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
|
@@ -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) {
|
|
@@ -97,6 +95,12 @@ function getConnectionErrorTag(connection) {
|
|
|
97
95
|
|
|
98
96
|
const PROVIDERS_DEFAULT_PAGE_SIZE = 20;
|
|
99
97
|
const PROVIDERS_FETCH_TIMEOUT_MS = 8000;
|
|
98
|
+
const PROVIDER_STATUS_FILTERS = [
|
|
99
|
+
{ value: "all", label: "All" },
|
|
100
|
+
{ value: "connected", label: "Connected" },
|
|
101
|
+
{ value: "ready", label: "Ready" },
|
|
102
|
+
{ value: "setup", label: "Needs setup" },
|
|
103
|
+
];
|
|
100
104
|
|
|
101
105
|
async function fetchJsonWithTimeout(url) {
|
|
102
106
|
const controller = new AbortController();
|
|
@@ -131,6 +135,13 @@ export default function ProvidersPage() {
|
|
|
131
135
|
useState(false);
|
|
132
136
|
const [testingMode, setTestingMode] = useState(null);
|
|
133
137
|
const [testResults, setTestResults] = useState(null);
|
|
138
|
+
const [statusFilter, setStatusFilter] = useState("all");
|
|
139
|
+
const [collapsedSections, setCollapsedSections] = useState({
|
|
140
|
+
custom: false,
|
|
141
|
+
oauth: false,
|
|
142
|
+
free: true,
|
|
143
|
+
apikey: true,
|
|
144
|
+
});
|
|
134
145
|
const notify = useNotificationStore();
|
|
135
146
|
const searchQuery = useHeaderSearchStore((s) => s.query);
|
|
136
147
|
const registerSearch = useHeaderSearchStore((s) => s.register);
|
|
@@ -144,7 +155,7 @@ export default function ProvidersPage() {
|
|
|
144
155
|
useEffect(() => {
|
|
145
156
|
// eslint-disable-next-line react-hooks/set-state-in-effect -- pagination reset: returns to page 1 when search query or page size changes
|
|
146
157
|
setApikeyPage(1);
|
|
147
|
-
}, [searchQuery, apikeyPageSize]);
|
|
158
|
+
}, [searchQuery, apikeyPageSize, statusFilter]);
|
|
148
159
|
|
|
149
160
|
const matchSearch = (name) =>
|
|
150
161
|
!searchQuery.trim() ||
|
|
@@ -160,16 +171,6 @@ export default function ProvidersPage() {
|
|
|
160
171
|
return (a.name || "").localeCompare(b.name || "");
|
|
161
172
|
});
|
|
162
173
|
|
|
163
|
-
const sortItemsByPriority = (items, authType) =>
|
|
164
|
-
[...items].sort((a, b) => {
|
|
165
|
-
const sa = getProviderStats(a.id, authType);
|
|
166
|
-
const sb = getProviderStats(b.id, authType);
|
|
167
|
-
const ca = sa.connected > 0 ? 1 : 0;
|
|
168
|
-
const cb = sb.connected > 0 ? 1 : 0;
|
|
169
|
-
if (ca !== cb) return cb - ca;
|
|
170
|
-
return (a.name || "").localeCompare(b.name || "");
|
|
171
|
-
});
|
|
172
|
-
|
|
173
174
|
useEffect(() => {
|
|
174
175
|
const fetchData = async () => {
|
|
175
176
|
try {
|
|
@@ -268,6 +269,21 @@ export default function ProvidersPage() {
|
|
|
268
269
|
return { connected, error, total, errorCode, errorTime, allDisabled };
|
|
269
270
|
};
|
|
270
271
|
|
|
272
|
+
const matchesStatusFilter = (providerId, provider, authType) => {
|
|
273
|
+
if (statusFilter === "all") return true;
|
|
274
|
+
const stats = getProviderStats(providerId, authType);
|
|
275
|
+
if (statusFilter === "connected") return stats.connected > 0;
|
|
276
|
+
if (statusFilter === "ready") return stats.connected === 0 && provider.noAuth === true;
|
|
277
|
+
return stats.connected === 0 && provider.noAuth !== true;
|
|
278
|
+
};
|
|
279
|
+
|
|
280
|
+
const toggleSection = (section) => {
|
|
281
|
+
setCollapsedSections((current) => ({
|
|
282
|
+
...current,
|
|
283
|
+
[section]: !current[section],
|
|
284
|
+
}));
|
|
285
|
+
};
|
|
286
|
+
|
|
271
287
|
// Toggle all connections for a provider on/off
|
|
272
288
|
const handleToggleProvider = async (providerId, authType, newActive) => {
|
|
273
289
|
const providerConns = connections.filter(
|
|
@@ -325,7 +341,7 @@ export default function ProvidersPage() {
|
|
|
325
341
|
textIcon: "OC",
|
|
326
342
|
apiType: node.apiType,
|
|
327
343
|
}))
|
|
328
|
-
.filter((p) => matchSearch(p.name));
|
|
344
|
+
.filter((p) => matchSearch(p.name) && matchesStatusFilter(p.id, p, "apikey"));
|
|
329
345
|
|
|
330
346
|
const anthropicCompatibleProviders = providerNodes
|
|
331
347
|
.filter((node) => node.type === "anthropic-compatible")
|
|
@@ -335,23 +351,28 @@ export default function ProvidersPage() {
|
|
|
335
351
|
color: "#D97757",
|
|
336
352
|
textIcon: "AC",
|
|
337
353
|
}))
|
|
338
|
-
.filter((p) => matchSearch(p.name));
|
|
354
|
+
.filter((p) => matchSearch(p.name) && matchesStatusFilter(p.id, p, "apikey"));
|
|
339
355
|
|
|
340
356
|
const oauthEntries = Object.entries(OAUTH_PROVIDERS).filter(
|
|
341
|
-
([, info]) => !info.hidden && matchSearch(info.name),
|
|
357
|
+
([key, info]) => !info.hidden && matchSearch(info.name) && matchesStatusFilter(key, info, "oauth"),
|
|
342
358
|
);
|
|
343
359
|
const freeEntries = Object.entries(FREE_PROVIDERS).filter(
|
|
344
|
-
([, info]) =>
|
|
360
|
+
([key, info]) => {
|
|
361
|
+
const hasApiKeyMode = Array.isArray(info?.authModes) && info.authModes.includes("apikey");
|
|
362
|
+
const authTypes = hasApiKeyMode ? ["oauth", "apikey"] : "oauth";
|
|
363
|
+
return !info.hidden && matchSearch(info.name) && matchesStatusFilter(key, info, authTypes);
|
|
364
|
+
},
|
|
345
365
|
);
|
|
346
366
|
const freeTierEntries = Object.entries(FREE_TIER_PROVIDERS).filter(
|
|
347
|
-
([, info]) => !info.hidden && matchSearch(info.name),
|
|
367
|
+
([key, info]) => !info.hidden && matchSearch(info.name) && matchesStatusFilter(key, info, "apikey"),
|
|
348
368
|
);
|
|
349
369
|
const apikeyEntries = sortByPriority(
|
|
350
370
|
Object.entries(APIKEY_PROVIDERS).filter(
|
|
351
|
-
([, info]) =>
|
|
371
|
+
([key, info]) =>
|
|
352
372
|
!info.hidden &&
|
|
353
373
|
(info.serviceKinds ?? ["llm"]).includes("llm") &&
|
|
354
|
-
matchSearch(info.name)
|
|
374
|
+
matchSearch(info.name) &&
|
|
375
|
+
matchesStatusFilter(key, info, "apikey"),
|
|
355
376
|
),
|
|
356
377
|
"apikey",
|
|
357
378
|
);
|
|
@@ -378,43 +399,41 @@ export default function ProvidersPage() {
|
|
|
378
399
|
apikeyEntries.length > 0 ||
|
|
379
400
|
compatibleProviders.length > 0 ||
|
|
380
401
|
anthropicCompatibleProviders.length > 0;
|
|
402
|
+
const showCustomSection =
|
|
403
|
+
compatibleProviders.length > 0 ||
|
|
404
|
+
anthropicCompatibleProviders.length > 0 ||
|
|
405
|
+
(statusFilter === "all" && !searchQuery.trim());
|
|
381
406
|
|
|
382
407
|
return (
|
|
383
|
-
<div className="flex min-w-0 flex-col gap-6 px-1 sm:px-0
|
|
408
|
+
<div className="flex min-w-0 flex-col gap-6 px-1 sm:px-0">
|
|
384
409
|
{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:
|
|
410
|
+
<div className="overflow-hidden rounded-xl border border-border bg-surface/80 shadow-sm">
|
|
411
|
+
<div className="grid grid-cols-3 divide-x divide-y divide-border-subtle sm:grid-cols-4 sm:divide-y-0">
|
|
412
|
+
<div className="col-span-3 flex items-center gap-3 px-4 py-3 sm:col-span-1">
|
|
413
|
+
<span className="flex size-9 shrink-0 items-center justify-center rounded-lg bg-primary/[0.08] text-primary">
|
|
414
|
+
<span aria-hidden="true" className="material-symbols-outlined" style={{ fontSize: 18 }}>dns</span>
|
|
390
415
|
</span>
|
|
391
416
|
<div>
|
|
392
|
-
<p className="text-[
|
|
393
|
-
<p className="mt-0.5 text-sm font-semibold text-text-main">{activePercent}% active</p>
|
|
417
|
+
<p className="text-[11px] font-medium text-text-muted">Connection health</p>
|
|
418
|
+
<p className="mt-0.5 text-sm font-semibold tabular-nums text-text-main">{activePercent}% active</p>
|
|
394
419
|
</div>
|
|
395
420
|
</div>
|
|
396
|
-
<div className="px-4 py-3
|
|
397
|
-
<p className="text-[
|
|
398
|
-
<p className="mt-
|
|
421
|
+
<div className="px-4 py-3">
|
|
422
|
+
<p className="text-[11px] font-medium text-text-muted">Connections</p>
|
|
423
|
+
<p className="mt-0.5 text-lg font-semibold tabular-nums text-text-main">{totalConnections}</p>
|
|
399
424
|
</div>
|
|
400
|
-
<div className="px-4 py-3
|
|
401
|
-
<p className="text-[
|
|
402
|
-
<div className="mt-
|
|
403
|
-
<p className="text-
|
|
425
|
+
<div className="px-4 py-3">
|
|
426
|
+
<p className="text-[11px] font-medium text-text-muted">Active</p>
|
|
427
|
+
<div className="mt-0.5 flex items-baseline gap-2">
|
|
428
|
+
<p className="text-lg font-semibold tabular-nums text-success">{activeConnections}</p>
|
|
404
429
|
{pausedConnections > 0 && <span className="text-[10px] text-text-muted">{pausedConnections} paused</span>}
|
|
405
430
|
</div>
|
|
406
431
|
</div>
|
|
407
|
-
<div className="px-4 py-3
|
|
408
|
-
<p className="text-[
|
|
409
|
-
<p className="mt-
|
|
432
|
+
<div className="px-4 py-3">
|
|
433
|
+
<p className="text-[11px] font-medium text-text-muted">Providers</p>
|
|
434
|
+
<p className="mt-0.5 text-lg font-semibold tabular-nums text-info">{connectedProviderCount}</p>
|
|
410
435
|
</div>
|
|
411
436
|
</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
437
|
</div>
|
|
419
438
|
)}
|
|
420
439
|
{loadError && (
|
|
@@ -423,28 +442,54 @@ export default function ProvidersPage() {
|
|
|
423
442
|
</div>
|
|
424
443
|
)}
|
|
425
444
|
|
|
445
|
+
<div className="overflow-x-auto pb-0.5 [scrollbar-width:none] [&::-webkit-scrollbar]:hidden">
|
|
446
|
+
<div className="inline-flex min-w-full items-center gap-1.5 rounded-xl border border-border-subtle bg-surface/70 p-1.5 sm:min-w-0">
|
|
447
|
+
{PROVIDER_STATUS_FILTERS.map((option) => (
|
|
448
|
+
<button
|
|
449
|
+
key={option.value}
|
|
450
|
+
type="button"
|
|
451
|
+
onClick={() => {
|
|
452
|
+
setStatusFilter(option.value);
|
|
453
|
+
setApikeyPage(1);
|
|
454
|
+
setCollapsedSections({ custom: false, oauth: false, free: false, apikey: false });
|
|
455
|
+
}}
|
|
456
|
+
aria-pressed={statusFilter === option.value}
|
|
457
|
+
className={`flex h-11 flex-1 items-center justify-center whitespace-nowrap rounded-lg px-3 text-xs font-medium transition-colors sm:h-8 sm:flex-none sm:px-3 ${statusFilter === option.value ? "bg-primary text-white shadow-sm" : "text-text-muted hover:bg-black/5 hover:text-text-main dark:hover:bg-white/5"}`}
|
|
458
|
+
>
|
|
459
|
+
{option.label}
|
|
460
|
+
</button>
|
|
461
|
+
))}
|
|
462
|
+
</div>
|
|
463
|
+
</div>
|
|
464
|
+
|
|
426
465
|
{!hasAnyResult && (
|
|
427
466
|
<div className="text-center py-8 border border-dashed border-border rounded-xl">
|
|
428
467
|
<span className="material-symbols-outlined text-[32px] text-text-muted mb-2">
|
|
429
468
|
search_off
|
|
430
469
|
</span>
|
|
431
|
-
<p className="text-text-muted text-sm">
|
|
470
|
+
<p className="text-text-muted text-sm">
|
|
471
|
+
{searchQuery.trim() ? "No providers match your search" : "No providers match this filter"}
|
|
472
|
+
</p>
|
|
432
473
|
</div>
|
|
433
474
|
)}
|
|
434
475
|
|
|
435
476
|
{/* Custom Providers (OpenAI/Anthropic Compatible) — dynamic */}
|
|
477
|
+
{showCustomSection && (
|
|
436
478
|
<div className="flex flex-col gap-4">
|
|
437
479
|
<ProviderSectionHeader
|
|
438
480
|
icon="extension"
|
|
439
481
|
title="Custom Providers"
|
|
440
482
|
description="OpenAI and Anthropic-compatible endpoints"
|
|
483
|
+
count={compatibleProviders.length + anthropicCompatibleProviders.length}
|
|
484
|
+
collapsed={collapsedSections.custom && !searchQuery.trim()}
|
|
485
|
+
onToggle={() => toggleSection("custom")}
|
|
441
486
|
>
|
|
442
487
|
<div className="grid grid-cols-1 gap-2 sm:flex sm:w-auto">
|
|
443
488
|
<Button
|
|
444
489
|
size="sm"
|
|
445
490
|
icon="add"
|
|
446
491
|
onClick={() => setShowAddAnthropicCompatibleModal(true)}
|
|
447
|
-
className="w-full sm:w-auto"
|
|
492
|
+
className="min-h-11 w-full sm:min-h-0 sm:w-auto"
|
|
448
493
|
>
|
|
449
494
|
Add Anthropic Compatible
|
|
450
495
|
</Button>
|
|
@@ -453,12 +498,13 @@ export default function ProvidersPage() {
|
|
|
453
498
|
variant="secondary"
|
|
454
499
|
icon="add"
|
|
455
500
|
onClick={() => setShowAddCompatibleModal(true)}
|
|
456
|
-
className="
|
|
501
|
+
className="min-h-11 w-full sm:min-h-0 sm:w-auto"
|
|
457
502
|
>
|
|
458
503
|
Add OpenAI Compatible
|
|
459
504
|
</Button>
|
|
460
505
|
</div>
|
|
461
506
|
</ProviderSectionHeader>
|
|
507
|
+
<div className={collapsedSections.custom && !searchQuery.trim() ? "hidden sm:block" : ""}>
|
|
462
508
|
{compatibleProviders.length === 0 &&
|
|
463
509
|
anthropicCompatibleProviders.length === 0 ? (
|
|
464
510
|
<div className="flex items-center gap-3 rounded-xl border border-dashed border-border bg-surface/45 px-4 py-3 text-text-muted">
|
|
@@ -469,7 +515,7 @@ export default function ProvidersPage() {
|
|
|
469
515
|
</div>
|
|
470
516
|
</div>
|
|
471
517
|
) : (
|
|
472
|
-
<div className="grid grid-cols-1 gap-
|
|
518
|
+
<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
519
|
{[...compatibleProviders, ...anthropicCompatibleProviders].map(
|
|
474
520
|
(info) => (
|
|
475
521
|
<ApiKeyProviderCard
|
|
@@ -477,7 +523,6 @@ export default function ProvidersPage() {
|
|
|
477
523
|
providerId={info.id}
|
|
478
524
|
provider={info}
|
|
479
525
|
stats={getProviderStats(info.id, "apikey")}
|
|
480
|
-
authType="compatible"
|
|
481
526
|
onToggle={(active) =>
|
|
482
527
|
handleToggleProvider(info.id, "apikey", active)
|
|
483
528
|
}
|
|
@@ -486,7 +531,9 @@ export default function ProvidersPage() {
|
|
|
486
531
|
)}
|
|
487
532
|
</div>
|
|
488
533
|
)}
|
|
534
|
+
</div>
|
|
489
535
|
</div>
|
|
536
|
+
)}
|
|
490
537
|
|
|
491
538
|
{/* OAuth Providers */}
|
|
492
539
|
{oauthEntries.length > 0 && (
|
|
@@ -495,13 +542,16 @@ export default function ProvidersPage() {
|
|
|
495
542
|
icon="passkey"
|
|
496
543
|
title="OAuth Providers"
|
|
497
544
|
description="Connect existing provider accounts securely"
|
|
545
|
+
count={oauthEntries.length}
|
|
546
|
+
collapsed={collapsedSections.oauth && !searchQuery.trim()}
|
|
547
|
+
onToggle={() => toggleSection("oauth")}
|
|
498
548
|
>
|
|
499
549
|
<div className="flex w-full flex-col gap-2 sm:w-auto sm:flex-row sm:items-center">
|
|
500
550
|
<ModelAvailabilityBadge />
|
|
501
551
|
<button
|
|
502
552
|
onClick={() => handleBatchTest("oauth")}
|
|
503
553
|
disabled={!!testingMode}
|
|
504
|
-
className={`flex w-full items-center justify-center gap-1.5 rounded-
|
|
554
|
+
className={`flex h-11 w-full items-center justify-center gap-1.5 rounded-xl border px-3 text-xs font-medium transition-colors sm:h-8 sm:w-auto sm:rounded-lg ${
|
|
505
555
|
testingMode === "oauth"
|
|
506
556
|
? "bg-primary/20 border-primary/40 text-primary animate-pulse"
|
|
507
557
|
: "bg-bg border-border text-text-muted hover:text-text-main hover:border-primary/40"
|
|
@@ -518,14 +568,13 @@ export default function ProvidersPage() {
|
|
|
518
568
|
</button>
|
|
519
569
|
</div>
|
|
520
570
|
</ProviderSectionHeader>
|
|
521
|
-
<div className="grid grid-cols-1 gap-
|
|
571
|
+
<div className={`${collapsedSections.oauth && !searchQuery.trim() ? "hidden sm:grid" : "grid"} grid-cols-1 gap-2.5 sm:grid-cols-2 sm:gap-3 lg:grid-cols-3 xl:grid-cols-4`}>
|
|
522
572
|
{oauthEntries.map(([key, info]) => (
|
|
523
573
|
<ProviderCard
|
|
524
574
|
key={key}
|
|
525
575
|
providerId={key}
|
|
526
576
|
provider={info}
|
|
527
577
|
stats={getProviderStats(key, "oauth")}
|
|
528
|
-
authType="oauth"
|
|
529
578
|
onToggle={(active) => handleToggleProvider(key, "oauth", active)}
|
|
530
579
|
/>
|
|
531
580
|
))}
|
|
@@ -540,11 +589,14 @@ export default function ProvidersPage() {
|
|
|
540
589
|
icon="savings"
|
|
541
590
|
title="Free Tier Providers"
|
|
542
591
|
description="Ready-to-use and free-tier routing options"
|
|
592
|
+
count={freeEntries.length + freeTierEntries.length}
|
|
593
|
+
collapsed={collapsedSections.free && !searchQuery.trim()}
|
|
594
|
+
onToggle={() => toggleSection("free")}
|
|
543
595
|
>
|
|
544
596
|
<button
|
|
545
597
|
onClick={() => handleBatchTest("free")}
|
|
546
598
|
disabled={!!testingMode}
|
|
547
|
-
className={`flex w-full items-center justify-center gap-1.5 rounded-
|
|
599
|
+
className={`flex h-11 w-full items-center justify-center gap-1.5 rounded-xl border px-3 text-xs font-medium transition-colors sm:h-8 sm:w-auto sm:rounded-lg ${
|
|
548
600
|
testingMode === "free"
|
|
549
601
|
? "bg-primary/20 border-primary/40 text-primary animate-pulse"
|
|
550
602
|
: "bg-bg border-border text-text-muted hover:text-text-main hover:border-primary/40"
|
|
@@ -560,7 +612,7 @@ export default function ProvidersPage() {
|
|
|
560
612
|
{testingMode === "free" ? "Testing..." : "Test All"}
|
|
561
613
|
</button>
|
|
562
614
|
</ProviderSectionHeader>
|
|
563
|
-
<div className="grid grid-cols-1 gap-
|
|
615
|
+
<div className={`${collapsedSections.free && !searchQuery.trim() ? "hidden sm:grid" : "grid"} grid-cols-1 gap-2.5 sm:grid-cols-2 sm:gap-3 lg:grid-cols-3 xl:grid-cols-4`}>
|
|
564
616
|
{freeEntries.map(([key, info]) => {
|
|
565
617
|
const hasApiKeyMode = Array.isArray(info?.authModes) && info.authModes.includes("apikey");
|
|
566
618
|
const statAuthTypes = hasApiKeyMode ? ["oauth", "apikey"] : "oauth";
|
|
@@ -570,7 +622,6 @@ export default function ProvidersPage() {
|
|
|
570
622
|
providerId={key}
|
|
571
623
|
provider={info}
|
|
572
624
|
stats={getProviderStats(key, statAuthTypes)}
|
|
573
|
-
authType="free"
|
|
574
625
|
onToggle={(active) => handleToggleProvider(key, hasApiKeyMode ? "apikey" : "oauth", active)}
|
|
575
626
|
/>
|
|
576
627
|
);
|
|
@@ -581,7 +632,6 @@ export default function ProvidersPage() {
|
|
|
581
632
|
providerId={key}
|
|
582
633
|
provider={info}
|
|
583
634
|
stats={getProviderStats(key, "apikey")}
|
|
584
|
-
authType="apikey"
|
|
585
635
|
onToggle={(active) => handleToggleProvider(key, "apikey", active)}
|
|
586
636
|
/>
|
|
587
637
|
))}
|
|
@@ -596,11 +646,14 @@ export default function ProvidersPage() {
|
|
|
596
646
|
icon="key"
|
|
597
647
|
title="API Key Providers"
|
|
598
648
|
description="Bring your own provider credentials"
|
|
649
|
+
count={apikeyEntries.length}
|
|
650
|
+
collapsed={collapsedSections.apikey && !searchQuery.trim()}
|
|
651
|
+
onToggle={() => toggleSection("apikey")}
|
|
599
652
|
>
|
|
600
653
|
<button
|
|
601
654
|
onClick={() => handleBatchTest("apikey")}
|
|
602
655
|
disabled={!!testingMode}
|
|
603
|
-
className={`flex w-full items-center justify-center gap-1.5 rounded-
|
|
656
|
+
className={`flex h-11 w-full items-center justify-center gap-1.5 rounded-xl border px-3 text-xs font-medium transition-colors sm:h-8 sm:w-auto sm:rounded-lg ${
|
|
604
657
|
testingMode === "apikey"
|
|
605
658
|
? "bg-primary/20 border-primary/40 text-primary animate-pulse"
|
|
606
659
|
: "bg-bg border-border text-text-muted hover:text-text-main hover:border-primary/40"
|
|
@@ -616,19 +669,19 @@ export default function ProvidersPage() {
|
|
|
616
669
|
{testingMode === "apikey" ? "Testing..." : "Test All"}
|
|
617
670
|
</button>
|
|
618
671
|
</ProviderSectionHeader>
|
|
619
|
-
<div className="grid grid-cols-1 gap-
|
|
672
|
+
<div className={`${collapsedSections.apikey && !searchQuery.trim() ? "hidden sm:grid" : "grid"} grid-cols-1 gap-2.5 sm:grid-cols-2 sm:gap-3 lg:grid-cols-3 xl:grid-cols-4`}>
|
|
620
673
|
{visibleApikeyEntries.map(([key, info]) => (
|
|
621
674
|
<ApiKeyProviderCard
|
|
622
675
|
key={key}
|
|
623
676
|
providerId={key}
|
|
624
677
|
provider={info}
|
|
625
678
|
stats={getProviderStats(key, "apikey")}
|
|
626
|
-
authType="apikey"
|
|
627
679
|
onToggle={(active) => handleToggleProvider(key, "apikey", active)}
|
|
628
680
|
/>
|
|
629
681
|
))}
|
|
630
682
|
</div>
|
|
631
683
|
{apikeyEntries.length > 0 && (
|
|
684
|
+
<div className={collapsedSections.apikey && !searchQuery.trim() ? "hidden sm:block" : ""}>
|
|
632
685
|
<Pagination
|
|
633
686
|
currentPage={activeApikeyPage}
|
|
634
687
|
pageSize={apikeyPageSize}
|
|
@@ -639,6 +692,7 @@ export default function ProvidersPage() {
|
|
|
639
692
|
setApikeyPage(1);
|
|
640
693
|
}}
|
|
641
694
|
/>
|
|
695
|
+
</div>
|
|
642
696
|
)}
|
|
643
697
|
</div>
|
|
644
698
|
)}
|
|
@@ -657,7 +711,6 @@ export default function ProvidersPage() {
|
|
|
657
711
|
providerId={key}
|
|
658
712
|
provider={info}
|
|
659
713
|
stats={getProviderStats(key, "apikey")}
|
|
660
|
-
authType="apikey"
|
|
661
714
|
onToggle={(active) => handleToggleProvider(key, "apikey", active)}
|
|
662
715
|
/>
|
|
663
716
|
))}
|
|
@@ -712,19 +765,47 @@ export default function ProvidersPage() {
|
|
|
712
765
|
);
|
|
713
766
|
}
|
|
714
767
|
|
|
715
|
-
function ProviderSectionHeader({
|
|
768
|
+
function ProviderSectionHeader({
|
|
769
|
+
icon,
|
|
770
|
+
title,
|
|
771
|
+
description,
|
|
772
|
+
count,
|
|
773
|
+
collapsed,
|
|
774
|
+
onToggle,
|
|
775
|
+
children,
|
|
776
|
+
}) {
|
|
716
777
|
return (
|
|
717
778
|
<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
|
-
<
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
<
|
|
724
|
-
|
|
779
|
+
<div className="flex w-full min-w-0 items-center gap-2.5 sm:w-auto">
|
|
780
|
+
<div className="flex min-w-0 flex-1 items-center gap-2.5 sm:flex-none">
|
|
781
|
+
<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">
|
|
782
|
+
{icon}
|
|
783
|
+
</span>
|
|
784
|
+
<div className="min-w-0">
|
|
785
|
+
<div className="flex items-center gap-2">
|
|
786
|
+
<h2 className="truncate text-lg font-semibold leading-tight">{title}</h2>
|
|
787
|
+
<span className="rounded-full bg-surface-2 px-2 py-0.5 text-[10px] font-semibold tabular-nums text-text-muted">
|
|
788
|
+
{count}
|
|
789
|
+
</span>
|
|
790
|
+
</div>
|
|
791
|
+
<p className="mt-0.5 truncate text-[11px] text-text-muted sm:text-xs">{description}</p>
|
|
792
|
+
</div>
|
|
725
793
|
</div>
|
|
794
|
+
<button
|
|
795
|
+
type="button"
|
|
796
|
+
onClick={onToggle}
|
|
797
|
+
className="flex size-11 shrink-0 items-center justify-center rounded-xl border border-border text-text-muted transition-colors hover:border-primary/30 hover:text-primary sm:hidden"
|
|
798
|
+
aria-expanded={!collapsed}
|
|
799
|
+
aria-label={`${collapsed ? "Expand" : "Collapse"} ${title}`}
|
|
800
|
+
>
|
|
801
|
+
<span className="material-symbols-outlined text-[20px]">
|
|
802
|
+
{collapsed ? "expand_more" : "expand_less"}
|
|
803
|
+
</span>
|
|
804
|
+
</button>
|
|
726
805
|
</div>
|
|
727
|
-
{children
|
|
806
|
+
{children && (
|
|
807
|
+
<div className={collapsed ? "hidden sm:block" : "block"}>{children}</div>
|
|
808
|
+
)}
|
|
728
809
|
</div>
|
|
729
810
|
);
|
|
730
811
|
}
|
|
@@ -733,42 +814,26 @@ ProviderSectionHeader.propTypes = {
|
|
|
733
814
|
icon: PropTypes.string.isRequired,
|
|
734
815
|
title: PropTypes.string.isRequired,
|
|
735
816
|
description: PropTypes.string.isRequired,
|
|
817
|
+
count: PropTypes.number.isRequired,
|
|
818
|
+
collapsed: PropTypes.bool.isRequired,
|
|
819
|
+
onToggle: PropTypes.func.isRequired,
|
|
736
820
|
children: PropTypes.node,
|
|
737
821
|
};
|
|
738
822
|
|
|
739
|
-
function ProviderCard({ providerId, provider, stats,
|
|
823
|
+
function ProviderCard({ providerId, provider, stats, onToggle }) {
|
|
740
824
|
const { connected, error, errorCode, allDisabled } = stats;
|
|
741
825
|
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
826
|
|
|
757
827
|
return (
|
|
758
828
|
<Link href={`/dashboard/providers/${providerId}`} className="group min-w-0">
|
|
759
829
|
<Card
|
|
760
830
|
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" : ""}`}
|
|
831
|
+
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
832
|
>
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
<div className="flex min-w-0 items-center gap-3">
|
|
833
|
+
<div className="flex h-full min-w-0 items-center justify-between gap-2.5 p-3">
|
|
834
|
+
<div className="flex min-w-0 items-center gap-2.5">
|
|
770
835
|
<div
|
|
771
|
-
className="flex size-
|
|
836
|
+
className="flex size-9 shrink-0 items-center justify-center rounded-lg ring-1 ring-black/[0.04] dark:ring-white/[0.06]"
|
|
772
837
|
style={{
|
|
773
838
|
backgroundColor: `${provider.color?.length > 7 ? provider.color : provider.color + "15"}`,
|
|
774
839
|
}}
|
|
@@ -776,8 +841,8 @@ function ProviderCard({ providerId, provider, stats, authType, onToggle }) {
|
|
|
776
841
|
<ProviderIcon
|
|
777
842
|
src={`/providers/${provider.id}.png`}
|
|
778
843
|
alt=""
|
|
779
|
-
size={
|
|
780
|
-
className="max-h-
|
|
844
|
+
size={28}
|
|
845
|
+
className="max-h-7 max-w-7 rounded-md object-contain"
|
|
781
846
|
fallbackText={
|
|
782
847
|
provider.textIcon || provider.id.slice(0, 2).toUpperCase()
|
|
783
848
|
}
|
|
@@ -786,26 +851,19 @@ function ProviderCard({ providerId, provider, stats, authType, onToggle }) {
|
|
|
786
851
|
</div>
|
|
787
852
|
<div className="min-w-0">
|
|
788
853
|
<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>
|
|
854
|
+
<div className="mt-1 flex min-w-0 items-center overflow-hidden whitespace-nowrap">
|
|
794
855
|
{allDisabled ? (
|
|
795
|
-
<
|
|
796
|
-
<span className="
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
</span>
|
|
800
|
-
Disabled
|
|
801
|
-
</span>
|
|
802
|
-
</Badge>
|
|
856
|
+
<span className="inline-flex items-center gap-1 text-[11px] text-text-muted">
|
|
857
|
+
<span aria-hidden="true" className="material-symbols-outlined text-[13px]">pause_circle</span>
|
|
858
|
+
Disabled
|
|
859
|
+
</span>
|
|
803
860
|
) : isNoAuth ? (
|
|
804
|
-
<
|
|
861
|
+
<span className="inline-flex items-center gap-1.5 text-[11px] font-medium text-success">
|
|
862
|
+
<span aria-hidden="true" className="size-1.5 rounded-full bg-success" />
|
|
863
|
+
Ready
|
|
864
|
+
</span>
|
|
805
865
|
) : (
|
|
806
|
-
|
|
807
|
-
{getStatusDisplay(connected, error, errorCode)}
|
|
808
|
-
</>
|
|
866
|
+
getStatusDisplay(connected, error, errorCode)
|
|
809
867
|
)}
|
|
810
868
|
</div>
|
|
811
869
|
</div>
|
|
@@ -822,13 +880,14 @@ function ProviderCard({ providerId, provider, stats, authType, onToggle }) {
|
|
|
822
880
|
>
|
|
823
881
|
<Toggle
|
|
824
882
|
size="sm"
|
|
883
|
+
touchTarget
|
|
825
884
|
checked={!allDisabled}
|
|
826
885
|
onChange={() => {}}
|
|
827
886
|
title={allDisabled ? "Enable provider" : "Disable provider"}
|
|
828
887
|
/>
|
|
829
888
|
</div>
|
|
830
889
|
)}
|
|
831
|
-
<span aria-hidden="true" className="material-symbols-outlined text-[
|
|
890
|
+
<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
891
|
chevron_right
|
|
833
892
|
</span>
|
|
834
893
|
</div>
|
|
@@ -854,7 +913,6 @@ ProviderCard.propTypes = {
|
|
|
854
913
|
total: PropTypes.number,
|
|
855
914
|
allDisabled: PropTypes.bool,
|
|
856
915
|
}).isRequired,
|
|
857
|
-
authType: PropTypes.string,
|
|
858
916
|
onToggle: PropTypes.func,
|
|
859
917
|
};
|
|
860
918
|
|
|
@@ -862,29 +920,14 @@ function ApiKeyProviderCard({
|
|
|
862
920
|
providerId,
|
|
863
921
|
provider,
|
|
864
922
|
stats,
|
|
865
|
-
authType,
|
|
866
923
|
onToggle,
|
|
867
924
|
}) {
|
|
868
925
|
const { connected, error, errorCode, allDisabled } = stats;
|
|
869
|
-
const isReady = !allDisabled && connected > 0;
|
|
870
926
|
const isCompatible = providerId.startsWith(OPENAI_COMPATIBLE_PREFIX);
|
|
871
927
|
const isAnthropicCompatible = providerId.startsWith(
|
|
872
928
|
ANTHROPIC_COMPATIBLE_PREFIX,
|
|
873
929
|
);
|
|
874
930
|
|
|
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
931
|
const getIconPath = () => {
|
|
889
932
|
if (provider.id === "featherless") return null;
|
|
890
933
|
if (isCompatible)
|
|
@@ -899,17 +942,12 @@ function ApiKeyProviderCard({
|
|
|
899
942
|
<Link href={`/dashboard/providers/${providerId}`} className="group min-w-0">
|
|
900
943
|
<Card
|
|
901
944
|
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" : ""}`}
|
|
945
|
+
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
946
|
>
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
<div className="flex min-w-0 items-center gap-3">
|
|
947
|
+
<div className="flex h-full min-w-0 items-center justify-between gap-2.5 p-3">
|
|
948
|
+
<div className="flex min-w-0 items-center gap-2.5">
|
|
911
949
|
<div
|
|
912
|
-
className="flex size-
|
|
950
|
+
className="flex size-9 shrink-0 items-center justify-center rounded-lg ring-1 ring-black/[0.04] dark:ring-white/[0.06]"
|
|
913
951
|
style={{
|
|
914
952
|
backgroundColor: `${provider.color?.length > 7 ? provider.color : provider.color + "15"}`,
|
|
915
953
|
}}
|
|
@@ -917,8 +955,8 @@ function ApiKeyProviderCard({
|
|
|
917
955
|
<ProviderIcon
|
|
918
956
|
src={getIconPath()}
|
|
919
957
|
alt=""
|
|
920
|
-
size={
|
|
921
|
-
className="max-h-
|
|
958
|
+
size={28}
|
|
959
|
+
className="max-h-7 max-w-7 rounded-md object-contain"
|
|
922
960
|
fallbackText={
|
|
923
961
|
provider.textIcon || provider.id.slice(0, 2).toUpperCase()
|
|
924
962
|
}
|
|
@@ -927,34 +965,22 @@ function ApiKeyProviderCard({
|
|
|
927
965
|
</div>
|
|
928
966
|
<div className="min-w-0">
|
|
929
967
|
<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>
|
|
968
|
+
<div className="mt-1 flex min-w-0 items-center gap-1.5 overflow-hidden whitespace-nowrap">
|
|
935
969
|
{allDisabled ? (
|
|
936
|
-
<
|
|
937
|
-
<span className="
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
</span>
|
|
941
|
-
Disabled
|
|
942
|
-
</span>
|
|
943
|
-
</Badge>
|
|
970
|
+
<span className="inline-flex items-center gap-1 text-[11px] text-text-muted">
|
|
971
|
+
<span aria-hidden="true" className="material-symbols-outlined text-[13px]">pause_circle</span>
|
|
972
|
+
Disabled
|
|
973
|
+
</span>
|
|
944
974
|
) : (
|
|
945
975
|
<>
|
|
946
976
|
{getStatusDisplay(connected, error, errorCode)}
|
|
947
977
|
{isCompatible && (
|
|
948
|
-
<
|
|
949
|
-
{provider.apiType === "responses"
|
|
950
|
-
|
|
951
|
-
: "Chat"}
|
|
952
|
-
</Badge>
|
|
978
|
+
<span className="text-[10px] text-text-subtle">
|
|
979
|
+
· {provider.apiType === "responses" ? "Responses" : "Chat"}
|
|
980
|
+
</span>
|
|
953
981
|
)}
|
|
954
982
|
{isAnthropicCompatible && (
|
|
955
|
-
<
|
|
956
|
-
Messages
|
|
957
|
-
</Badge>
|
|
983
|
+
<span className="text-[10px] text-text-subtle">· Messages</span>
|
|
958
984
|
)}
|
|
959
985
|
</>
|
|
960
986
|
)}
|
|
@@ -973,13 +999,14 @@ function ApiKeyProviderCard({
|
|
|
973
999
|
>
|
|
974
1000
|
<Toggle
|
|
975
1001
|
size="sm"
|
|
1002
|
+
touchTarget
|
|
976
1003
|
checked={!allDisabled}
|
|
977
1004
|
onChange={() => {}}
|
|
978
1005
|
title={allDisabled ? "Enable provider" : "Disable provider"}
|
|
979
1006
|
/>
|
|
980
1007
|
</div>
|
|
981
1008
|
)}
|
|
982
|
-
<span aria-hidden="true" className="material-symbols-outlined text-[
|
|
1009
|
+
<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
1010
|
chevron_right
|
|
984
1011
|
</span>
|
|
985
1012
|
</div>
|
|
@@ -1006,7 +1033,6 @@ ApiKeyProviderCard.propTypes = {
|
|
|
1006
1033
|
total: PropTypes.number,
|
|
1007
1034
|
allDisabled: PropTypes.bool,
|
|
1008
1035
|
}).isRequired,
|
|
1009
|
-
authType: PropTypes.string,
|
|
1010
1036
|
onToggle: PropTypes.func,
|
|
1011
1037
|
};
|
|
1012
1038
|
|