omniroute 2.8.6 → 2.8.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/app/.next/BUILD_ID +1 -1
  2. package/app/.next/build-manifest.json +2 -2
  3. package/app/.next/prerender-manifest.json +3 -3
  4. package/app/.next/server/app/(dashboard)/dashboard/a2a/page_client-reference-manifest.js +1 -1
  5. package/app/.next/server/app/(dashboard)/dashboard/agents/page_client-reference-manifest.js +1 -1
  6. package/app/.next/server/app/(dashboard)/dashboard/analytics/page_client-reference-manifest.js +1 -1
  7. package/app/.next/server/app/(dashboard)/dashboard/api-manager/page_client-reference-manifest.js +1 -1
  8. package/app/.next/server/app/(dashboard)/dashboard/audit-log/page_client-reference-manifest.js +1 -1
  9. package/app/.next/server/app/(dashboard)/dashboard/auto-combo/page_client-reference-manifest.js +1 -1
  10. package/app/.next/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  11. package/app/.next/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  12. package/app/.next/server/app/(dashboard)/dashboard/costs/page_client-reference-manifest.js +1 -1
  13. package/app/.next/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  14. package/app/.next/server/app/(dashboard)/dashboard/health/page_client-reference-manifest.js +1 -1
  15. package/app/.next/server/app/(dashboard)/dashboard/limits/page_client-reference-manifest.js +1 -1
  16. package/app/.next/server/app/(dashboard)/dashboard/logs/page_client-reference-manifest.js +1 -1
  17. package/app/.next/server/app/(dashboard)/dashboard/mcp/page_client-reference-manifest.js +1 -1
  18. package/app/.next/server/app/(dashboard)/dashboard/media/page_client-reference-manifest.js +1 -1
  19. package/app/.next/server/app/(dashboard)/dashboard/onboarding/page_client-reference-manifest.js +1 -1
  20. package/app/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  21. package/app/.next/server/app/(dashboard)/dashboard/playground/page_client-reference-manifest.js +1 -1
  22. package/app/.next/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  23. package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  24. package/app/.next/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  25. package/app/.next/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  26. package/app/.next/server/app/(dashboard)/dashboard/search-tools/page_client-reference-manifest.js +1 -1
  27. package/app/.next/server/app/(dashboard)/dashboard/settings/page_client-reference-manifest.js +1 -1
  28. package/app/.next/server/app/(dashboard)/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  29. package/app/.next/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  30. package/app/.next/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  31. package/app/.next/server/app/400/page_client-reference-manifest.js +1 -1
  32. package/app/.next/server/app/401/page_client-reference-manifest.js +1 -1
  33. package/app/.next/server/app/403/page_client-reference-manifest.js +1 -1
  34. package/app/.next/server/app/408/page_client-reference-manifest.js +1 -1
  35. package/app/.next/server/app/429/page_client-reference-manifest.js +1 -1
  36. package/app/.next/server/app/500/page_client-reference-manifest.js +1 -1
  37. package/app/.next/server/app/502/page_client-reference-manifest.js +1 -1
  38. package/app/.next/server/app/503/page_client-reference-manifest.js +1 -1
  39. package/app/.next/server/app/_global-error.html +2 -2
  40. package/app/.next/server/app/_global-error.rsc +1 -1
  41. package/app/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  42. package/app/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  43. package/app/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  44. package/app/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  45. package/app/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  46. package/app/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  47. package/app/.next/server/app/api/providers/test-batch/route.js +4 -4
  48. package/app/.next/server/app/api/v1/embeddings/route.js +7 -6
  49. package/app/.next/server/app/api/v1/embeddings/route.js.nft.json +1 -1
  50. package/app/.next/server/app/callback/page_client-reference-manifest.js +1 -1
  51. package/app/.next/server/app/docs/page_client-reference-manifest.js +1 -1
  52. package/app/.next/server/app/forbidden/page_client-reference-manifest.js +1 -1
  53. package/app/.next/server/app/forgot-password/page_client-reference-manifest.js +1 -1
  54. package/app/.next/server/app/landing/page_client-reference-manifest.js +1 -1
  55. package/app/.next/server/app/login/page_client-reference-manifest.js +1 -1
  56. package/app/.next/server/app/maintenance/page_client-reference-manifest.js +1 -1
  57. package/app/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  58. package/app/.next/server/app/page_client-reference-manifest.js +1 -1
  59. package/app/.next/server/app/privacy/page_client-reference-manifest.js +1 -1
  60. package/app/.next/server/app/status/page_client-reference-manifest.js +1 -1
  61. package/app/.next/server/app/terms/page_client-reference-manifest.js +1 -1
  62. package/app/.next/server/chunks/[root-of-the-server]__007da72e._.js +3 -0
  63. package/app/.next/server/chunks/[root-of-the-server]__09c944b3._.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 +1 -1
  67. package/app/.next/server/chunks/[root-of-the-server]__92cb0def._.js +1 -1
  68. package/app/.next/server/chunks/[root-of-the-server]__d4563e10._.js +1 -1
  69. package/app/.next/server/chunks/[root-of-the-server]__db2f9fe0._.js +1 -1
  70. package/app/.next/server/chunks/[root-of-the-server]__e27a89bd._.js +1 -1
  71. package/app/.next/server/chunks/[root-of-the-server]__f31b4656._.js +1 -1
  72. package/app/.next/server/chunks/_05c48915._.js +1 -1
  73. package/app/.next/server/chunks/_2115d8de._.js +1 -1
  74. package/app/.next/server/chunks/_3ac953eb._.js +1 -1
  75. package/app/.next/server/chunks/_4b8fd853._.js +1 -1
  76. package/app/.next/server/chunks/_5677b5e2._.js +1 -1
  77. package/app/.next/server/chunks/_68683848._.js +1 -1
  78. package/app/.next/server/chunks/_b39b1914._.js +3 -0
  79. package/app/.next/server/chunks/_ee9b677b._.js +1 -1
  80. package/app/.next/server/chunks/ssr/[root-of-the-server]__9affb65e._.js +1 -1
  81. package/app/.next/server/chunks/ssr/[root-of-the-server]__a6942102._.js +1 -1
  82. package/app/.next/server/chunks/ssr/src_d3225e36._.js +1 -1
  83. package/app/.next/server/pages/500.html +2 -2
  84. package/app/.next/server/server-reference-manifest.js +1 -1
  85. package/app/.next/server/server-reference-manifest.json +1 -1
  86. package/app/.next/static/chunks/{353ef826fbae436d.js → 0c5e4a7f0f799d8c.js} +1 -1
  87. package/app/.next/static/chunks/6fecf6be49542089.js +1 -0
  88. package/app/CHANGELOG.md +32 -0
  89. package/app/docs/openapi.yaml +1 -1
  90. package/app/open-sse/services/rateLimitManager.ts +10 -5
  91. package/app/package-lock.json +2 -2
  92. package/app/package.json +1 -1
  93. package/app/src/app/(dashboard)/dashboard/providers/[id]/page.tsx +156 -0
  94. package/app/src/app/api/providers/test-batch/route.ts +48 -8
  95. package/app/src/app/api/v1/embeddings/route.ts +33 -3
  96. package/package.json +1 -1
  97. package/app/.next/server/chunks/[root-of-the-server]__6b56b04f._.js +0 -3
  98. package/app/.next/static/chunks/91761ba00c702cff.js +0 -1
  99. /package/app/.next/static/{m9BrfW8GQTdaCjvX6OgP2 → yygubF7HqPRxaseKRZqYC}/_buildManifest.js +0 -0
  100. /package/app/.next/static/{m9BrfW8GQTdaCjvX6OgP2 → yygubF7HqPRxaseKRZqYC}/_clientMiddlewareManifest.json +0 -0
  101. /package/app/.next/static/{m9BrfW8GQTdaCjvX6OgP2 → yygubF7HqPRxaseKRZqYC}/_ssgManifest.js +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omniroute",
3
- "version": "2.8.6",
3
+ "version": "2.8.8",
4
4
  "description": "Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,3 +0,0 @@
1
- module.exports=[918622,(e,t,r)=>{t.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},556704,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},832319,(e,t,r)=>{t.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},270406,(e,t,r)=>{t.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},814747,(e,t,r)=>{t.exports=e.x("path",()=>require("path"))},193695,(e,t,r)=>{t.exports=e.x("next/dist/shared/lib/no-fallback-error.external.js",()=>require("next/dist/shared/lib/no-fallback-error.external.js"))},442315,(e,t,r)=>{"use strict";t.exports=e.r(918622)},347540,(e,t,r)=>{"use strict";t.exports=e.r(442315).vendored["react-rsc"].React},819481,(e,t,r)=>{"use strict";var n=Object.defineProperty,i=Object.getOwnPropertyDescriptor,s=Object.getOwnPropertyNames,a=Object.prototype.hasOwnProperty,o={},l={RequestCookies:()=>f,ResponseCookies:()=>g,parseCookie:()=>p,parseSetCookie:()=>c,stringifyCookie:()=>u};for(var d in l)n(o,d,{get:l[d],enumerable:!0});function u(e){var t;let r=["path"in e&&e.path&&`Path=${e.path}`,"expires"in e&&(e.expires||0===e.expires)&&`Expires=${("number"==typeof e.expires?new Date(e.expires):e.expires).toUTCString()}`,"maxAge"in e&&"number"==typeof e.maxAge&&`Max-Age=${e.maxAge}`,"domain"in e&&e.domain&&`Domain=${e.domain}`,"secure"in e&&e.secure&&"Secure","httpOnly"in e&&e.httpOnly&&"HttpOnly","sameSite"in e&&e.sameSite&&`SameSite=${e.sameSite}`,"partitioned"in e&&e.partitioned&&"Partitioned","priority"in e&&e.priority&&`Priority=${e.priority}`].filter(Boolean),n=`${e.name}=${encodeURIComponent(null!=(t=e.value)?t:"")}`;return 0===r.length?n:`${n}; ${r.join("; ")}`}function p(e){let t=new Map;for(let r of e.split(/; */)){if(!r)continue;let e=r.indexOf("=");if(-1===e){t.set(r,"true");continue}let[n,i]=[r.slice(0,e),r.slice(e+1)];try{t.set(n,decodeURIComponent(null!=i?i:"true"))}catch{}}return t}function c(e){if(!e)return;let[[t,r],...n]=p(e),{domain:i,expires:s,httponly:a,maxage:o,path:l,samesite:d,secure:u,partitioned:c,priority:f}=Object.fromEntries(n.map(([e,t])=>[e.toLowerCase().replace(/-/g,""),t]));{var g,v,y={name:t,value:decodeURIComponent(r),domain:i,...s&&{expires:new Date(s)},...a&&{httpOnly:!0},..."string"==typeof o&&{maxAge:Number(o)},path:l,...d&&{sameSite:m.includes(g=(g=d).toLowerCase())?g:void 0},...u&&{secure:!0},...f&&{priority:h.includes(v=(v=f).toLowerCase())?v:void 0},...c&&{partitioned:!0}};let e={};for(let t in y)y[t]&&(e[t]=y[t]);return e}}t.exports=((e,t,r,o)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let r of s(t))a.call(e,r)||void 0===r||n(e,r,{get:()=>t[r],enumerable:!(o=i(t,r))||o.enumerable});return e})(n({},"__esModule",{value:!0}),o);var m=["strict","lax","none"],h=["low","medium","high"],f=class{constructor(e){this._parsed=new Map,this._headers=e;const t=e.get("cookie");if(t)for(const[e,r]of p(t))this._parsed.set(e,{name:e,value:r})}[Symbol.iterator](){return this._parsed[Symbol.iterator]()}get size(){return this._parsed.size}get(...e){let t="string"==typeof e[0]?e[0]:e[0].name;return this._parsed.get(t)}getAll(...e){var t;let r=Array.from(this._parsed);if(!e.length)return r.map(([e,t])=>t);let n="string"==typeof e[0]?e[0]:null==(t=e[0])?void 0:t.name;return r.filter(([e])=>e===n).map(([e,t])=>t)}has(e){return this._parsed.has(e)}set(...e){let[t,r]=1===e.length?[e[0].name,e[0].value]:e,n=this._parsed;return n.set(t,{name:t,value:r}),this._headers.set("cookie",Array.from(n).map(([e,t])=>u(t)).join("; ")),this}delete(e){let t=this._parsed,r=Array.isArray(e)?e.map(e=>t.delete(e)):t.delete(e);return this._headers.set("cookie",Array.from(t).map(([e,t])=>u(t)).join("; ")),r}clear(){return this.delete(Array.from(this._parsed.keys())),this}[Symbol.for("edge-runtime.inspect.custom")](){return`RequestCookies ${JSON.stringify(Object.fromEntries(this._parsed))}`}toString(){return[...this._parsed.values()].map(e=>`${e.name}=${encodeURIComponent(e.value)}`).join("; ")}},g=class{constructor(e){var t,r,n;this._parsed=new Map,this._headers=e;const i=null!=(n=null!=(r=null==(t=e.getSetCookie)?void 0:t.call(e))?r:e.get("set-cookie"))?n:[];for(const e of Array.isArray(i)?i:function(e){if(!e)return[];var t,r,n,i,s,a=[],o=0;function l(){for(;o<e.length&&/\s/.test(e.charAt(o));)o+=1;return o<e.length}for(;o<e.length;){for(t=o,s=!1;l();)if(","===(r=e.charAt(o))){for(n=o,o+=1,l(),i=o;o<e.length&&"="!==(r=e.charAt(o))&&";"!==r&&","!==r;)o+=1;o<e.length&&"="===e.charAt(o)?(s=!0,o=i,a.push(e.substring(t,n)),t=o):o=n+1}else o+=1;(!s||o>=e.length)&&a.push(e.substring(t,e.length))}return a}(i)){const t=c(e);t&&this._parsed.set(t.name,t)}}get(...e){let t="string"==typeof e[0]?e[0]:e[0].name;return this._parsed.get(t)}getAll(...e){var t;let r=Array.from(this._parsed.values());if(!e.length)return r;let n="string"==typeof e[0]?e[0]:null==(t=e[0])?void 0:t.name;return r.filter(e=>e.name===n)}has(e){return this._parsed.has(e)}set(...e){let[t,r,n]=1===e.length?[e[0].name,e[0].value,e[0]]:e,i=this._parsed;return i.set(t,function(e={name:"",value:""}){return"number"==typeof e.expires&&(e.expires=new Date(e.expires)),e.maxAge&&(e.expires=new Date(Date.now()+1e3*e.maxAge)),(null===e.path||void 0===e.path)&&(e.path="/"),e}({name:t,value:r,...n})),function(e,t){for(let[,r]of(t.delete("set-cookie"),e)){let e=u(r);t.append("set-cookie",e)}}(i,this._headers),this}delete(...e){let[t,r]="string"==typeof e[0]?[e[0]]:[e[0].name,e[0]];return this.set({...r,name:t,value:"",expires:new Date(0)})}[Symbol.for("edge-runtime.inspect.custom")](){return`ResponseCookies ${JSON.stringify(Object.fromEntries(this._parsed))}`}toString(){return[...this._parsed.values()].map(u).join("; ")}}},792509,(e,t,r)=>{t.exports=e.x("url",()=>require("url"))},785148,(e,t,r)=>{t.exports=e.x("better-sqlite3",()=>require("better-sqlite3"))},522734,(e,t,r)=>{t.exports=e.x("fs",()=>require("fs"))},446786,(e,t,r)=>{t.exports=e.x("os",()=>require("os"))},256770,e=>{"use strict";var t=e.i(814747),r=e.i(446786);let n="omniroute";function i(){try{return r.default.homedir()}catch{return process.cwd()}}function s(e){if("string"!=typeof e)return null;let r=e.trim();return r?t.default.resolve(r):null}function a(){return t.default.join(i(),`.${n}`)}function o({isCloud:e=!1}={}){let r;if(e)return"/tmp";let l=s(process.env.DATA_DIR);return l?l:(i(),(r=s(process.env.XDG_CONFIG_HOME))?t.default.join(r,n):a())}function l(e,r){return!!e&&!!r&&t.default.resolve(e)===t.default.resolve(r)}e.s(["getLegacyDotDataDir",()=>a,"isSamePath",()=>l,"resolveDataDir",()=>o])},439951,e=>{"use strict";var t=e.i(157763);function r(){try{return(0,t.getDbInstance)()}catch{return null}}function n(e={}){let t=r();if(!t)return[];let i=[],s=[];e.action&&(i.push("action = ?"),s.push(e.action)),e.actor&&(i.push("actor = ?"),s.push(e.actor));let a=i.length>0?`WHERE ${i.join(" AND ")}`:"",o=e.limit||100,l=e.offset||0;return t.prepare(`SELECT * FROM audit_log ${a} ORDER BY timestamp DESC LIMIT ? OFFSET ?`).all(...s,o,l).map(e=>({...e,details:e.details?JSON.parse(String(e.details)):null}))}parseInt(process.env.LOG_RETENTION_DAYS||"90",10);let i=new Set,s=new Map,a=!1,o=!1;for(let e of(process.env.NO_LOG_API_KEY_IDS||"").split(",").map(e=>e.trim()).filter(Boolean))i.add(e);function l(e,t){t?i.add(e):i.delete(e),s.set(e,{value:t,timestamp:Date.now()})}function d(e){if(!e)return!1;if(i.has(e))return!0;let t=function(e){let t=r();if(!t||!e||!function(e){if(a)return o;try{o=e.prepare("PRAGMA table_info(api_keys)").all().some(e=>"no_log"===e.name)}catch{o=!1}return a=!0,o}(t))return!1;let n=s.get(e);if(n&&Date.now()-n.timestamp<3e4)return n.value;try{let r=t.prepare("SELECT no_log FROM api_keys WHERE id = ?").get(e),n=!!(r&&1===Number(r.no_log));return s.set(e,{value:n,timestamp:Date.now()}),n}catch{return!1}}(e);return t&&i.add(e),t}e.s(["getAuditLog",()=>n,"isNoLog",()=>d,"setNoLog",()=>l])},677850,e=>e.a(async(t,r)=>{try{let t=await e.y("zod");e.n(t),r()}catch(e){r(e)}},!0),200392,e=>e.a(async(t,r)=>{try{var n=e.i(677850),i=t([n]);function s(e,t){let r=e.safeParse(t);if(r.success)return{success:!0,data:r.data};let n=Array.isArray(r.error?.issues)?r.error.issues:[];return{success:!1,error:{message:"Invalid request",details:n.map(e=>({field:e.path.join("."),message:e.message}))}}}function a(e){return!1===e.success}[n]=i.then?(await i)():i,n.z.object({password:n.z.string().min(1,"Password is required").max(200)}),e.s(["isValidationFailure",()=>a,"validateBody",()=>s]),r()}catch(e){r(e)}},!1),662636,e=>{"use strict";function t(e){if(!e)return"Unknown Account";let t="string"==typeof e.name&&e.name.trim()||"string"==typeof e.displayName&&e.displayName.trim()||"string"==typeof e.email&&e.email.trim();return t||("string"==typeof e.id&&e.id?`Account #${e.id.slice(0,6)}`:"Unknown Account")}e.s(["getAccountDisplayName",()=>t])},249157,e=>{"use strict";var t=e.i(706901),r=e.i(161002);e.s(["debug",()=>t.debug,"error",()=>t.error,"info",()=>t.info,"maskKey",()=>r.maskKey,"request",()=>t.request,"response",()=>t.response,"stream",()=>t.stream,"warn",()=>t.warn])},740512,e=>{"use strict";e.s(["toJsonErrorPayload",()=>function e(t,r="Upstream provider error"){let n={error:{message:r,type:"upstream_error",code:"upstream_error"}};if(t&&"object"==typeof t){let e=t.error;return"string"==typeof e?{error:{message:e,type:"upstream_error",code:"upstream_error"}}:e&&"object"==typeof e?t:{error:t}}if("string"==typeof t){let i=t.trim();if(!i)return n;try{let t=JSON.parse(i);return e(t,r)}catch{return{error:{message:i,type:"upstream_error",code:"upstream_error"}}}}return n}])},261189,e=>{"use strict";function t(e){if(!e.prefix||!e.baseUrl)throw Error("Invalid provider_node: missing prefix or baseUrl");if(e.prefix.includes("/")||e.prefix.includes(" "))throw Error(`Invalid provider_node prefix "${e.prefix}": must not contain / or spaces`);let t=e.baseUrl.replace(/\/+$/,"");return{id:e.prefix,baseUrl:`${t}/embeddings`,authType:"none",authHeader:"none",models:[]}}let r={nebius:{id:"nebius",baseUrl:"https://api.tokenfactory.nebius.com/v1/embeddings",authType:"apikey",authHeader:"bearer",models:[{id:"Qwen/Qwen3-Embedding-8B",name:"Qwen3 Embedding 8B",dimensions:4096}]},openai:{id:"openai",baseUrl:"https://api.openai.com/v1/embeddings",authType:"apikey",authHeader:"bearer",models:[{id:"text-embedding-3-small",name:"Text Embedding 3 Small",dimensions:1536},{id:"text-embedding-3-large",name:"Text Embedding 3 Large",dimensions:3072},{id:"text-embedding-ada-002",name:"Text Embedding Ada 002",dimensions:1536}]},mistral:{id:"mistral",baseUrl:"https://api.mistral.ai/v1/embeddings",authType:"apikey",authHeader:"bearer",models:[{id:"mistral-embed",name:"Mistral Embed",dimensions:1024}]},together:{id:"together",baseUrl:"https://api.together.xyz/v1/embeddings",authType:"apikey",authHeader:"bearer",models:[{id:"BAAI/bge-large-en-v1.5",name:"BGE Large EN v1.5",dimensions:1024},{id:"togethercomputer/m2-bert-80M-8k-retrieval",name:"M2 BERT 80M 8K",dimensions:768}]},fireworks:{id:"fireworks",baseUrl:"https://api.fireworks.ai/inference/v1/embeddings",authType:"apikey",authHeader:"bearer",models:[{id:"nomic-ai/nomic-embed-text-v1.5",name:"Nomic Embed Text v1.5",dimensions:768}]},nvidia:{id:"nvidia",baseUrl:"https://integrate.api.nvidia.com/v1/embeddings",authType:"apikey",authHeader:"bearer",models:[{id:"nvidia/nv-embedqa-e5-v5",name:"NV EmbedQA E5 v5",dimensions:1024}]}};function n(e){return r[e]||null}function i(e,t){if(!e)return{provider:null,model:null};let n=e.indexOf("/");if(n>0){for(let[t]of Object.entries(r))if(e.startsWith(t+"/"))return{provider:t,model:e.slice(t.length+1)};if(t){for(let r of t)if(e.startsWith(r.id+"/"))return{provider:r.id,model:e.slice(r.id.length+1)}}return{provider:e.slice(0,n),model:e.slice(n+1)}}for(let[t,n]of Object.entries(r))if(n.models.some(t=>t.id===e))return{provider:t,model:e};return{provider:null,model:e}}function s(){let e=[];for(let[t,n]of Object.entries(r))for(let r of n.models)e.push({id:`${t}/${r.id}`,name:r.name,provider:t,dimensions:r.dimensions});return e}e.s(["buildDynamicEmbeddingProvider",()=>t,"getAllEmbeddingModels",()=>s,"getEmbeddingProvider",()=>n,"parseEmbeddingModel",()=>i])},344448,e=>{"use strict";var t=e.i(261189);e.i(312125);var r=e.i(397506);async function n({body:e,credentials:n,log:i,resolvedProvider:s=null,resolvedModel:a=null}){let o,l,d;if(s)o=s.id,l=a,d=s;else{let r=(0,t.parseEmbeddingModel)(e.model);o=r.provider,l=r.model,d=o?(0,t.getEmbeddingProvider)(o):null}let u=Date.now(),p={model:e.model,input_count:Array.isArray(e.input)?e.input.length:1,dimensions:e.dimensions||void 0};if(!o)return{success:!1,status:400,error:`Invalid embedding model: ${e.model}. Use format: provider/model`};if(!d)return{success:!1,status:400,error:`Unknown embedding provider: ${o}`};let c={model:l,input:e.input};void 0!==e.dimensions&&(c.dimensions=e.dimensions),void 0!==e.encoding_format&&(c.encoding_format=e.encoding_format);let m={"Content-Type":"application/json"},h="none"===d.authType?null:n?.apiKey||n?.accessToken;h&&("bearer"===d.authHeader?m.Authorization=`Bearer ${h}`:"x-api-key"===d.authHeader&&(m["x-api-key"]=h)),i&&i.info("EMBED",`${o}/${l} | input: ${Array.isArray(e.input)?e.input.length+" items":"1 item"}`);try{let e=await fetch(d.baseUrl,{method:"POST",headers:m,body:JSON.stringify(c)});if(!e.ok){let t=await e.text();return i&&i.error("EMBED",`${o} error ${e.status}: ${t.slice(0,200)}`),(0,r.saveCallLog)({method:"POST",path:"/v1/embeddings",status:e.status,model:`${o}/${l}`,provider:o,duration:Date.now()-u,error:t.slice(0,500),requestBody:p}).catch(()=>{}),{success:!1,status:e.status,error:t}}let t=await e.json();return(0,r.saveCallLog)({method:"POST",path:"/v1/embeddings",status:200,model:`${o}/${l}`,provider:o,duration:Date.now()-u,tokens:{prompt_tokens:t.usage?.prompt_tokens||t.usage?.total_tokens||0,completion_tokens:0},requestBody:p,responseBody:{usage:t.usage||null,object:"list",data_count:t.data?.length||0}}).catch(()=>{}),{success:!0,data:{object:"list",data:t.data||t,model:`${o}/${l}`,usage:t.usage||{prompt_tokens:0,total_tokens:0}}}}catch(e){return i&&i.error("EMBED",`${o} fetch error: ${e.message}`),(0,r.saveCallLog)({method:"POST",path:"/v1/embeddings",status:502,model:`${o}/${l}`,provider:o,duration:Date.now()-u,error:e.message,requestBody:p}).catch(()=>{}),{success:!1,status:502,error:`Embedding provider error: ${e.message}`}}}e.s(["handleEmbedding",()=>n])},532400,e=>e.a(async(t,r)=>{try{var n=e.i(224010),i=e.i(344448),s=e.i(287726),a=e.i(261189),o=e.i(719201),l=e.i(16023),d=e.i(706901),u=e.i(249157),p=e.i(740512),c=e.i(478847),m=e.i(676088),h=e.i(200392);e.i(245272);var f=e.i(542949),g=e.i(385498),v=t([m,h]);async function y(){return new Response(null,{headers:{"Access-Control-Allow-Origin":n.CORS_ORIGIN,"Access-Control-Allow-Methods":"GET, POST, OPTIONS","Access-Control-Allow-Headers":"*"}})}async function b(){let e=(0,a.getAllEmbeddingModels)(),t=Math.floor(Date.now()/1e3),r=e.map(e=>({id:e.id,object:"model",created:t,owned_by:e.provider,type:"embedding",dimensions:e.dimensions}));try{let e=await (0,f.getAllCustomModels)();for(let[n,i]of Object.entries(e))if(Array.isArray(i))for(let e of i){if(!e?.id||!Array.isArray(e.supportedEndpoints)||!e.supportedEndpoints.includes("embeddings"))continue;let i=`${n}/${e.id}`;r.some(e=>e.id===i)||r.push({id:i,object:"model",created:t,owned_by:n,type:"embedding",dimensions:null})}}catch{}return new Response(JSON.stringify({object:"list",data:r}),{headers:{"Content-Type":"application/json"}})}async function E(e){let t;try{t=await e.json()}catch{return d.warn("EMBED","Invalid JSON body"),(0,o.errorResponse)(l.HTTP_STATUS.BAD_REQUEST,"Invalid JSON body")}let r=(0,h.validateBody)(m.v1EmbeddingsSchema,t);if((0,h.isValidationFailure)(r))return(0,o.errorResponse)(l.HTTP_STATUS.BAD_REQUEST,r.error.message);let n=r.data;if("true"===process.env.REQUIRE_API_KEY){let t=(0,s.extractApiKey)(e);if(!t)return(0,o.errorResponse)(l.HTTP_STATUS.UNAUTHORIZED,"Missing API key");if(!await (0,s.isValidApiKey)(t))return(0,o.errorResponse)(l.HTTP_STATUS.UNAUTHORIZED,"Invalid API key")}let f=await (0,c.enforceApiKeyPolicy)(e,n.model);if(f.rejection)return f.rejection;let v=[];try{let e=await (0,g.getProviderNodes)();v=(Array.isArray(e)?e:[]).filter(e=>{if("chat"!==e.apiType&&"responses"!==e.apiType)return!1;try{let t=new URL(e.baseUrl).hostname;return"localhost"===t||"127.0.0.1"===t||"::1"===t||"[::1]"===t}catch{return!1}}).map(e=>{try{return(0,a.buildDynamicEmbeddingProvider)(e)}catch(t){return d.error("EMBED",`Skipping invalid provider_node ${e.prefix}: ${t}`),null}}).filter(e=>null!==e)}catch(e){d.error("EMBED",`Failed to load provider_nodes for embeddings: ${e}`)}let{provider:y,model:b}=(0,a.parseEmbeddingModel)(n.model,v);if(!y)return(0,o.errorResponse)(l.HTTP_STATUS.BAD_REQUEST,`Invalid embedding model: ${n.model}. Use format: provider/model`);let E=v.find(e=>e.id===y)||(0,a.getEmbeddingProvider)(y)||null;if(!E)return(0,o.errorResponse)(l.HTTP_STATUS.BAD_REQUEST,`Unknown embedding provider: ${y}. No matching hardcoded or local provider found.`);let _=null;if(E&&"none"!==E.authType&&!(_=await (0,s.getProviderCredentials)(y)))return(0,o.errorResponse)(l.HTTP_STATUS.BAD_REQUEST,`No credentials for embedding provider: ${y}`);let x=await (0,i.handleEmbedding)({body:n,credentials:_,log:u,resolvedProvider:E,resolvedModel:b});if(x.success)return _&&await (0,s.clearRecoveredProviderState)(_),new Response(JSON.stringify(x.data),{status:200,headers:{"Content-Type":"application/json"}});let w=(0,p.toJsonErrorPayload)(x.error,"Embedding provider error");return new Response(JSON.stringify(w),{status:x.status,headers:{"Content-Type":"application/json"}})}[m,h]=v.then?(await v)():v,e.s(["GET",()=>b,"OPTIONS",()=>y,"POST",()=>E]),r()}catch(e){r(e)}},!1),559282,e=>e.a(async(t,r)=>{try{var n=e.i(747909),i=e.i(174017),s=e.i(996250),a=e.i(759756),o=e.i(561916),l=e.i(174677),d=e.i(869741),u=e.i(316795),p=e.i(487718),c=e.i(995169),m=e.i(47587),h=e.i(666012),f=e.i(570101),g=e.i(626937),v=e.i(10372),y=e.i(193695);e.i(52474);var b=e.i(600220),E=e.i(532400),_=t([E]);[E]=_.then?(await _)():_;let A=new n.AppRouteRouteModule({definition:{kind:i.RouteKind.APP_ROUTE,page:"/api/v1/embeddings/route",pathname:"/api/v1/embeddings",filename:"route",bundlePath:""},distDir:".next",relativeProjectDir:"",resolvedPagePath:"[project]/src/app/api/v1/embeddings/route.ts",nextConfigOutput:"standalone",userland:E}),{workAsyncStorage:R,workUnitAsyncStorage:T,serverHooks:S}=A;function x(){return(0,s.patchFetch)({workAsyncStorage:R,workUnitAsyncStorage:T})}async function w(e,t,r){A.isDev&&(0,a.addRequestMeta)(e,"devRequestTimingInternalsEnd",process.hrtime.bigint());let n="/api/v1/embeddings/route";n=n.replace(/\/index$/,"")||"/";let s=await A.prepare(e,t,{srcPage:n,multiZoneDraftMode:!1});if(!s)return t.statusCode=400,t.end("Bad Request"),null==r.waitUntil||r.waitUntil.call(r,Promise.resolve()),null;let{buildId:E,params:_,nextConfig:x,parsedUrl:w,isDraftMode:R,prerenderManifest:T,routerServerContext:S,isOnDemandRevalidate:O,revalidateOnlyGenerated:P,resolvedPathname:k,clientReferenceManifest:C,serverActionsManifest:D}=s,$=(0,d.normalizeAppPath)(n),U=!!(T.dynamicRoutes[$]||T.routes[k]),N=async()=>((null==S?void 0:S.render404)?await S.render404(e,t,w,!1):t.end("This page could not be found"),null);if(U&&!R){let e=!!T.routes[k],t=T.dynamicRoutes[$];if(t&&!1===t.fallback&&!e){if(x.experimental.adapterPath)return await N();throw new y.NoFallbackError}}let j=null;!U||A.isDev||R||(j=k,j="/index"===j?"/":j);let I=!0===A.isDev||!U,M=U&&!I;D&&C&&(0,l.setManifestsSingleton)({page:n,clientReferenceManifest:C,serverActionsManifest:D});let H=e.method||"GET",q=(0,o.getTracer)(),B=q.getActiveScopeSpan(),L={params:_,prerenderManifest:T,renderOpts:{experimental:{authInterrupts:!!x.experimental.authInterrupts},cacheComponents:!!x.cacheComponents,supportsDynamicResponse:I,incrementalCache:(0,a.getRequestMeta)(e,"incrementalCache"),cacheLifeProfiles:x.cacheLife,waitUntil:r.waitUntil,onClose:e=>{t.on("close",e)},onAfterTaskError:void 0,onInstrumentationRequestError:(t,r,n,i)=>A.onRequestError(e,t,n,i,S)},sharedContext:{buildId:E}},K=new u.NodeNextRequest(e),F=new u.NodeNextResponse(t),G=p.NextRequestAdapter.fromNodeNextRequest(K,(0,p.signalFromNodeResponse)(t));try{let s=async e=>A.handle(G,L).finally(()=>{if(!e)return;e.setAttributes({"http.status_code":t.statusCode,"next.rsc":!1});let r=q.getRootSpanAttributes();if(!r)return;if(r.get("next.span_type")!==c.BaseServerSpan.handleRequest)return void console.warn(`Unexpected root span type '${r.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let i=r.get("next.route");if(i){let t=`${H} ${i}`;e.setAttributes({"next.route":i,"http.route":i,"next.span_name":t}),e.updateName(t)}else e.updateName(`${H} ${n}`)}),l=!!(0,a.getRequestMeta)(e,"minimalMode"),d=async a=>{var o,d;let u=async({previousCacheEntry:i})=>{try{if(!l&&O&&P&&!i)return t.statusCode=404,t.setHeader("x-nextjs-cache","REVALIDATED"),t.end("This page could not be found"),null;let n=await s(a);e.fetchMetrics=L.renderOpts.fetchMetrics;let o=L.renderOpts.pendingWaitUntil;o&&r.waitUntil&&(r.waitUntil(o),o=void 0);let d=L.renderOpts.collectedTags;if(!U)return await (0,h.sendResponse)(K,F,n,L.renderOpts.pendingWaitUntil),null;{let e=await n.blob(),t=(0,f.toNodeOutgoingHttpHeaders)(n.headers);d&&(t[v.NEXT_CACHE_TAGS_HEADER]=d),!t["content-type"]&&e.type&&(t["content-type"]=e.type);let r=void 0!==L.renderOpts.collectedRevalidate&&!(L.renderOpts.collectedRevalidate>=v.INFINITE_CACHE)&&L.renderOpts.collectedRevalidate,i=void 0===L.renderOpts.collectedExpire||L.renderOpts.collectedExpire>=v.INFINITE_CACHE?void 0:L.renderOpts.collectedExpire;return{value:{kind:b.CachedRouteKind.APP_ROUTE,status:n.status,body:Buffer.from(await e.arrayBuffer()),headers:t},cacheControl:{revalidate:r,expire:i}}}}catch(t){throw(null==i?void 0:i.isStale)&&await A.onRequestError(e,t,{routerKind:"App Router",routePath:n,routeType:"route",revalidateReason:(0,m.getRevalidateReason)({isStaticGeneration:M,isOnDemandRevalidate:O})},!1,S),t}},p=await A.handleResponse({req:e,nextConfig:x,cacheKey:j,routeKind:i.RouteKind.APP_ROUTE,isFallback:!1,prerenderManifest:T,isRoutePPREnabled:!1,isOnDemandRevalidate:O,revalidateOnlyGenerated:P,responseGenerator:u,waitUntil:r.waitUntil,isMinimalMode:l});if(!U)return null;if((null==p||null==(o=p.value)?void 0:o.kind)!==b.CachedRouteKind.APP_ROUTE)throw Object.defineProperty(Error(`Invariant: app-route received invalid cache entry ${null==p||null==(d=p.value)?void 0:d.kind}`),"__NEXT_ERROR_CODE",{value:"E701",enumerable:!1,configurable:!0});l||t.setHeader("x-nextjs-cache",O?"REVALIDATED":p.isMiss?"MISS":p.isStale?"STALE":"HIT"),R&&t.setHeader("Cache-Control","private, no-cache, no-store, max-age=0, must-revalidate");let c=(0,f.fromNodeOutgoingHttpHeaders)(p.value.headers);return l&&U||c.delete(v.NEXT_CACHE_TAGS_HEADER),!p.cacheControl||t.getHeader("Cache-Control")||c.get("Cache-Control")||c.set("Cache-Control",(0,g.getCacheControlHeader)(p.cacheControl)),await (0,h.sendResponse)(K,F,new Response(p.value.body,{headers:c,status:p.value.status||200})),null};B?await d(B):await q.withPropagatedContext(e.headers,()=>q.trace(c.BaseServerSpan.handleRequest,{spanName:`${H} ${n}`,kind:o.SpanKind.SERVER,attributes:{"http.method":H,"http.target":e.url}},d))}catch(t){if(t instanceof y.NoFallbackError||await A.onRequestError(e,t,{routerKind:"App Router",routePath:$,routeType:"route",revalidateReason:(0,m.getRevalidateReason)({isStaticGeneration:M,isOnDemandRevalidate:O})},!1,S),U)throw t;return await (0,h.sendResponse)(K,F,new Response(null,{status:500})),null}}e.s(["handler",()=>w,"patchFetch",()=>x,"routeModule",()=>A,"serverHooks",()=>S,"workAsyncStorage",()=>R,"workUnitAsyncStorage",()=>T]),r()}catch(e){r(e)}},!1),605589,e=>{e.v(t=>Promise.all(["server/chunks/src_lib_localDb_ts_83220848._.js"].map(t=>e.l(t))).then(()=>t(969738)))},606102,e=>{e.v(e=>Promise.resolve().then(()=>e(548941)))},789543,e=>{e.v(e=>Promise.resolve().then(()=>e(385498)))},579042,e=>{e.v(t=>Promise.all(["server/chunks/src_shared_utils_apiKey_ts_fa113e09._.js"].map(t=>e.l(t))).then(()=>t(65448)))},49794,e=>{e.v(t=>Promise.all(["server/chunks/src_shared_constants_pricing_ts_65de0558._.js"].map(t=>e.l(t))).then(()=>t(404503)))},386305,e=>{e.v(e=>Promise.resolve().then(()=>e(878947)))}];
2
-
3
- //# sourceMappingURL=%5Broot-of-the-server%5D__6b56b04f._.js.map
@@ -1 +0,0 @@
1
- (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,710864,e=>{"use strict";var t=e.i(843476),r=e.i(271645),a=e.i(627949),l=e.i(745009),s=e.i(618566),i=e.i(522016),o=e.i(657688),n=e.i(948148);e.i(565650);var d=e.i(11477),c=e.i(474078),p=e.i(628029),u=e.i(339971),m=e.i(87855),x=e.i(454149),h=e.i(116016),h=h,f=e.i(567955),f=f,g=e.i(419947),g=g,v=e.i(148943),b=e.i(961430),y=e.i(105370),j=e.i(623249);e.i(313705);var C=e.i(25230),N=e.i(556938);function k(e){let t=e&&"object"==typeof e&&!Array.isArray(e)?e:{};return{use5h:"boolean"!=typeof t.use5h||t.use5h,useWeekly:"boolean"!=typeof t.useWeekly||t.useWeekly}}function w({t:e,normalizeToolCallId:a,preserveDeveloperRole:l,showDeveloperToggle:s=!0,onNormalizeChange:i,onPreserveChange:o,disabled:n}){let[d,c]=(0,r.useState)(!1),p=(0,r.useRef)(null);return(0,r.useEffect)(()=>{if(!d)return;let e=e=>{p.current&&!p.current.contains(e.target)&&c(!1)};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[d]),(0,t.jsxs)("div",{className:"relative inline-block",ref:p,children:[(0,t.jsxs)("button",{type:"button",onClick:()=>c(e=>!e),disabled:n,className:"inline-flex items-center gap-1 px-2 py-1 text-xs rounded-md border border-border bg-sidebar/50 hover:bg-sidebar text-text-muted hover:text-text-main disabled:opacity-50",title:e("compatAdjustmentsTitle"),children:[(0,t.jsx)("span",{className:"material-symbols-outlined text-sm",children:"tune"}),e("compatButtonLabel")]}),d&&(0,t.jsxs)("div",{className:"absolute left-0 top-full mt-1 z-50 min-w-[200px] p-3 rounded-lg border border-border bg-white dark:bg-zinc-900 shadow-xl ring-1 ring-black/5 dark:ring-white/10",children:[(0,t.jsx)("p",{className:"text-[10px] font-semibold uppercase tracking-wide text-text-muted mb-2",children:e("compatAdjustmentsTitle")}),(0,t.jsxs)("div",{className:"flex flex-col gap-3",children:[(0,t.jsx)(v.Toggle,{size:"sm",label:e("compatToolIdShort"),title:e("normalizeToolCallIdLabel"),checked:a,onChange:i,disabled:n}),s&&(0,t.jsx)(v.Toggle,{size:"sm",label:e("compatDoNotPreserveDeveloper"),title:e("preserveDeveloperRoleLabel"),checked:!1===l,onChange:e=>o(!e),disabled:n})]})]})]})}function T(){let e=(0,s.useParams)(),l=(0,s.useRouter)(),p=e.id,[u,v]=(0,r.useState)([]),[b,w]=(0,r.useState)(!0),[T,R]=(0,r.useState)(null),[E,D]=(0,r.useState)(!1),[U,_]=(0,r.useState)(!1),[K,F]=(0,r.useState)(!1),[z,q]=(0,r.useState)(!1),[B,J]=(0,r.useState)(null),[W,V]=(0,r.useState)(null),[H,Y]=(0,r.useState)({}),[G,Q]=(0,r.useState)(!1),{copied:X,copy:Z}=(0,N.useCopyToClipboard)(),ee=(0,n.useTranslations)("providers"),et=(0,a.useNotificationStore)(),er=(0,r.useRef)(!1),ea=(0,r.useRef)(!1),[el,es]=(0,r.useState)(null),[ei,eo]=(0,r.useState)(null),[en,ed]=(0,r.useState)(!1),[ec,ep]=(0,r.useState)(!1),[eu,em]=(0,r.useState)({current:0,total:0,phase:"idle",status:"",logs:[],error:"",importedCount:0}),[ex,eh]=(0,r.useState)({customModels:[],modelCompatOverrides:[]}),[ef,eg]=(0,r.useState)(null),ev=T?{id:T.id,name:T.name||("anthropic-compatible"===T.type?ee("anthropicCompatibleName"):ee("openaiCompatibleName")),color:"anthropic-compatible"===T.type?"#D97757":"#10A37F",textIcon:"anthropic-compatible"===T.type?"AC":"OC",apiType:T.apiType,baseUrl:T.baseUrl,type:T.type}:j.FREE_PROVIDERS[p]||j.OAUTH_PROVIDERS[p]||j.APIKEY_PROVIDERS[p],eb=!!j.FREE_PROVIDERS[p]||!!j.OAUTH_PROVIDERS[p],ey=(0,C.getModelsByProviderId)(p),ej=(0,j.getProviderAlias)(p),eC=(0,j.isOpenAICompatibleProvider)(p),eN=(0,j.isAnthropicCompatibleProvider)(p),ek=eC||eN,ew=p.endsWith("-search"),eT=ek?p:ej,eS=ek?T?.prefix||p:ej,eP=(0,r.useCallback)(async()=>{try{let e=await fetch("/api/models/alias"),t=await e.json();e.ok&&Y(t.aliases||{})}catch(e){console.log("Error fetching aliases:",e)}},[]),eR=(0,r.useCallback)(async()=>{if(!ew)try{let e=await fetch(`/api/provider-models?provider=${encodeURIComponent(p)}`,{cache:"no-store"});if(!e.ok)return;let t=await e.json();eh({customModels:t.models||[],modelCompatOverrides:t.modelCompatOverrides||[]})}catch(e){console.error("fetchProviderModelMeta",e)}},[p,ew]),eA=(0,r.useCallback)(async()=>{try{let[e,t]=await Promise.all([fetch("/api/providers",{cache:"no-store"}),fetch("/api/provider-nodes",{cache:"no-store"})]),r=await e.json(),a=await t.json();if(e.ok){let e=(r.connections||[]).filter(e=>e.provider===p);v(e)}if(t.ok){let e=(a.nodes||[]).find(e=>e.id===p)||null;if(!e&&ek)for(let t=0;t<3;t+=1){await new Promise(e=>setTimeout(e,150));let t=await fetch("/api/provider-nodes",{cache:"no-store"});if(t.ok&&(e=((await t.json()).nodes||[]).find(e=>e.id===p)||null))break}R(e)}}catch(e){console.log("Error fetching connections:",e)}finally{w(!1)}},[p,ek]),eI=async e=>{try{let t=await fetch(`/api/provider-nodes/${p}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)}),r=await t.json();t.ok&&(R(r.node),await eA(),q(!1))}catch(e){console.log("Error updating provider node:",e)}};(0,r.useEffect)(()=>{eA(),eP(),fetch("/api/settings/proxy").then(e=>e.ok?e.json():null).then(e=>eo(e)).catch(()=>{})},[eA,eP]),(0,r.useEffect)(()=>{b||ew||eR()},[b,ew,eR]),(0,r.useEffect)(()=>{b||0!==u.length||!ev||ek||er.current||ea.current||(er.current=!0,eb?D(!0):_(!0))},[b]);let eE=async(e,t,r=ej)=>{let a=`${r}/${e}`;try{let e=await fetch("/api/models/alias",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:a,alias:t})});if(e.ok)await eP();else{let t=await e.json();alert(t.error||ee("failedSetAlias"))}}catch(e){console.log("Error setting alias:",e)}},eD=async e=>{try{(await fetch(`/api/models/alias?alias=${encodeURIComponent(e)}`,{method:"DELETE"})).ok&&await eP()}catch(e){console.log("Error deleting alias:",e)}},eO=async e=>{if(confirm(ee("deleteConnectionConfirm")))try{(await fetch(`/api/providers/${e}`,{method:"DELETE"})).ok&&v(u.filter(t=>t.id!==e))}catch(e){console.log("Error deleting connection:",e)}},eM=(0,r.useCallback)(()=>{eA(),D(!1)},[eA]),eU=async e=>{try{let t=await fetch("/api/providers",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:p,...e})});if(t.ok)return await eA(),_(!1),null;let r=await t.json().catch(()=>({}));return r.error?.message||r.error||ee("failedSaveConnection")}catch(e){return console.log("Error saving connection:",e),ee("failedSaveConnectionRetry")}},eL=async e=>{try{let t=await fetch(`/api/providers/${B.id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(t.ok)return await eA(),F(!1),null;let r=await t.json().catch(()=>({}));return r.error?.message||r.error||ee("failedSaveConnection")}catch(e){return console.log("Error updating connection:",e),ee("failedSaveConnectionRetry")}},e$=async(e,t)=>{try{(await fetch(`/api/providers/${e}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({isActive:t})})).ok&&v(r=>r.map(r=>r.id===e?{...r,isActive:t}:r))}catch(e){console.log("Error updating connection status:",e)}},e_=async(e,t)=>{try{(await fetch("/api/rate-limits",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({connectionId:e,enabled:t})})).ok&&v(r=>r.map(r=>r.id===e?{...r,rateLimitProtection:t}:r))}catch(e){console.error("Error toggling rate limit:",e)}},eK=async(e,t,r)=>{try{let a=u.find(t=>t.id===e);if(!a)return;let l=a.providerSpecificData&&"object"==typeof a.providerSpecificData?a.providerSpecificData:{},s=l.codexLimitPolicy&&"object"==typeof l.codexLimitPolicy?l.codexLimitPolicy:{},i={...k(s),[t]:r},o=await fetch(`/api/providers/${e}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({providerSpecificData:{...l,codexLimitPolicy:i}})});if(!o.ok){let e=await o.json().catch(()=>({}));et.error(e.error||"Failed to update Codex limit policy");return}v(t=>t.map(t=>t.id===e?{...t,providerSpecificData:{...t.providerSpecificData||{},codexLimitPolicy:i}}:t)),et.success("Codex limit policy updated")}catch(e){console.error("Error toggling Codex quota policy:",e),et.error("Failed to update Codex limit policy")}},eF=async e=>{if(e&&!W){V(e);try{let t=await fetch(`/api/providers/${e}/test`,{method:"POST"});if(!t.ok){let e=await t.json().catch(()=>({}));alert(e.error||ee("failedRetestConnection"));return}await eA()}catch(e){console.error("Error retesting connection:",e)}finally{V(null)}}},[ez,eq]=(0,r.useState)(null),eB=async e=>{if(!ez){eq(e);try{let t=await fetch(`/api/providers/${e}/refresh`,{method:"POST"}),r=await t.json().catch(()=>({}));t.ok&&r.success?(et.success(ee("tokenRefreshed")),await eA()):et.error(r.error||ee("tokenRefreshFailed"))}catch(e){console.error("Error refreshing token:",e),et.error(ee("tokenRefreshFailed"))}finally{eq(null)}}},eJ=async(e,t)=>{if(e&&t)try{let r=t.priority,a=e.priority;r===a&&(r=u.indexOf(e)>u.indexOf(t)?t.priority-.5:t.priority+.5),await Promise.all([fetch(`/api/providers/${e.id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({priority:r})}),fetch(`/api/providers/${t.id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({priority:a})})]),await eA()}catch(e){console.log("Error swapping priority:",e)}},eW=async()=>{if(en)return;let e=u.find(e=>!1!==e.isActive);if(e){ed(!0),ep(!0),em({current:0,total:0,phase:"fetching",status:ee("fetchingModels"),logs:[],error:"",importedCount:0});try{let t=await fetch(`/api/providers/${e.id}/models`),r=await t.json();if(!t.ok)return void em(e=>({...e,phase:"error",status:ee("failedFetchModels"),error:r.error||ee("failedImportModels")}));let a=r.models||[];if(0===a.length)return void em(e=>({...e,phase:"done",status:ee("noModelsFound"),logs:[ee("noModelsReturnedFromEndpoint")]}));em(e=>({...e,phase:"importing",total:a.length,status:ee("importingModelsProgress",{current:0,total:a.length}),logs:[ee("foundModelsStartingImport",{count:a.length})]}));let l=0;for(let e=0;e<a.length;e++){let t=a[e],r=t.id||t.name||t.model;if(!r)continue;let s=r.split("/"),i=s[s.length-1];em(t=>({...t,current:e+1,status:ee("importingModelsProgress",{current:e+1,total:a.length}),logs:[...t.logs,ee("importingModelById",{modelId:r})]})),await fetch("/api/provider-models",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:p,modelId:r,modelName:t.name||r,source:"imported"})}),H[i]||await eE(r,i,eT),l+=1}await eP(),em(e=>({...e,phase:"done",current:a.length,status:l>0?ee("importSuccessCount",{count:l}):ee("noNewModelsAddedExisting"),logs:[...e.logs,l>0?ee("importDoneCount",{count:l}):ee("noNewModelsAdded")],importedCount:l})),l>0&&setTimeout(()=>{window.location.reload()},2e3)}catch(e){console.log("Error importing models:",e),em(t=>({...t,phase:"error",status:ee("importFailed"),error:e instanceof Error?e.message:ee("unexpectedErrorOccurred")}))}finally{ed(!1)}}},eV=async(e,t)=>{ep(!0),em({current:0,total:0,phase:"fetching",status:ee("fetchingModels"),logs:[],error:"",importedCount:0});try{let r=(await e()).models||[];if(0===r.length)return void em(e=>({...e,phase:"done",status:ee("noModelsFound"),logs:[ee("noModelsReturnedFromEndpoint")]}));em(e=>({...e,phase:"importing",total:r.length,status:ee("importingModelsProgress",{current:0,total:r.length}),logs:[ee("foundModelsStartingImport",{count:r.length})]}));let a=0;for(let e=0;e<r.length;e++){let l=r[e],s=l.id||l.name||l.model;s&&(em(t=>({...t,current:e+1,status:ee("importingModelsProgress",{current:e+1,total:r.length}),logs:[...t.logs,ee("importingModelById",{modelId:s})]})),await t(l)&&(a+=1))}em(e=>({...e,phase:"done",current:r.length,status:a>0?ee("importSuccessCount",{count:a}):ee("noNewModelsAdded"),logs:[...e.logs,a>0?ee("importDoneCount",{count:a}):ee("noNewModelsAdded")],importedCount:a})),a>0&&setTimeout(()=>{window.location.reload()},2e3)}catch(e){console.log("Error importing models:",e),em(t=>({...t,phase:"error",status:ee("importFailed"),error:e instanceof Error?e.message:ee("unexpectedErrorOccurred")}))}},eH=u.some(e=>!1!==e.isActive),eY=e=>{let t=ex.customModels.find(t=>t.id===e);if(t)return!!t.normalizeToolCallId;let r=ex.modelCompatOverrides.find(t=>t.id===e);return!!r?.normalizeToolCallId},eG=e=>{let t=ex.customModels.find(t=>t.id===e);if(t&&Object.prototype.hasOwnProperty.call(t,"preserveOpenAIDeveloperRole"))return!!t.preserveOpenAIDeveloperRole;let r=ex.modelCompatOverrides.find(t=>t.id===e);return!(r&&Object.prototype.hasOwnProperty.call(r,"preserveOpenAIDeveloperRole"))||!!r.preserveOpenAIDeveloperRole},eQ=async(e,t)=>{eg(e);try{let r,a=ex.customModels.find(t=>t.id===e);r=a?{provider:p,modelId:e,modelName:a.name||e,source:a.source||"manual",apiFormat:a.apiFormat||"chat-completions",supportedEndpoints:Array.isArray(a.supportedEndpoints)&&a.supportedEndpoints.length?a.supportedEndpoints:["chat"],normalizeToolCallId:void 0!==t.normalizeToolCallId?t.normalizeToolCallId:!!a.normalizeToolCallId,preserveOpenAIDeveloperRole:void 0!==t.preserveOpenAIDeveloperRole?t.preserveOpenAIDeveloperRole:!Object.prototype.hasOwnProperty.call(a,"preserveOpenAIDeveloperRole")||!!a.preserveOpenAIDeveloperRole}:{provider:p,modelId:e,...t},(await fetch("/api/provider-models",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)})).ok?await eR():et.error(ee("failedSaveCustomModel"))}catch{et.error(ee("failedSaveCustomModel"))}finally{eg(null)}};return b?(0,t.jsxs)("div",{className:"flex flex-col gap-8",children:[(0,t.jsx)(x.CardSkeleton,{}),(0,t.jsx)(x.CardSkeleton,{})]}):ev?(0,t.jsxs)("div",{className:"flex flex-col gap-8",children:[(0,t.jsxs)("div",{children:[(0,t.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,t.jsx)("span",{className:"material-symbols-outlined text-lg",children:"arrow_back"}),ee("backToProviders")]}),(0,t.jsxs)("div",{className:"flex items-center gap-4",children:[(0,t.jsx)("div",{className:"rounded-lg flex items-center justify-center",style:{backgroundColor:`${ev.color}15`},children:G?(0,t.jsx)("span",{className:"text-sm font-bold",style:{color:ev.color},children:ev.textIcon||ev.id.slice(0,2).toUpperCase()}):(0,t.jsx)(o.default,{src:eC&&ev.apiType?"responses"===ev.apiType?"/providers/oai-r.png":"/providers/oai-cc.png":eN?"/providers/anthropic-m.png":`/providers/${ev.id}.png`,alt:ev.name,width:48,height:48,className:"object-contain rounded-lg max-w-[48px] max-h-[48px]",sizes:"48px",onError:()=>Q(!0)})}),(0,t.jsxs)("div",{children:[ev.website?(0,t.jsxs)("a",{href:ev.website,target:"_blank",rel:"noopener noreferrer",className:"text-3xl font-semibold tracking-tight hover:underline inline-flex items-center gap-2",style:{color:ev.color},children:[ev.name,(0,t.jsx)("span",{className:"material-symbols-outlined text-lg opacity-60",children:"open_in_new"})]}):(0,t.jsx)("h1",{className:"text-3xl font-semibold tracking-tight",children:ev.name}),(0,t.jsx)("p",{className:"text-text-muted",children:ee("connectionCountLabel",{count:u.length})})]})]})]}),ek&&T&&(0,t.jsxs)(d.Card,{children:[(0,t.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("h2",{className:"text-lg font-semibold",children:eN?ee("anthropicCompatibleDetails"):ee("openaiCompatibleDetails")}),(0,t.jsxs)("p",{className:"text-sm text-text-muted",children:[eN?ee("messagesApi"):"responses"===T.apiType?ee("responsesApi"):ee("chatCompletions")," ","· ",(T.baseUrl||"").replace(/\/$/,""),"/",eN?ee("messagesPath"):"responses"===T.apiType?ee("responsesPath"):ee("chatCompletionsPath")]})]}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(c.Button,{size:"sm",icon:"add",onClick:()=>_(!0),disabled:u.length>0,children:ee("add")}),(0,t.jsx)(c.Button,{size:"sm",variant:"secondary",icon:"edit",onClick:()=>q(!0),children:ee("edit")}),(0,t.jsx)(c.Button,{size:"sm",variant:"secondary",icon:"delete",onClick:async()=>{if(confirm(ee("deleteCompatibleNodeConfirm",{type:eN?ee("anthropic"):ee("openai")})))try{(await fetch(`/api/provider-nodes/${p}`,{method:"DELETE"})).ok&&l.push("/dashboard/providers")}catch(e){console.log("Error deleting provider node:",e)}},children:ee("delete")})]})]}),u.length>0&&(0,t.jsx)("p",{className:"text-sm text-text-muted",children:ee("singleConnectionPerCompatible")})]}),(0,t.jsxs)(d.Card,{children:[(0,t.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,t.jsxs)("div",{className:"flex items-center gap-3",children:[(0,t.jsx)("h2",{className:"text-lg font-semibold",children:ee("connections")}),(0,t.jsxs)("button",{onClick:()=>es({level:"provider",id:p,label:ev?.name||p}),className:`inline-flex items-center gap-1 px-2 py-1 rounded text-xs font-medium transition-all ${ei?.providers?.[p]?"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:ei?.providers?.[p]?ee("providerProxyTitleConfigured",{host:ei.providers[p].host||ee("configured")}):ee("providerProxyConfigureHint"),children:[(0,t.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"vpn_lock"}),ei?.providers?.[p]&&ei.providers[p].host||ee("providerProxy")]})]}),ek?0===u.length&&(0,t.jsx)(c.Button,{size:"sm",icon:"add",onClick:()=>_(!0),children:ee("add")}):(0,t.jsx)(c.Button,{size:"sm",icon:"add",onClick:()=>eb?D(!0):_(!0),children:ee("add")})]}),0===u.length?(0,t.jsxs)("div",{className:"text-center py-12",children:[(0,t.jsx)("div",{className:"inline-flex items-center justify-center w-16 h-16 rounded-full bg-primary/10 text-primary mb-4",children:(0,t.jsx)("span",{className:"material-symbols-outlined text-[32px]",children:eb?"lock":"key"})}),(0,t.jsx)("p",{className:"text-text-main font-medium mb-1",children:ee("noConnectionsYet")}),(0,t.jsx)("p",{className:"text-sm text-text-muted mb-4",children:ee("addFirstConnectionHint")}),!ek&&(0,t.jsx)(c.Button,{icon:"add",onClick:()=>eb?D(!0):_(!0),children:ee("addConnection")})]}):(0,t.jsx)("div",{className:"flex flex-col divide-y divide-black/[0.03] dark:divide-white/[0.03]",children:u.sort((e,t)=>(e.priority||0)-(t.priority||0)).map((e,r)=>(0,t.jsx)(O,{connection:e,isOAuth:eb,isFirst:0===r,isLast:r===u.length-1,onMoveUp:()=>eJ(e,u[r-1]),onMoveDown:()=>eJ(e,u[r+1]),onToggleActive:t=>e$(e.id,t),onToggleRateLimit:t=>e_(e.id,t),isCodex:"codex"===p,onToggleCodex5h:t=>eK(e.id,"use5h",t),onToggleCodexWeekly:t=>eK(e.id,"useWeekly",t),onRetest:()=>eF(e.id),isRetesting:W===e.id,onEdit:()=>{J(e),F(!0)},onDelete:()=>eO(e.id),onReauth:eb?()=>D(!0):void 0,onRefreshToken:eb?()=>eB(e.id):void 0,isRefreshing:ez===e.id,onProxy:()=>es({level:"key",id:e.id,label:e.name||e.email||e.id}),hasProxy:!!(ei?.keys?.[e.id]||ei?.providers?.[p]||ei?.global),proxySource:ei?.keys?.[e.id]?"key":ei?.providers?.[p]?"provider":ei?.global?"global":null,proxyHost:(ei?.keys?.[e.id]||ei?.providers?.[p]||ei?.global)?.host||null},e.id))})]}),!ew&&(0,t.jsxs)(d.Card,{children:[(0,t.jsx)("h2",{className:"text-lg font-semibold mb-4",children:ee("availableModels")}),(()=>{if(ek)return(0,t.jsx)(I,{providerStorageAlias:eT,providerDisplayAlias:eS,modelAliases:H,copied:X,onCopy:Z,onSetAlias:eE,onDeleteAlias:eD,connections:u,isAnthropic:eN,onImportWithProgress:eV,t:ee,effectiveModelNormalize:eY,effectiveModelPreserveDeveloper:eG,saveModelCompatFlags:eQ,compatSavingModelId:ef,onModelsChanged:eR});if(ev.passthroughModels)return(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"flex items-center gap-2 mb-4",children:[(0,t.jsx)(c.Button,{size:"sm",variant:"secondary",icon:"download",onClick:eW,disabled:!eH||en,children:en?ee("importingModels"):ee("importFromModels")}),!eH&&(0,t.jsx)("span",{className:"text-xs text-text-muted",children:ee("addConnectionToImport")})]}),(0,t.jsx)(P,{providerAlias:ej,modelAliases:H,copied:X,onCopy:Z,onSetAlias:eE,onDeleteAlias:eD,t:ee,effectiveModelNormalize:eY,effectiveModelPreserveDeveloper:eG,saveModelCompatFlags:eQ,compatSavingModelId:ef})]});let e=(0,t.jsxs)("div",{className:"flex items-center gap-2 mb-4",children:[(0,t.jsx)(c.Button,{size:"sm",variant:"secondary",icon:"download",onClick:eW,disabled:!eH||en,children:en?ee("importingModels"):ee("importFromModels")}),!eH&&(0,t.jsx)("span",{className:"text-xs text-text-muted",children:ee("addConnectionToImport")})]});return 0===ey.length?(0,t.jsxs)("div",{children:[e,(0,t.jsx)("p",{className:"text-sm text-text-muted",children:ee("noModelsConfigured")})]}):(0,t.jsxs)("div",{children:[e,(0,t.jsx)("div",{className:"flex flex-wrap gap-3",children:ey.map(e=>{let r=`${eT}/${e.id}`,a=`${p}/${e.id}`,l=Object.entries(H).find(([,e])=>e===r||e===a)?.[0];return(0,t.jsx)(S,{model:e,fullModel:`${eS}/${e.id}`,alias:l,copied:X,onCopy:Z,t:ee,showDeveloperToggle:!0,normalizeToolCallId:eY(e.id),preserveDeveloperRole:eG(e.id),onNormalizeChange:t=>eQ(e.id,{normalizeToolCallId:t}),onPreserveChange:t=>eQ(e.id,{preserveOpenAIDeveloperRole:t}),compatDisabled:ef===e.id},e.id)})})]})})(),!ek&&(0,t.jsx)(A,{providerId:p,providerAlias:eS,copied:X,onCopy:Z,onModelsChanged:eR})]}),ew&&(0,t.jsxs)(d.Card,{children:[(0,t.jsx)("h2",{className:"text-lg font-semibold mb-4",children:ee("searchProvider")||"Search Provider"}),(0,t.jsx)("p",{className:"text-sm text-text-muted",children:ee("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"===p&&(0,t.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,t.jsx)("span",{className:"material-symbols-outlined text-sm text-blue-400",children:"link"}),(0,t.jsxs)("p",{className:"text-xs text-blue-300",children:["Uses the same API key as ",(0,t.jsx)("strong",{children:"Perplexity"})," (chat provider). If you already have Perplexity configured, no additional setup is needed."]})]})]}),"kiro"===p?(0,t.jsx)(f.default,{isOpen:E,providerInfo:ev,onSuccess:eM,onClose:()=>{ea.current=!0,D(!1)}}):"cursor"===p?(0,t.jsx)(g.default,{isOpen:E,onSuccess:eM,onClose:()=>{ea.current=!0,D(!1)}}):(0,t.jsx)(h.default,{isOpen:E,provider:p,providerInfo:ev,onSuccess:eM,onClose:()=>{ea.current=!0,D(!1)}}),(0,t.jsx)(M,{isOpen:U,provider:p,providerName:ev.name,isCompatible:ek,isAnthropic:eN,onSave:eU,onClose:()=>_(!1)}),(0,t.jsx)(L,{isOpen:K,connection:B,onSave:eL,onClose:()=>F(!1)}),ek&&(0,t.jsx)($,{isOpen:z,node:T,onSave:eI,onClose:()=>q(!1),isAnthropic:eN}),el&&(0,t.jsx)(y.ProxyConfigModal,{isOpen:!!el,onClose:()=>es(null),level:el.level,levelId:el.id,levelLabel:el.label}),(0,t.jsx)(m.Modal,{isOpen:ec,onClose:()=>{("done"===eu.phase||"error"===eu.phase)&&ep(!1)},title:ee("importingModelsTitle"),size:"md",closeOnOverlay:!1,showCloseButton:"done"===eu.phase||"error"===eu.phase,children:(0,t.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,t.jsxs)("div",{className:"flex items-center gap-3",children:["fetching"===eu.phase&&(0,t.jsx)("span",{className:"material-symbols-outlined text-primary animate-spin",children:"progress_activity"}),"importing"===eu.phase&&(0,t.jsx)("span",{className:"material-symbols-outlined text-primary animate-spin",children:"progress_activity"}),"done"===eu.phase&&(0,t.jsx)("span",{className:"material-symbols-outlined text-green-500",children:"check_circle"}),"error"===eu.phase&&(0,t.jsx)("span",{className:"material-symbols-outlined text-red-500",children:"error"}),(0,t.jsx)("span",{className:"text-sm font-medium text-text-main",children:eu.status})]}),("importing"===eu.phase||"done"===eu.phase)&&eu.total>0&&(0,t.jsxs)("div",{className:"w-full",children:[(0,t.jsxs)("div",{className:"flex items-center justify-between mb-1",children:[(0,t.jsxs)("span",{className:"text-xs text-text-muted",children:[eu.current," / ",eu.total]}),(0,t.jsxs)("span",{className:"text-xs text-text-muted",children:[Math.round(eu.current/eu.total*100),"%"]})]}),(0,t.jsx)("div",{className:"w-full h-2.5 bg-black/10 dark:bg-white/10 rounded-full overflow-hidden",children:(0,t.jsx)("div",{className:"h-full rounded-full transition-all duration-300 ease-out",style:{width:`${eu.current/eu.total*100}%`,background:"done"===eu.phase?"linear-gradient(90deg, #22c55e, #16a34a)":"linear-gradient(90deg, var(--color-primary), var(--color-primary-hover, var(--color-primary)))"}})})]}),"fetching"===eu.phase&&(0,t.jsx)("div",{className:"w-full h-2.5 bg-black/10 dark:bg-white/10 rounded-full overflow-hidden",children:(0,t.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"===eu.phase&&eu.error&&(0,t.jsx)("div",{className:"p-3 rounded-lg bg-red-500/10 border border-red-500/20",children:(0,t.jsx)("p",{className:"text-sm text-red-400",children:eu.error})}),eu.logs.length>0&&(0,t.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,t.jsx)("div",{className:"flex flex-col gap-1",children:eu.logs.map((e,r)=>(0,t.jsx)("p",{className:`text-xs font-mono ${e.startsWith("✓")?"text-green-500 font-semibold":"text-text-muted"}`,children:e},r))})}),"done"===eu.phase&&eu.importedCount>0&&(0,t.jsx)("p",{className:"text-xs text-text-muted text-center animate-pulse",children:ee("pageAutoRefresh")})]})})]}):(0,t.jsxs)("div",{className:"text-center py-20",children:[(0,t.jsx)("p",{className:"text-text-muted",children:ee("providerNotFound")}),(0,t.jsx)(i.default,{href:"/dashboard/providers",className:"text-primary mt-4 inline-block",children:ee("backToProviders")})]})}function S({model:e,fullModel:r,alias:a,copied:l,onCopy:s,t:i,showDeveloperToggle:o=!0,normalizeToolCallId:n,preserveDeveloperRole:d,onNormalizeChange:c,onPreserveChange:p,compatDisabled:u}){return(0,t.jsxs)("div",{className:"flex flex-col px-3 py-2 rounded-lg border border-border hover:bg-sidebar/50 min-w-[220px] max-w-md",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2 flex-wrap",children:[(0,t.jsx)("span",{className:"material-symbols-outlined text-base text-text-muted shrink-0",children:"smart_toy"}),(0,t.jsx)("code",{className:"text-xs text-text-muted font-mono bg-sidebar px-1.5 py-0.5 rounded",children:r}),(0,t.jsx)("button",{onClick:()=>s(r,`model-${e.id}`),className:"p-0.5 hover:bg-sidebar rounded text-text-muted hover:text-primary",title:i("copyModel"),children:(0,t.jsx)("span",{className:"material-symbols-outlined text-sm",children:l===`model-${e.id}`?"check":"content_copy"})})]}),(0,t.jsx)(w,{t:i,normalizeToolCallId:!!n,preserveDeveloperRole:d,showDeveloperToggle:o,onNormalizeChange:c,onPreserveChange:p,disabled:u})]})}function P({providerAlias:e,modelAliases:a,copied:l,onCopy:s,onSetAlias:i,onDeleteAlias:o,t:n,effectiveModelNormalize:d,effectiveModelPreserveDeveloper:p,saveModelCompatFlags:u,compatSavingModelId:m}){let[x,h]=(0,r.useState)(""),[f,g]=(0,r.useState)(!1),v=Object.entries(a).filter(([,t])=>t.startsWith(`${e}/`)).map(([t,r])=>({modelId:r.replace(`${e}/`,""),fullModel:r,alias:t})),b=async()=>{let e;if(!x.trim()||f)return;let t=x.trim(),r=(e=t.split("/"))[e.length-1];if(a[r])return void alert(n("aliasExistsAlert",{alias:r}));g(!0);try{await i(t,r),h("")}catch(e){console.log("Error adding model:",e)}finally{g(!1)}};return(0,t.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,t.jsx)("p",{className:"text-sm text-text-muted",children:n("openRouterAnyModelHint")}),(0,t.jsxs)("div",{className:"flex items-end gap-2",children:[(0,t.jsxs)("div",{className:"flex-1",children:[(0,t.jsx)("label",{htmlFor:"new-model-input",className:"text-xs text-text-muted mb-1 block",children:n("modelIdFromOpenRouter")}),(0,t.jsx)("input",{id:"new-model-input",type:"text",value:x,onChange:e=>h(e.target.value),onKeyDown:e=>"Enter"===e.key&&b(),placeholder:n("openRouterModelPlaceholder"),className:"w-full px-3 py-2 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary"})]}),(0,t.jsx)(c.Button,{size:"sm",icon:"add",onClick:b,disabled:!x.trim()||f,children:f?n("adding"):n("add")})]}),v.length>0&&(0,t.jsx)("div",{className:"flex flex-col gap-3",children:v.map(({modelId:e,fullModel:r,alias:a})=>(0,t.jsx)(R,{modelId:e,fullModel:r,copied:l,onCopy:s,onDeleteAlias:()=>o(a),t:n,showDeveloperToggle:!0,normalizeToolCallId:d(e),preserveDeveloperRole:p(e),onNormalizeChange:t=>u(e,{normalizeToolCallId:t}),onPreserveChange:t=>u(e,{preserveOpenAIDeveloperRole:t}),compatDisabled:m===e},r))})]})}function R({modelId:e,fullModel:r,copied:a,onCopy:l,onDeleteAlias:s,t:i,showDeveloperToggle:o=!0,normalizeToolCallId:n,preserveDeveloperRole:d,onNormalizeChange:c,onPreserveChange:p,compatDisabled:u}){return(0,t.jsxs)("div",{className:"flex flex-col gap-0 p-3 rounded-lg border border-border hover:bg-sidebar/50",children:[(0,t.jsxs)("div",{className:"flex items-start gap-3",children:[(0,t.jsx)("span",{className:"material-symbols-outlined text-base text-text-muted shrink-0",children:"smart_toy"}),(0,t.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,t.jsx)("p",{className:"text-sm font-medium truncate",children:e}),(0,t.jsxs)("div",{className:"flex items-center gap-1 mt-1 flex-wrap",children:[(0,t.jsx)("code",{className:"text-xs text-text-muted font-mono bg-sidebar px-1.5 py-0.5 rounded",children:r}),(0,t.jsx)("button",{onClick:()=>l(r,`model-${e}`),className:"p-0.5 hover:bg-sidebar rounded text-text-muted hover:text-primary",title:i("copyModel"),children:(0,t.jsx)("span",{className:"material-symbols-outlined text-sm",children:a===`model-${e}`?"check":"content_copy"})})]})]}),(0,t.jsx)("button",{onClick:s,className:"p-1 hover:bg-red-50 rounded text-red-500 shrink-0",title:i("removeModel"),children:(0,t.jsx)("span",{className:"material-symbols-outlined text-sm",children:"delete"})})]}),(0,t.jsx)("div",{className:"pl-9",children:(0,t.jsx)(w,{t:i,normalizeToolCallId:!!n,preserveDeveloperRole:d,showDeveloperToggle:o,onNormalizeChange:c,onPreserveChange:p,disabled:u})})]})}function A({providerId:e,providerAlias:l,copied:s,onCopy:i,onModelsChanged:o}){let d=(0,n.useTranslations)("providers"),p=(0,a.useNotificationStore)(),[u,m]=(0,r.useState)([]),[x,h]=(0,r.useState)(""),[f,g]=(0,r.useState)(""),[v,b]=(0,r.useState)("chat-completions"),[y,j]=(0,r.useState)(["chat"]),[C,N]=(0,r.useState)(!1),[k,T]=(0,r.useState)(!0),[S,P]=(0,r.useState)(null),[R,A]=(0,r.useState)("chat-completions"),[I,E]=(0,r.useState)(["chat"]),[D,O]=(0,r.useState)(!1),[M,U]=(0,r.useState)(!1),[L,$]=(0,r.useState)(null),_=(0,r.useCallback)(async()=>{try{let t=await fetch(`/api/provider-models?provider=${encodeURIComponent(e)}`);if(t.ok){let e=await t.json();m(e.models||[])}}catch(e){console.error("Failed to fetch custom models:",e)}finally{T(!1)}},[e]);(0,r.useEffect)(()=>{_()},[_]);let K=async()=>{if(x.trim()&&!C){N(!0);try{(await fetch("/api/provider-models",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:e,modelId:x.trim(),modelName:f.trim()||void 0,apiFormat:v,supportedEndpoints:y})})).ok&&(h(""),g(""),b("chat-completions"),j(["chat"]),await _(),o?.())}catch(e){console.error("Failed to add custom model:",e)}finally{N(!1)}}},F=async t=>{try{await fetch(`/api/provider-models?provider=${encodeURIComponent(e)}&model=${encodeURIComponent(t)}`,{method:"DELETE"}),await _(),o?.()}catch(e){console.error("Failed to remove custom model:",e)}},z=()=>{P(null),A("chat-completions"),E(["chat"]),O(!1),U(!0),$(null)},q=async t=>{if(S&&S===t){if(!I.length)return void p.error("Select at least one supported endpoint");$(t);try{let r=u.find(e=>e.id===t);if(!(await fetch("/api/provider-models",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:e,modelId:t,modelName:r?.name||t,source:r?.source||"manual",apiFormat:R,supportedEndpoints:I,normalizeToolCallId:D,preserveOpenAIDeveloperRole:M})})).ok)throw Error("Failed to save model endpoint settings");await _(),o?.(),p.success("Saved model endpoint settings"),z()}catch(e){console.error("Failed to save custom model:",e),p.error("Failed to save model endpoint settings")}finally{$(null)}}};return(0,t.jsxs)("div",{className:"mt-6 pt-6 border-t border-border",children:[(0,t.jsxs)("h3",{className:"text-sm font-semibold mb-3 flex items-center gap-2",children:[(0,t.jsx)("span",{className:"material-symbols-outlined text-base text-primary",children:"tune"}),d("customModels")]}),(0,t.jsx)("p",{className:"text-xs text-text-muted mb-3",children:d("customModelsHint")}),(0,t.jsxs)("div",{className:"flex flex-col gap-3 mb-3",children:[(0,t.jsxs)("div",{className:"flex items-end gap-2",children:[(0,t.jsxs)("div",{className:"flex-1",children:[(0,t.jsx)("label",{htmlFor:"custom-model-id",className:"text-xs text-text-muted mb-1 block",children:d("modelId")}),(0,t.jsx)("input",{id:"custom-model-id",type:"text",value:x,onChange:e=>h(e.target.value),onKeyDown:e=>"Enter"===e.key&&K(),placeholder:d("customModelPlaceholder"),className:"w-full px-3 py-2 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary"})]}),(0,t.jsxs)("div",{className:"w-40",children:[(0,t.jsx)("label",{htmlFor:"custom-model-name",className:"text-xs text-text-muted mb-1 block",children:d("displayName")}),(0,t.jsx)("input",{id:"custom-model-name",type:"text",value:f,onChange:e=>g(e.target.value),onKeyDown:e=>"Enter"===e.key&&K(),placeholder:d("optional"),className:"w-full px-3 py-2 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary"})]}),(0,t.jsx)(c.Button,{size:"sm",icon:"add",onClick:K,disabled:!x.trim()||C,children:C?d("adding"):d("add")})]}),(0,t.jsxs)("div",{className:"flex items-end gap-4 flex-wrap",children:[(0,t.jsxs)("div",{className:"w-48",children:[(0,t.jsx)("label",{htmlFor:"custom-api-format",className:"text-xs text-text-muted mb-1 block",children:"API Format"}),(0,t.jsxs)("select",{id:"custom-api-format",value:v,onChange:e=>b(e.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,t.jsx)("option",{value:"chat-completions",children:"Chat Completions"}),(0,t.jsx)("option",{value:"responses",children:"Responses API"})]})]}),(0,t.jsxs)("div",{className:"flex-1",children:[(0,t.jsx)("span",{className:"text-xs text-text-muted mb-1 block",children:"Supported Endpoints"}),(0,t.jsx)("div",{className:"flex items-center gap-3",children:["chat","embeddings","images","audio"].map(e=>(0,t.jsxs)("label",{className:"flex items-center gap-1.5 text-xs text-text-main cursor-pointer",children:[(0,t.jsx)("input",{type:"checkbox",checked:y.includes(e),onChange:t=>{t.target.checked?j(t=>[...t,e]):j(t=>t.filter(t=>t!==e))},className:"rounded border-border"}),"chat"===e?"💬 Chat":"embeddings"===e?"📐 Embeddings":"images"===e?"🖼️ Images":"🔊 Audio"]},e))})]})]})]}),k?(0,t.jsx)("p",{className:"text-xs text-text-muted",children:d("loading")}):u.length>0?(0,t.jsx)("div",{className:"flex flex-col gap-2",children:u.map(e=>{let r=`${l}/${e.id}`,a=`custom-${e.id}`;return(0,t.jsxs)("div",{className:"flex items-center gap-3 p-3 rounded-lg border border-border hover:bg-sidebar/50",children:[(0,t.jsx)("span",{className:"material-symbols-outlined text-base text-primary",children:"tune"}),(0,t.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,t.jsx)("p",{className:"text-sm font-medium truncate",children:e.name||e.id}),(0,t.jsxs)("div",{className:"flex items-center gap-1 mt-1 flex-wrap",children:[(0,t.jsx)("code",{className:"text-xs text-text-muted font-mono bg-sidebar px-1.5 py-0.5 rounded",children:r}),(0,t.jsx)("button",{onClick:()=>i(r,a),className:"p-0.5 hover:bg-sidebar rounded text-text-muted hover:text-primary",title:d("copyModel"),children:(0,t.jsx)("span",{className:"material-symbols-outlined text-sm",children:s===a?"check":"content_copy"})}),"responses"===e.apiFormat&&(0,t.jsx)("span",{className:"text-[10px] px-1.5 py-0.5 rounded-full bg-blue-500/15 text-blue-400 font-medium",children:"Responses"}),e.supportedEndpoints?.includes("embeddings")&&(0,t.jsx)("span",{className:"text-[10px] px-1.5 py-0.5 rounded-full bg-purple-500/15 text-purple-400 font-medium",children:"📐 Embed"}),e.supportedEndpoints?.includes("images")&&(0,t.jsx)("span",{className:"text-[10px] px-1.5 py-0.5 rounded-full bg-amber-500/15 text-amber-400 font-medium",children:"🖼️ Images"}),e.supportedEndpoints?.includes("audio")&&(0,t.jsx)("span",{className:"text-[10px] px-1.5 py-0.5 rounded-full bg-green-500/15 text-green-400 font-medium",children:"🔊 Audio"}),e.normalizeToolCallId&&(0,t.jsx)("span",{className:"text-[10px] px-1.5 py-0.5 rounded-full bg-slate-500/15 text-slate-400 font-medium",title:d("normalizeToolCallIdLabel"),children:"ID×9"}),!1===e.preserveOpenAIDeveloperRole&&(0,t.jsx)("span",{className:"text-[10px] px-1.5 py-0.5 rounded-full bg-cyan-500/15 text-cyan-400 font-medium",title:d("compatDoNotPreserveDeveloper"),children:d("compatBadgeNoPreserve")})]}),S===e.id&&(0,t.jsxs)("div",{className:"mt-3 p-3 rounded-lg border border-border bg-sidebar/40",children:[(0,t.jsxs)("div",{className:"flex items-end gap-3 flex-wrap",children:[(0,t.jsxs)("div",{className:"w-44",children:[(0,t.jsx)("label",{className:"text-xs text-text-muted mb-1 block",children:"API Format"}),(0,t.jsxs)("select",{value:R,onChange:e=>A(e.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,t.jsx)("option",{value:"chat-completions",children:"Chat Completions"}),(0,t.jsx)("option",{value:"responses",children:"Responses API"})]})]}),(0,t.jsxs)("div",{className:"flex-1 min-w-[240px]",children:[(0,t.jsx)("span",{className:"text-xs text-text-muted mb-1 block",children:"Supported Endpoints"}),(0,t.jsx)("div",{className:"flex items-center gap-3 flex-wrap",children:["chat","embeddings","images","audio"].map(e=>(0,t.jsxs)("label",{className:"flex items-center gap-1.5 text-xs text-text-main cursor-pointer",children:[(0,t.jsx)("input",{type:"checkbox",checked:I.includes(e),onChange:t=>{t.target.checked?E(t=>t.includes(e)?t:[...t,e]):E(t=>t.filter(t=>t!==e))},className:"rounded border-border"}),"chat"===e?"💬 Chat":"embeddings"===e?"📐 Embeddings":"images"===e?"🖼️ Images":"🔊 Audio"]},e))})]})]}),(0,t.jsx)("div",{className:"mt-3 pt-3 border-t border-border/80 w-full",children:(0,t.jsx)(w,{t:d,normalizeToolCallId:D,preserveDeveloperRole:M,showDeveloperToggle:!0,onNormalizeChange:O,onPreserveChange:U,disabled:L===e.id})}),(0,t.jsxs)("div",{className:"mt-3 flex items-center gap-2",children:[(0,t.jsx)(c.Button,{size:"sm",onClick:()=>q(e.id),disabled:L===e.id,children:L===e.id?d("saving"):d("save")}),(0,t.jsx)(c.Button,{size:"sm",variant:"ghost",onClick:z,children:d("cancel")})]})]})]}),(0,t.jsxs)("div",{className:"flex items-center gap-1",children:[(0,t.jsx)("button",{onClick:()=>{P(e.id),A(e.apiFormat||"chat-completions"),E(Array.isArray(e.supportedEndpoints)&&e.supportedEndpoints.length?e.supportedEndpoints:["chat"]),O(!!e.normalizeToolCallId),U(!Object.prototype.hasOwnProperty.call(e,"preserveOpenAIDeveloperRole")||!!e.preserveOpenAIDeveloperRole)},className:"p-1 hover:bg-sidebar rounded text-text-muted hover:text-primary",title:d("edit"),children:(0,t.jsx)("span",{className:"material-symbols-outlined text-sm",children:"edit"})}),(0,t.jsx)("button",{onClick:()=>F(e.id),className:"p-1 hover:bg-red-50 rounded text-red-500",title:d("removeCustomModel"),children:(0,t.jsx)("span",{className:"material-symbols-outlined text-sm",children:"delete"})})]})]},e.id)})}):(0,t.jsx)("p",{className:"text-xs text-text-muted",children:d("noCustomModels")})]})}function I({providerStorageAlias:e,providerDisplayAlias:l,modelAliases:s,copied:i,onCopy:o,onSetAlias:n,onDeleteAlias:d,connections:p,isAnthropic:u,onImportWithProgress:m,t:x,effectiveModelNormalize:h,effectiveModelPreserveDeveloper:f,saveModelCompatFlags:g,compatSavingModelId:v,onModelsChanged:b}){let[y,j]=(0,r.useState)(""),[C,N]=(0,r.useState)(!1),[k,w]=(0,r.useState)(!1),T=(0,a.useNotificationStore)(),S=Object.entries(s).filter(([,t])=>t.startsWith(`${e}/`)).map(([t,r])=>({modelId:r.replace(`${e}/`,""),fullModel:r,alias:t})),P=e=>{let t,r=(t=e.split("/"))[t.length-1];if(!s[r])return r;let a=`${l}-${r}`;return s[a]?null:a},A=async()=>{if(!y.trim()||C)return;let t=y.trim(),r=P(t);if(!r)return void T.error(x("allSuggestedAliasesExist"));N(!0);try{let a=await fetch("/api/provider-models",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:e,modelId:t,modelName:t,source:"manual"})});if(!a.ok){let e={};try{e=await a.json()}catch(e){console.error("Failed to parse error response from custom model API:",e)}throw Error(e.error?.message||x("failedSaveCustomModel"))}await n(t,r,e),j(""),T.success(x("modelAddedSuccess",{modelId:t})),b?.()}catch(e){console.error("Error adding model:",e),T.error(e instanceof Error?e.message:x("failedAddModelTryAgain"))}finally{N(!1)}},I=async()=>{if(k)return;let t=p.find(e=>!1!==e.isActive);if(t){w(!0);try{await m(async()=>{let e=await fetch(`/api/providers/${t.id}/models`),r=await e.json();if(!e.ok)throw Error(r.error||x("failedImportModels"));return r},async t=>{let r=t.id||t.name||t.model;if(!r)return!1;let a=P(r);return!!a&&((await fetch("/api/provider-models",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:e,modelId:r,modelName:t.name||r,source:"imported"})})).ok?(await n(r,a,e),!0):(T.error(x("failedSaveImportedModel")),!1))})}catch(e){console.error("Error importing models:",e),T.error(x("failedImportModelsTryAgain"))}finally{w(!1)}}},E=p.some(e=>!1!==e.isActive),D=async(t,r)=>{try{if(!(await fetch(`/api/provider-models?provider=${encodeURIComponent(e)}&model=${encodeURIComponent(t)}`,{method:"DELETE"})).ok)throw Error(x("failedRemoveModelFromDatabase"));await d(r),T.success(x("modelRemovedSuccess")),b?.()}catch(e){console.error("Error deleting model:",e),T.error(e instanceof Error?e.message:x("failedDeleteModelTryAgain"))}};return(0,t.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,t.jsx)("p",{className:"text-sm text-text-muted",children:x("compatibleModelsDescription",{type:u?x("anthropic"):x("openai")})}),(0,t.jsxs)("div",{className:"flex items-end gap-2 flex-wrap",children:[(0,t.jsxs)("div",{className:"flex-1 min-w-[240px]",children:[(0,t.jsx)("label",{htmlFor:"new-compatible-model-input",className:"text-xs text-text-muted mb-1 block",children:x("modelId")}),(0,t.jsx)("input",{id:"new-compatible-model-input",type:"text",value:y,onChange:e=>j(e.target.value),onKeyDown:e=>"Enter"===e.key&&A(),placeholder:u?x("anthropicCompatibleModelPlaceholder"):x("openaiCompatibleModelPlaceholder"),className:"w-full px-3 py-2 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary"})]}),(0,t.jsx)(c.Button,{size:"sm",icon:"add",onClick:A,disabled:!y.trim()||C,children:C?x("adding"):x("add")}),(0,t.jsx)(c.Button,{size:"sm",variant:"secondary",icon:"download",onClick:I,disabled:!E||k,children:k?x("importingModels"):x("importFromModels")})]}),!E&&(0,t.jsx)("p",{className:"text-xs text-text-muted",children:x("addConnectionToImport")}),S.length>0&&(0,t.jsx)("div",{className:"flex flex-col gap-3",children:S.map(({modelId:e,fullModel:r,alias:a})=>(0,t.jsx)(R,{modelId:e,fullModel:`${l}/${e}`,copied:i,onCopy:o,onDeleteAlias:()=>D(e,a),t:x,showDeveloperToggle:!u,normalizeToolCallId:h(e),preserveDeveloperRole:f(e),onNormalizeChange:t=>g(e,{normalizeToolCallId:t}),onPreserveChange:t=>g(e,{preserveOpenAIDeveloperRole:t}),compatDisabled:v===e},r))})]})}function E({until:e}){let[a,l]=(0,r.useState)("");return((0,r.useEffect)(()=>{let t=()=>{let t=new Date(e).getTime()-Date.now();if(t<=0)return void l("");let r=Math.floor(t/1e3);if(r<60)l(`${r}s`);else if(r<3600)l(`${Math.floor(r/60)}m ${r%60}s`);else{let e=Math.floor(r/3600),t=Math.floor(r%3600/60);l(`${e}h ${t}m`)}};t();let r=setInterval(t,1e3);return()=>clearInterval(r)},[e]),a)?(0,t.jsxs)("span",{className:"text-xs text-orange-500 font-mono",children:["⏱ ",a]}):null}S.propTypes={model:l.default.shape({id:l.default.string.isRequired}).isRequired,fullModel:l.default.string.isRequired,alias:l.default.string,copied:l.default.string,onCopy:l.default.func.isRequired,t:l.default.func,showDeveloperToggle:l.default.bool,normalizeToolCallId:l.default.bool,preserveDeveloperRole:l.default.bool,onNormalizeChange:l.default.func,onPreserveChange:l.default.func,compatDisabled:l.default.bool},P.propTypes={providerAlias:l.default.string.isRequired,modelAliases:l.default.object.isRequired,copied:l.default.string,onCopy:l.default.func.isRequired,onSetAlias:l.default.func.isRequired,onDeleteAlias:l.default.func.isRequired,t:l.default.func.isRequired,effectiveModelNormalize:l.default.func.isRequired,effectiveModelPreserveDeveloper:l.default.func.isRequired,saveModelCompatFlags:l.default.func.isRequired,compatSavingModelId:l.default.string},R.propTypes={modelId:l.default.string.isRequired,fullModel:l.default.string.isRequired,copied:l.default.string,onCopy:l.default.func.isRequired,onDeleteAlias:l.default.func.isRequired,t:l.default.func,showDeveloperToggle:l.default.bool,normalizeToolCallId:l.default.bool,preserveDeveloperRole:l.default.bool,onNormalizeChange:l.default.func,onPreserveChange:l.default.func,compatDisabled:l.default.bool},A.propTypes={providerId:l.default.string.isRequired,providerAlias:l.default.string.isRequired,copied:l.default.string,onCopy:l.default.func.isRequired,onModelsChanged:l.default.func},I.propTypes={providerStorageAlias:l.default.string.isRequired,providerDisplayAlias:l.default.string.isRequired,modelAliases:l.default.object.isRequired,copied:l.default.string,onCopy:l.default.func.isRequired,onSetAlias:l.default.func.isRequired,onDeleteAlias:l.default.func.isRequired,connections:l.default.arrayOf(l.default.shape({id:l.default.string,isActive:l.default.bool})).isRequired,isAnthropic:l.default.bool,onImportWithProgress:l.default.func.isRequired,t:l.default.func.isRequired,effectiveModelNormalize:l.default.func.isRequired,effectiveModelPreserveDeveloper:l.default.func.isRequired,saveModelCompatFlags:l.default.func.isRequired,compatSavingModelId:l.default.string,onModelsChanged:l.default.func},E.propTypes={until:l.default.string.isRequired};let D={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 O({connection:e,isOAuth:a,isCodex:l,isFirst:s,isLast:i,onMoveUp:o,onMoveDown:d,onToggleActive:u,onToggleRateLimit:m,onToggleCodex5h:x,onToggleCodexWeekly:h,onRetest:f,isRetesting:g,onEdit:b,onDelete:y,onReauth:j,onProxy:C,hasProxy:N,proxySource:w,proxyHost:T,onRefreshToken:S,isRefreshing:P}){let R,A=(0,n.useTranslations)("providers"),I=a?e.name||e.email||e.displayName||A("oauthAccount"):e.name,[O,M]=(0,r.useState)(!1),[U,L]=(0,r.useState)(()=>a&&e.expiresAt?Math.floor((new Date(e.expiresAt).getTime()-Date.now())/6e4):null);(0,r.useEffect)(()=>{if(!a||!e.expiresAt)return;let t=setInterval(()=>{L(Math.floor((new Date(e.expiresAt).getTime()-Date.now())/6e4))},3e4);return()=>clearInterval(t)},[a,e.expiresAt]),(0,r.useEffect)(()=>{let t=()=>{M(e.rateLimitedUntil&&new Date(e.rateLimitedUntil).getTime()>Date.now())};t();let r=e.rateLimitedUntil?setInterval(t,1e3):null;return()=>{r&&clearInterval(r)}},[e.rateLimitedUntil]);let $="unavailable"!==e.testStatus||O?e.testStatus:"active",_=function(e,t,r,a){if(!1===e.isActive)return{statusVariant:"default",statusLabel:a("statusDisabled"),errorType:null,errorBadge:null,errorTextClass:"text-text-muted"};if("active"===t||"success"===t)return{statusVariant:"success",statusLabel:a("statusConnected"),errorType:null,errorBadge:null,errorTextClass:"text-text-muted"};let l=function(e,t){if(t)return"upstream_rate_limited";if(e.lastErrorType)return e.lastErrorType;let r=Number(e.errorCode);if(401===r||403===r)return"upstream_auth_error";if(429===r)return"upstream_rate_limited";if(r>=500)return"upstream_unavailable";let a=(e.lastError||"").toLowerCase();return a?a.includes("runtime")||a.includes("not runnable")||a.includes("not installed")||a.includes("healthcheck")?"runtime_error":a.includes("refresh failed")?"token_refresh_failed":a.includes("token expired")||a.includes("expired")?"token_expired":a.includes("invalid api key")||a.includes("token invalid")||a.includes("revoked")||a.includes("access denied")||a.includes("unauthorized")?"upstream_auth_error":a.includes("rate limit")||a.includes("quota")||a.includes("too many requests")||a.includes("429")?"upstream_rate_limited":a.includes("fetch failed")||a.includes("network")||a.includes("timeout")||a.includes("econn")||a.includes("enotfound")?"network_error":a.includes("not supported")?"unsupported":"upstream_error":null}(e,r),s=l&&D[l]||null;return"runtime_error"===l?{statusVariant:"warning",statusLabel:a("statusRuntimeIssue"),errorType:l,errorBadge:s,errorTextClass:"text-yellow-600 dark:text-yellow-400"}:"upstream_auth_error"===l||"auth_missing"===l||"token_refresh_failed"===l||"token_expired"===l?{statusVariant:"error",statusLabel:a("statusAuthFailed"),errorType:l,errorBadge:s,errorTextClass:"text-red-500"}:"upstream_rate_limited"===l?{statusVariant:"warning",statusLabel:a("statusRateLimited"),errorType:l,errorBadge:s,errorTextClass:"text-yellow-600 dark:text-yellow-400"}:"network_error"===l?{statusVariant:"warning",statusLabel:a("statusNetworkIssue"),errorType:l,errorBadge:s,errorTextClass:"text-yellow-600 dark:text-yellow-400"}:"unsupported"===l?{statusVariant:"default",statusLabel:a("statusTestUnsupported"),errorType:l,errorBadge:s,errorTextClass:"text-text-muted"}:{statusVariant:"error",statusLabel:({unavailable:a("statusUnavailable"),failed:a("statusFailed"),error:a("statusError")})[t]||t||a("statusError"),errorType:l,errorBadge:s,errorTextClass:"text-red-500"}}(e,$,O,A),K=!!e.rateLimitProtection,F=k(e.providerSpecificData&&"object"==typeof e.providerSpecificData&&e.providerSpecificData.codexLimitPolicy&&"object"==typeof e.providerSpecificData.codexLimitPolicy?e.providerSpecificData.codexLimitPolicy:{}),z=F.use5h,q=F.useWeekly;return(0,t.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===e.isActive?"opacity-60":""}`,children:[(0,t.jsxs)("div",{className:"flex items-center gap-3 flex-1 min-w-0",children:[(0,t.jsxs)("div",{className:"flex flex-col",children:[(0,t.jsx)("button",{onClick:o,disabled:s,className:`p-0.5 rounded ${s?"text-text-muted/30 cursor-not-allowed":"hover:bg-sidebar text-text-muted hover:text-primary"}`,children:(0,t.jsx)("span",{className:"material-symbols-outlined text-sm",children:"keyboard_arrow_up"})}),(0,t.jsx)("button",{onClick:d,disabled:i,className:`p-0.5 rounded ${i?"text-text-muted/30 cursor-not-allowed":"hover:bg-sidebar text-text-muted hover:text-primary"}`,children:(0,t.jsx)("span",{className:"material-symbols-outlined text-sm",children:"keyboard_arrow_down"})})]}),(0,t.jsx)("span",{className:"material-symbols-outlined text-base text-text-muted",children:a?"lock":"key"}),(0,t.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,t.jsx)("p",{className:"text-sm font-medium truncate",children:I}),(0,t.jsxs)("div",{className:"flex items-center gap-2 mt-1 flex-wrap",children:[(0,t.jsx)(p.Badge,{variant:_.statusVariant,size:"sm",dot:!0,children:_.statusLabel}),null!==U&&(U<0?(0,t.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: ${e.expiresAt}`,children:[(0,t.jsx)("span",{className:"material-symbols-outlined text-[11px]",children:"error"}),"expired"]}):U<30?(0,t.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 ${U}m`,children:[(0,t.jsx)("span",{className:"material-symbols-outlined text-[11px]",children:"warning"}),`~${U}m`]}):null),O&&!1!==e.isActive&&(0,t.jsx)(E,{until:e.rateLimitedUntil}),_.errorBadge&&!1!==e.isActive&&(0,t.jsx)(p.Badge,{variant:_.errorBadge.variant,size:"sm",children:A(_.errorBadge.labelKey)}),e.lastError&&!1!==e.isActive&&(0,t.jsx)("span",{className:`text-xs truncate max-w-[300px] ${_.errorTextClass}`,title:e.lastError,children:e.lastError}),(0,t.jsxs)("span",{className:"text-xs text-text-muted",children:["#",e.priority]}),e.globalPriority&&(0,t.jsx)("span",{className:"text-xs text-text-muted",children:A("autoPriority",{priority:e.globalPriority})}),(0,t.jsx)("span",{className:"text-text-muted/30 select-none",children:"|"}),(0,t.jsxs)("button",{onClick:()=>m(!K),className:`inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-xs font-medium transition-all cursor-pointer ${K?"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:A(K?"disableRateLimitProtection":"enableRateLimitProtection"),children:[(0,t.jsx)("span",{className:"material-symbols-outlined text-[13px]",children:"shield"}),A(K?"rateLimitProtected":"rateLimitUnprotected")]}),l&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:"text-text-muted/30 select-none",children:"|"}),(0,t.jsxs)("button",{onClick:()=>x?.(!z),className:`inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-xs font-medium transition-all cursor-pointer ${z?"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,t.jsx)("span",{className:"material-symbols-outlined text-[13px]",children:"timer"}),"5h ",z?"ON":"OFF"]}),(0,t.jsxs)("button",{onClick:()=>h?.(!q),className:`inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-xs font-medium transition-all cursor-pointer ${q?"bg-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,t.jsx)("span",{className:"material-symbols-outlined text-[13px]",children:"date_range"}),"Weekly ",q?"ON":"OFF"]})]}),N&&(R=A("global"===w?"proxySourceGlobal":"provider"===w?"proxySourceProvider":"proxySourceKey"),(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)("span",{className:"text-text-muted/30 select-none",children:"|"}),(0,t.jsxs)("span",{className:`inline-flex items-center gap-0.5 px-1.5 py-0.5 rounded text-xs font-medium ${"global"===w?"bg-emerald-500/15 text-emerald-500":"provider"===w?"bg-amber-500/15 text-amber-500":"bg-blue-500/15 text-blue-500"}`,title:A("proxyConfiguredBySource",{source:R,host:T||A("configured")}),children:[(0,t.jsx)("span",{className:"material-symbols-outlined text-[13px]",children:"vpn_lock"}),T||A("proxy")]})]}))]})]})]}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(c.Button,{size:"sm",variant:"ghost",icon:"refresh",loading:g,disabled:!1===e.isActive,onClick:f,className:"!h-7 !px-2 text-xs",title:A("retestAuthentication"),children:A("retest")}),S&&(0,t.jsx)(c.Button,{size:"sm",variant:"ghost",icon:"token",loading:P,disabled:!1===e.isActive||P,onClick:S,className:"!h-7 !px-2 text-xs text-amber-500 hover:text-amber-400",title:"Refresh OAuth token manually",children:"Token"}),(0,t.jsx)(v.Toggle,{size:"sm",checked:e.isActive??!0,onChange:u,title:A(e.isActive??!0?"disableConnection":"enableConnection")}),(0,t.jsxs)("div",{className:"flex gap-1 ml-1 transition-opacity",children:[j&&(0,t.jsx)("button",{onClick:j,className:"p-2 hover:bg-amber-500/10 rounded text-amber-600 hover:text-amber-500",title:A("reauthenticateConnection"),children:(0,t.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"passkey"})}),(0,t.jsx)("button",{onClick:b,className:"p-2 hover:bg-black/5 dark:hover:bg-white/5 rounded text-text-muted hover:text-primary",title:A("edit"),children:(0,t.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"edit"})}),(0,t.jsx)("button",{onClick:C,className:"p-2 hover:bg-black/5 dark:hover:bg-white/5 rounded text-text-muted hover:text-primary",title:A("proxyConfig"),children:(0,t.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"vpn_lock"})}),(0,t.jsx)("button",{onClick:y,className:"p-2 hover:bg-red-500/10 rounded text-red-500",title:A("delete"),children:(0,t.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"delete"})})]})]})]})}function M({isOpen:e,provider:a,providerName:l,isCompatible:s,isAnthropic:i,onSave:o,onClose:d}){let x=(0,n.useTranslations)("providers"),h="bailian-coding-plan"===a,f="https://coding-intl.dashscope.aliyuncs.com/apps/anthropic/v1",[g,v]=(0,r.useState)({name:"",apiKey:"",priority:1,baseUrl:h?f:""}),[b,y]=(0,r.useState)(!1),[j,C]=(0,r.useState)(null),[N,k]=(0,r.useState)(!1),[w,T]=(0,r.useState)(null),S=async()=>{y(!0),T(null);try{let e=await fetch("/api/providers/validate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:a,apiKey:g.apiKey})}),t=await e.json();C(t.valid?"success":"failed")}catch{C("failed")}finally{y(!1)}},P=async()=>{if(a&&g.apiKey){k(!0),T(null);try{let e=null;if(h){let t=U(g.baseUrl,f);if(t.error)return void T(t.error);e=t.value}let t=!1;try{y(!0),C(null);let e=await fetch("/api/providers/validate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:a,apiKey:g.apiKey})});t=!!(await e.json()).valid,C(t?"success":"failed")}catch{C("failed")}finally{y(!1)}if(!t)return void T(x("apiKeyValidationFailed"));let r={name:g.name,apiKey:g.apiKey,priority:g.priority,testStatus:"active",providerSpecificData:void 0};h&&(r.providerSpecificData={baseUrl:e});let l=await o(r);l&&T("string"==typeof l?l:x("failedSaveConnection"))}finally{k(!1)}}};return a?(0,t.jsx)(m.Modal,{isOpen:e,title:x("addProviderApiKeyTitle",{provider:l||a}),onClose:d,children:(0,t.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,t.jsx)(u.Input,{label:x("nameLabel"),value:g.name,onChange:e=>v({...g,name:e.target.value}),placeholder:x("productionKey")}),(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)(u.Input,{label:x("apiKeyLabel"),type:"password",value:g.apiKey,onChange:e=>v({...g,apiKey:e.target.value}),className:"flex-1"}),(0,t.jsx)("div",{className:"pt-6",children:(0,t.jsx)(c.Button,{onClick:S,disabled:!g.apiKey||b||N,variant:"secondary",children:b?x("checking"):x("check")})})]}),j&&(0,t.jsx)(p.Badge,{variant:"success"===j?"success":"error",children:"success"===j?x("valid"):x("invalid")}),w&&(0,t.jsx)("div",{className:"text-sm text-red-500 bg-red-500/10 border border-red-500/20 rounded-lg px-3 py-2",children:w}),s&&(0,t.jsx)("p",{className:"text-xs text-text-muted",children:i?x("validationChecksAnthropicCompatible",{provider:l||x("anthropicCompatibleName")}):x("validationChecksOpenAiCompatible",{provider:l||x("openaiCompatibleName")})}),(0,t.jsx)(u.Input,{label:x("priorityLabel"),type:"number",value:g.priority,onChange:e=>v({...g,priority:Number.parseInt(e.target.value)||1})}),h&&(0,t.jsx)(u.Input,{label:"Base URL",value:g.baseUrl,onChange:e=>v({...g,baseUrl:e.target.value}),placeholder:f,hint:"Optional: Custom base URL for bailian-coding-plan provider"}),(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)(c.Button,{onClick:P,fullWidth:!0,disabled:!g.name||!g.apiKey||N,children:N?x("saving"):x("save")}),(0,t.jsx)(c.Button,{onClick:d,variant:"ghost",fullWidth:!0,children:x("cancel")})]})]})}):null}function U(e,t){let r=("string"==typeof e?e.trim():"")||t;try{let e=new URL(r);if("http:"!==e.protocol&&"https:"!==e.protocol)return{value:null,error:"Base URL must use http or https"};return{value:r,error:null}}catch{return{value:null,error:"Base URL must be a valid URL"}}}function L({isOpen:e,connection:a,onSave:l,onClose:s}){let i=(0,n.useTranslations)("providers"),[o,d]=(0,r.useState)({name:"",priority:1,apiKey:"",healthCheckInterval:60,baseUrl:""}),[x,h]=(0,r.useState)(!1),[f,g]=(0,r.useState)(null),[v,b]=(0,r.useState)(!1),[y,C]=(0,r.useState)(null),[N,k]=(0,r.useState)(!1),[w,T]=(0,r.useState)(null),[S,P]=(0,r.useState)([]),[R,A]=(0,r.useState)(""),I=a?.provider==="bailian-coding-plan",E="https://coding-intl.dashscope.aliyuncs.com/apps/anthropic/v1";(0,r.useEffect)(()=>{if(a){let e=a.providerSpecificData?.baseUrl;d({name:a.name||"",priority:a.priority||1,apiKey:"",healthCheckInterval:a.healthCheckInterval??60,baseUrl:e||(I?E:"")});let t=a.providerSpecificData?.extraApiKeys;P(Array.isArray(t)?t:[]),A(""),g(null),C(null),T(null)}},[a,I]);let O=async()=>{if(a?.provider){h(!0),g(null);try{let e=await fetch(`/api/providers/${a.id}/test`,{method:"POST"}),t=await e.json();g({valid:!!t.valid,diagnosis:t.diagnosis||null,message:t.error||null})}catch{g({valid:!1,diagnosis:{type:"network_error"},message:i("failedTestConnection")})}finally{h(!1)}}},M=async()=>{if(a?.provider&&o.apiKey){b(!0),C(null);try{let e=await fetch("/api/providers/validate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:a.provider,apiKey:o.apiKey})}),t=await e.json();C(t.valid?"success":"failed")}catch{C("failed")}finally{b(!1)}}},L=async()=>{k(!0),T(null);try{let e={name:o.name,priority:o.priority,healthCheckInterval:o.healthCheckInterval},t=null;if(I){let e=U(o.baseUrl,E);if(e.error)return void T(e.error);t=e.value}if(!$&&o.apiKey){e.apiKey=o.apiKey;let t="success"===y;if(!t)try{b(!0),C(null);let e=await fetch("/api/providers/validate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:a.provider,apiKey:o.apiKey})});t=!!(await e.json()).valid,C(t?"success":"failed")}catch{C("failed")}finally{b(!1)}t&&(e.testStatus="active",e.lastError=null,e.lastErrorAt=null,e.lastErrorType=null,e.lastErrorSource=null,e.errorCode=null,e.rateLimitedUntil=null)}!$&&(e.providerSpecificData={...a.providerSpecificData||{},extraApiKeys:S.filter(e=>e.trim().length>0)},I&&(e.providerSpecificData.baseUrl=t));let r=await l(e);r&&T("string"==typeof r?r:i("failedSaveConnection"))}finally{k(!1)}};if(!a)return null;let $="oauth"===a.authType,_=(0,j.isOpenAICompatibleProvider)(a.provider)||(0,j.isAnthropicCompatibleProvider)(a.provider),K=!f?.valid&&f?.diagnosis?.type&&D[f.diagnosis.type]||null;return(0,t.jsx)(m.Modal,{isOpen:e,title:i("editConnection"),onClose:s,children:(0,t.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,t.jsx)(u.Input,{label:i("nameLabel"),value:o.name,onChange:e=>d({...o,name:e.target.value}),placeholder:$?i("accountName"):i("productionKey")}),$&&a.email&&(0,t.jsxs)("div",{className:"bg-sidebar/50 p-3 rounded-lg",children:[(0,t.jsx)("p",{className:"text-sm text-text-muted mb-1",children:i("email")}),(0,t.jsx)("p",{className:"font-medium",children:a.email})]}),$&&(0,t.jsx)(u.Input,{label:i("healthCheckMinutes"),type:"number",value:o.healthCheckInterval,onChange:e=>d({...o,healthCheckInterval:Math.max(0,Number.parseInt(e.target.value)||0)}),hint:i("healthCheckHint")}),(0,t.jsx)(u.Input,{label:i("priorityLabel"),type:"number",value:o.priority,onChange:e=>d({...o,priority:Number.parseInt(e.target.value)||1})}),!$&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)(u.Input,{label:i("apiKeyLabel"),type:"password",value:o.apiKey,onChange:e=>d({...o,apiKey:e.target.value}),placeholder:i("enterNewApiKey"),hint:i("leaveBlankKeepCurrentApiKey"),className:"flex-1"}),(0,t.jsx)("div",{className:"pt-6",children:(0,t.jsx)(c.Button,{onClick:M,disabled:!o.apiKey||v||N,variant:"secondary",children:v?i("checking"):i("check")})})]}),y&&(0,t.jsx)(p.Badge,{variant:"success"===y?"success":"error",children:"success"===y?i("valid"):i("invalid")}),w&&(0,t.jsx)("div",{className:"text-sm text-red-500 bg-red-500/10 border border-red-500/20 rounded-lg px-3 py-2",children:w})]}),I&&(0,t.jsx)(u.Input,{label:"Base URL",value:o.baseUrl,onChange:e=>d({...o,baseUrl:e.target.value}),placeholder:E,hint:"Custom base URL for bailian-coding-plan provider"}),!$&&(0,t.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,t.jsxs)("label",{className:"text-sm font-medium text-text-main",children:["Extra API Keys",(0,t.jsx)("span",{className:"ml-2 text-[11px] font-normal text-text-muted",children:"(round-robin rotation — optional)"})]}),S.length>0&&(0,t.jsx)("div",{className:"flex flex-col gap-1.5",children:S.map((e,r)=>(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.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 #${r+2}: ${e.slice(0,6)}...${e.slice(-4)}`}),(0,t.jsx)("button",{onClick:()=>P(S.filter((e,t)=>t!==r)),className:"p-1.5 rounded hover:bg-red-500/10 text-red-400 hover:text-red-500",title:"Remove this key",children:(0,t.jsx)("span",{className:"material-symbols-outlined text-[16px]",children:"close"})})]},r))}),(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)("input",{type:"password",value:R,onChange:e=>A(e.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:e=>{"Enter"===e.key&&R.trim()&&(P([...S,R.trim()]),A(""))}}),(0,t.jsx)("button",{onClick:()=>{R.trim()&&(P([...S,R.trim()]),A(""))},disabled:!R.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"})]}),S.length>0&&(0,t.jsxs)("p",{className:"text-[11px] text-text-muted",children:[S.length+1," keys total — rotating round-robin on each request."]})]}),!_&&(0,t.jsxs)("div",{className:"flex items-center gap-3",children:[(0,t.jsx)(c.Button,{onClick:O,variant:"secondary",disabled:x,children:x?i("testing"):i("testConnection")}),f&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(p.Badge,{variant:f.valid?"success":"error",children:f.valid?i("valid"):i("failed")}),K&&(0,t.jsx)(p.Badge,{variant:K.variant,children:i(K.labelKey)})]})]}),(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)(c.Button,{onClick:L,fullWidth:!0,disabled:N,children:N?i("saving"):i("save")}),(0,t.jsx)(c.Button,{onClick:s,variant:"ghost",fullWidth:!0,children:i("cancel")})]})]})})}function $({isOpen:e,node:a,onSave:l,onClose:s,isAnthropic:i}){let o=(0,n.useTranslations)("providers"),[d,x]=(0,r.useState)({name:"",prefix:"",apiType:"chat",baseUrl:"https://api.openai.com/v1",chatPath:"",modelsPath:""}),[h,f]=(0,r.useState)(!1),[g,v]=(0,r.useState)(""),[y,j]=(0,r.useState)(!1),[C,N]=(0,r.useState)(null),[k,w]=(0,r.useState)(!1);(0,r.useEffect)(()=>{a&&(x({name:a.name||"",prefix:a.prefix||"",apiType:a.apiType||"chat",baseUrl:a.baseUrl||(i?"https://api.anthropic.com/v1":"https://api.openai.com/v1"),chatPath:a.chatPath||"",modelsPath:a.modelsPath||""}),w(!!(a.chatPath||a.modelsPath)))},[a,i]);let T=[{value:"chat",label:o("chatCompletions")},{value:"responses",label:o("responsesApi")}],S=async()=>{if(d.name.trim()&&d.prefix.trim()&&d.baseUrl.trim()){f(!0);try{let e={name:d.name,prefix:d.prefix,baseUrl:d.baseUrl,chatPath:d.chatPath||"",modelsPath:d.modelsPath||""};i||(e.apiType=d.apiType),await l(e)}finally{f(!1)}}},P=async()=>{j(!0);try{let e=await fetch("/api/provider-nodes/validate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({baseUrl:d.baseUrl,apiKey:g,type:i?"anthropic-compatible":"openai-compatible",modelsPath:d.modelsPath||""})}),t=await e.json();N(t.valid?"success":"failed")}catch{N("failed")}finally{j(!1)}};return a?(0,t.jsx)(m.Modal,{isOpen:e,title:o("editCompatibleTitle",{type:o(i?"anthropic":"openai")}),onClose:s,children:(0,t.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,t.jsx)(u.Input,{label:o("nameLabel"),value:d.name,onChange:e=>x({...d,name:e.target.value}),placeholder:o("compatibleProdPlaceholder",{type:o(i?"anthropic":"openai")}),hint:o("nameHint")}),(0,t.jsx)(u.Input,{label:o("prefixLabel"),value:d.prefix,onChange:e=>x({...d,prefix:e.target.value}),placeholder:o(i?"anthropicPrefixPlaceholder":"openaiPrefixPlaceholder"),hint:o("prefixHint")}),!i&&(0,t.jsx)(b.Select,{label:o("apiTypeLabel"),options:T,value:d.apiType,onChange:e=>x({...d,apiType:e.target.value})}),(0,t.jsx)(u.Input,{label:o("baseUrlLabel"),value:d.baseUrl,onChange:e=>x({...d,baseUrl:e.target.value}),placeholder:o(i?"anthropicBaseUrlPlaceholder":"openaiBaseUrlPlaceholder"),hint:o("compatibleBaseUrlHint",{type:o(i?"anthropic":"openai")})}),(0,t.jsxs)("button",{type:"button",className:"text-sm text-text-muted hover:text-text-primary flex items-center gap-1",onClick:()=>w(!k),"aria-expanded":k,"aria-controls":"advanced-settings",children:[(0,t.jsx)("span",{className:`transition-transform ${k?"rotate-90":""}`,"aria-hidden":"true",children:"▶"}),o("advancedSettings")]}),k&&(0,t.jsxs)("div",{id:"advanced-settings",className:"flex flex-col gap-3 pl-2 border-l-2 border-border",children:[(0,t.jsx)(u.Input,{label:o("chatPathLabel"),value:d.chatPath,onChange:e=>x({...d,chatPath:e.target.value}),placeholder:i?"/messages":o("chatPathPlaceholder"),hint:o("chatPathHint")}),(0,t.jsx)(u.Input,{label:o("modelsPathLabel"),value:d.modelsPath,onChange:e=>x({...d,modelsPath:e.target.value}),placeholder:o("modelsPathPlaceholder"),hint:o("modelsPathHint")})]}),(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)(u.Input,{label:o("apiKeyForCheck"),type:"password",value:g,onChange:e=>v(e.target.value),className:"flex-1"}),(0,t.jsx)("div",{className:"pt-6",children:(0,t.jsx)(c.Button,{onClick:P,disabled:!g||y||!d.baseUrl.trim(),variant:"secondary",children:o(y?"checking":"check")})})]}),C&&(0,t.jsx)(p.Badge,{variant:"success"===C?"success":"error",children:o("success"===C?"valid":"invalid")}),(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)(c.Button,{onClick:S,fullWidth:!0,disabled:!d.name.trim()||!d.prefix.trim()||!d.baseUrl.trim()||h,children:o(h?"saving":"save")}),(0,t.jsx)(c.Button,{onClick:s,variant:"ghost",fullWidth:!0,children:o("cancel")})]})]})}):null}O.propTypes={connection:l.default.shape({id:l.default.string,name:l.default.string,email:l.default.string,displayName:l.default.string,rateLimitedUntil:l.default.string,rateLimitProtection:l.default.bool,testStatus:l.default.string,isActive:l.default.bool,priority:l.default.number,lastError:l.default.string,lastErrorType:l.default.string,lastErrorSource:l.default.string,errorCode:l.default.oneOfType([l.default.string,l.default.number]),globalPriority:l.default.number,providerSpecificData:l.default.object}).isRequired,isOAuth:l.default.bool.isRequired,isCodex:l.default.bool,isFirst:l.default.bool.isRequired,isLast:l.default.bool.isRequired,onMoveUp:l.default.func.isRequired,onMoveDown:l.default.func.isRequired,onToggleActive:l.default.func.isRequired,onToggleRateLimit:l.default.func.isRequired,onToggleCodex5h:l.default.func,onToggleCodexWeekly:l.default.func,onRetest:l.default.func.isRequired,isRetesting:l.default.bool,onEdit:l.default.func.isRequired,onDelete:l.default.func.isRequired,onReauth:l.default.func},M.propTypes={isOpen:l.default.bool.isRequired,provider:l.default.string,providerName:l.default.string,isCompatible:l.default.bool,isAnthropic:l.default.bool,onSave:l.default.func.isRequired,onClose:l.default.func.isRequired},L.propTypes={isOpen:l.default.bool.isRequired,connection:l.default.shape({id:l.default.string,name:l.default.string,email:l.default.string,priority:l.default.number,authType:l.default.string,provider:l.default.string}),onSave:l.default.func.isRequired,onClose:l.default.func.isRequired},$.propTypes={isOpen:l.default.bool.isRequired,node:l.default.shape({id:l.default.string,name:l.default.string,prefix:l.default.string,apiType:l.default.string,baseUrl:l.default.string,chatPath:l.default.string,modelsPath:l.default.string}),onSave:l.default.func.isRequired,onClose:l.default.func.isRequired,isAnthropic:l.default.bool},e.s(["default",()=>T],710864)}]);