zevairouter 1.0.145 → 1.0.147
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/cli/app/.next-cli-build/BUILD_ID +1 -1
- package/cli/app/.next-cli-build/app-path-routes-manifest.json +9 -9
- package/cli/app/.next-cli-build/build-manifest.json +2 -2
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/automation/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/context/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/playground/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/pxpipe/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/terminal/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.html +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found.html +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/api/models/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/providers/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/providers/validate/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/version/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/callback.html +1 -1
- package/cli/app/.next-cli-build/server/app/callback.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/callback.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/callback.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/callback.segments/callback.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/automation.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/automation.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard/automation/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard/automation.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/combos.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/context.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/context.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard/context/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard/context.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/playground.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/playground.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard/playground/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard/playground.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/profile.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/quota.html +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/quota.rsc +7 -7
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +7 -7
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/translator.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/usage.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/index.html +1 -1
- package/cli/app/.next-cli-build/server/app/index.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/index.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/index.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/landing.html +1 -1
- package/cli/app/.next-cli-build/server/app/landing.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/landing.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/landing.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/landing.segments/landing.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/login.html +1 -1
- package/cli/app/.next-cli-build/server/app/login.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/login.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/login.segments/_index.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/login.segments/login.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app-paths-manifest.json +9 -9
- package/cli/app/.next-cli-build/server/chunks/3155.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/412.js +2 -2
- package/cli/app/.next-cli-build/server/chunks/4746.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/5307.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/5469.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/8242.js +2 -2
- package/cli/app/.next-cli-build/server/chunks/8306.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/9621.js +1 -1
- package/cli/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/pages/404.html +1 -1
- package/cli/app/.next-cli-build/server/pages/500.html +1 -1
- package/cli/app/.next-cli-build/static/chunks/523-176a0660a9383518.js +3 -0
- package/cli/app/.next-cli-build/static/chunks/5497-8d0ec2995dc0a392.js +7 -0
- package/cli/app/.next-cli-build/static/chunks/{620-b21eb963d0189283.js → 620-375754e53341e85b.js} +1 -1
- package/cli/app/.next-cli-build/static/chunks/9126-7d5476f17beddfb0.js +1 -0
- package/cli/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/page-2468e6ba8d1efeec.js +1 -0
- package/cli/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/quota/page-579bf915396efc69.js +1 -0
- package/cli/app/.next-cli-build/static/css/87ffa46afc2273f4.css +1 -0
- package/cli/app/CHANGELOG.md +17 -0
- package/cli/app/package.json +1 -1
- package/cli/package.json +1 -1
- package/package.json +1 -1
- package/src/app/(dashboard)/dashboard/basic-chat/BasicChatPageClient.js +91 -38
- package/src/app/(dashboard)/dashboard/endpoint/EndpointPageClient.js +45 -38
- package/src/app/(dashboard)/dashboard/providers/page.js +199 -173
- package/src/app/(dashboard)/dashboard/usage/components/OverviewCards.js +11 -17
- package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/QuotaTable.js +15 -9
- package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/index.js +188 -120
- package/src/app/(dashboard)/dashboard/usage/components/ProviderTopology.js +149 -24
- package/src/shared/components/Header.js +4 -4
- package/src/shared/components/HeaderLanguage.js +2 -1
- package/src/shared/components/HeaderMenu.js +2 -1
- package/src/shared/components/Toggle.js +28 -12
- package/src/shared/components/UsageStats.js +3 -3
- package/cli/app/.next-cli-build/static/chunks/523-078802482e95c757.js +0 -3
- package/cli/app/.next-cli-build/static/chunks/5497-276ef7bcaaa911b7.js +0 -7
- package/cli/app/.next-cli-build/static/chunks/9126-9e1755f122b943cd.js +0 -1
- package/cli/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/page-2cedde97aaf3c729.js +0 -1
- package/cli/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/quota/page-6050ac2547c62b54.js +0 -1
- package/cli/app/.next-cli-build/static/css/b912482d9fc0b2ed.css +0 -1
- /package/cli/app/.next-cli-build/static/{x2eyEbk18Mgl67fqRmEFx → y-U4C09T7DItXT7CZZV41}/_buildManifest.js +0 -0
- /package/cli/app/.next-cli-build/static/{x2eyEbk18Mgl67fqRmEFx → y-U4C09T7DItXT7CZZV41}/_ssgManifest.js +0 -0
|
@@ -18,8 +18,7 @@ export default function OverviewCards({ stats }) {
|
|
|
18
18
|
value: fmt(stats.totalRequests),
|
|
19
19
|
icon: "send",
|
|
20
20
|
valueClass: "text-text-main",
|
|
21
|
-
iconClass: "bg-primary/
|
|
22
|
-
accentClass: "from-primary via-primary/70 to-transparent",
|
|
21
|
+
iconClass: "bg-primary/[0.08] text-primary",
|
|
23
22
|
detail: "All routed calls",
|
|
24
23
|
},
|
|
25
24
|
{
|
|
@@ -27,8 +26,7 @@ export default function OverviewCards({ stats }) {
|
|
|
27
26
|
value: fmt(stats.totalPromptTokens),
|
|
28
27
|
icon: "input",
|
|
29
28
|
valueClass: "text-primary",
|
|
30
|
-
iconClass: "bg-primary/
|
|
31
|
-
accentClass: "from-primary via-primary/70 to-transparent",
|
|
29
|
+
iconClass: "bg-primary/[0.08] text-primary",
|
|
32
30
|
detail: "Prompt and context",
|
|
33
31
|
},
|
|
34
32
|
{
|
|
@@ -36,17 +34,15 @@ export default function OverviewCards({ stats }) {
|
|
|
36
34
|
value: fmt(cached),
|
|
37
35
|
icon: "database",
|
|
38
36
|
valueClass: "text-info",
|
|
39
|
-
iconClass: "bg-info/
|
|
40
|
-
|
|
41
|
-
detail: cached > 0 ? `${hitRate.toFixed(1)}% of input · cache rate` : "No cache hits yet",
|
|
37
|
+
iconClass: "bg-info/[0.08] text-info",
|
|
38
|
+
detail: cached > 0 ? `${hitRate.toFixed(1)}% cache rate` : "No cache hits yet",
|
|
42
39
|
},
|
|
43
40
|
{
|
|
44
41
|
label: "Output Tokens",
|
|
45
42
|
value: fmt(stats.totalCompletionTokens),
|
|
46
43
|
icon: "output",
|
|
47
44
|
valueClass: "text-success",
|
|
48
|
-
iconClass: "bg-success/
|
|
49
|
-
accentClass: "from-success via-success/70 to-transparent",
|
|
45
|
+
iconClass: "bg-success/[0.08] text-success",
|
|
50
46
|
detail: "Generated responses",
|
|
51
47
|
},
|
|
52
48
|
{
|
|
@@ -54,8 +50,7 @@ export default function OverviewCards({ stats }) {
|
|
|
54
50
|
value: `~${fmtCost(stats.totalCost)}`,
|
|
55
51
|
icon: "payments",
|
|
56
52
|
valueClass: "text-warning",
|
|
57
|
-
iconClass: "bg-warning/
|
|
58
|
-
accentClass: "from-warning via-warning/70 to-transparent",
|
|
53
|
+
iconClass: "bg-warning/[0.08] text-warning",
|
|
59
54
|
detail: "Estimated, not billing",
|
|
60
55
|
className: "col-span-2 sm:col-span-1",
|
|
61
56
|
},
|
|
@@ -67,21 +62,20 @@ export default function OverviewCards({ stats }) {
|
|
|
67
62
|
<Card
|
|
68
63
|
key={metric.label}
|
|
69
64
|
padding="none"
|
|
70
|
-
className={`
|
|
65
|
+
className={`relative flex min-h-[104px] min-w-0 flex-col overflow-hidden p-3.5 sm:min-h-[112px] sm:p-4 ${metric.className || ""}`}
|
|
71
66
|
>
|
|
72
|
-
<span className={`absolute inset-x-0 top-0 h-0.5 bg-linear-to-r ${metric.accentClass}`} aria-hidden="true" />
|
|
73
67
|
<div className="flex items-start justify-between gap-2">
|
|
74
|
-
<span className="pt-0.5 text-
|
|
68
|
+
<span className="pt-0.5 text-xs font-semibold text-text-muted">
|
|
75
69
|
{metric.label}
|
|
76
70
|
</span>
|
|
77
|
-
<span className={`material-symbols-outlined flex size-7 shrink-0 items-center justify-center rounded-
|
|
71
|
+
<span className={`material-symbols-outlined flex size-7 shrink-0 items-center justify-center rounded-md text-[16px] ${metric.iconClass}`}>
|
|
78
72
|
{metric.icon}
|
|
79
73
|
</span>
|
|
80
74
|
</div>
|
|
81
|
-
<span className={`mt-1
|
|
75
|
+
<span className={`mt-1 truncate text-[22px] font-semibold tracking-[-0.02em] sm:text-2xl ${metric.valueClass}`}>
|
|
82
76
|
{metric.value}
|
|
83
77
|
</span>
|
|
84
|
-
<span className="mt-auto
|
|
78
|
+
<span className="mt-auto text-[11px] leading-[1.3] text-text-muted">{metric.detail}</span>
|
|
85
79
|
</Card>
|
|
86
80
|
))}
|
|
87
81
|
</div>
|
|
@@ -89,6 +89,8 @@ export default function QuotaTable({
|
|
|
89
89
|
compact = false,
|
|
90
90
|
sortMode = "default",
|
|
91
91
|
showSortLabel = false,
|
|
92
|
+
paginate = true,
|
|
93
|
+
totalCount,
|
|
92
94
|
}) {
|
|
93
95
|
const [page, setPage] = useState(1);
|
|
94
96
|
|
|
@@ -106,7 +108,9 @@ export default function QuotaTable({
|
|
|
106
108
|
[normalizedQuotas, sortMode],
|
|
107
109
|
);
|
|
108
110
|
|
|
109
|
-
const totalPages =
|
|
111
|
+
const totalPages = paginate
|
|
112
|
+
? Math.max(1, Math.ceil(sortedQuotas.length / PAGE_SIZE))
|
|
113
|
+
: 1;
|
|
110
114
|
|
|
111
115
|
useEffect(() => {
|
|
112
116
|
// eslint-disable-next-line react-hooks/set-state-in-effect -- pagination reset: returns to page 1 when sort mode or data changes
|
|
@@ -122,12 +126,14 @@ export default function QuotaTable({
|
|
|
122
126
|
return null;
|
|
123
127
|
}
|
|
124
128
|
|
|
125
|
-
const currentPageRows =
|
|
126
|
-
(page - 1) * PAGE_SIZE,
|
|
127
|
-
|
|
128
|
-
);
|
|
129
|
+
const currentPageRows = paginate
|
|
130
|
+
? sortedQuotas.slice((page - 1) * PAGE_SIZE, page * PAGE_SIZE)
|
|
131
|
+
: sortedQuotas;
|
|
129
132
|
const pageStart = sortedQuotas.length === 0 ? 0 : (page - 1) * PAGE_SIZE + 1;
|
|
130
|
-
const pageEnd =
|
|
133
|
+
const pageEnd = paginate
|
|
134
|
+
? Math.min(page * PAGE_SIZE, sortedQuotas.length)
|
|
135
|
+
: sortedQuotas.length;
|
|
136
|
+
const displayedTotal = Number.isFinite(totalCount) ? totalCount : sortedQuotas.length;
|
|
131
137
|
|
|
132
138
|
const cellPad = compact ? "py-1 px-1.5" : "py-2 px-3";
|
|
133
139
|
const nameText = compact ? "text-[11px]" : "text-sm";
|
|
@@ -139,7 +145,7 @@ export default function QuotaTable({
|
|
|
139
145
|
<div className="space-y-2">
|
|
140
146
|
<div className="flex items-center justify-between gap-2">
|
|
141
147
|
<div className="text-[10px] text-text-muted">
|
|
142
|
-
{
|
|
148
|
+
{displayedTotal} quota{displayedTotal > 1 ? "s" : ""}
|
|
143
149
|
</div>
|
|
144
150
|
{showSortLabel && (
|
|
145
151
|
<div className="rounded-md border border-black/10 bg-black/[0.02] px-2 py-1 text-[10px] text-text-muted dark:border-white/10 dark:bg-white/[0.03]">
|
|
@@ -243,7 +249,7 @@ export default function QuotaTable({
|
|
|
243
249
|
type="button"
|
|
244
250
|
onClick={() => setPage((currentPage) => Math.max(1, currentPage - 1))}
|
|
245
251
|
disabled={page === 1}
|
|
246
|
-
className="flex h-
|
|
252
|
+
className="flex h-11 items-center rounded-lg border border-black/10 px-3 text-xs text-text-primary transition-colors hover:bg-black/5 disabled:cursor-not-allowed disabled:opacity-40 dark:border-white/10 dark:hover:bg-white/5 sm:h-7 sm:rounded-md sm:px-2 sm:text-[10px]"
|
|
247
253
|
>
|
|
248
254
|
Prev
|
|
249
255
|
</button>
|
|
@@ -251,7 +257,7 @@ export default function QuotaTable({
|
|
|
251
257
|
type="button"
|
|
252
258
|
onClick={() => setPage((currentPage) => Math.min(totalPages, currentPage + 1))}
|
|
253
259
|
disabled={page === totalPages}
|
|
254
|
-
className="flex h-
|
|
260
|
+
className="flex h-11 items-center rounded-lg border border-black/10 px-3 text-xs text-text-primary transition-colors hover:bg-black/5 disabled:cursor-not-allowed disabled:opacity-40 dark:border-white/10 dark:hover:bg-white/5 sm:h-7 sm:rounded-md sm:px-2 sm:text-[10px]"
|
|
255
261
|
>
|
|
256
262
|
Next
|
|
257
263
|
</button>
|
|
@@ -4,7 +4,11 @@ import { useState, useEffect, useCallback, useRef, useMemo } from "react";
|
|
|
4
4
|
import ProviderIcon from "@/shared/components/ProviderIcon";
|
|
5
5
|
import QuotaTable from "./QuotaTable";
|
|
6
6
|
import Toggle from "@/shared/components/Toggle";
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
parseQuotaData,
|
|
9
|
+
calculatePercentage,
|
|
10
|
+
getRemainingPercentage,
|
|
11
|
+
} from "./utils";
|
|
8
12
|
import Card from "@/shared/components/Card";
|
|
9
13
|
import { EditConnectionModal } from "@/shared/components";
|
|
10
14
|
import {
|
|
@@ -82,6 +86,22 @@ function getProviderDisplayName(provider) {
|
|
|
82
86
|
return AI_PROVIDERS[provider]?.name || provider;
|
|
83
87
|
}
|
|
84
88
|
|
|
89
|
+
function getUrgentQuotaRows(quotas, limit = 3) {
|
|
90
|
+
return quotas
|
|
91
|
+
.map((quota, index) => ({ quota, index }))
|
|
92
|
+
.sort((a, b) => {
|
|
93
|
+
const remainingDiff = getRemainingPercentage(a.quota) - getRemainingPercentage(b.quota);
|
|
94
|
+
if (remainingDiff !== 0) return remainingDiff;
|
|
95
|
+
|
|
96
|
+
const resetA = a.quota.resetAt ? new Date(a.quota.resetAt).getTime() : Number.POSITIVE_INFINITY;
|
|
97
|
+
const resetB = b.quota.resetAt ? new Date(b.quota.resetAt).getTime() : Number.POSITIVE_INFINITY;
|
|
98
|
+
if (resetA !== resetB) return resetA - resetB;
|
|
99
|
+
return a.index - b.index;
|
|
100
|
+
})
|
|
101
|
+
.slice(0, limit)
|
|
102
|
+
.map(({ quota }) => quota);
|
|
103
|
+
}
|
|
104
|
+
|
|
85
105
|
function buildProviderAggregateCard(provider, providerConnections, quotaData, loading, errors) {
|
|
86
106
|
if (!providerConnections.length) return null;
|
|
87
107
|
const allQuotas = [];
|
|
@@ -363,6 +383,8 @@ export default function ProviderLimits() {
|
|
|
363
383
|
const [quotaSortMode, setQuotaSortMode] = useState("default");
|
|
364
384
|
const [expiringFirst, setExpiringFirst] = useState(false);
|
|
365
385
|
const [providerMenuOpen, setProviderMenuOpen] = useState(false);
|
|
386
|
+
const [mobileActionsOpen, setMobileActionsOpen] = useState(false);
|
|
387
|
+
const [expandedQuotaCards, setExpandedQuotaCards] = useState({});
|
|
366
388
|
const [bulkToggling, setBulkToggling] = useState(false);
|
|
367
389
|
const [serverAggregateData, setServerAggregateData] = useState({});
|
|
368
390
|
const [serverAggregateLoading, setServerAggregateLoading] = useState({});
|
|
@@ -965,13 +987,13 @@ export default function ProviderLimits() {
|
|
|
965
987
|
return (
|
|
966
988
|
<div className="space-y-6">
|
|
967
989
|
{/* Header Controls */}
|
|
968
|
-
<div className="flex
|
|
969
|
-
<div className="flex flex-wrap items-center gap-1.5">
|
|
970
|
-
<div className="relative">
|
|
990
|
+
<div className="flex justify-end">
|
|
991
|
+
<div className="grid w-full grid-cols-[minmax(0,1fr)_minmax(0,1fr)_2.75rem] gap-2 sm:flex sm:w-auto sm:flex-wrap sm:items-center sm:gap-1.5">
|
|
992
|
+
<div className="relative min-w-0">
|
|
971
993
|
<button
|
|
972
994
|
type="button"
|
|
973
995
|
onClick={() => setProviderMenuOpen((prev) => !prev)}
|
|
974
|
-
className="flex h-
|
|
996
|
+
className="flex h-11 w-full min-w-0 items-center justify-between gap-1 rounded-xl border border-black/10 bg-black/[0.02] px-3 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 sm:h-8 sm:w-auto sm:rounded-lg sm:px-2"
|
|
975
997
|
aria-haspopup="menu"
|
|
976
998
|
aria-expanded={providerMenuOpen}
|
|
977
999
|
title="Filter quota providers"
|
|
@@ -990,7 +1012,7 @@ export default function ProviderLimits() {
|
|
|
990
1012
|
fallbackText={providerFilter.slice(0, 2).toUpperCase()}
|
|
991
1013
|
/>
|
|
992
1014
|
)}
|
|
993
|
-
<span className="truncate capitalize
|
|
1015
|
+
<span className="truncate capitalize">
|
|
994
1016
|
{selectedProviderLabel}
|
|
995
1017
|
</span>
|
|
996
1018
|
</span>
|
|
@@ -1066,23 +1088,7 @@ export default function ProviderLimits() {
|
|
|
1066
1088
|
</>
|
|
1067
1089
|
)}
|
|
1068
1090
|
</div>
|
|
1069
|
-
|
|
1070
|
-
{QUOTA_DISPLAY_MODE_OPTIONS.map((option) => (
|
|
1071
|
-
<button
|
|
1072
|
-
key={option.value}
|
|
1073
|
-
type="button"
|
|
1074
|
-
onClick={() => setDisplayMode(option.value)}
|
|
1075
|
-
aria-pressed={displayMode === option.value}
|
|
1076
|
-
className={`flex h-full items-center gap-1.5 px-2 text-xs transition-colors ${displayMode === option.value ? "bg-primary text-white" : "text-text-primary hover:bg-black/5 dark:hover:bg-white/10"}`}
|
|
1077
|
-
title={`Show quota in ${option.label} mode`}
|
|
1078
|
-
>
|
|
1079
|
-
<span className="material-symbols-outlined text-[14px]">
|
|
1080
|
-
{option.icon}
|
|
1081
|
-
</span>
|
|
1082
|
-
<span className="hidden sm:inline">{option.label}</span>
|
|
1083
|
-
</button>
|
|
1084
|
-
))}
|
|
1085
|
-
</div>
|
|
1091
|
+
|
|
1086
1092
|
<select
|
|
1087
1093
|
value={accountFilter}
|
|
1088
1094
|
onChange={(event) => {
|
|
@@ -1092,7 +1098,7 @@ export default function ProviderLimits() {
|
|
|
1092
1098
|
}
|
|
1093
1099
|
setAccountFilter(nextValue);
|
|
1094
1100
|
}}
|
|
1095
|
-
className="h-
|
|
1101
|
+
className="h-11 min-w-0 rounded-xl border border-black/10 bg-black/[0.02] px-3 text-xs text-text-primary outline-none transition-colors hover:bg-black/5 dark:border-white/10 dark:bg-white/[0.03] dark:hover:bg-white/10 sm:h-8 sm:rounded-lg sm:px-2"
|
|
1096
1102
|
aria-label="Filter accounts by status"
|
|
1097
1103
|
>
|
|
1098
1104
|
{ACCOUNT_FILTER_OPTIONS.map((option) => (
|
|
@@ -1102,97 +1108,119 @@ export default function ProviderLimits() {
|
|
|
1102
1108
|
))}
|
|
1103
1109
|
</select>
|
|
1104
1110
|
|
|
1105
|
-
{providerFilter === "codex" && (
|
|
1106
|
-
<select
|
|
1107
|
-
value={quotaSortMode}
|
|
1108
|
-
onChange={(event) => setQuotaSortMode(event.target.value)}
|
|
1109
|
-
className="h-8 rounded-lg border border-black/10 bg-black/[0.02] px-2 text-xs text-text-primary outline-none transition-colors hover:bg-black/5 dark:border-white/10 dark:bg-white/[0.03] dark:hover:bg-white/10"
|
|
1110
|
-
aria-label="Sort Codex quotas by remaining"
|
|
1111
|
-
>
|
|
1112
|
-
{QUOTA_SORT_OPTIONS.map((option) => (
|
|
1113
|
-
<option key={option.value} value={option.value}>
|
|
1114
|
-
{option.label}
|
|
1115
|
-
</option>
|
|
1116
|
-
))}
|
|
1117
|
-
</select>
|
|
1118
|
-
)}
|
|
1119
|
-
|
|
1120
1111
|
<button
|
|
1121
1112
|
type="button"
|
|
1122
|
-
onClick={
|
|
1123
|
-
|
|
1124
|
-
className=
|
|
1125
|
-
title="
|
|
1113
|
+
onClick={refreshAll}
|
|
1114
|
+
disabled={refreshingAll}
|
|
1115
|
+
className="flex size-11 shrink-0 items-center justify-center rounded-xl border border-black/10 text-xs text-text-primary transition-colors hover:bg-black/5 disabled:opacity-50 dark:border-white/10 dark:hover:bg-white/5 sm:size-8 sm:rounded-lg"
|
|
1116
|
+
title="Refresh all"
|
|
1117
|
+
aria-label="Refresh all quotas"
|
|
1126
1118
|
>
|
|
1127
|
-
<span
|
|
1128
|
-
|
|
1119
|
+
<span
|
|
1120
|
+
className={`material-symbols-outlined text-[18px] sm:text-[14px] ${refreshingAll ? "animate-spin" : ""}`}
|
|
1121
|
+
>
|
|
1122
|
+
refresh
|
|
1129
1123
|
</span>
|
|
1130
|
-
<span className="hidden sm:inline">Expiring first</span>
|
|
1131
1124
|
</button>
|
|
1132
1125
|
|
|
1133
|
-
|
|
1126
|
+
<div className="col-span-2 inline-flex min-h-11 min-w-0 overflow-hidden rounded-xl border border-black/10 bg-black/[0.02] dark:border-white/10 dark:bg-white/[0.03] sm:h-8 sm:min-h-0 sm:rounded-lg">
|
|
1127
|
+
{QUOTA_DISPLAY_MODE_OPTIONS.map((option) => (
|
|
1128
|
+
<button
|
|
1129
|
+
key={option.value}
|
|
1130
|
+
type="button"
|
|
1131
|
+
onClick={() => setDisplayMode(option.value)}
|
|
1132
|
+
aria-pressed={displayMode === option.value}
|
|
1133
|
+
className={`flex min-h-11 flex-1 items-center justify-center gap-1.5 px-3 text-xs font-medium transition-colors sm:min-h-0 sm:flex-none sm:justify-start sm:px-2 sm:font-normal ${displayMode === option.value ? "bg-primary text-white" : "text-text-primary hover:bg-black/5 dark:hover:bg-white/10"}`}
|
|
1134
|
+
title={`Show quota in ${option.label} mode`}
|
|
1135
|
+
>
|
|
1136
|
+
<span className="material-symbols-outlined text-[17px] sm:text-[14px]">
|
|
1137
|
+
{option.icon}
|
|
1138
|
+
</span>
|
|
1139
|
+
<span>{option.label}</span>
|
|
1140
|
+
</button>
|
|
1141
|
+
))}
|
|
1142
|
+
</div>
|
|
1134
1143
|
<button
|
|
1135
1144
|
type="button"
|
|
1136
|
-
onClick={
|
|
1137
|
-
|
|
1138
|
-
className=
|
|
1139
|
-
|
|
1145
|
+
onClick={() => setMobileActionsOpen((prev) => !prev)}
|
|
1146
|
+
aria-expanded={mobileActionsOpen}
|
|
1147
|
+
className={`flex size-11 items-center justify-center rounded-xl border text-text-primary transition-colors sm:hidden ${mobileActionsOpen ? "border-primary/30 bg-primary/10 text-primary" : "border-black/10 hover:bg-black/5 dark:border-white/10 dark:hover:bg-white/5"}`}
|
|
1148
|
+
aria-label={mobileActionsOpen ? "Hide more actions" : "Show more actions"}
|
|
1140
1149
|
>
|
|
1141
|
-
<span className="material-symbols-outlined text-[
|
|
1142
|
-
<span className="hidden sm:inline">Turn off Empty</span>
|
|
1150
|
+
<span className="material-symbols-outlined text-[20px]">tune</span>
|
|
1143
1151
|
</button>
|
|
1144
1152
|
|
|
1145
|
-
{
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1153
|
+
<div className={`${mobileActionsOpen ? "flex" : "hidden"} col-span-3 flex-col gap-2 rounded-2xl border border-black/10 bg-black/[0.02] p-3 dark:border-white/10 dark:bg-white/[0.03] sm:contents`}>
|
|
1154
|
+
{providerFilter === "codex" && (
|
|
1155
|
+
<select
|
|
1156
|
+
value={quotaSortMode}
|
|
1157
|
+
onChange={(event) => setQuotaSortMode(event.target.value)}
|
|
1158
|
+
className="h-11 w-full rounded-xl border border-black/10 bg-surface px-3 text-xs text-text-primary outline-none transition-colors hover:bg-black/5 dark:border-white/10 dark:hover:bg-white/10 sm:h-8 sm:w-auto sm:rounded-lg sm:bg-black/[0.02] sm:px-2 dark:sm:bg-white/[0.03]"
|
|
1159
|
+
aria-label="Sort Codex quotas by remaining"
|
|
1160
|
+
>
|
|
1161
|
+
{QUOTA_SORT_OPTIONS.map((option) => (
|
|
1162
|
+
<option key={option.value} value={option.value}>
|
|
1163
|
+
{option.label}
|
|
1164
|
+
</option>
|
|
1165
|
+
))}
|
|
1166
|
+
</select>
|
|
1167
|
+
)}
|
|
1158
1168
|
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
<span
|
|
1166
|
-
className={`material-symbols-outlined text-[14px] ${
|
|
1167
|
-
autoRefresh ? "text-primary" : "text-text-muted"
|
|
1168
|
-
}`}
|
|
1169
|
+
<button
|
|
1170
|
+
type="button"
|
|
1171
|
+
onClick={() => setExpiringFirst((prev) => !prev)}
|
|
1172
|
+
aria-pressed={expiringFirst}
|
|
1173
|
+
className={`flex h-11 w-full shrink-0 items-center justify-between gap-2 rounded-xl border px-3 text-xs transition-colors sm:h-8 sm:w-auto sm:justify-start sm:rounded-lg sm:px-2 ${expiringFirst ? "border-amber-500/40 bg-amber-500/10 text-amber-600 dark:text-amber-400" : "border-black/10 bg-surface text-text-primary hover:bg-black/5 dark:border-white/10 dark:bg-transparent dark:hover:bg-white/5"}`}
|
|
1174
|
+
title="Sort accounts by earliest quota reset time"
|
|
1169
1175
|
>
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
Auto-refresh
|
|
1174
|
-
</span>
|
|
1175
|
-
{autoRefresh && (
|
|
1176
|
-
<span className="text-[10px] text-text-muted tabular-nums">
|
|
1177
|
-
({countdown}s)
|
|
1176
|
+
<span className="flex items-center gap-2">
|
|
1177
|
+
<span className="material-symbols-outlined text-[18px] sm:text-[14px]">hourglass_top</span>
|
|
1178
|
+
<span>Expiring first</span>
|
|
1178
1179
|
</span>
|
|
1179
|
-
|
|
1180
|
-
|
|
1180
|
+
<span className="material-symbols-outlined text-[18px] sm:hidden">
|
|
1181
|
+
{expiringFirst ? "check_circle" : "circle"}
|
|
1182
|
+
</span>
|
|
1183
|
+
</button>
|
|
1181
1184
|
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
title="Refresh all"
|
|
1189
|
-
>
|
|
1190
|
-
<span
|
|
1191
|
-
className={`material-symbols-outlined text-[14px] ${refreshingAll ? "animate-spin" : ""}`}
|
|
1185
|
+
<button
|
|
1186
|
+
type="button"
|
|
1187
|
+
onClick={handleDisableDepleted}
|
|
1188
|
+
disabled={bulkToggling}
|
|
1189
|
+
className="flex h-11 w-full shrink-0 items-center gap-2 rounded-xl border border-red-500/30 bg-surface px-3 text-xs text-red-500 transition-colors hover:bg-red-500/10 disabled:opacity-50 dark:bg-transparent sm:h-8 sm:w-auto sm:rounded-lg sm:px-2"
|
|
1190
|
+
title="Disable connections with depleted quota on the current page"
|
|
1192
1191
|
>
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1192
|
+
<span className="material-symbols-outlined text-[18px] sm:text-[14px]">block</span>
|
|
1193
|
+
<span>Turn off Empty</span>
|
|
1194
|
+
</button>
|
|
1195
|
+
|
|
1196
|
+
<button
|
|
1197
|
+
type="button"
|
|
1198
|
+
onClick={handleEnableAvailable}
|
|
1199
|
+
disabled={bulkToggling}
|
|
1200
|
+
className="flex h-11 w-full shrink-0 items-center gap-2 rounded-xl border border-emerald-500/30 bg-surface px-3 text-xs text-emerald-600 transition-colors hover:bg-emerald-500/10 disabled:opacity-50 dark:bg-transparent dark:text-emerald-400 sm:h-8 sm:w-auto sm:rounded-lg sm:px-2"
|
|
1201
|
+
title="Enable connections that still have quota on the current page"
|
|
1202
|
+
>
|
|
1203
|
+
<span className="material-symbols-outlined text-[18px] sm:text-[14px]">check_circle</span>
|
|
1204
|
+
<span>Turn on Available</span>
|
|
1205
|
+
</button>
|
|
1206
|
+
|
|
1207
|
+
<button
|
|
1208
|
+
type="button"
|
|
1209
|
+
onClick={() => setAutoRefresh((prev) => !prev)}
|
|
1210
|
+
className="flex h-11 w-full shrink-0 items-center justify-between gap-2 rounded-xl border border-black/10 bg-surface px-3 text-xs transition-colors hover:bg-black/5 dark:border-white/10 dark:bg-transparent dark:hover:bg-white/5 sm:h-8 sm:w-auto sm:justify-start sm:rounded-lg sm:px-2"
|
|
1211
|
+
title={autoRefresh ? "Disable auto-refresh" : "Enable auto-refresh"}
|
|
1212
|
+
>
|
|
1213
|
+
<span className="flex items-center gap-2 text-text-primary">
|
|
1214
|
+
<span className={`material-symbols-outlined text-[18px] sm:text-[14px] ${autoRefresh ? "text-primary" : "text-text-muted"}`}>
|
|
1215
|
+
{autoRefresh ? "toggle_on" : "toggle_off"}
|
|
1216
|
+
</span>
|
|
1217
|
+
<span>Auto-refresh</span>
|
|
1218
|
+
</span>
|
|
1219
|
+
{autoRefresh && (
|
|
1220
|
+
<span className="text-[10px] text-text-muted tabular-nums">({countdown}s)</span>
|
|
1221
|
+
)}
|
|
1222
|
+
</button>
|
|
1223
|
+
</div>
|
|
1196
1224
|
</div>
|
|
1197
1225
|
</div>
|
|
1198
1226
|
|
|
@@ -1210,6 +1238,11 @@ export default function ProviderLimits() {
|
|
|
1210
1238
|
const quota = isAggregate ? conn.quota : quotaData[conn.id];
|
|
1211
1239
|
const isLoading = isAggregate ? conn.isLoading : loading[conn.id];
|
|
1212
1240
|
const error = isAggregate ? conn.error : errors[conn.id];
|
|
1241
|
+
const quotaRows = quota?.quotas || [];
|
|
1242
|
+
const quotaExpanded = expandedQuotaCards[conn.id] === true;
|
|
1243
|
+
const mobileQuotaRows = quotaExpanded
|
|
1244
|
+
? quotaRows
|
|
1245
|
+
: getUrgentQuotaRows(quotaRows);
|
|
1213
1246
|
|
|
1214
1247
|
// Use table layout for all providers
|
|
1215
1248
|
const isInactive = conn.isActive === false;
|
|
@@ -1221,7 +1254,7 @@ export default function ProviderLimits() {
|
|
|
1221
1254
|
padding="none"
|
|
1222
1255
|
className={`min-w-0 ${isInactive ? "opacity-60" : ""}`}
|
|
1223
1256
|
>
|
|
1224
|
-
<div className="
|
|
1257
|
+
<div className="border-b border-black/10 px-3 py-2 dark:border-white/10">
|
|
1225
1258
|
<div className="flex items-center justify-between gap-2">
|
|
1226
1259
|
<div className="flex items-center gap-2 min-w-0">
|
|
1227
1260
|
<div className="w-8 h-8 shrink-0 rounded-md flex items-center justify-center overflow-hidden">
|
|
@@ -1247,7 +1280,7 @@ export default function ProviderLimits() {
|
|
|
1247
1280
|
</div>
|
|
1248
1281
|
</div>
|
|
1249
1282
|
|
|
1250
|
-
<div className="flex items-center gap-
|
|
1283
|
+
<div className="flex shrink-0 items-center gap-0.5 sm:gap-1">
|
|
1251
1284
|
<button
|
|
1252
1285
|
type="button"
|
|
1253
1286
|
onClick={() => (
|
|
@@ -1257,7 +1290,7 @@ export default function ProviderLimits() {
|
|
|
1257
1290
|
)}
|
|
1258
1291
|
disabled={isLoading || rowBusy}
|
|
1259
1292
|
aria-label="Refresh quota"
|
|
1260
|
-
className="
|
|
1293
|
+
className="flex size-11 items-center justify-center rounded-xl transition-colors hover:bg-black/5 disabled:opacity-50 dark:hover:bg-white/5 sm:size-8 sm:rounded-lg"
|
|
1261
1294
|
title="Refresh quota"
|
|
1262
1295
|
>
|
|
1263
1296
|
<span
|
|
@@ -1276,7 +1309,7 @@ export default function ProviderLimits() {
|
|
|
1276
1309
|
}}
|
|
1277
1310
|
disabled={rowBusy}
|
|
1278
1311
|
aria-label="Edit connection"
|
|
1279
|
-
className="
|
|
1312
|
+
className="flex size-11 items-center justify-center rounded-xl text-text-muted transition-colors hover:bg-black/5 hover:text-primary disabled:opacity-50 dark:hover:bg-white/5 sm:size-8 sm:rounded-lg"
|
|
1280
1313
|
title="Edit connection"
|
|
1281
1314
|
>
|
|
1282
1315
|
<span className="material-symbols-outlined text-[18px]">
|
|
@@ -1288,7 +1321,7 @@ export default function ProviderLimits() {
|
|
|
1288
1321
|
onClick={() => handleDeleteConnection(conn.id)}
|
|
1289
1322
|
disabled={rowBusy}
|
|
1290
1323
|
aria-label="Delete connection"
|
|
1291
|
-
className="
|
|
1324
|
+
className="flex size-11 items-center justify-center rounded-xl text-red-500 transition-colors hover:bg-red-500/10 disabled:opacity-50 sm:size-8 sm:rounded-lg"
|
|
1292
1325
|
title="Delete connection"
|
|
1293
1326
|
>
|
|
1294
1327
|
<span
|
|
@@ -1298,7 +1331,7 @@ export default function ProviderLimits() {
|
|
|
1298
1331
|
</span>
|
|
1299
1332
|
</button>
|
|
1300
1333
|
<div
|
|
1301
|
-
className="inline-flex items-center pl-0.5"
|
|
1334
|
+
className="inline-flex size-11 items-center justify-center sm:h-8 sm:w-auto sm:pl-0.5"
|
|
1302
1335
|
title={
|
|
1303
1336
|
(conn.isActive ?? true)
|
|
1304
1337
|
? "Disable connection"
|
|
@@ -1307,6 +1340,7 @@ export default function ProviderLimits() {
|
|
|
1307
1340
|
>
|
|
1308
1341
|
<Toggle
|
|
1309
1342
|
size="sm"
|
|
1343
|
+
touchTarget
|
|
1310
1344
|
checked={conn.isActive ?? true}
|
|
1311
1345
|
disabled={rowBusy}
|
|
1312
1346
|
onChange={(nextActive) =>
|
|
@@ -1334,16 +1368,50 @@ export default function ProviderLimits() {
|
|
|
1334
1368
|
</span>
|
|
1335
1369
|
<p className="mt-1.5 text-xs text-text-muted">{error}</p>
|
|
1336
1370
|
</div>
|
|
1337
|
-
) :
|
|
1371
|
+
) : quotaRows.length > 0 ? (
|
|
1338
1372
|
<div className="space-y-2">
|
|
1339
|
-
<
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1373
|
+
<div className="sm:hidden">
|
|
1374
|
+
<QuotaTable
|
|
1375
|
+
quotas={mobileQuotaRows}
|
|
1376
|
+
totalCount={quotaRows.length}
|
|
1377
|
+
paginate={false}
|
|
1378
|
+
compact
|
|
1379
|
+
sortMode="default"
|
|
1380
|
+
showSortLabel={
|
|
1381
|
+
conn.provider === "codex" && quotaSortMode !== "default"
|
|
1382
|
+
}
|
|
1383
|
+
/>
|
|
1384
|
+
{quotaRows.length > 3 && (
|
|
1385
|
+
<button
|
|
1386
|
+
type="button"
|
|
1387
|
+
onClick={() => setExpandedQuotaCards((current) => ({
|
|
1388
|
+
...current,
|
|
1389
|
+
[conn.id]: !quotaExpanded,
|
|
1390
|
+
}))}
|
|
1391
|
+
className="mt-2 flex h-11 w-full items-center justify-center gap-1.5 rounded-xl border border-black/10 bg-black/[0.02] text-xs font-medium text-text-primary transition-colors hover:bg-black/5 dark:border-white/10 dark:bg-white/[0.03] dark:hover:bg-white/5"
|
|
1392
|
+
aria-expanded={quotaExpanded}
|
|
1393
|
+
>
|
|
1394
|
+
<span>
|
|
1395
|
+
{quotaExpanded
|
|
1396
|
+
? "Show less"
|
|
1397
|
+
: `Show ${quotaRows.length - mobileQuotaRows.length} more`}
|
|
1398
|
+
</span>
|
|
1399
|
+
<span className="material-symbols-outlined text-[18px]">
|
|
1400
|
+
{quotaExpanded ? "expand_less" : "expand_more"}
|
|
1401
|
+
</span>
|
|
1402
|
+
</button>
|
|
1403
|
+
)}
|
|
1404
|
+
</div>
|
|
1405
|
+
<div className="hidden sm:block">
|
|
1406
|
+
<QuotaTable
|
|
1407
|
+
quotas={quotaRows}
|
|
1408
|
+
compact
|
|
1409
|
+
sortMode="default"
|
|
1410
|
+
showSortLabel={
|
|
1411
|
+
conn.provider === "codex" && quotaSortMode !== "default"
|
|
1412
|
+
}
|
|
1413
|
+
/>
|
|
1414
|
+
</div>
|
|
1347
1415
|
{quota?.message ? (
|
|
1348
1416
|
<p className="px-1 text-[10px] text-text-muted">{quota.message}</p>
|
|
1349
1417
|
) : null}
|
|
@@ -1379,7 +1447,7 @@ export default function ProviderLimits() {
|
|
|
1379
1447
|
setCustomPageSizeInput(String(nextPageSize));
|
|
1380
1448
|
}
|
|
1381
1449
|
}}
|
|
1382
|
-
className="h-
|
|
1450
|
+
className="h-11 rounded-xl border border-black/10 bg-black/[0.02] px-3 text-xs text-text-primary outline-none transition-colors hover:bg-black/5 dark:border-white/10 dark:bg-white/[0.03] dark:hover:bg-white/10 sm:h-8 sm:rounded-lg sm:px-2"
|
|
1383
1451
|
aria-label="Accounts per page"
|
|
1384
1452
|
>
|
|
1385
1453
|
{ACCOUNT_PAGE_SIZE_OPTIONS.map((option) => (
|
|
@@ -1419,7 +1487,7 @@ export default function ProviderLimits() {
|
|
|
1419
1487
|
setPageSize(nextPageSize);
|
|
1420
1488
|
setCustomPageSizeInput(String(nextPageSize));
|
|
1421
1489
|
}}
|
|
1422
|
-
className="h-
|
|
1490
|
+
className="h-11 w-24 rounded-xl border border-black/10 bg-black/[0.02] px-3 text-xs text-text-primary outline-none transition-colors hover:bg-black/5 dark:border-white/10 dark:bg-white/[0.03] dark:hover:bg-white/10 sm:h-8 sm:w-20 sm:rounded-lg sm:px-2"
|
|
1423
1491
|
aria-label="Custom accounts per page"
|
|
1424
1492
|
placeholder="Custom"
|
|
1425
1493
|
/>
|
|
@@ -1432,7 +1500,7 @@ export default function ProviderLimits() {
|
|
|
1432
1500
|
disabled={
|
|
1433
1501
|
pagination.page <= 1 || connectionsLoading || refreshingAll
|
|
1434
1502
|
}
|
|
1435
|
-
className="flex h-
|
|
1503
|
+
className="flex h-11 items-center rounded-xl border border-black/10 px-3 text-xs text-text-primary transition-colors hover:bg-black/5 disabled:cursor-not-allowed disabled:opacity-40 dark:border-white/10 dark:hover:bg-white/5 sm:h-8 sm:rounded-lg"
|
|
1436
1504
|
>
|
|
1437
1505
|
First Page
|
|
1438
1506
|
</button>
|
|
@@ -1444,7 +1512,7 @@ export default function ProviderLimits() {
|
|
|
1444
1512
|
disabled={
|
|
1445
1513
|
pagination.page <= 1 || connectionsLoading || refreshingAll
|
|
1446
1514
|
}
|
|
1447
|
-
className="flex
|
|
1515
|
+
className="flex size-11 items-center justify-center rounded-xl border border-black/10 text-text-primary transition-colors hover:bg-black/5 disabled:cursor-not-allowed disabled:opacity-40 dark:border-white/10 dark:hover:bg-white/5 sm:size-8 sm:rounded-lg"
|
|
1448
1516
|
aria-label="Previous accounts page"
|
|
1449
1517
|
>
|
|
1450
1518
|
<span className="material-symbols-outlined text-[16px]">
|
|
@@ -1463,7 +1531,7 @@ export default function ProviderLimits() {
|
|
|
1463
1531
|
connectionsLoading ||
|
|
1464
1532
|
refreshingAll
|
|
1465
1533
|
}
|
|
1466
|
-
className="flex
|
|
1534
|
+
className="flex size-11 items-center justify-center rounded-xl border border-black/10 text-text-primary transition-colors hover:bg-black/5 disabled:cursor-not-allowed disabled:opacity-40 dark:border-white/10 dark:hover:bg-white/5 sm:size-8 sm:rounded-lg"
|
|
1467
1535
|
aria-label="Next accounts page"
|
|
1468
1536
|
>
|
|
1469
1537
|
<span className="material-symbols-outlined text-[16px]">
|
|
@@ -1478,7 +1546,7 @@ export default function ProviderLimits() {
|
|
|
1478
1546
|
connectionsLoading ||
|
|
1479
1547
|
refreshingAll
|
|
1480
1548
|
}
|
|
1481
|
-
className="flex h-
|
|
1549
|
+
className="flex h-11 items-center rounded-xl border border-black/10 px-3 text-xs text-text-primary transition-colors hover:bg-black/5 disabled:cursor-not-allowed disabled:opacity-40 dark:border-white/10 dark:hover:bg-white/5 sm:h-8 sm:rounded-lg"
|
|
1482
1550
|
>
|
|
1483
1551
|
Last Page
|
|
1484
1552
|
</button>
|