zevairouter 1.0.145 → 1.0.147

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 (338) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/cli/app/.next-cli-build/BUILD_ID +1 -1
  3. package/cli/app/.next-cli-build/app-path-routes-manifest.json +9 -9
  4. package/cli/app/.next-cli-build/build-manifest.json +2 -2
  5. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/automation/page_client-reference-manifest.js +1 -1
  6. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
  7. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
  8. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  9. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  10. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
  11. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/context/page_client-reference-manifest.js +1 -1
  12. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  13. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
  14. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
  15. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
  16. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
  17. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
  18. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  19. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/playground/page_client-reference-manifest.js +1 -1
  20. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  21. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  22. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  23. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page.js +1 -1
  24. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  25. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
  26. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/pxpipe/page_client-reference-manifest.js +1 -1
  27. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page.js +1 -1
  28. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  29. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/terminal/page_client-reference-manifest.js +1 -1
  30. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
  31. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  32. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  33. package/cli/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
  34. package/cli/app/.next-cli-build/server/app/_global-error.html +1 -1
  35. package/cli/app/.next-cli-build/server/app/_global-error.rsc +1 -1
  36. package/cli/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
  37. package/cli/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  38. package/cli/app/.next-cli-build/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  39. package/cli/app/.next-cli-build/server/app/_global-error.segments/_head.segment.rsc +1 -1
  40. package/cli/app/.next-cli-build/server/app/_global-error.segments/_index.segment.rsc +1 -1
  41. package/cli/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  42. package/cli/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
  43. package/cli/app/.next-cli-build/server/app/_not-found.html +1 -1
  44. package/cli/app/.next-cli-build/server/app/_not-found.rsc +4 -4
  45. package/cli/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +4 -4
  46. package/cli/app/.next-cli-build/server/app/_not-found.segments/_head.segment.rsc +1 -1
  47. package/cli/app/.next-cli-build/server/app/_not-found.segments/_index.segment.rsc +4 -4
  48. package/cli/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  49. package/cli/app/.next-cli-build/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  50. package/cli/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  51. package/cli/app/.next-cli-build/server/app/api/models/route.js +1 -1
  52. package/cli/app/.next-cli-build/server/app/api/providers/route.js +1 -1
  53. package/cli/app/.next-cli-build/server/app/api/providers/validate/route.js +1 -1
  54. package/cli/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
  55. package/cli/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
  56. package/cli/app/.next-cli-build/server/app/api/version/route.js +1 -1
  57. package/cli/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
  58. package/cli/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
  59. package/cli/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
  60. package/cli/app/.next-cli-build/server/app/callback.html +1 -1
  61. package/cli/app/.next-cli-build/server/app/callback.rsc +4 -4
  62. package/cli/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +4 -4
  63. package/cli/app/.next-cli-build/server/app/callback.segments/_head.segment.rsc +1 -1
  64. package/cli/app/.next-cli-build/server/app/callback.segments/_index.segment.rsc +4 -4
  65. package/cli/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +2 -2
  66. package/cli/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
  67. package/cli/app/.next-cli-build/server/app/callback.segments/callback.segment.rsc +1 -1
  68. package/cli/app/.next-cli-build/server/app/dashboard/automation.html +1 -1
  69. package/cli/app/.next-cli-build/server/app/dashboard/automation.rsc +6 -6
  70. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard/automation/__PAGE__.segment.rsc +2 -2
  71. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard/automation.segment.rsc +1 -1
  72. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  73. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  74. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_full.segment.rsc +6 -6
  75. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_head.segment.rsc +1 -1
  76. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_index.segment.rsc +4 -4
  77. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_tree.segment.rsc +2 -2
  78. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
  79. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +6 -6
  80. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
  81. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
  82. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  83. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  84. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +6 -6
  85. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
  86. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_index.segment.rsc +4 -4
  87. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +2 -2
  88. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
  89. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +6 -6
  90. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
  91. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
  92. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  93. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  94. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +6 -6
  95. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
  96. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_index.segment.rsc +4 -4
  97. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +2 -2
  98. package/cli/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
  99. package/cli/app/.next-cli-build/server/app/dashboard/combos.rsc +6 -6
  100. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
  101. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
  102. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  103. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  104. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +6 -6
  105. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
  106. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_index.segment.rsc +4 -4
  107. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +2 -2
  108. package/cli/app/.next-cli-build/server/app/dashboard/context.html +1 -1
  109. package/cli/app/.next-cli-build/server/app/dashboard/context.rsc +6 -6
  110. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard/context/__PAGE__.segment.rsc +2 -2
  111. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard/context.segment.rsc +1 -1
  112. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  113. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  114. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_full.segment.rsc +6 -6
  115. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_head.segment.rsc +1 -1
  116. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_index.segment.rsc +4 -4
  117. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_tree.segment.rsc +2 -2
  118. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
  119. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.rsc +6 -6
  120. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
  121. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
  122. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  123. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  124. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +6 -6
  125. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
  126. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_index.segment.rsc +4 -4
  127. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +2 -2
  128. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
  129. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +6 -6
  130. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +2 -2
  131. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web.segment.rsc +1 -1
  132. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
  133. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  134. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  135. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +6 -6
  136. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_head.segment.rsc +1 -1
  137. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_index.segment.rsc +4 -4
  138. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +2 -2
  139. package/cli/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
  140. package/cli/app/.next-cli-build/server/app/dashboard/mitm.rsc +6 -6
  141. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
  142. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
  143. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  144. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  145. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +6 -6
  146. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
  147. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_index.segment.rsc +4 -4
  148. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +2 -2
  149. package/cli/app/.next-cli-build/server/app/dashboard/playground.html +1 -1
  150. package/cli/app/.next-cli-build/server/app/dashboard/playground.rsc +6 -6
  151. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard/playground/__PAGE__.segment.rsc +2 -2
  152. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard/playground.segment.rsc +1 -1
  153. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  154. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  155. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_full.segment.rsc +6 -6
  156. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_head.segment.rsc +1 -1
  157. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_index.segment.rsc +4 -4
  158. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_tree.segment.rsc +2 -2
  159. package/cli/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
  160. package/cli/app/.next-cli-build/server/app/dashboard/profile.rsc +6 -6
  161. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
  162. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
  163. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  164. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  165. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +6 -6
  166. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
  167. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_index.segment.rsc +4 -4
  168. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +2 -2
  169. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
  170. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.rsc +6 -6
  171. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
  172. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
  173. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  174. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  175. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  176. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +6 -6
  177. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
  178. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_index.segment.rsc +4 -4
  179. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +2 -2
  180. package/cli/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
  181. package/cli/app/.next-cli-build/server/app/dashboard/providers.rsc +6 -6
  182. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
  183. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  184. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  185. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  186. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +6 -6
  187. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
  188. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_index.segment.rsc +4 -4
  189. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +2 -2
  190. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
  191. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +6 -6
  192. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
  193. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
  194. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  195. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  196. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +6 -6
  197. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
  198. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +4 -4
  199. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +2 -2
  200. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.html +1 -1
  201. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.rsc +6 -6
  202. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe/__PAGE__.segment.rsc +2 -2
  203. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe.segment.rsc +1 -1
  204. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  205. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  206. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_full.segment.rsc +6 -6
  207. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_head.segment.rsc +1 -1
  208. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_index.segment.rsc +4 -4
  209. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_tree.segment.rsc +2 -2
  210. package/cli/app/.next-cli-build/server/app/dashboard/quota.html +2 -2
  211. package/cli/app/.next-cli-build/server/app/dashboard/quota.rsc +7 -7
  212. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +3 -3
  213. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
  214. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  215. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  216. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +7 -7
  217. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
  218. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_index.segment.rsc +4 -4
  219. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +2 -2
  220. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  221. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
  222. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +4 -4
  223. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +4 -4
  224. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
  225. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +4 -4
  226. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +2 -2
  227. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
  228. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
  229. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
  230. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
  231. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.html +1 -1
  232. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.rsc +6 -6
  233. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +2 -2
  234. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver.segment.rsc +1 -1
  235. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  236. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  237. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_full.segment.rsc +6 -6
  238. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_head.segment.rsc +1 -1
  239. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_index.segment.rsc +4 -4
  240. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_tree.segment.rsc +2 -2
  241. package/cli/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
  242. package/cli/app/.next-cli-build/server/app/dashboard/translator.rsc +6 -6
  243. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
  244. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
  245. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  246. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  247. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +6 -6
  248. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
  249. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_index.segment.rsc +4 -4
  250. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +2 -2
  251. package/cli/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
  252. package/cli/app/.next-cli-build/server/app/dashboard/usage.rsc +6 -6
  253. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
  254. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
  255. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  256. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  257. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +6 -6
  258. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
  259. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_index.segment.rsc +4 -4
  260. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +2 -2
  261. package/cli/app/.next-cli-build/server/app/dashboard.html +1 -1
  262. package/cli/app/.next-cli-build/server/app/dashboard.rsc +6 -6
  263. package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
  264. package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  265. package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  266. package/cli/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +6 -6
  267. package/cli/app/.next-cli-build/server/app/dashboard.segments/_head.segment.rsc +1 -1
  268. package/cli/app/.next-cli-build/server/app/dashboard.segments/_index.segment.rsc +4 -4
  269. package/cli/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +2 -2
  270. package/cli/app/.next-cli-build/server/app/index.html +1 -1
  271. package/cli/app/.next-cli-build/server/app/index.rsc +4 -4
  272. package/cli/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  273. package/cli/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +4 -4
  274. package/cli/app/.next-cli-build/server/app/index.segments/_head.segment.rsc +1 -1
  275. package/cli/app/.next-cli-build/server/app/index.segments/_index.segment.rsc +4 -4
  276. package/cli/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +2 -2
  277. package/cli/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
  278. package/cli/app/.next-cli-build/server/app/landing.html +1 -1
  279. package/cli/app/.next-cli-build/server/app/landing.rsc +5 -5
  280. package/cli/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +5 -5
  281. package/cli/app/.next-cli-build/server/app/landing.segments/_head.segment.rsc +1 -1
  282. package/cli/app/.next-cli-build/server/app/landing.segments/_index.segment.rsc +4 -4
  283. package/cli/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +2 -2
  284. package/cli/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +2 -2
  285. package/cli/app/.next-cli-build/server/app/landing.segments/landing.segment.rsc +1 -1
  286. package/cli/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
  287. package/cli/app/.next-cli-build/server/app/login.html +1 -1
  288. package/cli/app/.next-cli-build/server/app/login.rsc +5 -5
  289. package/cli/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +5 -5
  290. package/cli/app/.next-cli-build/server/app/login.segments/_head.segment.rsc +1 -1
  291. package/cli/app/.next-cli-build/server/app/login.segments/_index.segment.rsc +4 -4
  292. package/cli/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +2 -2
  293. package/cli/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  294. package/cli/app/.next-cli-build/server/app/login.segments/login.segment.rsc +1 -1
  295. package/cli/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
  296. package/cli/app/.next-cli-build/server/app-paths-manifest.json +9 -9
  297. package/cli/app/.next-cli-build/server/chunks/3155.js +1 -1
  298. package/cli/app/.next-cli-build/server/chunks/412.js +2 -2
  299. package/cli/app/.next-cli-build/server/chunks/4746.js +1 -1
  300. package/cli/app/.next-cli-build/server/chunks/5307.js +1 -1
  301. package/cli/app/.next-cli-build/server/chunks/5469.js +1 -1
  302. package/cli/app/.next-cli-build/server/chunks/8242.js +2 -2
  303. package/cli/app/.next-cli-build/server/chunks/8306.js +1 -1
  304. package/cli/app/.next-cli-build/server/chunks/9621.js +1 -1
  305. package/cli/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
  306. package/cli/app/.next-cli-build/server/pages/404.html +1 -1
  307. package/cli/app/.next-cli-build/server/pages/500.html +1 -1
  308. package/cli/app/.next-cli-build/static/chunks/523-176a0660a9383518.js +3 -0
  309. package/cli/app/.next-cli-build/static/chunks/5497-8d0ec2995dc0a392.js +7 -0
  310. package/cli/app/.next-cli-build/static/chunks/{620-b21eb963d0189283.js → 620-375754e53341e85b.js} +1 -1
  311. package/cli/app/.next-cli-build/static/chunks/9126-7d5476f17beddfb0.js +1 -0
  312. package/cli/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/page-2468e6ba8d1efeec.js +1 -0
  313. package/cli/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/quota/page-579bf915396efc69.js +1 -0
  314. package/cli/app/.next-cli-build/static/css/87ffa46afc2273f4.css +1 -0
  315. package/cli/app/CHANGELOG.md +17 -0
  316. package/cli/app/package.json +1 -1
  317. package/cli/package.json +1 -1
  318. package/package.json +1 -1
  319. package/src/app/(dashboard)/dashboard/basic-chat/BasicChatPageClient.js +91 -38
  320. package/src/app/(dashboard)/dashboard/endpoint/EndpointPageClient.js +45 -38
  321. package/src/app/(dashboard)/dashboard/providers/page.js +199 -173
  322. package/src/app/(dashboard)/dashboard/usage/components/OverviewCards.js +11 -17
  323. package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/QuotaTable.js +15 -9
  324. package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/index.js +188 -120
  325. package/src/app/(dashboard)/dashboard/usage/components/ProviderTopology.js +149 -24
  326. package/src/shared/components/Header.js +4 -4
  327. package/src/shared/components/HeaderLanguage.js +2 -1
  328. package/src/shared/components/HeaderMenu.js +2 -1
  329. package/src/shared/components/Toggle.js +28 -12
  330. package/src/shared/components/UsageStats.js +3 -3
  331. package/cli/app/.next-cli-build/static/chunks/523-078802482e95c757.js +0 -3
  332. package/cli/app/.next-cli-build/static/chunks/5497-276ef7bcaaa911b7.js +0 -7
  333. package/cli/app/.next-cli-build/static/chunks/9126-9e1755f122b943cd.js +0 -1
  334. package/cli/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/page-2cedde97aaf3c729.js +0 -1
  335. package/cli/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/quota/page-6050ac2547c62b54.js +0 -1
  336. package/cli/app/.next-cli-build/static/css/b912482d9fc0b2ed.css +0 -1
  337. /package/cli/app/.next-cli-build/static/{x2eyEbk18Mgl67fqRmEFx → y-U4C09T7DItXT7CZZV41}/_buildManifest.js +0 -0
  338. /package/cli/app/.next-cli-build/static/{x2eyEbk18Mgl67fqRmEFx → y-U4C09T7DItXT7CZZV41}/_ssgManifest.js +0 -0
@@ -29,28 +29,26 @@ import { useHeaderSearchStore } from "@/store/headerSearchStore";
29
29
  import ModelAvailabilityBadge from "./components/ModelAvailabilityBadge";
30
30
 
31
31
  function getStatusDisplay(connected, error, errorCode) {
32
- const parts = [];
33
32
  if (connected > 0) {
34
- parts.push(
35
- <Badge key="connected" variant="success" size="sm" dot>
36
- {connected} Connected
37
- </Badge>,
33
+ return (
34
+ <span className="inline-flex min-w-0 items-center gap-1.5 text-[11px] font-medium text-success">
35
+ <span aria-hidden="true" className="size-1.5 shrink-0 rounded-full bg-success" />
36
+ {connected} connected
37
+ </span>
38
38
  );
39
39
  }
40
40
  if (error > 0) {
41
41
  const errText = errorCode
42
42
  ? `${error} Error (${errorCode})`
43
43
  : `${error} Error`;
44
- parts.push(
45
- <Badge key="error" variant="error" size="sm" dot>
44
+ return (
45
+ <span className="inline-flex min-w-0 items-center gap-1.5 text-[11px] font-medium text-error">
46
+ <span aria-hidden="true" className="size-1.5 shrink-0 rounded-full bg-error" />
46
47
  {errText}
47
- </Badge>,
48
+ </span>
48
49
  );
49
50
  }
50
- if (parts.length === 0) {
51
- return <span className="text-text-muted">No connections</span>;
52
- }
53
- return parts;
51
+ return <span className="text-[11px] text-text-muted">No connections</span>;
54
52
  }
55
53
 
56
54
  function getConnectionErrorTag(connection) {
@@ -97,6 +95,12 @@ function getConnectionErrorTag(connection) {
97
95
 
98
96
  const PROVIDERS_DEFAULT_PAGE_SIZE = 20;
99
97
  const PROVIDERS_FETCH_TIMEOUT_MS = 8000;
98
+ const PROVIDER_STATUS_FILTERS = [
99
+ { value: "all", label: "All" },
100
+ { value: "connected", label: "Connected" },
101
+ { value: "ready", label: "Ready" },
102
+ { value: "setup", label: "Needs setup" },
103
+ ];
100
104
 
101
105
  async function fetchJsonWithTimeout(url) {
102
106
  const controller = new AbortController();
@@ -131,6 +135,13 @@ export default function ProvidersPage() {
131
135
  useState(false);
132
136
  const [testingMode, setTestingMode] = useState(null);
133
137
  const [testResults, setTestResults] = useState(null);
138
+ const [statusFilter, setStatusFilter] = useState("all");
139
+ const [collapsedSections, setCollapsedSections] = useState({
140
+ custom: false,
141
+ oauth: false,
142
+ free: true,
143
+ apikey: true,
144
+ });
134
145
  const notify = useNotificationStore();
135
146
  const searchQuery = useHeaderSearchStore((s) => s.query);
136
147
  const registerSearch = useHeaderSearchStore((s) => s.register);
@@ -144,7 +155,7 @@ export default function ProvidersPage() {
144
155
  useEffect(() => {
145
156
  // eslint-disable-next-line react-hooks/set-state-in-effect -- pagination reset: returns to page 1 when search query or page size changes
146
157
  setApikeyPage(1);
147
- }, [searchQuery, apikeyPageSize]);
158
+ }, [searchQuery, apikeyPageSize, statusFilter]);
148
159
 
149
160
  const matchSearch = (name) =>
150
161
  !searchQuery.trim() ||
@@ -160,16 +171,6 @@ export default function ProvidersPage() {
160
171
  return (a.name || "").localeCompare(b.name || "");
161
172
  });
162
173
 
163
- const sortItemsByPriority = (items, authType) =>
164
- [...items].sort((a, b) => {
165
- const sa = getProviderStats(a.id, authType);
166
- const sb = getProviderStats(b.id, authType);
167
- const ca = sa.connected > 0 ? 1 : 0;
168
- const cb = sb.connected > 0 ? 1 : 0;
169
- if (ca !== cb) return cb - ca;
170
- return (a.name || "").localeCompare(b.name || "");
171
- });
172
-
173
174
  useEffect(() => {
174
175
  const fetchData = async () => {
175
176
  try {
@@ -268,6 +269,21 @@ export default function ProvidersPage() {
268
269
  return { connected, error, total, errorCode, errorTime, allDisabled };
269
270
  };
270
271
 
272
+ const matchesStatusFilter = (providerId, provider, authType) => {
273
+ if (statusFilter === "all") return true;
274
+ const stats = getProviderStats(providerId, authType);
275
+ if (statusFilter === "connected") return stats.connected > 0;
276
+ if (statusFilter === "ready") return stats.connected === 0 && provider.noAuth === true;
277
+ return stats.connected === 0 && provider.noAuth !== true;
278
+ };
279
+
280
+ const toggleSection = (section) => {
281
+ setCollapsedSections((current) => ({
282
+ ...current,
283
+ [section]: !current[section],
284
+ }));
285
+ };
286
+
271
287
  // Toggle all connections for a provider on/off
272
288
  const handleToggleProvider = async (providerId, authType, newActive) => {
273
289
  const providerConns = connections.filter(
@@ -325,7 +341,7 @@ export default function ProvidersPage() {
325
341
  textIcon: "OC",
326
342
  apiType: node.apiType,
327
343
  }))
328
- .filter((p) => matchSearch(p.name));
344
+ .filter((p) => matchSearch(p.name) && matchesStatusFilter(p.id, p, "apikey"));
329
345
 
330
346
  const anthropicCompatibleProviders = providerNodes
331
347
  .filter((node) => node.type === "anthropic-compatible")
@@ -335,23 +351,28 @@ export default function ProvidersPage() {
335
351
  color: "#D97757",
336
352
  textIcon: "AC",
337
353
  }))
338
- .filter((p) => matchSearch(p.name));
354
+ .filter((p) => matchSearch(p.name) && matchesStatusFilter(p.id, p, "apikey"));
339
355
 
340
356
  const oauthEntries = Object.entries(OAUTH_PROVIDERS).filter(
341
- ([, info]) => !info.hidden && matchSearch(info.name),
357
+ ([key, info]) => !info.hidden && matchSearch(info.name) && matchesStatusFilter(key, info, "oauth"),
342
358
  );
343
359
  const freeEntries = Object.entries(FREE_PROVIDERS).filter(
344
- ([, info]) => !info.hidden && matchSearch(info.name),
360
+ ([key, info]) => {
361
+ const hasApiKeyMode = Array.isArray(info?.authModes) && info.authModes.includes("apikey");
362
+ const authTypes = hasApiKeyMode ? ["oauth", "apikey"] : "oauth";
363
+ return !info.hidden && matchSearch(info.name) && matchesStatusFilter(key, info, authTypes);
364
+ },
345
365
  );
346
366
  const freeTierEntries = Object.entries(FREE_TIER_PROVIDERS).filter(
347
- ([, info]) => !info.hidden && matchSearch(info.name),
367
+ ([key, info]) => !info.hidden && matchSearch(info.name) && matchesStatusFilter(key, info, "apikey"),
348
368
  );
349
369
  const apikeyEntries = sortByPriority(
350
370
  Object.entries(APIKEY_PROVIDERS).filter(
351
- ([, info]) =>
371
+ ([key, info]) =>
352
372
  !info.hidden &&
353
373
  (info.serviceKinds ?? ["llm"]).includes("llm") &&
354
- matchSearch(info.name),
374
+ matchSearch(info.name) &&
375
+ matchesStatusFilter(key, info, "apikey"),
355
376
  ),
356
377
  "apikey",
357
378
  );
@@ -378,43 +399,41 @@ export default function ProvidersPage() {
378
399
  apikeyEntries.length > 0 ||
379
400
  compatibleProviders.length > 0 ||
380
401
  anthropicCompatibleProviders.length > 0;
402
+ const showCustomSection =
403
+ compatibleProviders.length > 0 ||
404
+ anthropicCompatibleProviders.length > 0 ||
405
+ (statusFilter === "all" && !searchQuery.trim());
381
406
 
382
407
  return (
383
- <div className="flex min-w-0 flex-col gap-6 px-1 sm:px-0 lg:gap-7">
408
+ <div className="flex min-w-0 flex-col gap-6 px-1 sm:px-0">
384
409
  {totalConnections > 0 && (
385
- <div className="overflow-hidden rounded-2xl border border-primary/15 bg-surface/85 shadow-[0_20px_45px_-38px_rgba(229,106,74,0.8)] backdrop-blur-sm">
386
- <div className="grid grid-cols-2 divide-x divide-y divide-border-subtle sm:grid-cols-4 sm:divide-y-0">
387
- <div className="col-span-2 flex items-center gap-3 px-4 py-3.5 sm:col-span-1">
388
- <span className="flex size-10 shrink-0 items-center justify-center rounded-xl bg-primary/10 text-primary ring-1 ring-primary/15">
389
- <span aria-hidden="true" className="material-symbols-outlined" style={{ fontSize: 20 }}>dns</span>
410
+ <div className="overflow-hidden rounded-xl border border-border bg-surface/80 shadow-sm">
411
+ <div className="grid grid-cols-3 divide-x divide-y divide-border-subtle sm:grid-cols-4 sm:divide-y-0">
412
+ <div className="col-span-3 flex items-center gap-3 px-4 py-3 sm:col-span-1">
413
+ <span className="flex size-9 shrink-0 items-center justify-center rounded-lg bg-primary/[0.08] text-primary">
414
+ <span aria-hidden="true" className="material-symbols-outlined" style={{ fontSize: 18 }}>dns</span>
390
415
  </span>
391
416
  <div>
392
- <p className="text-[10px] font-bold uppercase tracking-[0.12em] text-text-muted">Connection health</p>
393
- <p className="mt-0.5 text-sm font-semibold text-text-main">{activePercent}% active</p>
417
+ <p className="text-[11px] font-medium text-text-muted">Connection health</p>
418
+ <p className="mt-0.5 text-sm font-semibold tabular-nums text-text-main">{activePercent}% active</p>
394
419
  </div>
395
420
  </div>
396
- <div className="px-4 py-3.5">
397
- <p className="text-[10px] font-bold uppercase tracking-[0.1em] text-text-muted">Connections</p>
398
- <p className="mt-1 text-xl font-bold tracking-tight text-text-main">{totalConnections}</p>
421
+ <div className="px-4 py-3">
422
+ <p className="text-[11px] font-medium text-text-muted">Connections</p>
423
+ <p className="mt-0.5 text-lg font-semibold tabular-nums text-text-main">{totalConnections}</p>
399
424
  </div>
400
- <div className="px-4 py-3.5">
401
- <p className="text-[10px] font-bold uppercase tracking-[0.1em] text-text-muted">Active</p>
402
- <div className="mt-1 flex items-baseline gap-2">
403
- <p className="text-xl font-bold tracking-tight text-success">{activeConnections}</p>
425
+ <div className="px-4 py-3">
426
+ <p className="text-[11px] font-medium text-text-muted">Active</p>
427
+ <div className="mt-0.5 flex items-baseline gap-2">
428
+ <p className="text-lg font-semibold tabular-nums text-success">{activeConnections}</p>
404
429
  {pausedConnections > 0 && <span className="text-[10px] text-text-muted">{pausedConnections} paused</span>}
405
430
  </div>
406
431
  </div>
407
- <div className="px-4 py-3.5">
408
- <p className="text-[10px] font-bold uppercase tracking-[0.1em] text-text-muted">Providers</p>
409
- <p className="mt-1 text-xl font-bold tracking-tight text-info">{connectedProviderCount}</p>
432
+ <div className="px-4 py-3">
433
+ <p className="text-[11px] font-medium text-text-muted">Providers</p>
434
+ <p className="mt-0.5 text-lg font-semibold tabular-nums text-info">{connectedProviderCount}</p>
410
435
  </div>
411
436
  </div>
412
- {totalConnections >= 100 && (
413
- <div className="flex items-center gap-2 border-t border-border-subtle bg-surface-2/35 px-4 py-2 text-[11px] text-text-muted">
414
- <span aria-hidden="true" className="material-symbols-outlined text-[15px] text-primary">filter_alt</span>
415
- Open a provider to search and filter its paginated connections.
416
- </div>
417
- )}
418
437
  </div>
419
438
  )}
420
439
  {loadError && (
@@ -423,28 +442,54 @@ export default function ProvidersPage() {
423
442
  </div>
424
443
  )}
425
444
 
445
+ <div className="overflow-x-auto pb-0.5 [scrollbar-width:none] [&::-webkit-scrollbar]:hidden">
446
+ <div className="inline-flex min-w-full items-center gap-1.5 rounded-xl border border-border-subtle bg-surface/70 p-1.5 sm:min-w-0">
447
+ {PROVIDER_STATUS_FILTERS.map((option) => (
448
+ <button
449
+ key={option.value}
450
+ type="button"
451
+ onClick={() => {
452
+ setStatusFilter(option.value);
453
+ setApikeyPage(1);
454
+ setCollapsedSections({ custom: false, oauth: false, free: false, apikey: false });
455
+ }}
456
+ aria-pressed={statusFilter === option.value}
457
+ className={`flex h-11 flex-1 items-center justify-center whitespace-nowrap rounded-lg px-3 text-xs font-medium transition-colors sm:h-8 sm:flex-none sm:px-3 ${statusFilter === option.value ? "bg-primary text-white shadow-sm" : "text-text-muted hover:bg-black/5 hover:text-text-main dark:hover:bg-white/5"}`}
458
+ >
459
+ {option.label}
460
+ </button>
461
+ ))}
462
+ </div>
463
+ </div>
464
+
426
465
  {!hasAnyResult && (
427
466
  <div className="text-center py-8 border border-dashed border-border rounded-xl">
428
467
  <span className="material-symbols-outlined text-[32px] text-text-muted mb-2">
429
468
  search_off
430
469
  </span>
431
- <p className="text-text-muted text-sm">No providers match your search</p>
470
+ <p className="text-text-muted text-sm">
471
+ {searchQuery.trim() ? "No providers match your search" : "No providers match this filter"}
472
+ </p>
432
473
  </div>
433
474
  )}
434
475
 
435
476
  {/* Custom Providers (OpenAI/Anthropic Compatible) — dynamic */}
477
+ {showCustomSection && (
436
478
  <div className="flex flex-col gap-4">
437
479
  <ProviderSectionHeader
438
480
  icon="extension"
439
481
  title="Custom Providers"
440
482
  description="OpenAI and Anthropic-compatible endpoints"
483
+ count={compatibleProviders.length + anthropicCompatibleProviders.length}
484
+ collapsed={collapsedSections.custom && !searchQuery.trim()}
485
+ onToggle={() => toggleSection("custom")}
441
486
  >
442
487
  <div className="grid grid-cols-1 gap-2 sm:flex sm:w-auto">
443
488
  <Button
444
489
  size="sm"
445
490
  icon="add"
446
491
  onClick={() => setShowAddAnthropicCompatibleModal(true)}
447
- className="w-full sm:w-auto"
492
+ className="min-h-11 w-full sm:min-h-0 sm:w-auto"
448
493
  >
449
494
  Add Anthropic Compatible
450
495
  </Button>
@@ -453,12 +498,13 @@ export default function ProvidersPage() {
453
498
  variant="secondary"
454
499
  icon="add"
455
500
  onClick={() => setShowAddCompatibleModal(true)}
456
- className="w-full !bg-white !text-black hover:!bg-gray-100 sm:w-auto"
501
+ className="min-h-11 w-full sm:min-h-0 sm:w-auto"
457
502
  >
458
503
  Add OpenAI Compatible
459
504
  </Button>
460
505
  </div>
461
506
  </ProviderSectionHeader>
507
+ <div className={collapsedSections.custom && !searchQuery.trim() ? "hidden sm:block" : ""}>
462
508
  {compatibleProviders.length === 0 &&
463
509
  anthropicCompatibleProviders.length === 0 ? (
464
510
  <div className="flex items-center gap-3 rounded-xl border border-dashed border-border bg-surface/45 px-4 py-3 text-text-muted">
@@ -469,7 +515,7 @@ export default function ProvidersPage() {
469
515
  </div>
470
516
  </div>
471
517
  ) : (
472
- <div className="grid grid-cols-1 gap-3 sm:grid-cols-2 sm:gap-4 lg:grid-cols-3 xl:grid-cols-4">
518
+ <div className="grid grid-cols-1 gap-2.5 sm:grid-cols-2 sm:gap-3 lg:grid-cols-3 xl:grid-cols-4">
473
519
  {[...compatibleProviders, ...anthropicCompatibleProviders].map(
474
520
  (info) => (
475
521
  <ApiKeyProviderCard
@@ -477,7 +523,6 @@ export default function ProvidersPage() {
477
523
  providerId={info.id}
478
524
  provider={info}
479
525
  stats={getProviderStats(info.id, "apikey")}
480
- authType="compatible"
481
526
  onToggle={(active) =>
482
527
  handleToggleProvider(info.id, "apikey", active)
483
528
  }
@@ -486,7 +531,9 @@ export default function ProvidersPage() {
486
531
  )}
487
532
  </div>
488
533
  )}
534
+ </div>
489
535
  </div>
536
+ )}
490
537
 
491
538
  {/* OAuth Providers */}
492
539
  {oauthEntries.length > 0 && (
@@ -495,13 +542,16 @@ export default function ProvidersPage() {
495
542
  icon="passkey"
496
543
  title="OAuth Providers"
497
544
  description="Connect existing provider accounts securely"
545
+ count={oauthEntries.length}
546
+ collapsed={collapsedSections.oauth && !searchQuery.trim()}
547
+ onToggle={() => toggleSection("oauth")}
498
548
  >
499
549
  <div className="flex w-full flex-col gap-2 sm:w-auto sm:flex-row sm:items-center">
500
550
  <ModelAvailabilityBadge />
501
551
  <button
502
552
  onClick={() => handleBatchTest("oauth")}
503
553
  disabled={!!testingMode}
504
- className={`flex w-full items-center justify-center gap-1.5 rounded-lg border px-3 py-2 text-xs font-medium transition-colors sm:w-auto sm:py-1.5 ${
554
+ className={`flex h-11 w-full items-center justify-center gap-1.5 rounded-xl border px-3 text-xs font-medium transition-colors sm:h-8 sm:w-auto sm:rounded-lg ${
505
555
  testingMode === "oauth"
506
556
  ? "bg-primary/20 border-primary/40 text-primary animate-pulse"
507
557
  : "bg-bg border-border text-text-muted hover:text-text-main hover:border-primary/40"
@@ -518,14 +568,13 @@ export default function ProvidersPage() {
518
568
  </button>
519
569
  </div>
520
570
  </ProviderSectionHeader>
521
- <div className="grid grid-cols-1 gap-3 sm:grid-cols-2 sm:gap-4 lg:grid-cols-3 xl:grid-cols-4">
571
+ <div className={`${collapsedSections.oauth && !searchQuery.trim() ? "hidden sm:grid" : "grid"} grid-cols-1 gap-2.5 sm:grid-cols-2 sm:gap-3 lg:grid-cols-3 xl:grid-cols-4`}>
522
572
  {oauthEntries.map(([key, info]) => (
523
573
  <ProviderCard
524
574
  key={key}
525
575
  providerId={key}
526
576
  provider={info}
527
577
  stats={getProviderStats(key, "oauth")}
528
- authType="oauth"
529
578
  onToggle={(active) => handleToggleProvider(key, "oauth", active)}
530
579
  />
531
580
  ))}
@@ -540,11 +589,14 @@ export default function ProvidersPage() {
540
589
  icon="savings"
541
590
  title="Free Tier Providers"
542
591
  description="Ready-to-use and free-tier routing options"
592
+ count={freeEntries.length + freeTierEntries.length}
593
+ collapsed={collapsedSections.free && !searchQuery.trim()}
594
+ onToggle={() => toggleSection("free")}
543
595
  >
544
596
  <button
545
597
  onClick={() => handleBatchTest("free")}
546
598
  disabled={!!testingMode}
547
- className={`flex w-full items-center justify-center gap-1.5 rounded-lg border px-3 py-2 text-xs font-medium transition-colors sm:w-auto sm:py-1.5 ${
599
+ className={`flex h-11 w-full items-center justify-center gap-1.5 rounded-xl border px-3 text-xs font-medium transition-colors sm:h-8 sm:w-auto sm:rounded-lg ${
548
600
  testingMode === "free"
549
601
  ? "bg-primary/20 border-primary/40 text-primary animate-pulse"
550
602
  : "bg-bg border-border text-text-muted hover:text-text-main hover:border-primary/40"
@@ -560,7 +612,7 @@ export default function ProvidersPage() {
560
612
  {testingMode === "free" ? "Testing..." : "Test All"}
561
613
  </button>
562
614
  </ProviderSectionHeader>
563
- <div className="grid grid-cols-1 gap-3 sm:grid-cols-2 sm:gap-4 lg:grid-cols-3 xl:grid-cols-4">
615
+ <div className={`${collapsedSections.free && !searchQuery.trim() ? "hidden sm:grid" : "grid"} grid-cols-1 gap-2.5 sm:grid-cols-2 sm:gap-3 lg:grid-cols-3 xl:grid-cols-4`}>
564
616
  {freeEntries.map(([key, info]) => {
565
617
  const hasApiKeyMode = Array.isArray(info?.authModes) && info.authModes.includes("apikey");
566
618
  const statAuthTypes = hasApiKeyMode ? ["oauth", "apikey"] : "oauth";
@@ -570,7 +622,6 @@ export default function ProvidersPage() {
570
622
  providerId={key}
571
623
  provider={info}
572
624
  stats={getProviderStats(key, statAuthTypes)}
573
- authType="free"
574
625
  onToggle={(active) => handleToggleProvider(key, hasApiKeyMode ? "apikey" : "oauth", active)}
575
626
  />
576
627
  );
@@ -581,7 +632,6 @@ export default function ProvidersPage() {
581
632
  providerId={key}
582
633
  provider={info}
583
634
  stats={getProviderStats(key, "apikey")}
584
- authType="apikey"
585
635
  onToggle={(active) => handleToggleProvider(key, "apikey", active)}
586
636
  />
587
637
  ))}
@@ -596,11 +646,14 @@ export default function ProvidersPage() {
596
646
  icon="key"
597
647
  title="API Key Providers"
598
648
  description="Bring your own provider credentials"
649
+ count={apikeyEntries.length}
650
+ collapsed={collapsedSections.apikey && !searchQuery.trim()}
651
+ onToggle={() => toggleSection("apikey")}
599
652
  >
600
653
  <button
601
654
  onClick={() => handleBatchTest("apikey")}
602
655
  disabled={!!testingMode}
603
- className={`flex w-full items-center justify-center gap-1.5 rounded-lg border px-3 py-2 text-xs font-medium transition-colors sm:w-auto sm:py-1.5 ${
656
+ className={`flex h-11 w-full items-center justify-center gap-1.5 rounded-xl border px-3 text-xs font-medium transition-colors sm:h-8 sm:w-auto sm:rounded-lg ${
604
657
  testingMode === "apikey"
605
658
  ? "bg-primary/20 border-primary/40 text-primary animate-pulse"
606
659
  : "bg-bg border-border text-text-muted hover:text-text-main hover:border-primary/40"
@@ -616,19 +669,19 @@ export default function ProvidersPage() {
616
669
  {testingMode === "apikey" ? "Testing..." : "Test All"}
617
670
  </button>
618
671
  </ProviderSectionHeader>
619
- <div className="grid grid-cols-1 gap-3 sm:grid-cols-2 sm:gap-4 lg:grid-cols-3 xl:grid-cols-4">
672
+ <div className={`${collapsedSections.apikey && !searchQuery.trim() ? "hidden sm:grid" : "grid"} grid-cols-1 gap-2.5 sm:grid-cols-2 sm:gap-3 lg:grid-cols-3 xl:grid-cols-4`}>
620
673
  {visibleApikeyEntries.map(([key, info]) => (
621
674
  <ApiKeyProviderCard
622
675
  key={key}
623
676
  providerId={key}
624
677
  provider={info}
625
678
  stats={getProviderStats(key, "apikey")}
626
- authType="apikey"
627
679
  onToggle={(active) => handleToggleProvider(key, "apikey", active)}
628
680
  />
629
681
  ))}
630
682
  </div>
631
683
  {apikeyEntries.length > 0 && (
684
+ <div className={collapsedSections.apikey && !searchQuery.trim() ? "hidden sm:block" : ""}>
632
685
  <Pagination
633
686
  currentPage={activeApikeyPage}
634
687
  pageSize={apikeyPageSize}
@@ -639,6 +692,7 @@ export default function ProvidersPage() {
639
692
  setApikeyPage(1);
640
693
  }}
641
694
  />
695
+ </div>
642
696
  )}
643
697
  </div>
644
698
  )}
@@ -657,7 +711,6 @@ export default function ProvidersPage() {
657
711
  providerId={key}
658
712
  provider={info}
659
713
  stats={getProviderStats(key, "apikey")}
660
- authType="apikey"
661
714
  onToggle={(active) => handleToggleProvider(key, "apikey", active)}
662
715
  />
663
716
  ))}
@@ -712,19 +765,47 @@ export default function ProvidersPage() {
712
765
  );
713
766
  }
714
767
 
715
- function ProviderSectionHeader({ icon, title, description, children }) {
768
+ function ProviderSectionHeader({
769
+ icon,
770
+ title,
771
+ description,
772
+ count,
773
+ collapsed,
774
+ onToggle,
775
+ children,
776
+ }) {
716
777
  return (
717
778
  <div className="flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between">
718
- <div className="flex min-w-0 items-center gap-3">
719
- <span aria-hidden="true" className="material-symbols-outlined flex size-10 shrink-0 items-center justify-center rounded-xl bg-primary/10 text-[20px] text-primary ring-1 ring-primary/15">
720
- {icon}
721
- </span>
722
- <div className="min-w-0">
723
- <h2 className="text-lg font-semibold leading-tight sm:text-xl">{title}</h2>
724
- <p className="mt-0.5 text-xs text-text-muted">{description}</p>
779
+ <div className="flex w-full min-w-0 items-center gap-2.5 sm:w-auto">
780
+ <div className="flex min-w-0 flex-1 items-center gap-2.5 sm:flex-none">
781
+ <span aria-hidden="true" className="material-symbols-outlined flex size-8 shrink-0 items-center justify-center rounded-lg bg-primary/[0.08] text-[17px] text-primary">
782
+ {icon}
783
+ </span>
784
+ <div className="min-w-0">
785
+ <div className="flex items-center gap-2">
786
+ <h2 className="truncate text-lg font-semibold leading-tight">{title}</h2>
787
+ <span className="rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold tabular-nums text-text-muted">
788
+ {count}
789
+ </span>
790
+ </div>
791
+ <p className="mt-0.5 truncate text-[11px] text-text-muted sm:text-xs">{description}</p>
792
+ </div>
725
793
  </div>
794
+ <button
795
+ type="button"
796
+ onClick={onToggle}
797
+ className="flex size-11 shrink-0 items-center justify-center rounded-xl border border-border text-text-muted transition-colors hover:border-primary/30 hover:text-primary sm:hidden"
798
+ aria-expanded={!collapsed}
799
+ aria-label={`${collapsed ? "Expand" : "Collapse"} ${title}`}
800
+ >
801
+ <span className="material-symbols-outlined text-[20px]">
802
+ {collapsed ? "expand_more" : "expand_less"}
803
+ </span>
804
+ </button>
726
805
  </div>
727
- {children}
806
+ {children && (
807
+ <div className={collapsed ? "hidden sm:block" : "block"}>{children}</div>
808
+ )}
728
809
  </div>
729
810
  );
730
811
  }
@@ -733,42 +814,26 @@ ProviderSectionHeader.propTypes = {
733
814
  icon: PropTypes.string.isRequired,
734
815
  title: PropTypes.string.isRequired,
735
816
  description: PropTypes.string.isRequired,
817
+ count: PropTypes.number.isRequired,
818
+ collapsed: PropTypes.bool.isRequired,
819
+ onToggle: PropTypes.func.isRequired,
736
820
  children: PropTypes.node,
737
821
  };
738
822
 
739
- function ProviderCard({ providerId, provider, stats, authType, onToggle }) {
823
+ function ProviderCard({ providerId, provider, stats, onToggle }) {
740
824
  const { connected, error, errorCode, allDisabled } = stats;
741
825
  const isNoAuth = !!provider.noAuth;
742
- const isReady = !allDisabled && (connected > 0 || isNoAuth);
743
-
744
- const dotColors = {
745
- free: "bg-green-500",
746
- oauth: "bg-blue-500",
747
- apikey: "bg-amber-500",
748
- compatible: "bg-orange-500",
749
- };
750
- const dotLabels = {
751
- free: "Free",
752
- oauth: "OAuth",
753
- apikey: "API Key",
754
- compatible: "Compatible",
755
- };
756
826
 
757
827
  return (
758
828
  <Link href={`/dashboard/providers/${providerId}`} className="group min-w-0">
759
829
  <Card
760
830
  padding="none"
761
- className={`relative h-[82px] min-h-[82px] cursor-pointer overflow-hidden transition-[border-color,box-shadow,opacity] sm:h-[94px] sm:min-h-[94px] ${
762
- isReady
763
- ? "border-success/25 bg-linear-to-br from-success/[0.045] to-transparent"
764
- : "group-hover:border-primary/25"
765
- } ${allDisabled ? "opacity-55" : ""}`}
831
+ className={`relative h-[76px] min-h-[76px] cursor-pointer overflow-hidden transition-[border-color,box-shadow,opacity] group-hover:border-primary/30 group-hover:shadow-[0_10px_26px_-22px_rgba(229,106,74,0.55)] sm:h-[78px] sm:min-h-[78px] ${allDisabled ? "opacity-55" : ""}`}
766
832
  >
767
- {isReady && <span className="absolute inset-y-3 left-0 w-0.5 rounded-r-full bg-success" />}
768
- <div className="flex h-full min-w-0 items-center justify-between gap-3 p-3.5">
769
- <div className="flex min-w-0 items-center gap-3">
833
+ <div className="flex h-full min-w-0 items-center justify-between gap-2.5 p-3">
834
+ <div className="flex min-w-0 items-center gap-2.5">
770
835
  <div
771
- className="flex size-10 shrink-0 items-center justify-center rounded-xl ring-1 ring-black/[0.04] dark:ring-white/[0.06]"
836
+ className="flex size-9 shrink-0 items-center justify-center rounded-lg ring-1 ring-black/[0.04] dark:ring-white/[0.06]"
772
837
  style={{
773
838
  backgroundColor: `${provider.color?.length > 7 ? provider.color : provider.color + "15"}`,
774
839
  }}
@@ -776,8 +841,8 @@ function ProviderCard({ providerId, provider, stats, authType, onToggle }) {
776
841
  <ProviderIcon
777
842
  src={`/providers/${provider.id}.png`}
778
843
  alt=""
779
- size={30}
780
- className="max-h-[32px] max-w-[32px] rounded-lg object-contain"
844
+ size={28}
845
+ className="max-h-7 max-w-7 rounded-md object-contain"
781
846
  fallbackText={
782
847
  provider.textIcon || provider.id.slice(0, 2).toUpperCase()
783
848
  }
@@ -786,26 +851,19 @@ function ProviderCard({ providerId, provider, stats, authType, onToggle }) {
786
851
  </div>
787
852
  <div className="min-w-0">
788
853
  <h3 className="truncate text-sm font-semibold text-text-main">{provider.name}</h3>
789
- <div className="mt-1 flex min-w-0 items-center gap-1.5 overflow-hidden whitespace-nowrap text-xs">
790
- <span className="inline-flex items-center gap-1 text-[10px] font-medium text-text-muted">
791
- <span aria-hidden="true" className={`size-1.5 rounded-full ${dotColors[authType] || "bg-text-muted"}`} />
792
- {dotLabels[authType] || "Provider"}
793
- </span>
854
+ <div className="mt-1 flex min-w-0 items-center overflow-hidden whitespace-nowrap">
794
855
  {allDisabled ? (
795
- <Badge variant="default" size="sm">
796
- <span className="flex items-center gap-1">
797
- <span className="material-symbols-outlined text-[12px]">
798
- pause_circle
799
- </span>
800
- Disabled
801
- </span>
802
- </Badge>
856
+ <span className="inline-flex items-center gap-1 text-[11px] text-text-muted">
857
+ <span aria-hidden="true" className="material-symbols-outlined text-[13px]">pause_circle</span>
858
+ Disabled
859
+ </span>
803
860
  ) : isNoAuth ? (
804
- <Badge variant="success" size="sm" dot>Ready</Badge>
861
+ <span className="inline-flex items-center gap-1.5 text-[11px] font-medium text-success">
862
+ <span aria-hidden="true" className="size-1.5 rounded-full bg-success" />
863
+ Ready
864
+ </span>
805
865
  ) : (
806
- <>
807
- {getStatusDisplay(connected, error, errorCode)}
808
- </>
866
+ getStatusDisplay(connected, error, errorCode)
809
867
  )}
810
868
  </div>
811
869
  </div>
@@ -822,13 +880,14 @@ function ProviderCard({ providerId, provider, stats, authType, onToggle }) {
822
880
  >
823
881
  <Toggle
824
882
  size="sm"
883
+ touchTarget
825
884
  checked={!allDisabled}
826
885
  onChange={() => {}}
827
886
  title={allDisabled ? "Enable provider" : "Disable provider"}
828
887
  />
829
888
  </div>
830
889
  )}
831
- <span aria-hidden="true" className="material-symbols-outlined text-[18px] text-text-subtle transition-[transform,color] group-hover:translate-x-0.5 group-hover:text-primary">
890
+ <span aria-hidden="true" className="material-symbols-outlined text-[17px] text-text-subtle transition-[transform,color] group-hover:translate-x-0.5 group-hover:text-primary">
832
891
  chevron_right
833
892
  </span>
834
893
  </div>
@@ -854,7 +913,6 @@ ProviderCard.propTypes = {
854
913
  total: PropTypes.number,
855
914
  allDisabled: PropTypes.bool,
856
915
  }).isRequired,
857
- authType: PropTypes.string,
858
916
  onToggle: PropTypes.func,
859
917
  };
860
918
 
@@ -862,29 +920,14 @@ function ApiKeyProviderCard({
862
920
  providerId,
863
921
  provider,
864
922
  stats,
865
- authType,
866
923
  onToggle,
867
924
  }) {
868
925
  const { connected, error, errorCode, allDisabled } = stats;
869
- const isReady = !allDisabled && connected > 0;
870
926
  const isCompatible = providerId.startsWith(OPENAI_COMPATIBLE_PREFIX);
871
927
  const isAnthropicCompatible = providerId.startsWith(
872
928
  ANTHROPIC_COMPATIBLE_PREFIX,
873
929
  );
874
930
 
875
- const dotColors = {
876
- free: "bg-green-500",
877
- oauth: "bg-blue-500",
878
- apikey: "bg-amber-500",
879
- compatible: "bg-orange-500",
880
- };
881
- const dotLabels = {
882
- free: "Free",
883
- oauth: "OAuth",
884
- apikey: "API Key",
885
- compatible: "Compatible",
886
- };
887
-
888
931
  const getIconPath = () => {
889
932
  if (provider.id === "featherless") return null;
890
933
  if (isCompatible)
@@ -899,17 +942,12 @@ function ApiKeyProviderCard({
899
942
  <Link href={`/dashboard/providers/${providerId}`} className="group min-w-0">
900
943
  <Card
901
944
  padding="none"
902
- className={`relative h-[82px] min-h-[82px] cursor-pointer overflow-hidden transition-[border-color,box-shadow,opacity] sm:h-[94px] sm:min-h-[94px] ${
903
- isReady
904
- ? "border-success/25 bg-linear-to-br from-success/[0.045] to-transparent"
905
- : "group-hover:border-primary/25"
906
- } ${allDisabled ? "opacity-55" : ""}`}
945
+ className={`relative h-[76px] min-h-[76px] cursor-pointer overflow-hidden transition-[border-color,box-shadow,opacity] group-hover:border-primary/30 group-hover:shadow-[0_10px_26px_-22px_rgba(229,106,74,0.55)] sm:h-[78px] sm:min-h-[78px] ${allDisabled ? "opacity-55" : ""}`}
907
946
  >
908
- {isReady && <span className="absolute inset-y-3 left-0 w-0.5 rounded-r-full bg-success" />}
909
- <div className="flex h-full min-w-0 items-center justify-between gap-3 p-3.5">
910
- <div className="flex min-w-0 items-center gap-3">
947
+ <div className="flex h-full min-w-0 items-center justify-between gap-2.5 p-3">
948
+ <div className="flex min-w-0 items-center gap-2.5">
911
949
  <div
912
- className="flex size-10 shrink-0 items-center justify-center rounded-xl ring-1 ring-black/[0.04] dark:ring-white/[0.06]"
950
+ className="flex size-9 shrink-0 items-center justify-center rounded-lg ring-1 ring-black/[0.04] dark:ring-white/[0.06]"
913
951
  style={{
914
952
  backgroundColor: `${provider.color?.length > 7 ? provider.color : provider.color + "15"}`,
915
953
  }}
@@ -917,8 +955,8 @@ function ApiKeyProviderCard({
917
955
  <ProviderIcon
918
956
  src={getIconPath()}
919
957
  alt=""
920
- size={30}
921
- className="max-h-[32px] max-w-[32px] rounded-lg object-contain"
958
+ size={28}
959
+ className="max-h-7 max-w-7 rounded-md object-contain"
922
960
  fallbackText={
923
961
  provider.textIcon || provider.id.slice(0, 2).toUpperCase()
924
962
  }
@@ -927,34 +965,22 @@ function ApiKeyProviderCard({
927
965
  </div>
928
966
  <div className="min-w-0">
929
967
  <h3 className="truncate text-sm font-semibold text-text-main">{provider.name}</h3>
930
- <div className="mt-1 flex min-w-0 items-center gap-1.5 overflow-hidden whitespace-nowrap text-xs">
931
- <span className="inline-flex items-center gap-1 text-[10px] font-medium text-text-muted">
932
- <span aria-hidden="true" className={`size-1.5 rounded-full ${dotColors[authType] || "bg-text-muted"}`} />
933
- {dotLabels[authType] || "Provider"}
934
- </span>
968
+ <div className="mt-1 flex min-w-0 items-center gap-1.5 overflow-hidden whitespace-nowrap">
935
969
  {allDisabled ? (
936
- <Badge variant="default" size="sm">
937
- <span className="flex items-center gap-1">
938
- <span className="material-symbols-outlined text-[12px]">
939
- pause_circle
940
- </span>
941
- Disabled
942
- </span>
943
- </Badge>
970
+ <span className="inline-flex items-center gap-1 text-[11px] text-text-muted">
971
+ <span aria-hidden="true" className="material-symbols-outlined text-[13px]">pause_circle</span>
972
+ Disabled
973
+ </span>
944
974
  ) : (
945
975
  <>
946
976
  {getStatusDisplay(connected, error, errorCode)}
947
977
  {isCompatible && (
948
- <Badge variant="default" size="sm">
949
- {provider.apiType === "responses"
950
- ? "Responses"
951
- : "Chat"}
952
- </Badge>
978
+ <span className="text-[10px] text-text-subtle">
979
+ · {provider.apiType === "responses" ? "Responses" : "Chat"}
980
+ </span>
953
981
  )}
954
982
  {isAnthropicCompatible && (
955
- <Badge variant="default" size="sm">
956
- Messages
957
- </Badge>
983
+ <span className="text-[10px] text-text-subtle">· Messages</span>
958
984
  )}
959
985
  </>
960
986
  )}
@@ -973,13 +999,14 @@ function ApiKeyProviderCard({
973
999
  >
974
1000
  <Toggle
975
1001
  size="sm"
1002
+ touchTarget
976
1003
  checked={!allDisabled}
977
1004
  onChange={() => {}}
978
1005
  title={allDisabled ? "Enable provider" : "Disable provider"}
979
1006
  />
980
1007
  </div>
981
1008
  )}
982
- <span aria-hidden="true" className="material-symbols-outlined text-[18px] text-text-subtle transition-[transform,color] group-hover:translate-x-0.5 group-hover:text-primary">
1009
+ <span aria-hidden="true" className="material-symbols-outlined text-[17px] text-text-subtle transition-[transform,color] group-hover:translate-x-0.5 group-hover:text-primary">
983
1010
  chevron_right
984
1011
  </span>
985
1012
  </div>
@@ -1006,7 +1033,6 @@ ApiKeyProviderCard.propTypes = {
1006
1033
  total: PropTypes.number,
1007
1034
  allDisabled: PropTypes.bool,
1008
1035
  }).isRequired,
1009
- authType: PropTypes.string,
1010
1036
  onToggle: PropTypes.func,
1011
1037
  };
1012
1038