omniroute 3.3.10 → 3.3.11

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 (115) 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/page_client-reference-manifest.js +1 -1
  9. package/app/.next/server/app/(dashboard)/dashboard/audit-log/page_client-reference-manifest.js +1 -1
  10. package/app/.next/server/app/(dashboard)/dashboard/auto-combo/page_client-reference-manifest.js +1 -1
  11. package/app/.next/server/app/(dashboard)/dashboard/cache/page_client-reference-manifest.js +1 -1
  12. package/app/.next/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  13. package/app/.next/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  14. package/app/.next/server/app/(dashboard)/dashboard/costs/page_client-reference-manifest.js +1 -1
  15. package/app/.next/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  16. package/app/.next/server/app/(dashboard)/dashboard/health/page_client-reference-manifest.js +1 -1
  17. package/app/.next/server/app/(dashboard)/dashboard/limits/page_client-reference-manifest.js +1 -1
  18. package/app/.next/server/app/(dashboard)/dashboard/logs/page_client-reference-manifest.js +1 -1
  19. package/app/.next/server/app/(dashboard)/dashboard/mcp/page_client-reference-manifest.js +1 -1
  20. package/app/.next/server/app/(dashboard)/dashboard/media/page_client-reference-manifest.js +1 -1
  21. package/app/.next/server/app/(dashboard)/dashboard/onboarding/page_client-reference-manifest.js +1 -1
  22. package/app/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  23. package/app/.next/server/app/(dashboard)/dashboard/playground/page_client-reference-manifest.js +1 -1
  24. package/app/.next/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  25. package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  26. package/app/.next/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  27. package/app/.next/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  28. package/app/.next/server/app/(dashboard)/dashboard/search-tools/page_client-reference-manifest.js +1 -1
  29. package/app/.next/server/app/(dashboard)/dashboard/settings/page_client-reference-manifest.js +1 -1
  30. package/app/.next/server/app/(dashboard)/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  31. package/app/.next/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  32. package/app/.next/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  33. package/app/.next/server/app/400/page_client-reference-manifest.js +1 -1
  34. package/app/.next/server/app/401/page_client-reference-manifest.js +1 -1
  35. package/app/.next/server/app/403/page_client-reference-manifest.js +1 -1
  36. package/app/.next/server/app/408/page_client-reference-manifest.js +1 -1
  37. package/app/.next/server/app/429/page_client-reference-manifest.js +1 -1
  38. package/app/.next/server/app/500/page_client-reference-manifest.js +1 -1
  39. package/app/.next/server/app/502/page_client-reference-manifest.js +1 -1
  40. package/app/.next/server/app/503/page_client-reference-manifest.js +1 -1
  41. package/app/.next/server/app/_global-error.html +2 -2
  42. package/app/.next/server/app/_global-error.rsc +1 -1
  43. package/app/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  44. package/app/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  45. package/app/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  46. package/app/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  47. package/app/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  48. package/app/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  49. package/app/.next/server/app/api/system/version/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]__112a90be._.js +2 -2
  63. package/app/.next/server/chunks/[root-of-the-server]__46e00e59._.js +2 -2
  64. package/app/.next/server/chunks/[root-of-the-server]__5c021c68._.js +1 -1
  65. package/app/.next/server/chunks/[root-of-the-server]__6fba99f4._.js +1 -1
  66. package/app/.next/server/chunks/[root-of-the-server]__745fa111._.js +1 -1
  67. package/app/.next/server/chunks/[root-of-the-server]__78f7009e._.js +1 -1
  68. package/app/.next/server/chunks/[root-of-the-server]__7ace0fcd._.js +1 -1
  69. package/app/.next/server/chunks/[root-of-the-server]__7d4ffdb3._.js +1 -1
  70. package/app/.next/server/chunks/[root-of-the-server]__8c57851d._.js +1 -1
  71. package/app/.next/server/chunks/[root-of-the-server]__9096d2fa._.js +1 -1
  72. package/app/.next/server/chunks/[root-of-the-server]__a1f12196._.js +1 -1
  73. package/app/.next/server/chunks/[root-of-the-server]__a32d3818._.js +1 -1
  74. package/app/.next/server/chunks/[root-of-the-server]__b39d0020._.js +2 -2
  75. package/app/.next/server/chunks/[root-of-the-server]__bc251fbe._.js +1 -1
  76. package/app/.next/server/chunks/_05c48915._.js +1 -1
  77. package/app/.next/server/chunks/_06515a8a._.js +1 -1
  78. package/app/.next/server/chunks/_2115d8de._.js +1 -1
  79. package/app/.next/server/chunks/_3ac953eb._.js +1 -1
  80. package/app/.next/server/chunks/_4b8fd853._.js +1 -1
  81. package/app/.next/server/chunks/_68683848._.js +1 -1
  82. package/app/.next/server/chunks/_7badaddf._.js +2 -2
  83. package/app/.next/server/chunks/_ee9b677b._.js +1 -1
  84. package/app/.next/server/chunks/open-sse_config_providerModels_ts_04541468._.js +1 -1
  85. package/app/.next/server/chunks/open-sse_config_providerRegistry_ts_2f74ec2a._.js +1 -1
  86. package/app/.next/server/chunks/open-sse_config_providerRegistry_ts_dec0f840._.js +1 -1
  87. package/app/.next/server/chunks/open-sse_executors_01c3e95e._.js +1 -1
  88. package/app/.next/server/chunks/open-sse_executors_codex_ts_6d18ec4b._.js +1 -1
  89. package/app/.next/server/chunks/ssr/[root-of-the-server]__9ef96d20._.js +1 -1
  90. package/app/.next/server/chunks/ssr/[root-of-the-server]__a6942102._.js +1 -1
  91. package/app/.next/server/chunks/ssr/_19b3d5b1._.js +1 -1
  92. package/app/.next/server/chunks/ssr/_31f623fe._.js +1 -1
  93. package/app/.next/server/chunks/ssr/open-sse_config_providerModels_ts_4cac55e2._.js +1 -1
  94. package/app/.next/server/pages/500.html +2 -2
  95. package/app/.next/server/server-reference-manifest.js +1 -1
  96. package/app/.next/server/server-reference-manifest.json +1 -1
  97. package/app/.next/static/chunks/{c7acff0f25f46281.js → 7c68da7fb645b441.js} +1 -1
  98. package/app/.next/static/chunks/{aa0bfbc0b2eb7658.js → 93854a469fd935c2.js} +1 -1
  99. package/app/.next/static/chunks/{5a0cb6640589f4fa.js → af07e5bb4e2fd5ef.js} +1 -1
  100. package/app/CHANGELOG.md +24 -0
  101. package/app/docs/openapi.yaml +1 -1
  102. package/app/open-sse/config/providerRegistry.ts +2 -1
  103. package/app/open-sse/executors/codex.ts +5 -0
  104. package/app/open-sse/handlers/chatCore.ts +35 -13
  105. package/app/open-sse/package.json +1 -1
  106. package/app/package-lock.json +3 -3
  107. package/app/package.json +1 -1
  108. package/app/src/shared/components/OAuthModal.tsx +6 -1
  109. package/app/src/shared/services/cliRuntime.ts +7 -3
  110. package/app/tests/unit/cli-runtime-detection.test.mjs +15 -6
  111. package/app/tests/unit/t28-model-catalog-updates.test.mjs +2 -2
  112. package/package.json +1 -1
  113. /package/app/.next/static/{JHXiVG41z1UrA7MsRLXGd → wq1Ii1uhsKllCHQoeqLBt}/_buildManifest.js +0 -0
  114. /package/app/.next/static/{JHXiVG41z1UrA7MsRLXGd → wq1Ii1uhsKllCHQoeqLBt}/_clientMiddlewareManifest.json +0 -0
  115. /package/app/.next/static/{JHXiVG41z1UrA7MsRLXGd → wq1Ii1uhsKllCHQoeqLBt}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,804730,e=>{e.v({name:"omniroute",version:"3.3.10",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.",type:"module",bin:{omniroute:"bin/omniroute.mjs","omniroute-reset-password":"bin/reset-password.mjs"},files:["bin/","app/","open-sse/mcp-server/","src/shared/contracts/","scripts/postinstall.mjs","scripts/native-binary-compat.mjs","README.md","LICENSE"],workspaces:["open-sse"],engines:{node:">=18.0.0 <24.0.0"},keywords:["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],license:"MIT",author:"diegosouzapw",repository:{type:"git",url:"https://github.com/diegosouzapw/OmniRoute"},homepage:"https://omniroute.online",scripts:{dev:"node scripts/run-next.mjs dev",build:"node scripts/build-next-isolated.mjs","build:cli":"node scripts/prepublish.mjs",start:"node scripts/run-next.mjs start",lint:"eslint .","electron:dev":'concurrently "npm run dev" "wait-on http://localhost:20128 && cd electron && npm run dev"',"electron:build":"npm run build && cd electron && npm run build","electron:build:win":"npm run build && cd electron && npm run build:win","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:linux":"npm run build && cd electron && npm run build:linux",test:"node --import tsx/esm --test tests/unit/*.test.mjs","test:unit":"node --import tsx/esm --test tests/unit/*.test.mjs","test:plan3":"node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","test:fixes":"node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:security":"node --import tsx/esm --test tests/unit/security-fase01.test.mjs","check:cycles":"node scripts/check-cycles.mjs","check:route-validation:t06":"node scripts/check-route-validation.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","check:docs-sync":"node scripts/check-docs-sync.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","test:vitest":"vitest run open-sse/mcp-server/__tests__/*.test.ts open-sse/services/autoCombo/__tests__/*.test.ts","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e",check:"npm run lint && npm run test",prepublishOnly:"npm run build:cli",postinstall:"node scripts/postinstall.mjs",prepare:"husky","system-info":"node scripts/system-info.mjs"},dependencies:{"@lobehub/icons":"^5.0.1","@modelcontextprotocol/sdk":"^1.27.1","@monaco-editor/react":"^4.7.0","@swc/helpers":"0.5.19",bcryptjs:"^3.0.3","better-sqlite3":"^12.6.2",bottleneck:"^2.19.5",dompurify:"^3.3.2",express:"^5.2.1","fetch-socks":"^1.3.2","http-proxy-middleware":"^3.0.5","https-proxy-agent":"^8.0.0",jose:"^6.1.3",keytar:"^7.9.0",lowdb:"^7.0.1","monaco-editor":"^0.55.1",next:"^16.0.10","next-intl":"^4.8.3","node-machine-id":"^1.1.12",open:"^11.0.0",ora:"^9.1.0",pino:"^10.3.1","pino-pretty":"^13.1.3",react:"19.2.4","react-dom":"19.2.4",recharts:"^3.7.0",selfsigned:"^5.5.0",tsx:"^4.21.0",undici:"^7.19.2",uuid:"^13.0.0","wreq-js":"^2.0.1",zod:"^4.3.6",zustand:"^5.0.10"},devDependencies:{"@playwright/test":"^1.58.2","@tailwindcss/postcss":"^4.1.18","@types/bcryptjs":"^3.0.0","@types/better-sqlite3":"^7.6.13","@types/keytar":"^4.4.0","@types/node":"^25.2.3","@types/react":"^19.2.14","@types/react-dom":"^19.2.3",c8:"^11.0.0",concurrently:"^9.2.1","cross-env":"^10.1.0",eslint:"^9.39.2","eslint-config-next":"^16.0.10",husky:"^9.1.7","lint-staged":"^16.2.7",prettier:"^3.8.1",tailwindcss:"^4",typescript:"^5.9.3","typescript-eslint":"^8.56.0",vitest:"^4.0.18","wait-on":"^9.0.4"},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},pnpm:{onlyBuiltDependencies:["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},overrides:{dompurify:"^3.3.2","path-to-regexp":"^8.4.0",react:"$react","react-dom":"$react-dom"}})},175696,e=>{"use strict";var t=e.i(861745),s=e.i(843476);function r({locale:e,...r}){if(!e)throw Error(void 0);return(0,s.jsx)(t.IntlProvider,{locale:e,...r})}e.s(["default",()=>r])}]);
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,804730,e=>{e.v({name:"omniroute",version:"3.3.11",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.",type:"module",bin:{omniroute:"bin/omniroute.mjs","omniroute-reset-password":"bin/reset-password.mjs"},files:["bin/","app/","open-sse/mcp-server/","src/shared/contracts/","scripts/postinstall.mjs","scripts/native-binary-compat.mjs","README.md","LICENSE"],workspaces:["open-sse"],engines:{node:">=18.0.0 <24.0.0"},keywords:["ai","router","proxy","openai","claude","anthropic","gemini","fallback","cursor","cline","codex","llm","auto-fallback"],license:"MIT",author:"diegosouzapw",repository:{type:"git",url:"https://github.com/diegosouzapw/OmniRoute"},homepage:"https://omniroute.online",scripts:{dev:"node scripts/run-next.mjs dev",build:"node scripts/build-next-isolated.mjs","build:cli":"node scripts/prepublish.mjs",start:"node scripts/run-next.mjs start",lint:"eslint .","electron:dev":'concurrently "npm run dev" "wait-on http://localhost:20128 && cd electron && npm run dev"',"electron:build":"npm run build && cd electron && npm run build","electron:build:win":"npm run build && cd electron && npm run build:win","electron:build:mac":"npm run build && cd electron && npm run build:mac","electron:build:linux":"npm run build && cd electron && npm run build:linux",test:"node --import tsx/esm --test tests/unit/*.test.mjs","test:unit":"node --import tsx/esm --test tests/unit/*.test.mjs","test:plan3":"node --import tsx/esm --test tests/unit/plan3-p0.test.mjs","test:fixes":"node --import tsx/esm --test tests/unit/fixes-p1.test.mjs","test:security":"node --import tsx/esm --test tests/unit/security-fase01.test.mjs","check:cycles":"node scripts/check-cycles.mjs","check:route-validation:t06":"node scripts/check-route-validation.mjs","check:any-budget:t11":"node scripts/check-t11-any-budget.mjs","check:docs-sync":"node scripts/check-docs-sync.mjs","typecheck:core":"tsc --pretty false -p tsconfig.typecheck-core.json","typecheck:noimplicit:core":"tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json","test:integration":"node --import tsx/esm --test tests/integration/*.test.mjs","test:e2e":"node scripts/run-playwright-tests.mjs test tests/e2e/*.spec.ts","test:protocols:e2e":"node scripts/run-protocol-clients-tests.mjs","test:vitest":"vitest run open-sse/mcp-server/__tests__/*.test.ts open-sse/services/autoCombo/__tests__/*.test.ts","test:ecosystem":"node scripts/run-ecosystem-tests.mjs","test:coverage":"c8 --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 55 --lines 55 --functions 55 --branches 60 node --import tsx/esm --test tests/unit/*.test.mjs","test:coverage:legacy":"c8 --exclude=open-sse --check-coverage --lines 50 --functions 50 --branches 50 node --import tsx/esm --test tests/unit/*.test.mjs","coverage:report":"c8 report --exclude=tests/** --exclude=**/*.test.* --reporter=text --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov","coverage:report:legacy":"c8 report --exclude=open-sse --reporter=text --reporter=text-summary","test:all":"npm run test:unit && npm run test:vitest && npm run test:ecosystem && npm run test:e2e",check:"npm run lint && npm run test",prepublishOnly:"npm run build:cli",postinstall:"node scripts/postinstall.mjs",prepare:"husky","system-info":"node scripts/system-info.mjs"},dependencies:{"@lobehub/icons":"^5.0.1","@modelcontextprotocol/sdk":"^1.27.1","@monaco-editor/react":"^4.7.0","@swc/helpers":"0.5.19",bcryptjs:"^3.0.3","better-sqlite3":"^12.6.2",bottleneck:"^2.19.5",dompurify:"^3.3.2",express:"^5.2.1","fetch-socks":"^1.3.2","http-proxy-middleware":"^3.0.5","https-proxy-agent":"^8.0.0",jose:"^6.1.3",keytar:"^7.9.0",lowdb:"^7.0.1","monaco-editor":"^0.55.1",next:"^16.0.10","next-intl":"^4.8.3","node-machine-id":"^1.1.12",open:"^11.0.0",ora:"^9.1.0",pino:"^10.3.1","pino-pretty":"^13.1.3",react:"19.2.4","react-dom":"19.2.4",recharts:"^3.7.0",selfsigned:"^5.5.0",tsx:"^4.21.0",undici:"^7.19.2",uuid:"^13.0.0","wreq-js":"^2.0.1",zod:"^4.3.6",zustand:"^5.0.10"},devDependencies:{"@playwright/test":"^1.58.2","@tailwindcss/postcss":"^4.1.18","@types/bcryptjs":"^3.0.0","@types/better-sqlite3":"^7.6.13","@types/keytar":"^4.4.0","@types/node":"^25.2.3","@types/react":"^19.2.14","@types/react-dom":"^19.2.3",c8:"^11.0.0",concurrently:"^9.2.1","cross-env":"^10.1.0",eslint:"^9.39.2","eslint-config-next":"^16.0.10",husky:"^9.1.7","lint-staged":"^16.2.7",prettier:"^3.8.1",tailwindcss:"^4",typescript:"^5.9.3","typescript-eslint":"^8.56.0",vitest:"^4.0.18","wait-on":"^9.0.4"},"lint-staged":{"*.{js,jsx,ts,tsx,mjs}":["prettier --write","eslint --fix --no-error-on-unmatched-pattern"],"*.{json,md,yml,yaml,css}":["prettier --write"]},pnpm:{onlyBuiltDependencies:["@parcel/watcher","@swc/core","better-sqlite3","esbuild","omniroute","sharp"]},overrides:{dompurify:"^3.3.2","path-to-regexp":"^8.4.0",react:"$react","react-dom":"$react-dom"}})},175696,e=>{"use strict";var t=e.i(861745),s=e.i(843476);function r({locale:e,...r}){if(!e)throw Error(void 0);return(0,s.jsx)(t.IntlProvider,{locale:e,...r})}e.s(["default",()=>r])}]);
@@ -165,7 +165,7 @@ ${o}
165
165
  }
166
166
  `,eax=(f="anticon",p={defaultVariants:{spin:!1},variants:{spin:{false:null,true:eab(({css:e})=>({spin:e`
167
167
  animation: ${eaj} 1s linear infinite;
168
- `})).spin}}},e=>{var t;if((null==p?void 0:p.variants)==null)return eaO(f,null==e?void 0:e.class,null==e?void 0:e.className);let{variants:r,defaultVariants:n}=p,o=Object.keys(r).map(t=>{let o=null==e?void 0:e[t],i=null==n?void 0:n[t];if(null===o)return null;let l=eag(o)||eag(i);return r[t][l]}),i=e&&Object.entries(e).reduce((e,t)=>{let[r,n]=t;return void 0===n||(e[r]=n),e},{});return eaO(f,o,null==p||null==(t=p.compoundVariants)?void 0:t.reduce((e,t)=>{let{class:r,className:o,...l}=t;return Object.entries(l).every(e=>{let[t,r]=e;return Array.isArray(r)?r.includes({...n,...i}[t]):({...n,...i})[t]===r})?[...e,r,o]:e},[]),null==e?void 0:e.class,null==e?void 0:e.className)}),eaw=(0,el.memo)(({icon:e,size:t,color:r,fill:n="transparent",className:o,focusable:i,spin:l,fillRule:c,fillOpacity:a,ref:u,...s})=>{let{color:f,fill:p,fillOpacity:y,fillRule:b,focusable:m,className:v,size:h,...d}=(0,el.use)(ead),{size:g,strokeWidth:O}=(0,el.useMemo)(()=>(e=>{let t,r;if("number"==typeof e||e instanceof Number)return{size:e};switch(e){case"large":t=24,r=2;break;case"middle":t=20,r=2;break;case"small":t=14,r=2;break;default:e?(t=e?.size||24,r=e?.strokeWidth||2):(t="1em",r=2)}return{size:t,strokeWidth:r}})(t||h),[t,h]);return(0,ei.jsx)("span",{className:eam(eax({spin:l}),v,o),role:"img",...d,...s,children:e&&((0,el.isValidElement)(e)?e:(0,ei.jsx)(e,{color:r||f,fill:n||p,fillOpacity:a||y,fillRule:c||b,focusable:i||m,height:g,ref:u,size:g,strokeWidth:O,width:g}))})});eaw.displayName="Icon";let eaP=(...e)=>e.filter((e,t,r)=>!!e&&""!==e.trim()&&r.indexOf(e)===t).join(" ").trim(),eaS=e=>{let t=e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,r)=>r?r.toUpperCase():t.toLowerCase());return t.charAt(0).toUpperCase()+t.slice(1)};var eaz={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};let eaE=(0,el.forwardRef)(({color:e="currentColor",size:t=24,strokeWidth:r=2,absoluteStrokeWidth:n,className:o="",children:i,iconNode:l,...c},a)=>(0,el.createElement)("svg",{ref:a,...eaz,width:t,height:t,stroke:e,strokeWidth:n?24*Number(r)/Number(t):r,className:eaP("lucide",o),...!i&&!(e=>{for(let t in e)if(t.startsWith("aria-")||"role"===t||"title"===t)return!0;return!1})(c)&&{"aria-hidden":"true"},...c},[...l.map(([e,t])=>(0,el.createElement)(e,t)),...Array.isArray(i)?i:[i]])),eak=(Q="Provider",ee=[["path",{d:"M15.4 17.4L18.6 14.6C18.7904 14.4162 19.0152 14.2716 19.2615 14.1746C19.5077 14.0776 19.7707 14.0301 20.0354 14.0347C20.3 14.0394 20.5611 14.0961 20.8039 14.2017C21.0466 14.3072 21.2662 14.4596 21.45 14.65C21.6339 14.8404 21.7784 15.0652 21.8754 15.3115C21.9724 15.5577 22.0199 15.8207 22.0153 16.0854C22.0106 16.35 21.9539 16.6111 21.8483 16.8539C21.7428 17.0966 21.5904 17.3162 21.4 17.5L17.8 20.8C17.1 21.6 16.1 22 15 22H11C9.9 22 8.9 21.6 8.2 20.8L6.898 19.336C6.80426 19.2304 6.68923 19.1459 6.56048 19.088C6.43173 19.0301 6.29218 19.0001 6.151 19H5",key:"1"}],["path",{d:"M2 14H14C14.5304 14 15.0391 14.2107 15.4142 14.5858C15.7893 14.9609 16 15.4696 16 16C16 16.5304 15.7893 17.0391 15.4142 17.4142C15.0391 17.7893 14.5304 18 14 18H12",key:"2"}],["path",{d:"M5 14V20C5 20.265 4.895 20.52 4.707 20.707 4.52 20.895 4.265 21 4 21H2M17.598 6.5C17.828 6.101 17.964 5.655 17.994 5.196 18.024 4.737 17.948 4.277 17.772 3.852 17.596 3.427 17.324 3.048 16.978 2.744 16.632 2.441 16.221 2.221 15.777 2.102 15.332 1.983 14.866 1.968 14.415 2.058 13.963 2.147 13.539 2.34 13.174 2.62 12.809 2.9 12.513 3.26 12.309 3.673 12.106 4.086 12 4.54 12 5 12 4.54 11.894 4.086 11.691 3.673 11.487 3.26 11.191 2.9 10.826 2.62 10.461 2.34 10.037 2.147 9.585 2.058 9.134 1.968 8.668 1.983 8.224 2.102 7.779 2.221 7.368 2.441 7.022 2.744 6.676 3.048 6.404 3.427 6.228 3.852 6.052 4.277 5.976 4.737 6.006 5.196 6.037 5.655 6.172 6.101 6.402 6.5",key:"3"}],["path",{d:"M17.997 5.125C18.585 5.276 19.131 5.559 19.593 5.952 20.055 6.346 20.422 6.839 20.665 7.395 20.909 7.951 21.022 8.555 20.998 9.161 20.973 9.768 20.811 10.361 20.523 10.895M6.003 5.125C5.415 5.276 4.869 5.559 4.407 5.952 3.945 6.346 3.578 6.839 3.335 7.395 3.091 7.951 2.978 8.555 3.002 9.161 3.027 9.768 3.189 10.361 3.477 10.895M15 11C14.135 10.747 13.375 10.221 12.834 9.5 12.293 8.778 12.001 7.901 12 7 12 7.901 11.707 8.778 11.166 9.5 10.625 10.221 9.865 10.747 9 11M12 8V5",key:"4"}]],(y=(0,el.forwardRef)(({className:e,...t},r)=>(0,el.createElement)(eaE,{ref:r,iconNode:ee,className:eaP(`lucide-${eaS(Q).replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()}`,`lucide-${Q}`,e),...t}))).displayName=eaS(Q),y);function eaM(e){return(eaM="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}eak.displayName="ProviderIcon";var eaC=["color","size"];function eaD(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}var eaN=(0,el.memo)(function(e){var t=e.color,r=e.size,n=function(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],!(t.indexOf(r)>=0)&&Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}(e,eaC);return(0,ei.jsx)(eaw,function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?eaD(Object(r),!0).forEach(function(t){var n,o,i;n=e,o=t,i=r[t],(o=function(e){var t=function(e,t){if("object"!=eaM(e)||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!=eaM(n))return n;throw TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==eaM(t)?t:String(t)}(o))in n?Object.defineProperty(n,o,{value:i,enumerable:!0,configurable:!0,writable:!0}):n[o]=i}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):eaD(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))})}return e}({color:t||eah.colorTextDescription,icon:eak,size:void 0===r?12:r},n))});function eaT(e){return(eaT="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function eaA(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}var eaI=(0,el.memo)(function(e){var t=e.shape,r=e.color,n=e.background,o=e.size,i=e.style,l=e.iconMultiple,c=e.iconStyle,a=e.iconClassName;return(0,ei.jsx)(ef,{flex:"none",style:function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?eaA(Object(r),!0).forEach(function(t){var n,o,i;n=e,o=t,i=r[t],(o=function(e){var t=function(e,t){if("object"!=eaT(e)||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!=eaT(n))return n;throw TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==eaT(t)?t:String(t)}(o))in n?Object.defineProperty(n,o,{value:i,enumerable:!0,configurable:!0,writable:!0}):n[o]=i}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):eaA(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))})}return e}({background:n||eah.colorFillSecondary,borderRadius:"circle"===(void 0===t?"circle":t)?"50%":Math.floor(.1*o),color:r,height:o,width:o},i),children:(0,ei.jsx)(eaN,{className:a,color:r,size:o*(void 0===l?.6:l),style:c})})});function eaV(e){return(eaV="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var eaH=["provider","size","type","forceMono","shape"];function ea$(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}function eaL(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?ea$(Object(r),!0).forEach(function(t){var n,o,i;n=e,o=t,i=r[t],(o=function(e){var t=function(e,t){if("object"!=eaV(e)||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!=eaV(n))return n;throw TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==eaV(t)?t:String(t)}(o))in n?Object.defineProperty(n,o,{value:i,enumerable:!0,configurable:!0,writable:!0}):n[o]=i}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):ea$(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))})}return e}function eaR(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}var eaB=(0,el.memo)(function(e){var t,r,n,o,i,l,c,a=e.provider,u=e.size,s=e.type,f=e.forceMono,p=e.shape,y=function(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],!(t.indexOf(r)>=0)&&Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}(e,eaH),b=(0,el.useMemo)(function(){if(a){var e,t=a.toLowerCase(),r=function(e,t){var r="u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!r){if(Array.isArray(e)||(r=function(e,t){if(e){if("string"==typeof e)return eaR(e,void 0);var r=Object.prototype.toString.call(e).slice(8,-1);if("Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return eaR(e,void 0)}}(e))){r&&(e=r);var n=0,o=function(){};return{s:o,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:o}}throw TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,l=!0,c=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return l=e.done,e},e:function(e){c=!0,i=e},f:function(){try{l||null==r.return||r.return()}finally{if(c)throw i}}}}(QU);try{for(r.s();!(e=r.n()).done;){var n=e.value;if(n.keywords.some(function(e){return e.toLowerCase()===t}))return n}}catch(e){r.e(e)}finally{r.f()}}},[a]),m=eaL(eaL({size:void 0===u?12:u},null==b?void 0:b.props),y);switch(void 0===s?"avatar":s){case"avatar":if(!(null!=b&&b.Icon))return(0,ei.jsx)(eaI,eaL({shape:p},m));return(0,ei.jsx)(b.Icon.Avatar,eaL({shape:p},m));case"mono":if(!(null!=b&&b.Icon))return(0,ei.jsx)(eaN,eaL({},m));if(!f&&a===QC.LobeHub)return(0,ei.jsx)(b.Icon.Color,eaL({},m));return(0,ei.jsx)(b.Icon,eaL({},m));case"color":if(!(null!=b&&b.Icon))return(0,ei.jsx)(eaN,eaL({},m));return null!=(t=b.Icon)&&t.Color?(0,ei.jsx)(b.Icon.Color,eaL({},m)):(0,ei.jsx)(b.Icon,eaL({},m));case"combine":if(!(null!=b&&b.Icon))return(0,ei.jsx)(eaN,eaL({},m));return null!=(r=b.Icon)&&r.Combine?(0,ei.jsx)(b.Icon.Combine,eaL({type:"mono"},m)):null!=(n=b.Icon)&&n.Brand?(0,ei.jsx)(b.Icon.Brand,eaL({},m)):null!=(o=b.Icon)&&o.Text?(0,ei.jsx)(b.Icon.Text,eaL({},m)):(0,ei.jsx)(b.Icon,eaL({},m));case"combine-color":if(!(null!=b&&b.Icon))return(0,ei.jsx)(eaN,eaL({},m));return null!=(i=b.Icon)&&i.Combine?(0,ei.jsx)(b.Icon.Combine,eaL({type:"color"},m)):null!=(l=b.Icon)&&l.BrandColor?(0,ei.jsx)(b.Icon.BrandColor,eaL({},m)):null!=(c=b.Icon)&&c.Text?(0,ei.jsx)(b.Icon.Text,eaL({},m)):(0,ei.jsx)(b.Icon,eaL({},m));default:return(0,ei.jsx)(eaN,eaL({},m))}});eaB.displayName="ProviderIcon";let eaF={openai:"openai",anthropic:"anthropic",claude:"anthropic",gemini:"google",google:"google",deepseek:"deepseek",groq:"groq",mistral:"mistral",cohere:"cohere",perplexity:"perplexity",xai:"xai",grok:"xai",together:"togetherai",fireworks:"fireworks","fireworks-ai":"fireworks",cerebras:"cerebras",huggingface:"huggingface","hugging-face":"huggingface",openrouter:"openrouter","open-router":"openrouter",ollama:"ollama",minimax:"minimax",qwen:"qwen",alibaba:"qwen",moonshot:"moonshot",kimi:"moonshot",baidu:"baidu",ernie:"baidu",spark:"iflytek","zhipu-ai":"zhipu",zhipu:"zhipu",lmsys:"lmsys","stability-ai":"stability",stability:"stability",replicate:"replicate",ai21:"ai21",nvidia:"nvidia",cloudflare:"cloudflare","cloudflare-ai":"cloudflare","aws-bedrock":"bedrock",bedrock:"bedrock",azure:"azure","azure-openai":"azure",copilot:"githubcopilot","github-copilot":"githubcopilot",mistralai:"mistral",codex:"openai",blackbox:"blackboxai",blackboxai:"blackboxai",pollinations:"pollinations"};class ea_ extends el.Component{constructor(e){super(e),this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(){this.props.onError()}render(){return this.state.hasError?null:this.props.children}}function eaU({size:e}){return(0,ei.jsxs)("svg",{width:e,height:e,viewBox:"0 0 24 24",fill:"none",style:{flex:"none"},children:[(0,ei.jsx)("circle",{cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"1.5",opacity:"0.4"}),(0,ei.jsx)("path",{d:"M8 12h8M12 8v8",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round"})]})}let eaq=new Set(["aimlapi","alibaba","alicode-intl","alicode","anthropic-m","anthropic","antigravity","bailian-coding-plan","blackbox","brave-search","brave","cerebras","claude","cline","codex","cohere","continue","copilot","cursor","deepgram","deepseek","droid","exa-search","fireworks","gemini-cli","gemini","github","glm","groq","iflow","ironclaw","kilo-gateway","kilocode","kimi-coding-apikey","kimi-coding","kimi","kiro","longcat","minimax-cn","minimax","mistral","nanobot","nebius","nvidia","oai-cc","oai-r","ollama-cloud","openai","openclaw","openrouter","perplexity-search","perplexity","pollinations","qwen","roo","serper-search","serper","siliconflow","tavily-search","tavily","together","xai","zeroclaw"]),eaW=new Set(["apikey","assemblyai","brave","cartesia","cloudflare-ai","comfyui","elevenlabs","exa-search","exa","huggingface","hyperbolic","inworld","nanobanana","oauth","opencode-go","opencode-zen","opencode","playht","puter","scaleway","sdwebui","synthetic","vertex","windsurf","zai"]),eaG=(0,el.memo)(function({providerId:e,size:t=24,type:r="color",className:n,style:o}){let i=e.toLowerCase(),l=eaF[i]??null,c=eaq.has(i),a=eaW.has(i),[u,s]=(0,el.useState)(null!==l),[f,p]=(0,el.useState)(c),[y,b]=(0,el.useState)(!c&&a);return u&&l?(0,ei.jsx)("span",{className:n,style:{display:"inline-flex",alignItems:"center",...o},children:(0,ei.jsx)(ea_,{onError:()=>s(!1),children:(0,ei.jsx)(eaB,{provider:l,size:t,type:r})})}):f?(0,ei.jsx)("span",{className:n,style:{display:"inline-flex",alignItems:"center",...o},children:(0,ei.jsx)(ec.default,{src:`/providers/${i}.png`,alt:e,width:t,height:t,style:{objectFit:"contain"},onError:()=>{p(!1),b(a)},unoptimized:!0})}):y?(0,ei.jsx)("span",{className:n,style:{display:"inline-flex",alignItems:"center",...o},children:(0,ei.jsx)(ec.default,{src:`/providers/${i}.svg`,alt:e,width:t,height:t,style:{objectFit:"contain"},onError:()=>b(!1),unoptimized:!0})}):(0,ei.jsx)("span",{className:n,style:{display:"inline-flex",alignItems:"center",...o},children:(0,ei.jsx)(eaU,{size:t})})});e.s(["default",0,eaG],393162)},6998,e=>{"use strict";var t=e.i(843476),r=e.i(618566),n=e.i(522016),o=e.i(657688),i=e.i(745009),l=e.i(897844),c=e.i(932993),a=e.i(31954),u=e.i(156221),s=e.i(393162),f=e.i(948148),p=e.i(623249);function y({onMenuClick:e,showMenuButton:i=!0}){let y=(0,r.usePathname)(),b=(0,r.useRouter)(),m=(0,f.useTranslations)("header"),{title:v,description:h,breadcrumbs:d}=function(e){let t=(0,f.useTranslations)("header");if(!e)return{title:"",description:"",breadcrumbs:[]};let r=e.match(/\/providers\/([^/]+)$/);if(r){let e=r[1],n=p.OAUTH_PROVIDERS[e]||p.FREE_PROVIDERS[e]||p.APIKEY_PROVIDERS[e];if(n)return{title:n.name,description:"",breadcrumbs:[{label:t("providers"),href:"/dashboard/providers"},{label:n.name,providerId:n.id}]};if(e.startsWith(p.OPENAI_COMPATIBLE_PREFIX))return{title:t("openaiCompatible"),description:"",breadcrumbs:[{label:t("providers"),href:"/dashboard/providers"},{label:t("openaiCompatible"),providerId:"oai-cc"}]};if(e.startsWith(p.ANTHROPIC_COMPATIBLE_PREFIX))return{title:t("anthropicCompatible"),description:"",breadcrumbs:[{label:t("providers"),href:"/dashboard/providers"},{label:t("anthropicCompatible"),providerId:"anthropic-m"}]}}return e.includes("/providers")?{title:t("providers"),description:t("providerDescription"),breadcrumbs:[]}:e.includes("/combos")?{title:t("combos"),description:t("comboDescription"),breadcrumbs:[]}:e.includes("/usage")?{title:t("usage"),description:t("usageDescription"),breadcrumbs:[]}:e.includes("/analytics")?{title:t("analytics"),description:t("analyticsDescription"),breadcrumbs:[]}:e.includes("/cli-tools")?{title:t("cliTools"),description:t("cliToolsDescription"),breadcrumbs:[]}:"/dashboard"===e?{title:t("home"),description:t("homeDescription"),breadcrumbs:[]}:e.includes("/mcp")?{title:t("mcp"),description:t("mcpDescription"),breadcrumbs:[]}:e.includes("/a2a")?{title:t("a2a"),description:t("a2aDescription"),breadcrumbs:[]}:e.includes("/endpoint")?{title:t("endpoint"),description:t("endpointDescription"),breadcrumbs:[]}:e.includes("/profile")?{title:t("settings"),description:t("settingsDescription"),breadcrumbs:[]}:{title:"",description:"",breadcrumbs:[]}}(y),g=async()=>{try{(await fetch("/api/auth/logout",{method:"POST"})).ok&&(b.push("/login"),b.refresh())}catch(e){console.error("Failed to logout:",e)}};return(0,t.jsxs)("header",{className:"flex items-center justify-between px-8 py-5 border-b border-black/5 dark:border-white/5 bg-bg/80 backdrop-blur-xl z-10 sticky top-0",children:[(0,t.jsx)("div",{className:"flex items-center gap-3 lg:hidden",children:i&&(0,t.jsx)("button",{onClick:e,className:"text-text-main hover:text-primary transition-colors",children:(0,t.jsx)("span",{className:"material-symbols-outlined",children:"menu"})})}),(0,t.jsx)("div",{className:"hidden lg:flex flex-col",children:d.length>0?(0,t.jsx)("div",{className:"flex items-center gap-2",children:d.map((e,r)=>(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[r>0&&(0,t.jsx)("span",{className:"material-symbols-outlined text-text-muted text-base",children:"chevron_right"}),e.href?(0,t.jsx)(n.default,{href:e.href,className:"text-text-muted hover:text-primary transition-colors",children:e.label}):(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[e.image&&(0,t.jsx)(o.default,{src:e.image,alt:e.label,width:28,height:28,className:"object-contain rounded max-w-[28px] max-h-[28px]",sizes:"28px",onError:e=>{e.currentTarget.style.display="none"}}),e.providerId&&(0,t.jsx)(s.default,{providerId:e.providerId,size:28,type:"color"}),(0,t.jsx)("h1",{className:"text-2xl font-semibold text-text-main tracking-tight",children:e.label})]})]},`${e.label}-${e.href||"current"}`))}):v?(0,t.jsxs)("div",{children:[(0,t.jsx)("h1",{className:"text-2xl font-semibold text-text-main tracking-tight",children:v}),h&&(0,t.jsx)("p",{className:"text-sm text-text-muted",children:h})]}):null}),(0,t.jsxs)("div",{className:"flex items-center gap-3 ml-auto",children:[(0,t.jsx)(u.default,{}),(0,t.jsx)(l.default,{}),(0,t.jsx)(a.default,{}),(0,t.jsx)(c.default,{}),(0,t.jsx)("button",{onClick:g,className:"flex items-center justify-center p-2 rounded-lg text-text-muted hover:text-red-500 hover:bg-red-500/10 transition-all",title:m("logout"),children:(0,t.jsx)("span",{className:"material-symbols-outlined",children:"logout"})})]})]})}y.propTypes={onMenuClick:i.default.func,showMenuButton:i.default.bool},e.s(["default",()=>y])},982131,e=>{"use strict";var t=e.i(843476),r=e.i(948148),n=e.i(522016),o=e.i(497769);let i=[{label:"Features",href:"#features"},{label:"Pricing",href:"#pricing"},{label:"Changelog",href:"https://github.com/diegosouzapw/OmniRoute/releases",external:!0}],l=[{label:"Documentation",href:"/docs"},{label:"API Reference",href:"/docs#api-reference"},{label:"Help Center",href:"https://github.com/diegosouzapw/OmniRoute/discussions",external:!0}],c=[{label:"About",href:"https://github.com/diegosouzapw/OmniRoute",external:!0},{label:"Blog",href:"https://github.com/diegosouzapw/OmniRoute/releases",external:!0},{label:"Contact",href:"https://github.com/diegosouzapw/OmniRoute/issues/new/choose",external:!0},{label:"Terms",href:"/terms"},{label:"Privacy",href:"/privacy"}];function a(){let e=(0,r.useTranslations)("stats"),a=e=>e.external?(0,t.jsx)("a",{href:e.href,target:"_blank",rel:"noopener noreferrer",className:"hover:text-primary transition-colors",children:e.label}):(0,t.jsx)(n.default,{href:e.href,className:"hover:text-primary transition-colors",children:e.label});return(0,t.jsx)("footer",{className:"bg-bg border-t border-border pt-16 pb-12",children:(0,t.jsxs)("div",{className:"container mx-auto px-4 sm:px-6 lg:px-8",children:[(0,t.jsxs)("div",{className:"grid grid-cols-2 md:grid-cols-4 lg:grid-cols-5 gap-10 mb-12",children:[(0,t.jsxs)("div",{className:"col-span-2 lg:col-span-2",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2 mb-6",children:[(0,t.jsx)("div",{className:"size-6 text-primary",children:(0,t.jsx)("svg",{className:"w-full h-full",fill:"currentColor",viewBox:"0 0 48 48",children:(0,t.jsx)("path",{clipRule:"evenodd",d:"M12.0799 24L4 19.2479L9.95537 8.75216L18.04 13.4961L18.0446 4H29.9554L29.96 13.4961L38.0446 8.75216L44 19.2479L35.92 24L44 28.7521L38.0446 39.2479L29.96 34.5039L29.9554 44H18.0446L18.04 34.5039L9.95537 39.2479L4 28.7521L12.0799 24Z",fillRule:"evenodd"})})}),(0,t.jsx)("span",{className:"text-xl font-bold text-text-main",children:o.APP_CONFIG.name})]}),(0,t.jsx)("p",{className:"text-text-muted mb-6 max-w-sm font-light",children:"The unified interface for modern AI infrastructure. Secure, observable, and scalable."}),(0,t.jsxs)("div",{className:"flex gap-4",children:[(0,t.jsx)("a",{href:"https://github.com/diegosouzapw/OmniRoute/discussions",target:"_blank",rel:"noopener noreferrer",className:"text-gray-400 hover:text-primary transition-colors","aria-label":"Community Discussions",children:(0,t.jsx)("svg",{className:"w-5 h-5",fill:"currentColor",viewBox:"0 0 24 24",children:(0,t.jsx)("path",{d:"M22.46 6c-.77.35-1.6.58-2.46.69.88-.53 1.56-1.37 1.88-2.38-.83.5-1.75.85-2.72 1.05C18.37 4.5 17.26 4 16 4c-2.35 0-4.27 1.92-4.27 4.29 0 .34.04.67.11.98C8.28 9.09 5.11 7.38 3 4.79c-.37.63-.58 1.37-.58 2.15 0 1.49.75 2.81 1.91 3.56-.71 0-1.37-.2-1.95-.5v.03c0 2.08 1.48 3.82 3.44 4.21a4.22 4.22 0 0 1-1.93.07 4.28 4.28 0 0 0 4 2.98 8.521 8.521 0 0 1-5.33 1.84c-.34 0-.68-.02-1.02-.06C3.44 20.29 5.7 21 8.12 21 16 21 20.33 14.46 20.33 8.79c0-.19 0-.37-.01-.56.84-.6 1.56-1.36 2.14-2.23z"})})}),(0,t.jsx)("a",{href:"https://github.com/diegosouzapw/OmniRoute",target:"_blank",rel:"noopener noreferrer",className:"text-gray-400 hover:text-primary transition-colors","aria-label":"GitHub",children:(0,t.jsx)("svg",{className:"w-5 h-5",fill:"currentColor",viewBox:"0 0 24 24",children:(0,t.jsx)("path",{d:"M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0 1 12 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0 0 22 12.017C22 6.484 17.522 2 12 2z"})})})]})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("h4",{className:"font-semibold text-text-main mb-4",children:e("product")}),(0,t.jsx)("ul",{className:"flex flex-col gap-3 text-sm text-text-muted font-light",children:i.map(e=>(0,t.jsx)("li",{children:a(e)},e.label))})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("h4",{className:"font-semibold text-text-main mb-4",children:e("resources")}),(0,t.jsx)("ul",{className:"flex flex-col gap-3 text-sm text-text-muted font-light",children:l.map(e=>(0,t.jsx)("li",{children:a(e)},e.label))})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("h4",{className:"font-semibold text-text-main mb-4",children:e("company")}),(0,t.jsx)("ul",{className:"flex flex-col gap-3 text-sm text-text-muted font-light",children:c.map(e=>(0,t.jsx)("li",{children:a(e)},e.label))})]})]}),(0,t.jsxs)("div",{className:"border-t border-border pt-8 flex flex-col md:flex-row justify-between items-center gap-4",children:[(0,t.jsxs)("p",{className:"text-sm text-text-muted",children:["© ",new Date().getFullYear()," ",o.APP_CONFIG.name," Inc. All rights reserved."]}),(0,t.jsxs)("div",{className:"flex gap-6 text-sm text-text-muted",children:[(0,t.jsx)("a",{href:"/docs",className:"hover:text-primary transition-colors",children:"Documentation"}),(0,t.jsx)(n.default,{href:"/terms",className:"hover:text-primary transition-colors",children:"Terms"}),(0,t.jsx)(n.default,{href:"/privacy",className:"hover:text-primary transition-colors",children:"Privacy"}),(0,t.jsx)("a",{href:"https://github.com/diegosouzapw/OmniRoute/blob/main/LICENSE",target:"_blank",rel:"noopener noreferrer",className:"hover:text-primary transition-colors",children:"License"})]})]})]})})}e.s(["default",()=>a])},556938,e=>{"use strict";var t=e.i(271645),r=e.i(950914);function n(e=2e3){let[o,i]=(0,t.useState)(null),l=(0,t.useRef)(null);return{copied:o,copy:(0,t.useCallback)(async(t,n="default")=>{let o=await (0,r.copyToClipboard)(t);return o&&(i(n),l.current&&clearTimeout(l.current),l.current=setTimeout(()=>{i(null)},e)),o},[e])}}e.s(["useCopyToClipboard",()=>n])},116016,e=>{"use strict";var t=e.i(247167),r=e.i(843476),n=e.i(271645),o=e.i(745009),i=e.i(703166),l=e.i(342923),c=e.i(80173),a=e.i(556938);let u=new Set(["antigravity","gemini-cli"]);function s({isOpen:e,provider:o,providerInfo:s,onSuccess:f,onClose:p,idcConfig:y}){let[b,m]=(0,n.useState)("waiting"),[v,h]=(0,n.useState)(null),[d,g]=(0,n.useState)(""),[O,j]=(0,n.useState)(null),[x,w]=(0,n.useState)(!1),[P,S]=(0,n.useState)(null),[z,E]=(0,n.useState)(!1),k=(0,n.useRef)(null),{copied:M,copy:C}=(0,a.useCopyToClipboard)(),[D,N]=(0,n.useState)(!1),[T,A]=(0,n.useState)("/callback?code=..."),I=(0,n.useRef)(!1),V=(0,n.useRef)(!1),[H,$]=(0,n.useState)(!1);(0,n.useEffect)(()=>{{let e=window.location.hostname,t="localhost"===e||"127.0.0.1"===e||e.startsWith("192.168.")||e.startsWith("10.")||/^172\.(1[6-9]|2\d|3[01])\./.test(e),r="localhost"===e||"127.0.0.1"===e;N(t),$(r),A(`${window.location.origin}/callback?code=...`)}},[]);let L=(0,n.useCallback)(async(e,t)=>{if(v)try{let r=await fetch(`/api/oauth/${o}/exchange`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e,redirectUri:v.redirectUri,codeVerifier:v.codeVerifier,state:t})}),n=await r.json();if(!r.ok){let e="object"==typeof n.error&&null!==n.error?n.error.message||JSON.stringify(n.error):n.error||"Exchange failed";throw Error(e)}m("success"),f?.()}catch(e){e.message?.toLowerCase().includes("redirect_uri_mismatch")&&u.has(o)?j("redirect_uri_mismatch: The default Google OAuth credentials only work on localhost. For remote use, configure your own OAuth credentials via environment variables: "+("antigravity"===o?"ANTIGRAVITY_OAUTH_CLIENT_ID and ANTIGRAVITY_OAUTH_CLIENT_SECRET":"GEMINI_OAUTH_CLIENT_ID and GEMINI_OAUTH_CLIENT_SECRET")+". See the README section 'OAuth on a Remote Server'."):j(e.message),m("error")}},[v,o,f]),R=(0,n.useCallback)(async(e,t,r,n)=>{E(!0);for(let i=0;i<60;i++){await new Promise(e=>setTimeout(e,1e3*r));try{let i=await fetch(`/api/oauth/${o}/poll`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({deviceCode:e,codeVerifier:t,extraData:n})}),l=await i.json();if(l.success){m("success"),E(!1),f?.();return}if("expired_token"===l.error||"access_denied"===l.error)throw Error(l.errorDescription||l.error);"slow_down"===l.error&&(r=Math.min(r+5,30))}catch(e){j(e.message),m("error"),E(!1);return}}j("Authorization timeout"),m("error"),E(!1)},[o,f]),B=(0,n.useCallback)(async()=>{if(o)try{let e;if(j(null),"github"===o||"qwen"===o||"kiro"===o||"kimi-coding"===o||"kilocode"===o){w(!0),m("waiting");let e=await fetch(`/api/oauth/${o}/device-code`),t=await e.json();if(!e.ok){let e="object"==typeof t.error&&null!==t.error?t.error.message||JSON.stringify(t.error):t.error||"Request failed";throw Error(e)}S(t);let r=t.verification_uri_complete||t.verification_uri;r&&window.open(r,"oauth_verify");let n="kiro"===o?{_clientId:t._clientId,_clientSecret:t._clientSecret}:null;R(t.device_code,t.codeVerifier,t.interval||5,n);return}let r=!1;if("codex"===o&&D)try{let e=await fetch("/api/oauth/codex/start-callback-server"),t=await e.json();if(!e.ok)throw Error(t.error);h({...t,redirectUri:t.redirectUri}),m("waiting"),window.open(t.authUrl,"oauth_auth"),E(!0);for(let e=0;e<150;e++){await new Promise(e=>setTimeout(e,2e3));let e=await fetch("/api/oauth/codex/poll-callback",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({})}),t=await e.json();if(t.success){m("success"),E(!1),f?.();return}if(t.error&&!t.pending)throw Error(t.errorDescription||t.error)}throw E(!1),Error("Authorization timeout")}catch(e){console.warn("Codex callback server failed, falling back to standard manual flow",e),E(!1),r=!0}if("codex"===o||"openai"===o)e="http://localhost:1455/auth/callback";else if(u.has(o)){let t=window.location.port||"20128";e=`http://localhost:${t}/callback`}else if(D){let t=window.location.port||("https:"===window.location.protocol?"443":"80");e=`http://localhost:${t}/callback`}else{let r=t.default.env.NEXT_PUBLIC_BASE_URL,n=r&&"http://localhost:20128"!==r?r.replace(/\/$/,""):window.location.origin;e=`${n}/callback`}let n=await fetch(`/api/oauth/${o}/authorize?redirect_uri=${encodeURIComponent(e)}`),i=await n.json();if(!n.ok){let e="object"==typeof i.error&&null!==i.error?i.error.message||JSON.stringify(i.error):i.error||"Authorization failed";throw Error(e)}h({...i,redirectUri:e}),!H||r?(m("input"),window.open(i.authUrl,"oauth_auth")):(m("waiting"),k.current=window.open(i.authUrl,"oauth_popup","width=600,height=700"),k.current||m("input"))}catch(e){j(e.message),m("error")}},[o,D,H,R,f]);(0,n.useEffect)(()=>{e||(V.current=!1)},[e]),(0,n.useEffect)(()=>{e&&o&&(V.current||(V.current=!0,h(null),g(""),j(null),w(!1),S(null),E(!1),B()))},[e,o,B]),(0,n.useEffect)(()=>{let e;if(!v)return;I.current=!1;let t=async e=>{if(I.current)return;let{code:t,state:r,error:n,errorDescription:o}=e;if(n){I.current=!0,j(o||n),m("error");return}t&&(I.current=!0,await L(t,r))},r=e=>{let r=window.location.port,n=e.origin.match(/^https?:\/\/(localhost|127\.0\.0\.1)(:\d+)?$/)&&new URL(e.origin).port===r;(e.origin===window.location.origin||n)&&e.data?.type==="oauth_callback"&&t(e.data.data)};window.addEventListener("message",r);try{(e=new BroadcastChannel("oauth_callback")).onmessage=e=>t(e.data)}catch(e){console.log("BroadcastChannel not supported")}let n=e=>{if("oauth_callback"===e.key&&e.newValue)try{let r=JSON.parse(e.newValue);t(r),localStorage.removeItem("oauth_callback")}catch(e){console.log("Failed to parse localStorage data")}};window.addEventListener("storage",n);try{let e=localStorage.getItem("oauth_callback");if(e){let r=JSON.parse(e);r.timestamp&&Date.now()-r.timestamp<3e4&&(t(r),localStorage.removeItem("oauth_callback"))}}catch{}return()=>{window.removeEventListener("message",r),window.removeEventListener("storage",n),e&&e.close()}},[v,L]),(0,n.useEffect)(()=>{if("waiting"!==b||x||!k.current)return;let e=setInterval(()=>{if(I.current)return void clearInterval(e);try{k.current?.closed&&(clearInterval(e),"waiting"===b&&m("input"))}catch{}},1e3),t=setTimeout(()=>{I.current||"waiting"!==b||(clearInterval(e),m("input"))},3e5);return()=>{clearInterval(e),clearTimeout(t)}},[b,x]);let F=async()=>{try{j(null);let e=d.trim(),t=null,r=v?.state||null,n=null,o=null;try{let i=new URL(e);t=i.searchParams.get("code"),r=i.searchParams.get("state")||i.hash.replace(/^#/,"")||r,n=i.searchParams.get("error"),o=i.searchParams.get("error_description")}catch{let[n,o]=e.split("#",2);t=n||null,r=o||r}if(n)throw Error(o||n);if(!t)throw Error("No authorization code found. Paste the callback URL or the Authentication Code.");await L(t,r)}catch(e){j(e.message),m("error")}};return o&&s?(0,r.jsx)(i.default,{isOpen:e,title:`Connect ${s.name}`,onClose:p,size:"lg",children:(0,r.jsxs)("div",{className:"flex flex-col gap-4",children:["waiting"===b&&!x&&(0,r.jsxs)("div",{className:"text-center py-6",children:[(0,r.jsx)("div",{className:"size-16 mx-auto mb-4 rounded-full bg-primary/10 flex items-center justify-center",children:(0,r.jsx)("span",{className:"material-symbols-outlined text-3xl text-primary animate-spin",children:"progress_activity"})}),(0,r.jsx)("h3",{className:"text-lg font-semibold mb-2",children:"Waiting for Authorization"}),(0,r.jsx)("p",{className:"text-sm text-text-muted mb-2",children:"Complete the authorization in the popup window."}),(0,r.jsx)("p",{className:"text-xs text-text-muted mb-4 opacity-70",children:"If the popup closes without redirecting back (e.g. Qoder), this dialog will automatically switch to manual URL input mode."}),(0,r.jsx)(l.default,{variant:"ghost",onClick:()=>m("input"),children:"Popup blocked? Enter URL manually"})]}),"waiting"===b&&x&&P&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)("div",{className:"text-center py-4",children:[(0,r.jsx)("p",{className:"text-sm text-text-muted mb-4",children:"Visit the URL below and enter the code:"}),(0,r.jsxs)("div",{className:"bg-sidebar p-4 rounded-lg mb-4",children:[(0,r.jsx)("p",{className:"text-xs text-text-muted mb-1",children:"Verification URL"}),(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsx)("code",{className:"flex-1 text-sm break-all",children:P.verification_uri}),(0,r.jsx)(l.default,{size:"sm",variant:"ghost",icon:"verify_url"===M?"check":"content_copy",onClick:()=>C(P.verification_uri,"verify_url")})]})]}),(0,r.jsxs)("div",{className:"bg-primary/10 p-4 rounded-lg",children:[(0,r.jsx)("p",{className:"text-xs text-text-muted mb-1",children:"Your Code"}),(0,r.jsxs)("div",{className:"flex items-center justify-center gap-2",children:[(0,r.jsx)("p",{className:"text-2xl font-mono font-bold text-primary",children:P.user_code}),(0,r.jsx)(l.default,{size:"sm",variant:"ghost",icon:"user_code"===M?"check":"content_copy",onClick:()=>C(P.user_code,"user_code")})]})]})]}),z&&(0,r.jsxs)("div",{className:"flex items-center justify-center gap-2 text-sm text-text-muted",children:[(0,r.jsx)("span",{className:"material-symbols-outlined animate-spin",children:"progress_activity"}),"Waiting for authorization..."]})]}),"input"===b&&!x&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)("div",{className:"space-y-4",children:[!H&&u.has(o)&&(0,r.jsxs)("div",{className:"rounded-lg border border-amber-500/30 bg-amber-500/10 p-3 text-xs text-amber-200",children:[(0,r.jsx)("span",{className:"material-symbols-outlined text-sm align-middle mr-1",children:"warning"}),(0,r.jsx)("strong",{children:"Remote access + Google OAuth:"})," The default credentials only accept redirects to ",(0,r.jsx)("code",{children:"localhost"}),". After authorizing, your browser will try to open ",(0,r.jsx)("code",{children:"localhost"})," — copy that full URL and paste it below. For fully remote use without this manual step,"," ",(0,r.jsx)("a",{href:"https://github.com/diegosouzapw/OmniRoute#oauth-on-a-remote-server",target:"_blank",rel:"noreferrer",className:"underline",children:"configure your own OAuth credentials"}),"."]}),!H&&!u.has(o)&&(0,r.jsxs)("div",{className:"rounded-lg border border-blue-500/30 bg-blue-500/10 p-3 text-xs text-blue-200",children:[(0,r.jsx)("span",{className:"material-symbols-outlined text-sm align-middle mr-1",children:"info"}),(0,r.jsx)("strong",{children:"Remote access:"})," Since you're accessing OmniRoute remotely, after authorizing you'll see an error page (localhost not found). That's expected — just copy the full URL from your browser's address bar and paste it below."]}),(0,r.jsxs)("div",{children:[(0,r.jsx)("p",{className:"text-sm font-medium mb-2",children:"Step 1: Open this URL in your browser"}),(0,r.jsxs)("div",{className:"flex gap-2",children:[(0,r.jsx)(c.default,{value:v?.authUrl||"",readOnly:!0,className:"flex-1 font-mono text-xs"}),(0,r.jsx)(l.default,{variant:"secondary",icon:"auth_url"===M?"check":"content_copy",onClick:()=>C(v?.authUrl,"auth_url"),children:"Copy"})]})]}),(0,r.jsxs)("div",{children:[(0,r.jsx)("p",{className:"text-sm font-medium mb-2",children:"Step 2: Paste the callback URL or auth code here"}),(0,r.jsxs)("p",{className:"text-xs text-text-muted mb-2",children:["After authorization, paste the full callback URL. For Claude Code, you can also paste the Authentication Code directly, for example ",(0,r.jsx)("code",{children:"code#state"}),"."]}),(0,r.jsx)(c.default,{value:d,onChange:e=>g(e.target.value),placeholder:"claude"===o?"code#state or /callback?code=...":T,className:"font-mono text-xs"})]})]}),(0,r.jsxs)("div",{className:"flex gap-2",children:[(0,r.jsx)(l.default,{onClick:F,fullWidth:!0,disabled:!d,children:"Connect"}),(0,r.jsx)(l.default,{onClick:p,variant:"ghost",fullWidth:!0,children:"Cancel"})]})]}),"success"===b&&(0,r.jsxs)("div",{className:"text-center py-6",children:[(0,r.jsx)("div",{className:"size-16 mx-auto mb-4 rounded-full bg-green-100 dark:bg-green-900/30 flex items-center justify-center",children:(0,r.jsx)("span",{className:"material-symbols-outlined text-3xl text-green-600",children:"check_circle"})}),(0,r.jsx)("h3",{className:"text-lg font-semibold mb-2",children:"Connected Successfully!"}),(0,r.jsxs)("p",{className:"text-sm text-text-muted mb-4",children:["Your ",s.name," account has been connected."]}),(0,r.jsx)(l.default,{onClick:p,fullWidth:!0,children:"Done"})]}),"error"===b&&(0,r.jsxs)("div",{className:"text-center py-6",children:[(0,r.jsx)("div",{className:"size-16 mx-auto mb-4 rounded-full bg-red-100 dark:bg-red-900/30 flex items-center justify-center",children:(0,r.jsx)("span",{className:"material-symbols-outlined text-3xl text-red-600",children:"error"})}),(0,r.jsx)("h3",{className:"text-lg font-semibold mb-2",children:"Connection Failed"}),(0,r.jsx)("p",{className:"text-sm text-red-600 mb-4",children:O}),(0,r.jsxs)("div",{className:"flex gap-2",children:[(0,r.jsx)(l.default,{onClick:B,variant:"secondary",fullWidth:!0,children:"Try Again"}),(0,r.jsx)(l.default,{onClick:p,variant:"ghost",fullWidth:!0,children:"Cancel"})]})]})]})}):null}s.propTypes={isOpen:o.default.bool.isRequired,provider:o.default.string,providerInfo:o.default.shape({name:o.default.string}),onSuccess:o.default.func,onClose:o.default.func.isRequired},e.s(["default",()=>s])},279743,e=>{"use strict";var t=e.i(843476),r=e.i(271645),n=e.i(745009),o=e.i(703166);e.i(313705);var i=e.i(25230),l=e.i(623249);let c=[...Object.keys(l.OAUTH_PROVIDERS),...Object.keys(l.FREE_PROVIDERS),...Object.keys(l.APIKEY_PROVIDERS)];function a({isOpen:e,onClose:n,onSelect:a,selectedModel:u,activeProviders:s=[],title:f="Select Model",modelAliases:p={},addedModelValues:y=[]}){let[b,m]=(0,r.useState)(""),[v,h]=(0,r.useState)([]),[d,g]=(0,r.useState)([]),[O,j]=(0,r.useState)({}),x=async()=>{try{let e=await fetch("/api/combos");if(!e.ok)throw Error(`Failed to fetch combos: ${e.status}`);let t=await e.json();h(t.combos||[])}catch(e){console.error("Error fetching combos:",e),h([])}};(0,r.useEffect)(()=>{e&&x()},[e]);let w=async()=>{try{let e=await fetch("/api/provider-nodes");if(!e.ok)throw Error(`Failed to fetch provider nodes: ${e.status}`);let t=await e.json();g(t.nodes||[])}catch(e){console.error("Error fetching provider nodes:",e),g([])}};(0,r.useEffect)(()=>{e&&w()},[e]);let P=async()=>{try{let e=await fetch("/api/provider-models");if(!e.ok)throw Error(`Failed to fetch custom models: ${e.status}`);let t=await e.json();j(t.models||{})}catch(e){console.error("Error fetching custom models:",e),j({})}};(0,r.useEffect)(()=>{e&&P()},[e]);let S=(0,r.useMemo)(()=>({...l.OAUTH_PROVIDERS,...l.FREE_PROVIDERS,...l.APIKEY_PROVIDERS}),[]),z=(0,r.useMemo)(()=>{let e={};return[...new Set([...s.map(e=>e.provider)])].sort((e,t)=>{let r=c.indexOf(e),n=c.indexOf(t);return(-1===r?999:r)-(-1===n?999:n)}).forEach(t=>{let r=i.PROVIDER_ID_TO_ALIAS[t]||t,n=S[t]||{name:t,color:"#666"},o=(0,l.isOpenAICompatibleProvider)(t)||(0,l.isAnthropicCompatibleProvider)(t),c=O[t]||[];if(n.passthroughModels){let o=Object.entries(p).filter(([,e])=>e.startsWith(`${r}/`)).map(([e,t])=>({id:t.replace(`${r}/`,""),name:e,value:t})),i=c.filter(e=>!o.some(t=>t.id===e.id)).map(e=>({id:e.id,name:e.name||e.id,value:`${r}/${e.id}`,isCustom:!0})),l=[...o,...i];if(l.length>0){let o=d.find(e=>e.id===t),i=o?.name||n.name;e[t]={name:i,alias:r,color:n.color,models:l}}}else if(o){let r=d.find(e=>e.id===t),o=r?.name||n.name,i=r?.prefix||t,l=Object.entries(p).filter(([,e])=>e.startsWith(`${t}/`)).map(([e,r])=>({id:r.replace(`${t}/`,""),name:e,value:`${i}/${r.replace(`${t}/`,"")}`})),a=c.filter(e=>!l.some(t=>t.id===e.id)).map(e=>({id:e.id,name:e.name||e.id,value:`${i}/${e.id}`,isCustom:!0})),u=[...l,...a];u.length>0&&(e[t]={name:o,alias:i,color:n.color,models:u,isCustom:!0,hasModels:!0})}else{let o=(0,i.getModelsByProviderId)(t),l=[...o.map(e=>({id:e.id,name:e.name,value:`${r}/${e.id}`})),...c.filter(e=>!o.some(t=>t.id===e.id)).map(e=>({id:e.id,name:e.name||e.id,value:`${r}/${e.id}`,isCustom:!0}))];l.length>0&&(e[t]={name:n.name,alias:r,color:n.color,models:l})}}),e},[s,p,S,d,O]),E=(0,r.useMemo)(()=>{if(!b.trim())return v;let e=b.toLowerCase();return v.filter(t=>t.name.toLowerCase().includes(e))},[v,b]),k=(0,r.useMemo)(()=>{if(!b.trim())return z;let e=b.toLowerCase(),t={};return Object.entries(z).forEach(([r,n])=>{let o=n.models.filter(t=>t.name.toLowerCase().includes(e)||t.id.toLowerCase().includes(e)),i=n.name.toLowerCase().includes(e);(o.length>0||i)&&(t[r]={...n,models:o})}),t},[z,b]),M=e=>{a(e),n(),m("")};return(0,t.jsxs)(o.default,{isOpen:e,onClose:()=>{n(),m("")},title:f,size:"md",className:"p-4!",children:[(0,t.jsx)("div",{className:"mb-3",children:(0,t.jsxs)("div",{className:"relative",children:[(0,t.jsx)("span",{className:"material-symbols-outlined absolute left-2.5 top-1/2 -translate-y-1/2 text-text-muted text-[16px]",children:"search"}),(0,t.jsx)("input",{type:"text",placeholder:"Search...",value:b,onChange:e=>m(e.target.value),className:"w-full pl-8 pr-3 py-1.5 bg-surface border border-border rounded text-xs focus:outline-none focus:ring-1 focus:ring-primary/50"})]})}),(0,t.jsxs)("div",{className:"max-h-[300px] overflow-y-auto space-y-3",children:[E.length>0&&(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"flex items-center gap-1.5 mb-1.5 sticky top-0 bg-surface py-0.5",children:[(0,t.jsx)("span",{className:"material-symbols-outlined text-primary text-[14px]",children:"layers"}),(0,t.jsx)("span",{className:"text-xs font-medium text-primary",children:"Combos"}),(0,t.jsxs)("span",{className:"text-[10px] text-text-muted",children:["(",E.length,")"]})]}),(0,t.jsx)("div",{className:"flex flex-wrap gap-1.5",children:E.map(e=>{let r=u===e.name;return(0,t.jsx)("button",{onClick:()=>M({id:e.name,name:e.name,value:e.name}),className:`
168
+ `})).spin}}},e=>{var t;if((null==p?void 0:p.variants)==null)return eaO(f,null==e?void 0:e.class,null==e?void 0:e.className);let{variants:r,defaultVariants:n}=p,o=Object.keys(r).map(t=>{let o=null==e?void 0:e[t],i=null==n?void 0:n[t];if(null===o)return null;let l=eag(o)||eag(i);return r[t][l]}),i=e&&Object.entries(e).reduce((e,t)=>{let[r,n]=t;return void 0===n||(e[r]=n),e},{});return eaO(f,o,null==p||null==(t=p.compoundVariants)?void 0:t.reduce((e,t)=>{let{class:r,className:o,...l}=t;return Object.entries(l).every(e=>{let[t,r]=e;return Array.isArray(r)?r.includes({...n,...i}[t]):({...n,...i})[t]===r})?[...e,r,o]:e},[]),null==e?void 0:e.class,null==e?void 0:e.className)}),eaw=(0,el.memo)(({icon:e,size:t,color:r,fill:n="transparent",className:o,focusable:i,spin:l,fillRule:c,fillOpacity:a,ref:u,...s})=>{let{color:f,fill:p,fillOpacity:y,fillRule:b,focusable:m,className:v,size:h,...d}=(0,el.use)(ead),{size:g,strokeWidth:O}=(0,el.useMemo)(()=>(e=>{let t,r;if("number"==typeof e||e instanceof Number)return{size:e};switch(e){case"large":t=24,r=2;break;case"middle":t=20,r=2;break;case"small":t=14,r=2;break;default:e?(t=e?.size||24,r=e?.strokeWidth||2):(t="1em",r=2)}return{size:t,strokeWidth:r}})(t||h),[t,h]);return(0,ei.jsx)("span",{className:eam(eax({spin:l}),v,o),role:"img",...d,...s,children:e&&((0,el.isValidElement)(e)?e:(0,ei.jsx)(e,{color:r||f,fill:n||p,fillOpacity:a||y,fillRule:c||b,focusable:i||m,height:g,ref:u,size:g,strokeWidth:O,width:g}))})});eaw.displayName="Icon";let eaP=(...e)=>e.filter((e,t,r)=>!!e&&""!==e.trim()&&r.indexOf(e)===t).join(" ").trim(),eaS=e=>{let t=e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,r)=>r?r.toUpperCase():t.toLowerCase());return t.charAt(0).toUpperCase()+t.slice(1)};var eaz={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};let eaE=(0,el.forwardRef)(({color:e="currentColor",size:t=24,strokeWidth:r=2,absoluteStrokeWidth:n,className:o="",children:i,iconNode:l,...c},a)=>(0,el.createElement)("svg",{ref:a,...eaz,width:t,height:t,stroke:e,strokeWidth:n?24*Number(r)/Number(t):r,className:eaP("lucide",o),...!i&&!(e=>{for(let t in e)if(t.startsWith("aria-")||"role"===t||"title"===t)return!0;return!1})(c)&&{"aria-hidden":"true"},...c},[...l.map(([e,t])=>(0,el.createElement)(e,t)),...Array.isArray(i)?i:[i]])),eak=(Q="Provider",ee=[["path",{d:"M15.4 17.4L18.6 14.6C18.7904 14.4162 19.0152 14.2716 19.2615 14.1746C19.5077 14.0776 19.7707 14.0301 20.0354 14.0347C20.3 14.0394 20.5611 14.0961 20.8039 14.2017C21.0466 14.3072 21.2662 14.4596 21.45 14.65C21.6339 14.8404 21.7784 15.0652 21.8754 15.3115C21.9724 15.5577 22.0199 15.8207 22.0153 16.0854C22.0106 16.35 21.9539 16.6111 21.8483 16.8539C21.7428 17.0966 21.5904 17.3162 21.4 17.5L17.8 20.8C17.1 21.6 16.1 22 15 22H11C9.9 22 8.9 21.6 8.2 20.8L6.898 19.336C6.80426 19.2304 6.68923 19.1459 6.56048 19.088C6.43173 19.0301 6.29218 19.0001 6.151 19H5",key:"1"}],["path",{d:"M2 14H14C14.5304 14 15.0391 14.2107 15.4142 14.5858C15.7893 14.9609 16 15.4696 16 16C16 16.5304 15.7893 17.0391 15.4142 17.4142C15.0391 17.7893 14.5304 18 14 18H12",key:"2"}],["path",{d:"M5 14V20C5 20.265 4.895 20.52 4.707 20.707 4.52 20.895 4.265 21 4 21H2M17.598 6.5C17.828 6.101 17.964 5.655 17.994 5.196 18.024 4.737 17.948 4.277 17.772 3.852 17.596 3.427 17.324 3.048 16.978 2.744 16.632 2.441 16.221 2.221 15.777 2.102 15.332 1.983 14.866 1.968 14.415 2.058 13.963 2.147 13.539 2.34 13.174 2.62 12.809 2.9 12.513 3.26 12.309 3.673 12.106 4.086 12 4.54 12 5 12 4.54 11.894 4.086 11.691 3.673 11.487 3.26 11.191 2.9 10.826 2.62 10.461 2.34 10.037 2.147 9.585 2.058 9.134 1.968 8.668 1.983 8.224 2.102 7.779 2.221 7.368 2.441 7.022 2.744 6.676 3.048 6.404 3.427 6.228 3.852 6.052 4.277 5.976 4.737 6.006 5.196 6.037 5.655 6.172 6.101 6.402 6.5",key:"3"}],["path",{d:"M17.997 5.125C18.585 5.276 19.131 5.559 19.593 5.952 20.055 6.346 20.422 6.839 20.665 7.395 20.909 7.951 21.022 8.555 20.998 9.161 20.973 9.768 20.811 10.361 20.523 10.895M6.003 5.125C5.415 5.276 4.869 5.559 4.407 5.952 3.945 6.346 3.578 6.839 3.335 7.395 3.091 7.951 2.978 8.555 3.002 9.161 3.027 9.768 3.189 10.361 3.477 10.895M15 11C14.135 10.747 13.375 10.221 12.834 9.5 12.293 8.778 12.001 7.901 12 7 12 7.901 11.707 8.778 11.166 9.5 10.625 10.221 9.865 10.747 9 11M12 8V5",key:"4"}]],(y=(0,el.forwardRef)(({className:e,...t},r)=>(0,el.createElement)(eaE,{ref:r,iconNode:ee,className:eaP(`lucide-${eaS(Q).replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()}`,`lucide-${Q}`,e),...t}))).displayName=eaS(Q),y);function eaM(e){return(eaM="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}eak.displayName="ProviderIcon";var eaC=["color","size"];function eaD(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}var eaN=(0,el.memo)(function(e){var t=e.color,r=e.size,n=function(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],!(t.indexOf(r)>=0)&&Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}(e,eaC);return(0,ei.jsx)(eaw,function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?eaD(Object(r),!0).forEach(function(t){var n,o,i;n=e,o=t,i=r[t],(o=function(e){var t=function(e,t){if("object"!=eaM(e)||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!=eaM(n))return n;throw TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==eaM(t)?t:String(t)}(o))in n?Object.defineProperty(n,o,{value:i,enumerable:!0,configurable:!0,writable:!0}):n[o]=i}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):eaD(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))})}return e}({color:t||eah.colorTextDescription,icon:eak,size:void 0===r?12:r},n))});function eaT(e){return(eaT="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function eaA(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}var eaI=(0,el.memo)(function(e){var t=e.shape,r=e.color,n=e.background,o=e.size,i=e.style,l=e.iconMultiple,c=e.iconStyle,a=e.iconClassName;return(0,ei.jsx)(ef,{flex:"none",style:function(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?eaA(Object(r),!0).forEach(function(t){var n,o,i;n=e,o=t,i=r[t],(o=function(e){var t=function(e,t){if("object"!=eaT(e)||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!=eaT(n))return n;throw TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==eaT(t)?t:String(t)}(o))in n?Object.defineProperty(n,o,{value:i,enumerable:!0,configurable:!0,writable:!0}):n[o]=i}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):eaA(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))})}return e}({background:n||eah.colorFillSecondary,borderRadius:"circle"===(void 0===t?"circle":t)?"50%":Math.floor(.1*o),color:r,height:o,width:o},i),children:(0,ei.jsx)(eaN,{className:a,color:r,size:o*(void 0===l?.6:l),style:c})})});function eaV(e){return(eaV="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var eaH=["provider","size","type","forceMono","shape"];function ea$(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}function eaL(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?ea$(Object(r),!0).forEach(function(t){var n,o,i;n=e,o=t,i=r[t],(o=function(e){var t=function(e,t){if("object"!=eaV(e)||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!=eaV(n))return n;throw TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==eaV(t)?t:String(t)}(o))in n?Object.defineProperty(n,o,{value:i,enumerable:!0,configurable:!0,writable:!0}):n[o]=i}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):ea$(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))})}return e}function eaR(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}var eaB=(0,el.memo)(function(e){var t,r,n,o,i,l,c,a=e.provider,u=e.size,s=e.type,f=e.forceMono,p=e.shape,y=function(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r,n,o={},i=Object.keys(e);for(n=0;n<i.length;n++)r=i[n],t.indexOf(r)>=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],!(t.indexOf(r)>=0)&&Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}(e,eaH),b=(0,el.useMemo)(function(){if(a){var e,t=a.toLowerCase(),r=function(e,t){var r="u">typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!r){if(Array.isArray(e)||(r=function(e,t){if(e){if("string"==typeof e)return eaR(e,void 0);var r=Object.prototype.toString.call(e).slice(8,-1);if("Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r)return Array.from(e);if("Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return eaR(e,void 0)}}(e))){r&&(e=r);var n=0,o=function(){};return{s:o,n:function(){return n>=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:o}}throw TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,l=!0,c=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return l=e.done,e},e:function(e){c=!0,i=e},f:function(){try{l||null==r.return||r.return()}finally{if(c)throw i}}}}(QU);try{for(r.s();!(e=r.n()).done;){var n=e.value;if(n.keywords.some(function(e){return e.toLowerCase()===t}))return n}}catch(e){r.e(e)}finally{r.f()}}},[a]),m=eaL(eaL({size:void 0===u?12:u},null==b?void 0:b.props),y);switch(void 0===s?"avatar":s){case"avatar":if(!(null!=b&&b.Icon))return(0,ei.jsx)(eaI,eaL({shape:p},m));return(0,ei.jsx)(b.Icon.Avatar,eaL({shape:p},m));case"mono":if(!(null!=b&&b.Icon))return(0,ei.jsx)(eaN,eaL({},m));if(!f&&a===QC.LobeHub)return(0,ei.jsx)(b.Icon.Color,eaL({},m));return(0,ei.jsx)(b.Icon,eaL({},m));case"color":if(!(null!=b&&b.Icon))return(0,ei.jsx)(eaN,eaL({},m));return null!=(t=b.Icon)&&t.Color?(0,ei.jsx)(b.Icon.Color,eaL({},m)):(0,ei.jsx)(b.Icon,eaL({},m));case"combine":if(!(null!=b&&b.Icon))return(0,ei.jsx)(eaN,eaL({},m));return null!=(r=b.Icon)&&r.Combine?(0,ei.jsx)(b.Icon.Combine,eaL({type:"mono"},m)):null!=(n=b.Icon)&&n.Brand?(0,ei.jsx)(b.Icon.Brand,eaL({},m)):null!=(o=b.Icon)&&o.Text?(0,ei.jsx)(b.Icon.Text,eaL({},m)):(0,ei.jsx)(b.Icon,eaL({},m));case"combine-color":if(!(null!=b&&b.Icon))return(0,ei.jsx)(eaN,eaL({},m));return null!=(i=b.Icon)&&i.Combine?(0,ei.jsx)(b.Icon.Combine,eaL({type:"color"},m)):null!=(l=b.Icon)&&l.BrandColor?(0,ei.jsx)(b.Icon.BrandColor,eaL({},m)):null!=(c=b.Icon)&&c.Text?(0,ei.jsx)(b.Icon.Text,eaL({},m)):(0,ei.jsx)(b.Icon,eaL({},m));default:return(0,ei.jsx)(eaN,eaL({},m))}});eaB.displayName="ProviderIcon";let eaF={openai:"openai",anthropic:"anthropic",claude:"anthropic",gemini:"google",google:"google",deepseek:"deepseek",groq:"groq",mistral:"mistral",cohere:"cohere",perplexity:"perplexity",xai:"xai",grok:"xai",together:"togetherai",fireworks:"fireworks","fireworks-ai":"fireworks",cerebras:"cerebras",huggingface:"huggingface","hugging-face":"huggingface",openrouter:"openrouter","open-router":"openrouter",ollama:"ollama",minimax:"minimax",qwen:"qwen",alibaba:"qwen",moonshot:"moonshot",kimi:"moonshot",baidu:"baidu",ernie:"baidu",spark:"iflytek","zhipu-ai":"zhipu",zhipu:"zhipu",lmsys:"lmsys","stability-ai":"stability",stability:"stability",replicate:"replicate",ai21:"ai21",nvidia:"nvidia",cloudflare:"cloudflare","cloudflare-ai":"cloudflare","aws-bedrock":"bedrock",bedrock:"bedrock",azure:"azure","azure-openai":"azure",copilot:"githubcopilot","github-copilot":"githubcopilot",mistralai:"mistral",codex:"openai",blackbox:"blackboxai",blackboxai:"blackboxai",pollinations:"pollinations"};class ea_ extends el.Component{constructor(e){super(e),this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(){this.props.onError()}render(){return this.state.hasError?null:this.props.children}}function eaU({size:e}){return(0,ei.jsxs)("svg",{width:e,height:e,viewBox:"0 0 24 24",fill:"none",style:{flex:"none"},children:[(0,ei.jsx)("circle",{cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"1.5",opacity:"0.4"}),(0,ei.jsx)("path",{d:"M8 12h8M12 8v8",stroke:"currentColor",strokeWidth:"1.5",strokeLinecap:"round"})]})}let eaq=new Set(["aimlapi","alibaba","alicode-intl","alicode","anthropic-m","anthropic","antigravity","bailian-coding-plan","blackbox","brave-search","brave","cerebras","claude","cline","codex","cohere","continue","copilot","cursor","deepgram","deepseek","droid","exa-search","fireworks","gemini-cli","gemini","github","glm","groq","iflow","ironclaw","kilo-gateway","kilocode","kimi-coding-apikey","kimi-coding","kimi","kiro","longcat","minimax-cn","minimax","mistral","nanobot","nebius","nvidia","oai-cc","oai-r","ollama-cloud","openai","openclaw","openrouter","perplexity-search","perplexity","pollinations","qwen","roo","serper-search","serper","siliconflow","tavily-search","tavily","together","xai","zeroclaw"]),eaW=new Set(["apikey","assemblyai","brave","cartesia","cloudflare-ai","comfyui","elevenlabs","exa-search","exa","huggingface","hyperbolic","inworld","nanobanana","oauth","opencode-go","opencode-zen","opencode","playht","puter","scaleway","sdwebui","synthetic","vertex","windsurf","zai"]),eaG=(0,el.memo)(function({providerId:e,size:t=24,type:r="color",className:n,style:o}){let i=e.toLowerCase(),l=eaF[i]??null,c=eaq.has(i),a=eaW.has(i),[u,s]=(0,el.useState)(null!==l),[f,p]=(0,el.useState)(c),[y,b]=(0,el.useState)(!c&&a);return u&&l?(0,ei.jsx)("span",{className:n,style:{display:"inline-flex",alignItems:"center",...o},children:(0,ei.jsx)(ea_,{onError:()=>s(!1),children:(0,ei.jsx)(eaB,{provider:l,size:t,type:r})})}):f?(0,ei.jsx)("span",{className:n,style:{display:"inline-flex",alignItems:"center",...o},children:(0,ei.jsx)(ec.default,{src:`/providers/${i}.png`,alt:e,width:t,height:t,style:{objectFit:"contain"},onError:()=>{p(!1),b(a)},unoptimized:!0})}):y?(0,ei.jsx)("span",{className:n,style:{display:"inline-flex",alignItems:"center",...o},children:(0,ei.jsx)(ec.default,{src:`/providers/${i}.svg`,alt:e,width:t,height:t,style:{objectFit:"contain"},onError:()=>b(!1),unoptimized:!0})}):(0,ei.jsx)("span",{className:n,style:{display:"inline-flex",alignItems:"center",...o},children:(0,ei.jsx)(eaU,{size:t})})});e.s(["default",0,eaG],393162)},6998,e=>{"use strict";var t=e.i(843476),r=e.i(618566),n=e.i(522016),o=e.i(657688),i=e.i(745009),l=e.i(897844),c=e.i(932993),a=e.i(31954),u=e.i(156221),s=e.i(393162),f=e.i(948148),p=e.i(623249);function y({onMenuClick:e,showMenuButton:i=!0}){let y=(0,r.usePathname)(),b=(0,r.useRouter)(),m=(0,f.useTranslations)("header"),{title:v,description:h,breadcrumbs:d}=function(e){let t=(0,f.useTranslations)("header");if(!e)return{title:"",description:"",breadcrumbs:[]};let r=e.match(/\/providers\/([^/]+)$/);if(r){let e=r[1],n=p.OAUTH_PROVIDERS[e]||p.FREE_PROVIDERS[e]||p.APIKEY_PROVIDERS[e];if(n)return{title:n.name,description:"",breadcrumbs:[{label:t("providers"),href:"/dashboard/providers"},{label:n.name,providerId:n.id}]};if(e.startsWith(p.OPENAI_COMPATIBLE_PREFIX))return{title:t("openaiCompatible"),description:"",breadcrumbs:[{label:t("providers"),href:"/dashboard/providers"},{label:t("openaiCompatible"),providerId:"oai-cc"}]};if(e.startsWith(p.ANTHROPIC_COMPATIBLE_PREFIX))return{title:t("anthropicCompatible"),description:"",breadcrumbs:[{label:t("providers"),href:"/dashboard/providers"},{label:t("anthropicCompatible"),providerId:"anthropic-m"}]}}return e.includes("/providers")?{title:t("providers"),description:t("providerDescription"),breadcrumbs:[]}:e.includes("/combos")?{title:t("combos"),description:t("comboDescription"),breadcrumbs:[]}:e.includes("/usage")?{title:t("usage"),description:t("usageDescription"),breadcrumbs:[]}:e.includes("/analytics")?{title:t("analytics"),description:t("analyticsDescription"),breadcrumbs:[]}:e.includes("/cli-tools")?{title:t("cliTools"),description:t("cliToolsDescription"),breadcrumbs:[]}:"/dashboard"===e?{title:t("home"),description:t("homeDescription"),breadcrumbs:[]}:e.includes("/mcp")?{title:t("mcp"),description:t("mcpDescription"),breadcrumbs:[]}:e.includes("/a2a")?{title:t("a2a"),description:t("a2aDescription"),breadcrumbs:[]}:e.includes("/endpoint")?{title:t("endpoint"),description:t("endpointDescription"),breadcrumbs:[]}:e.includes("/profile")?{title:t("settings"),description:t("settingsDescription"),breadcrumbs:[]}:{title:"",description:"",breadcrumbs:[]}}(y),g=async()=>{try{(await fetch("/api/auth/logout",{method:"POST"})).ok&&(b.push("/login"),b.refresh())}catch(e){console.error("Failed to logout:",e)}};return(0,t.jsxs)("header",{className:"flex items-center justify-between px-8 py-5 border-b border-black/5 dark:border-white/5 bg-bg/80 backdrop-blur-xl z-10 sticky top-0",children:[(0,t.jsx)("div",{className:"flex items-center gap-3 lg:hidden",children:i&&(0,t.jsx)("button",{onClick:e,className:"text-text-main hover:text-primary transition-colors",children:(0,t.jsx)("span",{className:"material-symbols-outlined",children:"menu"})})}),(0,t.jsx)("div",{className:"hidden lg:flex flex-col",children:d.length>0?(0,t.jsx)("div",{className:"flex items-center gap-2",children:d.map((e,r)=>(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[r>0&&(0,t.jsx)("span",{className:"material-symbols-outlined text-text-muted text-base",children:"chevron_right"}),e.href?(0,t.jsx)(n.default,{href:e.href,className:"text-text-muted hover:text-primary transition-colors",children:e.label}):(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[e.image&&(0,t.jsx)(o.default,{src:e.image,alt:e.label,width:28,height:28,className:"object-contain rounded max-w-[28px] max-h-[28px]",sizes:"28px",onError:e=>{e.currentTarget.style.display="none"}}),e.providerId&&(0,t.jsx)(s.default,{providerId:e.providerId,size:28,type:"color"}),(0,t.jsx)("h1",{className:"text-2xl font-semibold text-text-main tracking-tight",children:e.label})]})]},`${e.label}-${e.href||"current"}`))}):v?(0,t.jsxs)("div",{children:[(0,t.jsx)("h1",{className:"text-2xl font-semibold text-text-main tracking-tight",children:v}),h&&(0,t.jsx)("p",{className:"text-sm text-text-muted",children:h})]}):null}),(0,t.jsxs)("div",{className:"flex items-center gap-3 ml-auto",children:[(0,t.jsx)(u.default,{}),(0,t.jsx)(l.default,{}),(0,t.jsx)(a.default,{}),(0,t.jsx)(c.default,{}),(0,t.jsx)("button",{onClick:g,className:"flex items-center justify-center p-2 rounded-lg text-text-muted hover:text-red-500 hover:bg-red-500/10 transition-all",title:m("logout"),children:(0,t.jsx)("span",{className:"material-symbols-outlined",children:"logout"})})]})]})}y.propTypes={onMenuClick:i.default.func,showMenuButton:i.default.bool},e.s(["default",()=>y])},982131,e=>{"use strict";var t=e.i(843476),r=e.i(948148),n=e.i(522016),o=e.i(497769);let i=[{label:"Features",href:"#features"},{label:"Pricing",href:"#pricing"},{label:"Changelog",href:"https://github.com/diegosouzapw/OmniRoute/releases",external:!0}],l=[{label:"Documentation",href:"/docs"},{label:"API Reference",href:"/docs#api-reference"},{label:"Help Center",href:"https://github.com/diegosouzapw/OmniRoute/discussions",external:!0}],c=[{label:"About",href:"https://github.com/diegosouzapw/OmniRoute",external:!0},{label:"Blog",href:"https://github.com/diegosouzapw/OmniRoute/releases",external:!0},{label:"Contact",href:"https://github.com/diegosouzapw/OmniRoute/issues/new/choose",external:!0},{label:"Terms",href:"/terms"},{label:"Privacy",href:"/privacy"}];function a(){let e=(0,r.useTranslations)("stats"),a=e=>e.external?(0,t.jsx)("a",{href:e.href,target:"_blank",rel:"noopener noreferrer",className:"hover:text-primary transition-colors",children:e.label}):(0,t.jsx)(n.default,{href:e.href,className:"hover:text-primary transition-colors",children:e.label});return(0,t.jsx)("footer",{className:"bg-bg border-t border-border pt-16 pb-12",children:(0,t.jsxs)("div",{className:"container mx-auto px-4 sm:px-6 lg:px-8",children:[(0,t.jsxs)("div",{className:"grid grid-cols-2 md:grid-cols-4 lg:grid-cols-5 gap-10 mb-12",children:[(0,t.jsxs)("div",{className:"col-span-2 lg:col-span-2",children:[(0,t.jsxs)("div",{className:"flex items-center gap-2 mb-6",children:[(0,t.jsx)("div",{className:"size-6 text-primary",children:(0,t.jsx)("svg",{className:"w-full h-full",fill:"currentColor",viewBox:"0 0 48 48",children:(0,t.jsx)("path",{clipRule:"evenodd",d:"M12.0799 24L4 19.2479L9.95537 8.75216L18.04 13.4961L18.0446 4H29.9554L29.96 13.4961L38.0446 8.75216L44 19.2479L35.92 24L44 28.7521L38.0446 39.2479L29.96 34.5039L29.9554 44H18.0446L18.04 34.5039L9.95537 39.2479L4 28.7521L12.0799 24Z",fillRule:"evenodd"})})}),(0,t.jsx)("span",{className:"text-xl font-bold text-text-main",children:o.APP_CONFIG.name})]}),(0,t.jsx)("p",{className:"text-text-muted mb-6 max-w-sm font-light",children:"The unified interface for modern AI infrastructure. Secure, observable, and scalable."}),(0,t.jsxs)("div",{className:"flex gap-4",children:[(0,t.jsx)("a",{href:"https://github.com/diegosouzapw/OmniRoute/discussions",target:"_blank",rel:"noopener noreferrer",className:"text-gray-400 hover:text-primary transition-colors","aria-label":"Community Discussions",children:(0,t.jsx)("svg",{className:"w-5 h-5",fill:"currentColor",viewBox:"0 0 24 24",children:(0,t.jsx)("path",{d:"M22.46 6c-.77.35-1.6.58-2.46.69.88-.53 1.56-1.37 1.88-2.38-.83.5-1.75.85-2.72 1.05C18.37 4.5 17.26 4 16 4c-2.35 0-4.27 1.92-4.27 4.29 0 .34.04.67.11.98C8.28 9.09 5.11 7.38 3 4.79c-.37.63-.58 1.37-.58 2.15 0 1.49.75 2.81 1.91 3.56-.71 0-1.37-.2-1.95-.5v.03c0 2.08 1.48 3.82 3.44 4.21a4.22 4.22 0 0 1-1.93.07 4.28 4.28 0 0 0 4 2.98 8.521 8.521 0 0 1-5.33 1.84c-.34 0-.68-.02-1.02-.06C3.44 20.29 5.7 21 8.12 21 16 21 20.33 14.46 20.33 8.79c0-.19 0-.37-.01-.56.84-.6 1.56-1.36 2.14-2.23z"})})}),(0,t.jsx)("a",{href:"https://github.com/diegosouzapw/OmniRoute",target:"_blank",rel:"noopener noreferrer",className:"text-gray-400 hover:text-primary transition-colors","aria-label":"GitHub",children:(0,t.jsx)("svg",{className:"w-5 h-5",fill:"currentColor",viewBox:"0 0 24 24",children:(0,t.jsx)("path",{d:"M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0 1 12 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0 0 22 12.017C22 6.484 17.522 2 12 2z"})})})]})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("h4",{className:"font-semibold text-text-main mb-4",children:e("product")}),(0,t.jsx)("ul",{className:"flex flex-col gap-3 text-sm text-text-muted font-light",children:i.map(e=>(0,t.jsx)("li",{children:a(e)},e.label))})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("h4",{className:"font-semibold text-text-main mb-4",children:e("resources")}),(0,t.jsx)("ul",{className:"flex flex-col gap-3 text-sm text-text-muted font-light",children:l.map(e=>(0,t.jsx)("li",{children:a(e)},e.label))})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("h4",{className:"font-semibold text-text-main mb-4",children:e("company")}),(0,t.jsx)("ul",{className:"flex flex-col gap-3 text-sm text-text-muted font-light",children:c.map(e=>(0,t.jsx)("li",{children:a(e)},e.label))})]})]}),(0,t.jsxs)("div",{className:"border-t border-border pt-8 flex flex-col md:flex-row justify-between items-center gap-4",children:[(0,t.jsxs)("p",{className:"text-sm text-text-muted",children:["© ",new Date().getFullYear()," ",o.APP_CONFIG.name," Inc. All rights reserved."]}),(0,t.jsxs)("div",{className:"flex gap-6 text-sm text-text-muted",children:[(0,t.jsx)("a",{href:"/docs",className:"hover:text-primary transition-colors",children:"Documentation"}),(0,t.jsx)(n.default,{href:"/terms",className:"hover:text-primary transition-colors",children:"Terms"}),(0,t.jsx)(n.default,{href:"/privacy",className:"hover:text-primary transition-colors",children:"Privacy"}),(0,t.jsx)("a",{href:"https://github.com/diegosouzapw/OmniRoute/blob/main/LICENSE",target:"_blank",rel:"noopener noreferrer",className:"hover:text-primary transition-colors",children:"License"})]})]})]})})}e.s(["default",()=>a])},556938,e=>{"use strict";var t=e.i(271645),r=e.i(950914);function n(e=2e3){let[o,i]=(0,t.useState)(null),l=(0,t.useRef)(null);return{copied:o,copy:(0,t.useCallback)(async(t,n="default")=>{let o=await (0,r.copyToClipboard)(t);return o&&(i(n),l.current&&clearTimeout(l.current),l.current=setTimeout(()=>{i(null)},e)),o},[e])}}e.s(["useCopyToClipboard",()=>n])},116016,e=>{"use strict";var t=e.i(247167),r=e.i(843476),n=e.i(271645),o=e.i(745009),i=e.i(703166),l=e.i(342923),c=e.i(80173),a=e.i(556938);let u=new Set(["antigravity","gemini-cli"]);function s({isOpen:e,provider:o,providerInfo:s,onSuccess:f,onClose:p,idcConfig:y}){let[b,m]=(0,n.useState)("waiting"),[v,h]=(0,n.useState)(null),[d,g]=(0,n.useState)(""),[O,j]=(0,n.useState)(null),[x,w]=(0,n.useState)(!1),[P,S]=(0,n.useState)(null),[z,E]=(0,n.useState)(!1),k=(0,n.useRef)(null),{copied:M,copy:C}=(0,a.useCopyToClipboard)(),[D,N]=(0,n.useState)(!1),[T,A]=(0,n.useState)("/callback?code=..."),I=(0,n.useRef)(!1),V=(0,n.useRef)(!1),[H,$]=(0,n.useState)(!1);(0,n.useEffect)(()=>{{let e=window.location.hostname,t="localhost"===e||"127.0.0.1"===e||e.startsWith("192.168.")||e.startsWith("10.")||/^172\.(1[6-9]|2\d|3[01])\./.test(e),r="localhost"===e||"127.0.0.1"===e;N(t),$(r),A(`${window.location.origin}/callback?code=...`)}},[]);let L=(0,n.useCallback)(async(e,t)=>{if(v)try{let r=await fetch(`/api/oauth/${o}/exchange`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:e,redirectUri:v.redirectUri,codeVerifier:v.codeVerifier,state:t})}),n=await r.json();if(!r.ok){let e="object"==typeof n.error&&null!==n.error?n.error.message||JSON.stringify(n.error):n.error||"Exchange failed";throw Error(e)}m("success"),f?.()}catch(e){e.message?.toLowerCase().includes("redirect_uri_mismatch")&&u.has(o)?j("redirect_uri_mismatch: The default Google OAuth credentials only work on localhost. For remote use, configure your own OAuth credentials via environment variables: "+("antigravity"===o?"ANTIGRAVITY_OAUTH_CLIENT_ID and ANTIGRAVITY_OAUTH_CLIENT_SECRET":"GEMINI_OAUTH_CLIENT_ID and GEMINI_OAUTH_CLIENT_SECRET")+". See the README section 'OAuth on a Remote Server'."):j(e.message),m("error")}},[v,o,f]),R=(0,n.useCallback)(async(e,t,r,n)=>{E(!0);for(let i=0;i<60;i++){await new Promise(e=>setTimeout(e,1e3*r));try{let i=await fetch(`/api/oauth/${o}/poll`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({deviceCode:e,codeVerifier:t,extraData:n})}),l=await i.json();if(l.success){m("success"),E(!1),f?.();return}if("expired_token"===l.error||"access_denied"===l.error)throw Error(l.errorDescription||l.error);"slow_down"===l.error&&(r=Math.min(r+5,30))}catch(e){j(e.message),m("error"),E(!1);return}}j("Authorization timeout"),m("error"),E(!1)},[o,f]),B=(0,n.useCallback)(async()=>{if(o)try{let e;if(j(null),"github"===o||"qwen"===o||"kiro"===o||"kimi-coding"===o||"kilocode"===o){w(!0),m("waiting");let e=await fetch(`/api/oauth/${o}/device-code`),t=await e.json();if(!e.ok){let e="object"==typeof t.error&&null!==t.error?t.error.message||JSON.stringify(t.error):t.error||"Request failed";throw Error(e)}S(t);let r=t.verification_uri_complete||t.verification_uri;r&&window.open(r,"oauth_verify");let n="kiro"===o?{_clientId:t._clientId,_clientSecret:t._clientSecret}:null;R(t.device_code,t.codeVerifier,t.interval||5,n);return}let r=!1;if("codex"===o&&D)try{let e=await fetch("/api/oauth/codex/start-callback-server"),t=await e.json();if(!e.ok)throw Error(t.error);h({...t,redirectUri:t.redirectUri}),m("waiting"),k.current=window.open(t.authUrl,"oauth_auth"),k.current||m("input"),E(!0);for(let e=0;e<150;e++){await new Promise(e=>setTimeout(e,2e3));let e=await fetch("/api/oauth/codex/poll-callback",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({})}),t=await e.json();if(t.success){m("success"),E(!1),f?.();return}if(t.error&&!t.pending)throw Error(t.errorDescription||t.error)}throw E(!1),Error("Authorization timeout")}catch(e){console.warn("Codex callback server failed, falling back to standard manual flow",e),E(!1),r=!0}if("codex"===o||"openai"===o)e="http://localhost:1455/auth/callback";else if(u.has(o)){let t=window.location.port||"20128";e=`http://localhost:${t}/callback`}else if(D){let t=window.location.port||("https:"===window.location.protocol?"443":"80");e=`http://localhost:${t}/callback`}else{let r=t.default.env.NEXT_PUBLIC_BASE_URL,n=r&&"http://localhost:20128"!==r?r.replace(/\/$/,""):window.location.origin;e=`${n}/callback`}let n=await fetch(`/api/oauth/${o}/authorize?redirect_uri=${encodeURIComponent(e)}`),i=await n.json();if(!n.ok){let e="object"==typeof i.error&&null!==i.error?i.error.message||JSON.stringify(i.error):i.error||"Authorization failed";throw Error(e)}h({...i,redirectUri:e}),!H||r?(m("input"),window.open(i.authUrl,"oauth_auth")):(m("waiting"),k.current=window.open(i.authUrl,"oauth_popup","width=600,height=700"),k.current||m("input"))}catch(e){j(e.message),m("error")}},[o,D,H,R,f]);(0,n.useEffect)(()=>{e||(V.current=!1)},[e]),(0,n.useEffect)(()=>{e&&o&&(V.current||(V.current=!0,h(null),g(""),j(null),w(!1),S(null),E(!1),B()))},[e,o,B]),(0,n.useEffect)(()=>{let e;if(!v)return;I.current=!1;let t=async e=>{if(I.current)return;let{code:t,state:r,error:n,errorDescription:o}=e;if(n){I.current=!0,j(o||n),m("error");return}t&&(I.current=!0,await L(t,r))},r=e=>{let r=window.location.port,n=e.origin.match(/^https?:\/\/(localhost|127\.0\.0\.1)(:\d+)?$/)&&new URL(e.origin).port===r;(e.origin===window.location.origin||n)&&e.data?.type==="oauth_callback"&&t(e.data.data)};window.addEventListener("message",r);try{(e=new BroadcastChannel("oauth_callback")).onmessage=e=>t(e.data)}catch(e){console.log("BroadcastChannel not supported")}let n=e=>{if("oauth_callback"===e.key&&e.newValue)try{let r=JSON.parse(e.newValue);t(r),localStorage.removeItem("oauth_callback")}catch(e){console.log("Failed to parse localStorage data")}};window.addEventListener("storage",n);try{let e=localStorage.getItem("oauth_callback");if(e){let r=JSON.parse(e);r.timestamp&&Date.now()-r.timestamp<3e4&&(t(r),localStorage.removeItem("oauth_callback"))}}catch{}return()=>{window.removeEventListener("message",r),window.removeEventListener("storage",n),e&&e.close()}},[v,L]),(0,n.useEffect)(()=>{if("waiting"!==b||x||!k.current)return;let e=setInterval(()=>{if(I.current)return void clearInterval(e);try{k.current?.closed&&(clearInterval(e),"waiting"===b&&m("input"))}catch{}},1e3),t=setTimeout(()=>{I.current||"waiting"!==b||(clearInterval(e),m("input"))},3e5);return()=>{clearInterval(e),clearTimeout(t)}},[b,x]);let F=async()=>{try{j(null);let e=d.trim(),t=null,r=v?.state||null,n=null,o=null;try{let i=new URL(e);t=i.searchParams.get("code"),r=i.searchParams.get("state")||i.hash.replace(/^#/,"")||r,n=i.searchParams.get("error"),o=i.searchParams.get("error_description")}catch{let[n,o]=e.split("#",2);t=n||null,r=o||r}if(n)throw Error(o||n);if(!t)throw Error("No authorization code found. Paste the callback URL or the Authentication Code.");await L(t,r)}catch(e){j(e.message),m("error")}};return o&&s?(0,r.jsx)(i.default,{isOpen:e,title:`Connect ${s.name}`,onClose:p,size:"lg",children:(0,r.jsxs)("div",{className:"flex flex-col gap-4",children:["waiting"===b&&!x&&(0,r.jsxs)("div",{className:"text-center py-6",children:[(0,r.jsx)("div",{className:"size-16 mx-auto mb-4 rounded-full bg-primary/10 flex items-center justify-center",children:(0,r.jsx)("span",{className:"material-symbols-outlined text-3xl text-primary animate-spin",children:"progress_activity"})}),(0,r.jsx)("h3",{className:"text-lg font-semibold mb-2",children:"Waiting for Authorization"}),(0,r.jsx)("p",{className:"text-sm text-text-muted mb-2",children:"Complete the authorization in the popup window."}),(0,r.jsx)("p",{className:"text-xs text-text-muted mb-4 opacity-70",children:"If the popup closes without redirecting back (e.g. Qoder), this dialog will automatically switch to manual URL input mode."}),(0,r.jsx)(l.default,{variant:"ghost",onClick:()=>m("input"),children:"Popup blocked? Enter URL manually"})]}),"waiting"===b&&x&&P&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)("div",{className:"text-center py-4",children:[(0,r.jsx)("p",{className:"text-sm text-text-muted mb-4",children:"Visit the URL below and enter the code:"}),(0,r.jsxs)("div",{className:"bg-sidebar p-4 rounded-lg mb-4",children:[(0,r.jsx)("p",{className:"text-xs text-text-muted mb-1",children:"Verification URL"}),(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsx)("code",{className:"flex-1 text-sm break-all",children:P.verification_uri}),(0,r.jsx)(l.default,{size:"sm",variant:"ghost",icon:"verify_url"===M?"check":"content_copy",onClick:()=>C(P.verification_uri,"verify_url")})]})]}),(0,r.jsxs)("div",{className:"bg-primary/10 p-4 rounded-lg",children:[(0,r.jsx)("p",{className:"text-xs text-text-muted mb-1",children:"Your Code"}),(0,r.jsxs)("div",{className:"flex items-center justify-center gap-2",children:[(0,r.jsx)("p",{className:"text-2xl font-mono font-bold text-primary",children:P.user_code}),(0,r.jsx)(l.default,{size:"sm",variant:"ghost",icon:"user_code"===M?"check":"content_copy",onClick:()=>C(P.user_code,"user_code")})]})]})]}),z&&(0,r.jsxs)("div",{className:"flex items-center justify-center gap-2 text-sm text-text-muted",children:[(0,r.jsx)("span",{className:"material-symbols-outlined animate-spin",children:"progress_activity"}),"Waiting for authorization..."]})]}),"input"===b&&!x&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)("div",{className:"space-y-4",children:[!H&&u.has(o)&&(0,r.jsxs)("div",{className:"rounded-lg border border-amber-500/30 bg-amber-500/10 p-3 text-xs text-amber-200",children:[(0,r.jsx)("span",{className:"material-symbols-outlined text-sm align-middle mr-1",children:"warning"}),(0,r.jsx)("strong",{children:"Remote access + Google OAuth:"})," The default credentials only accept redirects to ",(0,r.jsx)("code",{children:"localhost"}),". After authorizing, your browser will try to open ",(0,r.jsx)("code",{children:"localhost"})," — copy that full URL and paste it below. For fully remote use without this manual step,"," ",(0,r.jsx)("a",{href:"https://github.com/diegosouzapw/OmniRoute#oauth-on-a-remote-server",target:"_blank",rel:"noreferrer",className:"underline",children:"configure your own OAuth credentials"}),"."]}),!H&&!u.has(o)&&(0,r.jsxs)("div",{className:"rounded-lg border border-blue-500/30 bg-blue-500/10 p-3 text-xs text-blue-200",children:[(0,r.jsx)("span",{className:"material-symbols-outlined text-sm align-middle mr-1",children:"info"}),(0,r.jsx)("strong",{children:"Remote access:"})," Since you're accessing OmniRoute remotely, after authorizing you'll see an error page (localhost not found). That's expected — just copy the full URL from your browser's address bar and paste it below."]}),(0,r.jsxs)("div",{children:[(0,r.jsx)("p",{className:"text-sm font-medium mb-2",children:"Step 1: Open this URL in your browser"}),(0,r.jsxs)("div",{className:"flex gap-2",children:[(0,r.jsx)(c.default,{value:v?.authUrl||"",readOnly:!0,className:"flex-1 font-mono text-xs"}),(0,r.jsx)(l.default,{variant:"secondary",icon:"auth_url"===M?"check":"content_copy",onClick:()=>C(v?.authUrl,"auth_url"),children:"Copy"})]})]}),(0,r.jsxs)("div",{children:[(0,r.jsx)("p",{className:"text-sm font-medium mb-2",children:"Step 2: Paste the callback URL or auth code here"}),(0,r.jsxs)("p",{className:"text-xs text-text-muted mb-2",children:["After authorization, paste the full callback URL. For Claude Code, you can also paste the Authentication Code directly, for example ",(0,r.jsx)("code",{children:"code#state"}),"."]}),(0,r.jsx)(c.default,{value:d,onChange:e=>g(e.target.value),placeholder:"claude"===o?"code#state or /callback?code=...":T,className:"font-mono text-xs"})]})]}),(0,r.jsxs)("div",{className:"flex gap-2",children:[(0,r.jsx)(l.default,{onClick:F,fullWidth:!0,disabled:!d,children:"Connect"}),(0,r.jsx)(l.default,{onClick:p,variant:"ghost",fullWidth:!0,children:"Cancel"})]})]}),"success"===b&&(0,r.jsxs)("div",{className:"text-center py-6",children:[(0,r.jsx)("div",{className:"size-16 mx-auto mb-4 rounded-full bg-green-100 dark:bg-green-900/30 flex items-center justify-center",children:(0,r.jsx)("span",{className:"material-symbols-outlined text-3xl text-green-600",children:"check_circle"})}),(0,r.jsx)("h3",{className:"text-lg font-semibold mb-2",children:"Connected Successfully!"}),(0,r.jsxs)("p",{className:"text-sm text-text-muted mb-4",children:["Your ",s.name," account has been connected."]}),(0,r.jsx)(l.default,{onClick:p,fullWidth:!0,children:"Done"})]}),"error"===b&&(0,r.jsxs)("div",{className:"text-center py-6",children:[(0,r.jsx)("div",{className:"size-16 mx-auto mb-4 rounded-full bg-red-100 dark:bg-red-900/30 flex items-center justify-center",children:(0,r.jsx)("span",{className:"material-symbols-outlined text-3xl text-red-600",children:"error"})}),(0,r.jsx)("h3",{className:"text-lg font-semibold mb-2",children:"Connection Failed"}),(0,r.jsx)("p",{className:"text-sm text-red-600 mb-4",children:O}),(0,r.jsxs)("div",{className:"flex gap-2",children:[(0,r.jsx)(l.default,{onClick:B,variant:"secondary",fullWidth:!0,children:"Try Again"}),(0,r.jsx)(l.default,{onClick:p,variant:"ghost",fullWidth:!0,children:"Cancel"})]})]})]})}):null}s.propTypes={isOpen:o.default.bool.isRequired,provider:o.default.string,providerInfo:o.default.shape({name:o.default.string}),onSuccess:o.default.func,onClose:o.default.func.isRequired},e.s(["default",()=>s])},279743,e=>{"use strict";var t=e.i(843476),r=e.i(271645),n=e.i(745009),o=e.i(703166);e.i(313705);var i=e.i(25230),l=e.i(623249);let c=[...Object.keys(l.OAUTH_PROVIDERS),...Object.keys(l.FREE_PROVIDERS),...Object.keys(l.APIKEY_PROVIDERS)];function a({isOpen:e,onClose:n,onSelect:a,selectedModel:u,activeProviders:s=[],title:f="Select Model",modelAliases:p={},addedModelValues:y=[]}){let[b,m]=(0,r.useState)(""),[v,h]=(0,r.useState)([]),[d,g]=(0,r.useState)([]),[O,j]=(0,r.useState)({}),x=async()=>{try{let e=await fetch("/api/combos");if(!e.ok)throw Error(`Failed to fetch combos: ${e.status}`);let t=await e.json();h(t.combos||[])}catch(e){console.error("Error fetching combos:",e),h([])}};(0,r.useEffect)(()=>{e&&x()},[e]);let w=async()=>{try{let e=await fetch("/api/provider-nodes");if(!e.ok)throw Error(`Failed to fetch provider nodes: ${e.status}`);let t=await e.json();g(t.nodes||[])}catch(e){console.error("Error fetching provider nodes:",e),g([])}};(0,r.useEffect)(()=>{e&&w()},[e]);let P=async()=>{try{let e=await fetch("/api/provider-models");if(!e.ok)throw Error(`Failed to fetch custom models: ${e.status}`);let t=await e.json();j(t.models||{})}catch(e){console.error("Error fetching custom models:",e),j({})}};(0,r.useEffect)(()=>{e&&P()},[e]);let S=(0,r.useMemo)(()=>({...l.OAUTH_PROVIDERS,...l.FREE_PROVIDERS,...l.APIKEY_PROVIDERS}),[]),z=(0,r.useMemo)(()=>{let e={};return[...new Set([...s.map(e=>e.provider)])].sort((e,t)=>{let r=c.indexOf(e),n=c.indexOf(t);return(-1===r?999:r)-(-1===n?999:n)}).forEach(t=>{let r=i.PROVIDER_ID_TO_ALIAS[t]||t,n=S[t]||{name:t,color:"#666"},o=(0,l.isOpenAICompatibleProvider)(t)||(0,l.isAnthropicCompatibleProvider)(t),c=O[t]||[];if(n.passthroughModels){let o=Object.entries(p).filter(([,e])=>e.startsWith(`${r}/`)).map(([e,t])=>({id:t.replace(`${r}/`,""),name:e,value:t})),i=c.filter(e=>!o.some(t=>t.id===e.id)).map(e=>({id:e.id,name:e.name||e.id,value:`${r}/${e.id}`,isCustom:!0})),l=[...o,...i];if(l.length>0){let o=d.find(e=>e.id===t),i=o?.name||n.name;e[t]={name:i,alias:r,color:n.color,models:l}}}else if(o){let r=d.find(e=>e.id===t),o=r?.name||n.name,i=r?.prefix||t,l=Object.entries(p).filter(([,e])=>e.startsWith(`${t}/`)).map(([e,r])=>({id:r.replace(`${t}/`,""),name:e,value:`${i}/${r.replace(`${t}/`,"")}`})),a=c.filter(e=>!l.some(t=>t.id===e.id)).map(e=>({id:e.id,name:e.name||e.id,value:`${i}/${e.id}`,isCustom:!0})),u=[...l,...a];u.length>0&&(e[t]={name:o,alias:i,color:n.color,models:u,isCustom:!0,hasModels:!0})}else{let o=(0,i.getModelsByProviderId)(t),l=[...o.map(e=>({id:e.id,name:e.name,value:`${r}/${e.id}`})),...c.filter(e=>!o.some(t=>t.id===e.id)).map(e=>({id:e.id,name:e.name||e.id,value:`${r}/${e.id}`,isCustom:!0}))];l.length>0&&(e[t]={name:n.name,alias:r,color:n.color,models:l})}}),e},[s,p,S,d,O]),E=(0,r.useMemo)(()=>{if(!b.trim())return v;let e=b.toLowerCase();return v.filter(t=>t.name.toLowerCase().includes(e))},[v,b]),k=(0,r.useMemo)(()=>{if(!b.trim())return z;let e=b.toLowerCase(),t={};return Object.entries(z).forEach(([r,n])=>{let o=n.models.filter(t=>t.name.toLowerCase().includes(e)||t.id.toLowerCase().includes(e)),i=n.name.toLowerCase().includes(e);(o.length>0||i)&&(t[r]={...n,models:o})}),t},[z,b]),M=e=>{a(e),n(),m("")};return(0,t.jsxs)(o.default,{isOpen:e,onClose:()=>{n(),m("")},title:f,size:"md",className:"p-4!",children:[(0,t.jsx)("div",{className:"mb-3",children:(0,t.jsxs)("div",{className:"relative",children:[(0,t.jsx)("span",{className:"material-symbols-outlined absolute left-2.5 top-1/2 -translate-y-1/2 text-text-muted text-[16px]",children:"search"}),(0,t.jsx)("input",{type:"text",placeholder:"Search...",value:b,onChange:e=>m(e.target.value),className:"w-full pl-8 pr-3 py-1.5 bg-surface border border-border rounded text-xs focus:outline-none focus:ring-1 focus:ring-primary/50"})]})}),(0,t.jsxs)("div",{className:"max-h-[300px] overflow-y-auto space-y-3",children:[E.length>0&&(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"flex items-center gap-1.5 mb-1.5 sticky top-0 bg-surface py-0.5",children:[(0,t.jsx)("span",{className:"material-symbols-outlined text-primary text-[14px]",children:"layers"}),(0,t.jsx)("span",{className:"text-xs font-medium text-primary",children:"Combos"}),(0,t.jsxs)("span",{className:"text-[10px] text-text-muted",children:["(",E.length,")"]})]}),(0,t.jsx)("div",{className:"flex flex-wrap gap-1.5",children:E.map(e=>{let r=u===e.name;return(0,t.jsx)("button",{onClick:()=>M({id:e.name,name:e.name,value:e.name}),className:`
169
169
  px-2 py-1 rounded-xl text-xs font-medium transition-all border hover:cursor-pointer
170
170
  ${r?"bg-primary text-white border-primary":"bg-surface border-border text-text-main hover:border-primary/50 hover:bg-primary/5"}
171
171
  `,children:e.name},e.id)})})]}),Object.entries(k).map(([e,r])=>(0,t.jsxs)("div",{children:[(0,t.jsxs)("div",{className:"flex items-center gap-1.5 mb-1.5 sticky top-0 bg-surface py-0.5",children:[(0,t.jsx)("div",{className:"w-2 h-2 rounded-full",style:{backgroundColor:r.color}}),(0,t.jsx)("span",{className:"text-xs font-medium text-primary",children:r.name}),(0,t.jsxs)("span",{className:"text-[10px] text-text-muted",children:["(",r.models.length,")"]})]}),(0,t.jsx)("div",{className:"flex flex-wrap gap-1.5",children:r.models.map(e=>{let r=u===e.value,n=y.includes(e.value);return(0,t.jsxs)("button",{onClick:()=>M(e),className:`