zevairouter 1.0.146 → 1.0.148

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 (345) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/cli/app/.next-cli-build/BUILD_ID +1 -1
  3. package/cli/app/.next-cli-build/app-path-routes-manifest.json +8 -8
  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 +8 -8
  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/4566.js +1 -1
  300. package/cli/app/.next-cli-build/server/chunks/4746.js +1 -1
  301. package/cli/app/.next-cli-build/server/chunks/5307.js +1 -1
  302. package/cli/app/.next-cli-build/server/chunks/5469.js +1 -1
  303. package/cli/app/.next-cli-build/server/chunks/5949.js +3 -3
  304. package/cli/app/.next-cli-build/server/chunks/8242.js +2 -2
  305. package/cli/app/.next-cli-build/server/chunks/8306.js +1 -1
  306. package/cli/app/.next-cli-build/server/chunks/8371.js +1 -1
  307. package/cli/app/.next-cli-build/server/chunks/9621.js +1 -1
  308. package/cli/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
  309. package/cli/app/.next-cli-build/server/pages/404.html +1 -1
  310. package/cli/app/.next-cli-build/server/pages/500.html +1 -1
  311. package/cli/app/.next-cli-build/static/chunks/523-176a0660a9383518.js +3 -0
  312. package/cli/app/.next-cli-build/static/chunks/5497-8d0ec2995dc0a392.js +7 -0
  313. package/cli/app/.next-cli-build/static/chunks/{620-cc65df39cb93df1c.js → 620-16902cd352ef1d97.js} +1 -1
  314. package/cli/app/.next-cli-build/static/chunks/9126-7d5476f17beddfb0.js +1 -0
  315. package/cli/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/page-2468e6ba8d1efeec.js +1 -0
  316. package/cli/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/quota/page-579bf915396efc69.js +1 -0
  317. package/cli/app/.next-cli-build/static/css/87ffa46afc2273f4.css +1 -0
  318. package/cli/app/CHANGELOG.md +22 -0
  319. package/cli/app/cli/hooks/cloakbrowserRuntime.js +111 -4
  320. package/cli/app/package.json +1 -1
  321. package/cli/hooks/cloakbrowserRuntime.js +111 -4
  322. package/cli/package.json +1 -1
  323. package/package.json +1 -1
  324. package/src/app/(dashboard)/dashboard/basic-chat/BasicChatPageClient.js +91 -38
  325. package/src/app/(dashboard)/dashboard/endpoint/EndpointPageClient.js +45 -38
  326. package/src/app/(dashboard)/dashboard/providers/page.js +136 -36
  327. package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/QuotaTable.js +15 -9
  328. package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/index.js +188 -120
  329. package/src/app/(dashboard)/dashboard/usage/components/ProviderTopology.js +128 -3
  330. package/src/lib/oauth/services/bulkImportBrowserEngine.js +36 -0
  331. package/src/lib/oauth/services/codebuddyCnBulkImportManager.js +469 -172
  332. package/src/lib/oauth/services/codebuddyCnPhoneAutomation.js +16 -2
  333. package/src/lib/oauth/services/kiroBulkImportManager.js +7 -1
  334. package/src/shared/components/Header.js +4 -4
  335. package/src/shared/components/HeaderLanguage.js +2 -1
  336. package/src/shared/components/HeaderMenu.js +2 -1
  337. package/src/shared/components/Toggle.js +28 -12
  338. package/cli/app/.next-cli-build/static/chunks/523-078802482e95c757.js +0 -3
  339. package/cli/app/.next-cli-build/static/chunks/5497-7f6609cd427c6525.js +0 -7
  340. package/cli/app/.next-cli-build/static/chunks/9126-9e1755f122b943cd.js +0 -1
  341. package/cli/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/page-847b19cd29966941.js +0 -1
  342. package/cli/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/quota/page-6050ac2547c62b54.js +0 -1
  343. package/cli/app/.next-cli-build/static/css/1472cd17dfd55a13.css +0 -1
  344. /package/cli/app/.next-cli-build/static/{DeFI037NxtdV4EpLD2ihz → kmlfntQuBCJ_ni8__OiKd}/_buildManifest.js +0 -0
  345. /package/cli/app/.next-cli-build/static/{DeFI037NxtdV4EpLD2ihz → kmlfntQuBCJ_ni8__OiKd}/_ssgManifest.js +0 -0
@@ -95,6 +95,12 @@ function getConnectionErrorTag(connection) {
95
95
 
96
96
  const PROVIDERS_DEFAULT_PAGE_SIZE = 20;
97
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
+ ];
98
104
 
99
105
  async function fetchJsonWithTimeout(url) {
100
106
  const controller = new AbortController();
@@ -129,6 +135,13 @@ export default function ProvidersPage() {
129
135
  useState(false);
130
136
  const [testingMode, setTestingMode] = useState(null);
131
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
+ });
132
145
  const notify = useNotificationStore();
133
146
  const searchQuery = useHeaderSearchStore((s) => s.query);
134
147
  const registerSearch = useHeaderSearchStore((s) => s.register);
@@ -142,7 +155,7 @@ export default function ProvidersPage() {
142
155
  useEffect(() => {
143
156
  // eslint-disable-next-line react-hooks/set-state-in-effect -- pagination reset: returns to page 1 when search query or page size changes
144
157
  setApikeyPage(1);
145
- }, [searchQuery, apikeyPageSize]);
158
+ }, [searchQuery, apikeyPageSize, statusFilter]);
146
159
 
147
160
  const matchSearch = (name) =>
148
161
  !searchQuery.trim() ||
@@ -158,16 +171,6 @@ export default function ProvidersPage() {
158
171
  return (a.name || "").localeCompare(b.name || "");
159
172
  });
160
173
 
161
- const sortItemsByPriority = (items, authType) =>
162
- [...items].sort((a, b) => {
163
- const sa = getProviderStats(a.id, authType);
164
- const sb = getProviderStats(b.id, authType);
165
- const ca = sa.connected > 0 ? 1 : 0;
166
- const cb = sb.connected > 0 ? 1 : 0;
167
- if (ca !== cb) return cb - ca;
168
- return (a.name || "").localeCompare(b.name || "");
169
- });
170
-
171
174
  useEffect(() => {
172
175
  const fetchData = async () => {
173
176
  try {
@@ -266,6 +269,21 @@ export default function ProvidersPage() {
266
269
  return { connected, error, total, errorCode, errorTime, allDisabled };
267
270
  };
268
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
+
269
287
  // Toggle all connections for a provider on/off
270
288
  const handleToggleProvider = async (providerId, authType, newActive) => {
271
289
  const providerConns = connections.filter(
@@ -323,7 +341,7 @@ export default function ProvidersPage() {
323
341
  textIcon: "OC",
324
342
  apiType: node.apiType,
325
343
  }))
326
- .filter((p) => matchSearch(p.name));
344
+ .filter((p) => matchSearch(p.name) && matchesStatusFilter(p.id, p, "apikey"));
327
345
 
328
346
  const anthropicCompatibleProviders = providerNodes
329
347
  .filter((node) => node.type === "anthropic-compatible")
@@ -333,23 +351,28 @@ export default function ProvidersPage() {
333
351
  color: "#D97757",
334
352
  textIcon: "AC",
335
353
  }))
336
- .filter((p) => matchSearch(p.name));
354
+ .filter((p) => matchSearch(p.name) && matchesStatusFilter(p.id, p, "apikey"));
337
355
 
338
356
  const oauthEntries = Object.entries(OAUTH_PROVIDERS).filter(
339
- ([, info]) => !info.hidden && matchSearch(info.name),
357
+ ([key, info]) => !info.hidden && matchSearch(info.name) && matchesStatusFilter(key, info, "oauth"),
340
358
  );
341
359
  const freeEntries = Object.entries(FREE_PROVIDERS).filter(
342
- ([, 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
+ },
343
365
  );
344
366
  const freeTierEntries = Object.entries(FREE_TIER_PROVIDERS).filter(
345
- ([, info]) => !info.hidden && matchSearch(info.name),
367
+ ([key, info]) => !info.hidden && matchSearch(info.name) && matchesStatusFilter(key, info, "apikey"),
346
368
  );
347
369
  const apikeyEntries = sortByPriority(
348
370
  Object.entries(APIKEY_PROVIDERS).filter(
349
- ([, info]) =>
371
+ ([key, info]) =>
350
372
  !info.hidden &&
351
373
  (info.serviceKinds ?? ["llm"]).includes("llm") &&
352
- matchSearch(info.name),
374
+ matchSearch(info.name) &&
375
+ matchesStatusFilter(key, info, "apikey"),
353
376
  ),
354
377
  "apikey",
355
378
  );
@@ -376,6 +399,10 @@ export default function ProvidersPage() {
376
399
  apikeyEntries.length > 0 ||
377
400
  compatibleProviders.length > 0 ||
378
401
  anthropicCompatibleProviders.length > 0;
402
+ const showCustomSection =
403
+ compatibleProviders.length > 0 ||
404
+ anthropicCompatibleProviders.length > 0 ||
405
+ (statusFilter === "all" && !searchQuery.trim());
379
406
 
380
407
  return (
381
408
  <div className="flex min-w-0 flex-col gap-6 px-1 sm:px-0">
@@ -415,28 +442,54 @@ export default function ProvidersPage() {
415
442
  </div>
416
443
  )}
417
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
+
418
465
  {!hasAnyResult && (
419
466
  <div className="text-center py-8 border border-dashed border-border rounded-xl">
420
467
  <span className="material-symbols-outlined text-[32px] text-text-muted mb-2">
421
468
  search_off
422
469
  </span>
423
- <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>
424
473
  </div>
425
474
  )}
426
475
 
427
476
  {/* Custom Providers (OpenAI/Anthropic Compatible) — dynamic */}
477
+ {showCustomSection && (
428
478
  <div className="flex flex-col gap-4">
429
479
  <ProviderSectionHeader
430
480
  icon="extension"
431
481
  title="Custom Providers"
432
482
  description="OpenAI and Anthropic-compatible endpoints"
483
+ count={compatibleProviders.length + anthropicCompatibleProviders.length}
484
+ collapsed={collapsedSections.custom && !searchQuery.trim()}
485
+ onToggle={() => toggleSection("custom")}
433
486
  >
434
487
  <div className="grid grid-cols-1 gap-2 sm:flex sm:w-auto">
435
488
  <Button
436
489
  size="sm"
437
490
  icon="add"
438
491
  onClick={() => setShowAddAnthropicCompatibleModal(true)}
439
- className="w-full sm:w-auto"
492
+ className="min-h-11 w-full sm:min-h-0 sm:w-auto"
440
493
  >
441
494
  Add Anthropic Compatible
442
495
  </Button>
@@ -445,12 +498,13 @@ export default function ProvidersPage() {
445
498
  variant="secondary"
446
499
  icon="add"
447
500
  onClick={() => setShowAddCompatibleModal(true)}
448
- className="w-full sm:w-auto"
501
+ className="min-h-11 w-full sm:min-h-0 sm:w-auto"
449
502
  >
450
503
  Add OpenAI Compatible
451
504
  </Button>
452
505
  </div>
453
506
  </ProviderSectionHeader>
507
+ <div className={collapsedSections.custom && !searchQuery.trim() ? "hidden sm:block" : ""}>
454
508
  {compatibleProviders.length === 0 &&
455
509
  anthropicCompatibleProviders.length === 0 ? (
456
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">
@@ -477,7 +531,9 @@ export default function ProvidersPage() {
477
531
  )}
478
532
  </div>
479
533
  )}
534
+ </div>
480
535
  </div>
536
+ )}
481
537
 
482
538
  {/* OAuth Providers */}
483
539
  {oauthEntries.length > 0 && (
@@ -486,13 +542,16 @@ export default function ProvidersPage() {
486
542
  icon="passkey"
487
543
  title="OAuth Providers"
488
544
  description="Connect existing provider accounts securely"
545
+ count={oauthEntries.length}
546
+ collapsed={collapsedSections.oauth && !searchQuery.trim()}
547
+ onToggle={() => toggleSection("oauth")}
489
548
  >
490
549
  <div className="flex w-full flex-col gap-2 sm:w-auto sm:flex-row sm:items-center">
491
550
  <ModelAvailabilityBadge />
492
551
  <button
493
552
  onClick={() => handleBatchTest("oauth")}
494
553
  disabled={!!testingMode}
495
- 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 ${
496
555
  testingMode === "oauth"
497
556
  ? "bg-primary/20 border-primary/40 text-primary animate-pulse"
498
557
  : "bg-bg border-border text-text-muted hover:text-text-main hover:border-primary/40"
@@ -509,7 +568,7 @@ export default function ProvidersPage() {
509
568
  </button>
510
569
  </div>
511
570
  </ProviderSectionHeader>
512
- <div className="grid grid-cols-1 gap-2.5 sm:grid-cols-2 sm:gap-3 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`}>
513
572
  {oauthEntries.map(([key, info]) => (
514
573
  <ProviderCard
515
574
  key={key}
@@ -530,11 +589,14 @@ export default function ProvidersPage() {
530
589
  icon="savings"
531
590
  title="Free Tier Providers"
532
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")}
533
595
  >
534
596
  <button
535
597
  onClick={() => handleBatchTest("free")}
536
598
  disabled={!!testingMode}
537
- 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 ${
538
600
  testingMode === "free"
539
601
  ? "bg-primary/20 border-primary/40 text-primary animate-pulse"
540
602
  : "bg-bg border-border text-text-muted hover:text-text-main hover:border-primary/40"
@@ -550,7 +612,7 @@ export default function ProvidersPage() {
550
612
  {testingMode === "free" ? "Testing..." : "Test All"}
551
613
  </button>
552
614
  </ProviderSectionHeader>
553
- <div className="grid grid-cols-1 gap-2.5 sm:grid-cols-2 sm:gap-3 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`}>
554
616
  {freeEntries.map(([key, info]) => {
555
617
  const hasApiKeyMode = Array.isArray(info?.authModes) && info.authModes.includes("apikey");
556
618
  const statAuthTypes = hasApiKeyMode ? ["oauth", "apikey"] : "oauth";
@@ -584,11 +646,14 @@ export default function ProvidersPage() {
584
646
  icon="key"
585
647
  title="API Key Providers"
586
648
  description="Bring your own provider credentials"
649
+ count={apikeyEntries.length}
650
+ collapsed={collapsedSections.apikey && !searchQuery.trim()}
651
+ onToggle={() => toggleSection("apikey")}
587
652
  >
588
653
  <button
589
654
  onClick={() => handleBatchTest("apikey")}
590
655
  disabled={!!testingMode}
591
- 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 ${
592
657
  testingMode === "apikey"
593
658
  ? "bg-primary/20 border-primary/40 text-primary animate-pulse"
594
659
  : "bg-bg border-border text-text-muted hover:text-text-main hover:border-primary/40"
@@ -604,7 +669,7 @@ export default function ProvidersPage() {
604
669
  {testingMode === "apikey" ? "Testing..." : "Test All"}
605
670
  </button>
606
671
  </ProviderSectionHeader>
607
- <div className="grid grid-cols-1 gap-2.5 sm:grid-cols-2 sm:gap-3 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`}>
608
673
  {visibleApikeyEntries.map(([key, info]) => (
609
674
  <ApiKeyProviderCard
610
675
  key={key}
@@ -616,6 +681,7 @@ export default function ProvidersPage() {
616
681
  ))}
617
682
  </div>
618
683
  {apikeyEntries.length > 0 && (
684
+ <div className={collapsedSections.apikey && !searchQuery.trim() ? "hidden sm:block" : ""}>
619
685
  <Pagination
620
686
  currentPage={activeApikeyPage}
621
687
  pageSize={apikeyPageSize}
@@ -626,6 +692,7 @@ export default function ProvidersPage() {
626
692
  setApikeyPage(1);
627
693
  }}
628
694
  />
695
+ </div>
629
696
  )}
630
697
  </div>
631
698
  )}
@@ -698,19 +765,47 @@ export default function ProvidersPage() {
698
765
  );
699
766
  }
700
767
 
701
- function ProviderSectionHeader({ icon, title, description, children }) {
768
+ function ProviderSectionHeader({
769
+ icon,
770
+ title,
771
+ description,
772
+ count,
773
+ collapsed,
774
+ onToggle,
775
+ children,
776
+ }) {
702
777
  return (
703
778
  <div className="flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between">
704
- <div className="flex min-w-0 items-center gap-2.5">
705
- <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">
706
- {icon}
707
- </span>
708
- <div className="min-w-0">
709
- <h2 className="text-lg font-semibold leading-tight">{title}</h2>
710
- <p className="mt-0.5 text-[11px] text-text-muted sm:text-xs">{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>
711
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>
712
805
  </div>
713
- {children}
806
+ {children && (
807
+ <div className={collapsed ? "hidden sm:block" : "block"}>{children}</div>
808
+ )}
714
809
  </div>
715
810
  );
716
811
  }
@@ -719,6 +814,9 @@ ProviderSectionHeader.propTypes = {
719
814
  icon: PropTypes.string.isRequired,
720
815
  title: PropTypes.string.isRequired,
721
816
  description: PropTypes.string.isRequired,
817
+ count: PropTypes.number.isRequired,
818
+ collapsed: PropTypes.bool.isRequired,
819
+ onToggle: PropTypes.func.isRequired,
722
820
  children: PropTypes.node,
723
821
  };
724
822
 
@@ -782,6 +880,7 @@ function ProviderCard({ providerId, provider, stats, onToggle }) {
782
880
  >
783
881
  <Toggle
784
882
  size="sm"
883
+ touchTarget
785
884
  checked={!allDisabled}
786
885
  onChange={() => {}}
787
886
  title={allDisabled ? "Enable provider" : "Disable provider"}
@@ -900,6 +999,7 @@ function ApiKeyProviderCard({
900
999
  >
901
1000
  <Toggle
902
1001
  size="sm"
1002
+ touchTarget
903
1003
  checked={!allDisabled}
904
1004
  onChange={() => {}}
905
1005
  title={allDisabled ? "Enable provider" : "Disable provider"}
@@ -89,6 +89,8 @@ export default function QuotaTable({
89
89
  compact = false,
90
90
  sortMode = "default",
91
91
  showSortLabel = false,
92
+ paginate = true,
93
+ totalCount,
92
94
  }) {
93
95
  const [page, setPage] = useState(1);
94
96
 
@@ -106,7 +108,9 @@ export default function QuotaTable({
106
108
  [normalizedQuotas, sortMode],
107
109
  );
108
110
 
109
- const totalPages = Math.max(1, Math.ceil(sortedQuotas.length / PAGE_SIZE));
111
+ const totalPages = paginate
112
+ ? Math.max(1, Math.ceil(sortedQuotas.length / PAGE_SIZE))
113
+ : 1;
110
114
 
111
115
  useEffect(() => {
112
116
  // eslint-disable-next-line react-hooks/set-state-in-effect -- pagination reset: returns to page 1 when sort mode or data changes
@@ -122,12 +126,14 @@ export default function QuotaTable({
122
126
  return null;
123
127
  }
124
128
 
125
- const currentPageRows = sortedQuotas.slice(
126
- (page - 1) * PAGE_SIZE,
127
- page * PAGE_SIZE,
128
- );
129
+ const currentPageRows = paginate
130
+ ? sortedQuotas.slice((page - 1) * PAGE_SIZE, page * PAGE_SIZE)
131
+ : sortedQuotas;
129
132
  const pageStart = sortedQuotas.length === 0 ? 0 : (page - 1) * PAGE_SIZE + 1;
130
- const pageEnd = Math.min(page * PAGE_SIZE, sortedQuotas.length);
133
+ const pageEnd = paginate
134
+ ? Math.min(page * PAGE_SIZE, sortedQuotas.length)
135
+ : sortedQuotas.length;
136
+ const displayedTotal = Number.isFinite(totalCount) ? totalCount : sortedQuotas.length;
131
137
 
132
138
  const cellPad = compact ? "py-1 px-1.5" : "py-2 px-3";
133
139
  const nameText = compact ? "text-[11px]" : "text-sm";
@@ -139,7 +145,7 @@ export default function QuotaTable({
139
145
  <div className="space-y-2">
140
146
  <div className="flex items-center justify-between gap-2">
141
147
  <div className="text-[10px] text-text-muted">
142
- {sortedQuotas.length} quota{sortedQuotas.length > 1 ? "s" : ""}
148
+ {displayedTotal} quota{displayedTotal > 1 ? "s" : ""}
143
149
  </div>
144
150
  {showSortLabel && (
145
151
  <div className="rounded-md border border-black/10 bg-black/[0.02] px-2 py-1 text-[10px] text-text-muted dark:border-white/10 dark:bg-white/[0.03]">
@@ -243,7 +249,7 @@ export default function QuotaTable({
243
249
  type="button"
244
250
  onClick={() => setPage((currentPage) => Math.max(1, currentPage - 1))}
245
251
  disabled={page === 1}
246
- className="flex h-6 items-center rounded-md border border-black/10 px-2 text-[10px] text-text-primary transition-colors hover:bg-black/5 disabled:cursor-not-allowed disabled:opacity-40 dark:border-white/10 dark:hover:bg-white/5"
252
+ className="flex h-11 items-center rounded-lg border border-black/10 px-3 text-xs text-text-primary transition-colors hover:bg-black/5 disabled:cursor-not-allowed disabled:opacity-40 dark:border-white/10 dark:hover:bg-white/5 sm:h-7 sm:rounded-md sm:px-2 sm:text-[10px]"
247
253
  >
248
254
  Prev
249
255
  </button>
@@ -251,7 +257,7 @@ export default function QuotaTable({
251
257
  type="button"
252
258
  onClick={() => setPage((currentPage) => Math.min(totalPages, currentPage + 1))}
253
259
  disabled={page === totalPages}
254
- className="flex h-6 items-center rounded-md border border-black/10 px-2 text-[10px] text-text-primary transition-colors hover:bg-black/5 disabled:cursor-not-allowed disabled:opacity-40 dark:border-white/10 dark:hover:bg-white/5"
260
+ className="flex h-11 items-center rounded-lg border border-black/10 px-3 text-xs text-text-primary transition-colors hover:bg-black/5 disabled:cursor-not-allowed disabled:opacity-40 dark:border-white/10 dark:hover:bg-white/5 sm:h-7 sm:rounded-md sm:px-2 sm:text-[10px]"
255
261
  >
256
262
  Next
257
263
  </button>