n9router 0.3.90 → 0.3.93
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/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-path-routes-manifest.json +3 -0
- package/.next/standalone/.next/build-manifest.json +3 -3
- package/.next/standalone/.next/routes-manifest.json +18 -0
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/basic-chat/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/basic-chat/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/cli-tools/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/combos/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/combos/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/console-log/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/console-log/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/endpoint/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/mitm/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/mitm/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/profile/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/profile/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/[id]/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/[id]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/new/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/new/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/proxy-pools/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/proxy-pools/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/quota/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/quota/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/translator/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/translator/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/usage/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/usage/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page.js +1 -1
- package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +11 -11
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +11 -11
- package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +6 -6
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/api/antigravity-tools/import/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/antigravity-tools/import-refresh-tokens/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/antigravity-tools/import-refresh-tokens/route/build-manifest.json +9 -0
- package/.next/standalone/.next/server/app/api/antigravity-tools/import-refresh-tokens/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/antigravity-tools/import-refresh-tokens/route.js +11 -0
- package/.next/standalone/.next/server/app/api/antigravity-tools/import-refresh-tokens/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/antigravity-tools/import-refresh-tokens/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/antigravity-tools/import-refresh-tokens/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/auth/login/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cli-tools/claude-settings/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cli-tools/claude-settings/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cli-tools/codex-settings/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cli-tools/codex-settings/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cli-tools/droid-settings/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cli-tools/droid-settings/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cli-tools/openclaw-settings/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cli-tools/openclaw-settings/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cli-tools/opencode-settings/route.js +1 -1
- package/.next/standalone/.next/server/app/api/cli-tools/opencode-settings/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cloud/auth/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cloud/credentials/update/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cloud/model/resolve/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cloud/models/alias/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/combos/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/combos/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/init/route.js +1 -1
- package/.next/standalone/.next/server/app/api/init/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/internal/request-detail/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/internal/request-detail/route/build-manifest.json +9 -0
- package/.next/standalone/.next/server/app/api/internal/request-detail/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/internal/request-detail/route.js +8 -0
- package/.next/standalone/.next/server/app/api/internal/request-detail/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/internal/request-detail/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/internal/request-detail/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/internal/usage/route/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/app/api/internal/usage/route/build-manifest.json +9 -0
- package/.next/standalone/.next/server/app/api/internal/usage/route/server-reference-manifest.json +4 -0
- package/.next/standalone/.next/server/app/api/internal/usage/route.js +8 -0
- package/.next/standalone/.next/server/app/api/internal/usage/route.js.map +5 -0
- package/.next/standalone/.next/server/app/api/internal/usage/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/internal/usage/route_client-reference-manifest.js +3 -0
- package/.next/standalone/.next/server/app/api/keys/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/keys/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/models/alias/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/models/availability/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/models/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/models/test/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/oauth/[provider]/[action]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/oauth/cursor/auto-import/route.js +1 -1
- package/.next/standalone/.next/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/oauth/cursor/import/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/oauth/gitlab/pat/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/pricing/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/provider-nodes/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/providers/[id]/models/route.js +4 -4
- package/.next/standalone/.next/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/providers/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/providers/[id]/test-models/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/providers/client/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/providers/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/providers/test-batch/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/providers/validate/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/proxy-pools/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/proxy-pools/[id]/test/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/proxy-pools/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/settings/database/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/settings/require-login/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/translator/send/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/translator/translate/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/tunnel/disable/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/tunnel/enable/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/tunnel/status/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/usage/chart/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/usage/history/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/usage/logs/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/usage/providers/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/usage/request-details/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/usage/request-logs/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/usage/stats/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/usage/stream/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/api/chat/route.js +2 -2
- package/.next/standalone/.next/server/app/api/v1/api/chat/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/chat/completions/route.js +4 -4
- package/.next/standalone/.next/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/embeddings/route.js +4 -4
- package/.next/standalone/.next/server/app/api/v1/embeddings/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/messages/route.js +2 -2
- package/.next/standalone/.next/server/app/api/v1/messages/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/models/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/responses/route.js +2 -2
- package/.next/standalone/.next/server/app/api/v1/responses/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1beta/models/[...path]/route.js +3 -3
- package/.next/standalone/.next/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/version/route.js +2 -2
- package/.next/standalone/.next/server/app/callback/page.js +1 -1
- package/.next/standalone/.next/server/app/callback/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/callback/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/callback.html +1 -1
- package/.next/standalone/.next/server/app/callback.rsc +13 -13
- package/.next/standalone/.next/server/app/callback.segments/_full.segment.rsc +13 -13
- package/.next/standalone/.next/server/app/callback.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/callback.segments/_index.segment.rsc +6 -6
- package/.next/standalone/.next/server/app/callback.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/callback.segments/callback/__PAGE__.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/callback.segments/callback.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/basic-chat.html +1 -1
- package/.next/standalone/.next/server/app/dashboard/basic-chat.rsc +14 -14
- package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/_full.segment.rsc +14 -14
- package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/_index.segment.rsc +6 -6
- package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/cli-tools.html +1 -1
- package/.next/standalone/.next/server/app/dashboard/cli-tools.rsc +14 -14
- package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/_full.segment.rsc +14 -14
- package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/_index.segment.rsc +6 -6
- package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/combos.html +1 -1
- package/.next/standalone/.next/server/app/dashboard/combos.rsc +15 -15
- package/.next/standalone/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/combos.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/dashboard/combos.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/combos.segments/_index.segment.rsc +6 -6
- package/.next/standalone/.next/server/app/dashboard/combos.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/endpoint.html +1 -1
- package/.next/standalone/.next/server/app/dashboard/endpoint.rsc +14 -14
- package/.next/standalone/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/endpoint.segments/_full.segment.rsc +14 -14
- package/.next/standalone/.next/server/app/dashboard/endpoint.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/endpoint.segments/_index.segment.rsc +6 -6
- package/.next/standalone/.next/server/app/dashboard/endpoint.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/mitm.html +1 -1
- package/.next/standalone/.next/server/app/dashboard/mitm.rsc +14 -14
- package/.next/standalone/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/mitm.segments/_full.segment.rsc +14 -14
- package/.next/standalone/.next/server/app/dashboard/mitm.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/mitm.segments/_index.segment.rsc +6 -6
- package/.next/standalone/.next/server/app/dashboard/mitm.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/profile.html +1 -1
- package/.next/standalone/.next/server/app/dashboard/profile.rsc +15 -15
- package/.next/standalone/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/profile.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/dashboard/profile.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/profile.segments/_index.segment.rsc +6 -6
- package/.next/standalone/.next/server/app/dashboard/profile.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/providers/new.html +1 -1
- package/.next/standalone/.next/server/app/dashboard/providers/new.rsc +15 -15
- package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/providers/new.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/dashboard/providers/new.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/providers/new.segments/_index.segment.rsc +6 -6
- package/.next/standalone/.next/server/app/dashboard/providers/new.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/providers.html +1 -1
- package/.next/standalone/.next/server/app/dashboard/providers.rsc +15 -15
- package/.next/standalone/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/providers.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/dashboard/providers.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/providers.segments/_index.segment.rsc +6 -6
- package/.next/standalone/.next/server/app/dashboard/providers.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/proxy-pools.html +1 -1
- package/.next/standalone/.next/server/app/dashboard/proxy-pools.rsc +15 -15
- package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +6 -6
- package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/quota.html +2 -2
- package/.next/standalone/.next/server/app/dashboard/quota.rsc +15 -15
- package/.next/standalone/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/quota.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/dashboard/quota.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/quota.segments/_index.segment.rsc +6 -6
- package/.next/standalone/.next/server/app/dashboard/quota.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/settings/pricing/page.js +1 -1
- package/.next/standalone/.next/server/app/dashboard/settings/pricing/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/dashboard/settings/pricing.html +1 -1
- package/.next/standalone/.next/server/app/dashboard/settings/pricing.rsc +13 -13
- package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +13 -13
- package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +6 -6
- package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/translator.html +1 -1
- package/.next/standalone/.next/server/app/dashboard/translator.rsc +15 -15
- package/.next/standalone/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/translator.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/dashboard/translator.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/translator.segments/_index.segment.rsc +6 -6
- package/.next/standalone/.next/server/app/dashboard/translator.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard/usage.html +1 -1
- package/.next/standalone/.next/server/app/dashboard/usage.rsc +15 -15
- package/.next/standalone/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/usage.segments/_full.segment.rsc +15 -15
- package/.next/standalone/.next/server/app/dashboard/usage.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/usage.segments/_index.segment.rsc +6 -6
- package/.next/standalone/.next/server/app/dashboard/usage.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/dashboard.html +1 -1
- package/.next/standalone/.next/server/app/dashboard.rsc +14 -14
- package/.next/standalone/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard.segments/_full.segment.rsc +14 -14
- package/.next/standalone/.next/server/app/dashboard.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard.segments/_index.segment.rsc +6 -6
- package/.next/standalone/.next/server/app/dashboard.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +11 -11
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +11 -11
- package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +6 -6
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/landing/page.js +1 -1
- package/.next/standalone/.next/server/app/landing/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/landing/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/landing.html +1 -1
- package/.next/standalone/.next/server/app/landing.rsc +13 -13
- package/.next/standalone/.next/server/app/landing.segments/_full.segment.rsc +13 -13
- package/.next/standalone/.next/server/app/landing.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/landing.segments/_index.segment.rsc +6 -6
- package/.next/standalone/.next/server/app/landing.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/landing.segments/landing/__PAGE__.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/landing.segments/landing.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/login/page.js +1 -1
- package/.next/standalone/.next/server/app/login/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login.html +1 -1
- package/.next/standalone/.next/server/app/login.rsc +13 -13
- package/.next/standalone/.next/server/app/login.segments/_full.segment.rsc +13 -13
- package/.next/standalone/.next/server/app/login.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/login.segments/_index.segment.rsc +6 -6
- package/.next/standalone/.next/server/app/login.segments/_tree.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/login.segments/login/__PAGE__.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/login.segments/login.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/page.js +1 -1
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app-paths-manifest.json +3 -0
- package/.next/standalone/.next/server/chunks/0zjb_server_app_api_antigravity-tools_import-refresh-tokens_route_actions_0jn9smo.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0-7rakw._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0.yvcis._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0148t9m._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__01rpshu._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0d5yskq._.js → [root-of-the-server]__04phkrb._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__053j5al._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__067b5fv._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__09pq~46._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__09u3y1w._.js +1 -1
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0jh1if9._.js → [root-of-the-server]__0_8qd4-._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__00d92lv._.js → [root-of-the-server]__0_qom9~._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0azf4gz._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0b56uvi._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0b802lh._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0bcktr4._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0cix-zv._.js +1 -1
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0g.slg5._.js → [root-of-the-server]__0e27kvj._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0gglkh-._.js +4 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0sr3x1r._.js → [root-of-the-server]__0gicxvd._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0a872qj._.js → [root-of-the-server]__0i_45tv._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0inxxu0._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0ju9vfb._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0kpc-o6._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0lc~.sk._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0lp_pm5._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0m.zwk_._.js +1 -1
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0vccex-._.js → [root-of-the-server]__0mcgcwu._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0pwrfp1._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0r6q4qf._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0szv.g3._.js +3 -0
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0uw3x8s._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0vbd~f-._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0y.reft._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0y5ae.7._.js +1 -1
- package/.next/standalone/.next/server/chunks/_0__-aqg._.js +3 -0
- package/.next/standalone/.next/server/chunks/_0_ovl1h._.js +3 -0
- package/.next/standalone/.next/server/chunks/{_0fqqr7l._.js → _0vq-0-m._.js} +2 -2
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_internal_request-detail_route_actions_0l0f~.x.js +3 -0
- package/.next/standalone/.next/server/chunks/_next-internal_server_app_api_internal_usage_route_actions_058gklf.js +3 -0
- package/.next/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0kjg_-d._.js → [root-of-the-server]__13ps.wr._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/{node_modules_next_0x_me2y._.js → _04v6e-j._.js} +2 -2
- package/.next/standalone/.next/server/chunks/ssr/_0c8m5sm._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/_0fd4.es._.js +5 -0
- package/.next/standalone/.next/server/chunks/ssr/_13z1.b_._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_0_xhepz._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_app_(dashboard)_dashboard_providers_[id]_page_0-3xvzc.js +4 -1
- package/.next/standalone/.next/server/chunks/ssr/src_app_(dashboard)_dashboard_usage_page_0fz7awb.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_shared_constants_cliTools_09iru_o.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/static/chunks/0-rta-yheghf7.js +1 -0
- package/.next/standalone/.next/static/chunks/{0~p0472sbmye6.js → 0deg-_syv13xx.js} +1 -1
- package/.next/standalone/.next/static/chunks/0h~4je-_gk7-5.css +1 -0
- package/.next/standalone/.next/static/chunks/{17~_6lx17xr8z.js → 0j6650zqytl.z.js} +1 -1
- package/.next/standalone/.next/static/chunks/{0pwbnjvdm7lt_.js → 0lqwk82lneihh.js} +2 -2
- package/.next/standalone/.next/static/chunks/{148_2lu2ra629.js → 11jq77q6zkl40.js} +1 -1
- package/.next/standalone/.next/static/chunks/127zo11qzv8-9.js +4 -0
- package/.next/{static/chunks/06l6ck_q1o~m9.js → standalone/.next/static/chunks/16r2wq4pvci67.js} +1 -1
- package/.next/standalone/AGENTS.md +136 -0
- package/.next/standalone/docs/token_swap.png +0 -0
- package/.next/standalone/docs/token_swap_guide.md +21 -0
- package/.next/standalone/mitm/server.js +51 -5
- package/.next/standalone/mitm/usageTracker.js +524 -0
- package/.next/standalone/package-lock.json +2 -2
- package/.next/standalone/package.json +1 -1
- package/.next/standalone/src/app/(dashboard)/dashboard/providers/[id]/page.js +123 -8
- package/.next/standalone/src/app/(dashboard)/dashboard/usage/components/RequestDetailsTab.js +13 -2
- package/.next/standalone/src/app/api/antigravity-tools/import-refresh-tokens/route.js +218 -0
- package/.next/standalone/src/app/api/internal/request-detail/route.js +45 -0
- package/.next/standalone/src/app/api/internal/usage/route.js +59 -0
- package/.next/standalone/src/mitm/server.js +51 -5
- package/.next/standalone/src/mitm/usageTracker.js +524 -0
- package/.next/static/chunks/0-rta-yheghf7.js +1 -0
- package/.next/static/chunks/{0~p0472sbmye6.js → 0deg-_syv13xx.js} +1 -1
- package/.next/static/chunks/0h~4je-_gk7-5.css +1 -0
- package/.next/static/chunks/{17~_6lx17xr8z.js → 0j6650zqytl.z.js} +1 -1
- package/.next/static/chunks/{0pwbnjvdm7lt_.js → 0lqwk82lneihh.js} +2 -2
- package/.next/static/chunks/{148_2lu2ra629.js → 11jq77q6zkl40.js} +1 -1
- package/.next/static/chunks/127zo11qzv8-9.js +4 -0
- package/.next/{standalone/.next/static/chunks/06l6ck_q1o~m9.js → static/chunks/16r2wq4pvci67.js} +1 -1
- package/package.json +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__081rpq_._.js +0 -4
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0b7zcdl._.js +0 -3
- package/.next/standalone/.next/server/chunks/_019vwuu._.js +0 -3
- package/.next/standalone/.next/static/chunks/026p3rpdycbyo.css +0 -1
- package/.next/standalone/.next/static/chunks/0b285gqd-hcvu.js +0 -1
- package/.next/standalone/.next/static/chunks/121._9x_i3s-~.js +0 -1
- package/.next/static/chunks/026p3rpdycbyo.css +0 -1
- package/.next/static/chunks/0b285gqd-hcvu.js +0 -1
- package/.next/static/chunks/121._9x_i3s-~.js +0 -1
- /package/.next/standalone/.next/static/{eALv8q_pKhx9-bE-9KiDB → b_Drjo0YdAiFCInKT62q9}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{eALv8q_pKhx9-bE-9KiDB → b_Drjo0YdAiFCInKT62q9}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{eALv8q_pKhx9-bE-9KiDB → b_Drjo0YdAiFCInKT62q9}/_ssgManifest.js +0 -0
- /package/.next/static/{eALv8q_pKhx9-bE-9KiDB → b_Drjo0YdAiFCInKT62q9}/_buildManifest.js +0 -0
- /package/.next/static/{eALv8q_pKhx9-bE-9KiDB → b_Drjo0YdAiFCInKT62q9}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{eALv8q_pKhx9-bE-9KiDB → b_Drjo0YdAiFCInKT62q9}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,99165,e=>{"use strict";var t=e.i(43476),i=e.i(71645),a=e.i(45009),s=e.i(18566),r=e.i(22016),l=e.i(57688);e.i(38730);var o=e.i(96521),n=e.i(39114),d=e.i(51916),c=e.i(95541),p=e.i(85011),u=e.i(50832),x=e.i(10444),m=e.i(29852),m=m,h=e.i(30115),h=h,f=e.i(27927),f=f,y=e.i(59497),y=y,g=e.i(75634),b=e.i(4539),v=e.i(55849),j=e.i(85035);e.i(4565);var N=e.i(55937),k=e.i(29370);let C=new Map,w={"openrouter-free":e=>e.filter(e=>e.pricing?.prompt==="0"&&e.pricing?.completion==="0"&&e.context_length>=2e5).map(e=>({id:e.id,name:e.name,contextLength:e.context_length})).sort((e,t)=>t.contextLength-e.contextLength)};async function S(e){if(!e?.url||!e?.type)return[];let t=C.get(e.url);if(t&&Date.now()<t.expiresAt)return t.data;try{let t=await fetch(e.url);if(!t.ok)return[];let i=await t.json(),a=i.data??i.models??i,s=w[e.type],r=s?s(Array.isArray(a)?a:[]):[];return C.set(e.url,{data:r,expiresAt:Date.now()+6e5}),r}catch{return[]}}let A="Imports accounts from ~/.antigravity_tools on this machine (Antigravity IDE local data). Requires that folder to exist and contain signed-in accounts.",P='Paste Google OAuth refresh tokens: one per line (1//…), a JSON array with refresh_token, or any text containing "refresh_token": "…". Each token is refreshed and accounts are added or updated by Google email.';function T({model:e,fullModel:i,alias:a,copied:s,onCopy:r,testStatus:l,isCustom:o,isFree:n,onDeleteAlias:d,onTest:c,isTesting:p}){let u="ok"===l?"#22c55e":"error"===l?"#ef4444":void 0;return(0,t.jsx)("div",{className:`group px-3 py-2 rounded-lg border ${"ok"===l?"border-green-500/40":"error"===l?"border-red-500/40":"border-border"} hover:bg-sidebar/50`,children:(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("span",{className:"material-symbols-outlined text-base",style:u?{color:u}:void 0,children:"ok"===l?"check_circle":"error"===l?"cancel":"smart_toy"}),(0,t.jsx)("code",{className:"text-xs text-text-muted font-mono bg-sidebar px-1.5 py-0.5 rounded",children:i}),c&&(0,t.jsxs)("div",{className:"relative group/btn",children:[(0,t.jsx)("button",{onClick:c,disabled:p,className:`p-0.5 hover:bg-sidebar rounded text-text-muted hover:text-primary transition-opacity ${p?"opacity-100":"opacity-0 group-hover:opacity-100"}`,children:(0,t.jsx)("span",{className:"material-symbols-outlined text-sm",style:p?{animation:"spin 1s linear infinite"}:void 0,children:p?"progress_activity":"science"})}),(0,t.jsx)("span",{className:"pointer-events-none absolute mt-1 top-5 left-1/2 -translate-x-1/2 text-[10px] text-text-muted whitespace-nowrap opacity-0 group-hover/btn:opacity-100 transition-opacity",children:p?"Testing...":"Test"})]}),(0,t.jsxs)("div",{className:"relative group/btn",children:[(0,t.jsx)("button",{onClick:()=>r(i,`model-${e.id}`),className:"p-0.5 hover:bg-sidebar rounded text-text-muted hover:text-primary",children:(0,t.jsx)("span",{className:"material-symbols-outlined text-sm",children:s===`model-${e.id}`?"check":"content_copy"})}),(0,t.jsx)("span",{className:"pointer-events-none absolute mt-1 top-5 left-1/2 -translate-x-1/2 text-[10px] text-text-muted whitespace-nowrap opacity-0 group-hover/btn:opacity-100 transition-opacity",children:s===`model-${e.id}`?"Copied!":"Copy"})]}),o&&(0,t.jsx)("button",{onClick:d,className:"p-0.5 hover:bg-red-500/10 rounded text-text-muted hover:text-red-500 opacity-0 group-hover:opacity-100 transition-opacity ml-auto",title:"Remove custom model",children:(0,t.jsx)("span",{className:"material-symbols-outlined text-sm",children:"close"})})]})})}function O({modelId:e,fullModel:i,copied:a,onCopy:s,onDeleteAlias:r,onTest:l,testStatus:o,isTesting:n,isFree:d}){let c="ok"===o?"#22c55e":"error"===o?"#ef4444":void 0;return(0,t.jsxs)("div",{className:`flex items-center gap-3 p-3 rounded-lg border ${"ok"===o?"border-green-500/40":"error"===o?"border-red-500/40":"border-border"} hover:bg-sidebar/50`,children:[(0,t.jsx)("span",{className:"material-symbols-outlined text-base text-text-muted",style:c?{color:c}:void 0,children:"ok"===o?"check_circle":"error"===o?"cancel":"smart_toy"}),(0,t.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,t.jsx)("p",{className:"text-sm font-medium truncate",children:e}),(0,t.jsxs)("div",{className:"flex items-center gap-1 mt-1",children:[(0,t.jsx)("code",{className:"text-xs text-text-muted font-mono bg-sidebar px-1.5 py-0.5 rounded",children:i}),d&&(0,t.jsx)("span",{className:"text-[10px] font-medium px-1.5 py-0.5 rounded bg-green-500/10 text-green-600 dark:text-green-400",children:"Free"}),(0,t.jsxs)("div",{className:"relative group/btn",children:[(0,t.jsx)("button",{onClick:()=>s(i,`model-${e}`),className:"p-0.5 hover:bg-sidebar rounded text-text-muted hover:text-primary",children:(0,t.jsx)("span",{className:"material-symbols-outlined text-sm",children:a===`model-${e}`?"check":"content_copy"})}),(0,t.jsx)("span",{className:"pointer-events-none absolute top-5 left-1/2 -translate-x-1/2 text-[10px] text-text-muted whitespace-nowrap opacity-0 group-hover/btn:opacity-100 transition-opacity",children:a===`model-${e}`?"Copied!":"Copy"})]}),l&&(0,t.jsxs)("div",{className:"relative group/btn",children:[(0,t.jsx)("button",{onClick:l,disabled:n,className:"p-0.5 hover:bg-sidebar rounded text-text-muted hover:text-primary transition-colors",children:(0,t.jsx)("span",{className:"material-symbols-outlined text-sm",style:n?{animation:"spin 1s linear infinite"}:void 0,children:n?"progress_activity":"science"})}),(0,t.jsx)("span",{className:"pointer-events-none absolute top-5 left-1/2 -translate-x-1/2 text-[10px] text-text-muted whitespace-nowrap opacity-0 group-hover/btn:opacity-100 transition-opacity",children:n?"Testing...":"Test"})]})]})]}),(0,t.jsx)("button",{onClick:r,className:"p-1 hover:bg-red-50 rounded text-red-500",title:"Remove model",children:(0,t.jsx)("span",{className:"material-symbols-outlined text-sm",children:"delete"})})]})}function I({providerStorageAlias:e,providerDisplayAlias:a,modelAliases:s,copied:r,onCopy:l,onSetAlias:o,onDeleteAlias:d,connections:c,isAnthropic:p}){let[u,x]=(0,i.useState)(""),[m,h]=(0,i.useState)(!1),[f,y]=(0,i.useState)(!1),[g,b]=(0,i.useState)(null),[v,j]=(0,i.useState)({}),N=async t=>{if(!g){b(t);try{let i=await fetch("/api/models/test",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:`${e}/${t}`})}),a=await i.json();j(e=>({...e,[t]:a.ok?"ok":"error"}))}catch{j(e=>({...e,[t]:"error"}))}finally{b(null)}}},k=Object.entries(s).filter(([,t])=>t.startsWith(`${e}/`)).map(([t,i])=>({modelId:i.replace(`${e}/`,""),fullModel:i,alias:t})),C=t=>{let i,r=`${e}/${t}`;if(Object.values(s).includes(r))return null;let l=(i=t.split("/"))[i.length-1];if(!s[l])return l;let o=`${a}-${l}`;return s[o]?null:o},w=async()=>{if(!u.trim()||m)return;let t=u.trim(),i=C(t);if(!i)return void alert("All suggested aliases already exist. Please choose a different model or remove conflicting aliases.");h(!0);try{await o(t,i,e),x("")}catch(e){console.log("Error adding model:",e)}finally{h(!1)}},S=async()=>{if(f)return;let t=c.find(e=>!1!==e.isActive);if(t){y(!0);try{let i=await fetch(`/api/providers/${t.id}/models`),a=await i.json();if(!i.ok)return void alert(a.error||"Failed to import models");let s=a.models||[];if(0===s.length)return void alert("No models returned from /models.");let r=0;for(let t of s){let i=t.id||t.name||t.model;if(!i)continue;let a=C(i);a&&(await o(i,a,e),r+=1)}0===r&&alert("No new models were added.")}catch(e){console.log("Error importing models:",e)}finally{y(!1)}}},A=c.some(e=>!1!==e.isActive);return(0,t.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,t.jsxs)("p",{className:"text-sm text-text-muted",children:["Add ",p?"Anthropic":"OpenAI","-compatible models manually or import them from the /models endpoint."]}),(0,t.jsxs)("div",{className:"flex items-end gap-2 flex-wrap",children:[(0,t.jsxs)("div",{className:"flex-1 min-w-[240px]",children:[(0,t.jsx)("label",{htmlFor:"new-compatible-model-input",className:"text-xs text-text-muted mb-1 block",children:"Model ID"}),(0,t.jsx)("input",{id:"new-compatible-model-input",type:"text",value:u,onChange:e=>x(e.target.value),onKeyDown:e=>"Enter"===e.key&&w(),placeholder:p?"claude-3-opus-20240229":"gpt-4o",className:"w-full px-3 py-2 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary"})]}),(0,t.jsx)(n.Button,{size:"sm",icon:"add",onClick:w,disabled:!u.trim()||m,children:m?"Adding...":"Add"}),(0,t.jsx)(n.Button,{size:"sm",variant:"secondary",icon:"download",onClick:S,disabled:!A||f,children:f?"Importing...":"Import from /models"})]}),!A&&(0,t.jsx)("p",{className:"text-xs text-text-muted",children:"Add a connection to enable importing models."}),k.length>0&&(0,t.jsx)("div",{className:"flex flex-col gap-3",children:k.map(({modelId:e,fullModel:i,alias:s})=>(0,t.jsx)(O,{modelId:e,fullModel:`${a}/${e}`,copied:r,onCopy:l,onDeleteAlias:()=>d(s),onTest:c.length>0?()=>N(e):void 0,testStatus:v[e],isTesting:g===e},i))})]})}function R({until:e}){let[a,s]=(0,i.useState)("");return((0,i.useEffect)(()=>{let t=()=>{let t=new Date(e).getTime()-Date.now();if(t<=0)return void s("");let i=Math.floor(t/1e3);if(i<60)s(`${i}s`);else if(i<3600)s(`${Math.floor(i/60)}m ${i%60}s`);else{let e=Math.floor(i/3600),t=Math.floor(i%3600/60);s(`${e}h ${t}m`)}};t();let i=setInterval(t,1e3);return()=>clearInterval(i)},[e]),a)?(0,t.jsxs)("span",{className:"text-xs text-orange-500 font-mono",children:["⏱ ",a]}):null}function $({connection:e,proxyPools:a,isOAuth:s,isFirst:r,isLast:l,onMoveUp:o,onMoveDown:n,onToggleActive:c,onUpdateProxy:p,onEdit:u,onDelete:x}){let[m,h]=(0,i.useState)(!1),[f,y]=(0,i.useState)(!1),b=(0,i.useRef)(null),v=new Map((a||[]).map(e=>[e.id,e])),j=e.providerSpecificData?.proxyPoolId||null,N=j?v.get(j):null,k=e.providerSpecificData?.connectionProxyEnabled===!0&&!!e.providerSpecificData?.connectionProxyUrl,C=!!j||k,w=N?`Pool: ${N.name}`:j?`Pool: ${j} (inactive/missing)`:k?`Legacy: ${e.providerSpecificData?.connectionProxyUrl}`:"",S="";if(N?.proxyUrl||e.providerSpecificData?.connectionProxyUrl){let t=N?.proxyUrl||e.providerSpecificData?.connectionProxyUrl;try{let e=new URL(t);S=`${e.protocol}//${e.hostname}${e.port?`:${e.port}`:""}`}catch{S=t}}let A=N?.noProxy||e.providerSpecificData?.connectionNoProxy||"",P="default";N?.isActive===!0?P="success":(j||k)&&(P="error"),(0,i.useEffect)(()=>{if(!m)return;let e=e=>{b.current&&!b.current.contains(e.target)&&h(!1)};return document.addEventListener("mousedown",e),()=>document.removeEventListener("mousedown",e)},[m]);let T=async e=>{y(!0);try{await p("__none__"===e?null:e)}finally{y(!1),h(!1)}},O=s?e.name||e.email||e.displayName||"OAuth Account":e.name,[I,E]=(0,i.useState)(!1),_=Object.entries(e).filter(([e])=>e.startsWith("modelLock_")).map(([,e])=>e).filter(e=>!!e).sort()[0]||null;(0,i.useEffect)(()=>{let t=()=>{E(!!Object.entries(e).filter(([e])=>e.startsWith("modelLock_")).map(([,e])=>e).filter(e=>e&&new Date(e).getTime()>Date.now()).sort()[0])};t();let i=_?setInterval(t,1e3):null;return()=>{i&&clearInterval(i)}},[_]);let D="unavailable"!==e.testStatus||I?e.testStatus:"active";return(0,t.jsxs)("div",{className:`group flex items-center justify-between p-3 rounded-lg hover:bg-black/[0.02] dark:hover:bg-white/[0.02] transition-colors ${!1===e.isActive?"opacity-60":""}`,children:[(0,t.jsxs)("div",{className:"flex items-center gap-3 flex-1 min-w-0",children:[(0,t.jsxs)("div",{className:"flex flex-col",children:[(0,t.jsx)("button",{onClick:o,disabled:r,className:`p-0.5 rounded ${r?"text-text-muted/30 cursor-not-allowed":"hover:bg-sidebar text-text-muted hover:text-primary"}`,children:(0,t.jsx)("span",{className:"material-symbols-outlined text-sm",children:"keyboard_arrow_up"})}),(0,t.jsx)("button",{onClick:n,disabled:l,className:`p-0.5 rounded ${l?"text-text-muted/30 cursor-not-allowed":"hover:bg-sidebar text-text-muted hover:text-primary"}`,children:(0,t.jsx)("span",{className:"material-symbols-outlined text-sm",children:"keyboard_arrow_down"})})]}),(0,t.jsx)("span",{className:"material-symbols-outlined text-base text-text-muted",children:s?"lock":"key"}),(0,t.jsxs)("div",{className:"flex-1 min-w-0",children:[(0,t.jsx)("p",{className:"text-sm font-medium truncate",children:O}),(0,t.jsxs)("div",{className:"flex items-center gap-2 mt-1",children:[(0,t.jsx)(d.Badge,{variant:!1===e.isActive?"default":"active"===D||"success"===D?"success":"error"===D||"expired"===D||"unavailable"===D?"error":"default",size:"sm",dot:!0,children:!1===e.isActive?"disabled":D||"Unknown"}),C&&(0,t.jsx)(d.Badge,{variant:P,size:"sm",children:"Proxy"}),I&&!1!==e.isActive&&(0,t.jsx)(R,{until:_}),e.lastError&&!1!==e.isActive&&(0,t.jsx)("span",{className:"text-xs text-red-500 truncate max-w-[300px]",title:e.lastError,children:e.lastError}),(0,t.jsxs)("span",{className:"text-xs text-text-muted",children:["#",e.priority]}),e.globalPriority&&(0,t.jsxs)("span",{className:"text-xs text-text-muted",children:["Auto: ",e.globalPriority]})]}),C&&(0,t.jsxs)("div",{className:"mt-1 flex items-center gap-2 flex-wrap",children:[(0,t.jsx)("span",{className:"text-[11px] text-text-muted truncate max-w-[420px]",title:w,children:w}),S&&(0,t.jsx)("code",{className:"text-[10px] font-mono bg-black/5 dark:bg-white/5 px-1 py-0.5 rounded text-text-muted",children:S}),A&&(0,t.jsxs)("span",{className:"text-[11px] text-text-muted truncate max-w-[320px]",title:A,children:["no_proxy: ",A]})]})]})]}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsxs)("div",{className:"flex gap-1",children:[(a||[]).length>0&&(0,t.jsxs)("div",{className:"relative",ref:b,children:[(0,t.jsxs)("button",{onClick:()=>h(e=>!e),className:`flex flex-col items-center px-2 py-1 rounded hover:bg-black/5 dark:hover:bg-white/5 transition-colors ${C?"text-primary":"text-text-muted hover:text-primary"}`,disabled:f,children:[(0,t.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:f?"progress_activity":"lan"}),(0,t.jsx)("span",{className:"text-[10px] leading-tight",children:"Proxy"})]}),m&&(0,t.jsxs)("div",{className:"absolute right-0 top-full mt-1 z-50 bg-bg border border-border rounded-lg shadow-lg py-1 min-w-[160px]",children:[(0,t.jsx)("button",{onClick:()=>T("__none__"),className:`w-full text-left px-3 py-1.5 text-sm hover:bg-black/5 dark:hover:bg-white/5 ${!j?"text-primary font-medium":"text-text-main"}`,children:"None"}),(a||[]).map(e=>(0,t.jsx)("button",{onClick:()=>T(e.id),className:`w-full text-left px-3 py-1.5 text-sm hover:bg-black/5 dark:hover:bg-white/5 ${j===e.id?"text-primary font-medium":"text-text-main"}`,children:e.name},e.id))]})]}),(0,t.jsxs)("button",{onClick:u,className:"flex flex-col items-center px-2 py-1 rounded hover:bg-black/5 dark:hover:bg-white/5 text-text-muted hover:text-primary",children:[(0,t.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"edit"}),(0,t.jsx)("span",{className:"text-[10px] leading-tight",children:"Edit"})]}),(0,t.jsxs)("button",{onClick:x,className:"flex flex-col items-center px-2 py-1 rounded hover:bg-red-500/10 text-red-500",children:[(0,t.jsx)("span",{className:"material-symbols-outlined text-[18px]",children:"delete"}),(0,t.jsx)("span",{className:"text-[10px] leading-tight",children:"Delete"})]})]}),(0,t.jsx)(g.Toggle,{size:"sm",checked:e.isActive??!0,onChange:c,title:e.isActive??!0?"Disable connection":"Enable connection"})]})]})}function E({isOpen:e,provider:a,providerName:s,isCompatible:r,isAnthropic:l,proxyPools:o,onSave:u,onClose:x}){let m="__none__",[h,f]=(0,i.useState)({name:"",apiKey:"",priority:1,proxyPoolId:m}),[y,g]=(0,i.useState)(!1),[v,j]=(0,i.useState)(null),[N,k]=(0,i.useState)(!1),C=async()=>{g(!0);try{let e=await fetch("/api/providers/validate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:a,apiKey:h.apiKey})}),t=await e.json();j(t.valid?"success":"failed")}catch{j("failed")}finally{g(!1)}},w=async()=>{if(a&&h.apiKey){k(!0);try{let e=!1;try{g(!0),j(null);let t=await fetch("/api/providers/validate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:a,apiKey:h.apiKey})});e=!!(await t.json()).valid,j(e?"success":"failed")}catch{j("failed")}finally{g(!1)}await u({name:h.name,apiKey:h.apiKey,priority:h.priority,proxyPoolId:h.proxyPoolId===m?null:h.proxyPoolId,testStatus:e?"active":"unknown",providerSpecificData:void 0})}finally{k(!1)}}};return a?(0,t.jsx)(p.Modal,{isOpen:e,title:`Add ${s||a} API Key`,onClose:x,children:(0,t.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,t.jsx)(c.Input,{label:"Name",value:h.name,onChange:e=>f({...h,name:e.target.value}),placeholder:"Production Key"}),(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)(c.Input,{label:"API Key",type:"password",value:h.apiKey,onChange:e=>f({...h,apiKey:e.target.value}),className:"flex-1"}),(0,t.jsx)("div",{className:"pt-6",children:(0,t.jsx)(n.Button,{onClick:C,disabled:!h.apiKey||y||N,variant:"secondary",children:y?"Checking...":"Check"})})]}),v&&(0,t.jsx)(d.Badge,{variant:"success"===v?"success":"error",children:"success"===v?"Valid":"Invalid"}),r&&(0,t.jsx)("p",{className:"text-xs text-text-muted",children:l?`Validation checks ${s||"Anthropic Compatible"} by verifying the API key.`:`Validation checks ${s||"OpenAI Compatible"} via /models on your base URL.`}),(0,t.jsx)(c.Input,{label:"Priority",type:"number",value:h.priority,onChange:e=>f({...h,priority:Number.parseInt(e.target.value)||1})}),(0,t.jsx)(b.Select,{label:"Proxy Pool",value:h.proxyPoolId,onChange:e=>f({...h,proxyPoolId:e.target.value}),options:[{value:m,label:"None"},...(o||[]).map(e=>({value:e.id,label:e.name}))],placeholder:"None"}),0===(o||[]).length&&(0,t.jsx)("p",{className:"text-xs text-text-muted",children:"No active proxy pools available. Create one in Proxy Pools page first."}),(0,t.jsx)("p",{className:"text-xs text-text-muted",children:"Legacy manual proxy fields are still accepted by API for backward compatibility."}),(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)(n.Button,{onClick:w,fullWidth:!0,disabled:!h.name||!h.apiKey||N,children:N?"Saving...":"Save"}),(0,t.jsx)(n.Button,{onClick:x,variant:"ghost",fullWidth:!0,children:"Cancel"})]})]})}):null}function _({isOpen:e,connection:a,proxyPools:s,onSave:r,onClose:l}){let[o,u]=(0,i.useState)({name:"",priority:1,apiKey:""}),[x,m]=(0,i.useState)(!1),[h,f]=(0,i.useState)(null),[y,g]=(0,i.useState)(!1),[b,v]=(0,i.useState)(null),[N,k]=(0,i.useState)(!1);(0,i.useEffect)(()=>{a&&(u({name:a.name||"",priority:a.priority||1,apiKey:""}),f(null),v(null))},[a]);let C=async()=>{if(a?.provider){m(!0),f(null);try{let e=await fetch(`/api/providers/${a.id}/test`,{method:"POST"}),t=await e.json();f(t.valid?"success":"failed")}catch{f("failed")}finally{m(!1)}}},w=async()=>{if(a?.provider&&o.apiKey){g(!0),v(null);try{let e=await fetch("/api/providers/validate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:a.provider,apiKey:o.apiKey})}),t=await e.json();v(t.valid?"success":"failed")}catch{v("failed")}finally{g(!1)}}},S=async()=>{k(!0);try{let e={name:o.name,priority:o.priority};if(!A&&o.apiKey){e.apiKey=o.apiKey;let t="success"===b;if(!t)try{g(!0),v(null);let e=await fetch("/api/providers/validate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:a.provider,apiKey:o.apiKey})});t=!!(await e.json()).valid,v(t?"success":"failed")}catch{v("failed")}finally{g(!1)}t&&(e.testStatus="active",e.lastError=null,e.lastErrorAt=null)}await r(e)}finally{k(!1)}};if(!a)return null;let A="oauth"===a.authType,P=(0,j.isOpenAICompatibleProvider)(a.provider)||(0,j.isAnthropicCompatibleProvider)(a.provider);return(0,t.jsx)(p.Modal,{isOpen:e,title:"Edit Connection",onClose:l,children:(0,t.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,t.jsx)(c.Input,{label:"Name",value:o.name,onChange:e=>u({...o,name:e.target.value}),placeholder:A?"Account name":"Production Key"}),A&&a.email&&(0,t.jsxs)("div",{className:"bg-sidebar/50 p-3 rounded-lg",children:[(0,t.jsx)("p",{className:"text-sm text-text-muted mb-1",children:"Email"}),(0,t.jsx)("p",{className:"font-medium",children:a.email})]}),(0,t.jsx)(c.Input,{label:"Priority",type:"number",value:o.priority,onChange:e=>u({...o,priority:Number.parseInt(e.target.value)||1})}),!A&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)(c.Input,{label:"API Key",type:"password",value:o.apiKey,onChange:e=>u({...o,apiKey:e.target.value}),placeholder:"Enter new API key",hint:"Leave blank to keep the current API key.",className:"flex-1"}),(0,t.jsx)("div",{className:"pt-6",children:(0,t.jsx)(n.Button,{onClick:w,disabled:!o.apiKey||y||N,variant:"secondary",children:y?"Checking...":"Check"})})]}),b&&(0,t.jsx)(d.Badge,{variant:"success"===b?"success":"error",children:"success"===b?"Valid":"Invalid"})]}),!P&&(0,t.jsxs)("div",{className:"flex items-center gap-3",children:[(0,t.jsx)(n.Button,{onClick:C,variant:"secondary",disabled:x,children:x?"Testing...":"Test Connection"}),h&&(0,t.jsx)(d.Badge,{variant:"success"===h?"success":"error",children:"success"===h?"Valid":"Failed"})]}),(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)(n.Button,{onClick:S,fullWidth:!0,disabled:N,children:N?"Saving...":"Save"}),(0,t.jsx)(n.Button,{onClick:l,variant:"ghost",fullWidth:!0,children:"Cancel"})]})]})})}function D({isOpen:e,node:a,onSave:s,onClose:r,isAnthropic:l}){let[o,u]=(0,i.useState)({name:"",prefix:"",apiType:"chat",baseUrl:"https://api.openai.com/v1"}),[x,m]=(0,i.useState)(!1),[h,f]=(0,i.useState)(""),[y,g]=(0,i.useState)(""),[v,j]=(0,i.useState)(!1),[N,k]=(0,i.useState)(null);(0,i.useEffect)(()=>{a&&u({name:a.name||"",prefix:a.prefix||"",apiType:a.apiType||"chat",baseUrl:a.baseUrl||(l?"https://api.anthropic.com/v1":"https://api.openai.com/v1")})},[a,l]);let C=async()=>{if(o.name.trim()&&o.prefix.trim()&&o.baseUrl.trim()){m(!0);try{let e={name:o.name,prefix:o.prefix,baseUrl:o.baseUrl};l||(e.apiType=o.apiType),await s(e)}finally{m(!1)}}},w=async()=>{j(!0);try{let e=await fetch("/api/provider-nodes/validate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({baseUrl:o.baseUrl,apiKey:h,type:l?"anthropic-compatible":"openai-compatible",modelId:y.trim()||void 0})}),t=await e.json();k(t.valid?"success":"failed")}catch{k("failed")}finally{j(!1)}};return a?(0,t.jsx)(p.Modal,{isOpen:e,title:`Edit ${l?"Anthropic":"OpenAI"} Compatible`,onClose:r,children:(0,t.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,t.jsx)(c.Input,{label:"Name",value:o.name,onChange:e=>u({...o,name:e.target.value}),placeholder:`${l?"Anthropic":"OpenAI"} Compatible (Prod)`,hint:"Required. A friendly label for this node."}),(0,t.jsx)(c.Input,{label:"Prefix",value:o.prefix,onChange:e=>u({...o,prefix:e.target.value}),placeholder:l?"ac-prod":"oc-prod",hint:"Required. Used as the provider prefix for model IDs."}),!l&&(0,t.jsx)(b.Select,{label:"API Type",options:[{value:"chat",label:"Chat Completions"},{value:"responses",label:"Responses API"}],value:o.apiType,onChange:e=>u({...o,apiType:e.target.value})}),(0,t.jsx)(c.Input,{label:"Base URL",value:o.baseUrl,onChange:e=>u({...o,baseUrl:e.target.value}),placeholder:l?"https://api.anthropic.com/v1":"https://api.openai.com/v1",hint:`Use the base URL (ending in /v1) for your ${l?"Anthropic":"OpenAI"}-compatible API.`}),(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)(c.Input,{label:"API Key (for Check)",type:"password",value:h,onChange:e=>f(e.target.value),className:"flex-1"}),(0,t.jsx)("div",{className:"pt-6",children:(0,t.jsx)(n.Button,{onClick:w,disabled:!h||v||!o.baseUrl.trim(),variant:"secondary",children:v?"Checking...":"Check"})})]}),(0,t.jsx)(c.Input,{label:"Model ID (optional)",value:y,onChange:e=>g(e.target.value),placeholder:"e.g. my-model-id",hint:"If provider lacks /models endpoint, enter a model ID to validate via chat/completions instead."}),N&&(0,t.jsx)(d.Badge,{variant:"success"===N?"success":"error",children:"success"===N?"Valid":"Invalid"}),(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)(n.Button,{onClick:C,fullWidth:!0,disabled:!o.name.trim()||!o.prefix.trim()||!o.baseUrl.trim()||x,children:x?"Saving...":"Save"}),(0,t.jsx)(n.Button,{onClick:r,variant:"ghost",fullWidth:!0,children:"Cancel"})]})]})}):null}function U({isOpen:e,providerAlias:a,providerDisplayAlias:s,onSave:r,onClose:l}){let[o,d]=(0,i.useState)(""),[c,u]=(0,i.useState)(null),[x,m]=(0,i.useState)(""),[h,f]=(0,i.useState)(!1);(0,i.useEffect)(()=>{e&&(d(""),u(null),m(""))},[e]);let y=async()=>{if(o.trim()){u("testing"),m("");try{let e=await fetch("/api/models/test",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:`${a}/${o.trim()}`})}),t=await e.json();u(t.ok?"ok":"error"),m(t.error||"")}catch(e){u("error"),m(e.message)}}},g=async()=>{if(o.trim()&&!h){f(!0);try{await r(o.trim())}finally{f(!1)}}};return(0,t.jsx)(p.Modal,{isOpen:e,onClose:l,title:"Add Custom Model",children:(0,t.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("label",{className:"text-sm font-medium mb-1.5 block",children:"Model ID"}),(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)("input",{type:"text",value:o,onChange:e=>{d(e.target.value),u(null),m("")},onKeyDown:e=>{"Enter"===e.key&&y()},placeholder:"e.g. claude-opus-4-5",className:"flex-1 px-3 py-2 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary",autoFocus:!0}),(0,t.jsx)(n.Button,{variant:"secondary",icon:"science",loading:"testing"===c,onClick:y,disabled:!o.trim()||"testing"===c,children:"testing"===c?"Testing...":"Test"})]}),(0,t.jsxs)("p",{className:"text-xs text-text-muted mt-1",children:["Sent to provider as: ",(0,t.jsx)("code",{className:"font-mono bg-sidebar px-1 rounded",children:o.trim()||"model-id"})]})]}),"ok"===c&&(0,t.jsxs)("div",{className:"flex items-center gap-2 text-sm text-green-600",children:[(0,t.jsx)("span",{className:"material-symbols-outlined text-base",children:"check_circle"}),"Model is reachable"]}),"error"===c&&(0,t.jsxs)("div",{className:"flex items-start gap-2 text-sm text-red-500",children:[(0,t.jsx)("span",{className:"material-symbols-outlined text-base shrink-0",children:"cancel"}),(0,t.jsx)("span",{children:x||"Model not reachable"})]}),(0,t.jsxs)("div",{className:"flex gap-2 pt-1",children:[(0,t.jsx)(n.Button,{onClick:l,variant:"ghost",fullWidth:!0,size:"sm",children:"Cancel"}),(0,t.jsx)(n.Button,{onClick:g,fullWidth:!0,size:"sm",disabled:!o.trim()||h,children:h?"Adding...":"Add Model"})]})]})})}T.propTypes={model:a.default.shape({id:a.default.string.isRequired}).isRequired,fullModel:a.default.string.isRequired,alias:a.default.string,copied:a.default.string,onCopy:a.default.func.isRequired,testStatus:a.default.oneOf(["ok","error"]),isCustom:a.default.bool,isFree:a.default.bool,onDeleteAlias:a.default.func,onTest:a.default.func,isTesting:a.default.bool},a.default.string.isRequired,a.default.object.isRequired,a.default.string,a.default.func.isRequired,a.default.func.isRequired,a.default.func.isRequired,O.propTypes={modelId:a.default.string.isRequired,fullModel:a.default.string.isRequired,copied:a.default.string,onCopy:a.default.func.isRequired,onDeleteAlias:a.default.func.isRequired,onTest:a.default.func,testStatus:a.default.oneOf(["ok","error"]),isTesting:a.default.bool,isFree:a.default.bool},I.propTypes={providerStorageAlias:a.default.string.isRequired,providerDisplayAlias:a.default.string.isRequired,modelAliases:a.default.object.isRequired,copied:a.default.string,onCopy:a.default.func.isRequired,onSetAlias:a.default.func.isRequired,onDeleteAlias:a.default.func.isRequired,connections:a.default.arrayOf(a.default.shape({id:a.default.string,isActive:a.default.bool})).isRequired,isAnthropic:a.default.bool},R.propTypes={until:a.default.string.isRequired},$.propTypes={connection:a.default.shape({id:a.default.string,name:a.default.string,email:a.default.string,displayName:a.default.string,modelLockUntil:a.default.string,testStatus:a.default.string,isActive:a.default.bool,lastError:a.default.string,priority:a.default.number,globalPriority:a.default.number}).isRequired,proxyPools:a.default.arrayOf(a.default.shape({id:a.default.string,name:a.default.string,proxyUrl:a.default.string,noProxy:a.default.string,isActive:a.default.bool})),isOAuth:a.default.bool.isRequired,isFirst:a.default.bool.isRequired,isLast:a.default.bool.isRequired,onMoveUp:a.default.func.isRequired,onMoveDown:a.default.func.isRequired,onToggleActive:a.default.func.isRequired,onUpdateProxy:a.default.func,onEdit:a.default.func.isRequired,onDelete:a.default.func.isRequired},E.propTypes={isOpen:a.default.bool.isRequired,provider:a.default.string,providerName:a.default.string,isCompatible:a.default.bool,isAnthropic:a.default.bool,proxyPools:a.default.arrayOf(a.default.shape({id:a.default.string,name:a.default.string})),onSave:a.default.func.isRequired,onClose:a.default.func.isRequired},_.propTypes={isOpen:a.default.bool.isRequired,connection:a.default.shape({id:a.default.string,name:a.default.string,email:a.default.string,priority:a.default.number,authType:a.default.string,provider:a.default.string,providerSpecificData:a.default.object}),proxyPools:a.default.arrayOf(a.default.shape({id:a.default.string,name:a.default.string})),onSave:a.default.func.isRequired,onClose:a.default.func.isRequired},D.propTypes={isOpen:a.default.bool.isRequired,node:a.default.shape({id:a.default.string,name:a.default.string,prefix:a.default.string,apiType:a.default.string,baseUrl:a.default.string}),onSave:a.default.func.isRequired,onClose:a.default.func.isRequired,isAnthropic:a.default.bool},U.propTypes={isOpen:a.default.bool.isRequired,providerAlias:a.default.string.isRequired,providerDisplayAlias:a.default.string.isRequired,onSave:a.default.func.isRequired,onClose:a.default.func.isRequired},e.s(["default",0,function(){let e,a=(0,s.useParams)(),d=(0,s.useRouter)(),c=a.id,[C,w]=(0,i.useState)([]),[O,R]=(0,i.useState)(!0),[q,B]=(0,i.useState)(null),[K,M]=(0,i.useState)([]),[F,L]=(0,i.useState)(!1),[J,z]=(0,i.useState)(!1),[V,W]=(0,i.useState)(!1),[G,H]=(0,i.useState)(!1),[Y,Q]=(0,i.useState)(!1),[X,Z]=(0,i.useState)(!1),[ee,et]=(0,i.useState)(!1),[ei,ea]=(0,i.useState)(!1),[es,er]=(0,i.useState)(!1),[el,eo]=(0,i.useState)(""),[en,ed]=(0,i.useState)(null),[ec,ep]=(0,i.useState)(null),[eu,ex]=(0,i.useState)({}),[em,eh]=(0,i.useState)(!1),[ef,ey]=(0,i.useState)({}),[eg,eb]=(0,i.useState)(""),[ev,ej]=(0,i.useState)(null),[eN,ek]=(0,i.useState)(!1),[eC,ew]=(0,i.useState)([]),[eS,eA]=(0,i.useState)("__none__"),[eP,eT]=(0,i.useState)(!1),[eO,eI]=(0,i.useState)(null),[eR,e$]=(0,i.useState)(""),[eE,e_]=(0,i.useState)([]),[eD,eU]=(0,i.useState)([]),{copied:eq,copy:eB}=(0,k.useCopyToClipboard)(),eK=q?{id:q.id,name:q.name||("anthropic-compatible"===q.type?"Anthropic Compatible":"OpenAI Compatible"),color:"anthropic-compatible"===q.type?"#D97757":"#10A37F",textIcon:"anthropic-compatible"===q.type?"AC":"OC",apiType:q.apiType,baseUrl:q.baseUrl,type:q.type}:j.OAUTH_PROVIDERS[c]||j.APIKEY_PROVIDERS[c]||j.FREE_PROVIDERS[c]||j.FREE_TIER_PROVIDERS[c],eM=!!j.OAUTH_PROVIDERS[c]||!!j.FREE_PROVIDERS[c],eF=(0,N.getModelsByProviderId)(c),eL=(0,j.getProviderAlias)(c),eJ=(0,j.isOpenAICompatibleProvider)(c),ez=(0,j.isAnthropicCompatibleProvider)(c),eV=eJ||ez,eW=eV?c:eL,eG=eV?q?.prefix||c:eL,eH=(0,i.useCallback)(async()=>{try{let e=await fetch("/api/models/alias"),t=await e.json();e.ok&&ex(t.aliases||{})}catch(e){console.log("Error fetching aliases:",e)}},[]);(0,i.useEffect)(()=>{"kilocode"===c&&fetch("/api/providers/kilo/free-models").then(e=>e.json()).then(e=>{e.models?.length&&eU(e.models)}).catch(()=>{})},[c]);let eY=(0,i.useCallback)(async()=>{try{let[e,t,i,a]=await Promise.all([fetch("/api/providers",{cache:"no-store"}),fetch("/api/provider-nodes",{cache:"no-store"}),fetch("/api/proxy-pools?isActive=true",{cache:"no-store"}),fetch("/api/settings",{cache:"no-store"})]),s=await e.json(),r=await t.json(),l=await i.json(),o=a.ok?await a.json():{};if(e.ok){let e=(s.connections||[]).filter(e=>e.provider===c);w(e)}i.ok&&M(l.proxyPools||[]);let n=(o.providerStrategies||{})[c]||{};if(eI(n.fallbackStrategy||null),e$(null!=n.stickyRoundRobinLimit?String(n.stickyRoundRobinLimit):"1"),t.ok){let e=(r.nodes||[]).find(e=>e.id===c)||null;if(!e&&eV)for(let t=0;t<3;t+=1){await new Promise(e=>setTimeout(e,150));let t=await fetch("/api/provider-nodes",{cache:"no-store"});if(t.ok&&(e=((await t.json()).nodes||[]).find(e=>e.id===c)||null))break}B(e)}}catch(e){console.log("Error fetching connections:",e)}finally{R(!1)}},[c,eV]),eQ=async e=>{try{let t=await fetch(`/api/provider-nodes/${c}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)}),i=await t.json();t.ok&&(B(i.node),await eY(),Q(!1))}catch(e){console.log("Error updating provider node:",e)}},eX=async(e,t)=>{try{let i=await fetch("/api/settings",{cache:"no-store"}),a=(i.ok?await i.json():{}).providerStrategies||{},s={};e&&(s.fallbackStrategy=e),"round-robin"===e&&""!==t&&(s.stickyRoundRobinLimit=Number(t)||3);let r={...a};0===Object.keys(s).length?delete r[c]:r[c]=s,await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({providerStrategies:r})})}catch(e){console.log("Error saving provider strategy:",e)}};(0,i.useEffect)(()=>{eY(),eH()},[eY,eH]),(0,i.useEffect)(()=>{let e=(j.OAUTH_PROVIDERS[c]||j.APIKEY_PROVIDERS[c]||j.FREE_PROVIDERS[c]||j.FREE_TIER_PROVIDERS[c])?.modelsFetcher;e&&S(e).then(e_)},[c]);let eZ=async(e,t,i=eL)=>{let a=`${i}/${e}`;try{let e=await fetch("/api/models/alias",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:a,alias:t})});if(e.ok)await eH();else{let t=await e.json();alert(t.error||"Failed to set alias")}}catch(e){console.log("Error setting alias:",e)}},e0=async e=>{try{(await fetch(`/api/models/alias?alias=${encodeURIComponent(e)}`,{method:"DELETE"})).ok&&await eH()}catch(e){console.log("Error deleting alias:",e)}},e1=async e=>{if(confirm("Delete this connection?"))try{(await fetch(`/api/providers/${e}`,{method:"DELETE"})).ok&&w(C.filter(t=>t.id!==e))}catch(e){console.log("Error deleting connection:",e)}},e5=()=>{eY(),L(!1)},e2=async e=>{try{(await fetch("/api/providers",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:c,...e})})).ok&&(await eY(),W(!1))}catch(e){console.log("Error saving connection:",e)}},e4=async e=>{try{(await fetch(`/api/providers/${ec.id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})).ok&&(await eY(),H(!1))}catch(e){console.log("Error updating connection:",e)}},e3=async(e,t)=>{try{(await fetch(`/api/providers/${e}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({isActive:t})})).ok&&w(i=>i.map(i=>i.id===e?{...i,isActive:t}:i))}catch(e){console.log("Error updating connection status:",e)}},e6=async(e,t)=>{let i=[...C];[i[e],i[t]]=[i[t],i[e]],w(i);try{await Promise.all([fetch(`/api/providers/${i[e].id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({priority:e})}),fetch(`/api/providers/${i[t].id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({priority:t})})])}catch(e){console.log("Error swapping priority:",e),await eY()}},e8=C.filter(e=>eC.includes(e.id));C.length>0&&(eC.length,C.length),(0,i.useEffect)(()=>{ew(e=>e.filter(e=>C.some(t=>t.id===e)))},[C]);let e9=(()=>{if(0===e8.length)return"";let e=new Set(e8.map(e=>e.providerSpecificData?.proxyPoolId||"__none__"));if(1===e.size){let t=[...e][0];if("__none__"===t)return"All selected currently unbound";let i=K.find(e=>e.id===t);return`All selected currently bound to ${i?.name||t}`}return"Selected connections have mixed proxy bindings"})(),e7=()=>{eP||Z(!1)},te=async()=>{if(0===eC.length)return;let e="__none__"===eS?null:eS;eT(!0);try{let t=[];for(let i of eC)try{let a=await fetch(`/api/providers/${i}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({proxyPoolId:e})});t.push(a.ok)}catch(e){console.log("Error applying bulk proxy pool for",i,e),t.push(!1)}let i=t.filter(e=>!e).length;i>0&&alert(`Updated with ${i} failed request(s).`),await eY(),ew([]),eA("__none__"),Z(!1)}catch(e){console.log("Error applying bulk proxy pool:",e)}finally{eT(!1)}},tt=ee||ei,ti=async()=>{et(!0),ed(null);try{let e=await fetch("/api/antigravity-tools/import",{method:"POST"}),t=await e.json();e.ok?(ed(t),await eY()):ed({error:t.error||"Import failed"})}catch(e){ed({error:e.message})}et(!1)},ta=async()=>{if(el.trim()){ea(!0),ed(null);try{let e=await fetch("/api/antigravity-tools/import-refresh-tokens",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({text:el})}),t=await e.json();e.ok?(ed(t),await eY(),er(!1),eo("")):ed({error:t.error||"Import failed"})}catch(e){ed({error:e.message})}ea(!1)}},ts=()=>{ei||er(!1)},tr=(0,t.jsx)("div",{className:"flex flex-col divide-y divide-black/[0.03] dark:divide-white/[0.03]",children:C.map((e,i)=>(0,t.jsx)("div",{className:"flex items-stretch",children:(0,t.jsx)("div",{className:"flex-1 min-w-0",children:(0,t.jsx)($,{connection:e,proxyPools:K,isOAuth:eM,isFirst:0===i,isLast:i===C.length-1,onMoveUp:()=>e6(i,i-1),onMoveDown:()=>e6(i,i+1),onToggleActive:t=>e3(e.id,t),onUpdateProxy:async t=>{try{(await fetch(`/api/providers/${e.id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({proxyPoolId:t||null})})).ok&&w(i=>i.map(i=>i.id===e.id?{...i,providerSpecificData:{...i.providerSpecificData,proxyPoolId:t||null}}:i))}catch(e){console.log("Error updating proxy:",e)}},onEdit:()=>{ep(e),H(!0)},onDelete:()=>e1(e.id)})})},e.id))}),tl=[{value:"__none__",label:"None"},...K.map(e=>({value:e.id,label:e.name}))],to=0===eC.length?"Select one or more connections, then click Proxy Action.":e9,tn=eC.length>0&&!eP,td=(0,t.jsx)(p.Modal,{isOpen:X,onClose:e7,title:`Proxy Action (${eC.length} selected)`,children:(0,t.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,t.jsx)(b.Select,{label:"Proxy Pool",value:eS,onChange:e=>eA(e.target.value),options:tl,placeholder:"None"}),(0,t.jsx)("p",{className:"text-xs text-text-muted",children:to}),(0,t.jsx)("p",{className:"text-xs text-text-muted",children:"Selecting None will unbind selected connections from proxy pool."}),(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)(n.Button,{onClick:te,fullWidth:!0,disabled:!tn,children:eP?"Applying...":"Apply"}),(0,t.jsx)(n.Button,{onClick:e7,variant:"ghost",fullWidth:!0,disabled:eP,children:"Cancel"})]})]})}),tc=async e=>{if(!ev){ej(e);try{let t=await fetch("/api/models/test",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({model:`${eW}/${e}`})}),i=await t.json();ey(t=>({...t,[e]:i.ok?"ok":"error"})),eb(i.ok?"":i.error||"Model not reachable")}catch{ey(t=>({...t,[e]:"error"})),eb("Network error")}finally{ej(null)}}};return O?(0,t.jsxs)("div",{className:"flex flex-col gap-8",children:[(0,t.jsx)(u.CardSkeleton,{}),(0,t.jsx)(u.CardSkeleton,{})]}):eK?(0,t.jsxs)("div",{className:"flex flex-col gap-8",children:[(0,t.jsxs)("div",{children:[(0,t.jsxs)(r.default,{href:"/dashboard/providers",className:"inline-flex items-center gap-1 text-sm text-text-muted hover:text-primary transition-colors mb-4",children:[(0,t.jsx)("span",{className:"material-symbols-outlined text-lg",children:"arrow_back"}),"Back to Providers"]}),(0,t.jsxs)("div",{className:"flex items-center gap-4",children:[(0,t.jsx)("div",{className:"rounded-lg flex items-center justify-center",style:{backgroundColor:`${eK.color}15`},children:em?(0,t.jsx)("span",{className:"text-sm font-bold",style:{color:eK.color},children:eK.textIcon||eK.id.slice(0,2).toUpperCase()}):(0,t.jsx)(l.default,{src:eJ&&eK.apiType?"responses"===eK.apiType?"/providers/oai-r.png":"/providers/oai-cc.png":ez?"/providers/anthropic-m.png":`/providers/${eK.id}.png`,alt:eK.name,width:48,height:48,className:"object-contain rounded-lg max-w-[48px] max-h-[48px]",sizes:"48px",onError:()=>eh(!0)})}),(0,t.jsxs)("div",{children:[(0,t.jsx)("h1",{className:"text-3xl font-semibold tracking-tight",children:eK.name}),(0,t.jsxs)("p",{className:"text-text-muted",children:[C.length," connection",1===C.length?"":"s"]})]})]})]}),eK.deprecated&&(0,t.jsxs)("div",{className:"flex items-start gap-2 px-3 py-2 rounded-lg bg-black/[0.02] dark:bg-white/[0.02] border border-black/[0.05] dark:border-white/[0.05]",children:[(0,t.jsx)("span",{className:"material-symbols-outlined text-[16px] text-text-muted mt-0.5 shrink-0",children:"info"}),(0,t.jsx)("p",{className:"text-xs text-text-muted leading-relaxed",children:eK.deprecationNotice})]}),eK.notice&&!eK.deprecated&&(0,t.jsxs)("div",{className:"flex items-center gap-2 px-3 py-2 rounded-lg bg-black/[0.02] dark:bg-white/[0.02] border border-black/[0.05] dark:border-white/[0.05]",children:[(0,t.jsx)("span",{className:"material-symbols-outlined text-[16px] text-text-muted shrink-0",children:"info"}),(0,t.jsx)("p",{className:"text-xs text-text-muted leading-relaxed",children:eK.notice.text}),eK.notice.apiKeyUrl&&(0,t.jsx)("a",{href:eK.notice.apiKeyUrl,target:"_blank",rel:"noopener noreferrer",className:"text-xs text-primary hover:underline shrink-0",children:"Get API Key →"})]}),eV&&q&&(0,t.jsxs)(o.Card,{children:[(0,t.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("h2",{className:"text-lg font-semibold",children:ez?"Anthropic Compatible Details":"OpenAI Compatible Details"}),(0,t.jsxs)("p",{className:"text-sm text-text-muted",children:[ez?"Messages API":"responses"===q.apiType?"Responses API":"Chat Completions"," · ",(q.baseUrl||"").replace(/\/$/,""),"/",ez?"messages":"responses"===q.apiType?"responses":"chat/completions"]})]}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)(n.Button,{size:"sm",icon:"add",onClick:()=>W(!0),disabled:C.length>0,children:"Add"}),(0,t.jsx)(n.Button,{size:"sm",variant:"secondary",icon:"edit",onClick:()=>Q(!0),children:"Edit"}),(0,t.jsx)(n.Button,{size:"sm",variant:"secondary",icon:"delete",onClick:async()=>{if(confirm(`Delete this ${ez?"Anthropic":"OpenAI"} Compatible node?`))try{(await fetch(`/api/provider-nodes/${c}`,{method:"DELETE"})).ok&&d.push("/dashboard/providers")}catch(e){console.log("Error deleting provider node:",e)}},children:"Delete"})]})]}),C.length>0&&(0,t.jsx)("p",{className:"text-sm text-text-muted",children:"Only one connection is allowed per compatible node. Add another node if you need more connections."})]}),(0,t.jsxs)(o.Card,{children:[(0,t.jsxs)("div",{className:"flex items-center justify-between mb-4",children:[(0,t.jsx)("h2",{className:"text-lg font-semibold",children:"Connections"}),(0,t.jsxs)("div",{className:"flex items-center gap-2",children:[(0,t.jsx)("span",{className:"text-xs text-text-muted font-medium",children:"Round Robin"}),(0,t.jsx)(g.Toggle,{checked:"round-robin"===eO,onChange:e=>{let t=e?"round-robin":null,i=e?eR||"1":eR;e&&!eR&&e$("1"),eI(t),eX(t,i)}}),"round-robin"===eO&&(0,t.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,t.jsx)("span",{className:"text-xs text-text-muted",children:"Sticky:"}),(0,t.jsx)("input",{type:"number",min:1,value:eR,onChange:e=>{var t;e$(t=e.target.value),eX("round-robin",t)},placeholder:"1",className:"w-14 px-2 py-1 text-xs border border-border rounded-md bg-background focus:outline-none focus:border-primary"})]})]})]}),en&&(0,t.jsxs)("div",{className:`flex items-center justify-between gap-2 mb-3 px-3 py-2 rounded-lg text-xs ${en.error?"bg-red-500/5 border border-red-500/15 text-red-500":"bg-green-500/5 border border-green-500/15 text-green-600"}`,children:[(0,t.jsx)("span",{children:en.error?`✗ ${en.error}`:(e=[`imported ${en.imported}`,`updated ${en.updated}`],en.skipped>0&&e.push(`skipped ${en.skipped}`),en.failed>0&&e.push(`failed ${en.failed}`),`✓ ${e.join(", ")}`)}),(0,t.jsx)("button",{onClick:()=>ed(null),className:"text-current opacity-60 hover:opacity-100",children:"✕"})]}),0===C.length?(0,t.jsxs)("div",{className:"text-center py-12",children:[(0,t.jsx)("div",{className:"inline-flex items-center justify-center w-16 h-16 rounded-full bg-primary/10 text-primary mb-4",children:(0,t.jsx)("span",{className:"material-symbols-outlined text-[32px]",children:eM?"lock":"key"})}),(0,t.jsx)("p",{className:"text-text-main font-medium mb-1",children:"No connections yet"}),(0,t.jsx)("p",{className:"text-sm text-text-muted mb-4",children:"Add your first connection to get started"}),!eV&&(0,t.jsxs)("div",{className:"flex gap-2 justify-center",children:["iflow"===c&&(0,t.jsx)(n.Button,{icon:"cookie",variant:"secondary",onClick:()=>z(!0),children:"Cookie Auth"}),(0,t.jsx)(n.Button,{icon:"add",onClick:()=>eM?L(!0):W(!0),children:"iflow"===c?"OAuth":"Add Connection"}),"antigravity"===c&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(v.Tooltip,{text:A,position:"bottom",children:(0,t.jsx)(n.Button,{icon:"download",variant:"secondary",onClick:ti,disabled:tt,children:ee?"Importing…":"Import from AGT"})}),(0,t.jsx)(v.Tooltip,{text:P,position:"bottom",children:(0,t.jsx)(n.Button,{icon:"key",variant:"secondary",onClick:()=>er(!0),disabled:tt,children:"Import refresh tokens"})})]})]})]}):(0,t.jsxs)(t.Fragment,{children:[tr,!eV&&(0,t.jsxs)("div",{className:"flex gap-2 mt-4",children:["iflow"===c&&(0,t.jsx)(n.Button,{size:"sm",icon:"cookie",variant:"secondary",onClick:()=>z(!0),title:"Add connection using browser cookie",children:"Cookie"}),(0,t.jsx)(n.Button,{size:"sm",icon:"add",onClick:()=>eM?L(!0):W(!0),children:"Add"}),"antigravity"===c&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(v.Tooltip,{text:A,position:"bottom",children:(0,t.jsx)(n.Button,{size:"sm",icon:"download",variant:"secondary",onClick:ti,disabled:tt,children:ee?"Importing…":"Import from AGT"})}),(0,t.jsx)(v.Tooltip,{text:P,position:"bottom",children:(0,t.jsx)(n.Button,{size:"sm",icon:"key",variant:"secondary",onClick:()=>er(!0),disabled:tt,children:"Refresh tokens"})})]})]})]})]}),(0,t.jsxs)(o.Card,{children:[(0,t.jsx)("div",{className:"flex items-center justify-between mb-4",children:(0,t.jsx)("h2",{className:"text-lg font-semibold",children:"Available Models"})}),!!eg&&(0,t.jsx)("p",{className:"text-xs text-red-500 mb-3 break-words",children:eg}),(()=>{let e,i;if(eV)return(0,t.jsx)(I,{providerStorageAlias:eW,providerDisplayAlias:eG,modelAliases:eu,copied:eq,onCopy:eB,onSetAlias:eZ,onDeleteAlias:e0,connections:C,isAnthropic:ez});let a=[...eF,...eD.filter(e=>!eF.some(t=>t.id===e.id))],s=Object.entries(eu).filter(([e,t])=>{let i=`${eW}/`;if(!t.startsWith(i))return!1;let a=t.slice(i.length);return eK.passthroughModels?!eF.some(e=>e.id===a):!eF.some(e=>e.id===a)&&e===a}).map(([e,t])=>({id:t.slice(`${eW}/`.length),alias:e,fullModel:t}));return(0,t.jsxs)("div",{className:"flex flex-wrap gap-3",children:[a.map(e=>{let i=`${eW}/${e.id}`,a=`${c}/${e.id}`,s=Object.entries(eu).find(([,e])=>e===i||e===a)?.[0];return(0,t.jsx)(T,{model:e,fullModel:`${eG}/${e.id}`,alias:s,copied:eq,onCopy:eB,onSetAlias:t=>eZ(e.id,t,eW),onDeleteAlias:()=>e0(s),testStatus:ef[e.id],onTest:C.length>0?()=>tc(e.id):void 0,isTesting:ev===e.id,isFree:e.isFree},e.id)}),s.map(e=>(0,t.jsx)(T,{model:{id:e.id},fullModel:`${eG}/${e.id}`,alias:e.alias,copied:eq,onCopy:eB,onSetAlias:()=>{},onDeleteAlias:()=>e0(e.alias),testStatus:ef[e.id],onTest:C.length>0?()=>tc(e.id):void 0,isTesting:ev===e.id,isCustom:!0},e.id)),(0,t.jsxs)("button",{onClick:()=>ek(!0),className:"flex items-center gap-1.5 px-3 py-2 rounded-lg border border-dashed border-black/15 dark:border-white/15 text-xs text-text-muted hover:text-primary hover:border-primary/40 transition-colors",children:[(0,t.jsx)("span",{className:"material-symbols-outlined text-sm",children:"add"}),"Add Model"]}),eE.length>0&&(e=new Set(Object.values(eu)),0===(i=eE.filter(t=>!e.has(`${eW}/${t.id}`))).length?null:(0,t.jsxs)("div",{className:"w-full mt-2",children:[(0,t.jsx)("p",{className:"text-xs text-text-muted mb-2",children:"Suggested free models (≥200k context):"}),(0,t.jsx)("div",{className:"flex flex-wrap gap-2",children:i.map(e=>(0,t.jsxs)("button",{onClick:async()=>{let t=e.id.split("/").pop();await eZ(e.id,t,eW)},className:"flex items-center gap-1 px-2.5 py-1.5 rounded-lg border border-black/10 dark:border-white/10 text-xs text-text-muted hover:text-primary hover:border-primary/40 hover:bg-primary/5 transition-colors",title:`${e.name} \xb7 ${(e.contextLength/1e3).toFixed(0)}k ctx`,children:[(0,t.jsx)("span",{className:"material-symbols-outlined text-[13px]",children:"add"}),e.id.split("/").pop()]},e.id))})]}))]})})()]}),td,"antigravity"===c&&(0,t.jsx)(p.Modal,{isOpen:es,onClose:ts,title:"Import accounts (refresh tokens)",children:(0,t.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,t.jsxs)("p",{className:"text-sm text-text-muted",children:["Paste one or more Google OAuth refresh tokens. Supported formats: a single token (lines starting with"," ",(0,t.jsx)("code",{className:"text-xs bg-surface-secondary px-1 rounded",children:"1//…"}),"), a JSON array with"," ",(0,t.jsx)("code",{className:"text-xs bg-surface-secondary px-1 rounded",children:"refresh_token"}),", or any text containing"," ",(0,t.jsx)("code",{className:"text-xs bg-surface-secondary px-1 rounded",children:'"refresh_token": "…"'})," ","(values are extracted automatically)."]}),(0,t.jsxs)("div",{className:"space-y-2",children:[(0,t.jsx)("label",{className:"block text-sm font-medium text-text-primary",children:"Refresh tokens"}),(0,t.jsx)("textarea",{value:el,onChange:e=>eo(e.target.value),placeholder:`Paste your refresh token(s) here (batch supported)
|
|
2
|
+
|
|
3
|
+
Example:
|
|
4
|
+
"refresh_token": "example_refresh_token"`,className:"w-full min-h-[160px] px-3 py-2 bg-surface-secondary border border-border rounded-lg text-sm text-text-primary placeholder:text-text-muted/80 focus:outline-none focus:ring-2 focus:ring-primary resize-y font-mono",disabled:ei}),(0,t.jsx)("p",{className:"text-xs text-text-muted",children:"Tip: You can paste multiple tokens or a JSON array to import in batch."})]}),(0,t.jsxs)("div",{className:"flex gap-2",children:[(0,t.jsx)(n.Button,{variant:"secondary",fullWidth:!0,onClick:ts,disabled:ei,children:"Cancel"}),(0,t.jsx)(n.Button,{fullWidth:!0,onClick:ta,disabled:ei||!el.trim(),children:ei?"Importing…":"Import"})]})]})}),"kiro"===c?(0,t.jsx)(m.default,{isOpen:F,providerInfo:eK,onSuccess:e5,onClose:()=>L(!1)}):"cursor"===c?(0,t.jsx)(h.default,{isOpen:F,onSuccess:e5,onClose:()=>L(!1)}):"gitlab"===c?(0,t.jsx)(y.default,{isOpen:F,providerInfo:eK,onSuccess:e5,onClose:()=>L(!1)}):(0,t.jsx)(x.OAuthModal,{isOpen:F,provider:c,providerInfo:eK,onSuccess:e5,onClose:()=>L(!1)}),"iflow"===c&&(0,t.jsx)(f.default,{isOpen:J,onSuccess:()=>{eY(),z(!1)},onClose:()=>z(!1)}),(0,t.jsx)(E,{isOpen:V,provider:c,providerName:eK.name,isCompatible:eV,isAnthropic:ez,proxyPools:K,onSave:e2,onClose:()=>W(!1)}),(0,t.jsx)(_,{isOpen:G,connection:ec,proxyPools:K,onSave:e4,onClose:()=>H(!1)}),eV&&(0,t.jsx)(D,{isOpen:Y,node:q,onSave:eQ,onClose:()=>Q(!1),isAnthropic:ez}),!eV&&(0,t.jsx)(U,{isOpen:eN,providerAlias:eW,providerDisplayAlias:eG,onSave:async e=>{let t=eK?.passthroughModels?e.split("/").pop():e;await eZ(e,t,eW),ek(!1)},onClose:()=>ek(!1)})]}):(0,t.jsxs)("div",{className:"text-center py-20",children:[(0,t.jsx)("p",{className:"text-text-muted",children:"Provider not found"}),(0,t.jsx)(r.default,{href:"/dashboard/providers",className:"text-primary mt-4 inline-block",children:"Back to Providers"})]})}],99165)}]);
|
package/.next/{static/chunks/06l6ck_q1o~m9.js → standalone/.next/static/chunks/16r2wq4pvci67.js}
RENAMED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,20956,e=>{"use strict";var t=e.i(41691);e.s(["ModelSelectModal",()=>t.default])},35918,e=>{"use strict";var t=e.i(55937);e.s(["calculatePercentage",0,function(e,t){return t&&0!==t?!e||e<0?100:e>=t?0:Math.round((t-e)/t*100):0},"formatResetTime",0,function(e){if(!e)return"-";try{let t="string"==typeof e?new Date(e):e,r=new Date,i=t-r;if(i<=0)return"-";let a=Math.ceil(i/6e4);if(a<60)return`${a}m`;let n=Math.floor(a/60),o=a%60;if(n<24)return`${n}h ${o}m`;let s=Math.floor(n/24);return`${s}d ${n%24}h ${o}m`}catch(e){return"-"}},"parseQuotaData",0,function(e,r){if(!r||"object"!=typeof r)return[];let i=[];try{switch(e.toLowerCase()){case"github":default:r.quotas&&Object.entries(r.quotas).forEach(([e,t])=>{i.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null})});break;case"antigravity":r.quotas&&Object.entries(r.quotas).forEach(([e,t])=>{i.push({name:t.displayName||e,modelKey:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null,remainingPercentage:t.remainingPercentage})});break;case"codex":r.quotas&&Object.entries(r.quotas).forEach(([e,t])=>{i.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null})});break;case"kiro":r.quotas&&Object.entries(r.quotas).forEach(([e,t])=>{i.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null})});break;case"claude":r.message?i.push({name:"error",used:0,total:0,resetAt:null,message:r.message}):r.quotas&&Object.entries(r.quotas).forEach(([e,t])=>{i.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null})})}}catch(t){return console.error(`Error parsing quota data for ${e}:`,t),[]}let a=(0,t.getModelsByProviderId)(e);if(a.length>0){let e=new Map(a.map((e,t)=>[e.id,t]));i.sort((t,r)=>{let i=t.modelKey||t.name,a=r.modelKey||r.name;return(e.get(i)??999)-(e.get(a)??999)})}return i}])},96521,e=>{"use strict";var t=e.i(10092);e.s(["Card",()=>t.default])},75634,e=>{"use strict";var t=e.i(88577);e.s(["Toggle",()=>t.default])},51916,e=>{"use strict";var t=e.i(64920);e.s(["Badge",()=>t.default])},88143,(e,t,r)=>{"use strict";function i({widthInt:e,heightInt:t,blurWidth:r,blurHeight:a,blurDataURL:n,objectFit:o}){let s=r?40*r:e,l=a?40*a:t,u=s&&l?`viewBox='0 0 ${s} ${l}'`:"";return`%3Csvg xmlns='http://www.w3.org/2000/svg' ${u}%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeColorMatrix values='1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 100 -1' result='s'/%3E%3CfeFlood x='0' y='0' width='100%25' height='100%25'/%3E%3CfeComposite operator='out' in='s'/%3E%3CfeComposite in2='SourceGraphic'/%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3C/filter%3E%3Cimage width='100%25' height='100%25' x='0' y='0' preserveAspectRatio='${u?"none":"contain"===o?"xMidYMid":"cover"===o?"xMidYMid slice":"none"}' style='filter: url(%23b);' href='${n}'/%3E%3C/svg%3E`}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"getImageBlurSvg",{enumerable:!0,get:function(){return i}})},87690,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var i={VALID_LOADERS:function(){return n},imageConfigDefault:function(){return o}};for(var a in i)Object.defineProperty(r,a,{enumerable:!0,get:i[a]});let n=["default","imgix","cloudinary","akamai","custom"],o={deviceSizes:[640,750,828,1080,1200,1920,2048,3840],imageSizes:[32,48,64,96,128,256,384],path:"/_next/image",loader:"default",loaderFile:"",domains:[],disableStaticImages:!1,minimumCacheTTL:14400,formats:["image/webp"],maximumDiskCacheSize:void 0,maximumRedirects:3,maximumResponseBody:5e7,dangerouslyAllowLocalIP:!1,dangerouslyAllowSVG:!1,contentSecurityPolicy:"script-src 'none'; frame-src 'none'; sandbox;",contentDispositionType:"attachment",localPatterns:void 0,remotePatterns:[],qualities:[75],unoptimized:!1,customCacheHandler:!1}},8927,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"getImgProps",{enumerable:!0,get:function(){return u}}),e.r(33525);let i=e.r(43369),a=e.r(88143),n=e.r(87690),o=["-moz-initial","fill","none","scale-down",void 0];function s(e){return void 0!==e.default}function l(e){return void 0===e?e:"number"==typeof e?Number.isFinite(e)?e:NaN:"string"==typeof e&&/^[0-9]+$/.test(e)?parseInt(e,10):NaN}function u({src:e,sizes:t,unoptimized:r=!1,priority:d=!1,preload:c=!1,loading:f,className:p,quality:g,width:m,height:h,fill:b=!1,style:v,overrideSrc:y,onLoad:w,onLoadingComplete:_,placeholder:j="empty",blurDataURL:P,fetchPriority:x,decoding:S="async",layout:E,objectFit:O,objectPosition:C,lazyBoundary:R,lazyRoot:M,...I},A){var $;let k,z,D,{imgConf:T,showAltText:q,blurComplete:N,defaultLoader:L}=A,U=T||n.imageConfigDefault;if("allSizes"in U)k=U;else{let e=[...U.deviceSizes,...U.imageSizes].sort((e,t)=>e-t),t=U.deviceSizes.sort((e,t)=>e-t),r=U.qualities?.sort((e,t)=>e-t);k={...U,allSizes:e,deviceSizes:t,qualities:r}}if(void 0===L)throw Object.defineProperty(Error("images.loaderFile detected but the file is missing default export.\nRead more: https://nextjs.org/docs/messages/invalid-images-config"),"__NEXT_ERROR_CODE",{value:"E163",enumerable:!1,configurable:!0});let B=I.loader||L;delete I.loader,delete I.srcSet;let F="__next_img_default"in B;if(F){if("custom"===k.loader)throw Object.defineProperty(Error(`Image with src "${e}" is missing "loader" prop.
|
|
1
|
+
(globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,20956,e=>{"use strict";var t=e.i(41691);e.s(["ModelSelectModal",()=>t.default])},35918,e=>{"use strict";var t=e.i(55937);e.s(["calculatePercentage",0,function(e,t){return t&&0!==t?!e||e<0?100:e>=t?0:Math.round((t-e)/t*100):0},"formatResetTime",0,function(e){if(!e)return"-";try{let t="string"==typeof e?new Date(e):e,r=new Date,i=t-r;if(i<=0)return"-";let a=Math.ceil(i/6e4);if(a<60)return`${a}m`;let n=Math.floor(a/60),o=a%60;if(n<24)return`${n}h ${o}m`;let s=Math.floor(n/24);return`${s}d ${n%24}h ${o}m`}catch(e){return"-"}},"parseQuotaData",0,function(e,r){if(!r||"object"!=typeof r)return[];let i=[];try{switch(e.toLowerCase()){case"github":default:r.quotas&&Object.entries(r.quotas).forEach(([e,t])=>{i.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null})});break;case"antigravity":r.quotas&&Object.entries(r.quotas).forEach(([e,t])=>{i.push({name:t.displayName||e,modelKey:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null,remainingPercentage:t.remainingPercentage})});break;case"codex":r.quotas&&Object.entries(r.quotas).forEach(([e,t])=>{i.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null})});break;case"kiro":r.quotas&&Object.entries(r.quotas).forEach(([e,t])=>{i.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null})});break;case"claude":r.message?i.push({name:"error",used:0,total:0,resetAt:null,message:r.message}):r.quotas&&Object.entries(r.quotas).forEach(([e,t])=>{i.push({name:e,used:t.used||0,total:t.total||0,resetAt:t.resetAt||null})})}}catch(t){return console.error(`Error parsing quota data for ${e}:`,t),[]}let a=(0,t.getModelsByProviderId)(e);if(a.length>0){let e=new Map(a.map((e,t)=>[e.id,t]));i.sort((t,r)=>{let i=t.modelKey||t.name,a=r.modelKey||r.name;return(e.get(i)??999)-(e.get(a)??999)})}return i}])},96521,e=>{"use strict";var t=e.i(10092);e.s(["Card",()=>t.default])},75634,e=>{"use strict";var t=e.i(88577);e.s(["Toggle",()=>t.default])},51916,e=>{"use strict";var t=e.i(64920);e.s(["Badge",()=>t.default])},55849,e=>{"use strict";var t=e.i(12720);e.s(["Tooltip",()=>t.default])},88143,(e,t,r)=>{"use strict";function i({widthInt:e,heightInt:t,blurWidth:r,blurHeight:a,blurDataURL:n,objectFit:o}){let s=r?40*r:e,l=a?40*a:t,u=s&&l?`viewBox='0 0 ${s} ${l}'`:"";return`%3Csvg xmlns='http://www.w3.org/2000/svg' ${u}%3E%3Cfilter id='b' color-interpolation-filters='sRGB'%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3CfeColorMatrix values='1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 100 -1' result='s'/%3E%3CfeFlood x='0' y='0' width='100%25' height='100%25'/%3E%3CfeComposite operator='out' in='s'/%3E%3CfeComposite in2='SourceGraphic'/%3E%3CfeGaussianBlur stdDeviation='20'/%3E%3C/filter%3E%3Cimage width='100%25' height='100%25' x='0' y='0' preserveAspectRatio='${u?"none":"contain"===o?"xMidYMid":"cover"===o?"xMidYMid slice":"none"}' style='filter: url(%23b);' href='${n}'/%3E%3C/svg%3E`}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"getImageBlurSvg",{enumerable:!0,get:function(){return i}})},87690,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var i={VALID_LOADERS:function(){return n},imageConfigDefault:function(){return o}};for(var a in i)Object.defineProperty(r,a,{enumerable:!0,get:i[a]});let n=["default","imgix","cloudinary","akamai","custom"],o={deviceSizes:[640,750,828,1080,1200,1920,2048,3840],imageSizes:[32,48,64,96,128,256,384],path:"/_next/image",loader:"default",loaderFile:"",domains:[],disableStaticImages:!1,minimumCacheTTL:14400,formats:["image/webp"],maximumDiskCacheSize:void 0,maximumRedirects:3,maximumResponseBody:5e7,dangerouslyAllowLocalIP:!1,dangerouslyAllowSVG:!1,contentSecurityPolicy:"script-src 'none'; frame-src 'none'; sandbox;",contentDispositionType:"attachment",localPatterns:void 0,remotePatterns:[],qualities:[75],unoptimized:!1,customCacheHandler:!1}},8927,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"getImgProps",{enumerable:!0,get:function(){return u}}),e.r(33525);let i=e.r(43369),a=e.r(88143),n=e.r(87690),o=["-moz-initial","fill","none","scale-down",void 0];function s(e){return void 0!==e.default}function l(e){return void 0===e?e:"number"==typeof e?Number.isFinite(e)?e:NaN:"string"==typeof e&&/^[0-9]+$/.test(e)?parseInt(e,10):NaN}function u({src:e,sizes:t,unoptimized:r=!1,priority:d=!1,preload:c=!1,loading:f,className:p,quality:g,width:m,height:h,fill:b=!1,style:v,overrideSrc:y,onLoad:w,onLoadingComplete:_,placeholder:j="empty",blurDataURL:P,fetchPriority:x,decoding:S="async",layout:E,objectFit:O,objectPosition:C,lazyBoundary:R,lazyRoot:M,...I},A){var $;let k,z,D,{imgConf:T,showAltText:q,blurComplete:N,defaultLoader:L}=A,U=T||n.imageConfigDefault;if("allSizes"in U)k=U;else{let e=[...U.deviceSizes,...U.imageSizes].sort((e,t)=>e-t),t=U.deviceSizes.sort((e,t)=>e-t),r=U.qualities?.sort((e,t)=>e-t);k={...U,allSizes:e,deviceSizes:t,qualities:r}}if(void 0===L)throw Object.defineProperty(Error("images.loaderFile detected but the file is missing default export.\nRead more: https://nextjs.org/docs/messages/invalid-images-config"),"__NEXT_ERROR_CODE",{value:"E163",enumerable:!1,configurable:!0});let B=I.loader||L;delete I.loader,delete I.srcSet;let F="__next_img_default"in B;if(F){if("custom"===k.loader)throw Object.defineProperty(Error(`Image with src "${e}" is missing "loader" prop.
|
|
2
2
|
Read more: https://nextjs.org/docs/messages/next-image-missing-loader`),"__NEXT_ERROR_CODE",{value:"E252",enumerable:!1,configurable:!0})}else{let e=B;B=t=>{let{config:r,...i}=t;return e(i)}}if(E){"fill"===E&&(b=!0);let e={intrinsic:{maxWidth:"100%",height:"auto"},responsive:{width:"100%",height:"auto"}}[E];e&&(v={...v,...e});let r={responsive:"100vw",fill:"100vw"}[E];r&&!t&&(t=r)}let W="",G=l(m),V=l(h);if(($=e)&&"object"==typeof $&&(s($)||void 0!==$.src)){let t=s(e)?e.default:e;if(!t.src)throw Object.defineProperty(Error(`An object should only be passed to the image component src parameter if it comes from a static image import. It must include src. Received ${JSON.stringify(t)}`),"__NEXT_ERROR_CODE",{value:"E460",enumerable:!1,configurable:!0});if(!t.height||!t.width)throw Object.defineProperty(Error(`An object should only be passed to the image component src parameter if it comes from a static image import. It must include height and width. Received ${JSON.stringify(t)}`),"__NEXT_ERROR_CODE",{value:"E48",enumerable:!1,configurable:!0});if(z=t.blurWidth,D=t.blurHeight,P=P||t.blurDataURL,W=t.src,!b)if(G||V){if(G&&!V){let e=G/t.width;V=Math.round(t.height*e)}else if(!G&&V){let e=V/t.height;G=Math.round(t.width*e)}}else G=t.width,V=t.height}let X=!d&&!c&&("lazy"===f||void 0===f);(!(e="string"==typeof e?e:W)||e.startsWith("data:")||e.startsWith("blob:"))&&(r=!0,X=!1),k.unoptimized&&(r=!0),F&&!k.dangerouslyAllowSVG&&e.split("?",1)[0].endsWith(".svg")&&(r=!0);let H=l(g),K=Object.assign(b?{position:"absolute",height:"100%",width:"100%",left:0,top:0,right:0,bottom:0,objectFit:O,objectPosition:C}:{},q?{}:{color:"transparent"},v),Q=N||"empty"===j?null:"blur"===j?`url("data:image/svg+xml;charset=utf-8,${(0,a.getImageBlurSvg)({widthInt:G,heightInt:V,blurWidth:z,blurHeight:D,blurDataURL:P||"",objectFit:K.objectFit})}")`:`url("${j}")`,J=o.includes(K.objectFit)?"fill"===K.objectFit?"100% 100%":"cover":K.objectFit,Y=Q?{backgroundSize:J,backgroundPosition:K.objectPosition||"50% 50%",backgroundRepeat:"no-repeat",backgroundImage:Q}:{},Z=function({config:e,src:t,unoptimized:r,width:a,quality:n,sizes:o,loader:s}){if(r){if(t.startsWith("/")&&!t.startsWith("//")){let e=(0,i.getDeploymentId)();if(e){let r=t.indexOf("?");if(-1!==r){let i=new URLSearchParams(t.slice(r+1));i.get("dpl")||(i.append("dpl",e),t=t.slice(0,r)+"?"+i.toString())}else t+=`?dpl=${e}`}}return{src:t,srcSet:void 0,sizes:void 0}}let{widths:l,kind:u}=function({deviceSizes:e,allSizes:t},r,i){if(i){let r=/(^|\s)(1?\d?\d)vw/g,a=[];for(let e;e=r.exec(i);)a.push(parseInt(e[2]));if(a.length){let r=.01*Math.min(...a);return{widths:t.filter(t=>t>=e[0]*r),kind:"w"}}return{widths:t,kind:"w"}}return"number"!=typeof r?{widths:e,kind:"w"}:{widths:[...new Set([r,2*r].map(e=>t.find(t=>t>=e)||t[t.length-1]))],kind:"x"}}(e,a,o),d=l.length-1;return{sizes:o||"w"!==u?o:"100vw",srcSet:l.map((r,i)=>`${s({config:e,src:t,quality:n,width:r})} ${"w"===u?r:i+1}${u}`).join(", "),src:s({config:e,src:t,quality:n,width:l[d]})}}({config:k,src:e,unoptimized:r,width:G,quality:H,sizes:t,loader:B}),ee=X?"lazy":f;return{props:{...I,loading:ee,fetchPriority:x,width:G,height:V,decoding:S,className:p,style:{...K,...Y},sizes:Z.sizes,srcSet:Z.srcSet,src:y||Z.src},meta:{unoptimized:r,preload:c||d,placeholder:j,fill:b}}}},98879,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"default",{enumerable:!0,get:function(){return s}});let i=e.r(71645),a="u"<typeof window,n=a?()=>{}:i.useLayoutEffect,o=a?()=>{}:i.useEffect;function s(e){let{headManager:t,reduceComponentsToState:r}=e;function s(){if(t&&t.mountedInstances){let e=i.Children.toArray(Array.from(t.mountedInstances).filter(Boolean));t.updateHead(r(e))}}return a&&(t?.mountedInstances?.add(e.children),s()),n(()=>(t?.mountedInstances?.add(e.children),()=>{t?.mountedInstances?.delete(e.children)})),n(()=>(t&&(t._pendingUpdate=s),()=>{t&&(t._pendingUpdate=s)})),o(()=>(t&&t._pendingUpdate&&(t._pendingUpdate(),t._pendingUpdate=null),()=>{t&&t._pendingUpdate&&(t._pendingUpdate(),t._pendingUpdate=null)})),null}},25633,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var i={default:function(){return m},defaultHead:function(){return c}};for(var a in i)Object.defineProperty(r,a,{enumerable:!0,get:i[a]});let n=e.r(55682),o=e.r(90809),s=e.r(43476),l=o._(e.r(71645)),u=n._(e.r(98879)),d=e.r(42732);function c(){return[(0,s.jsx)("meta",{charSet:"utf-8"},"charset"),(0,s.jsx)("meta",{name:"viewport",content:"width=device-width"},"viewport")]}function f(e,t){return"string"==typeof t||"number"==typeof t?e:t.type===l.default.Fragment?e.concat(l.default.Children.toArray(t.props.children).reduce((e,t)=>"string"==typeof t||"number"==typeof t?e:e.concat(t),[])):e.concat(t)}e.r(33525);let p=["name","httpEquiv","charSet","itemProp"];function g(e){let t,r,i,a;return e.reduce(f,[]).reverse().concat(c().reverse()).filter((t=new Set,r=new Set,i=new Set,a={},e=>{let n=!0,o=!1;if(e.key&&"number"!=typeof e.key&&e.key.indexOf("$")>0){o=!0;let r=e.key.slice(e.key.indexOf("$")+1);t.has(r)?n=!1:t.add(r)}switch(e.type){case"title":case"base":r.has(e.type)?n=!1:r.add(e.type);break;case"meta":for(let t=0,r=p.length;t<r;t++){let r=p[t];if(e.props.hasOwnProperty(r))if("charSet"===r)i.has(r)?n=!1:i.add(r);else{let t=e.props[r],i=a[r]||new Set;("name"!==r||!o)&&i.has(t)?n=!1:(i.add(t),a[r]=i)}}}return n})).reverse().map((e,t)=>{let r=e.key||t;return l.default.cloneElement(e,{key:r})})}let m=function({children:e}){let t=(0,l.useContext)(d.HeadManagerContext);return(0,s.jsx)(u.default,{reduceComponentsToState:g,headManager:t,children:e})};("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},18556,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"ImageConfigContext",{enumerable:!0,get:function(){return n}});let i=e.r(55682)._(e.r(71645)),a=e.r(87690),n=i.default.createContext(a.imageConfigDefault)},65856,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"RouterContext",{enumerable:!0,get:function(){return i}});let i=e.r(55682)._(e.r(71645)).default.createContext(null)},70965,(e,t,r)=>{"use strict";function i(e,t){let r=e||75;return t?.qualities?.length?t.qualities.reduce((e,t)=>Math.abs(t-r)<Math.abs(e-r)?t:e,t.qualities[0]):r}Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"findClosestQuality",{enumerable:!0,get:function(){return i}})},1948,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"default",{enumerable:!0,get:function(){return o}});let i=e.r(70965),a=e.r(43369);function n({config:e,src:t,width:r,quality:o}){let s=(0,a.getDeploymentId)();if(t.startsWith("/")&&!t.startsWith("//")){let e=t.indexOf("?");if(-1!==e){let r=new URLSearchParams(t.slice(e+1)),i=r.get("dpl");if(i){s=i,r.delete("dpl");let a=r.toString();t=t.slice(0,e)+(a?"?"+a:"")}}}if(t.startsWith("/")&&t.includes("?")&&e.localPatterns?.length===1&&"**"===e.localPatterns[0].pathname&&""===e.localPatterns[0].search)throw Object.defineProperty(Error(`Image with src "${t}" is using a query string which is not configured in images.localPatterns.
|
|
3
3
|
Read more: https://nextjs.org/docs/messages/next-image-unconfigured-localpatterns`),"__NEXT_ERROR_CODE",{value:"E871",enumerable:!1,configurable:!0});let l=(0,i.findClosestQuality)(o,e);return`${e.path}?url=${encodeURIComponent(t)}&w=${r}&q=${l}${t.startsWith("/")&&s?`&dpl=${s}`:""}`}n.__next_img_default=!0;let o=n},5500,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0}),Object.defineProperty(r,"Image",{enumerable:!0,get:function(){return w}});let i=e.r(55682),a=e.r(90809),n=e.r(43476),o=a._(e.r(71645)),s=i._(e.r(74080)),l=i._(e.r(25633)),u=e.r(8927),d=e.r(87690),c=e.r(18556);e.r(33525);let f=e.r(65856),p=i._(e.r(1948)),g=e.r(18581),m={deviceSizes:[640,750,828,1080,1200,1920,2048,3840],imageSizes:[32,48,64,96,128,256,384],qualities:[75],path:"/_next/image",loader:"default",dangerouslyAllowSVG:!1,unoptimized:!0};function h(e,t,r,i,a,n,o){let s=e?.src;e&&e["data-loaded-src"]!==s&&(e["data-loaded-src"]=s,("decode"in e?e.decode():Promise.resolve()).catch(()=>{}).then(()=>{if(e.parentElement&&e.isConnected){if("empty"!==t&&a(!0),r?.current){let t=new Event("load");Object.defineProperty(t,"target",{writable:!1,value:e});let i=!1,a=!1;r.current({...t,nativeEvent:t,currentTarget:e,target:e,isDefaultPrevented:()=>i,isPropagationStopped:()=>a,persist:()=>{},preventDefault:()=>{i=!0,t.preventDefault()},stopPropagation:()=>{a=!0,t.stopPropagation()}})}i?.current&&i.current(e)}}))}function b(e){return o.use?{fetchPriority:e}:{fetchpriority:e}}"u"<typeof window&&(globalThis.__NEXT_IMAGE_IMPORTED=!0);let v=(0,o.forwardRef)(({src:e,srcSet:t,sizes:r,height:i,width:a,decoding:s,className:l,style:u,fetchPriority:d,placeholder:c,loading:f,unoptimized:p,fill:m,onLoadRef:v,onLoadingCompleteRef:y,setBlurComplete:w,setShowAltText:_,sizesInput:j,onLoad:P,onError:x,...S},E)=>{let O=(0,o.useCallback)(e=>{e&&(x&&(e.src=e.src),e.complete&&h(e,c,v,y,w,p,j))},[e,c,v,y,w,x,p,j]),C=(0,g.useMergedRef)(E,O);return(0,n.jsx)("img",{...S,...b(d),loading:f,width:a,height:i,decoding:s,"data-nimg":m?"fill":"1",className:l,style:u,sizes:r,srcSet:t,src:e,ref:C,onLoad:e=>{h(e.currentTarget,c,v,y,w,p,j)},onError:e=>{_(!0),"empty"!==c&&w(!0),x&&x(e)}})});function y({isAppRouter:e,imgAttributes:t}){let r={as:"image",imageSrcSet:t.srcSet,imageSizes:t.sizes,crossOrigin:t.crossOrigin,referrerPolicy:t.referrerPolicy,...b(t.fetchPriority)};return e&&s.default.preload?(s.default.preload(t.src,r),null):(0,n.jsx)(l.default,{children:(0,n.jsx)("link",{rel:"preload",href:t.srcSet?void 0:t.src,...r},"__nimg-"+t.src+t.srcSet+t.sizes)})}let w=(0,o.forwardRef)((e,t)=>{let r=(0,o.useContext)(f.RouterContext),i=(0,o.useContext)(c.ImageConfigContext),a=(0,o.useMemo)(()=>{let e=m||i||d.imageConfigDefault,t=[...e.deviceSizes,...e.imageSizes].sort((e,t)=>e-t),r=e.deviceSizes.sort((e,t)=>e-t),a=e.qualities?.sort((e,t)=>e-t);return{...e,allSizes:t,deviceSizes:r,qualities:a,localPatterns:"u"<typeof window?i?.localPatterns:e.localPatterns}},[i]),{onLoad:s,onLoadingComplete:l}=e,g=(0,o.useRef)(s);(0,o.useEffect)(()=>{g.current=s},[s]);let h=(0,o.useRef)(l);(0,o.useEffect)(()=>{h.current=l},[l]);let[b,w]=(0,o.useState)(!1),[_,j]=(0,o.useState)(!1),{props:P,meta:x}=(0,u.getImgProps)(e,{defaultLoader:p.default,imgConf:a,blurComplete:b,showAltText:_});return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(v,{...P,unoptimized:x.unoptimized,placeholder:x.placeholder,fill:x.fill,onLoadRef:g,onLoadingCompleteRef:h,setBlurComplete:w,setShowAltText:j,sizesInput:e.sizes,ref:t}),x.preload?(0,n.jsx)(y,{isAppRouter:!r,imgAttributes:P}):null]})});("function"==typeof r.default||"object"==typeof r.default&&null!==r.default)&&void 0===r.default.__esModule&&(Object.defineProperty(r.default,"__esModule",{value:!0}),Object.assign(r.default,r),t.exports=r.default)},94909,(e,t,r)=>{"use strict";Object.defineProperty(r,"__esModule",{value:!0});var i={default:function(){return d},getImageProps:function(){return u}};for(var a in i)Object.defineProperty(r,a,{enumerable:!0,get:i[a]});let n=e.r(55682),o=e.r(8927),s=e.r(5500),l=n._(e.r(1948));function u(e){let{props:t}=(0,o.getImgProps)(e,{defaultLoader:l.default,imgConf:{deviceSizes:[640,750,828,1080,1200,1920,2048,3840],imageSizes:[32,48,64,96,128,256,384],qualities:[75],path:"/_next/image",loader:"default",dangerouslyAllowSVG:!1,unoptimized:!0}});for(let[e,r]of Object.entries(t))void 0===r&&delete t[e];return{props:t}}let d=s.Image},57688,(e,t,r)=>{t.exports=e.r(94909)},18312,e=>{"use strict";e.i(47167);var t=e.i(43476),r=e.i(71645);e.i(38730);var i=e.i(50832),a=e.i(66104);e.i(4565);var n=e.i(55937);e.i(83806);var o=e.i(10215),o=o,s=e.i(63750),s=s,l=e.i(52816),l=l,u=e.i(81446),u=u,d=e.i(38512),d=d,c=e.i(22634),c=c;let f="https://9router.com",p={claude:"/api/cli-tools/claude-settings",codex:"/api/cli-tools/codex-settings",opencode:"/api/cli-tools/opencode-settings",droid:"/api/cli-tools/droid-settings",openclaw:"/api/cli-tools/openclaw-settings"};e.s(["default",0,function({machineId:e}){let g,m,h,[b,v]=(0,r.useState)([]),[y,w]=(0,r.useState)(!0),[_,j]=(0,r.useState)(null),[P,x]=(0,r.useState)({}),[S,E]=(0,r.useState)(!1),[O,C]=(0,r.useState)(!1),[R,M]=(0,r.useState)(""),[I,A]=(0,r.useState)([]),[$,k]=(0,r.useState)({});(0,r.useEffect)(()=>{q(),D(),T(),z()},[]);let z=async()=>{try{let e=await Promise.all(Object.entries(p).map(async([e,t])=>{try{let r=await fetch(t),i=await r.json();return[e,i]}catch{return[e,null]}}));k(Object.fromEntries(e))}catch(e){console.log("Error fetching tool statuses:",e)}},D=async()=>{try{let[e,t]=await Promise.all([fetch("/api/settings"),fetch("/api/tunnel/status")]);if(e.ok){let t=await e.json();E(t.cloudEnabled||!1)}if(t.ok){let e=await t.json();C(e.enabled||!1),M(e.publicUrl||"")}}catch(e){console.log("Error loading settings:",e)}},T=async()=>{try{let e=await fetch("/api/keys");if(e.ok){let t=await e.json();A(t.keys||[])}}catch(e){console.log("Error fetching API keys:",e)}},q=async()=>{try{let e=await fetch("/api/providers"),t=await e.json();e.ok&&v(t.connections||[])}catch(e){console.log("Error fetching connections:",e)}finally{w(!1)}},N=()=>b.filter(e=>!1!==e.isActive),L=(0,r.useCallback)((e,t,r)=>{x(i=>i[e]?.[t]===r?i:{...i,[e]:{...i[e],[t]:r}})},[]);if(y)return(0,t.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,t.jsx)(i.CardSkeleton,{}),(0,t.jsx)(i.CardSkeleton,{}),(0,t.jsx)(i.CardSkeleton,{})]});let U=(g=N(),m=[],h=new Set,g.forEach(e=>{let t=n.PROVIDER_ID_TO_ALIAS[e.provider]||e.provider;(0,n.getModelsByProviderId)(e.provider).forEach(r=>{let i=`${t}/${r.id}`;h.has(i)||(h.add(i),m.push({value:i,label:`${t}/${r.id}`,provider:e.provider,alias:t,connectionName:e.name,modelId:r.id}))})}),m).length>0,B=Object.entries(a.CLI_TOOLS);return(0,t.jsx)("div",{className:"flex flex-col gap-6",children:(0,t.jsx)("div",{className:"flex flex-col gap-4",children:B.map(([e,r])=>((e,r)=>{let i={tool:r,isExpanded:_===e,onToggle:()=>j(_===e?null:e),baseUrl:O&&R?R:S&&f?f:window.location.origin,apiKeys:I};switch(e){case"claude":return(0,t.jsx)(o.default,{...i,activeProviders:N(),modelMappings:P[e]||{},onModelMappingChange:(t,r)=>L(e,t,r),hasActiveProviders:U,cloudEnabled:S,initialStatus:$.claude},e);case"codex":return(0,t.jsx)(s.default,{...i,activeProviders:N(),cloudEnabled:S,initialStatus:$.codex},e);case"opencode":return(0,t.jsx)(c.default,{...i,activeProviders:N(),cloudEnabled:S,initialStatus:$.opencode},e);case"droid":return(0,t.jsx)(l.default,{...i,activeProviders:N(),hasActiveProviders:U,cloudEnabled:S,initialStatus:$.droid},e);case"openclaw":return(0,t.jsx)(u.default,{...i,activeProviders:N(),hasActiveProviders:U,cloudEnabled:S,initialStatus:$.openclaw},e);default:return(0,t.jsx)(d.default,{toolId:e,...i,activeProviders:N(),cloudEnabled:S,tunnelEnabled:O},e)}})(e,r))})})}],18312)}]);
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# AGENTS.md
|
|
2
|
+
|
|
3
|
+
This file provides guidance to Codex (Codex.ai/code) when working with code in this repository.
|
|
4
|
+
|
|
5
|
+
## Project Overview
|
|
6
|
+
|
|
7
|
+
9Router is a self-hosted AI routing gateway built on Next.js 16 + React 19. It acts as a local proxy between AI coding tools (Codex, Cursor, Codex, Gemini CLI, etc.) and 40+ upstream AI providers. It provides format translation (OpenAI <-> Codex <-> Gemini <-> etc.), multi-account fallback, quota tracking, and usage monitoring. The app exposes an OpenAI-compatible endpoint at `/v1/*` and a web dashboard at `/dashboard`.
|
|
8
|
+
|
|
9
|
+
## Common Commands
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
# Development
|
|
13
|
+
cp .env.example .env # first time only
|
|
14
|
+
npm install
|
|
15
|
+
PORT=20128 NEXT_PUBLIC_BASE_URL=http://localhost:20128 npm run dev
|
|
16
|
+
|
|
17
|
+
# Production build
|
|
18
|
+
npm run build
|
|
19
|
+
PORT=20128 HOSTNAME=0.0.0.0 NEXT_PUBLIC_BASE_URL=http://localhost:20128 npm run start
|
|
20
|
+
|
|
21
|
+
# Bun alternative
|
|
22
|
+
npm run dev:bun
|
|
23
|
+
npm run build:bun
|
|
24
|
+
npm run start:bun
|
|
25
|
+
|
|
26
|
+
# Linting
|
|
27
|
+
npx eslint .
|
|
28
|
+
|
|
29
|
+
# Tests (Vitest must be installed separately in /tmp)
|
|
30
|
+
cd /tmp && npm install vitest # one-time setup
|
|
31
|
+
cd tests/ && npm test # run all tests
|
|
32
|
+
|
|
33
|
+
# Run a single test file
|
|
34
|
+
cd tests/ && NODE_PATH=/tmp/node_modules /tmp/node_modules/.bin/vitest run unit/embeddingsCore.test.js --reporter=verbose
|
|
35
|
+
|
|
36
|
+
# Docker
|
|
37
|
+
docker build -t 9router .
|
|
38
|
+
docker run -d --name 9router -p 20128:20128 --env-file .env -v 9router-data:/app/data 9router
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Architecture
|
|
42
|
+
|
|
43
|
+
### Two-Layer Routing Core
|
|
44
|
+
|
|
45
|
+
The system has a split routing architecture:
|
|
46
|
+
|
|
47
|
+
- **`src/sse/`** — App-level SSE handlers. Entry point is `src/sse/handlers/chat.js`. Handles model/combo resolution, credential selection, and delegates to the core.
|
|
48
|
+
- **`open-sse/`** — Shared, provider-agnostic routing engine (publishable as a separate package). Contains the core chat orchestration (`handlers/chatCore.js`), provider executors, format translators, and stream utilities.
|
|
49
|
+
|
|
50
|
+
Request flow: `API route → src/sse/handlers/chat.js → open-sse/handlers/chatCore.js → executor → upstream provider → response translator → client`
|
|
51
|
+
|
|
52
|
+
### Path Aliases
|
|
53
|
+
|
|
54
|
+
Defined in `jsconfig.json`:
|
|
55
|
+
- `@/*` → `./src/*`
|
|
56
|
+
- `open-sse` / `open-sse/*` → `./open-sse/*`
|
|
57
|
+
|
|
58
|
+
### API Routes (`src/app/api/`)
|
|
59
|
+
|
|
60
|
+
Two categories of API routes:
|
|
61
|
+
|
|
62
|
+
1. **Compatibility APIs** (consumed by CLI tools):
|
|
63
|
+
- `/v1/chat/completions` — OpenAI-format chat (main entry point)
|
|
64
|
+
- `/v1/messages` — Anthropic Codex format
|
|
65
|
+
- `/v1/responses` — OpenAI Responses API format
|
|
66
|
+
- `/v1/embeddings`, `/v1/models`, `/v1beta/models`
|
|
67
|
+
- URL rewrites in `next.config.mjs` map `/v1/*` → `/api/v1/*`
|
|
68
|
+
|
|
69
|
+
2. **Management APIs** (consumed by the dashboard):
|
|
70
|
+
- `/api/providers*`, `/api/provider-nodes*` — provider CRUD
|
|
71
|
+
- `/api/oauth/*` — OAuth flows for provider connections
|
|
72
|
+
- `/api/keys*`, `/api/combos*`, `/api/models/alias` — API keys, model combos, aliases
|
|
73
|
+
- `/api/settings/*`, `/api/auth/*`, `/api/usage/*`, `/api/sync/*`
|
|
74
|
+
|
|
75
|
+
### Format Translation System (`open-sse/translator/`)
|
|
76
|
+
|
|
77
|
+
Translates between provider-specific formats. Source format is auto-detected from the request endpoint and body shape (see `formats.js`). Supported formats: `openai`, `openai-responses`, `Codex`, `gemini`, `vertex`, `codex`, `antigravity`, `kiro`, `cursor`, `ollama`.
|
|
78
|
+
|
|
79
|
+
- `translator/request/` — Inbound translation (e.g., `openai-to-Codex.js`)
|
|
80
|
+
- `translator/response/` — Outbound translation (e.g., `Codex-to-openai.js`)
|
|
81
|
+
|
|
82
|
+
### Provider Executors (`open-sse/executors/`)
|
|
83
|
+
|
|
84
|
+
Each executor handles a specific provider's auth, API endpoint construction, and credential refresh. Examples: `codex.js`, `cursor.js`, `gemini-cli.js`, `kiro.js`, `iflow.js`, `antigravity.js`, `vertex.js`. The `default.js` executor handles standard OpenAI-compatible providers.
|
|
85
|
+
|
|
86
|
+
### Combo + Account Fallback
|
|
87
|
+
|
|
88
|
+
- **Combos**: Named sequences of models tried in order (e.g., subscription → cheap → free)
|
|
89
|
+
- **Account fallback**: Multiple accounts per provider, round-robin with cooldown on failure
|
|
90
|
+
- Logic in `open-sse/services/accountFallback.js` and `src/sse/handlers/chat.js` (combo orchestration)
|
|
91
|
+
|
|
92
|
+
### Persistence
|
|
93
|
+
|
|
94
|
+
- **State DB**: `src/lib/localDb.js` → `${DATA_DIR}/db.json` (or `~/.n9router/db.json`). Uses lowdb. Stores provider connections, nodes, aliases, combos, API keys, settings, pricing.
|
|
95
|
+
- **Usage DB**: `src/lib/usageDb.js` → `~/.n9router/usage.json` + `~/.n9router/log.txt`. Independent from `DATA_DIR`.
|
|
96
|
+
|
|
97
|
+
### Frontend
|
|
98
|
+
|
|
99
|
+
- Next.js App Router with dashboard pages under `src/app/(dashboard)/dashboard/`
|
|
100
|
+
- Zustand stores in `src/store/` (providerStore, userStore, themeStore, notificationStore)
|
|
101
|
+
- UI components in `src/shared/components/`
|
|
102
|
+
- Tailwind CSS v4 via PostCSS plugin
|
|
103
|
+
|
|
104
|
+
### MITM Proxy (`src/mitm/`)
|
|
105
|
+
|
|
106
|
+
Separate child process for intercepting HTTPS traffic from CLI tools. Has its own cert generation (`cert/`), DNS handling, and Express server.
|
|
107
|
+
|
|
108
|
+
### Cloud Worker (`cloud/`)
|
|
109
|
+
|
|
110
|
+
Cloudflare Workers deployment for optional cloud sync relay. Has its own `wrangler.toml`, `package.json`, and separate source in `cloud/src/`.
|
|
111
|
+
|
|
112
|
+
## Key Environment Variables
|
|
113
|
+
|
|
114
|
+
| Variable | Purpose |
|
|
115
|
+
|----------|---------|
|
|
116
|
+
| `JWT_SECRET` | Required. Signs dashboard auth tokens |
|
|
117
|
+
| `INITIAL_PASSWORD` | Required. Dashboard login password |
|
|
118
|
+
| `DATA_DIR` | Persistent storage directory (default: `~/.n9router`) |
|
|
119
|
+
| `PORT` | Server port (default: 20128) |
|
|
120
|
+
| `NEXT_PUBLIC_BASE_URL` | Public URL for the instance |
|
|
121
|
+
| `REQUIRE_API_KEY` | Enforce API key on `/v1/*` routes |
|
|
122
|
+
| `ENABLE_REQUEST_LOGS` | Log full request/response bodies |
|
|
123
|
+
|
|
124
|
+
## Testing Notes
|
|
125
|
+
|
|
126
|
+
- Tests live in `tests/unit/` and use Vitest v4
|
|
127
|
+
- Vitest is installed in `/tmp/node_modules` to avoid conflicts with the root Next.js project's hoisting
|
|
128
|
+
- Test config is at `tests/vitest.config.js` — it aliases `open-sse` to the local package
|
|
129
|
+
- Current coverage: embeddings core, cloud worker handler, OAuth cursor auto-import, OpenAI-to-Codex translation, provider validation, translator request normalization
|
|
130
|
+
|
|
131
|
+
## CI/CD
|
|
132
|
+
|
|
133
|
+
- GitHub Actions workflow at `.github/workflows/docker-publish.yml`
|
|
134
|
+
- Triggers on version tags (`v*`) and manual dispatch
|
|
135
|
+
- Builds and pushes Docker image to `ghcr.io`
|
|
136
|
+
- Docker uses multi-stage build with `node:20-alpine`, standalone Next.js output
|
|
Binary file
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
Muốn dùng thử thì cài rất nhanh:
|
|
2
|
+
|
|
3
|
+
npm i -g n9router
|
|
4
|
+
|
|
5
|
+
Nếu bạn dùng Antigravity để code hằng ngày, chắc đã từng gặp cảnh đang làm ngon thì dính 429, quota hết, flow bị ngắt giữa chừng.
|
|
6
|
+
|
|
7
|
+
n9router là một dự án fork từ 9Router, được phát triển thêm với trọng tâm rõ hơn vào trải nghiệm tự host và các tính năng thực dụng cho người dùng IDE/CLI AI. Một trong những phần đáng giá nhất hiện tại là Antigravity Token Swap.
|
|
8
|
+
|
|
9
|
+
Hiểu đơn giản, thay vì phải tự đổi account, tự thay token, hoặc tự chỉnh config mỗi khi quota chạm trần, n9router đứng ở lớp proxy MITM và tự động luân chuyển token giữa nhiều tài khoản Antigravity. Với người dùng cuối, bạn vẫn dùng IDE như cũ, nhưng phía sau hệ thống sẽ tự chọn account phù hợp để request tiếp tục chạy.
|
|
10
|
+
|
|
11
|
+
Trong thời điểm quota Antigravity bị giới hạn khá nhanh, kể cả với account Ultra, thì việc phải dùng song song nhiều account AI Pro và AI Ultra gần như là điều khó tránh khỏi nếu muốn làm việc liên tục. Vấn đề là không ai muốn đang code lại phải dừng giữa chừng chỉ để logout, login, đổi token hay switch account thủ công. Phần đáng giá của tool này là nó gánh phần việc đó ở tầng proxy, để session làm việc được giữ xuyên suốt hơn.
|
|
12
|
+
|
|
13
|
+
Điểm hay của Antigravity Token Swap là nó giải quyết đúng vấn đề thực tế. Khi một account bị quota hit hoặc gặp 429, proxy có thể tự chuyển sang account khác trong pool và thử lại. Nhờ vậy workflow đỡ bị gãy hơn rất nhiều, nhất là với những ai dùng Antigravity liên tục cho coding session dài.
|
|
14
|
+
|
|
15
|
+
Toàn bộ việc quản lý cũng được gom vào một chỗ. Bạn có thể xem pool account, quota còn lại, thời điểm reset quota, account nào đang là account kế tiếp, streak hiện tại của từng account, đồng thời bật tắt từng account hoặc reset streak ngay trên dashboard.
|
|
16
|
+
|
|
17
|
+
Cách bật cũng khá đơn giản: khởi động MITM Server, bật DNS Redirect cho Antigravity, rồi bật Token Rotation trong dashboard. Sau đó chỉ cần thêm nhiều account Antigravity vào pool là dùng được.
|
|
18
|
+
|
|
19
|
+
Nếu chưa muốn thêm account bằng tay, có thể dùng luôn nút import accounts từ Antigravity Management Tools trong phần provider Antigravity để đưa account vào pool nhanh hơn.
|
|
20
|
+
|
|
21
|
+
Nói ngắn gọn, Antigravity Token Swap không phải là một tính năng kiểu “cho vui”. Nó là thứ giúp biến nhiều account Antigravity thành một lớp quota pool thực thụ, để công việc không bị phụ thuộc vào giới hạn của từng account riêng lẻ.
|
|
@@ -10,6 +10,7 @@ const { isTokenSwapEnabled, getAllActiveConnections, triggerRefreshIfNeeded,
|
|
|
10
10
|
setCooldown, setModelCooldown, getTokenSwapStrategy,
|
|
11
11
|
parseQuotaCooldown, markAccountUsed, getConnectionLabel } = require("./tokenPool");
|
|
12
12
|
const { getCertForDomain } = require("./cert/generate");
|
|
13
|
+
const { buildInputOnlyRequestDetail, createTokenSwapUsageObserver, generateDetailId } = require("./usageTracker");
|
|
13
14
|
|
|
14
15
|
const DB_FILE = path.join(DATA_DIR, "db.json");
|
|
15
16
|
const LOCAL_PORT = 443;
|
|
@@ -180,7 +181,7 @@ async function passthrough(req, res, bodyBuffer, onResponse) {
|
|
|
180
181
|
// Unlike passthrough(), this checks upstream statusCode BEFORE
|
|
181
182
|
// piping to client — enabling auto-retry on 429/503.
|
|
182
183
|
|
|
183
|
-
async function tokenSwapForward(req, res, bodyBuffer, connections, model, strategy) {
|
|
184
|
+
async function tokenSwapForward(req, res, bodyBuffer, connections, model, strategy, provider, requestStartTime) {
|
|
184
185
|
const targetHost = (req.headers.host || TARGET_HOSTS[0]).split(":")[0];
|
|
185
186
|
const targetIP = await resolveTargetIP(targetHost);
|
|
186
187
|
|
|
@@ -245,12 +246,57 @@ async function tokenSwapForward(req, res, bodyBuffer, connections, model, strate
|
|
|
245
246
|
}
|
|
246
247
|
|
|
247
248
|
const newCount = (conn.consecutiveUseCount || 0) + 1;
|
|
249
|
+
const statusCode = result.response.statusCode || 0;
|
|
248
250
|
const successModelTag = model ? ` model=${model}` : "";
|
|
249
251
|
const successStrategyTag = strategy === "sticky" ? ` sticky(use #${newCount})` : ` rr`;
|
|
250
|
-
log(`✅ [token-swap] "${label}" → ${
|
|
252
|
+
log(`✅ [token-swap] "${label}" → ${statusCode}${successModelTag}${successStrategyTag}`);
|
|
251
253
|
markAccountUsed(conn.id);
|
|
252
|
-
res.writeHead(
|
|
253
|
-
|
|
254
|
+
res.writeHead(statusCode, result.response.headers);
|
|
255
|
+
|
|
256
|
+
const detailId = generateDetailId(model);
|
|
257
|
+
const inputOnlyDetail = buildInputOnlyRequestDetail({
|
|
258
|
+
detailId,
|
|
259
|
+
provider,
|
|
260
|
+
model,
|
|
261
|
+
connectionId: conn.id,
|
|
262
|
+
bodyBuffer
|
|
263
|
+
});
|
|
264
|
+
fetch("http://127.0.0.1:20128/api/internal/request-detail", {
|
|
265
|
+
method: "POST",
|
|
266
|
+
headers: {
|
|
267
|
+
"Content-Type": "application/json",
|
|
268
|
+
[INTERNAL_REQUEST_HEADER.name]: INTERNAL_REQUEST_HEADER.value
|
|
269
|
+
},
|
|
270
|
+
body: JSON.stringify(inputOnlyDetail)
|
|
271
|
+
}).catch((detailError) => {
|
|
272
|
+
err(`[token-swap] failed to create request detail for "${label}": ${detailError.message}`);
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
const usageObserver = createTokenSwapUsageObserver({
|
|
276
|
+
provider,
|
|
277
|
+
model,
|
|
278
|
+
connectionId: conn.id,
|
|
279
|
+
accountLabel: label,
|
|
280
|
+
bodyBuffer,
|
|
281
|
+
contentType: result.response.headers["content-type"] || "",
|
|
282
|
+
contentEncoding: result.response.headers["content-encoding"] || "",
|
|
283
|
+
statusCode,
|
|
284
|
+
detailRecord: inputOnlyDetail,
|
|
285
|
+
requestStartTime
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
result.response.on("data", (chunk) => {
|
|
289
|
+
usageObserver.onChunk(chunk);
|
|
290
|
+
res.write(chunk);
|
|
291
|
+
});
|
|
292
|
+
result.response.on("end", () => {
|
|
293
|
+
res.end();
|
|
294
|
+
usageObserver.onEnd().catch(() => {});
|
|
295
|
+
});
|
|
296
|
+
result.response.on("error", (streamError) => {
|
|
297
|
+
err(`[token-swap] upstream stream error for "${label}": ${streamError.message}`);
|
|
298
|
+
if (!res.writableEnded) res.end();
|
|
299
|
+
});
|
|
254
300
|
return true;
|
|
255
301
|
} catch (e) {
|
|
256
302
|
err(`[token-swap] error for "${label}": ${e.message}`);
|
|
@@ -312,7 +358,7 @@ const server = https.createServer(sslOptions, async (req, res) => {
|
|
|
312
358
|
const poolConns = getAllActiveConnections(swapProvider, model);
|
|
313
359
|
if (poolConns.length > 0) {
|
|
314
360
|
log(`🔑 [${tool}] token-swap: ${poolConns.length} account(s) available (strategy=${strategy}${model ? `, model=${model}` : ""})`);
|
|
315
|
-
const handled = await tokenSwapForward(req, res, bodyBuffer, poolConns, model, strategy);
|
|
361
|
+
const handled = await tokenSwapForward(req, res, bodyBuffer, poolConns, model, strategy, swapProvider, bodyCollectStart);
|
|
316
362
|
if (handled) return;
|
|
317
363
|
log(`⚠️ [${tool}] token-swap: all accounts exhausted, falling through to original token`);
|
|
318
364
|
} else {
|