ktrouter 1.0.6 → 1.0.7

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 (277) hide show
  1. package/app/.next/BUILD_ID +1 -1
  2. package/app/.next/app-path-routes-manifest.json +2 -2
  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/combos/[id]/route.js +1 -1
  45. package/app/.next/server/app/api/models/route.js +1 -1
  46. package/app/.next/server/app/api/models/test/route.js +1 -1
  47. package/app/.next/server/app/api/providers/[id]/test-models/route.js +1 -1
  48. package/app/.next/server/app/api/providers/route.js +1 -1
  49. package/app/.next/server/app/api/settings/route.js +1 -1
  50. package/app/.next/server/app/api/translator/console-logs/route.js +1 -1
  51. package/app/.next/server/app/api/translator/console-logs/stream/route.js +1 -1
  52. package/app/.next/server/app/api/update/check/route.js +1 -1
  53. package/app/.next/server/app/api/usage/[connectionId]/route.js +1 -1
  54. package/app/.next/server/app/api/v1/audio/transcriptions/route.js +1 -1
  55. package/app/.next/server/app/callback/page_client-reference-manifest.js +1 -1
  56. package/app/.next/server/app/callback.html +1 -1
  57. package/app/.next/server/app/callback.rsc +3 -3
  58. package/app/.next/server/app/callback.segments/_full.segment.rsc +3 -3
  59. package/app/.next/server/app/callback.segments/_head.segment.rsc +1 -1
  60. package/app/.next/server/app/callback.segments/_index.segment.rsc +3 -3
  61. package/app/.next/server/app/callback.segments/_tree.segment.rsc +1 -1
  62. package/app/.next/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
  63. package/app/.next/server/app/callback.segments/callback.segment.rsc +1 -1
  64. package/app/.next/server/app/dashboard/basic-chat.html +1 -1
  65. package/app/.next/server/app/dashboard/basic-chat.rsc +5 -5
  66. package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
  67. package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
  68. package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  69. package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  70. package/app/.next/server/app/dashboard/basic-chat.segments/_full.segment.rsc +5 -5
  71. package/app/.next/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
  72. package/app/.next/server/app/dashboard/basic-chat.segments/_index.segment.rsc +3 -3
  73. package/app/.next/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +1 -1
  74. package/app/.next/server/app/dashboard/cli-tools.html +1 -1
  75. package/app/.next/server/app/dashboard/cli-tools.rsc +5 -5
  76. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
  77. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
  78. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  79. package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  80. package/app/.next/server/app/dashboard/cli-tools.segments/_full.segment.rsc +5 -5
  81. package/app/.next/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
  82. package/app/.next/server/app/dashboard/cli-tools.segments/_index.segment.rsc +3 -3
  83. package/app/.next/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +1 -1
  84. package/app/.next/server/app/dashboard/combos.html +1 -1
  85. package/app/.next/server/app/dashboard/combos.rsc +5 -5
  86. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
  87. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
  88. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  89. package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  90. package/app/.next/server/app/dashboard/combos.segments/_full.segment.rsc +5 -5
  91. package/app/.next/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
  92. package/app/.next/server/app/dashboard/combos.segments/_index.segment.rsc +3 -3
  93. package/app/.next/server/app/dashboard/combos.segments/_tree.segment.rsc +1 -1
  94. package/app/.next/server/app/dashboard/endpoint.html +1 -1
  95. package/app/.next/server/app/dashboard/endpoint.rsc +5 -5
  96. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
  97. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
  98. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  99. package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  100. package/app/.next/server/app/dashboard/endpoint.segments/_full.segment.rsc +5 -5
  101. package/app/.next/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
  102. package/app/.next/server/app/dashboard/endpoint.segments/_index.segment.rsc +3 -3
  103. package/app/.next/server/app/dashboard/endpoint.segments/_tree.segment.rsc +1 -1
  104. package/app/.next/server/app/dashboard/media-providers/web.html +1 -1
  105. package/app/.next/server/app/dashboard/media-providers/web.rsc +5 -5
  106. package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +2 -2
  107. package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web.segment.rsc +1 -1
  108. package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
  109. package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  110. package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  111. package/app/.next/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +5 -5
  112. package/app/.next/server/app/dashboard/media-providers/web.segments/_head.segment.rsc +1 -1
  113. package/app/.next/server/app/dashboard/media-providers/web.segments/_index.segment.rsc +3 -3
  114. package/app/.next/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +1 -1
  115. package/app/.next/server/app/dashboard/mitm.html +1 -1
  116. package/app/.next/server/app/dashboard/mitm.rsc +5 -5
  117. package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
  118. package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
  119. package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  120. package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  121. package/app/.next/server/app/dashboard/mitm.segments/_full.segment.rsc +5 -5
  122. package/app/.next/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
  123. package/app/.next/server/app/dashboard/mitm.segments/_index.segment.rsc +3 -3
  124. package/app/.next/server/app/dashboard/mitm.segments/_tree.segment.rsc +1 -1
  125. package/app/.next/server/app/dashboard/profile.html +1 -1
  126. package/app/.next/server/app/dashboard/profile.rsc +5 -5
  127. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
  128. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
  129. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  130. package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  131. package/app/.next/server/app/dashboard/profile.segments/_full.segment.rsc +5 -5
  132. package/app/.next/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
  133. package/app/.next/server/app/dashboard/profile.segments/_index.segment.rsc +3 -3
  134. package/app/.next/server/app/dashboard/profile.segments/_tree.segment.rsc +1 -1
  135. package/app/.next/server/app/dashboard/providers/new.html +1 -1
  136. package/app/.next/server/app/dashboard/providers/new.rsc +5 -5
  137. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
  138. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
  139. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  140. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  141. package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  142. package/app/.next/server/app/dashboard/providers/new.segments/_full.segment.rsc +5 -5
  143. package/app/.next/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
  144. package/app/.next/server/app/dashboard/providers/new.segments/_index.segment.rsc +3 -3
  145. package/app/.next/server/app/dashboard/providers/new.segments/_tree.segment.rsc +1 -1
  146. package/app/.next/server/app/dashboard/providers.html +1 -1
  147. package/app/.next/server/app/dashboard/providers.rsc +5 -5
  148. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
  149. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  150. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  151. package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  152. package/app/.next/server/app/dashboard/providers.segments/_full.segment.rsc +5 -5
  153. package/app/.next/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
  154. package/app/.next/server/app/dashboard/providers.segments/_index.segment.rsc +3 -3
  155. package/app/.next/server/app/dashboard/providers.segments/_tree.segment.rsc +1 -1
  156. package/app/.next/server/app/dashboard/proxy-pools.html +1 -1
  157. package/app/.next/server/app/dashboard/proxy-pools.rsc +5 -5
  158. package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
  159. package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
  160. package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  161. package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  162. package/app/.next/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +5 -5
  163. package/app/.next/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
  164. package/app/.next/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +3 -3
  165. package/app/.next/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +1 -1
  166. package/app/.next/server/app/dashboard/quota.html +2 -2
  167. package/app/.next/server/app/dashboard/quota.rsc +6 -6
  168. package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +3 -3
  169. package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
  170. package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  171. package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  172. package/app/.next/server/app/dashboard/quota.segments/_full.segment.rsc +6 -6
  173. package/app/.next/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
  174. package/app/.next/server/app/dashboard/quota.segments/_index.segment.rsc +3 -3
  175. package/app/.next/server/app/dashboard/quota.segments/_tree.segment.rsc +1 -1
  176. package/app/.next/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  177. package/app/.next/server/app/dashboard/settings/pricing.html +1 -1
  178. package/app/.next/server/app/dashboard/settings/pricing.rsc +3 -3
  179. package/app/.next/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +3 -3
  180. package/app/.next/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
  181. package/app/.next/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +3 -3
  182. package/app/.next/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +1 -1
  183. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
  184. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
  185. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
  186. package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
  187. package/app/.next/server/app/dashboard/skills.html +1 -1
  188. package/app/.next/server/app/dashboard/skills.rsc +5 -5
  189. package/app/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills/__PAGE__.segment.rsc +2 -2
  190. package/app/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills.segment.rsc +1 -1
  191. package/app/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  192. package/app/.next/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  193. package/app/.next/server/app/dashboard/skills.segments/_full.segment.rsc +5 -5
  194. package/app/.next/server/app/dashboard/skills.segments/_head.segment.rsc +1 -1
  195. package/app/.next/server/app/dashboard/skills.segments/_index.segment.rsc +3 -3
  196. package/app/.next/server/app/dashboard/skills.segments/_tree.segment.rsc +1 -1
  197. package/app/.next/server/app/dashboard/translator.html +1 -1
  198. package/app/.next/server/app/dashboard/translator.rsc +5 -5
  199. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
  200. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
  201. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  202. package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  203. package/app/.next/server/app/dashboard/translator.segments/_full.segment.rsc +5 -5
  204. package/app/.next/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
  205. package/app/.next/server/app/dashboard/translator.segments/_index.segment.rsc +3 -3
  206. package/app/.next/server/app/dashboard/translator.segments/_tree.segment.rsc +1 -1
  207. package/app/.next/server/app/dashboard/usage.html +1 -1
  208. package/app/.next/server/app/dashboard/usage.rsc +5 -5
  209. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
  210. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
  211. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  212. package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  213. package/app/.next/server/app/dashboard/usage.segments/_full.segment.rsc +5 -5
  214. package/app/.next/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
  215. package/app/.next/server/app/dashboard/usage.segments/_index.segment.rsc +3 -3
  216. package/app/.next/server/app/dashboard/usage.segments/_tree.segment.rsc +1 -1
  217. package/app/.next/server/app/dashboard.html +1 -1
  218. package/app/.next/server/app/dashboard.rsc +5 -5
  219. package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
  220. package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  221. package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  222. package/app/.next/server/app/dashboard.segments/_full.segment.rsc +5 -5
  223. package/app/.next/server/app/dashboard.segments/_head.segment.rsc +1 -1
  224. package/app/.next/server/app/dashboard.segments/_index.segment.rsc +3 -3
  225. package/app/.next/server/app/dashboard.segments/_tree.segment.rsc +1 -1
  226. package/app/.next/server/app/index.html +1 -1
  227. package/app/.next/server/app/index.rsc +3 -3
  228. package/app/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  229. package/app/.next/server/app/index.segments/_full.segment.rsc +3 -3
  230. package/app/.next/server/app/index.segments/_head.segment.rsc +1 -1
  231. package/app/.next/server/app/index.segments/_index.segment.rsc +3 -3
  232. package/app/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  233. package/app/.next/server/app/landing/page_client-reference-manifest.js +1 -1
  234. package/app/.next/server/app/landing.html +1 -1
  235. package/app/.next/server/app/landing.rsc +3 -3
  236. package/app/.next/server/app/landing.segments/_full.segment.rsc +3 -3
  237. package/app/.next/server/app/landing.segments/_head.segment.rsc +1 -1
  238. package/app/.next/server/app/landing.segments/_index.segment.rsc +3 -3
  239. package/app/.next/server/app/landing.segments/_tree.segment.rsc +1 -1
  240. package/app/.next/server/app/landing.segments/landing/__PAGE__.segment.rsc +1 -1
  241. package/app/.next/server/app/landing.segments/landing.segment.rsc +1 -1
  242. package/app/.next/server/app/login/page_client-reference-manifest.js +1 -1
  243. package/app/.next/server/app/login.html +1 -1
  244. package/app/.next/server/app/login.rsc +4 -4
  245. package/app/.next/server/app/login.segments/_full.segment.rsc +4 -4
  246. package/app/.next/server/app/login.segments/_head.segment.rsc +1 -1
  247. package/app/.next/server/app/login.segments/_index.segment.rsc +3 -3
  248. package/app/.next/server/app/login.segments/_tree.segment.rsc +1 -1
  249. package/app/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  250. package/app/.next/server/app/login.segments/login.segment.rsc +1 -1
  251. package/app/.next/server/app/page_client-reference-manifest.js +1 -1
  252. package/app/.next/server/app-paths-manifest.json +2 -2
  253. package/app/.next/server/chunks/3110.js +1 -1
  254. package/app/.next/server/chunks/4315.js +1 -1
  255. package/app/.next/server/chunks/4632.js +1 -1
  256. package/app/.next/server/chunks/4746.js +1 -1
  257. package/app/.next/server/chunks/5718.js +4 -4
  258. package/app/.next/server/chunks/7153.js +1 -1
  259. package/app/.next/server/chunks/8895.js +1 -1
  260. package/app/.next/server/chunks/9142.js +1 -1
  261. package/app/.next/server/chunks/9609.js +1 -1
  262. package/app/.next/server/middleware-build-manifest.js +1 -1
  263. package/app/.next/server/pages/404.html +1 -1
  264. package/app/.next/server/pages/500.html +1 -1
  265. package/app/.next/static/chunks/{1321-052f0a2e4288207e.js → 1321-4b5a6b5dc2e27bb8.js} +1 -1
  266. package/app/.next/static/chunks/app/(dashboard)/dashboard/quota/page-fd3343e5e62687cc.js +1 -0
  267. package/app/.next-cli-build/static/chunks/{1321-052f0a2e4288207e.js → 1321-4b5a6b5dc2e27bb8.js} +1 -1
  268. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/quota/page-fd3343e5e62687cc.js +1 -0
  269. package/app/package.json +1 -1
  270. package/app/src/mitm/server.js +6 -6
  271. package/package.json +1 -1
  272. package/app/.next/static/chunks/app/(dashboard)/dashboard/quota/page-7ef54d2cf4eee7d0.js +0 -1
  273. package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/quota/page-7ef54d2cf4eee7d0.js +0 -1
  274. /package/app/.next/static/{r-S_1hWow1yeDi0LvTwjb → 4vJswhx16aiNl7bDC9l2Y}/_buildManifest.js +0 -0
  275. /package/app/.next/static/{r-S_1hWow1yeDi0LvTwjb → 4vJswhx16aiNl7bDC9l2Y}/_ssgManifest.js +0 -0
  276. /package/app/.next-cli-build/static/{r-S_1hWow1yeDi0LvTwjb → 4vJswhx16aiNl7bDC9l2Y}/_buildManifest.js +0 -0
  277. /package/app/.next-cli-build/static/{r-S_1hWow1yeDi0LvTwjb → 4vJswhx16aiNl7bDC9l2Y}/_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 a=r(95155),s=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",s=t?"text-[11px]":"text-sm",i=t?"text-[11px]":"text-sm",l=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,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,a=t-r;if(a<=0)return"-";let s=Math.ceil(a/6e4);if(s<60)return`${s}m`;let i=Math.floor(s/60),l=s%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,a=new Date(r.getFullYear(),r.getMonth(),r.getDate()),s=new Date(a);s.setDate(s.getDate()+1);let i="";i=t>=a&&t<s?"Today":t>=s&&t<new Date(s.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,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===o?"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(o,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:[o,"%"]})]})]})}),(0,a.jsx)("td",{className:`${r} w-[25%]`,children:"-"!==m||u?t?(0,a.jsx)("div",{className:`${i} text-text-primary font-medium truncate`,title:u||"",children:"-"!==m?`in ${m}`:u}):(0,a.jsxs)("div",{className:"space-y-0.5",children:["-"!==m&&(0,a.jsxs)("div",{className:`${i} text-text-primary font-medium`,children:["in ",m]}),u&&(0,a.jsx)("div",{className:`${l} text-text-muted`,children:u})]}):(0,a.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,s.useState)([]),[r,b]=(0,s.useState)({}),[f,y]=(0,s.useState)({}),[v,j]=(0,s.useState)({}),[w,k]=(0,s.useState)(()=>{let e=window.localStorage.getItem(g);return null===e||"true"===e}),[N,$]=(0,s.useState)(null),[C,S]=(0,s.useState)(!1),[E,A]=(0,s.useState)(60),[P,q]=(0,s.useState)(!0),[T,D]=(0,s.useState)(null),[L,O]=(0,s.useState)(null),[M,I]=(0,s.useState)(!1),[_,z]=(0,s.useState)(null),[F,U]=(0,s.useState)([]),[G,K]=(0,s.useState)("all"),[R,H]=(0,s.useState)(!1),[J,B]=(0,s.useState)(!1),[Y,Q]=(0,s.useState)(!1),V=(0,s.useRef)(null),W=(0,s.useRef)(null),X=(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([]),[]}},[]),Z=(0,s.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 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),b(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":if(t.quotas){let e=new Map;Object.entries(t.quotas).forEach(([t,r])=>{let a=n.get(t)||t,s={name:o[a]||r.displayName||a,modelKey:a,sourceModelKey:r.sourceModelKey||t,used:r.used||0,total:r.total||0,resetAt:r.resetAt||null,remainingPercentage:r.remainingPercentage},i=e.get(a);if(!i)return void e.set(a,s);let l=i.remainingPercentage??c(i.used,i.total);(s.remainingPercentage??c(s.used,s.total))<l&&e.set(a,s)}),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 a=(0,l.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);b(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),j(t=>({...t,[e]:r.message||"Failed to fetch quota"}))}finally{y(t=>({...t,[e]:!1}))}},[]),ee=(0,s.useCallback)(async(e,t)=>{await Z(e,t),$(new Date)},[Z]),et=(0,s.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,s.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)}},[]),ea=(0,s.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,s.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 es=(0,s.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,s.useEffect)(()=>{(async()=>{q(!0);let e=await X();q(!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,s.useEffect)(()=>{window.localStorage.setItem(g,String(w))},[w]),(0,s.useEffect)(()=>{if(!w){V.current&&(clearInterval(V.current),V.current=null),W.current&&(clearInterval(W.current),W.current=null);return}return V.current=setInterval(()=>{es()},6e4),W.current=setInterval(()=>{A(e=>e<=1?60:e-1)},1e3),()=>{V.current&&clearInterval(V.current),W.current&&clearInterval(W.current)}},[w,es]),(0,s.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(es,6e4),W.current=setInterval(()=>{A(e=>e<=1?60:e-1)},1e3))};return document.addEventListener("visibilitychange",e),()=>{document.removeEventListener("visibilitychange",e)}},[w,es]);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),a=x.wb.indexOf(t.provider);return r!==a?r-a:e.provider.localeCompare(t.provider)}),ec=e=>void 0!==e.remainingPercentage?e.remainingPercentage:c(e.used,e.total),ed=e=>{let t=r[e.id]?.quotas;return!!t?.length&&t.some(e=>!!e.total&&!(e.total<=0)&&5>=ec(e))},em=(0,s.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]),eu=Array.from(new Set(ei.map(e=>e.provider))).sort(),eh="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>ec(e)&&e.total>0):e,0),P||0!==eo.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:()=>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,a.jsxs)("span",{className:"flex min-w-0 items-center gap-1.5",children:["all"===G?(0,a.jsx)("span",{className:"material-symbols-outlined text-[14px] text-text-muted",children:"apps"}):(0,a.jsx)(i.A,{src:`/providers/${G}.png`,alt:G,size:18,className:"size-[18px] rounded object-contain",fallbackText:G.slice(0,2).toUpperCase()}),(0,a.jsx)("span",{className:"truncate capitalize hidden lg:inline",children:eh})]}),(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:()=>B(!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:()=>{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,a.jsx)("span",{className:"material-symbols-outlined text-[22px]",children:"apps"}),(0,a.jsx)("span",{className:"font-medium",children:"All providers"}),"all"===G&&(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:eu.map(e=>(0,a.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,a.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,a.jsx)("span",{className:"font-medium capitalize",children:e}),G===e&&(0,a.jsx)("span",{className:"material-symbols-outlined ml-auto text-[20px]",children:"check"})]},e))})]})]})]}),(0,a.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,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:()=>{em(eo.filter(e=>(e.isActive??!0)&&ed(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,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:()=>{em(eo.filter(e=>!(e.isActive??!0)&&!ed(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,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:()=>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,a.jsx)("span",{className:`material-symbols-outlined text-[14px] ${w?"text-primary":"text-text-muted"}`,children:w?"toggle_on":"toggle_off"}),(0,a.jsx)("span",{className:"hidden text-text-primary sm:inline",children:"Auto-refresh"}),w&&(0,a.jsxs)("span",{className:"text-[10px] text-text-muted tabular-nums",children:["(",E,"s)"]})]}),(0,a.jsx)("button",{type:"button",onClick:es,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,a.jsx)("span",{className:`material-symbols-outlined text-[14px] ${C?"animate-spin":""}`,children:"refresh"})})]})]}),(0,a.jsx)("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-3",children:eo.map(e=>{let t,s,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,a.jsxs)(u.default,{padding:"none",className:`min-w-0 ${c?"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)(i.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:()=>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,a.jsx)("span",{className:`material-symbols-outlined text-[18px] text-text-muted ${n?"animate-spin":""}`,children:"refresh"})}),(0,a.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,a.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"edit"})}),(0,a.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,a.jsx)("span",{className:`material-symbols-outlined text-[18px] ${T===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)(m.default,{size:"sm",checked:e.isActive??!0,disabled:h,onChange:t=>er(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"})}):o?(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:o})]}):l?.message?(0,a.jsx)("div",{className:"text-center py-5",children:(0,a.jsx)("p",{className:"text-xs text-text-muted",children:l.message})}):(0,a.jsx)(d,{quotas:l?.quotas,compact:!0})})]},e.id)})}),(0,a.jsx)(h.wI,{isOpen:M,connection:_,proxyPools:F,onSave:ea,onClose:()=>{I(!1),z(null)}})]}):(0,a.jsx)(u.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()}]);
package/app/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ktrouter",
3
- "version": "1.0.6",
3
+ "version": "1.0.7",
4
4
  "description": "KTRouter - AI proxy router with web dashboard",
5
5
  "scripts": {
6
6
  "dev": "next dev --webpack --port 3008",
@@ -1,4 +1,4 @@
1
- var K=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Zt=K((Ad,Fn)=>{var s0=require("fs"),kr=require("path"),Pn=require("os"),xa="ktrouter";function On(){return process.platform==="win32"?kr.join(process.env.APPDATA||kr.join(Pn.homedir(),"AppData","Roaming"),xa):kr.join(Pn.homedir(),`.${xa}`)}function o0(){let e=process.env.DATA_DIR;if(!e)return On();try{return s0.mkdirSync(e,{recursive:!0}),e}catch(t){if(t?.code==="EACCES"||t?.code==="EPERM")return console.warn(`[DATA_DIR] '${e}' not writable \u2192 fallback ~/.${xa}`),On();throw t}}var Vn=o0(),u0=kr.join(Vn,"mitm");Fn.exports={DATA_DIR:Vn,MITM_DIR:u0}});var Sa=K((Id,Kn)=>{var l0=["daily-cloudcode-pa.googleapis.com","cloudcode-pa.googleapis.com","api.individual.githubcopilot.com","q.us-east-1.amazonaws.com","codewhisperer.us-east-1.amazonaws.com","api2.cursor.sh"],f0={antigravity:[":generateContent",":streamGenerateContent"],copilot:["/chat/completions","/v1/messages","/responses"],kiro:["/generateAssistantResponse"],cursor:["/BidiAppend","/RunSSE","/RunPoll","/Run"]},c0={antigravity:{"gemini-default":"gemini-3.5-flash-high","gemini-3-flash-agent":"gemini-3.5-flash-high","gemini-3-flash":"gemini-3.5-flash-medium","gemini-3.0-flash":"gemini-3.5-flash-medium","gemini-3-pro":"gemini-3.1-pro-high","gemini-3.1-pro":"gemini-3.1-pro-high","gemini-3.5-flash":"gemini-3.5-flash-high","gemini-3.5-flash-low":"gemini-3.5-flash-medium","gemini-pro-agent":"gemini-3.1-pro-high","claude-sonnet-4-6":"claude-sonnet-4-6-thinking","claude-opus-4-6":"claude-opus-4-6-thinking","gpt-oss-120b":"gpt-oss-120b-medium"}},d0={antigravity:[{match:/flash.*high|high.*flash/i,alias:"gemini-3.5-flash-high"},{match:/flash.*medium|medium.*flash|flash.*low|low.*flash/i,alias:"gemini-3.5-flash-medium"},{match:/flash/i,alias:"gemini-3.5-flash-medium"},{match:/pro.*low|low.*pro/i,alias:"gemini-3.1-pro-low"},{match:/gemini.*pro|pro.*gemini/i,alias:"gemini-3.1-pro-high"},{match:/opus/i,alias:"claude-opus-4-6-thinking"},{match:/sonnet|claude/i,alias:"claude-sonnet-4-6-thinking"},{match:/gpt.*oss|oss/i,alias:"gpt-oss-120b-medium"}]},h0=["recordCodeAssistMetrics","recordTrajectoryAnalytics","fetchAdminControls","listExperiments","fetchUserInfo"];function p0(e){let t=(e||"").split(":")[0];return t==="api.individual.githubcopilot.com"?"copilot":t==="daily-cloudcode-pa.googleapis.com"||t==="cloudcode-pa.googleapis.com"?"antigravity":t==="q.us-east-1.amazonaws.com"||t==="codewhisperer.us-east-1.amazonaws.com"?"kiro":t==="api2.cursor.sh"?"cursor":null}Kn.exports={TARGET_HOSTS:l0,URL_PATTERNS:f0,MODEL_SYNONYMS:c0,MODEL_PATTERNS:d0,LOG_BLACKLIST_URL_PARTS:h0,getToolForHost:p0}});var Mt=K((Bd,Gn)=>{var Ur=require("fs"),Aa=require("path"),Ta=require("zlib"),{DATA_DIR:g0}=Zt(),{LOG_BLACKLIST_URL_PARTS:y0}=Sa();function Mn(){return new Date().toLocaleTimeString("en-US",{hour12:!1})}var v0=e=>console.log(`[${Mn()}] [MITM] ${e}`),m0=e=>console.error(`[${Mn()}] \u274C [MITM] ${e}`),Pr=Aa.join(g0,"logs","mitm");Ur.existsSync(Pr)||Ur.mkdirSync(Pr,{recursive:!0});var C0=/^\s*(\{\s*\}|\[\s*\]|null)?\s*$/;function qn(e,t=80){return String(e).replace(/[^a-zA-Z0-9]/g,"_").substring(0,t)}function Hn(e){return e?y0.some(t=>e.includes(t)):!1}function E0(e,t){if(!e||e.length===0)return e;try{let a=(t||"").toLowerCase();if(a.includes("gzip"))return Ta.gunzipSync(e);if(a.includes("br"))return Ta.brotliDecompressSync(e);if(a.includes("deflate"))return Ta.inflateSync(e)}catch{}return e}function x0(e,t,a="raw"){if(Hn(e.url))return null;try{let r=new Date().toISOString().replace(/[:.]/g,"-"),n=qn((e.headers.host||"")+e.url),s=Aa.join(Pr,`${r}_${a}_${n}.req.json`),i=null;try{i=JSON.parse(t.toString())}catch{}return Ur.writeFileSync(s,JSON.stringify({method:e.method,url:e.url,host:e.headers.host,headers:e.headers,body:i??t.toString("utf8")},null,2)),s}catch{return null}}function S0(e,t="raw"){if(Hn(e.url))return null;let a=new Date().toISOString().replace(/[:.]/g,"-"),r=qn((e.headers.host||"")+e.url),n=Aa.join(Pr,`${a}_${t}_${r}.res.txt`),s=0,i={},o=[];return{writeHeader:(u,l)=>{s=u,i=l||{}},writeChunk:u=>{u!=null&&o.push(Buffer.isBuffer(u)?u:Buffer.from(u))},end:()=>{try{let u=Buffer.concat(o),l=i["content-encoding"]||i["Content-Encoding"],c=E0(u,l).toString("utf8");if(C0.test(c))return;let g={...i};delete g["content-encoding"],delete g["Content-Encoding"];let m=`STATUS: ${s}
1
+ var K=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Zt=K((Ad,Fn)=>{var s0=require("fs"),kr=require("path"),Pn=require("os"),xa="ktrouter";function On(){return process.platform==="win32"?kr.join(process.env.APPDATA||kr.join(Pn.homedir(),"AppData","Roaming"),xa):kr.join(Pn.homedir(),`.${xa}`)}function o0(){let e=process.env.DATA_DIR;if(!e)return On();try{return s0.mkdirSync(e,{recursive:!0}),e}catch(t){if(t?.code==="EACCES"||t?.code==="EPERM")return console.warn(`[DATA_DIR] '${e}' not writable \u2192 fallback ~/.${xa}`),On();throw t}}var Vn=o0(),u0=kr.join(Vn,"mitm");Fn.exports={DATA_DIR:Vn,MITM_DIR:u0}});var Sa=K((Id,Kn)=>{var l0=["daily-cloudcode-pa.googleapis.com","cloudcode-pa.googleapis.com","api.individual.githubcopilot.com","q.us-east-1.amazonaws.com","codewhisperer.us-east-1.amazonaws.com","api2.cursor.sh"],f0={antigravity:[":generateContent",":streamGenerateContent"],copilot:["/chat/completions","/v1/messages","/responses"],kiro:["/generateAssistantResponse"],cursor:["/BidiAppend","/RunSSE","/RunPoll","/Run"]},c0={antigravity:{"gemini-default":"gemini-3.5-flash-high","gemini-3-flash-agent":"gemini-3.5-flash-high","gemini-3-flash":"gemini-3.5-flash-medium","gemini-3.0-flash":"gemini-3.5-flash-medium","gemini-3-pro":"gemini-3.1-pro-high","gemini-3.1-pro":"gemini-3.1-pro-high","gemini-3.5-flash":"gemini-3.5-flash-high","gemini-3.5-flash-low":"gemini-3.5-flash-medium","gemini-pro-agent":"gemini-3.1-pro-high","claude-sonnet-4-6":"claude-sonnet-4-6-thinking","claude-opus-4-6":"claude-opus-4-6-thinking","gpt-oss-120b":"gpt-oss-120b-medium"}},d0={antigravity:[{match:/flash.*high|high.*flash/i,alias:"gemini-3.5-flash-high"},{match:/flash.*medium|medium.*flash|flash.*low|low.*flash/i,alias:"gemini-3.5-flash-medium"},{match:/flash/i,alias:"gemini-3.5-flash-medium"},{match:/pro.*low|low.*pro/i,alias:"gemini-3.1-pro-low"},{match:/gemini.*pro|pro.*gemini/i,alias:"gemini-3.1-pro-high"},{match:/opus/i,alias:"claude-opus-4-6-thinking"},{match:/sonnet|claude/i,alias:"claude-sonnet-4-6-thinking"},{match:/gpt.*oss|oss/i,alias:"gpt-oss-120b-medium"}]},h0=["recordCodeAssistMetrics","recordTrajectoryAnalytics","fetchAdminControls","listExperiments"];function p0(e){let t=(e||"").split(":")[0];return t==="api.individual.githubcopilot.com"?"copilot":t==="daily-cloudcode-pa.googleapis.com"||t==="cloudcode-pa.googleapis.com"?"antigravity":t==="q.us-east-1.amazonaws.com"||t==="codewhisperer.us-east-1.amazonaws.com"?"kiro":t==="api2.cursor.sh"?"cursor":null}Kn.exports={TARGET_HOSTS:l0,URL_PATTERNS:f0,MODEL_SYNONYMS:c0,MODEL_PATTERNS:d0,LOG_BLACKLIST_URL_PARTS:h0,getToolForHost:p0}});var Mt=K((Bd,Gn)=>{var Ur=require("fs"),Aa=require("path"),Ta=require("zlib"),{DATA_DIR:g0}=Zt(),{LOG_BLACKLIST_URL_PARTS:y0}=Sa();function Mn(){return new Date().toLocaleTimeString("en-US",{hour12:!1})}var v0=e=>console.log(`[${Mn()}] [MITM] ${e}`),m0=e=>console.error(`[${Mn()}] \u274C [MITM] ${e}`),Pr=Aa.join(g0,"logs","mitm");Ur.existsSync(Pr)||Ur.mkdirSync(Pr,{recursive:!0});var C0=/^\s*(\{\s*\}|\[\s*\]|null)?\s*$/;function qn(e,t=80){return String(e).replace(/[^a-zA-Z0-9]/g,"_").substring(0,t)}function Hn(e){return e?y0.some(t=>e.includes(t)):!1}function E0(e,t){if(!e||e.length===0)return e;try{let a=(t||"").toLowerCase();if(a.includes("gzip"))return Ta.gunzipSync(e);if(a.includes("br"))return Ta.brotliDecompressSync(e);if(a.includes("deflate"))return Ta.inflateSync(e)}catch{}return e}function x0(e,t,a="raw"){if(Hn(e.url))return null;try{let r=new Date().toISOString().replace(/[:.]/g,"-"),n=qn((e.headers.host||"")+e.url),s=Aa.join(Pr,`${r}_${a}_${n}.req.json`),i=null;try{i=JSON.parse(t.toString())}catch{}return Ur.writeFileSync(s,JSON.stringify({method:e.method,url:e.url,host:e.headers.host,headers:e.headers,body:i??t.toString("utf8")},null,2)),s}catch{return null}}function S0(e,t="raw"){if(Hn(e.url))return null;let a=new Date().toISOString().replace(/[:.]/g,"-"),r=qn((e.headers.host||"")+e.url),n=Aa.join(Pr,`${a}_${t}_${r}.res.txt`),s=0,i={},o=[];return{writeHeader:(u,l)=>{s=u,i=l||{}},writeChunk:u=>{u!=null&&o.push(Buffer.isBuffer(u)?u:Buffer.from(u))},end:()=>{try{let u=Buffer.concat(o),l=i["content-encoding"]||i["Content-Encoding"],c=E0(u,l).toString("utf8");if(C0.test(c))return;let g={...i};delete g["content-encoding"],delete g["Content-Encoding"];let m=`STATUS: ${s}
2
2
  HEADERS: ${JSON.stringify(g,null,2)}
3
3
  ---BODY---
4
4
  ${c}`;Ur.writeFileSync(n,m)}catch{}},file:n}}Gn.exports={log:v0,err:m0,dumpRequest:x0,createResponseDumper:S0}});var Y=K((bd,zn)=>{zn.exports={options:{usePureJavaScript:!1}}});var $n=K((_d,Yn)=>{var Ia={};Yn.exports=Ia;var Qn={};Ia.encode=function(e,t,a){if(typeof t!="string")throw new TypeError('"alphabet" must be a string.');if(a!==void 0&&typeof a!="number")throw new TypeError('"maxline" must be a number.');var r="";if(!(e instanceof Uint8Array))r=T0(e,t);else{var n=0,s=t.length,i=t.charAt(0),o=[0];for(n=0;n<e.length;++n){for(var u=0,l=e[n];u<o.length;++u)l+=o[u]<<8,o[u]=l%s,l=l/s|0;for(;l>0;)o.push(l%s),l=l/s|0}for(n=0;e[n]===0&&n<e.length-1;++n)r+=i;for(n=o.length-1;n>=0;--n)r+=t[o[n]]}if(a){var f=new RegExp(".{1,"+a+"}","g");r=r.match(f).join(`\r
@@ -22,11 +22,11 @@ ${c}`;Ur.writeFileSync(n,m)}catch{}},file:n}}Gn.exports={log:v0,err:m0,dumpReque
22
22
  Private-Lines: `+u+`\r
23
23
  `,s+=f;var S=ha("putty-private-key-file-mac-key",t),T=Ce.util.createBuffer();pr(T,r),pr(T,n),pr(T,a),T.putInt32(i.length()),T.putBuffer(i),T.putInt32(l.length()),T.putBuffer(l);var B=Ce.hmac.create();return B.start("sha1",S),B.update(T.bytes()),s+=`\r
24
24
  Private-MAC: `+B.digest().toHex()+`\r
25
- `,s};pa.publicKeyToOpenSSH=function(e,t){var a="ssh-rsa";t=t||"";var r=Ce.util.createBuffer();return pr(r,a),Ct(r,e.e),Ct(r,e.n),a+" "+Ce.util.encode64(r.bytes())+" "+t};pa.privateKeyToOpenSSH=function(e,t){return t?Ce.pki.encryptRsaPrivateKey(e,t,{legacy:!0,algorithm:"aes128"}):Ce.pki.privateKeyToPem(e)};pa.getPublicKeyFingerprint=function(e,t){t=t||{};var a=t.md||Ce.md.md5.create(),r="ssh-rsa",n=Ce.util.createBuffer();pr(n,r),Ct(n,e.e),Ct(n,e.n),a.start(),a.update(n.getBytes());var s=a.digest();if(t.encoding==="hex"){var i=s.toHex();return t.delimiter?i.match(/.{2}/g).join(t.delimiter):i}else{if(t.encoding==="binary")return s.getBytes();if(t.encoding)throw new Error('Unknown encoding "'+t.encoding+'".')}return s};function Ct(e,t){var a=t.toString(16);a[0]>="8"&&(a="00"+a);var r=Ce.util.hexToBytes(a);e.putInt32(r.length),e.putBytes(r)}function pr(e,t){e.putInt32(t.length),e.putString(t)}function ha(){for(var e=Ce.md.sha1.create(),t=arguments.length,a=0;a<t;++a)e.update(arguments[a]);return e.digest()}});var so=K((ph,io)=>{io.exports=Y();Nt();Is();ut();Vr();Er();Hs();rr();Ys();Xs();Zs();Za();Wr();Ht();Ya();rn();ro();nn();Wa();Fa();ra();tt();qa();no();cn();re()});var fo=K((gh,lo)=>{var oo=require("path"),Xe=require("fs"),Je=so(),{MITM_DIR:ga}=Zt(),Vt=oo.join(ga,"rootCA.key"),At=oo.join(ga,"rootCA.crt");function uo(e){try{let t=Je.pki.certificateFromPem(Xe.readFileSync(e,"utf8")),a=new Date(Date.now()+720*60*60*1e3);return t.validity.notAfter<a}catch{return!0}}async function uc(){let e=Xe.existsSync(Vt)&&Xe.existsSync(At);if(e&&!uo(At))return console.log("\u2705 Root CA already exists"),{key:Vt,cert:At};if(e){console.log("\u{1F510} Root CA expired or expiring soon \u2014 regenerating...");try{Xe.unlinkSync(Vt)}catch{}try{Xe.unlinkSync(At)}catch{}}Xe.existsSync(ga)||Xe.mkdirSync(ga,{recursive:!0}),console.log("\u{1F510} Generating Root CA certificate...");let t=Je.pki.rsa.generateKeyPair(2048),a=Je.pki.createCertificate();a.publicKey=t.publicKey,a.serialNumber="01",a.validity.notBefore=new Date,a.validity.notAfter=new Date,a.validity.notAfter.setFullYear(a.validity.notBefore.getFullYear()+10);let r=[{name:"commonName",value:"KTRouter MITM Root CA"},{name:"organizationName",value:"KTRouter"},{name:"countryName",value:"US"}];a.setSubject(r),a.setIssuer(r),a.setExtensions([{name:"basicConstraints",cA:!0,critical:!0},{name:"keyUsage",keyCertSign:!0,cRLSign:!0,critical:!0},{name:"subjectKeyIdentifier"}]),a.sign(t.privateKey,Je.md.sha256.create());let n=Je.pki.privateKeyToPem(t.privateKey),s=Je.pki.certificateToPem(a);return Xe.writeFileSync(Vt,n),Xe.writeFileSync(At,s),console.log("\u2705 Root CA generated successfully"),{key:Vt,cert:At}}function lc(){if(!Xe.existsSync(Vt)||!Xe.existsSync(At))throw new Error("Root CA not found. Generate it first.");let e=Xe.readFileSync(Vt,"utf8"),t=Xe.readFileSync(At,"utf8");return{key:Je.pki.privateKeyFromPem(e),cert:Je.pki.certificateFromPem(t)}}function fc(e,t){let a=Je.pki.rsa.generateKeyPair(2048),r=Je.pki.createCertificate();return r.publicKey=a.publicKey,r.serialNumber=Math.floor(Math.random()*1e6).toString(),r.validity.notBefore=new Date,r.validity.notAfter=new Date,r.validity.notAfter.setFullYear(r.validity.notBefore.getFullYear()+1),r.setSubject([{name:"commonName",value:e}]),r.setIssuer(t.cert.subject.attributes),r.setExtensions([{name:"basicConstraints",cA:!1},{name:"keyUsage",digitalSignature:!0,keyEncipherment:!0},{name:"extKeyUsage",serverAuth:!0,clientAuth:!0},{name:"subjectAltName",altNames:[{type:2,value:e},{type:2,value:`*.${e}`}]}]),r.sign(t.key,Je.md.sha256.create()),{key:Je.pki.privateKeyToPem(a.privateKey),cert:Je.pki.certificateToPem(r)}}lo.exports={generateRootCA:uc,loadRootCA:lc,generateLeafCert:fc,isCertExpired:uo,ROOT_CA_CERT_PATH:At,ROOT_CA_KEY_PATH:Vt}});var ho=K((Ch,co)=>{var yh=require("path"),vh=require("fs"),{MITM_DIR:mh}=Zt(),{generateRootCA:cc,loadRootCA:dc,generateLeafCert:hc}=fo();async function pc(){return await cc()}function gc(e){try{let t=dc(),a=hc(e,t);return{key:a.key,cert:a.cert}}catch(t){return console.error(`Failed to generate cert for ${e}:`,t.message),null}}co.exports={generateCert:pc,getCertForDomain:gc}});var vo=K((Eh,yo)=>{var po=require("fs"),yc=require("path"),{DATA_DIR:vc}=Zt(),go=yc.join(vc,"mitm","aliases.json");function mc(){try{return po.existsSync(go)?JSON.parse(po.readFileSync(go,"utf-8")):null}catch{return null}}function Cc(e){return mc()?.[e]||null}yo.exports={getMitmAlias:Cc}});var ya=K((Th,Eo)=>{var{log:xh,err:Sh}=Mt(),mo="http://localhost:3008",Ec=String(process.env.MITM_ROUTER_BASE||mo).trim().replace(/\/+$/,"")||mo,Co=process.env.ROUTER_API_KEY,xc=new Set(["host","content-length","connection","transfer-encoding","content-type","authorization"]);async function Sc(e,t="/v1/chat/completions",a={}){let r={};for(let[s,i]of Object.entries(a))xc.has(s.toLowerCase())||(r[s]=i);return await fetch(`${Ec}${t}`,{method:"POST",headers:{...r,"Content-Type":"application/json",...Co&&{Authorization:`Bearer ${Co}`}},body:JSON.stringify(e)})}async function Tc(e,t,a){let r=e.headers.get("content-type")||"application/json",n=e.status||200,s={"Content-Type":r,"Cache-Control":"no-cache",Connection:"keep-alive"};if(r.includes("text/event-stream")&&(s["X-Accel-Buffering"]="no"),t.writeHead(n,s),a&&a.writeHeader(e.status,Object.fromEntries(e.headers)),!e.body){let u=await e.text().catch(()=>"");a&&(a.writeChunk(u),a.end()),t.end(u);return}let i=e.body.getReader(),o=new TextDecoder;for(;;){let{done:u,value:l}=await i.read();if(u){a&&a.end(),t.end();break}a&&a.writeChunk(l),t.write(o.decode(l,{stream:!0}))}}Eo.exports={fetchRouter:Sc,pipeSSE:Tc}});var So=K((Ah,xo)=>{var{err:Ac,createResponseDumper:Ic}=Mt(),{fetchRouter:Bc,pipeSSE:bc}=ya();async function _c(e,t,a,r){let n=Ic(e,"intercept-antigravity"),s=e.url.includes(":streamGenerateContent");try{let i=JSON.parse(a.toString());if(!i.model){let l=e.url.match(/\/models\/([^\/:]+)/);l&&(i.model=l[1])}r&&(i.model=r);let o=i.input&&!i.messages?"/v1/responses":"/v1/chat/completions",u=await Bc(i,o,e.headers);await bc(u,t,n)}catch(i){Ac(`[antigravity] ${i.message}`),n&&(n.writeChunk(`
26
- [ERROR] ${i.message}
27
- `),n.end()),s?(t.headersSent||t.writeHead(200,{"Content-Type":"text/event-stream"}),t.end(`data: ${JSON.stringify({error:{message:i.message}})}\r
25
+ `,s};pa.publicKeyToOpenSSH=function(e,t){var a="ssh-rsa";t=t||"";var r=Ce.util.createBuffer();return pr(r,a),Ct(r,e.e),Ct(r,e.n),a+" "+Ce.util.encode64(r.bytes())+" "+t};pa.privateKeyToOpenSSH=function(e,t){return t?Ce.pki.encryptRsaPrivateKey(e,t,{legacy:!0,algorithm:"aes128"}):Ce.pki.privateKeyToPem(e)};pa.getPublicKeyFingerprint=function(e,t){t=t||{};var a=t.md||Ce.md.md5.create(),r="ssh-rsa",n=Ce.util.createBuffer();pr(n,r),Ct(n,e.e),Ct(n,e.n),a.start(),a.update(n.getBytes());var s=a.digest();if(t.encoding==="hex"){var i=s.toHex();return t.delimiter?i.match(/.{2}/g).join(t.delimiter):i}else{if(t.encoding==="binary")return s.getBytes();if(t.encoding)throw new Error('Unknown encoding "'+t.encoding+'".')}return s};function Ct(e,t){var a=t.toString(16);a[0]>="8"&&(a="00"+a);var r=Ce.util.hexToBytes(a);e.putInt32(r.length),e.putBytes(r)}function pr(e,t){e.putInt32(t.length),e.putString(t)}function ha(){for(var e=Ce.md.sha1.create(),t=arguments.length,a=0;a<t;++a)e.update(arguments[a]);return e.digest()}});var so=K((ph,io)=>{io.exports=Y();Nt();Is();ut();Vr();Er();Hs();rr();Ys();Xs();Zs();Za();Wr();Ht();Ya();rn();ro();nn();Wa();Fa();ra();tt();qa();no();cn();re()});var fo=K((gh,lo)=>{var oo=require("path"),Xe=require("fs"),Je=so(),{MITM_DIR:ga}=Zt(),Vt=oo.join(ga,"rootCA.key"),At=oo.join(ga,"rootCA.crt");function uo(e){try{let t=Je.pki.certificateFromPem(Xe.readFileSync(e,"utf8")),a=new Date(Date.now()+720*60*60*1e3);return t.validity.notAfter<a}catch{return!0}}async function uc(){let e=Xe.existsSync(Vt)&&Xe.existsSync(At);if(e&&!uo(At))return console.log("\u2705 Root CA already exists"),{key:Vt,cert:At};if(e){console.log("\u{1F510} Root CA expired or expiring soon \u2014 regenerating...");try{Xe.unlinkSync(Vt)}catch{}try{Xe.unlinkSync(At)}catch{}}Xe.existsSync(ga)||Xe.mkdirSync(ga,{recursive:!0}),console.log("\u{1F510} Generating Root CA certificate...");let t=Je.pki.rsa.generateKeyPair(2048),a=Je.pki.createCertificate();a.publicKey=t.publicKey,a.serialNumber="01",a.validity.notBefore=new Date,a.validity.notAfter=new Date,a.validity.notAfter.setFullYear(a.validity.notBefore.getFullYear()+10);let r=[{name:"commonName",value:"KTRouter MITM Root CA"},{name:"organizationName",value:"KTRouter"},{name:"countryName",value:"US"}];a.setSubject(r),a.setIssuer(r),a.setExtensions([{name:"basicConstraints",cA:!0,critical:!0},{name:"keyUsage",keyCertSign:!0,cRLSign:!0,critical:!0},{name:"subjectKeyIdentifier"}]),a.sign(t.privateKey,Je.md.sha256.create());let n=Je.pki.privateKeyToPem(t.privateKey),s=Je.pki.certificateToPem(a);return Xe.writeFileSync(Vt,n),Xe.writeFileSync(At,s),console.log("\u2705 Root CA generated successfully"),{key:Vt,cert:At}}function lc(){if(!Xe.existsSync(Vt)||!Xe.existsSync(At))throw new Error("Root CA not found. Generate it first.");let e=Xe.readFileSync(Vt,"utf8"),t=Xe.readFileSync(At,"utf8");return{key:Je.pki.privateKeyFromPem(e),cert:Je.pki.certificateFromPem(t)}}function fc(e,t){let a=Je.pki.rsa.generateKeyPair(2048),r=Je.pki.createCertificate();return r.publicKey=a.publicKey,r.serialNumber=Math.floor(Math.random()*1e6).toString(),r.validity.notBefore=new Date,r.validity.notAfter=new Date,r.validity.notAfter.setFullYear(r.validity.notBefore.getFullYear()+1),r.setSubject([{name:"commonName",value:e}]),r.setIssuer(t.cert.subject.attributes),r.setExtensions([{name:"basicConstraints",cA:!1},{name:"keyUsage",digitalSignature:!0,keyEncipherment:!0},{name:"extKeyUsage",serverAuth:!0,clientAuth:!0},{name:"subjectAltName",altNames:[{type:2,value:e},{type:2,value:`*.${e}`}]}]),r.sign(t.key,Je.md.sha256.create()),{key:Je.pki.privateKeyToPem(a.privateKey),cert:Je.pki.certificateToPem(r)}}lo.exports={generateRootCA:uc,loadRootCA:lc,generateLeafCert:fc,isCertExpired:uo,ROOT_CA_CERT_PATH:At,ROOT_CA_KEY_PATH:Vt}});var ho=K((Ch,co)=>{var yh=require("path"),vh=require("fs"),{MITM_DIR:mh}=Zt(),{generateRootCA:cc,loadRootCA:dc,generateLeafCert:hc}=fo();async function pc(){return await cc()}function gc(e){try{let t=dc(),a=hc(e,t);return{key:a.key,cert:a.cert}}catch(t){return console.error(`Failed to generate cert for ${e}:`,t.message),null}}co.exports={generateCert:pc,getCertForDomain:gc}});var vo=K((Eh,yo)=>{var po=require("fs"),yc=require("path"),{DATA_DIR:vc}=Zt(),go=yc.join(vc,"mitm","aliases.json");function mc(){try{return po.existsSync(go)?JSON.parse(po.readFileSync(go,"utf-8")):null}catch{return null}}function Cc(e){return mc()?.[e]||null}yo.exports={getMitmAlias:Cc}});var ya=K((Th,Eo)=>{var{log:xh,err:Sh}=Mt(),mo="http://localhost:3008",Ec=String(process.env.MITM_ROUTER_BASE||mo).trim().replace(/\/+$/,"")||mo,Co=process.env.ROUTER_API_KEY,xc=new Set(["host","content-length","connection","transfer-encoding","content-type","authorization"]);async function Sc(e,t="/v1/chat/completions",a={}){let r={};for(let[s,i]of Object.entries(a))xc.has(s.toLowerCase())||(r[s]=i);return await fetch(`${Ec}${t}`,{method:"POST",headers:{...r,"Content-Type":"application/json",...Co&&{Authorization:`Bearer ${Co}`}},body:JSON.stringify(e)})}async function Tc(e,t,a){let r=e.headers.get("content-type")||"application/json",n=e.status||200,s={"Content-Type":r,"Cache-Control":"no-cache",Connection:"keep-alive"};if(r.includes("text/event-stream")&&(s["X-Accel-Buffering"]="no"),t.writeHead(n,s),a&&a.writeHeader(e.status,Object.fromEntries(e.headers)),!e.body){let u=await e.text().catch(()=>"");a&&(a.writeChunk(u),a.end()),t.end(u);return}let i=e.body.getReader(),o=new TextDecoder;for(;;){let{done:u,value:l}=await i.read();if(u){a&&a.end(),t.end();break}a&&a.writeChunk(l),t.write(o.decode(l,{stream:!0}))}}Eo.exports={fetchRouter:Sc,pipeSSE:Tc}});var So=K((Ah,xo)=>{var{err:Ac,createResponseDumper:Ic}=Mt(),{fetchRouter:Bc,pipeSSE:bc}=ya();async function _c(e,t,a,r,n){let s=Ic(e,"intercept-antigravity"),i=e.url.includes(":streamGenerateContent");try{let o=JSON.parse(a.toString());if(!o.model){let f=e.url.match(/\/models\/([^\/:]+)/);f&&(o.model=f[1])}if(!r){if(s&&s.end(),typeof n=="function")return n(e,t,a);throw new Error("No Antigravity model mapping found")}o.model=r;let u=o.input&&!o.messages?"/v1/responses":"/v1/chat/completions",l=await Bc(o,u,e.headers);await bc(l,t,s)}catch(o){Ac(`[antigravity] ${o.message}`),s&&(s.writeChunk(`
26
+ [ERROR] ${o.message}
27
+ `),s.end()),i?(t.headersSent||t.writeHead(200,{"Content-Type":"text/event-stream"}),t.end(`data: ${JSON.stringify({error:{message:o.message}})}\r
28
28
  \r
29
- `)):(t.headersSent||t.writeHead(500,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:{message:i.message,type:"mitm_error"}})))}}xo.exports={intercept:_c}});var Ao=K((Ih,To)=>{var{err:Nc}=Mt(),{fetchRouter:wc,pipeSSE:Rc}=ya(),Lc={"/chat/completions":"/v1/chat/completions","/v1/messages":"/v1/messages","/responses":"/v1/responses"};function Dc(e,t){if(t&&t.input&&!t.messages)return"/v1/responses";for(let[a,r]of Object.entries(Lc))if(e.includes(a))return r;return"/v1/chat/completions"}async function kc(e,t,a,r){try{let n=JSON.parse(a.toString());n.model=r;let s=Dc(e.url,n),i=await wc(n,s,e.headers);await Rc(i,t)}catch(n){Nc(`[copilot] ${n.message}`),t.headersSent||t.writeHead(500,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:{message:n.message,type:"mitm_error"}}))}}To.exports={intercept:kc}});var No=K((Bh,_o)=>{var{err:Uc}=Mt(),{fetchRouter:Pc}=ya(),Oc=require("fs"),Vc=require("path"),Fc=Vc.join(__dirname,"../../../data/logs/mitm/kiro-debug.log");function va(e){try{Oc.appendFileSync(Fc,`${new Date().toISOString()} ${e}
29
+ `)):(t.headersSent||t.writeHead(500,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:{message:o.message,type:"mitm_error"}})))}}xo.exports={intercept:_c}});var Ao=K((Ih,To)=>{var{err:Nc}=Mt(),{fetchRouter:wc,pipeSSE:Rc}=ya(),Lc={"/chat/completions":"/v1/chat/completions","/v1/messages":"/v1/messages","/responses":"/v1/responses"};function Dc(e,t){if(t&&t.input&&!t.messages)return"/v1/responses";for(let[a,r]of Object.entries(Lc))if(e.includes(a))return r;return"/v1/chat/completions"}async function kc(e,t,a,r){try{let n=JSON.parse(a.toString());n.model=r;let s=Dc(e.url,n),i=await wc(n,s,e.headers);await Rc(i,t)}catch(n){Nc(`[copilot] ${n.message}`),t.headersSent||t.writeHead(500,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:{message:n.message,type:"mitm_error"}}))}}To.exports={intercept:kc}});var No=K((Bh,_o)=>{var{err:Uc}=Mt(),{fetchRouter:Pc}=ya(),Oc=require("fs"),Vc=require("path"),Fc=Vc.join(__dirname,"../../../data/logs/mitm/kiro-debug.log");function va(e){try{Oc.appendFileSync(Fc,`${new Date().toISOString()} ${e}
30
30
  `)}catch{}}var Kc=(()=>{let e=new Uint32Array(256);for(let t=0;t<256;t++){let a=t;for(let r=0;r<8;r++)a=a&1?3988292384^a>>>1:a>>>1;e[t]=a}return e})();function Io(e){let t=4294967295;for(let a=0;a<e.length;a++)t=t>>>8^Kc[(t^e[a])&255];return(t^4294967295)>>>0}function _n(e,t){let a=Buffer.from(e,"utf8"),r=Buffer.from(t,"utf8"),n=Buffer.alloc(1+a.length+1+2+r.length),s=0;return n[s++]=a.length,a.copy(n,s),s+=a.length,n[s++]=7,n.writeUInt16BE(r.length,s),s+=2,r.copy(n,s),n}function ma(e,t){let a=Buffer.from(typeof t=="string"?t:JSON.stringify(t),"utf8"),r=Buffer.concat([_n(":message-type","event"),_n(":event-type",e),_n(":content-type","application/json")]),n=r.length,s=12+n+a.length+4,i=Buffer.alloc(s);return i.writeUInt32BE(s,0),i.writeUInt32BE(n,4),i.writeUInt32BE(Io(i.slice(0,8)),8),r.copy(i,12),a.copy(i,12+n),i.writeUInt32BE(Io(i.slice(0,s-4)),s-4),i}function bo(e){if(typeof e=="string")return e;if(e==null)return"{}";try{return JSON.stringify(e)}catch{return"{}"}}function Bo(e){let t=[],a=e.userInputMessageContext?.toolResults||[];for(let n of a){let s=(n.content||[]).map(i=>i.text||"").join(`
31
31
  `);t.push({role:"tool",tool_call_id:n.toolUseId||"",content:s})}let r=(e.content||"").trim();return(r||a.length===0)&&t.push({role:"user",content:r}),t}function Mc(e){let t=e.toolUses||[];return t.length>0?{role:"assistant",content:e.content||null,tool_calls:t.map(a=>({id:a.toolUseId||`call_${Date.now()}`,type:"function",function:{name:a.name||"",arguments:bo(a.input)}}))}:{role:"assistant",content:e.content||""}}function qc(e){let t=e.conversationState||{},a=t.history||[],r=t.currentMessage,n=[];for(let s of a)s.userInputMessage?n.push(...Bo(s.userInputMessage)):s.assistantResponseMessage&&n.push(Mc(s.assistantResponseMessage));return r?.userInputMessage&&n.push(...Bo(r.userInputMessage)),n}function Hc(e){let t=e.conversationState||{},a=t.currentMessage?.userInputMessage?.userInputMessageContext?.tools||[],r=t.history?.find(s=>s.userInputMessage?.userInputMessageContext?.tools)?.userInputMessage?.userInputMessageContext?.tools||[],n=a.length>0?a:r;return n.length?n.map(s=>{let i=s.toolSpecification||s;return{type:"function",function:{name:i.name||"",description:i.description||`Tool: ${i.name||"unknown"}`,parameters:i.inputSchema?.json||{type:"object",properties:{},required:[]}}}}):[]}async function Gc(e,t){if(!e.body){t.end(ma("messageStopEvent",{}));return}let a=e.body.getReader(),r=new TextDecoder,n="",s=!1,i={},o=()=>{s||(s=!0,t.write(ma("messageStopEvent",{})))};try{for(;;){let{done:u,value:l}=await a.read();if(u)break;n+=r.decode(l,{stream:!0});let f=n.split(`
32
32
  `);n=f.pop()??"";for(let c of f){let g=c.trim();if(!g.startsWith("data:"))continue;let m=g.slice(5).trim();if(m==="[DONE]"){o();continue}let y;try{y=JSON.parse(m)}catch{continue}let x=y?.choices?.[0]?.delta;if(!x)continue;if(x.content&&t.write(ma("assistantResponseEvent",{content:x.content})),x.tool_calls){va(`TOOL_CALLS delta: ${JSON.stringify(x.tool_calls).slice(0,300)}`);for(let T of x.tool_calls){let B=T.index??0;i[B]||(i[B]={id:T.id??"",name:"",args:""});let b=i[B];T.id&&(b.id=T.id),T.function?.name&&(b.name+=T.function.name);let P=typeof T.function?.arguments;T.function?.arguments!=null&&(b.args+=bo(T.function.arguments)),va(` tc[${B}] argType=${P} id=${b.id} name=${b.name} args_so_far=${b.args.slice(0,100)}`)}}let S=y?.choices?.[0]?.finish_reason;if(S){if(va(`FINISH finish_reason=${S} toolCallKeys=${JSON.stringify(Object.keys(i))}`),S==="tool_calls")for(let T of Object.values(i)){let B=T.args||"{}";va(` toolUseEvent: id=${T.id} name=${T.name} inputStr=${B.slice(0,200)}`),t.write(ma("toolUseEvent",{toolUseId:T.id,name:T.name,input:B}))}o()}}}}finally{o(),t.end()}}async function zc(e,t,a,r){try{let n=JSON.parse(a.toString()),s=qc(n);if(s.length===0)throw new Error("codeWhispererToMessages produced 0 messages \u2014 check request body");let i=Hc(n),o={model:r,messages:s,stream:!0,...i.length>0&&{tools:i,tool_choice:"auto"}},u=await Pc(o,"/v1/chat/completions",e.headers);t.writeHead(u.status,{"Content-Type":"application/vnd.amazon.eventstream","x-amzn-requestid":`mitm-${Date.now()}`,"x-amz-id-2":"mitm","Transfer-Encoding":"chunked"}),await Gc(u,t)}catch(n){Uc(`[Kiro] ${n.message}`),t.headersSent||t.writeHead(500,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:{message:n.message,type:"mitm_error"}}))}}_o.exports={intercept:zc}});var Ro=K((bh,wo)=>{async function Qc(e,t){t.writeHead(501,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:{message:"Cursor MITM support is coming soon.",type:"not_implemented"}}))}wo.exports={intercept:Qc}});var Do=K((_h,Lo)=>{var Yc={antigravity:["daily-cloudcode-pa.googleapis.com","cloudcode-pa.googleapis.com"],copilot:["api.individual.githubcopilot.com"],kiro:["q.us-east-1.amazonaws.com","codewhisperer.us-east-1.amazonaws.com"],cursor:["api2.cursor.sh"]};Lo.exports={TOOL_HOSTS:Yc}});var Fo=K((Nh,Vo)=>{var{exec:ko,execSync:$c}=require("child_process"),Uo=process.platform==="win32";function Po(){if(Uo)try{return $c("net session >nul 2>&1",{windowsHide:!0,stdio:"ignore"}),!0}catch{return!1}return typeof process.getuid=="function"&&process.getuid()===0}function Oo(e){return`'${String(e).replace(/'/g,"''")}'`}function Wc(e){if(!Uo)return Promise.reject(new Error("Windows-only"));let t=Buffer.from(e,"utf16le").toString("base64");if(Po())return new Promise((r,n)=>{ko(`powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -EncodedCommand ${t}`,{windowsHide:!0},(s,i,o)=>{s?n(new Error(o||s.message)):r(i)})});let a=`
@@ -48,7 +48,7 @@ ${i}
48
48
  `).replace(/[\r\n\s]+$/g,"")+`
49
49
  `).replace(/'/g,"'\\''");await Dr(`printf '%s' '${o}' | tee ${Ze} > /dev/null`,t),await zo(t)}Ca(`\u{1F310} DNS ${e}: \u2705 removed ${r.join(", ")}`)}catch(n){let s=n.message?.includes("incorrect password")?"Wrong sudo password":`Failed to remove DNS entry: ${n.message}`;throw new Error(s)}}async function td(e){for(let t of Object.keys(Ft))try{await Qo(t,e)}catch(a){Xc(`DNS ${t}: failed to remove \u2014 ${a.message}`)}}function rd(){try{if(!_e.existsSync(Ze))return;let e=Object.values(Ft).flat(),t=_e.readFileSync(Ze,"utf8"),a=It?`\r
50
50
  `:`
51
- `,n=t.split(/\r?\n/).filter(s=>!e.some(i=>s.includes(i))).join(a).replace(/[\r\n\s]+$/g,"")+a;if(n===t)return;if(_e.writeFileSync(Ze,n,"utf8"),It)try{Lr("ipconfig /flushdns",{windowsHide:!0,stdio:"ignore"})}catch{}else if(Ho)try{Lr("dscacheutil -flushcache && killall -HUP mDNSResponder",{stdio:"ignore"})}catch{}else try{Lr("resolvectl flush-caches 2>/dev/null || true",{stdio:"ignore"})}catch{}}catch{}}Yo.exports={TOOL_HOSTS:Ft,addDNSEntry:ed,removeDNSEntry:Qo,removeAllDNSEntries:td,removeAllDNSEntriesSync:rd,execWithPassword:Dr,isSudoAvailable:Ea,canRunSudoWithoutPassword:Go,isSudoPasswordRequired:Jc,checkDNSEntry:Nn,checkAllDNSStatus:Zc}});var t0=require("https"),Wo=require("fs"),jo=require("path"),ad=require("dns"),{promisify:nd}=require("util"),{execSync:wn}=require("child_process"),{log:r0,err:Bt,dumpRequest:id,createResponseDumper:sd}=Mt(),{TARGET_HOSTS:od,URL_PATTERNS:ud,MODEL_SYNONYMS:ld,MODEL_PATTERNS:fd,getToolForHost:cd}=Sa(),{DATA_DIR:kh,MITM_DIR:Xo}=Zt(),{getCertForDomain:dd}=ho(),{getMitmAlias:hd}=vo(),gr=443,Jo=process.platform==="win32",a0=!0,Zo={name:"x-request-source",value:"local"},pd={"cloudcode-pa.googleapis.com":"daily-cloudcode-pa.googleapis.com"},Rn={antigravity:So(),copilot:Ao(),kiro:No(),cursor:Ro()},Ln=new Map,n0;function gd(e,t){try{if(Ln.has(e))return t(null,Ln.get(e));let a=dd(e);if(!a)return t(new Error(`Failed to generate cert for ${e}`));let r=require("tls").createSecureContext({key:a.key,cert:`${a.cert}
51
+ `,n=t.split(/\r?\n/).filter(s=>!e.some(i=>s.includes(i))).join(a).replace(/[\r\n\s]+$/g,"")+a;if(n===t)return;if(_e.writeFileSync(Ze,n,"utf8"),It)try{Lr("ipconfig /flushdns",{windowsHide:!0,stdio:"ignore"})}catch{}else if(Ho)try{Lr("dscacheutil -flushcache && killall -HUP mDNSResponder",{stdio:"ignore"})}catch{}else try{Lr("resolvectl flush-caches 2>/dev/null || true",{stdio:"ignore"})}catch{}}catch{}}Yo.exports={TOOL_HOSTS:Ft,addDNSEntry:ed,removeDNSEntry:Qo,removeAllDNSEntries:td,removeAllDNSEntriesSync:rd,execWithPassword:Dr,isSudoAvailable:Ea,canRunSudoWithoutPassword:Go,isSudoPasswordRequired:Jc,checkDNSEntry:Nn,checkAllDNSStatus:Zc}});var t0=require("https"),Wo=require("fs"),jo=require("path"),ad=require("dns"),{promisify:nd}=require("util"),{execSync:wn}=require("child_process"),{log:r0,err:Bt,dumpRequest:id,createResponseDumper:sd}=Mt(),{TARGET_HOSTS:od,URL_PATTERNS:ud,MODEL_SYNONYMS:ld,MODEL_PATTERNS:fd,getToolForHost:cd}=Sa(),{DATA_DIR:kh,MITM_DIR:Xo}=Zt(),{getCertForDomain:dd}=ho(),{getMitmAlias:hd}=vo(),gr=443,Jo=process.platform==="win32",a0=!0,Zo={name:"x-request-source",value:"local"},pd=process.env.MITM_REWRITE_ANTIGRAVITY_PASSTHROUGH==="1"?{"cloudcode-pa.googleapis.com":"daily-cloudcode-pa.googleapis.com"}:{},Rn={antigravity:So(),copilot:Ao(),kiro:No(),cursor:Ro()},Ln=new Map,n0;function gd(e,t){try{if(Ln.has(e))return t(null,Ln.get(e));let a=dd(e);if(!a)return t(new Error(`Failed to generate cert for ${e}`));let r=require("tls").createSecureContext({key:a.key,cert:`${a.cert}
52
52
  ${n0}`});Ln.set(e,r),t(null,r)}catch(a){Bt(`SNI error for ${e}: ${a.message}`),t(a)}}var i0;try{let e=Wo.readFileSync(jo.join(Xo,"rootCA.key")),t=Wo.readFileSync(jo.join(Xo,"rootCA.crt"));n0=t.toString("utf8"),i0={key:e,cert:t,SNICallback:gd}}catch(e){Bt(`Root CA not found: ${e.message}`),process.exit(1)}var Dn={},yd=300*1e3;async function vd(e){let t=Dn[e];if(t&&Date.now()-t.ts<yd)return t.ip;let a=new ad.Resolver;a.setServers(["8.8.8.8"]);let n=await nd(a.resolve4.bind(a))(e);return Dn[e]={ip:n[0],ts:Date.now()},Dn[e].ip}function md(e){return new Promise((t,a)=>{let r=[];e.on("data",n=>r.push(n)),e.on("end",()=>t(Buffer.concat(r))),e.on("error",a)})}function Cd(e,t){let a=e.match(/\/models\/([^/:]+)/);if(a)return a[1];try{let r=JSON.parse(t.toString());return r.conversationState?r.conversationState.currentMessage?.userInputMessage?.modelId||null:r.model||null}catch{return null}}function Ed(e,t){if(!t)return null;try{let a=hd(e);if(!a)return null;let r=ld?.[e]?.[t]||t;if(a[r])return a[r];if(e==="antigravity"){let i=(...u)=>{let l=u.find(f=>a[f]);return l?a[l]:null},o=null;if(r==="gemini-3.5-flash-high"?o=i("gemini-3.5-flash-high","gemini-3-flash-agent","gemini-3.5-flash","gemini-3-flash"):r==="gemini-3.5-flash-medium"?o=i("gemini-3.5-flash-medium","gemini-3-flash","gemini-3.0-flash","gemini-3.5-flash-low"):r==="gemini-pro-agent"||r==="gemini-3.1-pro-high"?o=i("gemini-3.1-pro-high","gemini-pro-agent","gemini-3.1-pro"):r==="gemini-3-flash-agent"||r==="gemini-3-flash"?o=i("gemini-3-flash","gemini-3-flash-agent","gemini-3.0-flash"):r==="gemini-3.5-flash-low"?o=i("gemini-3.5-flash-low","gemini-3.5-flash","gemini-3-flash"):r==="claude-sonnet-4-6-thinking"?o=i("claude-sonnet-4-6-thinking","claude-sonnet-4-6"):r==="claude-opus-4-6-thinking"?o=i("claude-opus-4-6-thinking","claude-opus-4-6"):r==="gpt-oss-120b-medium"&&(o=i("gpt-oss-120b-medium","gpt-oss-120b")),o)return o}let n=fd?.[e]?.find(({match:i})=>i.test(t)||i.test(r));if(n?.alias){if(a[n.alias])return a[n.alias];if(e==="antigravity"){let i={"gemini-3.5-flash-high":["gemini-3-flash-agent","gemini-3.5-flash","gemini-3-flash"],"gemini-3.5-flash-medium":["gemini-3-flash","gemini-3.0-flash","gemini-3.5-flash-low"],"claude-sonnet-4-6-thinking":["claude-sonnet-4-6"],"claude-opus-4-6-thinking":["claude-opus-4-6"],"gpt-oss-120b-medium":["gpt-oss-120b"]}[n.alias]?.find(o=>a[o]);if(i)return a[i]}}let s=Object.keys(a).find(i=>i&&a[i]&&(r.startsWith(i)||i.startsWith(r)));return s?a[s]:null}catch{return null}}async function Xt(e,t,a,r){let n=(e.headers.host||od[0]).split(":")[0],s=pd[n]||n,i=await vd(s),o=a0?sd(e,"passthrough"):null,u=t0.request({hostname:i,port:443,path:e.url,method:e.method,headers:{...e.headers,host:s},servername:s,rejectUnauthorized:!1},l=>{if(t.writeHead(l.statusCode,l.headers),o&&o.writeHeader(l.statusCode,l.headers),!r&&!o){l.pipe(t);return}let f=[];l.on("data",c=>{o&&o.writeChunk(c),r&&f.push(c),t.write(c)}),l.on("end",()=>{if(o&&o.end(),t.end(),r)try{r(Buffer.concat(f),l.headers)}catch{}})});u.on("error",l=>{Bt(`Passthrough error: ${l.message}`),o&&(o.writeChunk(`
53
53
  [ERROR] ${l.message}
54
54
  `),o.end()),t.headersSent||t.writeHead(502),t.end("Bad Gateway")}),a.length>0&&u.write(a),u.end()}var kn=t0.createServer(i0,async(e,t)=>{try{if(e.url==="/_mitm_health"){t.writeHead(200,{"Content-Type":"application/json"}),t.end(JSON.stringify({ok:!0,pid:process.pid}));return}let a=await md(e);if(a0&&id(e,a,"raw"),e.headers[Zo.name]===Zo.value)return Xt(e,t,a);let r=cd(e.headers.host);if(!r||!(ud[r]||[]).some(u=>e.url.includes(u)))return Xt(e,t,a);if(r==="cursor")return Rn[r].intercept(e,t,a,null,Xt);let i=Cd(e.url,a),o=Ed(r,i);return r==="antigravity"||o?Rn[r].intercept(e,t,a,o,Xt):Xt(e,t,a)}catch(a){Bt(`Unhandled error: ${a.message}`),t.headersSent||t.writeHead(500,{"Content-Type":"application/json"}),t.end(JSON.stringify({error:{message:a.message,type:"mitm_error"}}))}});function xd(e){try{let t=[];if(Jo){let a=`powershell -NonInteractive -WindowStyle Hidden -Command "Get-NetTCPConnection -LocalPort ${e} -State Listen -ErrorAction SilentlyContinue | Select-Object -ExpandProperty OwningProcess"`,r=wn(a,{encoding:"utf-8",windowsHide:!0}).trim();if(!r)return;t=r.split(/\r?\n/).map(n=>n.trim()).filter(n=>n&&Number(n)!==process.pid&&Number(n)>4)}else{let a=wn(`lsof -nP -iTCP:${e} -sTCP:LISTEN -t`,{encoding:"utf-8",windowsHide:!0}).trim();if(!a)return;t=a.split(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ktrouter",
3
- "version": "1.0.6",
3
+ "version": "1.0.7",
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:()=>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()}]);
@@ -1 +0,0 @@
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()}]);