@amir83nasr/10router 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1837) hide show
  1. package/.next/BUILD_ID +1 -0
  2. package/.next/app-path-routes-manifest.json +169 -0
  3. package/.next/build-manifest.json +20 -0
  4. package/.next/export-marker.json +6 -0
  5. package/.next/images-manifest.json +68 -0
  6. package/.next/next-minimal-server.js.nft.json +1 -0
  7. package/.next/next-server.js.nft.json +1 -0
  8. package/.next/package.json +1 -0
  9. package/.next/prerender-manifest.json +633 -0
  10. package/.next/react-loadable-manifest.json +11 -0
  11. package/.next/required-server-files.json +410 -0
  12. package/.next/routes-manifest.json +1132 -0
  13. package/.next/server/app/(dashboard)/dashboard/basic-chat/page.js +1 -0
  14. package/.next/server/app/(dashboard)/dashboard/basic-chat/page.js.nft.json +1 -0
  15. package/.next/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -0
  16. package/.next/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js +40 -0
  17. package/.next/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js.nft.json +1 -0
  18. package/.next/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -0
  19. package/.next/server/app/(dashboard)/dashboard/cli-tools/page.js +1 -0
  20. package/.next/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -0
  21. package/.next/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -0
  22. package/.next/server/app/(dashboard)/dashboard/combos/page.js +1 -0
  23. package/.next/server/app/(dashboard)/dashboard/combos/page.js.nft.json +1 -0
  24. package/.next/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -0
  25. package/.next/server/app/(dashboard)/dashboard/console-log/page.js +1 -0
  26. package/.next/server/app/(dashboard)/dashboard/console-log/page.js.nft.json +1 -0
  27. package/.next/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -0
  28. package/.next/server/app/(dashboard)/dashboard/endpoint/page.js +1 -0
  29. package/.next/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -0
  30. package/.next/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -0
  31. package/.next/server/app/(dashboard)/dashboard/media-providers/systemone/[id]/page.js +10 -0
  32. package/.next/server/app/(dashboard)/dashboard/media-providers/systemone/[id]/page.js.nft.json +1 -0
  33. package/.next/server/app/(dashboard)/dashboard/media-providers/systemone/[id]/page_client-reference-manifest.js +1 -0
  34. package/.next/server/app/(dashboard)/dashboard/media-providers/systemone/page.js +1 -0
  35. package/.next/server/app/(dashboard)/dashboard/media-providers/systemone/page.js.nft.json +1 -0
  36. package/.next/server/app/(dashboard)/dashboard/media-providers/systemone/page_client-reference-manifest.js +1 -0
  37. package/.next/server/app/(dashboard)/dashboard/page.js +1 -0
  38. package/.next/server/app/(dashboard)/dashboard/page.js.nft.json +1 -0
  39. package/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -0
  40. package/.next/server/app/(dashboard)/dashboard/profile/page.js +1 -0
  41. package/.next/server/app/(dashboard)/dashboard/profile/page.js.nft.json +1 -0
  42. package/.next/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -0
  43. package/.next/server/app/(dashboard)/dashboard/providers/[id]/page.js +21 -0
  44. package/.next/server/app/(dashboard)/dashboard/providers/[id]/page.js.nft.json +1 -0
  45. package/.next/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -0
  46. package/.next/server/app/(dashboard)/dashboard/providers/new/page.js +1 -0
  47. package/.next/server/app/(dashboard)/dashboard/providers/new/page.js.nft.json +1 -0
  48. package/.next/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -0
  49. package/.next/server/app/(dashboard)/dashboard/providers/page.js +1 -0
  50. package/.next/server/app/(dashboard)/dashboard/providers/page.js.nft.json +1 -0
  51. package/.next/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -0
  52. package/.next/server/app/(dashboard)/dashboard/proxy-pools/page.js +4 -0
  53. package/.next/server/app/(dashboard)/dashboard/proxy-pools/page.js.nft.json +1 -0
  54. package/.next/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -0
  55. package/.next/server/app/(dashboard)/dashboard/pxpipe/page.js +1 -0
  56. package/.next/server/app/(dashboard)/dashboard/pxpipe/page.js.nft.json +1 -0
  57. package/.next/server/app/(dashboard)/dashboard/pxpipe/page_client-reference-manifest.js +1 -0
  58. package/.next/server/app/(dashboard)/dashboard/quota/page.js +1 -0
  59. package/.next/server/app/(dashboard)/dashboard/quota/page.js.nft.json +1 -0
  60. package/.next/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -0
  61. package/.next/server/app/(dashboard)/dashboard/token-saver/page.js +1 -0
  62. package/.next/server/app/(dashboard)/dashboard/token-saver/page.js.nft.json +1 -0
  63. package/.next/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -0
  64. package/.next/server/app/(dashboard)/dashboard/usage/page.js +1 -0
  65. package/.next/server/app/(dashboard)/dashboard/usage/page.js.nft.json +1 -0
  66. package/.next/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -0
  67. package/.next/server/app/_global-error/page.js +31 -0
  68. package/.next/server/app/_global-error/page.js.nft.json +1 -0
  69. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -0
  70. package/.next/server/app/_global-error.html +1 -0
  71. package/.next/server/app/_global-error.meta +27 -0
  72. package/.next/server/app/_global-error.rsc +14 -0
  73. package/.next/server/app/_global-error.segments/_full.segment.rsc +14 -0
  74. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +20 -0
  75. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
  76. package/.next/server/app/_not-found/page.js +1 -0
  77. package/.next/server/app/_not-found/page.js.nft.json +1 -0
  78. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
  79. package/.next/server/app/_not-found.html +1 -0
  80. package/.next/server/app/_not-found.meta +27 -0
  81. package/.next/server/app/_not-found.rsc +24 -0
  82. package/.next/server/app/_not-found.segments/_full.segment.rsc +24 -0
  83. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +27 -0
  84. package/.next/server/app/_not-found.segments/_tree.segment.rsc +6 -0
  85. package/.next/server/app/api/auth/login/route.js +3 -0
  86. package/.next/server/app/api/auth/login/route.js.nft.json +1 -0
  87. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -0
  88. package/.next/server/app/api/auth/logout/route.js +1 -0
  89. package/.next/server/app/api/auth/logout/route.js.nft.json +1 -0
  90. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -0
  91. package/.next/server/app/api/auth/oidc/callback/route.js +1 -0
  92. package/.next/server/app/api/auth/oidc/callback/route.js.nft.json +1 -0
  93. package/.next/server/app/api/auth/oidc/callback/route_client-reference-manifest.js +1 -0
  94. package/.next/server/app/api/auth/oidc/start/route.js +1 -0
  95. package/.next/server/app/api/auth/oidc/start/route.js.nft.json +1 -0
  96. package/.next/server/app/api/auth/oidc/start/route_client-reference-manifest.js +1 -0
  97. package/.next/server/app/api/auth/oidc/test/route.js +1 -0
  98. package/.next/server/app/api/auth/oidc/test/route.js.nft.json +1 -0
  99. package/.next/server/app/api/auth/oidc/test/route_client-reference-manifest.js +1 -0
  100. package/.next/server/app/api/auth/reset-password/route.js +1 -0
  101. package/.next/server/app/api/auth/reset-password/route.js.nft.json +1 -0
  102. package/.next/server/app/api/auth/reset-password/route_client-reference-manifest.js +1 -0
  103. package/.next/server/app/api/auth/saml/acs/route.js +3 -0
  104. package/.next/server/app/api/auth/saml/acs/route.js.nft.json +1 -0
  105. package/.next/server/app/api/auth/saml/acs/route_client-reference-manifest.js +1 -0
  106. package/.next/server/app/api/auth/saml/metadata/route.js +3 -0
  107. package/.next/server/app/api/auth/saml/metadata/route.js.nft.json +1 -0
  108. package/.next/server/app/api/auth/saml/metadata/route_client-reference-manifest.js +1 -0
  109. package/.next/server/app/api/auth/saml/start/route.js +3 -0
  110. package/.next/server/app/api/auth/saml/start/route.js.nft.json +1 -0
  111. package/.next/server/app/api/auth/saml/start/route_client-reference-manifest.js +1 -0
  112. package/.next/server/app/api/auth/saml/test/route.js +3 -0
  113. package/.next/server/app/api/auth/saml/test/route.js.nft.json +1 -0
  114. package/.next/server/app/api/auth/saml/test/route_client-reference-manifest.js +1 -0
  115. package/.next/server/app/api/auth/status/route.js +3 -0
  116. package/.next/server/app/api/auth/status/route.js.nft.json +1 -0
  117. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -0
  118. package/.next/server/app/api/changelog/route.js +1 -0
  119. package/.next/server/app/api/changelog/route.js.nft.json +1 -0
  120. package/.next/server/app/api/changelog/route_client-reference-manifest.js +1 -0
  121. package/.next/server/app/api/cli-tools/all-statuses/route.js +1 -0
  122. package/.next/server/app/api/cli-tools/all-statuses/route.js.nft.json +1 -0
  123. package/.next/server/app/api/cli-tools/all-statuses/route_client-reference-manifest.js +1 -0
  124. package/.next/server/app/api/cli-tools/claude-settings/route.js +2 -0
  125. package/.next/server/app/api/cli-tools/claude-settings/route.js.nft.json +1 -0
  126. package/.next/server/app/api/cli-tools/claude-settings/route_client-reference-manifest.js +1 -0
  127. package/.next/server/app/api/cli-tools/codex-settings/route.js +2 -0
  128. package/.next/server/app/api/cli-tools/codex-settings/route.js.nft.json +1 -0
  129. package/.next/server/app/api/cli-tools/codex-settings/route_client-reference-manifest.js +1 -0
  130. package/.next/server/app/api/cli-tools/cowork-mcp-registry/route.js +2 -0
  131. package/.next/server/app/api/cli-tools/cowork-mcp-registry/route.js.nft.json +1 -0
  132. package/.next/server/app/api/cli-tools/cowork-mcp-registry/route_client-reference-manifest.js +1 -0
  133. package/.next/server/app/api/cli-tools/cowork-mcp-tools/route.js +2 -0
  134. package/.next/server/app/api/cli-tools/cowork-mcp-tools/route.js.nft.json +1 -0
  135. package/.next/server/app/api/cli-tools/cowork-mcp-tools/route_client-reference-manifest.js +1 -0
  136. package/.next/server/app/api/cli-tools/cowork-settings/route.js +2 -0
  137. package/.next/server/app/api/cli-tools/cowork-settings/route.js.nft.json +1 -0
  138. package/.next/server/app/api/cli-tools/cowork-settings/route_client-reference-manifest.js +1 -0
  139. package/.next/server/app/api/cli-tools/dsh-settings/route.js +1 -0
  140. package/.next/server/app/api/cli-tools/dsh-settings/route.js.nft.json +1 -0
  141. package/.next/server/app/api/cli-tools/dsh-settings/route_client-reference-manifest.js +1 -0
  142. package/.next/server/app/api/cli-tools/opencode-settings/route.js +2 -0
  143. package/.next/server/app/api/cli-tools/opencode-settings/route.js.nft.json +1 -0
  144. package/.next/server/app/api/cli-tools/opencode-settings/route_client-reference-manifest.js +1 -0
  145. package/.next/server/app/api/combos/[id]/route.js +1 -0
  146. package/.next/server/app/api/combos/[id]/route.js.nft.json +1 -0
  147. package/.next/server/app/api/combos/[id]/route_client-reference-manifest.js +1 -0
  148. package/.next/server/app/api/combos/route.js +1 -0
  149. package/.next/server/app/api/combos/route.js.nft.json +1 -0
  150. package/.next/server/app/api/combos/route_client-reference-manifest.js +1 -0
  151. package/.next/server/app/api/headroom/extras/route.js +1 -0
  152. package/.next/server/app/api/headroom/extras/route.js.nft.json +1 -0
  153. package/.next/server/app/api/headroom/extras/route_client-reference-manifest.js +1 -0
  154. package/.next/server/app/api/headroom/proxy/[...path]/route.js +1 -0
  155. package/.next/server/app/api/headroom/proxy/[...path]/route.js.nft.json +1 -0
  156. package/.next/server/app/api/headroom/proxy/[...path]/route_client-reference-manifest.js +1 -0
  157. package/.next/server/app/api/headroom/restart/route.js +1 -0
  158. package/.next/server/app/api/headroom/restart/route.js.nft.json +1 -0
  159. package/.next/server/app/api/headroom/restart/route_client-reference-manifest.js +1 -0
  160. package/.next/server/app/api/headroom/start/route.js +1 -0
  161. package/.next/server/app/api/headroom/start/route.js.nft.json +1 -0
  162. package/.next/server/app/api/headroom/start/route_client-reference-manifest.js +1 -0
  163. package/.next/server/app/api/headroom/status/route.js +1 -0
  164. package/.next/server/app/api/headroom/status/route.js.nft.json +1 -0
  165. package/.next/server/app/api/headroom/status/route_client-reference-manifest.js +1 -0
  166. package/.next/server/app/api/headroom/stop/route.js +1 -0
  167. package/.next/server/app/api/headroom/stop/route.js.nft.json +1 -0
  168. package/.next/server/app/api/headroom/stop/route_client-reference-manifest.js +1 -0
  169. package/.next/server/app/api/health/route.js +1 -0
  170. package/.next/server/app/api/health/route.js.nft.json +1 -0
  171. package/.next/server/app/api/health/route_client-reference-manifest.js +1 -0
  172. package/.next/server/app/api/init/route.js +1 -0
  173. package/.next/server/app/api/init/route.js.nft.json +1 -0
  174. package/.next/server/app/api/init/route_client-reference-manifest.js +1 -0
  175. package/.next/server/app/api/keys/[id]/route.js +1 -0
  176. package/.next/server/app/api/keys/[id]/route.js.nft.json +1 -0
  177. package/.next/server/app/api/keys/[id]/route_client-reference-manifest.js +1 -0
  178. package/.next/server/app/api/keys/route.js +1 -0
  179. package/.next/server/app/api/keys/route.js.nft.json +1 -0
  180. package/.next/server/app/api/keys/route_client-reference-manifest.js +1 -0
  181. package/.next/server/app/api/locale/route.js +1 -0
  182. package/.next/server/app/api/locale/route.js.nft.json +1 -0
  183. package/.next/server/app/api/locale/route_client-reference-manifest.js +1 -0
  184. package/.next/server/app/api/mcp/[plugin]/message/route.js +7 -0
  185. package/.next/server/app/api/mcp/[plugin]/message/route.js.nft.json +1 -0
  186. package/.next/server/app/api/mcp/[plugin]/message/route_client-reference-manifest.js +1 -0
  187. package/.next/server/app/api/mcp/[plugin]/sse/route.js +10 -0
  188. package/.next/server/app/api/mcp/[plugin]/sse/route.js.nft.json +1 -0
  189. package/.next/server/app/api/mcp/[plugin]/sse/route_client-reference-manifest.js +1 -0
  190. package/.next/server/app/api/media-providers/tts/deepgram/voices/route.js +1 -0
  191. package/.next/server/app/api/media-providers/tts/deepgram/voices/route.js.nft.json +1 -0
  192. package/.next/server/app/api/media-providers/tts/deepgram/voices/route_client-reference-manifest.js +1 -0
  193. package/.next/server/app/api/media-providers/tts/elevenlabs/voices/route.js +1 -0
  194. package/.next/server/app/api/media-providers/tts/elevenlabs/voices/route.js.nft.json +1 -0
  195. package/.next/server/app/api/media-providers/tts/elevenlabs/voices/route_client-reference-manifest.js +1 -0
  196. package/.next/server/app/api/media-providers/tts/inworld/voices/route.js +1 -0
  197. package/.next/server/app/api/media-providers/tts/inworld/voices/route.js.nft.json +1 -0
  198. package/.next/server/app/api/media-providers/tts/inworld/voices/route_client-reference-manifest.js +1 -0
  199. package/.next/server/app/api/media-providers/tts/minimax/voices/route.js +1 -0
  200. package/.next/server/app/api/media-providers/tts/minimax/voices/route.js.nft.json +1 -0
  201. package/.next/server/app/api/media-providers/tts/minimax/voices/route_client-reference-manifest.js +1 -0
  202. package/.next/server/app/api/media-providers/tts/voices/route.js +1 -0
  203. package/.next/server/app/api/media-providers/tts/voices/route.js.nft.json +1 -0
  204. package/.next/server/app/api/media-providers/tts/voices/route_client-reference-manifest.js +1 -0
  205. package/.next/server/app/api/models/alias/route.js +1 -0
  206. package/.next/server/app/api/models/alias/route.js.nft.json +1 -0
  207. package/.next/server/app/api/models/alias/route_client-reference-manifest.js +1 -0
  208. package/.next/server/app/api/models/availability/route.js +1 -0
  209. package/.next/server/app/api/models/availability/route.js.nft.json +1 -0
  210. package/.next/server/app/api/models/availability/route_client-reference-manifest.js +1 -0
  211. package/.next/server/app/api/models/catalog-sync/route.js +1 -0
  212. package/.next/server/app/api/models/catalog-sync/route.js.nft.json +1 -0
  213. package/.next/server/app/api/models/catalog-sync/route_client-reference-manifest.js +1 -0
  214. package/.next/server/app/api/models/custom/route.js +1 -0
  215. package/.next/server/app/api/models/custom/route.js.nft.json +1 -0
  216. package/.next/server/app/api/models/custom/route_client-reference-manifest.js +1 -0
  217. package/.next/server/app/api/models/disabled/route.js +1 -0
  218. package/.next/server/app/api/models/disabled/route.js.nft.json +1 -0
  219. package/.next/server/app/api/models/disabled/route_client-reference-manifest.js +1 -0
  220. package/.next/server/app/api/models/route.js +1 -0
  221. package/.next/server/app/api/models/route.js.nft.json +1 -0
  222. package/.next/server/app/api/models/route_client-reference-manifest.js +1 -0
  223. package/.next/server/app/api/models/test/route.js +1 -0
  224. package/.next/server/app/api/models/test/route.js.nft.json +1 -0
  225. package/.next/server/app/api/models/test/route_client-reference-manifest.js +1 -0
  226. package/.next/server/app/api/oauth/[provider]/[action]/route.js +1 -0
  227. package/.next/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -0
  228. package/.next/server/app/api/oauth/[provider]/[action]/route_client-reference-manifest.js +1 -0
  229. package/.next/server/app/api/oauth/codex/bulk-import/route.js +1 -0
  230. package/.next/server/app/api/oauth/codex/bulk-import/route.js.nft.json +1 -0
  231. package/.next/server/app/api/oauth/codex/bulk-import/route_client-reference-manifest.js +1 -0
  232. package/.next/server/app/api/oauth/codex/import-token/route.js +1 -0
  233. package/.next/server/app/api/oauth/codex/import-token/route.js.nft.json +1 -0
  234. package/.next/server/app/api/oauth/codex/import-token/route_client-reference-manifest.js +1 -0
  235. package/.next/server/app/api/oauth/cursor/auto-import/route.js +4 -0
  236. package/.next/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -0
  237. package/.next/server/app/api/oauth/cursor/auto-import/route_client-reference-manifest.js +1 -0
  238. package/.next/server/app/api/oauth/cursor/import/route.js +1 -0
  239. package/.next/server/app/api/oauth/cursor/import/route.js.nft.json +1 -0
  240. package/.next/server/app/api/oauth/cursor/import/route_client-reference-manifest.js +1 -0
  241. package/.next/server/app/api/oauth/gitlab/pat/route.js +1 -0
  242. package/.next/server/app/api/oauth/gitlab/pat/route.js.nft.json +1 -0
  243. package/.next/server/app/api/oauth/gitlab/pat/route_client-reference-manifest.js +1 -0
  244. package/.next/server/app/api/oauth/grok-cli/bulk-import/route.js +1 -0
  245. package/.next/server/app/api/oauth/grok-cli/bulk-import/route.js.nft.json +1 -0
  246. package/.next/server/app/api/oauth/grok-cli/bulk-import/route_client-reference-manifest.js +1 -0
  247. package/.next/server/app/api/oauth/iflow/cookie/route.js +1 -0
  248. package/.next/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -0
  249. package/.next/server/app/api/oauth/iflow/cookie/route_client-reference-manifest.js +1 -0
  250. package/.next/server/app/api/oauth/xiaomi-mimo/api-key/route.js +1 -0
  251. package/.next/server/app/api/oauth/xiaomi-mimo/api-key/route.js.nft.json +1 -0
  252. package/.next/server/app/api/oauth/xiaomi-mimo/api-key/route_client-reference-manifest.js +1 -0
  253. package/.next/server/app/api/oauth/xiaomi-mimo/auto-import/route.js +4 -0
  254. package/.next/server/app/api/oauth/xiaomi-mimo/auto-import/route.js.nft.json +1 -0
  255. package/.next/server/app/api/oauth/xiaomi-mimo/auto-import/route_client-reference-manifest.js +1 -0
  256. package/.next/server/app/api/pricing/route.js +1 -0
  257. package/.next/server/app/api/pricing/route.js.nft.json +1 -0
  258. package/.next/server/app/api/pricing/route_client-reference-manifest.js +1 -0
  259. package/.next/server/app/api/provider-nodes/[id]/route.js +1 -0
  260. package/.next/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -0
  261. package/.next/server/app/api/provider-nodes/[id]/route_client-reference-manifest.js +1 -0
  262. package/.next/server/app/api/provider-nodes/route.js +1 -0
  263. package/.next/server/app/api/provider-nodes/route.js.nft.json +1 -0
  264. package/.next/server/app/api/provider-nodes/route_client-reference-manifest.js +1 -0
  265. package/.next/server/app/api/provider-nodes/validate/route.js +1 -0
  266. package/.next/server/app/api/provider-nodes/validate/route.js.nft.json +1 -0
  267. package/.next/server/app/api/provider-nodes/validate/route_client-reference-manifest.js +1 -0
  268. package/.next/server/app/api/providers/[id]/models/route.js +1 -0
  269. package/.next/server/app/api/providers/[id]/models/route.js.nft.json +1 -0
  270. package/.next/server/app/api/providers/[id]/models/route_client-reference-manifest.js +1 -0
  271. package/.next/server/app/api/providers/[id]/route.js +1 -0
  272. package/.next/server/app/api/providers/[id]/route.js.nft.json +1 -0
  273. package/.next/server/app/api/providers/[id]/route_client-reference-manifest.js +1 -0
  274. package/.next/server/app/api/providers/[id]/test/route.js +1 -0
  275. package/.next/server/app/api/providers/[id]/test/route.js.nft.json +1 -0
  276. package/.next/server/app/api/providers/[id]/test/route_client-reference-manifest.js +1 -0
  277. package/.next/server/app/api/providers/[id]/test-models/route.js +1 -0
  278. package/.next/server/app/api/providers/[id]/test-models/route.js.nft.json +1 -0
  279. package/.next/server/app/api/providers/[id]/test-models/route_client-reference-manifest.js +1 -0
  280. package/.next/server/app/api/providers/client/route.js +1 -0
  281. package/.next/server/app/api/providers/client/route.js.nft.json +1 -0
  282. package/.next/server/app/api/providers/client/route_client-reference-manifest.js +1 -0
  283. package/.next/server/app/api/providers/kilo/free-models/route.js +1 -0
  284. package/.next/server/app/api/providers/kilo/free-models/route.js.nft.json +1 -0
  285. package/.next/server/app/api/providers/kilo/free-models/route_client-reference-manifest.js +1 -0
  286. package/.next/server/app/api/providers/route.js +1 -0
  287. package/.next/server/app/api/providers/route.js.nft.json +1 -0
  288. package/.next/server/app/api/providers/route_client-reference-manifest.js +1 -0
  289. package/.next/server/app/api/providers/suggested-models/route.js +1 -0
  290. package/.next/server/app/api/providers/suggested-models/route.js.nft.json +1 -0
  291. package/.next/server/app/api/providers/suggested-models/route_client-reference-manifest.js +1 -0
  292. package/.next/server/app/api/providers/test-batch/route.js +1 -0
  293. package/.next/server/app/api/providers/test-batch/route.js.nft.json +1 -0
  294. package/.next/server/app/api/providers/test-batch/route_client-reference-manifest.js +1 -0
  295. package/.next/server/app/api/providers/validate/route.js +1 -0
  296. package/.next/server/app/api/providers/validate/route.js.nft.json +1 -0
  297. package/.next/server/app/api/providers/validate/route_client-reference-manifest.js +1 -0
  298. package/.next/server/app/api/proxy-pools/[id]/route.js +1 -0
  299. package/.next/server/app/api/proxy-pools/[id]/route.js.nft.json +1 -0
  300. package/.next/server/app/api/proxy-pools/[id]/route_client-reference-manifest.js +1 -0
  301. package/.next/server/app/api/proxy-pools/[id]/test/route.js +1 -0
  302. package/.next/server/app/api/proxy-pools/[id]/test/route.js.nft.json +1 -0
  303. package/.next/server/app/api/proxy-pools/[id]/test/route_client-reference-manifest.js +1 -0
  304. package/.next/server/app/api/proxy-pools/cloudflare-deploy/route.js +43 -0
  305. package/.next/server/app/api/proxy-pools/cloudflare-deploy/route.js.nft.json +1 -0
  306. package/.next/server/app/api/proxy-pools/cloudflare-deploy/route_client-reference-manifest.js +1 -0
  307. package/.next/server/app/api/proxy-pools/deno-deploy/route.js +40 -0
  308. package/.next/server/app/api/proxy-pools/deno-deploy/route.js.nft.json +1 -0
  309. package/.next/server/app/api/proxy-pools/deno-deploy/route_client-reference-manifest.js +1 -0
  310. package/.next/server/app/api/proxy-pools/route.js +1 -0
  311. package/.next/server/app/api/proxy-pools/route.js.nft.json +1 -0
  312. package/.next/server/app/api/proxy-pools/route_client-reference-manifest.js +1 -0
  313. package/.next/server/app/api/proxy-pools/vercel-deploy/route.js +33 -0
  314. package/.next/server/app/api/proxy-pools/vercel-deploy/route.js.nft.json +1 -0
  315. package/.next/server/app/api/proxy-pools/vercel-deploy/route_client-reference-manifest.js +1 -0
  316. package/.next/server/app/api/pxpipe/health/route.js +3 -0
  317. package/.next/server/app/api/pxpipe/health/route.js.nft.json +1 -0
  318. package/.next/server/app/api/pxpipe/health/route_client-reference-manifest.js +1 -0
  319. package/.next/server/app/api/pxpipe/install/route.js +3 -0
  320. package/.next/server/app/api/pxpipe/install/route.js.nft.json +1 -0
  321. package/.next/server/app/api/pxpipe/install/route_client-reference-manifest.js +1 -0
  322. package/.next/server/app/api/pxpipe/logs/route.js +3 -0
  323. package/.next/server/app/api/pxpipe/logs/route.js.nft.json +1 -0
  324. package/.next/server/app/api/pxpipe/logs/route_client-reference-manifest.js +1 -0
  325. package/.next/server/app/api/pxpipe/restart/route.js +3 -0
  326. package/.next/server/app/api/pxpipe/restart/route.js.nft.json +1 -0
  327. package/.next/server/app/api/pxpipe/restart/route_client-reference-manifest.js +1 -0
  328. package/.next/server/app/api/pxpipe/start/route.js +3 -0
  329. package/.next/server/app/api/pxpipe/start/route.js.nft.json +1 -0
  330. package/.next/server/app/api/pxpipe/start/route_client-reference-manifest.js +1 -0
  331. package/.next/server/app/api/pxpipe/stats/route.js +3 -0
  332. package/.next/server/app/api/pxpipe/stats/route.js.nft.json +1 -0
  333. package/.next/server/app/api/pxpipe/stats/route_client-reference-manifest.js +1 -0
  334. package/.next/server/app/api/pxpipe/status/route.js +3 -0
  335. package/.next/server/app/api/pxpipe/status/route.js.nft.json +1 -0
  336. package/.next/server/app/api/pxpipe/status/route_client-reference-manifest.js +1 -0
  337. package/.next/server/app/api/pxpipe/stop/route.js +3 -0
  338. package/.next/server/app/api/pxpipe/stop/route.js.nft.json +1 -0
  339. package/.next/server/app/api/pxpipe/stop/route_client-reference-manifest.js +1 -0
  340. package/.next/server/app/api/settings/database/route.js +1 -0
  341. package/.next/server/app/api/settings/database/route.js.nft.json +1 -0
  342. package/.next/server/app/api/settings/database/route_client-reference-manifest.js +1 -0
  343. package/.next/server/app/api/settings/proxy-test/route.js +1 -0
  344. package/.next/server/app/api/settings/proxy-test/route.js.nft.json +1 -0
  345. package/.next/server/app/api/settings/proxy-test/route_client-reference-manifest.js +1 -0
  346. package/.next/server/app/api/settings/require-login/route.js +1 -0
  347. package/.next/server/app/api/settings/require-login/route.js.nft.json +1 -0
  348. package/.next/server/app/api/settings/require-login/route_client-reference-manifest.js +1 -0
  349. package/.next/server/app/api/settings/route.js +1 -0
  350. package/.next/server/app/api/settings/route.js.nft.json +1 -0
  351. package/.next/server/app/api/settings/route_client-reference-manifest.js +1 -0
  352. package/.next/server/app/api/shutdown/route.js +1 -0
  353. package/.next/server/app/api/shutdown/route.js.nft.json +1 -0
  354. package/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -0
  355. package/.next/server/app/api/tags/route.js +1 -0
  356. package/.next/server/app/api/tags/route.js.nft.json +1 -0
  357. package/.next/server/app/api/tags/route_client-reference-manifest.js +1 -0
  358. package/.next/server/app/api/translator/console-logs/route.js +1 -0
  359. package/.next/server/app/api/translator/console-logs/route.js.nft.json +1 -0
  360. package/.next/server/app/api/translator/console-logs/route_client-reference-manifest.js +1 -0
  361. package/.next/server/app/api/translator/console-logs/stream/route.js +9 -0
  362. package/.next/server/app/api/translator/console-logs/stream/route.js.nft.json +1 -0
  363. package/.next/server/app/api/translator/console-logs/stream/route_client-reference-manifest.js +1 -0
  364. package/.next/server/app/api/translator/load/route.js +1 -0
  365. package/.next/server/app/api/translator/load/route.js.nft.json +1 -0
  366. package/.next/server/app/api/translator/load/route_client-reference-manifest.js +1 -0
  367. package/.next/server/app/api/translator/save/route.js +1 -0
  368. package/.next/server/app/api/translator/save/route.js.nft.json +1 -0
  369. package/.next/server/app/api/translator/save/route_client-reference-manifest.js +1 -0
  370. package/.next/server/app/api/translator/send/route.js +1 -0
  371. package/.next/server/app/api/translator/send/route.js.nft.json +1 -0
  372. package/.next/server/app/api/translator/send/route_client-reference-manifest.js +1 -0
  373. package/.next/server/app/api/translator/translate/route.js +1 -0
  374. package/.next/server/app/api/translator/translate/route.js.nft.json +1 -0
  375. package/.next/server/app/api/translator/translate/route_client-reference-manifest.js +1 -0
  376. package/.next/server/app/api/tunnel/disable/route.js +1 -0
  377. package/.next/server/app/api/tunnel/disable/route.js.nft.json +1 -0
  378. package/.next/server/app/api/tunnel/disable/route_client-reference-manifest.js +1 -0
  379. package/.next/server/app/api/tunnel/enable/route.js +1 -0
  380. package/.next/server/app/api/tunnel/enable/route.js.nft.json +1 -0
  381. package/.next/server/app/api/tunnel/enable/route_client-reference-manifest.js +1 -0
  382. package/.next/server/app/api/tunnel/status/route.js +1 -0
  383. package/.next/server/app/api/tunnel/status/route.js.nft.json +1 -0
  384. package/.next/server/app/api/tunnel/status/route_client-reference-manifest.js +1 -0
  385. package/.next/server/app/api/tunnel/tailscale-check/route.js +1 -0
  386. package/.next/server/app/api/tunnel/tailscale-check/route.js.nft.json +1 -0
  387. package/.next/server/app/api/tunnel/tailscale-check/route_client-reference-manifest.js +1 -0
  388. package/.next/server/app/api/tunnel/tailscale-disable/route.js +1 -0
  389. package/.next/server/app/api/tunnel/tailscale-disable/route.js.nft.json +1 -0
  390. package/.next/server/app/api/tunnel/tailscale-disable/route_client-reference-manifest.js +1 -0
  391. package/.next/server/app/api/tunnel/tailscale-enable/route.js +1 -0
  392. package/.next/server/app/api/tunnel/tailscale-enable/route.js.nft.json +1 -0
  393. package/.next/server/app/api/tunnel/tailscale-enable/route_client-reference-manifest.js +1 -0
  394. package/.next/server/app/api/tunnel/tailscale-install/route.js +5 -0
  395. package/.next/server/app/api/tunnel/tailscale-install/route.js.nft.json +1 -0
  396. package/.next/server/app/api/tunnel/tailscale-install/route_client-reference-manifest.js +1 -0
  397. package/.next/server/app/api/usage/[connectionId]/codex-reset-credits/route.js +1 -0
  398. package/.next/server/app/api/usage/[connectionId]/codex-reset-credits/route.js.nft.json +1 -0
  399. package/.next/server/app/api/usage/[connectionId]/codex-reset-credits/route_client-reference-manifest.js +1 -0
  400. package/.next/server/app/api/usage/[connectionId]/route.js +1 -0
  401. package/.next/server/app/api/usage/[connectionId]/route.js.nft.json +1 -0
  402. package/.next/server/app/api/usage/[connectionId]/route_client-reference-manifest.js +1 -0
  403. package/.next/server/app/api/usage/chart/route.js +1 -0
  404. package/.next/server/app/api/usage/chart/route.js.nft.json +1 -0
  405. package/.next/server/app/api/usage/chart/route_client-reference-manifest.js +1 -0
  406. package/.next/server/app/api/usage/history/route.js +1 -0
  407. package/.next/server/app/api/usage/history/route.js.nft.json +1 -0
  408. package/.next/server/app/api/usage/history/route_client-reference-manifest.js +1 -0
  409. package/.next/server/app/api/usage/logs/route.js +1 -0
  410. package/.next/server/app/api/usage/logs/route.js.nft.json +1 -0
  411. package/.next/server/app/api/usage/logs/route_client-reference-manifest.js +1 -0
  412. package/.next/server/app/api/usage/providers/route.js +1 -0
  413. package/.next/server/app/api/usage/providers/route.js.nft.json +1 -0
  414. package/.next/server/app/api/usage/providers/route_client-reference-manifest.js +1 -0
  415. package/.next/server/app/api/usage/request-details/route.js +1 -0
  416. package/.next/server/app/api/usage/request-details/route.js.nft.json +1 -0
  417. package/.next/server/app/api/usage/request-details/route_client-reference-manifest.js +1 -0
  418. package/.next/server/app/api/usage/request-logs/route.js +1 -0
  419. package/.next/server/app/api/usage/request-logs/route.js.nft.json +1 -0
  420. package/.next/server/app/api/usage/request-logs/route_client-reference-manifest.js +1 -0
  421. package/.next/server/app/api/usage/stats/route.js +1 -0
  422. package/.next/server/app/api/usage/stats/route.js.nft.json +1 -0
  423. package/.next/server/app/api/usage/stats/route_client-reference-manifest.js +1 -0
  424. package/.next/server/app/api/usage/stream/route.js +7 -0
  425. package/.next/server/app/api/usage/stream/route.js.nft.json +1 -0
  426. package/.next/server/app/api/usage/stream/route_client-reference-manifest.js +1 -0
  427. package/.next/server/app/api/v1/api/chat/route.js +1 -0
  428. package/.next/server/app/api/v1/api/chat/route.js.nft.json +1 -0
  429. package/.next/server/app/api/v1/api/chat/route_client-reference-manifest.js +1 -0
  430. package/.next/server/app/api/v1/audio/speech/route.js +1 -0
  431. package/.next/server/app/api/v1/audio/speech/route.js.nft.json +1 -0
  432. package/.next/server/app/api/v1/audio/speech/route_client-reference-manifest.js +1 -0
  433. package/.next/server/app/api/v1/audio/transcriptions/route.js +1 -0
  434. package/.next/server/app/api/v1/audio/transcriptions/route.js.nft.json +1 -0
  435. package/.next/server/app/api/v1/audio/transcriptions/route_client-reference-manifest.js +1 -0
  436. package/.next/server/app/api/v1/audio/voices/route.js +1 -0
  437. package/.next/server/app/api/v1/audio/voices/route.js.nft.json +1 -0
  438. package/.next/server/app/api/v1/audio/voices/route_client-reference-manifest.js +1 -0
  439. package/.next/server/app/api/v1/chat/completions/route.js +1 -0
  440. package/.next/server/app/api/v1/chat/completions/route.js.nft.json +1 -0
  441. package/.next/server/app/api/v1/chat/completions/route_client-reference-manifest.js +1 -0
  442. package/.next/server/app/api/v1/embeddings/route.js +1 -0
  443. package/.next/server/app/api/v1/embeddings/route.js.nft.json +1 -0
  444. package/.next/server/app/api/v1/embeddings/route_client-reference-manifest.js +1 -0
  445. package/.next/server/app/api/v1/images/generations/route.js +4 -0
  446. package/.next/server/app/api/v1/images/generations/route.js.nft.json +1 -0
  447. package/.next/server/app/api/v1/images/generations/route_client-reference-manifest.js +1 -0
  448. package/.next/server/app/api/v1/messages/count_tokens/route.js +1 -0
  449. package/.next/server/app/api/v1/messages/count_tokens/route.js.nft.json +1 -0
  450. package/.next/server/app/api/v1/messages/count_tokens/route_client-reference-manifest.js +1 -0
  451. package/.next/server/app/api/v1/messages/route.js +1 -0
  452. package/.next/server/app/api/v1/messages/route.js.nft.json +1 -0
  453. package/.next/server/app/api/v1/messages/route_client-reference-manifest.js +1 -0
  454. package/.next/server/app/api/v1/models/[...model]/route.js +1 -0
  455. package/.next/server/app/api/v1/models/[...model]/route.js.nft.json +1 -0
  456. package/.next/server/app/api/v1/models/[...model]/route_client-reference-manifest.js +1 -0
  457. package/.next/server/app/api/v1/models/info/route.js +1 -0
  458. package/.next/server/app/api/v1/models/info/route.js.nft.json +1 -0
  459. package/.next/server/app/api/v1/models/info/route_client-reference-manifest.js +1 -0
  460. package/.next/server/app/api/v1/models/route.js +1 -0
  461. package/.next/server/app/api/v1/models/route.js.nft.json +1 -0
  462. package/.next/server/app/api/v1/models/route_client-reference-manifest.js +1 -0
  463. package/.next/server/app/api/v1/responses/compact/route.js +1 -0
  464. package/.next/server/app/api/v1/responses/compact/route.js.nft.json +1 -0
  465. package/.next/server/app/api/v1/responses/compact/route_client-reference-manifest.js +1 -0
  466. package/.next/server/app/api/v1/responses/route.js +1 -0
  467. package/.next/server/app/api/v1/responses/route.js.nft.json +1 -0
  468. package/.next/server/app/api/v1/responses/route_client-reference-manifest.js +1 -0
  469. package/.next/server/app/api/v1/route.js +1 -0
  470. package/.next/server/app/api/v1/route.js.nft.json +1 -0
  471. package/.next/server/app/api/v1/route_client-reference-manifest.js +1 -0
  472. package/.next/server/app/api/v1/search/route.js +1 -0
  473. package/.next/server/app/api/v1/search/route.js.nft.json +1 -0
  474. package/.next/server/app/api/v1/search/route_client-reference-manifest.js +1 -0
  475. package/.next/server/app/api/v1/systemone/route.js +1 -0
  476. package/.next/server/app/api/v1/systemone/route.js.nft.json +1 -0
  477. package/.next/server/app/api/v1/systemone/route_client-reference-manifest.js +1 -0
  478. package/.next/server/app/api/v1/videos/[id]/route.js +1 -0
  479. package/.next/server/app/api/v1/videos/[id]/route.js.nft.json +1 -0
  480. package/.next/server/app/api/v1/videos/[id]/route_client-reference-manifest.js +1 -0
  481. package/.next/server/app/api/v1/videos/edits/route.js +1 -0
  482. package/.next/server/app/api/v1/videos/edits/route.js.nft.json +1 -0
  483. package/.next/server/app/api/v1/videos/edits/route_client-reference-manifest.js +1 -0
  484. package/.next/server/app/api/v1/videos/extensions/route.js +1 -0
  485. package/.next/server/app/api/v1/videos/extensions/route.js.nft.json +1 -0
  486. package/.next/server/app/api/v1/videos/extensions/route_client-reference-manifest.js +1 -0
  487. package/.next/server/app/api/v1/videos/generations/route.js +1 -0
  488. package/.next/server/app/api/v1/videos/generations/route.js.nft.json +1 -0
  489. package/.next/server/app/api/v1/videos/generations/route_client-reference-manifest.js +1 -0
  490. package/.next/server/app/api/v1/web/fetch/route.js +1 -0
  491. package/.next/server/app/api/v1/web/fetch/route.js.nft.json +1 -0
  492. package/.next/server/app/api/v1/web/fetch/route_client-reference-manifest.js +1 -0
  493. package/.next/server/app/api/v1beta/models/[...path]/route.js +1 -0
  494. package/.next/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -0
  495. package/.next/server/app/api/v1beta/models/[...path]/route_client-reference-manifest.js +1 -0
  496. package/.next/server/app/api/v1beta/models/route.js +1 -0
  497. package/.next/server/app/api/v1beta/models/route.js.nft.json +1 -0
  498. package/.next/server/app/api/v1beta/models/route_client-reference-manifest.js +1 -0
  499. package/.next/server/app/api/version/route.js +1 -0
  500. package/.next/server/app/api/version/route.js.nft.json +1 -0
  501. package/.next/server/app/api/version/route_client-reference-manifest.js +1 -0
  502. package/.next/server/app/api/version/shutdown/route.js +1 -0
  503. package/.next/server/app/api/version/shutdown/route.js.nft.json +1 -0
  504. package/.next/server/app/api/version/shutdown/route_client-reference-manifest.js +1 -0
  505. package/.next/server/app/api/version/update/route.js +1 -0
  506. package/.next/server/app/api/version/update/route.js.nft.json +1 -0
  507. package/.next/server/app/api/version/update/route_client-reference-manifest.js +1 -0
  508. package/.next/server/app/callback/page.js +1 -0
  509. package/.next/server/app/callback/page.js.nft.json +1 -0
  510. package/.next/server/app/callback/page_client-reference-manifest.js +1 -0
  511. package/.next/server/app/callback.html +1 -0
  512. package/.next/server/app/callback.meta +26 -0
  513. package/.next/server/app/callback.rsc +28 -0
  514. package/.next/server/app/callback.segments/_full.segment.rsc +28 -0
  515. package/.next/server/app/callback.segments/_tree.segment.rsc +6 -0
  516. package/.next/server/app/callback.segments/callback/__PAGE__.segment.rsc +31 -0
  517. package/.next/server/app/dashboard/basic-chat.html +1 -0
  518. package/.next/server/app/dashboard/basic-chat.meta +36 -0
  519. package/.next/server/app/dashboard/basic-chat.rsc +26 -0
  520. package/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +31 -0
  521. package/.next/server/app/dashboard/basic-chat.segments/_full.segment.rsc +26 -0
  522. package/.next/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +6 -0
  523. package/.next/server/app/dashboard/cli-tools.html +1 -0
  524. package/.next/server/app/dashboard/cli-tools.meta +36 -0
  525. package/.next/server/app/dashboard/cli-tools.rsc +27 -0
  526. package/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +31 -0
  527. package/.next/server/app/dashboard/cli-tools.segments/_full.segment.rsc +27 -0
  528. package/.next/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +6 -0
  529. package/.next/server/app/dashboard/combos.html +1 -0
  530. package/.next/server/app/dashboard/combos.meta +36 -0
  531. package/.next/server/app/dashboard/combos.rsc +29 -0
  532. package/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +34 -0
  533. package/.next/server/app/dashboard/combos.segments/_full.segment.rsc +29 -0
  534. package/.next/server/app/dashboard/combos.segments/_tree.segment.rsc +6 -0
  535. package/.next/server/app/dashboard/endpoint.html +1 -0
  536. package/.next/server/app/dashboard/endpoint.meta +36 -0
  537. package/.next/server/app/dashboard/endpoint.rsc +27 -0
  538. package/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +31 -0
  539. package/.next/server/app/dashboard/endpoint.segments/_full.segment.rsc +27 -0
  540. package/.next/server/app/dashboard/endpoint.segments/_tree.segment.rsc +6 -0
  541. package/.next/server/app/dashboard/media-providers/systemone.html +1 -0
  542. package/.next/server/app/dashboard/media-providers/systemone.meta +41 -0
  543. package/.next/server/app/dashboard/media-providers/systemone.rsc +29 -0
  544. package/.next/server/app/dashboard/media-providers/systemone.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/systemone/__PAGE__.segment.rsc +35 -0
  545. package/.next/server/app/dashboard/media-providers/systemone.segments/_full.segment.rsc +29 -0
  546. package/.next/server/app/dashboard/media-providers/systemone.segments/_tree.segment.rsc +6 -0
  547. package/.next/server/app/dashboard/profile.html +1 -0
  548. package/.next/server/app/dashboard/profile.meta +36 -0
  549. package/.next/server/app/dashboard/profile.rsc +29 -0
  550. package/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +34 -0
  551. package/.next/server/app/dashboard/profile.segments/_full.segment.rsc +29 -0
  552. package/.next/server/app/dashboard/profile.segments/_tree.segment.rsc +6 -0
  553. package/.next/server/app/dashboard/providers/new.html +1 -0
  554. package/.next/server/app/dashboard/providers/new.meta +41 -0
  555. package/.next/server/app/dashboard/providers/new.rsc +29 -0
  556. package/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +35 -0
  557. package/.next/server/app/dashboard/providers/new.segments/_full.segment.rsc +29 -0
  558. package/.next/server/app/dashboard/providers/new.segments/_tree.segment.rsc +6 -0
  559. package/.next/server/app/dashboard/providers.html +1 -0
  560. package/.next/server/app/dashboard/providers.meta +36 -0
  561. package/.next/server/app/dashboard/providers.rsc +29 -0
  562. package/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +34 -0
  563. package/.next/server/app/dashboard/providers.segments/_full.segment.rsc +29 -0
  564. package/.next/server/app/dashboard/providers.segments/_tree.segment.rsc +6 -0
  565. package/.next/server/app/dashboard/proxy-pools.html +1 -0
  566. package/.next/server/app/dashboard/proxy-pools.meta +36 -0
  567. package/.next/server/app/dashboard/proxy-pools.rsc +29 -0
  568. package/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +34 -0
  569. package/.next/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +29 -0
  570. package/.next/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +6 -0
  571. package/.next/server/app/dashboard/pxpipe.html +1 -0
  572. package/.next/server/app/dashboard/pxpipe.meta +36 -0
  573. package/.next/server/app/dashboard/pxpipe.rsc +26 -0
  574. package/.next/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe/__PAGE__.segment.rsc +31 -0
  575. package/.next/server/app/dashboard/pxpipe.segments/_full.segment.rsc +26 -0
  576. package/.next/server/app/dashboard/pxpipe.segments/_tree.segment.rsc +6 -0
  577. package/.next/server/app/dashboard/quota.html +2 -0
  578. package/.next/server/app/dashboard/quota.meta +36 -0
  579. package/.next/server/app/dashboard/quota.rsc +27 -0
  580. package/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +32 -0
  581. package/.next/server/app/dashboard/quota.segments/_full.segment.rsc +27 -0
  582. package/.next/server/app/dashboard/quota.segments/_tree.segment.rsc +6 -0
  583. package/.next/server/app/dashboard/settings/pricing/page.js +1 -0
  584. package/.next/server/app/dashboard/settings/pricing/page.js.nft.json +1 -0
  585. package/.next/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -0
  586. package/.next/server/app/dashboard/settings/pricing.html +1 -0
  587. package/.next/server/app/dashboard/settings/pricing.meta +36 -0
  588. package/.next/server/app/dashboard/settings/pricing.rsc +28 -0
  589. package/.next/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +28 -0
  590. package/.next/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +6 -0
  591. package/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +33 -0
  592. package/.next/server/app/dashboard/token-saver.html +1 -0
  593. package/.next/server/app/dashboard/token-saver.meta +36 -0
  594. package/.next/server/app/dashboard/token-saver.rsc +26 -0
  595. package/.next/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +31 -0
  596. package/.next/server/app/dashboard/token-saver.segments/_full.segment.rsc +26 -0
  597. package/.next/server/app/dashboard/token-saver.segments/_tree.segment.rsc +6 -0
  598. package/.next/server/app/dashboard/usage.html +2 -0
  599. package/.next/server/app/dashboard/usage.meta +36 -0
  600. package/.next/server/app/dashboard/usage.rsc +29 -0
  601. package/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +34 -0
  602. package/.next/server/app/dashboard/usage.segments/_full.segment.rsc +29 -0
  603. package/.next/server/app/dashboard/usage.segments/_tree.segment.rsc +6 -0
  604. package/.next/server/app/dashboard.html +1 -0
  605. package/.next/server/app/dashboard.meta +31 -0
  606. package/.next/server/app/dashboard.rsc +27 -0
  607. package/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +30 -0
  608. package/.next/server/app/dashboard.segments/_full.segment.rsc +27 -0
  609. package/.next/server/app/dashboard.segments/_tree.segment.rsc +6 -0
  610. package/.next/server/app/index.html +1 -0
  611. package/.next/server/app/index.meta +23 -0
  612. package/.next/server/app/index.rsc +23 -0
  613. package/.next/server/app/index.segments/__PAGE__.segment.rsc +25 -0
  614. package/.next/server/app/index.segments/_full.segment.rsc +23 -0
  615. package/.next/server/app/index.segments/_tree.segment.rsc +6 -0
  616. package/.next/server/app/landing/page.js +1 -0
  617. package/.next/server/app/landing/page.js.nft.json +1 -0
  618. package/.next/server/app/landing/page_client-reference-manifest.js +1 -0
  619. package/.next/server/app/landing.html +1 -0
  620. package/.next/server/app/landing.meta +26 -0
  621. package/.next/server/app/landing.rsc +28 -0
  622. package/.next/server/app/landing.segments/_full.segment.rsc +28 -0
  623. package/.next/server/app/landing.segments/_tree.segment.rsc +6 -0
  624. package/.next/server/app/landing.segments/landing/__PAGE__.segment.rsc +31 -0
  625. package/.next/server/app/login/page.js +1 -0
  626. package/.next/server/app/login/page.js.nft.json +1 -0
  627. package/.next/server/app/login/page_client-reference-manifest.js +1 -0
  628. package/.next/server/app/login.html +1 -0
  629. package/.next/server/app/login.meta +26 -0
  630. package/.next/server/app/login.rsc +28 -0
  631. package/.next/server/app/login.segments/_full.segment.rsc +28 -0
  632. package/.next/server/app/login.segments/_tree.segment.rsc +6 -0
  633. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +31 -0
  634. package/.next/server/app/manifest.webmanifest/route.js +17 -0
  635. package/.next/server/app/manifest.webmanifest/route.js.nft.json +1 -0
  636. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -0
  637. package/.next/server/app/manifest.webmanifest.body +1 -0
  638. package/.next/server/app/manifest.webmanifest.meta +1 -0
  639. package/.next/server/app/page.js +1 -0
  640. package/.next/server/app/page.js.nft.json +1 -0
  641. package/.next/server/app/page_client-reference-manifest.js +1 -0
  642. package/.next/server/app-paths-manifest.json +169 -0
  643. package/.next/server/chunks/1003.js +1 -0
  644. package/.next/server/chunks/1011.js +1 -0
  645. package/.next/server/chunks/1126.js +1 -0
  646. package/.next/server/chunks/1157.js +1 -0
  647. package/.next/server/chunks/1194.js +1 -0
  648. package/.next/server/chunks/1238.js +1 -0
  649. package/.next/server/chunks/1273.js +1 -0
  650. package/.next/server/chunks/1316.js +165 -0
  651. package/.next/server/chunks/1336.js +1 -0
  652. package/.next/server/chunks/1412.js +1 -0
  653. package/.next/server/chunks/1470.js +1 -0
  654. package/.next/server/chunks/1564.js +1 -0
  655. package/.next/server/chunks/1612.js +33 -0
  656. package/.next/server/chunks/1633.js +1 -0
  657. package/.next/server/chunks/1985.js +1 -0
  658. package/.next/server/chunks/2076.js +1 -0
  659. package/.next/server/chunks/2143.js +1 -0
  660. package/.next/server/chunks/2151.js +1 -0
  661. package/.next/server/chunks/2225.js +9 -0
  662. package/.next/server/chunks/224.js +1 -0
  663. package/.next/server/chunks/2282.js +150 -0
  664. package/.next/server/chunks/2310.js +2 -0
  665. package/.next/server/chunks/2339.js +1 -0
  666. package/.next/server/chunks/2426.js +1 -0
  667. package/.next/server/chunks/257.js +67 -0
  668. package/.next/server/chunks/2638.js +1 -0
  669. package/.next/server/chunks/2706.js +1 -0
  670. package/.next/server/chunks/3023.js +9 -0
  671. package/.next/server/chunks/3034.js +9 -0
  672. package/.next/server/chunks/3179.js +1 -0
  673. package/.next/server/chunks/3250.js +9 -0
  674. package/.next/server/chunks/3336.js +1 -0
  675. package/.next/server/chunks/3425.js +1 -0
  676. package/.next/server/chunks/3481.js +9 -0
  677. package/.next/server/chunks/3512.js +29 -0
  678. package/.next/server/chunks/3533.js +1 -0
  679. package/.next/server/chunks/3544.js +1 -0
  680. package/.next/server/chunks/4129.js +1 -0
  681. package/.next/server/chunks/4139.js +9 -0
  682. package/.next/server/chunks/4301.js +7 -0
  683. package/.next/server/chunks/4364.js +1 -0
  684. package/.next/server/chunks/4464.js +1 -0
  685. package/.next/server/chunks/460.js +1 -0
  686. package/.next/server/chunks/4793.js +1 -0
  687. package/.next/server/chunks/4915.js +62 -0
  688. package/.next/server/chunks/4961.js +7 -0
  689. package/.next/server/chunks/537.js +9 -0
  690. package/.next/server/chunks/5412.js +9 -0
  691. package/.next/server/chunks/5496.js +1 -0
  692. package/.next/server/chunks/5761.js +1 -0
  693. package/.next/server/chunks/5939.js +9 -0
  694. package/.next/server/chunks/6009.js +1 -0
  695. package/.next/server/chunks/6056.js +1 -0
  696. package/.next/server/chunks/613.js +1 -0
  697. package/.next/server/chunks/6343.js +72 -0
  698. package/.next/server/chunks/6461.js +5 -0
  699. package/.next/server/chunks/6823.js +1 -0
  700. package/.next/server/chunks/7002.js +9 -0
  701. package/.next/server/chunks/7019.js +3 -0
  702. package/.next/server/chunks/7156.js +1 -0
  703. package/.next/server/chunks/7257.js +1 -0
  704. package/.next/server/chunks/7268.js +1 -0
  705. package/.next/server/chunks/7459.js +120 -0
  706. package/.next/server/chunks/7504.js +1 -0
  707. package/.next/server/chunks/7535.js +21 -0
  708. package/.next/server/chunks/7816.js +1 -0
  709. package/.next/server/chunks/7963.js +193 -0
  710. package/.next/server/chunks/8066.js +31 -0
  711. package/.next/server/chunks/8567.js +1 -0
  712. package/.next/server/chunks/8569.js +11 -0
  713. package/.next/server/chunks/8784.js +1 -0
  714. package/.next/server/chunks/881.js +10 -0
  715. package/.next/server/chunks/8857.js +1 -0
  716. package/.next/server/chunks/8923.js +1 -0
  717. package/.next/server/chunks/8940.js +1 -0
  718. package/.next/server/chunks/9018.js +1 -0
  719. package/.next/server/chunks/9250.js +7 -0
  720. package/.next/server/chunks/9287.js +1 -0
  721. package/.next/server/chunks/9429.js +2 -0
  722. package/.next/server/chunks/9603.js +1 -0
  723. package/.next/server/chunks/9614.js +1 -0
  724. package/.next/server/chunks/9646.js +1 -0
  725. package/.next/server/chunks/9792.js +9 -0
  726. package/.next/server/functions-config-manifest.json +25 -0
  727. package/.next/server/instrumentation.js +1 -0
  728. package/.next/server/instrumentation.js.nft.json +1 -0
  729. package/.next/server/interception-route-rewrite-manifest.js +1 -0
  730. package/.next/server/middleware-build-manifest.js +1 -0
  731. package/.next/server/middleware-manifest.json +6 -0
  732. package/.next/server/middleware-react-loadable-manifest.js +1 -0
  733. package/.next/server/middleware.js +171 -0
  734. package/.next/server/middleware.js.nft.json +1 -0
  735. package/.next/server/next-font-manifest.js +1 -0
  736. package/.next/server/next-font-manifest.json +1 -0
  737. package/.next/server/pages/404.html +1 -0
  738. package/.next/server/pages/500.html +1 -0
  739. package/.next/server/pages-manifest.json +4 -0
  740. package/.next/server/prefetch-hints.json +446 -0
  741. package/.next/server/server-reference-manifest.js +1 -0
  742. package/.next/server/server-reference-manifest.json +1 -0
  743. package/.next/server/webpack-runtime.js +1 -0
  744. package/.next/static/AiSMDHTT8m1mHG-uAmkFq/_buildManifest.js +1 -0
  745. package/.next/static/AiSMDHTT8m1mHG-uAmkFq/_ssgManifest.js +1 -0
  746. package/.next/static/chunks/1078-965aa38f6ae4f5b7.js +1 -0
  747. package/.next/static/chunks/1278-d7d5375869132de1.js +1 -0
  748. package/.next/static/chunks/1471-10f225f62f7469cc.js +1 -0
  749. package/.next/static/chunks/159-17737a7c99ff1a65.js +1 -0
  750. package/.next/static/chunks/1722-bb40b4311197204b.js +1 -0
  751. package/.next/static/chunks/1830-901fe48c3c62604f.js +1 -0
  752. package/.next/static/chunks/208-fcb6c54f9db5664f.js +1 -0
  753. package/.next/static/chunks/3153-fde052e626cc6d40.js +67 -0
  754. package/.next/static/chunks/3577-cd98d40e3099e1b0.js +1 -0
  755. package/.next/static/chunks/4484-893f9cfcbe1499df.js +1 -0
  756. package/.next/static/chunks/4489-0f3ff0134169e717.js +1 -0
  757. package/.next/static/chunks/4899.0d4260af2a463837.js +1 -0
  758. package/.next/static/chunks/5113-5c4f5181388aab72.js +1 -0
  759. package/.next/static/chunks/5166-cadbdbf7d6854cf9.js +1 -0
  760. package/.next/static/chunks/5778-9d97ce04f2ac118c.js +1 -0
  761. package/.next/static/chunks/5862-f98c2f3d480b80d2.js +1 -0
  762. package/.next/static/chunks/6817-449f7a2452845c74.js +1 -0
  763. package/.next/static/chunks/6920-e2b533c1eafa9521.js +1 -0
  764. package/.next/static/chunks/7276-16ef14f7b2cd478d.js +1 -0
  765. package/.next/static/chunks/7287-b8e377303d1c5ae8.js +11 -0
  766. package/.next/static/chunks/7552-11960bc118e4e0f7.js +1 -0
  767. package/.next/static/chunks/7822.01a4d5bdd39fa0b7.js +1 -0
  768. package/.next/static/chunks/7835-c1ef8f5cdaaad483.js +1 -0
  769. package/.next/static/chunks/80d4b624.42a8767f1c8767a3.js +1 -0
  770. package/.next/static/chunks/9369-b8c9520bc2536ff2.js +1 -0
  771. package/.next/static/chunks/9590-0d0b3dd0530b2b7b.js +1 -0
  772. package/.next/static/chunks/9966-7232c138a59bdc2f.js +52 -0
  773. package/.next/static/chunks/9980-971a38c4ad288d6c.js +1 -0
  774. package/.next/static/chunks/9ce8c186-3c7d7dbc5d428052.js +1 -0
  775. package/.next/static/chunks/app/(dashboard)/dashboard/basic-chat/page-c074ab1b76a6c8ba.js +1 -0
  776. package/.next/static/chunks/app/(dashboard)/dashboard/cli-tools/[toolId]/page-2ff675120416e925.js +40 -0
  777. package/.next/static/chunks/app/(dashboard)/dashboard/cli-tools/page-654e770c4dca90e8.js +1 -0
  778. package/.next/static/chunks/app/(dashboard)/dashboard/combos/page-55bc39e30923938a.js +1 -0
  779. package/.next/static/chunks/app/(dashboard)/dashboard/console-log/page-aac9a9397d3f7f17.js +1 -0
  780. package/.next/static/chunks/app/(dashboard)/dashboard/endpoint/page-d60651b77028b014.js +1 -0
  781. package/.next/static/chunks/app/(dashboard)/dashboard/media-providers/systemone/[id]/page-3d78f5834ef97b82.js +10 -0
  782. package/.next/static/chunks/app/(dashboard)/dashboard/media-providers/systemone/page-e41bf53886195393.js +1 -0
  783. package/.next/static/chunks/app/(dashboard)/dashboard/page-670583d9f9c104af.js +1 -0
  784. package/.next/static/chunks/app/(dashboard)/dashboard/profile/page-53158d30b5643b05.js +1 -0
  785. package/.next/static/chunks/app/(dashboard)/dashboard/providers/[id]/page-fd2615fea8932fd5.js +21 -0
  786. package/.next/static/chunks/app/(dashboard)/dashboard/providers/new/page-7c9e30c4985582a6.js +1 -0
  787. package/.next/static/chunks/app/(dashboard)/dashboard/providers/page-7cc2c66e63fce4ab.js +1 -0
  788. package/.next/static/chunks/app/(dashboard)/dashboard/proxy-pools/page-5e1fb41bd7b555a6.js +4 -0
  789. package/.next/static/chunks/app/(dashboard)/dashboard/pxpipe/page-1ec35dafa18e5d24.js +1 -0
  790. package/.next/static/chunks/app/(dashboard)/dashboard/quota/page-11d5ca23d18d596e.js +1 -0
  791. package/.next/static/chunks/app/(dashboard)/dashboard/token-saver/page-388b616d8c2aa3fc.js +1 -0
  792. package/.next/static/chunks/app/(dashboard)/dashboard/usage/page-466f7a8f7319ad85.js +1 -0
  793. package/.next/static/chunks/app/(dashboard)/layout-e1e5bead272b5c82.js +1 -0
  794. package/.next/static/chunks/app/_global-error/page-fe947d4ab19df968.js +1 -0
  795. package/.next/static/chunks/app/_not-found/page-d66f1e17185e98d1.js +1 -0
  796. package/.next/static/chunks/app/api/auth/login/route-fe947d4ab19df968.js +1 -0
  797. package/.next/static/chunks/app/api/auth/logout/route-fe947d4ab19df968.js +1 -0
  798. package/.next/static/chunks/app/api/auth/oidc/callback/route-fe947d4ab19df968.js +1 -0
  799. package/.next/static/chunks/app/api/auth/oidc/start/route-fe947d4ab19df968.js +1 -0
  800. package/.next/static/chunks/app/api/auth/oidc/test/route-fe947d4ab19df968.js +1 -0
  801. package/.next/static/chunks/app/api/auth/reset-password/route-fe947d4ab19df968.js +1 -0
  802. package/.next/static/chunks/app/api/auth/saml/acs/route-fe947d4ab19df968.js +1 -0
  803. package/.next/static/chunks/app/api/auth/saml/metadata/route-fe947d4ab19df968.js +1 -0
  804. package/.next/static/chunks/app/api/auth/saml/start/route-fe947d4ab19df968.js +1 -0
  805. package/.next/static/chunks/app/api/auth/saml/test/route-fe947d4ab19df968.js +1 -0
  806. package/.next/static/chunks/app/api/auth/status/route-fe947d4ab19df968.js +1 -0
  807. package/.next/static/chunks/app/api/changelog/route-fe947d4ab19df968.js +1 -0
  808. package/.next/static/chunks/app/api/cli-tools/all-statuses/route-fe947d4ab19df968.js +1 -0
  809. package/.next/static/chunks/app/api/cli-tools/claude-settings/route-fe947d4ab19df968.js +1 -0
  810. package/.next/static/chunks/app/api/cli-tools/codex-settings/route-fe947d4ab19df968.js +1 -0
  811. package/.next/static/chunks/app/api/cli-tools/cowork-mcp-registry/route-fe947d4ab19df968.js +1 -0
  812. package/.next/static/chunks/app/api/cli-tools/cowork-mcp-tools/route-fe947d4ab19df968.js +1 -0
  813. package/.next/static/chunks/app/api/cli-tools/cowork-settings/route-fe947d4ab19df968.js +1 -0
  814. package/.next/static/chunks/app/api/cli-tools/dsh-settings/route-fe947d4ab19df968.js +1 -0
  815. package/.next/static/chunks/app/api/cli-tools/opencode-settings/route-fe947d4ab19df968.js +1 -0
  816. package/.next/static/chunks/app/api/combos/[id]/route-fe947d4ab19df968.js +1 -0
  817. package/.next/static/chunks/app/api/combos/route-fe947d4ab19df968.js +1 -0
  818. package/.next/static/chunks/app/api/headroom/extras/route-fe947d4ab19df968.js +1 -0
  819. package/.next/static/chunks/app/api/headroom/proxy/[...path]/route-fe947d4ab19df968.js +1 -0
  820. package/.next/static/chunks/app/api/headroom/restart/route-fe947d4ab19df968.js +1 -0
  821. package/.next/static/chunks/app/api/headroom/start/route-fe947d4ab19df968.js +1 -0
  822. package/.next/static/chunks/app/api/headroom/status/route-fe947d4ab19df968.js +1 -0
  823. package/.next/static/chunks/app/api/headroom/stop/route-fe947d4ab19df968.js +1 -0
  824. package/.next/static/chunks/app/api/health/route-fe947d4ab19df968.js +1 -0
  825. package/.next/static/chunks/app/api/init/route-fe947d4ab19df968.js +1 -0
  826. package/.next/static/chunks/app/api/keys/[id]/route-fe947d4ab19df968.js +1 -0
  827. package/.next/static/chunks/app/api/keys/route-fe947d4ab19df968.js +1 -0
  828. package/.next/static/chunks/app/api/locale/route-fe947d4ab19df968.js +1 -0
  829. package/.next/static/chunks/app/api/mcp/[plugin]/message/route-fe947d4ab19df968.js +1 -0
  830. package/.next/static/chunks/app/api/mcp/[plugin]/sse/route-fe947d4ab19df968.js +1 -0
  831. package/.next/static/chunks/app/api/media-providers/tts/deepgram/voices/route-fe947d4ab19df968.js +1 -0
  832. package/.next/static/chunks/app/api/media-providers/tts/elevenlabs/voices/route-fe947d4ab19df968.js +1 -0
  833. package/.next/static/chunks/app/api/media-providers/tts/inworld/voices/route-fe947d4ab19df968.js +1 -0
  834. package/.next/static/chunks/app/api/media-providers/tts/minimax/voices/route-fe947d4ab19df968.js +1 -0
  835. package/.next/static/chunks/app/api/media-providers/tts/voices/route-fe947d4ab19df968.js +1 -0
  836. package/.next/static/chunks/app/api/models/alias/route-fe947d4ab19df968.js +1 -0
  837. package/.next/static/chunks/app/api/models/availability/route-fe947d4ab19df968.js +1 -0
  838. package/.next/static/chunks/app/api/models/catalog-sync/route-fe947d4ab19df968.js +1 -0
  839. package/.next/static/chunks/app/api/models/custom/route-fe947d4ab19df968.js +1 -0
  840. package/.next/static/chunks/app/api/models/disabled/route-fe947d4ab19df968.js +1 -0
  841. package/.next/static/chunks/app/api/models/route-fe947d4ab19df968.js +1 -0
  842. package/.next/static/chunks/app/api/models/test/route-fe947d4ab19df968.js +1 -0
  843. package/.next/static/chunks/app/api/oauth/[provider]/[action]/route-fe947d4ab19df968.js +1 -0
  844. package/.next/static/chunks/app/api/oauth/codex/bulk-import/route-fe947d4ab19df968.js +1 -0
  845. package/.next/static/chunks/app/api/oauth/codex/import-token/route-fe947d4ab19df968.js +1 -0
  846. package/.next/static/chunks/app/api/oauth/cursor/auto-import/route-fe947d4ab19df968.js +1 -0
  847. package/.next/static/chunks/app/api/oauth/cursor/import/route-fe947d4ab19df968.js +1 -0
  848. package/.next/static/chunks/app/api/oauth/gitlab/pat/route-fe947d4ab19df968.js +1 -0
  849. package/.next/static/chunks/app/api/oauth/grok-cli/bulk-import/route-fe947d4ab19df968.js +1 -0
  850. package/.next/static/chunks/app/api/oauth/iflow/cookie/route-fe947d4ab19df968.js +1 -0
  851. package/.next/static/chunks/app/api/oauth/xiaomi-mimo/api-key/route-fe947d4ab19df968.js +1 -0
  852. package/.next/static/chunks/app/api/oauth/xiaomi-mimo/auto-import/route-fe947d4ab19df968.js +1 -0
  853. package/.next/static/chunks/app/api/pricing/route-fe947d4ab19df968.js +1 -0
  854. package/.next/static/chunks/app/api/provider-nodes/[id]/route-fe947d4ab19df968.js +1 -0
  855. package/.next/static/chunks/app/api/provider-nodes/route-fe947d4ab19df968.js +1 -0
  856. package/.next/static/chunks/app/api/provider-nodes/validate/route-fe947d4ab19df968.js +1 -0
  857. package/.next/static/chunks/app/api/providers/[id]/models/route-fe947d4ab19df968.js +1 -0
  858. package/.next/static/chunks/app/api/providers/[id]/route-fe947d4ab19df968.js +1 -0
  859. package/.next/static/chunks/app/api/providers/[id]/test/route-fe947d4ab19df968.js +1 -0
  860. package/.next/static/chunks/app/api/providers/[id]/test-models/route-fe947d4ab19df968.js +1 -0
  861. package/.next/static/chunks/app/api/providers/client/route-fe947d4ab19df968.js +1 -0
  862. package/.next/static/chunks/app/api/providers/kilo/free-models/route-fe947d4ab19df968.js +1 -0
  863. package/.next/static/chunks/app/api/providers/route-fe947d4ab19df968.js +1 -0
  864. package/.next/static/chunks/app/api/providers/suggested-models/route-fe947d4ab19df968.js +1 -0
  865. package/.next/static/chunks/app/api/providers/test-batch/route-fe947d4ab19df968.js +1 -0
  866. package/.next/static/chunks/app/api/providers/validate/route-fe947d4ab19df968.js +1 -0
  867. package/.next/static/chunks/app/api/proxy-pools/[id]/route-fe947d4ab19df968.js +1 -0
  868. package/.next/static/chunks/app/api/proxy-pools/[id]/test/route-fe947d4ab19df968.js +1 -0
  869. package/.next/static/chunks/app/api/proxy-pools/cloudflare-deploy/route-fe947d4ab19df968.js +1 -0
  870. package/.next/static/chunks/app/api/proxy-pools/deno-deploy/route-fe947d4ab19df968.js +1 -0
  871. package/.next/static/chunks/app/api/proxy-pools/route-fe947d4ab19df968.js +1 -0
  872. package/.next/static/chunks/app/api/proxy-pools/vercel-deploy/route-fe947d4ab19df968.js +1 -0
  873. package/.next/static/chunks/app/api/pxpipe/health/route-fe947d4ab19df968.js +1 -0
  874. package/.next/static/chunks/app/api/pxpipe/install/route-fe947d4ab19df968.js +1 -0
  875. package/.next/static/chunks/app/api/pxpipe/logs/route-fe947d4ab19df968.js +1 -0
  876. package/.next/static/chunks/app/api/pxpipe/restart/route-fe947d4ab19df968.js +1 -0
  877. package/.next/static/chunks/app/api/pxpipe/start/route-fe947d4ab19df968.js +1 -0
  878. package/.next/static/chunks/app/api/pxpipe/stats/route-fe947d4ab19df968.js +1 -0
  879. package/.next/static/chunks/app/api/pxpipe/status/route-fe947d4ab19df968.js +1 -0
  880. package/.next/static/chunks/app/api/pxpipe/stop/route-fe947d4ab19df968.js +1 -0
  881. package/.next/static/chunks/app/api/settings/database/route-fe947d4ab19df968.js +1 -0
  882. package/.next/static/chunks/app/api/settings/proxy-test/route-fe947d4ab19df968.js +1 -0
  883. package/.next/static/chunks/app/api/settings/require-login/route-fe947d4ab19df968.js +1 -0
  884. package/.next/static/chunks/app/api/settings/route-fe947d4ab19df968.js +1 -0
  885. package/.next/static/chunks/app/api/shutdown/route-fe947d4ab19df968.js +1 -0
  886. package/.next/static/chunks/app/api/tags/route-fe947d4ab19df968.js +1 -0
  887. package/.next/static/chunks/app/api/translator/console-logs/route-fe947d4ab19df968.js +1 -0
  888. package/.next/static/chunks/app/api/translator/console-logs/stream/route-fe947d4ab19df968.js +1 -0
  889. package/.next/static/chunks/app/api/translator/load/route-fe947d4ab19df968.js +1 -0
  890. package/.next/static/chunks/app/api/translator/save/route-fe947d4ab19df968.js +1 -0
  891. package/.next/static/chunks/app/api/translator/send/route-fe947d4ab19df968.js +1 -0
  892. package/.next/static/chunks/app/api/translator/translate/route-fe947d4ab19df968.js +1 -0
  893. package/.next/static/chunks/app/api/tunnel/disable/route-fe947d4ab19df968.js +1 -0
  894. package/.next/static/chunks/app/api/tunnel/enable/route-fe947d4ab19df968.js +1 -0
  895. package/.next/static/chunks/app/api/tunnel/status/route-fe947d4ab19df968.js +1 -0
  896. package/.next/static/chunks/app/api/tunnel/tailscale-check/route-fe947d4ab19df968.js +1 -0
  897. package/.next/static/chunks/app/api/tunnel/tailscale-disable/route-fe947d4ab19df968.js +1 -0
  898. package/.next/static/chunks/app/api/tunnel/tailscale-enable/route-fe947d4ab19df968.js +1 -0
  899. package/.next/static/chunks/app/api/tunnel/tailscale-install/route-fe947d4ab19df968.js +1 -0
  900. package/.next/static/chunks/app/api/usage/[connectionId]/codex-reset-credits/route-fe947d4ab19df968.js +1 -0
  901. package/.next/static/chunks/app/api/usage/[connectionId]/route-fe947d4ab19df968.js +1 -0
  902. package/.next/static/chunks/app/api/usage/chart/route-fe947d4ab19df968.js +1 -0
  903. package/.next/static/chunks/app/api/usage/history/route-fe947d4ab19df968.js +1 -0
  904. package/.next/static/chunks/app/api/usage/logs/route-fe947d4ab19df968.js +1 -0
  905. package/.next/static/chunks/app/api/usage/providers/route-fe947d4ab19df968.js +1 -0
  906. package/.next/static/chunks/app/api/usage/request-details/route-fe947d4ab19df968.js +1 -0
  907. package/.next/static/chunks/app/api/usage/request-logs/route-fe947d4ab19df968.js +1 -0
  908. package/.next/static/chunks/app/api/usage/stats/route-fe947d4ab19df968.js +1 -0
  909. package/.next/static/chunks/app/api/usage/stream/route-fe947d4ab19df968.js +1 -0
  910. package/.next/static/chunks/app/api/v1/api/chat/route-fe947d4ab19df968.js +1 -0
  911. package/.next/static/chunks/app/api/v1/audio/speech/route-fe947d4ab19df968.js +1 -0
  912. package/.next/static/chunks/app/api/v1/audio/transcriptions/route-fe947d4ab19df968.js +1 -0
  913. package/.next/static/chunks/app/api/v1/audio/voices/route-fe947d4ab19df968.js +1 -0
  914. package/.next/static/chunks/app/api/v1/chat/completions/route-fe947d4ab19df968.js +1 -0
  915. package/.next/static/chunks/app/api/v1/embeddings/route-fe947d4ab19df968.js +1 -0
  916. package/.next/static/chunks/app/api/v1/images/generations/route-fe947d4ab19df968.js +1 -0
  917. package/.next/static/chunks/app/api/v1/messages/count_tokens/route-fe947d4ab19df968.js +1 -0
  918. package/.next/static/chunks/app/api/v1/messages/route-fe947d4ab19df968.js +1 -0
  919. package/.next/static/chunks/app/api/v1/models/[...model]/route-fe947d4ab19df968.js +1 -0
  920. package/.next/static/chunks/app/api/v1/models/info/route-fe947d4ab19df968.js +1 -0
  921. package/.next/static/chunks/app/api/v1/models/route-fe947d4ab19df968.js +1 -0
  922. package/.next/static/chunks/app/api/v1/responses/compact/route-fe947d4ab19df968.js +1 -0
  923. package/.next/static/chunks/app/api/v1/responses/route-fe947d4ab19df968.js +1 -0
  924. package/.next/static/chunks/app/api/v1/route-fe947d4ab19df968.js +1 -0
  925. package/.next/static/chunks/app/api/v1/search/route-fe947d4ab19df968.js +1 -0
  926. package/.next/static/chunks/app/api/v1/systemone/route-fe947d4ab19df968.js +1 -0
  927. package/.next/static/chunks/app/api/v1/videos/[id]/route-fe947d4ab19df968.js +1 -0
  928. package/.next/static/chunks/app/api/v1/videos/edits/route-fe947d4ab19df968.js +1 -0
  929. package/.next/static/chunks/app/api/v1/videos/extensions/route-fe947d4ab19df968.js +1 -0
  930. package/.next/static/chunks/app/api/v1/videos/generations/route-fe947d4ab19df968.js +1 -0
  931. package/.next/static/chunks/app/api/v1/web/fetch/route-fe947d4ab19df968.js +1 -0
  932. package/.next/static/chunks/app/api/v1beta/models/[...path]/route-fe947d4ab19df968.js +1 -0
  933. package/.next/static/chunks/app/api/v1beta/models/route-fe947d4ab19df968.js +1 -0
  934. package/.next/static/chunks/app/api/version/route-fe947d4ab19df968.js +1 -0
  935. package/.next/static/chunks/app/api/version/shutdown/route-fe947d4ab19df968.js +1 -0
  936. package/.next/static/chunks/app/api/version/update/route-fe947d4ab19df968.js +1 -0
  937. package/.next/static/chunks/app/callback/page-f4019bfc06b9a21c.js +1 -0
  938. package/.next/static/chunks/app/dashboard/settings/pricing/page-b9ee16bd322c018e.js +1 -0
  939. package/.next/static/chunks/app/landing/page-a088604744d51552.js +1 -0
  940. package/.next/static/chunks/app/layout-56cb8d3773a70c00.js +1 -0
  941. package/.next/static/chunks/app/login/page-dd11fb741ed7fda4.js +1 -0
  942. package/.next/static/chunks/app/manifest.webmanifest/route-fe947d4ab19df968.js +1 -0
  943. package/.next/static/chunks/app/page-fe947d4ab19df968.js +1 -0
  944. package/.next/static/chunks/e138dfde-a5c7fa92857215f2.js +1 -0
  945. package/.next/static/chunks/framework-c33600f6d7c90335.js +1 -0
  946. package/.next/static/chunks/main-536afed42e49674c.js +5 -0
  947. package/.next/static/chunks/main-app-17abdf14ff64ab69.js +1 -0
  948. package/.next/static/chunks/next/dist/client/components/builtin/app-error-fe947d4ab19df968.js +1 -0
  949. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-fe947d4ab19df968.js +1 -0
  950. package/.next/static/chunks/next/dist/client/components/builtin/global-error-21486667022bd4cf.js +1 -0
  951. package/.next/static/chunks/next/dist/client/components/builtin/not-found-fe947d4ab19df968.js +1 -0
  952. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-fe947d4ab19df968.js +1 -0
  953. package/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  954. package/.next/static/chunks/webpack-452a2f4aec1a53ee.js +1 -0
  955. package/.next/static/css/8fbebca0759ae504.css +1 -0
  956. package/.next/static/css/e07f2bf4fa519943.css +31 -0
  957. package/.next/static/css/e9178fa7e53ec623.css +1 -0
  958. package/.next/static/media/17cf9497af825577-s.woff2 +0 -0
  959. package/.next/static/media/19cfc7226ec3afaa-s.woff2 +0 -0
  960. package/.next/static/media/1abbc144918f74fd-s.p.woff2 +0 -0
  961. package/.next/static/media/21350d82a1f187e9-s.woff2 +0 -0
  962. package/.next/static/media/8c96cc4bd2a39381-s.p.woff2 +0 -0
  963. package/.next/static/media/8e9860b6e62d6359-s.woff2 +0 -0
  964. package/.next/static/media/ba9851c3c22cd980-s.woff2 +0 -0
  965. package/.next/static/media/c5fe6dc8356a8c31-s.woff2 +0 -0
  966. package/.next/static/media/df0a9ae256c0569c-s.woff2 +0 -0
  967. package/.next/static/media/e4af272ccee01ff0-s.p.woff2 +0 -0
  968. package/LICENSE.md +21 -0
  969. package/README.md +67 -0
  970. package/bin/10router.mjs +301 -0
  971. package/custom-server.js +147 -0
  972. package/next.config.mjs +110 -0
  973. package/open-sse/AGENTS.md +39 -0
  974. package/open-sse/config/appConstants.js +221 -0
  975. package/open-sse/config/codexInstructions.js +119 -0
  976. package/open-sse/config/defaultThinkingSignature.js +14 -0
  977. package/open-sse/config/errorConfig.js +94 -0
  978. package/open-sse/config/googleTtsLanguages.js +62 -0
  979. package/open-sse/config/grokCli.js +10 -0
  980. package/open-sse/config/mediaConfig.js +27 -0
  981. package/open-sse/config/models.js +13 -0
  982. package/open-sse/config/ollamaModels.js +28 -0
  983. package/open-sse/config/providerModels.js +138 -0
  984. package/open-sse/config/providers.js +21 -0
  985. package/open-sse/config/runtimeConfig.js +101 -0
  986. package/open-sse/config/ttsModels.js +199 -0
  987. package/open-sse/executors/antigravity.js +706 -0
  988. package/open-sse/executors/base.js +231 -0
  989. package/open-sse/executors/codex.js +606 -0
  990. package/open-sse/executors/cursor.js +1251 -0
  991. package/open-sse/executors/default.js +352 -0
  992. package/open-sse/executors/index.js +50 -0
  993. package/open-sse/executors/opencode-go.js +216 -0
  994. package/open-sse/executors/opencode-zen.js +343 -0
  995. package/open-sse/executors/opencode.js +618 -0
  996. package/open-sse/executors/qoder.js +860 -0
  997. package/open-sse/executors/xiaomi-mimo.js +107 -0
  998. package/open-sse/executors/xiaomi-tokenplan.js +20 -0
  999. package/open-sse/executors/zed.js +330 -0
  1000. package/open-sse/handlers/chatCore/nonStreamingHandler.js +490 -0
  1001. package/open-sse/handlers/chatCore/requestDetail.js +169 -0
  1002. package/open-sse/handlers/chatCore/sseToJsonHandler.js +503 -0
  1003. package/open-sse/handlers/chatCore/streamingHandler.js +310 -0
  1004. package/open-sse/handlers/chatCore.js +740 -0
  1005. package/open-sse/handlers/embeddingProviders/_base.js +4 -0
  1006. package/open-sse/handlers/embeddingProviders/gemini.js +55 -0
  1007. package/open-sse/handlers/embeddingProviders/index.js +41 -0
  1008. package/open-sse/handlers/embeddingProviders/openai.js +31 -0
  1009. package/open-sse/handlers/embeddingProviders/openaiCompatNode.js +13 -0
  1010. package/open-sse/handlers/embeddingProviders/selfhostedEmbedding.js +49 -0
  1011. package/open-sse/handlers/embeddingsCore.js +144 -0
  1012. package/open-sse/handlers/fetch/index.js +415 -0
  1013. package/open-sse/handlers/imageGenerationCore.js +261 -0
  1014. package/open-sse/handlers/imageProviders/_base.js +31 -0
  1015. package/open-sse/handlers/imageProviders/antigravity.js +88 -0
  1016. package/open-sse/handlers/imageProviders/blackForestLabs.js +47 -0
  1017. package/open-sse/handlers/imageProviders/codex.js +235 -0
  1018. package/open-sse/handlers/imageProviders/comfyui.js +12 -0
  1019. package/open-sse/handlers/imageProviders/falAi.js +44 -0
  1020. package/open-sse/handlers/imageProviders/gemini.js +28 -0
  1021. package/open-sse/handlers/imageProviders/huggingface.js +23 -0
  1022. package/open-sse/handlers/imageProviders/index.js +41 -0
  1023. package/open-sse/handlers/imageProviders/nanobanana.js +61 -0
  1024. package/open-sse/handlers/imageProviders/openai.js +33 -0
  1025. package/open-sse/handlers/imageProviders/runwayml.js +60 -0
  1026. package/open-sse/handlers/imageProviders/sdwebui.js +22 -0
  1027. package/open-sse/handlers/imageProviders/stabilityAi.js +35 -0
  1028. package/open-sse/handlers/responsesHandler.js +107 -0
  1029. package/open-sse/handlers/search/callers.js +469 -0
  1030. package/open-sse/handlers/search/chatSearch.js +502 -0
  1031. package/open-sse/handlers/search/index.js +246 -0
  1032. package/open-sse/handlers/search/normalizers.js +414 -0
  1033. package/open-sse/handlers/sttCore.js +262 -0
  1034. package/open-sse/handlers/systemoneCore.js +89 -0
  1035. package/open-sse/handlers/ttsCore.js +88 -0
  1036. package/open-sse/handlers/ttsProviders/_base.js +51 -0
  1037. package/open-sse/handlers/ttsProviders/edgeTts.js +89 -0
  1038. package/open-sse/handlers/ttsProviders/elevenlabs.js +48 -0
  1039. package/open-sse/handlers/ttsProviders/gemini.js +136 -0
  1040. package/open-sse/handlers/ttsProviders/genericFormats.js +191 -0
  1041. package/open-sse/handlers/ttsProviders/googleTts.js +64 -0
  1042. package/open-sse/handlers/ttsProviders/index.js +56 -0
  1043. package/open-sse/handlers/ttsProviders/localDevice.js +98 -0
  1044. package/open-sse/handlers/ttsProviders/minimax.js +63 -0
  1045. package/open-sse/handlers/ttsProviders/openai.js +36 -0
  1046. package/open-sse/handlers/ttsProviders/openrouter.js +73 -0
  1047. package/open-sse/handlers/ttsProviders/selfhostedTts.js +70 -0
  1048. package/open-sse/handlers/ttsProviders/xiaomi-mimo.js +71 -0
  1049. package/open-sse/handlers/videoCore.js +242 -0
  1050. package/open-sse/handlers/videoProviders/index.js +12 -0
  1051. package/open-sse/handlers/videoProviders/openrouter.js +43 -0
  1052. package/open-sse/index.js +84 -0
  1053. package/open-sse/providers/REGISTRY_TEMPLATE.js +98 -0
  1054. package/open-sse/providers/capabilities.js +1543 -0
  1055. package/open-sse/providers/catalogOverride.js +82 -0
  1056. package/open-sse/providers/index.js +63 -0
  1057. package/open-sse/providers/models/helpers.js +27 -0
  1058. package/open-sse/providers/models/namePatterns.js +33 -0
  1059. package/open-sse/providers/models/schema.js +48 -0
  1060. package/open-sse/providers/pricing.js +1204 -0
  1061. package/open-sse/providers/registry/antigravity.js +147 -0
  1062. package/open-sse/providers/registry/claude.js +81 -0
  1063. package/open-sse/providers/registry/codex.js +210 -0
  1064. package/open-sse/providers/registry/cursor.js +58 -0
  1065. package/open-sse/providers/registry/deepseek.js +74 -0
  1066. package/open-sse/providers/registry/fish-audio.js +31 -0
  1067. package/open-sse/providers/registry/gemini.js +126 -0
  1068. package/open-sse/providers/registry/glm-cn.js +39 -0
  1069. package/open-sse/providers/registry/glm.js +75 -0
  1070. package/open-sse/providers/registry/groq.js +62 -0
  1071. package/open-sse/providers/registry/huggingface.js +40 -0
  1072. package/open-sse/providers/registry/iflow.js +52 -0
  1073. package/open-sse/providers/registry/index.js +59 -0
  1074. package/open-sse/providers/registry/mimo-free.js +25 -0
  1075. package/open-sse/providers/registry/minimax-cn.js +82 -0
  1076. package/open-sse/providers/registry/minimax.js +94 -0
  1077. package/open-sse/providers/registry/openai.js +122 -0
  1078. package/open-sse/providers/registry/opencode-go.js +115 -0
  1079. package/open-sse/providers/registry/opencode-zen.js +297 -0
  1080. package/open-sse/providers/registry/opencode.js +54 -0
  1081. package/open-sse/providers/registry/openrouter.js +128 -0
  1082. package/open-sse/providers/registry/qoder.js +61 -0
  1083. package/open-sse/providers/registry/siliconflow.js +39 -0
  1084. package/open-sse/providers/registry/vercel-ai-gateway.js +42 -0
  1085. package/open-sse/providers/registry/xai.js +59 -0
  1086. package/open-sse/providers/registry/xiaomi-mimo.js +90 -0
  1087. package/open-sse/providers/registry/xiaomi-tokenplan.js +66 -0
  1088. package/open-sse/providers/registry/xquik.js +31 -0
  1089. package/open-sse/providers/registry/zed.js +70 -0
  1090. package/open-sse/providers/schema.js +76 -0
  1091. package/open-sse/providers/shared.js +114 -0
  1092. package/open-sse/providers/thinkingLevels.js +74 -0
  1093. package/open-sse/providers/visionPatterns.js +58 -0
  1094. package/open-sse/rtk/applyFilter.js +17 -0
  1095. package/open-sse/rtk/autodetect.js +124 -0
  1096. package/open-sse/rtk/caveman.js +9 -0
  1097. package/open-sse/rtk/cavemanPrompts.js +118 -0
  1098. package/open-sse/rtk/constants.js +78 -0
  1099. package/open-sse/rtk/filters/buildOutput.js +133 -0
  1100. package/open-sse/rtk/filters/dedupLog.js +44 -0
  1101. package/open-sse/rtk/filters/find.js +50 -0
  1102. package/open-sse/rtk/filters/gitDiff.js +92 -0
  1103. package/open-sse/rtk/filters/gitLog.js +102 -0
  1104. package/open-sse/rtk/filters/gitStatus.js +129 -0
  1105. package/open-sse/rtk/filters/grep.js +48 -0
  1106. package/open-sse/rtk/filters/ls.js +83 -0
  1107. package/open-sse/rtk/filters/readNumbered.js +27 -0
  1108. package/open-sse/rtk/filters/searchList.js +52 -0
  1109. package/open-sse/rtk/filters/smartTruncate.js +19 -0
  1110. package/open-sse/rtk/filters/tree.js +32 -0
  1111. package/open-sse/rtk/headroom.js +296 -0
  1112. package/open-sse/rtk/index.js +122 -0
  1113. package/open-sse/rtk/ponytail.js +9 -0
  1114. package/open-sse/rtk/ponytailPrompt.js +58 -0
  1115. package/open-sse/rtk/pxpipe.js +113 -0
  1116. package/open-sse/rtk/registry.js +40 -0
  1117. package/open-sse/rtk/systemInject.js +301 -0
  1118. package/open-sse/services/accountFallback.js +244 -0
  1119. package/open-sse/services/capacityAdapter.js +182 -0
  1120. package/open-sse/services/combo.js +715 -0
  1121. package/open-sse/services/compact.js +70 -0
  1122. package/open-sse/services/copilotModels.js +163 -0
  1123. package/open-sse/services/cursorModels.js +209 -0
  1124. package/open-sse/services/grokCliModels.js +128 -0
  1125. package/open-sse/services/kimchiModels.js +191 -0
  1126. package/open-sse/services/model.js +141 -0
  1127. package/open-sse/services/oauthCredentialManager.js +165 -0
  1128. package/open-sse/services/projectId.js +343 -0
  1129. package/open-sse/services/provider.js +181 -0
  1130. package/open-sse/services/qoderModels.js +410 -0
  1131. package/open-sse/services/thoughtSignatureStore.js +210 -0
  1132. package/open-sse/services/tokenRefresh/dedup.js +31 -0
  1133. package/open-sse/services/tokenRefresh/providers.js +564 -0
  1134. package/open-sse/services/tokenRefresh.js +201 -0
  1135. package/open-sse/services/usage/antigravity-weekly.js +155 -0
  1136. package/open-sse/services/usage/claude.js +211 -0
  1137. package/open-sse/services/usage/codebuddy-cn.js +172 -0
  1138. package/open-sse/services/usage/codex.js +283 -0
  1139. package/open-sse/services/usage/commandcode.js +153 -0
  1140. package/open-sse/services/usage/deepseek.js +103 -0
  1141. package/open-sse/services/usage/github.js +107 -0
  1142. package/open-sse/services/usage/glm.js +88 -0
  1143. package/open-sse/services/usage/google.js +223 -0
  1144. package/open-sse/services/usage/grok-cli.js +414 -0
  1145. package/open-sse/services/usage/grokCliQuotaFrame.js +194 -0
  1146. package/open-sse/services/usage/groq.js +133 -0
  1147. package/open-sse/services/usage/minimax.js +297 -0
  1148. package/open-sse/services/usage/misc.js +275 -0
  1149. package/open-sse/services/usage/opencode-go.js +106 -0
  1150. package/open-sse/services/usage/shared.js +70 -0
  1151. package/open-sse/services/usage/xiaomi-mimo.js +129 -0
  1152. package/open-sse/services/usage/zed.js +220 -0
  1153. package/open-sse/services/usage.js +88 -0
  1154. package/open-sse/shared/machineId.js +23 -0
  1155. package/open-sse/shared/mimoAccount.js +306 -0
  1156. package/open-sse/shared/qoder/attachments.js +436 -0
  1157. package/open-sse/shared/qoder/constants.js +182 -0
  1158. package/open-sse/shared/qoder/contextTier.js +180 -0
  1159. package/open-sse/shared/qoder/cosy.js +175 -0
  1160. package/open-sse/shared/qoder/encoding.js +55 -0
  1161. package/open-sse/shared/qoder/sse.js +209 -0
  1162. package/open-sse/shared/zedAuth.js +431 -0
  1163. package/open-sse/transformer/responsesTransformer.js +438 -0
  1164. package/open-sse/transformer/streamToJsonConverter.js +113 -0
  1165. package/open-sse/translator/concerns/chunk.js +11 -0
  1166. package/open-sse/translator/concerns/finishReason.js +87 -0
  1167. package/open-sse/translator/concerns/image.js +158 -0
  1168. package/open-sse/translator/concerns/json.js +9 -0
  1169. package/open-sse/translator/concerns/message.js +8 -0
  1170. package/open-sse/translator/concerns/modality.js +182 -0
  1171. package/open-sse/translator/concerns/paramSupport.js +80 -0
  1172. package/open-sse/translator/concerns/prefetch.js +111 -0
  1173. package/open-sse/translator/concerns/reasoning.js +23 -0
  1174. package/open-sse/translator/concerns/thinking.js +53 -0
  1175. package/open-sse/translator/concerns/thinkingUnified.js +438 -0
  1176. package/open-sse/translator/concerns/toolCall.js +185 -0
  1177. package/open-sse/translator/concerns/usage.js +98 -0
  1178. package/open-sse/translator/formats/claude.js +705 -0
  1179. package/open-sse/translator/formats/gemini.js +498 -0
  1180. package/open-sse/translator/formats/maxTokens.js +33 -0
  1181. package/open-sse/translator/formats/openai.js +150 -0
  1182. package/open-sse/translator/formats/responsesApi.js +210 -0
  1183. package/open-sse/translator/formats.js +32 -0
  1184. package/open-sse/translator/index.js +297 -0
  1185. package/open-sse/translator/request/antigravity-to-openai.js +250 -0
  1186. package/open-sse/translator/request/claude-to-openai.js +297 -0
  1187. package/open-sse/translator/request/gemini-to-openai.js +152 -0
  1188. package/open-sse/translator/request/openai-responses.js +502 -0
  1189. package/open-sse/translator/request/openai-to-claude.js +413 -0
  1190. package/open-sse/translator/request/openai-to-cursor.js +185 -0
  1191. package/open-sse/translator/request/openai-to-gemini.js +477 -0
  1192. package/open-sse/translator/response/claude-to-openai.js +227 -0
  1193. package/open-sse/translator/response/cursor-to-openai.js +30 -0
  1194. package/open-sse/translator/response/gemini-to-openai.js +172 -0
  1195. package/open-sse/translator/response/openai-responses.js +652 -0
  1196. package/open-sse/translator/response/openai-to-antigravity.js +127 -0
  1197. package/open-sse/translator/response/openai-to-claude.js +276 -0
  1198. package/open-sse/translator/schema/blocks.js +57 -0
  1199. package/open-sse/translator/schema/defaults.js +7 -0
  1200. package/open-sse/translator/schema/finishReasons.js +28 -0
  1201. package/open-sse/translator/schema/index.js +11 -0
  1202. package/open-sse/translator/schema/roles.js +16 -0
  1203. package/open-sse/utils/bypassHandler.js +327 -0
  1204. package/open-sse/utils/claudeCloaking.js +274 -0
  1205. package/open-sse/utils/claudeSignature.js +41 -0
  1206. package/open-sse/utils/claudeToolTypeSelfCheck.mjs +121 -0
  1207. package/open-sse/utils/clientDetector.js +70 -0
  1208. package/open-sse/utils/codexToolSchema.js +80 -0
  1209. package/open-sse/utils/cursorChecksum.js +151 -0
  1210. package/open-sse/utils/cursorProtobuf.js +999 -0
  1211. package/open-sse/utils/debugLog.js +19 -0
  1212. package/open-sse/utils/error.js +159 -0
  1213. package/open-sse/utils/modelMarkers.js +23 -0
  1214. package/open-sse/utils/ollamaTransform.js +102 -0
  1215. package/open-sse/utils/opencodeFreeUsage.js +115 -0
  1216. package/open-sse/utils/proxyFetch.js +258 -0
  1217. package/open-sse/utils/reasoningContentInjector.js +77 -0
  1218. package/open-sse/utils/requestLogger.js +271 -0
  1219. package/open-sse/utils/responsesStreamHelpers.js +53 -0
  1220. package/open-sse/utils/sessionManager.js +286 -0
  1221. package/open-sse/utils/sse.js +14 -0
  1222. package/open-sse/utils/sseConstants.js +23 -0
  1223. package/open-sse/utils/stream.js +612 -0
  1224. package/open-sse/utils/streamHandler.js +329 -0
  1225. package/open-sse/utils/streamHelpers.js +155 -0
  1226. package/open-sse/utils/toolDeduper.js +49 -0
  1227. package/open-sse/utils/usageTracking.js +473 -0
  1228. package/package.json +118 -0
  1229. package/public/favicon.svg +72 -0
  1230. package/public/i18n/literals/fa.json +1380 -0
  1231. package/public/icons/icon-192.svg +22 -0
  1232. package/public/icons/icon-512.svg +22 -0
  1233. package/public/icons/icon.svg +72 -0
  1234. package/public/providers/agentrouter.png +0 -0
  1235. package/public/providers/alicode-intl.png +0 -0
  1236. package/public/providers/alicode.png +0 -0
  1237. package/public/providers/alims-intl.png +0 -0
  1238. package/public/providers/alitp-intl.png +0 -0
  1239. package/public/providers/amp.png +0 -0
  1240. package/public/providers/anthropic.png +0 -0
  1241. package/public/providers/api-airforce.png +0 -0
  1242. package/public/providers/assemblyai.png +0 -0
  1243. package/public/providers/aws-polly.png +0 -0
  1244. package/public/providers/azure.png +0 -0
  1245. package/public/providers/baidu.png +0 -0
  1246. package/public/providers/bazaarlink.png +0 -0
  1247. package/public/providers/black-forest-labs.png +0 -0
  1248. package/public/providers/blackbox.png +0 -0
  1249. package/public/providers/bluesminds.png +0 -0
  1250. package/public/providers/brave-search.png +0 -0
  1251. package/public/providers/byteplus.png +0 -0
  1252. package/public/providers/cartesia.png +0 -0
  1253. package/public/providers/cerebras.png +0 -0
  1254. package/public/providers/chutes.png +0 -0
  1255. package/public/providers/claude.png +0 -0
  1256. package/public/providers/clinepass.png +0 -0
  1257. package/public/providers/codebuddy-cn.png +0 -0
  1258. package/public/providers/codebuddy-intl.png +0 -0
  1259. package/public/providers/codex.png +0 -0
  1260. package/public/providers/cohere.png +0 -0
  1261. package/public/providers/comfyui.png +0 -0
  1262. package/public/providers/commandcode.png +0 -0
  1263. package/public/providers/continue.png +0 -0
  1264. package/public/providers/coqui.png +0 -0
  1265. package/public/providers/cursor.png +0 -0
  1266. package/public/providers/deepgram.png +0 -0
  1267. package/public/providers/deepseek-tui.png +0 -0
  1268. package/public/providers/deepseek.png +0 -0
  1269. package/public/providers/devin-cli.png +0 -0
  1270. package/public/providers/droid.png +0 -0
  1271. package/public/providers/edge-tts.png +0 -0
  1272. package/public/providers/elevenlabs.png +0 -0
  1273. package/public/providers/exa.png +0 -0
  1274. package/public/providers/fal-ai.png +0 -0
  1275. package/public/providers/featherless.png +0 -0
  1276. package/public/providers/firecrawl.png +0 -0
  1277. package/public/providers/fireworks.png +0 -0
  1278. package/public/providers/fish-audio.png +0 -0
  1279. package/public/providers/gemini.png +0 -0
  1280. package/public/providers/github.png +0 -0
  1281. package/public/providers/gitlab.png +0 -0
  1282. package/public/providers/glm-cn.png +0 -0
  1283. package/public/providers/glm.png +0 -0
  1284. package/public/providers/google-pse.png +0 -0
  1285. package/public/providers/google-tts.png +0 -0
  1286. package/public/providers/grok-cli.png +0 -0
  1287. package/public/providers/grok-web.png +0 -0
  1288. package/public/providers/groq.png +0 -0
  1289. package/public/providers/hermes.png +0 -0
  1290. package/public/providers/huggingface.png +0 -0
  1291. package/public/providers/hyperbolic.png +0 -0
  1292. package/public/providers/iflow.png +0 -0
  1293. package/public/providers/inworld.png +0 -0
  1294. package/public/providers/jcode.png +0 -0
  1295. package/public/providers/jina-ai.png +0 -0
  1296. package/public/providers/jina-reader.png +0 -0
  1297. package/public/providers/kilo-gateway.png +0 -0
  1298. package/public/providers/kilocode.png +0 -0
  1299. package/public/providers/kimchi.png +0 -0
  1300. package/public/providers/kimchi.svg +4 -0
  1301. package/public/providers/linkup.png +0 -0
  1302. package/public/providers/llm7.png +0 -0
  1303. package/public/providers/local-device.png +0 -0
  1304. package/public/providers/longcat.png +0 -0
  1305. package/public/providers/mimo-free.png +0 -0
  1306. package/public/providers/minimax-cn.png +0 -0
  1307. package/public/providers/minimax.png +0 -0
  1308. package/public/providers/mistral.png +0 -0
  1309. package/public/providers/mmf.png +0 -0
  1310. package/public/providers/morph.png +0 -0
  1311. package/public/providers/nanobanana.png +0 -0
  1312. package/public/providers/nebius.png +0 -0
  1313. package/public/providers/novita.png +0 -0
  1314. package/public/providers/nvidia.png +0 -0
  1315. package/public/providers/ollama-local.png +0 -0
  1316. package/public/providers/ollama.png +0 -0
  1317. package/public/providers/openai.png +0 -0
  1318. package/public/providers/openclaw.png +0 -0
  1319. package/public/providers/opencode-go.png +0 -0
  1320. package/public/providers/opencode.png +0 -0
  1321. package/public/providers/opendesign.png +0 -0
  1322. package/public/providers/openrouter.png +0 -0
  1323. package/public/providers/perplexity-agent.png +0 -0
  1324. package/public/providers/perplexity-web.png +0 -0
  1325. package/public/providers/perplexity.png +0 -0
  1326. package/public/providers/playht.png +0 -0
  1327. package/public/providers/poolside.png +0 -0
  1328. package/public/providers/qoder.png +0 -0
  1329. package/public/providers/qwen.png +0 -0
  1330. package/public/providers/recraft.png +0 -0
  1331. package/public/providers/reka.png +0 -0
  1332. package/public/providers/roo.png +0 -0
  1333. package/public/providers/runwayml.png +0 -0
  1334. package/public/providers/sambanova.png +0 -0
  1335. package/public/providers/sdwebui.png +0 -0
  1336. package/public/providers/searchapi.png +0 -0
  1337. package/public/providers/searxng.png +0 -0
  1338. package/public/providers/selfhosted-embedding.png +0 -0
  1339. package/public/providers/selfhosted-stt.png +0 -0
  1340. package/public/providers/selfhosted-tts.png +0 -0
  1341. package/public/providers/serper.png +0 -0
  1342. package/public/providers/siliconflow.png +0 -0
  1343. package/public/providers/stability-ai.png +0 -0
  1344. package/public/providers/tavily.png +0 -0
  1345. package/public/providers/tencent.png +0 -0
  1346. package/public/providers/together.png +0 -0
  1347. package/public/providers/tokenrouter.png +0 -0
  1348. package/public/providers/topaz.png +0 -0
  1349. package/public/providers/tortoise.png +0 -0
  1350. package/public/providers/trae.png +0 -0
  1351. package/public/providers/venice.png +0 -0
  1352. package/public/providers/vercel-ai-gateway.png +0 -0
  1353. package/public/providers/vercel.png +0 -0
  1354. package/public/providers/volcengine-ark.png +0 -0
  1355. package/public/providers/voyage-ai.png +0 -0
  1356. package/public/providers/windsurf.png +0 -0
  1357. package/public/providers/workbuddy.png +0 -0
  1358. package/public/providers/xai.png +0 -0
  1359. package/public/providers/xiaomi-mimo.png +0 -0
  1360. package/public/providers/xiaomi-tokenplan.png +0 -0
  1361. package/public/providers/xquik.png +0 -0
  1362. package/public/providers/youcom.png +0 -0
  1363. package/public/providers/zed.png +0 -0
  1364. package/public/sw.js +22 -0
  1365. package/scripts/dev-local.mjs +67 -0
  1366. package/src/app/(dashboard)/dashboard/basic-chat/BasicChatPageClient.tsx +1140 -0
  1367. package/src/app/(dashboard)/dashboard/basic-chat/page.tsx +5 -0
  1368. package/src/app/(dashboard)/dashboard/cli-tools/CLIToolsPageClient.tsx +69 -0
  1369. package/src/app/(dashboard)/dashboard/cli-tools/[toolId]/ToolDetailClient.tsx +279 -0
  1370. package/src/app/(dashboard)/dashboard/cli-tools/[toolId]/page.tsx +11 -0
  1371. package/src/app/(dashboard)/dashboard/cli-tools/components/cards/ClaudeToolCard.tsx +705 -0
  1372. package/src/app/(dashboard)/dashboard/cli-tools/components/cards/CodexToolCard.tsx +596 -0
  1373. package/src/app/(dashboard)/dashboard/cli-tools/components/cards/CoworkToolCard.tsx +835 -0
  1374. package/src/app/(dashboard)/dashboard/cli-tools/components/cards/DefaultToolCard.tsx +318 -0
  1375. package/src/app/(dashboard)/dashboard/cli-tools/components/cards/DshToolCard.tsx +537 -0
  1376. package/src/app/(dashboard)/dashboard/cli-tools/components/cards/OpenCodeToolCard.tsx +661 -0
  1377. package/src/app/(dashboard)/dashboard/cli-tools/components/cards/ToolSummaryCard.tsx +49 -0
  1378. package/src/app/(dashboard)/dashboard/cli-tools/components/cards/index.ts +7 -0
  1379. package/src/app/(dashboard)/dashboard/cli-tools/components/index.ts +11 -0
  1380. package/src/app/(dashboard)/dashboard/cli-tools/components/shared/ApiKeySelect.tsx +155 -0
  1381. package/src/app/(dashboard)/dashboard/cli-tools/components/shared/BaseUrlSelect.tsx +241 -0
  1382. package/src/app/(dashboard)/dashboard/cli-tools/components/shared/cliEndpointMatch.ts +13 -0
  1383. package/src/app/(dashboard)/dashboard/cli-tools/components/shared/cliEndpointPresets.ts +106 -0
  1384. package/src/app/(dashboard)/dashboard/cli-tools/components/shared/index.ts +4 -0
  1385. package/src/app/(dashboard)/dashboard/cli-tools/page.tsx +7 -0
  1386. package/src/app/(dashboard)/dashboard/combos/page.tsx +901 -0
  1387. package/src/app/(dashboard)/dashboard/console-log/ConsoleLogClient.tsx +414 -0
  1388. package/src/app/(dashboard)/dashboard/console-log/page.tsx +8 -0
  1389. package/src/app/(dashboard)/dashboard/endpoint/EndpointPageClient.tsx +434 -0
  1390. package/src/app/(dashboard)/dashboard/endpoint/components/EndpointRow.tsx +35 -0
  1391. package/src/app/(dashboard)/dashboard/endpoint/components/SecurityWarning.tsx +30 -0
  1392. package/src/app/(dashboard)/dashboard/endpoint/components/StatusAlert.tsx +33 -0
  1393. package/src/app/(dashboard)/dashboard/endpoint/endpointConstants.ts +37 -0
  1394. package/src/app/(dashboard)/dashboard/endpoint/endpointPing.ts +33 -0
  1395. package/src/app/(dashboard)/dashboard/endpoint/page.tsx +7 -0
  1396. package/src/app/(dashboard)/dashboard/media-providers/systemone/[id]/page.tsx +350 -0
  1397. package/src/app/(dashboard)/dashboard/media-providers/systemone/page.tsx +124 -0
  1398. package/src/app/(dashboard)/dashboard/page.tsx +7 -0
  1399. package/src/app/(dashboard)/dashboard/profile/page.tsx +905 -0
  1400. package/src/app/(dashboard)/dashboard/providers/[id]/AddApiKeyModal.tsx +380 -0
  1401. package/src/app/(dashboard)/dashboard/providers/[id]/AddCustomModelModal.tsx +171 -0
  1402. package/src/app/(dashboard)/dashboard/providers/[id]/BulkImportCodexModal.tsx +147 -0
  1403. package/src/app/(dashboard)/dashboard/providers/[id]/BulkImportGrokCliModal.tsx +289 -0
  1404. package/src/app/(dashboard)/dashboard/providers/[id]/CompatibleModelsSection.tsx +259 -0
  1405. package/src/app/(dashboard)/dashboard/providers/[id]/ConnectionRow.tsx +362 -0
  1406. package/src/app/(dashboard)/dashboard/providers/[id]/CooldownTimer.tsx +32 -0
  1407. package/src/app/(dashboard)/dashboard/providers/[id]/EditCompatibleNodeModal.tsx +163 -0
  1408. package/src/app/(dashboard)/dashboard/providers/[id]/ModelRow.tsx +116 -0
  1409. package/src/app/(dashboard)/dashboard/providers/[id]/PassthroughModelsSection.tsx +183 -0
  1410. package/src/app/(dashboard)/dashboard/providers/[id]/page.tsx +1918 -0
  1411. package/src/app/(dashboard)/dashboard/providers/[id]/useOneByOneTest.ts +102 -0
  1412. package/src/app/(dashboard)/dashboard/providers/components/AddCompatibleModal.tsx +185 -0
  1413. package/src/app/(dashboard)/dashboard/providers/components/ConnectionsCard.tsx +476 -0
  1414. package/src/app/(dashboard)/dashboard/providers/components/ModelAvailabilityBadge.tsx +192 -0
  1415. package/src/app/(dashboard)/dashboard/providers/components/ModelsCard.tsx +344 -0
  1416. package/src/app/(dashboard)/dashboard/providers/new/page.tsx +275 -0
  1417. package/src/app/(dashboard)/dashboard/providers/page.tsx +614 -0
  1418. package/src/app/(dashboard)/dashboard/providers/utils.ts +19 -0
  1419. package/src/app/(dashboard)/dashboard/proxy-pools/page.tsx +1305 -0
  1420. package/src/app/(dashboard)/dashboard/pxpipe/PxpipeClient.tsx +404 -0
  1421. package/src/app/(dashboard)/dashboard/pxpipe/page.tsx +5 -0
  1422. package/src/app/(dashboard)/dashboard/quota/page.tsx +11 -0
  1423. package/src/app/(dashboard)/dashboard/token-saver/TokenSaverClient.tsx +1096 -0
  1424. package/src/app/(dashboard)/dashboard/token-saver/page.tsx +5 -0
  1425. package/src/app/(dashboard)/dashboard/usage/components/OverviewCards.tsx +53 -0
  1426. package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/ProviderLimitCard.tsx +175 -0
  1427. package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/QuotaProgressBar.tsx +131 -0
  1428. package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/QuotaTable.tsx +314 -0
  1429. package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/index.tsx +1507 -0
  1430. package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/utils.ts +698 -0
  1431. package/src/app/(dashboard)/dashboard/usage/components/ProviderTopology.tsx +550 -0
  1432. package/src/app/(dashboard)/dashboard/usage/components/UsageChart.tsx +152 -0
  1433. package/src/app/(dashboard)/dashboard/usage/components/UsageTable.tsx +249 -0
  1434. package/src/app/(dashboard)/dashboard/usage/page.tsx +70 -0
  1435. package/src/app/(dashboard)/layout.tsx +5 -0
  1436. package/src/app/api/auth/login/route.js +146 -0
  1437. package/src/app/api/auth/logout/route.js +12 -0
  1438. package/src/app/api/auth/oidc/callback/route.js +100 -0
  1439. package/src/app/api/auth/oidc/start/route.js +59 -0
  1440. package/src/app/api/auth/oidc/test/route.js +86 -0
  1441. package/src/app/api/auth/reset-password/route.js +13 -0
  1442. package/src/app/api/auth/saml/acs/route.js +74 -0
  1443. package/src/app/api/auth/saml/metadata/route.js +28 -0
  1444. package/src/app/api/auth/saml/start/route.js +32 -0
  1445. package/src/app/api/auth/saml/test/route.js +84 -0
  1446. package/src/app/api/auth/status/route.js +72 -0
  1447. package/src/app/api/changelog/route.js +28 -0
  1448. package/src/app/api/cli-tools/all-statuses/route.js +32 -0
  1449. package/src/app/api/cli-tools/claude-settings/route.js +266 -0
  1450. package/src/app/api/cli-tools/codex-settings/profiles.js +109 -0
  1451. package/src/app/api/cli-tools/codex-settings/route.js +411 -0
  1452. package/src/app/api/cli-tools/cowork-mcp-registry/route.js +77 -0
  1453. package/src/app/api/cli-tools/cowork-mcp-tools/route.js +116 -0
  1454. package/src/app/api/cli-tools/cowork-settings/route.js +487 -0
  1455. package/src/app/api/cli-tools/dsh-settings/route.ts +254 -0
  1456. package/src/app/api/cli-tools/opencode-settings/route.js +334 -0
  1457. package/src/app/api/combos/[id]/route.js +84 -0
  1458. package/src/app/api/combos/route.js +51 -0
  1459. package/src/app/api/headroom/extras/route.js +54 -0
  1460. package/src/app/api/headroom/proxy/[...path]/route.js +104 -0
  1461. package/src/app/api/headroom/restart/route.js +43 -0
  1462. package/src/app/api/headroom/start/route.js +43 -0
  1463. package/src/app/api/headroom/status/route.js +18 -0
  1464. package/src/app/api/headroom/stop/route.js +14 -0
  1465. package/src/app/api/health/route.js +15 -0
  1466. package/src/app/api/init/route.js +4 -0
  1467. package/src/app/api/keys/[id]/route.js +58 -0
  1468. package/src/app/api/keys/route.js +45 -0
  1469. package/src/app/api/locale/route.js +24 -0
  1470. package/src/app/api/mcp/[plugin]/message/route.js +19 -0
  1471. package/src/app/api/mcp/[plugin]/sse/route.js +35 -0
  1472. package/src/app/api/media-providers/tts/deepgram/voices/route.js +76 -0
  1473. package/src/app/api/media-providers/tts/elevenlabs/voices/route.js +77 -0
  1474. package/src/app/api/media-providers/tts/inworld/voices/route.js +71 -0
  1475. package/src/app/api/media-providers/tts/minimax/voices/route.js +126 -0
  1476. package/src/app/api/media-providers/tts/voices/route.js +110 -0
  1477. package/src/app/api/models/alias/route.js +53 -0
  1478. package/src/app/api/models/availability/route.js +94 -0
  1479. package/src/app/api/models/catalog-sync/route.js +34 -0
  1480. package/src/app/api/models/custom/route.js +66 -0
  1481. package/src/app/api/models/disabled/route.js +50 -0
  1482. package/src/app/api/models/route.js +101 -0
  1483. package/src/app/api/models/test/ping.js +318 -0
  1484. package/src/app/api/models/test/route.js +14 -0
  1485. package/src/app/api/oauth/[provider]/[action]/route.js +604 -0
  1486. package/src/app/api/oauth/codex/bulk-import/route.js +115 -0
  1487. package/src/app/api/oauth/codex/import-token/route.js +93 -0
  1488. package/src/app/api/oauth/cursor/auto-import/route.js +238 -0
  1489. package/src/app/api/oauth/cursor/import/route.js +91 -0
  1490. package/src/app/api/oauth/gitlab/pat/route.js +65 -0
  1491. package/src/app/api/oauth/grok-cli/bulk-import/route.js +107 -0
  1492. package/src/app/api/oauth/iflow/cookie/route.js +139 -0
  1493. package/src/app/api/oauth/xiaomi-mimo/api-key/route.js +129 -0
  1494. package/src/app/api/oauth/xiaomi-mimo/auto-import/route.js +135 -0
  1495. package/src/app/api/pricing/route.js +121 -0
  1496. package/src/app/api/provider-nodes/[id]/route.js +113 -0
  1497. package/src/app/api/provider-nodes/route.js +112 -0
  1498. package/src/app/api/provider-nodes/validate/route.js +222 -0
  1499. package/src/app/api/providers/[id]/models/route.js +579 -0
  1500. package/src/app/api/providers/[id]/route.js +189 -0
  1501. package/src/app/api/providers/[id]/test/route.js +23 -0
  1502. package/src/app/api/providers/[id]/test/testUtils.js +1107 -0
  1503. package/src/app/api/providers/[id]/test-models/route.js +79 -0
  1504. package/src/app/api/providers/client/route.js +163 -0
  1505. package/src/app/api/providers/kilo/free-models/route.js +55 -0
  1506. package/src/app/api/providers/route.js +218 -0
  1507. package/src/app/api/providers/suggested-models/filters.js +42 -0
  1508. package/src/app/api/providers/suggested-models/route.js +32 -0
  1509. package/src/app/api/providers/test-batch/route.js +133 -0
  1510. package/src/app/api/providers/validate/route.js +700 -0
  1511. package/src/app/api/proxy-pools/[id]/route.js +152 -0
  1512. package/src/app/api/proxy-pools/[id]/test/route.js +72 -0
  1513. package/src/app/api/proxy-pools/cloudflare-deploy/route.js +167 -0
  1514. package/src/app/api/proxy-pools/deno-deploy/route.js +172 -0
  1515. package/src/app/api/proxy-pools/route.js +93 -0
  1516. package/src/app/api/proxy-pools/vercel-deploy/route.js +142 -0
  1517. package/src/app/api/pxpipe/health/route.js +16 -0
  1518. package/src/app/api/pxpipe/install/route.js +20 -0
  1519. package/src/app/api/pxpipe/logs/route.js +18 -0
  1520. package/src/app/api/pxpipe/restart/route.js +16 -0
  1521. package/src/app/api/pxpipe/start/route.js +29 -0
  1522. package/src/app/api/pxpipe/stats/route.js +14 -0
  1523. package/src/app/api/pxpipe/status/route.js +21 -0
  1524. package/src/app/api/pxpipe/stop/route.js +16 -0
  1525. package/src/app/api/settings/database/route.js +54 -0
  1526. package/src/app/api/settings/proxy-test/route.js +27 -0
  1527. package/src/app/api/settings/require-login/route.js +15 -0
  1528. package/src/app/api/settings/route.js +149 -0
  1529. package/src/app/api/shutdown/route.js +26 -0
  1530. package/src/app/api/tags/route.js +17 -0
  1531. package/src/app/api/translator/console-logs/route.js +24 -0
  1532. package/src/app/api/translator/console-logs/stream/route.js +98 -0
  1533. package/src/app/api/translator/load/route.js +48 -0
  1534. package/src/app/api/translator/save/route.js +47 -0
  1535. package/src/app/api/translator/send/route.js +105 -0
  1536. package/src/app/api/translator/translate/route.js +118 -0
  1537. package/src/app/api/tunnel/disable/route.js +17 -0
  1538. package/src/app/api/tunnel/enable/route.js +21 -0
  1539. package/src/app/api/tunnel/status/route.js +25 -0
  1540. package/src/app/api/tunnel/tailscale-check/route.js +77 -0
  1541. package/src/app/api/tunnel/tailscale-disable/route.js +17 -0
  1542. package/src/app/api/tunnel/tailscale-enable/route.js +17 -0
  1543. package/src/app/api/tunnel/tailscale-install/route.js +98 -0
  1544. package/src/app/api/usage/[connectionId]/codex-reset-credits/route.js +196 -0
  1545. package/src/app/api/usage/[connectionId]/route.js +192 -0
  1546. package/src/app/api/usage/chart/route.js +21 -0
  1547. package/src/app/api/usage/history/route.js +12 -0
  1548. package/src/app/api/usage/logs/route.js +12 -0
  1549. package/src/app/api/usage/providers/route.js +38 -0
  1550. package/src/app/api/usage/request-details/route.js +65 -0
  1551. package/src/app/api/usage/request-logs/route.js +13 -0
  1552. package/src/app/api/usage/stats/route.js +23 -0
  1553. package/src/app/api/usage/stream/route.js +93 -0
  1554. package/src/app/api/v1/api/chat/route.js +36 -0
  1555. package/src/app/api/v1/audio/speech/route.js +16 -0
  1556. package/src/app/api/v1/audio/transcriptions/route.js +19 -0
  1557. package/src/app/api/v1/audio/voices/route.js +78 -0
  1558. package/src/app/api/v1/chat/completions/route.js +34 -0
  1559. package/src/app/api/v1/embeddings/route.js +21 -0
  1560. package/src/app/api/v1/images/generations/route.js +16 -0
  1561. package/src/app/api/v1/messages/count_tokens/route.js +96 -0
  1562. package/src/app/api/v1/messages/route.js +35 -0
  1563. package/src/app/api/v1/models/[...model]/route.js +75 -0
  1564. package/src/app/api/v1/models/info/route.js +131 -0
  1565. package/src/app/api/v1/models/route.js +586 -0
  1566. package/src/app/api/v1/responses/compact/route.js +37 -0
  1567. package/src/app/api/v1/responses/route.js +30 -0
  1568. package/src/app/api/v1/route.js +1 -0
  1569. package/src/app/api/v1/search/route.js +21 -0
  1570. package/src/app/api/v1/systemone/route.js +21 -0
  1571. package/src/app/api/v1/videos/[id]/route.js +17 -0
  1572. package/src/app/api/v1/videos/edits/route.js +16 -0
  1573. package/src/app/api/v1/videos/extensions/route.js +16 -0
  1574. package/src/app/api/v1/videos/generations/route.js +16 -0
  1575. package/src/app/api/v1/web/fetch/route.js +21 -0
  1576. package/src/app/api/v1beta/models/[...path]/route.js +599 -0
  1577. package/src/app/api/v1beta/models/route.js +62 -0
  1578. package/src/app/api/version/route.js +15 -0
  1579. package/src/app/api/version/shutdown/route.js +38 -0
  1580. package/src/app/api/version/update/route.js +11 -0
  1581. package/src/app/callback/page.tsx +162 -0
  1582. package/src/app/dashboard/settings/pricing/page.tsx +192 -0
  1583. package/src/app/globals.css +356 -0
  1584. package/src/app/landing/components/AnimatedBackground.tsx +58 -0
  1585. package/src/app/landing/components/Features.tsx +137 -0
  1586. package/src/app/landing/components/FlowAnimation.tsx +168 -0
  1587. package/src/app/landing/components/Footer.tsx +110 -0
  1588. package/src/app/landing/components/GetStarted.tsx +105 -0
  1589. package/src/app/landing/components/HeroSection.tsx +48 -0
  1590. package/src/app/landing/components/HowItWorks.tsx +69 -0
  1591. package/src/app/landing/components/Navigation.tsx +120 -0
  1592. package/src/app/landing/page.tsx +131 -0
  1593. package/src/app/layout.tsx +60 -0
  1594. package/src/app/login/page.tsx +277 -0
  1595. package/src/app/manifest.ts +33 -0
  1596. package/src/app/page.tsx +5 -0
  1597. package/src/components/app-sidebar.tsx +140 -0
  1598. package/src/components/ui/alert.tsx +72 -0
  1599. package/src/components/ui/avatar.tsx +93 -0
  1600. package/src/components/ui/badge.tsx +44 -0
  1601. package/src/components/ui/breadcrumb.tsx +103 -0
  1602. package/src/components/ui/button.tsx +66 -0
  1603. package/src/components/ui/card.tsx +91 -0
  1604. package/src/components/ui/chart.tsx +338 -0
  1605. package/src/components/ui/checkbox.tsx +26 -0
  1606. package/src/components/ui/dialog.tsx +152 -0
  1607. package/src/components/ui/dropdown-menu.tsx +249 -0
  1608. package/src/components/ui/input.tsx +18 -0
  1609. package/src/components/ui/label.tsx +18 -0
  1610. package/src/components/ui/pagination.tsx +112 -0
  1611. package/src/components/ui/select.tsx +184 -0
  1612. package/src/components/ui/separator.tsx +25 -0
  1613. package/src/components/ui/sheet.tsx +128 -0
  1614. package/src/components/ui/sidebar.tsx +671 -0
  1615. package/src/components/ui/skeleton.tsx +13 -0
  1616. package/src/components/ui/switch.tsx +32 -0
  1617. package/src/components/ui/table.tsx +86 -0
  1618. package/src/components/ui/tabs.tsx +79 -0
  1619. package/src/components/ui/tooltip.tsx +50 -0
  1620. package/src/dashboardGuard.ts +298 -0
  1621. package/src/hooks/use-mobile.ts +19 -0
  1622. package/src/i18n/RuntimeI18nProvider.tsx +28 -0
  1623. package/src/i18n/config.ts +19 -0
  1624. package/src/i18n/runtime.ts +177 -0
  1625. package/src/instrumentation.ts +14 -0
  1626. package/src/lib/auth/dashboardSession.js +112 -0
  1627. package/src/lib/auth/loginLimiter.js +70 -0
  1628. package/src/lib/auth/oidc.js +242 -0
  1629. package/src/lib/auth/saml.js +273 -0
  1630. package/src/lib/auth/trustedPeer.js +7 -0
  1631. package/src/lib/consoleLogBuffer.js +114 -0
  1632. package/src/lib/dataDir.js +78 -0
  1633. package/src/lib/db/adapters/betterSqliteAdapter.js +83 -0
  1634. package/src/lib/db/adapters/bunSqliteAdapter.js +83 -0
  1635. package/src/lib/db/adapters/nodeSqliteAdapter.js +111 -0
  1636. package/src/lib/db/adapters/sqljsAdapter.js +128 -0
  1637. package/src/lib/db/backup.js +88 -0
  1638. package/src/lib/db/driver.js +94 -0
  1639. package/src/lib/db/helpers/jsonCol.js +13 -0
  1640. package/src/lib/db/helpers/kvStore.js +45 -0
  1641. package/src/lib/db/helpers/metaStore.js +28 -0
  1642. package/src/lib/db/index.js +312 -0
  1643. package/src/lib/db/migrate.js +427 -0
  1644. package/src/lib/db/migrations/001-initial.js +14 -0
  1645. package/src/lib/db/migrations/index.js +10 -0
  1646. package/src/lib/db/paths.js +18 -0
  1647. package/src/lib/db/repos/aliasRepo.js +63 -0
  1648. package/src/lib/db/repos/apiKeysRepo.js +78 -0
  1649. package/src/lib/db/repos/combosRepo.js +83 -0
  1650. package/src/lib/db/repos/connectionsRepo.js +347 -0
  1651. package/src/lib/db/repos/disabledModelsRepo.js +56 -0
  1652. package/src/lib/db/repos/nodesRepo.js +98 -0
  1653. package/src/lib/db/repos/pricingRepo.js +108 -0
  1654. package/src/lib/db/repos/proxyPoolsRepo.js +109 -0
  1655. package/src/lib/db/repos/requestDetailsRepo.js +287 -0
  1656. package/src/lib/db/repos/settingsRepo.js +123 -0
  1657. package/src/lib/db/repos/usageRepo.js +1043 -0
  1658. package/src/lib/db/schema.js +161 -0
  1659. package/src/lib/db/version.js +21 -0
  1660. package/src/lib/grokBuildConfig.js +228 -0
  1661. package/src/lib/headroom/detect.js +212 -0
  1662. package/src/lib/headroom/process.js +307 -0
  1663. package/src/lib/isContainer.js +62 -0
  1664. package/src/lib/localDb.js +51 -0
  1665. package/src/lib/logLine.js +204 -0
  1666. package/src/lib/mcp/stdioSseBridge.js +223 -0
  1667. package/src/lib/modelCatalog/sync.js +292 -0
  1668. package/src/lib/network/connectionProxy.js +172 -0
  1669. package/src/lib/network/initOutboundProxy.js +25 -0
  1670. package/src/lib/network/outboundProxy.js +87 -0
  1671. package/src/lib/network/proxyTest.js +88 -0
  1672. package/src/lib/network/resolveOutboundProxy.js +45 -0
  1673. package/src/lib/oauth/constants/oauth.js +213 -0
  1674. package/src/lib/oauth/constants/xai.js +62 -0
  1675. package/src/lib/oauth/providerHelpers.js +74 -0
  1676. package/src/lib/oauth/providers/_shared.js +17 -0
  1677. package/src/lib/oauth/providers/antigravity.js +119 -0
  1678. package/src/lib/oauth/providers/claude.js +60 -0
  1679. package/src/lib/oauth/providers/codebuddy-cn.js +80 -0
  1680. package/src/lib/oauth/providers/codebuddy-intl.js +75 -0
  1681. package/src/lib/oauth/providers/codex.js +69 -0
  1682. package/src/lib/oauth/providers/cursor.js +19 -0
  1683. package/src/lib/oauth/providers/github.js +98 -0
  1684. package/src/lib/oauth/providers/gitlab.js +64 -0
  1685. package/src/lib/oauth/providers/grok-cli.js +123 -0
  1686. package/src/lib/oauth/providers/iflow.js +89 -0
  1687. package/src/lib/oauth/providers/index.js +243 -0
  1688. package/src/lib/oauth/providers/kilocode.js +75 -0
  1689. package/src/lib/oauth/providers/kimchi.js +76 -0
  1690. package/src/lib/oauth/providers/qoder.js +111 -0
  1691. package/src/lib/oauth/providers/trae.js +337 -0
  1692. package/src/lib/oauth/providers/windsurf.js +172 -0
  1693. package/src/lib/oauth/providers/xai.js +101 -0
  1694. package/src/lib/oauth/providers/xiaomi-mimo.js +120 -0
  1695. package/src/lib/oauth/providers/zed.js +68 -0
  1696. package/src/lib/oauth/providers.js +1 -0
  1697. package/src/lib/oauth/services/antigravity.js +322 -0
  1698. package/src/lib/oauth/services/claude.js +135 -0
  1699. package/src/lib/oauth/services/codex.js +149 -0
  1700. package/src/lib/oauth/services/cursor.js +179 -0
  1701. package/src/lib/oauth/services/github.js +227 -0
  1702. package/src/lib/oauth/services/iflow.js +201 -0
  1703. package/src/lib/oauth/services/index.js +13 -0
  1704. package/src/lib/oauth/services/kimchi.js +139 -0
  1705. package/src/lib/oauth/services/oauth.js +161 -0
  1706. package/src/lib/oauth/services/openai.js +122 -0
  1707. package/src/lib/oauth/services/qoder.js +237 -0
  1708. package/src/lib/oauth/services/xai.js +241 -0
  1709. package/src/lib/oauth/utils/banner.js +62 -0
  1710. package/src/lib/oauth/utils/ideDetect.js +64 -0
  1711. package/src/lib/oauth/utils/pkce.js +39 -0
  1712. package/src/lib/oauth/utils/server.js +1056 -0
  1713. package/src/lib/oauth/utils/ui.js +47 -0
  1714. package/src/lib/providerNormalization.js +49 -0
  1715. package/src/lib/pxpipe/events.js +146 -0
  1716. package/src/lib/pxpipe/install.js +143 -0
  1717. package/src/lib/pxpipe/loader.js +76 -0
  1718. package/src/lib/pxpipe/service.js +69 -0
  1719. package/src/lib/qoder/constants.js +2 -0
  1720. package/src/lib/qoder/cosy.js +2 -0
  1721. package/src/lib/qoder/encoding.js +2 -0
  1722. package/src/lib/tunnel/cloudflare/cloudflared.js +513 -0
  1723. package/src/lib/tunnel/cloudflare/config.js +9 -0
  1724. package/src/lib/tunnel/cloudflare/healthCheck.js +33 -0
  1725. package/src/lib/tunnel/cloudflare/manager.js +174 -0
  1726. package/src/lib/tunnel/cloudflare/pid.js +31 -0
  1727. package/src/lib/tunnel/index.js +53 -0
  1728. package/src/lib/tunnel/shared/dnsResolver.js +20 -0
  1729. package/src/lib/tunnel/shared/internetCheck.js +33 -0
  1730. package/src/lib/tunnel/shared/state.js +45 -0
  1731. package/src/lib/tunnel/shared/watchdogConfig.js +9 -0
  1732. package/src/lib/tunnel/sudoExec.js +49 -0
  1733. package/src/lib/tunnel/sudoPassword.js +90 -0
  1734. package/src/lib/tunnel/tailscale/config.js +7 -0
  1735. package/src/lib/tunnel/tailscale/healthCheck.js +33 -0
  1736. package/src/lib/tunnel/tailscale/manager.js +151 -0
  1737. package/src/lib/tunnel/tailscale/tailscale.js +1013 -0
  1738. package/src/lib/usageDb.js +15 -0
  1739. package/src/lib/versionCheck.js +67 -0
  1740. package/src/models/index.ts +38 -0
  1741. package/src/proxy.ts +10 -0
  1742. package/src/shared/components/AddCustomEmbeddingModal.tsx +220 -0
  1743. package/src/shared/components/CapacityBadges.tsx +47 -0
  1744. package/src/shared/components/ChangelogModal.tsx +82 -0
  1745. package/src/shared/components/ComboFormModal.tsx +321 -0
  1746. package/src/shared/components/CursorAuthModal.tsx +213 -0
  1747. package/src/shared/components/EditConnectionModal.tsx +369 -0
  1748. package/src/shared/components/EntityCard.tsx +106 -0
  1749. package/src/shared/components/EntityCardSkeleton.tsx +69 -0
  1750. package/src/shared/components/Footer.tsx +133 -0
  1751. package/src/shared/components/GitLabAuthModal.tsx +294 -0
  1752. package/src/shared/components/Header.tsx +370 -0
  1753. package/src/shared/components/HeaderLanguage.tsx +53 -0
  1754. package/src/shared/components/HeaderMenu.tsx +75 -0
  1755. package/src/shared/components/IFlowCookieModal.tsx +140 -0
  1756. package/src/shared/components/Icon.tsx +237 -0
  1757. package/src/shared/components/LanguageSwitcher.tsx +139 -0
  1758. package/src/shared/components/Loading.tsx +102 -0
  1759. package/src/shared/components/ManualConfigModal.tsx +55 -0
  1760. package/src/shared/components/McpMarketplaceModal.tsx +320 -0
  1761. package/src/shared/components/Modal.tsx +130 -0
  1762. package/src/shared/components/ModelSelectModal.tsx +755 -0
  1763. package/src/shared/components/NineRemoteButton.tsx +28 -0
  1764. package/src/shared/components/NineRemotePromoModal.tsx +91 -0
  1765. package/src/shared/components/NoAuthProxyCard.tsx +178 -0
  1766. package/src/shared/components/OAuthModal.tsx +1055 -0
  1767. package/src/shared/components/PricingModal.tsx +202 -0
  1768. package/src/shared/components/ProviderIcon.tsx +80 -0
  1769. package/src/shared/components/ProviderInfoCard.tsx +98 -0
  1770. package/src/shared/components/RequestLogger.tsx +149 -0
  1771. package/src/shared/components/SegmentedControl.tsx +45 -0
  1772. package/src/shared/components/ShutdownModal.tsx +65 -0
  1773. package/src/shared/components/ThemeProvider.tsx +15 -0
  1774. package/src/shared/components/ThemeToggle.tsx +52 -0
  1775. package/src/shared/components/UpdateDialog.tsx +248 -0
  1776. package/src/shared/components/UsageStats.tsx +714 -0
  1777. package/src/shared/components/VersionLabel.tsx +122 -0
  1778. package/src/shared/components/XiaomiMimoAuthModal.tsx +277 -0
  1779. package/src/shared/components/index.ts +32 -0
  1780. package/src/shared/components/layouts/AuthLayout.tsx +22 -0
  1781. package/src/shared/components/layouts/DashboardLayout.tsx +105 -0
  1782. package/src/shared/components/layouts/Page.tsx +158 -0
  1783. package/src/shared/components/layouts/index.ts +4 -0
  1784. package/src/shared/constants/cliTools.js +123 -0
  1785. package/src/shared/constants/colors.ts +92 -0
  1786. package/src/shared/constants/config.ts +100 -0
  1787. package/src/shared/constants/coworkPlugins.ts +113 -0
  1788. package/src/shared/constants/index.ts +3 -0
  1789. package/src/shared/constants/locales.ts +5 -0
  1790. package/src/shared/constants/models.ts +65 -0
  1791. package/src/shared/constants/providers.js +236 -0
  1792. package/src/shared/constants/providersDisplay.ts +15 -0
  1793. package/src/shared/constants/ttsProviders.ts +166 -0
  1794. package/src/shared/hooks/index.js +3 -0
  1795. package/src/shared/hooks/useCopyToClipboard.js +45 -0
  1796. package/src/shared/hooks/useModelCaps.js +91 -0
  1797. package/src/shared/hooks/useShutdown.ts +68 -0
  1798. package/src/shared/hooks/useTheme.js +59 -0
  1799. package/src/shared/services/bootstrap.ts +13 -0
  1800. package/src/shared/services/initializeApp.ts +323 -0
  1801. package/src/shared/services/quotaAutoPing.ts +400 -0
  1802. package/src/shared/utils/api.ts +100 -0
  1803. package/src/shared/utils/apiKey.ts +92 -0
  1804. package/src/shared/utils/bulkAdd.ts +87 -0
  1805. package/src/shared/utils/cn.ts +7 -0
  1806. package/src/shared/utils/connectionStatus.ts +14 -0
  1807. package/src/shared/utils/index.ts +40 -0
  1808. package/src/shared/utils/machine.ts +6 -0
  1809. package/src/shared/utils/machineId.ts +70 -0
  1810. package/src/shared/utils/providerCustomModels.ts +80 -0
  1811. package/src/shared/utils/providerIcon.ts +248 -0
  1812. package/src/shared/utils/providerModelsFetcher.ts +33 -0
  1813. package/src/shared/utils/ssrfGuard.ts +223 -0
  1814. package/src/shared/utils/utils.js +1 -0
  1815. package/src/sse/handlers/chat.js +430 -0
  1816. package/src/sse/handlers/embeddings.js +192 -0
  1817. package/src/sse/handlers/fetch.js +255 -0
  1818. package/src/sse/handlers/imageGeneration.js +175 -0
  1819. package/src/sse/handlers/search.js +260 -0
  1820. package/src/sse/handlers/stt.js +120 -0
  1821. package/src/sse/handlers/systemone.js +173 -0
  1822. package/src/sse/handlers/tts.js +157 -0
  1823. package/src/sse/handlers/videoGeneration.js +274 -0
  1824. package/src/sse/services/antigravityQuota.ts +220 -0
  1825. package/src/sse/services/auth.ts +485 -0
  1826. package/src/sse/services/backgroundTokenRefresh.ts +190 -0
  1827. package/src/sse/services/model.ts +102 -0
  1828. package/src/sse/services/tokenRefresh.ts +328 -0
  1829. package/src/sse/services/zedQuota.ts +233 -0
  1830. package/src/sse/utils/logger.ts +140 -0
  1831. package/src/store/headerSearchStore.ts +27 -0
  1832. package/src/store/index.ts +5 -0
  1833. package/src/store/notificationStore.ts +75 -0
  1834. package/src/store/providerStore.ts +75 -0
  1835. package/src/store/settingsStore.ts +63 -0
  1836. package/src/store/themeStore.ts +48 -0
  1837. package/src/store/userStore.ts +35 -0
@@ -0,0 +1,1918 @@
1
+ "use client";
2
+ import Icon from "@/shared/components/Icon";
3
+
4
+ import { useState, useEffect, useCallback, useRef } from "react";
5
+ import { useParams, useRouter } from "next/navigation";
6
+ import Link from "next/link";
7
+ import Image from "next/image";
8
+ import {
9
+ getInitials,
10
+ getProviderIconSrc,
11
+ guessProviderIconIdFromUrl,
12
+ markProviderIconMissing,
13
+ } from "@/shared/utils/providerIcon";
14
+ import {
15
+ Page,
16
+ PanelSkeleton,
17
+ OAuthModal,
18
+ CursorAuthModal,
19
+ XiaomiMimoAuthModal,
20
+ IFlowCookieModal,
21
+ GitLabAuthModal,
22
+ EditConnectionModal,
23
+ NoAuthProxyCard,
24
+ ConfirmModal,
25
+ } from "@/shared/components";
26
+ import { Card, CardContent } from "@/components/ui/card";
27
+ import { Button } from "@/components/ui/button";
28
+ import {
29
+ OAUTH_PROVIDERS,
30
+ APIKEY_PROVIDERS,
31
+ FREE_PROVIDERS,
32
+ FREE_TIER_PROVIDERS,
33
+ WEB_COOKIE_PROVIDERS,
34
+ getProviderAlias,
35
+ isOpenAICompatibleProvider,
36
+ isAnthropicCompatibleProvider,
37
+ AI_PROVIDERS,
38
+ } from "@/shared/constants/providers";
39
+ import { getModelsByProviderId, getModelKind } from "@/shared/constants/models";
40
+ import { useCopyToClipboard } from "@/shared/hooks/useCopyToClipboard";
41
+ import { useModelCaps } from "@/shared/hooks/useModelCaps";
42
+ import { translate } from "@/i18n/runtime";
43
+ import { fetchSuggestedModels } from "@/shared/utils/providerModelsFetcher";
44
+ import { getProviderCustomModelRows } from "@/shared/utils/providerCustomModels";
45
+ import ModelRow from "./ModelRow";
46
+ import { Switch } from "@/components/ui/switch";
47
+ import { Checkbox } from "@/components/ui/checkbox";
48
+ import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip";
49
+ import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog";
50
+ import { ArrowLeftRight, Server, Unplug } from "lucide-react";
51
+ import PassthroughModelsSection from "./PassthroughModelsSection";
52
+ import CompatibleModelsSection from "./CompatibleModelsSection";
53
+ import ConnectionRow from "./ConnectionRow";
54
+ import AddApiKeyModal from "./AddApiKeyModal";
55
+ import EditCompatibleNodeModal from "./EditCompatibleNodeModal";
56
+ import AddCustomModelModal from "./AddCustomModelModal";
57
+ import BulkImportCodexModal from "./BulkImportCodexModal";
58
+ import BulkImportGrokCliModal from "./BulkImportGrokCliModal";
59
+ import { useOneByOneTest } from "./useOneByOneTest";
60
+
61
+ const AUTO_PING_SETTINGS_KEYS = {
62
+ claude: "claudeAutoPing",
63
+ codex: "codexAutoPing",
64
+ };
65
+
66
+ export default function ProviderDetailPage() {
67
+ const params = useParams();
68
+ const router = useRouter();
69
+ const providerId: any = (params as any).id;
70
+ const { getCaps } = useModelCaps();
71
+ const [connections, setConnections] = useState<any[]>([]);
72
+ const [loading, setLoading] = useState<boolean>(true);
73
+ const [providerNode, setProviderNode] = useState<any>(null);
74
+ const [proxyPools, setProxyPools] = useState<any[]>([]);
75
+ const [showOAuthModal, setShowOAuthModal] = useState<boolean>(false);
76
+ const [showXiaomiMimoModal, setShowXiaomiMimoModal] = useState<boolean>(false);
77
+ const [showIFlowCookieModal, setShowIFlowCookieModal] = useState<boolean>(false);
78
+ const [showAddApiKeyModal, setShowAddApiKeyModal] = useState<boolean>(false);
79
+ const [addConnectionError, setAddConnectionError] = useState<string>("");
80
+ const [showBulkImportCodex, setShowBulkImportCodex] = useState<boolean>(false);
81
+ const [showBulkImportGrokCli, setShowBulkImportGrokCli] = useState<boolean>(false);
82
+ const [showEditModal, setShowEditModal] = useState<boolean>(false);
83
+ const [showEditNodeModal, setShowEditNodeModal] = useState<boolean>(false);
84
+ const [showBulkProxyModal, setShowBulkProxyModal] = useState<boolean>(false);
85
+ const [selectedConnection, setSelectedConnection] = useState<any>(null);
86
+ const [modelAliases, setModelAliases] = useState<any>({});
87
+ const [customModels, setCustomModels] = useState<any[]>([]);
88
+ const [headerImgError, setHeaderImgError] = useState<boolean>(false);
89
+ const [modelTestResults, setModelTestResults] = useState<any>({});
90
+ const [modelsTestError, setModelsTestError] = useState<string>("");
91
+ const [testingModelIds, setTestingModelIds] = useState(() => new Set());
92
+ const [showAddCustomModel, setShowAddCustomModel] = useState<boolean>(false);
93
+ const [selectedConnectionIds, setSelectedConnectionIds] = useState<any[]>([]);
94
+ const [bulkUpdatingProxy, setBulkUpdatingProxy] = useState<boolean>(false);
95
+ const [providerStrategy, setProviderStrategy] = useState<any>(null);
96
+ const [providerStickyLimit, setProviderStickyLimit] = useState<string>("");
97
+ const [autoPing, setAutoPing] = useState({ enabled: false, connections: {} });
98
+ const [suggestedModels, setSuggestedModels] = useState<any[]>([]);
99
+ const [liveModels, setLiveModels] = useState<any[]>([]);
100
+ // Live-catalog fetch warning/error (surfaced for zed only; cursor behavior unchanged).
101
+ const [liveModelsError, setLiveModelsError] = useState<any>(null);
102
+ const [kiloFreeModels, setKiloFreeModels] = useState<any[]>([]);
103
+ const [disabledModelIds, setDisabledModelIds] = useState<any[]>([]);
104
+ const [confirmState, setConfirmState] = useState<any>(null);
105
+ const [showAgRiskModal, setShowAgRiskModal] = useState<boolean>(false);
106
+ const oneByOne = useOneByOneTest(connections);
107
+ const oneByOneRunning = oneByOne.running;
108
+ const oneByOneStopping = oneByOne.stopping;
109
+ const oneByOneCurrentConnectionId = oneByOne.currentConnectionId;
110
+ const oneByOneResults = oneByOne.results;
111
+ const oneByOneSummary = oneByOne.summary;
112
+ const handleRunOneByOneTest = oneByOne.run;
113
+ const handleStopOneByOneTest = oneByOne.stop;
114
+ const [importingQoderModels, setImportingQoderModels] = useState<boolean>(false);
115
+ const { copied, copy } = useCopyToClipboard();
116
+
117
+ const AG_RISK_STORAGE_KEY = "ag_risk_confirmed";
118
+
119
+ const openOAuthConnection = () => {
120
+ setShowOAuthModal(true);
121
+ };
122
+
123
+ const triggerOAuthConnection = () => {
124
+ if (providerId === "antigravity" && typeof window !== "undefined") {
125
+ const confirmed = window.localStorage.getItem(AG_RISK_STORAGE_KEY) === "true";
126
+ if (!confirmed) {
127
+ setShowAgRiskModal(true);
128
+ return;
129
+ }
130
+ }
131
+ // Xiaomi Desktop: auto-import local credentials first, OAuth as fallback
132
+ if (providerId === "xiaomi-mimo") {
133
+ setShowXiaomiMimoModal(true);
134
+ return;
135
+ }
136
+ if (isOAuth) {
137
+ openOAuthConnection();
138
+ return;
139
+ }
140
+ setAddConnectionError("");
141
+ setShowAddApiKeyModal(true);
142
+ };
143
+
144
+ const triggerApiKeyConnection = () => {
145
+ setAddConnectionError("");
146
+ setShowAddApiKeyModal(true);
147
+ };
148
+
149
+ const triggerAddConnection = () => {
150
+ if (isOAuth) {
151
+ triggerOAuthConnection();
152
+ return;
153
+ }
154
+ triggerApiKeyConnection();
155
+ };
156
+
157
+ const handleAgRiskConfirm = () => {
158
+ if (typeof window !== "undefined") {
159
+ window.localStorage.setItem(AG_RISK_STORAGE_KEY, "true");
160
+ }
161
+ setShowAgRiskModal(false);
162
+ if (isOAuth) {
163
+ openOAuthConnection();
164
+ return;
165
+ }
166
+ triggerApiKeyConnection();
167
+ };
168
+
169
+ const providerInfo = providerNode
170
+ ? {
171
+ id: providerNode.id,
172
+ name:
173
+ providerNode.name ||
174
+ (providerNode.type === "anthropic-compatible"
175
+ ? "Anthropic Compatible"
176
+ : "OpenAI Compatible"),
177
+ color: providerNode.type === "anthropic-compatible" ? "#D97757" : "#10A37F",
178
+ textIcon: providerNode.type === "anthropic-compatible" ? "AC" : "OC",
179
+ apiType: providerNode.apiType,
180
+ baseUrl: providerNode.baseUrl,
181
+ type: providerNode.type,
182
+ }
183
+ : OAUTH_PROVIDERS[providerId] ||
184
+ APIKEY_PROVIDERS[providerId] ||
185
+ FREE_PROVIDERS[providerId] ||
186
+ FREE_TIER_PROVIDERS[providerId] ||
187
+ WEB_COOKIE_PROVIDERS[providerId];
188
+ const authModes = providerInfo?.authModes || [];
189
+ const isOAuth =
190
+ !!OAUTH_PROVIDERS[providerId] || !!FREE_PROVIDERS[providerId] || authModes.includes("oauth");
191
+ const supportsApiKeyAuth = !!APIKEY_PROVIDERS[providerId] || authModes.includes("apikey");
192
+ const isFreeNoAuth = !!FREE_PROVIDERS[providerId]?.noAuth;
193
+ const staticModels = getModelsByProviderId(providerId);
194
+ const models =
195
+ (providerId === "cursor" || providerId === "zed") && liveModels.length > 0
196
+ ? liveModels
197
+ : staticModels;
198
+ const providerAlias = getProviderAlias(providerId);
199
+
200
+ const isOpenAICompatible = isOpenAICompatibleProvider(providerId);
201
+ const isAnthropicCompatible = isAnthropicCompatibleProvider(providerId);
202
+ const isCompatible = isOpenAICompatible || isAnthropicCompatible;
203
+ const hasDualAuthModes = !isCompatible && isOAuth && supportsApiKeyAuth;
204
+ const oauthConnectionLabel =
205
+ providerId === "xai"
206
+ ? "Grok Build OAuth"
207
+ : providerId === "grok-cli"
208
+ ? "Grok CLI Device Login"
209
+ : "OAuth";
210
+ const apiKeyConnectionLabel =
211
+ providerId === "xai" ? "xAI API Key" : providerId === "qoder" ? "PAT" : "API Key";
212
+ const providerStorageAlias = isCompatible ? providerId : providerAlias;
213
+ const providerDisplayAlias = isCompatible ? providerNode?.prefix || providerId : providerAlias;
214
+
215
+ const fetchDisabledModels = useCallback(async () => {
216
+ try {
217
+ const res = await fetch(
218
+ `/api/models/disabled?providerAlias=${encodeURIComponent(providerStorageAlias)}`,
219
+ { cache: "no-store" },
220
+ );
221
+ const data = await res.json();
222
+ if (res.ok) setDisabledModelIds(data.ids || []);
223
+ } catch (error) {
224
+ console.log("Error fetching disabled models:", error);
225
+ }
226
+ }, [providerStorageAlias]);
227
+
228
+ const handleDisableModel = async (modelId) => {
229
+ try {
230
+ const res = await fetch("/api/models/disabled", {
231
+ method: "POST",
232
+ headers: { "Content-Type": "application/json" },
233
+ body: JSON.stringify({ providerAlias: providerStorageAlias, ids: [modelId] }),
234
+ });
235
+ if (res.ok) await fetchDisabledModels();
236
+ } catch (error) {
237
+ console.log("Error disabling model:", error);
238
+ }
239
+ };
240
+
241
+ const handleEnableModel = async (modelId) => {
242
+ try {
243
+ const res = await fetch(
244
+ `/api/models/disabled?providerAlias=${encodeURIComponent(providerStorageAlias)}&id=${encodeURIComponent(modelId)}`,
245
+ { method: "DELETE" },
246
+ );
247
+ if (res.ok) await fetchDisabledModels();
248
+ } catch (error) {
249
+ console.log("Error enabling model:", error);
250
+ }
251
+ };
252
+
253
+ const handleDisableAll = async (ids) => {
254
+ if (!ids.length) return;
255
+ setConfirmState({
256
+ title: "Disable All Models",
257
+ message: `Disable all ${ids.length} model(s)?`,
258
+ onConfirm: async () => {
259
+ setConfirmState(null);
260
+ try {
261
+ const res = await fetch("/api/models/disabled", {
262
+ method: "POST",
263
+ headers: { "Content-Type": "application/json" },
264
+ body: JSON.stringify({ providerAlias: providerStorageAlias, ids }),
265
+ });
266
+ if (res.ok) await fetchDisabledModels();
267
+ } catch (error) {
268
+ console.log("Error disabling all models:", error);
269
+ }
270
+ },
271
+ });
272
+ };
273
+
274
+ const handleEnableAll = async () => {
275
+ try {
276
+ const res = await fetch(
277
+ `/api/models/disabled?providerAlias=${encodeURIComponent(providerStorageAlias)}`,
278
+ { method: "DELETE" },
279
+ );
280
+ if (res.ok) await fetchDisabledModels();
281
+ } catch (error) {
282
+ console.log("Error enabling all models:", error);
283
+ }
284
+ };
285
+
286
+ // Define callbacks BEFORE the useEffect that uses them
287
+ const fetchAliases = useCallback(async () => {
288
+ try {
289
+ const res = await fetch("/api/models/alias");
290
+ const data = await res.json();
291
+ if (res.ok) {
292
+ setModelAliases(data.aliases || {});
293
+ }
294
+ } catch (error) {
295
+ console.log("Error fetching aliases:", error);
296
+ }
297
+ }, []);
298
+
299
+ const fetchCustomModels = useCallback(async () => {
300
+ try {
301
+ const res = await fetch("/api/models/custom", { cache: "no-store" });
302
+ const data = await res.json();
303
+ if (res.ok) {
304
+ setCustomModels(data.models || []);
305
+ }
306
+ } catch (error) {
307
+ console.log("Error fetching custom models:", error);
308
+ }
309
+ }, []);
310
+
311
+ // Fetch free models from Kilo API for kilocode provider
312
+ useEffect(() => {
313
+ if (providerId !== "kilocode") return;
314
+ fetch("/api/providers/kilo/free-models")
315
+ .then((res) => res.json())
316
+ .then((data) => {
317
+ if (data.models?.length) setKiloFreeModels(data.models);
318
+ })
319
+ .catch(() => {});
320
+ }, [providerId]);
321
+
322
+ const fetchConnections = useCallback(async () => {
323
+ try {
324
+ const [connectionsRes, nodesRes, proxyPoolsRes, settingsRes] = await Promise.all([
325
+ fetch("/api/providers", { cache: "no-store" }),
326
+ fetch("/api/provider-nodes", { cache: "no-store" }),
327
+ fetch("/api/proxy-pools?isActive=true", { cache: "no-store" }),
328
+ fetch("/api/settings", { cache: "no-store" }),
329
+ ]);
330
+ const connectionsData = await connectionsRes.json();
331
+ const nodesData = await nodesRes.json();
332
+ const proxyPoolsData = await proxyPoolsRes.json();
333
+ const settingsData = settingsRes.ok ? await settingsRes.json() : {};
334
+ if (connectionsRes.ok) {
335
+ const filtered = (connectionsData.connections || []).filter(
336
+ (c) => c.provider === providerId,
337
+ );
338
+ setConnections(filtered);
339
+ }
340
+ if (proxyPoolsRes.ok) {
341
+ setProxyPools(proxyPoolsData.proxyPools || []);
342
+ }
343
+ // Load per-provider strategy override
344
+ const override = (settingsData.providerStrategies || {})[providerId] || {};
345
+ setProviderStrategy(override.fallbackStrategy || null);
346
+ setProviderStickyLimit(
347
+ override.stickyRoundRobinLimit != null ? String(override.stickyRoundRobinLimit) : "1",
348
+ );
349
+ const autoPingSettingsKey = AUTO_PING_SETTINGS_KEYS[providerId];
350
+ const apCfg = autoPingSettingsKey ? settingsData[autoPingSettingsKey] || {} : {};
351
+ setAutoPing({ enabled: apCfg.enabled === true, connections: apCfg.connections || {} });
352
+ if (nodesRes.ok) {
353
+ let node = (nodesData.nodes || []).find((entry) => entry.id === providerId) || null;
354
+
355
+ // Newly created compatible nodes can be briefly unavailable on one worker.
356
+ // Retry a few times before showing "Provider not found".
357
+ if (!node && isCompatible) {
358
+ for (let attempt = 0; attempt < 3; attempt += 1) {
359
+ await new Promise((resolve) => setTimeout(resolve, 150));
360
+ const retryRes = await fetch("/api/provider-nodes", { cache: "no-store" });
361
+ if (!retryRes.ok) continue;
362
+ const retryData = await retryRes.json();
363
+ node = (retryData.nodes || []).find((entry) => entry.id === providerId) || null;
364
+ if (node) break;
365
+ }
366
+ }
367
+
368
+ setProviderNode(node);
369
+ }
370
+ } catch (error) {
371
+ console.log("Error fetching connections:", error);
372
+ } finally {
373
+ setLoading(false);
374
+ }
375
+ }, [providerId, isCompatible]);
376
+
377
+ const handleUpdateNode = async (formData) => {
378
+ try {
379
+ const res = await fetch(`/api/provider-nodes/${providerId}`, {
380
+ method: "PUT",
381
+ headers: { "Content-Type": "application/json" },
382
+ body: JSON.stringify(formData),
383
+ });
384
+ const data = await res.json();
385
+ if (res.ok) {
386
+ setProviderNode(data.node);
387
+ await fetchConnections();
388
+ setShowEditNodeModal(false);
389
+ }
390
+ } catch (error) {
391
+ console.log("Error updating provider node:", error);
392
+ }
393
+ };
394
+
395
+ const saveProviderStrategy = async (strategy, stickyLimit) => {
396
+ try {
397
+ const settingsRes = await fetch("/api/settings", { cache: "no-store" });
398
+ const settingsData = settingsRes.ok ? await settingsRes.json() : {};
399
+ const current = settingsData.providerStrategies || {};
400
+
401
+ // Build override: null strategy means remove override, use global
402
+ const override: any = {};
403
+ if (strategy) override.fallbackStrategy = strategy;
404
+ if (strategy === "round-robin" && stickyLimit !== "") {
405
+ override.stickyRoundRobinLimit = Number(stickyLimit) || 3;
406
+ }
407
+
408
+ const updated = { ...current };
409
+ if (Object.keys(override).length === 0) {
410
+ delete updated[providerId];
411
+ } else {
412
+ updated[providerId] = override;
413
+ }
414
+
415
+ await fetch("/api/settings", {
416
+ method: "PATCH",
417
+ headers: { "Content-Type": "application/json" },
418
+ body: JSON.stringify({ providerStrategies: updated }),
419
+ });
420
+ } catch (error) {
421
+ console.log("Error saving provider strategy:", error);
422
+ }
423
+ };
424
+
425
+ const handleRoundRobinToggle = (enabled) => {
426
+ const strategy = enabled ? "round-robin" : null;
427
+ const sticky = enabled ? providerStickyLimit || "1" : providerStickyLimit;
428
+ if (enabled && !providerStickyLimit) setProviderStickyLimit("1");
429
+ setProviderStrategy(strategy);
430
+ saveProviderStrategy(strategy, sticky);
431
+ };
432
+
433
+ const handleStickyLimitChange = (value) => {
434
+ setProviderStickyLimit(value);
435
+ saveProviderStrategy("round-robin", value);
436
+ };
437
+
438
+ const saveAutoPing = async (next) => {
439
+ const autoPingSettingsKey = AUTO_PING_SETTINGS_KEYS[providerId];
440
+ if (!autoPingSettingsKey) return;
441
+
442
+ setAutoPing(next);
443
+ try {
444
+ await fetch("/api/settings", {
445
+ method: "PATCH",
446
+ headers: { "Content-Type": "application/json" },
447
+ body: JSON.stringify({ [autoPingSettingsKey]: next }),
448
+ });
449
+ } catch (error) {
450
+ console.log("Error saving auto-ping config:", error);
451
+ }
452
+ };
453
+
454
+ const handleAutoPingConnection = (connectionId, on) => {
455
+ saveAutoPing({ ...autoPing, connections: { ...autoPing.connections, [connectionId]: on } });
456
+ };
457
+
458
+ useEffect(() => {
459
+ fetchConnections();
460
+ fetchAliases();
461
+ fetchCustomModels();
462
+ fetchDisabledModels();
463
+ }, [fetchConnections, fetchAliases, fetchCustomModels, fetchDisabledModels]);
464
+
465
+ // Live per-connection catalogs (cursor, zed): the static registry carries
466
+ // no usable list, so resolve from the active connection. Fires only when
467
+ // the provider id or connection list changes — no polling, no loop.
468
+ // Cursor path is statement-identical to before; zed adds error surfacing.
469
+ useEffect(() => {
470
+ const isLiveCatalog = providerId === "cursor" || providerId === "zed";
471
+ if (!isLiveCatalog) {
472
+ setLiveModels([]);
473
+ return;
474
+ }
475
+
476
+ const connection = connections.find((item) => item.isActive !== false);
477
+ if (!connection?.id) {
478
+ setLiveModels([]);
479
+ if (providerId === "zed") setLiveModelsError(null);
480
+ return;
481
+ }
482
+
483
+ let cancelled = false;
484
+ if (providerId === "zed") setLiveModelsError(null);
485
+ fetch(`/api/providers/${connection.id}/models`, { cache: "no-store" })
486
+ .then(async (res) => ({ ok: res.ok, data: await res.json().catch(() => null) }))
487
+ .then(({ ok, data }) => {
488
+ if (cancelled) return;
489
+ if (ok && Array.isArray(data?.models) && data.models.length > 0) {
490
+ setLiveModels(data.models);
491
+ if (providerId === "zed" && data?.warning) setLiveModelsError(data.warning);
492
+ return;
493
+ }
494
+ if (providerId === "zed") {
495
+ setLiveModels([]);
496
+ setLiveModelsError(data?.warning || data?.error || "Zed returned no live models.");
497
+ }
498
+ })
499
+ .catch(() => {
500
+ if (!cancelled && providerId === "zed") {
501
+ setLiveModels([]);
502
+ setLiveModelsError("Failed to reach the Zed model catalog.");
503
+ }
504
+ });
505
+
506
+ return () => {
507
+ cancelled = true;
508
+ };
509
+ }, [providerId, connections]);
510
+
511
+ // Fetch suggested models from provider's public API (if configured)
512
+ useEffect(() => {
513
+ const fetcher = (
514
+ OAUTH_PROVIDERS[providerId] ||
515
+ APIKEY_PROVIDERS[providerId] ||
516
+ FREE_PROVIDERS[providerId] ||
517
+ FREE_TIER_PROVIDERS[providerId]
518
+ )?.modelsFetcher;
519
+ if (!fetcher) return;
520
+ fetchSuggestedModels(fetcher).then(setSuggestedModels);
521
+ }, [providerId]);
522
+
523
+ const handleSetAlias = async (modelId, alias, providerAliasOverride = providerAlias) => {
524
+ const fullModel = `${providerAliasOverride}/${modelId}`;
525
+ try {
526
+ const res = await fetch("/api/models/alias", {
527
+ method: "PUT",
528
+ headers: { "Content-Type": "application/json" },
529
+ body: JSON.stringify({ model: fullModel, alias }),
530
+ });
531
+ if (res.ok) {
532
+ await fetchAliases();
533
+ } else {
534
+ const data = await res.json();
535
+ alert(data.error || "Failed to set alias");
536
+ }
537
+ } catch (error) {
538
+ console.log("Error setting alias:", error);
539
+ }
540
+ };
541
+
542
+ const handleDeleteAlias = async (alias) => {
543
+ try {
544
+ const res = await fetch(`/api/models/alias?alias=${encodeURIComponent(alias)}`, {
545
+ method: "DELETE",
546
+ });
547
+ if (res.ok) {
548
+ await fetchAliases();
549
+ }
550
+ } catch (error) {
551
+ console.log("Error deleting alias:", error);
552
+ }
553
+ };
554
+
555
+ const handleAddCustomModel = async (
556
+ modelId,
557
+ type = "llm",
558
+ providerAliasOverride = providerStorageAlias,
559
+ caps,
560
+ ) => {
561
+ try {
562
+ const res = await fetch("/api/models/custom", {
563
+ method: "POST",
564
+ headers: { "Content-Type": "application/json" },
565
+ body: JSON.stringify({
566
+ providerAlias: providerAliasOverride,
567
+ id: modelId,
568
+ type,
569
+ ...(caps ? { caps } : {}),
570
+ }),
571
+ });
572
+ if (res.ok) {
573
+ await fetchCustomModels();
574
+ if (typeof window !== "undefined")
575
+ window.dispatchEvent(new CustomEvent("customModelChanged"));
576
+ } else {
577
+ const data = await res.json();
578
+ alert(data.error || "Failed to add custom model");
579
+ }
580
+ } catch (error) {
581
+ console.log("Error adding custom model:", error);
582
+ }
583
+ };
584
+
585
+ const handleDeleteCustomModel = async (
586
+ modelId,
587
+ type = "llm",
588
+ providerAliasOverride = providerStorageAlias,
589
+ ) => {
590
+ try {
591
+ const params = new URLSearchParams({
592
+ providerAlias: providerAliasOverride,
593
+ id: modelId,
594
+ type,
595
+ });
596
+ const res = await fetch(`/api/models/custom?${params}`, { method: "DELETE" });
597
+ if (res.ok) {
598
+ await fetchCustomModels();
599
+ if (typeof window !== "undefined")
600
+ window.dispatchEvent(new CustomEvent("customModelChanged"));
601
+ }
602
+ } catch (error) {
603
+ console.log("Error deleting custom model:", error);
604
+ }
605
+ };
606
+
607
+ // Fetch Qoder model list and automatically add to available models
608
+ const handleImportQoderModels = async () => {
609
+ if (importingQoderModels) return;
610
+ const activeConnection = connections.find((conn) => conn.isActive !== false);
611
+ if (!activeConnection) {
612
+ alert(translate("Please add an active Qoder connection first"));
613
+ return;
614
+ }
615
+
616
+ setImportingQoderModels(true);
617
+ try {
618
+ const res = await fetch(`/api/providers/${activeConnection.id}/models`);
619
+ const data = await res.json();
620
+ if (!res.ok) {
621
+ alert(data.error || translate("Failed to fetch models"));
622
+ return;
623
+ }
624
+ const models = data.models || [];
625
+ if (models.length === 0) {
626
+ alert(translate("No models returned"));
627
+ return;
628
+ }
629
+
630
+ let importedCount = 0;
631
+ for (const model of models) {
632
+ const modelId = model.id || model.name;
633
+ if (!modelId) continue;
634
+
635
+ // Qoder model ID format may be "qoder/auto" or "auto", need to remove prefix
636
+ const cleanModelId = modelId.replace(/^qoder\//, "");
637
+ const alreadyExists =
638
+ customModels.some(
639
+ (entry) =>
640
+ entry.providerAlias === providerStorageAlias &&
641
+ entry.id === cleanModelId &&
642
+ (entry.kind || entry.type || "llm") === "llm",
643
+ ) || Object.values(modelAliases).includes(`${providerStorageAlias}/${cleanModelId}`);
644
+ if (alreadyExists) {
645
+ continue;
646
+ }
647
+
648
+ await handleAddCustomModel(cleanModelId, "llm", providerStorageAlias);
649
+ importedCount += 1;
650
+ }
651
+
652
+ if (importedCount === 0) {
653
+ alert(translate("All models already exist, no new models added"));
654
+ } else {
655
+ alert(translate("Successfully added") + ` ${importedCount} ` + translate("models"));
656
+ }
657
+ } catch (error) {
658
+ console.log("Error importing Qoder models:", error);
659
+ alert(translate("Error fetching models") + ": " + error.message);
660
+ } finally {
661
+ setImportingQoderModels(false);
662
+ }
663
+ };
664
+
665
+ const handleDelete = async (id) => {
666
+ setConfirmState({
667
+ title: "Delete Connection",
668
+ message: "Delete this connection?",
669
+ onConfirm: async () => {
670
+ setConfirmState(null);
671
+ try {
672
+ const res = await fetch(`/api/providers/${id}`, { method: "DELETE" });
673
+ if (res.ok) {
674
+ setConnections((prev) => prev.filter((c) => c.id !== id));
675
+ }
676
+ } catch (error) {
677
+ console.log("Error deleting connection:", error);
678
+ }
679
+ },
680
+ });
681
+ };
682
+
683
+ const handleBulkDelete = () => {
684
+ const count = selectedConnectionIds.length;
685
+ if (count === 0) return;
686
+ setConfirmState({
687
+ title: `Delete ${count} Connection${count > 1 ? "s" : ""}`,
688
+ message: `Delete ${count} connection${count > 1 ? "s" : ""}? This cannot be undone.`,
689
+ onConfirm: async () => {
690
+ setConfirmState(null);
691
+ let failed = 0;
692
+ const idsToDelete = [...selectedConnectionIds];
693
+ for (const id of idsToDelete) {
694
+ try {
695
+ const res = await fetch(`/api/providers/${id}`, { method: "DELETE" });
696
+ if (!res.ok) failed += 1;
697
+ } catch (error) {
698
+ console.log("Error deleting connection:", error);
699
+ failed += 1;
700
+ }
701
+ }
702
+ setConnections((prev) => prev.filter((c) => !idsToDelete.includes(c.id)));
703
+ setSelectedConnectionIds([]);
704
+ if (failed > 0)
705
+ alert(`Deleted ${idsToDelete.length - failed} connection(s), ${failed} failed.`);
706
+ },
707
+ });
708
+ };
709
+
710
+ const handleOAuthSuccess = () => {
711
+ fetchConnections();
712
+ setShowOAuthModal(false);
713
+ };
714
+
715
+ const handleIFlowCookieSuccess = () => {
716
+ fetchConnections();
717
+ setShowIFlowCookieModal(false);
718
+ };
719
+
720
+ const handleSaveApiKey = async (formData) => {
721
+ setAddConnectionError("");
722
+ try {
723
+ const res = await fetch("/api/providers", {
724
+ method: "POST",
725
+ headers: { "Content-Type": "application/json" },
726
+ body: JSON.stringify({ provider: providerId, ...formData }),
727
+ });
728
+
729
+ let data = null;
730
+ try {
731
+ data = await res.json();
732
+ } catch {
733
+ data = null;
734
+ }
735
+
736
+ if (res.ok) {
737
+ await fetchConnections();
738
+ setShowAddApiKeyModal(false);
739
+ return;
740
+ }
741
+
742
+ setAddConnectionError(data?.error || "Failed to save connection");
743
+ } catch (error) {
744
+ console.log("Error saving connection:", error);
745
+ setAddConnectionError("Failed to save connection");
746
+ }
747
+ };
748
+
749
+ const handleUpdateConnection = async (formData) => {
750
+ try {
751
+ const res = await fetch(`/api/providers/${selectedConnection.id}`, {
752
+ method: "PUT",
753
+ headers: { "Content-Type": "application/json" },
754
+ body: JSON.stringify(formData),
755
+ });
756
+ if (res.ok) {
757
+ await fetchConnections();
758
+ setShowEditModal(false);
759
+ }
760
+ } catch (error) {
761
+ console.log("Error updating connection:", error);
762
+ }
763
+ };
764
+
765
+ const handleUpdateConnectionStatus = async (id, isActive) => {
766
+ try {
767
+ const res = await fetch(`/api/providers/${id}`, {
768
+ method: "PUT",
769
+ headers: { "Content-Type": "application/json" },
770
+ body: JSON.stringify({ isActive }),
771
+ });
772
+ if (res.ok) {
773
+ setConnections((prev) => prev.map((c) => (c.id === id ? { ...c, isActive } : c)));
774
+ }
775
+ } catch (error) {
776
+ console.log("Error updating connection status:", error);
777
+ }
778
+ };
779
+
780
+ const handleSwapPriority = async (index1, index2) => {
781
+ // Optimistic update state
782
+ const newConnections = [...connections];
783
+ [newConnections[index1], newConnections[index2]] = [
784
+ newConnections[index2],
785
+ newConnections[index1],
786
+ ];
787
+ setConnections(newConnections);
788
+
789
+ try {
790
+ await Promise.all([
791
+ fetch(`/api/providers/${newConnections[index1].id}`, {
792
+ method: "PUT",
793
+ headers: { "Content-Type": "application/json" },
794
+ body: JSON.stringify({ priority: index1 }),
795
+ }),
796
+ fetch(`/api/providers/${newConnections[index2].id}`, {
797
+ method: "PUT",
798
+ headers: { "Content-Type": "application/json" },
799
+ body: JSON.stringify({ priority: index2 }),
800
+ }),
801
+ ]);
802
+ } catch (error) {
803
+ console.log("Error swapping priority:", error);
804
+ await fetchConnections();
805
+ }
806
+ };
807
+
808
+ const allSelected = connections.length > 0 && selectedConnectionIds.length === connections.length;
809
+
810
+ const toggleSelectConnection = (connectionId) => {
811
+ setSelectedConnectionIds((prev) =>
812
+ prev.includes(connectionId)
813
+ ? prev.filter((id) => id !== connectionId)
814
+ : [...prev, connectionId],
815
+ );
816
+ };
817
+
818
+ const toggleSelectAllConnections = () => {
819
+ if (allSelected) {
820
+ setSelectedConnectionIds([]);
821
+ return;
822
+ }
823
+ setSelectedConnectionIds(connections.map((conn) => conn.id));
824
+ };
825
+
826
+ useEffect(() => {
827
+ setSelectedConnectionIds((prev) =>
828
+ prev.filter((id) => connections.some((conn) => conn.id === id)),
829
+ );
830
+ }, [connections]);
831
+
832
+ const closeBulkProxyModal = () => {
833
+ if (bulkUpdatingProxy) return;
834
+ setShowBulkProxyModal(false);
835
+ };
836
+
837
+ const applyProxyAssignments = async (assignments) => {
838
+ setBulkUpdatingProxy(true);
839
+ try {
840
+ let failed = 0;
841
+ for (const { connectionId, proxyPoolId } of assignments) {
842
+ try {
843
+ const res = await fetch(`/api/providers/${connectionId}`, {
844
+ method: "PUT",
845
+ headers: { "Content-Type": "application/json" },
846
+ body: JSON.stringify({ proxyPoolId }),
847
+ });
848
+ if (!res.ok) failed += 1;
849
+ } catch (e) {
850
+ console.log("Error applying proxy for", connectionId, e);
851
+ failed += 1;
852
+ }
853
+ }
854
+ if (failed > 0) alert(`Updated with ${failed} failed request(s).`);
855
+ await fetchConnections();
856
+ setShowBulkProxyModal(false);
857
+ } finally {
858
+ setBulkUpdatingProxy(false);
859
+ }
860
+ };
861
+
862
+ const handleApplySinglePool = (proxyPoolId) => {
863
+ const targets = connections.map((c) => ({ connectionId: c.id, proxyPoolId }));
864
+ return applyProxyAssignments(targets);
865
+ };
866
+
867
+ const handleApplyOneToOne = () => {
868
+ const activePools = proxyPools.filter((p) => p.isActive === true);
869
+ if (activePools.length === 0) {
870
+ alert("No active proxy pools available.");
871
+ return;
872
+ }
873
+ const targets = connections.map((c, i) => ({
874
+ connectionId: c.id,
875
+ proxyPoolId: activePools[i % activePools.length].id,
876
+ }));
877
+ return applyProxyAssignments(targets);
878
+ };
879
+
880
+ const isSelected = (connectionId) => selectedConnectionIds.includes(connectionId);
881
+
882
+ const connectionsList = (
883
+ <div className="flex min-w-0 flex-col divide-y divide-black/[0.03] dark:divide-white/[0.03] max-h-[500px] overflow-y-auto pr-1">
884
+ {connections.map((conn, index) => (
885
+ <div key={conn.id} className="flex min-w-0 items-stretch">
886
+ <div className="flex shrink-0 items-center pl-1 sm:pl-2">
887
+ <Checkbox
888
+ checked={isSelected(conn.id)}
889
+ onCheckedChange={() => toggleSelectConnection(conn.id)}
890
+ />
891
+ </div>
892
+ <div className="flex-1 min-w-0">
893
+ <ConnectionRow
894
+ connection={conn}
895
+ proxyPools={proxyPools}
896
+ isOAuth={isOAuth}
897
+ isFirst={index === 0}
898
+ isLast={index === connections.length - 1}
899
+ onMoveUp={() => handleSwapPriority(index, index - 1)}
900
+ onMoveDown={() => handleSwapPriority(index, index + 1)}
901
+ onToggleActive={(isActive) => handleUpdateConnectionStatus(conn.id, isActive)}
902
+ autoPing={
903
+ AUTO_PING_SETTINGS_KEYS[providerId] && conn.authType === "oauth"
904
+ ? {
905
+ on: autoPing.connections[conn.id] === true,
906
+ onToggle: (on) => handleAutoPingConnection(conn.id, on),
907
+ provider: providerId,
908
+ }
909
+ : null
910
+ }
911
+ onUpdateProxy={async (proxyPoolId) => {
912
+ try {
913
+ const res = await fetch(`/api/providers/${conn.id}`, {
914
+ method: "PUT",
915
+ headers: { "Content-Type": "application/json" },
916
+ body: JSON.stringify({ proxyPoolId: proxyPoolId || null }),
917
+ });
918
+ if (res.ok) {
919
+ setConnections((prev) =>
920
+ prev.map((c) =>
921
+ c.id === conn.id
922
+ ? {
923
+ ...c,
924
+ providerSpecificData: {
925
+ ...c.providerSpecificData,
926
+ proxyPoolId: proxyPoolId || null,
927
+ },
928
+ }
929
+ : c,
930
+ ),
931
+ );
932
+ }
933
+ } catch (error) {
934
+ console.log("Error updating proxy:", error);
935
+ }
936
+ }}
937
+ onEdit={() => {
938
+ setSelectedConnection(conn);
939
+ setShowEditModal(true);
940
+ }}
941
+ onDelete={() => handleDelete(conn.id)}
942
+ oneByOneStatus={oneByOneResults[conn.id] || null}
943
+ />
944
+ </div>
945
+ </div>
946
+ ))}
947
+ </div>
948
+ );
949
+
950
+ const activePools = proxyPools.filter((p) => p.isActive === true);
951
+
952
+ const bulkActionModal = (
953
+ <Dialog
954
+ open={showBulkProxyModal}
955
+ onOpenChange={(open) => {
956
+ if (!open) closeBulkProxyModal();
957
+ }}
958
+ >
959
+ <DialogContent className="max-w-md">
960
+ <DialogHeader>
961
+ <DialogTitle>Apply Proxy ({connections.length} connections)</DialogTitle>
962
+ </DialogHeader>
963
+ <div className="flex flex-col gap-2 p-4">
964
+ <button
965
+ onClick={handleApplyOneToOne}
966
+ disabled={bulkUpdatingProxy || activePools.length === 0}
967
+ className="flex items-center gap-3 rounded-lg border border-border px-3 py-2.5 text-left transition-colors hover:bg-muted disabled:cursor-not-allowed disabled:opacity-50"
968
+ >
969
+ <ArrowLeftRight className="size-4 shrink-0 text-muted-foreground" />
970
+ <span className="flex min-w-0 flex-col">
971
+ <span className="text-sm font-medium text-foreground">One-to-one (rotate)</span>
972
+ <span className="text-xs text-muted-foreground">
973
+ Distribute connections across {activePools.length} active pool(s)
974
+ </span>
975
+ </span>
976
+ </button>
977
+ <button
978
+ onClick={() => handleApplySinglePool(null)}
979
+ disabled={bulkUpdatingProxy}
980
+ className="flex items-center gap-3 rounded-lg border border-border px-3 py-2.5 text-left transition-colors hover:bg-muted disabled:cursor-not-allowed disabled:opacity-50"
981
+ >
982
+ <Unplug className="size-4 shrink-0 text-muted-foreground" />
983
+ <span className="flex min-w-0 flex-col">
984
+ <span className="text-sm font-medium text-foreground">None (unbind all)</span>
985
+ <span className="text-xs text-muted-foreground">
986
+ Remove proxy from all connections
987
+ </span>
988
+ </span>
989
+ </button>
990
+ {proxyPools.map((pool) => (
991
+ <button
992
+ key={pool.id}
993
+ onClick={() => handleApplySinglePool(pool.id)}
994
+ disabled={bulkUpdatingProxy || pool.isActive !== true}
995
+ className="flex items-center gap-3 rounded-lg border border-border px-3 py-2.5 text-left transition-colors hover:bg-muted disabled:cursor-not-allowed disabled:opacity-50"
996
+ >
997
+ <Server className="size-4 shrink-0 text-muted-foreground" />
998
+ <span className="truncate text-sm font-medium text-foreground">{pool.name}</span>
999
+ {pool.isActive !== true && (
1000
+ <span className="text-[10px] text-muted-foreground">(inactive)</span>
1001
+ )}
1002
+ </button>
1003
+ ))}
1004
+
1005
+ {bulkUpdatingProxy && <p className="text-xs text-muted-foreground">Applying...</p>}
1006
+ </div>
1007
+ </DialogContent>
1008
+ </Dialog>
1009
+ );
1010
+
1011
+ const handleTestModel = async (modelId, kind = "llm") => {
1012
+ if (testingModelIds.has(modelId)) return;
1013
+ setTestingModelIds((prev) => new Set(prev).add(modelId));
1014
+ try {
1015
+ const res = await fetch("/api/models/test", {
1016
+ method: "POST",
1017
+ headers: { "Content-Type": "application/json" },
1018
+ body: JSON.stringify({ model: `${providerStorageAlias}/${modelId}`, kind }),
1019
+ });
1020
+ const data = await res.json();
1021
+ setModelTestResults((prev) => ({ ...prev, [modelId]: data.ok ? "ok" : "error" }));
1022
+ setModelsTestError(data.ok ? "" : data.error || "Model not reachable");
1023
+ } catch {
1024
+ setModelTestResults((prev) => ({ ...prev, [modelId]: "error" }));
1025
+ setModelsTestError("Network error");
1026
+ } finally {
1027
+ setTestingModelIds((prev) => {
1028
+ const n = new Set(prev);
1029
+ n.delete(modelId);
1030
+ return n;
1031
+ });
1032
+ }
1033
+ };
1034
+
1035
+ const renderModelsSection = () => {
1036
+ if (isCompatible) {
1037
+ return (
1038
+ <CompatibleModelsSection
1039
+ providerStorageAlias={providerStorageAlias}
1040
+ providerDisplayAlias={providerDisplayAlias}
1041
+ modelAliases={modelAliases}
1042
+ customModels={customModels}
1043
+ copied={copied}
1044
+ onCopy={copy}
1045
+ onSetAlias={handleSetAlias}
1046
+ onDeleteAlias={handleDeleteAlias}
1047
+ onAddCustomModel={(modelId) => handleAddCustomModel(modelId, "llm", providerStorageAlias)}
1048
+ onDeleteCustomModel={(modelId) =>
1049
+ handleDeleteCustomModel(modelId, "llm", providerStorageAlias)
1050
+ }
1051
+ connections={connections}
1052
+ isAnthropic={isAnthropicCompatible}
1053
+ />
1054
+ );
1055
+ }
1056
+ // Combine hardcoded models with Kilo free models (deduplicated)
1057
+ // Exclude non-llm models (embedding, tts, etc.) — they have dedicated pages under media-providers
1058
+ const allModels = [
1059
+ ...models,
1060
+ ...kiloFreeModels.filter((fm) => !models.some((m) => m.id === fm.id)),
1061
+ ].filter((m) => {
1062
+ const k = getModelKind(m);
1063
+ return !k || k === "llm";
1064
+ });
1065
+ const disabledSet = new Set(disabledModelIds);
1066
+ const displayModels = allModels.filter((m) => !disabledSet.has(m.id));
1067
+ const disabledDisplayModels = allModels.filter((m) => disabledSet.has(m.id));
1068
+ const customModelRows = getProviderCustomModelRows({
1069
+ customModels,
1070
+ modelAliases,
1071
+ providerAlias: providerStorageAlias,
1072
+ builtInModels: models,
1073
+ type: "llm",
1074
+ });
1075
+
1076
+ return (
1077
+ <div className="flex flex-wrap gap-3">
1078
+ {/* Custom models first */}
1079
+ {customModelRows.map((model) => (
1080
+ <ModelRow
1081
+ key={`${model.source}-${model.fullModel}`}
1082
+ model={{ id: model.id, name: model.name }}
1083
+ fullModel={`${providerDisplayAlias}/${model.id}`}
1084
+ alias={model.alias}
1085
+ copied={copied}
1086
+ onCopy={copy}
1087
+ onSetAlias={() => {}}
1088
+ onDeleteAlias={() => {
1089
+ if (model.source === "custom") {
1090
+ handleDeleteCustomModel(model.id, "llm", providerStorageAlias);
1091
+ } else {
1092
+ handleDeleteAlias(model.alias);
1093
+ }
1094
+ }}
1095
+ testStatus={modelTestResults[model.id]}
1096
+ onTest={
1097
+ connections.length > 0 || isFreeNoAuth
1098
+ ? () => handleTestModel(model.id, getModelKind(model, "llm"))
1099
+ : undefined
1100
+ }
1101
+ isTesting={testingModelIds.has(model.id)}
1102
+ isCustom
1103
+ isFree={false}
1104
+ caps={getCaps(`${providerId}/${model.id}`)}
1105
+ />
1106
+ ))}
1107
+
1108
+ {displayModels.map((model) => {
1109
+ const fullModel = `${providerStorageAlias}/${model.id}`;
1110
+ const oldFormatModel = `${providerId}/${model.id}`;
1111
+ const existingAlias = Object.entries(modelAliases).find(
1112
+ ([, m]) => m === fullModel || m === oldFormatModel,
1113
+ )?.[0];
1114
+ return (
1115
+ <ModelRow
1116
+ key={model.id}
1117
+ model={model}
1118
+ fullModel={`${providerDisplayAlias}/${model.id}`}
1119
+ alias={existingAlias}
1120
+ copied={copied}
1121
+ onCopy={copy}
1122
+ onSetAlias={(alias) => handleSetAlias(model.id, alias, providerStorageAlias)}
1123
+ onDeleteAlias={() => handleDeleteAlias(existingAlias)}
1124
+ testStatus={modelTestResults[model.id]}
1125
+ onTest={
1126
+ connections.length > 0 || isFreeNoAuth
1127
+ ? () => handleTestModel(model.id, getModelKind(model, "llm"))
1128
+ : undefined
1129
+ }
1130
+ isTesting={testingModelIds.has(model.id)}
1131
+ isFree={model.isFree}
1132
+ onDisable={() => handleDisableModel(model.id)}
1133
+ caps={getCaps(`${providerId}/${model.id}`)}
1134
+ />
1135
+ );
1136
+ })}
1137
+
1138
+ {/* Add model button — inline, same style as model chips */}
1139
+ <button
1140
+ onClick={() => setShowAddCustomModel(true)}
1141
+ className="flex w-full items-center justify-center gap-1.5 rounded-lg border border-dashed border-primary/40 px-3 py-2 text-xs text-primary transition-colors hover:border-primary hover:bg-primary/5 sm:w-auto"
1142
+ >
1143
+ <Icon name="add" className="text-sm" />
1144
+ Add Model
1145
+ </button>
1146
+
1147
+ {/* Import Qoder models button — only show for qoder provider */}
1148
+ {providerId === "qoder" && connections.some((conn) => conn.isActive !== false) && (
1149
+ <button
1150
+ onClick={handleImportQoderModels}
1151
+ disabled={importingQoderModels}
1152
+ className="flex w-full items-center justify-center gap-1.5 rounded-lg border border-dashed border-blue-500/40 px-3 py-2 text-xs text-blue-600 dark:text-blue-400 transition-colors hover:border-blue-500 hover:bg-blue-500/5 sm:w-auto disabled:opacity-50 disabled:cursor-not-allowed"
1153
+ >
1154
+ <Icon
1155
+ name={importingQoderModels ? "progress_activity" : "download"}
1156
+ className="text-sm"
1157
+ style={importingQoderModels ? { animation: "spin 1s linear infinite" } : undefined}
1158
+ />
1159
+ {importingQoderModels ? translate("Fetching...") : translate("Fetch Qoder Models")}
1160
+ </button>
1161
+ )}
1162
+
1163
+ {/* Suggested models from provider API — show only models not yet added */}
1164
+ {suggestedModels.length > 0 &&
1165
+ (() => {
1166
+ const addedFullModels = new Set([
1167
+ ...Object.values(modelAliases),
1168
+ ...customModelRows.map((model) => model.fullModel),
1169
+ ]);
1170
+ const hardcodedIds = new Set(models.map((m) => m.id));
1171
+ const notAdded = suggestedModels.filter(
1172
+ (m) =>
1173
+ !addedFullModels.has(`${providerStorageAlias}/${m.id}`) && !hardcodedIds.has(m.id),
1174
+ );
1175
+ if (notAdded.length === 0) return null;
1176
+ return (
1177
+ <div className="w-full mt-2">
1178
+ <p className="text-xs text-muted-foreground mb-2">
1179
+ Suggested free models (≥200k context):
1180
+ </p>
1181
+ <div className="flex flex-wrap gap-2">
1182
+ {notAdded.map((m) => (
1183
+ <Tooltip key={m.id}>
1184
+ <TooltipTrigger asChild>
1185
+ <button
1186
+ onClick={async () => {
1187
+ await handleAddCustomModel(m.id, "llm", providerStorageAlias);
1188
+ }}
1189
+ 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-muted-foreground hover:text-primary hover:border-primary/40 hover:bg-primary/5 transition-colors"
1190
+ >
1191
+ <Icon name="add" className="text-[13px]" />
1192
+ {m.id.split("/").pop()}
1193
+ </button>
1194
+ </TooltipTrigger>
1195
+ <TooltipContent>
1196
+ {`${m.name} · ${(m.contextLength / 1000).toFixed(0)}k ctx`}
1197
+ </TooltipContent>
1198
+ </Tooltip>
1199
+ ))}
1200
+ </div>
1201
+ </div>
1202
+ );
1203
+ })()}
1204
+
1205
+ {/* Disabled models — restorable */}
1206
+ {disabledDisplayModels.length > 0 && (
1207
+ <div className="w-full mt-2">
1208
+ <p className="text-xs text-muted-foreground mb-2">
1209
+ Disabled models ({disabledDisplayModels.length}):
1210
+ </p>
1211
+ <div className="flex flex-wrap gap-2">
1212
+ {disabledDisplayModels.map((m) => (
1213
+ <Tooltip key={m.id}>
1214
+ <TooltipTrigger asChild>
1215
+ <button
1216
+ onClick={() => handleEnableModel(m.id)}
1217
+ className="flex items-center gap-1 px-2.5 py-1.5 rounded-lg border border-dashed border-black/10 dark:border-white/10 text-xs text-muted-foreground hover:text-primary hover:border-primary/40 hover:bg-primary/5 transition-colors"
1218
+ >
1219
+ <Icon name="add" className="text-[13px]" />
1220
+ {m.id}
1221
+ </button>
1222
+ </TooltipTrigger>
1223
+ <TooltipContent>Restore model</TooltipContent>
1224
+ </Tooltip>
1225
+ ))}
1226
+ </div>
1227
+ </div>
1228
+ )}
1229
+ </div>
1230
+ );
1231
+ };
1232
+
1233
+ if (loading) {
1234
+ return (
1235
+ <Page>
1236
+ <PanelSkeleton />
1237
+ <PanelSkeleton />
1238
+ </Page>
1239
+ );
1240
+ }
1241
+
1242
+ if (!providerInfo) {
1243
+ return (
1244
+ <div className="text-center py-20">
1245
+ <p className="text-muted-foreground">Provider not found</p>
1246
+ <Link href="/dashboard/providers" className="text-primary mt-4 inline-block">
1247
+ Back to Providers
1248
+ </Link>
1249
+ </div>
1250
+ );
1251
+ }
1252
+
1253
+ // Determine icon path: guess a brand logo from the custom node baseUrl
1254
+ // first (e.g. api.deepseek.com → deepseek.png), then the API family logo.
1255
+ const getHeaderIconPath = () => {
1256
+ if (isCompatible) {
1257
+ const guessed = getProviderIconSrc(guessProviderIconIdFromUrl(providerNode?.baseUrl));
1258
+ if (guessed) return guessed;
1259
+ return isAnthropicCompatible ? "/providers/anthropic.png" : "/providers/openai.png";
1260
+ }
1261
+ return getProviderIconSrc(providerInfo.id);
1262
+ };
1263
+
1264
+ return (
1265
+ <>
1266
+ <Page>
1267
+ {/* Header */}
1268
+ <div className="min-w-0">
1269
+ <Button variant="outline" size="sm" asChild className="mb-4">
1270
+ <Link href="/dashboard/providers">
1271
+ <Icon name="arrow_back" className="text-lg" />
1272
+ Back to Providers
1273
+ </Link>
1274
+ </Button>
1275
+ <div className="flex min-w-0 items-center gap-3 sm:gap-4">
1276
+ <div
1277
+ className="flex size-12 shrink-0 items-center justify-center rounded-lg"
1278
+ style={{ backgroundColor: `${providerInfo.color}15` }}
1279
+ >
1280
+ {headerImgError || !getHeaderIconPath() ? (
1281
+ <span className="text-sm font-bold" style={{ color: providerInfo.color }}>
1282
+ {getInitials(providerInfo.name) ||
1283
+ providerInfo.textIcon ||
1284
+ providerInfo.id.slice(0, 2).toUpperCase()}
1285
+ </span>
1286
+ ) : (
1287
+ <Image
1288
+ src={getHeaderIconPath()}
1289
+ alt={providerInfo.name}
1290
+ width={48}
1291
+ height={48}
1292
+ className="max-h-12 max-w-12 rounded-lg object-contain"
1293
+ sizes="48px"
1294
+ onError={() => {
1295
+ markProviderIconMissing(providerInfo.id);
1296
+ setHeaderImgError(true);
1297
+ }}
1298
+ loading="lazy"
1299
+ decoding="async"
1300
+ />
1301
+ )}
1302
+ </div>
1303
+ <div className="min-w-0">
1304
+ <div className="flex items-center gap-3 flex-wrap">
1305
+ <h1 className="truncate text-2xl font-semibold tracking-tight sm:text-3xl">
1306
+ {providerInfo.name}
1307
+ </h1>
1308
+ {(providerInfo.notice?.apiKeyUrl ||
1309
+ providerInfo.notice?.signupUrl ||
1310
+ providerInfo.website) && (
1311
+ <a
1312
+ href={
1313
+ providerInfo.notice?.apiKeyUrl ||
1314
+ providerInfo.notice?.signupUrl ||
1315
+ providerInfo.website
1316
+ }
1317
+ target="_blank"
1318
+ rel="noopener noreferrer"
1319
+ className="text-xs text-primary hover:underline inline-flex items-center gap-1"
1320
+ >
1321
+ <Icon name="open_in_new" className="text-sm" />
1322
+ {providerInfo.notice?.apiKeyUrl ? "Get API Key" : "Sign up / Learn more"}
1323
+ </a>
1324
+ )}
1325
+ </div>
1326
+ <p className="text-muted-foreground">
1327
+ {connections.length} connection{connections.length === 1 ? "" : "s"}
1328
+ </p>
1329
+ </div>
1330
+ </div>
1331
+ </div>
1332
+
1333
+ {providerInfo.deprecated && (
1334
+ <div className="flex items-center gap-2 px-3 py-2 rounded-lg bg-yellow-500/10 border border-yellow-500/30">
1335
+ <Icon name="warning" className="text-[16px] text-yellow-500 mt-0.5 shrink-0" />
1336
+ <p className="text-xs text-red-600 dark:text-yellow-400 leading-relaxed">
1337
+ {providerInfo.deprecationNotice}
1338
+ </p>
1339
+ </div>
1340
+ )}
1341
+
1342
+ {providerInfo.notice?.text && !providerInfo.deprecated && (
1343
+ <div className="flex flex-col gap-2 rounded-lg border border-blue-500/30 bg-blue-500/10 px-3 py-2 sm:flex-row sm:items-center">
1344
+ <Icon name="info" className="text-[16px] text-blue-500 shrink-0" />
1345
+ <p className="min-w-0 flex-1 text-xs leading-relaxed text-blue-600 dark:text-blue-400">
1346
+ {providerInfo.notice.text}
1347
+ </p>
1348
+ {providerInfo.notice.apiKeyUrl && (
1349
+ <a
1350
+ href={providerInfo.notice.apiKeyUrl}
1351
+ target="_blank"
1352
+ rel="noopener noreferrer"
1353
+ className="inline-flex justify-center rounded bg-blue-500 px-2 py-1 text-xs font-medium text-white transition-colors hover:bg-blue-600 sm:py-0.5"
1354
+ >
1355
+ Get API Key →
1356
+ </a>
1357
+ )}
1358
+ </div>
1359
+ )}
1360
+
1361
+ {isCompatible && providerNode && (
1362
+ <Card>
1363
+ <CardContent>
1364
+ <div className="mb-4 flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between">
1365
+ <div className="min-w-0">
1366
+ <h2 className="text-lg font-semibold">
1367
+ {isAnthropicCompatible
1368
+ ? "Anthropic Compatible Details"
1369
+ : "OpenAI Compatible Details"}
1370
+ </h2>
1371
+ <p className="break-all text-sm text-muted-foreground">
1372
+ {isAnthropicCompatible
1373
+ ? "Messages API"
1374
+ : providerNode.apiType === "responses"
1375
+ ? "Responses API"
1376
+ : "Chat Completions"}{" "}
1377
+ · {(providerNode.baseUrl || "").replace(/\/$/, "")}/
1378
+ {isAnthropicCompatible
1379
+ ? "messages"
1380
+ : providerNode.apiType === "responses"
1381
+ ? "responses"
1382
+ : "chat/completions"}
1383
+ </p>
1384
+ </div>
1385
+ <div className="grid grid-cols-1 gap-2 sm:flex sm:items-center">
1386
+ <Button
1387
+ size="sm"
1388
+ onClick={() => {
1389
+ setAddConnectionError("");
1390
+ setShowAddApiKeyModal(true);
1391
+ }}
1392
+ className="w-full sm:w-auto"
1393
+ >
1394
+ <Icon name="add" />
1395
+ Add API Key
1396
+ </Button>
1397
+ <Button
1398
+ size="sm"
1399
+ variant="secondary"
1400
+ onClick={() => setShowEditNodeModal(true)}
1401
+ className="w-full sm:w-auto"
1402
+ >
1403
+ <Icon name="edit" />
1404
+ Edit
1405
+ </Button>
1406
+ <Button
1407
+ size="sm"
1408
+ variant="secondary"
1409
+ onClick={async () => {
1410
+ setConfirmState({
1411
+ title: "Delete Compatible Node",
1412
+ message: `Delete this ${isAnthropicCompatible ? "Anthropic" : "OpenAI"} Compatible node?`,
1413
+ onConfirm: async () => {
1414
+ setConfirmState(null);
1415
+ try {
1416
+ const res = await fetch(`/api/provider-nodes/${providerId}`, {
1417
+ method: "DELETE",
1418
+ });
1419
+ if (res.ok) {
1420
+ router.push("/dashboard/providers");
1421
+ }
1422
+ } catch (error) {
1423
+ console.log("Error deleting provider node:", error);
1424
+ }
1425
+ },
1426
+ });
1427
+ }}
1428
+ className="w-full sm:w-auto"
1429
+ >
1430
+ <Icon name="delete" />
1431
+ Delete
1432
+ </Button>
1433
+ </div>
1434
+ </div>
1435
+ </CardContent>
1436
+ </Card>
1437
+ )}
1438
+
1439
+ {/* Connections */}
1440
+ {isFreeNoAuth ? (
1441
+ <NoAuthProxyCard providerId={providerId} />
1442
+ ) : (
1443
+ <Card>
1444
+ <CardContent>
1445
+ <div className="mb-4 flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between">
1446
+ <h2 className="text-lg font-semibold">Connections</h2>
1447
+ <div className="flex flex-col gap-3 sm:flex-row sm:items-center sm:gap-4">
1448
+ {connections.length > 0 && proxyPools.length > 0 && (
1449
+ <Button
1450
+ size="sm"
1451
+ variant="secondary"
1452
+ onClick={() => setShowBulkProxyModal(true)}
1453
+ >
1454
+ <Icon name="lan" />
1455
+ Apply Proxy
1456
+ </Button>
1457
+ )}
1458
+ {connections.length > 0 && (
1459
+ <>
1460
+ {selectedConnectionIds.length > 0 && (
1461
+ <Button size="sm" variant="destructive" onClick={handleBulkDelete}>
1462
+ <Icon name="delete" />
1463
+ Delete Selected ({selectedConnectionIds.length})
1464
+ </Button>
1465
+ )}
1466
+ <Button
1467
+ size="sm"
1468
+ variant="secondary"
1469
+ onClick={handleRunOneByOneTest}
1470
+ disabled={oneByOneRunning}
1471
+ >
1472
+ <Icon name="sync" />
1473
+ {oneByOneRunning
1474
+ ? "Testing Connection One-by-One..."
1475
+ : "Test Connection One-by-One"}
1476
+ </Button>
1477
+ {oneByOneRunning && (
1478
+ <Button
1479
+ size="sm"
1480
+ variant="ghost"
1481
+ onClick={handleStopOneByOneTest}
1482
+ disabled={oneByOneStopping}
1483
+ >
1484
+ <Icon name="stop" />
1485
+ {oneByOneStopping ? "Stopping..." : "Stop"}
1486
+ </Button>
1487
+ )}
1488
+ </>
1489
+ )}
1490
+ {/* Round Robin toggle */}
1491
+ <div className="flex flex-wrap items-center gap-2">
1492
+ <span className="text-xs text-muted-foreground font-medium">Round Robin</span>
1493
+ <Switch
1494
+ checked={providerStrategy === "round-robin"}
1495
+ onCheckedChange={handleRoundRobinToggle}
1496
+ />
1497
+ {providerStrategy === "round-robin" && (
1498
+ <div className="flex items-center gap-1.5">
1499
+ <span className="text-xs text-muted-foreground">Sticky:</span>
1500
+ <input
1501
+ type="number"
1502
+ min={1}
1503
+ value={providerStickyLimit}
1504
+ onChange={(e: any) => handleStickyLimitChange(e.target.value)}
1505
+ placeholder="1"
1506
+ className="w-14 px-2 py-1 text-xs border border-border rounded-md bg-background focus:outline-none focus:border-primary"
1507
+ />
1508
+ </div>
1509
+ )}
1510
+ </div>
1511
+ </div>
1512
+ </div>
1513
+
1514
+ {connections.length === 0 ? (
1515
+ <div className="flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between">
1516
+ <div className="flex items-center gap-3">
1517
+ <div className="inline-flex items-center justify-center w-9 h-9 rounded-full bg-primary/10 text-primary shrink-0">
1518
+ <Icon name={isOAuth ? "lock" : "key"} className="text-[18px]" />
1519
+ </div>
1520
+ <div className="min-w-0">
1521
+ <p className="text-sm text-muted-foreground">No connections yet</p>
1522
+ {hasDualAuthModes && (
1523
+ <p className="text-xs text-muted-foreground">
1524
+ Choose {oauthConnectionLabel} or {apiKeyConnectionLabel}.
1525
+ </p>
1526
+ )}
1527
+ </div>
1528
+ </div>
1529
+ <div className="flex gap-2">
1530
+ {hasDualAuthModes ? (
1531
+ <>
1532
+ <Button size="sm" variant="secondary" onClick={triggerOAuthConnection}>
1533
+ <Icon name="lock" />
1534
+ {oauthConnectionLabel}
1535
+ </Button>
1536
+ <Button size="sm" onClick={triggerApiKeyConnection}>
1537
+ <Icon name="key" />
1538
+ {apiKeyConnectionLabel}
1539
+ </Button>
1540
+ </>
1541
+ ) : (
1542
+ <>
1543
+ {!isCompatible && providerId === "iflow" && (
1544
+ <Button
1545
+ size="sm"
1546
+ variant="secondary"
1547
+ onClick={() => setShowIFlowCookieModal(true)}
1548
+ >
1549
+ <Icon name="cookie" />
1550
+ Cookie
1551
+ </Button>
1552
+ )}
1553
+ {providerId === "codex" && (
1554
+ <Button
1555
+ size="sm"
1556
+ variant="secondary"
1557
+ onClick={() => setShowBulkImportCodex(true)}
1558
+ >
1559
+ <Icon name="playlist_add" />
1560
+ {translate("Bulk Add")}
1561
+ </Button>
1562
+ )}
1563
+ {providerId === "grok-cli" && (
1564
+ <Button
1565
+ size="sm"
1566
+ variant="secondary"
1567
+ onClick={() => setShowBulkImportGrokCli(true)}
1568
+ >
1569
+ <Icon name="playlist_add" />
1570
+ {translate("Bulk Add")}
1571
+ </Button>
1572
+ )}
1573
+ <Button size="sm" onClick={triggerAddConnection}>
1574
+ <Icon name="add" />
1575
+ {isCompatible
1576
+ ? "Add API Key"
1577
+ : providerId === "iflow"
1578
+ ? "OAuth"
1579
+ : "Add Connection"}
1580
+ </Button>
1581
+ </>
1582
+ )}
1583
+ </div>
1584
+ </div>
1585
+ ) : (
1586
+ <>
1587
+ {oneByOneSummary && (
1588
+ <div className="mb-4 rounded-lg border border-black/10 bg-black/[0.02] px-3 py-2 text-xs text-muted-foreground dark:border-white/10 dark:bg-white/[0.03]">
1589
+ <div className="flex flex-wrap items-center gap-3">
1590
+ <span>Total: {oneByOneSummary.total}</span>
1591
+ <span>Completed: {oneByOneSummary.completed}</span>
1592
+ <span>Passed: {oneByOneSummary.passed}</span>
1593
+ <span>Failed: {oneByOneSummary.failed}</span>
1594
+ {oneByOneSummary.stopped && (
1595
+ <span className="text-amber-600 dark:text-amber-400">Stopped</span>
1596
+ )}
1597
+ {oneByOneRunning && oneByOneCurrentConnectionId && (
1598
+ <span>
1599
+ Running:{" "}
1600
+ {connections.find((conn) => conn.id === oneByOneCurrentConnectionId)
1601
+ ?.name || oneByOneCurrentConnectionId}
1602
+ </span>
1603
+ )}
1604
+ </div>
1605
+ </div>
1606
+ )}
1607
+ {connections.length > 0 && (
1608
+ <div className="mb-3 flex items-center gap-2 border-b border-black/[0.03] pb-2 dark:border-white/[0.03]">
1609
+ <label className="flex cursor-pointer items-center gap-1.5 text-xs text-muted-foreground hover:text-primary">
1610
+ <Checkbox
1611
+ checked={allSelected}
1612
+ onCheckedChange={toggleSelectAllConnections}
1613
+ className="size-3.5 [&_svg]:size-2.5"
1614
+ />
1615
+ Select All
1616
+ </label>
1617
+ </div>
1618
+ )}
1619
+ {connectionsList}
1620
+ {!isCompatible && (
1621
+ <div className="mt-4 grid grid-cols-1 gap-2 sm:flex">
1622
+ {providerId === "iflow" && (
1623
+ <Tooltip>
1624
+ <TooltipTrigger asChild>
1625
+ <Button
1626
+ size="sm"
1627
+ variant="secondary"
1628
+ onClick={() => setShowIFlowCookieModal(true)}
1629
+ className="w-full sm:w-auto"
1630
+ >
1631
+ <Icon name="cookie" />
1632
+ Cookie
1633
+ </Button>
1634
+ </TooltipTrigger>
1635
+ <TooltipContent>Add connection using browser cookie</TooltipContent>
1636
+ </Tooltip>
1637
+ )}
1638
+ {providerId === "codex" && (
1639
+ <Tooltip>
1640
+ <TooltipTrigger asChild>
1641
+ <Button
1642
+ size="sm"
1643
+ variant="secondary"
1644
+ onClick={() => setShowBulkImportCodex(true)}
1645
+ className="w-full sm:w-auto"
1646
+ >
1647
+ <Icon name="playlist_add" />
1648
+ {translate("Bulk Add")}
1649
+ </Button>
1650
+ </TooltipTrigger>
1651
+ <TooltipContent>
1652
+ {translate("Bulk import codex accounts from JSON")}
1653
+ </TooltipContent>
1654
+ </Tooltip>
1655
+ )}
1656
+ {providerId === "grok-cli" && (
1657
+ <Tooltip>
1658
+ <TooltipTrigger asChild>
1659
+ <Button
1660
+ size="sm"
1661
+ variant="secondary"
1662
+ onClick={() => setShowBulkImportGrokCli(true)}
1663
+ className="w-full sm:w-auto"
1664
+ >
1665
+ <Icon name="playlist_add" />
1666
+ {translate("Bulk Add")}
1667
+ </Button>
1668
+ </TooltipTrigger>
1669
+ <TooltipContent>
1670
+ {translate("Bulk import Grok CLI accounts from JSON")}
1671
+ </TooltipContent>
1672
+ </Tooltip>
1673
+ )}
1674
+ {hasDualAuthModes ? (
1675
+ <>
1676
+ <Button
1677
+ size="sm"
1678
+ variant="secondary"
1679
+ onClick={triggerOAuthConnection}
1680
+ className="w-full sm:w-auto"
1681
+ >
1682
+ <Icon name="lock" />
1683
+ {oauthConnectionLabel}
1684
+ </Button>
1685
+ <Button
1686
+ size="sm"
1687
+ onClick={triggerApiKeyConnection}
1688
+ className="w-full sm:w-auto"
1689
+ >
1690
+ <Icon name="key" />
1691
+ {apiKeyConnectionLabel}
1692
+ </Button>
1693
+ </>
1694
+ ) : (
1695
+ <Button
1696
+ size="sm"
1697
+ onClick={triggerAddConnection}
1698
+ className="w-full sm:w-auto"
1699
+ >
1700
+ <Icon name="add" />
1701
+ Add
1702
+ </Button>
1703
+ )}
1704
+ </div>
1705
+ )}
1706
+ </>
1707
+ )}
1708
+ </CardContent>
1709
+ </Card>
1710
+ )}
1711
+
1712
+ {/* Models */}
1713
+ <Card>
1714
+ <CardContent>
1715
+ <div className="mb-4 flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between">
1716
+ <div className="flex items-center gap-3">
1717
+ <h2 className="text-lg font-semibold">{"Available Models"}</h2>
1718
+ </div>
1719
+ {!isCompatible &&
1720
+ (() => {
1721
+ const allIds = [
1722
+ ...models,
1723
+ ...kiloFreeModels.filter((fm) => !models.some((m) => m.id === fm.id)),
1724
+ ]
1725
+ .filter((m) => {
1726
+ const k = getModelKind(m);
1727
+ return !k || k === "llm";
1728
+ })
1729
+ .map((m) => m.id);
1730
+ const activeIds = allIds.filter((id) => !disabledModelIds.includes(id));
1731
+ return (
1732
+ <div className="flex gap-2">
1733
+ {disabledModelIds.length > 0 && (
1734
+ <Button size="sm" variant="secondary" onClick={handleEnableAll}>
1735
+ <Icon name="restart_alt" />
1736
+ Active All
1737
+ </Button>
1738
+ )}
1739
+ {activeIds.length > 0 && (
1740
+ <Button
1741
+ size="sm"
1742
+ variant="secondary"
1743
+ onClick={() => handleDisableAll(activeIds)}
1744
+ >
1745
+ <Icon name="block" />
1746
+ Disable All
1747
+ </Button>
1748
+ )}
1749
+ </div>
1750
+ );
1751
+ })()}
1752
+ </div>
1753
+ {!!modelsTestError && (
1754
+ <div className="mb-3">
1755
+ <p className="text-xs text-red-500 break-words">{modelsTestError}</p>
1756
+ {/RegionError|hosted in China|regionNotAllowed/i.test(modelsTestError) &&
1757
+ (() => {
1758
+ const str =
1759
+ typeof modelsTestError === "string"
1760
+ ? modelsTestError
1761
+ : JSON.stringify(modelsTestError);
1762
+ const linkMatch = str.match(/https:\/\/opencode\.ai\/workspace\/[^\s"')]+/);
1763
+ const wrkMatch = str.match(/wrk_[0-9A-Za-z]+/);
1764
+ const targetUrl = linkMatch
1765
+ ? linkMatch[0].endsWith("/go")
1766
+ ? linkMatch[0]
1767
+ : `${linkMatch[0]}/go`
1768
+ : wrkMatch
1769
+ ? `https://opencode.ai/workspace/${wrkMatch[0]}/go`
1770
+ : "https://opencode.ai";
1771
+
1772
+ return (
1773
+ <div className="mt-1.5">
1774
+ <a
1775
+ href={targetUrl}
1776
+ target="_blank"
1777
+ rel="noreferrer"
1778
+ className="inline-flex items-center gap-1 rounded-md bg-amber-500/10 px-2 py-0.5 text-xs font-medium text-amber-600 hover:bg-amber-500/20 dark:text-amber-400 transition-colors"
1779
+ >
1780
+ <span>Allow China-hosted models</span>
1781
+ <Icon name="open_in_new" className="text-[13px]" />
1782
+ </a>
1783
+ </div>
1784
+ );
1785
+ })()}
1786
+ </div>
1787
+ )}
1788
+ {providerId === "zed" && !!liveModelsError && (
1789
+ <p className="text-xs text-red-500 mb-3 break-words">{liveModelsError}</p>
1790
+ )}
1791
+ {renderModelsSection()}
1792
+ </CardContent>
1793
+ </Card>
1794
+
1795
+ {bulkActionModal}
1796
+
1797
+ {/* Modals */}
1798
+ {providerId === "cursor" ? (
1799
+ <CursorAuthModal
1800
+ isOpen={showOAuthModal}
1801
+ onSuccess={handleOAuthSuccess}
1802
+ onClose={() => setShowOAuthModal(false)}
1803
+ />
1804
+ ) : providerId === "gitlab" ? (
1805
+ <GitLabAuthModal
1806
+ isOpen={showOAuthModal}
1807
+ providerInfo={providerInfo}
1808
+ onSuccess={handleOAuthSuccess}
1809
+ onClose={() => setShowOAuthModal(false)}
1810
+ />
1811
+ ) : (
1812
+ <OAuthModal
1813
+ isOpen={showOAuthModal}
1814
+ provider={providerId}
1815
+ providerInfo={providerInfo}
1816
+ onSuccess={handleOAuthSuccess}
1817
+ onClose={() => setShowOAuthModal(false)}
1818
+ />
1819
+ )}
1820
+
1821
+ {/* Xiaomi Desktop: auto-import local credentials modal */}
1822
+ <XiaomiMimoAuthModal
1823
+ isOpen={showXiaomiMimoModal}
1824
+ onSuccess={handleOAuthSuccess}
1825
+ onClose={() => setShowXiaomiMimoModal(false)}
1826
+ />
1827
+ {providerId === "iflow" && (
1828
+ <IFlowCookieModal
1829
+ isOpen={showIFlowCookieModal}
1830
+ onSuccess={handleIFlowCookieSuccess}
1831
+ onClose={() => setShowIFlowCookieModal(false)}
1832
+ />
1833
+ )}
1834
+ </Page>
1835
+ <AddApiKeyModal
1836
+ isOpen={showAddApiKeyModal}
1837
+ provider={providerId}
1838
+ providerName={providerInfo.name}
1839
+ authType={providerInfo?.authType}
1840
+ authHint={providerInfo?.authHint}
1841
+ website={providerInfo?.website}
1842
+ proxyPools={proxyPools}
1843
+ error={addConnectionError}
1844
+ onSave={handleSaveApiKey}
1845
+ onClose={() => {
1846
+ setAddConnectionError("");
1847
+ setShowAddApiKeyModal(false);
1848
+ }}
1849
+ />
1850
+ <EditConnectionModal
1851
+ isOpen={showEditModal}
1852
+ connection={selectedConnection}
1853
+ proxyPools={proxyPools}
1854
+ onSave={handleUpdateConnection}
1855
+ onClose={() => setShowEditModal(false)}
1856
+ />
1857
+ {isCompatible && (
1858
+ <EditCompatibleNodeModal
1859
+ isOpen={showEditNodeModal}
1860
+ node={providerNode}
1861
+ onSave={handleUpdateNode}
1862
+ onClose={() => setShowEditNodeModal(false)}
1863
+ isAnthropic={isAnthropicCompatible}
1864
+ />
1865
+ )}
1866
+ {!isCompatible && (
1867
+ <AddCustomModelModal
1868
+ isOpen={showAddCustomModel}
1869
+ providerAlias={providerStorageAlias}
1870
+ providerDisplayAlias={providerDisplayAlias}
1871
+ onSave={async (modelId, caps) => {
1872
+ await handleAddCustomModel(modelId, "llm", providerStorageAlias, caps);
1873
+ setShowAddCustomModel(false);
1874
+ }}
1875
+ onClose={() => setShowAddCustomModel(false)}
1876
+ />
1877
+ )}
1878
+
1879
+ {providerId === "codex" && (
1880
+ <BulkImportCodexModal
1881
+ isOpen={showBulkImportCodex}
1882
+ onClose={() => setShowBulkImportCodex(false)}
1883
+ onSuccess={fetchConnections}
1884
+ />
1885
+ )}
1886
+
1887
+ {providerId === "grok-cli" && (
1888
+ <BulkImportGrokCliModal
1889
+ isOpen={showBulkImportGrokCli}
1890
+ onClose={() => setShowBulkImportGrokCli(false)}
1891
+ onSuccess={fetchConnections}
1892
+ />
1893
+ )}
1894
+
1895
+ {/* AG Risk Confirmation Modal */}
1896
+ <ConfirmModal
1897
+ isOpen={showAgRiskModal}
1898
+ onClose={() => setShowAgRiskModal(false)}
1899
+ onConfirm={handleAgRiskConfirm}
1900
+ title="Risk Notice"
1901
+ message={providerInfo?.deprecationNotice}
1902
+ confirmText="I Understand, Continue"
1903
+ cancelText="Cancel"
1904
+ variant="danger"
1905
+ />
1906
+
1907
+ {/* Confirm Modal */}
1908
+ <ConfirmModal
1909
+ isOpen={!!confirmState}
1910
+ onClose={() => setConfirmState(null)}
1911
+ onConfirm={confirmState?.onConfirm}
1912
+ title={confirmState?.title || "Confirm"}
1913
+ message={confirmState?.message}
1914
+ variant="danger"
1915
+ />
1916
+ </>
1917
+ );
1918
+ }