zevairouter 1.0.13 → 1.0.14

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 (612) hide show
  1. package/cli/app/.next-cli-build/BUILD_ID +1 -1
  2. package/cli/app/.next-cli-build/app-path-routes-manifest.json +4 -4
  3. package/cli/app/.next-cli-build/build-manifest.json +2 -2
  4. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/automation/page.js +1 -1
  5. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/automation/page.js.nft.json +1 -1
  6. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/automation/page_client-reference-manifest.js +1 -1
  7. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page.js +1 -1
  8. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page.js.nft.json +1 -1
  9. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
  10. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js +1 -1
  11. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js.nft.json +1 -1
  12. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
  13. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page.js +1 -1
  14. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -1
  15. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  16. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page.js +1 -1
  17. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page.js.nft.json +1 -1
  18. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  19. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page.js +1 -1
  20. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page.js.nft.json +1 -1
  21. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
  22. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page.js +1 -1
  23. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -1
  24. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  25. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js +1 -1
  26. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js.nft.json +1 -1
  27. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
  28. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js +1 -1
  29. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js.nft.json +1 -1
  30. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
  31. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js +1 -1
  32. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js.nft.json +1 -1
  33. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
  34. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page.js +1 -1
  35. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page.js.nft.json +1 -1
  36. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
  37. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page.js +1 -1
  38. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page.js.nft.json +1 -1
  39. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
  40. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/page.js +1 -1
  41. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/page.js.nft.json +1 -1
  42. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  43. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page.js +2 -2
  44. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page.js.nft.json +1 -1
  45. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  46. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page.js +1 -1
  47. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page.js.nft.json +1 -1
  48. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  49. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page.js +1 -1
  50. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page.js.nft.json +1 -1
  51. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  52. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page.js +1 -1
  53. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page.js.nft.json +1 -1
  54. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  55. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page.js +1 -1
  56. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page.js.nft.json +1 -1
  57. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
  58. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page.js +2 -2
  59. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page.js.nft.json +1 -1
  60. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  61. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page.js +1 -1
  62. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page.js.nft.json +1 -1
  63. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
  64. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page.js +1 -1
  65. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page.js.nft.json +1 -1
  66. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  67. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page.js +1 -1
  68. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page.js.nft.json +1 -1
  69. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  70. package/cli/app/.next-cli-build/server/app/_global-error/page.js.nft.json +1 -1
  71. package/cli/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
  72. package/cli/app/.next-cli-build/server/app/_global-error.html +1 -1
  73. package/cli/app/.next-cli-build/server/app/_global-error.rsc +1 -1
  74. package/cli/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
  75. package/cli/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  76. package/cli/app/.next-cli-build/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  77. package/cli/app/.next-cli-build/server/app/_global-error.segments/_head.segment.rsc +1 -1
  78. package/cli/app/.next-cli-build/server/app/_global-error.segments/_index.segment.rsc +1 -1
  79. package/cli/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  80. package/cli/app/.next-cli-build/server/app/_not-found/page.js +1 -1
  81. package/cli/app/.next-cli-build/server/app/_not-found/page.js.nft.json +1 -1
  82. package/cli/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
  83. package/cli/app/.next-cli-build/server/app/_not-found.html +1 -1
  84. package/cli/app/.next-cli-build/server/app/_not-found.rsc +4 -4
  85. package/cli/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +4 -4
  86. package/cli/app/.next-cli-build/server/app/_not-found.segments/_head.segment.rsc +1 -1
  87. package/cli/app/.next-cli-build/server/app/_not-found.segments/_index.segment.rsc +4 -4
  88. package/cli/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  89. package/cli/app/.next-cli-build/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  90. package/cli/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  91. package/cli/app/.next-cli-build/server/app/api/auth/login/route.js +1 -1
  92. package/cli/app/.next-cli-build/server/app/api/auth/login/route.js.nft.json +1 -1
  93. package/cli/app/.next-cli-build/server/app/api/auth/logout/route.js.nft.json +1 -1
  94. package/cli/app/.next-cli-build/server/app/api/auth/oidc/callback/route.js +1 -1
  95. package/cli/app/.next-cli-build/server/app/api/auth/oidc/callback/route.js.nft.json +1 -1
  96. package/cli/app/.next-cli-build/server/app/api/auth/oidc/start/route.js +1 -1
  97. package/cli/app/.next-cli-build/server/app/api/auth/oidc/start/route.js.nft.json +1 -1
  98. package/cli/app/.next-cli-build/server/app/api/auth/oidc/test/route.js +1 -1
  99. package/cli/app/.next-cli-build/server/app/api/auth/oidc/test/route.js.nft.json +1 -1
  100. package/cli/app/.next-cli-build/server/app/api/auth/status/route.js +1 -1
  101. package/cli/app/.next-cli-build/server/app/api/auth/status/route.js.nft.json +1 -1
  102. package/cli/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js.nft.json +1 -1
  103. package/cli/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js +1 -1
  104. package/cli/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
  105. package/cli/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/route.js +1 -1
  106. package/cli/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -1
  107. package/cli/app/.next-cli-build/server/app/api/cli-tools/claude-settings/route.js.nft.json +1 -1
  108. package/cli/app/.next-cli-build/server/app/api/cli-tools/cline-settings/route.js.nft.json +1 -1
  109. package/cli/app/.next-cli-build/server/app/api/cli-tools/codex-gateway/accounts/route.js +1 -1
  110. package/cli/app/.next-cli-build/server/app/api/cli-tools/codex-gateway/accounts/route.js.nft.json +1 -1
  111. package/cli/app/.next-cli-build/server/app/api/cli-tools/codex-settings/route.js.nft.json +1 -1
  112. package/cli/app/.next-cli-build/server/app/api/cli-tools/copilot-settings/route.js.nft.json +1 -1
  113. package/cli/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-registry/route.js.nft.json +1 -1
  114. package/cli/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-tools/route.js.nft.json +1 -1
  115. package/cli/app/.next-cli-build/server/app/api/cli-tools/cowork-settings/route.js.nft.json +1 -1
  116. package/cli/app/.next-cli-build/server/app/api/cli-tools/deepseek-tui-settings/route.js.nft.json +1 -1
  117. package/cli/app/.next-cli-build/server/app/api/cli-tools/droid-settings/route.js.nft.json +1 -1
  118. package/cli/app/.next-cli-build/server/app/api/cli-tools/hermes-settings/route.js.nft.json +1 -1
  119. package/cli/app/.next-cli-build/server/app/api/cli-tools/jcode-settings/route.js.nft.json +1 -1
  120. package/cli/app/.next-cli-build/server/app/api/cli-tools/kilo-settings/route.js.nft.json +1 -1
  121. package/cli/app/.next-cli-build/server/app/api/cli-tools/openclaw-settings/route.js.nft.json +1 -1
  122. package/cli/app/.next-cli-build/server/app/api/cli-tools/opencode-settings/route.js.nft.json +1 -1
  123. package/cli/app/.next-cli-build/server/app/api/combos/[id]/route.js +1 -1
  124. package/cli/app/.next-cli-build/server/app/api/combos/[id]/route.js.nft.json +1 -1
  125. package/cli/app/.next-cli-build/server/app/api/combos/route.js +1 -1
  126. package/cli/app/.next-cli-build/server/app/api/combos/route.js.nft.json +1 -1
  127. package/cli/app/.next-cli-build/server/app/api/health/route.js.nft.json +1 -1
  128. package/cli/app/.next-cli-build/server/app/api/init/route.js +1 -1
  129. package/cli/app/.next-cli-build/server/app/api/init/route.js.nft.json +1 -1
  130. package/cli/app/.next-cli-build/server/app/api/keys/[id]/route.js +1 -1
  131. package/cli/app/.next-cli-build/server/app/api/keys/[id]/route.js.nft.json +1 -1
  132. package/cli/app/.next-cli-build/server/app/api/keys/route.js +1 -1
  133. package/cli/app/.next-cli-build/server/app/api/keys/route.js.nft.json +1 -1
  134. package/cli/app/.next-cli-build/server/app/api/locale/route.js.nft.json +1 -1
  135. package/cli/app/.next-cli-build/server/app/api/mcp/[plugin]/message/route.js.nft.json +1 -1
  136. package/cli/app/.next-cli-build/server/app/api/mcp/[plugin]/sse/route.js.nft.json +1 -1
  137. package/cli/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js +1 -1
  138. package/cli/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js.nft.json +1 -1
  139. package/cli/app/.next-cli-build/server/app/api/media-providers/tts/elevenlabs/voices/route.js +1 -1
  140. package/cli/app/.next-cli-build/server/app/api/media-providers/tts/elevenlabs/voices/route.js.nft.json +1 -1
  141. package/cli/app/.next-cli-build/server/app/api/media-providers/tts/inworld/voices/route.js +1 -1
  142. package/cli/app/.next-cli-build/server/app/api/media-providers/tts/inworld/voices/route.js.nft.json +1 -1
  143. package/cli/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js +1 -1
  144. package/cli/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js.nft.json +1 -1
  145. package/cli/app/.next-cli-build/server/app/api/media-providers/tts/voices/route.js.nft.json +1 -1
  146. package/cli/app/.next-cli-build/server/app/api/models/alias/route.js +1 -1
  147. package/cli/app/.next-cli-build/server/app/api/models/alias/route.js.nft.json +1 -1
  148. package/cli/app/.next-cli-build/server/app/api/models/availability/route.js +1 -1
  149. package/cli/app/.next-cli-build/server/app/api/models/availability/route.js.nft.json +1 -1
  150. package/cli/app/.next-cli-build/server/app/api/models/custom/route.js +1 -1
  151. package/cli/app/.next-cli-build/server/app/api/models/custom/route.js.nft.json +1 -1
  152. package/cli/app/.next-cli-build/server/app/api/models/disabled/route.js +1 -1
  153. package/cli/app/.next-cli-build/server/app/api/models/disabled/route.js.nft.json +1 -1
  154. package/cli/app/.next-cli-build/server/app/api/models/route.js +1 -1
  155. package/cli/app/.next-cli-build/server/app/api/models/route.js.nft.json +1 -1
  156. package/cli/app/.next-cli-build/server/app/api/models/test/route.js +1 -1
  157. package/cli/app/.next-cli-build/server/app/api/models/test/route.js.nft.json +1 -1
  158. package/cli/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js +1 -1
  159. package/cli/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
  160. package/cli/app/.next-cli-build/server/app/api/oauth/antigravity/bulk-import/[jobId]/cancel/route.js +1 -1
  161. package/cli/app/.next-cli-build/server/app/api/oauth/antigravity/bulk-import/[jobId]/cancel/route.js.nft.json +1 -1
  162. package/cli/app/.next-cli-build/server/app/api/oauth/antigravity/bulk-import/[jobId]/manual/[workerId]/route.js +1 -1
  163. package/cli/app/.next-cli-build/server/app/api/oauth/antigravity/bulk-import/[jobId]/manual/[workerId]/route.js.nft.json +1 -1
  164. package/cli/app/.next-cli-build/server/app/api/oauth/antigravity/bulk-import/[jobId]/route.js +1 -1
  165. package/cli/app/.next-cli-build/server/app/api/oauth/antigravity/bulk-import/[jobId]/route.js.nft.json +1 -1
  166. package/cli/app/.next-cli-build/server/app/api/oauth/antigravity/bulk-import/latest/route.js +1 -1
  167. package/cli/app/.next-cli-build/server/app/api/oauth/antigravity/bulk-import/latest/route.js.nft.json +1 -1
  168. package/cli/app/.next-cli-build/server/app/api/oauth/antigravity/bulk-import/route.js +1 -1
  169. package/cli/app/.next-cli-build/server/app/api/oauth/antigravity/bulk-import/route.js.nft.json +1 -1
  170. package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/bulk-import/[jobId]/cancel/route.js +1 -1
  171. package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/bulk-import/[jobId]/cancel/route.js.nft.json +1 -1
  172. package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/bulk-import/[jobId]/manual/[workerId]/route.js +1 -1
  173. package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/bulk-import/[jobId]/manual/[workerId]/route.js.nft.json +1 -1
  174. package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/bulk-import/[jobId]/route.js +1 -1
  175. package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/bulk-import/[jobId]/route.js.nft.json +1 -1
  176. package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/bulk-import/latest/route.js +1 -1
  177. package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/bulk-import/latest/route.js.nft.json +1 -1
  178. package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/bulk-import/route.js +1 -1
  179. package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/bulk-import/route.js.nft.json +1 -1
  180. package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/bulk-token/route.js +1 -1
  181. package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/bulk-token/route.js.nft.json +1 -1
  182. package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/quota-cookie/route.js +1 -1
  183. package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/quota-cookie/route.js.nft.json +1 -1
  184. package/cli/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js +1 -1
  185. package/cli/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js.nft.json +1 -1
  186. package/cli/app/.next-cli-build/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -1
  187. package/cli/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js +1 -1
  188. package/cli/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js.nft.json +1 -1
  189. package/cli/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js +1 -1
  190. package/cli/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js.nft.json +1 -1
  191. package/cli/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js +1 -1
  192. package/cli/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -1
  193. package/cli/app/.next-cli-build/server/app/api/oauth/kiro/auto-import/route.js.nft.json +1 -1
  194. package/cli/app/.next-cli-build/server/app/api/oauth/kiro/bulk-import/[jobId]/cancel/route.js +1 -1
  195. package/cli/app/.next-cli-build/server/app/api/oauth/kiro/bulk-import/[jobId]/cancel/route.js.nft.json +1 -1
  196. package/cli/app/.next-cli-build/server/app/api/oauth/kiro/bulk-import/[jobId]/manual/[workerId]/route.js +1 -1
  197. package/cli/app/.next-cli-build/server/app/api/oauth/kiro/bulk-import/[jobId]/manual/[workerId]/route.js.nft.json +1 -1
  198. package/cli/app/.next-cli-build/server/app/api/oauth/kiro/bulk-import/[jobId]/route.js +1 -1
  199. package/cli/app/.next-cli-build/server/app/api/oauth/kiro/bulk-import/[jobId]/route.js.nft.json +1 -1
  200. package/cli/app/.next-cli-build/server/app/api/oauth/kiro/bulk-import/latest/route.js +1 -1
  201. package/cli/app/.next-cli-build/server/app/api/oauth/kiro/bulk-import/latest/route.js.nft.json +1 -1
  202. package/cli/app/.next-cli-build/server/app/api/oauth/kiro/bulk-import/route.js +1 -1
  203. package/cli/app/.next-cli-build/server/app/api/oauth/kiro/bulk-import/route.js.nft.json +1 -1
  204. package/cli/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js +1 -1
  205. package/cli/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
  206. package/cli/app/.next-cli-build/server/app/api/oauth/kiro/social-authorize/route.js.nft.json +1 -1
  207. package/cli/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js +1 -1
  208. package/cli/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -1
  209. package/cli/app/.next-cli-build/server/app/api/oauth/qoder/bulk-import/[jobId]/cancel/route.js +1 -1
  210. package/cli/app/.next-cli-build/server/app/api/oauth/qoder/bulk-import/[jobId]/cancel/route.js.nft.json +1 -1
  211. package/cli/app/.next-cli-build/server/app/api/oauth/qoder/bulk-import/[jobId]/manual/[workerId]/route.js +1 -1
  212. package/cli/app/.next-cli-build/server/app/api/oauth/qoder/bulk-import/[jobId]/manual/[workerId]/route.js.nft.json +1 -1
  213. package/cli/app/.next-cli-build/server/app/api/oauth/qoder/bulk-import/[jobId]/route.js +1 -1
  214. package/cli/app/.next-cli-build/server/app/api/oauth/qoder/bulk-import/[jobId]/route.js.nft.json +1 -1
  215. package/cli/app/.next-cli-build/server/app/api/oauth/qoder/bulk-import/latest/route.js +1 -1
  216. package/cli/app/.next-cli-build/server/app/api/oauth/qoder/bulk-import/latest/route.js.nft.json +1 -1
  217. package/cli/app/.next-cli-build/server/app/api/oauth/qoder/bulk-import/route.js +1 -1
  218. package/cli/app/.next-cli-build/server/app/api/oauth/qoder/bulk-import/route.js.nft.json +1 -1
  219. package/cli/app/.next-cli-build/server/app/api/pricing/route.js +1 -1
  220. package/cli/app/.next-cli-build/server/app/api/pricing/route.js.nft.json +1 -1
  221. package/cli/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js +1 -1
  222. package/cli/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -1
  223. package/cli/app/.next-cli-build/server/app/api/provider-nodes/route.js +1 -1
  224. package/cli/app/.next-cli-build/server/app/api/provider-nodes/route.js.nft.json +1 -1
  225. package/cli/app/.next-cli-build/server/app/api/provider-nodes/validate/route.js.nft.json +1 -1
  226. package/cli/app/.next-cli-build/server/app/api/providers/[id]/models/route.js +1 -1
  227. package/cli/app/.next-cli-build/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
  228. package/cli/app/.next-cli-build/server/app/api/providers/[id]/route.js +1 -1
  229. package/cli/app/.next-cli-build/server/app/api/providers/[id]/route.js.nft.json +1 -1
  230. package/cli/app/.next-cli-build/server/app/api/providers/[id]/test/route.js +1 -1
  231. package/cli/app/.next-cli-build/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
  232. package/cli/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js +1 -1
  233. package/cli/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js.nft.json +1 -1
  234. package/cli/app/.next-cli-build/server/app/api/providers/client/route.js +1 -1
  235. package/cli/app/.next-cli-build/server/app/api/providers/client/route.js.nft.json +1 -1
  236. package/cli/app/.next-cli-build/server/app/api/providers/kilo/free-models/route.js.nft.json +1 -1
  237. package/cli/app/.next-cli-build/server/app/api/providers/route.js +1 -1
  238. package/cli/app/.next-cli-build/server/app/api/providers/route.js.nft.json +1 -1
  239. package/cli/app/.next-cli-build/server/app/api/providers/suggested-models/route.js.nft.json +1 -1
  240. package/cli/app/.next-cli-build/server/app/api/providers/test-batch/route.js +1 -1
  241. package/cli/app/.next-cli-build/server/app/api/providers/test-batch/route.js.nft.json +1 -1
  242. package/cli/app/.next-cli-build/server/app/api/providers/validate/route.js +1 -1
  243. package/cli/app/.next-cli-build/server/app/api/providers/validate/route.js.nft.json +1 -1
  244. package/cli/app/.next-cli-build/server/app/api/proxy-pools/[id]/route.js +1 -1
  245. package/cli/app/.next-cli-build/server/app/api/proxy-pools/[id]/route.js.nft.json +1 -1
  246. package/cli/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js +1 -1
  247. package/cli/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js.nft.json +1 -1
  248. package/cli/app/.next-cli-build/server/app/api/proxy-pools/cloudflare-deploy/route.js +1 -1
  249. package/cli/app/.next-cli-build/server/app/api/proxy-pools/cloudflare-deploy/route.js.nft.json +1 -1
  250. package/cli/app/.next-cli-build/server/app/api/proxy-pools/deno-deploy/route.js +1 -1
  251. package/cli/app/.next-cli-build/server/app/api/proxy-pools/deno-deploy/route.js.nft.json +1 -1
  252. package/cli/app/.next-cli-build/server/app/api/proxy-pools/route.js +1 -1
  253. package/cli/app/.next-cli-build/server/app/api/proxy-pools/route.js.nft.json +1 -1
  254. package/cli/app/.next-cli-build/server/app/api/proxy-pools/vercel-deploy/route.js +1 -1
  255. package/cli/app/.next-cli-build/server/app/api/proxy-pools/vercel-deploy/route.js.nft.json +1 -1
  256. package/cli/app/.next-cli-build/server/app/api/settings/database/route.js +1 -1
  257. package/cli/app/.next-cli-build/server/app/api/settings/database/route.js.nft.json +1 -1
  258. package/cli/app/.next-cli-build/server/app/api/settings/proxy-test/route.js.nft.json +1 -1
  259. package/cli/app/.next-cli-build/server/app/api/settings/require-login/route.js +1 -1
  260. package/cli/app/.next-cli-build/server/app/api/settings/require-login/route.js.nft.json +1 -1
  261. package/cli/app/.next-cli-build/server/app/api/settings/route.js +1 -1
  262. package/cli/app/.next-cli-build/server/app/api/settings/route.js.nft.json +1 -1
  263. package/cli/app/.next-cli-build/server/app/api/shutdown/route.js.nft.json +1 -1
  264. package/cli/app/.next-cli-build/server/app/api/tags/route.js.nft.json +1 -1
  265. package/cli/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
  266. package/cli/app/.next-cli-build/server/app/api/translator/console-logs/route.js.nft.json +1 -1
  267. package/cli/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
  268. package/cli/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js.nft.json +1 -1
  269. package/cli/app/.next-cli-build/server/app/api/translator/load/route.js.nft.json +1 -1
  270. package/cli/app/.next-cli-build/server/app/api/translator/save/route.js.nft.json +1 -1
  271. package/cli/app/.next-cli-build/server/app/api/translator/send/route.js +1 -1
  272. package/cli/app/.next-cli-build/server/app/api/translator/send/route.js.nft.json +1 -1
  273. package/cli/app/.next-cli-build/server/app/api/translator/translate/route.js +1 -1
  274. package/cli/app/.next-cli-build/server/app/api/translator/translate/route.js.nft.json +1 -1
  275. package/cli/app/.next-cli-build/server/app/api/tunnel/disable/route.js +1 -1
  276. package/cli/app/.next-cli-build/server/app/api/tunnel/disable/route.js.nft.json +1 -1
  277. package/cli/app/.next-cli-build/server/app/api/tunnel/enable/route.js +1 -1
  278. package/cli/app/.next-cli-build/server/app/api/tunnel/enable/route.js.nft.json +1 -1
  279. package/cli/app/.next-cli-build/server/app/api/tunnel/status/route.js +1 -1
  280. package/cli/app/.next-cli-build/server/app/api/tunnel/status/route.js.nft.json +1 -1
  281. package/cli/app/.next-cli-build/server/app/api/tunnel/tailscale-check/route.js +1 -1
  282. package/cli/app/.next-cli-build/server/app/api/tunnel/tailscale-check/route.js.nft.json +1 -1
  283. package/cli/app/.next-cli-build/server/app/api/tunnel/tailscale-disable/route.js +1 -1
  284. package/cli/app/.next-cli-build/server/app/api/tunnel/tailscale-disable/route.js.nft.json +1 -1
  285. package/cli/app/.next-cli-build/server/app/api/tunnel/tailscale-enable/route.js +1 -1
  286. package/cli/app/.next-cli-build/server/app/api/tunnel/tailscale-enable/route.js.nft.json +1 -1
  287. package/cli/app/.next-cli-build/server/app/api/tunnel/tailscale-install/route.js +1 -1
  288. package/cli/app/.next-cli-build/server/app/api/tunnel/tailscale-install/route.js.nft.json +1 -1
  289. package/cli/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js +1 -1
  290. package/cli/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
  291. package/cli/app/.next-cli-build/server/app/api/usage/chart/route.js +1 -1
  292. package/cli/app/.next-cli-build/server/app/api/usage/chart/route.js.nft.json +1 -1
  293. package/cli/app/.next-cli-build/server/app/api/usage/history/route.js +1 -1
  294. package/cli/app/.next-cli-build/server/app/api/usage/history/route.js.nft.json +1 -1
  295. package/cli/app/.next-cli-build/server/app/api/usage/providers/route.js +1 -1
  296. package/cli/app/.next-cli-build/server/app/api/usage/providers/route.js.nft.json +1 -1
  297. package/cli/app/.next-cli-build/server/app/api/usage/request-details/route.js +1 -1
  298. package/cli/app/.next-cli-build/server/app/api/usage/request-details/route.js.nft.json +1 -1
  299. package/cli/app/.next-cli-build/server/app/api/usage/request-logs/route.js +1 -1
  300. package/cli/app/.next-cli-build/server/app/api/usage/request-logs/route.js.nft.json +1 -1
  301. package/cli/app/.next-cli-build/server/app/api/usage/stats/route.js +1 -1
  302. package/cli/app/.next-cli-build/server/app/api/usage/stats/route.js.nft.json +1 -1
  303. package/cli/app/.next-cli-build/server/app/api/usage/stream/route.js +2 -2
  304. package/cli/app/.next-cli-build/server/app/api/usage/stream/route.js.nft.json +1 -1
  305. package/cli/app/.next-cli-build/server/app/api/v1/api/chat/route.js +1 -1
  306. package/cli/app/.next-cli-build/server/app/api/v1/api/chat/route.js.nft.json +1 -1
  307. package/cli/app/.next-cli-build/server/app/api/v1/audio/speech/route.js +1 -1
  308. package/cli/app/.next-cli-build/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
  309. package/cli/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js +1 -1
  310. package/cli/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js.nft.json +1 -1
  311. package/cli/app/.next-cli-build/server/app/api/v1/audio/voices/route.js.nft.json +1 -1
  312. package/cli/app/.next-cli-build/server/app/api/v1/chat/completions/route.js +1 -1
  313. package/cli/app/.next-cli-build/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
  314. package/cli/app/.next-cli-build/server/app/api/v1/embeddings/route.js +1 -1
  315. package/cli/app/.next-cli-build/server/app/api/v1/embeddings/route.js.nft.json +1 -1
  316. package/cli/app/.next-cli-build/server/app/api/v1/images/generations/route.js +1 -1
  317. package/cli/app/.next-cli-build/server/app/api/v1/images/generations/route.js.nft.json +1 -1
  318. package/cli/app/.next-cli-build/server/app/api/v1/messages/count_tokens/route.js.nft.json +1 -1
  319. package/cli/app/.next-cli-build/server/app/api/v1/messages/route.js +1 -1
  320. package/cli/app/.next-cli-build/server/app/api/v1/messages/route.js.nft.json +1 -1
  321. package/cli/app/.next-cli-build/server/app/api/v1/models/[kind]/route.js +1 -1
  322. package/cli/app/.next-cli-build/server/app/api/v1/models/[kind]/route.js.nft.json +1 -1
  323. package/cli/app/.next-cli-build/server/app/api/v1/models/info/route.js.nft.json +1 -1
  324. package/cli/app/.next-cli-build/server/app/api/v1/models/route.js +1 -1
  325. package/cli/app/.next-cli-build/server/app/api/v1/models/route.js.nft.json +1 -1
  326. package/cli/app/.next-cli-build/server/app/api/v1/responses/compact/route.js +1 -1
  327. package/cli/app/.next-cli-build/server/app/api/v1/responses/compact/route.js.nft.json +1 -1
  328. package/cli/app/.next-cli-build/server/app/api/v1/responses/route.js +1 -1
  329. package/cli/app/.next-cli-build/server/app/api/v1/responses/route.js.nft.json +1 -1
  330. package/cli/app/.next-cli-build/server/app/api/v1/route.js +1 -1
  331. package/cli/app/.next-cli-build/server/app/api/v1/route.js.nft.json +1 -1
  332. package/cli/app/.next-cli-build/server/app/api/v1/search/route.js +1 -1
  333. package/cli/app/.next-cli-build/server/app/api/v1/search/route.js.nft.json +1 -1
  334. package/cli/app/.next-cli-build/server/app/api/v1/web/fetch/route.js +1 -1
  335. package/cli/app/.next-cli-build/server/app/api/v1/web/fetch/route.js.nft.json +1 -1
  336. package/cli/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js +1 -1
  337. package/cli/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
  338. package/cli/app/.next-cli-build/server/app/api/v1beta/models/route.js.nft.json +1 -1
  339. package/cli/app/.next-cli-build/server/app/api/version/route.js +1 -1
  340. package/cli/app/.next-cli-build/server/app/api/version/route.js.nft.json +1 -1
  341. package/cli/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
  342. package/cli/app/.next-cli-build/server/app/api/version/shutdown/route.js.nft.json +1 -1
  343. package/cli/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
  344. package/cli/app/.next-cli-build/server/app/api/version/update/route.js.nft.json +1 -1
  345. package/cli/app/.next-cli-build/server/app/callback/page.js +1 -1
  346. package/cli/app/.next-cli-build/server/app/callback/page.js.nft.json +1 -1
  347. package/cli/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
  348. package/cli/app/.next-cli-build/server/app/callback.html +1 -1
  349. package/cli/app/.next-cli-build/server/app/callback.rsc +4 -4
  350. package/cli/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +4 -4
  351. package/cli/app/.next-cli-build/server/app/callback.segments/_head.segment.rsc +1 -1
  352. package/cli/app/.next-cli-build/server/app/callback.segments/_index.segment.rsc +4 -4
  353. package/cli/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +2 -2
  354. package/cli/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
  355. package/cli/app/.next-cli-build/server/app/callback.segments/callback.segment.rsc +1 -1
  356. package/cli/app/.next-cli-build/server/app/dashboard/automation.html +1 -1
  357. package/cli/app/.next-cli-build/server/app/dashboard/automation.rsc +6 -6
  358. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard/automation/__PAGE__.segment.rsc +2 -2
  359. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard/automation.segment.rsc +1 -1
  360. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  361. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  362. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_full.segment.rsc +6 -6
  363. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_head.segment.rsc +1 -1
  364. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_index.segment.rsc +4 -4
  365. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_tree.segment.rsc +2 -2
  366. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
  367. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +6 -6
  368. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
  369. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
  370. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  371. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  372. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +6 -6
  373. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
  374. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_index.segment.rsc +4 -4
  375. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +2 -2
  376. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
  377. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +6 -6
  378. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
  379. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
  380. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  381. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  382. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +6 -6
  383. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
  384. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_index.segment.rsc +4 -4
  385. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +2 -2
  386. package/cli/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
  387. package/cli/app/.next-cli-build/server/app/dashboard/combos.rsc +6 -6
  388. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
  389. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
  390. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  391. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  392. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +6 -6
  393. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
  394. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_index.segment.rsc +4 -4
  395. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +2 -2
  396. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
  397. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.rsc +6 -6
  398. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
  399. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
  400. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  401. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  402. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +6 -6
  403. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
  404. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_index.segment.rsc +4 -4
  405. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +2 -2
  406. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
  407. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +6 -6
  408. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +2 -2
  409. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web.segment.rsc +1 -1
  410. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
  411. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  412. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  413. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +6 -6
  414. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_head.segment.rsc +1 -1
  415. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_index.segment.rsc +4 -4
  416. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +2 -2
  417. package/cli/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
  418. package/cli/app/.next-cli-build/server/app/dashboard/mitm.rsc +6 -6
  419. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
  420. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
  421. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  422. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  423. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +6 -6
  424. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
  425. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_index.segment.rsc +4 -4
  426. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +2 -2
  427. package/cli/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
  428. package/cli/app/.next-cli-build/server/app/dashboard/profile.rsc +6 -6
  429. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
  430. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
  431. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  432. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  433. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +6 -6
  434. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
  435. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_index.segment.rsc +4 -4
  436. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +2 -2
  437. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
  438. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.rsc +6 -6
  439. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
  440. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
  441. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  442. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  443. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  444. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +6 -6
  445. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
  446. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_index.segment.rsc +4 -4
  447. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +2 -2
  448. package/cli/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
  449. package/cli/app/.next-cli-build/server/app/dashboard/providers.rsc +6 -6
  450. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
  451. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  452. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  453. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  454. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +6 -6
  455. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
  456. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_index.segment.rsc +4 -4
  457. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +2 -2
  458. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
  459. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +6 -6
  460. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
  461. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
  462. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  463. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  464. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +6 -6
  465. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
  466. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +4 -4
  467. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +2 -2
  468. package/cli/app/.next-cli-build/server/app/dashboard/quota.html +2 -2
  469. package/cli/app/.next-cli-build/server/app/dashboard/quota.rsc +7 -7
  470. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +3 -3
  471. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
  472. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  473. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  474. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +7 -7
  475. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
  476. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_index.segment.rsc +4 -4
  477. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +2 -2
  478. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing/page.js +1 -1
  479. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing/page.js.nft.json +1 -1
  480. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  481. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
  482. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +4 -4
  483. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +4 -4
  484. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
  485. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +4 -4
  486. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +2 -2
  487. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
  488. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
  489. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
  490. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
  491. package/cli/app/.next-cli-build/server/app/dashboard/skills.html +1 -1
  492. package/cli/app/.next-cli-build/server/app/dashboard/skills.rsc +6 -6
  493. package/cli/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills/__PAGE__.segment.rsc +2 -2
  494. package/cli/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills.segment.rsc +1 -1
  495. package/cli/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  496. package/cli/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  497. package/cli/app/.next-cli-build/server/app/dashboard/skills.segments/_full.segment.rsc +6 -6
  498. package/cli/app/.next-cli-build/server/app/dashboard/skills.segments/_head.segment.rsc +1 -1
  499. package/cli/app/.next-cli-build/server/app/dashboard/skills.segments/_index.segment.rsc +4 -4
  500. package/cli/app/.next-cli-build/server/app/dashboard/skills.segments/_tree.segment.rsc +2 -2
  501. package/cli/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
  502. package/cli/app/.next-cli-build/server/app/dashboard/translator.rsc +6 -6
  503. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
  504. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
  505. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  506. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  507. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +6 -6
  508. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
  509. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_index.segment.rsc +4 -4
  510. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +2 -2
  511. package/cli/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
  512. package/cli/app/.next-cli-build/server/app/dashboard/usage.rsc +6 -6
  513. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
  514. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
  515. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  516. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  517. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +6 -6
  518. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
  519. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_index.segment.rsc +4 -4
  520. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +2 -2
  521. package/cli/app/.next-cli-build/server/app/dashboard.html +1 -1
  522. package/cli/app/.next-cli-build/server/app/dashboard.rsc +6 -6
  523. package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
  524. package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  525. package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  526. package/cli/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +6 -6
  527. package/cli/app/.next-cli-build/server/app/dashboard.segments/_head.segment.rsc +1 -1
  528. package/cli/app/.next-cli-build/server/app/dashboard.segments/_index.segment.rsc +4 -4
  529. package/cli/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +2 -2
  530. package/cli/app/.next-cli-build/server/app/index.html +1 -1
  531. package/cli/app/.next-cli-build/server/app/index.rsc +4 -4
  532. package/cli/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  533. package/cli/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +4 -4
  534. package/cli/app/.next-cli-build/server/app/index.segments/_head.segment.rsc +1 -1
  535. package/cli/app/.next-cli-build/server/app/index.segments/_index.segment.rsc +4 -4
  536. package/cli/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +2 -2
  537. package/cli/app/.next-cli-build/server/app/landing/page.js +1 -1
  538. package/cli/app/.next-cli-build/server/app/landing/page.js.nft.json +1 -1
  539. package/cli/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
  540. package/cli/app/.next-cli-build/server/app/landing.html +1 -1
  541. package/cli/app/.next-cli-build/server/app/landing.rsc +4 -4
  542. package/cli/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +4 -4
  543. package/cli/app/.next-cli-build/server/app/landing.segments/_head.segment.rsc +1 -1
  544. package/cli/app/.next-cli-build/server/app/landing.segments/_index.segment.rsc +4 -4
  545. package/cli/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +2 -2
  546. package/cli/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +1 -1
  547. package/cli/app/.next-cli-build/server/app/landing.segments/landing.segment.rsc +1 -1
  548. package/cli/app/.next-cli-build/server/app/login/page.js +1 -1
  549. package/cli/app/.next-cli-build/server/app/login/page.js.nft.json +1 -1
  550. package/cli/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
  551. package/cli/app/.next-cli-build/server/app/login.html +1 -1
  552. package/cli/app/.next-cli-build/server/app/login.rsc +5 -5
  553. package/cli/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +5 -5
  554. package/cli/app/.next-cli-build/server/app/login.segments/_head.segment.rsc +1 -1
  555. package/cli/app/.next-cli-build/server/app/login.segments/_index.segment.rsc +4 -4
  556. package/cli/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +2 -2
  557. package/cli/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  558. package/cli/app/.next-cli-build/server/app/login.segments/login.segment.rsc +1 -1
  559. package/cli/app/.next-cli-build/server/app/manifest.webmanifest/route.js.nft.json +1 -1
  560. package/cli/app/.next-cli-build/server/app/page.js +1 -1
  561. package/cli/app/.next-cli-build/server/app/page.js.nft.json +1 -1
  562. package/cli/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
  563. package/cli/app/.next-cli-build/server/app-paths-manifest.json +4 -4
  564. package/cli/app/.next-cli-build/server/chunks/2777.js +1 -0
  565. package/cli/app/.next-cli-build/server/chunks/3110.js +1 -1
  566. package/cli/app/.next-cli-build/server/chunks/318.js +1 -1
  567. package/cli/app/.next-cli-build/server/chunks/3188.js +1 -1
  568. package/cli/app/.next-cli-build/server/chunks/3593.js +1 -1
  569. package/cli/app/.next-cli-build/server/chunks/4043.js +14 -0
  570. package/cli/app/.next-cli-build/server/chunks/4055.js +1 -1
  571. package/cli/app/.next-cli-build/server/chunks/4161.js +1 -1
  572. package/cli/app/.next-cli-build/server/chunks/4739.js +1 -1
  573. package/cli/app/.next-cli-build/server/chunks/4746.js +1 -1
  574. package/cli/app/.next-cli-build/server/chunks/4780.js +1 -1
  575. package/cli/app/.next-cli-build/server/chunks/507.js +1 -1
  576. package/cli/app/.next-cli-build/server/chunks/5217.js +1 -1
  577. package/cli/app/.next-cli-build/server/chunks/5258.js +1 -1
  578. package/cli/app/.next-cli-build/server/chunks/6896.js +1 -1
  579. package/cli/app/.next-cli-build/server/chunks/698.js +1 -1
  580. package/cli/app/.next-cli-build/server/chunks/7153.js +1 -1
  581. package/cli/app/.next-cli-build/server/chunks/7965.js +1 -1
  582. package/cli/app/.next-cli-build/server/chunks/8255.js +1 -1
  583. package/cli/app/.next-cli-build/server/chunks/8520.js +1 -1
  584. package/cli/app/.next-cli-build/server/chunks/915.js +1 -1
  585. package/cli/app/.next-cli-build/server/chunks/9326.js +1 -1
  586. package/cli/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
  587. package/cli/app/.next-cli-build/server/middleware.js +2 -2
  588. package/cli/app/.next-cli-build/server/pages/404.html +1 -1
  589. package/cli/app/.next-cli-build/server/pages/500.html +1 -1
  590. package/cli/app/.next-cli-build/static/chunks/{1321-1ea0cba0e1dc93f9.js → 1321-8460c1d61e66cdd9.js} +1 -1
  591. package/cli/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/profile/{page-ad6c0d386a0a9e15.js → page-ec740b92f0fead18.js} +1 -1
  592. package/cli/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/quota/page-00add5a971054c3c.js +1 -0
  593. package/cli/app/.next-cli-build/static/css/{705fa00a1e55feb4.css → 20176eae83d8ef2f.css} +1 -1
  594. package/cli/app/package.json +1 -1
  595. package/cli/package.json +1 -1
  596. package/package.json +1 -1
  597. package/src/app/(dashboard)/dashboard/profile/page.js +15 -0
  598. package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/index.js +3 -3
  599. package/src/app/api/init/route.js +8 -0
  600. package/src/app/api/usage/[connectionId]/route.js +22 -170
  601. package/src/app/globals.css +5 -7
  602. package/src/lib/db/index.js +6 -0
  603. package/src/lib/db/repos/quotaCacheRepo.js +80 -0
  604. package/src/lib/db/schema.js +15 -0
  605. package/src/lib/localDb.js +2 -0
  606. package/src/lib/usage/quotaRefresh.js +61 -0
  607. package/src/lib/usage/quotaService.js +146 -0
  608. package/src/sse/services/auth.js +45 -1
  609. package/cli/app/.next-cli-build/server/chunks/4884.js +0 -13
  610. package/cli/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/quota/page-bb8cd39cef8dc67a.js +0 -1
  611. /package/cli/app/.next-cli-build/static/{PMzBo5bAkklvn1QHwZSHz → AcNhouZGB-IW1HaLcuwFO}/_buildManifest.js +0 -0
  612. /package/cli/app/.next-cli-build/static/{PMzBo5bAkklvn1QHwZSHz → AcNhouZGB-IW1HaLcuwFO}/_ssgManifest.js +0 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zevairouter",
3
- "version": "1.0.13",
3
+ "version": "1.0.14",
4
4
  "description": "ZevaiRouter - AI Router with provider automation, multi-account workflows, and quota tracking",
5
5
  "bin": {
6
6
  "zevai": "./cli/cli.js"
package/cli/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zevairouter-cli",
3
- "version": "1.0.13",
3
+ "version": "1.0.14",
4
4
  "description": "ZevaiRouter CLI - Start and manage ZevaiRouter server",
5
5
  "bin": {
6
6
  "zevai": "./cli.js"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zevairouter",
3
- "version": "1.0.13",
3
+ "version": "1.0.14",
4
4
  "description": "ZevaiRouter - AI Router with provider automation, multi-account workflows, and quota tracking",
5
5
  "bin": {
6
6
  "zevai": "./cli/cli.js"
@@ -946,6 +946,21 @@ export default function ProfilePage() {
946
946
  </div>
947
947
  )}
948
948
 
949
+ {/* Most Quota (smart routing) */}
950
+ <div className="flex items-start sm:items-center justify-between gap-4 pt-4 border-t border-border/50">
951
+ <div className="flex-1 min-w-0">
952
+ <p className="font-medium text-sm sm:text-base">Most Quota</p>
953
+ <p className="text-xs sm:text-sm text-text-muted">
954
+ Pick the account with the most remaining quota (uses cached usage)
955
+ </p>
956
+ </div>
957
+ <Toggle
958
+ checked={settings.fallbackStrategy === "most-quota"}
959
+ onChange={() => updateFallbackStrategy(settings.fallbackStrategy === "most-quota" ? "fill-first" : "most-quota")}
960
+ disabled={loading}
961
+ />
962
+ </div>
963
+
949
964
  {/* Combo Round Robin */}
950
965
  <div className="flex items-start sm:items-center justify-between gap-4 pt-4 border-t border-border/50">
951
966
  <div className="flex-1 min-w-0">
@@ -403,7 +403,7 @@ export default function ProviderLimits() {
403
403
  );
404
404
 
405
405
  // Fetch quota for a specific connection
406
- const fetchQuota = useCallback(async (connectionId, provider) => {
406
+ const fetchQuota = useCallback(async (connectionId, provider, force = false) => {
407
407
  setLoading((prev) => ({ ...prev, [connectionId]: true }));
408
408
  setErrors((prev) => ({ ...prev, [connectionId]: null }));
409
409
 
@@ -411,7 +411,7 @@ export default function ProviderLimits() {
411
411
  console.log(
412
412
  `[ProviderLimits] Fetching quota for ${provider} (${connectionId})`,
413
413
  );
414
- const response = await fetch(`/api/usage/${connectionId}`);
414
+ const response = await fetch(`/api/usage/${connectionId}${force ? "?refresh=1" : ""}`);
415
415
 
416
416
  if (!response.ok) {
417
417
  const errorData = await response.json().catch(() => ({}));
@@ -636,7 +636,7 @@ export default function ProviderLimits() {
636
636
  );
637
637
 
638
638
  await Promise.all(
639
- visibleConnections.map((conn) => fetchQuota(conn.id, conn.provider)),
639
+ visibleConnections.map((conn) => fetchQuota(conn.id, conn.provider, true)),
640
640
  );
641
641
 
642
642
  setLastUpdated(new Date());
@@ -1,4 +1,12 @@
1
1
  // This API route is called automatically to initialize app
2
+ import { startQuotaRefreshLoop } from "@/lib/usage/quotaRefresh";
3
+
2
4
  export async function GET() {
5
+ // Start the background quota-refresh loop (guarded so it only starts once).
6
+ try {
7
+ startQuotaRefreshLoop();
8
+ } catch (e) {
9
+ console.warn(`[Init] quota refresh loop start failed: ${e.message}`);
10
+ }
3
11
  return new Response("Initialized", { status: 200 });
4
12
  }
@@ -1,188 +1,40 @@
1
1
  // Ensure proxyFetch is loaded to patch globalThis.fetch
2
2
  import "open-sse/index.js";
3
3
 
4
- import { getProviderConnectionById, updateProviderConnection } from "@/lib/localDb";
5
- import { getUsageForProvider } from "open-sse/services/usage.js";
6
- import { getExecutor } from "open-sse/executors/index.js";
7
- import { resolveConnectionProxyConfig } from "@/lib/network/connectionProxy";
8
- import { USAGE_APIKEY_PROVIDERS } from "@/shared/constants/providers";
4
+ import { getQuotaSnapshot } from "@/lib/localDb";
5
+ import { resolveUsageForConnection } from "@/lib/usage/quotaService";
9
6
 
10
- // Detect auth-expired messages returned by usage providers instead of throwing
11
- const AUTH_EXPIRED_PATTERNS = ["expired", "authentication", "unauthorized", "401", "re-authorize"];
12
- function isAuthExpiredMessage(usage) {
13
- if (!usage?.message) return false;
14
- const msg = usage.message.toLowerCase();
15
- return AUTH_EXPIRED_PATTERNS.some((p) => msg.includes(p));
16
- }
17
-
18
- /**
19
- * Refresh credentials using executor and update database
20
- * @param {boolean} force - Skip needsRefresh check and always attempt refresh
21
- * @returns Promise<{ connection, refreshed: boolean }>
22
- */
23
- async function refreshAndUpdateCredentials(connection, force = false, proxyOptions = null) {
24
- const executor = getExecutor(connection.provider);
25
-
26
- // Build credentials object from connection
27
- const credentials = {
28
- accessToken: connection.accessToken,
29
- refreshToken: connection.refreshToken,
30
- idToken: connection.idToken,
31
- expiresAt: connection.expiresAt || connection.tokenExpiresAt,
32
- lastRefreshAt: connection.lastRefreshAt,
33
- connectionId: connection.id,
34
- providerSpecificData: connection.providerSpecificData,
35
- // For GitHub
36
- copilotToken: connection.providerSpecificData?.copilotToken,
37
- copilotTokenExpiresAt: connection.providerSpecificData?.copilotTokenExpiresAt,
38
- };
39
-
40
- // Check if refresh is needed (skip when force=true)
41
- const needsRefresh = force || executor.needsRefresh(credentials);
42
-
43
- if (!needsRefresh) {
44
- return { connection, refreshed: false };
45
- }
46
-
47
- // Use executor's refreshCredentials method (with optional proxy)
48
- const refreshResult = await executor.refreshCredentials(credentials, console, proxyOptions);
49
-
50
- if (!refreshResult) {
51
- // Refresh failed but we still have an accessToken — try with existing token
52
- if (connection.accessToken) {
53
- return { connection, refreshed: false };
54
- }
55
- throw new Error("Failed to refresh credentials. Please re-authorize the connection.");
56
- }
57
-
58
- // Build update object
59
- const now = new Date().toISOString();
60
- const updateData = {
61
- updatedAt: now,
62
- };
63
-
64
- // Update accessToken if present
65
- if (refreshResult.accessToken) {
66
- updateData.accessToken = refreshResult.accessToken;
67
- }
68
-
69
- // Update refreshToken if present
70
- if (refreshResult.refreshToken) {
71
- updateData.refreshToken = refreshResult.refreshToken;
72
- }
73
-
74
- if (refreshResult.idToken) {
75
- updateData.idToken = refreshResult.idToken;
76
- }
77
-
78
- if (refreshResult.lastRefreshAt) {
79
- updateData.lastRefreshAt = refreshResult.lastRefreshAt;
80
- }
81
-
82
- // Update token expiry
83
- if (refreshResult.expiresIn) {
84
- updateData.expiresAt = new Date(Date.now() + refreshResult.expiresIn * 1000).toISOString();
85
- updateData.expiresIn = refreshResult.expiresIn;
86
- } else if (refreshResult.expiresAt) {
87
- updateData.expiresAt = refreshResult.expiresAt;
88
- }
89
-
90
- // Handle provider-specific data (copilotToken for GitHub, etc.)
91
- const providerSpecificUpdates = {
92
- ...(refreshResult.providerSpecificData || {}),
93
- ...(refreshResult.copilotToken ? { copilotToken: refreshResult.copilotToken } : {}),
94
- ...(refreshResult.copilotTokenExpiresAt ? { copilotTokenExpiresAt: refreshResult.copilotTokenExpiresAt } : {}),
95
- };
96
- if (Object.keys(providerSpecificUpdates).length > 0) {
97
- updateData.providerSpecificData = {
98
- ...(connection.providerSpecificData || {}),
99
- ...providerSpecificUpdates,
100
- };
101
- }
102
-
103
- // Update database
104
- await updateProviderConnection(connection.id, updateData);
105
-
106
- // Return updated connection
107
- const updatedConnection = {
108
- ...connection,
109
- ...updateData,
110
- providerSpecificData: updateData.providerSpecificData || connection.providerSpecificData,
111
- };
112
-
113
- return {
114
- connection: updatedConnection,
115
- refreshed: true,
116
- };
117
- }
7
+ // Serve cached quota when it's fresher than this; otherwise fetch live.
8
+ const CACHE_FRESH_MS = 60 * 1000;
118
9
 
119
10
  /**
120
- * GET /api/usage/[connectionId] - Get usage data for a specific connection
11
+ * GET /api/usage/[connectionId] - Get usage data for a specific connection.
12
+ *
13
+ * Reads the server-side quota cache first (instant); only hits the upstream API
14
+ * when the cache is stale or `?refresh=1` is passed. Live fetches also write the
15
+ * cache so routing + dashboard stay in sync.
121
16
  */
122
17
  export async function GET(request, { params }) {
123
- let connection;
18
+ let connectionId;
124
19
  try {
125
- const { connectionId } = await params;
126
-
127
-
128
- // Get connection from database
129
- connection = await getProviderConnectionById(connectionId);
130
- if (!connection) {
131
- return Response.json({ error: "Connection not found" }, { status: 404 });
132
- }
133
-
134
- // Allow OAuth connections, plus whitelisted apikey providers (glm/minimax/...)
135
- const isOAuth = connection.authType === "oauth";
136
- const isApikeyEligible =
137
- connection.authType === "apikey" &&
138
- USAGE_APIKEY_PROVIDERS.includes(connection.provider);
139
-
140
- if (!isOAuth && !isApikeyEligible) {
141
- return Response.json({ message: "Usage not available for this connection" });
142
- }
143
-
144
- // Resolve connection proxy config; force strictProxy=false so quota/refresh fall back to direct on failure
145
- const proxyConfig = await resolveConnectionProxyConfig(connection.providerSpecificData);
146
- const proxyOptions = {
147
- connectionProxyEnabled: proxyConfig.connectionProxyEnabled === true,
148
- connectionProxyUrl: proxyConfig.connectionProxyUrl || "",
149
- connectionNoProxy: proxyConfig.connectionNoProxy || "",
150
- vercelRelayUrl: proxyConfig.vercelRelayUrl || "",
151
- strictProxy: false,
152
- };
153
-
154
- // Refresh credentials only for OAuth connections (apikey has no token refresh)
155
- if (isOAuth) {
156
- try {
157
- const result = await refreshAndUpdateCredentials(connection, false, proxyOptions);
158
- connection = result.connection;
159
- } catch (refreshError) {
160
- console.error("[Usage API] Credential refresh failed:", refreshError);
161
- return Response.json({
162
- error: `Credential refresh failed: ${refreshError.message}`
163
- }, { status: 401 });
20
+ ({ connectionId } = await params);
21
+ const url = new URL(request.url);
22
+ const force = url.searchParams.get("refresh") === "1";
23
+
24
+ if (!force) {
25
+ const snap = await getQuotaSnapshot(connectionId);
26
+ if (snap?.usage && Date.now() - new Date(snap.fetchedAt).getTime() < CACHE_FRESH_MS) {
27
+ return Response.json({ ...snap.usage, cached: true, fetchedAt: snap.fetchedAt });
164
28
  }
165
29
  }
166
30
 
167
- // Fetch usage from provider API
168
- let usage = await getUsageForProvider(connection, proxyOptions);
169
-
170
- // If provider returned an auth-expired message instead of throwing,
171
- // force-refresh token and retry once (OAuth only)
172
- if (isOAuth && isAuthExpiredMessage(usage) && connection.refreshToken) {
173
- try {
174
- const retryResult = await refreshAndUpdateCredentials(connection, true, proxyOptions);
175
- connection = retryResult.connection;
176
- usage = await getUsageForProvider(connection, proxyOptions);
177
- } catch (retryError) {
178
- console.warn(`[Usage] ${connection.provider}: force refresh failed: ${retryError.message}`);
179
- }
31
+ const usage = await resolveUsageForConnection(connectionId, { writeCache: true, force });
32
+ if (usage?.notFound) {
33
+ return Response.json({ error: "Connection not found" }, { status: 404 });
180
34
  }
181
-
182
35
  return Response.json(usage);
183
36
  } catch (error) {
184
- const provider = connection?.provider ?? "unknown";
185
- console.warn(`[Usage] ${provider}: ${error.message}`);
37
+ console.warn(`[Usage] ${connectionId || "unknown"}: ${error.message}`);
186
38
  return Response.json({ error: error.message }, { status: 500 });
187
39
  }
188
40
  }
@@ -510,11 +510,9 @@ button {
510
510
  0 1px 2px rgba(15, 23, 42, 0.05),
511
511
  0 10px 24px -10px rgba(15, 23, 42, 0.18),
512
512
  0 24px 48px -24px rgba(15, 23, 42, 0.22);
513
- transform: perspective(1200px) translateZ(0);
514
- transform-style: preserve-3d;
515
- transition: transform 0.35s cubic-bezier(0.22, 1, 0.36, 1),
513
+ transform: translateY(0);
514
+ transition: transform 0.3s cubic-bezier(0.22, 1, 0.36, 1),
516
515
  box-shadow 0.35s cubic-bezier(0.22, 1, 0.36, 1);
517
- will-change: transform;
518
516
  }
519
517
  .card-3d::before {
520
518
  content: "";
@@ -527,7 +525,7 @@ button {
527
525
  }
528
526
  .card-3d > * { position: relative; z-index: 1; }
529
527
  .card-3d:hover {
530
- transform: perspective(1200px) translateY(-3px) rotateX(1deg) rotateY(-1deg);
528
+ transform: translateY(-3px);
531
529
  box-shadow:
532
530
  inset 0 1px 0 0 rgba(255, 255, 255, 0.6),
533
531
  0 2px 4px rgba(15, 23, 42, 0.06),
@@ -568,8 +566,8 @@ button {
568
566
  0 44px 80px -28px rgba(0, 0, 0, 0.72);
569
567
  }
570
568
 
571
- /* Respect reduced-motion: keep depth, drop the tilt/scale animation */
569
+ /* Respect reduced-motion: keep depth, drop the movement */
572
570
  @media (prefers-reduced-motion: reduce) {
573
571
  .card-3d { transition: box-shadow 0.3s ease; }
574
- .card-3d:hover { transform: perspective(1200px) translateY(-2px); }
572
+ .card-3d:hover { transform: none; }
575
573
  }
@@ -27,6 +27,12 @@ export {
27
27
  createProxyPool, updateProxyPool, deleteProxyPool,
28
28
  } from "./repos/proxyPoolsRepo.js";
29
29
 
30
+ // Quota cache (server-side per-account quota snapshots for routing)
31
+ export {
32
+ saveQuotaSnapshot, getQuotaSnapshot, getAllQuotaSnapshots,
33
+ deleteQuotaSnapshot, getCachedRemainingPercent,
34
+ } from "./repos/quotaCacheRepo.js";
35
+
30
36
  // API keys
31
37
  export {
32
38
  getApiKeys, getApiKeyById, createApiKey, updateApiKey, deleteApiKey, validateApiKey,
@@ -0,0 +1,80 @@
1
+ import { getAdapter } from "../driver.js";
2
+ import { parseJson, stringifyJson } from "../helpers/jsonCol.js";
3
+
4
+ /**
5
+ * Quota cache repo — server-side snapshots of upstream per-account quota.
6
+ *
7
+ * A background loop (see open-sse/services/quotaRefresh.js) periodically calls
8
+ * getUsageForProvider() and writes the result here so request routing can read
9
+ * remaining quota synchronously (one SQLite lookup) instead of a live network
10
+ * call. One row per connection.
11
+ */
12
+
13
+ /**
14
+ * Upsert a quota snapshot for a connection.
15
+ * @param {string} connectionId
16
+ * @param {string} provider
17
+ * @param {object} usage - the object returned by getUsageForProvider (quotas, plan, message, accountDead...)
18
+ */
19
+ export async function saveQuotaSnapshot(connectionId, provider, usage) {
20
+ if (!connectionId) return;
21
+ const db = await getAdapter();
22
+ const fetchedAt = new Date().toISOString();
23
+ db.run(
24
+ `INSERT INTO quotaCache(connectionId, provider, data, fetchedAt) VALUES(?, ?, ?, ?)
25
+ ON CONFLICT(connectionId) DO UPDATE SET provider = excluded.provider, data = excluded.data, fetchedAt = excluded.fetchedAt`,
26
+ [connectionId, provider || "", stringifyJson(usage || {}), fetchedAt]
27
+ );
28
+ }
29
+
30
+ function rowToSnapshot(row) {
31
+ if (!row) return null;
32
+ return {
33
+ connectionId: row.connectionId,
34
+ provider: row.provider,
35
+ fetchedAt: row.fetchedAt,
36
+ usage: parseJson(row.data, {}),
37
+ };
38
+ }
39
+
40
+ /** Get one connection's cached snapshot, or null. */
41
+ export async function getQuotaSnapshot(connectionId) {
42
+ if (!connectionId) return null;
43
+ const db = await getAdapter();
44
+ const row = db.get(
45
+ `SELECT connectionId, provider, data, fetchedAt FROM quotaCache WHERE connectionId = ?`,
46
+ [connectionId]
47
+ );
48
+ return rowToSnapshot(row);
49
+ }
50
+
51
+ /** Get all cached snapshots (optionally filtered by provider). */
52
+ export async function getAllQuotaSnapshots(provider = null) {
53
+ const db = await getAdapter();
54
+ const rows = provider
55
+ ? db.all(`SELECT connectionId, provider, data, fetchedAt FROM quotaCache WHERE provider = ?`, [provider])
56
+ : db.all(`SELECT connectionId, provider, data, fetchedAt FROM quotaCache`);
57
+ return rows.map(rowToSnapshot);
58
+ }
59
+
60
+ /** Delete a connection's snapshot (e.g. when the connection is removed). */
61
+ export async function deleteQuotaSnapshot(connectionId) {
62
+ if (!connectionId) return;
63
+ const db = await getAdapter();
64
+ db.run(`DELETE FROM quotaCache WHERE connectionId = ?`, [connectionId]);
65
+ }
66
+
67
+ /**
68
+ * Read the best remaining-quota percentage for a connection+model from cache.
69
+ * Returns a number 0..100, or null when unknown (no snapshot / model absent).
70
+ * Used by the router's "most-quota" strategy.
71
+ */
72
+ export async function getCachedRemainingPercent(connectionId, model) {
73
+ const snap = await getQuotaSnapshot(connectionId);
74
+ if (!snap) return null;
75
+ const quotas = snap.usage?.quotas;
76
+ if (!quotas || typeof quotas !== "object") return null;
77
+ const q = quotas[model];
78
+ if (!q || typeof q.remainingPercentage !== "number") return null;
79
+ return q.remainingPercentage;
80
+ }
@@ -148,6 +148,21 @@ export const TABLES = {
148
148
  "CREATE INDEX IF NOT EXISTS idx_rd_conn ON requestDetails(connectionId)",
149
149
  ],
150
150
  },
151
+ // Server-side snapshot of upstream per-account quota, refreshed by a
152
+ // background loop. Lets routing read remaining quota synchronously without a
153
+ // live network call. One row per connection; `data` holds the quotas map +
154
+ // plan/message from getUsageForProvider.
155
+ quotaCache: {
156
+ columns: {
157
+ connectionId: "TEXT PRIMARY KEY",
158
+ provider: "TEXT",
159
+ data: "TEXT NOT NULL",
160
+ fetchedAt: "TEXT NOT NULL",
161
+ },
162
+ indexes: [
163
+ "CREATE INDEX IF NOT EXISTS idx_qc_provider ON quotaCache(provider)",
164
+ ],
165
+ },
151
166
  };
152
167
 
153
168
  export function buildCreateTableSql(name, def) {
@@ -10,6 +10,8 @@ export {
10
10
  createProviderNode, updateProviderNode, deleteProviderNode,
11
11
  getProxyPools, getProxyPoolById,
12
12
  createProxyPool, updateProxyPool, deleteProxyPool,
13
+ saveQuotaSnapshot, getQuotaSnapshot, getAllQuotaSnapshots,
14
+ deleteQuotaSnapshot, getCachedRemainingPercent,
13
15
  getApiKeys, getApiKeyById, createApiKey, updateApiKey, deleteApiKey, validateApiKey,
14
16
  getCombos, getComboById, getComboByName,
15
17
  createCombo, updateCombo, deleteCombo,
@@ -0,0 +1,61 @@
1
+ // Background quota refresh loop.
2
+ //
3
+ // Periodically snapshots each active, usage-eligible connection's upstream quota
4
+ // into the server-side quota cache (quotaCache table) so request routing can read
5
+ // remaining quota synchronously. Requests are staggered to avoid a burst of
6
+ // upstream calls. Guarded via globalThis so Next.js hot-reload / multiple imports
7
+ // don't start duplicate loops.
8
+
9
+ import { getProviderConnections } from "@/lib/localDb";
10
+ import { resolveUsageForConnection, isUsageEligible } from "./quotaService.js";
11
+
12
+ const REFRESH_INTERVAL_MS = 5 * 60 * 1000; // full sweep cadence per connection
13
+ const STAGGER_MS = 4 * 1000; // gap between connections in a sweep
14
+ const MIN_START_DELAY_MS = 15 * 1000; // let the server settle before first sweep
15
+
16
+ if (!globalThis._quotaRefreshState) {
17
+ globalThis._quotaRefreshState = { started: false, timer: null, running: false };
18
+ }
19
+ const state = globalThis._quotaRefreshState;
20
+
21
+ async function sweepOnce() {
22
+ if (state.running) return;
23
+ state.running = true;
24
+ try {
25
+ let connections = [];
26
+ try {
27
+ connections = await getProviderConnections({ isActive: true });
28
+ } catch (e) {
29
+ console.warn(`[QuotaRefresh] failed to list connections: ${e.message}`);
30
+ return;
31
+ }
32
+ const eligible = connections.filter(isUsageEligible);
33
+ for (const conn of eligible) {
34
+ try {
35
+ await resolveUsageForConnection(conn.id, { writeCache: true });
36
+ } catch (e) {
37
+ console.warn(`[QuotaRefresh] ${conn.provider}/${conn.id}: ${e.message}`);
38
+ }
39
+ // Stagger to avoid hammering upstreams all at once.
40
+ await new Promise((r) => setTimeout(r, STAGGER_MS));
41
+ }
42
+ } finally {
43
+ state.running = false;
44
+ }
45
+ }
46
+
47
+ /** Start the background loop once per process. Safe to call repeatedly. */
48
+ export function startQuotaRefreshLoop() {
49
+ if (state.started) return;
50
+ state.started = true;
51
+ setTimeout(() => {
52
+ void sweepOnce();
53
+ state.timer = setInterval(() => void sweepOnce(), REFRESH_INTERVAL_MS);
54
+ if (state.timer.unref) state.timer.unref();
55
+ }, MIN_START_DELAY_MS);
56
+ }
57
+
58
+ /** Trigger an immediate one-off sweep (fire-and-forget). */
59
+ export function refreshQuotaNow() {
60
+ void sweepOnce();
61
+ }
@@ -0,0 +1,146 @@
1
+ // Shared quota service: refresh credentials, fetch upstream usage, and write a
2
+ // server-side cache snapshot. Used by both the /api/usage route (live view) and
3
+ // the background refresh loop (routing cache). Extracted so both paths share one
4
+ // implementation of the refresh→fetch→cache flow.
5
+
6
+ import "open-sse/index.js"; // ensure proxyFetch patches globalThis.fetch
7
+ import { getProviderConnectionById, updateProviderConnection, saveQuotaSnapshot } from "@/lib/localDb";
8
+ import { getUsageForProvider } from "open-sse/services/usage.js";
9
+ import { getExecutor } from "open-sse/executors/index.js";
10
+ import { resolveConnectionProxyConfig } from "@/lib/network/connectionProxy";
11
+ import { USAGE_APIKEY_PROVIDERS } from "@/shared/constants/providers";
12
+
13
+ const AUTH_EXPIRED_PATTERNS = ["expired", "authentication", "unauthorized", "401", "re-authorize"];
14
+ function isAuthExpiredMessage(usage) {
15
+ if (!usage?.message) return false;
16
+ const msg = usage.message.toLowerCase();
17
+ return AUTH_EXPIRED_PATTERNS.some((p) => msg.includes(p));
18
+ }
19
+
20
+ /**
21
+ * Refresh credentials via the provider executor and persist any updated tokens.
22
+ * @returns {Promise<{connection, refreshed: boolean}>}
23
+ */
24
+ export async function refreshAndUpdateCredentials(connection, force = false, proxyOptions = null) {
25
+ const executor = getExecutor(connection.provider);
26
+
27
+ const credentials = {
28
+ accessToken: connection.accessToken,
29
+ refreshToken: connection.refreshToken,
30
+ idToken: connection.idToken,
31
+ expiresAt: connection.expiresAt || connection.tokenExpiresAt,
32
+ lastRefreshAt: connection.lastRefreshAt,
33
+ connectionId: connection.id,
34
+ providerSpecificData: connection.providerSpecificData,
35
+ copilotToken: connection.providerSpecificData?.copilotToken,
36
+ copilotTokenExpiresAt: connection.providerSpecificData?.copilotTokenExpiresAt,
37
+ };
38
+
39
+ const needsRefresh = force || executor.needsRefresh(credentials);
40
+ if (!needsRefresh) return { connection, refreshed: false };
41
+
42
+ const refreshResult = await executor.refreshCredentials(credentials, console, proxyOptions);
43
+ if (!refreshResult) {
44
+ if (connection.accessToken) return { connection, refreshed: false };
45
+ throw new Error("Failed to refresh credentials. Please re-authorize the connection.");
46
+ }
47
+
48
+ const now = new Date().toISOString();
49
+ const updateData = { updatedAt: now };
50
+ if (refreshResult.accessToken) updateData.accessToken = refreshResult.accessToken;
51
+ if (refreshResult.refreshToken) updateData.refreshToken = refreshResult.refreshToken;
52
+ if (refreshResult.idToken) updateData.idToken = refreshResult.idToken;
53
+ if (refreshResult.lastRefreshAt) updateData.lastRefreshAt = refreshResult.lastRefreshAt;
54
+ if (refreshResult.expiresIn) {
55
+ updateData.expiresAt = new Date(Date.now() + refreshResult.expiresIn * 1000).toISOString();
56
+ updateData.expiresIn = refreshResult.expiresIn;
57
+ } else if (refreshResult.expiresAt) {
58
+ updateData.expiresAt = refreshResult.expiresAt;
59
+ }
60
+
61
+ const providerSpecificUpdates = {
62
+ ...(refreshResult.providerSpecificData || {}),
63
+ ...(refreshResult.copilotToken ? { copilotToken: refreshResult.copilotToken } : {}),
64
+ ...(refreshResult.copilotTokenExpiresAt ? { copilotTokenExpiresAt: refreshResult.copilotTokenExpiresAt } : {}),
65
+ };
66
+ if (Object.keys(providerSpecificUpdates).length > 0) {
67
+ updateData.providerSpecificData = {
68
+ ...(connection.providerSpecificData || {}),
69
+ ...providerSpecificUpdates,
70
+ };
71
+ }
72
+
73
+ await updateProviderConnection(connection.id, updateData);
74
+ const updatedConnection = {
75
+ ...connection,
76
+ ...updateData,
77
+ providerSpecificData: updateData.providerSpecificData || connection.providerSpecificData,
78
+ };
79
+ return { connection: updatedConnection, refreshed: true };
80
+ }
81
+
82
+ function isUsageEligible(connection) {
83
+ if (!connection) return false;
84
+ if (connection.authType === "oauth") return true;
85
+ return connection.authType === "apikey" && USAGE_APIKEY_PROVIDERS.includes(connection.provider);
86
+ }
87
+
88
+ /**
89
+ * Full usage flow for one connection: resolve proxy → refresh token (OAuth) →
90
+ * fetch upstream usage → retry once on auth-expired. Optionally write the result
91
+ * to the server-side quota cache. Returns the usage object (may contain
92
+ * {quotas}, {message}, {accountDead}). Does not throw for expected states.
93
+ *
94
+ * @param {string} connectionId
95
+ * @param {object} opts { writeCache?: boolean, force?: boolean }
96
+ */
97
+ export async function resolveUsageForConnection(connectionId, opts = {}) {
98
+ const { writeCache = false, force = false } = opts;
99
+ const connection = await getProviderConnectionById(connectionId);
100
+ if (!connection) return { error: "Connection not found", notFound: true };
101
+
102
+ if (!isUsageEligible(connection)) {
103
+ return { message: "Usage not available for this connection" };
104
+ }
105
+
106
+ const proxyConfig = await resolveConnectionProxyConfig(connection.providerSpecificData);
107
+ const proxyOptions = {
108
+ connectionProxyEnabled: proxyConfig.connectionProxyEnabled === true,
109
+ connectionProxyUrl: proxyConfig.connectionProxyUrl || "",
110
+ connectionNoProxy: proxyConfig.connectionNoProxy || "",
111
+ vercelRelayUrl: proxyConfig.vercelRelayUrl || "",
112
+ strictProxy: false,
113
+ };
114
+
115
+ let conn = connection;
116
+ const isOAuth = conn.authType === "oauth";
117
+
118
+ if (isOAuth) {
119
+ const result = await refreshAndUpdateCredentials(conn, force, proxyOptions);
120
+ conn = result.connection;
121
+ }
122
+
123
+ let usage = await getUsageForProvider(conn, proxyOptions);
124
+
125
+ if (isOAuth && isAuthExpiredMessage(usage) && conn.refreshToken) {
126
+ try {
127
+ const retry = await refreshAndUpdateCredentials(conn, true, proxyOptions);
128
+ conn = retry.connection;
129
+ usage = await getUsageForProvider(conn, proxyOptions);
130
+ } catch (retryError) {
131
+ console.warn(`[Usage] ${conn.provider}: force refresh failed: ${retryError.message}`);
132
+ }
133
+ }
134
+
135
+ if (writeCache && usage && !usage.error) {
136
+ try {
137
+ await saveQuotaSnapshot(conn.id, conn.provider, usage);
138
+ } catch (e) {
139
+ console.warn(`[QuotaCache] save failed for ${conn.id}: ${e.message}`);
140
+ }
141
+ }
142
+
143
+ return usage;
144
+ }
145
+
146
+ export { isUsageEligible };