vforclaude2 0.3.87

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 (1908) hide show
  1. package/.claude/.claude.json +5 -0
  2. package/.claude/backups/.claude.json.backup.1772012846605 +4 -0
  3. package/.claude/cowork_plugins/install-counts-cache.json +634 -0
  4. package/.claude/cowork_plugins/known_marketplaces.json +10 -0
  5. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/.claude-plugin/marketplace.json +115 -0
  6. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/LICENSE +202 -0
  7. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/README.md +80 -0
  8. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/bio-research/.claude-plugin/plugin.json +8 -0
  9. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/bio-research/.mcp.json +44 -0
  10. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/bio-research/LICENSE +202 -0
  11. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/bio-research/README.md +82 -0
  12. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/bio-research/skills/instrument-data-to-allotrope/LICENSE.txt +201 -0
  13. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/bio-research/skills/instrument-data-to-allotrope/requirements.txt +26 -0
  14. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/bio-research/skills/nextflow-development/LICENSE.txt +201 -0
  15. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/bio-research/skills/scientific-problem-selection/LICENSE.txt +201 -0
  16. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/bio-research/skills/scvi-tools/LICENSE.txt +201 -0
  17. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/bio-research/skills/single-cell-rna-qc/LICENSE.txt +201 -0
  18. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/cowork-plugin-management/.claude-plugin/plugin.json +8 -0
  19. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/cowork-plugin-management/LICENSE +202 -0
  20. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/cowork-plugin-management/skills/cowork-plugin-customizer/LICENSE.txt +202 -0
  21. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/cowork-plugin-management/skills/cowork-plugin-customizer/examples/customized-mcp.json +40 -0
  22. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/customer-support/.claude-plugin/plugin.json +8 -0
  23. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/customer-support/.mcp.json +40 -0
  24. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/customer-support/LICENSE +202 -0
  25. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/customer-support/README.md +139 -0
  26. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/design/.claude-plugin/plugin.json +8 -0
  27. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/design/.mcp.json +40 -0
  28. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/design/README.md +116 -0
  29. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/engineering/.claude-plugin/plugin.json +8 -0
  30. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/engineering/.mcp.json +44 -0
  31. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/engineering/README.md +135 -0
  32. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/enterprise-search/.claude-plugin/plugin.json +8 -0
  33. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/enterprise-search/.mcp.json +36 -0
  34. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/enterprise-search/LICENSE +202 -0
  35. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/enterprise-search/README.md +156 -0
  36. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/finance/.claude-plugin/plugin.json +8 -0
  37. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/finance/.mcp.json +32 -0
  38. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/finance/LICENSE +202 -0
  39. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/finance/README.md +91 -0
  40. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/human-resources/.claude-plugin/plugin.json +8 -0
  41. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/human-resources/.mcp.json +28 -0
  42. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/human-resources/README.md +134 -0
  43. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/legal/.claude-plugin/plugin.json +8 -0
  44. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/legal/.mcp.json +36 -0
  45. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/legal/LICENSE +202 -0
  46. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/legal/README.md +229 -0
  47. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/marketing/.claude-plugin/plugin.json +8 -0
  48. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/marketing/.mcp.json +48 -0
  49. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/marketing/LICENSE +202 -0
  50. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/marketing/README.md +88 -0
  51. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/operations/.claude-plugin/plugin.json +8 -0
  52. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/operations/.mcp.json +36 -0
  53. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/operations/README.md +134 -0
  54. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/partner-built/apollo/.claude-plugin/plugin.json +13 -0
  55. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/partner-built/apollo/.mcp.json +8 -0
  56. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/partner-built/apollo/LICENSE +21 -0
  57. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/partner-built/apollo/README.md +99 -0
  58. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/partner-built/brand-voice/.claude-plugin/marketplace.json +20 -0
  59. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/partner-built/brand-voice/.claude-plugin/plugin.json +9 -0
  60. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/partner-built/brand-voice/.mcp.json +32 -0
  61. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/partner-built/brand-voice/LICENSE +21 -0
  62. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/partner-built/brand-voice/README.md +132 -0
  63. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/partner-built/brand-voice/settings/brand-voice.local.md.example +42 -0
  64. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/partner-built/common-room/.claude-plugin/plugin.json +9 -0
  65. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/partner-built/common-room/.mcp.json +8 -0
  66. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/partner-built/common-room/LICENSE +202 -0
  67. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/partner-built/common-room/README.md +64 -0
  68. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/partner-built/slack/.claude-plugin/plugin.json +11 -0
  69. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/partner-built/slack/.mcp.json +12 -0
  70. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/partner-built/slack/LICENSE +21 -0
  71. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/partner-built/slack/README.md +108 -0
  72. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/product-management/.claude-plugin/plugin.json +8 -0
  73. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/product-management/.mcp.json +64 -0
  74. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/product-management/LICENSE +202 -0
  75. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/product-management/README.md +102 -0
  76. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/productivity/.claude-plugin/plugin.json +8 -0
  77. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/productivity/.mcp.json +44 -0
  78. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/productivity/LICENSE +202 -0
  79. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/productivity/README.md +96 -0
  80. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/productivity/skills/dashboard.html +3098 -0
  81. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/sales/.claude-plugin/plugin.json +8 -0
  82. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/sales/.mcp.json +60 -0
  83. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/sales/LICENSE +202 -0
  84. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/sales/README.md +143 -0
  85. package/.claude/cowork_plugins/marketplaces/knowledge-work-plugins/sales/skills/create-an-asset/README.md +169 -0
  86. package/.claude/cowork_settings.json +10 -0
  87. package/.claude/debug/93c847f7-9a51-4a5f-9a41-6fd84fab16d3.txt +37 -0
  88. package/.claude/settings.local.json +7 -0
  89. package/.next/BUILD_ID +1 -0
  90. package/.next/app-path-routes-manifest.json +104 -0
  91. package/.next/build-manifest.json +20 -0
  92. package/.next/diagnostics/build-diagnostics.json +6 -0
  93. package/.next/diagnostics/framework.json +1 -0
  94. package/.next/export-marker.json +6 -0
  95. package/.next/images-manifest.json +68 -0
  96. package/.next/next-minimal-server.js.nft.json +1 -0
  97. package/.next/next-server.js.nft.json +1 -0
  98. package/.next/package.json +1 -0
  99. package/.next/prerender-manifest.json +527 -0
  100. package/.next/react-loadable-manifest.json +8 -0
  101. package/.next/required-server-files.js +365 -0
  102. package/.next/required-server-files.json +365 -0
  103. package/.next/routes-manifest.json +709 -0
  104. package/.next/server/app/(dashboard)/dashboard/cli-tools/page.js +2 -0
  105. package/.next/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -0
  106. package/.next/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -0
  107. package/.next/server/app/(dashboard)/dashboard/combos/page.js +2 -0
  108. package/.next/server/app/(dashboard)/dashboard/combos/page.js.nft.json +1 -0
  109. package/.next/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -0
  110. package/.next/server/app/(dashboard)/dashboard/console-log/page.js +2 -0
  111. package/.next/server/app/(dashboard)/dashboard/console-log/page.js.nft.json +1 -0
  112. package/.next/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -0
  113. package/.next/server/app/(dashboard)/dashboard/endpoint/page.js +2 -0
  114. package/.next/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -0
  115. package/.next/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -0
  116. package/.next/server/app/(dashboard)/dashboard/mitm/page.js +2 -0
  117. package/.next/server/app/(dashboard)/dashboard/mitm/page.js.nft.json +1 -0
  118. package/.next/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -0
  119. package/.next/server/app/(dashboard)/dashboard/page.js +2 -0
  120. package/.next/server/app/(dashboard)/dashboard/page.js.nft.json +1 -0
  121. package/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -0
  122. package/.next/server/app/(dashboard)/dashboard/profile/page.js +2 -0
  123. package/.next/server/app/(dashboard)/dashboard/profile/page.js.nft.json +1 -0
  124. package/.next/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -0
  125. package/.next/server/app/(dashboard)/dashboard/providers/[id]/page.js +2 -0
  126. package/.next/server/app/(dashboard)/dashboard/providers/[id]/page.js.nft.json +1 -0
  127. package/.next/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -0
  128. package/.next/server/app/(dashboard)/dashboard/providers/new/page.js +2 -0
  129. package/.next/server/app/(dashboard)/dashboard/providers/new/page.js.nft.json +1 -0
  130. package/.next/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -0
  131. package/.next/server/app/(dashboard)/dashboard/providers/page.js +2 -0
  132. package/.next/server/app/(dashboard)/dashboard/providers/page.js.nft.json +1 -0
  133. package/.next/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -0
  134. package/.next/server/app/(dashboard)/dashboard/proxy-pools/page.js +3 -0
  135. package/.next/server/app/(dashboard)/dashboard/proxy-pools/page.js.nft.json +1 -0
  136. package/.next/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -0
  137. package/.next/server/app/(dashboard)/dashboard/quota/page.js +2 -0
  138. package/.next/server/app/(dashboard)/dashboard/quota/page.js.nft.json +1 -0
  139. package/.next/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -0
  140. package/.next/server/app/(dashboard)/dashboard/translator/page.js +2 -0
  141. package/.next/server/app/(dashboard)/dashboard/translator/page.js.nft.json +1 -0
  142. package/.next/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -0
  143. package/.next/server/app/(dashboard)/dashboard/usage/page.js +2 -0
  144. package/.next/server/app/(dashboard)/dashboard/usage/page.js.nft.json +1 -0
  145. package/.next/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -0
  146. package/.next/server/app/_global-error/page.js +32 -0
  147. package/.next/server/app/_global-error/page.js.nft.json +1 -0
  148. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -0
  149. package/.next/server/app/_global-error.html +1 -0
  150. package/.next/server/app/_global-error.meta +16 -0
  151. package/.next/server/app/_global-error.rsc +14 -0
  152. package/.next/server/app/_global-error.segments/_full.segment.rsc +14 -0
  153. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +5 -0
  154. package/.next/server/app/_global-error.segments/_global-error.segment.rsc +5 -0
  155. package/.next/server/app/_global-error.segments/_head.segment.rsc +5 -0
  156. package/.next/server/app/_global-error.segments/_index.segment.rsc +5 -0
  157. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
  158. package/.next/server/app/_not-found/page.js +2 -0
  159. package/.next/server/app/_not-found/page.js.nft.json +1 -0
  160. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
  161. package/.next/server/app/_not-found.html +1 -0
  162. package/.next/server/app/_not-found.meta +16 -0
  163. package/.next/server/app/_not-found.rsc +20 -0
  164. package/.next/server/app/_not-found.segments/_full.segment.rsc +20 -0
  165. package/.next/server/app/_not-found.segments/_head.segment.rsc +6 -0
  166. package/.next/server/app/_not-found.segments/_index.segment.rsc +8 -0
  167. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +5 -0
  168. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +5 -0
  169. package/.next/server/app/_not-found.segments/_tree.segment.rsc +4 -0
  170. package/.next/server/app/api/auth/login/route.js +1 -0
  171. package/.next/server/app/api/auth/login/route.js.nft.json +1 -0
  172. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -0
  173. package/.next/server/app/api/auth/logout/route.js +1 -0
  174. package/.next/server/app/api/auth/logout/route.js.nft.json +1 -0
  175. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -0
  176. package/.next/server/app/api/cli-tools/antigravity-mitm/alias/route.js +2 -0
  177. package/.next/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -0
  178. package/.next/server/app/api/cli-tools/antigravity-mitm/alias/route_client-reference-manifest.js +1 -0
  179. package/.next/server/app/api/cli-tools/antigravity-mitm/route.js +2 -0
  180. package/.next/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -0
  181. package/.next/server/app/api/cli-tools/antigravity-mitm/route_client-reference-manifest.js +1 -0
  182. package/.next/server/app/api/cli-tools/claude-settings/route.js +2 -0
  183. package/.next/server/app/api/cli-tools/claude-settings/route.js.nft.json +1 -0
  184. package/.next/server/app/api/cli-tools/claude-settings/route_client-reference-manifest.js +1 -0
  185. package/.next/server/app/api/cli-tools/codex-settings/route.js +32 -0
  186. package/.next/server/app/api/cli-tools/codex-settings/route.js.nft.json +1 -0
  187. package/.next/server/app/api/cli-tools/codex-settings/route_client-reference-manifest.js +1 -0
  188. package/.next/server/app/api/cli-tools/copilot-settings/route.js +2 -0
  189. package/.next/server/app/api/cli-tools/copilot-settings/route.js.nft.json +1 -0
  190. package/.next/server/app/api/cli-tools/copilot-settings/route_client-reference-manifest.js +1 -0
  191. package/.next/server/app/api/cli-tools/droid-settings/route.js +2 -0
  192. package/.next/server/app/api/cli-tools/droid-settings/route.js.nft.json +1 -0
  193. package/.next/server/app/api/cli-tools/droid-settings/route_client-reference-manifest.js +1 -0
  194. package/.next/server/app/api/cli-tools/openclaw-settings/route.js +2 -0
  195. package/.next/server/app/api/cli-tools/openclaw-settings/route.js.nft.json +1 -0
  196. package/.next/server/app/api/cli-tools/openclaw-settings/route_client-reference-manifest.js +1 -0
  197. package/.next/server/app/api/cli-tools/opencode-settings/route.js +2 -0
  198. package/.next/server/app/api/cli-tools/opencode-settings/route.js.nft.json +1 -0
  199. package/.next/server/app/api/cli-tools/opencode-settings/route_client-reference-manifest.js +1 -0
  200. package/.next/server/app/api/cloud/auth/route.js +1 -0
  201. package/.next/server/app/api/cloud/auth/route.js.nft.json +1 -0
  202. package/.next/server/app/api/cloud/auth/route_client-reference-manifest.js +1 -0
  203. package/.next/server/app/api/cloud/credentials/update/route.js +1 -0
  204. package/.next/server/app/api/cloud/credentials/update/route.js.nft.json +1 -0
  205. package/.next/server/app/api/cloud/credentials/update/route_client-reference-manifest.js +1 -0
  206. package/.next/server/app/api/cloud/model/resolve/route.js +1 -0
  207. package/.next/server/app/api/cloud/model/resolve/route.js.nft.json +1 -0
  208. package/.next/server/app/api/cloud/model/resolve/route_client-reference-manifest.js +1 -0
  209. package/.next/server/app/api/cloud/models/alias/route.js +1 -0
  210. package/.next/server/app/api/cloud/models/alias/route.js.nft.json +1 -0
  211. package/.next/server/app/api/cloud/models/alias/route_client-reference-manifest.js +1 -0
  212. package/.next/server/app/api/combos/[id]/route.js +1 -0
  213. package/.next/server/app/api/combos/[id]/route.js.nft.json +1 -0
  214. package/.next/server/app/api/combos/[id]/route_client-reference-manifest.js +1 -0
  215. package/.next/server/app/api/combos/route.js +1 -0
  216. package/.next/server/app/api/combos/route.js.nft.json +1 -0
  217. package/.next/server/app/api/combos/route_client-reference-manifest.js +1 -0
  218. package/.next/server/app/api/init/route.js +1 -0
  219. package/.next/server/app/api/init/route.js.nft.json +1 -0
  220. package/.next/server/app/api/init/route_client-reference-manifest.js +1 -0
  221. package/.next/server/app/api/keys/[id]/route.js +1 -0
  222. package/.next/server/app/api/keys/[id]/route.js.nft.json +1 -0
  223. package/.next/server/app/api/keys/[id]/route_client-reference-manifest.js +1 -0
  224. package/.next/server/app/api/keys/route.js +1 -0
  225. package/.next/server/app/api/keys/route.js.nft.json +1 -0
  226. package/.next/server/app/api/keys/route_client-reference-manifest.js +1 -0
  227. package/.next/server/app/api/locale/route.js +1 -0
  228. package/.next/server/app/api/locale/route.js.nft.json +1 -0
  229. package/.next/server/app/api/locale/route_client-reference-manifest.js +1 -0
  230. package/.next/server/app/api/models/alias/route.js +1 -0
  231. package/.next/server/app/api/models/alias/route.js.nft.json +1 -0
  232. package/.next/server/app/api/models/alias/route_client-reference-manifest.js +1 -0
  233. package/.next/server/app/api/models/availability/route.js +1 -0
  234. package/.next/server/app/api/models/availability/route.js.nft.json +1 -0
  235. package/.next/server/app/api/models/availability/route_client-reference-manifest.js +1 -0
  236. package/.next/server/app/api/models/route.js +1 -0
  237. package/.next/server/app/api/models/route.js.nft.json +1 -0
  238. package/.next/server/app/api/models/route_client-reference-manifest.js +1 -0
  239. package/.next/server/app/api/oauth/[provider]/[action]/route.js +1 -0
  240. package/.next/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -0
  241. package/.next/server/app/api/oauth/[provider]/[action]/route_client-reference-manifest.js +1 -0
  242. package/.next/server/app/api/oauth/cursor/auto-import/route.js +4 -0
  243. package/.next/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -0
  244. package/.next/server/app/api/oauth/cursor/auto-import/route_client-reference-manifest.js +1 -0
  245. package/.next/server/app/api/oauth/cursor/import/route.js +1 -0
  246. package/.next/server/app/api/oauth/cursor/import/route.js.nft.json +1 -0
  247. package/.next/server/app/api/oauth/cursor/import/route_client-reference-manifest.js +1 -0
  248. package/.next/server/app/api/oauth/iflow/cookie/route.js +1 -0
  249. package/.next/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -0
  250. package/.next/server/app/api/oauth/iflow/cookie/route_client-reference-manifest.js +1 -0
  251. package/.next/server/app/api/oauth/kiro/auto-import/route.js +1 -0
  252. package/.next/server/app/api/oauth/kiro/auto-import/route.js.nft.json +1 -0
  253. package/.next/server/app/api/oauth/kiro/auto-import/route_client-reference-manifest.js +1 -0
  254. package/.next/server/app/api/oauth/kiro/import/route.js +1 -0
  255. package/.next/server/app/api/oauth/kiro/import/route.js.nft.json +1 -0
  256. package/.next/server/app/api/oauth/kiro/import/route_client-reference-manifest.js +1 -0
  257. package/.next/server/app/api/oauth/kiro/social-authorize/route.js +1 -0
  258. package/.next/server/app/api/oauth/kiro/social-authorize/route.js.nft.json +1 -0
  259. package/.next/server/app/api/oauth/kiro/social-authorize/route_client-reference-manifest.js +1 -0
  260. package/.next/server/app/api/oauth/kiro/social-exchange/route.js +1 -0
  261. package/.next/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -0
  262. package/.next/server/app/api/oauth/kiro/social-exchange/route_client-reference-manifest.js +1 -0
  263. package/.next/server/app/api/pricing/route.js +1 -0
  264. package/.next/server/app/api/pricing/route.js.nft.json +1 -0
  265. package/.next/server/app/api/pricing/route_client-reference-manifest.js +1 -0
  266. package/.next/server/app/api/provider-nodes/[id]/route.js +1 -0
  267. package/.next/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -0
  268. package/.next/server/app/api/provider-nodes/[id]/route_client-reference-manifest.js +1 -0
  269. package/.next/server/app/api/provider-nodes/route.js +1 -0
  270. package/.next/server/app/api/provider-nodes/route.js.nft.json +1 -0
  271. package/.next/server/app/api/provider-nodes/route_client-reference-manifest.js +1 -0
  272. package/.next/server/app/api/provider-nodes/validate/route.js +1 -0
  273. package/.next/server/app/api/provider-nodes/validate/route.js.nft.json +1 -0
  274. package/.next/server/app/api/provider-nodes/validate/route_client-reference-manifest.js +1 -0
  275. package/.next/server/app/api/providers/[id]/models/route.js +1 -0
  276. package/.next/server/app/api/providers/[id]/models/route.js.nft.json +1 -0
  277. package/.next/server/app/api/providers/[id]/models/route_client-reference-manifest.js +1 -0
  278. package/.next/server/app/api/providers/[id]/route.js +1 -0
  279. package/.next/server/app/api/providers/[id]/route.js.nft.json +1 -0
  280. package/.next/server/app/api/providers/[id]/route_client-reference-manifest.js +1 -0
  281. package/.next/server/app/api/providers/[id]/test-models/route.js +1 -0
  282. package/.next/server/app/api/providers/[id]/test-models/route.js.nft.json +1 -0
  283. package/.next/server/app/api/providers/[id]/test-models/route_client-reference-manifest.js +1 -0
  284. package/.next/server/app/api/providers/client/route.js +1 -0
  285. package/.next/server/app/api/providers/client/route.js.nft.json +1 -0
  286. package/.next/server/app/api/providers/client/route_client-reference-manifest.js +1 -0
  287. package/.next/server/app/api/providers/route.js +1 -0
  288. package/.next/server/app/api/providers/route.js.nft.json +1 -0
  289. package/.next/server/app/api/providers/route_client-reference-manifest.js +1 -0
  290. package/.next/server/app/api/providers/test-batch/route.js +1 -0
  291. package/.next/server/app/api/providers/test-batch/route.js.nft.json +1 -0
  292. package/.next/server/app/api/providers/test-batch/route_client-reference-manifest.js +1 -0
  293. package/.next/server/app/api/providers/validate/route.js +1 -0
  294. package/.next/server/app/api/providers/validate/route.js.nft.json +1 -0
  295. package/.next/server/app/api/providers/validate/route_client-reference-manifest.js +1 -0
  296. package/.next/server/app/api/proxy-pools/[id]/route.js +1 -0
  297. package/.next/server/app/api/proxy-pools/[id]/route.js.nft.json +1 -0
  298. package/.next/server/app/api/proxy-pools/[id]/route_client-reference-manifest.js +1 -0
  299. package/.next/server/app/api/proxy-pools/route.js +1 -0
  300. package/.next/server/app/api/proxy-pools/route.js.nft.json +1 -0
  301. package/.next/server/app/api/proxy-pools/route_client-reference-manifest.js +1 -0
  302. package/.next/server/app/api/settings/database/route.js +1 -0
  303. package/.next/server/app/api/settings/database/route.js.nft.json +1 -0
  304. package/.next/server/app/api/settings/database/route_client-reference-manifest.js +1 -0
  305. package/.next/server/app/api/settings/proxy-test/route.js +1 -0
  306. package/.next/server/app/api/settings/proxy-test/route.js.nft.json +1 -0
  307. package/.next/server/app/api/settings/proxy-test/route_client-reference-manifest.js +1 -0
  308. package/.next/server/app/api/settings/require-login/route.js +1 -0
  309. package/.next/server/app/api/settings/require-login/route.js.nft.json +1 -0
  310. package/.next/server/app/api/settings/require-login/route_client-reference-manifest.js +1 -0
  311. package/.next/server/app/api/settings/route.js +1 -0
  312. package/.next/server/app/api/settings/route.js.nft.json +1 -0
  313. package/.next/server/app/api/settings/route_client-reference-manifest.js +1 -0
  314. package/.next/server/app/api/shutdown/route.js +1 -0
  315. package/.next/server/app/api/shutdown/route.js.nft.json +1 -0
  316. package/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -0
  317. package/.next/server/app/api/tags/route.js +1 -0
  318. package/.next/server/app/api/tags/route.js.nft.json +1 -0
  319. package/.next/server/app/api/tags/route_client-reference-manifest.js +1 -0
  320. package/.next/server/app/api/translator/console-logs/route.js +1 -0
  321. package/.next/server/app/api/translator/console-logs/route.js.nft.json +1 -0
  322. package/.next/server/app/api/translator/console-logs/route_client-reference-manifest.js +1 -0
  323. package/.next/server/app/api/translator/console-logs/stream/route.js +7 -0
  324. package/.next/server/app/api/translator/console-logs/stream/route.js.nft.json +1 -0
  325. package/.next/server/app/api/translator/console-logs/stream/route_client-reference-manifest.js +1 -0
  326. package/.next/server/app/api/translator/load/route.js +1 -0
  327. package/.next/server/app/api/translator/load/route.js.nft.json +1 -0
  328. package/.next/server/app/api/translator/load/route_client-reference-manifest.js +1 -0
  329. package/.next/server/app/api/translator/save/route.js +1 -0
  330. package/.next/server/app/api/translator/save/route.js.nft.json +1 -0
  331. package/.next/server/app/api/translator/save/route_client-reference-manifest.js +1 -0
  332. package/.next/server/app/api/translator/send/route.js +1 -0
  333. package/.next/server/app/api/translator/send/route.js.nft.json +1 -0
  334. package/.next/server/app/api/translator/send/route_client-reference-manifest.js +1 -0
  335. package/.next/server/app/api/translator/translate/route.js +1 -0
  336. package/.next/server/app/api/translator/translate/route.js.nft.json +1 -0
  337. package/.next/server/app/api/translator/translate/route_client-reference-manifest.js +1 -0
  338. package/.next/server/app/api/tunnel/disable/route.js +1 -0
  339. package/.next/server/app/api/tunnel/disable/route.js.nft.json +1 -0
  340. package/.next/server/app/api/tunnel/disable/route_client-reference-manifest.js +1 -0
  341. package/.next/server/app/api/tunnel/enable/route.js +1 -0
  342. package/.next/server/app/api/tunnel/enable/route.js.nft.json +1 -0
  343. package/.next/server/app/api/tunnel/enable/route_client-reference-manifest.js +1 -0
  344. package/.next/server/app/api/tunnel/status/route.js +1 -0
  345. package/.next/server/app/api/tunnel/status/route.js.nft.json +1 -0
  346. package/.next/server/app/api/tunnel/status/route_client-reference-manifest.js +1 -0
  347. package/.next/server/app/api/usage/[connectionId]/route.js +1 -0
  348. package/.next/server/app/api/usage/[connectionId]/route.js.nft.json +1 -0
  349. package/.next/server/app/api/usage/[connectionId]/route_client-reference-manifest.js +1 -0
  350. package/.next/server/app/api/usage/chart/route.js +1 -0
  351. package/.next/server/app/api/usage/chart/route.js.nft.json +1 -0
  352. package/.next/server/app/api/usage/chart/route_client-reference-manifest.js +1 -0
  353. package/.next/server/app/api/usage/history/route.js +1 -0
  354. package/.next/server/app/api/usage/history/route.js.nft.json +1 -0
  355. package/.next/server/app/api/usage/history/route_client-reference-manifest.js +1 -0
  356. package/.next/server/app/api/usage/providers/route.js +1 -0
  357. package/.next/server/app/api/usage/providers/route.js.nft.json +1 -0
  358. package/.next/server/app/api/usage/providers/route_client-reference-manifest.js +1 -0
  359. package/.next/server/app/api/usage/request-details/route.js +1 -0
  360. package/.next/server/app/api/usage/request-details/route.js.nft.json +1 -0
  361. package/.next/server/app/api/usage/request-details/route_client-reference-manifest.js +1 -0
  362. package/.next/server/app/api/usage/request-logs/route.js +1 -0
  363. package/.next/server/app/api/usage/request-logs/route.js.nft.json +1 -0
  364. package/.next/server/app/api/usage/request-logs/route_client-reference-manifest.js +1 -0
  365. package/.next/server/app/api/usage/stats/route.js +1 -0
  366. package/.next/server/app/api/usage/stats/route.js.nft.json +1 -0
  367. package/.next/server/app/api/usage/stats/route_client-reference-manifest.js +1 -0
  368. package/.next/server/app/api/usage/stream/route.js +7 -0
  369. package/.next/server/app/api/usage/stream/route.js.nft.json +1 -0
  370. package/.next/server/app/api/usage/stream/route_client-reference-manifest.js +1 -0
  371. package/.next/server/app/api/v1/api/chat/route.js +1 -0
  372. package/.next/server/app/api/v1/api/chat/route.js.nft.json +1 -0
  373. package/.next/server/app/api/v1/api/chat/route_client-reference-manifest.js +1 -0
  374. package/.next/server/app/api/v1/chat/completions/route.js +1 -0
  375. package/.next/server/app/api/v1/chat/completions/route.js.nft.json +1 -0
  376. package/.next/server/app/api/v1/chat/completions/route_client-reference-manifest.js +1 -0
  377. package/.next/server/app/api/v1/embeddings/route.js +1 -0
  378. package/.next/server/app/api/v1/embeddings/route.js.nft.json +1 -0
  379. package/.next/server/app/api/v1/embeddings/route_client-reference-manifest.js +1 -0
  380. package/.next/server/app/api/v1/messages/count_tokens/route.js +1 -0
  381. package/.next/server/app/api/v1/messages/count_tokens/route.js.nft.json +1 -0
  382. package/.next/server/app/api/v1/messages/count_tokens/route_client-reference-manifest.js +1 -0
  383. package/.next/server/app/api/v1/messages/route.js +1 -0
  384. package/.next/server/app/api/v1/messages/route.js.nft.json +1 -0
  385. package/.next/server/app/api/v1/messages/route_client-reference-manifest.js +1 -0
  386. package/.next/server/app/api/v1/models/route.js +1 -0
  387. package/.next/server/app/api/v1/models/route.js.nft.json +1 -0
  388. package/.next/server/app/api/v1/models/route_client-reference-manifest.js +1 -0
  389. package/.next/server/app/api/v1/responses/route.js +1 -0
  390. package/.next/server/app/api/v1/responses/route.js.nft.json +1 -0
  391. package/.next/server/app/api/v1/responses/route_client-reference-manifest.js +1 -0
  392. package/.next/server/app/api/v1/route.js +1 -0
  393. package/.next/server/app/api/v1/route.js.nft.json +1 -0
  394. package/.next/server/app/api/v1/route_client-reference-manifest.js +1 -0
  395. package/.next/server/app/api/v1beta/models/[...path]/route.js +1 -0
  396. package/.next/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -0
  397. package/.next/server/app/api/v1beta/models/[...path]/route_client-reference-manifest.js +1 -0
  398. package/.next/server/app/api/v1beta/models/route.js +1 -0
  399. package/.next/server/app/api/v1beta/models/route.js.nft.json +1 -0
  400. package/.next/server/app/api/v1beta/models/route_client-reference-manifest.js +1 -0
  401. package/.next/server/app/api/version/route.js +1 -0
  402. package/.next/server/app/api/version/route.js.nft.json +1 -0
  403. package/.next/server/app/api/version/route_client-reference-manifest.js +1 -0
  404. package/.next/server/app/callback/page.js +2 -0
  405. package/.next/server/app/callback/page.js.nft.json +1 -0
  406. package/.next/server/app/callback/page_client-reference-manifest.js +1 -0
  407. package/.next/server/app/callback.html +1 -0
  408. package/.next/server/app/callback.meta +15 -0
  409. package/.next/server/app/callback.rsc +24 -0
  410. package/.next/server/app/callback.segments/_full.segment.rsc +24 -0
  411. package/.next/server/app/callback.segments/_head.segment.rsc +6 -0
  412. package/.next/server/app/callback.segments/_index.segment.rsc +8 -0
  413. package/.next/server/app/callback.segments/_tree.segment.rsc +4 -0
  414. package/.next/server/app/callback.segments/callback/__PAGE__.segment.rsc +9 -0
  415. package/.next/server/app/callback.segments/callback.segment.rsc +5 -0
  416. package/.next/server/app/dashboard/cli-tools.html +1 -0
  417. package/.next/server/app/dashboard/cli-tools.meta +17 -0
  418. package/.next/server/app/dashboard/cli-tools.rsc +24 -0
  419. package/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +6 -0
  420. package/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +5 -0
  421. package/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +5 -0
  422. package/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +6 -0
  423. package/.next/server/app/dashboard/cli-tools.segments/_full.segment.rsc +24 -0
  424. package/.next/server/app/dashboard/cli-tools.segments/_head.segment.rsc +6 -0
  425. package/.next/server/app/dashboard/cli-tools.segments/_index.segment.rsc +8 -0
  426. package/.next/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +5 -0
  427. package/.next/server/app/dashboard/combos.html +1 -0
  428. package/.next/server/app/dashboard/combos.meta +17 -0
  429. package/.next/server/app/dashboard/combos.rsc +26 -0
  430. package/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +9 -0
  431. package/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +5 -0
  432. package/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +5 -0
  433. package/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +6 -0
  434. package/.next/server/app/dashboard/combos.segments/_full.segment.rsc +26 -0
  435. package/.next/server/app/dashboard/combos.segments/_head.segment.rsc +6 -0
  436. package/.next/server/app/dashboard/combos.segments/_index.segment.rsc +8 -0
  437. package/.next/server/app/dashboard/combos.segments/_tree.segment.rsc +5 -0
  438. package/.next/server/app/dashboard/endpoint.html +1 -0
  439. package/.next/server/app/dashboard/endpoint.meta +17 -0
  440. package/.next/server/app/dashboard/endpoint.rsc +24 -0
  441. package/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +6 -0
  442. package/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +5 -0
  443. package/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +5 -0
  444. package/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +6 -0
  445. package/.next/server/app/dashboard/endpoint.segments/_full.segment.rsc +24 -0
  446. package/.next/server/app/dashboard/endpoint.segments/_head.segment.rsc +6 -0
  447. package/.next/server/app/dashboard/endpoint.segments/_index.segment.rsc +8 -0
  448. package/.next/server/app/dashboard/endpoint.segments/_tree.segment.rsc +5 -0
  449. package/.next/server/app/dashboard/mitm.html +1 -0
  450. package/.next/server/app/dashboard/mitm.meta +17 -0
  451. package/.next/server/app/dashboard/mitm.rsc +23 -0
  452. package/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +6 -0
  453. package/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +5 -0
  454. package/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +5 -0
  455. package/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +6 -0
  456. package/.next/server/app/dashboard/mitm.segments/_full.segment.rsc +23 -0
  457. package/.next/server/app/dashboard/mitm.segments/_head.segment.rsc +6 -0
  458. package/.next/server/app/dashboard/mitm.segments/_index.segment.rsc +8 -0
  459. package/.next/server/app/dashboard/mitm.segments/_tree.segment.rsc +5 -0
  460. package/.next/server/app/dashboard/profile.html +1 -0
  461. package/.next/server/app/dashboard/profile.meta +17 -0
  462. package/.next/server/app/dashboard/profile.rsc +26 -0
  463. package/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +9 -0
  464. package/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +5 -0
  465. package/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +5 -0
  466. package/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +6 -0
  467. package/.next/server/app/dashboard/profile.segments/_full.segment.rsc +26 -0
  468. package/.next/server/app/dashboard/profile.segments/_head.segment.rsc +6 -0
  469. package/.next/server/app/dashboard/profile.segments/_index.segment.rsc +8 -0
  470. package/.next/server/app/dashboard/profile.segments/_tree.segment.rsc +5 -0
  471. package/.next/server/app/dashboard/providers/new.html +1 -0
  472. package/.next/server/app/dashboard/providers/new.meta +18 -0
  473. package/.next/server/app/dashboard/providers/new.rsc +26 -0
  474. package/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +9 -0
  475. package/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +5 -0
  476. package/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +5 -0
  477. package/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +5 -0
  478. package/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +6 -0
  479. package/.next/server/app/dashboard/providers/new.segments/_full.segment.rsc +26 -0
  480. package/.next/server/app/dashboard/providers/new.segments/_head.segment.rsc +6 -0
  481. package/.next/server/app/dashboard/providers/new.segments/_index.segment.rsc +8 -0
  482. package/.next/server/app/dashboard/providers/new.segments/_tree.segment.rsc +5 -0
  483. package/.next/server/app/dashboard/providers.html +1 -0
  484. package/.next/server/app/dashboard/providers.meta +17 -0
  485. package/.next/server/app/dashboard/providers.rsc +26 -0
  486. package/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +9 -0
  487. package/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +5 -0
  488. package/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +5 -0
  489. package/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +6 -0
  490. package/.next/server/app/dashboard/providers.segments/_full.segment.rsc +26 -0
  491. package/.next/server/app/dashboard/providers.segments/_head.segment.rsc +6 -0
  492. package/.next/server/app/dashboard/providers.segments/_index.segment.rsc +8 -0
  493. package/.next/server/app/dashboard/providers.segments/_tree.segment.rsc +5 -0
  494. package/.next/server/app/dashboard/proxy-pools.html +1 -0
  495. package/.next/server/app/dashboard/proxy-pools.meta +17 -0
  496. package/.next/server/app/dashboard/proxy-pools.rsc +26 -0
  497. package/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +9 -0
  498. package/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +5 -0
  499. package/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +5 -0
  500. package/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +6 -0
  501. package/.next/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +26 -0
  502. package/.next/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +6 -0
  503. package/.next/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +8 -0
  504. package/.next/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +5 -0
  505. package/.next/server/app/dashboard/quota.html +1 -0
  506. package/.next/server/app/dashboard/quota.meta +17 -0
  507. package/.next/server/app/dashboard/quota.rsc +24 -0
  508. package/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +7 -0
  509. package/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +5 -0
  510. package/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +5 -0
  511. package/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +6 -0
  512. package/.next/server/app/dashboard/quota.segments/_full.segment.rsc +24 -0
  513. package/.next/server/app/dashboard/quota.segments/_head.segment.rsc +6 -0
  514. package/.next/server/app/dashboard/quota.segments/_index.segment.rsc +8 -0
  515. package/.next/server/app/dashboard/quota.segments/_tree.segment.rsc +5 -0
  516. package/.next/server/app/dashboard/settings/pricing/page.js +2 -0
  517. package/.next/server/app/dashboard/settings/pricing/page.js.nft.json +1 -0
  518. package/.next/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -0
  519. package/.next/server/app/dashboard/settings/pricing.html +1 -0
  520. package/.next/server/app/dashboard/settings/pricing.meta +17 -0
  521. package/.next/server/app/dashboard/settings/pricing.rsc +24 -0
  522. package/.next/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +24 -0
  523. package/.next/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +6 -0
  524. package/.next/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +8 -0
  525. package/.next/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +4 -0
  526. package/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +9 -0
  527. package/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +5 -0
  528. package/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +5 -0
  529. package/.next/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +5 -0
  530. package/.next/server/app/dashboard/translator.html +1 -0
  531. package/.next/server/app/dashboard/translator.meta +17 -0
  532. package/.next/server/app/dashboard/translator.rsc +26 -0
  533. package/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +9 -0
  534. package/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +5 -0
  535. package/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +5 -0
  536. package/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +6 -0
  537. package/.next/server/app/dashboard/translator.segments/_full.segment.rsc +26 -0
  538. package/.next/server/app/dashboard/translator.segments/_head.segment.rsc +6 -0
  539. package/.next/server/app/dashboard/translator.segments/_index.segment.rsc +8 -0
  540. package/.next/server/app/dashboard/translator.segments/_tree.segment.rsc +5 -0
  541. package/.next/server/app/dashboard/usage.html +1 -0
  542. package/.next/server/app/dashboard/usage.meta +17 -0
  543. package/.next/server/app/dashboard/usage.rsc +26 -0
  544. package/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +9 -0
  545. package/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +5 -0
  546. package/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +5 -0
  547. package/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +6 -0
  548. package/.next/server/app/dashboard/usage.segments/_full.segment.rsc +26 -0
  549. package/.next/server/app/dashboard/usage.segments/_head.segment.rsc +6 -0
  550. package/.next/server/app/dashboard/usage.segments/_index.segment.rsc +8 -0
  551. package/.next/server/app/dashboard/usage.segments/_tree.segment.rsc +5 -0
  552. package/.next/server/app/dashboard.html +1 -0
  553. package/.next/server/app/dashboard.meta +16 -0
  554. package/.next/server/app/dashboard.rsc +24 -0
  555. package/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +6 -0
  556. package/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +5 -0
  557. package/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +6 -0
  558. package/.next/server/app/dashboard.segments/_full.segment.rsc +24 -0
  559. package/.next/server/app/dashboard.segments/_head.segment.rsc +6 -0
  560. package/.next/server/app/dashboard.segments/_index.segment.rsc +8 -0
  561. package/.next/server/app/dashboard.segments/_tree.segment.rsc +5 -0
  562. package/.next/server/app/favicon.ico/route.js +1 -0
  563. package/.next/server/app/favicon.ico/route.js.nft.json +1 -0
  564. package/.next/server/app/favicon.ico.body +0 -0
  565. package/.next/server/app/favicon.ico.meta +1 -0
  566. package/.next/server/app/index.html +1 -0
  567. package/.next/server/app/index.meta +16 -0
  568. package/.next/server/app/index.rsc +19 -0
  569. package/.next/server/app/index.segments/__PAGE__.segment.rsc +6 -0
  570. package/.next/server/app/index.segments/_full.segment.rsc +19 -0
  571. package/.next/server/app/index.segments/_head.segment.rsc +6 -0
  572. package/.next/server/app/index.segments/_index.segment.rsc +8 -0
  573. package/.next/server/app/index.segments/_tree.segment.rsc +4 -0
  574. package/.next/server/app/landing/page.js +2 -0
  575. package/.next/server/app/landing/page.js.nft.json +1 -0
  576. package/.next/server/app/landing/page_client-reference-manifest.js +1 -0
  577. package/.next/server/app/landing.html +1 -0
  578. package/.next/server/app/landing.meta +15 -0
  579. package/.next/server/app/landing.rsc +24 -0
  580. package/.next/server/app/landing.segments/_full.segment.rsc +24 -0
  581. package/.next/server/app/landing.segments/_head.segment.rsc +6 -0
  582. package/.next/server/app/landing.segments/_index.segment.rsc +8 -0
  583. package/.next/server/app/landing.segments/_tree.segment.rsc +4 -0
  584. package/.next/server/app/landing.segments/landing/__PAGE__.segment.rsc +9 -0
  585. package/.next/server/app/landing.segments/landing.segment.rsc +5 -0
  586. package/.next/server/app/login/page.js +2 -0
  587. package/.next/server/app/login/page.js.nft.json +1 -0
  588. package/.next/server/app/login/page_client-reference-manifest.js +1 -0
  589. package/.next/server/app/login.html +1 -0
  590. package/.next/server/app/login.meta +15 -0
  591. package/.next/server/app/login.rsc +25 -0
  592. package/.next/server/app/login.segments/_full.segment.rsc +25 -0
  593. package/.next/server/app/login.segments/_head.segment.rsc +6 -0
  594. package/.next/server/app/login.segments/_index.segment.rsc +8 -0
  595. package/.next/server/app/login.segments/_tree.segment.rsc +5 -0
  596. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +10 -0
  597. package/.next/server/app/login.segments/login.segment.rsc +5 -0
  598. package/.next/server/app/manifest.webmanifest/route.js +16 -0
  599. package/.next/server/app/manifest.webmanifest/route.js.nft.json +1 -0
  600. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -0
  601. package/.next/server/app/manifest.webmanifest.body +1 -0
  602. package/.next/server/app/manifest.webmanifest.meta +1 -0
  603. package/.next/server/app/page.js +2 -0
  604. package/.next/server/app/page.js.nft.json +1 -0
  605. package/.next/server/app/page_client-reference-manifest.js +1 -0
  606. package/.next/server/app-paths-manifest.json +104 -0
  607. package/.next/server/chunks/1130.js +1 -0
  608. package/.next/server/chunks/1220.js +3 -0
  609. package/.next/server/chunks/1424.js +1 -0
  610. package/.next/server/chunks/1705.js +1 -0
  611. package/.next/server/chunks/1813.js +1 -0
  612. package/.next/server/chunks/241.js +1 -0
  613. package/.next/server/chunks/2417.js +1 -0
  614. package/.next/server/chunks/289.js +1 -0
  615. package/.next/server/chunks/318.js +164 -0
  616. package/.next/server/chunks/3245.js +1 -0
  617. package/.next/server/chunks/3832.js +1 -0
  618. package/.next/server/chunks/412.js +7 -0
  619. package/.next/server/chunks/4124.js +1 -0
  620. package/.next/server/chunks/4642.js +1 -0
  621. package/.next/server/chunks/4689.js +1 -0
  622. package/.next/server/chunks/4741.js +18 -0
  623. package/.next/server/chunks/4755.js +1 -0
  624. package/.next/server/chunks/4989.js +2 -0
  625. package/.next/server/chunks/5270.js +1 -0
  626. package/.next/server/chunks/5296.js +1 -0
  627. package/.next/server/chunks/5297.js +1 -0
  628. package/.next/server/chunks/5573.js +1 -0
  629. package/.next/server/chunks/6108.js +1 -0
  630. package/.next/server/chunks/6182.js +5 -0
  631. package/.next/server/chunks/63.js +45 -0
  632. package/.next/server/chunks/6446.js +1 -0
  633. package/.next/server/chunks/649.js +15 -0
  634. package/.next/server/chunks/6649.js +1 -0
  635. package/.next/server/chunks/6844.js +1 -0
  636. package/.next/server/chunks/7341.js +1 -0
  637. package/.next/server/chunks/7774.js +120 -0
  638. package/.next/server/chunks/7861.js +1 -0
  639. package/.next/server/chunks/7890.js +3 -0
  640. package/.next/server/chunks/7898.js +1 -0
  641. package/.next/server/chunks/7924.js +1 -0
  642. package/.next/server/chunks/8332.js +1 -0
  643. package/.next/server/chunks/8895.js +4 -0
  644. package/.next/server/chunks/9201.js +1 -0
  645. package/.next/server/chunks/9609.js +1 -0
  646. package/.next/server/chunks/9713.js +1 -0
  647. package/.next/server/chunks/9718.js +1 -0
  648. package/.next/server/functions-config-manifest.json +18 -0
  649. package/.next/server/interception-route-rewrite-manifest.js +1 -0
  650. package/.next/server/middleware-build-manifest.js +1 -0
  651. package/.next/server/middleware-manifest.json +6 -0
  652. package/.next/server/middleware-react-loadable-manifest.js +1 -0
  653. package/.next/server/middleware.js +56 -0
  654. package/.next/server/middleware.js.nft.json +1 -0
  655. package/.next/server/next-font-manifest.js +1 -0
  656. package/.next/server/next-font-manifest.json +1 -0
  657. package/.next/server/pages/404.html +1 -0
  658. package/.next/server/pages/500.html +1 -0
  659. package/.next/server/pages-manifest.json +4 -0
  660. package/.next/server/prefetch-hints.json +1 -0
  661. package/.next/server/server-reference-manifest.js +1 -0
  662. package/.next/server/server-reference-manifest.json +1 -0
  663. package/.next/server/webpack-runtime.js +1 -0
  664. package/.next/standalone/.next/BUILD_ID +1 -0
  665. package/.next/standalone/.next/app-path-routes-manifest.json +104 -0
  666. package/.next/standalone/.next/build-manifest.json +20 -0
  667. package/.next/standalone/.next/package.json +1 -0
  668. package/.next/standalone/.next/prerender-manifest.json +527 -0
  669. package/.next/standalone/.next/react-loadable-manifest.json +8 -0
  670. package/.next/standalone/.next/required-server-files.json +365 -0
  671. package/.next/standalone/.next/routes-manifest.json +709 -0
  672. package/.next/standalone/.next/server/app/(dashboard)/dashboard/cli-tools/page.js +2 -0
  673. package/.next/standalone/.next/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -0
  674. package/.next/standalone/.next/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -0
  675. package/.next/standalone/.next/server/app/(dashboard)/dashboard/combos/page.js +2 -0
  676. package/.next/standalone/.next/server/app/(dashboard)/dashboard/combos/page.js.nft.json +1 -0
  677. package/.next/standalone/.next/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -0
  678. package/.next/standalone/.next/server/app/(dashboard)/dashboard/console-log/page.js +2 -0
  679. package/.next/standalone/.next/server/app/(dashboard)/dashboard/console-log/page.js.nft.json +1 -0
  680. package/.next/standalone/.next/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -0
  681. package/.next/standalone/.next/server/app/(dashboard)/dashboard/endpoint/page.js +2 -0
  682. package/.next/standalone/.next/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -0
  683. package/.next/standalone/.next/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -0
  684. package/.next/standalone/.next/server/app/(dashboard)/dashboard/mitm/page.js +2 -0
  685. package/.next/standalone/.next/server/app/(dashboard)/dashboard/mitm/page.js.nft.json +1 -0
  686. package/.next/standalone/.next/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -0
  687. package/.next/standalone/.next/server/app/(dashboard)/dashboard/page.js +2 -0
  688. package/.next/standalone/.next/server/app/(dashboard)/dashboard/page.js.nft.json +1 -0
  689. package/.next/standalone/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -0
  690. package/.next/standalone/.next/server/app/(dashboard)/dashboard/profile/page.js +2 -0
  691. package/.next/standalone/.next/server/app/(dashboard)/dashboard/profile/page.js.nft.json +1 -0
  692. package/.next/standalone/.next/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -0
  693. package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/[id]/page.js +2 -0
  694. package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/[id]/page.js.nft.json +1 -0
  695. package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -0
  696. package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/new/page.js +2 -0
  697. package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/new/page.js.nft.json +1 -0
  698. package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -0
  699. package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/page.js +2 -0
  700. package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/page.js.nft.json +1 -0
  701. package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -0
  702. package/.next/standalone/.next/server/app/(dashboard)/dashboard/proxy-pools/page.js +3 -0
  703. package/.next/standalone/.next/server/app/(dashboard)/dashboard/proxy-pools/page.js.nft.json +1 -0
  704. package/.next/standalone/.next/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -0
  705. package/.next/standalone/.next/server/app/(dashboard)/dashboard/quota/page.js +2 -0
  706. package/.next/standalone/.next/server/app/(dashboard)/dashboard/quota/page.js.nft.json +1 -0
  707. package/.next/standalone/.next/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -0
  708. package/.next/standalone/.next/server/app/(dashboard)/dashboard/translator/page.js +2 -0
  709. package/.next/standalone/.next/server/app/(dashboard)/dashboard/translator/page.js.nft.json +1 -0
  710. package/.next/standalone/.next/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -0
  711. package/.next/standalone/.next/server/app/(dashboard)/dashboard/usage/page.js +2 -0
  712. package/.next/standalone/.next/server/app/(dashboard)/dashboard/usage/page.js.nft.json +1 -0
  713. package/.next/standalone/.next/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -0
  714. package/.next/standalone/.next/server/app/_global-error/page.js +32 -0
  715. package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +1 -0
  716. package/.next/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -0
  717. package/.next/standalone/.next/server/app/_global-error.html +1 -0
  718. package/.next/standalone/.next/server/app/_global-error.meta +16 -0
  719. package/.next/standalone/.next/server/app/_global-error.rsc +14 -0
  720. package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +14 -0
  721. package/.next/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +5 -0
  722. package/.next/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +5 -0
  723. package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +5 -0
  724. package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +5 -0
  725. package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
  726. package/.next/standalone/.next/server/app/_not-found/page.js +2 -0
  727. package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -0
  728. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -0
  729. package/.next/standalone/.next/server/app/_not-found.html +1 -0
  730. package/.next/standalone/.next/server/app/_not-found.meta +16 -0
  731. package/.next/standalone/.next/server/app/_not-found.rsc +20 -0
  732. package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +20 -0
  733. package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +6 -0
  734. package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +8 -0
  735. package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +5 -0
  736. package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +5 -0
  737. package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +4 -0
  738. package/.next/standalone/.next/server/app/api/auth/login/route.js +1 -0
  739. package/.next/standalone/.next/server/app/api/auth/login/route.js.nft.json +1 -0
  740. package/.next/standalone/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -0
  741. package/.next/standalone/.next/server/app/api/auth/logout/route.js +1 -0
  742. package/.next/standalone/.next/server/app/api/auth/logout/route.js.nft.json +1 -0
  743. package/.next/standalone/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -0
  744. package/.next/standalone/.next/server/app/api/cli-tools/antigravity-mitm/alias/route.js +2 -0
  745. package/.next/standalone/.next/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -0
  746. package/.next/standalone/.next/server/app/api/cli-tools/antigravity-mitm/alias/route_client-reference-manifest.js +1 -0
  747. package/.next/standalone/.next/server/app/api/cli-tools/antigravity-mitm/route.js +2 -0
  748. package/.next/standalone/.next/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -0
  749. package/.next/standalone/.next/server/app/api/cli-tools/antigravity-mitm/route_client-reference-manifest.js +1 -0
  750. package/.next/standalone/.next/server/app/api/cli-tools/claude-settings/route.js +2 -0
  751. package/.next/standalone/.next/server/app/api/cli-tools/claude-settings/route.js.nft.json +1 -0
  752. package/.next/standalone/.next/server/app/api/cli-tools/claude-settings/route_client-reference-manifest.js +1 -0
  753. package/.next/standalone/.next/server/app/api/cli-tools/codex-settings/route.js +32 -0
  754. package/.next/standalone/.next/server/app/api/cli-tools/codex-settings/route.js.nft.json +1 -0
  755. package/.next/standalone/.next/server/app/api/cli-tools/codex-settings/route_client-reference-manifest.js +1 -0
  756. package/.next/standalone/.next/server/app/api/cli-tools/copilot-settings/route.js +2 -0
  757. package/.next/standalone/.next/server/app/api/cli-tools/copilot-settings/route.js.nft.json +1 -0
  758. package/.next/standalone/.next/server/app/api/cli-tools/copilot-settings/route_client-reference-manifest.js +1 -0
  759. package/.next/standalone/.next/server/app/api/cli-tools/droid-settings/route.js +2 -0
  760. package/.next/standalone/.next/server/app/api/cli-tools/droid-settings/route.js.nft.json +1 -0
  761. package/.next/standalone/.next/server/app/api/cli-tools/droid-settings/route_client-reference-manifest.js +1 -0
  762. package/.next/standalone/.next/server/app/api/cli-tools/openclaw-settings/route.js +2 -0
  763. package/.next/standalone/.next/server/app/api/cli-tools/openclaw-settings/route.js.nft.json +1 -0
  764. package/.next/standalone/.next/server/app/api/cli-tools/openclaw-settings/route_client-reference-manifest.js +1 -0
  765. package/.next/standalone/.next/server/app/api/cli-tools/opencode-settings/route.js +2 -0
  766. package/.next/standalone/.next/server/app/api/cli-tools/opencode-settings/route.js.nft.json +1 -0
  767. package/.next/standalone/.next/server/app/api/cli-tools/opencode-settings/route_client-reference-manifest.js +1 -0
  768. package/.next/standalone/.next/server/app/api/cloud/auth/route.js +1 -0
  769. package/.next/standalone/.next/server/app/api/cloud/auth/route.js.nft.json +1 -0
  770. package/.next/standalone/.next/server/app/api/cloud/auth/route_client-reference-manifest.js +1 -0
  771. package/.next/standalone/.next/server/app/api/cloud/credentials/update/route.js +1 -0
  772. package/.next/standalone/.next/server/app/api/cloud/credentials/update/route.js.nft.json +1 -0
  773. package/.next/standalone/.next/server/app/api/cloud/credentials/update/route_client-reference-manifest.js +1 -0
  774. package/.next/standalone/.next/server/app/api/cloud/model/resolve/route.js +1 -0
  775. package/.next/standalone/.next/server/app/api/cloud/model/resolve/route.js.nft.json +1 -0
  776. package/.next/standalone/.next/server/app/api/cloud/model/resolve/route_client-reference-manifest.js +1 -0
  777. package/.next/standalone/.next/server/app/api/cloud/models/alias/route.js +1 -0
  778. package/.next/standalone/.next/server/app/api/cloud/models/alias/route.js.nft.json +1 -0
  779. package/.next/standalone/.next/server/app/api/cloud/models/alias/route_client-reference-manifest.js +1 -0
  780. package/.next/standalone/.next/server/app/api/combos/[id]/route.js +1 -0
  781. package/.next/standalone/.next/server/app/api/combos/[id]/route.js.nft.json +1 -0
  782. package/.next/standalone/.next/server/app/api/combos/[id]/route_client-reference-manifest.js +1 -0
  783. package/.next/standalone/.next/server/app/api/combos/route.js +1 -0
  784. package/.next/standalone/.next/server/app/api/combos/route.js.nft.json +1 -0
  785. package/.next/standalone/.next/server/app/api/combos/route_client-reference-manifest.js +1 -0
  786. package/.next/standalone/.next/server/app/api/init/route.js +1 -0
  787. package/.next/standalone/.next/server/app/api/init/route.js.nft.json +1 -0
  788. package/.next/standalone/.next/server/app/api/init/route_client-reference-manifest.js +1 -0
  789. package/.next/standalone/.next/server/app/api/keys/[id]/route.js +1 -0
  790. package/.next/standalone/.next/server/app/api/keys/[id]/route.js.nft.json +1 -0
  791. package/.next/standalone/.next/server/app/api/keys/[id]/route_client-reference-manifest.js +1 -0
  792. package/.next/standalone/.next/server/app/api/keys/route.js +1 -0
  793. package/.next/standalone/.next/server/app/api/keys/route.js.nft.json +1 -0
  794. package/.next/standalone/.next/server/app/api/keys/route_client-reference-manifest.js +1 -0
  795. package/.next/standalone/.next/server/app/api/locale/route.js +1 -0
  796. package/.next/standalone/.next/server/app/api/locale/route.js.nft.json +1 -0
  797. package/.next/standalone/.next/server/app/api/locale/route_client-reference-manifest.js +1 -0
  798. package/.next/standalone/.next/server/app/api/models/alias/route.js +1 -0
  799. package/.next/standalone/.next/server/app/api/models/alias/route.js.nft.json +1 -0
  800. package/.next/standalone/.next/server/app/api/models/alias/route_client-reference-manifest.js +1 -0
  801. package/.next/standalone/.next/server/app/api/models/availability/route.js +1 -0
  802. package/.next/standalone/.next/server/app/api/models/availability/route.js.nft.json +1 -0
  803. package/.next/standalone/.next/server/app/api/models/availability/route_client-reference-manifest.js +1 -0
  804. package/.next/standalone/.next/server/app/api/models/route.js +1 -0
  805. package/.next/standalone/.next/server/app/api/models/route.js.nft.json +1 -0
  806. package/.next/standalone/.next/server/app/api/models/route_client-reference-manifest.js +1 -0
  807. package/.next/standalone/.next/server/app/api/oauth/[provider]/[action]/route.js +1 -0
  808. package/.next/standalone/.next/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -0
  809. package/.next/standalone/.next/server/app/api/oauth/[provider]/[action]/route_client-reference-manifest.js +1 -0
  810. package/.next/standalone/.next/server/app/api/oauth/cursor/auto-import/route.js +4 -0
  811. package/.next/standalone/.next/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -0
  812. package/.next/standalone/.next/server/app/api/oauth/cursor/auto-import/route_client-reference-manifest.js +1 -0
  813. package/.next/standalone/.next/server/app/api/oauth/cursor/import/route.js +1 -0
  814. package/.next/standalone/.next/server/app/api/oauth/cursor/import/route.js.nft.json +1 -0
  815. package/.next/standalone/.next/server/app/api/oauth/cursor/import/route_client-reference-manifest.js +1 -0
  816. package/.next/standalone/.next/server/app/api/oauth/iflow/cookie/route.js +1 -0
  817. package/.next/standalone/.next/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -0
  818. package/.next/standalone/.next/server/app/api/oauth/iflow/cookie/route_client-reference-manifest.js +1 -0
  819. package/.next/standalone/.next/server/app/api/oauth/kiro/auto-import/route.js +1 -0
  820. package/.next/standalone/.next/server/app/api/oauth/kiro/auto-import/route.js.nft.json +1 -0
  821. package/.next/standalone/.next/server/app/api/oauth/kiro/auto-import/route_client-reference-manifest.js +1 -0
  822. package/.next/standalone/.next/server/app/api/oauth/kiro/import/route.js +1 -0
  823. package/.next/standalone/.next/server/app/api/oauth/kiro/import/route.js.nft.json +1 -0
  824. package/.next/standalone/.next/server/app/api/oauth/kiro/import/route_client-reference-manifest.js +1 -0
  825. package/.next/standalone/.next/server/app/api/oauth/kiro/social-authorize/route.js +1 -0
  826. package/.next/standalone/.next/server/app/api/oauth/kiro/social-authorize/route.js.nft.json +1 -0
  827. package/.next/standalone/.next/server/app/api/oauth/kiro/social-authorize/route_client-reference-manifest.js +1 -0
  828. package/.next/standalone/.next/server/app/api/oauth/kiro/social-exchange/route.js +1 -0
  829. package/.next/standalone/.next/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -0
  830. package/.next/standalone/.next/server/app/api/oauth/kiro/social-exchange/route_client-reference-manifest.js +1 -0
  831. package/.next/standalone/.next/server/app/api/pricing/route.js +1 -0
  832. package/.next/standalone/.next/server/app/api/pricing/route.js.nft.json +1 -0
  833. package/.next/standalone/.next/server/app/api/pricing/route_client-reference-manifest.js +1 -0
  834. package/.next/standalone/.next/server/app/api/provider-nodes/[id]/route.js +1 -0
  835. package/.next/standalone/.next/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -0
  836. package/.next/standalone/.next/server/app/api/provider-nodes/[id]/route_client-reference-manifest.js +1 -0
  837. package/.next/standalone/.next/server/app/api/provider-nodes/route.js +1 -0
  838. package/.next/standalone/.next/server/app/api/provider-nodes/route.js.nft.json +1 -0
  839. package/.next/standalone/.next/server/app/api/provider-nodes/route_client-reference-manifest.js +1 -0
  840. package/.next/standalone/.next/server/app/api/provider-nodes/validate/route.js +1 -0
  841. package/.next/standalone/.next/server/app/api/provider-nodes/validate/route.js.nft.json +1 -0
  842. package/.next/standalone/.next/server/app/api/provider-nodes/validate/route_client-reference-manifest.js +1 -0
  843. package/.next/standalone/.next/server/app/api/providers/[id]/models/route.js +1 -0
  844. package/.next/standalone/.next/server/app/api/providers/[id]/models/route.js.nft.json +1 -0
  845. package/.next/standalone/.next/server/app/api/providers/[id]/models/route_client-reference-manifest.js +1 -0
  846. package/.next/standalone/.next/server/app/api/providers/[id]/route.js +1 -0
  847. package/.next/standalone/.next/server/app/api/providers/[id]/route.js.nft.json +1 -0
  848. package/.next/standalone/.next/server/app/api/providers/[id]/route_client-reference-manifest.js +1 -0
  849. package/.next/standalone/.next/server/app/api/providers/[id]/test-models/route.js +1 -0
  850. package/.next/standalone/.next/server/app/api/providers/[id]/test-models/route.js.nft.json +1 -0
  851. package/.next/standalone/.next/server/app/api/providers/[id]/test-models/route_client-reference-manifest.js +1 -0
  852. package/.next/standalone/.next/server/app/api/providers/client/route.js +1 -0
  853. package/.next/standalone/.next/server/app/api/providers/client/route.js.nft.json +1 -0
  854. package/.next/standalone/.next/server/app/api/providers/client/route_client-reference-manifest.js +1 -0
  855. package/.next/standalone/.next/server/app/api/providers/route.js +1 -0
  856. package/.next/standalone/.next/server/app/api/providers/route.js.nft.json +1 -0
  857. package/.next/standalone/.next/server/app/api/providers/route_client-reference-manifest.js +1 -0
  858. package/.next/standalone/.next/server/app/api/providers/test-batch/route.js +1 -0
  859. package/.next/standalone/.next/server/app/api/providers/test-batch/route.js.nft.json +1 -0
  860. package/.next/standalone/.next/server/app/api/providers/test-batch/route_client-reference-manifest.js +1 -0
  861. package/.next/standalone/.next/server/app/api/providers/validate/route.js +1 -0
  862. package/.next/standalone/.next/server/app/api/providers/validate/route.js.nft.json +1 -0
  863. package/.next/standalone/.next/server/app/api/providers/validate/route_client-reference-manifest.js +1 -0
  864. package/.next/standalone/.next/server/app/api/proxy-pools/[id]/route.js +1 -0
  865. package/.next/standalone/.next/server/app/api/proxy-pools/[id]/route.js.nft.json +1 -0
  866. package/.next/standalone/.next/server/app/api/proxy-pools/[id]/route_client-reference-manifest.js +1 -0
  867. package/.next/standalone/.next/server/app/api/proxy-pools/route.js +1 -0
  868. package/.next/standalone/.next/server/app/api/proxy-pools/route.js.nft.json +1 -0
  869. package/.next/standalone/.next/server/app/api/proxy-pools/route_client-reference-manifest.js +1 -0
  870. package/.next/standalone/.next/server/app/api/settings/database/route.js +1 -0
  871. package/.next/standalone/.next/server/app/api/settings/database/route.js.nft.json +1 -0
  872. package/.next/standalone/.next/server/app/api/settings/database/route_client-reference-manifest.js +1 -0
  873. package/.next/standalone/.next/server/app/api/settings/proxy-test/route.js +1 -0
  874. package/.next/standalone/.next/server/app/api/settings/proxy-test/route.js.nft.json +1 -0
  875. package/.next/standalone/.next/server/app/api/settings/proxy-test/route_client-reference-manifest.js +1 -0
  876. package/.next/standalone/.next/server/app/api/settings/require-login/route.js +1 -0
  877. package/.next/standalone/.next/server/app/api/settings/require-login/route.js.nft.json +1 -0
  878. package/.next/standalone/.next/server/app/api/settings/require-login/route_client-reference-manifest.js +1 -0
  879. package/.next/standalone/.next/server/app/api/settings/route.js +1 -0
  880. package/.next/standalone/.next/server/app/api/settings/route.js.nft.json +1 -0
  881. package/.next/standalone/.next/server/app/api/settings/route_client-reference-manifest.js +1 -0
  882. package/.next/standalone/.next/server/app/api/shutdown/route.js +1 -0
  883. package/.next/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -0
  884. package/.next/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -0
  885. package/.next/standalone/.next/server/app/api/tags/route.js +1 -0
  886. package/.next/standalone/.next/server/app/api/tags/route.js.nft.json +1 -0
  887. package/.next/standalone/.next/server/app/api/tags/route_client-reference-manifest.js +1 -0
  888. package/.next/standalone/.next/server/app/api/translator/console-logs/route.js +1 -0
  889. package/.next/standalone/.next/server/app/api/translator/console-logs/route.js.nft.json +1 -0
  890. package/.next/standalone/.next/server/app/api/translator/console-logs/route_client-reference-manifest.js +1 -0
  891. package/.next/standalone/.next/server/app/api/translator/console-logs/stream/route.js +7 -0
  892. package/.next/standalone/.next/server/app/api/translator/console-logs/stream/route.js.nft.json +1 -0
  893. package/.next/standalone/.next/server/app/api/translator/console-logs/stream/route_client-reference-manifest.js +1 -0
  894. package/.next/standalone/.next/server/app/api/translator/load/route.js +1 -0
  895. package/.next/standalone/.next/server/app/api/translator/load/route.js.nft.json +1 -0
  896. package/.next/standalone/.next/server/app/api/translator/load/route_client-reference-manifest.js +1 -0
  897. package/.next/standalone/.next/server/app/api/translator/save/route.js +1 -0
  898. package/.next/standalone/.next/server/app/api/translator/save/route.js.nft.json +1 -0
  899. package/.next/standalone/.next/server/app/api/translator/save/route_client-reference-manifest.js +1 -0
  900. package/.next/standalone/.next/server/app/api/translator/send/route.js +1 -0
  901. package/.next/standalone/.next/server/app/api/translator/send/route.js.nft.json +1 -0
  902. package/.next/standalone/.next/server/app/api/translator/send/route_client-reference-manifest.js +1 -0
  903. package/.next/standalone/.next/server/app/api/translator/translate/route.js +1 -0
  904. package/.next/standalone/.next/server/app/api/translator/translate/route.js.nft.json +1 -0
  905. package/.next/standalone/.next/server/app/api/translator/translate/route_client-reference-manifest.js +1 -0
  906. package/.next/standalone/.next/server/app/api/tunnel/disable/route.js +1 -0
  907. package/.next/standalone/.next/server/app/api/tunnel/disable/route.js.nft.json +1 -0
  908. package/.next/standalone/.next/server/app/api/tunnel/disable/route_client-reference-manifest.js +1 -0
  909. package/.next/standalone/.next/server/app/api/tunnel/enable/route.js +1 -0
  910. package/.next/standalone/.next/server/app/api/tunnel/enable/route.js.nft.json +1 -0
  911. package/.next/standalone/.next/server/app/api/tunnel/enable/route_client-reference-manifest.js +1 -0
  912. package/.next/standalone/.next/server/app/api/tunnel/status/route.js +1 -0
  913. package/.next/standalone/.next/server/app/api/tunnel/status/route.js.nft.json +1 -0
  914. package/.next/standalone/.next/server/app/api/tunnel/status/route_client-reference-manifest.js +1 -0
  915. package/.next/standalone/.next/server/app/api/usage/[connectionId]/route.js +1 -0
  916. package/.next/standalone/.next/server/app/api/usage/[connectionId]/route.js.nft.json +1 -0
  917. package/.next/standalone/.next/server/app/api/usage/[connectionId]/route_client-reference-manifest.js +1 -0
  918. package/.next/standalone/.next/server/app/api/usage/chart/route.js +1 -0
  919. package/.next/standalone/.next/server/app/api/usage/chart/route.js.nft.json +1 -0
  920. package/.next/standalone/.next/server/app/api/usage/chart/route_client-reference-manifest.js +1 -0
  921. package/.next/standalone/.next/server/app/api/usage/history/route.js +1 -0
  922. package/.next/standalone/.next/server/app/api/usage/history/route.js.nft.json +1 -0
  923. package/.next/standalone/.next/server/app/api/usage/history/route_client-reference-manifest.js +1 -0
  924. package/.next/standalone/.next/server/app/api/usage/providers/route.js +1 -0
  925. package/.next/standalone/.next/server/app/api/usage/providers/route.js.nft.json +1 -0
  926. package/.next/standalone/.next/server/app/api/usage/providers/route_client-reference-manifest.js +1 -0
  927. package/.next/standalone/.next/server/app/api/usage/request-details/route.js +1 -0
  928. package/.next/standalone/.next/server/app/api/usage/request-details/route.js.nft.json +1 -0
  929. package/.next/standalone/.next/server/app/api/usage/request-details/route_client-reference-manifest.js +1 -0
  930. package/.next/standalone/.next/server/app/api/usage/request-logs/route.js +1 -0
  931. package/.next/standalone/.next/server/app/api/usage/request-logs/route.js.nft.json +1 -0
  932. package/.next/standalone/.next/server/app/api/usage/request-logs/route_client-reference-manifest.js +1 -0
  933. package/.next/standalone/.next/server/app/api/usage/stats/route.js +1 -0
  934. package/.next/standalone/.next/server/app/api/usage/stats/route.js.nft.json +1 -0
  935. package/.next/standalone/.next/server/app/api/usage/stats/route_client-reference-manifest.js +1 -0
  936. package/.next/standalone/.next/server/app/api/usage/stream/route.js +7 -0
  937. package/.next/standalone/.next/server/app/api/usage/stream/route.js.nft.json +1 -0
  938. package/.next/standalone/.next/server/app/api/usage/stream/route_client-reference-manifest.js +1 -0
  939. package/.next/standalone/.next/server/app/api/v1/api/chat/route.js +1 -0
  940. package/.next/standalone/.next/server/app/api/v1/api/chat/route.js.nft.json +1 -0
  941. package/.next/standalone/.next/server/app/api/v1/api/chat/route_client-reference-manifest.js +1 -0
  942. package/.next/standalone/.next/server/app/api/v1/chat/completions/route.js +1 -0
  943. package/.next/standalone/.next/server/app/api/v1/chat/completions/route.js.nft.json +1 -0
  944. package/.next/standalone/.next/server/app/api/v1/chat/completions/route_client-reference-manifest.js +1 -0
  945. package/.next/standalone/.next/server/app/api/v1/embeddings/route.js +1 -0
  946. package/.next/standalone/.next/server/app/api/v1/embeddings/route.js.nft.json +1 -0
  947. package/.next/standalone/.next/server/app/api/v1/embeddings/route_client-reference-manifest.js +1 -0
  948. package/.next/standalone/.next/server/app/api/v1/messages/count_tokens/route.js +1 -0
  949. package/.next/standalone/.next/server/app/api/v1/messages/count_tokens/route.js.nft.json +1 -0
  950. package/.next/standalone/.next/server/app/api/v1/messages/count_tokens/route_client-reference-manifest.js +1 -0
  951. package/.next/standalone/.next/server/app/api/v1/messages/route.js +1 -0
  952. package/.next/standalone/.next/server/app/api/v1/messages/route.js.nft.json +1 -0
  953. package/.next/standalone/.next/server/app/api/v1/messages/route_client-reference-manifest.js +1 -0
  954. package/.next/standalone/.next/server/app/api/v1/models/route.js +1 -0
  955. package/.next/standalone/.next/server/app/api/v1/models/route.js.nft.json +1 -0
  956. package/.next/standalone/.next/server/app/api/v1/models/route_client-reference-manifest.js +1 -0
  957. package/.next/standalone/.next/server/app/api/v1/responses/route.js +1 -0
  958. package/.next/standalone/.next/server/app/api/v1/responses/route.js.nft.json +1 -0
  959. package/.next/standalone/.next/server/app/api/v1/responses/route_client-reference-manifest.js +1 -0
  960. package/.next/standalone/.next/server/app/api/v1/route.js +1 -0
  961. package/.next/standalone/.next/server/app/api/v1/route.js.nft.json +1 -0
  962. package/.next/standalone/.next/server/app/api/v1/route_client-reference-manifest.js +1 -0
  963. package/.next/standalone/.next/server/app/api/v1beta/models/[...path]/route.js +1 -0
  964. package/.next/standalone/.next/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -0
  965. package/.next/standalone/.next/server/app/api/v1beta/models/[...path]/route_client-reference-manifest.js +1 -0
  966. package/.next/standalone/.next/server/app/api/v1beta/models/route.js +1 -0
  967. package/.next/standalone/.next/server/app/api/v1beta/models/route.js.nft.json +1 -0
  968. package/.next/standalone/.next/server/app/api/v1beta/models/route_client-reference-manifest.js +1 -0
  969. package/.next/standalone/.next/server/app/api/version/route.js +1 -0
  970. package/.next/standalone/.next/server/app/api/version/route.js.nft.json +1 -0
  971. package/.next/standalone/.next/server/app/api/version/route_client-reference-manifest.js +1 -0
  972. package/.next/standalone/.next/server/app/callback/page.js +2 -0
  973. package/.next/standalone/.next/server/app/callback/page.js.nft.json +1 -0
  974. package/.next/standalone/.next/server/app/callback/page_client-reference-manifest.js +1 -0
  975. package/.next/standalone/.next/server/app/callback.html +1 -0
  976. package/.next/standalone/.next/server/app/callback.meta +15 -0
  977. package/.next/standalone/.next/server/app/callback.rsc +24 -0
  978. package/.next/standalone/.next/server/app/callback.segments/_full.segment.rsc +24 -0
  979. package/.next/standalone/.next/server/app/callback.segments/_head.segment.rsc +6 -0
  980. package/.next/standalone/.next/server/app/callback.segments/_index.segment.rsc +8 -0
  981. package/.next/standalone/.next/server/app/callback.segments/_tree.segment.rsc +4 -0
  982. package/.next/standalone/.next/server/app/callback.segments/callback/__PAGE__.segment.rsc +9 -0
  983. package/.next/standalone/.next/server/app/callback.segments/callback.segment.rsc +5 -0
  984. package/.next/standalone/.next/server/app/dashboard/cli-tools.html +1 -0
  985. package/.next/standalone/.next/server/app/dashboard/cli-tools.meta +17 -0
  986. package/.next/standalone/.next/server/app/dashboard/cli-tools.rsc +24 -0
  987. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +6 -0
  988. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +5 -0
  989. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +5 -0
  990. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +6 -0
  991. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/_full.segment.rsc +24 -0
  992. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/_head.segment.rsc +6 -0
  993. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/_index.segment.rsc +8 -0
  994. package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +5 -0
  995. package/.next/standalone/.next/server/app/dashboard/combos.html +1 -0
  996. package/.next/standalone/.next/server/app/dashboard/combos.meta +17 -0
  997. package/.next/standalone/.next/server/app/dashboard/combos.rsc +26 -0
  998. package/.next/standalone/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +9 -0
  999. package/.next/standalone/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +5 -0
  1000. package/.next/standalone/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +5 -0
  1001. package/.next/standalone/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +6 -0
  1002. package/.next/standalone/.next/server/app/dashboard/combos.segments/_full.segment.rsc +26 -0
  1003. package/.next/standalone/.next/server/app/dashboard/combos.segments/_head.segment.rsc +6 -0
  1004. package/.next/standalone/.next/server/app/dashboard/combos.segments/_index.segment.rsc +8 -0
  1005. package/.next/standalone/.next/server/app/dashboard/combos.segments/_tree.segment.rsc +5 -0
  1006. package/.next/standalone/.next/server/app/dashboard/endpoint.html +1 -0
  1007. package/.next/standalone/.next/server/app/dashboard/endpoint.meta +17 -0
  1008. package/.next/standalone/.next/server/app/dashboard/endpoint.rsc +24 -0
  1009. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +6 -0
  1010. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +5 -0
  1011. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +5 -0
  1012. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +6 -0
  1013. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/_full.segment.rsc +24 -0
  1014. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/_head.segment.rsc +6 -0
  1015. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/_index.segment.rsc +8 -0
  1016. package/.next/standalone/.next/server/app/dashboard/endpoint.segments/_tree.segment.rsc +5 -0
  1017. package/.next/standalone/.next/server/app/dashboard/mitm.html +1 -0
  1018. package/.next/standalone/.next/server/app/dashboard/mitm.meta +17 -0
  1019. package/.next/standalone/.next/server/app/dashboard/mitm.rsc +23 -0
  1020. package/.next/standalone/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +6 -0
  1021. package/.next/standalone/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +5 -0
  1022. package/.next/standalone/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +5 -0
  1023. package/.next/standalone/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +6 -0
  1024. package/.next/standalone/.next/server/app/dashboard/mitm.segments/_full.segment.rsc +23 -0
  1025. package/.next/standalone/.next/server/app/dashboard/mitm.segments/_head.segment.rsc +6 -0
  1026. package/.next/standalone/.next/server/app/dashboard/mitm.segments/_index.segment.rsc +8 -0
  1027. package/.next/standalone/.next/server/app/dashboard/mitm.segments/_tree.segment.rsc +5 -0
  1028. package/.next/standalone/.next/server/app/dashboard/profile.html +1 -0
  1029. package/.next/standalone/.next/server/app/dashboard/profile.meta +17 -0
  1030. package/.next/standalone/.next/server/app/dashboard/profile.rsc +26 -0
  1031. package/.next/standalone/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +9 -0
  1032. package/.next/standalone/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +5 -0
  1033. package/.next/standalone/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +5 -0
  1034. package/.next/standalone/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +6 -0
  1035. package/.next/standalone/.next/server/app/dashboard/profile.segments/_full.segment.rsc +26 -0
  1036. package/.next/standalone/.next/server/app/dashboard/profile.segments/_head.segment.rsc +6 -0
  1037. package/.next/standalone/.next/server/app/dashboard/profile.segments/_index.segment.rsc +8 -0
  1038. package/.next/standalone/.next/server/app/dashboard/profile.segments/_tree.segment.rsc +5 -0
  1039. package/.next/standalone/.next/server/app/dashboard/providers/new.html +1 -0
  1040. package/.next/standalone/.next/server/app/dashboard/providers/new.meta +18 -0
  1041. package/.next/standalone/.next/server/app/dashboard/providers/new.rsc +26 -0
  1042. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +9 -0
  1043. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +5 -0
  1044. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +5 -0
  1045. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +5 -0
  1046. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +6 -0
  1047. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/_full.segment.rsc +26 -0
  1048. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/_head.segment.rsc +6 -0
  1049. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/_index.segment.rsc +8 -0
  1050. package/.next/standalone/.next/server/app/dashboard/providers/new.segments/_tree.segment.rsc +5 -0
  1051. package/.next/standalone/.next/server/app/dashboard/providers.html +1 -0
  1052. package/.next/standalone/.next/server/app/dashboard/providers.meta +17 -0
  1053. package/.next/standalone/.next/server/app/dashboard/providers.rsc +26 -0
  1054. package/.next/standalone/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +9 -0
  1055. package/.next/standalone/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +5 -0
  1056. package/.next/standalone/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +5 -0
  1057. package/.next/standalone/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +6 -0
  1058. package/.next/standalone/.next/server/app/dashboard/providers.segments/_full.segment.rsc +26 -0
  1059. package/.next/standalone/.next/server/app/dashboard/providers.segments/_head.segment.rsc +6 -0
  1060. package/.next/standalone/.next/server/app/dashboard/providers.segments/_index.segment.rsc +8 -0
  1061. package/.next/standalone/.next/server/app/dashboard/providers.segments/_tree.segment.rsc +5 -0
  1062. package/.next/standalone/.next/server/app/dashboard/proxy-pools.html +1 -0
  1063. package/.next/standalone/.next/server/app/dashboard/proxy-pools.meta +17 -0
  1064. package/.next/standalone/.next/server/app/dashboard/proxy-pools.rsc +26 -0
  1065. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +9 -0
  1066. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +5 -0
  1067. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +5 -0
  1068. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +6 -0
  1069. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +26 -0
  1070. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +6 -0
  1071. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +8 -0
  1072. package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +5 -0
  1073. package/.next/standalone/.next/server/app/dashboard/quota.html +1 -0
  1074. package/.next/standalone/.next/server/app/dashboard/quota.meta +17 -0
  1075. package/.next/standalone/.next/server/app/dashboard/quota.rsc +24 -0
  1076. package/.next/standalone/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +7 -0
  1077. package/.next/standalone/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +5 -0
  1078. package/.next/standalone/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +5 -0
  1079. package/.next/standalone/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +6 -0
  1080. package/.next/standalone/.next/server/app/dashboard/quota.segments/_full.segment.rsc +24 -0
  1081. package/.next/standalone/.next/server/app/dashboard/quota.segments/_head.segment.rsc +6 -0
  1082. package/.next/standalone/.next/server/app/dashboard/quota.segments/_index.segment.rsc +8 -0
  1083. package/.next/standalone/.next/server/app/dashboard/quota.segments/_tree.segment.rsc +5 -0
  1084. package/.next/standalone/.next/server/app/dashboard/settings/pricing/page.js +2 -0
  1085. package/.next/standalone/.next/server/app/dashboard/settings/pricing/page.js.nft.json +1 -0
  1086. package/.next/standalone/.next/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -0
  1087. package/.next/standalone/.next/server/app/dashboard/settings/pricing.html +1 -0
  1088. package/.next/standalone/.next/server/app/dashboard/settings/pricing.meta +17 -0
  1089. package/.next/standalone/.next/server/app/dashboard/settings/pricing.rsc +24 -0
  1090. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +24 -0
  1091. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +6 -0
  1092. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +8 -0
  1093. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +4 -0
  1094. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +9 -0
  1095. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +5 -0
  1096. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +5 -0
  1097. package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +5 -0
  1098. package/.next/standalone/.next/server/app/dashboard/translator.html +1 -0
  1099. package/.next/standalone/.next/server/app/dashboard/translator.meta +17 -0
  1100. package/.next/standalone/.next/server/app/dashboard/translator.rsc +26 -0
  1101. package/.next/standalone/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +9 -0
  1102. package/.next/standalone/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +5 -0
  1103. package/.next/standalone/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +5 -0
  1104. package/.next/standalone/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +6 -0
  1105. package/.next/standalone/.next/server/app/dashboard/translator.segments/_full.segment.rsc +26 -0
  1106. package/.next/standalone/.next/server/app/dashboard/translator.segments/_head.segment.rsc +6 -0
  1107. package/.next/standalone/.next/server/app/dashboard/translator.segments/_index.segment.rsc +8 -0
  1108. package/.next/standalone/.next/server/app/dashboard/translator.segments/_tree.segment.rsc +5 -0
  1109. package/.next/standalone/.next/server/app/dashboard/usage.html +1 -0
  1110. package/.next/standalone/.next/server/app/dashboard/usage.meta +17 -0
  1111. package/.next/standalone/.next/server/app/dashboard/usage.rsc +26 -0
  1112. package/.next/standalone/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +9 -0
  1113. package/.next/standalone/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +5 -0
  1114. package/.next/standalone/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +5 -0
  1115. package/.next/standalone/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +6 -0
  1116. package/.next/standalone/.next/server/app/dashboard/usage.segments/_full.segment.rsc +26 -0
  1117. package/.next/standalone/.next/server/app/dashboard/usage.segments/_head.segment.rsc +6 -0
  1118. package/.next/standalone/.next/server/app/dashboard/usage.segments/_index.segment.rsc +8 -0
  1119. package/.next/standalone/.next/server/app/dashboard/usage.segments/_tree.segment.rsc +5 -0
  1120. package/.next/standalone/.next/server/app/dashboard.html +1 -0
  1121. package/.next/standalone/.next/server/app/dashboard.meta +16 -0
  1122. package/.next/standalone/.next/server/app/dashboard.rsc +24 -0
  1123. package/.next/standalone/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +6 -0
  1124. package/.next/standalone/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +5 -0
  1125. package/.next/standalone/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +6 -0
  1126. package/.next/standalone/.next/server/app/dashboard.segments/_full.segment.rsc +24 -0
  1127. package/.next/standalone/.next/server/app/dashboard.segments/_head.segment.rsc +6 -0
  1128. package/.next/standalone/.next/server/app/dashboard.segments/_index.segment.rsc +8 -0
  1129. package/.next/standalone/.next/server/app/dashboard.segments/_tree.segment.rsc +5 -0
  1130. package/.next/standalone/.next/server/app/favicon.ico/route.js +1 -0
  1131. package/.next/standalone/.next/server/app/favicon.ico/route.js.nft.json +1 -0
  1132. package/.next/standalone/.next/server/app/favicon.ico.body +0 -0
  1133. package/.next/standalone/.next/server/app/favicon.ico.meta +1 -0
  1134. package/.next/standalone/.next/server/app/index.html +1 -0
  1135. package/.next/standalone/.next/server/app/index.meta +16 -0
  1136. package/.next/standalone/.next/server/app/index.rsc +19 -0
  1137. package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +6 -0
  1138. package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +19 -0
  1139. package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +6 -0
  1140. package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +8 -0
  1141. package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +4 -0
  1142. package/.next/standalone/.next/server/app/landing/page.js +2 -0
  1143. package/.next/standalone/.next/server/app/landing/page.js.nft.json +1 -0
  1144. package/.next/standalone/.next/server/app/landing/page_client-reference-manifest.js +1 -0
  1145. package/.next/standalone/.next/server/app/landing.html +1 -0
  1146. package/.next/standalone/.next/server/app/landing.meta +15 -0
  1147. package/.next/standalone/.next/server/app/landing.rsc +24 -0
  1148. package/.next/standalone/.next/server/app/landing.segments/_full.segment.rsc +24 -0
  1149. package/.next/standalone/.next/server/app/landing.segments/_head.segment.rsc +6 -0
  1150. package/.next/standalone/.next/server/app/landing.segments/_index.segment.rsc +8 -0
  1151. package/.next/standalone/.next/server/app/landing.segments/_tree.segment.rsc +4 -0
  1152. package/.next/standalone/.next/server/app/landing.segments/landing/__PAGE__.segment.rsc +9 -0
  1153. package/.next/standalone/.next/server/app/landing.segments/landing.segment.rsc +5 -0
  1154. package/.next/standalone/.next/server/app/login/page.js +2 -0
  1155. package/.next/standalone/.next/server/app/login/page.js.nft.json +1 -0
  1156. package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -0
  1157. package/.next/standalone/.next/server/app/login.html +1 -0
  1158. package/.next/standalone/.next/server/app/login.meta +15 -0
  1159. package/.next/standalone/.next/server/app/login.rsc +25 -0
  1160. package/.next/standalone/.next/server/app/login.segments/_full.segment.rsc +25 -0
  1161. package/.next/standalone/.next/server/app/login.segments/_head.segment.rsc +6 -0
  1162. package/.next/standalone/.next/server/app/login.segments/_index.segment.rsc +8 -0
  1163. package/.next/standalone/.next/server/app/login.segments/_tree.segment.rsc +5 -0
  1164. package/.next/standalone/.next/server/app/login.segments/login/__PAGE__.segment.rsc +10 -0
  1165. package/.next/standalone/.next/server/app/login.segments/login.segment.rsc +5 -0
  1166. package/.next/standalone/.next/server/app/manifest.webmanifest/route.js +16 -0
  1167. package/.next/standalone/.next/server/app/manifest.webmanifest/route.js.nft.json +1 -0
  1168. package/.next/standalone/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -0
  1169. package/.next/standalone/.next/server/app/manifest.webmanifest.body +1 -0
  1170. package/.next/standalone/.next/server/app/manifest.webmanifest.meta +1 -0
  1171. package/.next/standalone/.next/server/app/page.js +2 -0
  1172. package/.next/standalone/.next/server/app/page.js.nft.json +1 -0
  1173. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -0
  1174. package/.next/standalone/.next/server/app-paths-manifest.json +104 -0
  1175. package/.next/standalone/.next/server/chunks/1130.js +1 -0
  1176. package/.next/standalone/.next/server/chunks/1220.js +3 -0
  1177. package/.next/standalone/.next/server/chunks/1424.js +1 -0
  1178. package/.next/standalone/.next/server/chunks/1705.js +1 -0
  1179. package/.next/standalone/.next/server/chunks/1813.js +1 -0
  1180. package/.next/standalone/.next/server/chunks/241.js +1 -0
  1181. package/.next/standalone/.next/server/chunks/2417.js +1 -0
  1182. package/.next/standalone/.next/server/chunks/289.js +1 -0
  1183. package/.next/standalone/.next/server/chunks/318.js +164 -0
  1184. package/.next/standalone/.next/server/chunks/3245.js +1 -0
  1185. package/.next/standalone/.next/server/chunks/3832.js +1 -0
  1186. package/.next/standalone/.next/server/chunks/412.js +7 -0
  1187. package/.next/standalone/.next/server/chunks/4124.js +1 -0
  1188. package/.next/standalone/.next/server/chunks/4642.js +1 -0
  1189. package/.next/standalone/.next/server/chunks/4689.js +1 -0
  1190. package/.next/standalone/.next/server/chunks/4741.js +18 -0
  1191. package/.next/standalone/.next/server/chunks/4755.js +1 -0
  1192. package/.next/standalone/.next/server/chunks/4989.js +2 -0
  1193. package/.next/standalone/.next/server/chunks/5270.js +1 -0
  1194. package/.next/standalone/.next/server/chunks/5296.js +1 -0
  1195. package/.next/standalone/.next/server/chunks/5297.js +1 -0
  1196. package/.next/standalone/.next/server/chunks/5573.js +1 -0
  1197. package/.next/standalone/.next/server/chunks/6108.js +1 -0
  1198. package/.next/standalone/.next/server/chunks/6182.js +5 -0
  1199. package/.next/standalone/.next/server/chunks/63.js +45 -0
  1200. package/.next/standalone/.next/server/chunks/6446.js +1 -0
  1201. package/.next/standalone/.next/server/chunks/649.js +15 -0
  1202. package/.next/standalone/.next/server/chunks/6649.js +1 -0
  1203. package/.next/standalone/.next/server/chunks/6844.js +1 -0
  1204. package/.next/standalone/.next/server/chunks/7341.js +1 -0
  1205. package/.next/standalone/.next/server/chunks/7774.js +120 -0
  1206. package/.next/standalone/.next/server/chunks/7861.js +1 -0
  1207. package/.next/standalone/.next/server/chunks/7890.js +3 -0
  1208. package/.next/standalone/.next/server/chunks/7898.js +1 -0
  1209. package/.next/standalone/.next/server/chunks/7924.js +1 -0
  1210. package/.next/standalone/.next/server/chunks/8332.js +1 -0
  1211. package/.next/standalone/.next/server/chunks/8895.js +4 -0
  1212. package/.next/standalone/.next/server/chunks/9201.js +1 -0
  1213. package/.next/standalone/.next/server/chunks/9609.js +1 -0
  1214. package/.next/standalone/.next/server/chunks/9713.js +1 -0
  1215. package/.next/standalone/.next/server/chunks/9718.js +1 -0
  1216. package/.next/standalone/.next/server/functions-config-manifest.json +18 -0
  1217. package/.next/standalone/.next/server/middleware-build-manifest.js +1 -0
  1218. package/.next/standalone/.next/server/middleware-manifest.json +6 -0
  1219. package/.next/standalone/.next/server/middleware-react-loadable-manifest.js +1 -0
  1220. package/.next/standalone/.next/server/middleware.js +56 -0
  1221. package/.next/standalone/.next/server/next-font-manifest.js +1 -0
  1222. package/.next/standalone/.next/server/next-font-manifest.json +1 -0
  1223. package/.next/standalone/.next/server/pages/404.html +1 -0
  1224. package/.next/standalone/.next/server/pages/500.html +1 -0
  1225. package/.next/standalone/.next/server/pages-manifest.json +4 -0
  1226. package/.next/standalone/.next/server/prefetch-hints.json +1 -0
  1227. package/.next/standalone/.next/server/server-reference-manifest.js +1 -0
  1228. package/.next/standalone/.next/server/server-reference-manifest.json +1 -0
  1229. package/.next/standalone/.next/server/webpack-runtime.js +1 -0
  1230. package/.next/standalone/package.json +68 -0
  1231. package/.next/standalone/server.js +38 -0
  1232. package/.next/standalone/src/mitm/server.js +233 -0
  1233. package/.next/standalone/src/shared/utils/apiKey.js +98 -0
  1234. package/.next/static/2ZXkRcWLgj32_7M6Za4Gl/_buildManifest.js +1 -0
  1235. package/.next/static/2ZXkRcWLgj32_7M6Za4Gl/_ssgManifest.js +1 -0
  1236. package/.next/static/chunks/123-2df5178dd6863198.js +1 -0
  1237. package/.next/static/chunks/1a258343-4af2572c60ed5a11.js +1 -0
  1238. package/.next/static/chunks/2652-9390de91ba4d998f.js +1 -0
  1239. package/.next/static/chunks/3794-123fdf632563f469.js +32 -0
  1240. package/.next/static/chunks/4007-4208afb61e702563.js +3 -0
  1241. package/.next/static/chunks/4bd1b696-e356ca5ba0218e27.js +1 -0
  1242. package/.next/static/chunks/5497-b4d17d3cec4555c6.js +7 -0
  1243. package/.next/static/chunks/5772-81f907ca6ec17897.js +3 -0
  1244. package/.next/static/chunks/8202.1ffc6ce531e066ce.js +1 -0
  1245. package/.next/static/chunks/9242-f68cd69d27fb178b.js +15 -0
  1246. package/.next/static/chunks/app/(dashboard)/dashboard/cli-tools/page-36c60da33f0ce9c4.js +1 -0
  1247. package/.next/static/chunks/app/(dashboard)/dashboard/combos/page-4bdb0cadb949e4c1.js +1 -0
  1248. package/.next/static/chunks/app/(dashboard)/dashboard/console-log/page-361c438ee7bf7fe0.js +1 -0
  1249. package/.next/static/chunks/app/(dashboard)/dashboard/endpoint/page-e8a8912b2e1c9349.js +1 -0
  1250. package/.next/static/chunks/app/(dashboard)/dashboard/mitm/page-89d121ff185bee59.js +1 -0
  1251. package/.next/static/chunks/app/(dashboard)/dashboard/page-1daa9c7d16bfa9fc.js +1 -0
  1252. package/.next/static/chunks/app/(dashboard)/dashboard/profile/page-7c0d1d4d4402ec80.js +1 -0
  1253. package/.next/static/chunks/app/(dashboard)/dashboard/providers/[id]/page-c3d0d307be6d0e43.js +1 -0
  1254. package/.next/static/chunks/app/(dashboard)/dashboard/providers/new/page-893168550a4af7e2.js +1 -0
  1255. package/.next/static/chunks/app/(dashboard)/dashboard/providers/page-4db55fc79a3b45eb.js +1 -0
  1256. package/.next/static/chunks/app/(dashboard)/dashboard/proxy-pools/page-d19487b5634c925f.js +2 -0
  1257. package/.next/static/chunks/app/(dashboard)/dashboard/quota/page-283b404ae2c56609.js +1 -0
  1258. package/.next/static/chunks/app/(dashboard)/dashboard/translator/page-05a40a08f82c93d8.js +1 -0
  1259. package/.next/static/chunks/app/(dashboard)/dashboard/usage/page-1374719e2cd7805e.js +1 -0
  1260. package/.next/static/chunks/app/(dashboard)/layout-7b5c73fdeec705a5.js +1 -0
  1261. package/.next/static/chunks/app/_global-error/page-5e254d0ad05b8e8a.js +1 -0
  1262. package/.next/static/chunks/app/_not-found/page-89be6743514e5f9f.js +1 -0
  1263. package/.next/static/chunks/app/api/auth/login/route-5e254d0ad05b8e8a.js +1 -0
  1264. package/.next/static/chunks/app/api/auth/logout/route-5e254d0ad05b8e8a.js +1 -0
  1265. package/.next/static/chunks/app/api/cli-tools/antigravity-mitm/alias/route-5e254d0ad05b8e8a.js +1 -0
  1266. package/.next/static/chunks/app/api/cli-tools/antigravity-mitm/route-5e254d0ad05b8e8a.js +1 -0
  1267. package/.next/static/chunks/app/api/cli-tools/claude-settings/route-5e254d0ad05b8e8a.js +1 -0
  1268. package/.next/static/chunks/app/api/cli-tools/codex-settings/route-5e254d0ad05b8e8a.js +1 -0
  1269. package/.next/static/chunks/app/api/cli-tools/copilot-settings/route-5e254d0ad05b8e8a.js +1 -0
  1270. package/.next/static/chunks/app/api/cli-tools/droid-settings/route-5e254d0ad05b8e8a.js +1 -0
  1271. package/.next/static/chunks/app/api/cli-tools/openclaw-settings/route-5e254d0ad05b8e8a.js +1 -0
  1272. package/.next/static/chunks/app/api/cli-tools/opencode-settings/route-5e254d0ad05b8e8a.js +1 -0
  1273. package/.next/static/chunks/app/api/cloud/auth/route-5e254d0ad05b8e8a.js +1 -0
  1274. package/.next/static/chunks/app/api/cloud/credentials/update/route-5e254d0ad05b8e8a.js +1 -0
  1275. package/.next/static/chunks/app/api/cloud/model/resolve/route-5e254d0ad05b8e8a.js +1 -0
  1276. package/.next/static/chunks/app/api/cloud/models/alias/route-5e254d0ad05b8e8a.js +1 -0
  1277. package/.next/static/chunks/app/api/combos/[id]/route-5e254d0ad05b8e8a.js +1 -0
  1278. package/.next/static/chunks/app/api/combos/route-5e254d0ad05b8e8a.js +1 -0
  1279. package/.next/static/chunks/app/api/init/route-5e254d0ad05b8e8a.js +1 -0
  1280. package/.next/static/chunks/app/api/keys/[id]/route-5e254d0ad05b8e8a.js +1 -0
  1281. package/.next/static/chunks/app/api/keys/route-5e254d0ad05b8e8a.js +1 -0
  1282. package/.next/static/chunks/app/api/locale/route-5e254d0ad05b8e8a.js +1 -0
  1283. package/.next/static/chunks/app/api/models/alias/route-5e254d0ad05b8e8a.js +1 -0
  1284. package/.next/static/chunks/app/api/models/availability/route-5e254d0ad05b8e8a.js +1 -0
  1285. package/.next/static/chunks/app/api/models/route-5e254d0ad05b8e8a.js +1 -0
  1286. package/.next/static/chunks/app/api/oauth/[provider]/[action]/route-5e254d0ad05b8e8a.js +1 -0
  1287. package/.next/static/chunks/app/api/oauth/cursor/auto-import/route-5e254d0ad05b8e8a.js +1 -0
  1288. package/.next/static/chunks/app/api/oauth/cursor/import/route-5e254d0ad05b8e8a.js +1 -0
  1289. package/.next/static/chunks/app/api/oauth/iflow/cookie/route-5e254d0ad05b8e8a.js +1 -0
  1290. package/.next/static/chunks/app/api/oauth/kiro/auto-import/route-5e254d0ad05b8e8a.js +1 -0
  1291. package/.next/static/chunks/app/api/oauth/kiro/import/route-5e254d0ad05b8e8a.js +1 -0
  1292. package/.next/static/chunks/app/api/oauth/kiro/social-authorize/route-5e254d0ad05b8e8a.js +1 -0
  1293. package/.next/static/chunks/app/api/oauth/kiro/social-exchange/route-5e254d0ad05b8e8a.js +1 -0
  1294. package/.next/static/chunks/app/api/pricing/route-5e254d0ad05b8e8a.js +1 -0
  1295. package/.next/static/chunks/app/api/provider-nodes/[id]/route-5e254d0ad05b8e8a.js +1 -0
  1296. package/.next/static/chunks/app/api/provider-nodes/route-5e254d0ad05b8e8a.js +1 -0
  1297. package/.next/static/chunks/app/api/provider-nodes/validate/route-5e254d0ad05b8e8a.js +1 -0
  1298. package/.next/static/chunks/app/api/providers/[id]/models/route-5e254d0ad05b8e8a.js +1 -0
  1299. package/.next/static/chunks/app/api/providers/[id]/route-5e254d0ad05b8e8a.js +1 -0
  1300. package/.next/static/chunks/app/api/providers/[id]/test-models/route-5e254d0ad05b8e8a.js +1 -0
  1301. package/.next/static/chunks/app/api/providers/client/route-5e254d0ad05b8e8a.js +1 -0
  1302. package/.next/static/chunks/app/api/providers/route-5e254d0ad05b8e8a.js +1 -0
  1303. package/.next/static/chunks/app/api/providers/test-batch/route-5e254d0ad05b8e8a.js +1 -0
  1304. package/.next/static/chunks/app/api/providers/validate/route-5e254d0ad05b8e8a.js +1 -0
  1305. package/.next/static/chunks/app/api/proxy-pools/[id]/route-5e254d0ad05b8e8a.js +1 -0
  1306. package/.next/static/chunks/app/api/proxy-pools/route-5e254d0ad05b8e8a.js +1 -0
  1307. package/.next/static/chunks/app/api/settings/database/route-5e254d0ad05b8e8a.js +1 -0
  1308. package/.next/static/chunks/app/api/settings/proxy-test/route-5e254d0ad05b8e8a.js +1 -0
  1309. package/.next/static/chunks/app/api/settings/require-login/route-5e254d0ad05b8e8a.js +1 -0
  1310. package/.next/static/chunks/app/api/settings/route-5e254d0ad05b8e8a.js +1 -0
  1311. package/.next/static/chunks/app/api/shutdown/route-5e254d0ad05b8e8a.js +1 -0
  1312. package/.next/static/chunks/app/api/tags/route-5e254d0ad05b8e8a.js +1 -0
  1313. package/.next/static/chunks/app/api/translator/console-logs/route-5e254d0ad05b8e8a.js +1 -0
  1314. package/.next/static/chunks/app/api/translator/console-logs/stream/route-5e254d0ad05b8e8a.js +1 -0
  1315. package/.next/static/chunks/app/api/translator/load/route-5e254d0ad05b8e8a.js +1 -0
  1316. package/.next/static/chunks/app/api/translator/save/route-5e254d0ad05b8e8a.js +1 -0
  1317. package/.next/static/chunks/app/api/translator/send/route-5e254d0ad05b8e8a.js +1 -0
  1318. package/.next/static/chunks/app/api/translator/translate/route-5e254d0ad05b8e8a.js +1 -0
  1319. package/.next/static/chunks/app/api/tunnel/disable/route-5e254d0ad05b8e8a.js +1 -0
  1320. package/.next/static/chunks/app/api/tunnel/enable/route-5e254d0ad05b8e8a.js +1 -0
  1321. package/.next/static/chunks/app/api/tunnel/status/route-5e254d0ad05b8e8a.js +1 -0
  1322. package/.next/static/chunks/app/api/usage/[connectionId]/route-5e254d0ad05b8e8a.js +1 -0
  1323. package/.next/static/chunks/app/api/usage/chart/route-5e254d0ad05b8e8a.js +1 -0
  1324. package/.next/static/chunks/app/api/usage/history/route-5e254d0ad05b8e8a.js +1 -0
  1325. package/.next/static/chunks/app/api/usage/providers/route-5e254d0ad05b8e8a.js +1 -0
  1326. package/.next/static/chunks/app/api/usage/request-details/route-5e254d0ad05b8e8a.js +1 -0
  1327. package/.next/static/chunks/app/api/usage/request-logs/route-5e254d0ad05b8e8a.js +1 -0
  1328. package/.next/static/chunks/app/api/usage/stats/route-5e254d0ad05b8e8a.js +1 -0
  1329. package/.next/static/chunks/app/api/usage/stream/route-5e254d0ad05b8e8a.js +1 -0
  1330. package/.next/static/chunks/app/api/v1/api/chat/route-5e254d0ad05b8e8a.js +1 -0
  1331. package/.next/static/chunks/app/api/v1/chat/completions/route-5e254d0ad05b8e8a.js +1 -0
  1332. package/.next/static/chunks/app/api/v1/embeddings/route-5e254d0ad05b8e8a.js +1 -0
  1333. package/.next/static/chunks/app/api/v1/messages/count_tokens/route-5e254d0ad05b8e8a.js +1 -0
  1334. package/.next/static/chunks/app/api/v1/messages/route-5e254d0ad05b8e8a.js +1 -0
  1335. package/.next/static/chunks/app/api/v1/models/route-5e254d0ad05b8e8a.js +1 -0
  1336. package/.next/static/chunks/app/api/v1/responses/route-5e254d0ad05b8e8a.js +1 -0
  1337. package/.next/static/chunks/app/api/v1/route-5e254d0ad05b8e8a.js +1 -0
  1338. package/.next/static/chunks/app/api/v1beta/models/[...path]/route-5e254d0ad05b8e8a.js +1 -0
  1339. package/.next/static/chunks/app/api/v1beta/models/route-5e254d0ad05b8e8a.js +1 -0
  1340. package/.next/static/chunks/app/api/version/route-5e254d0ad05b8e8a.js +1 -0
  1341. package/.next/static/chunks/app/callback/page-e98c5f2afe1b798f.js +1 -0
  1342. package/.next/static/chunks/app/dashboard/settings/pricing/page-4c6fd0ccbb51bb83.js +1 -0
  1343. package/.next/static/chunks/app/landing/page-9b546784307784bd.js +1 -0
  1344. package/.next/static/chunks/app/layout-57aeb5f3175a0cc5.js +1 -0
  1345. package/.next/static/chunks/app/login/page-008d17f2ddd1c0e0.js +1 -0
  1346. package/.next/static/chunks/app/manifest.webmanifest/route-5e254d0ad05b8e8a.js +1 -0
  1347. package/.next/static/chunks/app/page-5e254d0ad05b8e8a.js +1 -0
  1348. package/.next/static/chunks/framework-711ef29bc66f648c.js +1 -0
  1349. package/.next/static/chunks/main-414816c17bbd344f.js +5 -0
  1350. package/.next/static/chunks/main-app-bdbe0c27f86d4694.js +1 -0
  1351. package/.next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  1352. package/.next/static/chunks/webpack-819d2440cd722d0f.js +1 -0
  1353. package/.next/static/css/4a48b8c90d7cf506.css +3 -0
  1354. package/.next/static/css/599369d853c61df7.css +31 -0
  1355. package/.next/static/media/19cfc7226ec3afaa-s.woff2 +0 -0
  1356. package/.next/static/media/21350d82a1f187e9-s.woff2 +0 -0
  1357. package/.next/static/media/8e9860b6e62d6359-s.woff2 +0 -0
  1358. package/.next/static/media/ba9851c3c22cd980-s.woff2 +0 -0
  1359. package/.next/static/media/c5fe6dc8356a8c31-s.woff2 +0 -0
  1360. package/.next/static/media/df0a9ae256c0569c-s.woff2 +0 -0
  1361. package/.next/static/media/e4af272ccee01ff0-s.p.woff2 +0 -0
  1362. package/.next/trace +8 -0
  1363. package/.next/trace-build +1 -0
  1364. package/.next/types/app/(dashboard)/dashboard/cli-tools/page.ts +87 -0
  1365. package/.next/types/app/(dashboard)/dashboard/combos/page.ts +87 -0
  1366. package/.next/types/app/(dashboard)/dashboard/console-log/page.ts +87 -0
  1367. package/.next/types/app/(dashboard)/dashboard/endpoint/page.ts +87 -0
  1368. package/.next/types/app/(dashboard)/dashboard/mitm/page.ts +87 -0
  1369. package/.next/types/app/(dashboard)/dashboard/page.ts +87 -0
  1370. package/.next/types/app/(dashboard)/dashboard/profile/page.ts +87 -0
  1371. package/.next/types/app/(dashboard)/dashboard/providers/[id]/page.ts +87 -0
  1372. package/.next/types/app/(dashboard)/dashboard/providers/new/page.ts +87 -0
  1373. package/.next/types/app/(dashboard)/dashboard/providers/page.ts +87 -0
  1374. package/.next/types/app/(dashboard)/dashboard/proxy-pools/page.ts +87 -0
  1375. package/.next/types/app/(dashboard)/dashboard/quota/page.ts +87 -0
  1376. package/.next/types/app/(dashboard)/dashboard/translator/page.ts +87 -0
  1377. package/.next/types/app/(dashboard)/dashboard/usage/page.ts +87 -0
  1378. package/.next/types/app/api/auth/login/route.ts +351 -0
  1379. package/.next/types/app/api/auth/logout/route.ts +351 -0
  1380. package/.next/types/app/api/cli-tools/antigravity-mitm/alias/route.ts +351 -0
  1381. package/.next/types/app/api/cli-tools/antigravity-mitm/route.ts +351 -0
  1382. package/.next/types/app/api/cli-tools/claude-settings/route.ts +351 -0
  1383. package/.next/types/app/api/cli-tools/codex-settings/route.ts +351 -0
  1384. package/.next/types/app/api/cli-tools/copilot-settings/route.ts +351 -0
  1385. package/.next/types/app/api/cli-tools/droid-settings/route.ts +351 -0
  1386. package/.next/types/app/api/cli-tools/openclaw-settings/route.ts +351 -0
  1387. package/.next/types/app/api/cli-tools/opencode-settings/route.ts +351 -0
  1388. package/.next/types/app/api/cloud/auth/route.ts +351 -0
  1389. package/.next/types/app/api/cloud/credentials/update/route.ts +351 -0
  1390. package/.next/types/app/api/cloud/model/resolve/route.ts +351 -0
  1391. package/.next/types/app/api/cloud/models/alias/route.ts +351 -0
  1392. package/.next/types/app/api/combos/[id]/route.ts +351 -0
  1393. package/.next/types/app/api/combos/route.ts +351 -0
  1394. package/.next/types/app/api/init/route.ts +351 -0
  1395. package/.next/types/app/api/keys/[id]/route.ts +351 -0
  1396. package/.next/types/app/api/keys/route.ts +351 -0
  1397. package/.next/types/app/api/locale/route.ts +351 -0
  1398. package/.next/types/app/api/models/alias/route.ts +351 -0
  1399. package/.next/types/app/api/models/availability/route.ts +351 -0
  1400. package/.next/types/app/api/models/route.ts +351 -0
  1401. package/.next/types/app/api/oauth/[provider]/[action]/route.ts +351 -0
  1402. package/.next/types/app/api/oauth/cursor/auto-import/route.ts +351 -0
  1403. package/.next/types/app/api/oauth/cursor/import/route.ts +351 -0
  1404. package/.next/types/app/api/oauth/iflow/cookie/route.ts +351 -0
  1405. package/.next/types/app/api/oauth/kiro/auto-import/route.ts +351 -0
  1406. package/.next/types/app/api/oauth/kiro/import/route.ts +351 -0
  1407. package/.next/types/app/api/oauth/kiro/social-authorize/route.ts +351 -0
  1408. package/.next/types/app/api/oauth/kiro/social-exchange/route.ts +351 -0
  1409. package/.next/types/app/api/pricing/route.ts +351 -0
  1410. package/.next/types/app/api/provider-nodes/[id]/route.ts +351 -0
  1411. package/.next/types/app/api/provider-nodes/route.ts +351 -0
  1412. package/.next/types/app/api/provider-nodes/validate/route.ts +351 -0
  1413. package/.next/types/app/api/providers/[id]/models/route.ts +351 -0
  1414. package/.next/types/app/api/providers/[id]/route.ts +351 -0
  1415. package/.next/types/app/api/providers/[id]/test-models/route.ts +351 -0
  1416. package/.next/types/app/api/providers/client/route.ts +351 -0
  1417. package/.next/types/app/api/providers/route.ts +351 -0
  1418. package/.next/types/app/api/providers/test-batch/route.ts +351 -0
  1419. package/.next/types/app/api/providers/validate/route.ts +351 -0
  1420. package/.next/types/app/api/proxy-pools/[id]/route.ts +351 -0
  1421. package/.next/types/app/api/proxy-pools/route.ts +351 -0
  1422. package/.next/types/app/api/settings/database/route.ts +351 -0
  1423. package/.next/types/app/api/settings/proxy-test/route.ts +351 -0
  1424. package/.next/types/app/api/settings/require-login/route.ts +351 -0
  1425. package/.next/types/app/api/settings/route.ts +351 -0
  1426. package/.next/types/app/api/shutdown/route.ts +351 -0
  1427. package/.next/types/app/api/tags/route.ts +351 -0
  1428. package/.next/types/app/api/translator/console-logs/route.ts +351 -0
  1429. package/.next/types/app/api/translator/console-logs/stream/route.ts +351 -0
  1430. package/.next/types/app/api/translator/load/route.ts +351 -0
  1431. package/.next/types/app/api/translator/save/route.ts +351 -0
  1432. package/.next/types/app/api/translator/send/route.ts +351 -0
  1433. package/.next/types/app/api/translator/translate/route.ts +351 -0
  1434. package/.next/types/app/api/tunnel/disable/route.ts +351 -0
  1435. package/.next/types/app/api/tunnel/enable/route.ts +351 -0
  1436. package/.next/types/app/api/tunnel/status/route.ts +351 -0
  1437. package/.next/types/app/api/usage/[connectionId]/route.ts +351 -0
  1438. package/.next/types/app/api/usage/chart/route.ts +351 -0
  1439. package/.next/types/app/api/usage/history/route.ts +351 -0
  1440. package/.next/types/app/api/usage/providers/route.ts +351 -0
  1441. package/.next/types/app/api/usage/request-details/route.ts +351 -0
  1442. package/.next/types/app/api/usage/request-logs/route.ts +351 -0
  1443. package/.next/types/app/api/usage/stats/route.ts +351 -0
  1444. package/.next/types/app/api/usage/stream/route.ts +351 -0
  1445. package/.next/types/app/api/v1/api/chat/route.ts +351 -0
  1446. package/.next/types/app/api/v1/chat/completions/route.ts +351 -0
  1447. package/.next/types/app/api/v1/embeddings/route.ts +351 -0
  1448. package/.next/types/app/api/v1/messages/count_tokens/route.ts +351 -0
  1449. package/.next/types/app/api/v1/messages/route.ts +351 -0
  1450. package/.next/types/app/api/v1/models/route.ts +351 -0
  1451. package/.next/types/app/api/v1/responses/route.ts +351 -0
  1452. package/.next/types/app/api/v1/route.ts +351 -0
  1453. package/.next/types/app/api/v1beta/models/[...path]/route.ts +351 -0
  1454. package/.next/types/app/api/v1beta/models/route.ts +351 -0
  1455. package/.next/types/app/api/version/route.ts +351 -0
  1456. package/.next/types/app/callback/page.ts +87 -0
  1457. package/.next/types/app/dashboard/settings/pricing/page.ts +87 -0
  1458. package/.next/types/app/landing/page.ts +87 -0
  1459. package/.next/types/app/login/page.ts +87 -0
  1460. package/.next/types/app/page.ts +87 -0
  1461. package/.next/types/package.json +1 -0
  1462. package/.next/types/routes.d.ts +156 -0
  1463. package/.next/types/validator.ts +17 -0
  1464. package/LICENSE +21 -0
  1465. package/cloud/README.md +25 -0
  1466. package/cloud/migrations/0001_init.sql +9 -0
  1467. package/cloud/package.json +17 -0
  1468. package/cloud/src/handlers/cache.js +37 -0
  1469. package/cloud/src/handlers/chat.js +305 -0
  1470. package/cloud/src/handlers/cleanup.js +34 -0
  1471. package/cloud/src/handlers/countTokens.js +46 -0
  1472. package/cloud/src/handlers/embeddings.js +285 -0
  1473. package/cloud/src/handlers/forward.js +75 -0
  1474. package/cloud/src/handlers/forwardRaw.js +173 -0
  1475. package/cloud/src/handlers/sync.js +227 -0
  1476. package/cloud/src/handlers/verify.js +60 -0
  1477. package/cloud/src/index.js +233 -0
  1478. package/cloud/src/services/landingPage.js +27 -0
  1479. package/cloud/src/services/storage.js +88 -0
  1480. package/cloud/src/services/tokenRefresh.js +11 -0
  1481. package/cloud/src/stubs/usageDb.js +8 -0
  1482. package/cloud/src/utils/apiKey.js +72 -0
  1483. package/cloud/src/utils/logger.js +84 -0
  1484. package/cloud/wrangler.toml +17 -0
  1485. package/open-sse/config/appConstants.js +130 -0
  1486. package/open-sse/config/codexInstructions.js +120 -0
  1487. package/open-sse/config/constants.js +4 -0
  1488. package/open-sse/config/defaultThinkingSignature.js +7 -0
  1489. package/open-sse/config/ollamaModels.js +19 -0
  1490. package/open-sse/config/providerModels.js +390 -0
  1491. package/open-sse/config/providers.js +313 -0
  1492. package/open-sse/config/runtimeConfig.js +92 -0
  1493. package/open-sse/executors/antigravity.js +261 -0
  1494. package/open-sse/executors/base.js +130 -0
  1495. package/open-sse/executors/codex.js +108 -0
  1496. package/open-sse/executors/cursor.js +742 -0
  1497. package/open-sse/executors/default.js +213 -0
  1498. package/open-sse/executors/gemini-cli.js +67 -0
  1499. package/open-sse/executors/github.js +305 -0
  1500. package/open-sse/executors/iflow.js +104 -0
  1501. package/open-sse/executors/index.js +45 -0
  1502. package/open-sse/executors/kiro.js +448 -0
  1503. package/open-sse/executors/vertex.js +120 -0
  1504. package/open-sse/handlers/chatCore/nonStreamingHandler.js +204 -0
  1505. package/open-sse/handlers/chatCore/requestDetail.js +102 -0
  1506. package/open-sse/handlers/chatCore/sseToJsonHandler.js +161 -0
  1507. package/open-sse/handlers/chatCore/streamingHandler.js +99 -0
  1508. package/open-sse/handlers/chatCore.js +213 -0
  1509. package/open-sse/handlers/embeddingsCore.js +302 -0
  1510. package/open-sse/handlers/responsesHandler.js +103 -0
  1511. package/open-sse/index.js +74 -0
  1512. package/open-sse/services/accountFallback.js +251 -0
  1513. package/open-sse/services/combo.js +111 -0
  1514. package/open-sse/services/compact.js +71 -0
  1515. package/open-sse/services/model.js +169 -0
  1516. package/open-sse/services/projectId.js +307 -0
  1517. package/open-sse/services/provider.js +356 -0
  1518. package/open-sse/services/tokenRefresh.js +731 -0
  1519. package/open-sse/services/usage.js +708 -0
  1520. package/open-sse/transformer/responsesTransformer.js +439 -0
  1521. package/open-sse/transformer/streamToJsonConverter.js +103 -0
  1522. package/open-sse/translator/formats.js +31 -0
  1523. package/open-sse/translator/helpers/claudeHelper.js +198 -0
  1524. package/open-sse/translator/helpers/geminiHelper.js +337 -0
  1525. package/open-sse/translator/helpers/maxTokensHelper.js +25 -0
  1526. package/open-sse/translator/helpers/openaiHelper.js +127 -0
  1527. package/open-sse/translator/helpers/responsesApiHelper.js +129 -0
  1528. package/open-sse/translator/helpers/toolCallHelper.js +111 -0
  1529. package/open-sse/translator/index.js +204 -0
  1530. package/open-sse/translator/request/antigravity-to-openai.js +223 -0
  1531. package/open-sse/translator/request/claude-to-openai.js +232 -0
  1532. package/open-sse/translator/request/gemini-to-openai.js +147 -0
  1533. package/open-sse/translator/request/openai-responses.js +277 -0
  1534. package/open-sse/translator/request/openai-to-claude.js +348 -0
  1535. package/open-sse/translator/request/openai-to-cursor.js +181 -0
  1536. package/open-sse/translator/request/openai-to-gemini.js +431 -0
  1537. package/open-sse/translator/request/openai-to-kiro.js +306 -0
  1538. package/open-sse/translator/request/openai-to-kiro.old.js +278 -0
  1539. package/open-sse/translator/request/openai-to-ollama.js +159 -0
  1540. package/open-sse/translator/response/claude-to-openai.js +206 -0
  1541. package/open-sse/translator/response/cursor-to-openai.js +30 -0
  1542. package/open-sse/translator/response/gemini-to-openai.js +240 -0
  1543. package/open-sse/translator/response/kiro-to-openai.js +189 -0
  1544. package/open-sse/translator/response/ollama-to-openai.js +152 -0
  1545. package/open-sse/translator/response/openai-responses.js +571 -0
  1546. package/open-sse/translator/response/openai-to-antigravity.js +120 -0
  1547. package/open-sse/translator/response/openai-to-claude.js +223 -0
  1548. package/open-sse/utils/bypassHandler.js +298 -0
  1549. package/open-sse/utils/claudeCloaking.js +60 -0
  1550. package/open-sse/utils/cursorChecksum.js +149 -0
  1551. package/open-sse/utils/cursorProtobuf.js +904 -0
  1552. package/open-sse/utils/error.js +185 -0
  1553. package/open-sse/utils/ollamaTransform.js +85 -0
  1554. package/open-sse/utils/proxyFetch.js +258 -0
  1555. package/open-sse/utils/requestLogger.js +260 -0
  1556. package/open-sse/utils/sessionManager.js +82 -0
  1557. package/open-sse/utils/stream.js +392 -0
  1558. package/open-sse/utils/streamHandler.js +138 -0
  1559. package/open-sse/utils/streamHelpers.js +122 -0
  1560. package/open-sse/utils/usageTracking.js +325 -0
  1561. package/package.json +68 -0
  1562. package/public/favicon.svg +11 -0
  1563. package/public/file.svg +1 -0
  1564. package/public/globe.svg +1 -0
  1565. package/public/i18n/literals/ar.json +196 -0
  1566. package/public/i18n/literals/az.json +196 -0
  1567. package/public/i18n/literals/bn.json +196 -0
  1568. package/public/i18n/literals/cs.json +196 -0
  1569. package/public/i18n/literals/da.json +196 -0
  1570. package/public/i18n/literals/de.json +196 -0
  1571. package/public/i18n/literals/el.json +196 -0
  1572. package/public/i18n/literals/es.json +196 -0
  1573. package/public/i18n/literals/fi.json +196 -0
  1574. package/public/i18n/literals/fr.json +196 -0
  1575. package/public/i18n/literals/he.json +196 -0
  1576. package/public/i18n/literals/hi.json +196 -0
  1577. package/public/i18n/literals/hu.json +196 -0
  1578. package/public/i18n/literals/id.json +196 -0
  1579. package/public/i18n/literals/it.json +196 -0
  1580. package/public/i18n/literals/ja.json +196 -0
  1581. package/public/i18n/literals/ko.json +196 -0
  1582. package/public/i18n/literals/nl.json +196 -0
  1583. package/public/i18n/literals/no.json +196 -0
  1584. package/public/i18n/literals/pl.json +196 -0
  1585. package/public/i18n/literals/pt-BR.json +196 -0
  1586. package/public/i18n/literals/pt-PT.json +196 -0
  1587. package/public/i18n/literals/ro.json +196 -0
  1588. package/public/i18n/literals/ru.json +196 -0
  1589. package/public/i18n/literals/sv.json +196 -0
  1590. package/public/i18n/literals/th.json +196 -0
  1591. package/public/i18n/literals/tl.json +196 -0
  1592. package/public/i18n/literals/tr.json +196 -0
  1593. package/public/i18n/literals/uk.json +196 -0
  1594. package/public/i18n/literals/ur.json +196 -0
  1595. package/public/i18n/literals/vi.json +196 -0
  1596. package/public/i18n/literals/zh-CN.json +515 -0
  1597. package/public/i18n/literals/zh-TW.json +196 -0
  1598. package/public/icons/icon-192.svg +10 -0
  1599. package/public/icons/icon-512.svg +10 -0
  1600. package/public/next.svg +1 -0
  1601. package/public/providers/alicode-intl.png +0 -0
  1602. package/public/providers/alicode.png +0 -0
  1603. package/public/providers/anthropic-m.png +0 -0
  1604. package/public/providers/anthropic.png +0 -0
  1605. package/public/providers/antigravity.png +0 -0
  1606. package/public/providers/cerebras.png +0 -0
  1607. package/public/providers/chutes.png +0 -0
  1608. package/public/providers/claude.png +0 -0
  1609. package/public/providers/cline.png +0 -0
  1610. package/public/providers/codex.png +0 -0
  1611. package/public/providers/cohere.png +0 -0
  1612. package/public/providers/continue.png +0 -0
  1613. package/public/providers/copilot.png +0 -0
  1614. package/public/providers/cursor.png +0 -0
  1615. package/public/providers/deepseek.png +0 -0
  1616. package/public/providers/droid.png +0 -0
  1617. package/public/providers/fireworks.png +0 -0
  1618. package/public/providers/gemini-cli.png +0 -0
  1619. package/public/providers/gemini.png +0 -0
  1620. package/public/providers/github.png +0 -0
  1621. package/public/providers/glm-cn.png +0 -0
  1622. package/public/providers/glm.png +0 -0
  1623. package/public/providers/groq.png +0 -0
  1624. package/public/providers/iflow.png +0 -0
  1625. package/public/providers/kilocode.png +0 -0
  1626. package/public/providers/kimi-coding.png +0 -0
  1627. package/public/providers/kimi.png +0 -0
  1628. package/public/providers/kiro.png +0 -0
  1629. package/public/providers/minimax-cn.png +0 -0
  1630. package/public/providers/minimax.png +0 -0
  1631. package/public/providers/mistral.png +0 -0
  1632. package/public/providers/nebius.png +0 -0
  1633. package/public/providers/nvidia.png +0 -0
  1634. package/public/providers/oai-cc.png +0 -0
  1635. package/public/providers/oai-r.png +0 -0
  1636. package/public/providers/ollama-local.png +0 -0
  1637. package/public/providers/ollama.png +0 -0
  1638. package/public/providers/openai.png +0 -0
  1639. package/public/providers/openclaw.png +0 -0
  1640. package/public/providers/opencode.png +0 -0
  1641. package/public/providers/openrouter.png +0 -0
  1642. package/public/providers/perplexity.png +0 -0
  1643. package/public/providers/qwen.png +0 -0
  1644. package/public/providers/roo.png +0 -0
  1645. package/public/providers/siliconflow.png +0 -0
  1646. package/public/providers/together.png +0 -0
  1647. package/public/providers/vertex-partner.png +0 -0
  1648. package/public/providers/vertex.png +0 -0
  1649. package/public/providers/xai.png +0 -0
  1650. package/public/sw.js +22 -0
  1651. package/public/vercel.svg +1 -0
  1652. package/public/window.svg +1 -0
  1653. package/src/app/(dashboard)/dashboard/cli-tools/CLIToolsPageClient.js +206 -0
  1654. package/src/app/(dashboard)/dashboard/cli-tools/components/AntigravityToolCard.js +478 -0
  1655. package/src/app/(dashboard)/dashboard/cli-tools/components/ClaudeToolCard.js +388 -0
  1656. package/src/app/(dashboard)/dashboard/cli-tools/components/CodexToolCard.js +336 -0
  1657. package/src/app/(dashboard)/dashboard/cli-tools/components/CopilotToolCard.js +295 -0
  1658. package/src/app/(dashboard)/dashboard/cli-tools/components/DefaultToolCard.js +293 -0
  1659. package/src/app/(dashboard)/dashboard/cli-tools/components/DroidToolCard.js +339 -0
  1660. package/src/app/(dashboard)/dashboard/cli-tools/components/MitmServerCard.js +241 -0
  1661. package/src/app/(dashboard)/dashboard/cli-tools/components/MitmToolCard.js +299 -0
  1662. package/src/app/(dashboard)/dashboard/cli-tools/components/OpenClawToolCard.js +352 -0
  1663. package/src/app/(dashboard)/dashboard/cli-tools/components/OpenCodeToolCard.js +308 -0
  1664. package/src/app/(dashboard)/dashboard/cli-tools/components/index.js +11 -0
  1665. package/src/app/(dashboard)/dashboard/cli-tools/page.js +7 -0
  1666. package/src/app/(dashboard)/dashboard/combos/page.js +470 -0
  1667. package/src/app/(dashboard)/dashboard/console-log/ConsoleLogClient.js +91 -0
  1668. package/src/app/(dashboard)/dashboard/console-log/page.js +8 -0
  1669. package/src/app/(dashboard)/dashboard/endpoint/EndpointPageClient.js +772 -0
  1670. package/src/app/(dashboard)/dashboard/endpoint/page.js +7 -0
  1671. package/src/app/(dashboard)/dashboard/mitm/MitmPageClient.js +108 -0
  1672. package/src/app/(dashboard)/dashboard/mitm/page.js +5 -0
  1673. package/src/app/(dashboard)/dashboard/page.js +7 -0
  1674. package/src/app/(dashboard)/dashboard/profile/page.js +631 -0
  1675. package/src/app/(dashboard)/dashboard/providers/[id]/page.js +2235 -0
  1676. package/src/app/(dashboard)/dashboard/providers/[id]/page.new.js +1724 -0
  1677. package/src/app/(dashboard)/dashboard/providers/components/ModelAvailabilityBadge.js +185 -0
  1678. package/src/app/(dashboard)/dashboard/providers/new/page.js +220 -0
  1679. package/src/app/(dashboard)/dashboard/providers/page.js +454 -0
  1680. package/src/app/(dashboard)/dashboard/proxy-pools/page.js +489 -0
  1681. package/src/app/(dashboard)/dashboard/quota/page.js +11 -0
  1682. package/src/app/(dashboard)/dashboard/translator/page.js +300 -0
  1683. package/src/app/(dashboard)/dashboard/usage/components/OverviewCards.js +35 -0
  1684. package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/ProviderLimitCard.js +190 -0
  1685. package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/QuotaProgressBar.js +127 -0
  1686. package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/QuotaTable.js +160 -0
  1687. package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/index.js +416 -0
  1688. package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/utils.js +201 -0
  1689. package/src/app/(dashboard)/dashboard/usage/components/ProviderTopology.js +266 -0
  1690. package/src/app/(dashboard)/dashboard/usage/components/RequestDetailsTab.js +425 -0
  1691. package/src/app/(dashboard)/dashboard/usage/components/UsageChart.js +141 -0
  1692. package/src/app/(dashboard)/dashboard/usage/components/UsageTable.js +247 -0
  1693. package/src/app/(dashboard)/dashboard/usage/page.js +64 -0
  1694. package/src/app/(dashboard)/layout.js +6 -0
  1695. package/src/app/api/auth/login/route.js +54 -0
  1696. package/src/app/api/auth/logout/route.js +8 -0
  1697. package/src/app/api/cli-tools/antigravity-mitm/alias/route.js +51 -0
  1698. package/src/app/api/cli-tools/antigravity-mitm/route.js +133 -0
  1699. package/src/app/api/cli-tools/claude-settings/route.js +194 -0
  1700. package/src/app/api/cli-tools/codex-settings/route.js +218 -0
  1701. package/src/app/api/cli-tools/copilot-settings/route.js +148 -0
  1702. package/src/app/api/cli-tools/droid-settings/route.js +175 -0
  1703. package/src/app/api/cli-tools/openclaw-settings/route.js +180 -0
  1704. package/src/app/api/cli-tools/opencode-settings/route.js +153 -0
  1705. package/src/app/api/cloud/auth/route.js +50 -0
  1706. package/src/app/api/cloud/credentials/update/route.js +57 -0
  1707. package/src/app/api/cloud/model/resolve/route.js +50 -0
  1708. package/src/app/api/cloud/models/alias/route.js +72 -0
  1709. package/src/app/api/combos/[id]/route.js +71 -0
  1710. package/src/app/api/combos/route.js +48 -0
  1711. package/src/app/api/init/route.js +7 -0
  1712. package/src/app/api/keys/[id]/route.js +58 -0
  1713. package/src/app/api/keys/route.js +42 -0
  1714. package/src/app/api/locale/route.js +30 -0
  1715. package/src/app/api/models/alias/route.js +53 -0
  1716. package/src/app/api/models/availability/route.js +121 -0
  1717. package/src/app/api/models/route.js +55 -0
  1718. package/src/app/api/oauth/[provider]/[action]/route.js +166 -0
  1719. package/src/app/api/oauth/cursor/auto-import/route.js +186 -0
  1720. package/src/app/api/oauth/cursor/import/route.js +100 -0
  1721. package/src/app/api/oauth/iflow/cookie/route.js +137 -0
  1722. package/src/app/api/oauth/kiro/auto-import/route.js +85 -0
  1723. package/src/app/api/oauth/kiro/import/route.js +56 -0
  1724. package/src/app/api/oauth/kiro/social-authorize/route.js +43 -0
  1725. package/src/app/api/oauth/kiro/social-exchange/route.js +67 -0
  1726. package/src/app/api/pricing/route.js +134 -0
  1727. package/src/app/api/provider-nodes/[id]/route.js +93 -0
  1728. package/src/app/api/provider-nodes/route.js +83 -0
  1729. package/src/app/api/provider-nodes/validate/route.js +171 -0
  1730. package/src/app/api/providers/[id]/models/route.js +445 -0
  1731. package/src/app/api/providers/[id]/route.js +189 -0
  1732. package/src/app/api/providers/[id]/test-models/route.js +111 -0
  1733. package/src/app/api/providers/client/route.js +20 -0
  1734. package/src/app/api/providers/route.js +186 -0
  1735. package/src/app/api/providers/test-batch/route.js +131 -0
  1736. package/src/app/api/providers/validate/route.js +255 -0
  1737. package/src/app/api/proxy-pools/[id]/route.js +118 -0
  1738. package/src/app/api/proxy-pools/route.js +90 -0
  1739. package/src/app/api/settings/database/route.js +36 -0
  1740. package/src/app/api/settings/proxy-test/route.js +23 -0
  1741. package/src/app/api/settings/require-login/route.js +12 -0
  1742. package/src/app/api/settings/route.js +74 -0
  1743. package/src/app/api/shutdown/route.js +12 -0
  1744. package/src/app/api/tags/route.js +18 -0
  1745. package/src/app/api/translator/console-logs/route.js +24 -0
  1746. package/src/app/api/translator/console-logs/stream/route.js +70 -0
  1747. package/src/app/api/translator/load/route.js +45 -0
  1748. package/src/app/api/translator/save/route.js +44 -0
  1749. package/src/app/api/translator/send/route.js +58 -0
  1750. package/src/app/api/translator/translate/route.js +90 -0
  1751. package/src/app/api/tunnel/disable/route.js +12 -0
  1752. package/src/app/api/tunnel/enable/route.js +16 -0
  1753. package/src/app/api/tunnel/status/route.js +12 -0
  1754. package/src/app/api/usage/[connectionId]/route.js +152 -0
  1755. package/src/app/api/usage/chart/route.js +21 -0
  1756. package/src/app/api/usage/history/route.js +12 -0
  1757. package/src/app/api/usage/providers/route.js +42 -0
  1758. package/src/app/api/usage/request-details/route.js +57 -0
  1759. package/src/app/api/usage/request-logs/route.js +13 -0
  1760. package/src/app/api/usage/stats/route.js +23 -0
  1761. package/src/app/api/usage/stream/route.js +81 -0
  1762. package/src/app/api/v1/api/chat/route.js +38 -0
  1763. package/src/app/api/v1/chat/completions/route.js +54 -0
  1764. package/src/app/api/v1/embeddings/route.js +21 -0
  1765. package/src/app/api/v1/messages/count_tokens/route.js +52 -0
  1766. package/src/app/api/v1/messages/route.js +37 -0
  1767. package/src/app/api/v1/models/route.js +149 -0
  1768. package/src/app/api/v1/responses/route.js +31 -0
  1769. package/src/app/api/v1/route.js +32 -0
  1770. package/src/app/api/v1beta/models/[...path]/route.js +329 -0
  1771. package/src/app/api/v1beta/models/route.js +44 -0
  1772. package/src/app/api/version/route.js +45 -0
  1773. package/src/app/callback/page.js +138 -0
  1774. package/src/app/dashboard/settings/pricing/page.js +173 -0
  1775. package/src/app/favicon.ico +0 -0
  1776. package/src/app/globals.css +219 -0
  1777. package/src/app/landing/components/AnimatedBackground.js +57 -0
  1778. package/src/app/landing/components/Features.js +133 -0
  1779. package/src/app/landing/components/FlowAnimation.js +121 -0
  1780. package/src/app/landing/components/Footer.js +61 -0
  1781. package/src/app/landing/components/GetStarted.js +99 -0
  1782. package/src/app/landing/components/HeroSection.js +47 -0
  1783. package/src/app/landing/components/HowItWorks.js +66 -0
  1784. package/src/app/landing/components/Navigation.js +72 -0
  1785. package/src/app/landing/page.js +106 -0
  1786. package/src/app/layout.js +50 -0
  1787. package/src/app/login/page.js +124 -0
  1788. package/src/app/manifest.js +30 -0
  1789. package/src/app/page.js +7 -0
  1790. package/src/dashboardGuard.js +128 -0
  1791. package/src/i18n/RuntimeI18nProvider.js +27 -0
  1792. package/src/i18n/config.js +150 -0
  1793. package/src/i18n/runtime.js +162 -0
  1794. package/src/lib/consoleLogBuffer.js +79 -0
  1795. package/src/lib/initCloudSync.js +22 -0
  1796. package/src/lib/license/manager.js +36 -0
  1797. package/src/lib/localDb.js +1138 -0
  1798. package/src/lib/network/connectionProxy.js +58 -0
  1799. package/src/lib/network/initOutboundProxy.js +22 -0
  1800. package/src/lib/network/outboundProxy.js +68 -0
  1801. package/src/lib/network/proxyTest.js +91 -0
  1802. package/src/lib/oauth/constants/oauth.js +236 -0
  1803. package/src/lib/oauth/providers.js +999 -0
  1804. package/src/lib/oauth/services/antigravity.js +325 -0
  1805. package/src/lib/oauth/services/claude.js +136 -0
  1806. package/src/lib/oauth/services/codex.js +145 -0
  1807. package/src/lib/oauth/services/cursor.js +179 -0
  1808. package/src/lib/oauth/services/gemini.js +240 -0
  1809. package/src/lib/oauth/services/github.js +225 -0
  1810. package/src/lib/oauth/services/iflow.js +202 -0
  1811. package/src/lib/oauth/services/index.js +16 -0
  1812. package/src/lib/oauth/services/kiro.js +313 -0
  1813. package/src/lib/oauth/services/oauth.js +157 -0
  1814. package/src/lib/oauth/services/openai.js +123 -0
  1815. package/src/lib/oauth/services/qwen.js +170 -0
  1816. package/src/lib/oauth/utils/banner.js +63 -0
  1817. package/src/lib/oauth/utils/pkce.js +38 -0
  1818. package/src/lib/oauth/utils/server.js +116 -0
  1819. package/src/lib/oauth/utils/ui.js +48 -0
  1820. package/src/lib/requestDetailsDb.js +278 -0
  1821. package/src/lib/tunnel/cloudflared.js +326 -0
  1822. package/src/lib/tunnel/state.js +53 -0
  1823. package/src/lib/tunnel/tunnelManager.js +169 -0
  1824. package/src/lib/usage/fetcher.js +208 -0
  1825. package/src/lib/usageDb.js +809 -0
  1826. package/src/mitm/cert/generate.js +32 -0
  1827. package/src/mitm/cert/install.js +176 -0
  1828. package/src/mitm/cert/rootCA.js +173 -0
  1829. package/src/mitm/config.js +27 -0
  1830. package/src/mitm/dns/dnsConfig.js +218 -0
  1831. package/src/mitm/handlers/antigravity.js +20 -0
  1832. package/src/mitm/handlers/base.js +50 -0
  1833. package/src/mitm/handlers/copilot.js +35 -0
  1834. package/src/mitm/handlers/cursor.js +15 -0
  1835. package/src/mitm/handlers/kiro.js +20 -0
  1836. package/src/mitm/logger.js +8 -0
  1837. package/src/mitm/manager.js +618 -0
  1838. package/src/mitm/paths.js +16 -0
  1839. package/src/mitm/server.js +233 -0
  1840. package/src/models/index.js +35 -0
  1841. package/src/proxy.js +5 -0
  1842. package/src/server-init.js +17 -0
  1843. package/src/shared/components/Avatar.js +88 -0
  1844. package/src/shared/components/Badge.js +55 -0
  1845. package/src/shared/components/Button.js +56 -0
  1846. package/src/shared/components/Card.js +122 -0
  1847. package/src/shared/components/CursorAuthModal.js +215 -0
  1848. package/src/shared/components/Drawer.js +89 -0
  1849. package/src/shared/components/Footer.js +132 -0
  1850. package/src/shared/components/Header.js +153 -0
  1851. package/src/shared/components/IFlowCookieModal.js +132 -0
  1852. package/src/shared/components/Input.js +69 -0
  1853. package/src/shared/components/KiroAuthModal.js +383 -0
  1854. package/src/shared/components/KiroOAuthWrapper.js +103 -0
  1855. package/src/shared/components/KiroSocialOAuthModal.js +205 -0
  1856. package/src/shared/components/LanguageSwitcher.js +181 -0
  1857. package/src/shared/components/Loading.js +77 -0
  1858. package/src/shared/components/ManualConfigModal.js +46 -0
  1859. package/src/shared/components/Modal.js +143 -0
  1860. package/src/shared/components/ModelSelectModal.js +356 -0
  1861. package/src/shared/components/OAuthModal.js +476 -0
  1862. package/src/shared/components/Pagination.js +146 -0
  1863. package/src/shared/components/PricingModal.js +208 -0
  1864. package/src/shared/components/RequestLogger.js +121 -0
  1865. package/src/shared/components/SegmentedControl.js +48 -0
  1866. package/src/shared/components/Select.js +70 -0
  1867. package/src/shared/components/Sidebar.js +267 -0
  1868. package/src/shared/components/ThemeProvider.js +15 -0
  1869. package/src/shared/components/ThemeToggle.js +47 -0
  1870. package/src/shared/components/Toggle.js +90 -0
  1871. package/src/shared/components/Tooltip.js +19 -0
  1872. package/src/shared/components/UsageStats.js +465 -0
  1873. package/src/shared/components/index.js +33 -0
  1874. package/src/shared/components/layouts/AuthLayout.js +29 -0
  1875. package/src/shared/components/layouts/DashboardLayout.js +102 -0
  1876. package/src/shared/components/layouts/index.js +4 -0
  1877. package/src/shared/constants/cliTools.js +249 -0
  1878. package/src/shared/constants/colors.js +77 -0
  1879. package/src/shared/constants/config.js +67 -0
  1880. package/src/shared/constants/index.js +4 -0
  1881. package/src/shared/constants/models.js +35 -0
  1882. package/src/shared/constants/pricing.js +876 -0
  1883. package/src/shared/constants/providers.js +120 -0
  1884. package/src/shared/hooks/index.js +2 -0
  1885. package/src/shared/hooks/useCopyToClipboard.js +29 -0
  1886. package/src/shared/hooks/useTheme.js +60 -0
  1887. package/src/shared/services/cloudSyncScheduler.js +122 -0
  1888. package/src/shared/services/initializeApp.js +249 -0
  1889. package/src/shared/services/initializeCloudSync.js +37 -0
  1890. package/src/shared/utils/api.js +93 -0
  1891. package/src/shared/utils/apiKey.js +98 -0
  1892. package/src/shared/utils/clineAuth.js +37 -0
  1893. package/src/shared/utils/cloud.js +40 -0
  1894. package/src/shared/utils/cn.js +11 -0
  1895. package/src/shared/utils/index.js +40 -0
  1896. package/src/shared/utils/machine.js +18 -0
  1897. package/src/shared/utils/machineId.js +60 -0
  1898. package/src/sse/handlers/chat.js +215 -0
  1899. package/src/sse/handlers/embeddings.js +142 -0
  1900. package/src/sse/services/auth.js +267 -0
  1901. package/src/sse/services/model.js +68 -0
  1902. package/src/sse/services/tokenRefresh.js +288 -0
  1903. package/src/sse/utils/logger.js +75 -0
  1904. package/src/store/index.js +6 -0
  1905. package/src/store/notificationStore.js +45 -0
  1906. package/src/store/providerStore.js +48 -0
  1907. package/src/store/themeStore.js +54 -0
  1908. package/src/store/userStore.js +20 -0
@@ -0,0 +1,2235 @@
1
+ "use client";
2
+
3
+ import { useState, useEffect, useCallback, useRef } from "react";
4
+ import PropTypes from "prop-types";
5
+ import { useParams, useRouter } from "next/navigation";
6
+ import Link from "next/link";
7
+ import Image from "next/image";
8
+ import { Card, Button, Badge, Input, Modal, CardSkeleton, OAuthModal, KiroOAuthWrapper, CursorAuthModal, IFlowCookieModal, Toggle, Select } from "@/shared/components";
9
+ import { OAUTH_PROVIDERS, APIKEY_PROVIDERS, FREE_PROVIDERS, getProviderAlias, isOpenAICompatibleProvider, isAnthropicCompatibleProvider } from "@/shared/constants/providers";
10
+ import { getModelsByProviderId } from "@/shared/constants/models";
11
+ import { useCopyToClipboard } from "@/shared/hooks/useCopyToClipboard";
12
+
13
+ export default function ProviderDetailPage() {
14
+ const params = useParams();
15
+ const router = useRouter();
16
+ const providerId = params.id;
17
+ const [connections, setConnections] = useState([]);
18
+ const [loading, setLoading] = useState(true);
19
+ const [providerNode, setProviderNode] = useState(null);
20
+ const [proxyPools, setProxyPools] = useState([]);
21
+ const [showOAuthModal, setShowOAuthModal] = useState(false);
22
+ const [showIFlowCookieModal, setShowIFlowCookieModal] = useState(false);
23
+ const [showAddApiKeyModal, setShowAddApiKeyModal] = useState(false);
24
+ const [showEditModal, setShowEditModal] = useState(false);
25
+ const [showEditNodeModal, setShowEditNodeModal] = useState(false);
26
+ const [showBulkProxyModal, setShowBulkProxyModal] = useState(false);
27
+ const [selectedConnection, setSelectedConnection] = useState(null);
28
+ const [modelAliases, setModelAliases] = useState({});
29
+ const [headerImgError, setHeaderImgError] = useState(false);
30
+ const [modelTestResults, setModelTestResults] = useState({});
31
+ const [modelsTestError, setModelsTestError] = useState("");
32
+ const [testingModelId, setTestingModelId] = useState(null);
33
+ const [showAddCustomModel, setShowAddCustomModel] = useState(false);
34
+ const [selectedConnectionIds, setSelectedConnectionIds] = useState([]);
35
+ const [bulkProxyPoolId, setBulkProxyPoolId] = useState("__none__");
36
+ const [bulkUpdatingProxy, setBulkUpdatingProxy] = useState(false);
37
+ const [providerStrategy, setProviderStrategy] = useState(null); // null = use global, "round-robin" = override
38
+ const [providerStickyLimit, setProviderStickyLimit] = useState("");
39
+ const { copied, copy } = useCopyToClipboard();
40
+
41
+ const providerInfo = providerNode
42
+ ? {
43
+ id: providerNode.id,
44
+ name: providerNode.name || (providerNode.type === "anthropic-compatible" ? "Anthropic Compatible" : "OpenAI Compatible"),
45
+ color: providerNode.type === "anthropic-compatible" ? "#D97757" : "#10A37F",
46
+ textIcon: providerNode.type === "anthropic-compatible" ? "AC" : "OC",
47
+ apiType: providerNode.apiType,
48
+ baseUrl: providerNode.baseUrl,
49
+ type: providerNode.type,
50
+ }
51
+ : (OAUTH_PROVIDERS[providerId] || APIKEY_PROVIDERS[providerId] || FREE_PROVIDERS[providerId]);
52
+ const isOAuth = !!OAUTH_PROVIDERS[providerId] || !!FREE_PROVIDERS[providerId];
53
+ const models = getModelsByProviderId(providerId);
54
+ const providerAlias = getProviderAlias(providerId);
55
+
56
+ const isOpenAICompatible = isOpenAICompatibleProvider(providerId);
57
+ const isAnthropicCompatible = isAnthropicCompatibleProvider(providerId);
58
+ const isCompatible = isOpenAICompatible || isAnthropicCompatible;
59
+
60
+ const providerStorageAlias = isCompatible ? providerId : providerAlias;
61
+ const providerDisplayAlias = isCompatible
62
+ ? (providerNode?.prefix || providerId)
63
+ : providerAlias;
64
+
65
+ // Define callbacks BEFORE the useEffect that uses them
66
+ const fetchAliases = useCallback(async () => {
67
+ try {
68
+ const res = await fetch("/api/models/alias");
69
+ const data = await res.json();
70
+ if (res.ok) {
71
+ setModelAliases(data.aliases || {});
72
+ }
73
+ } catch (error) {
74
+ console.log("Error fetching aliases:", error);
75
+ }
76
+ }, []);
77
+
78
+ const fetchConnections = useCallback(async () => {
79
+ try {
80
+ const [connectionsRes, nodesRes, proxyPoolsRes, settingsRes] = await Promise.all([
81
+ fetch("/api/providers", { cache: "no-store" }),
82
+ fetch("/api/provider-nodes", { cache: "no-store" }),
83
+ fetch("/api/proxy-pools?isActive=true", { cache: "no-store" }),
84
+ fetch("/api/settings", { cache: "no-store" }),
85
+ ]);
86
+ const connectionsData = await connectionsRes.json();
87
+ const nodesData = await nodesRes.json();
88
+ const proxyPoolsData = await proxyPoolsRes.json();
89
+ const settingsData = settingsRes.ok ? await settingsRes.json() : {};
90
+ if (connectionsRes.ok) {
91
+ const filtered = (connectionsData.connections || []).filter(c => c.provider === providerId);
92
+ setConnections(filtered);
93
+ }
94
+ if (proxyPoolsRes.ok) {
95
+ setProxyPools(proxyPoolsData.proxyPools || []);
96
+ }
97
+ // Load per-provider strategy override
98
+ const override = (settingsData.providerStrategies || {})[providerId] || {};
99
+ setProviderStrategy(override.fallbackStrategy || null);
100
+ setProviderStickyLimit(override.stickyRoundRobinLimit != null ? String(override.stickyRoundRobinLimit) : "1");
101
+ if (nodesRes.ok) {
102
+ let node = (nodesData.nodes || []).find((entry) => entry.id === providerId) || null;
103
+
104
+ // Newly created compatible nodes can be briefly unavailable on one worker.
105
+ // Retry a few times before showing "Provider not found".
106
+ if (!node && isCompatible) {
107
+ for (let attempt = 0; attempt < 3; attempt += 1) {
108
+ await new Promise((resolve) => setTimeout(resolve, 150));
109
+ const retryRes = await fetch("/api/provider-nodes", { cache: "no-store" });
110
+ if (!retryRes.ok) continue;
111
+ const retryData = await retryRes.json();
112
+ node = (retryData.nodes || []).find((entry) => entry.id === providerId) || null;
113
+ if (node) break;
114
+ }
115
+ }
116
+
117
+ setProviderNode(node);
118
+ }
119
+ } catch (error) {
120
+ console.log("Error fetching connections:", error);
121
+ } finally {
122
+ setLoading(false);
123
+ }
124
+ }, [providerId, isCompatible]);
125
+
126
+ const handleUpdateNode = async (formData) => {
127
+ try {
128
+ const res = await fetch(`/api/provider-nodes/${providerId}`, {
129
+ method: "PUT",
130
+ headers: { "Content-Type": "application/json" },
131
+ body: JSON.stringify(formData),
132
+ });
133
+ const data = await res.json();
134
+ if (res.ok) {
135
+ setProviderNode(data.node);
136
+ await fetchConnections();
137
+ setShowEditNodeModal(false);
138
+ }
139
+ } catch (error) {
140
+ console.log("Error updating provider node:", error);
141
+ }
142
+ };
143
+
144
+ const saveProviderStrategy = async (strategy, stickyLimit) => {
145
+ try {
146
+ const settingsRes = await fetch("/api/settings", { cache: "no-store" });
147
+ const settingsData = settingsRes.ok ? await settingsRes.json() : {};
148
+ const current = settingsData.providerStrategies || {};
149
+
150
+ // Build override: null strategy means remove override, use global
151
+ const override = {};
152
+ if (strategy) override.fallbackStrategy = strategy;
153
+ if (strategy === "round-robin" && stickyLimit !== "") {
154
+ override.stickyRoundRobinLimit = Number(stickyLimit) || 3;
155
+ }
156
+
157
+ const updated = { ...current };
158
+ if (Object.keys(override).length === 0) {
159
+ delete updated[providerId];
160
+ } else {
161
+ updated[providerId] = override;
162
+ }
163
+
164
+ await fetch("/api/settings", {
165
+ method: "PATCH",
166
+ headers: { "Content-Type": "application/json" },
167
+ body: JSON.stringify({ providerStrategies: updated }),
168
+ });
169
+ } catch (error) {
170
+ console.log("Error saving provider strategy:", error);
171
+ }
172
+ };
173
+
174
+ const handleRoundRobinToggle = (enabled) => {
175
+ const strategy = enabled ? "round-robin" : null;
176
+ const sticky = enabled ? (providerStickyLimit || "1") : providerStickyLimit;
177
+ if (enabled && !providerStickyLimit) setProviderStickyLimit("1");
178
+ setProviderStrategy(strategy);
179
+ saveProviderStrategy(strategy, sticky);
180
+ };
181
+
182
+ const handleStickyLimitChange = (value) => {
183
+ setProviderStickyLimit(value);
184
+ saveProviderStrategy("round-robin", value);
185
+ };
186
+
187
+ useEffect(() => {
188
+ fetchConnections();
189
+ fetchAliases();
190
+ }, [fetchConnections, fetchAliases]);
191
+
192
+ const handleSetAlias = async (modelId, alias, providerAliasOverride = providerAlias) => {
193
+ const fullModel = `${providerAliasOverride}/${modelId}`;
194
+ try {
195
+ const res = await fetch("/api/models/alias", {
196
+ method: "PUT",
197
+ headers: { "Content-Type": "application/json" },
198
+ body: JSON.stringify({ model: fullModel, alias }),
199
+ });
200
+ if (res.ok) {
201
+ await fetchAliases();
202
+ } else {
203
+ const data = await res.json();
204
+ alert(data.error || "Failed to set alias");
205
+ }
206
+ } catch (error) {
207
+ console.log("Error setting alias:", error);
208
+ }
209
+ };
210
+
211
+ const handleDeleteAlias = async (alias) => {
212
+ try {
213
+ const res = await fetch(`/api/models/alias?alias=${encodeURIComponent(alias)}`, {
214
+ method: "DELETE",
215
+ });
216
+ if (res.ok) {
217
+ await fetchAliases();
218
+ }
219
+ } catch (error) {
220
+ console.log("Error deleting alias:", error);
221
+ }
222
+ };
223
+
224
+ const handleDelete = async (id) => {
225
+ if (!confirm("Delete this connection?")) return;
226
+ try {
227
+ const res = await fetch(`/api/providers/${id}`, { method: "DELETE" });
228
+ if (res.ok) {
229
+ setConnections(connections.filter(c => c.id !== id));
230
+ }
231
+ } catch (error) {
232
+ console.log("Error deleting connection:", error);
233
+ }
234
+ };
235
+
236
+ const handleOAuthSuccess = () => {
237
+ fetchConnections();
238
+ setShowOAuthModal(false);
239
+ };
240
+
241
+ const handleIFlowCookieSuccess = () => {
242
+ fetchConnections();
243
+ setShowIFlowCookieModal(false);
244
+ };
245
+
246
+ const handleSaveApiKey = async (formData) => {
247
+ try {
248
+ const res = await fetch("/api/providers", {
249
+ method: "POST",
250
+ headers: { "Content-Type": "application/json" },
251
+ body: JSON.stringify({ provider: providerId, ...formData }),
252
+ });
253
+ if (res.ok) {
254
+ await fetchConnections();
255
+ setShowAddApiKeyModal(false);
256
+ }
257
+ } catch (error) {
258
+ console.log("Error saving connection:", error);
259
+ }
260
+ };
261
+
262
+ const handleUpdateConnection = async (formData) => {
263
+ try {
264
+ const res = await fetch(`/api/providers/${selectedConnection.id}`, {
265
+ method: "PUT",
266
+ headers: { "Content-Type": "application/json" },
267
+ body: JSON.stringify(formData),
268
+ });
269
+ if (res.ok) {
270
+ await fetchConnections();
271
+ setShowEditModal(false);
272
+ }
273
+ } catch (error) {
274
+ console.log("Error updating connection:", error);
275
+ }
276
+ };
277
+
278
+ const handleUpdateConnectionStatus = async (id, isActive) => {
279
+ try {
280
+ const res = await fetch(`/api/providers/${id}`, {
281
+ method: "PUT",
282
+ headers: { "Content-Type": "application/json" },
283
+ body: JSON.stringify({ isActive }),
284
+ });
285
+ if (res.ok) {
286
+ setConnections(prev => prev.map(c => c.id === id ? { ...c, isActive } : c));
287
+ }
288
+ } catch (error) {
289
+ console.log("Error updating connection status:", error);
290
+ }
291
+ };
292
+
293
+ const handleSwapPriority = async (index1, index2) => {
294
+ // Optimistic update state
295
+ const newConnections = [...connections];
296
+ [newConnections[index1], newConnections[index2]] = [newConnections[index2], newConnections[index1]];
297
+ setConnections(newConnections);
298
+
299
+ try {
300
+ await Promise.all([
301
+ fetch(`/api/providers/${newConnections[index1].id}`, {
302
+ method: "PUT",
303
+ headers: { "Content-Type": "application/json" },
304
+ body: JSON.stringify({ priority: index1 }),
305
+ }),
306
+ fetch(`/api/providers/${newConnections[index2].id}`, {
307
+ method: "PUT",
308
+ headers: { "Content-Type": "application/json" },
309
+ body: JSON.stringify({ priority: index2 }),
310
+ }),
311
+ ]);
312
+ } catch (error) {
313
+ console.log("Error swapping priority:", error);
314
+ await fetchConnections();
315
+ }
316
+ };
317
+
318
+ const selectedConnections = connections.filter((conn) => selectedConnectionIds.includes(conn.id));
319
+ const allSelected = connections.length > 0 && selectedConnectionIds.length === connections.length;
320
+
321
+ const toggleSelectConnection = (connectionId) => {
322
+ setSelectedConnectionIds((prev) => (
323
+ prev.includes(connectionId)
324
+ ? prev.filter((id) => id !== connectionId)
325
+ : [...prev, connectionId]
326
+ ));
327
+ };
328
+
329
+ const toggleSelectAllConnections = () => {
330
+ if (allSelected) {
331
+ setSelectedConnectionIds([]);
332
+ return;
333
+ }
334
+ setSelectedConnectionIds(connections.map((conn) => conn.id));
335
+ };
336
+
337
+ const clearSelection = () => {
338
+ setSelectedConnectionIds([]);
339
+ setBulkProxyPoolId("__none__");
340
+ };
341
+
342
+ useEffect(() => {
343
+ setSelectedConnectionIds((prev) => prev.filter((id) => connections.some((conn) => conn.id === id)));
344
+ }, [connections]);
345
+
346
+ const selectedProxySummary = (() => {
347
+ if (selectedConnections.length === 0) return "";
348
+ const poolIds = new Set(selectedConnections.map((conn) => conn.providerSpecificData?.proxyPoolId || "__none__"));
349
+ if (poolIds.size === 1) {
350
+ const onlyId = [...poolIds][0];
351
+ if (onlyId === "__none__") return "All selected currently unbound";
352
+ const pool = proxyPools.find((p) => p.id === onlyId);
353
+ return `All selected currently bound to ${pool?.name || onlyId}`;
354
+ }
355
+ return "Selected connections have mixed proxy bindings";
356
+ })();
357
+
358
+ const openBulkProxyModal = () => {
359
+ if (selectedConnections.length === 0) return;
360
+ const uniquePoolIds = [...new Set(selectedConnections.map((conn) => conn.providerSpecificData?.proxyPoolId || "__none__"))];
361
+ setBulkProxyPoolId(uniquePoolIds.length === 1 ? uniquePoolIds[0] : "__none__");
362
+ setShowBulkProxyModal(true);
363
+ };
364
+
365
+ const closeBulkProxyModal = () => {
366
+ if (bulkUpdatingProxy) return;
367
+ setShowBulkProxyModal(false);
368
+ };
369
+
370
+ const handleBulkApplyProxyPool = async () => {
371
+ if (selectedConnectionIds.length === 0) return;
372
+
373
+ const proxyPoolId = bulkProxyPoolId === "__none__" ? null : bulkProxyPoolId;
374
+ setBulkUpdatingProxy(true);
375
+ try {
376
+ const results = [];
377
+ for (const connectionId of selectedConnectionIds) {
378
+ try {
379
+ const res = await fetch(`/api/providers/${connectionId}`, {
380
+ method: "PUT",
381
+ headers: { "Content-Type": "application/json" },
382
+ body: JSON.stringify({ proxyPoolId }),
383
+ });
384
+ results.push(res.ok);
385
+ } catch (e) {
386
+ console.log("Error applying bulk proxy pool for", connectionId, e);
387
+ results.push(false);
388
+ }
389
+ }
390
+
391
+ const failedCount = results.filter((ok) => !ok).length;
392
+ if (failedCount > 0) {
393
+ alert(`Updated with ${failedCount} failed request(s).`);
394
+ }
395
+
396
+ await fetchConnections();
397
+ clearSelection();
398
+ setShowBulkProxyModal(false);
399
+ } catch (error) {
400
+ console.log("Error applying bulk proxy pool:", error);
401
+ } finally {
402
+ setBulkUpdatingProxy(false);
403
+ }
404
+ };
405
+
406
+
407
+ const isSelected = (connectionId) => selectedConnectionIds.includes(connectionId);
408
+
409
+ const connectionsList = (
410
+ <div className="flex flex-col divide-y divide-black/[0.03] dark:divide-white/[0.03]">
411
+ {connections
412
+ .map((conn, index) => (
413
+ <div key={conn.id} className="flex items-stretch">
414
+ <div className="flex-1 min-w-0">
415
+ <ConnectionRow
416
+ connection={conn}
417
+ proxyPools={proxyPools}
418
+ isOAuth={isOAuth}
419
+ isFirst={index === 0}
420
+ isLast={index === connections.length - 1}
421
+ onMoveUp={() => handleSwapPriority(index, index - 1)}
422
+ onMoveDown={() => handleSwapPriority(index, index + 1)}
423
+ onToggleActive={(isActive) => handleUpdateConnectionStatus(conn.id, isActive)}
424
+ onUpdateProxy={async (proxyPoolId) => {
425
+ try {
426
+ const res = await fetch(`/api/providers/${conn.id}`, {
427
+ method: "PUT",
428
+ headers: { "Content-Type": "application/json" },
429
+ body: JSON.stringify({ proxyPoolId: proxyPoolId || null }),
430
+ });
431
+ if (res.ok) {
432
+ setConnections(prev => prev.map(c =>
433
+ c.id === conn.id
434
+ ? { ...c, providerSpecificData: { ...c.providerSpecificData, proxyPoolId: proxyPoolId || null } }
435
+ : c
436
+ ));
437
+ }
438
+ } catch (error) {
439
+ console.log("Error updating proxy:", error);
440
+ }
441
+ }}
442
+ onEdit={() => {
443
+ setSelectedConnection(conn);
444
+ setShowEditModal(true);
445
+ }}
446
+ onDelete={() => handleDelete(conn.id)}
447
+ />
448
+ </div>
449
+ </div>
450
+ ))}
451
+ </div>
452
+ );
453
+
454
+ const bulkProxyOptions = [
455
+ { value: "__none__", label: "None" },
456
+ ...proxyPools.map((pool) => ({ value: pool.id, label: pool.name })),
457
+ ];
458
+
459
+ const bulkHint = selectedConnectionIds.length === 0
460
+ ? "Select one or more connections, then click Proxy Action."
461
+ : selectedProxySummary;
462
+
463
+ const canApplyBulkProxy = selectedConnectionIds.length > 0 && !bulkUpdatingProxy;
464
+
465
+ const bulkActionModal = (
466
+ <Modal
467
+ isOpen={showBulkProxyModal}
468
+ onClose={closeBulkProxyModal}
469
+ title={`Proxy Action (${selectedConnectionIds.length} selected)`}
470
+ >
471
+ <div className="flex flex-col gap-4">
472
+ <Select
473
+ label="Proxy Pool"
474
+ value={bulkProxyPoolId}
475
+ onChange={(e) => setBulkProxyPoolId(e.target.value)}
476
+ options={bulkProxyOptions}
477
+ placeholder="None"
478
+ />
479
+
480
+ <p className="text-xs text-text-muted">{bulkHint}</p>
481
+ <p className="text-xs text-text-muted">Selecting None will unbind selected connections from proxy pool.</p>
482
+
483
+ <div className="flex gap-2">
484
+ <Button onClick={handleBulkApplyProxyPool} fullWidth disabled={!canApplyBulkProxy}>
485
+ {bulkUpdatingProxy ? "Applying..." : "Apply"}
486
+ </Button>
487
+ <Button onClick={closeBulkProxyModal} variant="ghost" fullWidth disabled={bulkUpdatingProxy}>
488
+ Cancel
489
+ </Button>
490
+ </div>
491
+ </div>
492
+ </Modal>
493
+ );
494
+
495
+ const handleTestModel = async (modelId) => {
496
+ if (testingModelId) return;
497
+ setTestingModelId(modelId);
498
+ try {
499
+ const res = await fetch("/api/models/test", {
500
+ method: "POST",
501
+ headers: { "Content-Type": "application/json" },
502
+ body: JSON.stringify({ model: `${providerStorageAlias}/${modelId}` }),
503
+ });
504
+ const data = await res.json();
505
+ setModelTestResults((prev) => ({ ...prev, [modelId]: data.ok ? "ok" : "error" }));
506
+ setModelsTestError(data.ok ? "" : (data.error || "Model not reachable"));
507
+ } catch {
508
+ setModelTestResults((prev) => ({ ...prev, [modelId]: "error" }));
509
+ setModelsTestError("Network error");
510
+ } finally {
511
+ setTestingModelId(null);
512
+ }
513
+ };
514
+
515
+ const renderModelsSection = () => {
516
+ if (isCompatible) {
517
+ return (
518
+ <CompatibleModelsSection
519
+ providerStorageAlias={providerStorageAlias}
520
+ providerDisplayAlias={providerDisplayAlias}
521
+ modelAliases={modelAliases}
522
+ copied={copied}
523
+ onCopy={copy}
524
+ onSetAlias={handleSetAlias}
525
+ onDeleteAlias={handleDeleteAlias}
526
+ connections={connections}
527
+ isAnthropic={isAnthropicCompatible}
528
+ />
529
+ );
530
+ }
531
+ if (providerInfo.passthroughModels) {
532
+ return (
533
+ <PassthroughModelsSection
534
+ providerAlias={providerAlias}
535
+ modelAliases={modelAliases}
536
+ copied={copied}
537
+ onCopy={copy}
538
+ onSetAlias={handleSetAlias}
539
+ onDeleteAlias={handleDeleteAlias}
540
+ />
541
+ );
542
+ }
543
+ // Custom models added by user (stored as aliases: modelId → providerAlias/modelId)
544
+ const customModels = Object.entries(modelAliases)
545
+ .filter(([alias, fullModel]) => {
546
+ const prefix = `${providerStorageAlias}/`;
547
+ if (!fullModel.startsWith(prefix)) return false;
548
+ const modelId = fullModel.slice(prefix.length);
549
+ // Only show if not already in hardcoded list
550
+ return !models.some((m) => m.id === modelId) && alias === modelId;
551
+ })
552
+ .map(([alias, fullModel]) => ({
553
+ id: fullModel.slice(`${providerStorageAlias}/`.length),
554
+ alias,
555
+ fullModel,
556
+ }));
557
+
558
+ return (
559
+ <div className="flex flex-wrap gap-3">
560
+ {models.map((model) => {
561
+ const fullModel = `${providerStorageAlias}/${model.id}`;
562
+ const oldFormatModel = `${providerId}/${model.id}`;
563
+ const existingAlias = Object.entries(modelAliases).find(
564
+ ([, m]) => m === fullModel || m === oldFormatModel
565
+ )?.[0];
566
+ return (
567
+ <ModelRow
568
+ key={model.id}
569
+ model={model}
570
+ fullModel={`${providerDisplayAlias}/${model.id}`}
571
+ alias={existingAlias}
572
+ copied={copied}
573
+ onCopy={copy}
574
+ onSetAlias={(alias) => handleSetAlias(model.id, alias, providerStorageAlias)}
575
+ onDeleteAlias={() => handleDeleteAlias(existingAlias)}
576
+ testStatus={modelTestResults[model.id]}
577
+ onTest={connections.length > 0 ? () => handleTestModel(model.id) : undefined}
578
+ isTesting={testingModelId === model.id}
579
+ />
580
+ );
581
+ })}
582
+
583
+ {/* Custom models inline */}
584
+ {customModels.map((model) => (
585
+ <ModelRow
586
+ key={model.id}
587
+ model={{ id: model.id }}
588
+ fullModel={`${providerDisplayAlias}/${model.id}`}
589
+ alias={model.alias}
590
+ copied={copied}
591
+ onCopy={copy}
592
+ onSetAlias={() => {}}
593
+ onDeleteAlias={() => handleDeleteAlias(model.alias)}
594
+ testStatus={modelTestResults[model.id]}
595
+ onTest={connections.length > 0 ? () => handleTestModel(model.id) : undefined}
596
+ isTesting={testingModelId === model.id}
597
+ isCustom
598
+ />
599
+ ))}
600
+
601
+ {/* Add model button — inline, same style as model chips */}
602
+ <button
603
+ onClick={() => setShowAddCustomModel(true)}
604
+ className="flex items-center gap-1.5 px-3 py-2 rounded-lg border border-dashed border-black/15 dark:border-white/15 text-xs text-text-muted hover:text-primary hover:border-primary/40 transition-colors"
605
+ >
606
+ <span className="material-symbols-outlined text-sm">add</span>
607
+ Add Model
608
+ </button>
609
+ </div>
610
+ );
611
+ };
612
+
613
+ if (loading) {
614
+ return (
615
+ <div className="flex flex-col gap-8">
616
+ <CardSkeleton />
617
+ <CardSkeleton />
618
+ </div>
619
+ );
620
+ }
621
+
622
+ if (!providerInfo) {
623
+ return (
624
+ <div className="text-center py-20">
625
+ <p className="text-text-muted">Provider not found</p>
626
+ <Link href="/dashboard/providers" className="text-primary mt-4 inline-block">
627
+ Back to Providers
628
+ </Link>
629
+ </div>
630
+ );
631
+ }
632
+
633
+ // Determine icon path: OpenAI Compatible providers use specialized icons
634
+ const getHeaderIconPath = () => {
635
+ if (isOpenAICompatible && providerInfo.apiType) {
636
+ return providerInfo.apiType === "responses" ? "/providers/oai-r.png" : "/providers/oai-cc.png";
637
+ }
638
+ if (isAnthropicCompatible) {
639
+ return "/providers/anthropic-m.png";
640
+ }
641
+ return `/providers/${providerInfo.id}.png`;
642
+ };
643
+
644
+ return (
645
+ <div className="flex flex-col gap-8">
646
+ {/* Header */}
647
+ <div>
648
+ <Link
649
+ href="/dashboard/providers"
650
+ className="inline-flex items-center gap-1 text-sm text-text-muted hover:text-primary transition-colors mb-4"
651
+ >
652
+ <span className="material-symbols-outlined text-lg">arrow_back</span>
653
+ Back to Providers
654
+ </Link>
655
+ <div className="flex items-center gap-4">
656
+ <div
657
+ className="rounded-lg flex items-center justify-center"
658
+ style={{ backgroundColor: `${providerInfo.color}15` }}
659
+ >
660
+ {headerImgError ? (
661
+ <span className="text-sm font-bold" style={{ color: providerInfo.color }}>
662
+ {providerInfo.textIcon || providerInfo.id.slice(0, 2).toUpperCase()}
663
+ </span>
664
+ ) : (
665
+ <Image
666
+ src={getHeaderIconPath()}
667
+ alt={providerInfo.name}
668
+ width={48}
669
+ height={48}
670
+ className="object-contain rounded-lg max-w-[48px] max-h-[48px]"
671
+ sizes="48px"
672
+ onError={() => setHeaderImgError(true)}
673
+ />
674
+ )}
675
+ </div>
676
+ <div>
677
+ <h1 className="text-3xl font-semibold tracking-tight">{providerInfo.name}</h1>
678
+ <p className="text-text-muted">
679
+ {connections.length} connection{connections.length === 1 ? "" : "s"}
680
+ </p>
681
+ </div>
682
+ </div>
683
+ </div>
684
+
685
+ {isCompatible && providerNode && (
686
+ <Card>
687
+ <div className="flex items-center justify-between mb-4">
688
+ <div>
689
+ <h2 className="text-lg font-semibold">{isAnthropicCompatible ? "Anthropic Compatible Details" : "OpenAI Compatible Details"}</h2>
690
+ <p className="text-sm text-text-muted">
691
+ {isAnthropicCompatible ? "Messages API" : (providerNode.apiType === "responses" ? "Responses API" : "Chat Completions")} · {(providerNode.baseUrl || "").replace(/\/$/, "")}/
692
+ {isAnthropicCompatible ? "messages" : (providerNode.apiType === "responses" ? "responses" : "chat/completions")}
693
+ </p>
694
+ </div>
695
+ <div className="flex items-center gap-2">
696
+ <Button
697
+ size="sm"
698
+ icon="add"
699
+ onClick={() => setShowAddApiKeyModal(true)}
700
+ disabled={connections.length > 0}
701
+ >
702
+ Add
703
+ </Button>
704
+ <Button
705
+ size="sm"
706
+ variant="secondary"
707
+ icon="edit"
708
+ onClick={() => setShowEditNodeModal(true)}
709
+ >
710
+ Edit
711
+ </Button>
712
+ <Button
713
+ size="sm"
714
+ variant="secondary"
715
+ icon="delete"
716
+ onClick={async () => {
717
+ if (!confirm(`Delete this ${isAnthropicCompatible ? "Anthropic" : "OpenAI"} Compatible node?`)) return;
718
+ try {
719
+ const res = await fetch(`/api/provider-nodes/${providerId}`, { method: "DELETE" });
720
+ if (res.ok) {
721
+ router.push("/dashboard/providers");
722
+ }
723
+ } catch (error) {
724
+ console.log("Error deleting provider node:", error);
725
+ }
726
+ }}
727
+ >
728
+ Delete
729
+ </Button>
730
+ </div>
731
+ </div>
732
+ {connections.length > 0 && (
733
+ <p className="text-sm text-text-muted">
734
+ Only one connection is allowed per compatible node. Add another node if you need more connections.
735
+ </p>
736
+ )}
737
+ </Card>
738
+ )}
739
+
740
+ {/* Connections */}
741
+ <Card>
742
+ <div className="flex items-center justify-between mb-4">
743
+ <h2 className="text-lg font-semibold">Connections</h2>
744
+ {/* Round Robin toggle */}
745
+ <div className="flex items-center gap-2">
746
+ <span className="text-xs text-text-muted font-medium">Round Robin</span>
747
+ <Toggle
748
+ checked={providerStrategy === "round-robin"}
749
+ onChange={handleRoundRobinToggle}
750
+ />
751
+ {providerStrategy === "round-robin" && (
752
+ <div className="flex items-center gap-1.5">
753
+ <span className="text-xs text-text-muted">Sticky:</span>
754
+ <input
755
+ type="number"
756
+ min={1}
757
+ value={providerStickyLimit}
758
+ onChange={(e) => handleStickyLimitChange(e.target.value)}
759
+ placeholder="1"
760
+ className="w-14 px-2 py-1 text-xs border border-border rounded-md bg-background focus:outline-none focus:border-primary"
761
+ />
762
+ </div>
763
+ )}
764
+ </div>
765
+ </div>
766
+
767
+ {connections.length === 0 ? (
768
+ <div className="text-center py-12">
769
+ <div className="inline-flex items-center justify-center w-16 h-16 rounded-full bg-primary/10 text-primary mb-4">
770
+ <span className="material-symbols-outlined text-[32px]">{isOAuth ? "lock" : "key"}</span>
771
+ </div>
772
+ <p className="text-text-main font-medium mb-1">No connections yet</p>
773
+ <p className="text-sm text-text-muted mb-4">Add your first connection to get started</p>
774
+ {!isCompatible && (
775
+ <div className="flex gap-2 justify-center">
776
+ {providerId === "iflow" && (
777
+ <Button icon="cookie" variant="secondary" onClick={() => setShowIFlowCookieModal(true)}>
778
+ Cookie Auth
779
+ </Button>
780
+ )}
781
+ <Button icon="add" onClick={() => isOAuth ? setShowOAuthModal(true) : setShowAddApiKeyModal(true)}>
782
+ {providerId === "iflow" ? "OAuth" : "Add Connection"}
783
+ </Button>
784
+ </div>
785
+ )}
786
+ </div>
787
+ ) : (
788
+ <>
789
+ {connectionsList}
790
+ {!isCompatible && (
791
+ <div className="flex gap-2 mt-4">
792
+ {providerId === "iflow" && (
793
+ <Button
794
+ size="sm"
795
+ icon="cookie"
796
+ variant="secondary"
797
+ onClick={() => setShowIFlowCookieModal(true)}
798
+ title="Add connection using browser cookie"
799
+ >
800
+ Cookie
801
+ </Button>
802
+ )}
803
+ <Button
804
+ size="sm"
805
+ icon="add"
806
+ onClick={() => isOAuth ? setShowOAuthModal(true) : setShowAddApiKeyModal(true)}
807
+ >
808
+ Add
809
+ </Button>
810
+ </div>
811
+ )}
812
+ </>
813
+ )}
814
+ </Card>
815
+
816
+ {/* Models */}
817
+ <Card>
818
+ <div className="flex items-center justify-between mb-4">
819
+ <h2 className="text-lg font-semibold">
820
+ {providerInfo.passthroughModels ? "Model Aliases" : "Available Models"}
821
+ </h2>
822
+ </div>
823
+ {!!modelsTestError && (
824
+ <p className="text-xs text-red-500 mb-3 break-words">{modelsTestError}</p>
825
+ )}
826
+ {renderModelsSection()}
827
+ </Card>
828
+
829
+ {bulkActionModal}
830
+
831
+ {/* Modals */}
832
+ {providerId === "kiro" ? (
833
+ <KiroOAuthWrapper
834
+ isOpen={showOAuthModal}
835
+ providerInfo={providerInfo}
836
+ onSuccess={handleOAuthSuccess}
837
+ onClose={() => setShowOAuthModal(false)}
838
+ />
839
+ ) : providerId === "cursor" ? (
840
+ <CursorAuthModal
841
+ isOpen={showOAuthModal}
842
+ onSuccess={handleOAuthSuccess}
843
+ onClose={() => setShowOAuthModal(false)}
844
+ />
845
+ ) : (
846
+ <OAuthModal
847
+ isOpen={showOAuthModal}
848
+ provider={providerId}
849
+ providerInfo={providerInfo}
850
+ onSuccess={handleOAuthSuccess}
851
+ onClose={() => setShowOAuthModal(false)}
852
+ />
853
+ )}
854
+ {providerId === "iflow" && (
855
+ <IFlowCookieModal
856
+ isOpen={showIFlowCookieModal}
857
+ onSuccess={handleIFlowCookieSuccess}
858
+ onClose={() => setShowIFlowCookieModal(false)}
859
+ />
860
+ )}
861
+ <AddApiKeyModal
862
+ isOpen={showAddApiKeyModal}
863
+ provider={providerId}
864
+ providerName={providerInfo.name}
865
+ isCompatible={isCompatible}
866
+ isAnthropic={isAnthropicCompatible}
867
+ proxyPools={proxyPools}
868
+ onSave={handleSaveApiKey}
869
+ onClose={() => setShowAddApiKeyModal(false)}
870
+ />
871
+ <EditConnectionModal
872
+ isOpen={showEditModal}
873
+ connection={selectedConnection}
874
+ proxyPools={proxyPools}
875
+ onSave={handleUpdateConnection}
876
+ onClose={() => setShowEditModal(false)}
877
+ />
878
+ {isCompatible && (
879
+ <EditCompatibleNodeModal
880
+ isOpen={showEditNodeModal}
881
+ node={providerNode}
882
+ onSave={handleUpdateNode}
883
+ onClose={() => setShowEditNodeModal(false)}
884
+ isAnthropic={isAnthropicCompatible}
885
+ />
886
+ )}
887
+ {!isCompatible && !providerInfo?.passthroughModels && (
888
+ <AddCustomModelModal
889
+ isOpen={showAddCustomModel}
890
+ providerAlias={providerStorageAlias}
891
+ providerDisplayAlias={providerDisplayAlias}
892
+ onSave={async (modelId) => {
893
+ await handleSetAlias(modelId, modelId, providerStorageAlias);
894
+ setShowAddCustomModel(false);
895
+ }}
896
+ onClose={() => setShowAddCustomModel(false)}
897
+ />
898
+ )}
899
+ </div>
900
+ );
901
+ }
902
+
903
+ function ModelRow({ model, fullModel, alias, copied, onCopy, testStatus, isCustom, onDeleteAlias, onTest, isTesting }) {
904
+ const borderColor = testStatus === "ok"
905
+ ? "border-green-500/40"
906
+ : testStatus === "error"
907
+ ? "border-red-500/40"
908
+ : "border-border";
909
+
910
+ const iconColor = testStatus === "ok"
911
+ ? "#22c55e"
912
+ : testStatus === "error"
913
+ ? "#ef4444"
914
+ : undefined;
915
+
916
+ return (
917
+ <div className={`group px-3 py-2 rounded-lg border ${borderColor} hover:bg-sidebar/50`}>
918
+ <div className="flex items-center gap-2">
919
+ <span
920
+ className="material-symbols-outlined text-base"
921
+ style={iconColor ? { color: iconColor } : undefined}
922
+ >
923
+ {testStatus === "ok" ? "check_circle" : testStatus === "error" ? "cancel" : "smart_toy"}
924
+ </span>
925
+ <code className="text-xs text-text-muted font-mono bg-sidebar px-1.5 py-0.5 rounded">{fullModel}</code>
926
+ {onTest && (
927
+ <button
928
+ onClick={onTest}
929
+ disabled={isTesting}
930
+ className={`p-0.5 hover:bg-sidebar rounded text-text-muted hover:text-primary transition-opacity ${isTesting ? "opacity-100" : "opacity-0 group-hover:opacity-100"}`}
931
+ title="Test model"
932
+ >
933
+ <span className="material-symbols-outlined text-sm" style={isTesting ? { animation: "spin 1s linear infinite" } : undefined}>
934
+ {isTesting ? "progress_activity" : "science"}
935
+ </span>
936
+ </button>
937
+ )}
938
+ <button
939
+ onClick={() => onCopy(fullModel, `model-${model.id}`)}
940
+ className="p-0.5 hover:bg-sidebar rounded text-text-muted hover:text-primary"
941
+ title="Copy model"
942
+ >
943
+ <span className="material-symbols-outlined text-sm">
944
+ {copied === `model-${model.id}` ? "check" : "content_copy"}
945
+ </span>
946
+ </button>
947
+ {isCustom && (
948
+ <button
949
+ onClick={onDeleteAlias}
950
+ className="p-0.5 hover:bg-red-500/10 rounded text-text-muted hover:text-red-500 opacity-0 group-hover:opacity-100 transition-opacity ml-auto"
951
+ title="Remove custom model"
952
+ >
953
+ <span className="material-symbols-outlined text-sm">close</span>
954
+ </button>
955
+ )}
956
+ </div>
957
+ </div>
958
+ );
959
+ }
960
+
961
+ ModelRow.propTypes = {
962
+ model: PropTypes.shape({
963
+ id: PropTypes.string.isRequired,
964
+ }).isRequired,
965
+ fullModel: PropTypes.string.isRequired,
966
+ alias: PropTypes.string,
967
+ copied: PropTypes.string,
968
+ onCopy: PropTypes.func.isRequired,
969
+ testStatus: PropTypes.oneOf(["ok", "error"]),
970
+ isCustom: PropTypes.bool,
971
+ onDeleteAlias: PropTypes.func,
972
+ onTest: PropTypes.func,
973
+ isTesting: PropTypes.bool,
974
+ };
975
+
976
+ function PassthroughModelsSection({ providerAlias, modelAliases, copied, onCopy, onSetAlias, onDeleteAlias }) {
977
+ const [newModel, setNewModel] = useState("");
978
+ const [adding, setAdding] = useState(false);
979
+
980
+ // Filter aliases for this provider - models are persisted via alias
981
+ const providerAliases = Object.entries(modelAliases).filter(
982
+ ([, model]) => model.startsWith(`${providerAlias}/`)
983
+ );
984
+
985
+ const allModels = providerAliases.map(([alias, fullModel]) => ({
986
+ modelId: fullModel.replace(`${providerAlias}/`, ""),
987
+ fullModel,
988
+ alias,
989
+ }));
990
+
991
+ // Generate default alias from modelId (last part after /)
992
+ const generateDefaultAlias = (modelId) => {
993
+ const parts = modelId.split("/");
994
+ return parts[parts.length - 1];
995
+ };
996
+
997
+ const handleAdd = async () => {
998
+ if (!newModel.trim() || adding) return;
999
+ const modelId = newModel.trim();
1000
+ const defaultAlias = generateDefaultAlias(modelId);
1001
+
1002
+ // Check if alias already exists
1003
+ if (modelAliases[defaultAlias]) {
1004
+ alert(`Alias "${defaultAlias}" already exists. Please use a different model or edit existing alias.`);
1005
+ return;
1006
+ }
1007
+
1008
+ setAdding(true);
1009
+ try {
1010
+ await onSetAlias(modelId, defaultAlias);
1011
+ setNewModel("");
1012
+ } catch (error) {
1013
+ console.log("Error adding model:", error);
1014
+ } finally {
1015
+ setAdding(false);
1016
+ }
1017
+ };
1018
+
1019
+ return (
1020
+ <div className="flex flex-col gap-4">
1021
+ <p className="text-sm text-text-muted">
1022
+ OpenRouter supports any model. Add models and create aliases for quick access.
1023
+ </p>
1024
+
1025
+ {/* Add new model */}
1026
+ <div className="flex items-end gap-2">
1027
+ <div className="flex-1">
1028
+ <label htmlFor="new-model-input" className="text-xs text-text-muted mb-1 block">Model ID (from OpenRouter)</label>
1029
+ <input
1030
+ id="new-model-input"
1031
+ type="text"
1032
+ value={newModel}
1033
+ onChange={(e) => setNewModel(e.target.value)}
1034
+ onKeyDown={(e) => e.key === "Enter" && handleAdd()}
1035
+ placeholder="anthropic/claude-3-opus"
1036
+ className="w-full px-3 py-2 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary"
1037
+ />
1038
+ </div>
1039
+ <Button size="sm" icon="add" onClick={handleAdd} disabled={!newModel.trim() || adding}>
1040
+ {adding ? "Adding..." : "Add"}
1041
+ </Button>
1042
+ </div>
1043
+
1044
+ {/* Models list */}
1045
+ {allModels.length > 0 && (
1046
+ <div className="flex flex-col gap-3">
1047
+ {allModels.map(({ modelId, fullModel, alias }) => (
1048
+ <PassthroughModelRow
1049
+ key={fullModel}
1050
+ modelId={modelId}
1051
+ fullModel={fullModel}
1052
+ copied={copied}
1053
+ onCopy={onCopy}
1054
+ onDeleteAlias={() => onDeleteAlias(alias)}
1055
+ />
1056
+ ))}
1057
+ </div>
1058
+ )}
1059
+ </div>
1060
+ );
1061
+ }
1062
+
1063
+ PassthroughModelsSection.propTypes = {
1064
+ providerAlias: PropTypes.string.isRequired,
1065
+ modelAliases: PropTypes.object.isRequired,
1066
+ copied: PropTypes.string,
1067
+ onCopy: PropTypes.func.isRequired,
1068
+ onSetAlias: PropTypes.func.isRequired,
1069
+ onDeleteAlias: PropTypes.func.isRequired,
1070
+ };
1071
+
1072
+ function PassthroughModelRow({ modelId, fullModel, copied, onCopy, onDeleteAlias, onTest, testStatus, isTesting }) {
1073
+ const borderColor = testStatus === "ok"
1074
+ ? "border-green-500/40"
1075
+ : testStatus === "error"
1076
+ ? "border-red-500/40"
1077
+ : "border-border";
1078
+
1079
+ const iconColor = testStatus === "ok"
1080
+ ? "#22c55e"
1081
+ : testStatus === "error"
1082
+ ? "#ef4444"
1083
+ : undefined;
1084
+
1085
+ return (
1086
+ <div className={`flex items-center gap-3 p-3 rounded-lg border ${borderColor} hover:bg-sidebar/50`}>
1087
+ <span
1088
+ className="material-symbols-outlined text-base text-text-muted"
1089
+ style={iconColor ? { color: iconColor } : undefined}
1090
+ >
1091
+ {testStatus === "ok" ? "check_circle" : testStatus === "error" ? "cancel" : "smart_toy"}
1092
+ </span>
1093
+
1094
+ <div className="flex-1 min-w-0">
1095
+ <p className="text-sm font-medium truncate">{modelId}</p>
1096
+
1097
+ <div className="flex items-center gap-1 mt-1">
1098
+ <code className="text-xs text-text-muted font-mono bg-sidebar px-1.5 py-0.5 rounded">{fullModel}</code>
1099
+ <button
1100
+ onClick={() => onCopy(fullModel, `model-${modelId}`)}
1101
+ className="p-0.5 hover:bg-sidebar rounded text-text-muted hover:text-primary"
1102
+ title="Copy model"
1103
+ >
1104
+ <span className="material-symbols-outlined text-sm">
1105
+ {copied === `model-${modelId}` ? "check" : "content_copy"}
1106
+ </span>
1107
+ </button>
1108
+ {onTest && (
1109
+ <button
1110
+ onClick={onTest}
1111
+ disabled={isTesting}
1112
+ className="p-0.5 hover:bg-sidebar rounded text-text-muted hover:text-primary transition-colors"
1113
+ title="Test model"
1114
+ >
1115
+ <span className="material-symbols-outlined text-sm" style={isTesting ? { animation: "spin 1s linear infinite" } : undefined}>
1116
+ {isTesting ? "progress_activity" : "science"}
1117
+ </span>
1118
+ </button>
1119
+ )}
1120
+ </div>
1121
+ </div>
1122
+
1123
+ {/* Delete button */}
1124
+ <button
1125
+ onClick={onDeleteAlias}
1126
+ className="p-1 hover:bg-red-50 rounded text-red-500"
1127
+ title="Remove model"
1128
+ >
1129
+ <span className="material-symbols-outlined text-sm">delete</span>
1130
+ </button>
1131
+ </div>
1132
+ );
1133
+ }
1134
+
1135
+ PassthroughModelRow.propTypes = {
1136
+ modelId: PropTypes.string.isRequired,
1137
+ fullModel: PropTypes.string.isRequired,
1138
+ copied: PropTypes.string,
1139
+ onCopy: PropTypes.func.isRequired,
1140
+ onDeleteAlias: PropTypes.func.isRequired,
1141
+ onTest: PropTypes.func,
1142
+ testStatus: PropTypes.oneOf(["ok", "error"]),
1143
+ isTesting: PropTypes.bool,
1144
+ };
1145
+
1146
+ function CompatibleModelsSection({ providerStorageAlias, providerDisplayAlias, modelAliases, copied, onCopy, onSetAlias, onDeleteAlias, connections, isAnthropic }) {
1147
+ const [newModel, setNewModel] = useState("");
1148
+ const [adding, setAdding] = useState(false);
1149
+ const [importing, setImporting] = useState(false);
1150
+ const [testingModelId, setTestingModelId] = useState(null);
1151
+ const [modelTestResults, setModelTestResults] = useState({});
1152
+
1153
+ const handleTestModel = async (modelId) => {
1154
+ if (testingModelId) return;
1155
+ setTestingModelId(modelId);
1156
+ try {
1157
+ const res = await fetch("/api/models/test", {
1158
+ method: "POST",
1159
+ headers: { "Content-Type": "application/json" },
1160
+ body: JSON.stringify({ model: `${providerStorageAlias}/${modelId}` }),
1161
+ });
1162
+ const data = await res.json();
1163
+ setModelTestResults((prev) => ({ ...prev, [modelId]: data.ok ? "ok" : "error" }));
1164
+ } catch {
1165
+ setModelTestResults((prev) => ({ ...prev, [modelId]: "error" }));
1166
+ } finally {
1167
+ setTestingModelId(null);
1168
+ }
1169
+ };
1170
+
1171
+ const providerAliases = Object.entries(modelAliases).filter(
1172
+ ([, model]) => model.startsWith(`${providerStorageAlias}/`)
1173
+ );
1174
+
1175
+ const allModels = providerAliases.map(([alias, fullModel]) => ({
1176
+ modelId: fullModel.replace(`${providerStorageAlias}/`, ""),
1177
+ fullModel,
1178
+ alias,
1179
+ }));
1180
+
1181
+ const generateDefaultAlias = (modelId) => {
1182
+ const parts = modelId.split("/");
1183
+ return parts[parts.length - 1];
1184
+ };
1185
+
1186
+ const resolveAlias = (modelId) => {
1187
+ const baseAlias = generateDefaultAlias(modelId);
1188
+ if (!modelAliases[baseAlias]) return baseAlias;
1189
+ const prefixedAlias = `${providerDisplayAlias}-${baseAlias}`;
1190
+ if (!modelAliases[prefixedAlias]) return prefixedAlias;
1191
+ return null;
1192
+ };
1193
+
1194
+ const handleAdd = async () => {
1195
+ if (!newModel.trim() || adding) return;
1196
+ const modelId = newModel.trim();
1197
+ const resolvedAlias = resolveAlias(modelId);
1198
+ if (!resolvedAlias) {
1199
+ alert("All suggested aliases already exist. Please choose a different model or remove conflicting aliases.");
1200
+ return;
1201
+ }
1202
+
1203
+ setAdding(true);
1204
+ try {
1205
+ await onSetAlias(modelId, resolvedAlias, providerStorageAlias);
1206
+ setNewModel("");
1207
+ } catch (error) {
1208
+ console.log("Error adding model:", error);
1209
+ } finally {
1210
+ setAdding(false);
1211
+ }
1212
+ };
1213
+
1214
+ const handleImport = async () => {
1215
+ if (importing) return;
1216
+ const activeConnection = connections.find((conn) => conn.isActive !== false);
1217
+ if (!activeConnection) return;
1218
+
1219
+ setImporting(true);
1220
+ try {
1221
+ const res = await fetch(`/api/providers/${activeConnection.id}/models`);
1222
+ const data = await res.json();
1223
+ if (!res.ok) {
1224
+ alert(data.error || "Failed to import models");
1225
+ return;
1226
+ }
1227
+ const models = data.models || [];
1228
+ if (models.length === 0) {
1229
+ alert("No models returned from /models.");
1230
+ return;
1231
+ }
1232
+ let importedCount = 0;
1233
+ for (const model of models) {
1234
+ const modelId = model.id || model.name || model.model;
1235
+ if (!modelId) continue;
1236
+ const resolvedAlias = resolveAlias(modelId);
1237
+ if (!resolvedAlias) continue;
1238
+ await onSetAlias(modelId, resolvedAlias, providerStorageAlias);
1239
+ importedCount += 1;
1240
+ }
1241
+ if (importedCount === 0) {
1242
+ alert("No new models were added.");
1243
+ }
1244
+ } catch (error) {
1245
+ console.log("Error importing models:", error);
1246
+ } finally {
1247
+ setImporting(false);
1248
+ }
1249
+ };
1250
+
1251
+ const canImport = connections.some((conn) => conn.isActive !== false);
1252
+
1253
+ return (
1254
+ <div className="flex flex-col gap-4">
1255
+ <p className="text-sm text-text-muted">
1256
+ Add {isAnthropic ? "Anthropic" : "OpenAI"}-compatible models manually or import them from the /models endpoint.
1257
+ </p>
1258
+
1259
+ <div className="flex items-end gap-2 flex-wrap">
1260
+ <div className="flex-1 min-w-[240px]">
1261
+ <label htmlFor="new-compatible-model-input" className="text-xs text-text-muted mb-1 block">Model ID</label>
1262
+ <input
1263
+ id="new-compatible-model-input"
1264
+ type="text"
1265
+ value={newModel}
1266
+ onChange={(e) => setNewModel(e.target.value)}
1267
+ onKeyDown={(e) => e.key === "Enter" && handleAdd()}
1268
+ placeholder={isAnthropic ? "claude-3-opus-20240229" : "gpt-4o"}
1269
+ className="w-full px-3 py-2 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary"
1270
+ />
1271
+ </div>
1272
+ <Button size="sm" icon="add" onClick={handleAdd} disabled={!newModel.trim() || adding}>
1273
+ {adding ? "Adding..." : "Add"}
1274
+ </Button>
1275
+ <Button size="sm" variant="secondary" icon="download" onClick={handleImport} disabled={!canImport || importing}>
1276
+ {importing ? "Importing..." : "Import from /models"}
1277
+ </Button>
1278
+ </div>
1279
+
1280
+ {!canImport && (
1281
+ <p className="text-xs text-text-muted">
1282
+ Add a connection to enable importing models.
1283
+ </p>
1284
+ )}
1285
+
1286
+ {allModels.length > 0 && (
1287
+ <div className="flex flex-col gap-3">
1288
+ {allModels.map(({ modelId, fullModel, alias }) => (
1289
+ <PassthroughModelRow
1290
+ key={fullModel}
1291
+ modelId={modelId}
1292
+ fullModel={`${providerDisplayAlias}/${modelId}`}
1293
+ copied={copied}
1294
+ onCopy={onCopy}
1295
+ onDeleteAlias={() => onDeleteAlias(alias)}
1296
+ onTest={connections.length > 0 ? () => handleTestModel(modelId) : undefined}
1297
+ testStatus={modelTestResults[modelId]}
1298
+ isTesting={testingModelId === modelId}
1299
+ />
1300
+ ))}
1301
+ </div>
1302
+ )}
1303
+ </div>
1304
+ );
1305
+ }
1306
+
1307
+ CompatibleModelsSection.propTypes = {
1308
+ providerStorageAlias: PropTypes.string.isRequired,
1309
+ providerDisplayAlias: PropTypes.string.isRequired,
1310
+ modelAliases: PropTypes.object.isRequired,
1311
+ copied: PropTypes.string,
1312
+ onCopy: PropTypes.func.isRequired,
1313
+ onSetAlias: PropTypes.func.isRequired,
1314
+ onDeleteAlias: PropTypes.func.isRequired,
1315
+ connections: PropTypes.arrayOf(PropTypes.shape({
1316
+ id: PropTypes.string,
1317
+ isActive: PropTypes.bool,
1318
+ })).isRequired,
1319
+ isAnthropic: PropTypes.bool,
1320
+ };
1321
+
1322
+ function CooldownTimer({ until }) {
1323
+ const [remaining, setRemaining] = useState("");
1324
+
1325
+ useEffect(() => {
1326
+ const updateRemaining = () => {
1327
+ const diff = new Date(until).getTime() - Date.now();
1328
+ if (diff <= 0) {
1329
+ setRemaining("");
1330
+ return;
1331
+ }
1332
+ const secs = Math.floor(diff / 1000);
1333
+ if (secs < 60) {
1334
+ setRemaining(`${secs}s`);
1335
+ } else if (secs < 3600) {
1336
+ setRemaining(`${Math.floor(secs / 60)}m ${secs % 60}s`);
1337
+ } else {
1338
+ const hrs = Math.floor(secs / 3600);
1339
+ const mins = Math.floor((secs % 3600) / 60);
1340
+ setRemaining(`${hrs}h ${mins}m`);
1341
+ }
1342
+ };
1343
+
1344
+ updateRemaining();
1345
+ const interval = setInterval(updateRemaining, 1000);
1346
+ return () => clearInterval(interval);
1347
+ }, [until]);
1348
+
1349
+ if (!remaining) return null;
1350
+
1351
+ return (
1352
+ <span className="text-xs text-orange-500 font-mono">
1353
+ ⏱ {remaining}
1354
+ </span>
1355
+ );
1356
+ }
1357
+
1358
+ CooldownTimer.propTypes = {
1359
+ until: PropTypes.string.isRequired,
1360
+ };
1361
+
1362
+ function ConnectionRow({ connection, proxyPools, isOAuth, isFirst, isLast, onMoveUp, onMoveDown, onToggleActive, onUpdateProxy, onEdit, onDelete }) {
1363
+ const [showProxyDropdown, setShowProxyDropdown] = useState(false);
1364
+ const [updatingProxy, setUpdatingProxy] = useState(false);
1365
+ const proxyDropdownRef = useRef(null);
1366
+
1367
+ const proxyPoolMap = new Map((proxyPools || []).map((pool) => [pool.id, pool]));
1368
+ const boundProxyPoolId = connection.providerSpecificData?.proxyPoolId || null;
1369
+ const boundProxyPool = boundProxyPoolId ? proxyPoolMap.get(boundProxyPoolId) : null;
1370
+ const hasLegacyProxy = connection.providerSpecificData?.connectionProxyEnabled === true && !!connection.providerSpecificData?.connectionProxyUrl;
1371
+ const hasAnyProxy = !!boundProxyPoolId || hasLegacyProxy;
1372
+ const proxyDisplayText = boundProxyPool
1373
+ ? `Pool: ${boundProxyPool.name}`
1374
+ : boundProxyPoolId
1375
+ ? `Pool: ${boundProxyPoolId} (inactive/missing)`
1376
+ : hasLegacyProxy
1377
+ ? `Legacy: ${connection.providerSpecificData?.connectionProxyUrl}`
1378
+ : "";
1379
+
1380
+ let maskedProxyUrl = "";
1381
+ if (boundProxyPool?.proxyUrl || connection.providerSpecificData?.connectionProxyUrl) {
1382
+ const rawProxyUrl = boundProxyPool?.proxyUrl || connection.providerSpecificData?.connectionProxyUrl;
1383
+ try {
1384
+ const parsed = new URL(rawProxyUrl);
1385
+ maskedProxyUrl = `${parsed.protocol}//${parsed.hostname}${parsed.port ? `:${parsed.port}` : ""}`;
1386
+ } catch {
1387
+ maskedProxyUrl = rawProxyUrl;
1388
+ }
1389
+ }
1390
+
1391
+ const noProxyText = boundProxyPool?.noProxy || connection.providerSpecificData?.connectionNoProxy || "";
1392
+
1393
+ let proxyBadgeVariant = "default";
1394
+ if (boundProxyPool?.isActive === true) {
1395
+ proxyBadgeVariant = "success";
1396
+ } else if (boundProxyPoolId || hasLegacyProxy) {
1397
+ proxyBadgeVariant = "error";
1398
+ }
1399
+
1400
+ // Close dropdown when clicking outside
1401
+ useEffect(() => {
1402
+ if (!showProxyDropdown) return;
1403
+ const handler = (e) => {
1404
+ if (proxyDropdownRef.current && !proxyDropdownRef.current.contains(e.target)) {
1405
+ setShowProxyDropdown(false);
1406
+ }
1407
+ };
1408
+ document.addEventListener("mousedown", handler);
1409
+ return () => document.removeEventListener("mousedown", handler);
1410
+ }, [showProxyDropdown]);
1411
+
1412
+ const handleSelectProxy = async (poolId) => {
1413
+ setUpdatingProxy(true);
1414
+ try {
1415
+ await onUpdateProxy(poolId === "__none__" ? null : poolId);
1416
+ } finally {
1417
+ setUpdatingProxy(false);
1418
+ setShowProxyDropdown(false);
1419
+ }
1420
+ };
1421
+
1422
+ const displayName = isOAuth
1423
+ ? connection.name || connection.email || connection.displayName || "OAuth Account"
1424
+ : connection.name;
1425
+
1426
+ // Use useState + useEffect for impure Date.now() to avoid calling during render
1427
+ const [isCooldown, setIsCooldown] = useState(false);
1428
+
1429
+ // Get earliest model lock timestamp (useEffect handles the Date.now() comparison)
1430
+ const modelLockUntil = Object.entries(connection)
1431
+ .filter(([k]) => k.startsWith("modelLock_"))
1432
+ .map(([, v]) => v)
1433
+ .filter(v => !!v)
1434
+ .sort()[0] || null;
1435
+
1436
+ useEffect(() => {
1437
+ const checkCooldown = () => {
1438
+ const until = Object.entries(connection)
1439
+ .filter(([k]) => k.startsWith("modelLock_"))
1440
+ .map(([, v]) => v)
1441
+ .filter(v => v && new Date(v).getTime() > Date.now())
1442
+ .sort()[0] || null;
1443
+ setIsCooldown(!!until);
1444
+ };
1445
+
1446
+ checkCooldown();
1447
+ const interval = modelLockUntil ? setInterval(checkCooldown, 1000) : null;
1448
+ return () => {
1449
+ if (interval) clearInterval(interval);
1450
+ };
1451
+ }, [modelLockUntil]);
1452
+
1453
+ // Determine effective status (override unavailable if cooldown expired)
1454
+ const effectiveStatus = (connection.testStatus === "unavailable" && !isCooldown)
1455
+ ? "active" // Cooldown expired → treat as active
1456
+ : connection.testStatus;
1457
+
1458
+ const getStatusVariant = () => {
1459
+ if (connection.isActive === false) return "default";
1460
+ if (effectiveStatus === "active" || effectiveStatus === "success") return "success";
1461
+ if (effectiveStatus === "error" || effectiveStatus === "expired" || effectiveStatus === "unavailable") return "error";
1462
+ return "default";
1463
+ };
1464
+
1465
+ return (
1466
+ <div className={`group flex items-center justify-between p-3 rounded-lg hover:bg-black/[0.02] dark:hover:bg-white/[0.02] transition-colors ${connection.isActive === false ? "opacity-60" : ""}`}>
1467
+ <div className="flex items-center gap-3 flex-1 min-w-0">
1468
+ {/* Priority arrows */}
1469
+ <div className="flex flex-col">
1470
+ <button
1471
+ onClick={onMoveUp}
1472
+ disabled={isFirst}
1473
+ className={`p-0.5 rounded ${isFirst ? "text-text-muted/30 cursor-not-allowed" : "hover:bg-sidebar text-text-muted hover:text-primary"}`}
1474
+ >
1475
+ <span className="material-symbols-outlined text-sm">keyboard_arrow_up</span>
1476
+ </button>
1477
+ <button
1478
+ onClick={onMoveDown}
1479
+ disabled={isLast}
1480
+ className={`p-0.5 rounded ${isLast ? "text-text-muted/30 cursor-not-allowed" : "hover:bg-sidebar text-text-muted hover:text-primary"}`}
1481
+ >
1482
+ <span className="material-symbols-outlined text-sm">keyboard_arrow_down</span>
1483
+ </button>
1484
+ </div>
1485
+ <span className="material-symbols-outlined text-base text-text-muted">
1486
+ {isOAuth ? "lock" : "key"}
1487
+ </span>
1488
+ <div className="flex-1 min-w-0">
1489
+ <p className="text-sm font-medium truncate">{displayName}</p>
1490
+ <div className="flex items-center gap-2 mt-1">
1491
+ <Badge variant={getStatusVariant()} size="sm" dot>
1492
+ {connection.isActive === false ? "disabled" : (effectiveStatus || "Unknown")}
1493
+ </Badge>
1494
+ {hasAnyProxy && (
1495
+ <Badge variant={proxyBadgeVariant} size="sm">
1496
+ Proxy
1497
+ </Badge>
1498
+ )}
1499
+ {isCooldown && connection.isActive !== false && <CooldownTimer until={modelLockUntil} />}
1500
+ {connection.lastError && connection.isActive !== false && (
1501
+ <span className="text-xs text-red-500 truncate max-w-[300px]" title={connection.lastError}>
1502
+ {connection.lastError}
1503
+ </span>
1504
+ )}
1505
+ <span className="text-xs text-text-muted">#{connection.priority}</span>
1506
+ {connection.globalPriority && (
1507
+ <span className="text-xs text-text-muted">Auto: {connection.globalPriority}</span>
1508
+ )}
1509
+ </div>
1510
+ {hasAnyProxy && (
1511
+ <div className="mt-1 flex items-center gap-2 flex-wrap">
1512
+ <span className="text-[11px] text-text-muted truncate max-w-[420px]" title={proxyDisplayText}>
1513
+ {proxyDisplayText}
1514
+ </span>
1515
+ {maskedProxyUrl && (
1516
+ <code className="text-[10px] font-mono bg-black/5 dark:bg-white/5 px-1 py-0.5 rounded text-text-muted">
1517
+ {maskedProxyUrl}
1518
+ </code>
1519
+ )}
1520
+ {noProxyText && (
1521
+ <span className="text-[11px] text-text-muted truncate max-w-[320px]" title={noProxyText}>
1522
+ no_proxy: {noProxyText}
1523
+ </span>
1524
+ )}
1525
+ </div>
1526
+ )}
1527
+ </div>
1528
+ </div>
1529
+ <div className="flex items-center gap-2">
1530
+ <div className="flex gap-1 opacity-0 group-hover:opacity-100 transition-opacity">
1531
+ {/* Proxy button with inline dropdown */}
1532
+ {(proxyPools || []).length > 0 && (
1533
+ <div className="relative" ref={proxyDropdownRef}>
1534
+ <button
1535
+ onClick={() => setShowProxyDropdown((v) => !v)}
1536
+ className={`flex flex-col items-center px-2 py-1 rounded hover:bg-black/5 dark:hover:bg-white/5 transition-colors ${hasAnyProxy ? "text-primary" : "text-text-muted hover:text-primary"}`}
1537
+ disabled={updatingProxy}
1538
+ >
1539
+ <span className="material-symbols-outlined text-[18px]">
1540
+ {updatingProxy ? "progress_activity" : "lan"}
1541
+ </span>
1542
+ <span className="text-[10px] leading-tight">Proxy</span>
1543
+ </button>
1544
+ {showProxyDropdown && (
1545
+ <div className="absolute right-0 top-full mt-1 z-50 bg-bg border border-border rounded-lg shadow-lg py-1 min-w-[160px]">
1546
+ <button
1547
+ onClick={() => handleSelectProxy("__none__")}
1548
+ className={`w-full text-left px-3 py-1.5 text-sm hover:bg-black/5 dark:hover:bg-white/5 ${!boundProxyPoolId ? "text-primary font-medium" : "text-text-main"}`}
1549
+ >
1550
+ None
1551
+ </button>
1552
+ {(proxyPools || []).map((pool) => (
1553
+ <button
1554
+ key={pool.id}
1555
+ onClick={() => handleSelectProxy(pool.id)}
1556
+ className={`w-full text-left px-3 py-1.5 text-sm hover:bg-black/5 dark:hover:bg-white/5 ${boundProxyPoolId === pool.id ? "text-primary font-medium" : "text-text-main"}`}
1557
+ >
1558
+ {pool.name}
1559
+ </button>
1560
+ ))}
1561
+ </div>
1562
+ )}
1563
+ </div>
1564
+ )}
1565
+ <button onClick={onEdit} className="flex flex-col items-center px-2 py-1 rounded hover:bg-black/5 dark:hover:bg-white/5 text-text-muted hover:text-primary">
1566
+ <span className="material-symbols-outlined text-[18px]">edit</span>
1567
+ <span className="text-[10px] leading-tight">Edit</span>
1568
+ </button>
1569
+ <button onClick={onDelete} className="flex flex-col items-center px-2 py-1 rounded hover:bg-red-500/10 text-red-500">
1570
+ <span className="material-symbols-outlined text-[18px]">delete</span>
1571
+ <span className="text-[10px] leading-tight">Delete</span>
1572
+ </button>
1573
+ </div>
1574
+ <Toggle
1575
+ size="sm"
1576
+ checked={connection.isActive ?? true}
1577
+ onChange={onToggleActive}
1578
+ title={(connection.isActive ?? true) ? "Disable connection" : "Enable connection"}
1579
+ />
1580
+ </div>
1581
+ </div>
1582
+ );
1583
+ }
1584
+
1585
+ ConnectionRow.propTypes = {
1586
+ connection: PropTypes.shape({
1587
+ id: PropTypes.string,
1588
+ name: PropTypes.string,
1589
+ email: PropTypes.string,
1590
+ displayName: PropTypes.string,
1591
+ modelLockUntil: PropTypes.string,
1592
+ testStatus: PropTypes.string,
1593
+ isActive: PropTypes.bool,
1594
+ lastError: PropTypes.string,
1595
+ priority: PropTypes.number,
1596
+ globalPriority: PropTypes.number,
1597
+ }).isRequired,
1598
+ proxyPools: PropTypes.arrayOf(PropTypes.shape({
1599
+ id: PropTypes.string,
1600
+ name: PropTypes.string,
1601
+ proxyUrl: PropTypes.string,
1602
+ noProxy: PropTypes.string,
1603
+ isActive: PropTypes.bool,
1604
+ })),
1605
+ isOAuth: PropTypes.bool.isRequired,
1606
+ isFirst: PropTypes.bool.isRequired,
1607
+ isLast: PropTypes.bool.isRequired,
1608
+ onMoveUp: PropTypes.func.isRequired,
1609
+ onMoveDown: PropTypes.func.isRequired,
1610
+ onToggleActive: PropTypes.func.isRequired,
1611
+ onUpdateProxy: PropTypes.func,
1612
+ onEdit: PropTypes.func.isRequired,
1613
+ onDelete: PropTypes.func.isRequired,
1614
+ };
1615
+
1616
+ function AddApiKeyModal({ isOpen, provider, providerName, isCompatible, isAnthropic, proxyPools, onSave, onClose }) {
1617
+ const NONE_PROXY_POOL_VALUE = "__none__";
1618
+
1619
+ const [formData, setFormData] = useState({
1620
+ name: "",
1621
+ apiKey: "",
1622
+ priority: 1,
1623
+ proxyPoolId: NONE_PROXY_POOL_VALUE,
1624
+ });
1625
+ const [validating, setValidating] = useState(false);
1626
+ const [validationResult, setValidationResult] = useState(null);
1627
+ const [saving, setSaving] = useState(false);
1628
+
1629
+ const handleValidate = async () => {
1630
+ setValidating(true);
1631
+ try {
1632
+ const res = await fetch("/api/providers/validate", {
1633
+ method: "POST",
1634
+ headers: { "Content-Type": "application/json" },
1635
+ body: JSON.stringify({ provider, apiKey: formData.apiKey }),
1636
+ });
1637
+ const data = await res.json();
1638
+ setValidationResult(data.valid ? "success" : "failed");
1639
+ } catch {
1640
+ setValidationResult("failed");
1641
+ } finally {
1642
+ setValidating(false);
1643
+ }
1644
+ };
1645
+
1646
+ const handleSubmit = async () => {
1647
+ if (!provider || !formData.apiKey) return;
1648
+
1649
+ setSaving(true);
1650
+ try {
1651
+ let isValid = false;
1652
+ try {
1653
+ setValidating(true);
1654
+ setValidationResult(null);
1655
+ const res = await fetch("/api/providers/validate", {
1656
+ method: "POST",
1657
+ headers: { "Content-Type": "application/json" },
1658
+ body: JSON.stringify({ provider, apiKey: formData.apiKey }),
1659
+ });
1660
+ const data = await res.json();
1661
+ isValid = !!data.valid;
1662
+ setValidationResult(isValid ? "success" : "failed");
1663
+ } catch {
1664
+ setValidationResult("failed");
1665
+ } finally {
1666
+ setValidating(false);
1667
+ }
1668
+
1669
+ await onSave({
1670
+ name: formData.name,
1671
+ apiKey: formData.apiKey,
1672
+ priority: formData.priority,
1673
+ proxyPoolId: formData.proxyPoolId === NONE_PROXY_POOL_VALUE ? null : formData.proxyPoolId,
1674
+ testStatus: isValid ? "active" : "unknown",
1675
+ providerSpecificData: undefined
1676
+ });
1677
+ } finally {
1678
+ setSaving(false);
1679
+ }
1680
+ };
1681
+
1682
+ if (!provider) return null;
1683
+
1684
+ return (
1685
+ <Modal isOpen={isOpen} title={`Add ${providerName || provider} API Key`} onClose={onClose}>
1686
+ <div className="flex flex-col gap-4">
1687
+ <Input
1688
+ label="Name"
1689
+ value={formData.name}
1690
+ onChange={(e) => setFormData({ ...formData, name: e.target.value })}
1691
+ placeholder="Production Key"
1692
+ />
1693
+ <div className="flex gap-2">
1694
+ <Input
1695
+ label="API Key"
1696
+ type="password"
1697
+ value={formData.apiKey}
1698
+ onChange={(e) => setFormData({ ...formData, apiKey: e.target.value })}
1699
+ className="flex-1"
1700
+ />
1701
+ <div className="pt-6">
1702
+ <Button onClick={handleValidate} disabled={!formData.apiKey || validating || saving} variant="secondary">
1703
+ {validating ? "Checking..." : "Check"}
1704
+ </Button>
1705
+ </div>
1706
+ </div>
1707
+ {validationResult && (
1708
+ <Badge variant={validationResult === "success" ? "success" : "error"}>
1709
+ {validationResult === "success" ? "Valid" : "Invalid"}
1710
+ </Badge>
1711
+ )}
1712
+ {isCompatible && (
1713
+ <p className="text-xs text-text-muted">
1714
+ {isAnthropic
1715
+ ? `Validation checks ${providerName || "Anthropic Compatible"} by verifying the API key.`
1716
+ : `Validation checks ${providerName || "OpenAI Compatible"} via /models on your base URL.`
1717
+ }
1718
+ </p>
1719
+ )}
1720
+ <Input
1721
+ label="Priority"
1722
+ type="number"
1723
+ value={formData.priority}
1724
+ onChange={(e) => setFormData({ ...formData, priority: Number.parseInt(e.target.value) || 1 })}
1725
+ />
1726
+
1727
+ <Select
1728
+ label="Proxy Pool"
1729
+ value={formData.proxyPoolId}
1730
+ onChange={(e) => setFormData({ ...formData, proxyPoolId: e.target.value })}
1731
+ options={[
1732
+ { value: NONE_PROXY_POOL_VALUE, label: "None" },
1733
+ ...(proxyPools || []).map((pool) => ({ value: pool.id, label: pool.name })),
1734
+ ]}
1735
+ placeholder="None"
1736
+ />
1737
+
1738
+ {(proxyPools || []).length === 0 && (
1739
+ <p className="text-xs text-text-muted">
1740
+ No active proxy pools available. Create one in Proxy Pools page first.
1741
+ </p>
1742
+ )}
1743
+
1744
+ <p className="text-xs text-text-muted">
1745
+ Legacy manual proxy fields are still accepted by API for backward compatibility.
1746
+ </p>
1747
+
1748
+ <div className="flex gap-2">
1749
+ <Button onClick={handleSubmit} fullWidth disabled={!formData.name || !formData.apiKey || saving}>
1750
+ {saving ? "Saving..." : "Save"}
1751
+ </Button>
1752
+ <Button onClick={onClose} variant="ghost" fullWidth>
1753
+ Cancel
1754
+ </Button>
1755
+ </div>
1756
+ </div>
1757
+ </Modal>
1758
+ );
1759
+ }
1760
+
1761
+ AddApiKeyModal.propTypes = {
1762
+ isOpen: PropTypes.bool.isRequired,
1763
+ provider: PropTypes.string,
1764
+ providerName: PropTypes.string,
1765
+ isCompatible: PropTypes.bool,
1766
+ isAnthropic: PropTypes.bool,
1767
+ proxyPools: PropTypes.arrayOf(PropTypes.shape({
1768
+ id: PropTypes.string,
1769
+ name: PropTypes.string,
1770
+ })),
1771
+ onSave: PropTypes.func.isRequired,
1772
+ onClose: PropTypes.func.isRequired,
1773
+ };
1774
+
1775
+ function EditConnectionModal({ isOpen, connection, proxyPools, onSave, onClose }) {
1776
+ const [formData, setFormData] = useState({
1777
+ name: "",
1778
+ priority: 1,
1779
+ apiKey: "",
1780
+ });
1781
+ const [testing, setTesting] = useState(false);
1782
+ const [testResult, setTestResult] = useState(null);
1783
+ const [validating, setValidating] = useState(false);
1784
+ const [validationResult, setValidationResult] = useState(null);
1785
+ const [saving, setSaving] = useState(false);
1786
+
1787
+ useEffect(() => {
1788
+ if (connection) {
1789
+ setFormData({
1790
+ name: connection.name || "",
1791
+ priority: connection.priority || 1,
1792
+ apiKey: "",
1793
+ });
1794
+ setTestResult(null);
1795
+ setValidationResult(null);
1796
+ }
1797
+ }, [connection]);
1798
+
1799
+ const handleTest = async () => {
1800
+ if (!connection?.provider) return;
1801
+ setTesting(true);
1802
+ setTestResult(null);
1803
+ try {
1804
+ const res = await fetch(`/api/providers/${connection.id}/test`, { method: "POST" });
1805
+ const data = await res.json();
1806
+ setTestResult(data.valid ? "success" : "failed");
1807
+ } catch {
1808
+ setTestResult("failed");
1809
+ } finally {
1810
+ setTesting(false);
1811
+ }
1812
+ };
1813
+
1814
+ const handleValidate = async () => {
1815
+ if (!connection?.provider || !formData.apiKey) return;
1816
+ setValidating(true);
1817
+ setValidationResult(null);
1818
+ try {
1819
+ const res = await fetch("/api/providers/validate", {
1820
+ method: "POST",
1821
+ headers: { "Content-Type": "application/json" },
1822
+ body: JSON.stringify({ provider: connection.provider, apiKey: formData.apiKey }),
1823
+ });
1824
+ const data = await res.json();
1825
+ setValidationResult(data.valid ? "success" : "failed");
1826
+ } catch {
1827
+ setValidationResult("failed");
1828
+ } finally {
1829
+ setValidating(false);
1830
+ }
1831
+ };
1832
+
1833
+ const handleSubmit = async () => {
1834
+ setSaving(true);
1835
+ try {
1836
+ const updates = {
1837
+ name: formData.name,
1838
+ priority: formData.priority,
1839
+ };
1840
+ if (!isOAuth && formData.apiKey) {
1841
+ updates.apiKey = formData.apiKey;
1842
+ let isValid = validationResult === "success";
1843
+ if (!isValid) {
1844
+ try {
1845
+ setValidating(true);
1846
+ setValidationResult(null);
1847
+ const res = await fetch("/api/providers/validate", {
1848
+ method: "POST",
1849
+ headers: { "Content-Type": "application/json" },
1850
+ body: JSON.stringify({ provider: connection.provider, apiKey: formData.apiKey }),
1851
+ });
1852
+ const data = await res.json();
1853
+ isValid = !!data.valid;
1854
+ setValidationResult(isValid ? "success" : "failed");
1855
+ } catch {
1856
+ setValidationResult("failed");
1857
+ } finally {
1858
+ setValidating(false);
1859
+ }
1860
+ }
1861
+ if (isValid) {
1862
+ updates.testStatus = "active";
1863
+ updates.lastError = null;
1864
+ updates.lastErrorAt = null;
1865
+ }
1866
+ }
1867
+ await onSave(updates);
1868
+ } finally {
1869
+ setSaving(false);
1870
+ }
1871
+ };
1872
+
1873
+ if (!connection) return null;
1874
+
1875
+ const isOAuth = connection.authType === "oauth";
1876
+ const isCompatible = isOpenAICompatibleProvider(connection.provider) || isAnthropicCompatibleProvider(connection.provider);
1877
+
1878
+ return (
1879
+ <Modal isOpen={isOpen} title="Edit Connection" onClose={onClose}>
1880
+ <div className="flex flex-col gap-4">
1881
+ <Input
1882
+ label="Name"
1883
+ value={formData.name}
1884
+ onChange={(e) => setFormData({ ...formData, name: e.target.value })}
1885
+ placeholder={isOAuth ? "Account name" : "Production Key"}
1886
+ />
1887
+ {isOAuth && connection.email && (
1888
+ <div className="bg-sidebar/50 p-3 rounded-lg">
1889
+ <p className="text-sm text-text-muted mb-1">Email</p>
1890
+ <p className="font-medium">{connection.email}</p>
1891
+ </div>
1892
+ )}
1893
+ <Input
1894
+ label="Priority"
1895
+ type="number"
1896
+ value={formData.priority}
1897
+ onChange={(e) => setFormData({ ...formData, priority: Number.parseInt(e.target.value) || 1 })}
1898
+ />
1899
+
1900
+ {!isOAuth && (
1901
+ <>
1902
+ <div className="flex gap-2">
1903
+ <Input
1904
+ label="API Key"
1905
+ type="password"
1906
+ value={formData.apiKey}
1907
+ onChange={(e) => setFormData({ ...formData, apiKey: e.target.value })}
1908
+ placeholder="Enter new API key"
1909
+ hint="Leave blank to keep the current API key."
1910
+ className="flex-1"
1911
+ />
1912
+ <div className="pt-6">
1913
+ <Button onClick={handleValidate} disabled={!formData.apiKey || validating || saving} variant="secondary">
1914
+ {validating ? "Checking..." : "Check"}
1915
+ </Button>
1916
+ </div>
1917
+ </div>
1918
+ {validationResult && (
1919
+ <Badge variant={validationResult === "success" ? "success" : "error"}>
1920
+ {validationResult === "success" ? "Valid" : "Invalid"}
1921
+ </Badge>
1922
+ )}
1923
+ </>
1924
+ )}
1925
+
1926
+ {/* Test Connection */}
1927
+ {!isCompatible && (
1928
+ <div className="flex items-center gap-3">
1929
+ <Button onClick={handleTest} variant="secondary" disabled={testing}>
1930
+ {testing ? "Testing..." : "Test Connection"}
1931
+ </Button>
1932
+ {testResult && (
1933
+ <Badge variant={testResult === "success" ? "success" : "error"}>
1934
+ {testResult === "success" ? "Valid" : "Failed"}
1935
+ </Badge>
1936
+ )}
1937
+ </div>
1938
+ )}
1939
+
1940
+ <div className="flex gap-2">
1941
+ <Button onClick={handleSubmit} fullWidth disabled={saving}>{saving ? "Saving..." : "Save"}</Button>
1942
+ <Button onClick={onClose} variant="ghost" fullWidth>Cancel</Button>
1943
+ </div>
1944
+ </div>
1945
+ </Modal>
1946
+ );
1947
+ }
1948
+
1949
+ EditConnectionModal.propTypes = {
1950
+ isOpen: PropTypes.bool.isRequired,
1951
+ connection: PropTypes.shape({
1952
+ id: PropTypes.string,
1953
+ name: PropTypes.string,
1954
+ email: PropTypes.string,
1955
+ priority: PropTypes.number,
1956
+ authType: PropTypes.string,
1957
+ provider: PropTypes.string,
1958
+ providerSpecificData: PropTypes.object,
1959
+ }),
1960
+ proxyPools: PropTypes.arrayOf(PropTypes.shape({
1961
+ id: PropTypes.string,
1962
+ name: PropTypes.string,
1963
+ })),
1964
+ onSave: PropTypes.func.isRequired,
1965
+ onClose: PropTypes.func.isRequired,
1966
+ };
1967
+
1968
+ function EditCompatibleNodeModal({ isOpen, node, onSave, onClose, isAnthropic }) {
1969
+ const [formData, setFormData] = useState({
1970
+ name: "",
1971
+ prefix: "",
1972
+ apiType: "chat",
1973
+ baseUrl: "https://api.openai.com/v1",
1974
+ });
1975
+ const [saving, setSaving] = useState(false);
1976
+ const [checkKey, setCheckKey] = useState("");
1977
+ const [checkModelId, setCheckModelId] = useState("");
1978
+ const [validating, setValidating] = useState(false);
1979
+ const [validationResult, setValidationResult] = useState(null);
1980
+
1981
+ useEffect(() => {
1982
+ if (node) {
1983
+ setFormData({
1984
+ name: node.name || "",
1985
+ prefix: node.prefix || "",
1986
+ apiType: node.apiType || "chat",
1987
+ baseUrl: node.baseUrl || (isAnthropic ? "https://api.anthropic.com/v1" : "https://api.openai.com/v1"),
1988
+ });
1989
+ }
1990
+ }, [node, isAnthropic]);
1991
+
1992
+ const apiTypeOptions = [
1993
+ { value: "chat", label: "Chat Completions" },
1994
+ { value: "responses", label: "Responses API" },
1995
+ ];
1996
+
1997
+ const handleSubmit = async () => {
1998
+ if (!formData.name.trim() || !formData.prefix.trim() || !formData.baseUrl.trim()) return;
1999
+ setSaving(true);
2000
+ try {
2001
+ const payload = {
2002
+ name: formData.name,
2003
+ prefix: formData.prefix,
2004
+ baseUrl: formData.baseUrl,
2005
+ };
2006
+ if (!isAnthropic) {
2007
+ payload.apiType = formData.apiType;
2008
+ }
2009
+ await onSave(payload);
2010
+ } finally {
2011
+ setSaving(false);
2012
+ }
2013
+ };
2014
+
2015
+ const handleValidate = async () => {
2016
+ setValidating(true);
2017
+ try {
2018
+ const res = await fetch("/api/provider-nodes/validate", {
2019
+ method: "POST",
2020
+ headers: { "Content-Type": "application/json" },
2021
+ body: JSON.stringify({
2022
+ baseUrl: formData.baseUrl,
2023
+ apiKey: checkKey,
2024
+ type: isAnthropic ? "anthropic-compatible" : "openai-compatible",
2025
+ modelId: checkModelId.trim() || undefined
2026
+ }),
2027
+ });
2028
+ const data = await res.json();
2029
+ setValidationResult(data.valid ? "success" : "failed");
2030
+ } catch {
2031
+ setValidationResult("failed");
2032
+ } finally {
2033
+ setValidating(false);
2034
+ }
2035
+ };
2036
+
2037
+ if (!node) return null;
2038
+
2039
+ return (
2040
+ <Modal isOpen={isOpen} title={`Edit ${isAnthropic ? "Anthropic" : "OpenAI"} Compatible`} onClose={onClose}>
2041
+ <div className="flex flex-col gap-4">
2042
+ <Input
2043
+ label="Name"
2044
+ value={formData.name}
2045
+ onChange={(e) => setFormData({ ...formData, name: e.target.value })}
2046
+ placeholder={`${isAnthropic ? "Anthropic" : "OpenAI"} Compatible (Prod)`}
2047
+ hint="Required. A friendly label for this node."
2048
+ />
2049
+ <Input
2050
+ label="Prefix"
2051
+ value={formData.prefix}
2052
+ onChange={(e) => setFormData({ ...formData, prefix: e.target.value })}
2053
+ placeholder={isAnthropic ? "ac-prod" : "oc-prod"}
2054
+ hint="Required. Used as the provider prefix for model IDs."
2055
+ />
2056
+ {!isAnthropic && (
2057
+ <Select
2058
+ label="API Type"
2059
+ options={apiTypeOptions}
2060
+ value={formData.apiType}
2061
+ onChange={(e) => setFormData({ ...formData, apiType: e.target.value })}
2062
+ />
2063
+ )}
2064
+ <Input
2065
+ label="Base URL"
2066
+ value={formData.baseUrl}
2067
+ onChange={(e) => setFormData({ ...formData, baseUrl: e.target.value })}
2068
+ placeholder={isAnthropic ? "https://api.anthropic.com/v1" : "https://api.openai.com/v1"}
2069
+ hint={`Use the base URL (ending in /v1) for your ${isAnthropic ? "Anthropic" : "OpenAI"}-compatible API.`}
2070
+ />
2071
+ <div className="flex gap-2">
2072
+ <Input
2073
+ label="API Key (for Check)"
2074
+ type="password"
2075
+ value={checkKey}
2076
+ onChange={(e) => setCheckKey(e.target.value)}
2077
+ className="flex-1"
2078
+ />
2079
+ <div className="pt-6">
2080
+ <Button onClick={handleValidate} disabled={!checkKey || validating || !formData.baseUrl.trim()} variant="secondary">
2081
+ {validating ? "Checking..." : "Check"}
2082
+ </Button>
2083
+ </div>
2084
+ </div>
2085
+ <Input
2086
+ label="Model ID (optional)"
2087
+ value={checkModelId}
2088
+ onChange={(e) => setCheckModelId(e.target.value)}
2089
+ placeholder="e.g. my-model-id"
2090
+ hint="If provider lacks /models endpoint, enter a model ID to validate via chat/completions instead."
2091
+ />
2092
+ {validationResult && (
2093
+ <Badge variant={validationResult === "success" ? "success" : "error"}>
2094
+ {validationResult === "success" ? "Valid" : "Invalid"}
2095
+ </Badge>
2096
+ )}
2097
+ <div className="flex gap-2">
2098
+ <Button onClick={handleSubmit} fullWidth disabled={!formData.name.trim() || !formData.prefix.trim() || !formData.baseUrl.trim() || saving}>
2099
+ {saving ? "Saving..." : "Save"}
2100
+ </Button>
2101
+ <Button onClick={onClose} variant="ghost" fullWidth>
2102
+ Cancel
2103
+ </Button>
2104
+ </div>
2105
+ </div>
2106
+ </Modal>
2107
+ );
2108
+ }
2109
+
2110
+ EditCompatibleNodeModal.propTypes = {
2111
+ isOpen: PropTypes.bool.isRequired,
2112
+ node: PropTypes.shape({
2113
+ id: PropTypes.string,
2114
+ name: PropTypes.string,
2115
+ prefix: PropTypes.string,
2116
+ apiType: PropTypes.string,
2117
+ baseUrl: PropTypes.string,
2118
+ }),
2119
+ onSave: PropTypes.func.isRequired,
2120
+ onClose: PropTypes.func.isRequired,
2121
+ isAnthropic: PropTypes.bool,
2122
+ };
2123
+
2124
+ function AddCustomModelModal({ isOpen, providerAlias, providerDisplayAlias, onSave, onClose }) {
2125
+ const [modelId, setModelId] = useState("");
2126
+ const [testStatus, setTestStatus] = useState(null); // null | "testing" | "ok" | "error"
2127
+ const [testError, setTestError] = useState("");
2128
+ const [saving, setSaving] = useState(false);
2129
+
2130
+ // Reset state when modal opens
2131
+ useEffect(() => {
2132
+ if (isOpen) { setModelId(""); setTestStatus(null); setTestError(""); }
2133
+ }, [isOpen]);
2134
+
2135
+ const handleTest = async () => {
2136
+ if (!modelId.trim()) return;
2137
+ setTestStatus("testing");
2138
+ setTestError("");
2139
+ try {
2140
+ const res = await fetch("/api/models/test", {
2141
+ method: "POST",
2142
+ headers: { "Content-Type": "application/json" },
2143
+ body: JSON.stringify({ model: `${providerAlias}/${modelId.trim()}` }),
2144
+ });
2145
+ const data = await res.json();
2146
+ setTestStatus(data.ok ? "ok" : "error");
2147
+ setTestError(data.error || "");
2148
+ } catch (err) {
2149
+ setTestStatus("error");
2150
+ setTestError(err.message);
2151
+ }
2152
+ };
2153
+
2154
+ const handleSave = async () => {
2155
+ if (!modelId.trim() || saving) return;
2156
+ setSaving(true);
2157
+ try {
2158
+ await onSave(modelId.trim());
2159
+ } finally {
2160
+ setSaving(false);
2161
+ }
2162
+ };
2163
+
2164
+ const handleKeyDown = (e) => {
2165
+ if (e.key === "Enter") handleTest();
2166
+ };
2167
+
2168
+ return (
2169
+ <Modal isOpen={isOpen} onClose={onClose} title="Add Custom Model">
2170
+ <div className="flex flex-col gap-4">
2171
+ <div>
2172
+ <label className="text-sm font-medium mb-1.5 block">Model ID</label>
2173
+ <div className="flex gap-2">
2174
+ <input
2175
+ type="text"
2176
+ value={modelId}
2177
+ onChange={(e) => { setModelId(e.target.value); setTestStatus(null); setTestError(""); }}
2178
+ onKeyDown={handleKeyDown}
2179
+ placeholder="e.g. claude-opus-4-5"
2180
+ className="flex-1 px-3 py-2 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary"
2181
+ autoFocus
2182
+ />
2183
+ <Button
2184
+ variant="secondary"
2185
+ icon="science"
2186
+ loading={testStatus === "testing"}
2187
+ onClick={handleTest}
2188
+ disabled={!modelId.trim() || testStatus === "testing"}
2189
+ >
2190
+ {testStatus === "testing" ? "Testing..." : "Test"}
2191
+ </Button>
2192
+ </div>
2193
+ <p className="text-xs text-text-muted mt-1">
2194
+ Sent to provider as: <code className="font-mono bg-sidebar px-1 rounded">{modelId.trim() || "model-id"}</code>
2195
+ </p>
2196
+ </div>
2197
+
2198
+ {/* Test result */}
2199
+ {testStatus === "ok" && (
2200
+ <div className="flex items-center gap-2 text-sm text-green-600">
2201
+ <span className="material-symbols-outlined text-base">check_circle</span>
2202
+ Model is reachable
2203
+ </div>
2204
+ )}
2205
+ {testStatus === "error" && (
2206
+ <div className="flex items-start gap-2 text-sm text-red-500">
2207
+ <span className="material-symbols-outlined text-base shrink-0">cancel</span>
2208
+ <span>{testError || "Model not reachable"}</span>
2209
+ </div>
2210
+ )}
2211
+
2212
+ <div className="flex gap-2 pt-1">
2213
+ <Button onClick={onClose} variant="ghost" fullWidth size="sm">Cancel</Button>
2214
+ <Button
2215
+ onClick={handleSave}
2216
+ fullWidth
2217
+ size="sm"
2218
+ disabled={!modelId.trim() || saving}
2219
+ >
2220
+ {saving ? "Adding..." : "Add Model"}
2221
+ </Button>
2222
+ </div>
2223
+ </div>
2224
+ </Modal>
2225
+ );
2226
+ }
2227
+
2228
+ AddCustomModelModal.propTypes = {
2229
+ isOpen: PropTypes.bool.isRequired,
2230
+ providerAlias: PropTypes.string.isRequired,
2231
+ providerDisplayAlias: PropTypes.string.isRequired,
2232
+ onSave: PropTypes.func.isRequired,
2233
+ onClose: PropTypes.func.isRequired,
2234
+ };
2235
+