zevairouter 1.0.145 → 1.0.146
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 +7 -0
- package/cli/app/.next-cli-build/BUILD_ID +1 -1
- package/cli/app/.next-cli-build/app-path-routes-manifest.json +4 -4
- 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_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 +4 -4
- package/cli/app/.next-cli-build/server/chunks/3155.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/412.js +1 -1
- 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/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/5497-7f6609cd427c6525.js +7 -0
- package/cli/app/.next-cli-build/static/chunks/{620-b21eb963d0189283.js → 620-cc65df39cb93df1c.js} +1 -1
- package/cli/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/page-847b19cd29966941.js +1 -0
- package/cli/app/.next-cli-build/static/css/1472cd17dfd55a13.css +1 -0
- package/cli/app/CHANGELOG.md +7 -0
- package/cli/app/package.json +1 -1
- package/cli/package.json +1 -1
- package/package.json +1 -1
- package/src/app/(dashboard)/dashboard/providers/page.js +71 -145
- package/src/app/(dashboard)/dashboard/usage/components/OverviewCards.js +11 -17
- package/src/app/(dashboard)/dashboard/usage/components/ProviderTopology.js +22 -22
- package/src/shared/components/UsageStats.js +3 -3
- package/cli/app/.next-cli-build/static/chunks/5497-276ef7bcaaa911b7.js +0 -7
- package/cli/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/page-2cedde97aaf3c729.js +0 -1
- package/cli/app/.next-cli-build/static/css/b912482d9fc0b2ed.css +0 -1
- /package/cli/app/.next-cli-build/static/{x2eyEbk18Mgl67fqRmEFx → DeFI037NxtdV4EpLD2ihz}/_buildManifest.js +0 -0
- /package/cli/app/.next-cli-build/static/{x2eyEbk18Mgl67fqRmEFx → DeFI037NxtdV4EpLD2ihz}/_ssgManifest.js +0 -0
|
@@ -29,28 +29,26 @@ import { useHeaderSearchStore } from "@/store/headerSearchStore";
|
|
|
29
29
|
import ModelAvailabilityBadge from "./components/ModelAvailabilityBadge";
|
|
30
30
|
|
|
31
31
|
function getStatusDisplay(connected, error, errorCode) {
|
|
32
|
-
const parts = [];
|
|
33
32
|
if (connected > 0) {
|
|
34
|
-
|
|
35
|
-
<
|
|
36
|
-
|
|
37
|
-
|
|
33
|
+
return (
|
|
34
|
+
<span className="inline-flex min-w-0 items-center gap-1.5 text-[11px] font-medium text-success">
|
|
35
|
+
<span aria-hidden="true" className="size-1.5 shrink-0 rounded-full bg-success" />
|
|
36
|
+
{connected} connected
|
|
37
|
+
</span>
|
|
38
38
|
);
|
|
39
39
|
}
|
|
40
40
|
if (error > 0) {
|
|
41
41
|
const errText = errorCode
|
|
42
42
|
? `${error} Error (${errorCode})`
|
|
43
43
|
: `${error} Error`;
|
|
44
|
-
|
|
45
|
-
<
|
|
44
|
+
return (
|
|
45
|
+
<span className="inline-flex min-w-0 items-center gap-1.5 text-[11px] font-medium text-error">
|
|
46
|
+
<span aria-hidden="true" className="size-1.5 shrink-0 rounded-full bg-error" />
|
|
46
47
|
{errText}
|
|
47
|
-
</
|
|
48
|
+
</span>
|
|
48
49
|
);
|
|
49
50
|
}
|
|
50
|
-
|
|
51
|
-
return <span className="text-text-muted">No connections</span>;
|
|
52
|
-
}
|
|
53
|
-
return parts;
|
|
51
|
+
return <span className="text-[11px] text-text-muted">No connections</span>;
|
|
54
52
|
}
|
|
55
53
|
|
|
56
54
|
function getConnectionErrorTag(connection) {
|
|
@@ -380,41 +378,35 @@ export default function ProvidersPage() {
|
|
|
380
378
|
anthropicCompatibleProviders.length > 0;
|
|
381
379
|
|
|
382
380
|
return (
|
|
383
|
-
<div className="flex min-w-0 flex-col gap-6 px-1 sm:px-0
|
|
381
|
+
<div className="flex min-w-0 flex-col gap-6 px-1 sm:px-0">
|
|
384
382
|
{totalConnections > 0 && (
|
|
385
|
-
<div className="overflow-hidden rounded-
|
|
386
|
-
<div className="grid grid-cols-
|
|
387
|
-
<div className="col-span-
|
|
388
|
-
<span className="flex size-
|
|
389
|
-
<span aria-hidden="true" className="material-symbols-outlined" style={{ fontSize:
|
|
383
|
+
<div className="overflow-hidden rounded-xl border border-border bg-surface/80 shadow-sm">
|
|
384
|
+
<div className="grid grid-cols-3 divide-x divide-y divide-border-subtle sm:grid-cols-4 sm:divide-y-0">
|
|
385
|
+
<div className="col-span-3 flex items-center gap-3 px-4 py-3 sm:col-span-1">
|
|
386
|
+
<span className="flex size-9 shrink-0 items-center justify-center rounded-lg bg-primary/[0.08] text-primary">
|
|
387
|
+
<span aria-hidden="true" className="material-symbols-outlined" style={{ fontSize: 18 }}>dns</span>
|
|
390
388
|
</span>
|
|
391
389
|
<div>
|
|
392
|
-
<p className="text-[
|
|
393
|
-
<p className="mt-0.5 text-sm font-semibold text-text-main">{activePercent}% active</p>
|
|
390
|
+
<p className="text-[11px] font-medium text-text-muted">Connection health</p>
|
|
391
|
+
<p className="mt-0.5 text-sm font-semibold tabular-nums text-text-main">{activePercent}% active</p>
|
|
394
392
|
</div>
|
|
395
393
|
</div>
|
|
396
|
-
<div className="px-4 py-3
|
|
397
|
-
<p className="text-[
|
|
398
|
-
<p className="mt-
|
|
394
|
+
<div className="px-4 py-3">
|
|
395
|
+
<p className="text-[11px] font-medium text-text-muted">Connections</p>
|
|
396
|
+
<p className="mt-0.5 text-lg font-semibold tabular-nums text-text-main">{totalConnections}</p>
|
|
399
397
|
</div>
|
|
400
|
-
<div className="px-4 py-3
|
|
401
|
-
<p className="text-[
|
|
402
|
-
<div className="mt-
|
|
403
|
-
<p className="text-
|
|
398
|
+
<div className="px-4 py-3">
|
|
399
|
+
<p className="text-[11px] font-medium text-text-muted">Active</p>
|
|
400
|
+
<div className="mt-0.5 flex items-baseline gap-2">
|
|
401
|
+
<p className="text-lg font-semibold tabular-nums text-success">{activeConnections}</p>
|
|
404
402
|
{pausedConnections > 0 && <span className="text-[10px] text-text-muted">{pausedConnections} paused</span>}
|
|
405
403
|
</div>
|
|
406
404
|
</div>
|
|
407
|
-
<div className="px-4 py-3
|
|
408
|
-
<p className="text-[
|
|
409
|
-
<p className="mt-
|
|
405
|
+
<div className="px-4 py-3">
|
|
406
|
+
<p className="text-[11px] font-medium text-text-muted">Providers</p>
|
|
407
|
+
<p className="mt-0.5 text-lg font-semibold tabular-nums text-info">{connectedProviderCount}</p>
|
|
410
408
|
</div>
|
|
411
409
|
</div>
|
|
412
|
-
{totalConnections >= 100 && (
|
|
413
|
-
<div className="flex items-center gap-2 border-t border-border-subtle bg-surface-2/35 px-4 py-2 text-[11px] text-text-muted">
|
|
414
|
-
<span aria-hidden="true" className="material-symbols-outlined text-[15px] text-primary">filter_alt</span>
|
|
415
|
-
Open a provider to search and filter its paginated connections.
|
|
416
|
-
</div>
|
|
417
|
-
)}
|
|
418
410
|
</div>
|
|
419
411
|
)}
|
|
420
412
|
{loadError && (
|
|
@@ -453,7 +445,7 @@ export default function ProvidersPage() {
|
|
|
453
445
|
variant="secondary"
|
|
454
446
|
icon="add"
|
|
455
447
|
onClick={() => setShowAddCompatibleModal(true)}
|
|
456
|
-
className="w-full
|
|
448
|
+
className="w-full sm:w-auto"
|
|
457
449
|
>
|
|
458
450
|
Add OpenAI Compatible
|
|
459
451
|
</Button>
|
|
@@ -469,7 +461,7 @@ export default function ProvidersPage() {
|
|
|
469
461
|
</div>
|
|
470
462
|
</div>
|
|
471
463
|
) : (
|
|
472
|
-
<div className="grid grid-cols-1 gap-
|
|
464
|
+
<div className="grid grid-cols-1 gap-2.5 sm:grid-cols-2 sm:gap-3 lg:grid-cols-3 xl:grid-cols-4">
|
|
473
465
|
{[...compatibleProviders, ...anthropicCompatibleProviders].map(
|
|
474
466
|
(info) => (
|
|
475
467
|
<ApiKeyProviderCard
|
|
@@ -477,7 +469,6 @@ export default function ProvidersPage() {
|
|
|
477
469
|
providerId={info.id}
|
|
478
470
|
provider={info}
|
|
479
471
|
stats={getProviderStats(info.id, "apikey")}
|
|
480
|
-
authType="compatible"
|
|
481
472
|
onToggle={(active) =>
|
|
482
473
|
handleToggleProvider(info.id, "apikey", active)
|
|
483
474
|
}
|
|
@@ -518,14 +509,13 @@ export default function ProvidersPage() {
|
|
|
518
509
|
</button>
|
|
519
510
|
</div>
|
|
520
511
|
</ProviderSectionHeader>
|
|
521
|
-
<div className="grid grid-cols-1 gap-
|
|
512
|
+
<div className="grid grid-cols-1 gap-2.5 sm:grid-cols-2 sm:gap-3 lg:grid-cols-3 xl:grid-cols-4">
|
|
522
513
|
{oauthEntries.map(([key, info]) => (
|
|
523
514
|
<ProviderCard
|
|
524
515
|
key={key}
|
|
525
516
|
providerId={key}
|
|
526
517
|
provider={info}
|
|
527
518
|
stats={getProviderStats(key, "oauth")}
|
|
528
|
-
authType="oauth"
|
|
529
519
|
onToggle={(active) => handleToggleProvider(key, "oauth", active)}
|
|
530
520
|
/>
|
|
531
521
|
))}
|
|
@@ -560,7 +550,7 @@ export default function ProvidersPage() {
|
|
|
560
550
|
{testingMode === "free" ? "Testing..." : "Test All"}
|
|
561
551
|
</button>
|
|
562
552
|
</ProviderSectionHeader>
|
|
563
|
-
<div className="grid grid-cols-1 gap-
|
|
553
|
+
<div className="grid grid-cols-1 gap-2.5 sm:grid-cols-2 sm:gap-3 lg:grid-cols-3 xl:grid-cols-4">
|
|
564
554
|
{freeEntries.map(([key, info]) => {
|
|
565
555
|
const hasApiKeyMode = Array.isArray(info?.authModes) && info.authModes.includes("apikey");
|
|
566
556
|
const statAuthTypes = hasApiKeyMode ? ["oauth", "apikey"] : "oauth";
|
|
@@ -570,7 +560,6 @@ export default function ProvidersPage() {
|
|
|
570
560
|
providerId={key}
|
|
571
561
|
provider={info}
|
|
572
562
|
stats={getProviderStats(key, statAuthTypes)}
|
|
573
|
-
authType="free"
|
|
574
563
|
onToggle={(active) => handleToggleProvider(key, hasApiKeyMode ? "apikey" : "oauth", active)}
|
|
575
564
|
/>
|
|
576
565
|
);
|
|
@@ -581,7 +570,6 @@ export default function ProvidersPage() {
|
|
|
581
570
|
providerId={key}
|
|
582
571
|
provider={info}
|
|
583
572
|
stats={getProviderStats(key, "apikey")}
|
|
584
|
-
authType="apikey"
|
|
585
573
|
onToggle={(active) => handleToggleProvider(key, "apikey", active)}
|
|
586
574
|
/>
|
|
587
575
|
))}
|
|
@@ -616,14 +604,13 @@ export default function ProvidersPage() {
|
|
|
616
604
|
{testingMode === "apikey" ? "Testing..." : "Test All"}
|
|
617
605
|
</button>
|
|
618
606
|
</ProviderSectionHeader>
|
|
619
|
-
<div className="grid grid-cols-1 gap-
|
|
607
|
+
<div className="grid grid-cols-1 gap-2.5 sm:grid-cols-2 sm:gap-3 lg:grid-cols-3 xl:grid-cols-4">
|
|
620
608
|
{visibleApikeyEntries.map(([key, info]) => (
|
|
621
609
|
<ApiKeyProviderCard
|
|
622
610
|
key={key}
|
|
623
611
|
providerId={key}
|
|
624
612
|
provider={info}
|
|
625
613
|
stats={getProviderStats(key, "apikey")}
|
|
626
|
-
authType="apikey"
|
|
627
614
|
onToggle={(active) => handleToggleProvider(key, "apikey", active)}
|
|
628
615
|
/>
|
|
629
616
|
))}
|
|
@@ -657,7 +644,6 @@ export default function ProvidersPage() {
|
|
|
657
644
|
providerId={key}
|
|
658
645
|
provider={info}
|
|
659
646
|
stats={getProviderStats(key, "apikey")}
|
|
660
|
-
authType="apikey"
|
|
661
647
|
onToggle={(active) => handleToggleProvider(key, "apikey", active)}
|
|
662
648
|
/>
|
|
663
649
|
))}
|
|
@@ -715,13 +701,13 @@ export default function ProvidersPage() {
|
|
|
715
701
|
function ProviderSectionHeader({ icon, title, description, children }) {
|
|
716
702
|
return (
|
|
717
703
|
<div className="flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between">
|
|
718
|
-
<div className="flex min-w-0 items-center gap-
|
|
719
|
-
<span aria-hidden="true" className="material-symbols-outlined flex size-
|
|
704
|
+
<div className="flex min-w-0 items-center gap-2.5">
|
|
705
|
+
<span aria-hidden="true" className="material-symbols-outlined flex size-8 shrink-0 items-center justify-center rounded-lg bg-primary/[0.08] text-[17px] text-primary">
|
|
720
706
|
{icon}
|
|
721
707
|
</span>
|
|
722
708
|
<div className="min-w-0">
|
|
723
|
-
<h2 className="text-lg font-semibold leading-tight
|
|
724
|
-
<p className="mt-0.5 text-
|
|
709
|
+
<h2 className="text-lg font-semibold leading-tight">{title}</h2>
|
|
710
|
+
<p className="mt-0.5 text-[11px] text-text-muted sm:text-xs">{description}</p>
|
|
725
711
|
</div>
|
|
726
712
|
</div>
|
|
727
713
|
{children}
|
|
@@ -736,39 +722,20 @@ ProviderSectionHeader.propTypes = {
|
|
|
736
722
|
children: PropTypes.node,
|
|
737
723
|
};
|
|
738
724
|
|
|
739
|
-
function ProviderCard({ providerId, provider, stats,
|
|
725
|
+
function ProviderCard({ providerId, provider, stats, onToggle }) {
|
|
740
726
|
const { connected, error, errorCode, allDisabled } = stats;
|
|
741
727
|
const isNoAuth = !!provider.noAuth;
|
|
742
|
-
const isReady = !allDisabled && (connected > 0 || isNoAuth);
|
|
743
|
-
|
|
744
|
-
const dotColors = {
|
|
745
|
-
free: "bg-green-500",
|
|
746
|
-
oauth: "bg-blue-500",
|
|
747
|
-
apikey: "bg-amber-500",
|
|
748
|
-
compatible: "bg-orange-500",
|
|
749
|
-
};
|
|
750
|
-
const dotLabels = {
|
|
751
|
-
free: "Free",
|
|
752
|
-
oauth: "OAuth",
|
|
753
|
-
apikey: "API Key",
|
|
754
|
-
compatible: "Compatible",
|
|
755
|
-
};
|
|
756
728
|
|
|
757
729
|
return (
|
|
758
730
|
<Link href={`/dashboard/providers/${providerId}`} className="group min-w-0">
|
|
759
731
|
<Card
|
|
760
732
|
padding="none"
|
|
761
|
-
className={`relative h-[
|
|
762
|
-
isReady
|
|
763
|
-
? "border-success/25 bg-linear-to-br from-success/[0.045] to-transparent"
|
|
764
|
-
: "group-hover:border-primary/25"
|
|
765
|
-
} ${allDisabled ? "opacity-55" : ""}`}
|
|
733
|
+
className={`relative h-[76px] min-h-[76px] cursor-pointer overflow-hidden transition-[border-color,box-shadow,opacity] group-hover:border-primary/30 group-hover:shadow-[0_10px_26px_-22px_rgba(229,106,74,0.55)] sm:h-[78px] sm:min-h-[78px] ${allDisabled ? "opacity-55" : ""}`}
|
|
766
734
|
>
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
<div className="flex min-w-0 items-center gap-3">
|
|
735
|
+
<div className="flex h-full min-w-0 items-center justify-between gap-2.5 p-3">
|
|
736
|
+
<div className="flex min-w-0 items-center gap-2.5">
|
|
770
737
|
<div
|
|
771
|
-
className="flex size-
|
|
738
|
+
className="flex size-9 shrink-0 items-center justify-center rounded-lg ring-1 ring-black/[0.04] dark:ring-white/[0.06]"
|
|
772
739
|
style={{
|
|
773
740
|
backgroundColor: `${provider.color?.length > 7 ? provider.color : provider.color + "15"}`,
|
|
774
741
|
}}
|
|
@@ -776,8 +743,8 @@ function ProviderCard({ providerId, provider, stats, authType, onToggle }) {
|
|
|
776
743
|
<ProviderIcon
|
|
777
744
|
src={`/providers/${provider.id}.png`}
|
|
778
745
|
alt=""
|
|
779
|
-
size={
|
|
780
|
-
className="max-h-
|
|
746
|
+
size={28}
|
|
747
|
+
className="max-h-7 max-w-7 rounded-md object-contain"
|
|
781
748
|
fallbackText={
|
|
782
749
|
provider.textIcon || provider.id.slice(0, 2).toUpperCase()
|
|
783
750
|
}
|
|
@@ -786,26 +753,19 @@ function ProviderCard({ providerId, provider, stats, authType, onToggle }) {
|
|
|
786
753
|
</div>
|
|
787
754
|
<div className="min-w-0">
|
|
788
755
|
<h3 className="truncate text-sm font-semibold text-text-main">{provider.name}</h3>
|
|
789
|
-
<div className="mt-1 flex min-w-0 items-center
|
|
790
|
-
<span className="inline-flex items-center gap-1 text-[10px] font-medium text-text-muted">
|
|
791
|
-
<span aria-hidden="true" className={`size-1.5 rounded-full ${dotColors[authType] || "bg-text-muted"}`} />
|
|
792
|
-
{dotLabels[authType] || "Provider"}
|
|
793
|
-
</span>
|
|
756
|
+
<div className="mt-1 flex min-w-0 items-center overflow-hidden whitespace-nowrap">
|
|
794
757
|
{allDisabled ? (
|
|
795
|
-
<
|
|
796
|
-
<span className="
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
</span>
|
|
800
|
-
Disabled
|
|
801
|
-
</span>
|
|
802
|
-
</Badge>
|
|
758
|
+
<span className="inline-flex items-center gap-1 text-[11px] text-text-muted">
|
|
759
|
+
<span aria-hidden="true" className="material-symbols-outlined text-[13px]">pause_circle</span>
|
|
760
|
+
Disabled
|
|
761
|
+
</span>
|
|
803
762
|
) : isNoAuth ? (
|
|
804
|
-
<
|
|
763
|
+
<span className="inline-flex items-center gap-1.5 text-[11px] font-medium text-success">
|
|
764
|
+
<span aria-hidden="true" className="size-1.5 rounded-full bg-success" />
|
|
765
|
+
Ready
|
|
766
|
+
</span>
|
|
805
767
|
) : (
|
|
806
|
-
|
|
807
|
-
{getStatusDisplay(connected, error, errorCode)}
|
|
808
|
-
</>
|
|
768
|
+
getStatusDisplay(connected, error, errorCode)
|
|
809
769
|
)}
|
|
810
770
|
</div>
|
|
811
771
|
</div>
|
|
@@ -828,7 +788,7 @@ function ProviderCard({ providerId, provider, stats, authType, onToggle }) {
|
|
|
828
788
|
/>
|
|
829
789
|
</div>
|
|
830
790
|
)}
|
|
831
|
-
<span aria-hidden="true" className="material-symbols-outlined text-[
|
|
791
|
+
<span aria-hidden="true" className="material-symbols-outlined text-[17px] text-text-subtle transition-[transform,color] group-hover:translate-x-0.5 group-hover:text-primary">
|
|
832
792
|
chevron_right
|
|
833
793
|
</span>
|
|
834
794
|
</div>
|
|
@@ -854,7 +814,6 @@ ProviderCard.propTypes = {
|
|
|
854
814
|
total: PropTypes.number,
|
|
855
815
|
allDisabled: PropTypes.bool,
|
|
856
816
|
}).isRequired,
|
|
857
|
-
authType: PropTypes.string,
|
|
858
817
|
onToggle: PropTypes.func,
|
|
859
818
|
};
|
|
860
819
|
|
|
@@ -862,29 +821,14 @@ function ApiKeyProviderCard({
|
|
|
862
821
|
providerId,
|
|
863
822
|
provider,
|
|
864
823
|
stats,
|
|
865
|
-
authType,
|
|
866
824
|
onToggle,
|
|
867
825
|
}) {
|
|
868
826
|
const { connected, error, errorCode, allDisabled } = stats;
|
|
869
|
-
const isReady = !allDisabled && connected > 0;
|
|
870
827
|
const isCompatible = providerId.startsWith(OPENAI_COMPATIBLE_PREFIX);
|
|
871
828
|
const isAnthropicCompatible = providerId.startsWith(
|
|
872
829
|
ANTHROPIC_COMPATIBLE_PREFIX,
|
|
873
830
|
);
|
|
874
831
|
|
|
875
|
-
const dotColors = {
|
|
876
|
-
free: "bg-green-500",
|
|
877
|
-
oauth: "bg-blue-500",
|
|
878
|
-
apikey: "bg-amber-500",
|
|
879
|
-
compatible: "bg-orange-500",
|
|
880
|
-
};
|
|
881
|
-
const dotLabels = {
|
|
882
|
-
free: "Free",
|
|
883
|
-
oauth: "OAuth",
|
|
884
|
-
apikey: "API Key",
|
|
885
|
-
compatible: "Compatible",
|
|
886
|
-
};
|
|
887
|
-
|
|
888
832
|
const getIconPath = () => {
|
|
889
833
|
if (provider.id === "featherless") return null;
|
|
890
834
|
if (isCompatible)
|
|
@@ -899,17 +843,12 @@ function ApiKeyProviderCard({
|
|
|
899
843
|
<Link href={`/dashboard/providers/${providerId}`} className="group min-w-0">
|
|
900
844
|
<Card
|
|
901
845
|
padding="none"
|
|
902
|
-
className={`relative h-[
|
|
903
|
-
isReady
|
|
904
|
-
? "border-success/25 bg-linear-to-br from-success/[0.045] to-transparent"
|
|
905
|
-
: "group-hover:border-primary/25"
|
|
906
|
-
} ${allDisabled ? "opacity-55" : ""}`}
|
|
846
|
+
className={`relative h-[76px] min-h-[76px] cursor-pointer overflow-hidden transition-[border-color,box-shadow,opacity] group-hover:border-primary/30 group-hover:shadow-[0_10px_26px_-22px_rgba(229,106,74,0.55)] sm:h-[78px] sm:min-h-[78px] ${allDisabled ? "opacity-55" : ""}`}
|
|
907
847
|
>
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
<div className="flex min-w-0 items-center gap-3">
|
|
848
|
+
<div className="flex h-full min-w-0 items-center justify-between gap-2.5 p-3">
|
|
849
|
+
<div className="flex min-w-0 items-center gap-2.5">
|
|
911
850
|
<div
|
|
912
|
-
className="flex size-
|
|
851
|
+
className="flex size-9 shrink-0 items-center justify-center rounded-lg ring-1 ring-black/[0.04] dark:ring-white/[0.06]"
|
|
913
852
|
style={{
|
|
914
853
|
backgroundColor: `${provider.color?.length > 7 ? provider.color : provider.color + "15"}`,
|
|
915
854
|
}}
|
|
@@ -917,8 +856,8 @@ function ApiKeyProviderCard({
|
|
|
917
856
|
<ProviderIcon
|
|
918
857
|
src={getIconPath()}
|
|
919
858
|
alt=""
|
|
920
|
-
size={
|
|
921
|
-
className="max-h-
|
|
859
|
+
size={28}
|
|
860
|
+
className="max-h-7 max-w-7 rounded-md object-contain"
|
|
922
861
|
fallbackText={
|
|
923
862
|
provider.textIcon || provider.id.slice(0, 2).toUpperCase()
|
|
924
863
|
}
|
|
@@ -927,34 +866,22 @@ function ApiKeyProviderCard({
|
|
|
927
866
|
</div>
|
|
928
867
|
<div className="min-w-0">
|
|
929
868
|
<h3 className="truncate text-sm font-semibold text-text-main">{provider.name}</h3>
|
|
930
|
-
<div className="mt-1 flex min-w-0 items-center gap-1.5 overflow-hidden whitespace-nowrap
|
|
931
|
-
<span className="inline-flex items-center gap-1 text-[10px] font-medium text-text-muted">
|
|
932
|
-
<span aria-hidden="true" className={`size-1.5 rounded-full ${dotColors[authType] || "bg-text-muted"}`} />
|
|
933
|
-
{dotLabels[authType] || "Provider"}
|
|
934
|
-
</span>
|
|
869
|
+
<div className="mt-1 flex min-w-0 items-center gap-1.5 overflow-hidden whitespace-nowrap">
|
|
935
870
|
{allDisabled ? (
|
|
936
|
-
<
|
|
937
|
-
<span className="
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
</span>
|
|
941
|
-
Disabled
|
|
942
|
-
</span>
|
|
943
|
-
</Badge>
|
|
871
|
+
<span className="inline-flex items-center gap-1 text-[11px] text-text-muted">
|
|
872
|
+
<span aria-hidden="true" className="material-symbols-outlined text-[13px]">pause_circle</span>
|
|
873
|
+
Disabled
|
|
874
|
+
</span>
|
|
944
875
|
) : (
|
|
945
876
|
<>
|
|
946
877
|
{getStatusDisplay(connected, error, errorCode)}
|
|
947
878
|
{isCompatible && (
|
|
948
|
-
<
|
|
949
|
-
{provider.apiType === "responses"
|
|
950
|
-
|
|
951
|
-
: "Chat"}
|
|
952
|
-
</Badge>
|
|
879
|
+
<span className="text-[10px] text-text-subtle">
|
|
880
|
+
· {provider.apiType === "responses" ? "Responses" : "Chat"}
|
|
881
|
+
</span>
|
|
953
882
|
)}
|
|
954
883
|
{isAnthropicCompatible && (
|
|
955
|
-
<
|
|
956
|
-
Messages
|
|
957
|
-
</Badge>
|
|
884
|
+
<span className="text-[10px] text-text-subtle">· Messages</span>
|
|
958
885
|
)}
|
|
959
886
|
</>
|
|
960
887
|
)}
|
|
@@ -979,7 +906,7 @@ function ApiKeyProviderCard({
|
|
|
979
906
|
/>
|
|
980
907
|
</div>
|
|
981
908
|
)}
|
|
982
|
-
<span aria-hidden="true" className="material-symbols-outlined text-[
|
|
909
|
+
<span aria-hidden="true" className="material-symbols-outlined text-[17px] text-text-subtle transition-[transform,color] group-hover:translate-x-0.5 group-hover:text-primary">
|
|
983
910
|
chevron_right
|
|
984
911
|
</span>
|
|
985
912
|
</div>
|
|
@@ -1006,7 +933,6 @@ ApiKeyProviderCard.propTypes = {
|
|
|
1006
933
|
total: PropTypes.number,
|
|
1007
934
|
allDisabled: PropTypes.bool,
|
|
1008
935
|
}).isRequired,
|
|
1009
|
-
authType: PropTypes.string,
|
|
1010
936
|
onToggle: PropTypes.func,
|
|
1011
937
|
};
|
|
1012
938
|
|
|
@@ -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>
|
|
@@ -15,7 +15,7 @@ import { AI_PROVIDERS } from "@/shared/constants/providers";
|
|
|
15
15
|
// Force-stop FE animation if a provider stays active longer than this
|
|
16
16
|
const FE_ACTIVE_TIMEOUT_MS = 60000;
|
|
17
17
|
const FE_ACTIVE_TICK_MS = 1000;
|
|
18
|
-
const FIT_OPTS = { padding: 0.
|
|
18
|
+
const FIT_OPTS = { padding: 0.14, duration: 200 };
|
|
19
19
|
|
|
20
20
|
function getProviderConfig(providerId) {
|
|
21
21
|
return AI_PROVIDERS[providerId] || { color: "#6b7280", name: providerId };
|
|
@@ -32,11 +32,11 @@ function ProviderNode({ data }) {
|
|
|
32
32
|
const [imgError, setImgError] = useState(false);
|
|
33
33
|
return (
|
|
34
34
|
<div
|
|
35
|
-
className="flex items-center gap-2
|
|
35
|
+
className="flex items-center gap-2 rounded-lg border bg-surface px-3 py-2 transition-all duration-300"
|
|
36
36
|
style={{
|
|
37
37
|
borderColor: active ? color : "var(--color-border)",
|
|
38
|
-
boxShadow: active ? `0 0
|
|
39
|
-
minWidth: "
|
|
38
|
+
boxShadow: active ? `0 0 12px ${color}30` : "none",
|
|
39
|
+
minWidth: "140px",
|
|
40
40
|
}}
|
|
41
41
|
>
|
|
42
42
|
<Handle type="target" position={Position.Top} id="top" className="!bg-transparent !border-0 !w-0 !h-0" />
|
|
@@ -46,19 +46,19 @@ function ProviderNode({ data }) {
|
|
|
46
46
|
|
|
47
47
|
{/* Provider icon */}
|
|
48
48
|
<div
|
|
49
|
-
className="
|
|
49
|
+
className="flex size-7 shrink-0 items-center justify-center rounded-md"
|
|
50
50
|
style={{ backgroundColor: `${color}15` }}
|
|
51
51
|
>
|
|
52
52
|
{!imgError ? (
|
|
53
|
-
<img src={imageUrl} alt={label} className="
|
|
53
|
+
<img src={imageUrl} alt={label} className="size-5 rounded-sm object-contain" onError={() => setImgError(true)} />
|
|
54
54
|
) : (
|
|
55
|
-
<span className="text-
|
|
55
|
+
<span className="text-xs font-bold" style={{ color }}>{textIcon}</span>
|
|
56
56
|
)}
|
|
57
57
|
</div>
|
|
58
58
|
|
|
59
59
|
{/* Provider name */}
|
|
60
60
|
<span
|
|
61
|
-
className="text-
|
|
61
|
+
className="truncate text-sm font-medium"
|
|
62
62
|
style={{ color: active ? color : "var(--color-text)" }}
|
|
63
63
|
>
|
|
64
64
|
{label}
|
|
@@ -82,16 +82,16 @@ ProviderNode.propTypes = {
|
|
|
82
82
|
// Center ZevaiRouter node
|
|
83
83
|
function RouterNode({ data }) {
|
|
84
84
|
return (
|
|
85
|
-
<div className="flex items-center justify-center
|
|
85
|
+
<div className="flex min-w-[118px] items-center justify-center rounded-lg border border-primary bg-primary/[0.06] px-4 py-2.5 shadow-sm">
|
|
86
86
|
<Handle type="source" position={Position.Top} id="top" className="!bg-transparent !border-0 !w-0 !h-0" />
|
|
87
87
|
<Handle type="source" position={Position.Bottom} id="bottom" className="!bg-transparent !border-0 !w-0 !h-0" />
|
|
88
88
|
<Handle type="source" position={Position.Left} id="left" className="!bg-transparent !border-0 !w-0 !h-0" />
|
|
89
89
|
<Handle type="source" position={Position.Right} id="right" className="!bg-transparent !border-0 !w-0 !h-0" />
|
|
90
90
|
|
|
91
|
-
<img src="/favicon.svg" alt="ZevaiRouter" className="
|
|
92
|
-
<span className="text-
|
|
91
|
+
<img src="/favicon.svg" alt="ZevaiRouter" className="mr-2 size-5" />
|
|
92
|
+
<span className="text-xs font-semibold text-primary">ZevaiRouter</span>
|
|
93
93
|
{data.activeCount > 0 && (
|
|
94
|
-
<span className="ml-2 px-1.5 py-0.5
|
|
94
|
+
<span className="ml-2 rounded-full bg-primary px-1.5 py-0.5 text-[10px] font-semibold text-white">
|
|
95
95
|
{data.activeCount}
|
|
96
96
|
</span>
|
|
97
97
|
)}
|
|
@@ -107,18 +107,18 @@ const nodeTypes = { provider: ProviderNode, router: RouterNode };
|
|
|
107
107
|
|
|
108
108
|
// Place N nodes evenly along an ellipse around the router center.
|
|
109
109
|
function buildLayout(providers, activeSet, lastSet, errorSet) {
|
|
110
|
-
const nodeW =
|
|
111
|
-
const nodeH =
|
|
112
|
-
const routerW =
|
|
113
|
-
const routerH =
|
|
114
|
-
const nodeGap =
|
|
110
|
+
const nodeW = 160;
|
|
111
|
+
const nodeH = 44;
|
|
112
|
+
const routerW = 118;
|
|
113
|
+
const routerH = 40;
|
|
114
|
+
const nodeGap = 20;
|
|
115
115
|
|
|
116
116
|
const count = providers.length;
|
|
117
117
|
|
|
118
118
|
// Compute rx so arc spacing between nodes >= nodeW + nodeGap
|
|
119
119
|
const minRx = ((nodeW + nodeGap) * count) / (2 * Math.PI);
|
|
120
|
-
const rx = Math.max(
|
|
121
|
-
const ry = Math.max(
|
|
120
|
+
const rx = Math.max(270, minRx);
|
|
121
|
+
const ry = Math.max(150, rx * 0.52);
|
|
122
122
|
if (count === 0) {
|
|
123
123
|
return {
|
|
124
124
|
nodes: [{ id: "router", type: "router", position: { x: 0, y: 0 }, data: { activeCount: 0 }, draggable: false }],
|
|
@@ -283,13 +283,13 @@ export default function ProviderTopology({ providers = [], activeRequests = [],
|
|
|
283
283
|
}, [nodes.length]);
|
|
284
284
|
|
|
285
285
|
return (
|
|
286
|
-
<div ref={containerRef} className="flex h-[
|
|
286
|
+
<div ref={containerRef} className="flex h-[340px] w-full min-w-0 flex-col overflow-hidden rounded-[14px] border border-border-subtle bg-surface/94 shadow-[0_14px_34px_-26px_rgba(15,23,42,0.28)] sm:h-[440px]">
|
|
287
287
|
<div className="flex shrink-0 items-center justify-between border-b border-border-subtle bg-surface/75 px-4 py-3.5">
|
|
288
288
|
<div className="flex items-center gap-2">
|
|
289
289
|
<span className="material-symbols-outlined text-[17px] text-primary">route</span>
|
|
290
|
-
<span className="text-xs font-
|
|
290
|
+
<span className="text-xs font-semibold text-text-main">Routing map</span>
|
|
291
291
|
</div>
|
|
292
|
-
<span className="
|
|
292
|
+
<span className="text-[11px] font-medium text-text-muted">
|
|
293
293
|
{providers.length} {providers.length === 1 ? "provider" : "providers"}
|
|
294
294
|
</span>
|
|
295
295
|
</div>
|