omniroute 2.8.0 → 2.8.1

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 (119) 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/callback/page_client-reference-manifest.js +1 -1
  48. package/app/.next/server/app/docs/page_client-reference-manifest.js +1 -1
  49. package/app/.next/server/app/forbidden/page_client-reference-manifest.js +1 -1
  50. package/app/.next/server/app/forgot-password/page_client-reference-manifest.js +1 -1
  51. package/app/.next/server/app/landing/page_client-reference-manifest.js +1 -1
  52. package/app/.next/server/app/login/page_client-reference-manifest.js +1 -1
  53. package/app/.next/server/app/maintenance/page_client-reference-manifest.js +1 -1
  54. package/app/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  55. package/app/.next/server/app/page_client-reference-manifest.js +1 -1
  56. package/app/.next/server/app/privacy/page_client-reference-manifest.js +1 -1
  57. package/app/.next/server/app/status/page_client-reference-manifest.js +1 -1
  58. package/app/.next/server/app/terms/page_client-reference-manifest.js +1 -1
  59. package/app/.next/server/chunks/[root-of-the-server]__09c944b3._.js +1 -1
  60. package/app/.next/server/chunks/[root-of-the-server]__167585da._.js +1 -1
  61. package/app/.next/server/chunks/[root-of-the-server]__3972de72._.js +5 -5
  62. package/app/.next/server/chunks/[root-of-the-server]__64bd5d97._.js +1 -1
  63. package/app/.next/server/chunks/[root-of-the-server]__784fb7c5._.js +1 -1
  64. package/app/.next/server/chunks/[root-of-the-server]__7d9b23e7._.js +1 -1
  65. package/app/.next/server/chunks/[root-of-the-server]__80e3bfc3._.js +1 -1
  66. package/app/.next/server/chunks/[root-of-the-server]__84e445b2._.js +2 -2
  67. package/app/.next/server/chunks/[root-of-the-server]__92cb0def._.js +2 -2
  68. package/app/.next/server/chunks/[root-of-the-server]__a630d6ef._.js +5 -5
  69. package/app/.next/server/chunks/[root-of-the-server]__cb8a67d1._.js +1 -1
  70. package/app/.next/server/chunks/[root-of-the-server]__db2f9fe0._.js +1 -1
  71. package/app/.next/server/chunks/[root-of-the-server]__dc47ee64._.js +1 -1
  72. package/app/.next/server/chunks/[root-of-the-server]__f0f9eb3f._.js +2 -2
  73. package/app/.next/server/chunks/_05c48915._.js +1 -1
  74. package/app/.next/server/chunks/_1244636c._.js +5 -5
  75. package/app/.next/server/chunks/_2115d8de._.js +1 -1
  76. package/app/.next/server/chunks/_3ac953eb._.js +1 -1
  77. package/app/.next/server/chunks/_4b8fd853._.js +1 -1
  78. package/app/.next/server/chunks/_68683848._.js +1 -1
  79. package/app/.next/server/chunks/_ee9b677b._.js +1 -1
  80. package/app/.next/server/chunks/open-sse_translator_index_ts_f5fd0821._.js +9 -9
  81. package/app/.next/server/chunks/src_lib_a886ee1f._.js +1 -1
  82. package/app/.next/server/chunks/src_shared_validation_schemas_ts_4e63863a._.js +1 -1
  83. package/app/.next/server/chunks/ssr/[root-of-the-server]__9affb65e._.js +1 -1
  84. package/app/.next/server/chunks/ssr/[root-of-the-server]__a6942102._.js +1 -1
  85. package/app/.next/server/chunks/ssr/_5a9cd299._.js +1 -1
  86. package/app/.next/server/chunks/ssr/src_d3225e36._.js +1 -1
  87. package/app/.next/server/chunks/ssr/src_i18n_messages_zh-CN_json_f4112d90._.js +1 -1
  88. package/app/.next/server/pages/500.html +2 -2
  89. package/app/.next/server/server-reference-manifest.js +1 -1
  90. package/app/.next/server/server-reference-manifest.json +1 -1
  91. package/app/.next/static/chunks/02afac1b585d8219.css +1 -0
  92. package/app/.next/static/chunks/{d3cb88d181c61235.js → 4bed5b394f9dece9.js} +1 -1
  93. package/app/.next/static/chunks/{4f099d0f5b0f00d6.js → b5cc103e16794392.js} +1 -1
  94. package/app/.next/static/chunks/d19ab4efcaddd1db.js +1 -0
  95. package/app/CHANGELOG.md +20 -0
  96. package/app/docs/openapi.yaml +1 -1
  97. package/app/open-sse/executors/kiro.ts +5 -2
  98. package/app/open-sse/handlers/chatCore.ts +11 -3
  99. package/app/open-sse/translator/helpers/toolCallHelper.ts +58 -15
  100. package/app/open-sse/translator/index.ts +10 -3
  101. package/app/open-sse/utils/stream.ts +129 -19
  102. package/app/open-sse/utils/usageTracking.ts +3 -1
  103. package/app/package-lock.json +2 -2
  104. package/app/package.json +1 -1
  105. package/app/src/app/(dashboard)/dashboard/providers/[id]/page.tsx +22 -0
  106. package/app/src/app/api/keys/[id]/route.ts +26 -4
  107. package/app/src/app/api/provider-models/route.ts +3 -1
  108. package/app/src/i18n/messages/zh-CN.json +862 -787
  109. package/app/src/lib/db/models.ts +25 -0
  110. package/app/src/lib/usage/callLogs.ts +6 -2
  111. package/app/src/shared/components/RequestLoggerDetail.tsx +10 -10
  112. package/app/src/shared/validation/schemas.ts +1 -0
  113. package/app/src/sse/handlers/chat.ts +8 -3
  114. package/package.json +1 -1
  115. package/app/.next/static/chunks/194dbd564ba7150b.css +0 -1
  116. package/app/.next/static/chunks/3f3d822837a5ff5f.js +0 -1
  117. /package/app/.next/static/{Y1ARupD8_nbYoMt6WYrBO → JoLoKHY_9DVANe7Qs4D0K}/_buildManifest.js +0 -0
  118. /package/app/.next/static/{Y1ARupD8_nbYoMt6WYrBO → JoLoKHY_9DVANe7Qs4D0K}/_clientMiddlewareManifest.json +0 -0
  119. /package/app/.next/static/{Y1ARupD8_nbYoMt6WYrBO → JoLoKHY_9DVANe7Qs4D0K}/_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)(null),H=(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)(()=>{H()},[H]);let I=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 H())}catch(a){console.error("Failed to add custom model:",a)}finally{w(!1)}}},J=async b=>{try{await fetch(`/api/provider-models?provider=${encodeURIComponent(a)}&model=${encodeURIComponent(b)}`,{method:"DELETE"}),await H()}catch(a){console.error("Failed to remove custom model:",a)}},K=()=>{A(null),C("chat-completions"),E(["chat"]),G(null)},L=async b=>{if(z&&z===b){if(!D.length)return void i.error("Select at least one supported endpoint");G(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})})).ok)throw Error("Failed to save model endpoint settings");await H(),i.success("Saved model endpoint settings"),K()}catch(a){console.error("Failed to save custom model:",a),i.error("Failed to save model endpoint settings")}finally{G(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&&I(),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&&I(),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:I,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"})]}),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)("div",{className:"mt-3 flex items-center gap-2",children:[(0,d.jsx)(n.Button,{size:"sm",onClick:()=>L(a.id),disabled:F===a.id,children:F===a.id?h("saving"):h("save")}),(0,d.jsx)(n.Button,{size:"sm",variant:"ghost",onClick:K,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"])},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:()=>J(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(){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)];
2
2
 
3
3
  //# sourceMappingURL=src_d3225e36._.js.map