ktrouter 1.0.4 → 1.0.5

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 (268) hide show
  1. package/app/.next/BUILD_ID +1 -1
  2. package/app/.next/app-path-routes-manifest.json +1 -1
  3. package/app/.next/build-manifest.json +2 -2
  4. package/app/.next/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
  5. package/app/.next/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
  6. package/app/.next/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  7. package/app/.next/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  8. package/app/.next/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
  9. package/app/.next/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  10. package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
  11. package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
  12. package/app/.next/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
  13. package/app/.next/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
  14. package/app/.next/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
  15. package/app/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  16. package/app/.next/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  17. package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  18. package/app/.next/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  19. package/app/.next/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  20. package/app/.next/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
  21. package/app/.next/server/app/(dashboard)/dashboard/quota/page.js +1 -1
  22. package/app/.next/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  23. package/app/.next/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
  24. package/app/.next/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  25. package/app/.next/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  26. package/app/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  27. package/app/.next/server/app/_global-error.html +1 -1
  28. package/app/.next/server/app/_global-error.rsc +1 -1
  29. package/app/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  30. package/app/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  31. package/app/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  32. package/app/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  33. package/app/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  34. package/app/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  35. package/app/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  36. package/app/.next/server/app/_not-found.html +1 -1
  37. package/app/.next/server/app/_not-found.rsc +3 -3
  38. package/app/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  39. package/app/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  40. package/app/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  41. package/app/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  42. package/app/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  43. package/app/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  44. package/app/.next/server/app/api/models/route.js +1 -1
  45. package/app/.next/server/app/api/models/test/route.js +1 -1
  46. package/app/.next/server/app/api/providers/[id]/test-models/route.js +1 -1
  47. package/app/.next/server/app/api/providers/route.js +1 -1
  48. package/app/.next/server/app/api/translator/console-logs/route.js +1 -1
  49. package/app/.next/server/app/api/translator/console-logs/stream/route.js +1 -1
  50. package/app/.next/server/app/api/update/check/route.js +1 -1
  51. package/app/.next/server/app/api/usage/[connectionId]/route.js +1 -1
  52. package/app/.next/server/app/callback/page_client-reference-manifest.js +1 -1
  53. package/app/.next/server/app/callback.html +1 -1
  54. package/app/.next/server/app/callback.rsc +3 -3
  55. package/app/.next/server/app/callback.segments/_full.segment.rsc +3 -3
  56. package/app/.next/server/app/callback.segments/_head.segment.rsc +1 -1
  57. package/app/.next/server/app/callback.segments/_index.segment.rsc +3 -3
  58. package/app/.next/server/app/callback.segments/_tree.segment.rsc +1 -1
  59. package/app/.next/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
  60. package/app/.next/server/app/callback.segments/callback.segment.rsc +1 -1
  61. package/app/.next/server/app/dashboard/basic-chat.html +1 -1
  62. package/app/.next/server/app/dashboard/basic-chat.rsc +5 -5
  63. package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
  64. package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
  65. package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  66. package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  67. package/app/.next/server/app/dashboard/basic-chat.segments/_full.segment.rsc +5 -5
  68. package/app/.next/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
  69. package/app/.next/server/app/dashboard/basic-chat.segments/_index.segment.rsc +3 -3
  70. package/app/.next/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +1 -1
  71. package/app/.next/server/app/dashboard/cli-tools.html +1 -1
  72. package/app/.next/server/app/dashboard/cli-tools.rsc +5 -5
  73. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
  74. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
  75. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  76. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  77. package/app/.next/server/app/dashboard/cli-tools.segments/_full.segment.rsc +5 -5
  78. package/app/.next/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
  79. package/app/.next/server/app/dashboard/cli-tools.segments/_index.segment.rsc +3 -3
  80. package/app/.next/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +1 -1
  81. package/app/.next/server/app/dashboard/combos.html +1 -1
  82. package/app/.next/server/app/dashboard/combos.rsc +5 -5
  83. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
  84. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
  85. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  86. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  87. package/app/.next/server/app/dashboard/combos.segments/_full.segment.rsc +5 -5
  88. package/app/.next/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
  89. package/app/.next/server/app/dashboard/combos.segments/_index.segment.rsc +3 -3
  90. package/app/.next/server/app/dashboard/combos.segments/_tree.segment.rsc +1 -1
  91. package/app/.next/server/app/dashboard/endpoint.html +1 -1
  92. package/app/.next/server/app/dashboard/endpoint.rsc +5 -5
  93. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
  94. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
  95. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  96. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  97. package/app/.next/server/app/dashboard/endpoint.segments/_full.segment.rsc +5 -5
  98. package/app/.next/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
  99. package/app/.next/server/app/dashboard/endpoint.segments/_index.segment.rsc +3 -3
  100. package/app/.next/server/app/dashboard/endpoint.segments/_tree.segment.rsc +1 -1
  101. package/app/.next/server/app/dashboard/media-providers/web.html +1 -1
  102. package/app/.next/server/app/dashboard/media-providers/web.rsc +5 -5
  103. package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +2 -2
  104. package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web.segment.rsc +1 -1
  105. package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
  106. package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  107. package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  108. package/app/.next/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +5 -5
  109. package/app/.next/server/app/dashboard/media-providers/web.segments/_head.segment.rsc +1 -1
  110. package/app/.next/server/app/dashboard/media-providers/web.segments/_index.segment.rsc +3 -3
  111. package/app/.next/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +1 -1
  112. package/app/.next/server/app/dashboard/mitm.html +1 -1
  113. package/app/.next/server/app/dashboard/mitm.rsc +5 -5
  114. package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
  115. package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
  116. package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  117. package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  118. package/app/.next/server/app/dashboard/mitm.segments/_full.segment.rsc +5 -5
  119. package/app/.next/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
  120. package/app/.next/server/app/dashboard/mitm.segments/_index.segment.rsc +3 -3
  121. package/app/.next/server/app/dashboard/mitm.segments/_tree.segment.rsc +1 -1
  122. package/app/.next/server/app/dashboard/profile.html +1 -1
  123. package/app/.next/server/app/dashboard/profile.rsc +5 -5
  124. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
  125. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
  126. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  127. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  128. package/app/.next/server/app/dashboard/profile.segments/_full.segment.rsc +5 -5
  129. package/app/.next/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
  130. package/app/.next/server/app/dashboard/profile.segments/_index.segment.rsc +3 -3
  131. package/app/.next/server/app/dashboard/profile.segments/_tree.segment.rsc +1 -1
  132. package/app/.next/server/app/dashboard/providers/new.html +1 -1
  133. package/app/.next/server/app/dashboard/providers/new.rsc +5 -5
  134. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
  135. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
  136. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  137. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  138. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  139. package/app/.next/server/app/dashboard/providers/new.segments/_full.segment.rsc +5 -5
  140. package/app/.next/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
  141. package/app/.next/server/app/dashboard/providers/new.segments/_index.segment.rsc +3 -3
  142. package/app/.next/server/app/dashboard/providers/new.segments/_tree.segment.rsc +1 -1
  143. package/app/.next/server/app/dashboard/providers.html +1 -1
  144. package/app/.next/server/app/dashboard/providers.rsc +5 -5
  145. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
  146. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  147. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  148. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  149. package/app/.next/server/app/dashboard/providers.segments/_full.segment.rsc +5 -5
  150. package/app/.next/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
  151. package/app/.next/server/app/dashboard/providers.segments/_index.segment.rsc +3 -3
  152. package/app/.next/server/app/dashboard/providers.segments/_tree.segment.rsc +1 -1
  153. package/app/.next/server/app/dashboard/proxy-pools.html +1 -1
  154. package/app/.next/server/app/dashboard/proxy-pools.rsc +5 -5
  155. package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
  156. package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
  157. package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  158. package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  159. package/app/.next/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +5 -5
  160. package/app/.next/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
  161. package/app/.next/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +3 -3
  162. package/app/.next/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +1 -1
  163. package/app/.next/server/app/dashboard/quota.html +2 -2
  164. package/app/.next/server/app/dashboard/quota.rsc +6 -6
  165. package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +3 -3
  166. package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
  167. package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  168. package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  169. package/app/.next/server/app/dashboard/quota.segments/_full.segment.rsc +6 -6
  170. package/app/.next/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
  171. package/app/.next/server/app/dashboard/quota.segments/_index.segment.rsc +3 -3
  172. package/app/.next/server/app/dashboard/quota.segments/_tree.segment.rsc +1 -1
  173. package/app/.next/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  174. package/app/.next/server/app/dashboard/settings/pricing.html +1 -1
  175. package/app/.next/server/app/dashboard/settings/pricing.rsc +3 -3
  176. package/app/.next/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +3 -3
  177. package/app/.next/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
  178. package/app/.next/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +3 -3
  179. package/app/.next/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +1 -1
  180. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
  181. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
  182. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
  183. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
  184. package/app/.next/server/app/dashboard/skills.html +1 -1
  185. package/app/.next/server/app/dashboard/skills.rsc +5 -5
  186. package/app/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills/__PAGE__.segment.rsc +2 -2
  187. package/app/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills.segment.rsc +1 -1
  188. package/app/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  189. package/app/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  190. package/app/.next/server/app/dashboard/skills.segments/_full.segment.rsc +5 -5
  191. package/app/.next/server/app/dashboard/skills.segments/_head.segment.rsc +1 -1
  192. package/app/.next/server/app/dashboard/skills.segments/_index.segment.rsc +3 -3
  193. package/app/.next/server/app/dashboard/skills.segments/_tree.segment.rsc +1 -1
  194. package/app/.next/server/app/dashboard/translator.html +1 -1
  195. package/app/.next/server/app/dashboard/translator.rsc +5 -5
  196. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
  197. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
  198. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  199. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  200. package/app/.next/server/app/dashboard/translator.segments/_full.segment.rsc +5 -5
  201. package/app/.next/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
  202. package/app/.next/server/app/dashboard/translator.segments/_index.segment.rsc +3 -3
  203. package/app/.next/server/app/dashboard/translator.segments/_tree.segment.rsc +1 -1
  204. package/app/.next/server/app/dashboard/usage.html +1 -1
  205. package/app/.next/server/app/dashboard/usage.rsc +5 -5
  206. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
  207. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
  208. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  209. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  210. package/app/.next/server/app/dashboard/usage.segments/_full.segment.rsc +5 -5
  211. package/app/.next/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
  212. package/app/.next/server/app/dashboard/usage.segments/_index.segment.rsc +3 -3
  213. package/app/.next/server/app/dashboard/usage.segments/_tree.segment.rsc +1 -1
  214. package/app/.next/server/app/dashboard.html +1 -1
  215. package/app/.next/server/app/dashboard.rsc +5 -5
  216. package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
  217. package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  218. package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  219. package/app/.next/server/app/dashboard.segments/_full.segment.rsc +5 -5
  220. package/app/.next/server/app/dashboard.segments/_head.segment.rsc +1 -1
  221. package/app/.next/server/app/dashboard.segments/_index.segment.rsc +3 -3
  222. package/app/.next/server/app/dashboard.segments/_tree.segment.rsc +1 -1
  223. package/app/.next/server/app/index.html +1 -1
  224. package/app/.next/server/app/index.rsc +3 -3
  225. package/app/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  226. package/app/.next/server/app/index.segments/_full.segment.rsc +3 -3
  227. package/app/.next/server/app/index.segments/_head.segment.rsc +1 -1
  228. package/app/.next/server/app/index.segments/_index.segment.rsc +3 -3
  229. package/app/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  230. package/app/.next/server/app/landing/page_client-reference-manifest.js +1 -1
  231. package/app/.next/server/app/landing.html +1 -1
  232. package/app/.next/server/app/landing.rsc +3 -3
  233. package/app/.next/server/app/landing.segments/_full.segment.rsc +3 -3
  234. package/app/.next/server/app/landing.segments/_head.segment.rsc +1 -1
  235. package/app/.next/server/app/landing.segments/_index.segment.rsc +3 -3
  236. package/app/.next/server/app/landing.segments/_tree.segment.rsc +1 -1
  237. package/app/.next/server/app/landing.segments/landing/__PAGE__.segment.rsc +1 -1
  238. package/app/.next/server/app/landing.segments/landing.segment.rsc +1 -1
  239. package/app/.next/server/app/login/page_client-reference-manifest.js +1 -1
  240. package/app/.next/server/app/login.html +1 -1
  241. package/app/.next/server/app/login.rsc +4 -4
  242. package/app/.next/server/app/login.segments/_full.segment.rsc +4 -4
  243. package/app/.next/server/app/login.segments/_head.segment.rsc +1 -1
  244. package/app/.next/server/app/login.segments/_index.segment.rsc +3 -3
  245. package/app/.next/server/app/login.segments/_tree.segment.rsc +1 -1
  246. package/app/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  247. package/app/.next/server/app/login.segments/login.segment.rsc +1 -1
  248. package/app/.next/server/app/page_client-reference-manifest.js +1 -1
  249. package/app/.next/server/app-paths-manifest.json +1 -1
  250. package/app/.next/server/chunks/3110.js +1 -1
  251. package/app/.next/server/chunks/4746.js +1 -1
  252. package/app/.next/server/chunks/7153.js +1 -1
  253. package/app/.next/server/chunks/9142.js +1 -1
  254. package/app/.next/server/middleware-build-manifest.js +1 -1
  255. package/app/.next/server/pages/404.html +1 -1
  256. package/app/.next/server/pages/500.html +1 -1
  257. package/app/.next/static/chunks/{1321-41a4dcfb188426d3.js → 1321-692c424aab14b711.js} +1 -1
  258. package/app/.next/static/chunks/app/(dashboard)/dashboard/quota/page-7ef54d2cf4eee7d0.js +1 -0
  259. package/app/.next-cli-build/static/chunks/{1321-41a4dcfb188426d3.js → 1321-692c424aab14b711.js} +1 -1
  260. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/quota/page-7ef54d2cf4eee7d0.js +1 -0
  261. package/app/package.json +1 -1
  262. package/package.json +1 -1
  263. package/app/.next/static/chunks/app/(dashboard)/dashboard/quota/page-bddafaa872e75197.js +0 -1
  264. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/quota/page-bddafaa872e75197.js +0 -1
  265. /package/app/.next/static/{vnu1gZOqzvf9J7CUswxcA → cTrKdjFen8_Jgs_D0NzQj}/_buildManifest.js +0 -0
  266. /package/app/.next/static/{vnu1gZOqzvf9J7CUswxcA → cTrKdjFen8_Jgs_D0NzQj}/_ssgManifest.js +0 -0
  267. /package/app/.next-cli-build/static/{vnu1gZOqzvf9J7CUswxcA → cTrKdjFen8_Jgs_D0NzQj}/_buildManifest.js +0 -0
  268. /package/app/.next-cli-build/static/{vnu1gZOqzvf9J7CUswxcA → cTrKdjFen8_Jgs_D0NzQj}/_ssgManifest.js +0 -0
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3826],{75095:(e,t,r)=>{"use strict";r.d(t,{default:()=>b});var s=r(95155),a=r(12115),i=r(57250),l=r(45564);let n=new Map([["gemini-default","gemini-3.5-flash-high"],["gemini-3-flash-agent","gemini-3.5-flash-high"],["gemini-3.5-flash","gemini-3.5-flash-high"],["gemini-3.5-flash-high","gemini-3.5-flash-high"],["gemini-3-flash","gemini-3.5-flash-medium"],["gemini-3.0-flash","gemini-3.5-flash-medium"],["gemini-3.5-flash-low","gemini-3.5-flash-medium"],["gemini-3.5-flash-medium","gemini-3.5-flash-medium"],["gemini-pro-agent","gemini-3.1-pro-high"],["gemini-3.1-pro","gemini-3.1-pro-high"],["gemini-3-pro","gemini-3.1-pro-high"],["gemini-3.1-pro-high","gemini-3.1-pro-high"],["gemini-3.1-pro-low","gemini-3.1-pro-low"],["claude-sonnet-4-6","claude-sonnet-4-6-thinking"],["claude-sonnet-4-6-thinking","claude-sonnet-4-6-thinking"],["claude-opus-4-6","claude-opus-4-6-thinking"],["claude-opus-4-6-thinking","claude-opus-4-6-thinking"],["gpt-oss-120b","gpt-oss-120b-medium"],["gpt-oss-120b-medium","gpt-oss-120b-medium"]]),o={"gemini-3.5-flash-high":"Gemini 3.5 Flash (High)","gemini-3.5-flash-medium":"Gemini 3.5 Flash (Medium)","gemini-3.1-pro-high":"Gemini 3.1 Pro (High)","gemini-3.1-pro-low":"Gemini 3.1 Pro (Low)","claude-sonnet-4-6-thinking":"Claude Sonnet 4.6 (Thinking)","claude-opus-4-6-thinking":"Claude Opus 4.6 (Thinking)","gpt-oss-120b-medium":"GPT-OSS 120B (Medium)"};function c(e,t){return t&&0!==t?!e||e<0?100:e>=t?0:Math.round((t-e)/t*100):0}function d({quotas:e=[],compact:t=!1}){if(!e||0===e.length)return null;let r=t?"py-1 px-1.5":"py-2 px-3",a=t?"text-[11px]":"text-sm",i=t?"text-[11px]":"text-sm",l=t?"text-[10px] leading-tight":"text-xs";return(0,s.jsx)("div",{className:"overflow-x-auto",children:(0,s.jsx)("table",{className:"w-full table-fixed text-left",children:(0,s.jsx)("tbody",{children:e.map((e,n)=>{let o=void 0!==e.remainingPercentage?Math.round(e.remainingPercentage):c(e.used,e.total),d=o>70?{text:"text-green-600 dark:text-green-400",bg:"bg-green-500",bgLight:"bg-green-500/10",emoji:"\uD83D\uDFE2"}:o>=30?{text:"text-yellow-600 dark:text-yellow-400",bg:"bg-yellow-500",bgLight:"bg-yellow-500/10",emoji:"\uD83D\uDFE1"}:{text:"text-red-600 dark:text-red-400",bg:"bg-red-500",bgLight:"bg-red-500/10",emoji:"\uD83D\uDD34"},m=function(e){if(!e)return"-";try{let t="string"==typeof e?new Date(e):e,r=new Date,s=t-r;if(s<=0)return"-";let a=Math.ceil(s/6e4);if(a<60)return`${a}m`;let i=Math.floor(a/60),l=a%60;if(i<24)return`${i}h ${l}m`;let n=Math.floor(i/24);return`${n}d ${i%24}h ${l}m`}catch(e){return"-"}}(e.resetAt),u=function(e){if(!e)return null;try{let t=new Date(e),r=new Date,s=new Date(r.getFullYear(),r.getMonth(),r.getDate()),a=new Date(s);a.setDate(a.getDate()+1);let i="";i=t>=s&&t<a?"Today":t>=a&&t<new Date(a.getTime()+864e5)?"Tomorrow":t.toLocaleDateString("en-US",{month:"short",day:"numeric"});let l=t.toLocaleTimeString("en-US",{hour:"numeric",minute:"2-digit",hour12:!0});return`${i}, ${l}`}catch{return null}}(e.resetAt);return(0,s.jsxs)("tr",{className:"border-b border-black/5 dark:border-white/5 hover:bg-black/[0.02] dark:hover:bg-white/[0.02] transition-colors",children:[(0,s.jsx)("td",{className:`${r} w-[30%]`,children:(0,s.jsxs)("div",{className:"flex items-center gap-1.5 min-w-0",children:[(0,s.jsx)("span",{className:"text-[10px] shrink-0",children:d.emoji}),(0,s.jsx)("span",{className:`${a} font-medium text-text-primary truncate`,children:e.name})]})}),(0,s.jsx)("td",{className:`${r} w-[45%]`,children:(0,s.jsxs)("div",{className:t?"space-y-1":"space-y-1.5",children:[(0,s.jsx)("div",{className:`${t?"h-1":"h-1.5"} rounded-full overflow-hidden border ${d.bgLight} ${0===o?"border-black/10 dark:border-white/10":"border-transparent"}`,children:(0,s.jsx)("div",{className:`h-full transition-all duration-300 ${d.bg}`,style:{width:`${Math.min(o,100)}%`}})}),(0,s.jsxs)("div",{className:`flex items-center justify-between ${t?"text-[10px]":"text-xs"}`,children:[(0,s.jsxs)("span",{className:"text-text-muted",children:[e.used.toLocaleString()," / ",e.total>0?e.total.toLocaleString():"∞"]}),(0,s.jsxs)("span",{className:`font-medium ${d.text}`,children:[o,"%"]})]})]})}),(0,s.jsx)("td",{className:`${r} w-[25%]`,children:"-"!==m||u?t?(0,s.jsx)("div",{className:`${i} text-text-primary font-medium truncate`,title:u||"",children:"-"!==m?`in ${m}`:u}):(0,s.jsxs)("div",{className:"space-y-0.5",children:["-"!==m&&(0,s.jsxs)("div",{className:`${i} text-text-primary font-medium`,children:["in ",m]}),u&&(0,s.jsx)("div",{className:`${l} text-text-muted`,children:u})]}):(0,s.jsx)("div",{className:`${i} text-text-muted italic`,children:"N/A"})})]},n)})})})})}var m=r(98542),u=r(84588),h=r(35497),x=r(52679);let p=e=>x.wb.includes(e.provider)&&("oauth"===e.authType||x.jO.includes(e.provider)),g="quotaAutoRefresh";function b(){let[e,t]=(0,a.useState)([]),[r,b]=(0,a.useState)({}),[f,y]=(0,a.useState)({}),[v,j]=(0,a.useState)({}),[w,k]=(0,a.useState)(()=>{let e=window.localStorage.getItem(g);return null===e||"true"===e}),[N,$]=(0,a.useState)(null),[C,S]=(0,a.useState)(!1),[E,A]=(0,a.useState)(60),[q,P]=(0,a.useState)(!0),[T,D]=(0,a.useState)(null),[L,O]=(0,a.useState)(null),[M,I]=(0,a.useState)(!1),[_,z]=(0,a.useState)(null),[F,U]=(0,a.useState)([]),[G,K]=(0,a.useState)("all"),[R,H]=(0,a.useState)(!1),[J,B]=(0,a.useState)(!1),[Y,Q]=(0,a.useState)(!1),V=(0,a.useRef)(null),W=(0,a.useRef)(null),X=(0,a.useCallback)(async()=>{try{let e=await fetch("/api/providers/client");if(!e.ok)throw Error("Failed to fetch connections");let r=(await e.json()).connections||[];return t(r),r}catch(e){return console.error("Error fetching connections:",e),t([]),[]}},[]),Z=(0,a.useCallback)(async(e,t)=>{y(t=>({...t,[e]:!0})),j(t=>({...t,[e]:null}));try{console.log(`[ProviderLimits] Fetching quota for ${t} (${e})`);let r=await fetch(`/api/usage/${e}`);if(!r.ok){let s=(await r.json().catch(()=>({}))).error||r.statusText;if(404===r.status)return void console.warn(`[ProviderLimits] Connection not found for ${t}, skipping`);if(401===r.status){console.warn(`[ProviderLimits] Auth error for ${t}:`,s),b(t=>({...t,[e]:{quotas:[],message:s}}));return}throw Error(`HTTP ${r.status}: ${s}`)}let s=await r.json();console.log(`[ProviderLimits] Got quota for ${t}:`,s);let a=function(e,t){if(!t||"object"!=typeof t)return[];let r=[];try{switch(e.toLowerCase()){case"github":default:t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null})});break;case"antigravity":if(t.quotas){let e=new Map;Object.entries(t.quotas).forEach(([t,r])=>{let s=n.get(t)||t,a={name:o[s]||r.displayName||s,modelKey:s,sourceModelKey:r.sourceModelKey||t,used:r.used||0,total:r.total||0,resetAt:r.resetAt||null,remainingPercentage:r.remainingPercentage},i=e.get(s);if(!i)return void e.set(s,a);let l=i.remainingPercentage??c(i.used,i.total);(a.remainingPercentage??c(a.used,a.total))<l&&e.set(s,a)}),r.push(...e.values())}break;case"codex":t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null})});break;case"kiro":t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null})});break;case"claude":t.message?r.push({name:"error",used:0,total:0,resetAt:null,message:t.message}):t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null})})}}catch(t){return console.error(`Error parsing quota data for ${e}:`,t),[]}let s=(0,l.KC)(e);if(s.length>0){let e=new Map(s.map((e,t)=>[e.id,t]));r.sort((t,r)=>{let s=t.modelKey||t.name,a=r.modelKey||r.name;return(e.get(s)??999)-(e.get(a)??999)})}return r}(t,s);b(t=>({...t,[e]:{quotas:a,plan:s.plan||null,message:s.message||null,raw:s}}))}catch(r){console.error(`[ProviderLimits] Error fetching quota for ${t} (${e}):`,r),j(t=>({...t,[e]:r.message||"Failed to fetch quota"}))}finally{y(t=>({...t,[e]:!1}))}},[]),ee=(0,a.useCallback)(async(e,t)=>{await Z(e,t),$(new Date)},[Z]),et=(0,a.useCallback)(async e=>{if(confirm("Delete this connection?")){D(e);try{(await fetch(`/api/providers/${e}`,{method:"DELETE"})).ok&&(t(t=>t.filter(t=>t.id!==e)),b(t=>{let r={...t};return delete r[e],r}),y(t=>{let r={...t};return delete r[e],r}),j(t=>{let r={...t};return delete r[e],r}))}catch(e){console.error("Error deleting connection:",e)}finally{D(null)}}},[]),er=(0,a.useCallback)(async(e,r)=>{O(e);try{(await fetch(`/api/providers/${e}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({isActive:r})})).ok&&t(t=>t.map(t=>t.id===e?{...t,isActive:r}:t))}catch(e){console.error("Error updating connection status:",e)}finally{O(null)}},[]),es=(0,a.useCallback)(async e=>{if(!_?.id)return;let t=_.id,r=_.provider;try{(await fetch(`/api/providers/${t}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})).ok&&(await X(),I(!1),z(null),x.wb.includes(r)&&await Z(t,r))}catch(e){console.error("Error saving connection:",e)}},[_,X,Z]);(0,a.useEffect)(()=>{let e=!1;return fetch("/api/proxy-pools?isActive=true",{cache:"no-store"}).then(e=>e.json()).then(t=>{!e&&t?.proxyPools&&U(t.proxyPools)}).catch(()=>{}),()=>{e=!0}},[]);let ea=(0,a.useCallback)(async()=>{if(!C){S(!0),A(60);try{let e=(await X()).filter(p);await Promise.all(e.map(e=>Z(e.id,e.provider))),$(new Date)}catch(e){console.error("Error refreshing all providers:",e)}finally{S(!1)}}},[C,X,Z]);(0,a.useEffect)(()=>{(async()=>{P(!0);let e=await X();P(!1);let t=e.filter(p),r={};t.forEach(e=>{r[e.id]=!0}),y(r),await Promise.all(t.map(e=>Z(e.id,e.provider))),$(new Date)})()},[]),(0,a.useEffect)(()=>{window.localStorage.setItem(g,String(w))},[w]),(0,a.useEffect)(()=>{if(!w){V.current&&(clearInterval(V.current),V.current=null),W.current&&(clearInterval(W.current),W.current=null);return}return V.current=setInterval(()=>{ea()},6e4),W.current=setInterval(()=>{A(e=>e<=1?60:e-1)},1e3),()=>{V.current&&clearInterval(V.current),W.current&&clearInterval(W.current)}},[w,ea]),(0,a.useEffect)(()=>{let e=()=>{document.hidden?(V.current&&(clearInterval(V.current),V.current=null),W.current&&(clearInterval(W.current),W.current=null)):w&&(V.current=setInterval(ea,6e4),W.current=setInterval(()=>{A(e=>e<=1?60:e-1)},1e3))};return document.addEventListener("visibilitychange",e),()=>{document.removeEventListener("visibilitychange",e)}},[w,ea]);let ei=e.filter(p),el=ei.filter(e=>"all"===G||e.provider===G),en=e=>{let t=(r[e.id]?.quotas||[]).map(e=>e.resetAt?new Date(e.resetAt).getTime():1/0).filter(e=>Number.isFinite(e));return t.length>0?Math.min(...t):1/0},eo=[...el].sort((e,t)=>{if(R){let r=en(e)-en(t);if(0!==r)return r}let r=x.wb.indexOf(e.provider),s=x.wb.indexOf(t.provider);return r!==s?r-s:e.provider.localeCompare(t.provider)}),ec=e=>{let t=r[e.id]?.quotas;return!!t?.length&&t.some(e=>!!e.total&&!(e.total<=0)&&5>=c(e.used,e.total))},ed=(0,a.useCallback)(async(e,r)=>{if(e.length&&!Y){Q(!0);try{await Promise.all(e.map(e=>fetch(`/api/providers/${e}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({isActive:r})}))),t(t=>t.map(t=>e.includes(t.id)?{...t,isActive:r}:t))}catch(e){console.error("Error bulk toggling connections:",e)}finally{Q(!1)}}},[Y]),em=Array.from(new Set(ei.map(e=>e.provider))).sort(),eu="all"===G?"All providers":G;return(eo.length,Object.values(r).filter(e=>e?.quotas?.length>0).length,Object.values(r).reduce((e,t)=>t?.quotas?e+ +!!t.quotas.some(e=>30>c(e.used,e.total)&&e.total>0):e,0),q||0!==eo.length)?(0,s.jsxs)("div",{className:"space-y-6",children:[(0,s.jsxs)("div",{className:"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",children:[(0,s.jsx)("div",{className:"flex flex-col gap-1 sm:flex-row sm:items-center sm:gap-3",children:(0,s.jsx)("h2",{className:"text-xl font-semibold text-text-primary",children:"Provider Limits"})}),(0,s.jsxs)("div",{className:"flex flex-wrap items-center gap-1.5",children:[(0,s.jsxs)("div",{className:"relative",children:[(0,s.jsxs)("button",{type:"button",onClick:()=>B(e=>!e),className:"flex h-8 items-center justify-between gap-1 rounded-lg border border-black/10 bg-black/[0.02] px-2 text-xs text-text-primary transition-colors hover:bg-black/5 dark:border-white/10 dark:bg-white/[0.03] dark:hover:bg-white/10","aria-haspopup":"menu","aria-expanded":J,title:"Filter quota providers",children:[(0,s.jsxs)("span",{className:"flex min-w-0 items-center gap-1.5",children:["all"===G?(0,s.jsx)("span",{className:"material-symbols-outlined text-[14px] text-text-muted",children:"apps"}):(0,s.jsx)(i.A,{src:`/providers/${G}.png`,alt:G,size:18,className:"size-[18px] rounded object-contain",fallbackText:G.slice(0,2).toUpperCase()}),(0,s.jsx)("span",{className:"truncate capitalize hidden lg:inline",children:eu})]}),(0,s.jsx)("span",{className:"material-symbols-outlined text-[14px] text-text-muted",children:"expand_more"})]}),J&&(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("button",{type:"button",className:"fixed inset-0 z-30 bg-transparent","aria-label":"Close provider filter",onClick:()=>B(!1)}),(0,s.jsxs)("div",{className:"absolute left-0 z-40 mt-2 w-64 overflow-hidden rounded-2xl border border-black/10 bg-surface/95 p-1.5 shadow-xl shadow-black/10 backdrop-blur dark:border-white/10 dark:bg-surface/95 sm:w-72",children:[(0,s.jsxs)("button",{type:"button",onClick:()=>{K("all"),B(!1)},className:`flex w-full items-center gap-3 rounded-xl px-3 py-2.5 text-left text-sm transition-colors ${"all"===G?"bg-primary/10 text-primary":"text-text-primary hover:bg-black/5 dark:hover:bg-white/10"}`,children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[22px]",children:"apps"}),(0,s.jsx)("span",{className:"font-medium",children:"All providers"}),"all"===G&&(0,s.jsx)("span",{className:"material-symbols-outlined ml-auto text-[20px]",children:"check"})]}),(0,s.jsx)("div",{className:"my-1 h-px bg-black/10 dark:bg-white/10"}),(0,s.jsx)("div",{className:"max-h-72 overflow-y-auto pr-1",children:em.map(e=>(0,s.jsxs)("button",{type:"button",onClick:()=>{K(e),B(!1)},className:`flex w-full items-center gap-3 rounded-xl px-3 py-2.5 text-left text-sm transition-colors ${G===e?"bg-primary/10 text-primary":"text-text-primary hover:bg-black/5 dark:hover:bg-white/10"}`,children:[(0,s.jsx)(i.A,{src:`/providers/${e}.png`,alt:e,size:24,className:"size-6 rounded-md object-contain",fallbackText:e.slice(0,2).toUpperCase()}),(0,s.jsx)("span",{className:"font-medium capitalize",children:e}),G===e&&(0,s.jsx)("span",{className:"material-symbols-outlined ml-auto text-[20px]",children:"check"})]},e))})]})]})]}),(0,s.jsxs)("button",{type:"button",onClick:()=>H(e=>!e),className:`flex h-8 shrink-0 items-center gap-1 rounded-lg border px-2 text-xs transition-colors ${R?"border-amber-500/40 bg-amber-500/10 text-amber-500":"border-black/10 text-text-primary hover:bg-black/5 dark:border-white/10 dark:hover:bg-white/5"}`,title:"Sort accounts by earliest quota reset time",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"hourglass_top"}),(0,s.jsx)("span",{className:"hidden sm:inline",children:"Expiring first"})]}),(0,s.jsxs)("button",{type:"button",onClick:()=>{ed(eo.filter(e=>(e.isActive??!0)&&ec(e)).map(e=>e.id),!1)},disabled:Y,className:"flex h-8 shrink-0 items-center gap-1 rounded-lg border border-red-500/30 px-2 text-xs text-red-500 transition-colors hover:bg-red-500/10 disabled:opacity-50",title:"Disable connections with depleted quota (within current filter)",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"block"}),(0,s.jsx)("span",{className:"hidden sm:inline",children:"Turn off Empty"})]}),(0,s.jsxs)("button",{type:"button",onClick:()=>{ed(eo.filter(e=>!(e.isActive??!0)&&!ec(e)).map(e=>e.id),!0)},disabled:Y,className:"flex h-8 shrink-0 items-center gap-1 rounded-lg border border-emerald-500/30 px-2 text-xs text-emerald-500 transition-colors hover:bg-emerald-500/10 disabled:opacity-50",title:"Enable connections that still have quota (within current filter)",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"check_circle"}),(0,s.jsx)("span",{className:"hidden sm:inline",children:"Turn on Available"})]}),(0,s.jsxs)("button",{onClick:()=>k(e=>!e),className:"flex h-8 shrink-0 items-center gap-1 rounded-lg border border-black/10 px-2 text-xs transition-colors hover:bg-black/5 dark:border-white/10 dark:hover:bg-white/5",title:w?"Disable auto-refresh":"Enable auto-refresh",children:[(0,s.jsx)("span",{className:`material-symbols-outlined text-[14px] ${w?"text-primary":"text-text-muted"}`,children:w?"toggle_on":"toggle_off"}),(0,s.jsx)("span",{className:"hidden text-text-primary sm:inline",children:"Auto-refresh"}),w&&(0,s.jsxs)("span",{className:"text-[10px] text-text-muted tabular-nums",children:["(",E,"s)"]})]}),(0,s.jsx)("button",{type:"button",onClick:ea,disabled:C,className:"flex h-8 shrink-0 items-center gap-1 rounded-lg border border-black/10 px-2 text-xs text-text-primary transition-colors hover:bg-black/5 dark:border-white/10 dark:hover:bg-white/5 disabled:opacity-50",title:"Refresh all",children:(0,s.jsx)("span",{className:`material-symbols-outlined text-[14px] ${C?"animate-spin":""}`,children:"refresh"})})]})]}),(0,s.jsx)("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-3",children:eo.map(e=>{let t,a,l=r[e.id],n=f[e.id],o=v[e.id],c=!1===e.isActive,h=T===e.id||L===e.id;return(0,s.jsxs)(u.default,{padding:"none",className:`min-w-0 ${c?"opacity-60":""}`,children:[(0,s.jsx)("div",{className:"px-3 py-2 border-b border-black/10 dark:border-white/10",children:(0,s.jsxs)("div",{className:"flex items-center justify-between gap-2",children:[(0,s.jsxs)("div",{className:"flex items-center gap-2 min-w-0",children:[(0,s.jsx)("div",{className:"w-8 h-8 shrink-0 rounded-md flex items-center justify-center overflow-hidden",children:(0,s.jsx)(i.A,{src:`/providers/${e.provider}.png`,alt:e.provider,size:32,className:"object-contain",fallbackText:e.provider?.slice(0,2).toUpperCase()||"PR"})}),(0,s.jsxs)("div",{className:"min-w-0",children:[(0,s.jsx)("h3",{className:"text-sm font-semibold text-text-primary capitalize truncate",children:e.provider}),(a=(t=e=>"string"==typeof e&&/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e))(e.email)?e.email:(t(e.name),e.name))?(0,s.jsx)("p",{className:"text-xs text-text-muted truncate",children:a}):null]})]}),(0,s.jsxs)("div",{className:"flex items-center gap-1 shrink-0",children:[(0,s.jsx)("button",{type:"button",onClick:()=>ee(e.id,e.provider),disabled:n||h,className:"p-1.5 rounded-lg hover:bg-black/5 dark:hover:bg-white/5 transition-colors disabled:opacity-50",title:"Refresh quota",children:(0,s.jsx)("span",{className:`material-symbols-outlined text-[18px] text-text-muted ${n?"animate-spin":""}`,children:"refresh"})}),(0,s.jsx)("button",{type:"button",onClick:()=>{z(e),I(!0)},disabled:h,className:"p-1.5 rounded-lg hover:bg-black/5 dark:hover:bg-white/5 text-text-muted hover:text-primary transition-colors disabled:opacity-50",title:"Edit connection",children:(0,s.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"edit"})}),(0,s.jsx)("button",{type:"button",onClick:()=>et(e.id),disabled:h,className:"p-1.5 rounded-lg hover:bg-red-500/10 text-red-500 transition-colors disabled:opacity-50",title:"Delete connection",children:(0,s.jsx)("span",{className:`material-symbols-outlined text-[18px] ${T===e.id?"animate-pulse":""}`,children:"delete"})}),(0,s.jsx)("div",{className:"inline-flex items-center pl-0.5",title:e.isActive??!0?"Disable connection":"Enable connection",children:(0,s.jsx)(m.default,{size:"sm",checked:e.isActive??!0,disabled:h,onChange:t=>er(e.id,t)})})]})]})}),(0,s.jsx)("div",{className:"px-2 py-1.5",children:n?(0,s.jsx)("div",{className:"text-center py-5 text-text-muted",children:(0,s.jsx)("span",{className:"material-symbols-outlined text-[28px] animate-spin",children:"progress_activity"})}):o?(0,s.jsxs)("div",{className:"text-center py-5",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[28px] text-red-500",children:"error"}),(0,s.jsx)("p",{className:"mt-1.5 text-xs text-text-muted",children:o})]}):l?.message?(0,s.jsx)("div",{className:"text-center py-5",children:(0,s.jsx)("p",{className:"text-xs text-text-muted",children:l.message})}):(0,s.jsx)(d,{quotas:l?.quotas,compact:!0})})]},e.id)})}),(0,s.jsx)(h.wI,{isOpen:M,connection:_,proxyPools:F,onSave:es,onClose:()=>{I(!1),z(null)}})]}):(0,s.jsx)(u.default,{padding:"lg",children:(0,s.jsxs)("div",{className:"text-center py-12",children:[(0,s.jsx)("span",{className:"material-symbols-outlined text-[64px] text-text-muted opacity-20",children:"cloud_off"}),(0,s.jsx)("h3",{className:"mt-4 text-lg font-semibold text-text-primary",children:"No Providers Connected"}),(0,s.jsx)("p",{className:"mt-2 text-sm text-text-muted max-w-md mx-auto",children:"Connect to providers with OAuth to track your API quota limits and usage."})]})})}},83376:(e,t,r)=>{Promise.resolve().then(r.bind(r,75095)),Promise.resolve().then(r.bind(r,25086))}},e=>{e.O(0,[2574,3862,2194,698,1321,5497,8441,3794,7358],()=>e(e.s=83376)),_N_E=e.O()}]);
package/app/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ktrouter",
3
- "version": "1.0.4",
3
+ "version": "1.0.5",
4
4
  "description": "KTRouter - AI proxy router with web dashboard",
5
5
  "scripts": {
6
6
  "dev": "next dev --webpack --port 3008",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ktrouter",
3
- "version": "1.0.4",
3
+ "version": "1.0.5",
4
4
  "description": "KTRouter CLI - AI proxy router with web dashboard",
5
5
  "bin": {
6
6
  "ktrouter": "./cli.js"
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3826],{75095:(e,t,r)=>{"use strict";r.d(t,{default:()=>p});var a=r(95155),s=r(12115),l=r(57250),i=r(45564);function n(e,t){return t&&0!==t?!e||e<0?100:e>=t?0:Math.round((t-e)/t*100):0}function o({quotas:e=[],compact:t=!1}){if(!e||0===e.length)return null;let r=t?"py-1 px-1.5":"py-2 px-3",s=t?"text-[11px]":"text-sm",l=t?"text-[11px]":"text-sm",i=t?"text-[10px] leading-tight":"text-xs";return(0,a.jsx)("div",{className:"overflow-x-auto",children:(0,a.jsx)("table",{className:"w-full table-fixed text-left",children:(0,a.jsx)("tbody",{children:e.map((e,o)=>{let c=void 0!==e.remainingPercentage?Math.round(e.remainingPercentage):n(e.used,e.total),d=c>70?{text:"text-green-600 dark:text-green-400",bg:"bg-green-500",bgLight:"bg-green-500/10",emoji:"\uD83D\uDFE2"}:c>=30?{text:"text-yellow-600 dark:text-yellow-400",bg:"bg-yellow-500",bgLight:"bg-yellow-500/10",emoji:"\uD83D\uDFE1"}:{text:"text-red-600 dark:text-red-400",bg:"bg-red-500",bgLight:"bg-red-500/10",emoji:"\uD83D\uDD34"},u=function(e){if(!e)return"-";try{let t="string"==typeof e?new Date(e):e,r=new Date,a=t-r;if(a<=0)return"-";let s=Math.ceil(a/6e4);if(s<60)return`${s}m`;let l=Math.floor(s/60),i=s%60;if(l<24)return`${l}h ${i}m`;let n=Math.floor(l/24);return`${n}d ${l%24}h ${i}m`}catch(e){return"-"}}(e.resetAt),m=function(e){if(!e)return null;try{let t=new Date(e),r=new Date,a=new Date(r.getFullYear(),r.getMonth(),r.getDate()),s=new Date(a);s.setDate(s.getDate()+1);let l="";l=t>=a&&t<s?"Today":t>=s&&t<new Date(s.getTime()+864e5)?"Tomorrow":t.toLocaleDateString("en-US",{month:"short",day:"numeric"});let i=t.toLocaleTimeString("en-US",{hour:"numeric",minute:"2-digit",hour12:!0});return`${l}, ${i}`}catch{return null}}(e.resetAt);return(0,a.jsxs)("tr",{className:"border-b border-black/5 dark:border-white/5 hover:bg-black/[0.02] dark:hover:bg-white/[0.02] transition-colors",children:[(0,a.jsx)("td",{className:`${r} w-[30%]`,children:(0,a.jsxs)("div",{className:"flex items-center gap-1.5 min-w-0",children:[(0,a.jsx)("span",{className:"text-[10px] shrink-0",children:d.emoji}),(0,a.jsx)("span",{className:`${s} font-medium text-text-primary truncate`,children:e.name})]})}),(0,a.jsx)("td",{className:`${r} w-[45%]`,children:(0,a.jsxs)("div",{className:t?"space-y-1":"space-y-1.5",children:[(0,a.jsx)("div",{className:`${t?"h-1":"h-1.5"} rounded-full overflow-hidden border ${d.bgLight} ${0===c?"border-black/10 dark:border-white/10":"border-transparent"}`,children:(0,a.jsx)("div",{className:`h-full transition-all duration-300 ${d.bg}`,style:{width:`${Math.min(c,100)}%`}})}),(0,a.jsxs)("div",{className:`flex items-center justify-between ${t?"text-[10px]":"text-xs"}`,children:[(0,a.jsxs)("span",{className:"text-text-muted",children:[e.used.toLocaleString()," / ",e.total>0?e.total.toLocaleString():"∞"]}),(0,a.jsxs)("span",{className:`font-medium ${d.text}`,children:[c,"%"]})]})]})}),(0,a.jsx)("td",{className:`${r} w-[25%]`,children:"-"!==u||m?t?(0,a.jsx)("div",{className:`${l} text-text-primary font-medium truncate`,title:m||"",children:"-"!==u?`in ${u}`:m}):(0,a.jsxs)("div",{className:"space-y-0.5",children:["-"!==u&&(0,a.jsxs)("div",{className:`${l} text-text-primary font-medium`,children:["in ",u]}),m&&(0,a.jsx)("div",{className:`${i} text-text-muted`,children:m})]}):(0,a.jsx)("div",{className:`${l} text-text-muted italic`,children:"N/A"})})]},o)})})})})}var c=r(98542),d=r(84588),u=r(35497),m=r(52679);let x=e=>m.wb.includes(e.provider)&&("oauth"===e.authType||m.jO.includes(e.provider)),h="quotaAutoRefresh";function p(){let[e,t]=(0,s.useState)([]),[r,p]=(0,s.useState)({}),[b,f]=(0,s.useState)({}),[g,y]=(0,s.useState)({}),[v,j]=(0,s.useState)(()=>{let e=window.localStorage.getItem(h);return null===e||"true"===e}),[w,N]=(0,s.useState)(null),[k,$]=(0,s.useState)(!1),[C,E]=(0,s.useState)(60),[A,S]=(0,s.useState)(!0),[q,P]=(0,s.useState)(null),[D,T]=(0,s.useState)(null),[L,O]=(0,s.useState)(!1),[I,_]=(0,s.useState)(null),[z,M]=(0,s.useState)([]),[U,F]=(0,s.useState)("all"),[R,K]=(0,s.useState)(!1),[J,G]=(0,s.useState)(!1),[H,Y]=(0,s.useState)(!1),B=(0,s.useRef)(null),Q=(0,s.useRef)(null),V=(0,s.useCallback)(async()=>{try{let e=await fetch("/api/providers/client");if(!e.ok)throw Error("Failed to fetch connections");let r=(await e.json()).connections||[];return t(r),r}catch(e){return console.error("Error fetching connections:",e),t([]),[]}},[]),W=(0,s.useCallback)(async(e,t)=>{f(t=>({...t,[e]:!0})),y(t=>({...t,[e]:null}));try{console.log(`[ProviderLimits] Fetching quota for ${t} (${e})`);let r=await fetch(`/api/usage/${e}`);if(!r.ok){let a=(await r.json().catch(()=>({}))).error||r.statusText;if(404===r.status)return void console.warn(`[ProviderLimits] Connection not found for ${t}, skipping`);if(401===r.status){console.warn(`[ProviderLimits] Auth error for ${t}:`,a),p(t=>({...t,[e]:{quotas:[],message:a}}));return}throw Error(`HTTP ${r.status}: ${a}`)}let a=await r.json();console.log(`[ProviderLimits] Got quota for ${t}:`,a);let s=function(e,t){if(!t||"object"!=typeof t)return[];let r=[];try{switch(e.toLowerCase()){case"github":default:t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null})});break;case"antigravity":t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:t.displayName||e,modelKey:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null,remainingPercentage:t.remainingPercentage})});break;case"codex":t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null})});break;case"kiro":t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null})});break;case"claude":t.message?r.push({name:"error",used:0,total:0,resetAt:null,message:t.message}):t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null})})}}catch(t){return console.error(`Error parsing quota data for ${e}:`,t),[]}let a=(0,i.KC)(e);if(a.length>0){let e=new Map(a.map((e,t)=>[e.id,t]));r.sort((t,r)=>{let a=t.modelKey||t.name,s=r.modelKey||r.name;return(e.get(a)??999)-(e.get(s)??999)})}return r}(t,a);p(t=>({...t,[e]:{quotas:s,plan:a.plan||null,message:a.message||null,raw:a}}))}catch(r){console.error(`[ProviderLimits] Error fetching quota for ${t} (${e}):`,r),y(t=>({...t,[e]:r.message||"Failed to fetch quota"}))}finally{f(t=>({...t,[e]:!1}))}},[]),X=(0,s.useCallback)(async(e,t)=>{await W(e,t),N(new Date)},[W]),Z=(0,s.useCallback)(async e=>{if(confirm("Delete this connection?")){P(e);try{(await fetch(`/api/providers/${e}`,{method:"DELETE"})).ok&&(t(t=>t.filter(t=>t.id!==e)),p(t=>{let r={...t};return delete r[e],r}),f(t=>{let r={...t};return delete r[e],r}),y(t=>{let r={...t};return delete r[e],r}))}catch(e){console.error("Error deleting connection:",e)}finally{P(null)}}},[]),ee=(0,s.useCallback)(async(e,r)=>{T(e);try{(await fetch(`/api/providers/${e}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({isActive:r})})).ok&&t(t=>t.map(t=>t.id===e?{...t,isActive:r}:t))}catch(e){console.error("Error updating connection status:",e)}finally{T(null)}},[]),et=(0,s.useCallback)(async e=>{if(!I?.id)return;let t=I.id,r=I.provider;try{(await fetch(`/api/providers/${t}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})).ok&&(await V(),O(!1),_(null),m.wb.includes(r)&&await W(t,r))}catch(e){console.error("Error saving connection:",e)}},[I,V,W]);(0,s.useEffect)(()=>{let e=!1;return fetch("/api/proxy-pools?isActive=true",{cache:"no-store"}).then(e=>e.json()).then(t=>{!e&&t?.proxyPools&&M(t.proxyPools)}).catch(()=>{}),()=>{e=!0}},[]);let er=(0,s.useCallback)(async()=>{if(!k){$(!0),E(60);try{let e=(await V()).filter(x);await Promise.all(e.map(e=>W(e.id,e.provider))),N(new Date)}catch(e){console.error("Error refreshing all providers:",e)}finally{$(!1)}}},[k,V,W]);(0,s.useEffect)(()=>{(async()=>{S(!0);let e=await V();S(!1);let t=e.filter(x),r={};t.forEach(e=>{r[e.id]=!0}),f(r),await Promise.all(t.map(e=>W(e.id,e.provider))),N(new Date)})()},[]),(0,s.useEffect)(()=>{window.localStorage.setItem(h,String(v))},[v]),(0,s.useEffect)(()=>{if(!v){B.current&&(clearInterval(B.current),B.current=null),Q.current&&(clearInterval(Q.current),Q.current=null);return}return B.current=setInterval(()=>{er()},6e4),Q.current=setInterval(()=>{E(e=>e<=1?60:e-1)},1e3),()=>{B.current&&clearInterval(B.current),Q.current&&clearInterval(Q.current)}},[v,er]),(0,s.useEffect)(()=>{let e=()=>{document.hidden?(B.current&&(clearInterval(B.current),B.current=null),Q.current&&(clearInterval(Q.current),Q.current=null)):v&&(B.current=setInterval(er,6e4),Q.current=setInterval(()=>{E(e=>e<=1?60:e-1)},1e3))};return document.addEventListener("visibilitychange",e),()=>{document.removeEventListener("visibilitychange",e)}},[v,er]);let ea=e.filter(x),es=ea.filter(e=>"all"===U||e.provider===U),el=e=>{let t=(r[e.id]?.quotas||[]).map(e=>e.resetAt?new Date(e.resetAt).getTime():1/0).filter(e=>Number.isFinite(e));return t.length>0?Math.min(...t):1/0},ei=[...es].sort((e,t)=>{if(R){let r=el(e)-el(t);if(0!==r)return r}let r=m.wb.indexOf(e.provider),a=m.wb.indexOf(t.provider);return r!==a?r-a:e.provider.localeCompare(t.provider)}),en=e=>{let t=r[e.id]?.quotas;return!!t?.length&&t.some(e=>!!e.total&&!(e.total<=0)&&5>=n(e.used,e.total))},eo=(0,s.useCallback)(async(e,r)=>{if(e.length&&!H){Y(!0);try{await Promise.all(e.map(e=>fetch(`/api/providers/${e}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({isActive:r})}))),t(t=>t.map(t=>e.includes(t.id)?{...t,isActive:r}:t))}catch(e){console.error("Error bulk toggling connections:",e)}finally{Y(!1)}}},[H]),ec=Array.from(new Set(ea.map(e=>e.provider))).sort(),ed="all"===U?"All providers":U;return(ei.length,Object.values(r).filter(e=>e?.quotas?.length>0).length,Object.values(r).reduce((e,t)=>t?.quotas?e+ +!!t.quotas.some(e=>30>n(e.used,e.total)&&e.total>0):e,0),A||0!==ei.length)?(0,a.jsxs)("div",{className:"space-y-6",children:[(0,a.jsxs)("div",{className:"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",children:[(0,a.jsx)("div",{className:"flex flex-col gap-1 sm:flex-row sm:items-center sm:gap-3",children:(0,a.jsx)("h2",{className:"text-xl font-semibold text-text-primary",children:"Provider Limits"})}),(0,a.jsxs)("div",{className:"flex flex-wrap items-center gap-1.5",children:[(0,a.jsxs)("div",{className:"relative",children:[(0,a.jsxs)("button",{type:"button",onClick:()=>G(e=>!e),className:"flex h-8 items-center justify-between gap-1 rounded-lg border border-black/10 bg-black/[0.02] px-2 text-xs text-text-primary transition-colors hover:bg-black/5 dark:border-white/10 dark:bg-white/[0.03] dark:hover:bg-white/10","aria-haspopup":"menu","aria-expanded":J,title:"Filter quota providers",children:[(0,a.jsxs)("span",{className:"flex min-w-0 items-center gap-1.5",children:["all"===U?(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px] text-text-muted",children:"apps"}):(0,a.jsx)(l.A,{src:`/providers/${U}.png`,alt:U,size:18,className:"size-[18px] rounded object-contain",fallbackText:U.slice(0,2).toUpperCase()}),(0,a.jsx)("span",{className:"truncate capitalize hidden lg:inline",children:ed})]}),(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px] text-text-muted",children:"expand_more"})]}),J&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("button",{type:"button",className:"fixed inset-0 z-30 bg-transparent","aria-label":"Close provider filter",onClick:()=>G(!1)}),(0,a.jsxs)("div",{className:"absolute left-0 z-40 mt-2 w-64 overflow-hidden rounded-2xl border border-black/10 bg-surface/95 p-1.5 shadow-xl shadow-black/10 backdrop-blur dark:border-white/10 dark:bg-surface/95 sm:w-72",children:[(0,a.jsxs)("button",{type:"button",onClick:()=>{F("all"),G(!1)},className:`flex w-full items-center gap-3 rounded-xl px-3 py-2.5 text-left text-sm transition-colors ${"all"===U?"bg-primary/10 text-primary":"text-text-primary hover:bg-black/5 dark:hover:bg-white/10"}`,children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[22px]",children:"apps"}),(0,a.jsx)("span",{className:"font-medium",children:"All providers"}),"all"===U&&(0,a.jsx)("span",{className:"material-symbols-outlined ml-auto text-[20px]",children:"check"})]}),(0,a.jsx)("div",{className:"my-1 h-px bg-black/10 dark:bg-white/10"}),(0,a.jsx)("div",{className:"max-h-72 overflow-y-auto pr-1",children:ec.map(e=>(0,a.jsxs)("button",{type:"button",onClick:()=>{F(e),G(!1)},className:`flex w-full items-center gap-3 rounded-xl px-3 py-2.5 text-left text-sm transition-colors ${U===e?"bg-primary/10 text-primary":"text-text-primary hover:bg-black/5 dark:hover:bg-white/10"}`,children:[(0,a.jsx)(l.A,{src:`/providers/${e}.png`,alt:e,size:24,className:"size-6 rounded-md object-contain",fallbackText:e.slice(0,2).toUpperCase()}),(0,a.jsx)("span",{className:"font-medium capitalize",children:e}),U===e&&(0,a.jsx)("span",{className:"material-symbols-outlined ml-auto text-[20px]",children:"check"})]},e))})]})]})]}),(0,a.jsxs)("button",{type:"button",onClick:()=>K(e=>!e),className:`flex h-8 shrink-0 items-center gap-1 rounded-lg border px-2 text-xs transition-colors ${R?"border-amber-500/40 bg-amber-500/10 text-amber-500":"border-black/10 text-text-primary hover:bg-black/5 dark:border-white/10 dark:hover:bg-white/5"}`,title:"Sort accounts by earliest quota reset time",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"hourglass_top"}),(0,a.jsx)("span",{className:"hidden sm:inline",children:"Expiring first"})]}),(0,a.jsxs)("button",{type:"button",onClick:()=>{eo(ei.filter(e=>(e.isActive??!0)&&en(e)).map(e=>e.id),!1)},disabled:H,className:"flex h-8 shrink-0 items-center gap-1 rounded-lg border border-red-500/30 px-2 text-xs text-red-500 transition-colors hover:bg-red-500/10 disabled:opacity-50",title:"Disable connections with depleted quota (within current filter)",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"block"}),(0,a.jsx)("span",{className:"hidden sm:inline",children:"Turn off Empty"})]}),(0,a.jsxs)("button",{type:"button",onClick:()=>{eo(ei.filter(e=>!(e.isActive??!0)&&!en(e)).map(e=>e.id),!0)},disabled:H,className:"flex h-8 shrink-0 items-center gap-1 rounded-lg border border-emerald-500/30 px-2 text-xs text-emerald-500 transition-colors hover:bg-emerald-500/10 disabled:opacity-50",title:"Enable connections that still have quota (within current filter)",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"check_circle"}),(0,a.jsx)("span",{className:"hidden sm:inline",children:"Turn on Available"})]}),(0,a.jsxs)("button",{onClick:()=>j(e=>!e),className:"flex h-8 shrink-0 items-center gap-1 rounded-lg border border-black/10 px-2 text-xs transition-colors hover:bg-black/5 dark:border-white/10 dark:hover:bg-white/5",title:v?"Disable auto-refresh":"Enable auto-refresh",children:[(0,a.jsx)("span",{className:`material-symbols-outlined text-[14px] ${v?"text-primary":"text-text-muted"}`,children:v?"toggle_on":"toggle_off"}),(0,a.jsx)("span",{className:"hidden text-text-primary sm:inline",children:"Auto-refresh"}),v&&(0,a.jsxs)("span",{className:"text-[10px] text-text-muted tabular-nums",children:["(",C,"s)"]})]}),(0,a.jsx)("button",{type:"button",onClick:er,disabled:k,className:"flex h-8 shrink-0 items-center gap-1 rounded-lg border border-black/10 px-2 text-xs text-text-primary transition-colors hover:bg-black/5 dark:border-white/10 dark:hover:bg-white/5 disabled:opacity-50",title:"Refresh all",children:(0,a.jsx)("span",{className:`material-symbols-outlined text-[14px] ${k?"animate-spin":""}`,children:"refresh"})})]})]}),(0,a.jsx)("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-3",children:ei.map(e=>{let t,s,i=r[e.id],n=b[e.id],u=g[e.id],m=!1===e.isActive,x=q===e.id||D===e.id;return(0,a.jsxs)(d.default,{padding:"none",className:`min-w-0 ${m?"opacity-60":""}`,children:[(0,a.jsx)("div",{className:"px-3 py-2 border-b border-black/10 dark:border-white/10",children:(0,a.jsxs)("div",{className:"flex items-center justify-between gap-2",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2 min-w-0",children:[(0,a.jsx)("div",{className:"w-8 h-8 shrink-0 rounded-md flex items-center justify-center overflow-hidden",children:(0,a.jsx)(l.A,{src:`/providers/${e.provider}.png`,alt:e.provider,size:32,className:"object-contain",fallbackText:e.provider?.slice(0,2).toUpperCase()||"PR"})}),(0,a.jsxs)("div",{className:"min-w-0",children:[(0,a.jsx)("h3",{className:"text-sm font-semibold text-text-primary capitalize truncate",children:e.provider}),(s=(t=e=>"string"==typeof e&&/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e))(e.email)?e.email:(t(e.name),e.name))?(0,a.jsx)("p",{className:"text-xs text-text-muted truncate",children:s}):null]})]}),(0,a.jsxs)("div",{className:"flex items-center gap-1 shrink-0",children:[(0,a.jsx)("button",{type:"button",onClick:()=>X(e.id,e.provider),disabled:n||x,className:"p-1.5 rounded-lg hover:bg-black/5 dark:hover:bg-white/5 transition-colors disabled:opacity-50",title:"Refresh quota",children:(0,a.jsx)("span",{className:`material-symbols-outlined text-[18px] text-text-muted ${n?"animate-spin":""}`,children:"refresh"})}),(0,a.jsx)("button",{type:"button",onClick:()=>{_(e),O(!0)},disabled:x,className:"p-1.5 rounded-lg hover:bg-black/5 dark:hover:bg-white/5 text-text-muted hover:text-primary transition-colors disabled:opacity-50",title:"Edit connection",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"edit"})}),(0,a.jsx)("button",{type:"button",onClick:()=>Z(e.id),disabled:x,className:"p-1.5 rounded-lg hover:bg-red-500/10 text-red-500 transition-colors disabled:opacity-50",title:"Delete connection",children:(0,a.jsx)("span",{className:`material-symbols-outlined text-[18px] ${q===e.id?"animate-pulse":""}`,children:"delete"})}),(0,a.jsx)("div",{className:"inline-flex items-center pl-0.5",title:e.isActive??!0?"Disable connection":"Enable connection",children:(0,a.jsx)(c.default,{size:"sm",checked:e.isActive??!0,disabled:x,onChange:t=>ee(e.id,t)})})]})]})}),(0,a.jsx)("div",{className:"px-2 py-1.5",children:n?(0,a.jsx)("div",{className:"text-center py-5 text-text-muted",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[28px] animate-spin",children:"progress_activity"})}):u?(0,a.jsxs)("div",{className:"text-center py-5",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[28px] text-red-500",children:"error"}),(0,a.jsx)("p",{className:"mt-1.5 text-xs text-text-muted",children:u})]}):i?.message?(0,a.jsx)("div",{className:"text-center py-5",children:(0,a.jsx)("p",{className:"text-xs text-text-muted",children:i.message})}):(0,a.jsx)(o,{quotas:i?.quotas,compact:!0})})]},e.id)})}),(0,a.jsx)(u.wI,{isOpen:L,connection:I,proxyPools:z,onSave:et,onClose:()=>{O(!1),_(null)}})]}):(0,a.jsx)(d.default,{padding:"lg",children:(0,a.jsxs)("div",{className:"text-center py-12",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[64px] text-text-muted opacity-20",children:"cloud_off"}),(0,a.jsx)("h3",{className:"mt-4 text-lg font-semibold text-text-primary",children:"No Providers Connected"}),(0,a.jsx)("p",{className:"mt-2 text-sm text-text-muted max-w-md mx-auto",children:"Connect to providers with OAuth to track your API quota limits and usage."})]})})}},83376:(e,t,r)=>{Promise.resolve().then(r.bind(r,75095)),Promise.resolve().then(r.bind(r,25086))}},e=>{e.O(0,[2574,3862,2194,698,1321,5497,8441,3794,7358],()=>e(e.s=83376)),_N_E=e.O()}]);
@@ -1 +0,0 @@
1
- (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3826],{75095:(e,t,r)=>{"use strict";r.d(t,{default:()=>p});var a=r(95155),s=r(12115),l=r(57250),i=r(45564);function n(e,t){return t&&0!==t?!e||e<0?100:e>=t?0:Math.round((t-e)/t*100):0}function o({quotas:e=[],compact:t=!1}){if(!e||0===e.length)return null;let r=t?"py-1 px-1.5":"py-2 px-3",s=t?"text-[11px]":"text-sm",l=t?"text-[11px]":"text-sm",i=t?"text-[10px] leading-tight":"text-xs";return(0,a.jsx)("div",{className:"overflow-x-auto",children:(0,a.jsx)("table",{className:"w-full table-fixed text-left",children:(0,a.jsx)("tbody",{children:e.map((e,o)=>{let c=void 0!==e.remainingPercentage?Math.round(e.remainingPercentage):n(e.used,e.total),d=c>70?{text:"text-green-600 dark:text-green-400",bg:"bg-green-500",bgLight:"bg-green-500/10",emoji:"\uD83D\uDFE2"}:c>=30?{text:"text-yellow-600 dark:text-yellow-400",bg:"bg-yellow-500",bgLight:"bg-yellow-500/10",emoji:"\uD83D\uDFE1"}:{text:"text-red-600 dark:text-red-400",bg:"bg-red-500",bgLight:"bg-red-500/10",emoji:"\uD83D\uDD34"},u=function(e){if(!e)return"-";try{let t="string"==typeof e?new Date(e):e,r=new Date,a=t-r;if(a<=0)return"-";let s=Math.ceil(a/6e4);if(s<60)return`${s}m`;let l=Math.floor(s/60),i=s%60;if(l<24)return`${l}h ${i}m`;let n=Math.floor(l/24);return`${n}d ${l%24}h ${i}m`}catch(e){return"-"}}(e.resetAt),m=function(e){if(!e)return null;try{let t=new Date(e),r=new Date,a=new Date(r.getFullYear(),r.getMonth(),r.getDate()),s=new Date(a);s.setDate(s.getDate()+1);let l="";l=t>=a&&t<s?"Today":t>=s&&t<new Date(s.getTime()+864e5)?"Tomorrow":t.toLocaleDateString("en-US",{month:"short",day:"numeric"});let i=t.toLocaleTimeString("en-US",{hour:"numeric",minute:"2-digit",hour12:!0});return`${l}, ${i}`}catch{return null}}(e.resetAt);return(0,a.jsxs)("tr",{className:"border-b border-black/5 dark:border-white/5 hover:bg-black/[0.02] dark:hover:bg-white/[0.02] transition-colors",children:[(0,a.jsx)("td",{className:`${r} w-[30%]`,children:(0,a.jsxs)("div",{className:"flex items-center gap-1.5 min-w-0",children:[(0,a.jsx)("span",{className:"text-[10px] shrink-0",children:d.emoji}),(0,a.jsx)("span",{className:`${s} font-medium text-text-primary truncate`,children:e.name})]})}),(0,a.jsx)("td",{className:`${r} w-[45%]`,children:(0,a.jsxs)("div",{className:t?"space-y-1":"space-y-1.5",children:[(0,a.jsx)("div",{className:`${t?"h-1":"h-1.5"} rounded-full overflow-hidden border ${d.bgLight} ${0===c?"border-black/10 dark:border-white/10":"border-transparent"}`,children:(0,a.jsx)("div",{className:`h-full transition-all duration-300 ${d.bg}`,style:{width:`${Math.min(c,100)}%`}})}),(0,a.jsxs)("div",{className:`flex items-center justify-between ${t?"text-[10px]":"text-xs"}`,children:[(0,a.jsxs)("span",{className:"text-text-muted",children:[e.used.toLocaleString()," / ",e.total>0?e.total.toLocaleString():"∞"]}),(0,a.jsxs)("span",{className:`font-medium ${d.text}`,children:[c,"%"]})]})]})}),(0,a.jsx)("td",{className:`${r} w-[25%]`,children:"-"!==u||m?t?(0,a.jsx)("div",{className:`${l} text-text-primary font-medium truncate`,title:m||"",children:"-"!==u?`in ${u}`:m}):(0,a.jsxs)("div",{className:"space-y-0.5",children:["-"!==u&&(0,a.jsxs)("div",{className:`${l} text-text-primary font-medium`,children:["in ",u]}),m&&(0,a.jsx)("div",{className:`${i} text-text-muted`,children:m})]}):(0,a.jsx)("div",{className:`${l} text-text-muted italic`,children:"N/A"})})]},o)})})})})}var c=r(98542),d=r(84588),u=r(35497),m=r(52679);let x=e=>m.wb.includes(e.provider)&&("oauth"===e.authType||m.jO.includes(e.provider)),h="quotaAutoRefresh";function p(){let[e,t]=(0,s.useState)([]),[r,p]=(0,s.useState)({}),[b,f]=(0,s.useState)({}),[g,y]=(0,s.useState)({}),[v,j]=(0,s.useState)(()=>{let e=window.localStorage.getItem(h);return null===e||"true"===e}),[w,N]=(0,s.useState)(null),[k,$]=(0,s.useState)(!1),[C,E]=(0,s.useState)(60),[A,S]=(0,s.useState)(!0),[q,P]=(0,s.useState)(null),[D,T]=(0,s.useState)(null),[L,O]=(0,s.useState)(!1),[I,_]=(0,s.useState)(null),[z,M]=(0,s.useState)([]),[U,F]=(0,s.useState)("all"),[R,K]=(0,s.useState)(!1),[J,G]=(0,s.useState)(!1),[H,Y]=(0,s.useState)(!1),B=(0,s.useRef)(null),Q=(0,s.useRef)(null),V=(0,s.useCallback)(async()=>{try{let e=await fetch("/api/providers/client");if(!e.ok)throw Error("Failed to fetch connections");let r=(await e.json()).connections||[];return t(r),r}catch(e){return console.error("Error fetching connections:",e),t([]),[]}},[]),W=(0,s.useCallback)(async(e,t)=>{f(t=>({...t,[e]:!0})),y(t=>({...t,[e]:null}));try{console.log(`[ProviderLimits] Fetching quota for ${t} (${e})`);let r=await fetch(`/api/usage/${e}`);if(!r.ok){let a=(await r.json().catch(()=>({}))).error||r.statusText;if(404===r.status)return void console.warn(`[ProviderLimits] Connection not found for ${t}, skipping`);if(401===r.status){console.warn(`[ProviderLimits] Auth error for ${t}:`,a),p(t=>({...t,[e]:{quotas:[],message:a}}));return}throw Error(`HTTP ${r.status}: ${a}`)}let a=await r.json();console.log(`[ProviderLimits] Got quota for ${t}:`,a);let s=function(e,t){if(!t||"object"!=typeof t)return[];let r=[];try{switch(e.toLowerCase()){case"github":default:t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null})});break;case"antigravity":t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:t.displayName||e,modelKey:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null,remainingPercentage:t.remainingPercentage})});break;case"codex":t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null})});break;case"kiro":t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null})});break;case"claude":t.message?r.push({name:"error",used:0,total:0,resetAt:null,message:t.message}):t.quotas&&Object.entries(t.quotas).forEach(([e,t])=>{r.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null})})}}catch(t){return console.error(`Error parsing quota data for ${e}:`,t),[]}let a=(0,i.KC)(e);if(a.length>0){let e=new Map(a.map((e,t)=>[e.id,t]));r.sort((t,r)=>{let a=t.modelKey||t.name,s=r.modelKey||r.name;return(e.get(a)??999)-(e.get(s)??999)})}return r}(t,a);p(t=>({...t,[e]:{quotas:s,plan:a.plan||null,message:a.message||null,raw:a}}))}catch(r){console.error(`[ProviderLimits] Error fetching quota for ${t} (${e}):`,r),y(t=>({...t,[e]:r.message||"Failed to fetch quota"}))}finally{f(t=>({...t,[e]:!1}))}},[]),X=(0,s.useCallback)(async(e,t)=>{await W(e,t),N(new Date)},[W]),Z=(0,s.useCallback)(async e=>{if(confirm("Delete this connection?")){P(e);try{(await fetch(`/api/providers/${e}`,{method:"DELETE"})).ok&&(t(t=>t.filter(t=>t.id!==e)),p(t=>{let r={...t};return delete r[e],r}),f(t=>{let r={...t};return delete r[e],r}),y(t=>{let r={...t};return delete r[e],r}))}catch(e){console.error("Error deleting connection:",e)}finally{P(null)}}},[]),ee=(0,s.useCallback)(async(e,r)=>{T(e);try{(await fetch(`/api/providers/${e}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({isActive:r})})).ok&&t(t=>t.map(t=>t.id===e?{...t,isActive:r}:t))}catch(e){console.error("Error updating connection status:",e)}finally{T(null)}},[]),et=(0,s.useCallback)(async e=>{if(!I?.id)return;let t=I.id,r=I.provider;try{(await fetch(`/api/providers/${t}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})).ok&&(await V(),O(!1),_(null),m.wb.includes(r)&&await W(t,r))}catch(e){console.error("Error saving connection:",e)}},[I,V,W]);(0,s.useEffect)(()=>{let e=!1;return fetch("/api/proxy-pools?isActive=true",{cache:"no-store"}).then(e=>e.json()).then(t=>{!e&&t?.proxyPools&&M(t.proxyPools)}).catch(()=>{}),()=>{e=!0}},[]);let er=(0,s.useCallback)(async()=>{if(!k){$(!0),E(60);try{let e=(await V()).filter(x);await Promise.all(e.map(e=>W(e.id,e.provider))),N(new Date)}catch(e){console.error("Error refreshing all providers:",e)}finally{$(!1)}}},[k,V,W]);(0,s.useEffect)(()=>{(async()=>{S(!0);let e=await V();S(!1);let t=e.filter(x),r={};t.forEach(e=>{r[e.id]=!0}),f(r),await Promise.all(t.map(e=>W(e.id,e.provider))),N(new Date)})()},[]),(0,s.useEffect)(()=>{window.localStorage.setItem(h,String(v))},[v]),(0,s.useEffect)(()=>{if(!v){B.current&&(clearInterval(B.current),B.current=null),Q.current&&(clearInterval(Q.current),Q.current=null);return}return B.current=setInterval(()=>{er()},6e4),Q.current=setInterval(()=>{E(e=>e<=1?60:e-1)},1e3),()=>{B.current&&clearInterval(B.current),Q.current&&clearInterval(Q.current)}},[v,er]),(0,s.useEffect)(()=>{let e=()=>{document.hidden?(B.current&&(clearInterval(B.current),B.current=null),Q.current&&(clearInterval(Q.current),Q.current=null)):v&&(B.current=setInterval(er,6e4),Q.current=setInterval(()=>{E(e=>e<=1?60:e-1)},1e3))};return document.addEventListener("visibilitychange",e),()=>{document.removeEventListener("visibilitychange",e)}},[v,er]);let ea=e.filter(x),es=ea.filter(e=>"all"===U||e.provider===U),el=e=>{let t=(r[e.id]?.quotas||[]).map(e=>e.resetAt?new Date(e.resetAt).getTime():1/0).filter(e=>Number.isFinite(e));return t.length>0?Math.min(...t):1/0},ei=[...es].sort((e,t)=>{if(R){let r=el(e)-el(t);if(0!==r)return r}let r=m.wb.indexOf(e.provider),a=m.wb.indexOf(t.provider);return r!==a?r-a:e.provider.localeCompare(t.provider)}),en=e=>{let t=r[e.id]?.quotas;return!!t?.length&&t.some(e=>!!e.total&&!(e.total<=0)&&5>=n(e.used,e.total))},eo=(0,s.useCallback)(async(e,r)=>{if(e.length&&!H){Y(!0);try{await Promise.all(e.map(e=>fetch(`/api/providers/${e}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({isActive:r})}))),t(t=>t.map(t=>e.includes(t.id)?{...t,isActive:r}:t))}catch(e){console.error("Error bulk toggling connections:",e)}finally{Y(!1)}}},[H]),ec=Array.from(new Set(ea.map(e=>e.provider))).sort(),ed="all"===U?"All providers":U;return(ei.length,Object.values(r).filter(e=>e?.quotas?.length>0).length,Object.values(r).reduce((e,t)=>t?.quotas?e+ +!!t.quotas.some(e=>30>n(e.used,e.total)&&e.total>0):e,0),A||0!==ei.length)?(0,a.jsxs)("div",{className:"space-y-6",children:[(0,a.jsxs)("div",{className:"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",children:[(0,a.jsx)("div",{className:"flex flex-col gap-1 sm:flex-row sm:items-center sm:gap-3",children:(0,a.jsx)("h2",{className:"text-xl font-semibold text-text-primary",children:"Provider Limits"})}),(0,a.jsxs)("div",{className:"flex flex-wrap items-center gap-1.5",children:[(0,a.jsxs)("div",{className:"relative",children:[(0,a.jsxs)("button",{type:"button",onClick:()=>G(e=>!e),className:"flex h-8 items-center justify-between gap-1 rounded-lg border border-black/10 bg-black/[0.02] px-2 text-xs text-text-primary transition-colors hover:bg-black/5 dark:border-white/10 dark:bg-white/[0.03] dark:hover:bg-white/10","aria-haspopup":"menu","aria-expanded":J,title:"Filter quota providers",children:[(0,a.jsxs)("span",{className:"flex min-w-0 items-center gap-1.5",children:["all"===U?(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px] text-text-muted",children:"apps"}):(0,a.jsx)(l.A,{src:`/providers/${U}.png`,alt:U,size:18,className:"size-[18px] rounded object-contain",fallbackText:U.slice(0,2).toUpperCase()}),(0,a.jsx)("span",{className:"truncate capitalize hidden lg:inline",children:ed})]}),(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px] text-text-muted",children:"expand_more"})]}),J&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("button",{type:"button",className:"fixed inset-0 z-30 bg-transparent","aria-label":"Close provider filter",onClick:()=>G(!1)}),(0,a.jsxs)("div",{className:"absolute left-0 z-40 mt-2 w-64 overflow-hidden rounded-2xl border border-black/10 bg-surface/95 p-1.5 shadow-xl shadow-black/10 backdrop-blur dark:border-white/10 dark:bg-surface/95 sm:w-72",children:[(0,a.jsxs)("button",{type:"button",onClick:()=>{F("all"),G(!1)},className:`flex w-full items-center gap-3 rounded-xl px-3 py-2.5 text-left text-sm transition-colors ${"all"===U?"bg-primary/10 text-primary":"text-text-primary hover:bg-black/5 dark:hover:bg-white/10"}`,children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[22px]",children:"apps"}),(0,a.jsx)("span",{className:"font-medium",children:"All providers"}),"all"===U&&(0,a.jsx)("span",{className:"material-symbols-outlined ml-auto text-[20px]",children:"check"})]}),(0,a.jsx)("div",{className:"my-1 h-px bg-black/10 dark:bg-white/10"}),(0,a.jsx)("div",{className:"max-h-72 overflow-y-auto pr-1",children:ec.map(e=>(0,a.jsxs)("button",{type:"button",onClick:()=>{F(e),G(!1)},className:`flex w-full items-center gap-3 rounded-xl px-3 py-2.5 text-left text-sm transition-colors ${U===e?"bg-primary/10 text-primary":"text-text-primary hover:bg-black/5 dark:hover:bg-white/10"}`,children:[(0,a.jsx)(l.A,{src:`/providers/${e}.png`,alt:e,size:24,className:"size-6 rounded-md object-contain",fallbackText:e.slice(0,2).toUpperCase()}),(0,a.jsx)("span",{className:"font-medium capitalize",children:e}),U===e&&(0,a.jsx)("span",{className:"material-symbols-outlined ml-auto text-[20px]",children:"check"})]},e))})]})]})]}),(0,a.jsxs)("button",{type:"button",onClick:()=>K(e=>!e),className:`flex h-8 shrink-0 items-center gap-1 rounded-lg border px-2 text-xs transition-colors ${R?"border-amber-500/40 bg-amber-500/10 text-amber-500":"border-black/10 text-text-primary hover:bg-black/5 dark:border-white/10 dark:hover:bg-white/5"}`,title:"Sort accounts by earliest quota reset time",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"hourglass_top"}),(0,a.jsx)("span",{className:"hidden sm:inline",children:"Expiring first"})]}),(0,a.jsxs)("button",{type:"button",onClick:()=>{eo(ei.filter(e=>(e.isActive??!0)&&en(e)).map(e=>e.id),!1)},disabled:H,className:"flex h-8 shrink-0 items-center gap-1 rounded-lg border border-red-500/30 px-2 text-xs text-red-500 transition-colors hover:bg-red-500/10 disabled:opacity-50",title:"Disable connections with depleted quota (within current filter)",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"block"}),(0,a.jsx)("span",{className:"hidden sm:inline",children:"Turn off Empty"})]}),(0,a.jsxs)("button",{type:"button",onClick:()=>{eo(ei.filter(e=>!(e.isActive??!0)&&!en(e)).map(e=>e.id),!0)},disabled:H,className:"flex h-8 shrink-0 items-center gap-1 rounded-lg border border-emerald-500/30 px-2 text-xs text-emerald-500 transition-colors hover:bg-emerald-500/10 disabled:opacity-50",title:"Enable connections that still have quota (within current filter)",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px]",children:"check_circle"}),(0,a.jsx)("span",{className:"hidden sm:inline",children:"Turn on Available"})]}),(0,a.jsxs)("button",{onClick:()=>j(e=>!e),className:"flex h-8 shrink-0 items-center gap-1 rounded-lg border border-black/10 px-2 text-xs transition-colors hover:bg-black/5 dark:border-white/10 dark:hover:bg-white/5",title:v?"Disable auto-refresh":"Enable auto-refresh",children:[(0,a.jsx)("span",{className:`material-symbols-outlined text-[14px] ${v?"text-primary":"text-text-muted"}`,children:v?"toggle_on":"toggle_off"}),(0,a.jsx)("span",{className:"hidden text-text-primary sm:inline",children:"Auto-refresh"}),v&&(0,a.jsxs)("span",{className:"text-[10px] text-text-muted tabular-nums",children:["(",C,"s)"]})]}),(0,a.jsx)("button",{type:"button",onClick:er,disabled:k,className:"flex h-8 shrink-0 items-center gap-1 rounded-lg border border-black/10 px-2 text-xs text-text-primary transition-colors hover:bg-black/5 dark:border-white/10 dark:hover:bg-white/5 disabled:opacity-50",title:"Refresh all",children:(0,a.jsx)("span",{className:`material-symbols-outlined text-[14px] ${k?"animate-spin":""}`,children:"refresh"})})]})]}),(0,a.jsx)("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-3",children:ei.map(e=>{let t,s,i=r[e.id],n=b[e.id],u=g[e.id],m=!1===e.isActive,x=q===e.id||D===e.id;return(0,a.jsxs)(d.default,{padding:"none",className:`min-w-0 ${m?"opacity-60":""}`,children:[(0,a.jsx)("div",{className:"px-3 py-2 border-b border-black/10 dark:border-white/10",children:(0,a.jsxs)("div",{className:"flex items-center justify-between gap-2",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2 min-w-0",children:[(0,a.jsx)("div",{className:"w-8 h-8 shrink-0 rounded-md flex items-center justify-center overflow-hidden",children:(0,a.jsx)(l.A,{src:`/providers/${e.provider}.png`,alt:e.provider,size:32,className:"object-contain",fallbackText:e.provider?.slice(0,2).toUpperCase()||"PR"})}),(0,a.jsxs)("div",{className:"min-w-0",children:[(0,a.jsx)("h3",{className:"text-sm font-semibold text-text-primary capitalize truncate",children:e.provider}),(s=(t=e=>"string"==typeof e&&/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e))(e.email)?e.email:(t(e.name),e.name))?(0,a.jsx)("p",{className:"text-xs text-text-muted truncate",children:s}):null]})]}),(0,a.jsxs)("div",{className:"flex items-center gap-1 shrink-0",children:[(0,a.jsx)("button",{type:"button",onClick:()=>X(e.id,e.provider),disabled:n||x,className:"p-1.5 rounded-lg hover:bg-black/5 dark:hover:bg-white/5 transition-colors disabled:opacity-50",title:"Refresh quota",children:(0,a.jsx)("span",{className:`material-symbols-outlined text-[18px] text-text-muted ${n?"animate-spin":""}`,children:"refresh"})}),(0,a.jsx)("button",{type:"button",onClick:()=>{_(e),O(!0)},disabled:x,className:"p-1.5 rounded-lg hover:bg-black/5 dark:hover:bg-white/5 text-text-muted hover:text-primary transition-colors disabled:opacity-50",title:"Edit connection",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"edit"})}),(0,a.jsx)("button",{type:"button",onClick:()=>Z(e.id),disabled:x,className:"p-1.5 rounded-lg hover:bg-red-500/10 text-red-500 transition-colors disabled:opacity-50",title:"Delete connection",children:(0,a.jsx)("span",{className:`material-symbols-outlined text-[18px] ${q===e.id?"animate-pulse":""}`,children:"delete"})}),(0,a.jsx)("div",{className:"inline-flex items-center pl-0.5",title:e.isActive??!0?"Disable connection":"Enable connection",children:(0,a.jsx)(c.default,{size:"sm",checked:e.isActive??!0,disabled:x,onChange:t=>ee(e.id,t)})})]})]})}),(0,a.jsx)("div",{className:"px-2 py-1.5",children:n?(0,a.jsx)("div",{className:"text-center py-5 text-text-muted",children:(0,a.jsx)("span",{className:"material-symbols-outlined text-[28px] animate-spin",children:"progress_activity"})}):u?(0,a.jsxs)("div",{className:"text-center py-5",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[28px] text-red-500",children:"error"}),(0,a.jsx)("p",{className:"mt-1.5 text-xs text-text-muted",children:u})]}):i?.message?(0,a.jsx)("div",{className:"text-center py-5",children:(0,a.jsx)("p",{className:"text-xs text-text-muted",children:i.message})}):(0,a.jsx)(o,{quotas:i?.quotas,compact:!0})})]},e.id)})}),(0,a.jsx)(u.wI,{isOpen:L,connection:I,proxyPools:z,onSave:et,onClose:()=>{O(!1),_(null)}})]}):(0,a.jsx)(d.default,{padding:"lg",children:(0,a.jsxs)("div",{className:"text-center py-12",children:[(0,a.jsx)("span",{className:"material-symbols-outlined text-[64px] text-text-muted opacity-20",children:"cloud_off"}),(0,a.jsx)("h3",{className:"mt-4 text-lg font-semibold text-text-primary",children:"No Providers Connected"}),(0,a.jsx)("p",{className:"mt-2 text-sm text-text-muted max-w-md mx-auto",children:"Connect to providers with OAuth to track your API quota limits and usage."})]})})}},83376:(e,t,r)=>{Promise.resolve().then(r.bind(r,75095)),Promise.resolve().then(r.bind(r,25086))}},e=>{e.O(0,[2574,3862,2194,698,1321,5497,8441,3794,7358],()=>e(e.s=83376)),_N_E=e.O()}]);