omniroute 2.8.4 → 2.8.6

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 (267) hide show
  1. package/app/.next/BUILD_ID +1 -1
  2. package/app/.next/build-manifest.json +2 -2
  3. package/app/.next/prerender-manifest.json +3 -3
  4. package/app/.next/server/app/(dashboard)/dashboard/a2a/page_client-reference-manifest.js +1 -1
  5. package/app/.next/server/app/(dashboard)/dashboard/agents/page_client-reference-manifest.js +1 -1
  6. package/app/.next/server/app/(dashboard)/dashboard/analytics/page_client-reference-manifest.js +1 -1
  7. package/app/.next/server/app/(dashboard)/dashboard/api-manager/page_client-reference-manifest.js +1 -1
  8. package/app/.next/server/app/(dashboard)/dashboard/audit-log/page_client-reference-manifest.js +1 -1
  9. package/app/.next/server/app/(dashboard)/dashboard/auto-combo/page_client-reference-manifest.js +1 -1
  10. package/app/.next/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  11. package/app/.next/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  12. package/app/.next/server/app/(dashboard)/dashboard/costs/page_client-reference-manifest.js +1 -1
  13. package/app/.next/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  14. package/app/.next/server/app/(dashboard)/dashboard/health/page_client-reference-manifest.js +1 -1
  15. package/app/.next/server/app/(dashboard)/dashboard/limits/page_client-reference-manifest.js +1 -1
  16. package/app/.next/server/app/(dashboard)/dashboard/logs/page_client-reference-manifest.js +1 -1
  17. package/app/.next/server/app/(dashboard)/dashboard/mcp/page_client-reference-manifest.js +1 -1
  18. package/app/.next/server/app/(dashboard)/dashboard/media/page_client-reference-manifest.js +1 -1
  19. package/app/.next/server/app/(dashboard)/dashboard/onboarding/page_client-reference-manifest.js +1 -1
  20. package/app/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  21. package/app/.next/server/app/(dashboard)/dashboard/playground/page_client-reference-manifest.js +1 -1
  22. package/app/.next/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  23. package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  24. package/app/.next/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  25. package/app/.next/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  26. package/app/.next/server/app/(dashboard)/dashboard/search-tools/page_client-reference-manifest.js +1 -1
  27. package/app/.next/server/app/(dashboard)/dashboard/settings/page_client-reference-manifest.js +1 -1
  28. package/app/.next/server/app/(dashboard)/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  29. package/app/.next/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  30. package/app/.next/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  31. package/app/.next/server/app/400/page_client-reference-manifest.js +1 -1
  32. package/app/.next/server/app/401/page_client-reference-manifest.js +1 -1
  33. package/app/.next/server/app/403/page_client-reference-manifest.js +1 -1
  34. package/app/.next/server/app/408/page_client-reference-manifest.js +1 -1
  35. package/app/.next/server/app/429/page_client-reference-manifest.js +1 -1
  36. package/app/.next/server/app/500/page_client-reference-manifest.js +1 -1
  37. package/app/.next/server/app/502/page_client-reference-manifest.js +1 -1
  38. package/app/.next/server/app/503/page_client-reference-manifest.js +1 -1
  39. package/app/.next/server/app/_global-error.html +2 -2
  40. package/app/.next/server/app/_global-error.rsc +1 -1
  41. package/app/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  42. package/app/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  43. package/app/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  44. package/app/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  45. package/app/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  46. package/app/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  47. package/app/.next/server/app/api/acp/agents/route.js +1 -1
  48. package/app/.next/server/app/api/acp/agents/route.js.nft.json +1 -1
  49. package/app/.next/server/app/api/auth/login/route.js +1 -1
  50. package/app/.next/server/app/api/auth/login/route.js.nft.json +1 -1
  51. package/app/.next/server/app/api/cli-tools/antigravity-mitm/alias/route.js +1 -1
  52. package/app/.next/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
  53. package/app/.next/server/app/api/cloud/auth/route.js +1 -1
  54. package/app/.next/server/app/api/cloud/auth/route.js.nft.json +1 -1
  55. package/app/.next/server/app/api/cloud/credentials/update/route.js +1 -1
  56. package/app/.next/server/app/api/cloud/credentials/update/route.js.nft.json +1 -1
  57. package/app/.next/server/app/api/cloud/model/resolve/route.js +1 -1
  58. package/app/.next/server/app/api/cloud/model/resolve/route.js.nft.json +1 -1
  59. package/app/.next/server/app/api/cloud/models/alias/route.js +1 -1
  60. package/app/.next/server/app/api/cloud/models/alias/route.js.nft.json +1 -1
  61. package/app/.next/server/app/api/combos/[id]/route.js +1 -1
  62. package/app/.next/server/app/api/combos/[id]/route.js.nft.json +1 -1
  63. package/app/.next/server/app/api/combos/route.js +1 -1
  64. package/app/.next/server/app/api/combos/route.js.nft.json +1 -1
  65. package/app/.next/server/app/api/combos/test/route.js +1 -1
  66. package/app/.next/server/app/api/combos/test/route.js.nft.json +1 -1
  67. package/app/.next/server/app/api/db-backups/export/route.js +1 -1
  68. package/app/.next/server/app/api/db-backups/export/route.js.nft.json +1 -1
  69. package/app/.next/server/app/api/db-backups/import/route.js +1 -1
  70. package/app/.next/server/app/api/db-backups/import/route.js.nft.json +1 -1
  71. package/app/.next/server/app/api/db-backups/route.js +1 -1
  72. package/app/.next/server/app/api/db-backups/route.js.nft.json +1 -1
  73. package/app/.next/server/app/api/keys/[id]/route.js +1 -1
  74. package/app/.next/server/app/api/keys/[id]/route.js.nft.json +1 -1
  75. package/app/.next/server/app/api/keys/route.js +1 -1
  76. package/app/.next/server/app/api/keys/route.js.nft.json +1 -1
  77. package/app/.next/server/app/api/logs/detail/route.js +1 -1
  78. package/app/.next/server/app/api/logs/detail/route.js.nft.json +1 -1
  79. package/app/.next/server/app/api/models/alias/route.js +1 -1
  80. package/app/.next/server/app/api/models/alias/route.js.nft.json +1 -1
  81. package/app/.next/server/app/api/models/openrouter-catalog/route.js +1 -1
  82. package/app/.next/server/app/api/models/openrouter-catalog/route.js.nft.json +1 -1
  83. package/app/.next/server/app/api/models/route.js +1 -1
  84. package/app/.next/server/app/api/models/route.js.nft.json +1 -1
  85. package/app/.next/server/app/api/monitoring/health/route.js +1 -1
  86. package/app/.next/server/app/api/monitoring/health/route.js.nft.json +1 -1
  87. package/app/.next/server/app/api/oauth/[provider]/[action]/route.js +1 -1
  88. package/app/.next/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
  89. package/app/.next/server/app/api/oauth/cursor/auto-import/route.js +1 -1
  90. package/app/.next/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -1
  91. package/app/.next/server/app/api/oauth/cursor/import/route.js +1 -1
  92. package/app/.next/server/app/api/oauth/cursor/import/route.js.nft.json +1 -1
  93. package/app/.next/server/app/api/oauth/kiro/auto-import/route.js +1 -1
  94. package/app/.next/server/app/api/oauth/kiro/auto-import/route.js.nft.json +1 -1
  95. package/app/.next/server/app/api/oauth/kiro/import/route.js +1 -1
  96. package/app/.next/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
  97. package/app/.next/server/app/api/oauth/kiro/social-exchange/route.js +1 -1
  98. package/app/.next/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -1
  99. package/app/.next/server/app/api/pricing/models/route.js +1 -1
  100. package/app/.next/server/app/api/pricing/models/route.js.nft.json +1 -1
  101. package/app/.next/server/app/api/pricing/route.js +1 -1
  102. package/app/.next/server/app/api/pricing/route.js.nft.json +1 -1
  103. package/app/.next/server/app/api/provider-models/route.js +2 -2
  104. package/app/.next/server/app/api/provider-models/route.js.nft.json +1 -1
  105. package/app/.next/server/app/api/provider-nodes/[id]/route.js +1 -1
  106. package/app/.next/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -1
  107. package/app/.next/server/app/api/provider-nodes/route.js +1 -1
  108. package/app/.next/server/app/api/provider-nodes/route.js.nft.json +1 -1
  109. package/app/.next/server/app/api/providers/[id]/models/route.js +1 -1
  110. package/app/.next/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
  111. package/app/.next/server/app/api/providers/[id]/refresh/route.js +1 -1
  112. package/app/.next/server/app/api/providers/[id]/refresh/route.js.nft.json +1 -1
  113. package/app/.next/server/app/api/providers/[id]/route.js +1 -1
  114. package/app/.next/server/app/api/providers/[id]/route.js.nft.json +1 -1
  115. package/app/.next/server/app/api/providers/[id]/test/route.js +1 -1
  116. package/app/.next/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
  117. package/app/.next/server/app/api/providers/client/route.js +1 -1
  118. package/app/.next/server/app/api/providers/client/route.js.nft.json +1 -1
  119. package/app/.next/server/app/api/providers/route.js +1 -1
  120. package/app/.next/server/app/api/providers/route.js.nft.json +1 -1
  121. package/app/.next/server/app/api/providers/test-batch/route.js +2 -2
  122. package/app/.next/server/app/api/providers/test-batch/route.js.nft.json +1 -1
  123. package/app/.next/server/app/api/providers/validate/route.js +1 -1
  124. package/app/.next/server/app/api/providers/validate/route.js.nft.json +1 -1
  125. package/app/.next/server/app/api/rate-limits/route.js +1 -1
  126. package/app/.next/server/app/api/rate-limits/route.js.nft.json +1 -1
  127. package/app/.next/server/app/api/resilience/route.js +1 -1
  128. package/app/.next/server/app/api/resilience/route.js.nft.json +1 -1
  129. package/app/.next/server/app/api/search/providers/route.js +1 -1
  130. package/app/.next/server/app/api/search/providers/route.js.nft.json +1 -1
  131. package/app/.next/server/app/api/search/stats/route.js +1 -1
  132. package/app/.next/server/app/api/search/stats/route.js.nft.json +1 -1
  133. package/app/.next/server/app/api/settings/codex-service-tier/route.js +1 -1
  134. package/app/.next/server/app/api/settings/codex-service-tier/route.js.nft.json +1 -1
  135. package/app/.next/server/app/api/settings/combo-defaults/route.js +1 -1
  136. package/app/.next/server/app/api/settings/combo-defaults/route.js.nft.json +1 -1
  137. package/app/.next/server/app/api/settings/proxies/assignments/route.js +2 -2
  138. package/app/.next/server/app/api/settings/proxies/bulk-assign/route.js +2 -2
  139. package/app/.next/server/app/api/settings/proxies/route.js +1 -1
  140. package/app/.next/server/app/api/settings/proxy/route.js +2 -2
  141. package/app/.next/server/app/api/settings/require-login/route.js +1 -1
  142. package/app/.next/server/app/api/settings/require-login/route.js.nft.json +1 -1
  143. package/app/.next/server/app/api/settings/route.js +1 -1
  144. package/app/.next/server/app/api/settings/route.js.nft.json +1 -1
  145. package/app/.next/server/app/api/settings/system-prompt/route.js +1 -1
  146. package/app/.next/server/app/api/settings/system-prompt/route.js.nft.json +1 -1
  147. package/app/.next/server/app/api/settings/thinking-budget/route.js +1 -1
  148. package/app/.next/server/app/api/settings/thinking-budget/route.js.nft.json +1 -1
  149. package/app/.next/server/app/api/sync/cloud/route.js +1 -1
  150. package/app/.next/server/app/api/sync/cloud/route.js.nft.json +1 -1
  151. package/app/.next/server/app/api/sync/initialize/route.js +1 -1
  152. package/app/.next/server/app/api/sync/initialize/route.js.nft.json +1 -1
  153. package/app/.next/server/app/api/system/version/route.js +1 -1
  154. package/app/.next/server/app/api/system/version/route.js.nft.json +1 -1
  155. package/app/.next/server/app/api/translator/send/route.js +1 -1
  156. package/app/.next/server/app/api/translator/send/route.js.nft.json +1 -1
  157. package/app/.next/server/app/api/translator/translate/route.js +1 -1
  158. package/app/.next/server/app/api/translator/translate/route.js.nft.json +1 -1
  159. package/app/.next/server/app/api/usage/quota/route.js +1 -1
  160. package/app/.next/server/app/api/usage/quota/route.js.nft.json +1 -1
  161. package/app/.next/server/app/api/v1/management/proxies/assignments/route.js +1 -1
  162. package/app/.next/server/app/api/v1/management/proxies/assignments/route.js.nft.json +1 -1
  163. package/app/.next/server/app/api/v1/management/proxies/bulk-assign/route.js +1 -1
  164. package/app/.next/server/app/api/v1/management/proxies/bulk-assign/route.js.nft.json +1 -1
  165. package/app/.next/server/app/api/v1/management/proxies/health/route.js +1 -1
  166. package/app/.next/server/app/api/v1/management/proxies/health/route.js.nft.json +1 -1
  167. package/app/.next/server/app/api/v1/management/proxies/route.js +1 -1
  168. package/app/.next/server/app/api/v1/management/proxies/route.js.nft.json +1 -1
  169. package/app/.next/server/app/api/v1/models/route.js +1 -1
  170. package/app/.next/server/app/api/v1/models/route.js.nft.json +1 -1
  171. package/app/.next/server/app/api/v1/route.js +1 -1
  172. package/app/.next/server/app/api/v1/route.js.nft.json +1 -1
  173. package/app/.next/server/app/callback/page_client-reference-manifest.js +1 -1
  174. package/app/.next/server/app/docs/page_client-reference-manifest.js +1 -1
  175. package/app/.next/server/app/forbidden/page_client-reference-manifest.js +1 -1
  176. package/app/.next/server/app/forgot-password/page_client-reference-manifest.js +1 -1
  177. package/app/.next/server/app/landing/page_client-reference-manifest.js +1 -1
  178. package/app/.next/server/app/login/page_client-reference-manifest.js +1 -1
  179. package/app/.next/server/app/maintenance/page_client-reference-manifest.js +1 -1
  180. package/app/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  181. package/app/.next/server/app/page_client-reference-manifest.js +1 -1
  182. package/app/.next/server/app/privacy/page_client-reference-manifest.js +1 -1
  183. package/app/.next/server/app/status/page_client-reference-manifest.js +1 -1
  184. package/app/.next/server/app/terms/page_client-reference-manifest.js +1 -1
  185. package/app/.next/server/chunks/[root-of-the-server]__09c944b3._.js +1 -1
  186. package/app/.next/server/chunks/[root-of-the-server]__134baf4c._.js +1 -1
  187. package/app/.next/server/chunks/[root-of-the-server]__179c5303._.js +1 -1
  188. package/app/.next/server/chunks/[root-of-the-server]__237e5042._.js +1 -1
  189. package/app/.next/server/chunks/[root-of-the-server]__46fad57a._.js +1 -1
  190. package/app/.next/server/chunks/[root-of-the-server]__784fb7c5._.js +1 -1
  191. package/app/.next/server/chunks/[root-of-the-server]__7d9b23e7._.js +1 -1
  192. package/app/.next/server/chunks/[root-of-the-server]__80e3bfc3._.js +2 -2
  193. package/app/.next/server/chunks/[root-of-the-server]__84e445b2._.js +1 -1
  194. package/app/.next/server/chunks/[root-of-the-server]__92cb0def._.js +1 -1
  195. package/app/.next/server/chunks/[root-of-the-server]__9bbd49c8._.js +1 -1
  196. package/app/.next/server/chunks/[root-of-the-server]__a630d6ef._.js +5 -5
  197. package/app/.next/server/chunks/[root-of-the-server]__add0a68c._.js +1 -1
  198. package/app/.next/server/chunks/[root-of-the-server]__c393c81f._.js +1 -1
  199. package/app/.next/server/chunks/[root-of-the-server]__c8e3c8a9._.js +50 -0
  200. package/app/.next/server/chunks/[root-of-the-server]__cd42b732._.js +1 -1
  201. package/app/.next/server/chunks/[root-of-the-server]__d4563e10._.js +1 -1
  202. package/app/.next/server/chunks/[root-of-the-server]__db2f9fe0._.js +1 -1
  203. package/app/.next/server/chunks/[root-of-the-server]__e27a89bd._.js +1 -1
  204. package/app/.next/server/chunks/[root-of-the-server]__e56edf04._.js +1 -1
  205. package/app/.next/server/chunks/[root-of-the-server]__e6e94646._.js +1 -1
  206. package/app/.next/server/chunks/[root-of-the-server]__eb98039a._.js +1 -1
  207. package/app/.next/server/chunks/[root-of-the-server]__f31b4656._.js +1 -1
  208. package/app/.next/server/chunks/_05c48915._.js +1 -1
  209. package/app/.next/server/chunks/_1244636c._.js +2 -2
  210. package/app/.next/server/chunks/_14963fed._.js +1 -1
  211. package/app/.next/server/chunks/_1717e651._.js +1 -1
  212. package/app/.next/server/chunks/_2115d8de._.js +1 -1
  213. package/app/.next/server/chunks/_3ac953eb._.js +1 -1
  214. package/app/.next/server/chunks/_4b8fd853._.js +1 -1
  215. package/app/.next/server/chunks/_5bbb2e7a._.js +1 -1
  216. package/app/.next/server/chunks/_68683848._.js +1 -1
  217. package/app/.next/server/chunks/_c05b9de3._.js +1 -1
  218. package/app/.next/server/chunks/_c795fc74._.js +1 -1
  219. package/app/.next/server/chunks/_ee7b7859._.js +1 -1
  220. package/app/.next/server/chunks/_ee9b677b._.js +1 -1
  221. package/app/.next/server/chunks/open-sse_cf4d5692._.js +1 -1
  222. package/app/.next/server/chunks/open-sse_config_constants_ts_9583de19._.js +1 -1
  223. package/app/.next/server/chunks/open-sse_services_826884e1._.js +2 -1
  224. package/app/.next/server/chunks/open-sse_translator_index_ts_f5fd0821._.js +2 -2
  225. package/app/.next/server/chunks/src_lib_localDb_ts_83220848._.js +1 -1
  226. package/app/.next/server/chunks/src_shared_validation_schemas_ts_4e63863a._.js +1 -1
  227. package/app/.next/server/chunks/ssr/[root-of-the-server]__9affb65e._.js +1 -1
  228. package/app/.next/server/chunks/ssr/[root-of-the-server]__a6942102._.js +1 -1
  229. package/app/.next/server/chunks/ssr/src_9197fb9b._.js +2 -2
  230. package/app/.next/server/chunks/ssr/src_d3225e36._.js +1 -1
  231. package/app/.next/server/chunks/ssr/src_i18n_messages_en_json_c3d5c412._.js +1 -1
  232. package/app/.next/server/chunks/ssr/src_i18n_messages_zh-CN_json_f4112d90._.js +1 -1
  233. package/app/.next/server/chunks/ssr/src_lib_initCloudSync_ts_982b9d4d._.js +1 -1
  234. package/app/.next/server/pages/500.html +2 -2
  235. package/app/.next/server/server-reference-manifest.js +1 -1
  236. package/app/.next/server/server-reference-manifest.json +1 -1
  237. package/app/.next/static/chunks/1042694db0c08f1f.css +1 -0
  238. package/app/.next/static/chunks/{0f71d7fbf89bb737.js → 34569b4e9d93c0ad.js} +2 -2
  239. package/app/.next/static/chunks/{1e206030e7793015.js → 353ef826fbae436d.js} +1 -1
  240. package/app/.next/static/chunks/91761ba00c702cff.js +1 -0
  241. package/app/CHANGELOG.md +56 -0
  242. package/app/docs/openapi.yaml +1 -1
  243. package/app/open-sse/config/constants.ts +3 -3
  244. package/app/open-sse/handlers/chatCore.ts +6 -2
  245. package/app/open-sse/services/comboAgentMiddleware.ts +9 -1
  246. package/app/open-sse/services/roleNormalizer.ts +14 -19
  247. package/app/open-sse/translator/index.ts +27 -3
  248. package/app/package-lock.json +2 -2
  249. package/app/package.json +1 -1
  250. package/app/src/app/(dashboard)/dashboard/cli-tools/CLIToolsPageClient.tsx +12 -0
  251. package/app/src/app/(dashboard)/dashboard/cli-tools/components/AntigravityToolCard.tsx +5 -5
  252. package/app/src/app/(dashboard)/dashboard/providers/[id]/page.tsx +381 -62
  253. package/app/src/app/api/provider-models/route.ts +47 -6
  254. package/app/src/i18n/messages/en.json +10 -0
  255. package/app/src/i18n/messages/zh-CN.json +10 -0
  256. package/app/src/lib/db/models.ts +130 -13
  257. package/app/src/lib/localDb.ts +5 -0
  258. package/app/src/shared/constants/cliTools.ts +2 -2
  259. package/app/src/shared/validation/schemas.ts +1 -0
  260. package/app/tests/e2e/providers-bailian-coding-plan.spec.ts +14 -0
  261. package/package.json +1 -1
  262. package/app/.next/server/chunks/[root-of-the-server]__3972de72._.js +0 -50
  263. package/app/.next/static/chunks/af071ff826ecff1b.css +0 -1
  264. package/app/.next/static/chunks/d19ab4efcaddd1db.js +0 -1
  265. /package/app/.next/static/{Ys6bRJXPNt8j-MKOjvZwp → m9BrfW8GQTdaCjvX6OgP2}/_buildManifest.js +0 -0
  266. /package/app/.next/static/{Ys6bRJXPNt8j-MKOjvZwp → m9BrfW8GQTdaCjvX6OgP2}/_clientMiddlewareManifest.json +0 -0
  267. /package/app/.next/static/{Ys6bRJXPNt8j-MKOjvZwp → m9BrfW8GQTdaCjvX6OgP2}/_ssgManifest.js +0 -0
@@ -1,3 +1,3 @@
1
- module.exports=[779276,a=>{"use strict";var b=a.i(743442);a.s(["OAuthModal",()=>b.default])},202373,a=>{"use strict";var b=a.i(394093);a.s(["KiroOAuthWrapper",()=>b.default])},182527,a=>{"use strict";var b=a.i(296193);a.s(["CursorAuthModal",()=>b.default])},755235,a=>a.a(async(b,c)=>{try{var d=a.i(187924),e=a.i(572131),f=a.i(240246),g=a.i(341212),h=a.i(50944),i=a.i(238246),j=a.i(571987),k=a.i(415925),l=a.i(442308),m=a.i(292216),n=a.i(294023),o=a.i(818465),p=a.i(489108),q=a.i(563203),r=a.i(831097),s=a.i(779276),t=a.i(202373),u=a.i(182527),v=a.i(709918),w=a.i(525290),x=a.i(248172),y=a.i(662073),z=a.i(867933),A=a.i(911655),B=a.i(386592),C=b([l,y,z]);function D(a){let b=a&&"object"==typeof a&&!Array.isArray(a)?a:{};return{use5h:"boolean"!=typeof b.use5h||b.use5h,useWeekly:"boolean"!=typeof b.useWeekly||b.useWeekly}}function E(){let a=(0,h.useParams)(),b=(0,h.useRouter)(),c=a.id,[g,l]=(0,e.useState)([]),[o,p]=(0,e.useState)(!0),[v,w]=(0,e.useState)(null),[z,C]=(0,e.useState)(!1),[E,H]=(0,e.useState)(!1),[K,N]=(0,e.useState)(!1),[Q,R]=(0,e.useState)(!1),[S,T]=(0,e.useState)(null),[U,V]=(0,e.useState)(null),[W,X]=(0,e.useState)({}),[Y,Z]=(0,e.useState)(!1),{copied:$,copy:_}=(0,B.useCopyToClipboard)(),aa=(0,k.useTranslations)("providers"),ab=(0,f.useNotificationStore)(),ac=(0,e.useRef)(!1),ad=(0,e.useRef)(!1),[ae,af]=(0,e.useState)(null),[ag,ah]=(0,e.useState)(null),[ai,aj]=(0,e.useState)(!1),[ak,al]=(0,e.useState)(!1),[am,an]=(0,e.useState)({current:0,total:0,phase:"idle",status:"",logs:[],error:"",importedCount:0}),ao=v?{id:v.id,name:v.name||("anthropic-compatible"===v.type?aa("anthropicCompatibleName"):aa("openaiCompatibleName")),color:"anthropic-compatible"===v.type?"#D97757":"#10A37F",textIcon:"anthropic-compatible"===v.type?"AC":"OC",apiType:v.apiType,baseUrl:v.baseUrl,type:v.type}:y.FREE_PROVIDERS[c]||y.OAUTH_PROVIDERS[c]||y.APIKEY_PROVIDERS[c],ap=!!y.FREE_PROVIDERS[c]||!!y.OAUTH_PROVIDERS[c],aq=(0,A.getModelsByProviderId)(c),ar=(0,y.getProviderAlias)(c),as=(0,y.isOpenAICompatibleProvider)(c),at=(0,y.isAnthropicCompatibleProvider)(c),au=as||at,av=c.endsWith("-search"),aw=au?c:ar,ax=au?v?.prefix||c:ar,ay=(0,e.useCallback)(async()=>{try{let a=await fetch("/api/models/alias"),b=await a.json();a.ok&&X(b.aliases||{})}catch(a){console.log("Error fetching aliases:",a)}},[]),az=(0,e.useCallback)(async()=>{try{let[a,b]=await Promise.all([fetch("/api/providers",{cache:"no-store"}),fetch("/api/provider-nodes",{cache:"no-store"})]),d=await a.json(),e=await b.json();if(a.ok){let a=(d.connections||[]).filter(a=>a.provider===c);l(a)}if(b.ok){let a=(e.nodes||[]).find(a=>a.id===c)||null;if(!a&&au)for(let b=0;b<3;b+=1){await new Promise(a=>setTimeout(a,150));let b=await fetch("/api/provider-nodes",{cache:"no-store"});if(b.ok&&(a=((await b.json()).nodes||[]).find(a=>a.id===c)||null))break}w(a)}}catch(a){console.log("Error fetching connections:",a)}finally{p(!1)}},[c,au]),aA=async a=>{try{let b=await fetch(`/api/provider-nodes/${c}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)}),d=await b.json();b.ok&&(w(d.node),await az(),R(!1))}catch(a){console.log("Error updating provider node:",a)}};(0,e.useEffect)(()=>{az(),ay(),fetch("/api/settings/proxy").then(a=>a.ok?a.json():null).then(a=>ah(a)).catch(()=>{})},[az,ay]),(0,e.useEffect)(()=>{o||0!==g.length||!ao||au||ac.current||ad.current||(ac.current=!0,ap?C(!0):H(!0))},[o]);let aB=async(a,b,c=ar)=>{let d=`${c}/${a}`;try{let a=await fetch("/api/models/alias",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:d,alias:b})});if(a.ok)await ay();else{let b=await a.json();alert(b.error||aa("failedSetAlias"))}}catch(a){console.log("Error setting alias:",a)}},aC=async a=>{try{(await fetch(`/api/models/alias?alias=${encodeURIComponent(a)}`,{method:"DELETE"})).ok&&await ay()}catch(a){console.log("Error deleting alias:",a)}},aD=async a=>{if(confirm(aa("deleteConnectionConfirm")))try{(await fetch(`/api/providers/${a}`,{method:"DELETE"})).ok&&l(g.filter(b=>b.id!==a))}catch(a){console.log("Error deleting connection:",a)}},aE=(0,e.useCallback)(()=>{az(),C(!1)},[az]),aF=async a=>{try{let b=await fetch("/api/providers",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:c,...a})});if(b.ok)return await az(),H(!1),null;let d=await b.json().catch(()=>({}));return d.error?.message||d.error||aa("failedSaveConnection")}catch(a){return console.log("Error saving connection:",a),aa("failedSaveConnectionRetry")}},aG=async a=>{try{let b=await fetch(`/api/providers/${S.id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)});if(b.ok)return await az(),N(!1),null;let c=await b.json().catch(()=>({}));return c.error?.message||c.error||aa("failedSaveConnection")}catch(a){return console.log("Error updating connection:",a),aa("failedSaveConnectionRetry")}},aH=async(a,b)=>{try{(await fetch(`/api/providers/${a}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({isActive:b})})).ok&&l(c=>c.map(c=>c.id===a?{...c,isActive:b}:c))}catch(a){console.log("Error updating connection status:",a)}},aI=async(a,b)=>{try{(await fetch("/api/rate-limits",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({connectionId:a,enabled:b})})).ok&&l(c=>c.map(c=>c.id===a?{...c,rateLimitProtection:b}:c))}catch(a){console.error("Error toggling rate limit:",a)}},aJ=async(a,b,c)=>{try{let d=g.find(b=>b.id===a);if(!d)return;let e=d.providerSpecificData&&"object"==typeof d.providerSpecificData?d.providerSpecificData:{},f=e.codexLimitPolicy&&"object"==typeof e.codexLimitPolicy?e.codexLimitPolicy:{},h={...D(f),[b]:c},i=await fetch(`/api/providers/${a}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({providerSpecificData:{...e,codexLimitPolicy:h}})});if(!i.ok){let a=await i.json().catch(()=>({}));ab.error(a.error||"Failed to update Codex limit policy");return}l(b=>b.map(b=>b.id===a?{...b,providerSpecificData:{...b.providerSpecificData||{},codexLimitPolicy:h}}:b)),ab.success("Codex limit policy updated")}catch(a){console.error("Error toggling Codex quota policy:",a),ab.error("Failed to update Codex limit policy")}},aK=async a=>{if(a&&!U){V(a);try{let b=await fetch(`/api/providers/${a}/test`,{method:"POST"});if(!b.ok){let a=await b.json().catch(()=>({}));alert(a.error||aa("failedRetestConnection"));return}await az()}catch(a){console.error("Error retesting connection:",a)}finally{V(null)}}},[aL,aM]=(0,e.useState)(null),aN=async a=>{if(!aL){aM(a);try{let b=await fetch(`/api/providers/${a}/refresh`,{method:"POST"}),c=await b.json().catch(()=>({}));b.ok&&c.success?(ab.success(aa("tokenRefreshed")),await az()):ab.error(c.error||aa("tokenRefreshFailed"))}catch(a){console.error("Error refreshing token:",a),ab.error(aa("tokenRefreshFailed"))}finally{aM(null)}}},aO=async(a,b)=>{if(a&&b)try{let c=b.priority,d=a.priority;c===d&&(c=g.indexOf(a)>g.indexOf(b)?b.priority-.5:b.priority+.5),await Promise.all([fetch(`/api/providers/${a.id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({priority:c})}),fetch(`/api/providers/${b.id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({priority:d})})]),await az()}catch(a){console.log("Error swapping priority:",a)}},aP=async()=>{if(ai)return;let a=g.find(a=>!1!==a.isActive);if(a){aj(!0),al(!0),an({current:0,total:0,phase:"fetching",status:aa("fetchingModels"),logs:[],error:"",importedCount:0});try{let b=await fetch(`/api/providers/${a.id}/models`),d=await b.json();if(!b.ok)return void an(a=>({...a,phase:"error",status:aa("failedFetchModels"),error:d.error||aa("failedImportModels")}));let e=d.models||[];if(0===e.length)return void an(a=>({...a,phase:"done",status:aa("noModelsFound"),logs:[aa("noModelsReturnedFromEndpoint")]}));an(a=>({...a,phase:"importing",total:e.length,status:aa("importingModelsProgress",{current:0,total:e.length}),logs:[aa("foundModelsStartingImport",{count:e.length})]}));let f=0;for(let a=0;a<e.length;a++){let b=e[a],d=b.id||b.name||b.model;if(!d)continue;let g=d.split("/"),h=g[g.length-1];an(b=>({...b,current:a+1,status:aa("importingModelsProgress",{current:a+1,total:e.length}),logs:[...b.logs,aa("importingModelById",{modelId:d})]})),await fetch("/api/provider-models",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:c,modelId:d,modelName:b.name||d,source:"imported"})}),W[h]||await aB(d,h,aw),f+=1}await ay(),an(a=>({...a,phase:"done",current:e.length,status:f>0?aa("importSuccessCount",{count:f}):aa("noNewModelsAddedExisting"),logs:[...a.logs,f>0?aa("importDoneCount",{count:f}):aa("noNewModelsAdded")],importedCount:f})),f>0&&setTimeout(()=>{window.location.reload()},2e3)}catch(a){console.log("Error importing models:",a),an(b=>({...b,phase:"error",status:aa("importFailed"),error:a instanceof Error?a.message:aa("unexpectedErrorOccurred")}))}finally{aj(!1)}}},aQ=async(a,b)=>{al(!0),an({current:0,total:0,phase:"fetching",status:aa("fetchingModels"),logs:[],error:"",importedCount:0});try{let c=(await a()).models||[];if(0===c.length)return void an(a=>({...a,phase:"done",status:aa("noModelsFound"),logs:[aa("noModelsReturnedFromEndpoint")]}));an(a=>({...a,phase:"importing",total:c.length,status:aa("importingModelsProgress",{current:0,total:c.length}),logs:[aa("foundModelsStartingImport",{count:c.length})]}));let d=0;for(let a=0;a<c.length;a++){let e=c[a],f=e.id||e.name||e.model;f&&(an(b=>({...b,current:a+1,status:aa("importingModelsProgress",{current:a+1,total:c.length}),logs:[...b.logs,aa("importingModelById",{modelId:f})]})),await b(e)&&(d+=1))}an(a=>({...a,phase:"done",current:c.length,status:d>0?aa("importSuccessCount",{count:d}):aa("noNewModelsAdded"),logs:[...a.logs,d>0?aa("importDoneCount",{count:d}):aa("noNewModelsAdded")],importedCount:d})),d>0&&setTimeout(()=>{window.location.reload()},2e3)}catch(a){console.log("Error importing models:",a),an(b=>({...b,phase:"error",status:aa("importFailed"),error:a instanceof Error?a.message:aa("unexpectedErrorOccurred")}))}},aR=g.some(a=>!1!==a.isActive);return o?(0,d.jsxs)("div",{className:"flex flex-col gap-8",children:[(0,d.jsx)(r.CardSkeleton,{}),(0,d.jsx)(r.CardSkeleton,{})]}):ao?(0,d.jsxs)("div",{className:"flex flex-col gap-8",children:[(0,d.jsxs)("div",{children:[(0,d.jsxs)(i.default,{href:"/dashboard/providers",className:"inline-flex items-center gap-1 text-sm text-text-muted hover:text-primary transition-colors mb-4",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-lg",children:"arrow_back"}),aa("backToProviders")]}),(0,d.jsxs)("div",{className:"flex items-center gap-4",children:[(0,d.jsx)("div",{className:"rounded-lg flex items-center justify-center",style:{backgroundColor:`${ao.color}15`},children:Y?(0,d.jsx)("span",{className:"text-sm font-bold",style:{color:ao.color},children:ao.textIcon||ao.id.slice(0,2).toUpperCase()}):(0,d.jsx)(j.default,{src:as&&ao.apiType?"responses"===ao.apiType?"/providers/oai-r.png":"/providers/oai-cc.png":at?"/providers/anthropic-m.png":`/providers/${ao.id}.png`,alt:ao.name,width:48,height:48,className:"object-contain rounded-lg max-w-[48px] max-h-[48px]",sizes:"48px",onError:()=>Z(!0)})}),(0,d.jsxs)("div",{children:[ao.website?(0,d.jsxs)("a",{href:ao.website,target:"_blank",rel:"noopener noreferrer",className:"text-3xl font-semibold tracking-tight hover:underline inline-flex items-center gap-2",style:{color:ao.color},children:[ao.name,(0,d.jsx)("span",{className:"material-symbols-outlined text-lg opacity-60",children:"open_in_new"})]}):(0,d.jsx)("h1",{className:"text-3xl font-semibold tracking-tight",children:ao.name}),(0,d.jsx)("p",{className:"text-text-muted",children:aa("connectionCountLabel",{count:g.length})})]})]})]}),au&&v&&(0,d.jsxs)(m.Card,{children:[(0,d.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,d.jsxs)("div",{children:[(0,d.jsx)("h2",{className:"text-lg font-semibold",children:at?aa("anthropicCompatibleDetails"):aa("openaiCompatibleDetails")}),(0,d.jsxs)("p",{className:"text-sm text-text-muted",children:[at?aa("messagesApi"):"responses"===v.apiType?aa("responsesApi"):aa("chatCompletions")," ","· ",(v.baseUrl||"").replace(/\/$/,""),"/",at?aa("messagesPath"):"responses"===v.apiType?aa("responsesPath"):aa("chatCompletionsPath")]})]}),(0,d.jsxs)("div",{className:"flex items-center gap-2",children:[(0,d.jsx)(n.Button,{size:"sm",icon:"add",onClick:()=>H(!0),disabled:g.length>0,children:aa("add")}),(0,d.jsx)(n.Button,{size:"sm",variant:"secondary",icon:"edit",onClick:()=>R(!0),children:aa("edit")}),(0,d.jsx)(n.Button,{size:"sm",variant:"secondary",icon:"delete",onClick:async()=>{if(confirm(aa("deleteCompatibleNodeConfirm",{type:at?aa("anthropic"):aa("openai")})))try{(await fetch(`/api/provider-nodes/${c}`,{method:"DELETE"})).ok&&b.push("/dashboard/providers")}catch(a){console.log("Error deleting provider node:",a)}},children:aa("delete")})]})]}),g.length>0&&(0,d.jsx)("p",{className:"text-sm text-text-muted",children:aa("singleConnectionPerCompatible")})]}),(0,d.jsxs)(m.Card,{children:[(0,d.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,d.jsxs)("div",{className:"flex items-center gap-3",children:[(0,d.jsx)("h2",{className:"text-lg font-semibold",children:aa("connections")}),(0,d.jsxs)("button",{onClick:()=>af({level:"provider",id:c,label:ao?.name||c}),className:`inline-flex items-center gap-1 px-2 py-1 rounded text-xs font-medium transition-all ${ag?.providers?.[c]?"bg-amber-500/15 text-amber-500 hover:bg-amber-500/25":"bg-black/[0.03] dark:bg-white/[0.03] text-text-muted/50 hover:text-text-muted hover:bg-black/[0.06] dark:hover:bg-white/[0.06]"}`,title:ag?.providers?.[c]?aa("providerProxyTitleConfigured",{host:ag.providers[c].host||aa("configured")}):aa("providerProxyConfigureHint"),children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"vpn_lock"}),ag?.providers?.[c]&&ag.providers[c].host||aa("providerProxy")]})]}),au?0===g.length&&(0,d.jsx)(n.Button,{size:"sm",icon:"add",onClick:()=>H(!0),children:aa("add")}):(0,d.jsx)(n.Button,{size:"sm",icon:"add",onClick:()=>ap?C(!0):H(!0),children:aa("add")})]}),0===g.length?(0,d.jsxs)("div",{className:"text-center py-12",children:[(0,d.jsx)("div",{className:"inline-flex items-center justify-center w-16 h-16 rounded-full bg-primary/10 text-primary mb-4",children:(0,d.jsx)("span",{className:"material-symbols-outlined text-[32px]",children:ap?"lock":"key"})}),(0,d.jsx)("p",{className:"text-text-main font-medium mb-1",children:aa("noConnectionsYet")}),(0,d.jsx)("p",{className:"text-sm text-text-muted mb-4",children:aa("addFirstConnectionHint")}),!au&&(0,d.jsx)(n.Button,{icon:"add",onClick:()=>ap?C(!0):H(!0),children:aa("addConnection")})]}):(0,d.jsx)("div",{className:"flex flex-col divide-y divide-black/[0.03] dark:divide-white/[0.03]",children:g.sort((a,b)=>(a.priority||0)-(b.priority||0)).map((a,b)=>(0,d.jsx)(L,{connection:a,isOAuth:ap,isFirst:0===b,isLast:b===g.length-1,onMoveUp:()=>aO(a,g[b-1]),onMoveDown:()=>aO(a,g[b+1]),onToggleActive:b=>aH(a.id,b),onToggleRateLimit:b=>aI(a.id,b),isCodex:"codex"===c,onToggleCodex5h:b=>aJ(a.id,"use5h",b),onToggleCodexWeekly:b=>aJ(a.id,"useWeekly",b),onRetest:()=>aK(a.id),isRetesting:U===a.id,onEdit:()=>{T(a),N(!0)},onDelete:()=>aD(a.id),onReauth:ap?()=>C(!0):void 0,onRefreshToken:ap?()=>aN(a.id):void 0,isRefreshing:aL===a.id,onProxy:()=>af({level:"key",id:a.id,label:a.name||a.email||a.id}),hasProxy:!!(ag?.keys?.[a.id]||ag?.providers?.[c]||ag?.global),proxySource:ag?.keys?.[a.id]?"key":ag?.providers?.[c]?"provider":ag?.global?"global":null,proxyHost:(ag?.keys?.[a.id]||ag?.providers?.[c]||ag?.global)?.host||null},a.id))})]}),!av&&(0,d.jsxs)(m.Card,{children:[(0,d.jsx)("h2",{className:"text-lg font-semibold mb-4",children:aa("availableModels")}),(()=>{if(au)return(0,d.jsx)(J,{providerStorageAlias:aw,providerDisplayAlias:ax,modelAliases:W,copied:$,onCopy:_,onSetAlias:aB,onDeleteAlias:aC,connections:g,isAnthropic:at,onImportWithProgress:aQ});if(ao.passthroughModels)return(0,d.jsxs)("div",{children:[(0,d.jsxs)("div",{className:"flex items-center gap-2 mb-4",children:[(0,d.jsx)(n.Button,{size:"sm",variant:"secondary",icon:"download",onClick:aP,disabled:!aR||ai,children:ai?aa("importingModels"):aa("importFromModels")}),!aR&&(0,d.jsx)("span",{className:"text-xs text-text-muted",children:aa("addConnectionToImport")})]}),(0,d.jsx)(G,{providerAlias:ar,modelAliases:W,copied:$,onCopy:_,onSetAlias:aB,onDeleteAlias:aC})]});let a=(0,d.jsxs)("div",{className:"flex items-center gap-2 mb-4",children:[(0,d.jsx)(n.Button,{size:"sm",variant:"secondary",icon:"download",onClick:aP,disabled:!aR||ai,children:ai?aa("importingModels"):aa("importFromModels")}),!aR&&(0,d.jsx)("span",{className:"text-xs text-text-muted",children:aa("addConnectionToImport")})]});return 0===aq.length?(0,d.jsxs)("div",{children:[a,(0,d.jsx)("p",{className:"text-sm text-text-muted",children:aa("noModelsConfigured")})]}):(0,d.jsxs)("div",{children:[a,(0,d.jsx)("div",{className:"flex flex-wrap gap-3",children:aq.map(a=>{let b=`${aw}/${a.id}`,e=`${c}/${a.id}`,f=Object.entries(W).find(([,a])=>a===b||a===e)?.[0];return(0,d.jsx)(F,{model:a,fullModel:`${ax}/${a.id}`,alias:f,copied:$,onCopy:_,onSetAlias:b=>aB(a.id,b,aw),onDeleteAlias:()=>aC(f)},a.id)})})]})})(),!au&&(0,d.jsx)(I,{providerId:c,providerAlias:ax,copied:$,onCopy:_})]}),av&&(0,d.jsxs)(m.Card,{children:[(0,d.jsx)("h2",{className:"text-lg font-semibold mb-4",children:aa("searchProvider")||"Search Provider"}),(0,d.jsx)("p",{className:"text-sm text-text-muted",children:aa("searchProviderDesc")||"This provider is used for web search via POST /v1/search. No model configuration needed — search providers are ready to use once an API key is connected."}),"perplexity-search"===c&&(0,d.jsxs)("div",{className:"mt-3 flex items-center gap-2 px-3 py-2 rounded-lg bg-blue-500/10 border border-blue-500/20",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-sm text-blue-400",children:"link"}),(0,d.jsxs)("p",{className:"text-xs text-blue-300",children:["Uses the same API key as ",(0,d.jsx)("strong",{children:"Perplexity"})," (chat provider). If you already have Perplexity configured, no additional setup is needed."]})]})]}),"kiro"===c?(0,d.jsx)(t.KiroOAuthWrapper,{isOpen:z,providerInfo:ao,onSuccess:aE,onClose:()=>{ad.current=!0,C(!1)}}):"cursor"===c?(0,d.jsx)(u.CursorAuthModal,{isOpen:z,onSuccess:aE,onClose:()=>{ad.current=!0,C(!1)}}):(0,d.jsx)(s.OAuthModal,{isOpen:z,provider:c,providerInfo:ao,onSuccess:aE,onClose:()=>{ad.current=!0,C(!1)}}),(0,d.jsx)(M,{isOpen:E,provider:c,providerName:ao.name,isCompatible:au,isAnthropic:at,onSave:aF,onClose:()=>H(!1)}),(0,d.jsx)(O,{isOpen:K,connection:S,onSave:aG,onClose:()=>N(!1)}),au&&(0,d.jsx)(P,{isOpen:Q,node:v,onSave:aA,onClose:()=>R(!1),isAnthropic:at}),ae&&(0,d.jsx)(x.ProxyConfigModal,{isOpen:!!ae,onClose:()=>af(null),level:ae.level,levelId:ae.id,levelLabel:ae.label}),(0,d.jsx)(q.Modal,{isOpen:ak,onClose:()=>{("done"===am.phase||"error"===am.phase)&&al(!1)},title:aa("importingModelsTitle"),size:"md",closeOnOverlay:!1,showCloseButton:"done"===am.phase||"error"===am.phase,children:(0,d.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,d.jsxs)("div",{className:"flex items-center gap-3",children:["fetching"===am.phase&&(0,d.jsx)("span",{className:"material-symbols-outlined text-primary animate-spin",children:"progress_activity"}),"importing"===am.phase&&(0,d.jsx)("span",{className:"material-symbols-outlined text-primary animate-spin",children:"progress_activity"}),"done"===am.phase&&(0,d.jsx)("span",{className:"material-symbols-outlined text-green-500",children:"check_circle"}),"error"===am.phase&&(0,d.jsx)("span",{className:"material-symbols-outlined text-red-500",children:"error"}),(0,d.jsx)("span",{className:"text-sm font-medium text-text-main",children:am.status})]}),("importing"===am.phase||"done"===am.phase)&&am.total>0&&(0,d.jsxs)("div",{className:"w-full",children:[(0,d.jsxs)("div",{className:"flex items-center justify-between mb-1",children:[(0,d.jsxs)("span",{className:"text-xs text-text-muted",children:[am.current," / ",am.total]}),(0,d.jsxs)("span",{className:"text-xs text-text-muted",children:[Math.round(am.current/am.total*100),"%"]})]}),(0,d.jsx)("div",{className:"w-full h-2.5 bg-black/10 dark:bg-white/10 rounded-full overflow-hidden",children:(0,d.jsx)("div",{className:"h-full rounded-full transition-all duration-300 ease-out",style:{width:`${am.current/am.total*100}%`,background:"done"===am.phase?"linear-gradient(90deg, #22c55e, #16a34a)":"linear-gradient(90deg, var(--color-primary), var(--color-primary-hover, var(--color-primary)))"}})})]}),"fetching"===am.phase&&(0,d.jsx)("div",{className:"w-full h-2.5 bg-black/10 dark:bg-white/10 rounded-full overflow-hidden",children:(0,d.jsx)("div",{className:"h-full rounded-full animate-pulse",style:{width:"60%",background:"linear-gradient(90deg, var(--color-primary), var(--color-primary-hover, var(--color-primary)))"}})}),"error"===am.phase&&am.error&&(0,d.jsx)("div",{className:"p-3 rounded-lg bg-red-500/10 border border-red-500/20",children:(0,d.jsx)("p",{className:"text-sm text-red-400",children:am.error})}),am.logs.length>0&&(0,d.jsx)("div",{className:"max-h-48 overflow-y-auto rounded-lg bg-black/5 dark:bg-white/5 p-3 border border-black/5 dark:border-white/5",children:(0,d.jsx)("div",{className:"flex flex-col gap-1",children:am.logs.map((a,b)=>(0,d.jsx)("p",{className:`text-xs font-mono ${a.startsWith("✓")?"text-green-500 font-semibold":"text-text-muted"}`,children:a},b))})}),"done"===am.phase&&am.importedCount>0&&(0,d.jsx)("p",{className:"text-xs text-text-muted text-center animate-pulse",children:aa("pageAutoRefresh")})]})})]}):(0,d.jsxs)("div",{className:"text-center py-20",children:[(0,d.jsx)("p",{className:"text-text-muted",children:aa("providerNotFound")}),(0,d.jsx)(i.default,{href:"/dashboard/providers",className:"text-primary mt-4 inline-block",children:aa("backToProviders")})]})}function F({model:a,fullModel:b,alias:c,copied:e,onCopy:f,onSetAlias:g,onDeleteAlias:h}){let i=(0,k.useTranslations)("providers");return(0,d.jsxs)("div",{className:"flex items-center gap-2 px-3 py-2 rounded-lg border border-border hover:bg-sidebar/50",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-base text-text-muted",children:"smart_toy"}),(0,d.jsx)("code",{className:"text-xs text-text-muted font-mono bg-sidebar px-1.5 py-0.5 rounded",children:b}),(0,d.jsx)("button",{onClick:()=>f(b,`model-${a.id}`),className:"p-0.5 hover:bg-sidebar rounded text-text-muted hover:text-primary",title:i("copyModel"),children:(0,d.jsx)("span",{className:"material-symbols-outlined text-sm",children:e===`model-${a.id}`?"check":"content_copy"})})]})}function G({providerAlias:a,modelAliases:b,copied:c,onCopy:f,onSetAlias:g,onDeleteAlias:h}){let i=(0,k.useTranslations)("providers"),[j,l]=(0,e.useState)(""),[m,o]=(0,e.useState)(!1),p=Object.entries(b).filter(([,b])=>b.startsWith(`${a}/`)).map(([b,c])=>({modelId:c.replace(`${a}/`,""),fullModel:c,alias:b})),q=async()=>{let a;if(!j.trim()||m)return;let c=j.trim(),d=(a=c.split("/"))[a.length-1];if(b[d])return void alert(i("aliasExistsAlert",{alias:d}));o(!0);try{await g(c,d),l("")}catch(a){console.log("Error adding model:",a)}finally{o(!1)}};return(0,d.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,d.jsx)("p",{className:"text-sm text-text-muted",children:i("openRouterAnyModelHint")}),(0,d.jsxs)("div",{className:"flex items-end gap-2",children:[(0,d.jsxs)("div",{className:"flex-1",children:[(0,d.jsx)("label",{htmlFor:"new-model-input",className:"text-xs text-text-muted mb-1 block",children:i("modelIdFromOpenRouter")}),(0,d.jsx)("input",{id:"new-model-input",type:"text",value:j,onChange:a=>l(a.target.value),onKeyDown:a=>"Enter"===a.key&&q(),placeholder:i("openRouterModelPlaceholder"),className:"w-full px-3 py-2 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary"})]}),(0,d.jsx)(n.Button,{size:"sm",icon:"add",onClick:q,disabled:!j.trim()||m,children:m?i("adding"):i("add")})]}),p.length>0&&(0,d.jsx)("div",{className:"flex flex-col gap-3",children:p.map(({modelId:a,fullModel:b,alias:e})=>(0,d.jsx)(H,{modelId:a,fullModel:b,copied:c,onCopy:f,onDeleteAlias:()=>h(e)},b))})]})}function H({modelId:a,fullModel:b,copied:c,onCopy:e,onDeleteAlias:f}){let g=(0,k.useTranslations)("providers");return(0,d.jsxs)("div",{className:"flex items-center gap-3 p-3 rounded-lg border border-border hover:bg-sidebar/50",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-base text-text-muted",children:"smart_toy"}),(0,d.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,d.jsx)("p",{className:"text-sm font-medium truncate",children:a}),(0,d.jsxs)("div",{className:"flex items-center gap-1 mt-1",children:[(0,d.jsx)("code",{className:"text-xs text-text-muted font-mono bg-sidebar px-1.5 py-0.5 rounded",children:b}),(0,d.jsx)("button",{onClick:()=>e(b,`model-${a}`),className:"p-0.5 hover:bg-sidebar rounded text-text-muted hover:text-primary",title:g("copyModel"),children:(0,d.jsx)("span",{className:"material-symbols-outlined text-sm",children:c===`model-${a}`?"check":"content_copy"})})]})]}),(0,d.jsx)("button",{onClick:f,className:"p-1 hover:bg-red-50 rounded text-red-500",title:g("removeModel"),children:(0,d.jsx)("span",{className:"material-symbols-outlined text-sm",children:"delete"})})]})}function I({providerId:a,providerAlias:b,copied:c,onCopy:g}){let h=(0,k.useTranslations)("providers"),i=(0,f.useNotificationStore)(),[j,l]=(0,e.useState)([]),[m,o]=(0,e.useState)(""),[p,q]=(0,e.useState)(""),[r,s]=(0,e.useState)("chat-completions"),[t,u]=(0,e.useState)(["chat"]),[v,w]=(0,e.useState)(!1),[x,y]=(0,e.useState)(!0),[z,A]=(0,e.useState)(null),[B,C]=(0,e.useState)("chat-completions"),[D,E]=(0,e.useState)(["chat"]),[F,G]=(0,e.useState)(!1),[H,I]=(0,e.useState)(null),J=(0,e.useCallback)(async()=>{try{let b=await fetch(`/api/provider-models?provider=${encodeURIComponent(a)}`);if(b.ok){let a=await b.json();l(a.models||[])}}catch(a){console.error("Failed to fetch custom models:",a)}finally{y(!1)}},[a]);(0,e.useEffect)(()=>{J()},[J]);let K=async()=>{if(m.trim()&&!v){w(!0);try{(await fetch("/api/provider-models",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:a,modelId:m.trim(),modelName:p.trim()||void 0,apiFormat:r,supportedEndpoints:t})})).ok&&(o(""),q(""),s("chat-completions"),u(["chat"]),await J())}catch(a){console.error("Failed to add custom model:",a)}finally{w(!1)}}},L=async b=>{try{await fetch(`/api/provider-models?provider=${encodeURIComponent(a)}&model=${encodeURIComponent(b)}`,{method:"DELETE"}),await J()}catch(a){console.error("Failed to remove custom model:",a)}},M=()=>{A(null),C("chat-completions"),E(["chat"]),G(!1),I(null)},N=async b=>{if(z&&z===b){if(!D.length)return void i.error("Select at least one supported endpoint");I(b);try{let c=j.find(a=>a.id===b);if(!(await fetch("/api/provider-models",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:a,modelId:b,modelName:c?.name||b,source:c?.source||"manual",apiFormat:B,supportedEndpoints:D,normalizeToolCallId:F})})).ok)throw Error("Failed to save model endpoint settings");await J(),i.success("Saved model endpoint settings"),M()}catch(a){console.error("Failed to save custom model:",a),i.error("Failed to save model endpoint settings")}finally{I(null)}}};return(0,d.jsxs)("div",{className:"mt-6 pt-6 border-t border-border",children:[(0,d.jsxs)("h3",{className:"text-sm font-semibold mb-3 flex items-center gap-2",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-base text-primary",children:"tune"}),h("customModels")]}),(0,d.jsx)("p",{className:"text-xs text-text-muted mb-3",children:h("customModelsHint")}),(0,d.jsxs)("div",{className:"flex flex-col gap-3 mb-3",children:[(0,d.jsxs)("div",{className:"flex items-end gap-2",children:[(0,d.jsxs)("div",{className:"flex-1",children:[(0,d.jsx)("label",{htmlFor:"custom-model-id",className:"text-xs text-text-muted mb-1 block",children:h("modelId")}),(0,d.jsx)("input",{id:"custom-model-id",type:"text",value:m,onChange:a=>o(a.target.value),onKeyDown:a=>"Enter"===a.key&&K(),placeholder:h("customModelPlaceholder"),className:"w-full px-3 py-2 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary"})]}),(0,d.jsxs)("div",{className:"w-40",children:[(0,d.jsx)("label",{htmlFor:"custom-model-name",className:"text-xs text-text-muted mb-1 block",children:h("displayName")}),(0,d.jsx)("input",{id:"custom-model-name",type:"text",value:p,onChange:a=>q(a.target.value),onKeyDown:a=>"Enter"===a.key&&K(),placeholder:h("optional"),className:"w-full px-3 py-2 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary"})]}),(0,d.jsx)(n.Button,{size:"sm",icon:"add",onClick:K,disabled:!m.trim()||v,children:v?h("adding"):h("add")})]}),(0,d.jsxs)("div",{className:"flex items-end gap-4 flex-wrap",children:[(0,d.jsxs)("div",{className:"w-48",children:[(0,d.jsx)("label",{htmlFor:"custom-api-format",className:"text-xs text-text-muted mb-1 block",children:"API Format"}),(0,d.jsxs)("select",{id:"custom-api-format",value:r,onChange:a=>s(a.target.value),className:"w-full px-3 py-2 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary",children:[(0,d.jsx)("option",{value:"chat-completions",children:"Chat Completions"}),(0,d.jsx)("option",{value:"responses",children:"Responses API"})]})]}),(0,d.jsxs)("div",{className:"flex-1",children:[(0,d.jsx)("span",{className:"text-xs text-text-muted mb-1 block",children:"Supported Endpoints"}),(0,d.jsx)("div",{className:"flex items-center gap-3",children:["chat","embeddings","images","audio"].map(a=>(0,d.jsxs)("label",{className:"flex items-center gap-1.5 text-xs text-text-main cursor-pointer",children:[(0,d.jsx)("input",{type:"checkbox",checked:t.includes(a),onChange:b=>{b.target.checked?u(b=>[...b,a]):u(b=>b.filter(b=>b!==a))},className:"rounded border-border"}),"chat"===a?"💬 Chat":"embeddings"===a?"📐 Embeddings":"images"===a?"🖼️ Images":"🔊 Audio"]},a))})]})]})]}),x?(0,d.jsx)("p",{className:"text-xs text-text-muted",children:h("loading")}):j.length>0?(0,d.jsx)("div",{className:"flex flex-col gap-2",children:j.map(a=>{let e=`${b}/${a.id}`,f=`custom-${a.id}`;return(0,d.jsxs)("div",{className:"flex items-center gap-3 p-3 rounded-lg border border-border hover:bg-sidebar/50",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-base text-primary",children:"tune"}),(0,d.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,d.jsx)("p",{className:"text-sm font-medium truncate",children:a.name||a.id}),(0,d.jsxs)("div",{className:"flex items-center gap-1 mt-1 flex-wrap",children:[(0,d.jsx)("code",{className:"text-xs text-text-muted font-mono bg-sidebar px-1.5 py-0.5 rounded",children:e}),(0,d.jsx)("button",{onClick:()=>g(e,f),className:"p-0.5 hover:bg-sidebar rounded text-text-muted hover:text-primary",title:h("copyModel"),children:(0,d.jsx)("span",{className:"material-symbols-outlined text-sm",children:c===f?"check":"content_copy"})}),"responses"===a.apiFormat&&(0,d.jsx)("span",{className:"text-[10px] px-1.5 py-0.5 rounded-full bg-blue-500/15 text-blue-400 font-medium",children:"Responses"}),a.supportedEndpoints?.includes("embeddings")&&(0,d.jsx)("span",{className:"text-[10px] px-1.5 py-0.5 rounded-full bg-purple-500/15 text-purple-400 font-medium",children:"📐 Embed"}),a.supportedEndpoints?.includes("images")&&(0,d.jsx)("span",{className:"text-[10px] px-1.5 py-0.5 rounded-full bg-amber-500/15 text-amber-400 font-medium",children:"🖼️ Images"}),a.supportedEndpoints?.includes("audio")&&(0,d.jsx)("span",{className:"text-[10px] px-1.5 py-0.5 rounded-full bg-green-500/15 text-green-400 font-medium",children:"🔊 Audio"}),a.normalizeToolCallId&&(0,d.jsx)("span",{className:"text-[10px] px-1.5 py-0.5 rounded-full bg-slate-500/15 text-slate-400 font-medium",title:"9-char tool call ID (Mistral)",children:"ID×9"})]}),z===a.id&&(0,d.jsxs)("div",{className:"mt-3 p-3 rounded-lg border border-border bg-sidebar/40",children:[(0,d.jsxs)("div",{className:"flex items-end gap-3 flex-wrap",children:[(0,d.jsxs)("div",{className:"w-44",children:[(0,d.jsx)("label",{className:"text-xs text-text-muted mb-1 block",children:"API Format"}),(0,d.jsxs)("select",{value:B,onChange:a=>C(a.target.value),className:"w-full px-2.5 py-2 text-xs border border-border rounded-lg bg-background focus:outline-none focus:border-primary",children:[(0,d.jsx)("option",{value:"chat-completions",children:"Chat Completions"}),(0,d.jsx)("option",{value:"responses",children:"Responses API"})]})]}),(0,d.jsxs)("div",{className:"flex-1 min-w-[240px]",children:[(0,d.jsx)("span",{className:"text-xs text-text-muted mb-1 block",children:"Supported Endpoints"}),(0,d.jsx)("div",{className:"flex items-center gap-3 flex-wrap",children:["chat","embeddings","images","audio"].map(a=>(0,d.jsxs)("label",{className:"flex items-center gap-1.5 text-xs text-text-main cursor-pointer",children:[(0,d.jsx)("input",{type:"checkbox",checked:D.includes(a),onChange:b=>{b.target.checked?E(b=>b.includes(a)?b:[...b,a]):E(b=>b.filter(b=>b!==a))},className:"rounded border-border"}),"chat"===a?"💬 Chat":"embeddings"===a?"📐 Embeddings":"images"===a?"🖼️ Images":"🔊 Audio"]},a))})]}),(0,d.jsxs)("label",{className:"flex items-center gap-2 text-xs text-text-main cursor-pointer",children:[(0,d.jsx)("input",{type:"checkbox",checked:F,onChange:a=>G(a.target.checked),className:"rounded border-border"}),"Normalize Tool Call ID (9 chars, Mistral)"]})]}),(0,d.jsxs)("div",{className:"mt-3 flex items-center gap-2",children:[(0,d.jsx)(n.Button,{size:"sm",onClick:()=>N(a.id),disabled:H===a.id,children:H===a.id?h("saving"):h("save")}),(0,d.jsx)(n.Button,{size:"sm",variant:"ghost",onClick:M,children:h("cancel")})]})]})]}),(0,d.jsxs)("div",{className:"flex items-center gap-1",children:[(0,d.jsx)("button",{onClick:()=>{A(a.id),C(a.apiFormat||"chat-completions"),E(Array.isArray(a.supportedEndpoints)&&a.supportedEndpoints.length?a.supportedEndpoints:["chat"]),G(!!a.normalizeToolCallId)},className:"p-1 hover:bg-sidebar rounded text-text-muted hover:text-primary",title:h("edit"),children:(0,d.jsx)("span",{className:"material-symbols-outlined text-sm",children:"edit"})}),(0,d.jsx)("button",{onClick:()=>L(a.id),className:"p-1 hover:bg-red-50 rounded text-red-500",title:h("removeCustomModel"),children:(0,d.jsx)("span",{className:"material-symbols-outlined text-sm",children:"delete"})})]})]},a.id)})}):(0,d.jsx)("p",{className:"text-xs text-text-muted",children:h("noCustomModels")})]})}function J({providerStorageAlias:a,providerDisplayAlias:b,modelAliases:c,copied:g,onCopy:h,onSetAlias:i,onDeleteAlias:j,connections:l,isAnthropic:m,onImportWithProgress:o}){let p=(0,k.useTranslations)("providers"),[q,r]=(0,e.useState)(""),[s,t]=(0,e.useState)(!1),[u,v]=(0,e.useState)(!1),w=(0,f.useNotificationStore)(),x=Object.entries(c).filter(([,b])=>b.startsWith(`${a}/`)).map(([b,c])=>({modelId:c.replace(`${a}/`,""),fullModel:c,alias:b})),y=a=>{let d,e=(d=a.split("/"))[d.length-1];if(!c[e])return e;let f=`${b}-${e}`;return c[f]?null:f},z=async()=>{if(!q.trim()||s)return;let b=q.trim(),c=y(b);if(!c)return void w.error(p("allSuggestedAliasesExist"));t(!0);try{let d=await fetch("/api/provider-models",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:a,modelId:b,modelName:b,source:"manual"})});if(!d.ok){let a={};try{a=await d.json()}catch(a){console.error("Failed to parse error response from custom model API:",a)}throw Error(a.error?.message||p("failedSaveCustomModel"))}await i(b,c,a),r(""),w.success(p("modelAddedSuccess",{modelId:b}))}catch(a){console.error("Error adding model:",a),w.error(a instanceof Error?a.message:p("failedAddModelTryAgain"))}finally{t(!1)}},A=async()=>{if(u)return;let b=l.find(a=>!1!==a.isActive);if(b){v(!0);try{await o(async()=>{let a=await fetch(`/api/providers/${b.id}/models`),c=await a.json();if(!a.ok)throw Error(c.error||p("failedImportModels"));return c},async b=>{let c=b.id||b.name||b.model;if(!c)return!1;let d=y(c);return!!d&&((await fetch("/api/provider-models",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:a,modelId:c,modelName:b.name||c,source:"imported"})})).ok?(await i(c,d,a),!0):(w.error(p("failedSaveImportedModel")),!1))})}catch(a){console.error("Error importing models:",a),w.error(p("failedImportModelsTryAgain"))}finally{v(!1)}}},B=l.some(a=>!1!==a.isActive),C=async(b,c)=>{try{if(!(await fetch(`/api/provider-models?provider=${encodeURIComponent(a)}&model=${encodeURIComponent(b)}`,{method:"DELETE"})).ok)throw Error(p("failedRemoveModelFromDatabase"));await j(c),w.success(p("modelRemovedSuccess"))}catch(a){console.error("Error deleting model:",a),w.error(a instanceof Error?a.message:p("failedDeleteModelTryAgain"))}};return(0,d.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,d.jsx)("p",{className:"text-sm text-text-muted",children:p("compatibleModelsDescription",{type:m?p("anthropic"):p("openai")})}),(0,d.jsxs)("div",{className:"flex items-end gap-2 flex-wrap",children:[(0,d.jsxs)("div",{className:"flex-1 min-w-[240px]",children:[(0,d.jsx)("label",{htmlFor:"new-compatible-model-input",className:"text-xs text-text-muted mb-1 block",children:p("modelId")}),(0,d.jsx)("input",{id:"new-compatible-model-input",type:"text",value:q,onChange:a=>r(a.target.value),onKeyDown:a=>"Enter"===a.key&&z(),placeholder:m?p("anthropicCompatibleModelPlaceholder"):p("openaiCompatibleModelPlaceholder"),className:"w-full px-3 py-2 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary"})]}),(0,d.jsx)(n.Button,{size:"sm",icon:"add",onClick:z,disabled:!q.trim()||s,children:s?p("adding"):p("add")}),(0,d.jsx)(n.Button,{size:"sm",variant:"secondary",icon:"download",onClick:A,disabled:!B||u,children:u?p("importingModels"):p("importFromModels")})]}),!B&&(0,d.jsx)("p",{className:"text-xs text-text-muted",children:p("addConnectionToImport")}),x.length>0&&(0,d.jsx)("div",{className:"flex flex-col gap-3",children:x.map(({modelId:a,fullModel:c,alias:e})=>(0,d.jsx)(H,{modelId:a,fullModel:`${b}/${a}`,copied:g,onCopy:h,onDeleteAlias:()=>C(a,e)},c))})]})}function K({until:a}){let[b,c]=(0,e.useState)("");return((0,e.useEffect)(()=>{let b=()=>{let b=new Date(a).getTime()-Date.now();if(b<=0)return void c("");let d=Math.floor(b/1e3);if(d<60)c(`${d}s`);else if(d<3600)c(`${Math.floor(d/60)}m ${d%60}s`);else{let a=Math.floor(d/3600),b=Math.floor(d%3600/60);c(`${a}h ${b}m`)}};b();let d=setInterval(b,1e3);return()=>clearInterval(d)},[a]),b)?(0,d.jsxs)("span",{className:"text-xs text-orange-500 font-mono",children:["⏱ ",b]}):null}[l,y,z]=C.then?(await C)():C,F.propTypes={model:g.default.shape({id:g.default.string.isRequired}).isRequired,fullModel:g.default.string.isRequired,alias:g.default.string,copied:g.default.string,onCopy:g.default.func.isRequired},G.propTypes={providerAlias:g.default.string.isRequired,modelAliases:g.default.object.isRequired,copied:g.default.string,onCopy:g.default.func.isRequired,onSetAlias:g.default.func.isRequired,onDeleteAlias:g.default.func.isRequired},H.propTypes={modelId:g.default.string.isRequired,fullModel:g.default.string.isRequired,copied:g.default.string,onCopy:g.default.func.isRequired,onDeleteAlias:g.default.func.isRequired},I.propTypes={providerId:g.default.string.isRequired,providerAlias:g.default.string.isRequired,copied:g.default.string,onCopy:g.default.func.isRequired},J.propTypes={providerStorageAlias:g.default.string.isRequired,providerDisplayAlias:g.default.string.isRequired,modelAliases:g.default.object.isRequired,copied:g.default.string,onCopy:g.default.func.isRequired,onSetAlias:g.default.func.isRequired,onDeleteAlias:g.default.func.isRequired,connections:g.default.arrayOf(g.default.shape({id:g.default.string,isActive:g.default.bool})).isRequired,isAnthropic:g.default.bool,onImportWithProgress:g.default.func.isRequired},K.propTypes={until:g.default.string.isRequired};let Q={runtime_error:{labelKey:"errorTypeRuntime",variant:"warning"},upstream_auth_error:{labelKey:"errorTypeUpstreamAuth",variant:"error"},auth_missing:{labelKey:"errorTypeMissingCredential",variant:"warning"},token_refresh_failed:{labelKey:"errorTypeRefreshFailed",variant:"warning"},token_expired:{labelKey:"errorTypeTokenExpired",variant:"warning"},upstream_rate_limited:{labelKey:"errorTypeRateLimited",variant:"warning"},upstream_unavailable:{labelKey:"errorTypeUpstreamUnavailable",variant:"error"},network_error:{labelKey:"errorTypeNetworkError",variant:"warning"},unsupported:{labelKey:"errorTypeTestUnsupported",variant:"default"},upstream_error:{labelKey:"errorTypeUpstreamError",variant:"error"}};function L({connection:a,isOAuth:b,isCodex:c,isFirst:f,isLast:g,onMoveUp:h,onMoveDown:i,onToggleActive:j,onToggleRateLimit:l,onToggleCodex5h:m,onToggleCodexWeekly:p,onRetest:q,isRetesting:r,onEdit:s,onDelete:t,onReauth:u,onProxy:w,hasProxy:x,proxySource:y,proxyHost:z,onRefreshToken:A,isRefreshing:B}){let C,E=(0,k.useTranslations)("providers"),F=b?a.name||a.email||a.displayName||E("oauthAccount"):a.name,[G,H]=(0,e.useState)(!1),[I,J]=(0,e.useState)(()=>{if(!b||!a.expiresAt)return null;let c=new Date(a.expiresAt).getTime();return Math.floor((c-Date.now())/6e4)});(0,e.useEffect)(()=>{if(!b||!a.expiresAt)return;let c=setInterval(()=>{let b=new Date(a.expiresAt).getTime();J(Math.floor((b-Date.now())/6e4))},3e4);return()=>clearInterval(c)},[b,a.expiresAt]),(0,e.useEffect)(()=>{let b=()=>{let b=a.rateLimitedUntil&&new Date(a.rateLimitedUntil).getTime()>Date.now();H(b)};b();let c=a.rateLimitedUntil?setInterval(b,1e3):null;return()=>{c&&clearInterval(c)}},[a.rateLimitedUntil]);let L="unavailable"!==a.testStatus||G?a.testStatus:"active",M=function(a,b,c,d){if(!1===a.isActive)return{statusVariant:"default",statusLabel:d("statusDisabled"),errorType:null,errorBadge:null,errorTextClass:"text-text-muted"};if("active"===b||"success"===b)return{statusVariant:"success",statusLabel:d("statusConnected"),errorType:null,errorBadge:null,errorTextClass:"text-text-muted"};let e=function(a,b){if(b)return"upstream_rate_limited";if(a.lastErrorType)return a.lastErrorType;let c=Number(a.errorCode);if(401===c||403===c)return"upstream_auth_error";if(429===c)return"upstream_rate_limited";if(c>=500)return"upstream_unavailable";let d=(a.lastError||"").toLowerCase();return d?d.includes("runtime")||d.includes("not runnable")||d.includes("not installed")||d.includes("healthcheck")?"runtime_error":d.includes("refresh failed")?"token_refresh_failed":d.includes("token expired")||d.includes("expired")?"token_expired":d.includes("invalid api key")||d.includes("token invalid")||d.includes("revoked")||d.includes("access denied")||d.includes("unauthorized")?"upstream_auth_error":d.includes("rate limit")||d.includes("quota")||d.includes("too many requests")||d.includes("429")?"upstream_rate_limited":d.includes("fetch failed")||d.includes("network")||d.includes("timeout")||d.includes("econn")||d.includes("enotfound")?"network_error":d.includes("not supported")?"unsupported":"upstream_error":null}(a,c),f=e&&Q[e]||null;if("runtime_error"===e)return{statusVariant:"warning",statusLabel:d("statusRuntimeIssue"),errorType:e,errorBadge:f,errorTextClass:"text-yellow-600 dark:text-yellow-400"};if("upstream_auth_error"===e||"auth_missing"===e||"token_refresh_failed"===e||"token_expired"===e)return{statusVariant:"error",statusLabel:d("statusAuthFailed"),errorType:e,errorBadge:f,errorTextClass:"text-red-500"};if("upstream_rate_limited"===e)return{statusVariant:"warning",statusLabel:d("statusRateLimited"),errorType:e,errorBadge:f,errorTextClass:"text-yellow-600 dark:text-yellow-400"};if("network_error"===e)return{statusVariant:"warning",statusLabel:d("statusNetworkIssue"),errorType:e,errorBadge:f,errorTextClass:"text-yellow-600 dark:text-yellow-400"};if("unsupported"===e)return{statusVariant:"default",statusLabel:d("statusTestUnsupported"),errorType:e,errorBadge:f,errorTextClass:"text-text-muted"};let g={unavailable:d("statusUnavailable"),failed:d("statusFailed"),error:d("statusError")};return{statusVariant:"error",statusLabel:g[b]||b||d("statusError"),errorType:e,errorBadge:f,errorTextClass:"text-red-500"}}(a,L,G,E),N=!!a.rateLimitProtection,O=a.providerSpecificData&&"object"==typeof a.providerSpecificData&&a.providerSpecificData.codexLimitPolicy&&"object"==typeof a.providerSpecificData.codexLimitPolicy?a.providerSpecificData.codexLimitPolicy:{},P=D(O),R=P.use5h,S=P.useWeekly;return(0,d.jsxs)("div",{className:`group flex items-center justify-between p-3 rounded-lg hover:bg-black/[0.02] dark:hover:bg-white/[0.02] transition-colors ${!1===a.isActive?"opacity-60":""}`,children:[(0,d.jsxs)("div",{className:"flex items-center gap-3 flex-1 min-w-0",children:[(0,d.jsxs)("div",{className:"flex flex-col",children:[(0,d.jsx)("button",{onClick:h,disabled:f,className:`p-0.5 rounded ${f?"text-text-muted/30 cursor-not-allowed":"hover:bg-sidebar text-text-muted hover:text-primary"}`,children:(0,d.jsx)("span",{className:"material-symbols-outlined text-sm",children:"keyboard_arrow_up"})}),(0,d.jsx)("button",{onClick:i,disabled:g,className:`p-0.5 rounded ${g?"text-text-muted/30 cursor-not-allowed":"hover:bg-sidebar text-text-muted hover:text-primary"}`,children:(0,d.jsx)("span",{className:"material-symbols-outlined text-sm",children:"keyboard_arrow_down"})})]}),(0,d.jsx)("span",{className:"material-symbols-outlined text-base text-text-muted",children:b?"lock":"key"}),(0,d.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,d.jsx)("p",{className:"text-sm font-medium truncate",children:F}),(0,d.jsxs)("div",{className:"flex items-center gap-2 mt-1 flex-wrap",children:[(0,d.jsx)(o.Badge,{variant:M.statusVariant,size:"sm",dot:!0,children:M.statusLabel}),null!==I&&(I<0?(0,d.jsxs)("span",{className:"inline-flex items-center gap-0.5 px-1.5 py-0.5 rounded text-xs font-medium bg-red-500/15 text-red-500",title:`Token expired: ${a.expiresAt}`,children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[11px]",children:"error"}),"expired"]}):I<30?(0,d.jsxs)("span",{className:"inline-flex items-center gap-0.5 px-1.5 py-0.5 rounded text-xs font-medium bg-amber-500/15 text-amber-500",title:`Token expires in ${I}m`,children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[11px]",children:"warning"}),`~${I}m`]}):null),G&&!1!==a.isActive&&(0,d.jsx)(K,{until:a.rateLimitedUntil}),M.errorBadge&&!1!==a.isActive&&(0,d.jsx)(o.Badge,{variant:M.errorBadge.variant,size:"sm",children:E(M.errorBadge.labelKey)}),a.lastError&&!1!==a.isActive&&(0,d.jsx)("span",{className:`text-xs truncate max-w-[300px] ${M.errorTextClass}`,title:a.lastError,children:a.lastError}),(0,d.jsxs)("span",{className:"text-xs text-text-muted",children:["#",a.priority]}),a.globalPriority&&(0,d.jsx)("span",{className:"text-xs text-text-muted",children:E("autoPriority",{priority:a.globalPriority})}),(0,d.jsx)("span",{className:"text-text-muted/30 select-none",children:"|"}),(0,d.jsxs)("button",{onClick:()=>l(!N),className:`inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-xs font-medium transition-all cursor-pointer ${N?"bg-emerald-500/15 text-emerald-500 hover:bg-emerald-500/25":"bg-black/[0.03] dark:bg-white/[0.03] text-text-muted/50 hover:text-text-muted hover:bg-black/[0.06] dark:hover:bg-white/[0.06]"}`,title:E(N?"disableRateLimitProtection":"enableRateLimitProtection"),children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[13px]",children:"shield"}),E(N?"rateLimitProtected":"rateLimitUnprotected")]}),c&&(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)("span",{className:"text-text-muted/30 select-none",children:"|"}),(0,d.jsxs)("button",{onClick:()=>m?.(!R),className:`inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-xs font-medium transition-all cursor-pointer ${R?"bg-blue-500/15 text-blue-500 hover:bg-blue-500/25":"bg-black/[0.03] dark:bg-white/[0.03] text-text-muted/50 hover:text-text-muted hover:bg-black/[0.06] dark:hover:bg-white/[0.06]"}`,title:"Toggle Codex 5h limit policy",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[13px]",children:"timer"}),"5h ",R?"ON":"OFF"]}),(0,d.jsxs)("button",{onClick:()=>p?.(!S),className:`inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-xs font-medium transition-all cursor-pointer ${S?"bg-violet-500/15 text-violet-500 hover:bg-violet-500/25":"bg-black/[0.03] dark:bg-white/[0.03] text-text-muted/50 hover:text-text-muted hover:bg-black/[0.06] dark:hover:bg-white/[0.06]"}`,title:"Toggle Codex weekly limit policy",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[13px]",children:"date_range"}),"Weekly ",S?"ON":"OFF"]})]}),x&&(C=E("global"===y?"proxySourceGlobal":"provider"===y?"proxySourceProvider":"proxySourceKey"),(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)("span",{className:"text-text-muted/30 select-none",children:"|"}),(0,d.jsxs)("span",{className:`inline-flex items-center gap-0.5 px-1.5 py-0.5 rounded text-xs font-medium ${"global"===y?"bg-emerald-500/15 text-emerald-500":"provider"===y?"bg-amber-500/15 text-amber-500":"bg-blue-500/15 text-blue-500"}`,title:E("proxyConfiguredBySource",{source:C,host:z||E("configured")}),children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[13px]",children:"vpn_lock"}),z||E("proxy")]})]}))]})]})]}),(0,d.jsxs)("div",{className:"flex items-center gap-2",children:[(0,d.jsx)(n.Button,{size:"sm",variant:"ghost",icon:"refresh",loading:r,disabled:!1===a.isActive,onClick:q,className:"!h-7 !px-2 text-xs",title:E("retestAuthentication"),children:E("retest")}),A&&(0,d.jsx)(n.Button,{size:"sm",variant:"ghost",icon:"token",loading:B,disabled:!1===a.isActive||B,onClick:A,className:"!h-7 !px-2 text-xs text-amber-500 hover:text-amber-400",title:"Refresh OAuth token manually",children:"Token"}),(0,d.jsx)(v.Toggle,{size:"sm",checked:a.isActive??!0,onChange:j,title:E(a.isActive??!0?"disableConnection":"enableConnection")}),(0,d.jsxs)("div",{className:"flex gap-1 ml-1 transition-opacity",children:[u&&(0,d.jsx)("button",{onClick:u,className:"p-2 hover:bg-amber-500/10 rounded text-amber-600 hover:text-amber-500",title:E("reauthenticateConnection"),children:(0,d.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"passkey"})}),(0,d.jsx)("button",{onClick:s,className:"p-2 hover:bg-black/5 dark:hover:bg-white/5 rounded text-text-muted hover:text-primary",title:E("edit"),children:(0,d.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"edit"})}),(0,d.jsx)("button",{onClick:w,className:"p-2 hover:bg-black/5 dark:hover:bg-white/5 rounded text-text-muted hover:text-primary",title:E("proxyConfig"),children:(0,d.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"vpn_lock"})}),(0,d.jsx)("button",{onClick:t,className:"p-2 hover:bg-red-500/10 rounded text-red-500",title:E("delete"),children:(0,d.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"delete"})})]})]})]})}function M({isOpen:a,provider:b,providerName:c,isCompatible:f,isAnthropic:g,onSave:h,onClose:i}){let j=(0,k.useTranslations)("providers"),l="bailian-coding-plan"===b,m="https://coding-intl.dashscope.aliyuncs.com/apps/anthropic/v1",[r,s]=(0,e.useState)({name:"",apiKey:"",priority:1,baseUrl:l?m:""}),[t,u]=(0,e.useState)(!1),[v,w]=(0,e.useState)(null),[x,y]=(0,e.useState)(!1),[z,A]=(0,e.useState)(null),B=async()=>{u(!0),A(null);try{let a=await fetch("/api/providers/validate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:b,apiKey:r.apiKey})}),c=await a.json();w(c.valid?"success":"failed")}catch{w("failed")}finally{u(!1)}},C=async()=>{if(b&&r.apiKey){y(!0),A(null);try{let a=null;if(l){let b=N(r.baseUrl,m);if(b.error)return void A(b.error);a=b.value}let c=!1;try{u(!0),w(null);let a=await fetch("/api/providers/validate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:b,apiKey:r.apiKey})});c=!!(await a.json()).valid,w(c?"success":"failed")}catch{w("failed")}finally{u(!1)}if(!c)return void A(j("apiKeyValidationFailed"));let d={name:r.name,apiKey:r.apiKey,priority:r.priority,testStatus:"active",providerSpecificData:void 0};l&&(d.providerSpecificData={baseUrl:a});let e=await h(d);e&&A("string"==typeof e?e:j("failedSaveConnection"))}finally{y(!1)}}};return b?(0,d.jsx)(q.Modal,{isOpen:a,title:j("addProviderApiKeyTitle",{provider:c||b}),onClose:i,children:(0,d.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,d.jsx)(p.Input,{label:j("nameLabel"),value:r.name,onChange:a=>s({...r,name:a.target.value}),placeholder:j("productionKey")}),(0,d.jsxs)("div",{className:"flex gap-2",children:[(0,d.jsx)(p.Input,{label:j("apiKeyLabel"),type:"password",value:r.apiKey,onChange:a=>s({...r,apiKey:a.target.value}),className:"flex-1"}),(0,d.jsx)("div",{className:"pt-6",children:(0,d.jsx)(n.Button,{onClick:B,disabled:!r.apiKey||t||x,variant:"secondary",children:t?j("checking"):j("check")})})]}),v&&(0,d.jsx)(o.Badge,{variant:"success"===v?"success":"error",children:"success"===v?j("valid"):j("invalid")}),z&&(0,d.jsx)("div",{className:"text-sm text-red-500 bg-red-500/10 border border-red-500/20 rounded-lg px-3 py-2",children:z}),f&&(0,d.jsx)("p",{className:"text-xs text-text-muted",children:g?j("validationChecksAnthropicCompatible",{provider:c||j("anthropicCompatibleName")}):j("validationChecksOpenAiCompatible",{provider:c||j("openaiCompatibleName")})}),(0,d.jsx)(p.Input,{label:j("priorityLabel"),type:"number",value:r.priority,onChange:a=>s({...r,priority:Number.parseInt(a.target.value)||1})}),l&&(0,d.jsx)(p.Input,{label:"Base URL",value:r.baseUrl,onChange:a=>s({...r,baseUrl:a.target.value}),placeholder:m,hint:"Optional: Custom base URL for bailian-coding-plan provider"}),(0,d.jsxs)("div",{className:"flex gap-2",children:[(0,d.jsx)(n.Button,{onClick:C,fullWidth:!0,disabled:!r.name||!r.apiKey||x,children:x?j("saving"):j("save")}),(0,d.jsx)(n.Button,{onClick:i,variant:"ghost",fullWidth:!0,children:j("cancel")})]})]})}):null}function N(a,b){let c=("string"==typeof a?a.trim():"")||b;try{let a=new URL(c);if("http:"!==a.protocol&&"https:"!==a.protocol)return{value:null,error:"Base URL must use http or https"};return{value:c,error:null}}catch{return{value:null,error:"Base URL must be a valid URL"}}}function O({isOpen:a,connection:b,onSave:c,onClose:f}){let g=(0,k.useTranslations)("providers"),[h,i]=(0,e.useState)({name:"",priority:1,apiKey:"",healthCheckInterval:60,baseUrl:""}),[j,l]=(0,e.useState)(!1),[m,r]=(0,e.useState)(null),[s,t]=(0,e.useState)(!1),[u,v]=(0,e.useState)(null),[w,x]=(0,e.useState)(!1),[z,A]=(0,e.useState)(null),[B,C]=(0,e.useState)([]),[D,E]=(0,e.useState)(""),F=b?.provider==="bailian-coding-plan",G="https://coding-intl.dashscope.aliyuncs.com/apps/anthropic/v1";(0,e.useEffect)(()=>{if(b){let a=b.providerSpecificData?.baseUrl;i({name:b.name||"",priority:b.priority||1,apiKey:"",healthCheckInterval:b.healthCheckInterval??60,baseUrl:a||(F?G:"")});let c=b.providerSpecificData?.extraApiKeys;C(Array.isArray(c)?c:[]),E(""),r(null),v(null),A(null)}},[b,F]);let H=async()=>{if(b?.provider){l(!0),r(null);try{let a=await fetch(`/api/providers/${b.id}/test`,{method:"POST"}),c=await a.json();r({valid:!!c.valid,diagnosis:c.diagnosis||null,message:c.error||null})}catch{r({valid:!1,diagnosis:{type:"network_error"},message:g("failedTestConnection")})}finally{l(!1)}}},I=async()=>{if(b?.provider&&h.apiKey){t(!0),v(null);try{let a=await fetch("/api/providers/validate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:b.provider,apiKey:h.apiKey})}),c=await a.json();v(c.valid?"success":"failed")}catch{v("failed")}finally{t(!1)}}},J=async()=>{x(!0),A(null);try{let a={name:h.name,priority:h.priority,healthCheckInterval:h.healthCheckInterval},d=null;if(F){let a=N(h.baseUrl,G);if(a.error)return void A(a.error);d=a.value}if(!K&&h.apiKey){a.apiKey=h.apiKey;let c="success"===u;if(!c)try{t(!0),v(null);let a=await fetch("/api/providers/validate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:b.provider,apiKey:h.apiKey})});c=!!(await a.json()).valid,v(c?"success":"failed")}catch{v("failed")}finally{t(!1)}c&&(a.testStatus="active",a.lastError=null,a.lastErrorAt=null,a.lastErrorType=null,a.lastErrorSource=null,a.errorCode=null,a.rateLimitedUntil=null)}!K&&(a.providerSpecificData={...b.providerSpecificData||{},extraApiKeys:B.filter(a=>a.trim().length>0)},F&&(a.providerSpecificData.baseUrl=d));let e=await c(a);e&&A("string"==typeof e?e:g("failedSaveConnection"))}finally{x(!1)}};if(!b)return null;let K="oauth"===b.authType,L=(0,y.isOpenAICompatibleProvider)(b.provider)||(0,y.isAnthropicCompatibleProvider)(b.provider),M=!m?.valid&&m?.diagnosis?.type&&Q[m.diagnosis.type]||null;return(0,d.jsx)(q.Modal,{isOpen:a,title:g("editConnection"),onClose:f,children:(0,d.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,d.jsx)(p.Input,{label:g("nameLabel"),value:h.name,onChange:a=>i({...h,name:a.target.value}),placeholder:K?g("accountName"):g("productionKey")}),K&&b.email&&(0,d.jsxs)("div",{className:"bg-sidebar/50 p-3 rounded-lg",children:[(0,d.jsx)("p",{className:"text-sm text-text-muted mb-1",children:g("email")}),(0,d.jsx)("p",{className:"font-medium",children:b.email})]}),K&&(0,d.jsx)(p.Input,{label:g("healthCheckMinutes"),type:"number",value:h.healthCheckInterval,onChange:a=>i({...h,healthCheckInterval:Math.max(0,Number.parseInt(a.target.value)||0)}),hint:g("healthCheckHint")}),(0,d.jsx)(p.Input,{label:g("priorityLabel"),type:"number",value:h.priority,onChange:a=>i({...h,priority:Number.parseInt(a.target.value)||1})}),!K&&(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)("div",{className:"flex gap-2",children:[(0,d.jsx)(p.Input,{label:g("apiKeyLabel"),type:"password",value:h.apiKey,onChange:a=>i({...h,apiKey:a.target.value}),placeholder:g("enterNewApiKey"),hint:g("leaveBlankKeepCurrentApiKey"),className:"flex-1"}),(0,d.jsx)("div",{className:"pt-6",children:(0,d.jsx)(n.Button,{onClick:I,disabled:!h.apiKey||s||w,variant:"secondary",children:s?g("checking"):g("check")})})]}),u&&(0,d.jsx)(o.Badge,{variant:"success"===u?"success":"error",children:"success"===u?g("valid"):g("invalid")}),z&&(0,d.jsx)("div",{className:"text-sm text-red-500 bg-red-500/10 border border-red-500/20 rounded-lg px-3 py-2",children:z})]}),F&&(0,d.jsx)(p.Input,{label:"Base URL",value:h.baseUrl,onChange:a=>i({...h,baseUrl:a.target.value}),placeholder:G,hint:"Custom base URL for bailian-coding-plan provider"}),!K&&(0,d.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,d.jsxs)("label",{className:"text-sm font-medium text-text-main",children:["Extra API Keys",(0,d.jsx)("span",{className:"ml-2 text-[11px] font-normal text-text-muted",children:"(round-robin rotation — optional)"})]}),B.length>0&&(0,d.jsx)("div",{className:"flex flex-col gap-1.5",children:B.map((a,b)=>(0,d.jsxs)("div",{className:"flex items-center gap-2",children:[(0,d.jsx)("span",{className:"flex-1 font-mono text-xs bg-sidebar/50 px-3 py-2 rounded border border-border text-text-muted truncate",children:`Key #${b+2}: ${a.slice(0,6)}...${a.slice(-4)}`}),(0,d.jsx)("button",{onClick:()=>C(B.filter((a,c)=>c!==b)),className:"p-1.5 rounded hover:bg-red-500/10 text-red-400 hover:text-red-500",title:"Remove this key",children:(0,d.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"close"})})]},b))}),(0,d.jsxs)("div",{className:"flex gap-2",children:[(0,d.jsx)("input",{type:"password",value:D,onChange:a=>E(a.target.value),placeholder:"Add another API key...",className:"flex-1 text-sm bg-sidebar/50 border border-border rounded px-3 py-2 text-text-main placeholder:text-text-muted focus:ring-1 focus:ring-primary outline-none",onKeyDown:a=>{"Enter"===a.key&&D.trim()&&(C([...B,D.trim()]),E(""))}}),(0,d.jsx)("button",{onClick:()=>{D.trim()&&(C([...B,D.trim()]),E(""))},disabled:!D.trim(),className:"px-3 py-2 rounded bg-primary/10 text-primary hover:bg-primary/20 disabled:opacity-40 text-sm font-medium",children:"Add"})]}),B.length>0&&(0,d.jsxs)("p",{className:"text-[11px] text-text-muted",children:[B.length+1," keys total — rotating round-robin on each request."]})]}),!L&&(0,d.jsxs)("div",{className:"flex items-center gap-3",children:[(0,d.jsx)(n.Button,{onClick:H,variant:"secondary",disabled:j,children:j?g("testing"):g("testConnection")}),m&&(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(o.Badge,{variant:m.valid?"success":"error",children:m.valid?g("valid"):g("failed")}),M&&(0,d.jsx)(o.Badge,{variant:M.variant,children:g(M.labelKey)})]})]}),(0,d.jsxs)("div",{className:"flex gap-2",children:[(0,d.jsx)(n.Button,{onClick:J,fullWidth:!0,disabled:w,children:w?g("saving"):g("save")}),(0,d.jsx)(n.Button,{onClick:f,variant:"ghost",fullWidth:!0,children:g("cancel")})]})]})})}function P({isOpen:a,node:b,onSave:c,onClose:f,isAnthropic:g}){let h=(0,k.useTranslations)("providers"),[i,j]=(0,e.useState)({name:"",prefix:"",apiType:"chat",baseUrl:"https://api.openai.com/v1",chatPath:"",modelsPath:""}),[l,m]=(0,e.useState)(!1),[r,s]=(0,e.useState)(""),[t,u]=(0,e.useState)(!1),[v,x]=(0,e.useState)(null),[y,z]=(0,e.useState)(!1);(0,e.useEffect)(()=>{b&&(j({name:b.name||"",prefix:b.prefix||"",apiType:b.apiType||"chat",baseUrl:b.baseUrl||(g?"https://api.anthropic.com/v1":"https://api.openai.com/v1"),chatPath:b.chatPath||"",modelsPath:b.modelsPath||""}),z(!!(b.chatPath||b.modelsPath)))},[b,g]);let A=[{value:"chat",label:h("chatCompletions")},{value:"responses",label:h("responsesApi")}],B=async()=>{if(i.name.trim()&&i.prefix.trim()&&i.baseUrl.trim()){m(!0);try{let a={name:i.name,prefix:i.prefix,baseUrl:i.baseUrl,chatPath:i.chatPath||"",modelsPath:i.modelsPath||""};g||(a.apiType=i.apiType),await c(a)}finally{m(!1)}}},C=async()=>{u(!0);try{let a=await fetch("/api/provider-nodes/validate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({baseUrl:i.baseUrl,apiKey:r,type:g?"anthropic-compatible":"openai-compatible",modelsPath:i.modelsPath||""})}),b=await a.json();x(b.valid?"success":"failed")}catch{x("failed")}finally{u(!1)}};return b?(0,d.jsx)(q.Modal,{isOpen:a,title:h("editCompatibleTitle",{type:h(g?"anthropic":"openai")}),onClose:f,children:(0,d.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,d.jsx)(p.Input,{label:h("nameLabel"),value:i.name,onChange:a=>j({...i,name:a.target.value}),placeholder:h("compatibleProdPlaceholder",{type:h(g?"anthropic":"openai")}),hint:h("nameHint")}),(0,d.jsx)(p.Input,{label:h("prefixLabel"),value:i.prefix,onChange:a=>j({...i,prefix:a.target.value}),placeholder:h(g?"anthropicPrefixPlaceholder":"openaiPrefixPlaceholder"),hint:h("prefixHint")}),!g&&(0,d.jsx)(w.Select,{label:h("apiTypeLabel"),options:A,value:i.apiType,onChange:a=>j({...i,apiType:a.target.value})}),(0,d.jsx)(p.Input,{label:h("baseUrlLabel"),value:i.baseUrl,onChange:a=>j({...i,baseUrl:a.target.value}),placeholder:h(g?"anthropicBaseUrlPlaceholder":"openaiBaseUrlPlaceholder"),hint:h("compatibleBaseUrlHint",{type:h(g?"anthropic":"openai")})}),(0,d.jsxs)("button",{type:"button",className:"text-sm text-text-muted hover:text-text-primary flex items-center gap-1",onClick:()=>z(!y),"aria-expanded":y,"aria-controls":"advanced-settings",children:[(0,d.jsx)("span",{className:`transition-transform ${y?"rotate-90":""}`,"aria-hidden":"true",children:"▶"}),h("advancedSettings")]}),y&&(0,d.jsxs)("div",{id:"advanced-settings",className:"flex flex-col gap-3 pl-2 border-l-2 border-border",children:[(0,d.jsx)(p.Input,{label:h("chatPathLabel"),value:i.chatPath,onChange:a=>j({...i,chatPath:a.target.value}),placeholder:g?"/messages":h("chatPathPlaceholder"),hint:h("chatPathHint")}),(0,d.jsx)(p.Input,{label:h("modelsPathLabel"),value:i.modelsPath,onChange:a=>j({...i,modelsPath:a.target.value}),placeholder:h("modelsPathPlaceholder"),hint:h("modelsPathHint")})]}),(0,d.jsxs)("div",{className:"flex gap-2",children:[(0,d.jsx)(p.Input,{label:h("apiKeyForCheck"),type:"password",value:r,onChange:a=>s(a.target.value),className:"flex-1"}),(0,d.jsx)("div",{className:"pt-6",children:(0,d.jsx)(n.Button,{onClick:C,disabled:!r||t||!i.baseUrl.trim(),variant:"secondary",children:h(t?"checking":"check")})})]}),v&&(0,d.jsx)(o.Badge,{variant:"success"===v?"success":"error",children:h("success"===v?"valid":"invalid")}),(0,d.jsxs)("div",{className:"flex gap-2",children:[(0,d.jsx)(n.Button,{onClick:B,fullWidth:!0,disabled:!i.name.trim()||!i.prefix.trim()||!i.baseUrl.trim()||l,children:h(l?"saving":"save")}),(0,d.jsx)(n.Button,{onClick:f,variant:"ghost",fullWidth:!0,children:h("cancel")})]})]})}):null}L.propTypes={connection:g.default.shape({id:g.default.string,name:g.default.string,email:g.default.string,displayName:g.default.string,rateLimitedUntil:g.default.string,rateLimitProtection:g.default.bool,testStatus:g.default.string,isActive:g.default.bool,priority:g.default.number,lastError:g.default.string,lastErrorType:g.default.string,lastErrorSource:g.default.string,errorCode:g.default.oneOfType([g.default.string,g.default.number]),globalPriority:g.default.number,providerSpecificData:g.default.object}).isRequired,isOAuth:g.default.bool.isRequired,isCodex:g.default.bool,isFirst:g.default.bool.isRequired,isLast:g.default.bool.isRequired,onMoveUp:g.default.func.isRequired,onMoveDown:g.default.func.isRequired,onToggleActive:g.default.func.isRequired,onToggleRateLimit:g.default.func.isRequired,onToggleCodex5h:g.default.func,onToggleCodexWeekly:g.default.func,onRetest:g.default.func.isRequired,isRetesting:g.default.bool,onEdit:g.default.func.isRequired,onDelete:g.default.func.isRequired,onReauth:g.default.func},M.propTypes={isOpen:g.default.bool.isRequired,provider:g.default.string,providerName:g.default.string,isCompatible:g.default.bool,isAnthropic:g.default.bool,onSave:g.default.func.isRequired,onClose:g.default.func.isRequired},O.propTypes={isOpen:g.default.bool.isRequired,connection:g.default.shape({id:g.default.string,name:g.default.string,email:g.default.string,priority:g.default.number,authType:g.default.string,provider:g.default.string}),onSave:g.default.func.isRequired,onClose:g.default.func.isRequired},P.propTypes={isOpen:g.default.bool.isRequired,node:g.default.shape({id:g.default.string,name:g.default.string,prefix:g.default.string,apiType:g.default.string,baseUrl:g.default.string,chatPath:g.default.string,modelsPath:g.default.string}),onSave:g.default.func.isRequired,onClose:g.default.func.isRequired,isAnthropic:g.default.bool},a.s(["default",()=>E]),c()}catch(a){c(a)}},!1)];
1
+ module.exports=[779276,a=>{"use strict";var b=a.i(743442);a.s(["OAuthModal",()=>b.default])},202373,a=>{"use strict";var b=a.i(394093);a.s(["KiroOAuthWrapper",()=>b.default])},182527,a=>{"use strict";var b=a.i(296193);a.s(["CursorAuthModal",()=>b.default])},755235,a=>a.a(async(b,c)=>{try{var d=a.i(187924),e=a.i(572131),f=a.i(240246),g=a.i(341212),h=a.i(50944),i=a.i(238246),j=a.i(571987),k=a.i(415925),l=a.i(442308),m=a.i(292216),n=a.i(294023),o=a.i(818465),p=a.i(489108),q=a.i(563203),r=a.i(831097),s=a.i(779276),t=a.i(202373),u=a.i(182527),v=a.i(709918),w=a.i(525290),x=a.i(248172),y=a.i(662073),z=a.i(867933),A=a.i(911655),B=a.i(386592),C=b([l,y,z]);function D(a){let b=a&&"object"==typeof a&&!Array.isArray(a)?a:{};return{use5h:"boolean"!=typeof b.use5h||b.use5h,useWeekly:"boolean"!=typeof b.useWeekly||b.useWeekly}}function E({t:a,normalizeToolCallId:b,preserveDeveloperRole:c,showDeveloperToggle:f=!0,onNormalizeChange:g,onPreserveChange:h,disabled:i}){let[j,k]=(0,e.useState)(!1),l=(0,e.useRef)(null);return(0,e.useEffect)(()=>{if(!j)return;let a=a=>{l.current&&!l.current.contains(a.target)&&k(!1)};return document.addEventListener("mousedown",a),()=>document.removeEventListener("mousedown",a)},[j]),(0,d.jsxs)("div",{className:"relative inline-block",ref:l,children:[(0,d.jsxs)("button",{type:"button",onClick:()=>k(a=>!a),disabled:i,className:"inline-flex items-center gap-1 px-2 py-1 text-xs rounded-md border border-border bg-sidebar/50 hover:bg-sidebar text-text-muted hover:text-text-main disabled:opacity-50",title:a("compatAdjustmentsTitle"),children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-sm",children:"tune"}),a("compatButtonLabel")]}),j&&(0,d.jsxs)("div",{className:"absolute left-0 top-full mt-1 z-50 min-w-[200px] p-3 rounded-lg border border-border bg-white dark:bg-zinc-900 shadow-xl ring-1 ring-black/5 dark:ring-white/10",children:[(0,d.jsx)("p",{className:"text-[10px] font-semibold uppercase tracking-wide text-text-muted mb-2",children:a("compatAdjustmentsTitle")}),(0,d.jsxs)("div",{className:"flex flex-col gap-3",children:[(0,d.jsx)(v.Toggle,{size:"sm",label:a("compatToolIdShort"),title:a("normalizeToolCallIdLabel"),checked:b,onChange:g,disabled:i}),f&&(0,d.jsx)(v.Toggle,{size:"sm",label:a("compatDoNotPreserveDeveloper"),title:a("preserveDeveloperRoleLabel"),checked:!1===c,onChange:a=>h(!a),disabled:i})]})]})]})}function F(){let a=(0,h.useParams)(),b=(0,h.useRouter)(),c=a.id,[g,l]=(0,e.useState)([]),[o,p]=(0,e.useState)(!0),[v,w]=(0,e.useState)(null),[z,C]=(0,e.useState)(!1),[E,F]=(0,e.useState)(!1),[I,L]=(0,e.useState)(!1),[O,R]=(0,e.useState)(!1),[S,T]=(0,e.useState)(null),[U,V]=(0,e.useState)(null),[W,X]=(0,e.useState)({}),[Y,Z]=(0,e.useState)(!1),{copied:$,copy:_}=(0,B.useCopyToClipboard)(),aa=(0,k.useTranslations)("providers"),ab=(0,f.useNotificationStore)(),ac=(0,e.useRef)(!1),ad=(0,e.useRef)(!1),[ae,af]=(0,e.useState)(null),[ag,ah]=(0,e.useState)(null),[ai,aj]=(0,e.useState)(!1),[ak,al]=(0,e.useState)(!1),[am,an]=(0,e.useState)({current:0,total:0,phase:"idle",status:"",logs:[],error:"",importedCount:0}),[ao,ap]=(0,e.useState)({customModels:[],modelCompatOverrides:[]}),[aq,ar]=(0,e.useState)(null),as=v?{id:v.id,name:v.name||("anthropic-compatible"===v.type?aa("anthropicCompatibleName"):aa("openaiCompatibleName")),color:"anthropic-compatible"===v.type?"#D97757":"#10A37F",textIcon:"anthropic-compatible"===v.type?"AC":"OC",apiType:v.apiType,baseUrl:v.baseUrl,type:v.type}:y.FREE_PROVIDERS[c]||y.OAUTH_PROVIDERS[c]||y.APIKEY_PROVIDERS[c],at=!!y.FREE_PROVIDERS[c]||!!y.OAUTH_PROVIDERS[c],au=(0,A.getModelsByProviderId)(c),av=(0,y.getProviderAlias)(c),aw=(0,y.isOpenAICompatibleProvider)(c),ax=(0,y.isAnthropicCompatibleProvider)(c),ay=aw||ax,az=c.endsWith("-search"),aA=ay?c:av,aB=ay?v?.prefix||c:av,aC=(0,e.useCallback)(async()=>{try{let a=await fetch("/api/models/alias"),b=await a.json();a.ok&&X(b.aliases||{})}catch(a){console.log("Error fetching aliases:",a)}},[]),aD=(0,e.useCallback)(async()=>{if(!az)try{let a=await fetch(`/api/provider-models?provider=${encodeURIComponent(c)}`,{cache:"no-store"});if(!a.ok)return;let b=await a.json();ap({customModels:b.models||[],modelCompatOverrides:b.modelCompatOverrides||[]})}catch(a){console.error("fetchProviderModelMeta",a)}},[c,az]),aE=(0,e.useCallback)(async()=>{try{let[a,b]=await Promise.all([fetch("/api/providers",{cache:"no-store"}),fetch("/api/provider-nodes",{cache:"no-store"})]),d=await a.json(),e=await b.json();if(a.ok){let a=(d.connections||[]).filter(a=>a.provider===c);l(a)}if(b.ok){let a=(e.nodes||[]).find(a=>a.id===c)||null;if(!a&&ay)for(let b=0;b<3;b+=1){await new Promise(a=>setTimeout(a,150));let b=await fetch("/api/provider-nodes",{cache:"no-store"});if(b.ok&&(a=((await b.json()).nodes||[]).find(a=>a.id===c)||null))break}w(a)}}catch(a){console.log("Error fetching connections:",a)}finally{p(!1)}},[c,ay]),aF=async a=>{try{let b=await fetch(`/api/provider-nodes/${c}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)}),d=await b.json();b.ok&&(w(d.node),await aE(),R(!1))}catch(a){console.log("Error updating provider node:",a)}};(0,e.useEffect)(()=>{aE(),aC(),fetch("/api/settings/proxy").then(a=>a.ok?a.json():null).then(a=>ah(a)).catch(()=>{})},[aE,aC]),(0,e.useEffect)(()=>{o||az||aD()},[o,az,aD]),(0,e.useEffect)(()=>{o||0!==g.length||!as||ay||ac.current||ad.current||(ac.current=!0,at?C(!0):F(!0))},[o]);let aG=async(a,b,c=av)=>{let d=`${c}/${a}`;try{let a=await fetch("/api/models/alias",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:d,alias:b})});if(a.ok)await aC();else{let b=await a.json();alert(b.error||aa("failedSetAlias"))}}catch(a){console.log("Error setting alias:",a)}},aH=async a=>{try{(await fetch(`/api/models/alias?alias=${encodeURIComponent(a)}`,{method:"DELETE"})).ok&&await aC()}catch(a){console.log("Error deleting alias:",a)}},aI=async a=>{if(confirm(aa("deleteConnectionConfirm")))try{(await fetch(`/api/providers/${a}`,{method:"DELETE"})).ok&&l(g.filter(b=>b.id!==a))}catch(a){console.log("Error deleting connection:",a)}},aJ=(0,e.useCallback)(()=>{aE(),C(!1)},[aE]),aK=async a=>{try{let b=await fetch("/api/providers",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:c,...a})});if(b.ok)return await aE(),F(!1),null;let d=await b.json().catch(()=>({}));return d.error?.message||d.error||aa("failedSaveConnection")}catch(a){return console.log("Error saving connection:",a),aa("failedSaveConnectionRetry")}},aL=async a=>{try{let b=await fetch(`/api/providers/${S.id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)});if(b.ok)return await aE(),L(!1),null;let c=await b.json().catch(()=>({}));return c.error?.message||c.error||aa("failedSaveConnection")}catch(a){return console.log("Error updating connection:",a),aa("failedSaveConnectionRetry")}},aM=async(a,b)=>{try{(await fetch(`/api/providers/${a}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({isActive:b})})).ok&&l(c=>c.map(c=>c.id===a?{...c,isActive:b}:c))}catch(a){console.log("Error updating connection status:",a)}},aN=async(a,b)=>{try{(await fetch("/api/rate-limits",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({connectionId:a,enabled:b})})).ok&&l(c=>c.map(c=>c.id===a?{...c,rateLimitProtection:b}:c))}catch(a){console.error("Error toggling rate limit:",a)}},aO=async(a,b,c)=>{try{let d=g.find(b=>b.id===a);if(!d)return;let e=d.providerSpecificData&&"object"==typeof d.providerSpecificData?d.providerSpecificData:{},f=e.codexLimitPolicy&&"object"==typeof e.codexLimitPolicy?e.codexLimitPolicy:{},h={...D(f),[b]:c},i=await fetch(`/api/providers/${a}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({providerSpecificData:{...e,codexLimitPolicy:h}})});if(!i.ok){let a=await i.json().catch(()=>({}));ab.error(a.error||"Failed to update Codex limit policy");return}l(b=>b.map(b=>b.id===a?{...b,providerSpecificData:{...b.providerSpecificData||{},codexLimitPolicy:h}}:b)),ab.success("Codex limit policy updated")}catch(a){console.error("Error toggling Codex quota policy:",a),ab.error("Failed to update Codex limit policy")}},aP=async a=>{if(a&&!U){V(a);try{let b=await fetch(`/api/providers/${a}/test`,{method:"POST"});if(!b.ok){let a=await b.json().catch(()=>({}));alert(a.error||aa("failedRetestConnection"));return}await aE()}catch(a){console.error("Error retesting connection:",a)}finally{V(null)}}},[aQ,aR]=(0,e.useState)(null),aS=async a=>{if(!aQ){aR(a);try{let b=await fetch(`/api/providers/${a}/refresh`,{method:"POST"}),c=await b.json().catch(()=>({}));b.ok&&c.success?(ab.success(aa("tokenRefreshed")),await aE()):ab.error(c.error||aa("tokenRefreshFailed"))}catch(a){console.error("Error refreshing token:",a),ab.error(aa("tokenRefreshFailed"))}finally{aR(null)}}},aT=async(a,b)=>{if(a&&b)try{let c=b.priority,d=a.priority;c===d&&(c=g.indexOf(a)>g.indexOf(b)?b.priority-.5:b.priority+.5),await Promise.all([fetch(`/api/providers/${a.id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({priority:c})}),fetch(`/api/providers/${b.id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({priority:d})})]),await aE()}catch(a){console.log("Error swapping priority:",a)}},aU=async()=>{if(ai)return;let a=g.find(a=>!1!==a.isActive);if(a){aj(!0),al(!0),an({current:0,total:0,phase:"fetching",status:aa("fetchingModels"),logs:[],error:"",importedCount:0});try{let b=await fetch(`/api/providers/${a.id}/models`),d=await b.json();if(!b.ok)return void an(a=>({...a,phase:"error",status:aa("failedFetchModels"),error:d.error||aa("failedImportModels")}));let e=d.models||[];if(0===e.length)return void an(a=>({...a,phase:"done",status:aa("noModelsFound"),logs:[aa("noModelsReturnedFromEndpoint")]}));an(a=>({...a,phase:"importing",total:e.length,status:aa("importingModelsProgress",{current:0,total:e.length}),logs:[aa("foundModelsStartingImport",{count:e.length})]}));let f=0;for(let a=0;a<e.length;a++){let b=e[a],d=b.id||b.name||b.model;if(!d)continue;let g=d.split("/"),h=g[g.length-1];an(b=>({...b,current:a+1,status:aa("importingModelsProgress",{current:a+1,total:e.length}),logs:[...b.logs,aa("importingModelById",{modelId:d})]})),await fetch("/api/provider-models",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:c,modelId:d,modelName:b.name||d,source:"imported"})}),W[h]||await aG(d,h,aA),f+=1}await aC(),an(a=>({...a,phase:"done",current:e.length,status:f>0?aa("importSuccessCount",{count:f}):aa("noNewModelsAddedExisting"),logs:[...a.logs,f>0?aa("importDoneCount",{count:f}):aa("noNewModelsAdded")],importedCount:f})),f>0&&setTimeout(()=>{window.location.reload()},2e3)}catch(a){console.log("Error importing models:",a),an(b=>({...b,phase:"error",status:aa("importFailed"),error:a instanceof Error?a.message:aa("unexpectedErrorOccurred")}))}finally{aj(!1)}}},aV=async(a,b)=>{al(!0),an({current:0,total:0,phase:"fetching",status:aa("fetchingModels"),logs:[],error:"",importedCount:0});try{let c=(await a()).models||[];if(0===c.length)return void an(a=>({...a,phase:"done",status:aa("noModelsFound"),logs:[aa("noModelsReturnedFromEndpoint")]}));an(a=>({...a,phase:"importing",total:c.length,status:aa("importingModelsProgress",{current:0,total:c.length}),logs:[aa("foundModelsStartingImport",{count:c.length})]}));let d=0;for(let a=0;a<c.length;a++){let e=c[a],f=e.id||e.name||e.model;f&&(an(b=>({...b,current:a+1,status:aa("importingModelsProgress",{current:a+1,total:c.length}),logs:[...b.logs,aa("importingModelById",{modelId:f})]})),await b(e)&&(d+=1))}an(a=>({...a,phase:"done",current:c.length,status:d>0?aa("importSuccessCount",{count:d}):aa("noNewModelsAdded"),logs:[...a.logs,d>0?aa("importDoneCount",{count:d}):aa("noNewModelsAdded")],importedCount:d})),d>0&&setTimeout(()=>{window.location.reload()},2e3)}catch(a){console.log("Error importing models:",a),an(b=>({...b,phase:"error",status:aa("importFailed"),error:a instanceof Error?a.message:aa("unexpectedErrorOccurred")}))}},aW=g.some(a=>!1!==a.isActive),aX=a=>{let b=ao.customModels.find(b=>b.id===a);if(b)return!!b.normalizeToolCallId;let c=ao.modelCompatOverrides.find(b=>b.id===a);return!!c?.normalizeToolCallId},aY=a=>{let b=ao.customModels.find(b=>b.id===a);if(b&&Object.prototype.hasOwnProperty.call(b,"preserveOpenAIDeveloperRole"))return!!b.preserveOpenAIDeveloperRole;let c=ao.modelCompatOverrides.find(b=>b.id===a);return!(c&&Object.prototype.hasOwnProperty.call(c,"preserveOpenAIDeveloperRole"))||!!c.preserveOpenAIDeveloperRole},aZ=async(a,b)=>{ar(a);try{let d,e=ao.customModels.find(b=>b.id===a);d=e?{provider:c,modelId:a,modelName:e.name||a,source:e.source||"manual",apiFormat:e.apiFormat||"chat-completions",supportedEndpoints:Array.isArray(e.supportedEndpoints)&&e.supportedEndpoints.length?e.supportedEndpoints:["chat"],normalizeToolCallId:void 0!==b.normalizeToolCallId?b.normalizeToolCallId:!!e.normalizeToolCallId,preserveOpenAIDeveloperRole:void 0!==b.preserveOpenAIDeveloperRole?b.preserveOpenAIDeveloperRole:!Object.prototype.hasOwnProperty.call(e,"preserveOpenAIDeveloperRole")||!!e.preserveOpenAIDeveloperRole}:{provider:c,modelId:a,...b},(await fetch("/api/provider-models",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(d)})).ok?await aD():ab.error(aa("failedSaveCustomModel"))}catch{ab.error(aa("failedSaveCustomModel"))}finally{ar(null)}};return o?(0,d.jsxs)("div",{className:"flex flex-col gap-8",children:[(0,d.jsx)(r.CardSkeleton,{}),(0,d.jsx)(r.CardSkeleton,{})]}):as?(0,d.jsxs)("div",{className:"flex flex-col gap-8",children:[(0,d.jsxs)("div",{children:[(0,d.jsxs)(i.default,{href:"/dashboard/providers",className:"inline-flex items-center gap-1 text-sm text-text-muted hover:text-primary transition-colors mb-4",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-lg",children:"arrow_back"}),aa("backToProviders")]}),(0,d.jsxs)("div",{className:"flex items-center gap-4",children:[(0,d.jsx)("div",{className:"rounded-lg flex items-center justify-center",style:{backgroundColor:`${as.color}15`},children:Y?(0,d.jsx)("span",{className:"text-sm font-bold",style:{color:as.color},children:as.textIcon||as.id.slice(0,2).toUpperCase()}):(0,d.jsx)(j.default,{src:aw&&as.apiType?"responses"===as.apiType?"/providers/oai-r.png":"/providers/oai-cc.png":ax?"/providers/anthropic-m.png":`/providers/${as.id}.png`,alt:as.name,width:48,height:48,className:"object-contain rounded-lg max-w-[48px] max-h-[48px]",sizes:"48px",onError:()=>Z(!0)})}),(0,d.jsxs)("div",{children:[as.website?(0,d.jsxs)("a",{href:as.website,target:"_blank",rel:"noopener noreferrer",className:"text-3xl font-semibold tracking-tight hover:underline inline-flex items-center gap-2",style:{color:as.color},children:[as.name,(0,d.jsx)("span",{className:"material-symbols-outlined text-lg opacity-60",children:"open_in_new"})]}):(0,d.jsx)("h1",{className:"text-3xl font-semibold tracking-tight",children:as.name}),(0,d.jsx)("p",{className:"text-text-muted",children:aa("connectionCountLabel",{count:g.length})})]})]})]}),ay&&v&&(0,d.jsxs)(m.Card,{children:[(0,d.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,d.jsxs)("div",{children:[(0,d.jsx)("h2",{className:"text-lg font-semibold",children:ax?aa("anthropicCompatibleDetails"):aa("openaiCompatibleDetails")}),(0,d.jsxs)("p",{className:"text-sm text-text-muted",children:[ax?aa("messagesApi"):"responses"===v.apiType?aa("responsesApi"):aa("chatCompletions")," ","· ",(v.baseUrl||"").replace(/\/$/,""),"/",ax?aa("messagesPath"):"responses"===v.apiType?aa("responsesPath"):aa("chatCompletionsPath")]})]}),(0,d.jsxs)("div",{className:"flex items-center gap-2",children:[(0,d.jsx)(n.Button,{size:"sm",icon:"add",onClick:()=>F(!0),disabled:g.length>0,children:aa("add")}),(0,d.jsx)(n.Button,{size:"sm",variant:"secondary",icon:"edit",onClick:()=>R(!0),children:aa("edit")}),(0,d.jsx)(n.Button,{size:"sm",variant:"secondary",icon:"delete",onClick:async()=>{if(confirm(aa("deleteCompatibleNodeConfirm",{type:ax?aa("anthropic"):aa("openai")})))try{(await fetch(`/api/provider-nodes/${c}`,{method:"DELETE"})).ok&&b.push("/dashboard/providers")}catch(a){console.log("Error deleting provider node:",a)}},children:aa("delete")})]})]}),g.length>0&&(0,d.jsx)("p",{className:"text-sm text-text-muted",children:aa("singleConnectionPerCompatible")})]}),(0,d.jsxs)(m.Card,{children:[(0,d.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,d.jsxs)("div",{className:"flex items-center gap-3",children:[(0,d.jsx)("h2",{className:"text-lg font-semibold",children:aa("connections")}),(0,d.jsxs)("button",{onClick:()=>af({level:"provider",id:c,label:as?.name||c}),className:`inline-flex items-center gap-1 px-2 py-1 rounded text-xs font-medium transition-all ${ag?.providers?.[c]?"bg-amber-500/15 text-amber-500 hover:bg-amber-500/25":"bg-black/[0.03] dark:bg-white/[0.03] text-text-muted/50 hover:text-text-muted hover:bg-black/[0.06] dark:hover:bg-white/[0.06]"}`,title:ag?.providers?.[c]?aa("providerProxyTitleConfigured",{host:ag.providers[c].host||aa("configured")}):aa("providerProxyConfigureHint"),children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"vpn_lock"}),ag?.providers?.[c]&&ag.providers[c].host||aa("providerProxy")]})]}),ay?0===g.length&&(0,d.jsx)(n.Button,{size:"sm",icon:"add",onClick:()=>F(!0),children:aa("add")}):(0,d.jsx)(n.Button,{size:"sm",icon:"add",onClick:()=>at?C(!0):F(!0),children:aa("add")})]}),0===g.length?(0,d.jsxs)("div",{className:"text-center py-12",children:[(0,d.jsx)("div",{className:"inline-flex items-center justify-center w-16 h-16 rounded-full bg-primary/10 text-primary mb-4",children:(0,d.jsx)("span",{className:"material-symbols-outlined text-[32px]",children:at?"lock":"key"})}),(0,d.jsx)("p",{className:"text-text-main font-medium mb-1",children:aa("noConnectionsYet")}),(0,d.jsx)("p",{className:"text-sm text-text-muted mb-4",children:aa("addFirstConnectionHint")}),!ay&&(0,d.jsx)(n.Button,{icon:"add",onClick:()=>at?C(!0):F(!0),children:aa("addConnection")})]}):(0,d.jsx)("div",{className:"flex flex-col divide-y divide-black/[0.03] dark:divide-white/[0.03]",children:g.sort((a,b)=>(a.priority||0)-(b.priority||0)).map((a,b)=>(0,d.jsx)(M,{connection:a,isOAuth:at,isFirst:0===b,isLast:b===g.length-1,onMoveUp:()=>aT(a,g[b-1]),onMoveDown:()=>aT(a,g[b+1]),onToggleActive:b=>aM(a.id,b),onToggleRateLimit:b=>aN(a.id,b),isCodex:"codex"===c,onToggleCodex5h:b=>aO(a.id,"use5h",b),onToggleCodexWeekly:b=>aO(a.id,"useWeekly",b),onRetest:()=>aP(a.id),isRetesting:U===a.id,onEdit:()=>{T(a),L(!0)},onDelete:()=>aI(a.id),onReauth:at?()=>C(!0):void 0,onRefreshToken:at?()=>aS(a.id):void 0,isRefreshing:aQ===a.id,onProxy:()=>af({level:"key",id:a.id,label:a.name||a.email||a.id}),hasProxy:!!(ag?.keys?.[a.id]||ag?.providers?.[c]||ag?.global),proxySource:ag?.keys?.[a.id]?"key":ag?.providers?.[c]?"provider":ag?.global?"global":null,proxyHost:(ag?.keys?.[a.id]||ag?.providers?.[c]||ag?.global)?.host||null},a.id))})]}),!az&&(0,d.jsxs)(m.Card,{children:[(0,d.jsx)("h2",{className:"text-lg font-semibold mb-4",children:aa("availableModels")}),(()=>{if(ay)return(0,d.jsx)(K,{providerStorageAlias:aA,providerDisplayAlias:aB,modelAliases:W,copied:$,onCopy:_,onSetAlias:aG,onDeleteAlias:aH,connections:g,isAnthropic:ax,onImportWithProgress:aV,t:aa,effectiveModelNormalize:aX,effectiveModelPreserveDeveloper:aY,saveModelCompatFlags:aZ,compatSavingModelId:aq,onModelsChanged:aD});if(as.passthroughModels)return(0,d.jsxs)("div",{children:[(0,d.jsxs)("div",{className:"flex items-center gap-2 mb-4",children:[(0,d.jsx)(n.Button,{size:"sm",variant:"secondary",icon:"download",onClick:aU,disabled:!aW||ai,children:ai?aa("importingModels"):aa("importFromModels")}),!aW&&(0,d.jsx)("span",{className:"text-xs text-text-muted",children:aa("addConnectionToImport")})]}),(0,d.jsx)(H,{providerAlias:av,modelAliases:W,copied:$,onCopy:_,onSetAlias:aG,onDeleteAlias:aH,t:aa,effectiveModelNormalize:aX,effectiveModelPreserveDeveloper:aY,saveModelCompatFlags:aZ,compatSavingModelId:aq})]});let a=(0,d.jsxs)("div",{className:"flex items-center gap-2 mb-4",children:[(0,d.jsx)(n.Button,{size:"sm",variant:"secondary",icon:"download",onClick:aU,disabled:!aW||ai,children:ai?aa("importingModels"):aa("importFromModels")}),!aW&&(0,d.jsx)("span",{className:"text-xs text-text-muted",children:aa("addConnectionToImport")})]});return 0===au.length?(0,d.jsxs)("div",{children:[a,(0,d.jsx)("p",{className:"text-sm text-text-muted",children:aa("noModelsConfigured")})]}):(0,d.jsxs)("div",{children:[a,(0,d.jsx)("div",{className:"flex flex-wrap gap-3",children:au.map(a=>{let b=`${aA}/${a.id}`,e=`${c}/${a.id}`,f=Object.entries(W).find(([,a])=>a===b||a===e)?.[0];return(0,d.jsx)(G,{model:a,fullModel:`${aB}/${a.id}`,alias:f,copied:$,onCopy:_,t:aa,showDeveloperToggle:!0,normalizeToolCallId:aX(a.id),preserveDeveloperRole:aY(a.id),onNormalizeChange:b=>aZ(a.id,{normalizeToolCallId:b}),onPreserveChange:b=>aZ(a.id,{preserveOpenAIDeveloperRole:b}),compatDisabled:aq===a.id},a.id)})})]})})(),!ay&&(0,d.jsx)(J,{providerId:c,providerAlias:aB,copied:$,onCopy:_,onModelsChanged:aD})]}),az&&(0,d.jsxs)(m.Card,{children:[(0,d.jsx)("h2",{className:"text-lg font-semibold mb-4",children:aa("searchProvider")||"Search Provider"}),(0,d.jsx)("p",{className:"text-sm text-text-muted",children:aa("searchProviderDesc")||"This provider is used for web search via POST /v1/search. No model configuration needed — search providers are ready to use once an API key is connected."}),"perplexity-search"===c&&(0,d.jsxs)("div",{className:"mt-3 flex items-center gap-2 px-3 py-2 rounded-lg bg-blue-500/10 border border-blue-500/20",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-sm text-blue-400",children:"link"}),(0,d.jsxs)("p",{className:"text-xs text-blue-300",children:["Uses the same API key as ",(0,d.jsx)("strong",{children:"Perplexity"})," (chat provider). If you already have Perplexity configured, no additional setup is needed."]})]})]}),"kiro"===c?(0,d.jsx)(t.KiroOAuthWrapper,{isOpen:z,providerInfo:as,onSuccess:aJ,onClose:()=>{ad.current=!0,C(!1)}}):"cursor"===c?(0,d.jsx)(u.CursorAuthModal,{isOpen:z,onSuccess:aJ,onClose:()=>{ad.current=!0,C(!1)}}):(0,d.jsx)(s.OAuthModal,{isOpen:z,provider:c,providerInfo:as,onSuccess:aJ,onClose:()=>{ad.current=!0,C(!1)}}),(0,d.jsx)(N,{isOpen:E,provider:c,providerName:as.name,isCompatible:ay,isAnthropic:ax,onSave:aK,onClose:()=>F(!1)}),(0,d.jsx)(P,{isOpen:I,connection:S,onSave:aL,onClose:()=>L(!1)}),ay&&(0,d.jsx)(Q,{isOpen:O,node:v,onSave:aF,onClose:()=>R(!1),isAnthropic:ax}),ae&&(0,d.jsx)(x.ProxyConfigModal,{isOpen:!!ae,onClose:()=>af(null),level:ae.level,levelId:ae.id,levelLabel:ae.label}),(0,d.jsx)(q.Modal,{isOpen:ak,onClose:()=>{("done"===am.phase||"error"===am.phase)&&al(!1)},title:aa("importingModelsTitle"),size:"md",closeOnOverlay:!1,showCloseButton:"done"===am.phase||"error"===am.phase,children:(0,d.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,d.jsxs)("div",{className:"flex items-center gap-3",children:["fetching"===am.phase&&(0,d.jsx)("span",{className:"material-symbols-outlined text-primary animate-spin",children:"progress_activity"}),"importing"===am.phase&&(0,d.jsx)("span",{className:"material-symbols-outlined text-primary animate-spin",children:"progress_activity"}),"done"===am.phase&&(0,d.jsx)("span",{className:"material-symbols-outlined text-green-500",children:"check_circle"}),"error"===am.phase&&(0,d.jsx)("span",{className:"material-symbols-outlined text-red-500",children:"error"}),(0,d.jsx)("span",{className:"text-sm font-medium text-text-main",children:am.status})]}),("importing"===am.phase||"done"===am.phase)&&am.total>0&&(0,d.jsxs)("div",{className:"w-full",children:[(0,d.jsxs)("div",{className:"flex items-center justify-between mb-1",children:[(0,d.jsxs)("span",{className:"text-xs text-text-muted",children:[am.current," / ",am.total]}),(0,d.jsxs)("span",{className:"text-xs text-text-muted",children:[Math.round(am.current/am.total*100),"%"]})]}),(0,d.jsx)("div",{className:"w-full h-2.5 bg-black/10 dark:bg-white/10 rounded-full overflow-hidden",children:(0,d.jsx)("div",{className:"h-full rounded-full transition-all duration-300 ease-out",style:{width:`${am.current/am.total*100}%`,background:"done"===am.phase?"linear-gradient(90deg, #22c55e, #16a34a)":"linear-gradient(90deg, var(--color-primary), var(--color-primary-hover, var(--color-primary)))"}})})]}),"fetching"===am.phase&&(0,d.jsx)("div",{className:"w-full h-2.5 bg-black/10 dark:bg-white/10 rounded-full overflow-hidden",children:(0,d.jsx)("div",{className:"h-full rounded-full animate-pulse",style:{width:"60%",background:"linear-gradient(90deg, var(--color-primary), var(--color-primary-hover, var(--color-primary)))"}})}),"error"===am.phase&&am.error&&(0,d.jsx)("div",{className:"p-3 rounded-lg bg-red-500/10 border border-red-500/20",children:(0,d.jsx)("p",{className:"text-sm text-red-400",children:am.error})}),am.logs.length>0&&(0,d.jsx)("div",{className:"max-h-48 overflow-y-auto rounded-lg bg-black/5 dark:bg-white/5 p-3 border border-black/5 dark:border-white/5",children:(0,d.jsx)("div",{className:"flex flex-col gap-1",children:am.logs.map((a,b)=>(0,d.jsx)("p",{className:`text-xs font-mono ${a.startsWith("✓")?"text-green-500 font-semibold":"text-text-muted"}`,children:a},b))})}),"done"===am.phase&&am.importedCount>0&&(0,d.jsx)("p",{className:"text-xs text-text-muted text-center animate-pulse",children:aa("pageAutoRefresh")})]})})]}):(0,d.jsxs)("div",{className:"text-center py-20",children:[(0,d.jsx)("p",{className:"text-text-muted",children:aa("providerNotFound")}),(0,d.jsx)(i.default,{href:"/dashboard/providers",className:"text-primary mt-4 inline-block",children:aa("backToProviders")})]})}function G({model:a,fullModel:b,alias:c,copied:e,onCopy:f,t:g,showDeveloperToggle:h=!0,normalizeToolCallId:i,preserveDeveloperRole:j,onNormalizeChange:k,onPreserveChange:l,compatDisabled:m}){return(0,d.jsxs)("div",{className:"flex flex-col px-3 py-2 rounded-lg border border-border hover:bg-sidebar/50 min-w-[220px] max-w-md",children:[(0,d.jsxs)("div",{className:"flex items-center gap-2 flex-wrap",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-base text-text-muted shrink-0",children:"smart_toy"}),(0,d.jsx)("code",{className:"text-xs text-text-muted font-mono bg-sidebar px-1.5 py-0.5 rounded",children:b}),(0,d.jsx)("button",{onClick:()=>f(b,`model-${a.id}`),className:"p-0.5 hover:bg-sidebar rounded text-text-muted hover:text-primary",title:g("copyModel"),children:(0,d.jsx)("span",{className:"material-symbols-outlined text-sm",children:e===`model-${a.id}`?"check":"content_copy"})})]}),(0,d.jsx)(E,{t:g,normalizeToolCallId:!!i,preserveDeveloperRole:j,showDeveloperToggle:h,onNormalizeChange:k,onPreserveChange:l,disabled:m})]})}function H({providerAlias:a,modelAliases:b,copied:c,onCopy:f,onSetAlias:g,onDeleteAlias:h,t:i,effectiveModelNormalize:j,effectiveModelPreserveDeveloper:k,saveModelCompatFlags:l,compatSavingModelId:m}){let[o,p]=(0,e.useState)(""),[q,r]=(0,e.useState)(!1),s=Object.entries(b).filter(([,b])=>b.startsWith(`${a}/`)).map(([b,c])=>({modelId:c.replace(`${a}/`,""),fullModel:c,alias:b})),t=async()=>{let a;if(!o.trim()||q)return;let c=o.trim(),d=(a=c.split("/"))[a.length-1];if(b[d])return void alert(i("aliasExistsAlert",{alias:d}));r(!0);try{await g(c,d),p("")}catch(a){console.log("Error adding model:",a)}finally{r(!1)}};return(0,d.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,d.jsx)("p",{className:"text-sm text-text-muted",children:i("openRouterAnyModelHint")}),(0,d.jsxs)("div",{className:"flex items-end gap-2",children:[(0,d.jsxs)("div",{className:"flex-1",children:[(0,d.jsx)("label",{htmlFor:"new-model-input",className:"text-xs text-text-muted mb-1 block",children:i("modelIdFromOpenRouter")}),(0,d.jsx)("input",{id:"new-model-input",type:"text",value:o,onChange:a=>p(a.target.value),onKeyDown:a=>"Enter"===a.key&&t(),placeholder:i("openRouterModelPlaceholder"),className:"w-full px-3 py-2 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary"})]}),(0,d.jsx)(n.Button,{size:"sm",icon:"add",onClick:t,disabled:!o.trim()||q,children:q?i("adding"):i("add")})]}),s.length>0&&(0,d.jsx)("div",{className:"flex flex-col gap-3",children:s.map(({modelId:a,fullModel:b,alias:e})=>(0,d.jsx)(I,{modelId:a,fullModel:b,copied:c,onCopy:f,onDeleteAlias:()=>h(e),t:i,showDeveloperToggle:!0,normalizeToolCallId:j(a),preserveDeveloperRole:k(a),onNormalizeChange:b=>l(a,{normalizeToolCallId:b}),onPreserveChange:b=>l(a,{preserveOpenAIDeveloperRole:b}),compatDisabled:m===a},b))})]})}function I({modelId:a,fullModel:b,copied:c,onCopy:e,onDeleteAlias:f,t:g,showDeveloperToggle:h=!0,normalizeToolCallId:i,preserveDeveloperRole:j,onNormalizeChange:k,onPreserveChange:l,compatDisabled:m}){return(0,d.jsxs)("div",{className:"flex flex-col gap-0 p-3 rounded-lg border border-border hover:bg-sidebar/50",children:[(0,d.jsxs)("div",{className:"flex items-start gap-3",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-base text-text-muted shrink-0",children:"smart_toy"}),(0,d.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,d.jsx)("p",{className:"text-sm font-medium truncate",children:a}),(0,d.jsxs)("div",{className:"flex items-center gap-1 mt-1 flex-wrap",children:[(0,d.jsx)("code",{className:"text-xs text-text-muted font-mono bg-sidebar px-1.5 py-0.5 rounded",children:b}),(0,d.jsx)("button",{onClick:()=>e(b,`model-${a}`),className:"p-0.5 hover:bg-sidebar rounded text-text-muted hover:text-primary",title:g("copyModel"),children:(0,d.jsx)("span",{className:"material-symbols-outlined text-sm",children:c===`model-${a}`?"check":"content_copy"})})]})]}),(0,d.jsx)("button",{onClick:f,className:"p-1 hover:bg-red-50 rounded text-red-500 shrink-0",title:g("removeModel"),children:(0,d.jsx)("span",{className:"material-symbols-outlined text-sm",children:"delete"})})]}),(0,d.jsx)("div",{className:"pl-9",children:(0,d.jsx)(E,{t:g,normalizeToolCallId:!!i,preserveDeveloperRole:j,showDeveloperToggle:h,onNormalizeChange:k,onPreserveChange:l,disabled:m})})]})}function J({providerId:a,providerAlias:b,copied:c,onCopy:g,onModelsChanged:h}){let i=(0,k.useTranslations)("providers"),j=(0,f.useNotificationStore)(),[l,m]=(0,e.useState)([]),[o,p]=(0,e.useState)(""),[q,r]=(0,e.useState)(""),[s,t]=(0,e.useState)("chat-completions"),[u,v]=(0,e.useState)(["chat"]),[w,x]=(0,e.useState)(!1),[y,z]=(0,e.useState)(!0),[A,B]=(0,e.useState)(null),[C,D]=(0,e.useState)("chat-completions"),[F,G]=(0,e.useState)(["chat"]),[H,I]=(0,e.useState)(!1),[J,K]=(0,e.useState)(!1),[L,M]=(0,e.useState)(null),N=(0,e.useCallback)(async()=>{try{let b=await fetch(`/api/provider-models?provider=${encodeURIComponent(a)}`);if(b.ok){let a=await b.json();m(a.models||[])}}catch(a){console.error("Failed to fetch custom models:",a)}finally{z(!1)}},[a]);(0,e.useEffect)(()=>{N()},[N]);let O=async()=>{if(o.trim()&&!w){x(!0);try{(await fetch("/api/provider-models",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:a,modelId:o.trim(),modelName:q.trim()||void 0,apiFormat:s,supportedEndpoints:u})})).ok&&(p(""),r(""),t("chat-completions"),v(["chat"]),await N(),h?.())}catch(a){console.error("Failed to add custom model:",a)}finally{x(!1)}}},P=async b=>{try{await fetch(`/api/provider-models?provider=${encodeURIComponent(a)}&model=${encodeURIComponent(b)}`,{method:"DELETE"}),await N(),h?.()}catch(a){console.error("Failed to remove custom model:",a)}},Q=()=>{B(null),D("chat-completions"),G(["chat"]),I(!1),K(!0),M(null)},R=async b=>{if(A&&A===b){if(!F.length)return void j.error("Select at least one supported endpoint");M(b);try{let c=l.find(a=>a.id===b);if(!(await fetch("/api/provider-models",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:a,modelId:b,modelName:c?.name||b,source:c?.source||"manual",apiFormat:C,supportedEndpoints:F,normalizeToolCallId:H,preserveOpenAIDeveloperRole:J})})).ok)throw Error("Failed to save model endpoint settings");await N(),h?.(),j.success("Saved model endpoint settings"),Q()}catch(a){console.error("Failed to save custom model:",a),j.error("Failed to save model endpoint settings")}finally{M(null)}}};return(0,d.jsxs)("div",{className:"mt-6 pt-6 border-t border-border",children:[(0,d.jsxs)("h3",{className:"text-sm font-semibold mb-3 flex items-center gap-2",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-base text-primary",children:"tune"}),i("customModels")]}),(0,d.jsx)("p",{className:"text-xs text-text-muted mb-3",children:i("customModelsHint")}),(0,d.jsxs)("div",{className:"flex flex-col gap-3 mb-3",children:[(0,d.jsxs)("div",{className:"flex items-end gap-2",children:[(0,d.jsxs)("div",{className:"flex-1",children:[(0,d.jsx)("label",{htmlFor:"custom-model-id",className:"text-xs text-text-muted mb-1 block",children:i("modelId")}),(0,d.jsx)("input",{id:"custom-model-id",type:"text",value:o,onChange:a=>p(a.target.value),onKeyDown:a=>"Enter"===a.key&&O(),placeholder:i("customModelPlaceholder"),className:"w-full px-3 py-2 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary"})]}),(0,d.jsxs)("div",{className:"w-40",children:[(0,d.jsx)("label",{htmlFor:"custom-model-name",className:"text-xs text-text-muted mb-1 block",children:i("displayName")}),(0,d.jsx)("input",{id:"custom-model-name",type:"text",value:q,onChange:a=>r(a.target.value),onKeyDown:a=>"Enter"===a.key&&O(),placeholder:i("optional"),className:"w-full px-3 py-2 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary"})]}),(0,d.jsx)(n.Button,{size:"sm",icon:"add",onClick:O,disabled:!o.trim()||w,children:w?i("adding"):i("add")})]}),(0,d.jsxs)("div",{className:"flex items-end gap-4 flex-wrap",children:[(0,d.jsxs)("div",{className:"w-48",children:[(0,d.jsx)("label",{htmlFor:"custom-api-format",className:"text-xs text-text-muted mb-1 block",children:"API Format"}),(0,d.jsxs)("select",{id:"custom-api-format",value:s,onChange:a=>t(a.target.value),className:"w-full px-3 py-2 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary",children:[(0,d.jsx)("option",{value:"chat-completions",children:"Chat Completions"}),(0,d.jsx)("option",{value:"responses",children:"Responses API"})]})]}),(0,d.jsxs)("div",{className:"flex-1",children:[(0,d.jsx)("span",{className:"text-xs text-text-muted mb-1 block",children:"Supported Endpoints"}),(0,d.jsx)("div",{className:"flex items-center gap-3",children:["chat","embeddings","images","audio"].map(a=>(0,d.jsxs)("label",{className:"flex items-center gap-1.5 text-xs text-text-main cursor-pointer",children:[(0,d.jsx)("input",{type:"checkbox",checked:u.includes(a),onChange:b=>{b.target.checked?v(b=>[...b,a]):v(b=>b.filter(b=>b!==a))},className:"rounded border-border"}),"chat"===a?"💬 Chat":"embeddings"===a?"📐 Embeddings":"images"===a?"🖼️ Images":"🔊 Audio"]},a))})]})]})]}),y?(0,d.jsx)("p",{className:"text-xs text-text-muted",children:i("loading")}):l.length>0?(0,d.jsx)("div",{className:"flex flex-col gap-2",children:l.map(a=>{let e=`${b}/${a.id}`,f=`custom-${a.id}`;return(0,d.jsxs)("div",{className:"flex items-center gap-3 p-3 rounded-lg border border-border hover:bg-sidebar/50",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-base text-primary",children:"tune"}),(0,d.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,d.jsx)("p",{className:"text-sm font-medium truncate",children:a.name||a.id}),(0,d.jsxs)("div",{className:"flex items-center gap-1 mt-1 flex-wrap",children:[(0,d.jsx)("code",{className:"text-xs text-text-muted font-mono bg-sidebar px-1.5 py-0.5 rounded",children:e}),(0,d.jsx)("button",{onClick:()=>g(e,f),className:"p-0.5 hover:bg-sidebar rounded text-text-muted hover:text-primary",title:i("copyModel"),children:(0,d.jsx)("span",{className:"material-symbols-outlined text-sm",children:c===f?"check":"content_copy"})}),"responses"===a.apiFormat&&(0,d.jsx)("span",{className:"text-[10px] px-1.5 py-0.5 rounded-full bg-blue-500/15 text-blue-400 font-medium",children:"Responses"}),a.supportedEndpoints?.includes("embeddings")&&(0,d.jsx)("span",{className:"text-[10px] px-1.5 py-0.5 rounded-full bg-purple-500/15 text-purple-400 font-medium",children:"📐 Embed"}),a.supportedEndpoints?.includes("images")&&(0,d.jsx)("span",{className:"text-[10px] px-1.5 py-0.5 rounded-full bg-amber-500/15 text-amber-400 font-medium",children:"🖼️ Images"}),a.supportedEndpoints?.includes("audio")&&(0,d.jsx)("span",{className:"text-[10px] px-1.5 py-0.5 rounded-full bg-green-500/15 text-green-400 font-medium",children:"🔊 Audio"}),a.normalizeToolCallId&&(0,d.jsx)("span",{className:"text-[10px] px-1.5 py-0.5 rounded-full bg-slate-500/15 text-slate-400 font-medium",title:i("normalizeToolCallIdLabel"),children:"ID×9"}),!1===a.preserveOpenAIDeveloperRole&&(0,d.jsx)("span",{className:"text-[10px] px-1.5 py-0.5 rounded-full bg-cyan-500/15 text-cyan-400 font-medium",title:i("compatDoNotPreserveDeveloper"),children:i("compatBadgeNoPreserve")})]}),A===a.id&&(0,d.jsxs)("div",{className:"mt-3 p-3 rounded-lg border border-border bg-sidebar/40",children:[(0,d.jsxs)("div",{className:"flex items-end gap-3 flex-wrap",children:[(0,d.jsxs)("div",{className:"w-44",children:[(0,d.jsx)("label",{className:"text-xs text-text-muted mb-1 block",children:"API Format"}),(0,d.jsxs)("select",{value:C,onChange:a=>D(a.target.value),className:"w-full px-2.5 py-2 text-xs border border-border rounded-lg bg-background focus:outline-none focus:border-primary",children:[(0,d.jsx)("option",{value:"chat-completions",children:"Chat Completions"}),(0,d.jsx)("option",{value:"responses",children:"Responses API"})]})]}),(0,d.jsxs)("div",{className:"flex-1 min-w-[240px]",children:[(0,d.jsx)("span",{className:"text-xs text-text-muted mb-1 block",children:"Supported Endpoints"}),(0,d.jsx)("div",{className:"flex items-center gap-3 flex-wrap",children:["chat","embeddings","images","audio"].map(a=>(0,d.jsxs)("label",{className:"flex items-center gap-1.5 text-xs text-text-main cursor-pointer",children:[(0,d.jsx)("input",{type:"checkbox",checked:F.includes(a),onChange:b=>{b.target.checked?G(b=>b.includes(a)?b:[...b,a]):G(b=>b.filter(b=>b!==a))},className:"rounded border-border"}),"chat"===a?"💬 Chat":"embeddings"===a?"📐 Embeddings":"images"===a?"🖼️ Images":"🔊 Audio"]},a))})]})]}),(0,d.jsx)("div",{className:"mt-3 pt-3 border-t border-border/80 w-full",children:(0,d.jsx)(E,{t:i,normalizeToolCallId:H,preserveDeveloperRole:J,showDeveloperToggle:!0,onNormalizeChange:I,onPreserveChange:K,disabled:L===a.id})}),(0,d.jsxs)("div",{className:"mt-3 flex items-center gap-2",children:[(0,d.jsx)(n.Button,{size:"sm",onClick:()=>R(a.id),disabled:L===a.id,children:L===a.id?i("saving"):i("save")}),(0,d.jsx)(n.Button,{size:"sm",variant:"ghost",onClick:Q,children:i("cancel")})]})]})]}),(0,d.jsxs)("div",{className:"flex items-center gap-1",children:[(0,d.jsx)("button",{onClick:()=>{B(a.id),D(a.apiFormat||"chat-completions"),G(Array.isArray(a.supportedEndpoints)&&a.supportedEndpoints.length?a.supportedEndpoints:["chat"]),I(!!a.normalizeToolCallId),K(!Object.prototype.hasOwnProperty.call(a,"preserveOpenAIDeveloperRole")||!!a.preserveOpenAIDeveloperRole)},className:"p-1 hover:bg-sidebar rounded text-text-muted hover:text-primary",title:i("edit"),children:(0,d.jsx)("span",{className:"material-symbols-outlined text-sm",children:"edit"})}),(0,d.jsx)("button",{onClick:()=>P(a.id),className:"p-1 hover:bg-red-50 rounded text-red-500",title:i("removeCustomModel"),children:(0,d.jsx)("span",{className:"material-symbols-outlined text-sm",children:"delete"})})]})]},a.id)})}):(0,d.jsx)("p",{className:"text-xs text-text-muted",children:i("noCustomModels")})]})}function K({providerStorageAlias:a,providerDisplayAlias:b,modelAliases:c,copied:g,onCopy:h,onSetAlias:i,onDeleteAlias:j,connections:k,isAnthropic:l,onImportWithProgress:m,t:o,effectiveModelNormalize:p,effectiveModelPreserveDeveloper:q,saveModelCompatFlags:r,compatSavingModelId:s,onModelsChanged:t}){let[u,v]=(0,e.useState)(""),[w,x]=(0,e.useState)(!1),[y,z]=(0,e.useState)(!1),A=(0,f.useNotificationStore)(),B=Object.entries(c).filter(([,b])=>b.startsWith(`${a}/`)).map(([b,c])=>({modelId:c.replace(`${a}/`,""),fullModel:c,alias:b})),C=a=>{let d,e=(d=a.split("/"))[d.length-1];if(!c[e])return e;let f=`${b}-${e}`;return c[f]?null:f},D=async()=>{if(!u.trim()||w)return;let b=u.trim(),c=C(b);if(!c)return void A.error(o("allSuggestedAliasesExist"));x(!0);try{let d=await fetch("/api/provider-models",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:a,modelId:b,modelName:b,source:"manual"})});if(!d.ok){let a={};try{a=await d.json()}catch(a){console.error("Failed to parse error response from custom model API:",a)}throw Error(a.error?.message||o("failedSaveCustomModel"))}await i(b,c,a),v(""),A.success(o("modelAddedSuccess",{modelId:b})),t?.()}catch(a){console.error("Error adding model:",a),A.error(a instanceof Error?a.message:o("failedAddModelTryAgain"))}finally{x(!1)}},E=async()=>{if(y)return;let b=k.find(a=>!1!==a.isActive);if(b){z(!0);try{await m(async()=>{let a=await fetch(`/api/providers/${b.id}/models`),c=await a.json();if(!a.ok)throw Error(c.error||o("failedImportModels"));return c},async b=>{let c=b.id||b.name||b.model;if(!c)return!1;let d=C(c);return!!d&&((await fetch("/api/provider-models",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:a,modelId:c,modelName:b.name||c,source:"imported"})})).ok?(await i(c,d,a),!0):(A.error(o("failedSaveImportedModel")),!1))})}catch(a){console.error("Error importing models:",a),A.error(o("failedImportModelsTryAgain"))}finally{z(!1)}}},F=k.some(a=>!1!==a.isActive),G=async(b,c)=>{try{if(!(await fetch(`/api/provider-models?provider=${encodeURIComponent(a)}&model=${encodeURIComponent(b)}`,{method:"DELETE"})).ok)throw Error(o("failedRemoveModelFromDatabase"));await j(c),A.success(o("modelRemovedSuccess")),t?.()}catch(a){console.error("Error deleting model:",a),A.error(a instanceof Error?a.message:o("failedDeleteModelTryAgain"))}};return(0,d.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,d.jsx)("p",{className:"text-sm text-text-muted",children:o("compatibleModelsDescription",{type:l?o("anthropic"):o("openai")})}),(0,d.jsxs)("div",{className:"flex items-end gap-2 flex-wrap",children:[(0,d.jsxs)("div",{className:"flex-1 min-w-[240px]",children:[(0,d.jsx)("label",{htmlFor:"new-compatible-model-input",className:"text-xs text-text-muted mb-1 block",children:o("modelId")}),(0,d.jsx)("input",{id:"new-compatible-model-input",type:"text",value:u,onChange:a=>v(a.target.value),onKeyDown:a=>"Enter"===a.key&&D(),placeholder:l?o("anthropicCompatibleModelPlaceholder"):o("openaiCompatibleModelPlaceholder"),className:"w-full px-3 py-2 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary"})]}),(0,d.jsx)(n.Button,{size:"sm",icon:"add",onClick:D,disabled:!u.trim()||w,children:w?o("adding"):o("add")}),(0,d.jsx)(n.Button,{size:"sm",variant:"secondary",icon:"download",onClick:E,disabled:!F||y,children:y?o("importingModels"):o("importFromModels")})]}),!F&&(0,d.jsx)("p",{className:"text-xs text-text-muted",children:o("addConnectionToImport")}),B.length>0&&(0,d.jsx)("div",{className:"flex flex-col gap-3",children:B.map(({modelId:a,fullModel:c,alias:e})=>(0,d.jsx)(I,{modelId:a,fullModel:`${b}/${a}`,copied:g,onCopy:h,onDeleteAlias:()=>G(a,e),t:o,showDeveloperToggle:!l,normalizeToolCallId:p(a),preserveDeveloperRole:q(a),onNormalizeChange:b=>r(a,{normalizeToolCallId:b}),onPreserveChange:b=>r(a,{preserveOpenAIDeveloperRole:b}),compatDisabled:s===a},c))})]})}function L({until:a}){let[b,c]=(0,e.useState)("");return((0,e.useEffect)(()=>{let b=()=>{let b=new Date(a).getTime()-Date.now();if(b<=0)return void c("");let d=Math.floor(b/1e3);if(d<60)c(`${d}s`);else if(d<3600)c(`${Math.floor(d/60)}m ${d%60}s`);else{let a=Math.floor(d/3600),b=Math.floor(d%3600/60);c(`${a}h ${b}m`)}};b();let d=setInterval(b,1e3);return()=>clearInterval(d)},[a]),b)?(0,d.jsxs)("span",{className:"text-xs text-orange-500 font-mono",children:["⏱ ",b]}):null}[l,y,z]=C.then?(await C)():C,G.propTypes={model:g.default.shape({id:g.default.string.isRequired}).isRequired,fullModel:g.default.string.isRequired,alias:g.default.string,copied:g.default.string,onCopy:g.default.func.isRequired,t:g.default.func,showDeveloperToggle:g.default.bool,normalizeToolCallId:g.default.bool,preserveDeveloperRole:g.default.bool,onNormalizeChange:g.default.func,onPreserveChange:g.default.func,compatDisabled:g.default.bool},H.propTypes={providerAlias:g.default.string.isRequired,modelAliases:g.default.object.isRequired,copied:g.default.string,onCopy:g.default.func.isRequired,onSetAlias:g.default.func.isRequired,onDeleteAlias:g.default.func.isRequired,t:g.default.func.isRequired,effectiveModelNormalize:g.default.func.isRequired,effectiveModelPreserveDeveloper:g.default.func.isRequired,saveModelCompatFlags:g.default.func.isRequired,compatSavingModelId:g.default.string},I.propTypes={modelId:g.default.string.isRequired,fullModel:g.default.string.isRequired,copied:g.default.string,onCopy:g.default.func.isRequired,onDeleteAlias:g.default.func.isRequired,t:g.default.func,showDeveloperToggle:g.default.bool,normalizeToolCallId:g.default.bool,preserveDeveloperRole:g.default.bool,onNormalizeChange:g.default.func,onPreserveChange:g.default.func,compatDisabled:g.default.bool},J.propTypes={providerId:g.default.string.isRequired,providerAlias:g.default.string.isRequired,copied:g.default.string,onCopy:g.default.func.isRequired,onModelsChanged:g.default.func},K.propTypes={providerStorageAlias:g.default.string.isRequired,providerDisplayAlias:g.default.string.isRequired,modelAliases:g.default.object.isRequired,copied:g.default.string,onCopy:g.default.func.isRequired,onSetAlias:g.default.func.isRequired,onDeleteAlias:g.default.func.isRequired,connections:g.default.arrayOf(g.default.shape({id:g.default.string,isActive:g.default.bool})).isRequired,isAnthropic:g.default.bool,onImportWithProgress:g.default.func.isRequired,t:g.default.func.isRequired,effectiveModelNormalize:g.default.func.isRequired,effectiveModelPreserveDeveloper:g.default.func.isRequired,saveModelCompatFlags:g.default.func.isRequired,compatSavingModelId:g.default.string,onModelsChanged:g.default.func},L.propTypes={until:g.default.string.isRequired};let R={runtime_error:{labelKey:"errorTypeRuntime",variant:"warning"},upstream_auth_error:{labelKey:"errorTypeUpstreamAuth",variant:"error"},auth_missing:{labelKey:"errorTypeMissingCredential",variant:"warning"},token_refresh_failed:{labelKey:"errorTypeRefreshFailed",variant:"warning"},token_expired:{labelKey:"errorTypeTokenExpired",variant:"warning"},upstream_rate_limited:{labelKey:"errorTypeRateLimited",variant:"warning"},upstream_unavailable:{labelKey:"errorTypeUpstreamUnavailable",variant:"error"},network_error:{labelKey:"errorTypeNetworkError",variant:"warning"},unsupported:{labelKey:"errorTypeTestUnsupported",variant:"default"},upstream_error:{labelKey:"errorTypeUpstreamError",variant:"error"}};function M({connection:a,isOAuth:b,isCodex:c,isFirst:f,isLast:g,onMoveUp:h,onMoveDown:i,onToggleActive:j,onToggleRateLimit:l,onToggleCodex5h:m,onToggleCodexWeekly:p,onRetest:q,isRetesting:r,onEdit:s,onDelete:t,onReauth:u,onProxy:w,hasProxy:x,proxySource:y,proxyHost:z,onRefreshToken:A,isRefreshing:B}){let C,E=(0,k.useTranslations)("providers"),F=b?a.name||a.email||a.displayName||E("oauthAccount"):a.name,[G,H]=(0,e.useState)(!1),[I,J]=(0,e.useState)(()=>{if(!b||!a.expiresAt)return null;let c=new Date(a.expiresAt).getTime();return Math.floor((c-Date.now())/6e4)});(0,e.useEffect)(()=>{if(!b||!a.expiresAt)return;let c=setInterval(()=>{let b=new Date(a.expiresAt).getTime();J(Math.floor((b-Date.now())/6e4))},3e4);return()=>clearInterval(c)},[b,a.expiresAt]),(0,e.useEffect)(()=>{let b=()=>{let b=a.rateLimitedUntil&&new Date(a.rateLimitedUntil).getTime()>Date.now();H(b)};b();let c=a.rateLimitedUntil?setInterval(b,1e3):null;return()=>{c&&clearInterval(c)}},[a.rateLimitedUntil]);let K="unavailable"!==a.testStatus||G?a.testStatus:"active",M=function(a,b,c,d){if(!1===a.isActive)return{statusVariant:"default",statusLabel:d("statusDisabled"),errorType:null,errorBadge:null,errorTextClass:"text-text-muted"};if("active"===b||"success"===b)return{statusVariant:"success",statusLabel:d("statusConnected"),errorType:null,errorBadge:null,errorTextClass:"text-text-muted"};let e=function(a,b){if(b)return"upstream_rate_limited";if(a.lastErrorType)return a.lastErrorType;let c=Number(a.errorCode);if(401===c||403===c)return"upstream_auth_error";if(429===c)return"upstream_rate_limited";if(c>=500)return"upstream_unavailable";let d=(a.lastError||"").toLowerCase();return d?d.includes("runtime")||d.includes("not runnable")||d.includes("not installed")||d.includes("healthcheck")?"runtime_error":d.includes("refresh failed")?"token_refresh_failed":d.includes("token expired")||d.includes("expired")?"token_expired":d.includes("invalid api key")||d.includes("token invalid")||d.includes("revoked")||d.includes("access denied")||d.includes("unauthorized")?"upstream_auth_error":d.includes("rate limit")||d.includes("quota")||d.includes("too many requests")||d.includes("429")?"upstream_rate_limited":d.includes("fetch failed")||d.includes("network")||d.includes("timeout")||d.includes("econn")||d.includes("enotfound")?"network_error":d.includes("not supported")?"unsupported":"upstream_error":null}(a,c),f=e&&R[e]||null;if("runtime_error"===e)return{statusVariant:"warning",statusLabel:d("statusRuntimeIssue"),errorType:e,errorBadge:f,errorTextClass:"text-yellow-600 dark:text-yellow-400"};if("upstream_auth_error"===e||"auth_missing"===e||"token_refresh_failed"===e||"token_expired"===e)return{statusVariant:"error",statusLabel:d("statusAuthFailed"),errorType:e,errorBadge:f,errorTextClass:"text-red-500"};if("upstream_rate_limited"===e)return{statusVariant:"warning",statusLabel:d("statusRateLimited"),errorType:e,errorBadge:f,errorTextClass:"text-yellow-600 dark:text-yellow-400"};if("network_error"===e)return{statusVariant:"warning",statusLabel:d("statusNetworkIssue"),errorType:e,errorBadge:f,errorTextClass:"text-yellow-600 dark:text-yellow-400"};if("unsupported"===e)return{statusVariant:"default",statusLabel:d("statusTestUnsupported"),errorType:e,errorBadge:f,errorTextClass:"text-text-muted"};let g={unavailable:d("statusUnavailable"),failed:d("statusFailed"),error:d("statusError")};return{statusVariant:"error",statusLabel:g[b]||b||d("statusError"),errorType:e,errorBadge:f,errorTextClass:"text-red-500"}}(a,K,G,E),N=!!a.rateLimitProtection,O=a.providerSpecificData&&"object"==typeof a.providerSpecificData&&a.providerSpecificData.codexLimitPolicy&&"object"==typeof a.providerSpecificData.codexLimitPolicy?a.providerSpecificData.codexLimitPolicy:{},P=D(O),Q=P.use5h,S=P.useWeekly;return(0,d.jsxs)("div",{className:`group flex items-center justify-between p-3 rounded-lg hover:bg-black/[0.02] dark:hover:bg-white/[0.02] transition-colors ${!1===a.isActive?"opacity-60":""}`,children:[(0,d.jsxs)("div",{className:"flex items-center gap-3 flex-1 min-w-0",children:[(0,d.jsxs)("div",{className:"flex flex-col",children:[(0,d.jsx)("button",{onClick:h,disabled:f,className:`p-0.5 rounded ${f?"text-text-muted/30 cursor-not-allowed":"hover:bg-sidebar text-text-muted hover:text-primary"}`,children:(0,d.jsx)("span",{className:"material-symbols-outlined text-sm",children:"keyboard_arrow_up"})}),(0,d.jsx)("button",{onClick:i,disabled:g,className:`p-0.5 rounded ${g?"text-text-muted/30 cursor-not-allowed":"hover:bg-sidebar text-text-muted hover:text-primary"}`,children:(0,d.jsx)("span",{className:"material-symbols-outlined text-sm",children:"keyboard_arrow_down"})})]}),(0,d.jsx)("span",{className:"material-symbols-outlined text-base text-text-muted",children:b?"lock":"key"}),(0,d.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,d.jsx)("p",{className:"text-sm font-medium truncate",children:F}),(0,d.jsxs)("div",{className:"flex items-center gap-2 mt-1 flex-wrap",children:[(0,d.jsx)(o.Badge,{variant:M.statusVariant,size:"sm",dot:!0,children:M.statusLabel}),null!==I&&(I<0?(0,d.jsxs)("span",{className:"inline-flex items-center gap-0.5 px-1.5 py-0.5 rounded text-xs font-medium bg-red-500/15 text-red-500",title:`Token expired: ${a.expiresAt}`,children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[11px]",children:"error"}),"expired"]}):I<30?(0,d.jsxs)("span",{className:"inline-flex items-center gap-0.5 px-1.5 py-0.5 rounded text-xs font-medium bg-amber-500/15 text-amber-500",title:`Token expires in ${I}m`,children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[11px]",children:"warning"}),`~${I}m`]}):null),G&&!1!==a.isActive&&(0,d.jsx)(L,{until:a.rateLimitedUntil}),M.errorBadge&&!1!==a.isActive&&(0,d.jsx)(o.Badge,{variant:M.errorBadge.variant,size:"sm",children:E(M.errorBadge.labelKey)}),a.lastError&&!1!==a.isActive&&(0,d.jsx)("span",{className:`text-xs truncate max-w-[300px] ${M.errorTextClass}`,title:a.lastError,children:a.lastError}),(0,d.jsxs)("span",{className:"text-xs text-text-muted",children:["#",a.priority]}),a.globalPriority&&(0,d.jsx)("span",{className:"text-xs text-text-muted",children:E("autoPriority",{priority:a.globalPriority})}),(0,d.jsx)("span",{className:"text-text-muted/30 select-none",children:"|"}),(0,d.jsxs)("button",{onClick:()=>l(!N),className:`inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-xs font-medium transition-all cursor-pointer ${N?"bg-emerald-500/15 text-emerald-500 hover:bg-emerald-500/25":"bg-black/[0.03] dark:bg-white/[0.03] text-text-muted/50 hover:text-text-muted hover:bg-black/[0.06] dark:hover:bg-white/[0.06]"}`,title:E(N?"disableRateLimitProtection":"enableRateLimitProtection"),children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[13px]",children:"shield"}),E(N?"rateLimitProtected":"rateLimitUnprotected")]}),c&&(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)("span",{className:"text-text-muted/30 select-none",children:"|"}),(0,d.jsxs)("button",{onClick:()=>m?.(!Q),className:`inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-xs font-medium transition-all cursor-pointer ${Q?"bg-blue-500/15 text-blue-500 hover:bg-blue-500/25":"bg-black/[0.03] dark:bg-white/[0.03] text-text-muted/50 hover:text-text-muted hover:bg-black/[0.06] dark:hover:bg-white/[0.06]"}`,title:"Toggle Codex 5h limit policy",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[13px]",children:"timer"}),"5h ",Q?"ON":"OFF"]}),(0,d.jsxs)("button",{onClick:()=>p?.(!S),className:`inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-xs font-medium transition-all cursor-pointer ${S?"bg-violet-500/15 text-violet-500 hover:bg-violet-500/25":"bg-black/[0.03] dark:bg-white/[0.03] text-text-muted/50 hover:text-text-muted hover:bg-black/[0.06] dark:hover:bg-white/[0.06]"}`,title:"Toggle Codex weekly limit policy",children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[13px]",children:"date_range"}),"Weekly ",S?"ON":"OFF"]})]}),x&&(C=E("global"===y?"proxySourceGlobal":"provider"===y?"proxySourceProvider":"proxySourceKey"),(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)("span",{className:"text-text-muted/30 select-none",children:"|"}),(0,d.jsxs)("span",{className:`inline-flex items-center gap-0.5 px-1.5 py-0.5 rounded text-xs font-medium ${"global"===y?"bg-emerald-500/15 text-emerald-500":"provider"===y?"bg-amber-500/15 text-amber-500":"bg-blue-500/15 text-blue-500"}`,title:E("proxyConfiguredBySource",{source:C,host:z||E("configured")}),children:[(0,d.jsx)("span",{className:"material-symbols-outlined text-[13px]",children:"vpn_lock"}),z||E("proxy")]})]}))]})]})]}),(0,d.jsxs)("div",{className:"flex items-center gap-2",children:[(0,d.jsx)(n.Button,{size:"sm",variant:"ghost",icon:"refresh",loading:r,disabled:!1===a.isActive,onClick:q,className:"!h-7 !px-2 text-xs",title:E("retestAuthentication"),children:E("retest")}),A&&(0,d.jsx)(n.Button,{size:"sm",variant:"ghost",icon:"token",loading:B,disabled:!1===a.isActive||B,onClick:A,className:"!h-7 !px-2 text-xs text-amber-500 hover:text-amber-400",title:"Refresh OAuth token manually",children:"Token"}),(0,d.jsx)(v.Toggle,{size:"sm",checked:a.isActive??!0,onChange:j,title:E(a.isActive??!0?"disableConnection":"enableConnection")}),(0,d.jsxs)("div",{className:"flex gap-1 ml-1 transition-opacity",children:[u&&(0,d.jsx)("button",{onClick:u,className:"p-2 hover:bg-amber-500/10 rounded text-amber-600 hover:text-amber-500",title:E("reauthenticateConnection"),children:(0,d.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"passkey"})}),(0,d.jsx)("button",{onClick:s,className:"p-2 hover:bg-black/5 dark:hover:bg-white/5 rounded text-text-muted hover:text-primary",title:E("edit"),children:(0,d.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"edit"})}),(0,d.jsx)("button",{onClick:w,className:"p-2 hover:bg-black/5 dark:hover:bg-white/5 rounded text-text-muted hover:text-primary",title:E("proxyConfig"),children:(0,d.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"vpn_lock"})}),(0,d.jsx)("button",{onClick:t,className:"p-2 hover:bg-red-500/10 rounded text-red-500",title:E("delete"),children:(0,d.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"delete"})})]})]})]})}function N({isOpen:a,provider:b,providerName:c,isCompatible:f,isAnthropic:g,onSave:h,onClose:i}){let j=(0,k.useTranslations)("providers"),l="bailian-coding-plan"===b,m="https://coding-intl.dashscope.aliyuncs.com/apps/anthropic/v1",[r,s]=(0,e.useState)({name:"",apiKey:"",priority:1,baseUrl:l?m:""}),[t,u]=(0,e.useState)(!1),[v,w]=(0,e.useState)(null),[x,y]=(0,e.useState)(!1),[z,A]=(0,e.useState)(null),B=async()=>{u(!0),A(null);try{let a=await fetch("/api/providers/validate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:b,apiKey:r.apiKey})}),c=await a.json();w(c.valid?"success":"failed")}catch{w("failed")}finally{u(!1)}},C=async()=>{if(b&&r.apiKey){y(!0),A(null);try{let a=null;if(l){let b=O(r.baseUrl,m);if(b.error)return void A(b.error);a=b.value}let c=!1;try{u(!0),w(null);let a=await fetch("/api/providers/validate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:b,apiKey:r.apiKey})});c=!!(await a.json()).valid,w(c?"success":"failed")}catch{w("failed")}finally{u(!1)}if(!c)return void A(j("apiKeyValidationFailed"));let d={name:r.name,apiKey:r.apiKey,priority:r.priority,testStatus:"active",providerSpecificData:void 0};l&&(d.providerSpecificData={baseUrl:a});let e=await h(d);e&&A("string"==typeof e?e:j("failedSaveConnection"))}finally{y(!1)}}};return b?(0,d.jsx)(q.Modal,{isOpen:a,title:j("addProviderApiKeyTitle",{provider:c||b}),onClose:i,children:(0,d.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,d.jsx)(p.Input,{label:j("nameLabel"),value:r.name,onChange:a=>s({...r,name:a.target.value}),placeholder:j("productionKey")}),(0,d.jsxs)("div",{className:"flex gap-2",children:[(0,d.jsx)(p.Input,{label:j("apiKeyLabel"),type:"password",value:r.apiKey,onChange:a=>s({...r,apiKey:a.target.value}),className:"flex-1"}),(0,d.jsx)("div",{className:"pt-6",children:(0,d.jsx)(n.Button,{onClick:B,disabled:!r.apiKey||t||x,variant:"secondary",children:t?j("checking"):j("check")})})]}),v&&(0,d.jsx)(o.Badge,{variant:"success"===v?"success":"error",children:"success"===v?j("valid"):j("invalid")}),z&&(0,d.jsx)("div",{className:"text-sm text-red-500 bg-red-500/10 border border-red-500/20 rounded-lg px-3 py-2",children:z}),f&&(0,d.jsx)("p",{className:"text-xs text-text-muted",children:g?j("validationChecksAnthropicCompatible",{provider:c||j("anthropicCompatibleName")}):j("validationChecksOpenAiCompatible",{provider:c||j("openaiCompatibleName")})}),(0,d.jsx)(p.Input,{label:j("priorityLabel"),type:"number",value:r.priority,onChange:a=>s({...r,priority:Number.parseInt(a.target.value)||1})}),l&&(0,d.jsx)(p.Input,{label:"Base URL",value:r.baseUrl,onChange:a=>s({...r,baseUrl:a.target.value}),placeholder:m,hint:"Optional: Custom base URL for bailian-coding-plan provider"}),(0,d.jsxs)("div",{className:"flex gap-2",children:[(0,d.jsx)(n.Button,{onClick:C,fullWidth:!0,disabled:!r.name||!r.apiKey||x,children:x?j("saving"):j("save")}),(0,d.jsx)(n.Button,{onClick:i,variant:"ghost",fullWidth:!0,children:j("cancel")})]})]})}):null}function O(a,b){let c=("string"==typeof a?a.trim():"")||b;try{let a=new URL(c);if("http:"!==a.protocol&&"https:"!==a.protocol)return{value:null,error:"Base URL must use http or https"};return{value:c,error:null}}catch{return{value:null,error:"Base URL must be a valid URL"}}}function P({isOpen:a,connection:b,onSave:c,onClose:f}){let g=(0,k.useTranslations)("providers"),[h,i]=(0,e.useState)({name:"",priority:1,apiKey:"",healthCheckInterval:60,baseUrl:""}),[j,l]=(0,e.useState)(!1),[m,r]=(0,e.useState)(null),[s,t]=(0,e.useState)(!1),[u,v]=(0,e.useState)(null),[w,x]=(0,e.useState)(!1),[z,A]=(0,e.useState)(null),[B,C]=(0,e.useState)([]),[D,E]=(0,e.useState)(""),F=b?.provider==="bailian-coding-plan",G="https://coding-intl.dashscope.aliyuncs.com/apps/anthropic/v1";(0,e.useEffect)(()=>{if(b){let a=b.providerSpecificData?.baseUrl;i({name:b.name||"",priority:b.priority||1,apiKey:"",healthCheckInterval:b.healthCheckInterval??60,baseUrl:a||(F?G:"")});let c=b.providerSpecificData?.extraApiKeys;C(Array.isArray(c)?c:[]),E(""),r(null),v(null),A(null)}},[b,F]);let H=async()=>{if(b?.provider){l(!0),r(null);try{let a=await fetch(`/api/providers/${b.id}/test`,{method:"POST"}),c=await a.json();r({valid:!!c.valid,diagnosis:c.diagnosis||null,message:c.error||null})}catch{r({valid:!1,diagnosis:{type:"network_error"},message:g("failedTestConnection")})}finally{l(!1)}}},I=async()=>{if(b?.provider&&h.apiKey){t(!0),v(null);try{let a=await fetch("/api/providers/validate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:b.provider,apiKey:h.apiKey})}),c=await a.json();v(c.valid?"success":"failed")}catch{v("failed")}finally{t(!1)}}},J=async()=>{x(!0),A(null);try{let a={name:h.name,priority:h.priority,healthCheckInterval:h.healthCheckInterval},d=null;if(F){let a=O(h.baseUrl,G);if(a.error)return void A(a.error);d=a.value}if(!K&&h.apiKey){a.apiKey=h.apiKey;let c="success"===u;if(!c)try{t(!0),v(null);let a=await fetch("/api/providers/validate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:b.provider,apiKey:h.apiKey})});c=!!(await a.json()).valid,v(c?"success":"failed")}catch{v("failed")}finally{t(!1)}c&&(a.testStatus="active",a.lastError=null,a.lastErrorAt=null,a.lastErrorType=null,a.lastErrorSource=null,a.errorCode=null,a.rateLimitedUntil=null)}!K&&(a.providerSpecificData={...b.providerSpecificData||{},extraApiKeys:B.filter(a=>a.trim().length>0)},F&&(a.providerSpecificData.baseUrl=d));let e=await c(a);e&&A("string"==typeof e?e:g("failedSaveConnection"))}finally{x(!1)}};if(!b)return null;let K="oauth"===b.authType,L=(0,y.isOpenAICompatibleProvider)(b.provider)||(0,y.isAnthropicCompatibleProvider)(b.provider),M=!m?.valid&&m?.diagnosis?.type&&R[m.diagnosis.type]||null;return(0,d.jsx)(q.Modal,{isOpen:a,title:g("editConnection"),onClose:f,children:(0,d.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,d.jsx)(p.Input,{label:g("nameLabel"),value:h.name,onChange:a=>i({...h,name:a.target.value}),placeholder:K?g("accountName"):g("productionKey")}),K&&b.email&&(0,d.jsxs)("div",{className:"bg-sidebar/50 p-3 rounded-lg",children:[(0,d.jsx)("p",{className:"text-sm text-text-muted mb-1",children:g("email")}),(0,d.jsx)("p",{className:"font-medium",children:b.email})]}),K&&(0,d.jsx)(p.Input,{label:g("healthCheckMinutes"),type:"number",value:h.healthCheckInterval,onChange:a=>i({...h,healthCheckInterval:Math.max(0,Number.parseInt(a.target.value)||0)}),hint:g("healthCheckHint")}),(0,d.jsx)(p.Input,{label:g("priorityLabel"),type:"number",value:h.priority,onChange:a=>i({...h,priority:Number.parseInt(a.target.value)||1})}),!K&&(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)("div",{className:"flex gap-2",children:[(0,d.jsx)(p.Input,{label:g("apiKeyLabel"),type:"password",value:h.apiKey,onChange:a=>i({...h,apiKey:a.target.value}),placeholder:g("enterNewApiKey"),hint:g("leaveBlankKeepCurrentApiKey"),className:"flex-1"}),(0,d.jsx)("div",{className:"pt-6",children:(0,d.jsx)(n.Button,{onClick:I,disabled:!h.apiKey||s||w,variant:"secondary",children:s?g("checking"):g("check")})})]}),u&&(0,d.jsx)(o.Badge,{variant:"success"===u?"success":"error",children:"success"===u?g("valid"):g("invalid")}),z&&(0,d.jsx)("div",{className:"text-sm text-red-500 bg-red-500/10 border border-red-500/20 rounded-lg px-3 py-2",children:z})]}),F&&(0,d.jsx)(p.Input,{label:"Base URL",value:h.baseUrl,onChange:a=>i({...h,baseUrl:a.target.value}),placeholder:G,hint:"Custom base URL for bailian-coding-plan provider"}),!K&&(0,d.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,d.jsxs)("label",{className:"text-sm font-medium text-text-main",children:["Extra API Keys",(0,d.jsx)("span",{className:"ml-2 text-[11px] font-normal text-text-muted",children:"(round-robin rotation — optional)"})]}),B.length>0&&(0,d.jsx)("div",{className:"flex flex-col gap-1.5",children:B.map((a,b)=>(0,d.jsxs)("div",{className:"flex items-center gap-2",children:[(0,d.jsx)("span",{className:"flex-1 font-mono text-xs bg-sidebar/50 px-3 py-2 rounded border border-border text-text-muted truncate",children:`Key #${b+2}: ${a.slice(0,6)}...${a.slice(-4)}`}),(0,d.jsx)("button",{onClick:()=>C(B.filter((a,c)=>c!==b)),className:"p-1.5 rounded hover:bg-red-500/10 text-red-400 hover:text-red-500",title:"Remove this key",children:(0,d.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"close"})})]},b))}),(0,d.jsxs)("div",{className:"flex gap-2",children:[(0,d.jsx)("input",{type:"password",value:D,onChange:a=>E(a.target.value),placeholder:"Add another API key...",className:"flex-1 text-sm bg-sidebar/50 border border-border rounded px-3 py-2 text-text-main placeholder:text-text-muted focus:ring-1 focus:ring-primary outline-none",onKeyDown:a=>{"Enter"===a.key&&D.trim()&&(C([...B,D.trim()]),E(""))}}),(0,d.jsx)("button",{onClick:()=>{D.trim()&&(C([...B,D.trim()]),E(""))},disabled:!D.trim(),className:"px-3 py-2 rounded bg-primary/10 text-primary hover:bg-primary/20 disabled:opacity-40 text-sm font-medium",children:"Add"})]}),B.length>0&&(0,d.jsxs)("p",{className:"text-[11px] text-text-muted",children:[B.length+1," keys total — rotating round-robin on each request."]})]}),!L&&(0,d.jsxs)("div",{className:"flex items-center gap-3",children:[(0,d.jsx)(n.Button,{onClick:H,variant:"secondary",disabled:j,children:j?g("testing"):g("testConnection")}),m&&(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(o.Badge,{variant:m.valid?"success":"error",children:m.valid?g("valid"):g("failed")}),M&&(0,d.jsx)(o.Badge,{variant:M.variant,children:g(M.labelKey)})]})]}),(0,d.jsxs)("div",{className:"flex gap-2",children:[(0,d.jsx)(n.Button,{onClick:J,fullWidth:!0,disabled:w,children:w?g("saving"):g("save")}),(0,d.jsx)(n.Button,{onClick:f,variant:"ghost",fullWidth:!0,children:g("cancel")})]})]})})}function Q({isOpen:a,node:b,onSave:c,onClose:f,isAnthropic:g}){let h=(0,k.useTranslations)("providers"),[i,j]=(0,e.useState)({name:"",prefix:"",apiType:"chat",baseUrl:"https://api.openai.com/v1",chatPath:"",modelsPath:""}),[l,m]=(0,e.useState)(!1),[r,s]=(0,e.useState)(""),[t,u]=(0,e.useState)(!1),[v,x]=(0,e.useState)(null),[y,z]=(0,e.useState)(!1);(0,e.useEffect)(()=>{b&&(j({name:b.name||"",prefix:b.prefix||"",apiType:b.apiType||"chat",baseUrl:b.baseUrl||(g?"https://api.anthropic.com/v1":"https://api.openai.com/v1"),chatPath:b.chatPath||"",modelsPath:b.modelsPath||""}),z(!!(b.chatPath||b.modelsPath)))},[b,g]);let A=[{value:"chat",label:h("chatCompletions")},{value:"responses",label:h("responsesApi")}],B=async()=>{if(i.name.trim()&&i.prefix.trim()&&i.baseUrl.trim()){m(!0);try{let a={name:i.name,prefix:i.prefix,baseUrl:i.baseUrl,chatPath:i.chatPath||"",modelsPath:i.modelsPath||""};g||(a.apiType=i.apiType),await c(a)}finally{m(!1)}}},C=async()=>{u(!0);try{let a=await fetch("/api/provider-nodes/validate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({baseUrl:i.baseUrl,apiKey:r,type:g?"anthropic-compatible":"openai-compatible",modelsPath:i.modelsPath||""})}),b=await a.json();x(b.valid?"success":"failed")}catch{x("failed")}finally{u(!1)}};return b?(0,d.jsx)(q.Modal,{isOpen:a,title:h("editCompatibleTitle",{type:h(g?"anthropic":"openai")}),onClose:f,children:(0,d.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,d.jsx)(p.Input,{label:h("nameLabel"),value:i.name,onChange:a=>j({...i,name:a.target.value}),placeholder:h("compatibleProdPlaceholder",{type:h(g?"anthropic":"openai")}),hint:h("nameHint")}),(0,d.jsx)(p.Input,{label:h("prefixLabel"),value:i.prefix,onChange:a=>j({...i,prefix:a.target.value}),placeholder:h(g?"anthropicPrefixPlaceholder":"openaiPrefixPlaceholder"),hint:h("prefixHint")}),!g&&(0,d.jsx)(w.Select,{label:h("apiTypeLabel"),options:A,value:i.apiType,onChange:a=>j({...i,apiType:a.target.value})}),(0,d.jsx)(p.Input,{label:h("baseUrlLabel"),value:i.baseUrl,onChange:a=>j({...i,baseUrl:a.target.value}),placeholder:h(g?"anthropicBaseUrlPlaceholder":"openaiBaseUrlPlaceholder"),hint:h("compatibleBaseUrlHint",{type:h(g?"anthropic":"openai")})}),(0,d.jsxs)("button",{type:"button",className:"text-sm text-text-muted hover:text-text-primary flex items-center gap-1",onClick:()=>z(!y),"aria-expanded":y,"aria-controls":"advanced-settings",children:[(0,d.jsx)("span",{className:`transition-transform ${y?"rotate-90":""}`,"aria-hidden":"true",children:"▶"}),h("advancedSettings")]}),y&&(0,d.jsxs)("div",{id:"advanced-settings",className:"flex flex-col gap-3 pl-2 border-l-2 border-border",children:[(0,d.jsx)(p.Input,{label:h("chatPathLabel"),value:i.chatPath,onChange:a=>j({...i,chatPath:a.target.value}),placeholder:g?"/messages":h("chatPathPlaceholder"),hint:h("chatPathHint")}),(0,d.jsx)(p.Input,{label:h("modelsPathLabel"),value:i.modelsPath,onChange:a=>j({...i,modelsPath:a.target.value}),placeholder:h("modelsPathPlaceholder"),hint:h("modelsPathHint")})]}),(0,d.jsxs)("div",{className:"flex gap-2",children:[(0,d.jsx)(p.Input,{label:h("apiKeyForCheck"),type:"password",value:r,onChange:a=>s(a.target.value),className:"flex-1"}),(0,d.jsx)("div",{className:"pt-6",children:(0,d.jsx)(n.Button,{onClick:C,disabled:!r||t||!i.baseUrl.trim(),variant:"secondary",children:h(t?"checking":"check")})})]}),v&&(0,d.jsx)(o.Badge,{variant:"success"===v?"success":"error",children:h("success"===v?"valid":"invalid")}),(0,d.jsxs)("div",{className:"flex gap-2",children:[(0,d.jsx)(n.Button,{onClick:B,fullWidth:!0,disabled:!i.name.trim()||!i.prefix.trim()||!i.baseUrl.trim()||l,children:h(l?"saving":"save")}),(0,d.jsx)(n.Button,{onClick:f,variant:"ghost",fullWidth:!0,children:h("cancel")})]})]})}):null}M.propTypes={connection:g.default.shape({id:g.default.string,name:g.default.string,email:g.default.string,displayName:g.default.string,rateLimitedUntil:g.default.string,rateLimitProtection:g.default.bool,testStatus:g.default.string,isActive:g.default.bool,priority:g.default.number,lastError:g.default.string,lastErrorType:g.default.string,lastErrorSource:g.default.string,errorCode:g.default.oneOfType([g.default.string,g.default.number]),globalPriority:g.default.number,providerSpecificData:g.default.object}).isRequired,isOAuth:g.default.bool.isRequired,isCodex:g.default.bool,isFirst:g.default.bool.isRequired,isLast:g.default.bool.isRequired,onMoveUp:g.default.func.isRequired,onMoveDown:g.default.func.isRequired,onToggleActive:g.default.func.isRequired,onToggleRateLimit:g.default.func.isRequired,onToggleCodex5h:g.default.func,onToggleCodexWeekly:g.default.func,onRetest:g.default.func.isRequired,isRetesting:g.default.bool,onEdit:g.default.func.isRequired,onDelete:g.default.func.isRequired,onReauth:g.default.func},N.propTypes={isOpen:g.default.bool.isRequired,provider:g.default.string,providerName:g.default.string,isCompatible:g.default.bool,isAnthropic:g.default.bool,onSave:g.default.func.isRequired,onClose:g.default.func.isRequired},P.propTypes={isOpen:g.default.bool.isRequired,connection:g.default.shape({id:g.default.string,name:g.default.string,email:g.default.string,priority:g.default.number,authType:g.default.string,provider:g.default.string}),onSave:g.default.func.isRequired,onClose:g.default.func.isRequired},Q.propTypes={isOpen:g.default.bool.isRequired,node:g.default.shape({id:g.default.string,name:g.default.string,prefix:g.default.string,apiType:g.default.string,baseUrl:g.default.string,chatPath:g.default.string,modelsPath:g.default.string}),onSave:g.default.func.isRequired,onClose:g.default.func.isRequired,isAnthropic:g.default.bool},a.s(["default",()=>F]),c()}catch(a){c(a)}},!1)];
2
2
 
3
3
  //# sourceMappingURL=src_d3225e36._.js.map