n9router 0.4.7 → 0.4.8

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 (1045) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-path-routes-manifest.json +7 -6
  3. package/.next/standalone/.next/build-manifest.json +2 -2
  4. package/.next/standalone/.next/prerender-manifest.json +3 -3
  5. package/.next/standalone/.next/required-server-files.json +5 -0
  6. package/.next/standalone/.next/routes-manifest.json +6 -0
  7. package/.next/standalone/.next/server/app/(dashboard)/dashboard/basic-chat/page.js +2 -2
  8. package/.next/standalone/.next/server/app/(dashboard)/dashboard/basic-chat/page.js.nft.json +1 -1
  9. package/.next/standalone/.next/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
  10. package/.next/standalone/.next/server/app/(dashboard)/dashboard/cli-tools/page.js +2 -2
  11. package/.next/standalone/.next/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -1
  12. package/.next/standalone/.next/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  13. package/.next/standalone/.next/server/app/(dashboard)/dashboard/combos/page.js +2 -2
  14. package/.next/standalone/.next/server/app/(dashboard)/dashboard/combos/page.js.nft.json +1 -1
  15. package/.next/standalone/.next/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  16. package/.next/standalone/.next/server/app/(dashboard)/dashboard/console-log/page.js +2 -2
  17. package/.next/standalone/.next/server/app/(dashboard)/dashboard/console-log/page.js.nft.json +1 -1
  18. package/.next/standalone/.next/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
  19. package/.next/standalone/.next/server/app/(dashboard)/dashboard/endpoint/page.js +2 -2
  20. package/.next/standalone/.next/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -1
  21. package/.next/standalone/.next/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  22. package/.next/standalone/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js +34 -5
  23. package/.next/standalone/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js.nft.json +1 -1
  24. package/.next/standalone/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
  25. package/.next/standalone/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js +2 -2
  26. package/.next/standalone/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
  28. package/.next/standalone/.next/server/app/(dashboard)/dashboard/mitm/page.js +2 -2
  29. package/.next/standalone/.next/server/app/(dashboard)/dashboard/mitm/page.js.nft.json +1 -1
  30. package/.next/standalone/.next/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
  31. package/.next/standalone/.next/server/app/(dashboard)/dashboard/page.js +2 -2
  32. package/.next/standalone/.next/server/app/(dashboard)/dashboard/page.js.nft.json +1 -1
  33. package/.next/standalone/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  34. package/.next/standalone/.next/server/app/(dashboard)/dashboard/profile/page.js +2 -2
  35. package/.next/standalone/.next/server/app/(dashboard)/dashboard/profile/page.js.nft.json +1 -1
  36. package/.next/standalone/.next/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  37. package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/[id]/page.js +3 -3
  38. package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/[id]/page.js.nft.json +1 -1
  39. package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  40. package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/new/page.js +2 -2
  41. package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/new/page.js.nft.json +1 -1
  42. package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  43. package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/page.js +2 -2
  44. package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/page.js.nft.json +1 -1
  45. package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  46. package/.next/standalone/.next/server/app/(dashboard)/dashboard/proxy-pools/page.js +3 -3
  47. package/.next/standalone/.next/server/app/(dashboard)/dashboard/proxy-pools/page.js.nft.json +1 -1
  48. package/.next/standalone/.next/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
  49. package/.next/standalone/.next/server/app/(dashboard)/dashboard/quota/page.js +2 -2
  50. package/.next/standalone/.next/server/app/(dashboard)/dashboard/quota/page.js.nft.json +1 -1
  51. package/.next/standalone/.next/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  52. package/.next/standalone/.next/server/app/(dashboard)/dashboard/translator/page.js +2 -2
  53. package/.next/standalone/.next/server/app/(dashboard)/dashboard/translator/page.js.nft.json +1 -1
  54. package/.next/standalone/.next/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  55. package/.next/standalone/.next/server/app/(dashboard)/dashboard/usage/page.js +2 -2
  56. package/.next/standalone/.next/server/app/(dashboard)/dashboard/usage/page.js.nft.json +1 -1
  57. package/.next/standalone/.next/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  58. package/.next/standalone/.next/server/app/_global-error/page.js +3 -3
  59. package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -1
  60. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  61. package/.next/standalone/.next/server/app/_global-error.html +1 -1
  62. package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
  63. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  64. package/.next/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  65. package/.next/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  66. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  67. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  68. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  69. package/.next/standalone/.next/server/app/_not-found/page.js +2 -2
  70. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  71. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  72. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  73. package/.next/standalone/.next/server/app/_not-found.rsc +4 -4
  74. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
  75. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  76. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  77. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  78. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  79. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  80. package/.next/standalone/.next/server/app/api/antigravity-ide/route.js +1 -1
  81. package/.next/standalone/.next/server/app/api/antigravity-ide/route.js.nft.json +1 -1
  82. package/.next/standalone/.next/server/app/api/antigravity-tools/import/route.js +1 -1
  83. package/.next/standalone/.next/server/app/api/antigravity-tools/import/route.js.nft.json +1 -1
  84. package/.next/standalone/.next/server/app/api/antigravity-tools/import-refresh-tokens/route.js +1 -1
  85. package/.next/standalone/.next/server/app/api/antigravity-tools/import-refresh-tokens/route.js.nft.json +1 -1
  86. package/.next/standalone/.next/server/app/api/auth/login/route.js +1 -1
  87. package/.next/standalone/.next/server/app/api/auth/login/route.js.nft.json +1 -1
  88. package/.next/standalone/.next/server/app/api/auth/logout/route.js +1 -1
  89. package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
  90. package/.next/standalone/.next/server/app/api/cli-tools/antigravity-mitm/alias/route.js +2 -2
  91. package/.next/standalone/.next/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
  92. package/.next/standalone/.next/server/app/api/cli-tools/antigravity-mitm/route.js +1 -2
  93. package/.next/standalone/.next/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -1
  94. package/.next/standalone/.next/server/app/api/cli-tools/claude-settings/route.js +2 -2
  95. package/.next/standalone/.next/server/app/api/cli-tools/claude-settings/route.js.nft.json +1 -1
  96. package/.next/standalone/.next/server/app/api/cli-tools/codex-settings/route.js +2 -2
  97. package/.next/standalone/.next/server/app/api/cli-tools/codex-settings/route.js.nft.json +1 -1
  98. package/.next/standalone/.next/server/app/api/cli-tools/copilot-settings/route.js +2 -2
  99. package/.next/standalone/.next/server/app/api/cli-tools/copilot-settings/route.js.nft.json +1 -1
  100. package/.next/standalone/.next/server/app/api/cli-tools/droid-settings/route.js +2 -2
  101. package/.next/standalone/.next/server/app/api/cli-tools/droid-settings/route.js.nft.json +1 -1
  102. package/.next/standalone/.next/server/app/api/cli-tools/openclaw-settings/route.js +2 -2
  103. package/.next/standalone/.next/server/app/api/cli-tools/openclaw-settings/route.js.nft.json +1 -1
  104. package/.next/standalone/.next/server/app/api/cli-tools/opencode-settings/route.js +1 -1
  105. package/.next/standalone/.next/server/app/api/cli-tools/opencode-settings/route.js.nft.json +1 -1
  106. package/.next/standalone/.next/server/app/api/cloud/auth/route.js +1 -1
  107. package/.next/standalone/.next/server/app/api/cloud/auth/route.js.nft.json +1 -1
  108. package/.next/standalone/.next/server/app/api/cloud/credentials/update/route.js +1 -1
  109. package/.next/standalone/.next/server/app/api/cloud/credentials/update/route.js.nft.json +1 -1
  110. package/.next/standalone/.next/server/app/api/cloud/model/resolve/route.js +1 -1
  111. package/.next/standalone/.next/server/app/api/cloud/model/resolve/route.js.nft.json +1 -1
  112. package/.next/standalone/.next/server/app/api/cloud/models/alias/route.js +1 -1
  113. package/.next/standalone/.next/server/app/api/cloud/models/alias/route.js.nft.json +1 -1
  114. package/.next/standalone/.next/server/app/api/combos/[id]/route.js +1 -1
  115. package/.next/standalone/.next/server/app/api/combos/[id]/route.js.nft.json +1 -1
  116. package/.next/standalone/.next/server/app/api/combos/route.js +1 -1
  117. package/.next/standalone/.next/server/app/api/combos/route.js.nft.json +1 -1
  118. package/.next/standalone/.next/server/app/api/health/route.js +1 -1
  119. package/.next/standalone/.next/server/app/api/health/route.js.nft.json +1 -1
  120. package/.next/standalone/.next/server/app/api/init/route.js +1 -1
  121. package/.next/standalone/.next/server/app/api/init/route.js.nft.json +1 -1
  122. package/.next/standalone/.next/server/app/api/internal/request-detail/route.js +1 -1
  123. package/.next/standalone/.next/server/app/api/internal/request-detail/route.js.nft.json +1 -1
  124. package/.next/standalone/.next/server/app/api/internal/usage/route.js +1 -1
  125. package/.next/standalone/.next/server/app/api/internal/usage/route.js.nft.json +1 -1
  126. package/.next/standalone/.next/server/app/api/keys/[id]/route.js +1 -1
  127. package/.next/standalone/.next/server/app/api/keys/[id]/route.js.nft.json +1 -1
  128. package/.next/standalone/.next/server/app/api/keys/route.js +1 -1
  129. package/.next/standalone/.next/server/app/api/keys/route.js.nft.json +1 -1
  130. package/.next/standalone/.next/server/app/api/locale/route.js +1 -1
  131. package/.next/standalone/.next/server/app/api/locale/route.js.nft.json +1 -1
  132. package/.next/standalone/.next/server/app/api/media-providers/tts/elevenlabs/voices/route.js +1 -1
  133. package/.next/standalone/.next/server/app/api/media-providers/tts/elevenlabs/voices/route.js.nft.json +1 -1
  134. package/.next/standalone/.next/server/app/api/media-providers/tts/voices/route.js +1 -1
  135. package/.next/standalone/.next/server/app/api/media-providers/tts/voices/route.js.nft.json +1 -1
  136. package/.next/standalone/.next/server/app/api/models/alias/route.js +1 -1
  137. package/.next/standalone/.next/server/app/api/models/alias/route.js.nft.json +1 -1
  138. package/.next/standalone/.next/server/app/api/models/availability/route.js +1 -1
  139. package/.next/standalone/.next/server/app/api/models/availability/route.js.nft.json +1 -1
  140. package/.next/standalone/.next/server/app/api/models/route.js +1 -1
  141. package/.next/standalone/.next/server/app/api/models/route.js.nft.json +1 -1
  142. package/.next/standalone/.next/server/app/api/models/test/route.js +1 -1
  143. package/.next/standalone/.next/server/app/api/models/test/route.js.nft.json +1 -1
  144. package/.next/standalone/.next/server/app/api/oauth/[provider]/[action]/route.js +1 -1
  145. package/.next/standalone/.next/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
  146. package/.next/standalone/.next/server/app/api/oauth/cursor/auto-import/route.js +2 -2
  147. package/.next/standalone/.next/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -1
  148. package/.next/standalone/.next/server/app/api/oauth/cursor/import/route.js +1 -1
  149. package/.next/standalone/.next/server/app/api/oauth/cursor/import/route.js.nft.json +1 -1
  150. package/.next/standalone/.next/server/app/api/oauth/gitlab/pat/route.js +1 -1
  151. package/.next/standalone/.next/server/app/api/oauth/gitlab/pat/route.js.nft.json +1 -1
  152. package/.next/standalone/.next/server/app/api/oauth/iflow/cookie/route.js +1 -1
  153. package/.next/standalone/.next/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -1
  154. package/.next/standalone/.next/server/app/api/oauth/kiro/auto-import/route.js +1 -1
  155. package/.next/standalone/.next/server/app/api/oauth/kiro/auto-import/route.js.nft.json +1 -1
  156. package/.next/standalone/.next/server/app/api/oauth/kiro/import/route.js +1 -1
  157. package/.next/standalone/.next/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
  158. package/.next/standalone/.next/server/app/api/oauth/kiro/social-authorize/route.js +1 -1
  159. package/.next/standalone/.next/server/app/api/oauth/kiro/social-authorize/route.js.nft.json +1 -1
  160. package/.next/standalone/.next/server/app/api/oauth/kiro/social-exchange/route.js +1 -1
  161. package/.next/standalone/.next/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -1
  162. package/.next/standalone/.next/server/app/api/pricing/route.js +1 -1
  163. package/.next/standalone/.next/server/app/api/pricing/route.js.nft.json +1 -1
  164. package/.next/standalone/.next/server/app/api/provider-nodes/[id]/route.js +1 -1
  165. package/.next/standalone/.next/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -1
  166. package/.next/standalone/.next/server/app/api/provider-nodes/route.js +1 -1
  167. package/.next/standalone/.next/server/app/api/provider-nodes/route.js.nft.json +1 -1
  168. package/.next/standalone/.next/server/app/api/provider-nodes/validate/route.js +1 -1
  169. package/.next/standalone/.next/server/app/api/provider-nodes/validate/route.js.nft.json +1 -1
  170. package/.next/standalone/.next/server/app/api/providers/[id]/models/route.js +1 -1
  171. package/.next/standalone/.next/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
  172. package/.next/standalone/.next/server/app/api/providers/[id]/route.js +1 -1
  173. package/.next/standalone/.next/server/app/api/providers/[id]/route.js.nft.json +1 -1
  174. package/.next/standalone/.next/server/app/api/providers/[id]/test/route.js +1 -1
  175. package/.next/standalone/.next/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
  176. package/.next/standalone/.next/server/app/api/providers/[id]/test-models/route.js +1 -1
  177. package/.next/standalone/.next/server/app/api/providers/[id]/test-models/route.js.nft.json +1 -1
  178. package/.next/standalone/.next/server/app/api/providers/client/route.js +1 -1
  179. package/.next/standalone/.next/server/app/api/providers/client/route.js.nft.json +1 -1
  180. package/.next/standalone/.next/server/app/api/providers/kilo/free-models/route.js +1 -1
  181. package/.next/standalone/.next/server/app/api/providers/kilo/free-models/route.js.nft.json +1 -1
  182. package/.next/standalone/.next/server/app/api/providers/route.js +1 -1
  183. package/.next/standalone/.next/server/app/api/providers/route.js.nft.json +1 -1
  184. package/.next/standalone/.next/server/app/api/providers/suggested-models/route.js +1 -0
  185. package/.next/standalone/.next/server/app/api/providers/suggested-models/route.js.nft.json +1 -0
  186. package/.next/standalone/.next/server/app/api/providers/suggested-models/route_client-reference-manifest.js +1 -0
  187. package/.next/standalone/.next/server/app/api/providers/test-batch/route.js +1 -1
  188. package/.next/standalone/.next/server/app/api/providers/test-batch/route.js.nft.json +1 -1
  189. package/.next/standalone/.next/server/app/api/providers/validate/route.js +1 -1
  190. package/.next/standalone/.next/server/app/api/providers/validate/route.js.nft.json +1 -1
  191. package/.next/standalone/.next/server/app/api/proxy-pools/[id]/route.js +1 -1
  192. package/.next/standalone/.next/server/app/api/proxy-pools/[id]/route.js.nft.json +1 -1
  193. package/.next/standalone/.next/server/app/api/proxy-pools/[id]/test/route.js +1 -1
  194. package/.next/standalone/.next/server/app/api/proxy-pools/[id]/test/route.js.nft.json +1 -1
  195. package/.next/standalone/.next/server/app/api/proxy-pools/route.js +1 -1
  196. package/.next/standalone/.next/server/app/api/proxy-pools/route.js.nft.json +1 -1
  197. package/.next/standalone/.next/server/app/api/proxy-pools/vercel-deploy/route.js +2 -2
  198. package/.next/standalone/.next/server/app/api/proxy-pools/vercel-deploy/route.js.nft.json +1 -1
  199. package/.next/standalone/.next/server/app/api/settings/database/route.js +1 -1
  200. package/.next/standalone/.next/server/app/api/settings/database/route.js.nft.json +1 -1
  201. package/.next/standalone/.next/server/app/api/settings/proxy-test/route.js +1 -1
  202. package/.next/standalone/.next/server/app/api/settings/proxy-test/route.js.nft.json +1 -1
  203. package/.next/standalone/.next/server/app/api/settings/require-login/route.js +1 -1
  204. package/.next/standalone/.next/server/app/api/settings/require-login/route.js.nft.json +1 -1
  205. package/.next/standalone/.next/server/app/api/settings/route.js +1 -1
  206. package/.next/standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
  207. package/.next/standalone/.next/server/app/api/shutdown/route.js +1 -1
  208. package/.next/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  209. package/.next/standalone/.next/server/app/api/tags/route.js +1 -1
  210. package/.next/standalone/.next/server/app/api/tags/route.js.nft.json +1 -1
  211. package/.next/standalone/.next/server/app/api/translator/console-logs/route.js +1 -1
  212. package/.next/standalone/.next/server/app/api/translator/console-logs/route.js.nft.json +1 -1
  213. package/.next/standalone/.next/server/app/api/translator/console-logs/stream/route.js +2 -2
  214. package/.next/standalone/.next/server/app/api/translator/console-logs/stream/route.js.nft.json +1 -1
  215. package/.next/standalone/.next/server/app/api/translator/load/route.js +1 -1
  216. package/.next/standalone/.next/server/app/api/translator/load/route.js.nft.json +1 -1
  217. package/.next/standalone/.next/server/app/api/translator/save/route.js +1 -1
  218. package/.next/standalone/.next/server/app/api/translator/save/route.js.nft.json +1 -1
  219. package/.next/standalone/.next/server/app/api/translator/send/route.js +1 -1
  220. package/.next/standalone/.next/server/app/api/translator/send/route.js.nft.json +1 -1
  221. package/.next/standalone/.next/server/app/api/translator/translate/route.js +1 -1
  222. package/.next/standalone/.next/server/app/api/translator/translate/route.js.nft.json +1 -1
  223. package/.next/standalone/.next/server/app/api/tunnel/disable/route.js +1 -1
  224. package/.next/standalone/.next/server/app/api/tunnel/disable/route.js.nft.json +1 -1
  225. package/.next/standalone/.next/server/app/api/tunnel/enable/route.js +1 -1
  226. package/.next/standalone/.next/server/app/api/tunnel/enable/route.js.nft.json +1 -1
  227. package/.next/standalone/.next/server/app/api/tunnel/status/route.js +1 -1
  228. package/.next/standalone/.next/server/app/api/tunnel/status/route.js.nft.json +1 -1
  229. package/.next/standalone/.next/server/app/api/tunnel/tailscale-check/route.js +2 -2
  230. package/.next/standalone/.next/server/app/api/tunnel/tailscale-check/route.js.nft.json +1 -1
  231. package/.next/standalone/.next/server/app/api/tunnel/tailscale-disable/route.js +1 -1
  232. package/.next/standalone/.next/server/app/api/tunnel/tailscale-disable/route.js.nft.json +1 -1
  233. package/.next/standalone/.next/server/app/api/tunnel/tailscale-enable/route.js +1 -1
  234. package/.next/standalone/.next/server/app/api/tunnel/tailscale-enable/route.js.nft.json +1 -1
  235. package/.next/standalone/.next/server/app/api/tunnel/tailscale-install/route.js +3 -3
  236. package/.next/standalone/.next/server/app/api/tunnel/tailscale-install/route.js.nft.json +1 -1
  237. package/.next/standalone/.next/server/app/api/tunnel/tailscale-login/route.js +2 -2
  238. package/.next/standalone/.next/server/app/api/tunnel/tailscale-login/route.js.nft.json +1 -1
  239. package/.next/standalone/.next/server/app/api/tunnel/tailscale-start-daemon/route.js +2 -2
  240. package/.next/standalone/.next/server/app/api/tunnel/tailscale-start-daemon/route.js.nft.json +1 -1
  241. package/.next/standalone/.next/server/app/api/usage/[connectionId]/route.js +1 -1
  242. package/.next/standalone/.next/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
  243. package/.next/standalone/.next/server/app/api/usage/chart/route.js +1 -1
  244. package/.next/standalone/.next/server/app/api/usage/chart/route.js.nft.json +1 -1
  245. package/.next/standalone/.next/server/app/api/usage/history/route.js +1 -1
  246. package/.next/standalone/.next/server/app/api/usage/history/route.js.nft.json +1 -1
  247. package/.next/standalone/.next/server/app/api/usage/logs/route.js +1 -1
  248. package/.next/standalone/.next/server/app/api/usage/logs/route.js.nft.json +1 -1
  249. package/.next/standalone/.next/server/app/api/usage/providers/route.js +1 -1
  250. package/.next/standalone/.next/server/app/api/usage/providers/route.js.nft.json +1 -1
  251. package/.next/standalone/.next/server/app/api/usage/request-details/route.js +1 -1
  252. package/.next/standalone/.next/server/app/api/usage/request-details/route.js.nft.json +1 -1
  253. package/.next/standalone/.next/server/app/api/usage/request-logs/route.js +1 -1
  254. package/.next/standalone/.next/server/app/api/usage/request-logs/route.js.nft.json +1 -1
  255. package/.next/standalone/.next/server/app/api/usage/stats/route.js +1 -1
  256. package/.next/standalone/.next/server/app/api/usage/stats/route.js.nft.json +1 -1
  257. package/.next/standalone/.next/server/app/api/usage/stream/route.js +2 -2
  258. package/.next/standalone/.next/server/app/api/usage/stream/route.js.nft.json +1 -1
  259. package/.next/standalone/.next/server/app/api/v1/api/chat/route.js +1 -1
  260. package/.next/standalone/.next/server/app/api/v1/api/chat/route.js.nft.json +1 -1
  261. package/.next/standalone/.next/server/app/api/v1/audio/speech/route.js +1 -1
  262. package/.next/standalone/.next/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
  263. package/.next/standalone/.next/server/app/api/v1/chat/completions/route.js +1 -1
  264. package/.next/standalone/.next/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
  265. package/.next/standalone/.next/server/app/api/v1/embeddings/route.js +1 -1
  266. package/.next/standalone/.next/server/app/api/v1/embeddings/route.js.nft.json +1 -1
  267. package/.next/standalone/.next/server/app/api/v1/messages/count_tokens/route.js +1 -1
  268. package/.next/standalone/.next/server/app/api/v1/messages/count_tokens/route.js.nft.json +1 -1
  269. package/.next/standalone/.next/server/app/api/v1/messages/route.js +1 -1
  270. package/.next/standalone/.next/server/app/api/v1/messages/route.js.nft.json +1 -1
  271. package/.next/standalone/.next/server/app/api/v1/models/route.js +1 -1
  272. package/.next/standalone/.next/server/app/api/v1/models/route.js.nft.json +1 -1
  273. package/.next/standalone/.next/server/app/api/v1/responses/compact/route.js +1 -1
  274. package/.next/standalone/.next/server/app/api/v1/responses/compact/route.js.nft.json +1 -1
  275. package/.next/standalone/.next/server/app/api/v1/responses/route.js +1 -1
  276. package/.next/standalone/.next/server/app/api/v1/responses/route.js.nft.json +1 -1
  277. package/.next/standalone/.next/server/app/api/v1/route.js +1 -1
  278. package/.next/standalone/.next/server/app/api/v1/route.js.nft.json +1 -1
  279. package/.next/standalone/.next/server/app/api/v1beta/models/[...path]/route.js +1 -1
  280. package/.next/standalone/.next/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
  281. package/.next/standalone/.next/server/app/api/v1beta/models/route.js +1 -1
  282. package/.next/standalone/.next/server/app/api/v1beta/models/route.js.nft.json +1 -1
  283. package/.next/standalone/.next/server/app/api/version/route.js +1 -1
  284. package/.next/standalone/.next/server/app/api/version/route.js.nft.json +1 -1
  285. package/.next/standalone/.next/server/app/callback/page.js +2 -2
  286. package/.next/standalone/.next/server/app/callback/page.js.nft.json +1 -1
  287. package/.next/standalone/.next/server/app/callback/page_client-reference-manifest.js +1 -1
  288. package/.next/standalone/.next/server/app/callback.html +1 -1
  289. package/.next/standalone/.next/server/app/callback.rsc +4 -4
  290. package/.next/standalone/.next/server/app/callback.segments/_full.segment.rsc +4 -4
  291. package/.next/standalone/.next/server/app/callback.segments/_head.segment.rsc +1 -1
  292. package/.next/standalone/.next/server/app/callback.segments/_index.segment.rsc +4 -4
  293. package/.next/standalone/.next/server/app/callback.segments/_tree.segment.rsc +2 -2
  294. package/.next/standalone/.next/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
  295. package/.next/standalone/.next/server/app/callback.segments/callback.segment.rsc +1 -1
  296. package/.next/standalone/.next/server/app/dashboard/basic-chat.html +1 -1
  297. package/.next/standalone/.next/server/app/dashboard/basic-chat.rsc +6 -6
  298. package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
  299. package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
  300. package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  301. package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  302. package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/_full.segment.rsc +6 -6
  303. package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
  304. package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/_index.segment.rsc +4 -4
  305. package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +2 -2
  306. package/.next/standalone/.next/server/app/dashboard/cli-tools.html +1 -1
  307. package/.next/standalone/.next/server/app/dashboard/cli-tools.rsc +6 -6
  308. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
  309. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
  310. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  311. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  312. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/_full.segment.rsc +6 -6
  313. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
  314. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/_index.segment.rsc +4 -4
  315. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +2 -2
  316. package/.next/standalone/.next/server/app/dashboard/combos.html +1 -1
  317. package/.next/standalone/.next/server/app/dashboard/combos.rsc +6 -6
  318. package/.next/standalone/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
  319. package/.next/standalone/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
  320. package/.next/standalone/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  321. package/.next/standalone/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  322. package/.next/standalone/.next/server/app/dashboard/combos.segments/_full.segment.rsc +6 -6
  323. package/.next/standalone/.next/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
  324. package/.next/standalone/.next/server/app/dashboard/combos.segments/_index.segment.rsc +4 -4
  325. package/.next/standalone/.next/server/app/dashboard/combos.segments/_tree.segment.rsc +2 -2
  326. package/.next/standalone/.next/server/app/dashboard/endpoint.html +1 -1
  327. package/.next/standalone/.next/server/app/dashboard/endpoint.rsc +6 -6
  328. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
  329. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
  330. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  331. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  332. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/_full.segment.rsc +6 -6
  333. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
  334. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/_index.segment.rsc +4 -4
  335. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/_tree.segment.rsc +2 -2
  336. package/.next/standalone/.next/server/app/dashboard/mitm.html +1 -1
  337. package/.next/standalone/.next/server/app/dashboard/mitm.rsc +6 -6
  338. package/.next/standalone/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
  339. package/.next/standalone/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
  340. package/.next/standalone/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  341. package/.next/standalone/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  342. package/.next/standalone/.next/server/app/dashboard/mitm.segments/_full.segment.rsc +6 -6
  343. package/.next/standalone/.next/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
  344. package/.next/standalone/.next/server/app/dashboard/mitm.segments/_index.segment.rsc +4 -4
  345. package/.next/standalone/.next/server/app/dashboard/mitm.segments/_tree.segment.rsc +2 -2
  346. package/.next/standalone/.next/server/app/dashboard/profile.html +1 -1
  347. package/.next/standalone/.next/server/app/dashboard/profile.rsc +6 -6
  348. package/.next/standalone/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
  349. package/.next/standalone/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
  350. package/.next/standalone/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  351. package/.next/standalone/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  352. package/.next/standalone/.next/server/app/dashboard/profile.segments/_full.segment.rsc +6 -6
  353. package/.next/standalone/.next/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
  354. package/.next/standalone/.next/server/app/dashboard/profile.segments/_index.segment.rsc +4 -4
  355. package/.next/standalone/.next/server/app/dashboard/profile.segments/_tree.segment.rsc +2 -2
  356. package/.next/standalone/.next/server/app/dashboard/providers/new.html +1 -1
  357. package/.next/standalone/.next/server/app/dashboard/providers/new.rsc +6 -6
  358. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
  359. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
  360. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  361. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  362. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  363. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/_full.segment.rsc +6 -6
  364. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
  365. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/_index.segment.rsc +4 -4
  366. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/_tree.segment.rsc +2 -2
  367. package/.next/standalone/.next/server/app/dashboard/providers.html +1 -1
  368. package/.next/standalone/.next/server/app/dashboard/providers.rsc +6 -6
  369. package/.next/standalone/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
  370. package/.next/standalone/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  371. package/.next/standalone/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  372. package/.next/standalone/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  373. package/.next/standalone/.next/server/app/dashboard/providers.segments/_full.segment.rsc +6 -6
  374. package/.next/standalone/.next/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
  375. package/.next/standalone/.next/server/app/dashboard/providers.segments/_index.segment.rsc +4 -4
  376. package/.next/standalone/.next/server/app/dashboard/providers.segments/_tree.segment.rsc +2 -2
  377. package/.next/standalone/.next/server/app/dashboard/proxy-pools.html +1 -1
  378. package/.next/standalone/.next/server/app/dashboard/proxy-pools.rsc +6 -6
  379. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
  380. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
  381. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  382. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  383. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +6 -6
  384. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
  385. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +4 -4
  386. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +2 -2
  387. package/.next/standalone/.next/server/app/dashboard/quota.html +2 -2
  388. package/.next/standalone/.next/server/app/dashboard/quota.rsc +7 -7
  389. package/.next/standalone/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +3 -3
  390. package/.next/standalone/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
  391. package/.next/standalone/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  392. package/.next/standalone/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  393. package/.next/standalone/.next/server/app/dashboard/quota.segments/_full.segment.rsc +7 -7
  394. package/.next/standalone/.next/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
  395. package/.next/standalone/.next/server/app/dashboard/quota.segments/_index.segment.rsc +4 -4
  396. package/.next/standalone/.next/server/app/dashboard/quota.segments/_tree.segment.rsc +2 -2
  397. package/.next/standalone/.next/server/app/dashboard/settings/pricing/page.js +2 -2
  398. package/.next/standalone/.next/server/app/dashboard/settings/pricing/page.js.nft.json +1 -1
  399. package/.next/standalone/.next/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  400. package/.next/standalone/.next/server/app/dashboard/settings/pricing.html +1 -1
  401. package/.next/standalone/.next/server/app/dashboard/settings/pricing.rsc +4 -4
  402. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +4 -4
  403. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
  404. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +4 -4
  405. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +2 -2
  406. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
  407. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
  408. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
  409. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
  410. package/.next/standalone/.next/server/app/dashboard/translator.html +1 -1
  411. package/.next/standalone/.next/server/app/dashboard/translator.rsc +6 -6
  412. package/.next/standalone/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
  413. package/.next/standalone/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
  414. package/.next/standalone/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  415. package/.next/standalone/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  416. package/.next/standalone/.next/server/app/dashboard/translator.segments/_full.segment.rsc +6 -6
  417. package/.next/standalone/.next/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
  418. package/.next/standalone/.next/server/app/dashboard/translator.segments/_index.segment.rsc +4 -4
  419. package/.next/standalone/.next/server/app/dashboard/translator.segments/_tree.segment.rsc +2 -2
  420. package/.next/standalone/.next/server/app/dashboard/usage.html +1 -1
  421. package/.next/standalone/.next/server/app/dashboard/usage.rsc +6 -6
  422. package/.next/standalone/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
  423. package/.next/standalone/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
  424. package/.next/standalone/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  425. package/.next/standalone/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  426. package/.next/standalone/.next/server/app/dashboard/usage.segments/_full.segment.rsc +6 -6
  427. package/.next/standalone/.next/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
  428. package/.next/standalone/.next/server/app/dashboard/usage.segments/_index.segment.rsc +4 -4
  429. package/.next/standalone/.next/server/app/dashboard/usage.segments/_tree.segment.rsc +2 -2
  430. package/.next/standalone/.next/server/app/dashboard.html +1 -1
  431. package/.next/standalone/.next/server/app/dashboard.rsc +6 -6
  432. package/.next/standalone/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
  433. package/.next/standalone/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  434. package/.next/standalone/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  435. package/.next/standalone/.next/server/app/dashboard.segments/_full.segment.rsc +6 -6
  436. package/.next/standalone/.next/server/app/dashboard.segments/_head.segment.rsc +1 -1
  437. package/.next/standalone/.next/server/app/dashboard.segments/_index.segment.rsc +4 -4
  438. package/.next/standalone/.next/server/app/dashboard.segments/_tree.segment.rsc +2 -2
  439. package/.next/standalone/.next/server/app/favicon.ico/route.js +1 -1
  440. package/.next/standalone/.next/server/app/favicon.ico/route.js.nft.json +1 -1
  441. package/.next/standalone/.next/server/app/index.html +1 -1
  442. package/.next/standalone/.next/server/app/index.rsc +4 -4
  443. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  444. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  445. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  446. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -4
  447. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  448. package/.next/standalone/.next/server/app/landing/page.js +2 -2
  449. package/.next/standalone/.next/server/app/landing/page.js.nft.json +1 -1
  450. package/.next/standalone/.next/server/app/landing/page_client-reference-manifest.js +1 -1
  451. package/.next/standalone/.next/server/app/landing.html +1 -1
  452. package/.next/standalone/.next/server/app/landing.rsc +4 -4
  453. package/.next/standalone/.next/server/app/landing.segments/_full.segment.rsc +4 -4
  454. package/.next/standalone/.next/server/app/landing.segments/_head.segment.rsc +1 -1
  455. package/.next/standalone/.next/server/app/landing.segments/_index.segment.rsc +4 -4
  456. package/.next/standalone/.next/server/app/landing.segments/_tree.segment.rsc +2 -2
  457. package/.next/standalone/.next/server/app/landing.segments/landing/__PAGE__.segment.rsc +1 -1
  458. package/.next/standalone/.next/server/app/landing.segments/landing.segment.rsc +1 -1
  459. package/.next/standalone/.next/server/app/login/page.js +2 -2
  460. package/.next/standalone/.next/server/app/login/page.js.nft.json +1 -1
  461. package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  462. package/.next/standalone/.next/server/app/login.html +1 -1
  463. package/.next/standalone/.next/server/app/login.rsc +5 -5
  464. package/.next/standalone/.next/server/app/login.segments/_full.segment.rsc +5 -5
  465. package/.next/standalone/.next/server/app/login.segments/_head.segment.rsc +1 -1
  466. package/.next/standalone/.next/server/app/login.segments/_index.segment.rsc +4 -4
  467. package/.next/standalone/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  468. package/.next/standalone/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  469. package/.next/standalone/.next/server/app/login.segments/login.segment.rsc +1 -1
  470. package/.next/standalone/.next/server/app/manifest.webmanifest/route.js +2 -2
  471. package/.next/standalone/.next/server/app/manifest.webmanifest/route.js.nft.json +1 -1
  472. package/.next/standalone/.next/server/app/page.js +2 -2
  473. package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
  474. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  475. package/.next/standalone/.next/server/app-paths-manifest.json +7 -6
  476. package/.next/standalone/.next/server/chunks/2409.js +1 -0
  477. package/.next/standalone/.next/server/chunks/241.js +1 -0
  478. package/.next/standalone/.next/server/chunks/2506.js +3 -3
  479. package/.next/standalone/.next/server/chunks/289.js +1 -1
  480. package/.next/standalone/.next/server/chunks/306.js +1 -0
  481. package/.next/standalone/.next/server/chunks/318.js +9 -9
  482. package/.next/standalone/.next/server/chunks/3646.js +1 -1
  483. package/.next/standalone/.next/server/chunks/3855.js +1 -0
  484. package/.next/standalone/.next/server/chunks/3913.js +64 -0
  485. package/.next/standalone/.next/server/chunks/412.js +2 -2
  486. package/.next/standalone/.next/server/chunks/4404.js +1 -0
  487. package/.next/standalone/.next/server/chunks/4989.js +2 -2
  488. package/.next/standalone/.next/server/chunks/541.js +1 -0
  489. package/.next/standalone/.next/server/chunks/6108.js +1 -0
  490. package/.next/standalone/.next/server/chunks/6143.js +1 -0
  491. package/.next/standalone/.next/server/chunks/{7828.js → 6327.js} +1 -1
  492. package/.next/standalone/.next/server/chunks/7595.js +1 -0
  493. package/.next/standalone/.next/server/chunks/7994.js +2 -2
  494. package/.next/standalone/.next/server/chunks/8226.js +2 -2
  495. package/.next/standalone/.next/server/chunks/8590.js +1 -1
  496. package/.next/standalone/.next/server/chunks/8895.js +2 -2
  497. package/.next/standalone/.next/server/chunks/9501.js +5 -0
  498. package/.next/standalone/.next/server/chunks/9609.js +1 -1
  499. package/.next/standalone/.next/server/chunks/9718.js +1 -1
  500. package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
  501. package/.next/standalone/.next/server/middleware.js +4 -4
  502. package/.next/standalone/.next/server/pages/404.html +1 -1
  503. package/.next/standalone/.next/server/pages/500.html +1 -1
  504. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  505. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  506. package/.next/standalone/.next/static/chunks/1051-a791905d1279a341.js +64 -0
  507. package/.next/standalone/.next/static/chunks/1321-6c4c2e2a875b3f09.js +1 -0
  508. package/.next/standalone/.next/static/chunks/2589-c9b859d6add2fcaf.js +3 -0
  509. package/.next/standalone/.next/static/chunks/5497-e94e33a5eac96d27.js +7 -0
  510. package/.next/standalone/.next/static/chunks/5601-1d538e4bbfb3814f.js +18 -0
  511. package/.next/standalone/.next/static/chunks/app/(dashboard)/dashboard/basic-chat/{page-830561bb05858742.js → page-d5a2e04ec5bbab95.js} +1 -1
  512. package/.next/standalone/.next/static/chunks/app/(dashboard)/dashboard/cli-tools/{page-6de79bf0d6e818c6.js → page-77e0cac4a054a7de.js} +1 -1
  513. package/.next/{static/chunks/app/(dashboard)/dashboard/combos/page-80256518cf21bba3.js → standalone/.next/static/chunks/app/(dashboard)/dashboard/combos/page-5b8274adb0617c1c.js} +1 -1
  514. package/.next/standalone/.next/static/chunks/app/(dashboard)/dashboard/console-log/{page-efb0054f924dd4fd.js → page-43f00f001abcec45.js} +1 -1
  515. package/.next/standalone/.next/static/chunks/app/(dashboard)/dashboard/endpoint/page-1158f90fcf0b5330.js +1 -0
  516. package/.next/{static/chunks/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page-ce6753401b741885.js → standalone/.next/static/chunks/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page-ef33b45245f904be.js} +36 -7
  517. package/.next/standalone/.next/static/chunks/app/(dashboard)/dashboard/media-providers/[kind]/{page-4b6e1e7c8db448ec.js → page-d27fbf5a1ec2aa2f.js} +1 -1
  518. package/.next/standalone/.next/static/chunks/app/(dashboard)/dashboard/mitm/{page-d99e342ecd18b0ef.js → page-94ac57c1e5946f92.js} +1 -1
  519. package/.next/standalone/.next/static/chunks/app/(dashboard)/dashboard/page-7b6d1de8d476ea5f.js +1 -0
  520. package/.next/standalone/.next/static/chunks/app/(dashboard)/dashboard/profile/{page-34888fb44c140c8c.js → page-878d93c57beb09db.js} +1 -1
  521. package/.next/standalone/.next/static/chunks/app/(dashboard)/dashboard/providers/[id]/page-9830703c0fe87883.js +4 -0
  522. package/.next/standalone/.next/static/chunks/app/(dashboard)/dashboard/providers/new/{page-28d13d1538c343a0.js → page-8f6cc09fc49e8683.js} +1 -1
  523. package/.next/standalone/.next/static/chunks/app/(dashboard)/dashboard/providers/{page-be365b98602603b8.js → page-ec51df4b9677983e.js} +1 -1
  524. package/.next/standalone/.next/static/chunks/app/(dashboard)/dashboard/proxy-pools/{page-56a88292dbb5c42c.js → page-86caff27d92376bc.js} +1 -1
  525. package/.next/standalone/.next/static/chunks/app/(dashboard)/dashboard/quota/page-f342c57181e01663.js +1 -0
  526. package/.next/standalone/.next/static/chunks/app/(dashboard)/dashboard/translator/{page-542a93cc9baf8c66.js → page-488019e0b709e092.js} +1 -1
  527. package/.next/standalone/.next/static/chunks/app/(dashboard)/dashboard/usage/{page-a1a313a19cd2934c.js → page-2c4ceb73922b6d43.js} +1 -1
  528. package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-6c7b3d52047b5054.js +1 -0
  529. package/.next/standalone/.next/static/chunks/app/_global-error/{page-73b8002b49e065e6.js → page-b1df829796388d92.js} +1 -1
  530. package/.next/standalone/.next/static/chunks/app/api/antigravity-ide/{route-73b8002b49e065e6.js → route-b1df829796388d92.js} +1 -1
  531. package/.next/standalone/.next/static/chunks/app/api/antigravity-tools/import/{route-73b8002b49e065e6.js → route-b1df829796388d92.js} +1 -1
  532. package/.next/standalone/.next/static/chunks/app/api/antigravity-tools/import-refresh-tokens/{route-73b8002b49e065e6.js → route-b1df829796388d92.js} +1 -1
  533. package/.next/standalone/.next/static/chunks/app/api/auth/login/route-b1df829796388d92.js +1 -0
  534. package/.next/standalone/.next/static/chunks/app/api/auth/logout/route-b1df829796388d92.js +1 -0
  535. package/.next/standalone/.next/static/chunks/app/api/cli-tools/antigravity-mitm/alias/route-b1df829796388d92.js +1 -0
  536. package/.next/standalone/.next/static/chunks/app/api/cli-tools/antigravity-mitm/route-b1df829796388d92.js +1 -0
  537. package/.next/standalone/.next/static/chunks/app/api/cli-tools/claude-settings/route-b1df829796388d92.js +1 -0
  538. package/.next/standalone/.next/static/chunks/app/api/cli-tools/codex-settings/route-b1df829796388d92.js +1 -0
  539. package/.next/standalone/.next/static/chunks/app/api/cli-tools/copilot-settings/route-b1df829796388d92.js +1 -0
  540. package/.next/standalone/.next/static/chunks/app/api/cli-tools/droid-settings/route-b1df829796388d92.js +1 -0
  541. package/.next/standalone/.next/static/chunks/app/api/cli-tools/openclaw-settings/route-b1df829796388d92.js +1 -0
  542. package/.next/standalone/.next/static/chunks/app/api/cli-tools/opencode-settings/route-b1df829796388d92.js +1 -0
  543. package/.next/standalone/.next/static/chunks/app/api/cloud/auth/route-b1df829796388d92.js +1 -0
  544. package/.next/standalone/.next/static/chunks/app/api/cloud/credentials/update/route-b1df829796388d92.js +1 -0
  545. package/.next/standalone/.next/static/chunks/app/api/cloud/model/resolve/route-b1df829796388d92.js +1 -0
  546. package/.next/standalone/.next/static/chunks/app/api/cloud/models/alias/route-b1df829796388d92.js +1 -0
  547. package/.next/standalone/.next/static/chunks/app/api/combos/[id]/route-b1df829796388d92.js +1 -0
  548. package/.next/standalone/.next/static/chunks/app/api/combos/route-b1df829796388d92.js +1 -0
  549. package/.next/standalone/.next/static/chunks/app/api/health/route-b1df829796388d92.js +1 -0
  550. package/.next/standalone/.next/static/chunks/app/api/init/route-b1df829796388d92.js +1 -0
  551. package/.next/standalone/.next/static/chunks/app/api/internal/request-detail/route-b1df829796388d92.js +1 -0
  552. package/.next/standalone/.next/static/chunks/app/api/internal/usage/route-b1df829796388d92.js +1 -0
  553. package/.next/standalone/.next/static/chunks/app/api/keys/[id]/route-b1df829796388d92.js +1 -0
  554. package/.next/standalone/.next/static/chunks/app/api/keys/route-b1df829796388d92.js +1 -0
  555. package/.next/standalone/.next/static/chunks/app/api/locale/route-b1df829796388d92.js +1 -0
  556. package/.next/standalone/.next/static/chunks/app/api/media-providers/tts/elevenlabs/voices/route-b1df829796388d92.js +1 -0
  557. package/.next/standalone/.next/static/chunks/app/api/media-providers/tts/voices/route-b1df829796388d92.js +1 -0
  558. package/.next/standalone/.next/static/chunks/app/api/models/alias/route-b1df829796388d92.js +1 -0
  559. package/.next/standalone/.next/static/chunks/app/api/models/availability/route-b1df829796388d92.js +1 -0
  560. package/.next/standalone/.next/static/chunks/app/api/models/route-b1df829796388d92.js +1 -0
  561. package/.next/standalone/.next/static/chunks/app/api/models/test/route-b1df829796388d92.js +1 -0
  562. package/.next/standalone/.next/static/chunks/app/api/oauth/[provider]/[action]/route-b1df829796388d92.js +1 -0
  563. package/.next/standalone/.next/static/chunks/app/api/oauth/cursor/auto-import/route-b1df829796388d92.js +1 -0
  564. package/.next/standalone/.next/static/chunks/app/api/oauth/cursor/import/route-b1df829796388d92.js +1 -0
  565. package/.next/standalone/.next/static/chunks/app/api/oauth/gitlab/pat/route-b1df829796388d92.js +1 -0
  566. package/.next/standalone/.next/static/chunks/app/api/oauth/iflow/cookie/route-b1df829796388d92.js +1 -0
  567. package/.next/standalone/.next/static/chunks/app/api/oauth/kiro/auto-import/route-b1df829796388d92.js +1 -0
  568. package/.next/standalone/.next/static/chunks/app/api/oauth/kiro/import/route-b1df829796388d92.js +1 -0
  569. package/.next/standalone/.next/static/chunks/app/api/oauth/kiro/social-authorize/route-b1df829796388d92.js +1 -0
  570. package/.next/standalone/.next/static/chunks/app/api/oauth/kiro/social-exchange/route-b1df829796388d92.js +1 -0
  571. package/.next/standalone/.next/static/chunks/app/api/pricing/route-b1df829796388d92.js +1 -0
  572. package/.next/standalone/.next/static/chunks/app/api/provider-nodes/[id]/route-b1df829796388d92.js +1 -0
  573. package/.next/standalone/.next/static/chunks/app/api/provider-nodes/route-b1df829796388d92.js +1 -0
  574. package/.next/standalone/.next/static/chunks/app/api/provider-nodes/validate/route-b1df829796388d92.js +1 -0
  575. package/.next/standalone/.next/static/chunks/app/api/providers/[id]/models/route-b1df829796388d92.js +1 -0
  576. package/.next/standalone/.next/static/chunks/app/api/providers/[id]/route-b1df829796388d92.js +1 -0
  577. package/.next/standalone/.next/static/chunks/app/api/providers/[id]/test/route-b1df829796388d92.js +1 -0
  578. package/.next/standalone/.next/static/chunks/app/api/providers/[id]/test-models/route-b1df829796388d92.js +1 -0
  579. package/.next/standalone/.next/static/chunks/app/api/providers/client/route-b1df829796388d92.js +1 -0
  580. package/.next/standalone/.next/static/chunks/app/api/providers/kilo/free-models/route-b1df829796388d92.js +1 -0
  581. package/.next/standalone/.next/static/chunks/app/api/providers/route-b1df829796388d92.js +1 -0
  582. package/.next/standalone/.next/static/chunks/app/api/providers/suggested-models/route-b1df829796388d92.js +1 -0
  583. package/.next/standalone/.next/static/chunks/app/api/providers/test-batch/route-b1df829796388d92.js +1 -0
  584. package/.next/standalone/.next/static/chunks/app/api/providers/validate/route-b1df829796388d92.js +1 -0
  585. package/.next/standalone/.next/static/chunks/app/api/proxy-pools/[id]/route-b1df829796388d92.js +1 -0
  586. package/.next/standalone/.next/static/chunks/app/api/proxy-pools/[id]/test/route-b1df829796388d92.js +1 -0
  587. package/.next/standalone/.next/static/chunks/app/api/proxy-pools/route-b1df829796388d92.js +1 -0
  588. package/.next/standalone/.next/static/chunks/app/api/proxy-pools/vercel-deploy/route-b1df829796388d92.js +1 -0
  589. package/.next/standalone/.next/static/chunks/app/api/settings/database/route-b1df829796388d92.js +1 -0
  590. package/.next/standalone/.next/static/chunks/app/api/settings/proxy-test/route-b1df829796388d92.js +1 -0
  591. package/.next/standalone/.next/static/chunks/app/api/settings/require-login/route-b1df829796388d92.js +1 -0
  592. package/.next/standalone/.next/static/chunks/app/api/settings/route-b1df829796388d92.js +1 -0
  593. package/.next/standalone/.next/static/chunks/app/api/shutdown/route-b1df829796388d92.js +1 -0
  594. package/.next/standalone/.next/static/chunks/app/api/tags/route-b1df829796388d92.js +1 -0
  595. package/.next/standalone/.next/static/chunks/app/api/translator/console-logs/route-b1df829796388d92.js +1 -0
  596. package/.next/standalone/.next/static/chunks/app/api/translator/console-logs/stream/route-b1df829796388d92.js +1 -0
  597. package/.next/standalone/.next/static/chunks/app/api/translator/load/route-b1df829796388d92.js +1 -0
  598. package/.next/standalone/.next/static/chunks/app/api/translator/save/route-b1df829796388d92.js +1 -0
  599. package/.next/standalone/.next/static/chunks/app/api/translator/send/route-b1df829796388d92.js +1 -0
  600. package/.next/standalone/.next/static/chunks/app/api/translator/translate/route-b1df829796388d92.js +1 -0
  601. package/.next/standalone/.next/static/chunks/app/api/tunnel/disable/route-b1df829796388d92.js +1 -0
  602. package/.next/standalone/.next/static/chunks/app/api/tunnel/enable/route-b1df829796388d92.js +1 -0
  603. package/.next/standalone/.next/static/chunks/app/api/tunnel/status/route-b1df829796388d92.js +1 -0
  604. package/.next/standalone/.next/static/chunks/app/api/tunnel/tailscale-check/route-b1df829796388d92.js +1 -0
  605. package/.next/standalone/.next/static/chunks/app/api/tunnel/tailscale-disable/route-b1df829796388d92.js +1 -0
  606. package/.next/standalone/.next/static/chunks/app/api/tunnel/tailscale-enable/route-b1df829796388d92.js +1 -0
  607. package/.next/standalone/.next/static/chunks/app/api/tunnel/tailscale-install/route-b1df829796388d92.js +1 -0
  608. package/.next/standalone/.next/static/chunks/app/api/tunnel/tailscale-login/route-b1df829796388d92.js +1 -0
  609. package/.next/standalone/.next/static/chunks/app/api/tunnel/tailscale-start-daemon/route-b1df829796388d92.js +1 -0
  610. package/.next/standalone/.next/static/chunks/app/api/usage/[connectionId]/route-b1df829796388d92.js +1 -0
  611. package/.next/standalone/.next/static/chunks/app/api/usage/chart/route-b1df829796388d92.js +1 -0
  612. package/.next/standalone/.next/static/chunks/app/api/usage/history/route-b1df829796388d92.js +1 -0
  613. package/.next/standalone/.next/static/chunks/app/api/usage/logs/route-b1df829796388d92.js +1 -0
  614. package/.next/standalone/.next/static/chunks/app/api/usage/providers/route-b1df829796388d92.js +1 -0
  615. package/.next/standalone/.next/static/chunks/app/api/usage/request-details/route-b1df829796388d92.js +1 -0
  616. package/.next/standalone/.next/static/chunks/app/api/usage/request-logs/route-b1df829796388d92.js +1 -0
  617. package/.next/standalone/.next/static/chunks/app/api/usage/stats/route-b1df829796388d92.js +1 -0
  618. package/.next/standalone/.next/static/chunks/app/api/usage/stream/route-b1df829796388d92.js +1 -0
  619. package/.next/standalone/.next/static/chunks/app/api/v1/api/chat/route-b1df829796388d92.js +1 -0
  620. package/.next/standalone/.next/static/chunks/app/api/v1/audio/speech/route-b1df829796388d92.js +1 -0
  621. package/.next/standalone/.next/static/chunks/app/api/v1/chat/completions/route-b1df829796388d92.js +1 -0
  622. package/.next/standalone/.next/static/chunks/app/api/v1/embeddings/route-b1df829796388d92.js +1 -0
  623. package/.next/standalone/.next/static/chunks/app/api/v1/messages/count_tokens/route-b1df829796388d92.js +1 -0
  624. package/.next/standalone/.next/static/chunks/app/api/v1/messages/route-b1df829796388d92.js +1 -0
  625. package/.next/standalone/.next/static/chunks/app/api/v1/models/route-b1df829796388d92.js +1 -0
  626. package/.next/standalone/.next/static/chunks/app/api/v1/responses/compact/route-b1df829796388d92.js +1 -0
  627. package/.next/standalone/.next/static/chunks/app/api/v1/responses/route-b1df829796388d92.js +1 -0
  628. package/.next/standalone/.next/static/chunks/app/api/v1/route-b1df829796388d92.js +1 -0
  629. package/.next/standalone/.next/static/chunks/app/api/v1beta/models/[...path]/route-b1df829796388d92.js +1 -0
  630. package/.next/standalone/.next/static/chunks/app/api/v1beta/models/route-b1df829796388d92.js +1 -0
  631. package/.next/standalone/.next/static/chunks/app/api/version/route-b1df829796388d92.js +1 -0
  632. package/.next/standalone/.next/static/chunks/app/login/{page-54cc56729733695a.js → page-be72e5284a2fb544.js} +1 -1
  633. package/.next/standalone/.next/static/chunks/app/manifest.webmanifest/route-b1df829796388d92.js +1 -0
  634. package/.next/standalone/.next/static/chunks/app/page-b1df829796388d92.js +1 -0
  635. package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-b1df829796388d92.js +1 -0
  636. package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-b1df829796388d92.js +1 -0
  637. package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-b1df829796388d92.js +1 -0
  638. package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-b1df829796388d92.js +1 -0
  639. package/.next/standalone/.next/static/css/88fc96b497c164a8.css +1 -0
  640. package/.next/standalone/.next/static/h8NGtEAY-aLid7r0dlZPy/_buildManifest.js +1 -0
  641. package/.next/standalone/mitm/cert/install.js +2 -2
  642. package/.next/standalone/mitm/dns/dnsConfig.js +3 -3
  643. package/.next/standalone/mitm/manager.js +21 -20
  644. package/.next/standalone/package.json +3 -1
  645. package/.next/standalone/server.js +1 -1
  646. package/.next/standalone/src/mitm/cert/generate.js +32 -0
  647. package/.next/standalone/src/mitm/cert/install.js +270 -0
  648. package/.next/standalone/src/mitm/cert/rootCA.js +173 -0
  649. package/.next/standalone/src/mitm/config.js +27 -0
  650. package/.next/standalone/src/mitm/dns/dnsConfig.js +378 -0
  651. package/.next/standalone/src/mitm/handlers/antigravity.js +20 -0
  652. package/.next/standalone/src/mitm/handlers/base.js +66 -0
  653. package/.next/standalone/src/mitm/handlers/copilot.js +35 -0
  654. package/.next/standalone/src/mitm/handlers/cursor.js +15 -0
  655. package/.next/standalone/src/mitm/handlers/kiro.js +20 -0
  656. package/.next/standalone/src/mitm/logger.js +8 -0
  657. package/.next/standalone/src/mitm/manager.js +693 -0
  658. package/.next/standalone/src/mitm/paths.js +33 -0
  659. package/.next/standalone/src/mitm/tokenPool.js +571 -0
  660. package/.next/standalone/src/mitm/usageTracker.js +600 -0
  661. package/.next/static/chunks/1051-a791905d1279a341.js +64 -0
  662. package/.next/static/chunks/1321-6c4c2e2a875b3f09.js +1 -0
  663. package/.next/static/chunks/2589-c9b859d6add2fcaf.js +3 -0
  664. package/.next/static/chunks/5497-e94e33a5eac96d27.js +7 -0
  665. package/.next/static/chunks/5601-1d538e4bbfb3814f.js +18 -0
  666. package/.next/static/chunks/app/(dashboard)/dashboard/basic-chat/{page-830561bb05858742.js → page-d5a2e04ec5bbab95.js} +1 -1
  667. package/.next/static/chunks/app/(dashboard)/dashboard/cli-tools/{page-6de79bf0d6e818c6.js → page-77e0cac4a054a7de.js} +1 -1
  668. package/.next/{standalone/.next/static/chunks/app/(dashboard)/dashboard/combos/page-80256518cf21bba3.js → static/chunks/app/(dashboard)/dashboard/combos/page-5b8274adb0617c1c.js} +1 -1
  669. package/.next/static/chunks/app/(dashboard)/dashboard/console-log/{page-efb0054f924dd4fd.js → page-43f00f001abcec45.js} +1 -1
  670. package/.next/static/chunks/app/(dashboard)/dashboard/endpoint/page-1158f90fcf0b5330.js +1 -0
  671. package/.next/{standalone/.next/static/chunks/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page-ce6753401b741885.js → static/chunks/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page-ef33b45245f904be.js} +36 -7
  672. package/.next/static/chunks/app/(dashboard)/dashboard/media-providers/[kind]/{page-4b6e1e7c8db448ec.js → page-d27fbf5a1ec2aa2f.js} +1 -1
  673. package/.next/static/chunks/app/(dashboard)/dashboard/mitm/{page-d99e342ecd18b0ef.js → page-94ac57c1e5946f92.js} +1 -1
  674. package/.next/static/chunks/app/(dashboard)/dashboard/page-7b6d1de8d476ea5f.js +1 -0
  675. package/.next/static/chunks/app/(dashboard)/dashboard/profile/{page-34888fb44c140c8c.js → page-878d93c57beb09db.js} +1 -1
  676. package/.next/static/chunks/app/(dashboard)/dashboard/providers/[id]/page-9830703c0fe87883.js +4 -0
  677. package/.next/static/chunks/app/(dashboard)/dashboard/providers/new/{page-28d13d1538c343a0.js → page-8f6cc09fc49e8683.js} +1 -1
  678. package/.next/static/chunks/app/(dashboard)/dashboard/providers/{page-be365b98602603b8.js → page-ec51df4b9677983e.js} +1 -1
  679. package/.next/static/chunks/app/(dashboard)/dashboard/proxy-pools/{page-56a88292dbb5c42c.js → page-86caff27d92376bc.js} +1 -1
  680. package/.next/static/chunks/app/(dashboard)/dashboard/quota/page-f342c57181e01663.js +1 -0
  681. package/.next/static/chunks/app/(dashboard)/dashboard/translator/{page-542a93cc9baf8c66.js → page-488019e0b709e092.js} +1 -1
  682. package/.next/static/chunks/app/(dashboard)/dashboard/usage/{page-a1a313a19cd2934c.js → page-2c4ceb73922b6d43.js} +1 -1
  683. package/.next/static/chunks/app/(dashboard)/layout-6c7b3d52047b5054.js +1 -0
  684. package/.next/static/chunks/app/_global-error/page-b1df829796388d92.js +1 -0
  685. package/.next/static/chunks/app/api/antigravity-ide/route-b1df829796388d92.js +1 -0
  686. package/.next/static/chunks/app/api/antigravity-tools/import/route-b1df829796388d92.js +1 -0
  687. package/.next/static/chunks/app/api/antigravity-tools/import-refresh-tokens/route-b1df829796388d92.js +1 -0
  688. package/.next/static/chunks/app/api/auth/login/route-b1df829796388d92.js +1 -0
  689. package/.next/static/chunks/app/api/auth/logout/route-b1df829796388d92.js +1 -0
  690. package/.next/static/chunks/app/api/cli-tools/antigravity-mitm/alias/route-b1df829796388d92.js +1 -0
  691. package/.next/static/chunks/app/api/cli-tools/antigravity-mitm/route-b1df829796388d92.js +1 -0
  692. package/.next/static/chunks/app/api/cli-tools/claude-settings/route-b1df829796388d92.js +1 -0
  693. package/.next/static/chunks/app/api/cli-tools/codex-settings/route-b1df829796388d92.js +1 -0
  694. package/.next/static/chunks/app/api/cli-tools/copilot-settings/route-b1df829796388d92.js +1 -0
  695. package/.next/static/chunks/app/api/cli-tools/droid-settings/route-b1df829796388d92.js +1 -0
  696. package/.next/static/chunks/app/api/cli-tools/openclaw-settings/route-b1df829796388d92.js +1 -0
  697. package/.next/static/chunks/app/api/cli-tools/opencode-settings/route-b1df829796388d92.js +1 -0
  698. package/.next/static/chunks/app/api/cloud/auth/route-b1df829796388d92.js +1 -0
  699. package/.next/static/chunks/app/api/cloud/credentials/update/route-b1df829796388d92.js +1 -0
  700. package/.next/static/chunks/app/api/cloud/model/resolve/route-b1df829796388d92.js +1 -0
  701. package/.next/static/chunks/app/api/cloud/models/alias/route-b1df829796388d92.js +1 -0
  702. package/.next/static/chunks/app/api/combos/[id]/route-b1df829796388d92.js +1 -0
  703. package/.next/static/chunks/app/api/combos/route-b1df829796388d92.js +1 -0
  704. package/.next/static/chunks/app/api/health/route-b1df829796388d92.js +1 -0
  705. package/.next/static/chunks/app/api/init/route-b1df829796388d92.js +1 -0
  706. package/.next/static/chunks/app/api/internal/request-detail/route-b1df829796388d92.js +1 -0
  707. package/.next/static/chunks/app/api/internal/usage/route-b1df829796388d92.js +1 -0
  708. package/.next/static/chunks/app/api/keys/[id]/route-b1df829796388d92.js +1 -0
  709. package/.next/static/chunks/app/api/keys/route-b1df829796388d92.js +1 -0
  710. package/.next/static/chunks/app/api/locale/route-b1df829796388d92.js +1 -0
  711. package/.next/static/chunks/app/api/media-providers/tts/elevenlabs/voices/route-b1df829796388d92.js +1 -0
  712. package/.next/static/chunks/app/api/media-providers/tts/voices/route-b1df829796388d92.js +1 -0
  713. package/.next/static/chunks/app/api/models/alias/route-b1df829796388d92.js +1 -0
  714. package/.next/static/chunks/app/api/models/availability/route-b1df829796388d92.js +1 -0
  715. package/.next/static/chunks/app/api/models/route-b1df829796388d92.js +1 -0
  716. package/.next/static/chunks/app/api/models/test/route-b1df829796388d92.js +1 -0
  717. package/.next/static/chunks/app/api/oauth/[provider]/[action]/route-b1df829796388d92.js +1 -0
  718. package/.next/static/chunks/app/api/oauth/cursor/auto-import/route-b1df829796388d92.js +1 -0
  719. package/.next/static/chunks/app/api/oauth/cursor/import/route-b1df829796388d92.js +1 -0
  720. package/.next/static/chunks/app/api/oauth/gitlab/pat/route-b1df829796388d92.js +1 -0
  721. package/.next/static/chunks/app/api/oauth/iflow/cookie/route-b1df829796388d92.js +1 -0
  722. package/.next/static/chunks/app/api/oauth/kiro/auto-import/route-b1df829796388d92.js +1 -0
  723. package/.next/static/chunks/app/api/oauth/kiro/import/route-b1df829796388d92.js +1 -0
  724. package/.next/static/chunks/app/api/oauth/kiro/social-authorize/route-b1df829796388d92.js +1 -0
  725. package/.next/static/chunks/app/api/oauth/kiro/social-exchange/route-b1df829796388d92.js +1 -0
  726. package/.next/static/chunks/app/api/pricing/route-b1df829796388d92.js +1 -0
  727. package/.next/static/chunks/app/api/provider-nodes/[id]/route-b1df829796388d92.js +1 -0
  728. package/.next/static/chunks/app/api/provider-nodes/route-b1df829796388d92.js +1 -0
  729. package/.next/static/chunks/app/api/provider-nodes/validate/route-b1df829796388d92.js +1 -0
  730. package/.next/static/chunks/app/api/providers/[id]/models/route-b1df829796388d92.js +1 -0
  731. package/.next/static/chunks/app/api/providers/[id]/route-b1df829796388d92.js +1 -0
  732. package/.next/static/chunks/app/api/providers/[id]/test/route-b1df829796388d92.js +1 -0
  733. package/.next/static/chunks/app/api/providers/[id]/test-models/route-b1df829796388d92.js +1 -0
  734. package/.next/static/chunks/app/api/providers/client/route-b1df829796388d92.js +1 -0
  735. package/.next/static/chunks/app/api/providers/kilo/free-models/route-b1df829796388d92.js +1 -0
  736. package/.next/static/chunks/app/api/providers/route-b1df829796388d92.js +1 -0
  737. package/.next/static/chunks/app/api/providers/suggested-models/route-b1df829796388d92.js +1 -0
  738. package/.next/static/chunks/app/api/providers/test-batch/route-b1df829796388d92.js +1 -0
  739. package/.next/static/chunks/app/api/providers/validate/route-b1df829796388d92.js +1 -0
  740. package/.next/static/chunks/app/api/proxy-pools/[id]/route-b1df829796388d92.js +1 -0
  741. package/.next/static/chunks/app/api/proxy-pools/[id]/test/route-b1df829796388d92.js +1 -0
  742. package/.next/static/chunks/app/api/proxy-pools/route-b1df829796388d92.js +1 -0
  743. package/.next/static/chunks/app/api/proxy-pools/vercel-deploy/route-b1df829796388d92.js +1 -0
  744. package/.next/static/chunks/app/api/settings/database/route-b1df829796388d92.js +1 -0
  745. package/.next/static/chunks/app/api/settings/proxy-test/route-b1df829796388d92.js +1 -0
  746. package/.next/static/chunks/app/api/settings/require-login/route-b1df829796388d92.js +1 -0
  747. package/.next/static/chunks/app/api/settings/route-b1df829796388d92.js +1 -0
  748. package/.next/static/chunks/app/api/shutdown/route-b1df829796388d92.js +1 -0
  749. package/.next/static/chunks/app/api/tags/route-b1df829796388d92.js +1 -0
  750. package/.next/static/chunks/app/api/translator/console-logs/route-b1df829796388d92.js +1 -0
  751. package/.next/static/chunks/app/api/translator/console-logs/stream/route-b1df829796388d92.js +1 -0
  752. package/.next/static/chunks/app/api/translator/load/route-b1df829796388d92.js +1 -0
  753. package/.next/static/chunks/app/api/translator/save/route-b1df829796388d92.js +1 -0
  754. package/.next/static/chunks/app/api/translator/send/route-b1df829796388d92.js +1 -0
  755. package/.next/static/chunks/app/api/translator/translate/route-b1df829796388d92.js +1 -0
  756. package/.next/static/chunks/app/api/tunnel/disable/route-b1df829796388d92.js +1 -0
  757. package/.next/static/chunks/app/api/tunnel/enable/route-b1df829796388d92.js +1 -0
  758. package/.next/static/chunks/app/api/tunnel/status/route-b1df829796388d92.js +1 -0
  759. package/.next/static/chunks/app/api/tunnel/tailscale-check/route-b1df829796388d92.js +1 -0
  760. package/.next/static/chunks/app/api/tunnel/tailscale-disable/route-b1df829796388d92.js +1 -0
  761. package/.next/static/chunks/app/api/tunnel/tailscale-enable/route-b1df829796388d92.js +1 -0
  762. package/.next/static/chunks/app/api/tunnel/tailscale-install/route-b1df829796388d92.js +1 -0
  763. package/.next/static/chunks/app/api/tunnel/tailscale-login/route-b1df829796388d92.js +1 -0
  764. package/.next/static/chunks/app/api/tunnel/tailscale-start-daemon/route-b1df829796388d92.js +1 -0
  765. package/.next/static/chunks/app/api/usage/[connectionId]/route-b1df829796388d92.js +1 -0
  766. package/.next/static/chunks/app/api/usage/chart/route-b1df829796388d92.js +1 -0
  767. package/.next/static/chunks/app/api/usage/history/route-b1df829796388d92.js +1 -0
  768. package/.next/static/chunks/app/api/usage/logs/route-b1df829796388d92.js +1 -0
  769. package/.next/static/chunks/app/api/usage/providers/route-b1df829796388d92.js +1 -0
  770. package/.next/static/chunks/app/api/usage/request-details/route-b1df829796388d92.js +1 -0
  771. package/.next/static/chunks/app/api/usage/request-logs/route-b1df829796388d92.js +1 -0
  772. package/.next/static/chunks/app/api/usage/stats/route-b1df829796388d92.js +1 -0
  773. package/.next/static/chunks/app/api/usage/stream/route-b1df829796388d92.js +1 -0
  774. package/.next/static/chunks/app/api/v1/api/chat/route-b1df829796388d92.js +1 -0
  775. package/.next/static/chunks/app/api/v1/audio/speech/route-b1df829796388d92.js +1 -0
  776. package/.next/static/chunks/app/api/v1/chat/completions/route-b1df829796388d92.js +1 -0
  777. package/.next/static/chunks/app/api/v1/embeddings/route-b1df829796388d92.js +1 -0
  778. package/.next/static/chunks/app/api/v1/messages/count_tokens/route-b1df829796388d92.js +1 -0
  779. package/.next/static/chunks/app/api/v1/messages/route-b1df829796388d92.js +1 -0
  780. package/.next/static/chunks/app/api/v1/models/route-b1df829796388d92.js +1 -0
  781. package/.next/static/chunks/app/api/v1/responses/compact/route-b1df829796388d92.js +1 -0
  782. package/.next/static/chunks/app/api/v1/responses/route-b1df829796388d92.js +1 -0
  783. package/.next/static/chunks/app/api/v1/route-b1df829796388d92.js +1 -0
  784. package/.next/static/chunks/app/api/v1beta/models/[...path]/route-b1df829796388d92.js +1 -0
  785. package/.next/static/chunks/app/api/v1beta/models/route-b1df829796388d92.js +1 -0
  786. package/.next/static/chunks/app/api/version/route-b1df829796388d92.js +1 -0
  787. package/.next/static/chunks/app/login/{page-54cc56729733695a.js → page-be72e5284a2fb544.js} +1 -1
  788. package/.next/static/chunks/app/manifest.webmanifest/route-b1df829796388d92.js +1 -0
  789. package/.next/static/chunks/app/page-b1df829796388d92.js +1 -0
  790. package/.next/static/chunks/next/dist/client/components/builtin/app-error-b1df829796388d92.js +1 -0
  791. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-b1df829796388d92.js +1 -0
  792. package/.next/static/chunks/next/dist/client/components/builtin/not-found-b1df829796388d92.js +1 -0
  793. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-b1df829796388d92.js +1 -0
  794. package/.next/static/css/88fc96b497c164a8.css +1 -0
  795. package/.next/static/h8NGtEAY-aLid7r0dlZPy/_buildManifest.js +1 -0
  796. package/README.md +1 -2
  797. package/package.json +3 -1
  798. package/.next/standalone/.next/server/chunks/3245.js +0 -1
  799. package/.next/standalone/.next/server/chunks/4689.js +0 -1
  800. package/.next/standalone/.next/server/chunks/5127.js +0 -1
  801. package/.next/standalone/.next/server/chunks/6182.js +0 -5
  802. package/.next/standalone/.next/server/chunks/6555.js +0 -1
  803. package/.next/standalone/.next/server/chunks/689.js +0 -1
  804. package/.next/standalone/.next/server/chunks/8220.js +0 -1
  805. package/.next/standalone/.next/server/chunks/869.js +0 -1
  806. package/.next/standalone/.next/server/chunks/9201.js +0 -1
  807. package/.next/standalone/.next/server/chunks/9612.js +0 -1
  808. package/.next/standalone/.next/static/W-c0RRAQmtcSIoLTJawK1/_buildManifest.js +0 -1
  809. package/.next/standalone/.next/static/chunks/123-9c561e168b206967.js +0 -1
  810. package/.next/standalone/.next/static/chunks/1321-e39ac1520e59f233.js +0 -1
  811. package/.next/standalone/.next/static/chunks/2589-6e15e2d8ce9c792d.js +0 -3
  812. package/.next/standalone/.next/static/chunks/5497-81adf0785c150317.js +0 -7
  813. package/.next/standalone/.next/static/chunks/5601-a0b403330ecce798.js +0 -18
  814. package/.next/standalone/.next/static/chunks/app/(dashboard)/dashboard/endpoint/page-42cd763529ac708f.js +0 -1
  815. package/.next/standalone/.next/static/chunks/app/(dashboard)/dashboard/page-9308c6959b7144fd.js +0 -1
  816. package/.next/standalone/.next/static/chunks/app/(dashboard)/dashboard/providers/[id]/page-640bf7f15af7240c.js +0 -4
  817. package/.next/standalone/.next/static/chunks/app/(dashboard)/dashboard/quota/page-6bd1edf4b3404eb3.js +0 -1
  818. package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-4c9cd1e77ccfdc99.js +0 -1
  819. package/.next/standalone/.next/static/chunks/app/api/auth/login/route-73b8002b49e065e6.js +0 -1
  820. package/.next/standalone/.next/static/chunks/app/api/auth/logout/route-73b8002b49e065e6.js +0 -1
  821. package/.next/standalone/.next/static/chunks/app/api/cli-tools/antigravity-mitm/alias/route-73b8002b49e065e6.js +0 -1
  822. package/.next/standalone/.next/static/chunks/app/api/cli-tools/antigravity-mitm/route-73b8002b49e065e6.js +0 -1
  823. package/.next/standalone/.next/static/chunks/app/api/cli-tools/claude-settings/route-73b8002b49e065e6.js +0 -1
  824. package/.next/standalone/.next/static/chunks/app/api/cli-tools/codex-settings/route-73b8002b49e065e6.js +0 -1
  825. package/.next/standalone/.next/static/chunks/app/api/cli-tools/copilot-settings/route-73b8002b49e065e6.js +0 -1
  826. package/.next/standalone/.next/static/chunks/app/api/cli-tools/droid-settings/route-73b8002b49e065e6.js +0 -1
  827. package/.next/standalone/.next/static/chunks/app/api/cli-tools/openclaw-settings/route-73b8002b49e065e6.js +0 -1
  828. package/.next/standalone/.next/static/chunks/app/api/cli-tools/opencode-settings/route-73b8002b49e065e6.js +0 -1
  829. package/.next/standalone/.next/static/chunks/app/api/cloud/auth/route-73b8002b49e065e6.js +0 -1
  830. package/.next/standalone/.next/static/chunks/app/api/cloud/credentials/update/route-73b8002b49e065e6.js +0 -1
  831. package/.next/standalone/.next/static/chunks/app/api/cloud/model/resolve/route-73b8002b49e065e6.js +0 -1
  832. package/.next/standalone/.next/static/chunks/app/api/cloud/models/alias/route-73b8002b49e065e6.js +0 -1
  833. package/.next/standalone/.next/static/chunks/app/api/combos/[id]/route-73b8002b49e065e6.js +0 -1
  834. package/.next/standalone/.next/static/chunks/app/api/combos/route-73b8002b49e065e6.js +0 -1
  835. package/.next/standalone/.next/static/chunks/app/api/health/route-73b8002b49e065e6.js +0 -1
  836. package/.next/standalone/.next/static/chunks/app/api/init/route-73b8002b49e065e6.js +0 -1
  837. package/.next/standalone/.next/static/chunks/app/api/internal/request-detail/route-73b8002b49e065e6.js +0 -1
  838. package/.next/standalone/.next/static/chunks/app/api/internal/usage/route-73b8002b49e065e6.js +0 -1
  839. package/.next/standalone/.next/static/chunks/app/api/keys/[id]/route-73b8002b49e065e6.js +0 -1
  840. package/.next/standalone/.next/static/chunks/app/api/keys/route-73b8002b49e065e6.js +0 -1
  841. package/.next/standalone/.next/static/chunks/app/api/locale/route-73b8002b49e065e6.js +0 -1
  842. package/.next/standalone/.next/static/chunks/app/api/media-providers/tts/elevenlabs/voices/route-73b8002b49e065e6.js +0 -1
  843. package/.next/standalone/.next/static/chunks/app/api/media-providers/tts/voices/route-73b8002b49e065e6.js +0 -1
  844. package/.next/standalone/.next/static/chunks/app/api/models/alias/route-73b8002b49e065e6.js +0 -1
  845. package/.next/standalone/.next/static/chunks/app/api/models/availability/route-73b8002b49e065e6.js +0 -1
  846. package/.next/standalone/.next/static/chunks/app/api/models/route-73b8002b49e065e6.js +0 -1
  847. package/.next/standalone/.next/static/chunks/app/api/models/test/route-73b8002b49e065e6.js +0 -1
  848. package/.next/standalone/.next/static/chunks/app/api/oauth/[provider]/[action]/route-73b8002b49e065e6.js +0 -1
  849. package/.next/standalone/.next/static/chunks/app/api/oauth/cursor/auto-import/route-73b8002b49e065e6.js +0 -1
  850. package/.next/standalone/.next/static/chunks/app/api/oauth/cursor/import/route-73b8002b49e065e6.js +0 -1
  851. package/.next/standalone/.next/static/chunks/app/api/oauth/gitlab/pat/route-73b8002b49e065e6.js +0 -1
  852. package/.next/standalone/.next/static/chunks/app/api/oauth/iflow/cookie/route-73b8002b49e065e6.js +0 -1
  853. package/.next/standalone/.next/static/chunks/app/api/oauth/kiro/auto-import/route-73b8002b49e065e6.js +0 -1
  854. package/.next/standalone/.next/static/chunks/app/api/oauth/kiro/import/route-73b8002b49e065e6.js +0 -1
  855. package/.next/standalone/.next/static/chunks/app/api/oauth/kiro/social-authorize/route-73b8002b49e065e6.js +0 -1
  856. package/.next/standalone/.next/static/chunks/app/api/oauth/kiro/social-exchange/route-73b8002b49e065e6.js +0 -1
  857. package/.next/standalone/.next/static/chunks/app/api/pricing/route-73b8002b49e065e6.js +0 -1
  858. package/.next/standalone/.next/static/chunks/app/api/provider-nodes/[id]/route-73b8002b49e065e6.js +0 -1
  859. package/.next/standalone/.next/static/chunks/app/api/provider-nodes/route-73b8002b49e065e6.js +0 -1
  860. package/.next/standalone/.next/static/chunks/app/api/provider-nodes/validate/route-73b8002b49e065e6.js +0 -1
  861. package/.next/standalone/.next/static/chunks/app/api/providers/[id]/models/route-73b8002b49e065e6.js +0 -1
  862. package/.next/standalone/.next/static/chunks/app/api/providers/[id]/route-73b8002b49e065e6.js +0 -1
  863. package/.next/standalone/.next/static/chunks/app/api/providers/[id]/test/route-73b8002b49e065e6.js +0 -1
  864. package/.next/standalone/.next/static/chunks/app/api/providers/[id]/test-models/route-73b8002b49e065e6.js +0 -1
  865. package/.next/standalone/.next/static/chunks/app/api/providers/client/route-73b8002b49e065e6.js +0 -1
  866. package/.next/standalone/.next/static/chunks/app/api/providers/kilo/free-models/route-73b8002b49e065e6.js +0 -1
  867. package/.next/standalone/.next/static/chunks/app/api/providers/route-73b8002b49e065e6.js +0 -1
  868. package/.next/standalone/.next/static/chunks/app/api/providers/test-batch/route-73b8002b49e065e6.js +0 -1
  869. package/.next/standalone/.next/static/chunks/app/api/providers/validate/route-73b8002b49e065e6.js +0 -1
  870. package/.next/standalone/.next/static/chunks/app/api/proxy-pools/[id]/route-73b8002b49e065e6.js +0 -1
  871. package/.next/standalone/.next/static/chunks/app/api/proxy-pools/[id]/test/route-73b8002b49e065e6.js +0 -1
  872. package/.next/standalone/.next/static/chunks/app/api/proxy-pools/route-73b8002b49e065e6.js +0 -1
  873. package/.next/standalone/.next/static/chunks/app/api/proxy-pools/vercel-deploy/route-73b8002b49e065e6.js +0 -1
  874. package/.next/standalone/.next/static/chunks/app/api/settings/database/route-73b8002b49e065e6.js +0 -1
  875. package/.next/standalone/.next/static/chunks/app/api/settings/proxy-test/route-73b8002b49e065e6.js +0 -1
  876. package/.next/standalone/.next/static/chunks/app/api/settings/require-login/route-73b8002b49e065e6.js +0 -1
  877. package/.next/standalone/.next/static/chunks/app/api/settings/route-73b8002b49e065e6.js +0 -1
  878. package/.next/standalone/.next/static/chunks/app/api/shutdown/route-73b8002b49e065e6.js +0 -1
  879. package/.next/standalone/.next/static/chunks/app/api/tags/route-73b8002b49e065e6.js +0 -1
  880. package/.next/standalone/.next/static/chunks/app/api/translator/console-logs/route-73b8002b49e065e6.js +0 -1
  881. package/.next/standalone/.next/static/chunks/app/api/translator/console-logs/stream/route-73b8002b49e065e6.js +0 -1
  882. package/.next/standalone/.next/static/chunks/app/api/translator/load/route-73b8002b49e065e6.js +0 -1
  883. package/.next/standalone/.next/static/chunks/app/api/translator/save/route-73b8002b49e065e6.js +0 -1
  884. package/.next/standalone/.next/static/chunks/app/api/translator/send/route-73b8002b49e065e6.js +0 -1
  885. package/.next/standalone/.next/static/chunks/app/api/translator/translate/route-73b8002b49e065e6.js +0 -1
  886. package/.next/standalone/.next/static/chunks/app/api/tunnel/disable/route-73b8002b49e065e6.js +0 -1
  887. package/.next/standalone/.next/static/chunks/app/api/tunnel/enable/route-73b8002b49e065e6.js +0 -1
  888. package/.next/standalone/.next/static/chunks/app/api/tunnel/status/route-73b8002b49e065e6.js +0 -1
  889. package/.next/standalone/.next/static/chunks/app/api/tunnel/tailscale-check/route-73b8002b49e065e6.js +0 -1
  890. package/.next/standalone/.next/static/chunks/app/api/tunnel/tailscale-disable/route-73b8002b49e065e6.js +0 -1
  891. package/.next/standalone/.next/static/chunks/app/api/tunnel/tailscale-enable/route-73b8002b49e065e6.js +0 -1
  892. package/.next/standalone/.next/static/chunks/app/api/tunnel/tailscale-install/route-73b8002b49e065e6.js +0 -1
  893. package/.next/standalone/.next/static/chunks/app/api/tunnel/tailscale-login/route-73b8002b49e065e6.js +0 -1
  894. package/.next/standalone/.next/static/chunks/app/api/tunnel/tailscale-start-daemon/route-73b8002b49e065e6.js +0 -1
  895. package/.next/standalone/.next/static/chunks/app/api/usage/[connectionId]/route-73b8002b49e065e6.js +0 -1
  896. package/.next/standalone/.next/static/chunks/app/api/usage/chart/route-73b8002b49e065e6.js +0 -1
  897. package/.next/standalone/.next/static/chunks/app/api/usage/history/route-73b8002b49e065e6.js +0 -1
  898. package/.next/standalone/.next/static/chunks/app/api/usage/logs/route-73b8002b49e065e6.js +0 -1
  899. package/.next/standalone/.next/static/chunks/app/api/usage/providers/route-73b8002b49e065e6.js +0 -1
  900. package/.next/standalone/.next/static/chunks/app/api/usage/request-details/route-73b8002b49e065e6.js +0 -1
  901. package/.next/standalone/.next/static/chunks/app/api/usage/request-logs/route-73b8002b49e065e6.js +0 -1
  902. package/.next/standalone/.next/static/chunks/app/api/usage/stats/route-73b8002b49e065e6.js +0 -1
  903. package/.next/standalone/.next/static/chunks/app/api/usage/stream/route-73b8002b49e065e6.js +0 -1
  904. package/.next/standalone/.next/static/chunks/app/api/v1/api/chat/route-73b8002b49e065e6.js +0 -1
  905. package/.next/standalone/.next/static/chunks/app/api/v1/audio/speech/route-73b8002b49e065e6.js +0 -1
  906. package/.next/standalone/.next/static/chunks/app/api/v1/chat/completions/route-73b8002b49e065e6.js +0 -1
  907. package/.next/standalone/.next/static/chunks/app/api/v1/embeddings/route-73b8002b49e065e6.js +0 -1
  908. package/.next/standalone/.next/static/chunks/app/api/v1/messages/count_tokens/route-73b8002b49e065e6.js +0 -1
  909. package/.next/standalone/.next/static/chunks/app/api/v1/messages/route-73b8002b49e065e6.js +0 -1
  910. package/.next/standalone/.next/static/chunks/app/api/v1/models/route-73b8002b49e065e6.js +0 -1
  911. package/.next/standalone/.next/static/chunks/app/api/v1/responses/compact/route-73b8002b49e065e6.js +0 -1
  912. package/.next/standalone/.next/static/chunks/app/api/v1/responses/route-73b8002b49e065e6.js +0 -1
  913. package/.next/standalone/.next/static/chunks/app/api/v1/route-73b8002b49e065e6.js +0 -1
  914. package/.next/standalone/.next/static/chunks/app/api/v1beta/models/[...path]/route-73b8002b49e065e6.js +0 -1
  915. package/.next/standalone/.next/static/chunks/app/api/v1beta/models/route-73b8002b49e065e6.js +0 -1
  916. package/.next/standalone/.next/static/chunks/app/api/version/route-73b8002b49e065e6.js +0 -1
  917. package/.next/standalone/.next/static/chunks/app/manifest.webmanifest/route-73b8002b49e065e6.js +0 -1
  918. package/.next/standalone/.next/static/chunks/app/page-73b8002b49e065e6.js +0 -1
  919. package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/app-error-73b8002b49e065e6.js +0 -1
  920. package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/forbidden-73b8002b49e065e6.js +0 -1
  921. package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/not-found-73b8002b49e065e6.js +0 -1
  922. package/.next/standalone/.next/static/chunks/next/dist/client/components/builtin/unauthorized-73b8002b49e065e6.js +0 -1
  923. package/.next/standalone/.next/static/css/2d390f725d5d5a0d.css +0 -1
  924. package/.next/static/W-c0RRAQmtcSIoLTJawK1/_buildManifest.js +0 -1
  925. package/.next/static/chunks/123-9c561e168b206967.js +0 -1
  926. package/.next/static/chunks/1321-e39ac1520e59f233.js +0 -1
  927. package/.next/static/chunks/2589-6e15e2d8ce9c792d.js +0 -3
  928. package/.next/static/chunks/5497-81adf0785c150317.js +0 -7
  929. package/.next/static/chunks/5601-a0b403330ecce798.js +0 -18
  930. package/.next/static/chunks/app/(dashboard)/dashboard/endpoint/page-42cd763529ac708f.js +0 -1
  931. package/.next/static/chunks/app/(dashboard)/dashboard/page-9308c6959b7144fd.js +0 -1
  932. package/.next/static/chunks/app/(dashboard)/dashboard/providers/[id]/page-640bf7f15af7240c.js +0 -4
  933. package/.next/static/chunks/app/(dashboard)/dashboard/quota/page-6bd1edf4b3404eb3.js +0 -1
  934. package/.next/static/chunks/app/(dashboard)/layout-4c9cd1e77ccfdc99.js +0 -1
  935. package/.next/static/chunks/app/_global-error/page-73b8002b49e065e6.js +0 -1
  936. package/.next/static/chunks/app/api/antigravity-ide/route-73b8002b49e065e6.js +0 -1
  937. package/.next/static/chunks/app/api/antigravity-tools/import/route-73b8002b49e065e6.js +0 -1
  938. package/.next/static/chunks/app/api/antigravity-tools/import-refresh-tokens/route-73b8002b49e065e6.js +0 -1
  939. package/.next/static/chunks/app/api/auth/login/route-73b8002b49e065e6.js +0 -1
  940. package/.next/static/chunks/app/api/auth/logout/route-73b8002b49e065e6.js +0 -1
  941. package/.next/static/chunks/app/api/cli-tools/antigravity-mitm/alias/route-73b8002b49e065e6.js +0 -1
  942. package/.next/static/chunks/app/api/cli-tools/antigravity-mitm/route-73b8002b49e065e6.js +0 -1
  943. package/.next/static/chunks/app/api/cli-tools/claude-settings/route-73b8002b49e065e6.js +0 -1
  944. package/.next/static/chunks/app/api/cli-tools/codex-settings/route-73b8002b49e065e6.js +0 -1
  945. package/.next/static/chunks/app/api/cli-tools/copilot-settings/route-73b8002b49e065e6.js +0 -1
  946. package/.next/static/chunks/app/api/cli-tools/droid-settings/route-73b8002b49e065e6.js +0 -1
  947. package/.next/static/chunks/app/api/cli-tools/openclaw-settings/route-73b8002b49e065e6.js +0 -1
  948. package/.next/static/chunks/app/api/cli-tools/opencode-settings/route-73b8002b49e065e6.js +0 -1
  949. package/.next/static/chunks/app/api/cloud/auth/route-73b8002b49e065e6.js +0 -1
  950. package/.next/static/chunks/app/api/cloud/credentials/update/route-73b8002b49e065e6.js +0 -1
  951. package/.next/static/chunks/app/api/cloud/model/resolve/route-73b8002b49e065e6.js +0 -1
  952. package/.next/static/chunks/app/api/cloud/models/alias/route-73b8002b49e065e6.js +0 -1
  953. package/.next/static/chunks/app/api/combos/[id]/route-73b8002b49e065e6.js +0 -1
  954. package/.next/static/chunks/app/api/combos/route-73b8002b49e065e6.js +0 -1
  955. package/.next/static/chunks/app/api/health/route-73b8002b49e065e6.js +0 -1
  956. package/.next/static/chunks/app/api/init/route-73b8002b49e065e6.js +0 -1
  957. package/.next/static/chunks/app/api/internal/request-detail/route-73b8002b49e065e6.js +0 -1
  958. package/.next/static/chunks/app/api/internal/usage/route-73b8002b49e065e6.js +0 -1
  959. package/.next/static/chunks/app/api/keys/[id]/route-73b8002b49e065e6.js +0 -1
  960. package/.next/static/chunks/app/api/keys/route-73b8002b49e065e6.js +0 -1
  961. package/.next/static/chunks/app/api/locale/route-73b8002b49e065e6.js +0 -1
  962. package/.next/static/chunks/app/api/media-providers/tts/elevenlabs/voices/route-73b8002b49e065e6.js +0 -1
  963. package/.next/static/chunks/app/api/media-providers/tts/voices/route-73b8002b49e065e6.js +0 -1
  964. package/.next/static/chunks/app/api/models/alias/route-73b8002b49e065e6.js +0 -1
  965. package/.next/static/chunks/app/api/models/availability/route-73b8002b49e065e6.js +0 -1
  966. package/.next/static/chunks/app/api/models/route-73b8002b49e065e6.js +0 -1
  967. package/.next/static/chunks/app/api/models/test/route-73b8002b49e065e6.js +0 -1
  968. package/.next/static/chunks/app/api/oauth/[provider]/[action]/route-73b8002b49e065e6.js +0 -1
  969. package/.next/static/chunks/app/api/oauth/cursor/auto-import/route-73b8002b49e065e6.js +0 -1
  970. package/.next/static/chunks/app/api/oauth/cursor/import/route-73b8002b49e065e6.js +0 -1
  971. package/.next/static/chunks/app/api/oauth/gitlab/pat/route-73b8002b49e065e6.js +0 -1
  972. package/.next/static/chunks/app/api/oauth/iflow/cookie/route-73b8002b49e065e6.js +0 -1
  973. package/.next/static/chunks/app/api/oauth/kiro/auto-import/route-73b8002b49e065e6.js +0 -1
  974. package/.next/static/chunks/app/api/oauth/kiro/import/route-73b8002b49e065e6.js +0 -1
  975. package/.next/static/chunks/app/api/oauth/kiro/social-authorize/route-73b8002b49e065e6.js +0 -1
  976. package/.next/static/chunks/app/api/oauth/kiro/social-exchange/route-73b8002b49e065e6.js +0 -1
  977. package/.next/static/chunks/app/api/pricing/route-73b8002b49e065e6.js +0 -1
  978. package/.next/static/chunks/app/api/provider-nodes/[id]/route-73b8002b49e065e6.js +0 -1
  979. package/.next/static/chunks/app/api/provider-nodes/route-73b8002b49e065e6.js +0 -1
  980. package/.next/static/chunks/app/api/provider-nodes/validate/route-73b8002b49e065e6.js +0 -1
  981. package/.next/static/chunks/app/api/providers/[id]/models/route-73b8002b49e065e6.js +0 -1
  982. package/.next/static/chunks/app/api/providers/[id]/route-73b8002b49e065e6.js +0 -1
  983. package/.next/static/chunks/app/api/providers/[id]/test/route-73b8002b49e065e6.js +0 -1
  984. package/.next/static/chunks/app/api/providers/[id]/test-models/route-73b8002b49e065e6.js +0 -1
  985. package/.next/static/chunks/app/api/providers/client/route-73b8002b49e065e6.js +0 -1
  986. package/.next/static/chunks/app/api/providers/kilo/free-models/route-73b8002b49e065e6.js +0 -1
  987. package/.next/static/chunks/app/api/providers/route-73b8002b49e065e6.js +0 -1
  988. package/.next/static/chunks/app/api/providers/test-batch/route-73b8002b49e065e6.js +0 -1
  989. package/.next/static/chunks/app/api/providers/validate/route-73b8002b49e065e6.js +0 -1
  990. package/.next/static/chunks/app/api/proxy-pools/[id]/route-73b8002b49e065e6.js +0 -1
  991. package/.next/static/chunks/app/api/proxy-pools/[id]/test/route-73b8002b49e065e6.js +0 -1
  992. package/.next/static/chunks/app/api/proxy-pools/route-73b8002b49e065e6.js +0 -1
  993. package/.next/static/chunks/app/api/proxy-pools/vercel-deploy/route-73b8002b49e065e6.js +0 -1
  994. package/.next/static/chunks/app/api/settings/database/route-73b8002b49e065e6.js +0 -1
  995. package/.next/static/chunks/app/api/settings/proxy-test/route-73b8002b49e065e6.js +0 -1
  996. package/.next/static/chunks/app/api/settings/require-login/route-73b8002b49e065e6.js +0 -1
  997. package/.next/static/chunks/app/api/settings/route-73b8002b49e065e6.js +0 -1
  998. package/.next/static/chunks/app/api/shutdown/route-73b8002b49e065e6.js +0 -1
  999. package/.next/static/chunks/app/api/tags/route-73b8002b49e065e6.js +0 -1
  1000. package/.next/static/chunks/app/api/translator/console-logs/route-73b8002b49e065e6.js +0 -1
  1001. package/.next/static/chunks/app/api/translator/console-logs/stream/route-73b8002b49e065e6.js +0 -1
  1002. package/.next/static/chunks/app/api/translator/load/route-73b8002b49e065e6.js +0 -1
  1003. package/.next/static/chunks/app/api/translator/save/route-73b8002b49e065e6.js +0 -1
  1004. package/.next/static/chunks/app/api/translator/send/route-73b8002b49e065e6.js +0 -1
  1005. package/.next/static/chunks/app/api/translator/translate/route-73b8002b49e065e6.js +0 -1
  1006. package/.next/static/chunks/app/api/tunnel/disable/route-73b8002b49e065e6.js +0 -1
  1007. package/.next/static/chunks/app/api/tunnel/enable/route-73b8002b49e065e6.js +0 -1
  1008. package/.next/static/chunks/app/api/tunnel/status/route-73b8002b49e065e6.js +0 -1
  1009. package/.next/static/chunks/app/api/tunnel/tailscale-check/route-73b8002b49e065e6.js +0 -1
  1010. package/.next/static/chunks/app/api/tunnel/tailscale-disable/route-73b8002b49e065e6.js +0 -1
  1011. package/.next/static/chunks/app/api/tunnel/tailscale-enable/route-73b8002b49e065e6.js +0 -1
  1012. package/.next/static/chunks/app/api/tunnel/tailscale-install/route-73b8002b49e065e6.js +0 -1
  1013. package/.next/static/chunks/app/api/tunnel/tailscale-login/route-73b8002b49e065e6.js +0 -1
  1014. package/.next/static/chunks/app/api/tunnel/tailscale-start-daemon/route-73b8002b49e065e6.js +0 -1
  1015. package/.next/static/chunks/app/api/usage/[connectionId]/route-73b8002b49e065e6.js +0 -1
  1016. package/.next/static/chunks/app/api/usage/chart/route-73b8002b49e065e6.js +0 -1
  1017. package/.next/static/chunks/app/api/usage/history/route-73b8002b49e065e6.js +0 -1
  1018. package/.next/static/chunks/app/api/usage/logs/route-73b8002b49e065e6.js +0 -1
  1019. package/.next/static/chunks/app/api/usage/providers/route-73b8002b49e065e6.js +0 -1
  1020. package/.next/static/chunks/app/api/usage/request-details/route-73b8002b49e065e6.js +0 -1
  1021. package/.next/static/chunks/app/api/usage/request-logs/route-73b8002b49e065e6.js +0 -1
  1022. package/.next/static/chunks/app/api/usage/stats/route-73b8002b49e065e6.js +0 -1
  1023. package/.next/static/chunks/app/api/usage/stream/route-73b8002b49e065e6.js +0 -1
  1024. package/.next/static/chunks/app/api/v1/api/chat/route-73b8002b49e065e6.js +0 -1
  1025. package/.next/static/chunks/app/api/v1/audio/speech/route-73b8002b49e065e6.js +0 -1
  1026. package/.next/static/chunks/app/api/v1/chat/completions/route-73b8002b49e065e6.js +0 -1
  1027. package/.next/static/chunks/app/api/v1/embeddings/route-73b8002b49e065e6.js +0 -1
  1028. package/.next/static/chunks/app/api/v1/messages/count_tokens/route-73b8002b49e065e6.js +0 -1
  1029. package/.next/static/chunks/app/api/v1/messages/route-73b8002b49e065e6.js +0 -1
  1030. package/.next/static/chunks/app/api/v1/models/route-73b8002b49e065e6.js +0 -1
  1031. package/.next/static/chunks/app/api/v1/responses/compact/route-73b8002b49e065e6.js +0 -1
  1032. package/.next/static/chunks/app/api/v1/responses/route-73b8002b49e065e6.js +0 -1
  1033. package/.next/static/chunks/app/api/v1/route-73b8002b49e065e6.js +0 -1
  1034. package/.next/static/chunks/app/api/v1beta/models/[...path]/route-73b8002b49e065e6.js +0 -1
  1035. package/.next/static/chunks/app/api/v1beta/models/route-73b8002b49e065e6.js +0 -1
  1036. package/.next/static/chunks/app/api/version/route-73b8002b49e065e6.js +0 -1
  1037. package/.next/static/chunks/app/manifest.webmanifest/route-73b8002b49e065e6.js +0 -1
  1038. package/.next/static/chunks/app/page-73b8002b49e065e6.js +0 -1
  1039. package/.next/static/chunks/next/dist/client/components/builtin/app-error-73b8002b49e065e6.js +0 -1
  1040. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-73b8002b49e065e6.js +0 -1
  1041. package/.next/static/chunks/next/dist/client/components/builtin/not-found-73b8002b49e065e6.js +0 -1
  1042. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-73b8002b49e065e6.js +0 -1
  1043. package/.next/static/css/2d390f725d5d5a0d.css +0 -1
  1044. /package/.next/standalone/.next/static/{W-c0RRAQmtcSIoLTJawK1 → h8NGtEAY-aLid7r0dlZPy}/_ssgManifest.js +0 -0
  1045. /package/.next/static/{W-c0RRAQmtcSIoLTJawK1 → h8NGtEAY-aLid7r0dlZPy}/_ssgManifest.js +0 -0
@@ -1,9 +1,9 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[182],{1943:(e,t,s)=>{Promise.resolve().then(s.bind(s,94588))},94588:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>P});var a=s(95155),r=s(73321),i=s(98500),o=s.n(i),n=s(12115),l=s(35497),d=s(57250),c=s(52679),x=s(28777),p=s(11059),m=s(14051),u=s.n(m);function h({until:e}){let[t,s]=(0,n.useState)("");return((0,n.useEffect)(()=>{let t=()=>{let t=new Date(e).getTime()-Date.now();if(t<=0)return void s("");let a=Math.floor(t/1e3);a<60?s(`${a}s`):a<3600?s(`${Math.floor(a/60)}m ${a%60}s`):s(`${Math.floor(a/3600)}h ${Math.floor(a%3600/60)}m`)};t();let a=setInterval(t,1e3);return()=>clearInterval(a)},[e]),t)?(0,a.jsxs)("span",{className:"text-xs text-orange-500 font-mono",children:["⏱ ",t]}):null}function b({connection:e,proxyPools:t,isOAuth:s,isFirst:r,isLast:i,onMoveUp:o,onMoveDown:d,onToggleActive:c,onUpdateProxy:x,onEdit:p,onDelete:m}){let[u,g]=(0,n.useState)(!1),[y,f]=(0,n.useState)(!1),[j,v]=(0,n.useState)(!1),N=(0,n.useRef)(null),w=new Map((t||[]).map(e=>[e.id,e])),k=e.providerSpecificData?.proxyPoolId||null,S=k?w.get(k):null,C=e.providerSpecificData?.connectionProxyEnabled===!0&&!!e.providerSpecificData?.connectionProxyUrl,$=!!k||C,P=S?`Pool: ${S.name}`:k?`Pool: ${k} (inactive/missing)`:C?`Legacy: ${e.providerSpecificData?.connectionProxyUrl}`:"",T="",O=S?.proxyUrl||e.providerSpecificData?.connectionProxyUrl;if(O)try{let e=new URL(O);T=`${e.protocol}//${e.hostname}${e.port?`:${e.port}`:""}`}catch{T=O}let A=S?.noProxy||e.providerSpecificData?.connectionNoProxy||"",_=S?.isActive===!0?"success":k||C?"error":"default",R=Object.entries(e).filter(([e])=>e.startsWith("modelLock_")).map(([,e])=>e).filter(Boolean).sort()[0]||null;(0,n.useEffect)(()=>{let t=()=>{v(!!Object.entries(e).filter(([e])=>e.startsWith("modelLock_")).map(([,e])=>e).filter(e=>e&&new Date(e).getTime()>Date.now()).sort()[0])};t();let s=R?setInterval(t,1e3):null;return()=>{s&&clearInterval(s)}},[R]),(0,n.useEffect)(()=>{if(!u)return;let e=e=>{N.current&&!N.current.contains(e.target)&&g(!1)};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[u]);let E="unavailable"!==e.testStatus||j?e.testStatus:"active",I=s?e.name||e.email||e.displayName||"OAuth Account":e.name,D=async e=>{f(!0);try{await x("__none__"===e?null:e)}finally{f(!1),g(!1)}};return(0,a.jsxs)("div",{className:`group flex items-center justify-between p2 rounded-lg hover:bg-black/[0.02] dark:hover:bg-white/[0.02] transition-colors ${!1===e.isActive?"opacity-60":""}`,children:[(0,a.jsxs)("div",{className:"flex items-center gap-3 flex-1 min-w-0",children:[(0,a.jsxs)("div",{className:"flex flex-col",children:[(0,a.jsx)("button",{onClick:o,disabled:r,className:`p-0.5 rounded ${r?"text-text-muted/30 cursor-not-allowed":"hover:bg-sidebar text-text-muted hover:text-primary"}`,children:(0,a.jsx)("span",{className:"material-symbols-outlined text-sm",children:"keyboard_arrow_up"})}),(0,a.jsx)("button",{onClick:d,disabled:i,className:`p-0.5 rounded ${i?"text-text-muted/30 cursor-not-allowed":"hover:bg-sidebar text-text-muted hover:text-primary"}`,children:(0,a.jsx)("span",{className:"material-symbols-outlined text-sm",children:"keyboard_arrow_down"})})]}),(0,a.jsx)("span",{className:"material-symbols-outlined text-base text-text-muted",children:s?"lock":"key"}),(0,a.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,a.jsx)("p",{className:"text-sm font-medium truncate",children:I}),(0,a.jsxs)("div",{className:"flex items-center gap-2 mt-1 flex-wrap",children:[(0,a.jsx)(l.Ex,{variant:!1===e.isActive?"default":"active"===E||"success"===E?"success":"error"===E||"expired"===E||"unavailable"===E?"error":"default",size:"sm",dot:!0,children:!1===e.isActive?"disabled":E||"Unknown"}),$&&(0,a.jsx)(l.Ex,{variant:_,size:"sm",children:"Proxy"}),j&&!1!==e.isActive&&(0,a.jsx)(h,{until:R}),e.lastError&&!1!==e.isActive&&(0,a.jsx)("span",{className:"text-xs text-red-500 truncate max-w-[300px]",title:e.lastError,children:e.lastError}),(0,a.jsxs)("span",{className:"text-xs text-text-muted",children:["#",e.priority]})]}),$&&(0,a.jsxs)("div",{className:"mt-1 flex items-center gap-2 flex-wrap",children:[(0,a.jsx)("span",{className:"text-[11px] text-text-muted truncate max-w-[420px]",title:P,children:P}),T&&(0,a.jsx)("code",{className:"text-[10px] font-mono bg-black/5 dark:bg-white/5 px-1 py-0.5 rounded text-text-muted",children:T}),A&&(0,a.jsxs)("span",{className:"text-[11px] text-text-muted truncate max-w-[320px]",title:A,children:["no_proxy: ",A]})]})]})]}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsxs)("div",{className:"flex gap-1",children:[(t||[]).length>0&&(0,a.jsxs)("div",{className:"relative",ref:N,children:[(0,a.jsxs)("button",{onClick:()=>g(e=>!e),className:`flex flex-col items-center px-2 py-1 rounded hover:bg-black/5 dark:hover:bg-white/5 transition-colors ${$?"text-primary":"text-text-muted hover:text-primary"}`,disabled:y,children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:y?"progress_activity":"lan"}),(0,a.jsx)("span",{className:"text-[10px] leading-tight",children:"Proxy"})]}),u&&(0,a.jsxs)("div",{className:"absolute right-0 top-full mt-1 z-50 bg-bg border border-border rounded-lg shadow-lg py-1 min-w-[160px]",children:[(0,a.jsx)("button",{onClick:()=>D("__none__"),className:`w-full text-left px-3 py-1.5 text-sm hover:bg-black/5 dark:hover:bg-white/5 ${!k?"text-primary font-medium":"text-text-main"}`,children:"None"}),(t||[]).map(e=>(0,a.jsx)("button",{onClick:()=>D(e.id),className:`w-full text-left px-3 py-1.5 text-sm hover:bg-black/5 dark:hover:bg-white/5 ${k===e.id?"text-primary font-medium":"text-text-main"}`,children:e.name},e.id))]})]}),(0,a.jsxs)("button",{onClick:p,className:"flex flex-col items-center px-2 py-1 rounded hover:bg-black/5 dark:hover:bg-white/5 text-text-muted hover:text-primary",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"edit"}),(0,a.jsx)("span",{className:"text-[10px] leading-tight",children:"Edit"})]}),(0,a.jsxs)("button",{onClick:m,className:"flex flex-col items-center px-2 py-1 rounded hover:bg-red-500/10 text-red-500",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"delete"}),(0,a.jsx)("span",{className:"text-[10px] leading-tight",children:"Delete"})]})]}),(0,a.jsx)(l.lM,{size:"sm",checked:e.isActive??!0,onChange:c,title:e.isActive??!0?"Disable":"Enable"})]})]})}function g({isOpen:e,provider:t,providerName:s,proxyPools:r,onSave:i,onClose:o}){let d="__none__",[c,x]=(0,n.useState)({name:"",apiKey:"",priority:1,proxyPoolId:d}),[p,m]=(0,n.useState)(!1),[u,h]=(0,n.useState)(null),[b,y]=(0,n.useState)(!1),f=async()=>{m(!0);try{let e=await fetch("/api/providers/validate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:t,apiKey:c.apiKey})}),s=await e.json();h(s.valid?"success":"failed")}catch{h("failed")}finally{m(!1)}},j=async()=>{if(t&&c.apiKey){y(!0);try{let e=!1;try{m(!0),h(null);let s=await fetch("/api/providers/validate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:t,apiKey:c.apiKey})});e=!!(await s.json()).valid,h(e?"success":"failed")}catch{h("failed")}finally{m(!1)}await i({name:c.name,apiKey:c.apiKey,priority:c.priority,proxyPoolId:c.proxyPoolId===d?null:c.proxyPoolId,testStatus:e?"active":"unknown"})}finally{y(!1)}}};return t?(0,a.jsx)(l.aF,{isOpen:e,title:`Add ${s||t} API Key`,onClose:o,children:(0,a.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("label",{className:"text-xs text-text-muted mb-1 block",children:"Name"}),(0,a.jsx)("input",{className:"w-full px-3 py-2 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary",value:c.name,onChange:e=>x({...c,name:e.target.value}),placeholder:"Production Key"})]}),(0,a.jsxs)("div",{className:"flex gap-2",children:[(0,a.jsxs)("div",{className:"flex-1",children:[(0,a.jsx)("label",{className:"text-xs text-text-muted mb-1 block",children:"API Key"}),(0,a.jsx)("input",{type:"password",className:"w-full px-3 py-2 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary",value:c.apiKey,onChange:e=>x({...c,apiKey:e.target.value})})]}),(0,a.jsx)("div",{className:"pt-6",children:(0,a.jsx)(l.$n,{onClick:f,disabled:!c.apiKey||p||b,variant:"secondary",children:p?"Checking...":"Check"})})]}),u&&(0,a.jsx)(l.Ex,{variant:"success"===u?"success":"error",children:"success"===u?"Valid":"Invalid"}),(0,a.jsxs)("div",{children:[(0,a.jsx)("label",{className:"text-xs text-text-muted mb-1 block",children:"Priority"}),(0,a.jsx)("input",{type:"number",className:"w-full px-3 py-2 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary",value:c.priority,onChange:e=>x({...c,priority:Number.parseInt(e.target.value)||1})})]}),(0,a.jsx)(l.l6,{label:"Proxy Pool",value:c.proxyPoolId,onChange:e=>x({...c,proxyPoolId:e.target.value}),options:[{value:d,label:"None"},...(r||[]).map(e=>({value:e.id,label:e.name}))]}),(0,a.jsxs)("div",{className:"flex gap-2",children:[(0,a.jsx)(l.$n,{onClick:j,fullWidth:!0,disabled:!c.name||!c.apiKey||b,children:b?"Saving...":"Save"}),(0,a.jsx)(l.$n,{onClick:o,variant:"ghost",fullWidth:!0,children:"Cancel"})]})]})}):null}function y({providerId:e,isOAuth:t}){let[s,r]=(0,n.useState)([]),[i,o]=(0,n.useState)([]),[d,c]=(0,n.useState)(!0),[x,p]=(0,n.useState)(!1),[m,u]=(0,n.useState)(!1),[h,f]=(0,n.useState)(null),[j,v]=(0,n.useState)(null),[N,w]=(0,n.useState)("1"),k=(0,n.useCallback)(async()=>{try{let[t,s,a]=await Promise.all([fetch("/api/providers",{cache:"no-store"}),fetch("/api/proxy-pools?isActive=true",{cache:"no-store"}),fetch("/api/settings",{cache:"no-store"})]),i=await t.json(),n=await s.json(),l=a.ok?await a.json():{};t.ok&&r((i.connections||[]).filter(t=>t.provider===e)),s.ok&&o(n.proxyPools||[]);let d=(l.providerStrategies||{})[e]||{};v(d.fallbackStrategy||null),w(null!=d.stickyRoundRobinLimit?String(d.stickyRoundRobinLimit):"1")}catch(e){console.log("ConnectionsCard fetch error:",e)}finally{c(!1)}},[e]);(0,n.useEffect)(()=>{k()},[k]);let S=async(t,s)=>{try{let a=await fetch("/api/settings",{cache:"no-store"}),r=(a.ok?await a.json():{}).providerStrategies||{},i={};t&&(i.fallbackStrategy=t),"round-robin"===t&&""!==s&&(i.stickyRoundRobinLimit=Number(s)||3);let o={...r};0===Object.keys(i).length?delete o[e]:o[e]=i,await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({providerStrategies:o})})}catch(e){console.log("saveStrategy error:",e)}},C=async(e,t)=>{let a=[...s];[a[e],a[t]]=[a[t],a[e]],r(a);try{await Promise.all([fetch(`/api/providers/${a[e].id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({priority:e})}),fetch(`/api/providers/${a[t].id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({priority:t})})])}catch{await k()}},$=async e=>{if(confirm("Delete this connection?"))try{(await fetch(`/api/providers/${e}`,{method:"DELETE"})).ok&&r(t=>t.filter(t=>t.id!==e))}catch(e){console.log("delete error:",e)}},P=async(e,t)=>{try{(await fetch(`/api/providers/${e}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({isActive:t})})).ok&&r(s=>s.map(s=>s.id===e?{...s,isActive:t}:s))}catch(e){console.log("toggle error:",e)}},T=async(e,t)=>{try{(await fetch(`/api/providers/${e}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({proxyPoolId:t||null})})).ok&&r(s=>s.map(s=>s.id===e?{...s,providerSpecificData:{...s.providerSpecificData,proxyPoolId:t||null}}:s))}catch(e){console.log("proxy error:",e)}},O=async t=>{try{(await fetch("/api/providers",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:e,...t})})).ok&&(await k(),p(!1))}catch(e){console.log("save apikey error:",e)}},A=async e=>{try{(await fetch(`/api/providers/${h.id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})).ok&&(await k(),u(!1))}catch(e){console.log("update connection error:",e)}};return d?(0,a.jsx)(l.Zp,{children:(0,a.jsx)("div",{className:"h-20 animate-pulse bg-black/5 rounded-lg"})}):(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(l.Zp,{children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,a.jsx)("h2",{className:"text-lg font-semibold",children:"Connections"}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("span",{className:"text-xs text-text-muted font-medium",children:"Round Robin"}),(0,a.jsx)(l.lM,{checked:"round-robin"===j,onChange:e=>{let t=e?"round-robin":null;v(t),e&&!N&&w("1"),S(t,e?N||"1":N)}}),"round-robin"===j&&(0,a.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,a.jsx)("span",{className:"text-xs text-text-muted",children:"Sticky:"}),(0,a.jsx)("input",{type:"number",min:1,value:N,onChange:e=>{w(e.target.value),S("round-robin",e.target.value)},className:"w-14 px-2 py-1 text-xs border border-border rounded-md bg-background focus:outline-none focus:border-primary"})]})]})]}),0===s.length?(0,a.jsxs)("div",{className:"flex items-center justify-between",children:[(0,a.jsx)("p",{className:"text-sm text-text-muted",children:"No connections yet"}),(0,a.jsx)(l.$n,{size:"sm",icon:"add",onClick:()=>p(!0),children:"Add Connection"})]}):(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("div",{className:"flex flex-col divide-y divide-black/[0.03] dark:divide-white/[0.03]",children:s.map((e,r)=>(0,a.jsx)(b,{connection:e,proxyPools:i,isOAuth:t,isFirst:0===r,isLast:r===s.length-1,onMoveUp:()=>C(r,r-1),onMoveDown:()=>C(r,r+1),onToggleActive:t=>P(e.id,t),onUpdateProxy:t=>T(e.id,t),onEdit:()=>{f(e),u(!0)},onDelete:()=>$(e.id)},e.id))}),(0,a.jsx)("div",{className:"mt-4",children:(0,a.jsx)(l.$n,{size:"sm",icon:"add",onClick:()=>p(!0),children:"Add"})})]})]}),(0,a.jsx)(g,{isOpen:x,provider:e,proxyPools:i,onSave:O,onClose:()=>p(!1)}),(0,a.jsx)(l.wI,{isOpen:m,connection:h,proxyPools:i,onSave:A,onClose:()=>u(!1)})]})}function f({model:e,fullModel:t,copied:s,onCopy:r,testStatus:i,isCustom:o,isFree:n,onDeleteAlias:l,onTest:d,isTesting:c}){let x="ok"===i?"#22c55e":"error"===i?"#ef4444":void 0;return(0,a.jsx)("div",{className:`group px-3 py-2 rounded-lg border ${"ok"===i?"border-green-500/40":"error"===i?"border-red-500/40":"border-border"} hover:bg-sidebar/50`,children:(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-base",style:x?{color:x}:void 0,children:"ok"===i?"check_circle":"error"===i?"cancel":"smart_toy"}),(0,a.jsxs)("div",{className:"flex flex-col gap-1",children:[(0,a.jsx)("code",{className:"text-xs text-text-muted font-mono bg-sidebar px-1.5 py-0.5 rounded",children:t}),e.name&&(0,a.jsx)("span",{className:"text-[9px] text-text-muted/70 italic pl-1",children:e.name})]}),d&&(0,a.jsxs)("div",{className:"relative group/btn",children:[(0,a.jsx)("button",{onClick:d,disabled:c,className:`p-0.5 hover:bg-sidebar rounded text-text-muted hover:text-primary transition-opacity ${c?"opacity-100":"opacity-0 group-hover:opacity-100"}`,children:(0,a.jsx)("span",{className:"material-symbols-outlined text-sm",style:c?{animation:"spin 1s linear infinite"}:void 0,children:c?"progress_activity":"science"})}),(0,a.jsx)("span",{className:"pointer-events-none absolute mt-1 top-5 left-1/2 -translate-x-1/2 text-[10px] text-text-muted whitespace-nowrap opacity-0 group-hover/btn:opacity-100 transition-opacity",children:c?"Testing...":"Test"})]}),(0,a.jsxs)("div",{className:"relative group/btn",children:[(0,a.jsx)("button",{onClick:()=>r(t,`model-${e.id}`),className:"p-0.5 hover:bg-sidebar rounded text-text-muted hover:text-primary",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-sm",children:s===`model-${e.id}`?"check":"content_copy"})}),(0,a.jsx)("span",{className:"pointer-events-none absolute mt-1 top-5 left-1/2 -translate-x-1/2 text-[10px] text-text-muted whitespace-nowrap opacity-0 group-hover/btn:opacity-100 transition-opacity",children:s===`model-${e.id}`?"Copied!":"Copy"})]}),n&&(0,a.jsx)("span",{className:"text-[10px] font-bold text-green-500 bg-green-500/10 px-1.5 py-0.5 rounded",children:"FREE"}),o&&(0,a.jsx)("button",{onClick:l,className:"p-0.5 hover:bg-red-500/10 rounded text-text-muted hover:text-red-500 opacity-0 group-hover:opacity-100 transition-opacity ml-auto",title:"Remove custom model",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-sm",children:"close"})})]})})}function j({isOpen:e,onSave:t,onClose:s}){let[r,i]=(0,n.useState)(""),o=()=>{r.trim()&&(t(r.trim()),i(""))};return(0,a.jsx)(l.aF,{isOpen:e,title:"Add Custom Model",onClose:s,children:(0,a.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("label",{className:"text-xs text-text-muted mb-1 block",children:"Model ID"}),(0,a.jsx)("input",{className:"w-full px-3 py-2 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary",value:r,onChange:e=>i(e.target.value),onKeyDown:e=>"Enter"===e.key&&o(),placeholder:"e.g. tts-1-hd",autoFocus:!0})]}),(0,a.jsxs)("div",{className:"flex gap-2",children:[(0,a.jsx)(l.$n,{onClick:o,fullWidth:!0,disabled:!r.trim(),children:"Add"}),(0,a.jsx)(l.$n,{onClick:s,variant:"ghost",fullWidth:!0,children:"Cancel"})]})]})})}function v({providerId:e,kindFilter:t}){let{copied:s,copy:r}=(0,p.C)(),[i,o]=(0,n.useState)({}),[d,m]=(0,n.useState)({}),[u,h]=(0,n.useState)(null),[b,g]=(0,n.useState)(""),[y,N]=(0,n.useState)(!1),[w,k]=(0,n.useState)([]),S=(0,c.wG)(e),C=(0,n.useCallback)(async()=>{try{let[t,s]=await Promise.all([fetch("/api/models/alias"),fetch("/api/providers",{cache:"no-store"})]),a=await t.json(),r=await s.json();t.ok&&o(a.aliases||{}),s.ok&&k((r.connections||[]).filter(t=>t.provider===e))}catch(e){console.log("ModelsCard fetch error:",e)}},[e]);(0,n.useEffect)(()=>{C()},[C]);let $=async(e,t)=>{let s=`${S}/${e}`;try{(await fetch("/api/models/alias",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:s,alias:t})})).ok&&await C()}catch(e){console.log("set alias error:",e)}},P=async e=>{try{(await fetch(`/api/models/alias?alias=${encodeURIComponent(e)}`,{method:"DELETE"})).ok&&await C()}catch(e){console.log("delete alias error:",e)}},T=async e=>{if(!u){h(e);try{let s=await fetch("/api/models/test",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:`${S}/${e}`,kind:t})}),a=await s.json();m(t=>({...t,[e]:a.ok?"ok":"error"})),g(a.ok?"":a.error||"Model not reachable")}catch{m(t=>({...t,[e]:"error"})),g("Network error")}finally{h(null)}}},O=(0,x.KC)(e),A=t?O.filter(e=>e.kinds?e.kinds.includes(t):e.type?e.type===t:"llm"===t):O,_=Object.entries(i).filter(([e,t])=>{let s=`${S}/`;if(!t.startsWith(s))return!1;let a=t.slice(s.length);return!A.some(e=>e.id===a)&&e===a}).map(([e,t])=>({id:t.slice(`${S}/`.length),alias:e}));return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(l.Zp,{children:[(0,a.jsx)("div",{className:"flex items-center justify-between mb-4",children:(0,a.jsxs)("h2",{className:"text-lg font-semibold",children:["Models",t?` — ${t.toUpperCase()}`:""]})}),b&&(0,a.jsx)("p",{className:"text-xs text-red-500 mb-3 break-words",children:b}),(0,a.jsxs)("div",{className:"flex flex-wrap gap-3",children:[A.map(e=>{let t=`${S}/${e.id}`,o=Object.entries(i).find(([,e])=>e===t)?.[0];return(0,a.jsx)(f,{model:e,fullModel:`${S}/${e.id}`,alias:o,copied:s,onCopy:r,onSetAlias:t=>$(e.id,t),onDeleteAlias:()=>P(o),testStatus:d[e.id],onTest:w.length>0?()=>T(e.id):void 0,isTesting:u===e.id,isFree:e.isFree},e.id)}),_.map(e=>(0,a.jsx)(f,{model:{id:e.id},fullModel:`${S}/${e.id}`,alias:e.alias,copied:s,onCopy:r,onSetAlias:()=>{},onDeleteAlias:()=>P(e.alias),testStatus:d[e.id],onTest:w.length>0?()=>T(e.id):void 0,isTesting:u===e.id,isCustom:!0},e.id)),(0,a.jsxs)("button",{onClick:()=>N(!0),className:"flex items-center gap-1.5 px-3 py-2 rounded-lg border border-dashed border-black/15 dark:border-white/15 text-xs text-text-muted hover:text-primary hover:border-primary/40 transition-colors",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-sm",children:"add"}),"Add Model"]})]})]}),(0,a.jsx)(j,{isOpen:y,onSave:async e=>{await $(e,e),N(!1)},onClose:()=>N(!1)})]})}h.propTypes={until:u().string.isRequired},b.propTypes={connection:u().shape({id:u().string,name:u().string,email:u().string,displayName:u().string,testStatus:u().string,isActive:u().bool,lastError:u().string,priority:u().number}).isRequired,proxyPools:u().array,isOAuth:u().bool.isRequired,isFirst:u().bool.isRequired,isLast:u().bool.isRequired,onMoveUp:u().func.isRequired,onMoveDown:u().func.isRequired,onToggleActive:u().func.isRequired,onUpdateProxy:u().func,onEdit:u().func.isRequired,onDelete:u().func.isRequired},g.propTypes={isOpen:u().bool.isRequired,provider:u().string,providerName:u().string,proxyPools:u().array,onSave:u().func.isRequired,onClose:u().func.isRequired},y.propTypes={providerId:u().string.isRequired,isOAuth:u().bool},f.propTypes={model:u().shape({id:u().string.isRequired}).isRequired,fullModel:u().string.isRequired,copied:u().string,onCopy:u().func.isRequired,testStatus:u().oneOf(["ok","error"]),isCustom:u().bool,isFree:u().bool,onDeleteAlias:u().func,onTest:u().func,isTesting:u().bool},j.propTypes={isOpen:u().bool.isRequired,onSave:u().func.isRequired,onClose:u().func.isRequired},v.propTypes={providerId:u().string.isRequired,kindFilter:u().string};let N={"google-tts":{hasLanguageDropdown:!1,hasModelSelector:!1,hasBrowseButton:!0,voiceSource:"hardcoded"},openai:{hasLanguageDropdown:!1,hasModelSelector:!0,hasBrowseButton:!1,voiceSource:"hardcoded",modelKey:"openai-tts-models",voiceKey:"openai-tts-voices"},elevenlabs:{hasLanguageDropdown:!1,hasModelSelector:!0,hasBrowseButton:!0,hasVoiceIdInput:!0,voiceSource:"api-language",modelKey:"elevenlabs-tts-models",apiEndpoint:"/api/media-providers/tts/elevenlabs/voices"},"edge-tts":{hasLanguageDropdown:!1,hasModelSelector:!1,hasBrowseButton:!0,voiceSource:"api-language"},"local-device":{hasLanguageDropdown:!1,hasModelSelector:!1,hasBrowseButton:!0,voiceSource:"api-language"}};function w({label:e,children:t}){return(0,a.jsxs)("div",{className:"flex items-center gap-3",children:[(0,a.jsx)("span",{className:"text-xs text-text-muted w-20 shrink-0",children:e}),(0,a.jsx)("div",{className:"flex-1",children:t})]})}let k=`// Audio will appear here after running.
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[182],{1943:(e,t,s)=>{Promise.resolve().then(s.bind(s,94588))},94588:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>R});var a=s(95155),r=s(73321),o=s(98500),i=s.n(o),n=s(12115),l=s(35497),d=s(57250),c=s(52679),x=s(28777),p=s(11059),m=s(14051),u=s.n(m);function h({until:e}){let[t,s]=(0,n.useState)("");return((0,n.useEffect)(()=>{let t=()=>{let t=new Date(e).getTime()-Date.now();if(t<=0)return void s("");let a=Math.floor(t/1e3);a<60?s(`${a}s`):a<3600?s(`${Math.floor(a/60)}m ${a%60}s`):s(`${Math.floor(a/3600)}h ${Math.floor(a%3600/60)}m`)};t();let a=setInterval(t,1e3);return()=>clearInterval(a)},[e]),t)?(0,a.jsxs)("span",{className:"text-xs text-orange-500 font-mono",children:["⏱ ",t]}):null}function b({connection:e,proxyPools:t,isOAuth:s,isFirst:r,isLast:o,onMoveUp:i,onMoveDown:d,onToggleActive:c,onUpdateProxy:x,onEdit:p,onDelete:m}){let[u,y]=(0,n.useState)(!1),[g,f]=(0,n.useState)(!1),[j,v]=(0,n.useState)(!1),N=(0,n.useRef)(null),w=new Map((t||[]).map(e=>[e.id,e])),k=e.providerSpecificData?.proxyPoolId||null,S=k?w.get(k):null,C=e.providerSpecificData?.connectionProxyEnabled===!0&&!!e.providerSpecificData?.connectionProxyUrl,$=!!k||C,P=S?`Pool: ${S.name}`:k?`Pool: ${k} (inactive/missing)`:C?`Legacy: ${e.providerSpecificData?.connectionProxyUrl}`:"",T="",A=S?.proxyUrl||e.providerSpecificData?.connectionProxyUrl;if(A)try{let e=new URL(A);T=`${e.protocol}//${e.hostname}${e.port?`:${e.port}`:""}`}catch{T=A}let R=S?.noProxy||e.providerSpecificData?.connectionNoProxy||"",O=S?.isActive===!0?"success":k||C?"error":"default",_=Object.entries(e).filter(([e])=>e.startsWith("modelLock_")).map(([,e])=>e).filter(Boolean).sort()[0]||null;(0,n.useEffect)(()=>{let t=()=>{v(!!Object.entries(e).filter(([e])=>e.startsWith("modelLock_")).map(([,e])=>e).filter(e=>e&&new Date(e).getTime()>Date.now()).sort()[0])};t();let s=_?setInterval(t,1e3):null;return()=>{s&&clearInterval(s)}},[_]),(0,n.useEffect)(()=>{if(!u)return;let e=e=>{N.current&&!N.current.contains(e.target)&&y(!1)};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[u]);let I="unavailable"!==e.testStatus||j?e.testStatus:"active",K=s?e.name||e.email||e.displayName||"OAuth Account":e.name,E=async e=>{f(!0);try{await x("__none__"===e?null:e)}finally{f(!1),y(!1)}};return(0,a.jsxs)("div",{className:`group flex items-center justify-between p2 rounded-lg hover:bg-black/[0.02] dark:hover:bg-white/[0.02] transition-colors ${!1===e.isActive?"opacity-60":""}`,children:[(0,a.jsxs)("div",{className:"flex items-center gap-3 flex-1 min-w-0",children:[(0,a.jsxs)("div",{className:"flex flex-col",children:[(0,a.jsx)("button",{onClick:i,disabled:r,className:`p-0.5 rounded ${r?"text-text-muted/30 cursor-not-allowed":"hover:bg-sidebar text-text-muted hover:text-primary"}`,children:(0,a.jsx)("span",{className:"material-symbols-outlined text-sm",children:"keyboard_arrow_up"})}),(0,a.jsx)("button",{onClick:d,disabled:o,className:`p-0.5 rounded ${o?"text-text-muted/30 cursor-not-allowed":"hover:bg-sidebar text-text-muted hover:text-primary"}`,children:(0,a.jsx)("span",{className:"material-symbols-outlined text-sm",children:"keyboard_arrow_down"})})]}),(0,a.jsx)("span",{className:"material-symbols-outlined text-base text-text-muted",children:s?"lock":"key"}),(0,a.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,a.jsx)("p",{className:"text-sm font-medium truncate",children:K}),(0,a.jsxs)("div",{className:"flex items-center gap-2 mt-1 flex-wrap",children:[(0,a.jsx)(l.Ex,{variant:!1===e.isActive?"default":"active"===I||"success"===I?"success":"error"===I||"expired"===I||"unavailable"===I?"error":"default",size:"sm",dot:!0,children:!1===e.isActive?"disabled":I||"Unknown"}),$&&(0,a.jsx)(l.Ex,{variant:O,size:"sm",children:"Proxy"}),j&&!1!==e.isActive&&(0,a.jsx)(h,{until:_}),e.lastError&&!1!==e.isActive&&(0,a.jsx)("span",{className:"text-xs text-red-500 truncate max-w-[300px]",title:e.lastError,children:e.lastError}),(0,a.jsxs)("span",{className:"text-xs text-text-muted",children:["#",e.priority]})]}),$&&(0,a.jsxs)("div",{className:"mt-1 flex items-center gap-2 flex-wrap",children:[(0,a.jsx)("span",{className:"text-[11px] text-text-muted truncate max-w-[420px]",title:P,children:P}),T&&(0,a.jsx)("code",{className:"text-[10px] font-mono bg-black/5 dark:bg-white/5 px-1 py-0.5 rounded text-text-muted",children:T}),R&&(0,a.jsxs)("span",{className:"text-[11px] text-text-muted truncate max-w-[320px]",title:R,children:["no_proxy: ",R]})]})]})]}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsxs)("div",{className:"flex gap-1",children:[(t||[]).length>0&&(0,a.jsxs)("div",{className:"relative",ref:N,children:[(0,a.jsxs)("button",{onClick:()=>y(e=>!e),className:`flex flex-col items-center px-2 py-1 rounded hover:bg-black/5 dark:hover:bg-white/5 transition-colors ${$?"text-primary":"text-text-muted hover:text-primary"}`,disabled:g,children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:g?"progress_activity":"lan"}),(0,a.jsx)("span",{className:"text-[10px] leading-tight",children:"Proxy"})]}),u&&(0,a.jsxs)("div",{className:"absolute right-0 top-full mt-1 z-50 bg-bg border border-border rounded-lg shadow-lg py-1 min-w-[160px]",children:[(0,a.jsx)("button",{onClick:()=>E("__none__"),className:`w-full text-left px-3 py-1.5 text-sm hover:bg-black/5 dark:hover:bg-white/5 ${!k?"text-primary font-medium":"text-text-main"}`,children:"None"}),(t||[]).map(e=>(0,a.jsx)("button",{onClick:()=>E(e.id),className:`w-full text-left px-3 py-1.5 text-sm hover:bg-black/5 dark:hover:bg-white/5 ${k===e.id?"text-primary font-medium":"text-text-main"}`,children:e.name},e.id))]})]}),(0,a.jsxs)("button",{onClick:p,className:"flex flex-col items-center px-2 py-1 rounded hover:bg-black/5 dark:hover:bg-white/5 text-text-muted hover:text-primary",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"edit"}),(0,a.jsx)("span",{className:"text-[10px] leading-tight",children:"Edit"})]}),(0,a.jsxs)("button",{onClick:m,className:"flex flex-col items-center px-2 py-1 rounded hover:bg-red-500/10 text-red-500",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"delete"}),(0,a.jsx)("span",{className:"text-[10px] leading-tight",children:"Delete"})]})]}),(0,a.jsx)(l.lM,{size:"sm",checked:e.isActive??!0,onChange:c,title:e.isActive??!0?"Disable":"Enable"})]})]})}function y({isOpen:e,provider:t,providerName:s,proxyPools:r,onSave:o,onClose:i}){let d="__none__",[c,x]=(0,n.useState)({name:"",apiKey:"",priority:1,proxyPoolId:d}),[p,m]=(0,n.useState)(!1),[u,h]=(0,n.useState)(null),[b,g]=(0,n.useState)(!1),f=async()=>{m(!0);try{let e=await fetch("/api/providers/validate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:t,apiKey:c.apiKey})}),s=await e.json();h(s.valid?"success":"failed")}catch{h("failed")}finally{m(!1)}},j=async()=>{if(t&&c.apiKey){g(!0);try{let e=!1;try{m(!0),h(null);let s=await fetch("/api/providers/validate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:t,apiKey:c.apiKey})});e=!!(await s.json()).valid,h(e?"success":"failed")}catch{h("failed")}finally{m(!1)}await o({name:c.name,apiKey:c.apiKey,priority:c.priority,proxyPoolId:c.proxyPoolId===d?null:c.proxyPoolId,testStatus:e?"active":"unknown"})}finally{g(!1)}}};return t?(0,a.jsx)(l.aF,{isOpen:e,title:`Add ${s||t} API Key`,onClose:i,children:(0,a.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("label",{className:"text-xs text-text-muted mb-1 block",children:"Name"}),(0,a.jsx)("input",{className:"w-full px-3 py-2 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary",value:c.name,onChange:e=>x({...c,name:e.target.value}),placeholder:"Production Key"})]}),(0,a.jsxs)("div",{className:"flex gap-2",children:[(0,a.jsxs)("div",{className:"flex-1",children:[(0,a.jsx)("label",{className:"text-xs text-text-muted mb-1 block",children:"API Key"}),(0,a.jsx)("input",{type:"password",className:"w-full px-3 py-2 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary",value:c.apiKey,onChange:e=>x({...c,apiKey:e.target.value})})]}),(0,a.jsx)("div",{className:"pt-6",children:(0,a.jsx)(l.$n,{onClick:f,disabled:!c.apiKey||p||b,variant:"secondary",children:p?"Checking...":"Check"})})]}),u&&(0,a.jsx)(l.Ex,{variant:"success"===u?"success":"error",children:"success"===u?"Valid":"Invalid"}),(0,a.jsxs)("div",{children:[(0,a.jsx)("label",{className:"text-xs text-text-muted mb-1 block",children:"Priority"}),(0,a.jsx)("input",{type:"number",className:"w-full px-3 py-2 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary",value:c.priority,onChange:e=>x({...c,priority:Number.parseInt(e.target.value)||1})})]}),(0,a.jsx)(l.l6,{label:"Proxy Pool",value:c.proxyPoolId,onChange:e=>x({...c,proxyPoolId:e.target.value}),options:[{value:d,label:"None"},...(r||[]).map(e=>({value:e.id,label:e.name}))]}),(0,a.jsxs)("div",{className:"flex gap-2",children:[(0,a.jsx)(l.$n,{onClick:j,fullWidth:!0,disabled:!c.name||!c.apiKey||b,children:b?"Saving...":"Save"}),(0,a.jsx)(l.$n,{onClick:i,variant:"ghost",fullWidth:!0,children:"Cancel"})]})]})}):null}function g({providerId:e,isOAuth:t}){let[s,r]=(0,n.useState)([]),[o,i]=(0,n.useState)([]),[d,c]=(0,n.useState)(!0),[x,p]=(0,n.useState)(!1),[m,u]=(0,n.useState)(!1),[h,f]=(0,n.useState)(null),[j,v]=(0,n.useState)(null),[N,w]=(0,n.useState)("1"),k=(0,n.useCallback)(async()=>{try{let[t,s,a]=await Promise.all([fetch("/api/providers",{cache:"no-store"}),fetch("/api/proxy-pools?isActive=true",{cache:"no-store"}),fetch("/api/settings",{cache:"no-store"})]),o=await t.json(),n=await s.json(),l=a.ok?await a.json():{};t.ok&&r((o.connections||[]).filter(t=>t.provider===e)),s.ok&&i(n.proxyPools||[]);let d=(l.providerStrategies||{})[e]||{};v(d.fallbackStrategy||null),w(null!=d.stickyRoundRobinLimit?String(d.stickyRoundRobinLimit):"1")}catch(e){console.log("ConnectionsCard fetch error:",e)}finally{c(!1)}},[e]);(0,n.useEffect)(()=>{k()},[k]);let S=async(t,s)=>{try{let a=await fetch("/api/settings",{cache:"no-store"}),r=(a.ok?await a.json():{}).providerStrategies||{},o={};t&&(o.fallbackStrategy=t),"round-robin"===t&&""!==s&&(o.stickyRoundRobinLimit=Number(s)||3);let i={...r};0===Object.keys(o).length?delete i[e]:i[e]=o,await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({providerStrategies:i})})}catch(e){console.log("saveStrategy error:",e)}},C=async(e,t)=>{let a=[...s];[a[e],a[t]]=[a[t],a[e]],r(a);try{await Promise.all([fetch(`/api/providers/${a[e].id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({priority:e})}),fetch(`/api/providers/${a[t].id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({priority:t})})])}catch{await k()}},$=async e=>{if(confirm("Delete this connection?"))try{(await fetch(`/api/providers/${e}`,{method:"DELETE"})).ok&&r(t=>t.filter(t=>t.id!==e))}catch(e){console.log("delete error:",e)}},P=async(e,t)=>{try{(await fetch(`/api/providers/${e}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({isActive:t})})).ok&&r(s=>s.map(s=>s.id===e?{...s,isActive:t}:s))}catch(e){console.log("toggle error:",e)}},T=async(e,t)=>{try{(await fetch(`/api/providers/${e}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({proxyPoolId:t||null})})).ok&&r(s=>s.map(s=>s.id===e?{...s,providerSpecificData:{...s.providerSpecificData,proxyPoolId:t||null}}:s))}catch(e){console.log("proxy error:",e)}},A=async t=>{try{(await fetch("/api/providers",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:e,...t})})).ok&&(await k(),p(!1))}catch(e){console.log("save apikey error:",e)}},R=async e=>{try{(await fetch(`/api/providers/${h.id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})).ok&&(await k(),u(!1))}catch(e){console.log("update connection error:",e)}};return d?(0,a.jsx)(l.Zp,{children:(0,a.jsx)("div",{className:"h-20 animate-pulse bg-black/5 rounded-lg"})}):(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(l.Zp,{children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,a.jsx)("h2",{className:"text-lg font-semibold",children:"Connections"}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("span",{className:"text-xs text-text-muted font-medium",children:"Round Robin"}),(0,a.jsx)(l.lM,{checked:"round-robin"===j,onChange:e=>{let t=e?"round-robin":null;v(t),e&&!N&&w("1"),S(t,e?N||"1":N)}}),"round-robin"===j&&(0,a.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,a.jsx)("span",{className:"text-xs text-text-muted",children:"Sticky:"}),(0,a.jsx)("input",{type:"number",min:1,value:N,onChange:e=>{w(e.target.value),S("round-robin",e.target.value)},className:"w-14 px-2 py-1 text-xs border border-border rounded-md bg-background focus:outline-none focus:border-primary"})]})]})]}),0===s.length?(0,a.jsxs)("div",{className:"flex items-center justify-between",children:[(0,a.jsx)("p",{className:"text-sm text-text-muted",children:"No connections yet"}),(0,a.jsx)(l.$n,{size:"sm",icon:"add",onClick:()=>p(!0),children:"Add Connection"})]}):(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("div",{className:"flex flex-col divide-y divide-black/[0.03] dark:divide-white/[0.03]",children:s.map((e,r)=>(0,a.jsx)(b,{connection:e,proxyPools:o,isOAuth:t,isFirst:0===r,isLast:r===s.length-1,onMoveUp:()=>C(r,r-1),onMoveDown:()=>C(r,r+1),onToggleActive:t=>P(e.id,t),onUpdateProxy:t=>T(e.id,t),onEdit:()=>{f(e),u(!0)},onDelete:()=>$(e.id)},e.id))}),(0,a.jsx)("div",{className:"mt-4",children:(0,a.jsx)(l.$n,{size:"sm",icon:"add",onClick:()=>p(!0),children:"Add"})})]})]}),(0,a.jsx)(y,{isOpen:x,provider:e,proxyPools:o,onSave:A,onClose:()=>p(!1)}),(0,a.jsx)(l.wI,{isOpen:m,connection:h,proxyPools:o,onSave:R,onClose:()=>u(!1)})]})}function f({model:e,fullModel:t,copied:s,onCopy:r,testStatus:o,isCustom:i,isFree:n,onDeleteAlias:l,onTest:d,isTesting:c}){let x="ok"===o?"#22c55e":"error"===o?"#ef4444":void 0;return(0,a.jsx)("div",{className:`group px-3 py-2 rounded-lg border ${"ok"===o?"border-green-500/40":"error"===o?"border-red-500/40":"border-border"} hover:bg-sidebar/50`,children:(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-base",style:x?{color:x}:void 0,children:"ok"===o?"check_circle":"error"===o?"cancel":"smart_toy"}),(0,a.jsxs)("div",{className:"flex flex-col gap-1",children:[(0,a.jsx)("code",{className:"text-xs text-text-muted font-mono bg-sidebar px-1.5 py-0.5 rounded",children:t}),e.name&&(0,a.jsx)("span",{className:"text-[9px] text-text-muted/70 italic pl-1",children:e.name})]}),d&&(0,a.jsxs)("div",{className:"relative group/btn",children:[(0,a.jsx)("button",{onClick:d,disabled:c,className:`p-0.5 hover:bg-sidebar rounded text-text-muted hover:text-primary transition-opacity ${c?"opacity-100":"opacity-0 group-hover:opacity-100"}`,children:(0,a.jsx)("span",{className:"material-symbols-outlined text-sm",style:c?{animation:"spin 1s linear infinite"}:void 0,children:c?"progress_activity":"science"})}),(0,a.jsx)("span",{className:"pointer-events-none absolute mt-1 top-5 left-1/2 -translate-x-1/2 text-[10px] text-text-muted whitespace-nowrap opacity-0 group-hover/btn:opacity-100 transition-opacity",children:c?"Testing...":"Test"})]}),(0,a.jsxs)("div",{className:"relative group/btn",children:[(0,a.jsx)("button",{onClick:()=>r(t,`model-${e.id}`),className:"p-0.5 hover:bg-sidebar rounded text-text-muted hover:text-primary",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-sm",children:s===`model-${e.id}`?"check":"content_copy"})}),(0,a.jsx)("span",{className:"pointer-events-none absolute mt-1 top-5 left-1/2 -translate-x-1/2 text-[10px] text-text-muted whitespace-nowrap opacity-0 group-hover/btn:opacity-100 transition-opacity",children:s===`model-${e.id}`?"Copied!":"Copy"})]}),n&&(0,a.jsx)("span",{className:"text-[10px] font-bold text-green-500 bg-green-500/10 px-1.5 py-0.5 rounded",children:"FREE"}),i&&(0,a.jsx)("button",{onClick:l,className:"p-0.5 hover:bg-red-500/10 rounded text-text-muted hover:text-red-500 opacity-0 group-hover:opacity-100 transition-opacity ml-auto",title:"Remove custom model",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-sm",children:"close"})})]})})}function j({isOpen:e,onSave:t,onClose:s}){let[r,o]=(0,n.useState)(""),i=()=>{r.trim()&&(t(r.trim()),o(""))};return(0,a.jsx)(l.aF,{isOpen:e,title:"Add Custom Model",onClose:s,children:(0,a.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("label",{className:"text-xs text-text-muted mb-1 block",children:"Model ID"}),(0,a.jsx)("input",{className:"w-full px-3 py-2 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary",value:r,onChange:e=>o(e.target.value),onKeyDown:e=>"Enter"===e.key&&i(),placeholder:"e.g. tts-1-hd",autoFocus:!0})]}),(0,a.jsxs)("div",{className:"flex gap-2",children:[(0,a.jsx)(l.$n,{onClick:i,fullWidth:!0,disabled:!r.trim(),children:"Add"}),(0,a.jsx)(l.$n,{onClick:s,variant:"ghost",fullWidth:!0,children:"Cancel"})]})]})})}function v({providerId:e,kindFilter:t}){let{copied:s,copy:r}=(0,p.C)(),[o,i]=(0,n.useState)({}),[d,m]=(0,n.useState)({}),[u,h]=(0,n.useState)(null),[b,y]=(0,n.useState)(""),[g,N]=(0,n.useState)(!1),[w,k]=(0,n.useState)([]),S=(0,c.wG)(e),C=(0,n.useCallback)(async()=>{try{let[t,s]=await Promise.all([fetch("/api/models/alias"),fetch("/api/providers",{cache:"no-store"})]),a=await t.json(),r=await s.json();t.ok&&i(a.aliases||{}),s.ok&&k((r.connections||[]).filter(t=>t.provider===e))}catch(e){console.log("ModelsCard fetch error:",e)}},[e]);(0,n.useEffect)(()=>{C()},[C]);let $=async(e,t)=>{let s=`${S}/${e}`;try{(await fetch("/api/models/alias",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:s,alias:t})})).ok&&await C()}catch(e){console.log("set alias error:",e)}},P=async e=>{try{(await fetch(`/api/models/alias?alias=${encodeURIComponent(e)}`,{method:"DELETE"})).ok&&await C()}catch(e){console.log("delete alias error:",e)}},T=async e=>{if(!u){h(e);try{let s=await fetch("/api/models/test",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:`${S}/${e}`,kind:t})}),a=await s.json();m(t=>({...t,[e]:a.ok?"ok":"error"})),y(a.ok?"":a.error||"Model not reachable")}catch{m(t=>({...t,[e]:"error"})),y("Network error")}finally{h(null)}}},A=(0,x.KC)(e),R=t?A.filter(e=>e.kinds?e.kinds.includes(t):e.type?e.type===t:"llm"===t):A,O=Object.entries(o).filter(([e,t])=>{let s=`${S}/`;if(!t.startsWith(s))return!1;let a=t.slice(s.length);return!R.some(e=>e.id===a)&&e===a}).map(([e,t])=>({id:t.slice(`${S}/`.length),alias:e}));return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(l.Zp,{children:[(0,a.jsx)("div",{className:"flex items-center justify-between mb-4",children:(0,a.jsxs)("h2",{className:"text-lg font-semibold",children:["Models",t?` — ${t.toUpperCase()}`:""]})}),b&&(0,a.jsx)("p",{className:"text-xs text-red-500 mb-3 break-words",children:b}),(0,a.jsxs)("div",{className:"flex flex-wrap gap-3",children:[R.map(e=>{let t=`${S}/${e.id}`,i=Object.entries(o).find(([,e])=>e===t)?.[0];return(0,a.jsx)(f,{model:e,fullModel:`${S}/${e.id}`,alias:i,copied:s,onCopy:r,onSetAlias:t=>$(e.id,t),onDeleteAlias:()=>P(i),testStatus:d[e.id],onTest:w.length>0?()=>T(e.id):void 0,isTesting:u===e.id,isFree:e.isFree},e.id)}),O.map(e=>(0,a.jsx)(f,{model:{id:e.id},fullModel:`${S}/${e.id}`,alias:e.alias,copied:s,onCopy:r,onSetAlias:()=>{},onDeleteAlias:()=>P(e.alias),testStatus:d[e.id],onTest:w.length>0?()=>T(e.id):void 0,isTesting:u===e.id,isCustom:!0},e.id)),(0,a.jsxs)("button",{onClick:()=>N(!0),className:"flex items-center gap-1.5 px-3 py-2 rounded-lg border border-dashed border-black/15 dark:border-white/15 text-xs text-text-muted hover:text-primary hover:border-primary/40 transition-colors",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-sm",children:"add"}),"Add Model"]})]})]}),(0,a.jsx)(j,{isOpen:g,onSave:async e=>{await $(e,e),N(!1)},onClose:()=>N(!1)})]})}h.propTypes={until:u().string.isRequired},b.propTypes={connection:u().shape({id:u().string,name:u().string,email:u().string,displayName:u().string,testStatus:u().string,isActive:u().bool,lastError:u().string,priority:u().number}).isRequired,proxyPools:u().array,isOAuth:u().bool.isRequired,isFirst:u().bool.isRequired,isLast:u().bool.isRequired,onMoveUp:u().func.isRequired,onMoveDown:u().func.isRequired,onToggleActive:u().func.isRequired,onUpdateProxy:u().func,onEdit:u().func.isRequired,onDelete:u().func.isRequired},y.propTypes={isOpen:u().bool.isRequired,provider:u().string,providerName:u().string,proxyPools:u().array,onSave:u().func.isRequired,onClose:u().func.isRequired},g.propTypes={providerId:u().string.isRequired,isOAuth:u().bool},f.propTypes={model:u().shape({id:u().string.isRequired}).isRequired,fullModel:u().string.isRequired,copied:u().string,onCopy:u().func.isRequired,testStatus:u().oneOf(["ok","error"]),isCustom:u().bool,isFree:u().bool,onDeleteAlias:u().func,onTest:u().func,isTesting:u().bool},j.propTypes={isOpen:u().bool.isRequired,onSave:u().func.isRequired,onClose:u().func.isRequired},v.propTypes={providerId:u().string.isRequired,kindFilter:u().string};let N={"google-tts":{hasLanguageDropdown:!1,hasModelSelector:!1,hasBrowseButton:!0,voiceSource:"hardcoded"},openai:{hasLanguageDropdown:!1,hasModelSelector:!0,hasBrowseButton:!1,voiceSource:"hardcoded",modelKey:"openai-tts-models",voiceKey:"openai-tts-voices",voicesPerModel:!0},openrouter:{hasLanguageDropdown:!1,hasModelSelector:!0,hasBrowseButton:!1,voiceSource:"hardcoded",modelKey:"openrouter-tts-models",voiceKey:"openrouter-tts-voices",voicesPerModel:!0},elevenlabs:{hasLanguageDropdown:!1,hasModelSelector:!0,hasBrowseButton:!0,hasVoiceIdInput:!0,voiceSource:"api-language",modelKey:"elevenlabs-tts-models",apiEndpoint:"/api/media-providers/tts/elevenlabs/voices"},"edge-tts":{hasLanguageDropdown:!1,hasModelSelector:!1,hasBrowseButton:!0,voiceSource:"api-language"},"local-device":{hasLanguageDropdown:!1,hasModelSelector:!1,hasBrowseButton:!0,voiceSource:"api-language"}};var w=s(33079);function k({label:e,children:t}){return(0,a.jsxs)("div",{className:"flex items-center gap-3",children:[(0,a.jsx)("span",{className:"text-xs text-text-muted w-20 shrink-0",children:e}),(0,a.jsx)("div",{className:"flex-1",children:t})]})}let S=`// Audio will appear here after running.
2
2
  // Example JSON response (response_format=json):
3
3
  {
4
4
  "format": "mp3",
5
5
  "audio": "//NExAANaAIIAUAAANNNNNNNN..." // base64 encoded MP3
6
- }`,S=`{
6
+ }`,C=`{
7
7
  "object": "list",
8
8
  "data": [{
9
9
  "object": "embedding",
@@ -12,11 +12,40 @@
12
12
  }],
13
13
  "model": "...",
14
14
  "usage": { "prompt_tokens": 9, "total_tokens": 9 }
15
- }`;function C({providerId:e}){let t=(0,c.wG)(e),s=(0,x.KC)(e).filter(e=>"embedding"===e.type),[r,i]=(0,n.useState)(s[0]?.id??""),[o,d]=(0,n.useState)("The quick brown fox jumps over the lazy dog"),[m,u]=(0,n.useState)(""),[h,b]=(0,n.useState)(!1),[g,y]=(0,n.useState)(""),[f,j]=(0,n.useState)(""),[v,N]=(0,n.useState)(null),[k,$]=(0,n.useState)(!1),[P,T]=(0,n.useState)(""),{copied:O,copy:A}=(0,p.C)(),{copied:_,copy:R}=(0,p.C)();(0,n.useEffect)(()=>{y(window.location.origin),fetch("/api/keys").then(e=>e.json()).then(e=>{u((e.keys||[]).find(e=>!1!==e.isActive)?.key||"")}).catch(()=>{}),fetch("/api/tunnel/status").then(e=>e.json()).then(e=>{e.publicUrl&&j(e.publicUrl)}).catch(()=>{})},[]);let E=h?f:g,I=r?`${t}/${r}`:"",D=`curl -X POST ${E}/v1/embeddings \\
15
+ }`,$={webSearch:{inputLabel:"Query",inputPlaceholder:"What is the latest news about AI?",defaultInput:"What is the latest news about AI?",bodyKey:"query",defaultResponse:`{
16
+ "results": [
17
+ { "title": "...", "url": "...", "snippet": "..." }
18
+ ]
19
+ }`},webFetch:{inputLabel:"URL",inputPlaceholder:"https://example.com",defaultInput:"https://example.com",bodyKey:"url",defaultResponse:`{
20
+ "content": "...",
21
+ "title": "...",
22
+ "url": "..."
23
+ }`},image:{inputLabel:"Prompt",inputPlaceholder:"A cute cat wearing a hat",defaultInput:"A cute cat wearing a hat",bodyKey:"prompt",defaultResponse:`{
24
+ "data": [
25
+ { "url": "...", "b64_json": "..." }
26
+ ]
27
+ }`},imageToText:{inputLabel:"Image URL",inputPlaceholder:"https://example.com/image.png",defaultInput:"https://upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Cat03.jpg/1200px-Cat03.jpg",bodyKey:"url",extraBody:{prompt:"Describe this image in detail"},defaultResponse:`{
28
+ "text": "A cat sitting on a windowsill...",
29
+ "model": "..."
30
+ }`},stt:{inputLabel:"Audio URL",inputPlaceholder:"https://example.com/audio.mp3",defaultInput:"",bodyKey:"url",defaultResponse:`{
31
+ "text": "Hello world...",
32
+ "model": "..."
33
+ }`},video:{inputLabel:"Prompt",inputPlaceholder:"A serene lake at sunset",defaultInput:"A serene lake at sunset",bodyKey:"prompt",defaultResponse:`{
34
+ "data": [
35
+ { "url": "..." }
36
+ ]
37
+ }`},music:{inputLabel:"Prompt",inputPlaceholder:"A calm piano melody",defaultInput:"A calm piano melody",bodyKey:"prompt",defaultResponse:`{
38
+ "data": [
39
+ { "url": "...", "format": "mp3" }
40
+ ]
41
+ }`}};function P({providerId:e}){let t=(0,c.wG)(e),s=(0,x.KC)(e).filter(e=>"embedding"===e.type),[r,o]=(0,n.useState)(s[0]?.id??""),[i,d]=(0,n.useState)("The quick brown fox jumps over the lazy dog"),[m,u]=(0,n.useState)(""),[h,b]=(0,n.useState)(!1),[y,g]=(0,n.useState)(""),[f,j]=(0,n.useState)(""),[v,N]=(0,n.useState)(null),[w,S]=(0,n.useState)(!1),[$,T]=(0,n.useState)(""),{copied:A,copy:R}=(0,p.C)(),{copied:O,copy:_}=(0,p.C)();(0,n.useEffect)(()=>{g(window.location.origin),fetch("/api/keys").then(e=>e.json()).then(e=>{u((e.keys||[]).find(e=>!1!==e.isActive)?.key||"")}).catch(()=>{}),fetch("/api/tunnel/status").then(e=>e.json()).then(e=>{e.publicUrl&&j(e.publicUrl)}).catch(()=>{})},[]);let I=h?f:y,K=r?`${t}/${r}`:"",E=`curl -X POST ${I}/v1/embeddings \\
16
42
  -H "Content-Type: application/json" \\
17
43
  -H "Authorization: Bearer ${m||"YOUR_KEY"}" \\
18
- -d '{"model": "${I}", "input": "${o}"}'`,K=async()=>{if(!o.trim()||!I)return;$(!0),T(""),N(null);let e=Date.now();try{let t={"Content-Type":"application/json"};m&&(t.Authorization=`Bearer ${m}`);let s=await fetch("/api/v1/embeddings",{method:"POST",headers:t,body:JSON.stringify({model:I,input:o.trim()})}),a=Date.now()-e,r=await s.json();if(!s.ok)return void T(r?.error?.message||r?.error||`HTTP ${s.status}`);N({data:r,latencyMs:a})}catch(e){T(e.message||"Network error")}finally{$(!1)}},U=v?JSON.stringify(v.data,null,2):"";return(0,a.jsxs)(l.Zp,{children:[(0,a.jsx)("h2",{className:"text-lg font-semibold mb-4",children:"Example"}),(0,a.jsxs)("div",{className:"flex flex-col gap-2.5",children:[(0,a.jsx)(w,{label:"Model",children:(0,a.jsx)("select",{value:r,onChange:e=>i(e.target.value),className:"w-full px-3 py-1.5 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary",children:s.map(e=>(0,a.jsx)("option",{value:e.id,children:e.name||e.id},e.id))})}),(0,a.jsx)(w,{label:"Endpoint",children:(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("input",{value:E,onChange:e=>h?j(e.target.value):y(e.target.value),className:"flex-1 px-3 py-1.5 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary font-mono",placeholder:"http://localhost:3000"}),f&&(0,a.jsxs)("button",{onClick:()=>b(e=>!e),title:h?"Using tunnel":"Using local",className:`flex items-center gap-1 text-xs px-2 py-1.5 rounded-lg border shrink-0 transition-colors ${h?"border-primary/40 bg-primary/10 text-primary":"border-border text-text-muted hover:text-primary"}`,children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"wifi_tethering"}),"Tunnel"]})]})}),(0,a.jsx)(w,{label:"API Key",children:(0,a.jsx)("input",{type:"password",value:m,onChange:e=>u(e.target.value),placeholder:"sk-...",className:"w-full px-3 py-1.5 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary font-mono"})}),(0,a.jsx)(w,{label:"Input",children:(0,a.jsxs)("div",{className:"relative",children:[(0,a.jsx)("input",{value:o,onChange:e=>d(e.target.value),className:"w-full px-3 py-1.5 pr-7 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary"}),o&&(0,a.jsx)("button",{type:"button",onClick:()=>d(""),className:"absolute right-2 top-1/2 -translate-y-1/2 text-text-muted hover:text-primary transition-colors",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"close"})})]})}),(0,a.jsxs)("div",{className:"mt-1",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-1.5",children:[(0,a.jsx)("span",{className:"text-xs font-semibold text-text-muted uppercase tracking-wider",children:"Request"}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsxs)("button",{onClick:()=>A(D),className:"flex items-center gap-1 text-xs text-text-muted hover:text-primary transition-colors",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:O?"check":"content_copy"}),O?"Copied":"Copy"]}),(0,a.jsxs)("button",{onClick:K,disabled:k||!o.trim()||!I,className:"flex items-center gap-1.5 px-3 py-1 rounded-lg bg-primary text-white text-xs font-medium hover:bg-primary/90 transition-colors disabled:opacity-50 disabled:cursor-not-allowed",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",style:k?{animation:"spin 1s linear infinite"}:void 0,children:k?"progress_activity":"play_arrow"}),k?"Running...":"Run"]})]})]}),(0,a.jsx)("pre",{className:"bg-sidebar rounded-lg px-3 py-2.5 text-xs font-mono text-text-main overflow-x-auto whitespace-pre",children:D})]}),P&&(0,a.jsx)("p",{className:"text-xs text-red-500 break-words",children:P}),(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-1.5",children:[(0,a.jsxs)("span",{className:"text-xs font-semibold text-text-muted uppercase tracking-wider",children:["Response ",v&&(0,a.jsxs)("span",{className:"font-normal normal-case",children:["⚡ ",v.latencyMs,"ms"]})]}),v&&(0,a.jsxs)("button",{onClick:()=>R(U),className:"flex items-center gap-1 text-xs text-text-muted hover:text-primary transition-colors",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:_?"check":"content_copy"}),_?"Copied":"Copy"]})]}),(0,a.jsx)("pre",{className:"bg-sidebar rounded-lg px-3 py-2.5 text-xs font-mono text-text-main overflow-x-auto whitespace-pre opacity-70",children:(e=>{if(!e)return S;let t=JSON.parse(JSON.stringify(e));return(t.data||[]).forEach(e=>{Array.isArray(e.embedding)&&e.embedding.length>4&&(e.embedding=[...e.embedding.slice(0,4).map(e=>parseFloat(e.toFixed(6))),`... (${e.embedding.length} dims)`])}),JSON.stringify(t,null,2)})(v?.data)})]})]})]})}function $({providerId:e}){let t=(0,c.wG)(e),s=N[e]||N["edge-tts"],[r,i]=(0,n.useState)(""),[o,d]=(0,n.useState)(""),[m,u]=(0,n.useState)(""),[h,b]=(0,n.useState)([]),[g,y]=(0,n.useState)(""),[f,j]=(0,n.useState)(()=>{if(s.hasModelSelector&&s.modelKey){let e=(0,x.KC)(s.modelKey);return e?.[0]?.id||""}return""}),[v,S]=(0,n.useState)("Hello, this is a text to speech test."),[C,P]=(0,n.useState)(""),[T,O]=(0,n.useState)(!1),[A,_]=(0,n.useState)(""),[R,E]=(0,n.useState)(""),[I,D]=(0,n.useState)("mp3"),[K,U]=(0,n.useState)(""),[M,L]=(0,n.useState)(null),[q,F]=(0,n.useState)(!1),[B,J]=(0,n.useState)(""),[z,H]=(0,n.useState)(null),{copied:V,copy:W}=(0,p.C)(),[Z,G]=(0,n.useState)(!1),[Y,X]=(0,n.useState)([]),[Q,ee]=(0,n.useState)(!1),[et,es]=(0,n.useState)(""),[ea,er]=(0,n.useState)(""),[ei,eo]=(0,n.useState)({});(0,n.useEffect)(()=>{if(_(window.location.origin),fetch("/api/keys").then(e=>e.json()).then(e=>{P((e.keys||[]).find(e=>!1!==e.isActive)?.key||"")}).catch(()=>{}),fetch("/api/tunnel/status").then(e=>e.json()).then(e=>{e.publicUrl&&E(e.publicUrl)}).catch(()=>{}),"hardcoded"===s.voiceSource){let t=s.voiceKey||e,a=(0,x.KC)(t).filter(e=>"tts"===e.type);if(a.length)if(s.hasBrowseButton){let e=a.find(e=>"en"===e.id)||a[0];y(e.id),i(e.id),d(e.name),b([{id:e.id,name:e.name}])}else b(a),i(a[0].id),d(a[0].name||a[0].id)}},[e]);let en=async()=>{if(G(!0),es(""),er(""),!Y.length){ee(!0);try{if("hardcoded"===s.voiceSource){let t=s.voiceKey||e,a=(0,x.KC)(t).filter(e=>"tts"===e.type),r={};for(let e of a)r[e.id]||(r[e.id]={code:e.id,name:e.name,voices:[{id:e.id,name:e.name}]});eo(r),X(Object.values(r).sort((e,t)=>e.name.localeCompare(t.name)))}else{let t=s.apiEndpoint?s.apiEndpoint:`/api/media-providers/tts/voices?provider=${"local-device"===e?"local-device":"edge-tts"}`,a=await fetch(t),r=await a.json();if(r.error)return void er(r.error);X(r.languages||[]),eo(r.byLang||{})}}catch(e){er(e.message)}finally{ee(!1)}}},el=et?Y.filter(e=>e.name.toLowerCase().includes(et.toLowerCase())||e.code.toLowerCase().includes(et.toLowerCase())):Y,ed=T?R:A,ec=s.hasVoiceIdInput?m:r,ex=s.hasModelSelector&&ec&&f?`${t}/${f}/${ec}`:ec?`${t}/${ec}`:"",ep=`curl -X POST ${ed}/v1/audio/speech${"json"===I?"?response_format=json":""} \\
44
+ -d '{"model": "${K}", "input": "${i}"}'`,L=async()=>{if(!i.trim()||!K)return;S(!0),T(""),N(null);let e=Date.now();try{let t={"Content-Type":"application/json"};m&&(t.Authorization=`Bearer ${m}`);let s=await fetch("/api/v1/embeddings",{method:"POST",headers:t,body:JSON.stringify({model:K,input:i.trim()})}),a=Date.now()-e,r=await s.json();if(!s.ok)return void T(r?.error?.message||r?.error||`HTTP ${s.status}`);N({data:r,latencyMs:a})}catch(e){T(e.message||"Network error")}finally{S(!1)}},U=v?JSON.stringify(v.data,null,2):"";return(0,a.jsxs)(l.Zp,{children:[(0,a.jsx)("h2",{className:"text-lg font-semibold mb-4",children:"Example"}),(0,a.jsxs)("div",{className:"flex flex-col gap-2.5",children:[(0,a.jsx)(k,{label:"Model",children:(0,a.jsx)("select",{value:r,onChange:e=>o(e.target.value),className:"w-full px-3 py-1.5 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary",children:s.map(e=>(0,a.jsx)("option",{value:e.id,children:e.name||e.id},e.id))})}),(0,a.jsx)(k,{label:"Endpoint",children:(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("input",{value:I,onChange:e=>h?j(e.target.value):g(e.target.value),className:"flex-1 px-3 py-1.5 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary font-mono",placeholder:"http://localhost:3000"}),f&&(0,a.jsxs)("button",{onClick:()=>b(e=>!e),title:h?"Using tunnel":"Using local",className:`flex items-center gap-1 text-xs px-2 py-1.5 rounded-lg border shrink-0 transition-colors ${h?"border-primary/40 bg-primary/10 text-primary":"border-border text-text-muted hover:text-primary"}`,children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"wifi_tethering"}),"Tunnel"]})]})}),(0,a.jsx)(k,{label:"API Key",children:(0,a.jsx)("input",{type:"password",value:m,onChange:e=>u(e.target.value),placeholder:"sk-...",className:"w-full px-3 py-1.5 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary font-mono"})}),(0,a.jsx)(k,{label:"Input",children:(0,a.jsxs)("div",{className:"relative",children:[(0,a.jsx)("input",{value:i,onChange:e=>d(e.target.value),className:"w-full px-3 py-1.5 pr-7 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary"}),i&&(0,a.jsx)("button",{type:"button",onClick:()=>d(""),className:"absolute right-2 top-1/2 -translate-y-1/2 text-text-muted hover:text-primary transition-colors",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"close"})})]})}),(0,a.jsxs)("div",{className:"mt-1",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-1.5",children:[(0,a.jsx)("span",{className:"text-xs font-semibold text-text-muted uppercase tracking-wider",children:"Request"}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsxs)("button",{onClick:()=>R(E),className:"flex items-center gap-1 text-xs text-text-muted hover:text-primary transition-colors",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:A?"check":"content_copy"}),A?"Copied":"Copy"]}),(0,a.jsxs)("button",{onClick:L,disabled:w||!i.trim()||!K,className:"flex items-center gap-1.5 px-3 py-1 rounded-lg bg-primary text-white text-xs font-medium hover:bg-primary/90 transition-colors disabled:opacity-50 disabled:cursor-not-allowed",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",style:w?{animation:"spin 1s linear infinite"}:void 0,children:w?"progress_activity":"play_arrow"}),w?"Running...":"Run"]})]})]}),(0,a.jsx)("pre",{className:"bg-sidebar rounded-lg px-3 py-2.5 text-xs font-mono text-text-main overflow-x-auto whitespace-pre",children:E})]}),$&&(0,a.jsx)("p",{className:"text-xs text-red-500 break-words",children:$}),(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-1.5",children:[(0,a.jsxs)("span",{className:"text-xs font-semibold text-text-muted uppercase tracking-wider",children:["Response ",v&&(0,a.jsxs)("span",{className:"font-normal normal-case",children:["⚡ ",v.latencyMs,"ms"]})]}),v&&(0,a.jsxs)("button",{onClick:()=>_(U),className:"flex items-center gap-1 text-xs text-text-muted hover:text-primary transition-colors",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:O?"check":"content_copy"}),O?"Copied":"Copy"]})]}),(0,a.jsx)("pre",{className:"bg-sidebar rounded-lg px-3 py-2.5 text-xs font-mono text-text-main overflow-x-auto whitespace-pre opacity-70",children:(e=>{if(!e)return C;let t=JSON.parse(JSON.stringify(e));return(t.data||[]).forEach(e=>{Array.isArray(e.embedding)&&e.embedding.length>4&&(e.embedding=[...e.embedding.slice(0,4).map(e=>parseFloat(e.toFixed(6))),`... (${e.embedding.length} dims)`])}),JSON.stringify(t,null,2)})(v?.data)})]})]})]})}function T({providerId:e}){let t=(0,c.wG)(e),s=N[e]||N["edge-tts"],[r,o]=(0,n.useState)(""),[i,d]=(0,n.useState)(""),[m,u]=(0,n.useState)(""),[h,b]=(0,n.useState)([]),[y,g]=(0,n.useState)(""),[f,j]=(0,n.useState)(()=>{if(s.hasModelSelector&&s.modelKey){let e=(0,x.KC)(s.modelKey);return e?.[0]?.id||""}return""}),[v,C]=(0,n.useState)("Hello, this is a text to speech test."),[$,P]=(0,n.useState)(""),[A,R]=(0,n.useState)(!1),[O,_]=(0,n.useState)(""),[I,K]=(0,n.useState)(""),[E,L]=(0,n.useState)("mp3"),[U,D]=(0,n.useState)(""),[M,q]=(0,n.useState)(null),[B,F]=(0,n.useState)(!1),[J,z]=(0,n.useState)(""),[H,W]=(0,n.useState)(null),{copied:V,copy:Y}=(0,p.C)(),[Z,G]=(0,n.useState)(!1),[X,Q]=(0,n.useState)([]),[ee,et]=(0,n.useState)(!1),[es,ea]=(0,n.useState)(""),[er,eo]=(0,n.useState)(""),[ei,en]=(0,n.useState)({});(0,n.useEffect)(()=>{if(_(window.location.origin),fetch("/api/keys").then(e=>e.json()).then(e=>{P((e.keys||[]).find(e=>!1!==e.isActive)?.key||"")}).catch(()=>{}),fetch("/api/tunnel/status").then(e=>e.json()).then(e=>{e.publicUrl&&K(e.publicUrl)}).catch(()=>{}),"hardcoded"===s.voiceSource){let t=s.hasModelSelector&&s.modelKey&&(0,x.KC)(s.modelKey)?.[0]?.id||"",a=s.voicesPerModel&&t?(0,w.jY)(e,t)||[]:(0,x.KC)(s.voiceKey||e).filter(e=>"tts"===e.type);if(a.length)if(s.hasBrowseButton){let e=a.find(e=>"en"===e.id)||a[0];g(e.id),o(e.id),d(e.name),b([{id:e.id,name:e.name}])}else b(a),o(a[0].id),d(a[0].name||a[0].id)}},[e]),(0,n.useEffect)(()=>{if(!s.voicesPerModel||!f)return;let t=(0,w.jY)(e,f)||[];b(t),t.length&&(o(t[0].id),d(t[0].name||t[0].id))},[f]);let el=async()=>{if(G(!0),ea(""),eo(""),!X.length){et(!0);try{if("hardcoded"===s.voiceSource){let t=s.voiceKey||e,a=(0,x.KC)(t).filter(e=>"tts"===e.type),r={};for(let e of a)r[e.id]||(r[e.id]={code:e.id,name:e.name,voices:[{id:e.id,name:e.name}]});en(r),Q(Object.values(r).sort((e,t)=>e.name.localeCompare(t.name)))}else{let t=s.apiEndpoint?s.apiEndpoint:`/api/media-providers/tts/voices?provider=${"local-device"===e?"local-device":"edge-tts"}`,a=await fetch(t),r=await a.json();if(r.error)return void eo(r.error);Q(r.languages||[]),en(r.byLang||{})}}catch(e){eo(e.message)}finally{et(!1)}}},ed=es?X.filter(e=>e.name.toLowerCase().includes(es.toLowerCase())||e.code.toLowerCase().includes(es.toLowerCase())):X,ec=A?I:O,ex=s.hasVoiceIdInput?m:r,ep=s.hasModelSelector&&ex&&f?`${t}/${f}/${ex}`:ex?`${t}/${ex}`:"",em=`curl -X POST ${ec}/v1/audio/speech${"json"===E?"?response_format=json":""} \\
19
45
  -H "Content-Type: application/json" \\
20
- -H "Authorization: Bearer ${C||"YOUR_KEY"}" \\
21
- -d '{"model": "${ex}", "input": "${v}"}' \\
22
- ${"json"===I?"":"--output speech.mp3"}`,em=async()=>{if(!v.trim()||!ex)return;F(!0),J(""),U(""),L(null);let e=Date.now();try{let t={"Content-Type":"application/json"};C&&(t.Authorization=`Bearer ${C}`);let s=`/api/v1/audio/speech${"json"===I?"?response_format=json":""}`,a=await fetch(s,{method:"POST",headers:t,body:JSON.stringify({model:ex,input:v.trim()})});if(H(Date.now()-e),!a.ok){let e=await a.json().catch(()=>({}));J(e?.error?.message||e?.error||`HTTP ${a.status}`);return}if("json"===I){let e=await a.json();L(e);let t=await fetch(`data:audio/mp3;base64,${e.audio}`).then(e=>e.blob());U(URL.createObjectURL(t))}else{let e=await a.blob();U(URL.createObjectURL(e))}}catch(e){J(e.message||"Network error")}finally{F(!1)}};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(l.Zp,{children:[(0,a.jsx)("h2",{className:"text-lg font-semibold mb-4",children:"Example"}),(0,a.jsxs)("div",{className:"flex flex-col gap-2.5",children:[(0,a.jsx)(w,{label:"Endpoint",children:(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsxs)("span",{className:"flex-1 px-3 py-1.5 text-sm font-mono text-text-main bg-sidebar rounded-lg truncate",children:[ed,"/v1/audio/speech"]}),R&&(0,a.jsxs)("button",{onClick:()=>O(e=>!e),title:T?"Using tunnel":"Using local",className:`flex items-center gap-1 text-xs px-2 py-1.5 rounded-lg border shrink-0 transition-colors ${T?"border-primary/40 bg-primary/10 text-primary":"border-border text-text-muted hover:text-primary"}`,children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"wifi_tethering"}),"Tunnel"]})]})}),(0,a.jsx)(w,{label:"API Key",children:(0,a.jsx)("span",{className:"px-3 py-1.5 text-sm font-mono text-text-main bg-sidebar rounded-lg truncate block",children:C?`${C.slice(0,8)}${"•".repeat(Math.min(20,C.length-8))}`:(0,a.jsx)("span",{className:"text-text-muted italic",children:"No key configured"})})}),s.hasModelSelector&&s.modelKey&&(0,a.jsx)(w,{label:"Model",children:(0,a.jsx)("select",{value:f,onChange:e=>j(e.target.value),className:"w-full px-3 py-1.5 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary",children:((0,x.KC)(s.modelKey)||[]).map(e=>(0,a.jsx)("option",{value:e.id,children:e.name||e.id},e.id))})}),s.hasBrowseButton&&(0,a.jsx)(w,{label:"Language",children:(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("button",{onClick:en,className:"flex-1 px-3 py-1.5 text-sm border border-border rounded-lg bg-background font-mono truncate text-left hover:border-primary/40 transition-colors",children:g?(0,a.jsx)("span",{className:"text-text-main",children:Y.find(e=>e.code===g)?.name||g}):(0,a.jsx)("span",{className:"text-text-muted",children:"No language selected"})}),(0,a.jsxs)("button",{onClick:en,className:"flex items-center gap-1 text-xs px-2.5 py-1.5 rounded-lg border border-border text-text-muted hover:text-primary hover:border-primary/40 transition-colors shrink-0",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"language"}),"Select language"]})]})}),h.length>0&&(0,a.jsx)(w,{label:"Voice",children:(0,a.jsx)("div",{className:"flex flex-wrap gap-1.5",children:h.map(e=>(0,a.jsxs)("button",{onClick:()=>{i(e.id),d(e.name),s.hasVoiceIdInput&&u(e.id)},className:`px-2.5 py-1 rounded-full text-xs border transition-colors ${r===e.id?"bg-primary/15 border-primary/40 text-primary font-medium":"border-border text-text-muted hover:text-primary hover:border-primary/40"}`,children:[e.name,e.gender?` \xb7 ${e.gender[0].toUpperCase()}`:"",!0===e.free_users_allowed&&(0,a.jsx)("span",{className:"ml-1.5 px-1 py-0.5 text-[9px] font-semibold rounded bg-green-500/15 text-green-600 border border-green-500/20",children:"Free"}),!1===e.free_users_allowed&&(0,a.jsx)("span",{className:"ml-1.5 px-1 py-0.5 text-[9px] font-semibold rounded bg-amber-500/15 text-amber-600 border border-amber-500/20",children:"Paid"})]},e.id))})}),s.hasVoiceIdInput&&(0,a.jsx)(w,{label:"Voice ID",children:(0,a.jsx)("div",{className:"flex flex-col gap-1",children:(0,a.jsxs)("div",{className:"relative",children:[(0,a.jsx)("input",{value:m,onChange:e=>{u(e.target.value),i(e.target.value)},placeholder:"e.g. CwhRBWXzGAHq8TQ4Fs17",className:"w-full px-3 py-1.5 pr-7 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary font-mono"}),m&&(0,a.jsx)("button",{type:"button",onClick:()=>{u(""),i("")},className:"absolute right-2 top-1/2 -translate-y-1/2 text-text-muted hover:text-primary transition-colors",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"close"})})]})})}),s.hasLanguageDropdown&&(0,a.jsx)(w,{label:"Language",children:(0,a.jsx)("select",{value:r,onChange:t=>{let s=(0,x.KC)(e).filter(e=>"tts"===e.type).find(e=>e.id===t.target.value);i(t.target.value),d(s?.name||t.target.value)},className:"w-full px-3 py-1.5 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary",children:(0,x.KC)(e).filter(e=>"tts"===e.type).map(e=>(0,a.jsx)("option",{value:e.id,children:e.name||e.id},e.id))})}),(0,a.jsx)(w,{label:"Input",children:(0,a.jsxs)("div",{className:"relative",children:[(0,a.jsx)("input",{value:v,onChange:e=>S(e.target.value),className:"w-full px-3 py-1.5 pr-7 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary"}),v&&(0,a.jsx)("button",{type:"button",onClick:()=>S(""),className:"absolute right-2 top-1/2 -translate-y-1/2 text-text-muted hover:text-primary transition-colors",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"close"})})]})}),(0,a.jsx)(w,{label:"Output Format",children:(0,a.jsxs)("select",{value:I,onChange:e=>D(e.target.value),className:"w-full px-3 py-1.5 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary",children:[(0,a.jsx)("option",{value:"mp3",children:"MP3 (Binary)"}),(0,a.jsx)("option",{value:"json",children:"JSON (Base64)"})]})}),(0,a.jsxs)("div",{className:"mt-1",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-1.5",children:[(0,a.jsx)("span",{className:"text-xs font-semibold text-text-muted uppercase tracking-wider",children:"Request"}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsxs)("button",{onClick:()=>W(ep),className:"flex items-center gap-1 text-xs text-text-muted hover:text-primary transition-colors",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:V?"check":"content_copy"}),V?"Copied":"Copy"]}),(0,a.jsxs)("button",{onClick:em,disabled:q||!v.trim()||!ex,className:"flex items-center gap-1.5 px-3 py-1 rounded-lg bg-primary text-white text-xs font-medium hover:bg-primary/90 transition-colors disabled:opacity-50 disabled:cursor-not-allowed",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",style:q?{animation:"spin 1s linear infinite"}:void 0,children:q?"progress_activity":"play_arrow"}),q?"Generating...":"Run"]})]})]}),(0,a.jsx)("pre",{className:"bg-sidebar rounded-lg px-3 py-2.5 text-xs font-mono text-text-main overflow-x-auto whitespace-pre",children:ep})]}),B&&(0,a.jsx)("p",{className:"text-xs text-red-500 break-words",children:B}),K?(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-1.5",children:[(0,a.jsxs)("span",{className:"text-xs font-semibold text-text-muted uppercase tracking-wider",children:["Response ",z&&(0,a.jsxs)("span",{className:"font-normal normal-case",children:["⚡ ",z,"ms"]})]}),(0,a.jsxs)("a",{href:K,download:"speech.mp3",className:"flex items-center gap-1 text-xs text-text-muted hover:text-primary transition-colors",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"download"}),"Download"]})]}),(0,a.jsx)("audio",{controls:!0,src:K,className:"w-full"}),M&&(0,a.jsxs)("div",{className:"mt-3",children:[(0,a.jsx)("div",{className:"flex items-center justify-between mb-1.5",children:(0,a.jsx)("span",{className:"text-xs font-semibold text-text-muted uppercase tracking-wider",children:"JSON Response"})}),(0,a.jsx)("pre",{className:"bg-sidebar rounded-lg px-3 py-2.5 text-xs font-mono text-text-main overflow-x-auto whitespace-pre-wrap break-all",children:JSON.stringify({format:M.format,audio:M.audio?`${M.audio.substring(0,100)}...`:""},null,2)})]})]}):(0,a.jsxs)("div",{children:[(0,a.jsx)("span",{className:"text-xs font-semibold text-text-muted uppercase tracking-wider",children:"Response"}),(0,a.jsx)("pre",{className:"mt-1.5 bg-sidebar rounded-lg px-3 py-2.5 text-xs font-mono text-text-main overflow-x-auto whitespace-pre opacity-50",children:k})]})]})]}),Z&&(0,a.jsx)("div",{className:"fixed inset-0 z-50 flex items-center justify-center",style:{backgroundColor:"rgba(0,0,0,0.6)",backdropFilter:"blur(2px)"},onClick:()=>G(!1),children:(0,a.jsxs)("div",{className:"border border-border rounded-xl shadow-2xl w-full max-w-md mx-4 flex flex-col max-h-[80vh]",style:{backgroundColor:"var(--color-bg)",isolation:"isolate"},onClick:e=>e.stopPropagation(),children:[(0,a.jsxs)("div",{className:"flex items-center justify-between px-4 py-3 border-b border-border shrink-0 rounded-t-xl",children:[(0,a.jsx)("h3",{className:"text-sm font-semibold",children:"Select Language"}),(0,a.jsx)("button",{onClick:()=>G(!1),className:"text-text-muted hover:text-primary transition-colors",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[20px]",children:"close"})})]}),(0,a.jsx)("div",{className:"px-4 py-2.5 border-b border-border shrink-0",children:(0,a.jsx)("input",{autoFocus:!0,value:et,onChange:e=>es(e.target.value),placeholder:"Search language...",className:"w-full px-3 py-1.5 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary"})}),(0,a.jsxs)("div",{className:"overflow-y-auto flex-1 p-2",children:[ea&&(0,a.jsx)("p",{className:"text-xs text-red-500 px-2 py-1",children:ea}),Q?(0,a.jsx)("p",{className:"text-xs text-text-muted px-2 py-3",children:"Loading..."}):(0,a.jsxs)("div",{className:"flex flex-col gap-0.5",children:[el.map(e=>(0,a.jsxs)("button",{onClick:()=>{let t;return G(!1),y(e.code),void(b(t=ei[e.code]?.voices||[]),t.length&&(i(t[0].id),d(t[0].name),s.hasVoiceIdInput&&u(t[0].id)))},className:`flex items-center justify-between w-full px-3 py-2 rounded-lg text-left hover:bg-sidebar transition-colors ${g===e.code?"bg-primary/10 text-primary":""}`,children:[(0,a.jsx)("span",{className:"text-sm",children:e.name}),(0,a.jsxs)("div",{className:"flex items-center gap-2 shrink-0",children:[(0,a.jsxs)("span",{className:"text-xs text-text-muted",children:[e.voices.length," voices"]}),g===e.code&&(0,a.jsx)("span",{className:"material-symbols-outlined text-[16px] text-primary",children:"check"})]})]},e.code)),0===el.length&&(0,a.jsx)("p",{className:"text-xs text-text-muted px-2 py-3",children:"No languages found."})]})]})]})})]})}function P(){let{kind:e,id:t}=(0,r.useParams)(),s=c.rj.find(t=>t.id===e);if(!s)return(0,r.notFound)();let i=c.Q2[t];if(!i)return(0,r.notFound)();let n=i.serviceKinds??["llm"];return n.includes(e)?(0,a.jsxs)("div",{className:"flex flex-col gap-8",children:[(0,a.jsxs)("div",{children:[(0,a.jsxs)(o(),{href:`/dashboard/media-providers/${e}`,className:"inline-flex items-center gap-1 text-sm text-text-muted hover:text-primary transition-colors mb-4",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-lg",children:"arrow_back"}),s.label]}),(0,a.jsxs)("div",{className:"flex items-center gap-4",children:[(0,a.jsx)("div",{className:"size-12 rounded-lg flex items-center justify-center shrink-0",style:{backgroundColor:`${i.color}15`},children:(0,a.jsx)(d.A,{src:`/providers/${i.id}.png`,alt:i.name,size:48,className:"object-contain rounded-lg max-w-[48px] max-h-[48px]",fallbackText:i.textIcon||i.id.slice(0,2).toUpperCase(),fallbackColor:i.color})}),(0,a.jsxs)("div",{children:[(0,a.jsx)("h1",{className:"text-3xl font-semibold tracking-tight",children:i.name}),(0,a.jsx)("div",{className:"flex items-center gap-1.5 mt-1 flex-wrap",children:n.map(t=>(0,a.jsx)(l.Ex,{variant:t===e?"primary":"default",size:"sm",children:t.toUpperCase()},t))})]})]})]}),i.noAuth?(0,a.jsx)(l.Zp,{children:(0,a.jsxs)("div",{className:"flex items-center gap-3",children:[(0,a.jsx)("div",{className:"inline-flex items-center justify-center w-10 h-10 rounded-full bg-green-500/10 text-green-500",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[20px]",children:"lock_open"})}),(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"text-sm font-medium",children:"No authentication required"}),(0,a.jsx)("p",{className:"text-xs text-text-muted",children:"This provider is ready to use."})]})]})}):(0,a.jsx)(y,{providerId:t,isOAuth:!1}),"tts"!==e&&(0,a.jsx)(v,{providerId:t,kindFilter:e}),"embedding"===e&&(0,a.jsx)(C,{providerId:t}),"tts"===e&&(0,a.jsx)($,{providerId:t})]}):(0,r.notFound)()}}},e=>{e.O(0,[2574,3862,123,1321,5497,8441,3794,7358],()=>e(e.s=1943)),_N_E=e.O()}]);
46
+ -H "Authorization: Bearer ${$||"YOUR_KEY"}" \\
47
+ -d '{"model": "${ep}", "input": "${v}"}' \\
48
+ ${"json"===E?"":"--output speech.mp3"}`,eu=async()=>{if(!v.trim()||!ep)return;F(!0),z(""),D(""),q(null);let e=Date.now();try{let t={"Content-Type":"application/json"};$&&(t.Authorization=`Bearer ${$}`);let s=`/api/v1/audio/speech${"json"===E?"?response_format=json":""}`,a=await fetch(s,{method:"POST",headers:t,body:JSON.stringify({model:ep,input:v.trim()})});if(W(Date.now()-e),!a.ok){let e=await a.json().catch(()=>({}));z(e?.error?.message||e?.error||`HTTP ${a.status}`);return}if("json"===E){let e=await a.json();q(e);let t=await fetch(`data:audio/mp3;base64,${e.audio}`).then(e=>e.blob());D(URL.createObjectURL(t))}else{let e=await a.blob();D(URL.createObjectURL(e))}}catch(e){z(e.message||"Network error")}finally{F(!1)}};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(l.Zp,{children:[(0,a.jsx)("h2",{className:"text-lg font-semibold mb-4",children:"Example"}),(0,a.jsxs)("div",{className:"flex flex-col gap-2.5",children:[(0,a.jsx)(k,{label:"Endpoint",children:(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsxs)("span",{className:"flex-1 px-3 py-1.5 text-sm font-mono text-text-main bg-sidebar rounded-lg truncate",children:[ec,"/v1/audio/speech"]}),I&&(0,a.jsxs)("button",{onClick:()=>R(e=>!e),title:A?"Using tunnel":"Using local",className:`flex items-center gap-1 text-xs px-2 py-1.5 rounded-lg border shrink-0 transition-colors ${A?"border-primary/40 bg-primary/10 text-primary":"border-border text-text-muted hover:text-primary"}`,children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"wifi_tethering"}),"Tunnel"]})]})}),(0,a.jsx)(k,{label:"API Key",children:(0,a.jsx)("span",{className:"px-3 py-1.5 text-sm font-mono text-text-main bg-sidebar rounded-lg truncate block",children:$?`${$.slice(0,8)}${"•".repeat(Math.min(20,$.length-8))}`:(0,a.jsx)("span",{className:"text-text-muted italic",children:"No key configured"})})}),s.hasModelSelector&&s.modelKey&&(0,a.jsx)(k,{label:"Model",children:(0,a.jsx)("select",{value:f,onChange:e=>j(e.target.value),className:"w-full px-3 py-1.5 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary",children:((0,x.KC)(s.modelKey)||[]).map(e=>(0,a.jsx)("option",{value:e.id,children:e.name||e.id},e.id))})}),s.hasBrowseButton&&(0,a.jsx)(k,{label:"Language",children:(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("button",{onClick:el,className:"flex-1 px-3 py-1.5 text-sm border border-border rounded-lg bg-background font-mono truncate text-left hover:border-primary/40 transition-colors",children:y?(0,a.jsx)("span",{className:"text-text-main",children:X.find(e=>e.code===y)?.name||y}):(0,a.jsx)("span",{className:"text-text-muted",children:"No language selected"})}),(0,a.jsxs)("button",{onClick:el,className:"flex items-center gap-1 text-xs px-2.5 py-1.5 rounded-lg border border-border text-text-muted hover:text-primary hover:border-primary/40 transition-colors shrink-0",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"language"}),"Select language"]})]})}),h.length>0&&(0,a.jsx)(k,{label:"Voice",children:(0,a.jsx)("div",{className:"flex flex-wrap gap-1.5",children:h.map(e=>(0,a.jsxs)("button",{onClick:()=>{o(e.id),d(e.name),s.hasVoiceIdInput&&u(e.id)},className:`px-2.5 py-1 rounded-full text-xs border transition-colors ${r===e.id?"bg-primary/15 border-primary/40 text-primary font-medium":"border-border text-text-muted hover:text-primary hover:border-primary/40"}`,children:[e.name,e.gender?` \xb7 ${e.gender[0].toUpperCase()}`:"",!0===e.free_users_allowed&&(0,a.jsx)("span",{className:"ml-1.5 px-1 py-0.5 text-[9px] font-semibold rounded bg-green-500/15 text-green-600 border border-green-500/20",children:"Free"}),!1===e.free_users_allowed&&(0,a.jsx)("span",{className:"ml-1.5 px-1 py-0.5 text-[9px] font-semibold rounded bg-amber-500/15 text-amber-600 border border-amber-500/20",children:"Paid"})]},e.id))})}),s.hasVoiceIdInput&&(0,a.jsx)(k,{label:"Voice ID",children:(0,a.jsx)("div",{className:"flex flex-col gap-1",children:(0,a.jsxs)("div",{className:"relative",children:[(0,a.jsx)("input",{value:m,onChange:e=>{u(e.target.value),o(e.target.value)},placeholder:"e.g. CwhRBWXzGAHq8TQ4Fs17",className:"w-full px-3 py-1.5 pr-7 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary font-mono"}),m&&(0,a.jsx)("button",{type:"button",onClick:()=>{u(""),o("")},className:"absolute right-2 top-1/2 -translate-y-1/2 text-text-muted hover:text-primary transition-colors",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"close"})})]})})}),s.hasLanguageDropdown&&(0,a.jsx)(k,{label:"Language",children:(0,a.jsx)("select",{value:r,onChange:t=>{let s=(0,x.KC)(e).filter(e=>"tts"===e.type).find(e=>e.id===t.target.value);o(t.target.value),d(s?.name||t.target.value)},className:"w-full px-3 py-1.5 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary",children:(0,x.KC)(e).filter(e=>"tts"===e.type).map(e=>(0,a.jsx)("option",{value:e.id,children:e.name||e.id},e.id))})}),(0,a.jsx)(k,{label:"Input",children:(0,a.jsxs)("div",{className:"relative",children:[(0,a.jsx)("input",{value:v,onChange:e=>C(e.target.value),className:"w-full px-3 py-1.5 pr-7 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary"}),v&&(0,a.jsx)("button",{type:"button",onClick:()=>C(""),className:"absolute right-2 top-1/2 -translate-y-1/2 text-text-muted hover:text-primary transition-colors",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"close"})})]})}),(0,a.jsx)(k,{label:"Output Format",children:(0,a.jsxs)("select",{value:E,onChange:e=>L(e.target.value),className:"w-full px-3 py-1.5 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary",children:[(0,a.jsx)("option",{value:"mp3",children:"MP3 (Binary)"}),(0,a.jsx)("option",{value:"json",children:"JSON (Base64)"})]})}),(0,a.jsxs)("div",{className:"mt-1",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-1.5",children:[(0,a.jsx)("span",{className:"text-xs font-semibold text-text-muted uppercase tracking-wider",children:"Request"}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsxs)("button",{onClick:()=>Y(em),className:"flex items-center gap-1 text-xs text-text-muted hover:text-primary transition-colors",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:V?"check":"content_copy"}),V?"Copied":"Copy"]}),(0,a.jsxs)("button",{onClick:eu,disabled:B||!v.trim()||!ep,className:"flex items-center gap-1.5 px-3 py-1 rounded-lg bg-primary text-white text-xs font-medium hover:bg-primary/90 transition-colors disabled:opacity-50 disabled:cursor-not-allowed",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",style:B?{animation:"spin 1s linear infinite"}:void 0,children:B?"progress_activity":"play_arrow"}),B?"Generating...":"Run"]})]})]}),(0,a.jsx)("pre",{className:"bg-sidebar rounded-lg px-3 py-2.5 text-xs font-mono text-text-main overflow-x-auto whitespace-pre",children:em})]}),J&&(0,a.jsx)("p",{className:"text-xs text-red-500 break-words",children:J}),U?(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-1.5",children:[(0,a.jsxs)("span",{className:"text-xs font-semibold text-text-muted uppercase tracking-wider",children:["Response ",H&&(0,a.jsxs)("span",{className:"font-normal normal-case",children:["⚡ ",H,"ms"]})]}),(0,a.jsxs)("a",{href:U,download:"speech.mp3",className:"flex items-center gap-1 text-xs text-text-muted hover:text-primary transition-colors",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"download"}),"Download"]})]}),(0,a.jsx)("audio",{controls:!0,src:U,className:"w-full"}),M&&(0,a.jsxs)("div",{className:"mt-3",children:[(0,a.jsx)("div",{className:"flex items-center justify-between mb-1.5",children:(0,a.jsx)("span",{className:"text-xs font-semibold text-text-muted uppercase tracking-wider",children:"JSON Response"})}),(0,a.jsx)("pre",{className:"bg-sidebar rounded-lg px-3 py-2.5 text-xs font-mono text-text-main overflow-x-auto whitespace-pre-wrap break-all",children:JSON.stringify({format:M.format,audio:M.audio?`${M.audio.substring(0,100)}...`:""},null,2)})]})]}):(0,a.jsxs)("div",{children:[(0,a.jsx)("span",{className:"text-xs font-semibold text-text-muted uppercase tracking-wider",children:"Response"}),(0,a.jsx)("pre",{className:"mt-1.5 bg-sidebar rounded-lg px-3 py-2.5 text-xs font-mono text-text-main overflow-x-auto whitespace-pre opacity-50",children:S})]})]})]}),Z&&(0,a.jsx)("div",{className:"fixed inset-0 z-50 flex items-center justify-center",style:{backgroundColor:"rgba(0,0,0,0.6)",backdropFilter:"blur(2px)"},onClick:()=>G(!1),children:(0,a.jsxs)("div",{className:"border border-border rounded-xl shadow-2xl w-full max-w-md mx-4 flex flex-col max-h-[80vh]",style:{backgroundColor:"var(--color-bg)",isolation:"isolate"},onClick:e=>e.stopPropagation(),children:[(0,a.jsxs)("div",{className:"flex items-center justify-between px-4 py-3 border-b border-border shrink-0 rounded-t-xl",children:[(0,a.jsx)("h3",{className:"text-sm font-semibold",children:"Select Language"}),(0,a.jsx)("button",{onClick:()=>G(!1),className:"text-text-muted hover:text-primary transition-colors",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[20px]",children:"close"})})]}),(0,a.jsx)("div",{className:"px-4 py-2.5 border-b border-border shrink-0",children:(0,a.jsx)("input",{autoFocus:!0,value:es,onChange:e=>ea(e.target.value),placeholder:"Search language...",className:"w-full px-3 py-1.5 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary"})}),(0,a.jsxs)("div",{className:"overflow-y-auto flex-1 p-2",children:[er&&(0,a.jsx)("p",{className:"text-xs text-red-500 px-2 py-1",children:er}),ee?(0,a.jsx)("p",{className:"text-xs text-text-muted px-2 py-3",children:"Loading..."}):(0,a.jsxs)("div",{className:"flex flex-col gap-0.5",children:[ed.map(e=>(0,a.jsxs)("button",{onClick:()=>{let t;return G(!1),g(e.code),void(b(t=ei[e.code]?.voices||[]),t.length&&(o(t[0].id),d(t[0].name),s.hasVoiceIdInput&&u(t[0].id)))},className:`flex items-center justify-between w-full px-3 py-2 rounded-lg text-left hover:bg-sidebar transition-colors ${y===e.code?"bg-primary/10 text-primary":""}`,children:[(0,a.jsx)("span",{className:"text-sm",children:e.name}),(0,a.jsxs)("div",{className:"flex items-center gap-2 shrink-0",children:[(0,a.jsxs)("span",{className:"text-xs text-text-muted",children:[e.voices.length," voices"]}),y===e.code&&(0,a.jsx)("span",{className:"material-symbols-outlined text-[16px] text-primary",children:"check"})]})]},e.code)),0===ed.length&&(0,a.jsx)("p",{className:"text-xs text-text-muted px-2 py-3",children:"No languages found."})]})]})]})})]})}function A({providerId:e,kind:t}){let s=(0,c.wG)(e),r=c.rj.find(e=>e.id===t),o=$[t];if(!r||!o)return null;let[i,d]=(0,n.useState)(o.defaultInput),[x,m]=(0,n.useState)(""),[u,h]=(0,n.useState)(!1),[b,y]=(0,n.useState)(""),[g,f]=(0,n.useState)(""),[j,v]=(0,n.useState)(null),[N,w]=(0,n.useState)(!1),[S,C]=(0,n.useState)(""),{copied:P,copy:T}=(0,p.C)(),{copied:R,copy:O}=(0,p.C)();(0,n.useEffect)(()=>{y(window.location.origin),fetch("/api/keys").then(e=>e.json()).then(e=>{m((e.keys||[]).find(e=>!1!==e.isActive)?.key||"")}).catch(()=>{}),fetch("/api/tunnel/status").then(e=>e.json()).then(e=>{e.publicUrl&&f(e.publicUrl)}).catch(()=>{})},[]);let _=u?g:b,I=r.endpoint.path,K={model:`${s}/model-name`,[o.bodyKey]:i,...o.extraBody},E=`curl -X ${r.endpoint.method} ${_}${I} \\
49
+ -H "Content-Type: application/json" \\
50
+ -H "Authorization: Bearer ${x||"YOUR_KEY"}" \\
51
+ -d '${JSON.stringify(K)}'`,L=async()=>{if(!i.trim())return;w(!0),C(""),v(null);let e=Date.now();try{let t={"Content-Type":"application/json"};x&&(t.Authorization=`Bearer ${x}`);let a={...K,model:`${s}/model-name`},o=await fetch(`/api${I}`,{method:r.endpoint.method,headers:t,body:JSON.stringify(a)}),i=Date.now()-e,n=await o.json();if(!o.ok)return void C(n?.error?.message||n?.error||`HTTP ${o.status}`);v({data:n,latencyMs:i})}catch(e){C(e.message||"Network error")}finally{w(!1)}},U=j?JSON.stringify(j.data,null,2):"";return(0,a.jsxs)(l.Zp,{children:[(0,a.jsx)("h2",{className:"text-lg font-semibold mb-4",children:"Example"}),(0,a.jsxs)("div",{className:"flex flex-col gap-2.5",children:[(0,a.jsx)(k,{label:"Endpoint",children:(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsxs)("span",{className:"flex-1 px-3 py-1.5 text-sm font-mono text-text-main bg-sidebar rounded-lg truncate",children:[_,I]}),g&&(0,a.jsxs)("button",{onClick:()=>h(e=>!e),title:u?"Using tunnel":"Using local",className:`flex items-center gap-1 text-xs px-2 py-1.5 rounded-lg border shrink-0 transition-colors ${u?"border-primary/40 bg-primary/10 text-primary":"border-border text-text-muted hover:text-primary"}`,children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"wifi_tethering"}),"Tunnel"]})]})}),(0,a.jsx)(k,{label:"API Key",children:(0,a.jsx)("span",{className:"px-3 py-1.5 text-sm font-mono text-text-main bg-sidebar rounded-lg truncate block",children:x?`${x.slice(0,8)}${"•".repeat(Math.min(20,x.length-8))}`:(0,a.jsx)("span",{className:"text-text-muted italic",children:"No key configured"})})}),(0,a.jsx)(k,{label:o.inputLabel,children:(0,a.jsxs)("div",{className:"relative",children:[(0,a.jsx)("input",{value:i,onChange:e=>d(e.target.value),placeholder:o.inputPlaceholder,className:"w-full px-3 py-1.5 pr-7 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary"}),i&&(0,a.jsx)("button",{type:"button",onClick:()=>d(""),className:"absolute right-2 top-1/2 -translate-y-1/2 text-text-muted hover:text-primary transition-colors",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"close"})})]})}),(0,a.jsxs)("div",{className:"mt-1",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-1.5",children:[(0,a.jsx)("span",{className:"text-xs font-semibold text-text-muted uppercase tracking-wider",children:"Request"}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsxs)("button",{onClick:()=>T(E),className:"flex items-center gap-1 text-xs text-text-muted hover:text-primary transition-colors",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:P?"check":"content_copy"}),P?"Copied":"Copy"]}),(0,a.jsxs)("button",{onClick:L,disabled:N||!i.trim(),className:"flex items-center gap-1.5 px-3 py-1 rounded-lg bg-primary text-white text-xs font-medium hover:bg-primary/90 transition-colors disabled:opacity-50 disabled:cursor-not-allowed",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",style:N?{animation:"spin 1s linear infinite"}:void 0,children:N?"progress_activity":"play_arrow"}),N?"Running...":"Run"]})]})]}),(0,a.jsx)("pre",{className:"bg-sidebar rounded-lg px-3 py-2.5 text-xs font-mono text-text-main overflow-x-auto whitespace-pre",children:E})]}),S&&(0,a.jsx)("p",{className:"text-xs text-red-500 break-words",children:S}),(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-1.5",children:[(0,a.jsxs)("span",{className:"text-xs font-semibold text-text-muted uppercase tracking-wider",children:["Response ",j&&(0,a.jsxs)("span",{className:"font-normal normal-case",children:["⚡ ",j.latencyMs,"ms"]})]}),j&&(0,a.jsxs)("button",{onClick:()=>O(U),className:"flex items-center gap-1 text-xs text-text-muted hover:text-primary transition-colors",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:R?"check":"content_copy"}),R?"Copied":"Copy"]})]}),(0,a.jsx)("pre",{className:"bg-sidebar rounded-lg px-3 py-2.5 text-xs font-mono text-text-main overflow-x-auto whitespace-pre opacity-70",children:j?U:o.defaultResponse})]})]})]})}function R(){let{kind:e,id:t}=(0,r.useParams)(),s=c.rj.find(t=>t.id===e);if(!s)return(0,r.notFound)();let o=c.Q2[t];if(!o)return(0,r.notFound)();let n=o.serviceKinds??["llm"];return n.includes(e)?(0,a.jsxs)("div",{className:"flex flex-col gap-8",children:[(0,a.jsxs)("div",{children:[(0,a.jsxs)(i(),{href:`/dashboard/media-providers/${e}`,className:"inline-flex items-center gap-1 text-sm text-text-muted hover:text-primary transition-colors mb-4",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-lg",children:"arrow_back"}),s.label]}),(0,a.jsxs)("div",{className:"flex items-center gap-4",children:[(0,a.jsx)("div",{className:"size-12 rounded-lg flex items-center justify-center shrink-0",style:{backgroundColor:`${o.color}15`},children:(0,a.jsx)(d.A,{src:`/providers/${o.id}.png`,alt:o.name,size:48,className:"object-contain rounded-lg max-w-[48px] max-h-[48px]",fallbackText:o.textIcon||o.id.slice(0,2).toUpperCase(),fallbackColor:o.color})}),(0,a.jsxs)("div",{children:[(0,a.jsx)("h1",{className:"text-3xl font-semibold tracking-tight",children:o.name}),(0,a.jsx)("div",{className:"flex items-center gap-1.5 mt-1 flex-wrap",children:n.map(t=>(0,a.jsx)(l.Ex,{variant:t===e?"primary":"default",size:"sm",children:t.toUpperCase()},t))})]})]})]}),o.noAuth?(0,a.jsx)(l.Zp,{children:(0,a.jsxs)("div",{className:"flex items-center gap-3",children:[(0,a.jsx)("div",{className:"inline-flex items-center justify-center w-10 h-10 rounded-full bg-green-500/10 text-green-500",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[20px]",children:"lock_open"})}),(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"text-sm font-medium",children:"No authentication required"}),(0,a.jsx)("p",{className:"text-xs text-text-muted",children:"This provider is ready to use."})]})]})}):(0,a.jsx)(g,{providerId:t,isOAuth:!1}),"tts"!==e&&(0,a.jsx)(v,{providerId:t,kindFilter:e}),"embedding"===e&&(0,a.jsx)(P,{providerId:t}),"tts"===e&&(0,a.jsx)(T,{providerId:t}),$[e]&&(0,a.jsx)(A,{providerId:t,kind:e})]}):(0,r.notFound)()}}},e=>{e.O(0,[2574,3862,1051,1321,5497,8441,3794,7358],()=>e(e.s=1943)),_N_E=e.O()}]);
@@ -1 +1 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6620],{16144:(e,s,r)=>{"use strict";r.r(s),r.d(s,{default:()=>u});var t=r(95155),i=r(73321),n=r(98500),l=r.n(n),a=r(12115),c=r(35497),d=r(57250),o=r(52679);function x(e){let s=Object.entries(e).some(([e,s])=>e.startsWith("modelLock_")&&s&&new Date(s).getTime()>Date.now());return"unavailable"!==e.testStatus||s?e.testStatus:"active"}function h({provider:e,kind:s,connections:r}){let i=o.Q2[e.id],n=!!i?.noAuth,a=r.filter(s=>s.provider===e.id),u=a.filter(e=>{let s=x(e);return"active"===s||"success"===s}).length,m=a.filter(e=>{let s=x(e);return"error"===s||"expired"===s||"unavailable"===s}).length,p=a.length,f=p>0&&a.every(e=>!1===e.isActive);return(0,t.jsx)(l(),{href:`/dashboard/media-providers/${s}/${e.id}`,className:"group",children:(0,t.jsx)(c.Zp,{padding:"xs",className:`h-full hover:bg-black/[0.01] dark:hover:bg-white/[0.01] transition-colors cursor-pointer ${f?"opacity-50":""}`,children:(0,t.jsxs)("div",{className:"flex items-center gap-3",children:[(0,t.jsx)("div",{className:"size-8 rounded-lg flex items-center justify-center shrink-0",style:{backgroundColor:`${e.color?.length>7?e.color:(e.color??"#888")+"15"}`},children:(0,t.jsx)(d.A,{src:`/providers/${e.id}.png`,alt:e.name,size:30,className:"object-contain rounded-lg max-w-[30px] max-h-[30px]",fallbackText:e.textIcon||e.id.slice(0,2).toUpperCase(),fallbackColor:e.color})}),(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"font-semibold text-sm",children:e.name}),(0,t.jsx)("div",{className:"flex items-center gap-2 mt-0.5 flex-wrap",children:n?(0,t.jsx)(c.Ex,{variant:"success",size:"sm",children:"Ready"}):f?(0,t.jsx)(c.Ex,{variant:"default",size:"sm",children:"Disabled"}):0===p?(0,t.jsx)("span",{className:"text-xs text-text-muted",children:"No connections"}):(0,t.jsxs)(t.Fragment,{children:[u>0&&(0,t.jsxs)(c.Ex,{variant:"success",size:"sm",dot:!0,children:[u," Connected"]}),m>0&&(0,t.jsxs)(c.Ex,{variant:"error",size:"sm",dot:!0,children:[m," Error"]}),0===u&&0===m&&(0,t.jsxs)(c.Ex,{variant:"default",size:"sm",children:[p," Added"]})]})})]})]})})})}function u(){let{kind:e}=(0,i.useParams)(),[s,r]=(0,a.useState)([]),n=o.rj.find(s=>s.id===e);if(!n)return(0,i.notFound)();let l=(0,o.o5)(e);return(0,a.useEffect)(()=>{fetch("/api/providers",{cache:"no-store"}).then(e=>e.json()).then(e=>r(e.connections||[])).catch(()=>{})},[]),(0,t.jsx)("div",{className:"flex flex-col gap-6",children:0===l.length?(0,t.jsxs)("div",{className:"text-center py-12 border border-dashed border-border rounded-xl text-text-muted text-sm",children:["No providers support ",(0,t.jsx)("strong",{children:n.label})," yet."]}):(0,t.jsx)("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",children:l.map(r=>(0,t.jsx)(h,{provider:r,kind:e,connections:s},r.id))})})}},34607:(e,s,r)=>{Promise.resolve().then(r.bind(r,16144))}},e=>{e.O(0,[2574,3862,123,1321,5497,8441,3794,7358],()=>e(e.s=34607)),_N_E=e.O()}]);
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6620],{16144:(e,s,r)=>{"use strict";r.r(s),r.d(s,{default:()=>u});var t=r(95155),i=r(73321),n=r(98500),l=r.n(n),a=r(12115),c=r(35497),d=r(57250),o=r(52679);function x(e){let s=Object.entries(e).some(([e,s])=>e.startsWith("modelLock_")&&s&&new Date(s).getTime()>Date.now());return"unavailable"!==e.testStatus||s?e.testStatus:"active"}function h({provider:e,kind:s,connections:r}){let i=o.Q2[e.id],n=!!i?.noAuth,a=r.filter(s=>s.provider===e.id),u=a.filter(e=>{let s=x(e);return"active"===s||"success"===s}).length,m=a.filter(e=>{let s=x(e);return"error"===s||"expired"===s||"unavailable"===s}).length,p=a.length,f=p>0&&a.every(e=>!1===e.isActive);return(0,t.jsx)(l(),{href:`/dashboard/media-providers/${s}/${e.id}`,className:"group",children:(0,t.jsx)(c.Zp,{padding:"xs",className:`h-full hover:bg-black/[0.01] dark:hover:bg-white/[0.01] transition-colors cursor-pointer ${f?"opacity-50":""}`,children:(0,t.jsxs)("div",{className:"flex items-center gap-3",children:[(0,t.jsx)("div",{className:"size-8 rounded-lg flex items-center justify-center shrink-0",style:{backgroundColor:`${e.color?.length>7?e.color:(e.color??"#888")+"15"}`},children:(0,t.jsx)(d.A,{src:`/providers/${e.id}.png`,alt:e.name,size:30,className:"object-contain rounded-lg max-w-[30px] max-h-[30px]",fallbackText:e.textIcon||e.id.slice(0,2).toUpperCase(),fallbackColor:e.color})}),(0,t.jsxs)("div",{children:[(0,t.jsx)("h3",{className:"font-semibold text-sm",children:e.name}),(0,t.jsx)("div",{className:"flex items-center gap-2 mt-0.5 flex-wrap",children:n?(0,t.jsx)(c.Ex,{variant:"success",size:"sm",children:"Ready"}):f?(0,t.jsx)(c.Ex,{variant:"default",size:"sm",children:"Disabled"}):0===p?(0,t.jsx)("span",{className:"text-xs text-text-muted",children:"No connections"}):(0,t.jsxs)(t.Fragment,{children:[u>0&&(0,t.jsxs)(c.Ex,{variant:"success",size:"sm",dot:!0,children:[u," Connected"]}),m>0&&(0,t.jsxs)(c.Ex,{variant:"error",size:"sm",dot:!0,children:[m," Error"]}),0===u&&0===m&&(0,t.jsxs)(c.Ex,{variant:"default",size:"sm",children:[p," Added"]})]})})]})]})})})}function u(){let{kind:e}=(0,i.useParams)(),[s,r]=(0,a.useState)([]),n=o.rj.find(s=>s.id===e);if(!n)return(0,i.notFound)();let l=(0,o.o5)(e);return(0,a.useEffect)(()=>{fetch("/api/providers",{cache:"no-store"}).then(e=>e.json()).then(e=>r(e.connections||[])).catch(()=>{})},[]),(0,t.jsx)("div",{className:"flex flex-col gap-6",children:0===l.length?(0,t.jsxs)("div",{className:"text-center py-12 border border-dashed border-border rounded-xl text-text-muted text-sm",children:["No providers support ",(0,t.jsx)("strong",{children:n.label})," yet."]}):(0,t.jsx)("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4",children:l.map(r=>(0,t.jsx)(h,{provider:r,kind:e,connections:s},r.id))})})}},34607:(e,s,r)=>{Promise.resolve().then(r.bind(r,16144))}},e=>{e.O(0,[2574,3862,1051,1321,5497,8441,3794,7358],()=>e(e.s=34607)),_N_E=e.O()}]);
@@ -1 +1 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6607],{23879:(e,s,t)=>{"use strict";t.d(s,{default:()=>r});var a=t(95155),n=t(12115),i=t(3534),o=t(28777),l=t(52679),c=t(86966);function r(){let[e,s]=(0,n.useState)([]),[t,r]=(0,n.useState)([]),[d,u]=(0,n.useState)({}),[h,p]=(0,n.useState)(!1),[f,w]=(0,n.useState)(null),[v,S]=(0,n.useState)({running:!1,certExists:!1,dnsStatus:{},hasCachedPassword:!1}),[g,k]=(0,n.useState)(!1),x=async()=>{try{let e=await fetch("/api/providers");if(e.ok){let t=await e.json();s(t.connections||[])}}catch{}},y=async()=>{try{let e=await fetch("/api/keys");if(e.ok){let s=await e.json();r(s.keys||[])}}catch{}},j=async()=>{try{let e=await fetch("/api/models/alias");if(e.ok){let s=await e.json();u(s.aliases||{})}}catch{}},m=async()=>{try{let e=await fetch("/api/settings");if(e.ok){let s=await e.json();p(s.cloudEnabled||!1),k(!!s.tokenSwapEnabled)}}catch{}};(0,n.useEffect)(()=>{(async()=>{await Promise.all([x(),y(),j(),m()])})()},[]);let E=()=>e.filter(e=>!1!==e.isActive),b=Object.entries(i.wn);return(0,a.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,a.jsx)(c.tA,{apiKeys:t,cloudEnabled:h,onStatusChange:S}),(0,a.jsx)("div",{className:"flex flex-col gap-2",children:b.map(([s,i])=>(0,a.jsxs)(n.Fragment,{children:[(0,a.jsx)(c.kn,{tool:i,isExpanded:f===s,onToggle:()=>w(f===s?null:s),serverRunning:v.running,dnsActive:v.dnsStatus?.[s]||!1,hasCachedPassword:v.hasCachedPassword||!1,apiKeys:t,activeProviders:E(),hasActiveProviders:E().some(e=>(0,o.KC)(e.provider).length>0||(0,l.mq)(e.provider)||(0,l.gb)(e.provider)),modelAliases:d,cloudEnabled:h,tokenSwapActive:i.supportsTokenSwap&&g,onDnsChange:e=>S(s=>({...s,dnsStatus:e.dnsStatus??s.dnsStatus}))}),i.supportsTokenSwap&&(0,a.jsx)(c.xm,{tool:i,connections:e,serverRunning:v.running,dnsActive:v.dnsStatus?.[s]||!1,onToggle:e=>k(e),onRefreshConnections:x})]},s))})]})}},60817:(e,s,t)=>{Promise.resolve().then(t.bind(t,23879))}},e=>{e.O(0,[2574,3862,123,5772,1321,5497,5601,8441,3794,7358],()=>e(e.s=60817)),_N_E=e.O()}]);
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6607],{23879:(e,s,t)=>{"use strict";t.d(s,{default:()=>r});var a=t(95155),n=t(12115),i=t(3534),o=t(28777),l=t(52679),c=t(86966);function r(){let[e,s]=(0,n.useState)([]),[t,r]=(0,n.useState)([]),[d,u]=(0,n.useState)({}),[h,p]=(0,n.useState)(!1),[f,w]=(0,n.useState)(null),[v,S]=(0,n.useState)({running:!1,certExists:!1,dnsStatus:{},hasCachedPassword:!1}),[g,k]=(0,n.useState)(!1),x=async()=>{try{let e=await fetch("/api/providers");if(e.ok){let t=await e.json();s(t.connections||[])}}catch{}},y=async()=>{try{let e=await fetch("/api/keys");if(e.ok){let s=await e.json();r(s.keys||[])}}catch{}},j=async()=>{try{let e=await fetch("/api/models/alias");if(e.ok){let s=await e.json();u(s.aliases||{})}}catch{}},m=async()=>{try{let e=await fetch("/api/settings");if(e.ok){let s=await e.json();p(s.cloudEnabled||!1),k(!!s.tokenSwapEnabled)}}catch{}};(0,n.useEffect)(()=>{(async()=>{await Promise.all([x(),y(),j(),m()])})()},[]);let E=()=>e.filter(e=>!1!==e.isActive),b=Object.entries(i.wn);return(0,a.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,a.jsx)(c.tA,{apiKeys:t,cloudEnabled:h,onStatusChange:S}),(0,a.jsx)("div",{className:"flex flex-col gap-2",children:b.map(([s,i])=>(0,a.jsxs)(n.Fragment,{children:[(0,a.jsx)(c.kn,{tool:i,isExpanded:f===s,onToggle:()=>w(f===s?null:s),serverRunning:v.running,dnsActive:v.dnsStatus?.[s]||!1,hasCachedPassword:v.hasCachedPassword||!1,apiKeys:t,activeProviders:E(),hasActiveProviders:E().some(e=>(0,o.KC)(e.provider).length>0||(0,l.mq)(e.provider)||(0,l.gb)(e.provider)),modelAliases:d,cloudEnabled:h,tokenSwapActive:i.supportsTokenSwap&&g,onDnsChange:e=>S(s=>({...s,dnsStatus:e.dnsStatus??s.dnsStatus}))}),i.supportsTokenSwap&&(0,a.jsx)(c.xm,{tool:i,connections:e,serverRunning:v.running,dnsActive:v.dnsStatus?.[s]||!1,onToggle:e=>k(e),onRefreshConnections:x})]},s))})]})}},60817:(e,s,t)=>{Promise.resolve().then(t.bind(t,23879))}},e=>{e.O(0,[2574,3862,1051,5772,1321,5497,5601,8441,3794,7358],()=>e(e.s=60817)),_N_E=e.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6337],{},_=>{_.O(0,[2574,3862,1051,1321,5497,2589,8441,3794,7358],()=>_(_.s=42589)),_N_E=_.O()}]);
@@ -1 +1 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3471],{64561:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>d});var a=s(95155),r=s(12115),o=s(35497),n=s(1620),i=s(31474),l=s(90620);function d(){let{theme:e,setTheme:t,isDark:s}=(0,n.D)(),[d,c]=(0,r.useState)({fallbackStrategy:"fill-first"}),[m,x]=(0,r.useState)(!0),[p,u]=(0,r.useState)({current:"",new:"",confirm:""}),[h,b]=(0,r.useState)({type:"",message:""}),[y,g]=(0,r.useState)(!1),[f,j]=(0,r.useState)(!1),[N,v]=(0,r.useState)({type:"",message:""}),w=(0,r.useRef)(null),[P,k]=(0,r.useState)({outboundProxyEnabled:!1,outboundProxyUrl:"",outboundNoProxy:""}),[C,S]=(0,r.useState)({type:"",message:""}),[O,R]=(0,r.useState)(!1),[E,T]=(0,r.useState)(!1);(0,r.useEffect)(()=>{fetch("/api/settings").then(e=>e.json()).then(e=>{c(e),k({outboundProxyEnabled:e?.outboundProxyEnabled===!0,outboundProxyUrl:e?.outboundProxyUrl||"",outboundNoProxy:e?.outboundNoProxy||""}),x(!1)}).catch(e=>{console.error("Failed to fetch settings:",e),x(!1)})},[]);let L=async e=>{if(e.preventDefault(),!0===d.outboundProxyEnabled){R(!0),S({type:"",message:""});try{let e=await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({outboundProxyUrl:P.outboundProxyUrl,outboundNoProxy:P.outboundNoProxy})}),t=await e.json();e.ok?(c(e=>({...e,...t})),S({type:"success",message:"Proxy settings applied"})):S({type:"error",message:t.error||"Failed to update proxy settings"})}catch(e){S({type:"error",message:"An error occurred"})}finally{R(!1)}}},F=async()=>{if(!0!==d.outboundProxyEnabled)return;let e=(P.outboundProxyUrl||"").trim();if(!e)return void S({type:"error",message:"Please enter a Proxy URL to test"});T(!0),S({type:"",message:""});try{let t=await fetch("/api/settings/proxy-test",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({proxyUrl:e})}),s=await t.json();t.ok&&s?.ok?S({type:"success",message:`Proxy test OK (${s.status}) in ${s.elapsedMs}ms`}):S({type:"error",message:s?.error||"Proxy test failed"})}catch(e){S({type:"error",message:"An error occurred"})}finally{T(!1)}},U=async e=>{R(!0),S({type:"",message:""});try{let t=await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({outboundProxyEnabled:e})}),s=await t.json();t.ok?(c(e=>({...e,...s})),k(e=>({...e,outboundProxyEnabled:s?.outboundProxyEnabled===!0})),S({type:"success",message:e?"Proxy enabled":"Proxy disabled"})):S({type:"error",message:s.error||"Failed to update proxy settings"})}catch(e){S({type:"error",message:"An error occurred"})}finally{R(!1)}},A=async e=>{if(e.preventDefault(),p.new!==p.confirm)return void b({type:"error",message:"Passwords do not match"});g(!0),b({type:"",message:""});try{let e=await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({currentPassword:p.current,newPassword:p.new})}),t=await e.json();e.ok?(b({type:"success",message:"Password updated successfully"}),u({current:"",new:"",confirm:""})):b({type:"error",message:t.error||"Failed to update password"})}catch(e){b({type:"error",message:"An error occurred"})}finally{g(!1)}},q=async e=>{try{(await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({fallbackStrategy:e})})).ok&&c(t=>({...t,fallbackStrategy:e}))}catch(e){console.error("Failed to update settings:",e)}},J=async e=>{try{(await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({comboStrategy:e})})).ok&&c(t=>({...t,comboStrategy:e}))}catch(e){console.error("Failed to update combo strategy:",e)}},$=async e=>{let t=parseInt(e);if(!isNaN(t)&&!(t<1))try{(await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({stickyRoundRobinLimit:t})})).ok&&c(e=>({...e,stickyRoundRobinLimit:t}))}catch(e){console.error("Failed to update sticky limit:",e)}},D=async e=>{try{(await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({requireLogin:e})})).ok&&c(t=>({...t,requireLogin:e}))}catch(e){console.error("Failed to update require login:",e)}},H=async e=>{try{(await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({enableObservability:e})})).ok&&c(t=>({...t,enableObservability:e}))}catch(e){console.error("Failed to update enableObservability:",e)}},M=async()=>{try{let e=await fetch("/api/settings");if(!e.ok)return;let t=await e.json();c(t)}catch(e){console.error("Failed to reload settings:",e)}},_=async()=>{j(!0),v({type:"",message:""});try{let e=await fetch("/api/settings/database");if(!e.ok){let t=await e.json().catch(()=>({}));throw Error(t.error||"Failed to export database")}let t=await e.json(),s=JSON.stringify(t,null,2),a=new Blob([s],{type:"application/json"}),r=URL.createObjectURL(a),o=document.createElement("a"),n=new Date().toISOString().replace(/[.:]/g,"-");o.href=r,o.download=`9router-backup-${n}.json`,document.body.appendChild(o),o.click(),document.body.removeChild(o),URL.revokeObjectURL(r),v({type:"success",message:"Database backup downloaded"})}catch(e){v({type:"error",message:e.message||"Failed to export database"})}finally{j(!1)}},Z=async e=>{let t=e.target.files?.[0];if(t){j(!0),v({type:"",message:""});try{let e=await t.text(),s=JSON.parse(e),a=await fetch("/api/settings/database",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)}),r=await a.json().catch(()=>({}));if(!a.ok)throw Error(r.error||"Failed to import database");await M(),v({type:"success",message:"Database imported successfully"})}catch(e){v({type:"error",message:e.message||"Invalid backup file"})}finally{w.current&&(w.current.value=""),j(!1)}}},I=!0===d.enableObservability;return(0,a.jsx)("div",{className:"max-w-2xl mx-auto",children:(0,a.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,a.jsxs)(o.Zp,{children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,a.jsxs)("div",{className:"flex items-center gap-4",children:[(0,a.jsx)("div",{className:"size-12 rounded-lg bg-green-500/10 text-green-500 flex items-center justify-center",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-2xl",children:"computer"})}),(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"text-xl font-semibold",children:"Local Mode"}),(0,a.jsx)("p",{className:"text-text-muted",children:"Running on your machine"})]})]}),(0,a.jsx)("div",{className:"inline-flex p-1 rounded-lg bg-black/5 dark:bg-white/5",children:["light","dark","system"].map(s=>(0,a.jsxs)("button",{type:"button",onClick:()=>t(s),className:(0,i.cn)("flex items-center gap-1.5 px-3 py-1.5 rounded-md font-medium transition-all",e===s?"bg-white dark:bg-white/10 text-text-main shadow-sm":"text-text-muted hover:text-text-main"),children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"light"===s?"light_mode":"dark"===s?"dark_mode":"contrast"}),(0,a.jsx)("span",{className:"capitalize text-sm",children:s})]},s))})]}),(0,a.jsxs)("div",{className:"flex flex-col gap-3 pt-4 border-t border-border",children:[(0,a.jsx)("div",{className:"flex items-center justify-between p-3 rounded-lg bg-bg border border-border",children:(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"font-medium",children:"Database Location"}),(0,a.jsx)("p",{className:"text-sm text-text-muted font-mono",children:"~/.n9router/db.json"})]})}),(0,a.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,a.jsx)(o.$n,{variant:"secondary",icon:"download",onClick:_,loading:f,children:"Download Backup"}),(0,a.jsx)(o.$n,{variant:"outline",icon:"upload",onClick:()=>w.current?.click(),disabled:f,children:"Import Backup"}),(0,a.jsx)("input",{ref:w,type:"file",accept:"application/json,.json",className:"hidden",onChange:Z})]}),N.message&&(0,a.jsx)("p",{className:`text-sm ${"error"===N.type?"text-red-500":"text-green-600 dark:text-green-400"}`,children:N.message})]})]}),(0,a.jsxs)(o.Zp,{children:[(0,a.jsxs)("div",{className:"flex items-center gap-3 mb-4",children:[(0,a.jsx)("div",{className:"p-2 rounded-lg bg-primary/10 text-primary",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[20px]",children:"shield"})}),(0,a.jsx)("h3",{className:"text-lg font-semibold",children:"Security"})]}),(0,a.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"font-medium",children:"Require login"}),(0,a.jsx)("p",{className:"text-sm text-text-muted",children:"When ON, dashboard requires password. When OFF, access without login."})]}),(0,a.jsx)(o.lM,{checked:!0===d.requireLogin,onChange:()=>D(!d.requireLogin),disabled:m})]}),!0===d.requireLogin&&(0,a.jsxs)("form",{onSubmit:A,className:"flex flex-col gap-4 pt-4 border-t border-border/50",children:[d.hasPassword&&(0,a.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,a.jsx)("label",{className:"text-sm font-medium",children:"Current Password"}),(0,a.jsx)(o.pd,{type:"password",placeholder:"Enter current password",value:p.current,onChange:e=>u({...p,current:e.target.value}),required:!0})]}),(0,a.jsxs)("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[(0,a.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,a.jsx)("label",{className:"text-sm font-medium",children:"New Password"}),(0,a.jsx)(o.pd,{type:"password",placeholder:"Enter new password",value:p.new,onChange:e=>u({...p,new:e.target.value}),required:!0})]}),(0,a.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,a.jsx)("label",{className:"text-sm font-medium",children:"Confirm New Password"}),(0,a.jsx)(o.pd,{type:"password",placeholder:"Confirm new password",value:p.confirm,onChange:e=>u({...p,confirm:e.target.value}),required:!0})]})]}),h.message&&(0,a.jsx)("p",{className:`text-sm ${"error"===h.type?"text-red-500":"text-green-500"}`,children:h.message}),(0,a.jsx)("div",{className:"pt-2",children:(0,a.jsx)(o.$n,{type:"submit",variant:"primary",loading:y,children:d.hasPassword?"Update Password":"Set Password"})})]})]})]}),(0,a.jsxs)(o.Zp,{children:[(0,a.jsxs)("div",{className:"flex items-center gap-3 mb-4",children:[(0,a.jsx)("div",{className:"p-2 rounded-lg bg-blue-500/10 text-blue-500",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[20px]",children:"route"})}),(0,a.jsx)("h3",{className:"text-lg font-semibold",children:"Routing Strategy"})]}),(0,a.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"font-medium",children:"Round Robin"}),(0,a.jsx)("p",{className:"text-sm text-text-muted",children:"Cycle through accounts to distribute load"})]}),(0,a.jsx)(o.lM,{checked:"round-robin"===d.fallbackStrategy,onChange:()=>q("round-robin"===d.fallbackStrategy?"fill-first":"round-robin"),disabled:m})]}),"round-robin"===d.fallbackStrategy&&(0,a.jsxs)("div",{className:"flex items-center justify-between pt-2 border-t border-border/50",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"font-medium",children:"Sticky Limit"}),(0,a.jsx)("p",{className:"text-sm text-text-muted",children:"Calls per account before switching"})]}),(0,a.jsx)(o.pd,{type:"number",min:"1",max:"10",value:d.stickyRoundRobinLimit||3,onChange:e=>$(e.target.value),disabled:m,className:"w-20 text-center"})]}),(0,a.jsxs)("div",{className:"flex items-center justify-between pt-4 border-t border-border/50",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"font-medium",children:"Combo Round Robin"}),(0,a.jsx)("p",{className:"text-sm text-text-muted",children:"Cycle through providers in combos instead of always starting with first"})]}),(0,a.jsx)(o.lM,{checked:"round-robin"===d.comboStrategy,onChange:()=>J("round-robin"===d.comboStrategy?"fallback":"round-robin"),disabled:m})]}),(0,a.jsx)("p",{className:"text-xs text-text-muted italic pt-2 border-t border-border/50",children:"round-robin"===d.fallbackStrategy?`Currently distributing requests across all available accounts with ${d.stickyRoundRobinLimit||3} calls per account.`:"Currently using accounts in priority order (Fill First)."})]})]}),(0,a.jsxs)(o.Zp,{children:[(0,a.jsxs)("div",{className:"flex items-center gap-3 mb-4",children:[(0,a.jsx)("div",{className:"p-2 rounded-lg bg-purple-500/10 text-purple-500",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[20px]",children:"wifi"})}),(0,a.jsx)("h3",{className:"text-lg font-semibold",children:"Network"})]}),(0,a.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"font-medium",children:"Outbound Proxy"}),(0,a.jsx)("p",{className:"text-sm text-text-muted",children:"Enable proxy for OAuth + provider outbound requests."})]}),(0,a.jsx)(o.lM,{checked:!0===d.outboundProxyEnabled,onChange:()=>U(!0!==d.outboundProxyEnabled),disabled:m||O})]}),!0===d.outboundProxyEnabled&&(0,a.jsxs)("form",{onSubmit:L,className:"flex flex-col gap-4 pt-2 border-t border-border/50",children:[(0,a.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,a.jsx)("label",{className:"font-medium",children:"Proxy URL"}),(0,a.jsx)(o.pd,{placeholder:"http://127.0.0.1:7897",value:P.outboundProxyUrl,onChange:e=>k(t=>({...t,outboundProxyUrl:e.target.value})),disabled:m||O}),(0,a.jsx)("p",{className:"text-sm text-text-muted",children:"Leave empty to inherit existing env proxy (if any)."})]}),(0,a.jsxs)("div",{className:"flex flex-col gap-2 pt-2 border-t border-border/50",children:[(0,a.jsx)("label",{className:"font-medium",children:"No Proxy"}),(0,a.jsx)(o.pd,{placeholder:"localhost,127.0.0.1",value:P.outboundNoProxy,onChange:e=>k(t=>({...t,outboundNoProxy:e.target.value})),disabled:m||O}),(0,a.jsx)("p",{className:"text-sm text-text-muted",children:"Comma-separated hostnames/domains to bypass the proxy."})]}),(0,a.jsxs)("div",{className:"pt-2 border-t border-border/50 flex items-center gap-2",children:[(0,a.jsx)(o.$n,{type:"button",variant:"secondary",loading:E,disabled:m||O,onClick:F,children:"Test proxy URL"}),(0,a.jsx)(o.$n,{type:"submit",variant:"primary",loading:O,children:"Apply"})]})]}),C.message&&(0,a.jsx)("p",{className:`text-sm ${"error"===C.type?"text-red-500":"text-green-500"} pt-2 border-t border-border/50`,children:C.message})]})]}),(0,a.jsxs)(o.Zp,{children:[(0,a.jsxs)("div",{className:"flex items-center gap-3 mb-4",children:[(0,a.jsx)("div",{className:"p-2 rounded-lg bg-orange-500/10 text-orange-500",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[20px]",children:"monitoring"})}),(0,a.jsx)("h3",{className:"text-lg font-semibold",children:"Observability"})]}),(0,a.jsxs)("div",{className:"flex items-center justify-between",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"font-medium",children:"Enable Observability"}),(0,a.jsx)("p",{className:"text-sm text-text-muted",children:"Record request details for inspection in the logs view"})]}),(0,a.jsx)(o.lM,{checked:I,onChange:H,disabled:m})]})]}),(0,a.jsxs)("div",{className:"text-center text-sm text-text-muted py-4",children:[(0,a.jsxs)("p",{children:[l.vQ.name," v",l.vQ.version]}),(0,a.jsx)("p",{className:"mt-1",children:"Local Mode - All data stored on your machine"})]})]})})}},68594:(e,t,s)=>{Promise.resolve().then(s.bind(s,64561))}},e=>{e.O(0,[2574,3862,123,1321,5497,8441,3794,7358],()=>e(e.s=68594)),_N_E=e.O()}]);
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3471],{64561:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>d});var a=s(95155),r=s(12115),o=s(35497),n=s(1620),i=s(31474),l=s(90620);function d(){let{theme:e,setTheme:t,isDark:s}=(0,n.D)(),[d,c]=(0,r.useState)({fallbackStrategy:"fill-first"}),[m,x]=(0,r.useState)(!0),[p,u]=(0,r.useState)({current:"",new:"",confirm:""}),[h,b]=(0,r.useState)({type:"",message:""}),[y,g]=(0,r.useState)(!1),[f,j]=(0,r.useState)(!1),[N,v]=(0,r.useState)({type:"",message:""}),w=(0,r.useRef)(null),[P,k]=(0,r.useState)({outboundProxyEnabled:!1,outboundProxyUrl:"",outboundNoProxy:""}),[C,S]=(0,r.useState)({type:"",message:""}),[O,R]=(0,r.useState)(!1),[E,T]=(0,r.useState)(!1);(0,r.useEffect)(()=>{fetch("/api/settings").then(e=>e.json()).then(e=>{c(e),k({outboundProxyEnabled:e?.outboundProxyEnabled===!0,outboundProxyUrl:e?.outboundProxyUrl||"",outboundNoProxy:e?.outboundNoProxy||""}),x(!1)}).catch(e=>{console.error("Failed to fetch settings:",e),x(!1)})},[]);let L=async e=>{if(e.preventDefault(),!0===d.outboundProxyEnabled){R(!0),S({type:"",message:""});try{let e=await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({outboundProxyUrl:P.outboundProxyUrl,outboundNoProxy:P.outboundNoProxy})}),t=await e.json();e.ok?(c(e=>({...e,...t})),S({type:"success",message:"Proxy settings applied"})):S({type:"error",message:t.error||"Failed to update proxy settings"})}catch(e){S({type:"error",message:"An error occurred"})}finally{R(!1)}}},F=async()=>{if(!0!==d.outboundProxyEnabled)return;let e=(P.outboundProxyUrl||"").trim();if(!e)return void S({type:"error",message:"Please enter a Proxy URL to test"});T(!0),S({type:"",message:""});try{let t=await fetch("/api/settings/proxy-test",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({proxyUrl:e})}),s=await t.json();t.ok&&s?.ok?S({type:"success",message:`Proxy test OK (${s.status}) in ${s.elapsedMs}ms`}):S({type:"error",message:s?.error||"Proxy test failed"})}catch(e){S({type:"error",message:"An error occurred"})}finally{T(!1)}},U=async e=>{R(!0),S({type:"",message:""});try{let t=await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({outboundProxyEnabled:e})}),s=await t.json();t.ok?(c(e=>({...e,...s})),k(e=>({...e,outboundProxyEnabled:s?.outboundProxyEnabled===!0})),S({type:"success",message:e?"Proxy enabled":"Proxy disabled"})):S({type:"error",message:s.error||"Failed to update proxy settings"})}catch(e){S({type:"error",message:"An error occurred"})}finally{R(!1)}},A=async e=>{if(e.preventDefault(),p.new!==p.confirm)return void b({type:"error",message:"Passwords do not match"});g(!0),b({type:"",message:""});try{let e=await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({currentPassword:p.current,newPassword:p.new})}),t=await e.json();e.ok?(b({type:"success",message:"Password updated successfully"}),u({current:"",new:"",confirm:""})):b({type:"error",message:t.error||"Failed to update password"})}catch(e){b({type:"error",message:"An error occurred"})}finally{g(!1)}},q=async e=>{try{(await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({fallbackStrategy:e})})).ok&&c(t=>({...t,fallbackStrategy:e}))}catch(e){console.error("Failed to update settings:",e)}},J=async e=>{try{(await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({comboStrategy:e})})).ok&&c(t=>({...t,comboStrategy:e}))}catch(e){console.error("Failed to update combo strategy:",e)}},$=async e=>{let t=parseInt(e);if(!isNaN(t)&&!(t<1))try{(await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({stickyRoundRobinLimit:t})})).ok&&c(e=>({...e,stickyRoundRobinLimit:t}))}catch(e){console.error("Failed to update sticky limit:",e)}},D=async e=>{try{(await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({requireLogin:e})})).ok&&c(t=>({...t,requireLogin:e}))}catch(e){console.error("Failed to update require login:",e)}},H=async e=>{try{(await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({enableObservability:e})})).ok&&c(t=>({...t,enableObservability:e}))}catch(e){console.error("Failed to update enableObservability:",e)}},M=async()=>{try{let e=await fetch("/api/settings");if(!e.ok)return;let t=await e.json();c(t)}catch(e){console.error("Failed to reload settings:",e)}},_=async()=>{j(!0),v({type:"",message:""});try{let e=await fetch("/api/settings/database");if(!e.ok){let t=await e.json().catch(()=>({}));throw Error(t.error||"Failed to export database")}let t=await e.json(),s=JSON.stringify(t,null,2),a=new Blob([s],{type:"application/json"}),r=URL.createObjectURL(a),o=document.createElement("a"),n=new Date().toISOString().replace(/[.:]/g,"-");o.href=r,o.download=`9router-backup-${n}.json`,document.body.appendChild(o),o.click(),document.body.removeChild(o),URL.revokeObjectURL(r),v({type:"success",message:"Database backup downloaded"})}catch(e){v({type:"error",message:e.message||"Failed to export database"})}finally{j(!1)}},Z=async e=>{let t=e.target.files?.[0];if(t){j(!0),v({type:"",message:""});try{let e=await t.text(),s=JSON.parse(e),a=await fetch("/api/settings/database",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)}),r=await a.json().catch(()=>({}));if(!a.ok)throw Error(r.error||"Failed to import database");await M(),v({type:"success",message:"Database imported successfully"})}catch(e){v({type:"error",message:e.message||"Invalid backup file"})}finally{w.current&&(w.current.value=""),j(!1)}}},I=!0===d.enableObservability;return(0,a.jsx)("div",{className:"max-w-2xl mx-auto",children:(0,a.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,a.jsxs)(o.Zp,{children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,a.jsxs)("div",{className:"flex items-center gap-4",children:[(0,a.jsx)("div",{className:"size-12 rounded-lg bg-green-500/10 text-green-500 flex items-center justify-center",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-2xl",children:"computer"})}),(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"text-xl font-semibold",children:"Local Mode"}),(0,a.jsx)("p",{className:"text-text-muted",children:"Running on your machine"})]})]}),(0,a.jsx)("div",{className:"inline-flex p-1 rounded-lg bg-black/5 dark:bg-white/5",children:["light","dark","system"].map(s=>(0,a.jsxs)("button",{type:"button",onClick:()=>t(s),className:(0,i.cn)("flex items-center gap-1.5 px-3 py-1.5 rounded-md font-medium transition-all",e===s?"bg-white dark:bg-white/10 text-text-main shadow-sm":"text-text-muted hover:text-text-main"),children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"light"===s?"light_mode":"dark"===s?"dark_mode":"contrast"}),(0,a.jsx)("span",{className:"capitalize text-sm",children:s})]},s))})]}),(0,a.jsxs)("div",{className:"flex flex-col gap-3 pt-4 border-t border-border",children:[(0,a.jsx)("div",{className:"flex items-center justify-between p-3 rounded-lg bg-bg border border-border",children:(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"font-medium",children:"Database Location"}),(0,a.jsx)("p",{className:"text-sm text-text-muted font-mono",children:"~/.n9router/db.json"})]})}),(0,a.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,a.jsx)(o.$n,{variant:"secondary",icon:"download",onClick:_,loading:f,children:"Download Backup"}),(0,a.jsx)(o.$n,{variant:"outline",icon:"upload",onClick:()=>w.current?.click(),disabled:f,children:"Import Backup"}),(0,a.jsx)("input",{ref:w,type:"file",accept:"application/json,.json",className:"hidden",onChange:Z})]}),N.message&&(0,a.jsx)("p",{className:`text-sm ${"error"===N.type?"text-red-500":"text-green-600 dark:text-green-400"}`,children:N.message})]})]}),(0,a.jsxs)(o.Zp,{children:[(0,a.jsxs)("div",{className:"flex items-center gap-3 mb-4",children:[(0,a.jsx)("div",{className:"p-2 rounded-lg bg-primary/10 text-primary",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[20px]",children:"shield"})}),(0,a.jsx)("h3",{className:"text-lg font-semibold",children:"Security"})]}),(0,a.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"font-medium",children:"Require login"}),(0,a.jsx)("p",{className:"text-sm text-text-muted",children:"When ON, dashboard requires password. When OFF, access without login."})]}),(0,a.jsx)(o.lM,{checked:!0===d.requireLogin,onChange:()=>D(!d.requireLogin),disabled:m})]}),!0===d.requireLogin&&(0,a.jsxs)("form",{onSubmit:A,className:"flex flex-col gap-4 pt-4 border-t border-border/50",children:[d.hasPassword&&(0,a.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,a.jsx)("label",{className:"text-sm font-medium",children:"Current Password"}),(0,a.jsx)(o.pd,{type:"password",placeholder:"Enter current password",value:p.current,onChange:e=>u({...p,current:e.target.value}),required:!0})]}),(0,a.jsxs)("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[(0,a.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,a.jsx)("label",{className:"text-sm font-medium",children:"New Password"}),(0,a.jsx)(o.pd,{type:"password",placeholder:"Enter new password",value:p.new,onChange:e=>u({...p,new:e.target.value}),required:!0})]}),(0,a.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,a.jsx)("label",{className:"text-sm font-medium",children:"Confirm New Password"}),(0,a.jsx)(o.pd,{type:"password",placeholder:"Confirm new password",value:p.confirm,onChange:e=>u({...p,confirm:e.target.value}),required:!0})]})]}),h.message&&(0,a.jsx)("p",{className:`text-sm ${"error"===h.type?"text-red-500":"text-green-500"}`,children:h.message}),(0,a.jsx)("div",{className:"pt-2",children:(0,a.jsx)(o.$n,{type:"submit",variant:"primary",loading:y,children:d.hasPassword?"Update Password":"Set Password"})})]})]})]}),(0,a.jsxs)(o.Zp,{children:[(0,a.jsxs)("div",{className:"flex items-center gap-3 mb-4",children:[(0,a.jsx)("div",{className:"p-2 rounded-lg bg-blue-500/10 text-blue-500",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[20px]",children:"route"})}),(0,a.jsx)("h3",{className:"text-lg font-semibold",children:"Routing Strategy"})]}),(0,a.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"font-medium",children:"Round Robin"}),(0,a.jsx)("p",{className:"text-sm text-text-muted",children:"Cycle through accounts to distribute load"})]}),(0,a.jsx)(o.lM,{checked:"round-robin"===d.fallbackStrategy,onChange:()=>q("round-robin"===d.fallbackStrategy?"fill-first":"round-robin"),disabled:m})]}),"round-robin"===d.fallbackStrategy&&(0,a.jsxs)("div",{className:"flex items-center justify-between pt-2 border-t border-border/50",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"font-medium",children:"Sticky Limit"}),(0,a.jsx)("p",{className:"text-sm text-text-muted",children:"Calls per account before switching"})]}),(0,a.jsx)(o.pd,{type:"number",min:"1",max:"10",value:d.stickyRoundRobinLimit||3,onChange:e=>$(e.target.value),disabled:m,className:"w-20 text-center"})]}),(0,a.jsxs)("div",{className:"flex items-center justify-between pt-4 border-t border-border/50",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"font-medium",children:"Combo Round Robin"}),(0,a.jsx)("p",{className:"text-sm text-text-muted",children:"Cycle through providers in combos instead of always starting with first"})]}),(0,a.jsx)(o.lM,{checked:"round-robin"===d.comboStrategy,onChange:()=>J("round-robin"===d.comboStrategy?"fallback":"round-robin"),disabled:m})]}),(0,a.jsx)("p",{className:"text-xs text-text-muted italic pt-2 border-t border-border/50",children:"round-robin"===d.fallbackStrategy?`Currently distributing requests across all available accounts with ${d.stickyRoundRobinLimit||3} calls per account.`:"Currently using accounts in priority order (Fill First)."})]})]}),(0,a.jsxs)(o.Zp,{children:[(0,a.jsxs)("div",{className:"flex items-center gap-3 mb-4",children:[(0,a.jsx)("div",{className:"p-2 rounded-lg bg-purple-500/10 text-purple-500",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[20px]",children:"wifi"})}),(0,a.jsx)("h3",{className:"text-lg font-semibold",children:"Network"})]}),(0,a.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"font-medium",children:"Outbound Proxy"}),(0,a.jsx)("p",{className:"text-sm text-text-muted",children:"Enable proxy for OAuth + provider outbound requests."})]}),(0,a.jsx)(o.lM,{checked:!0===d.outboundProxyEnabled,onChange:()=>U(!0!==d.outboundProxyEnabled),disabled:m||O})]}),!0===d.outboundProxyEnabled&&(0,a.jsxs)("form",{onSubmit:L,className:"flex flex-col gap-4 pt-2 border-t border-border/50",children:[(0,a.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,a.jsx)("label",{className:"font-medium",children:"Proxy URL"}),(0,a.jsx)(o.pd,{placeholder:"http://127.0.0.1:7897",value:P.outboundProxyUrl,onChange:e=>k(t=>({...t,outboundProxyUrl:e.target.value})),disabled:m||O}),(0,a.jsx)("p",{className:"text-sm text-text-muted",children:"Leave empty to inherit existing env proxy (if any)."})]}),(0,a.jsxs)("div",{className:"flex flex-col gap-2 pt-2 border-t border-border/50",children:[(0,a.jsx)("label",{className:"font-medium",children:"No Proxy"}),(0,a.jsx)(o.pd,{placeholder:"localhost,127.0.0.1",value:P.outboundNoProxy,onChange:e=>k(t=>({...t,outboundNoProxy:e.target.value})),disabled:m||O}),(0,a.jsx)("p",{className:"text-sm text-text-muted",children:"Comma-separated hostnames/domains to bypass the proxy."})]}),(0,a.jsxs)("div",{className:"pt-2 border-t border-border/50 flex items-center gap-2",children:[(0,a.jsx)(o.$n,{type:"button",variant:"secondary",loading:E,disabled:m||O,onClick:F,children:"Test proxy URL"}),(0,a.jsx)(o.$n,{type:"submit",variant:"primary",loading:O,children:"Apply"})]})]}),C.message&&(0,a.jsx)("p",{className:`text-sm ${"error"===C.type?"text-red-500":"text-green-500"} pt-2 border-t border-border/50`,children:C.message})]})]}),(0,a.jsxs)(o.Zp,{children:[(0,a.jsxs)("div",{className:"flex items-center gap-3 mb-4",children:[(0,a.jsx)("div",{className:"p-2 rounded-lg bg-orange-500/10 text-orange-500",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[20px]",children:"monitoring"})}),(0,a.jsx)("h3",{className:"text-lg font-semibold",children:"Observability"})]}),(0,a.jsxs)("div",{className:"flex items-center justify-between",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("p",{className:"font-medium",children:"Enable Observability"}),(0,a.jsx)("p",{className:"text-sm text-text-muted",children:"Record request details for inspection in the logs view"})]}),(0,a.jsx)(o.lM,{checked:I,onChange:H,disabled:m})]})]}),(0,a.jsxs)("div",{className:"text-center text-sm text-text-muted py-4",children:[(0,a.jsxs)("p",{children:[l.vQ.name," v",l.vQ.version]}),(0,a.jsx)("p",{className:"mt-1",children:"Local Mode - All data stored on your machine"})]})]})})}},68594:(e,t,s)=>{Promise.resolve().then(s.bind(s,64561))}},e=>{e.O(0,[2574,3862,1051,1321,5497,8441,3794,7358],()=>e(e.s=68594)),_N_E=e.O()}]);
@@ -0,0 +1,4 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2134],{17721:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>$});var i=s(95155),a=s(12115),r=s(73321),o=s(98500),n=s.n(o),l=s(5772),d=s(35497),c=s(52679),p=s(28777),x=s(11059);let m=new Map;async function u(e){if(!e?.url||!e?.type)return[];let t=m.get(e.url);if(t&&Date.now()<t.expiresAt)return t.data;try{let t=new URLSearchParams({url:e.url,type:e.type}),s=await fetch(`/api/providers/suggested-models?${t}`);if(!s.ok)return[];let i=(await s.json()).data??[];return m.set(e.url,{data:i,expiresAt:Date.now()+6e5}),i}catch{return[]}}var h=s(14051),y=s.n(h);function f({model:e,fullModel:t,alias:s,copied:a,onCopy:r,testStatus:o,isCustom:n,isFree:l,onDeleteAlias:d,onTest:c,isTesting:p}){let x="ok"===o?"#22c55e":"error"===o?"#ef4444":void 0;return(0,i.jsx)("div",{className:`group px-3 py-2 rounded-lg border ${"ok"===o?"border-green-500/40":"error"===o?"border-red-500/40":"border-border"} hover:bg-sidebar/50`,children:(0,i.jsxs)("div",{className:"flex items-center gap-2",children:[(0,i.jsx)("span",{className:"material-symbols-outlined text-base",style:x?{color:x}:void 0,children:"ok"===o?"check_circle":"error"===o?"cancel":"smart_toy"}),(0,i.jsxs)("div",{className:"flex flex-col gap-1",children:[(0,i.jsx)("code",{className:"text-xs text-text-muted font-mono bg-sidebar px-1.5 py-0.5 rounded",children:t}),e.name&&(0,i.jsx)("span",{className:"text-[9px] text-text-muted/70 italic pl-1",children:e.name})]}),c&&(0,i.jsxs)("div",{className:"relative group/btn",children:[(0,i.jsx)("button",{onClick:c,disabled:p,className:`p-0.5 hover:bg-sidebar rounded text-text-muted hover:text-primary transition-opacity ${p?"opacity-100":"opacity-0 group-hover:opacity-100"}`,children:(0,i.jsx)("span",{className:"material-symbols-outlined text-sm",style:p?{animation:"spin 1s linear infinite"}:void 0,children:p?"progress_activity":"science"})}),(0,i.jsx)("span",{className:"pointer-events-none absolute mt-1 top-5 left-1/2 -translate-x-1/2 text-[10px] text-text-muted whitespace-nowrap opacity-0 group-hover/btn:opacity-100 transition-opacity",children:p?"Testing...":"Test"})]}),(0,i.jsxs)("div",{className:"relative group/btn",children:[(0,i.jsx)("button",{onClick:()=>r(t,`model-${e.id}`),className:"p-0.5 hover:bg-sidebar rounded text-text-muted hover:text-primary",children:(0,i.jsx)("span",{className:"material-symbols-outlined text-sm",children:a===`model-${e.id}`?"check":"content_copy"})}),(0,i.jsx)("span",{className:"pointer-events-none absolute mt-1 top-5 left-1/2 -translate-x-1/2 text-[10px] text-text-muted whitespace-nowrap opacity-0 group-hover/btn:opacity-100 transition-opacity",children:a===`model-${e.id}`?"Copied!":"Copy"})]}),n&&(0,i.jsx)("button",{onClick:d,className:"p-0.5 hover:bg-red-500/10 rounded text-text-muted hover:text-red-500 opacity-0 group-hover:opacity-100 transition-opacity ml-auto",title:"Remove custom model",children:(0,i.jsx)("span",{className:"material-symbols-outlined text-sm",children:"close"})})]})})}function g({modelId:e,fullModel:t,copied:s,onCopy:a,onDeleteAlias:r,onTest:o,testStatus:n,isTesting:l}){let d="ok"===n?"#22c55e":"error"===n?"#ef4444":void 0;return(0,i.jsxs)("div",{className:`flex items-center gap-3 p-3 rounded-lg border ${"ok"===n?"border-green-500/40":"error"===n?"border-red-500/40":"border-border"} hover:bg-sidebar/50`,children:[(0,i.jsx)("span",{className:"material-symbols-outlined text-base text-text-muted",style:d?{color:d}:void 0,children:"ok"===n?"check_circle":"error"===n?"cancel":"smart_toy"}),(0,i.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,i.jsx)("p",{className:"text-sm font-medium truncate",children:e}),(0,i.jsxs)("div",{className:"flex items-center gap-1 mt-1",children:[(0,i.jsx)("code",{className:"text-xs text-text-muted font-mono bg-sidebar px-1.5 py-0.5 rounded",children:t}),(0,i.jsxs)("div",{className:"relative group/btn",children:[(0,i.jsx)("button",{onClick:()=>a(t,`model-${e}`),className:"p-0.5 hover:bg-sidebar rounded text-text-muted hover:text-primary",children:(0,i.jsx)("span",{className:"material-symbols-outlined text-sm",children:s===`model-${e}`?"check":"content_copy"})}),(0,i.jsx)("span",{className:"pointer-events-none absolute top-5 left-1/2 -translate-x-1/2 text-[10px] text-text-muted whitespace-nowrap opacity-0 group-hover/btn:opacity-100 transition-opacity",children:s===`model-${e}`?"Copied!":"Copy"})]}),o&&(0,i.jsxs)("div",{className:"relative group/btn",children:[(0,i.jsx)("button",{onClick:o,disabled:l,className:"p-0.5 hover:bg-sidebar rounded text-text-muted hover:text-primary transition-colors",children:(0,i.jsx)("span",{className:"material-symbols-outlined text-sm",style:l?{animation:"spin 1s linear infinite"}:void 0,children:l?"progress_activity":"science"})}),(0,i.jsx)("span",{className:"pointer-events-none absolute top-5 left-1/2 -translate-x-1/2 text-[10px] text-text-muted whitespace-nowrap opacity-0 group-hover/btn:opacity-100 transition-opacity",children:l?"Testing...":"Test"})]})]})]}),(0,i.jsx)("button",{onClick:r,className:"p-1 hover:bg-red-50 rounded text-red-500",title:"Remove model",children:(0,i.jsx)("span",{className:"material-symbols-outlined text-sm",children:"delete"})})]})}function b({providerStorageAlias:e,providerDisplayAlias:t,modelAliases:s,copied:r,onCopy:o,onSetAlias:n,onDeleteAlias:l,connections:c,isAnthropic:p}){let[x,m]=(0,a.useState)(""),[u,h]=(0,a.useState)(!1),[y,f]=(0,a.useState)(!1),[v,j]=(0,a.useState)(null),[N,k]=(0,a.useState)({}),w=async t=>{if(!v){j(t);try{let s=await fetch("/api/models/test",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:`${e}/${t}`})}),i=await s.json();k(e=>({...e,[t]:i.ok?"ok":"error"}))}catch{k(e=>({...e,[t]:"error"}))}finally{j(null)}}},C=Object.entries(s).filter(([,t])=>t.startsWith(`${e}/`)).map(([t,s])=>({modelId:s.replace(`${e}/`,""),fullModel:s,alias:t})),S=i=>{let a,r=`${e}/${i}`;if(Object.values(s).includes(r))return null;let o=(a=i.split("/"))[a.length-1];if(!s[o])return o;let n=`${t}-${o}`;return s[n]?null:n},$=async()=>{if(!x.trim()||u)return;let t=x.trim(),s=S(t);if(!s)return void alert("All suggested aliases already exist. Please choose a different model or remove conflicting aliases.");h(!0);try{await n(t,s,e),m("")}catch(e){console.log("Error adding model:",e)}finally{h(!1)}},A=async()=>{if(y)return;let t=c.find(e=>!1!==e.isActive);if(t){f(!0);try{let s=await fetch(`/api/providers/${t.id}/models`),i=await s.json();if(!s.ok)return void alert(i.error||"Failed to import models");let a=i.models||[];if(0===a.length)return void alert("No models returned from /models.");let r=0;for(let t of a){let s=t.id||t.name||t.model;if(!s)continue;let i=S(s);i&&(await n(s,i,e),r+=1)}0===r&&alert("No new models were added.")}catch(e){console.log("Error importing models:",e)}finally{f(!1)}}},P=c.some(e=>!1!==e.isActive);return(0,i.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,i.jsxs)("p",{className:"text-sm text-text-muted",children:["Add ",p?"Anthropic":"OpenAI","-compatible models manually or import them from the /models endpoint."]}),(0,i.jsxs)("div",{className:"flex items-end gap-2 flex-wrap",children:[(0,i.jsxs)("div",{className:"flex-1 min-w-[240px]",children:[(0,i.jsx)("label",{htmlFor:"new-compatible-model-input",className:"text-xs text-text-muted mb-1 block",children:"Model ID"}),(0,i.jsx)("input",{id:"new-compatible-model-input",type:"text",value:x,onChange:e=>m(e.target.value),onKeyDown:e=>"Enter"===e.key&&$(),placeholder:p?"claude-3-opus-20240229":"gpt-4o",className:"w-full px-3 py-2 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary"})]}),(0,i.jsx)(d.$n,{size:"sm",icon:"add",onClick:$,disabled:!x.trim()||u,children:u?"Adding...":"Add"}),(0,i.jsx)(d.$n,{size:"sm",variant:"secondary",icon:"download",onClick:A,disabled:!P||y,children:y?"Importing...":"Import from /models"})]}),!P&&(0,i.jsx)("p",{className:"text-xs text-text-muted",children:"Add a connection to enable importing models."}),C.length>0&&(0,i.jsx)("div",{className:"flex flex-col gap-3",children:C.map(({modelId:e,fullModel:s,alias:a})=>(0,i.jsx)(g,{modelId:e,fullModel:`${t}/${e}`,copied:r,onCopy:o,onDeleteAlias:()=>l(a),onTest:c.length>0?()=>w(e):void 0,testStatus:N[e],isTesting:v===e},s))})]})}function v({until:e}){let[t,s]=(0,a.useState)("");return((0,a.useEffect)(()=>{let t=()=>{let t=new Date(e).getTime()-Date.now();if(t<=0)return void s("");let i=Math.floor(t/1e3);if(i<60)s(`${i}s`);else if(i<3600)s(`${Math.floor(i/60)}m ${i%60}s`);else{let e=Math.floor(i/3600),t=Math.floor(i%3600/60);s(`${e}h ${t}m`)}};t();let i=setInterval(t,1e3);return()=>clearInterval(i)},[e]),t)?(0,i.jsxs)("span",{className:"text-xs text-orange-500 font-mono",children:["⏱ ",t]}):null}function j({connection:e,proxyPools:t,isOAuth:s,isFirst:r,isLast:o,onMoveUp:n,onMoveDown:l,onToggleActive:c,onUpdateProxy:p,onEdit:x,onDelete:m}){let[u,h]=(0,a.useState)(!1),[y,f]=(0,a.useState)(!1),g=(0,a.useRef)(null),b=new Map((t||[]).map(e=>[e.id,e])),N=e.providerSpecificData?.proxyPoolId||null,k=N?b.get(N):null,w=e.providerSpecificData?.connectionProxyEnabled===!0&&!!e.providerSpecificData?.connectionProxyUrl,C=!!N||w,S=k?`Pool: ${k.name}`:N?`Pool: ${N} (inactive/missing)`:w?`Legacy: ${e.providerSpecificData?.connectionProxyUrl}`:"",$="";if(k?.proxyUrl||e.providerSpecificData?.connectionProxyUrl){let t=k?.proxyUrl||e.providerSpecificData?.connectionProxyUrl;try{let e=new URL(t);$=`${e.protocol}//${e.hostname}${e.port?`:${e.port}`:""}`}catch{$=t}}let A=k?.noProxy||e.providerSpecificData?.connectionNoProxy||"",P="default";k?.isActive===!0?P="success":(N||w)&&(P="error"),(0,a.useEffect)(()=>{if(!u)return;let e=e=>{g.current&&!g.current.contains(e.target)&&h(!1)};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[u]);let T=async e=>{f(!0);try{await p("__none__"===e?null:e)}finally{f(!1),h(!1)}},O=s?e.name||e.email||e.displayName||"OAuth Account":e.name,[_,I]=(0,a.useState)(!1),R=Object.entries(e).filter(([e])=>e.startsWith("modelLock_")).map(([,e])=>e).filter(e=>!!e).sort()[0]||null;(0,a.useEffect)(()=>{let t=()=>{I(!!Object.entries(e).filter(([e])=>e.startsWith("modelLock_")).map(([,e])=>e).filter(e=>e&&new Date(e).getTime()>Date.now()).sort()[0])};t();let s=R?setInterval(t,1e3):null;return()=>{s&&clearInterval(s)}},[R]);let E="unavailable"!==e.testStatus||_?e.testStatus:"active";return(0,i.jsxs)("div",{className:`group flex items-center justify-between p-2 rounded-lg hover:bg-black/[0.02] dark:hover:bg-white/[0.02] transition-colors ${!1===e.isActive?"opacity-60":""}`,children:[(0,i.jsxs)("div",{className:"flex items-center gap-3 flex-1 min-w-0",children:[(0,i.jsxs)("div",{className:"flex flex-col",children:[(0,i.jsx)("button",{onClick:n,disabled:r,className:`p-0.5 rounded ${r?"text-text-muted/30 cursor-not-allowed":"hover:bg-sidebar text-text-muted hover:text-primary"}`,children:(0,i.jsx)("span",{className:"material-symbols-outlined text-sm",children:"keyboard_arrow_up"})}),(0,i.jsx)("button",{onClick:l,disabled:o,className:`p-0.5 rounded ${o?"text-text-muted/30 cursor-not-allowed":"hover:bg-sidebar text-text-muted hover:text-primary"}`,children:(0,i.jsx)("span",{className:"material-symbols-outlined text-sm",children:"keyboard_arrow_down"})})]}),(0,i.jsx)("span",{className:"material-symbols-outlined text-base text-text-muted",children:s?"lock":"key"}),(0,i.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,i.jsx)("p",{className:"text-sm font-medium truncate",children:O}),(0,i.jsxs)("div",{className:"flex items-center gap-2 mt-1",children:[(0,i.jsx)(d.Ex,{variant:!1===e.isActive?"default":"active"===E||"success"===E?"success":"error"===E||"expired"===E||"unavailable"===E?"error":"default",size:"sm",dot:!0,children:!1===e.isActive?"disabled":E||"Unknown"}),C&&(0,i.jsx)(d.Ex,{variant:P,size:"sm",children:"Proxy"}),_&&!1!==e.isActive&&(0,i.jsx)(v,{until:R}),e.lastError&&!1!==e.isActive&&(0,i.jsx)("span",{className:"text-xs text-red-500 truncate max-w-[300px]",title:e.lastError,children:e.lastError}),(0,i.jsxs)("span",{className:"text-xs text-text-muted",children:["#",e.priority]}),e.globalPriority&&(0,i.jsxs)("span",{className:"text-xs text-text-muted",children:["Auto: ",e.globalPriority]})]}),C&&(0,i.jsxs)("div",{className:"mt-1 flex items-center gap-2 flex-wrap",children:[(0,i.jsx)("span",{className:"text-[11px] text-text-muted truncate max-w-[420px]",title:S,children:S}),$&&(0,i.jsx)("code",{className:"text-[10px] font-mono bg-black/5 dark:bg-white/5 px-1 py-0.5 rounded text-text-muted",children:$}),A&&(0,i.jsxs)("span",{className:"text-[11px] text-text-muted truncate max-w-[320px]",title:A,children:["no_proxy: ",A]})]})]})]}),(0,i.jsxs)("div",{className:"flex items-center gap-2",children:[(0,i.jsxs)("div",{className:"flex gap-1",children:[(t||[]).length>0&&(0,i.jsxs)("div",{className:"relative",ref:g,children:[(0,i.jsxs)("button",{onClick:()=>h(e=>!e),className:`flex flex-col items-center px-2 py-1 rounded hover:bg-black/5 dark:hover:bg-white/5 transition-colors ${C?"text-primary":"text-text-muted hover:text-primary"}`,disabled:y,children:[(0,i.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:y?"progress_activity":"lan"}),(0,i.jsx)("span",{className:"text-[10px] leading-tight",children:"Proxy"})]}),u&&(0,i.jsxs)("div",{className:"absolute right-0 top-full mt-1 z-50 bg-bg border border-border rounded-lg shadow-lg py-1 min-w-[160px]",children:[(0,i.jsx)("button",{onClick:()=>T("__none__"),className:`w-full text-left px-3 py-1.5 text-sm hover:bg-black/5 dark:hover:bg-white/5 ${!N?"text-primary font-medium":"text-text-main"}`,children:"None"}),(t||[]).map(e=>(0,i.jsx)("button",{onClick:()=>T(e.id),className:`w-full text-left px-3 py-1.5 text-sm hover:bg-black/5 dark:hover:bg-white/5 ${N===e.id?"text-primary font-medium":"text-text-main"}`,children:e.name},e.id))]})]}),(0,i.jsxs)("button",{onClick:x,className:"flex flex-col items-center px-2 py-1 rounded hover:bg-black/5 dark:hover:bg-white/5 text-text-muted hover:text-primary",children:[(0,i.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"edit"}),(0,i.jsx)("span",{className:"text-[10px] leading-tight",children:"Edit"})]}),(0,i.jsxs)("button",{onClick:m,className:"flex flex-col items-center px-2 py-1 rounded hover:bg-red-500/10 text-red-500",children:[(0,i.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"delete"}),(0,i.jsx)("span",{className:"text-[10px] leading-tight",children:"Delete"})]})]}),(0,i.jsx)(d.lM,{size:"sm",checked:e.isActive??!0,onChange:c,title:e.isActive??!0?"Disable connection":"Enable connection"})]})]})}function N({isOpen:e,provider:t,providerName:s,isCompatible:r,isAnthropic:o,proxyPools:n,onSave:l,onClose:c}){let p="__none__",[x,m]=(0,a.useState)({name:"",apiKey:"",priority:1,proxyPoolId:p}),[u,h]=(0,a.useState)(!1),[y,f]=(0,a.useState)(null),[g,b]=(0,a.useState)(!1),v=async()=>{h(!0);try{let e=await fetch("/api/providers/validate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:t,apiKey:x.apiKey})}),s=await e.json();f(s.valid?"success":"failed")}catch{f("failed")}finally{h(!1)}},j=async()=>{if(t&&x.apiKey){b(!0);try{let e=!1;try{h(!0),f(null);let s=await fetch("/api/providers/validate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:t,apiKey:x.apiKey})});e=!!(await s.json()).valid,f(e?"success":"failed")}catch{f("failed")}finally{h(!1)}await l({name:x.name,apiKey:x.apiKey,priority:x.priority,proxyPoolId:x.proxyPoolId===p?null:x.proxyPoolId,testStatus:e?"active":"unknown",providerSpecificData:void 0})}finally{b(!1)}}};return t?(0,i.jsx)(d.aF,{isOpen:e,title:`Add ${s||t} API Key`,onClose:c,children:(0,i.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,i.jsx)(d.pd,{label:"Name",value:x.name,onChange:e=>m({...x,name:e.target.value}),placeholder:"Production Key"}),(0,i.jsxs)("div",{className:"flex gap-2",children:[(0,i.jsx)(d.pd,{label:"API Key",type:"password",value:x.apiKey,onChange:e=>m({...x,apiKey:e.target.value}),className:"flex-1"}),(0,i.jsx)("div",{className:"pt-6",children:(0,i.jsx)(d.$n,{onClick:v,disabled:!x.apiKey||u||g,variant:"secondary",children:u?"Checking...":"Check"})})]}),y&&(0,i.jsx)(d.Ex,{variant:"success"===y?"success":"error",children:"success"===y?"Valid":"Invalid"}),r&&(0,i.jsx)("p",{className:"text-xs text-text-muted",children:o?`Validation checks ${s||"Anthropic Compatible"} by verifying the API key.`:`Validation checks ${s||"OpenAI Compatible"} via /models on your base URL.`}),(0,i.jsx)(d.pd,{label:"Priority",type:"number",value:x.priority,onChange:e=>m({...x,priority:Number.parseInt(e.target.value)||1})}),(0,i.jsx)(d.l6,{label:"Proxy Pool",value:x.proxyPoolId,onChange:e=>m({...x,proxyPoolId:e.target.value}),options:[{value:p,label:"None"},...(n||[]).map(e=>({value:e.id,label:e.name}))],placeholder:"None"}),0===(n||[]).length&&(0,i.jsx)("p",{className:"text-xs text-text-muted",children:"No active proxy pools available. Create one in Proxy Pools page first."}),(0,i.jsx)("p",{className:"text-xs text-text-muted",children:"Legacy manual proxy fields are still accepted by API for backward compatibility."}),(0,i.jsxs)("div",{className:"flex gap-2",children:[(0,i.jsx)(d.$n,{onClick:j,fullWidth:!0,disabled:!x.name||!x.apiKey||g,children:g?"Saving...":"Save"}),(0,i.jsx)(d.$n,{onClick:c,variant:"ghost",fullWidth:!0,children:"Cancel"})]})]})}):null}function k({isOpen:e,node:t,onSave:s,onClose:r,isAnthropic:o}){let[n,l]=(0,a.useState)({name:"",prefix:"",apiType:"chat",baseUrl:"https://api.openai.com/v1"}),[c,p]=(0,a.useState)(!1),[x,m]=(0,a.useState)(""),[u,h]=(0,a.useState)(""),[y,f]=(0,a.useState)(!1),[g,b]=(0,a.useState)(null);(0,a.useEffect)(()=>{t&&l({name:t.name||"",prefix:t.prefix||"",apiType:t.apiType||"chat",baseUrl:t.baseUrl||(o?"https://api.anthropic.com/v1":"https://api.openai.com/v1")})},[t,o]);let v=async()=>{if(n.name.trim()&&n.prefix.trim()&&n.baseUrl.trim()){p(!0);try{let e={name:n.name,prefix:n.prefix,baseUrl:n.baseUrl};o||(e.apiType=n.apiType),await s(e)}finally{p(!1)}}},j=async()=>{f(!0);try{let e=await fetch("/api/provider-nodes/validate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({baseUrl:n.baseUrl,apiKey:x,type:o?"anthropic-compatible":"openai-compatible",modelId:u.trim()||void 0})}),t=await e.json();b(t.valid?"success":"failed")}catch{b("failed")}finally{f(!1)}};return t?(0,i.jsx)(d.aF,{isOpen:e,title:`Edit ${o?"Anthropic":"OpenAI"} Compatible`,onClose:r,children:(0,i.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,i.jsx)(d.pd,{label:"Name",value:n.name,onChange:e=>l({...n,name:e.target.value}),placeholder:`${o?"Anthropic":"OpenAI"} Compatible (Prod)`,hint:"Required. A friendly label for this node."}),(0,i.jsx)(d.pd,{label:"Prefix",value:n.prefix,onChange:e=>l({...n,prefix:e.target.value}),placeholder:o?"ac-prod":"oc-prod",hint:"Required. Used as the provider prefix for model IDs."}),!o&&(0,i.jsx)(d.l6,{label:"API Type",options:[{value:"chat",label:"Chat Completions"},{value:"responses",label:"Responses API"}],value:n.apiType,onChange:e=>l({...n,apiType:e.target.value})}),(0,i.jsx)(d.pd,{label:"Base URL",value:n.baseUrl,onChange:e=>l({...n,baseUrl:e.target.value}),placeholder:o?"https://api.anthropic.com/v1":"https://api.openai.com/v1",hint:`Use the base URL (ending in /v1) for your ${o?"Anthropic":"OpenAI"}-compatible API.`}),(0,i.jsxs)("div",{className:"flex gap-2",children:[(0,i.jsx)(d.pd,{label:"API Key (for Check)",type:"password",value:x,onChange:e=>m(e.target.value),className:"flex-1"}),(0,i.jsx)("div",{className:"pt-6",children:(0,i.jsx)(d.$n,{onClick:j,disabled:!x||y||!n.baseUrl.trim(),variant:"secondary",children:y?"Checking...":"Check"})})]}),(0,i.jsx)(d.pd,{label:"Model ID (optional)",value:u,onChange:e=>h(e.target.value),placeholder:"e.g. my-model-id",hint:"If provider lacks /models endpoint, enter a model ID to validate via chat/completions instead."}),g&&(0,i.jsx)(d.Ex,{variant:"success"===g?"success":"error",children:"success"===g?"Valid":"Invalid"}),(0,i.jsxs)("div",{className:"flex gap-2",children:[(0,i.jsx)(d.$n,{onClick:v,fullWidth:!0,disabled:!n.name.trim()||!n.prefix.trim()||!n.baseUrl.trim()||c,children:c?"Saving...":"Save"}),(0,i.jsx)(d.$n,{onClick:r,variant:"ghost",fullWidth:!0,children:"Cancel"})]})]})}):null}function w({isOpen:e,providerAlias:t,providerDisplayAlias:s,onSave:r,onClose:o}){let[n,l]=(0,a.useState)(""),[c,p]=(0,a.useState)(null),[x,m]=(0,a.useState)(""),[u,h]=(0,a.useState)(!1);(0,a.useEffect)(()=>{e&&(l(""),p(null),m(""))},[e]);let y=async()=>{if(n.trim()){p("testing"),m("");try{let e=await fetch("/api/models/test",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:`${t}/${n.trim()}`})}),s=await e.json();p(s.ok?"ok":"error"),m(s.error||"")}catch(e){p("error"),m(e.message)}}},f=async()=>{if(n.trim()&&!u){h(!0);try{await r(n.trim())}finally{h(!1)}}};return(0,i.jsx)(d.aF,{isOpen:e,onClose:o,title:"Add Custom Model",children:(0,i.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,i.jsxs)("div",{children:[(0,i.jsx)("label",{className:"text-sm font-medium mb-1.5 block",children:"Model ID"}),(0,i.jsxs)("div",{className:"flex gap-2",children:[(0,i.jsx)("input",{type:"text",value:n,onChange:e=>{l(e.target.value),p(null),m("")},onKeyDown:e=>{"Enter"===e.key&&y()},placeholder:"e.g. claude-opus-4-5",className:"flex-1 px-3 py-2 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary",autoFocus:!0}),(0,i.jsx)(d.$n,{variant:"secondary",icon:"science",loading:"testing"===c,onClick:y,disabled:!n.trim()||"testing"===c,children:"testing"===c?"Testing...":"Test"})]}),(0,i.jsxs)("p",{className:"text-xs text-text-muted mt-1",children:["Sent to provider as: ",(0,i.jsx)("code",{className:"font-mono bg-sidebar px-1 rounded",children:n.trim()||"model-id"})]})]}),"ok"===c&&(0,i.jsxs)("div",{className:"flex items-center gap-2 text-sm text-green-600",children:[(0,i.jsx)("span",{className:"material-symbols-outlined text-base",children:"check_circle"}),"Model is reachable"]}),"error"===c&&(0,i.jsxs)("div",{className:"flex items-start gap-2 text-sm text-red-500",children:[(0,i.jsx)("span",{className:"material-symbols-outlined text-base shrink-0",children:"cancel"}),(0,i.jsx)("span",{children:x||"Model not reachable"})]}),(0,i.jsxs)("div",{className:"flex gap-2 pt-1",children:[(0,i.jsx)(d.$n,{onClick:o,variant:"ghost",fullWidth:!0,size:"sm",children:"Cancel"}),(0,i.jsx)(d.$n,{onClick:f,fullWidth:!0,size:"sm",disabled:!n.trim()||u,children:u?"Adding...":"Add Model"})]})]})})}f.propTypes={model:y().shape({id:y().string.isRequired}).isRequired,fullModel:y().string.isRequired,alias:y().string,copied:y().string,onCopy:y().func.isRequired,testStatus:y().oneOf(["ok","error"]),isCustom:y().bool,isFree:y().bool,onDeleteAlias:y().func,onTest:y().func,isTesting:y().bool},y().string.isRequired,y().string.isRequired,y().string,y().func.isRequired,y().func.isRequired,y().func,y().oneOf(["ok","error"]),y().bool,y().string.isRequired,y().object.isRequired,y().string,y().func.isRequired,y().func.isRequired,y().func.isRequired,b.propTypes={providerStorageAlias:y().string.isRequired,providerDisplayAlias:y().string.isRequired,modelAliases:y().object.isRequired,copied:y().string,onCopy:y().func.isRequired,onSetAlias:y().func.isRequired,onDeleteAlias:y().func.isRequired,connections:y().arrayOf(y().shape({id:y().string,isActive:y().bool})).isRequired,isAnthropic:y().bool},v.propTypes={until:y().string.isRequired},j.propTypes={connection:y().shape({id:y().string,name:y().string,email:y().string,displayName:y().string,modelLockUntil:y().string,testStatus:y().string,isActive:y().bool,lastError:y().string,priority:y().number,globalPriority:y().number}).isRequired,proxyPools:y().arrayOf(y().shape({id:y().string,name:y().string,proxyUrl:y().string,noProxy:y().string,isActive:y().bool})),isOAuth:y().bool.isRequired,isFirst:y().bool.isRequired,isLast:y().bool.isRequired,onMoveUp:y().func.isRequired,onMoveDown:y().func.isRequired,onToggleActive:y().func.isRequired,onUpdateProxy:y().func,onEdit:y().func.isRequired,onDelete:y().func.isRequired},N.propTypes={isOpen:y().bool.isRequired,provider:y().string,providerName:y().string,isCompatible:y().bool,isAnthropic:y().bool,proxyPools:y().arrayOf(y().shape({id:y().string,name:y().string})),onSave:y().func.isRequired,onClose:y().func.isRequired},k.propTypes={isOpen:y().bool.isRequired,node:y().shape({id:y().string,name:y().string,prefix:y().string,apiType:y().string,baseUrl:y().string}),onSave:y().func.isRequired,onClose:y().func.isRequired,isAnthropic:y().bool},w.propTypes={isOpen:y().bool.isRequired,providerAlias:y().string.isRequired,providerDisplayAlias:y().string.isRequired,onSave:y().func.isRequired,onClose:y().func.isRequired};let C="Imports accounts from ~/.antigravity_tools on this machine (Antigravity IDE local data). Requires that folder to exist and contain signed-in accounts.",S='Paste Google OAuth refresh tokens: one per line (1//…), a JSON array with refresh_token, or any text containing "refresh_token": "…". Each token is refreshed and accounts are added or updated by Google email.';function $(){let e,t=(0,r.useParams)(),s=(0,r.useRouter)(),o=t.id,[m,h]=(0,a.useState)([]),[y,g]=(0,a.useState)(!0),[v,$]=(0,a.useState)(null),[A,P]=(0,a.useState)([]),[T,O]=(0,a.useState)(!1),[_,I]=(0,a.useState)(!1),[R,E]=(0,a.useState)(!1),[D,U]=(0,a.useState)(!1),[q,M]=(0,a.useState)(!1),[K,F]=(0,a.useState)(!1),[J,L]=(0,a.useState)(!1),[z,W]=(0,a.useState)(!1),[G,V]=(0,a.useState)(!1),[Z,B]=(0,a.useState)(""),[Q,H]=(0,a.useState)(null),[Y,X]=(0,a.useState)(null),[ee,et]=(0,a.useState)({}),[es,ei]=(0,a.useState)(!1),[ea,er]=(0,a.useState)({}),[eo,en]=(0,a.useState)(""),[el,ed]=(0,a.useState)(null),[ec,ep]=(0,a.useState)(!1),[ex,em]=(0,a.useState)([]),[eu,eh]=(0,a.useState)("__none__"),[ey,ef]=(0,a.useState)(!1),[eg,eb]=(0,a.useState)(null),[ev,ej]=(0,a.useState)(""),[eN,ek]=(0,a.useState)("auto"),[ew,eC]=(0,a.useState)([]),[eS,e$]=(0,a.useState)([]),{copied:eA,copy:eP}=(0,x.C)(),eT=v?{id:v.id,name:v.name||("anthropic-compatible"===v.type?"Anthropic Compatible":"OpenAI Compatible"),color:"anthropic-compatible"===v.type?"#D97757":"#10A37F",textIcon:"anthropic-compatible"===v.type?"AC":"OC",apiType:v.apiType,baseUrl:v.baseUrl,type:v.type}:c.zN[o]||c.fg[o]||c.IS[o]||c.nJ[o],eO=!!c.zN[o]||!!c.IS[o],e_=!!c.IS[o]?.noAuth,eI=(0,p.KC)(o),eR=(0,c.wG)(o),eE=(0,c.mq)(o),eD=(0,c.gb)(o),eU=eE||eD;c.Q2[o]?.thinkingConfig||c.s9.extended;let eq=eU?o:eR,eM=eU?v?.prefix||o:eR,eK=(0,a.useCallback)(async()=>{try{let e=await fetch("/api/models/alias"),t=await e.json();e.ok&&et(t.aliases||{})}catch(e){console.log("Error fetching aliases:",e)}},[]);(0,a.useEffect)(()=>{"kilocode"===o&&fetch("/api/providers/kilo/free-models").then(e=>e.json()).then(e=>{e.models?.length&&e$(e.models)}).catch(()=>{})},[o]);let eF=(0,a.useCallback)(async()=>{try{let[e,t,s,i]=await Promise.all([fetch("/api/providers",{cache:"no-store"}),fetch("/api/provider-nodes",{cache:"no-store"}),fetch("/api/proxy-pools?isActive=true",{cache:"no-store"}),fetch("/api/settings",{cache:"no-store"})]),a=await e.json(),r=await t.json(),n=await s.json(),l=i.ok?await i.json():{};if(e.ok){let e=(a.connections||[]).filter(e=>e.provider===o);h(e)}s.ok&&P(n.proxyPools||[]);let d=(l.providerStrategies||{})[o]||{};eb(d.fallbackStrategy||null),ej(null!=d.stickyRoundRobinLimit?String(d.stickyRoundRobinLimit):"1");let c=(l.providerThinking||{})[o]||{};if(ek(c.mode||"auto"),t.ok){let e=(r.nodes||[]).find(e=>e.id===o)||null;if(!e&&eU)for(let t=0;t<3;t+=1){await new Promise(e=>setTimeout(e,150));let t=await fetch("/api/provider-nodes",{cache:"no-store"});if(t.ok&&(e=((await t.json()).nodes||[]).find(e=>e.id===o)||null))break}$(e)}}catch(e){console.log("Error fetching connections:",e)}finally{g(!1)}},[o,eU]),eJ=async e=>{try{let t=await fetch(`/api/provider-nodes/${o}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)}),s=await t.json();t.ok&&($(s.node),await eF(),M(!1))}catch(e){console.log("Error updating provider node:",e)}},eL=async(e,t)=>{try{let s=await fetch("/api/settings",{cache:"no-store"}),i=(s.ok?await s.json():{}).providerStrategies||{},a={};e&&(a.fallbackStrategy=e),"round-robin"===e&&""!==t&&(a.stickyRoundRobinLimit=Number(t)||3);let r={...i};0===Object.keys(a).length?delete r[o]:r[o]=a,await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({providerStrategies:r})})}catch(e){console.log("Error saving provider strategy:",e)}};(0,a.useEffect)(()=>{eF(),eK()},[eF,eK]),(0,a.useEffect)(()=>{let e=(c.zN[o]||c.fg[o]||c.IS[o]||c.nJ[o])?.modelsFetcher;e&&u(e).then(eC)},[o]);let ez=async(e,t,s=eR)=>{let i=`${s}/${e}`;try{let e=await fetch("/api/models/alias",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:i,alias:t})});if(e.ok)await eK();else{let t=await e.json();alert(t.error||"Failed to set alias")}}catch(e){console.log("Error setting alias:",e)}},eW=async e=>{try{(await fetch(`/api/models/alias?alias=${encodeURIComponent(e)}`,{method:"DELETE"})).ok&&await eK()}catch(e){console.log("Error deleting alias:",e)}},eG=async e=>{if(confirm("Delete this connection?"))try{(await fetch(`/api/providers/${e}`,{method:"DELETE"})).ok&&h(m.filter(t=>t.id!==e))}catch(e){console.log("Error deleting connection:",e)}},eV=()=>{eF(),O(!1)},eZ=async e=>{try{(await fetch("/api/providers",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:o,...e})})).ok&&(await eF(),E(!1))}catch(e){console.log("Error saving connection:",e)}},eB=async e=>{try{(await fetch(`/api/providers/${Y.id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})).ok&&(await eF(),U(!1))}catch(e){console.log("Error updating connection:",e)}},eQ=async(e,t)=>{try{(await fetch(`/api/providers/${e}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({isActive:t})})).ok&&h(s=>s.map(s=>s.id===e?{...s,isActive:t}:s))}catch(e){console.log("Error updating connection status:",e)}},eH=async(e,t)=>{let s=[...m];[s[e],s[t]]=[s[t],s[e]],h(s);try{await Promise.all([fetch(`/api/providers/${s[e].id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({priority:e})}),fetch(`/api/providers/${s[t].id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({priority:t})})])}catch(e){console.log("Error swapping priority:",e),await eF()}},eY=m.filter(e=>ex.includes(e.id));m.length>0&&(ex.length,m.length),(0,a.useEffect)(()=>{em(e=>e.filter(e=>m.some(t=>t.id===e)))},[m]);let eX=(()=>{if(0===eY.length)return"";let e=new Set(eY.map(e=>e.providerSpecificData?.proxyPoolId||"__none__"));if(1===e.size){let t=[...e][0];if("__none__"===t)return"All selected currently unbound";let s=A.find(e=>e.id===t);return`All selected currently bound to ${s?.name||t}`}return"Selected connections have mixed proxy bindings"})(),e0=()=>{ey||F(!1)},e1=async()=>{if(0===ex.length)return;let e="__none__"===eu?null:eu;ef(!0);try{let t=[];for(let s of ex)try{let i=await fetch(`/api/providers/${s}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({proxyPoolId:e})});t.push(i.ok)}catch(e){console.log("Error applying bulk proxy pool for",s,e),t.push(!1)}let s=t.filter(e=>!e).length;s>0&&alert(`Updated with ${s} failed request(s).`),await eF(),em([]),eh("__none__"),F(!1)}catch(e){console.log("Error applying bulk proxy pool:",e)}finally{ef(!1)}},e5=J||z,e2=async()=>{L(!0),H(null);try{let e=await fetch("/api/antigravity-tools/import",{method:"POST"}),t=await e.json();e.ok?(H(t),await eF()):H({error:t.error||"Import failed"})}catch(e){H({error:e.message})}L(!1)},e4=async()=>{if(Z.trim()){W(!0),H(null);try{let e=await fetch("/api/antigravity-tools/import-refresh-tokens",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({text:Z})}),t=await e.json();e.ok?(H(t),await eF(),V(!1),B("")):H({error:t.error||"Import failed"})}catch(e){H({error:e.message})}W(!1)}},e3=()=>{z||V(!1)},e6=(0,i.jsx)("div",{className:"flex flex-col divide-y divide-black/[0.03] dark:divide-white/[0.03]",children:m.map((e,t)=>(0,i.jsx)("div",{className:"flex items-stretch",children:(0,i.jsx)("div",{className:"flex-1 min-w-0",children:(0,i.jsx)(j,{connection:e,proxyPools:A,isOAuth:eO,isFirst:0===t,isLast:t===m.length-1,onMoveUp:()=>eH(t,t-1),onMoveDown:()=>eH(t,t+1),onToggleActive:t=>eQ(e.id,t),onUpdateProxy:async t=>{try{(await fetch(`/api/providers/${e.id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({proxyPoolId:t||null})})).ok&&h(s=>s.map(s=>s.id===e.id?{...s,providerSpecificData:{...s.providerSpecificData,proxyPoolId:t||null}}:s))}catch(e){console.log("Error updating proxy:",e)}},onEdit:()=>{X(e),U(!0)},onDelete:()=>eG(e.id)})})},e.id))}),e7=[{value:"__none__",label:"None"},...A.map(e=>({value:e.id,label:e.name}))],e8=0===ex.length?"Select one or more connections, then click Proxy Action.":eX,e9=ex.length>0&&!ey,te=(0,i.jsx)(d.aF,{isOpen:K,onClose:e0,title:`Proxy Action (${ex.length} selected)`,children:(0,i.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,i.jsx)(d.l6,{label:"Proxy Pool",value:eu,onChange:e=>eh(e.target.value),options:e7,placeholder:"None"}),(0,i.jsx)("p",{className:"text-xs text-text-muted",children:e8}),(0,i.jsx)("p",{className:"text-xs text-text-muted",children:"Selecting None will unbind selected connections from proxy pool."}),(0,i.jsxs)("div",{className:"flex gap-2",children:[(0,i.jsx)(d.$n,{onClick:e1,fullWidth:!0,disabled:!e9,children:ey?"Applying...":"Apply"}),(0,i.jsx)(d.$n,{onClick:e0,variant:"ghost",fullWidth:!0,disabled:ey,children:"Cancel"})]})]})}),tt=async e=>{if(!el){ed(e);try{let t=await fetch("/api/models/test",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:`${eq}/${e}`})}),s=await t.json();er(t=>({...t,[e]:s.ok?"ok":"error"})),en(s.ok?"":s.error||"Model not reachable")}catch{er(t=>({...t,[e]:"error"})),en("Network error")}finally{ed(null)}}};return y?(0,i.jsxs)("div",{className:"flex flex-col gap-8",children:[(0,i.jsx)(d.Qv,{}),(0,i.jsx)(d.Qv,{})]}):eT?(0,i.jsxs)("div",{className:"flex flex-col gap-8",children:[(0,i.jsxs)("div",{children:[(0,i.jsxs)(n(),{href:"/dashboard/providers",className:"inline-flex items-center gap-1 text-sm text-text-muted hover:text-primary transition-colors mb-4",children:[(0,i.jsx)("span",{className:"material-symbols-outlined text-lg",children:"arrow_back"}),"Back to Providers"]}),(0,i.jsxs)("div",{className:"flex items-center gap-4",children:[(0,i.jsx)("div",{className:"rounded-lg flex items-center justify-center",style:{backgroundColor:`${eT.color}15`},children:es?(0,i.jsx)("span",{className:"text-sm font-bold",style:{color:eT.color},children:eT.textIcon||eT.id.slice(0,2).toUpperCase()}):(0,i.jsx)(l.default,{src:eE&&eT.apiType?"responses"===eT.apiType?"/providers/oai-r.png":"/providers/oai-cc.png":eD?"/providers/anthropic-m.png":`/providers/${eT.id}.png`,alt:eT.name,width:48,height:48,className:"object-contain rounded-lg max-w-[48px] max-h-[48px]",sizes:"48px",onError:()=>ei(!0)})}),(0,i.jsxs)("div",{children:[(0,i.jsx)("h1",{className:"text-3xl font-semibold tracking-tight",children:eT.name}),(0,i.jsxs)("p",{className:"text-text-muted",children:[m.length," connection",1===m.length?"":"s"]})]})]})]}),eT.deprecated&&(0,i.jsxs)("div",{className:"flex items-center gap-2 px-3 py-2 rounded-lg bg-yellow-500/10 border border-yellow-500/30",children:[(0,i.jsx)("span",{className:"material-symbols-outlined text-[16px] text-yellow-500 mt-0.5 shrink-0",children:"warning"}),(0,i.jsx)("p",{className:"text-xs text-red-600 dark:text-yellow-400 leading-relaxed",children:eT.deprecationNotice})]}),eT.notice&&!eT.deprecated&&(0,i.jsxs)("div",{className:"flex items-center gap-2 px-3 py-2 rounded-lg bg-blue-500/10 border border-blue-500/30",children:[(0,i.jsx)("span",{className:"material-symbols-outlined text-[16px] text-blue-500 shrink-0",children:"info"}),(0,i.jsx)("p",{className:"text-xs text-blue-600 dark:text-blue-400 leading-relaxed",children:eT.notice.text}),eT.notice.apiKeyUrl&&(0,i.jsx)("a",{href:eT.notice.apiKeyUrl,target:"_blank",rel:"noopener noreferrer",className:"text-xs font-medium text-white bg-blue-500 hover:bg-blue-600 px-2 py-0.5 rounded shrink-0 transition-colors",children:"Get API Key →"})]}),eU&&v&&(0,i.jsxs)(d.Zp,{children:[(0,i.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,i.jsxs)("div",{children:[(0,i.jsx)("h2",{className:"text-lg font-semibold",children:eD?"Anthropic Compatible Details":"OpenAI Compatible Details"}),(0,i.jsxs)("p",{className:"text-sm text-text-muted",children:[eD?"Messages API":"responses"===v.apiType?"Responses API":"Chat Completions"," \xb7 ",(v.baseUrl||"").replace(/\/$/,""),"/",eD?"messages":"responses"===v.apiType?"responses":"chat/completions"]})]}),(0,i.jsxs)("div",{className:"flex items-center gap-2",children:[(0,i.jsx)(d.$n,{size:"sm",icon:"add",onClick:()=>E(!0),disabled:m.length>0,children:"Add"}),(0,i.jsx)(d.$n,{size:"sm",variant:"secondary",icon:"edit",onClick:()=>M(!0),children:"Edit"}),(0,i.jsx)(d.$n,{size:"sm",variant:"secondary",icon:"delete",onClick:async()=>{if(confirm(`Delete this ${eD?"Anthropic":"OpenAI"} Compatible node?`))try{(await fetch(`/api/provider-nodes/${o}`,{method:"DELETE"})).ok&&s.push("/dashboard/providers")}catch(e){console.log("Error deleting provider node:",e)}},children:"Delete"})]})]}),m.length>0&&(0,i.jsx)("p",{className:"text-sm text-text-muted",children:"Only one connection is allowed per compatible node. Add another node if you need more connections."})]}),e_?(0,i.jsx)(d.Zp,{children:(0,i.jsxs)("div",{className:"flex items-center gap-3",children:[(0,i.jsx)("div",{className:"inline-flex items-center justify-center w-10 h-10 rounded-full bg-green-500/10 text-green-500",children:(0,i.jsx)("span",{className:"material-symbols-outlined text-[20px]",children:"lock_open"})}),(0,i.jsxs)("div",{children:[(0,i.jsx)("p",{className:"text-sm font-medium",children:"No authentication required"}),(0,i.jsx)("p",{className:"text-xs text-text-muted",children:"This provider is ready to use."})]})]})}):(0,i.jsxs)(d.Zp,{children:[(0,i.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,i.jsx)("h2",{className:"text-lg font-semibold",children:"Connections"}),(0,i.jsx)("div",{className:"flex items-center gap-4",children:(0,i.jsxs)("div",{className:"flex items-center gap-2",children:[(0,i.jsx)("span",{className:"text-xs text-text-muted font-medium",children:"Round Robin"}),(0,i.jsx)(d.lM,{checked:"round-robin"===eg,onChange:e=>{let t=e?"round-robin":null,s=e?ev||"1":ev;e&&!ev&&ej("1"),eb(t),eL(t,s)}}),"round-robin"===eg&&(0,i.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,i.jsx)("span",{className:"text-xs text-text-muted",children:"Sticky:"}),(0,i.jsx)("input",{type:"number",min:1,value:ev,onChange:e=>{var t;ej(t=e.target.value),eL("round-robin",t)},placeholder:"1",className:"w-14 px-2 py-1 text-xs border border-border rounded-md bg-background focus:outline-none focus:border-primary"})]})]})})]}),Q&&(0,i.jsxs)("div",{className:`flex items-center justify-between gap-2 mb-3 px-3 py-2 rounded-lg text-xs ${Q.error?"bg-red-500/5 border border-red-500/15 text-red-500":"bg-green-500/5 border border-green-500/15 text-green-600"}`,children:[(0,i.jsx)("span",{children:Q.error?`✗ ${Q.error}`:(e=[`imported ${Q.imported}`,`updated ${Q.updated}`],Q.skipped>0&&e.push(`skipped ${Q.skipped}`),Q.failed>0&&e.push(`failed ${Q.failed}`),`✓ ${e.join(", ")}`)}),(0,i.jsx)("button",{onClick:()=>H(null),className:"text-current opacity-60 hover:opacity-100",children:"✕"})]}),0===m.length?(0,i.jsxs)("div",{className:"text-center py-12",children:[(0,i.jsx)("div",{className:"inline-flex items-center justify-center w-16 h-16 rounded-full bg-primary/10 text-primary mb-4",children:(0,i.jsx)("span",{className:"material-symbols-outlined text-[32px]",children:eO?"lock":"key"})}),(0,i.jsx)("p",{className:"text-text-main font-medium mb-1",children:"No connections yet"}),(0,i.jsx)("p",{className:"text-sm text-text-muted mb-4",children:"Add your first connection to get started"}),!eU&&(0,i.jsxs)("div",{className:"flex gap-2 justify-center",children:["iflow"===o&&(0,i.jsx)(d.$n,{icon:"cookie",variant:"secondary",onClick:()=>I(!0),children:"Cookie Auth"}),(0,i.jsx)(d.$n,{icon:"add",onClick:()=>eO?O(!0):E(!0),children:"iflow"===o?"OAuth":"Add Connection"}),"antigravity"===o&&(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(d.m_,{text:C,position:"bottom",children:(0,i.jsx)(d.$n,{icon:"download",variant:"secondary",onClick:e2,disabled:e5,children:J?"Importing…":"Import from AGT"})}),(0,i.jsx)(d.m_,{text:S,position:"bottom",children:(0,i.jsx)(d.$n,{icon:"key",variant:"secondary",onClick:()=>V(!0),disabled:e5,children:"Import refresh tokens"})})]})]})]}):(0,i.jsxs)(i.Fragment,{children:[e6,!eU&&(0,i.jsxs)("div",{className:"flex gap-2 mt-4",children:["iflow"===o&&(0,i.jsx)(d.$n,{size:"sm",icon:"cookie",variant:"secondary",onClick:()=>I(!0),title:"Add connection using browser cookie",children:"Cookie"}),(0,i.jsx)(d.$n,{size:"sm",icon:"add",onClick:()=>eO?O(!0):E(!0),children:"Add"}),"antigravity"===o&&(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(d.m_,{text:C,position:"bottom",children:(0,i.jsx)(d.$n,{size:"sm",icon:"download",variant:"secondary",onClick:e2,disabled:e5,children:J?"Importing…":"Import from AGT"})}),(0,i.jsx)(d.m_,{text:S,position:"bottom",children:(0,i.jsx)(d.$n,{size:"sm",icon:"key",variant:"secondary",onClick:()=>V(!0),disabled:e5,children:"Refresh tokens"})})]})]})]})]}),(0,i.jsxs)(d.Zp,{children:[(0,i.jsx)("div",{className:"flex items-center justify-between mb-4",children:(0,i.jsx)("h2",{className:"text-lg font-semibold",children:"Available Models"})}),!!eo&&(0,i.jsx)("p",{className:"text-xs text-red-500 mb-3 break-words",children:eo}),(()=>{let e,t,s;if(eU)return(0,i.jsx)(b,{providerStorageAlias:eq,providerDisplayAlias:eM,modelAliases:ee,copied:eA,onCopy:eP,onSetAlias:ez,onDeleteAlias:eW,connections:m,isAnthropic:eD});let a=[...eI,...eS.filter(e=>!eI.some(t=>t.id===e.id))].filter(e=>!e.type||"llm"===e.type),r=Object.entries(ee).filter(([e,t])=>{let s=`${eq}/`;if(!t.startsWith(s))return!1;let i=t.slice(s.length);return eT.passthroughModels?!eI.some(e=>e.id===i):!eI.some(e=>e.id===i)&&e===i}).map(([e,t])=>({id:t.slice(`${eq}/`.length),alias:e,fullModel:t}));return(0,i.jsxs)("div",{className:"flex flex-wrap gap-3",children:[a.map(e=>{let t=`${eq}/${e.id}`,s=`${o}/${e.id}`,a=Object.entries(ee).find(([,e])=>e===t||e===s)?.[0];return(0,i.jsx)(f,{model:e,fullModel:`${eM}/${e.id}`,alias:a,copied:eA,onCopy:eP,onSetAlias:t=>ez(e.id,t,eq),onDeleteAlias:()=>eW(a),testStatus:ea[e.id],onTest:m.length>0||e_?()=>tt(e.id):void 0,isTesting:el===e.id,isFree:e.isFree},e.id)}),r.map(e=>(0,i.jsx)(f,{model:{id:e.id},fullModel:`${eM}/${e.id}`,alias:e.alias,copied:eA,onCopy:eP,onSetAlias:()=>{},onDeleteAlias:()=>eW(e.alias),testStatus:ea[e.id],onTest:m.length>0||e_?()=>tt(e.id):void 0,isTesting:el===e.id,isCustom:!0,isFree:!1},e.id)),(0,i.jsxs)("button",{onClick:()=>ep(!0),className:"flex items-center gap-1.5 px-3 py-2 rounded-lg border border-dashed border-black/15 dark:border-white/15 text-xs text-text-muted hover:text-primary hover:border-primary/40 transition-colors",children:[(0,i.jsx)("span",{className:"material-symbols-outlined text-sm",children:"add"}),"Add Model"]}),ew.length>0&&(e=new Set(Object.values(ee)),t=new Set(eI.map(e=>e.id)),0===(s=ew.filter(s=>!e.has(`${eq}/${s.id}`)&&!t.has(s.id))).length?null:(0,i.jsxs)("div",{className:"w-full mt-2",children:[(0,i.jsx)("p",{className:"text-xs text-text-muted mb-2",children:"Suggested free models (≥200k context):"}),(0,i.jsx)("div",{className:"flex flex-wrap gap-2",children:s.map(e=>(0,i.jsxs)("button",{onClick:async()=>{let t=e.id.split("/").pop();await ez(e.id,t,eq)},className:"flex items-center gap-1 px-2.5 py-1.5 rounded-lg border border-black/10 dark:border-white/10 text-xs text-text-muted hover:text-primary hover:border-primary/40 hover:bg-primary/5 transition-colors",title:`${e.name} \xb7 ${(e.contextLength/1e3).toFixed(0)}k ctx`,children:[(0,i.jsx)("span",{className:"material-symbols-outlined text-[13px]",children:"add"}),e.id.split("/").pop()]},e.id))})]}))]})})()]}),te,"antigravity"===o&&(0,i.jsx)(d.aF,{isOpen:G,onClose:e3,title:"Import accounts (refresh tokens)",children:(0,i.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,i.jsxs)("p",{className:"text-sm text-text-muted",children:["Paste one or more Google OAuth refresh tokens. Supported formats: a single token (lines starting with"," ",(0,i.jsx)("code",{className:"text-xs bg-surface-secondary px-1 rounded",children:"1//…"}),"), a JSON array with"," ",(0,i.jsx)("code",{className:"text-xs bg-surface-secondary px-1 rounded",children:"refresh_token"}),", or any text containing"," ",(0,i.jsx)("code",{className:"text-xs bg-surface-secondary px-1 rounded",children:'"refresh_token": "…"'})," ","(values are extracted automatically)."]}),(0,i.jsxs)("div",{className:"space-y-2",children:[(0,i.jsx)("label",{className:"block text-sm font-medium text-text-primary",children:"Refresh tokens"}),(0,i.jsx)("textarea",{value:Z,onChange:e=>B(e.target.value),placeholder:`Paste your refresh token(s) here (batch supported)
2
+
3
+ Example:
4
+ "refresh_token": "example_refresh_token"`,className:"w-full min-h-[160px] px-3 py-2 bg-surface-secondary border border-border rounded-lg text-sm text-text-primary placeholder:text-text-muted/80 focus:outline-none focus:ring-2 focus:ring-primary resize-y font-mono",disabled:z}),(0,i.jsx)("p",{className:"text-xs text-text-muted",children:"Tip: You can paste multiple tokens or a JSON array to import in batch."})]}),(0,i.jsxs)("div",{className:"flex gap-2",children:[(0,i.jsx)(d.$n,{variant:"secondary",fullWidth:!0,onClick:e3,disabled:z,children:"Cancel"}),(0,i.jsx)(d.$n,{fullWidth:!0,onClick:e4,disabled:z||!Z.trim(),children:z?"Importing…":"Import"})]})]})}),"kiro"===o?(0,i.jsx)(d.Mh,{isOpen:T,providerInfo:eT,onSuccess:eV,onClose:()=>O(!1)}):"cursor"===o?(0,i.jsx)(d.G9,{isOpen:T,onSuccess:eV,onClose:()=>O(!1)}):"gitlab"===o?(0,i.jsx)(d.vj,{isOpen:T,providerInfo:eT,onSuccess:eV,onClose:()=>O(!1)}):(0,i.jsx)(d.LF,{isOpen:T,provider:o,providerInfo:eT,onSuccess:eV,onClose:()=>O(!1)}),"iflow"===o&&(0,i.jsx)(d.vE,{isOpen:_,onSuccess:()=>{eF(),I(!1)},onClose:()=>I(!1)}),(0,i.jsx)(N,{isOpen:R,provider:o,providerName:eT.name,isCompatible:eU,isAnthropic:eD,proxyPools:A,onSave:eZ,onClose:()=>E(!1)}),(0,i.jsx)(d.wI,{isOpen:D,connection:Y,proxyPools:A,onSave:eB,onClose:()=>U(!1)}),eU&&(0,i.jsx)(k,{isOpen:q,node:v,onSave:eJ,onClose:()=>M(!1),isAnthropic:eD}),!eU&&(0,i.jsx)(w,{isOpen:ec,providerAlias:eq,providerDisplayAlias:eM,onSave:async e=>{let t=eT?.passthroughModels?e.split("/").pop():e;await ez(e,t,eq),ep(!1)},onClose:()=>ep(!1)})]}):(0,i.jsxs)("div",{className:"text-center py-20",children:[(0,i.jsx)("p",{className:"text-text-muted",children:"Provider not found"}),(0,i.jsx)(n(),{href:"/dashboard/providers",className:"text-primary mt-4 inline-block",children:"Back to Providers"})]})}},68241:(e,t,s)=>{Promise.resolve().then(s.bind(s,17721))}},e=>{e.O(0,[2574,3862,1051,5772,1321,5497,8441,3794,7358],()=>e(e.s=68241)),_N_E=e.O()}]);