n9router 0.3.91 → 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 +1 -0
- package/.next/standalone/.next/build-manifest.json +3 -3
- package/.next/standalone/.next/routes-manifest.json +6 -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/page.js +1 -1
- package/.next/standalone/.next/server/app/_global-error/page.js.nft.json +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 +1 -1
- 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 +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 +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 +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 +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 +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 +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 +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 +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.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/internal/request-detail/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/internal/usage/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/keys/[id]/route.js +1 -1
- 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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +1 -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]__0mpe9.-._.js → [root-of-the-server]__0-ztp63._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0ha8pqz._.js → [root-of-the-server]__0.yvcis._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0nkly1e._.js → [root-of-the-server]__0148t9m._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0u8dezo._.js → [root-of-the-server]__01dhv3a._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__01rpshu._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0ec61.d._.js → [root-of-the-server]__04o67.c._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0fsp-sk._.js → [root-of-the-server]__04phkrb._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0p8vmzj._.js → [root-of-the-server]__0_8pmqq._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0f59x8f._.js → [root-of-the-server]__0_8qd4-._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0tw0zvj._.js → [root-of-the-server]__0_a3mp3._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0t-7jzt._.js → [root-of-the-server]__0_qom9~._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0poxwxp._.js → [root-of-the-server]__0a4rwvw._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0evci68._.js → [root-of-the-server]__0b0hngg._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0b802lh._.js +1 -1
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0bdtalb._.js → [root-of-the-server]__0c-qn~s._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0sy.n8z._.js → [root-of-the-server]__0cix-zv._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__03of64y._.js → [root-of-the-server]__0d-p9ea._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0c09lpw._.js → [root-of-the-server]__0drf.ui._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0e27kvj._.js +3 -0
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0e4os.p._.js → [root-of-the-server]__0eyrvzj._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0_5bxb7._.js → [root-of-the-server]__0gglkh-._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0a_9~cg._.js → [root-of-the-server]__0ggqrke._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0pf0kam._.js → [root-of-the-server]__0gicxvd._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__06n~wts._.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]__091ltaw._.js → [root-of-the-server]__0jd9t2e._.js} +2 -2
- 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]__0jpee3.._.js → [root-of-the-server]__0n1xjjj._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0e7y8w~._.js → [root-of-the-server]__0ntxb7l._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0fa8rg9._.js → [root-of-the-server]__0ob~5~z._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__02.ogtw._.js → [root-of-the-server]__0pwrfp1._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0yf_zm4._.js → [root-of-the-server]__0q6qi87._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0xilem_._.js → [root-of-the-server]__0qbud9-._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0x6j5ov._.js → [root-of-the-server]__0s078yi._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0_zm3dg._.js → [root-of-the-server]__0shx3oz._.js} +2 -2
- 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]__0ldzewe._.js → [root-of-the-server]__0tdx4rw._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0y3xqc0._.js → [root-of-the-server]__0uc~.ow._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0nab92j._.js → [root-of-the-server]__0uilpvk._.js} +2 -2
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0uw3x8s._.js +1 -1
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0wczue6._.js → [root-of-the-server]__0wn37_w._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0442-5c._.js → [root-of-the-server]__0wor~wi._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__00_sy8a._.js → [root-of-the-server]__0wu_jyu._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0xls6ee._.js → [root-of-the-server]__0wzaoyn._.js} +2 -2
- 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]__01n7vgb._.js → [root-of-the-server]__0y5ae.7._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__06ogl04._.js → [root-of-the-server]__0ygxf8q._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__1365t9j._.js → [root-of-the-server]__0yk.b~x._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0d7obnq._.js → [root-of-the-server]__0yqcvre._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__04c-kkd._.js → [root-of-the-server]__0yye~im._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0-th9q.._.js → [root-of-the-server]__0z-kiuj._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__0zgc10n._.js → [root-of-the-server]__0z-slhf._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__00w1-vt._.js → [root-of-the-server]__0~0444n._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__02ez_-~._.js → [root-of-the-server]__11ddaxt._.js} +2 -2
- package/.next/standalone/.next/server/chunks/{[root-of-the-server]__11x4~za._.js → [root-of-the-server]__120yp9v._.js} +2 -2
- 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/ssr/{[root-of-the-server]__04f0xi0._.js → [root-of-the-server]__0c6sbbj._.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_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/{static/chunks/0ggs~59p2zyrg.js → standalone/.next/static/chunks/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/{static/chunks/0pwbnjvdm7lt_.js → standalone/.next/static/chunks/0lqwk82lneihh.js} +2 -2
- package/.next/{static/chunks/148_2lu2ra629.js → standalone/.next/static/chunks/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_guide.md +2 -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/api/antigravity-tools/import-refresh-tokens/route.js +218 -0
- package/.next/{standalone/.next/static/chunks/0ggs~59p2zyrg.js → static/chunks/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/{standalone/.next/static/chunks/0pwbnjvdm7lt_.js → static/chunks/0lqwk82lneihh.js} +2 -2
- package/.next/{standalone/.next/static/chunks/148_2lu2ra629.js → static/chunks/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]__0jlk7i0._.js +0 -3
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0m42-i~._.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/static/chunks/026p3rpdycbyo.css +0 -1
- package/.next/static/chunks/0b285gqd-hcvu.js +0 -1
- /package/.next/standalone/.next/static/{G51gMWWv_zPc_nZoCBESi → b_Drjo0YdAiFCInKT62q9}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{G51gMWWv_zPc_nZoCBESi → b_Drjo0YdAiFCInKT62q9}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{G51gMWWv_zPc_nZoCBESi → b_Drjo0YdAiFCInKT62q9}/_ssgManifest.js +0 -0
- /package/.next/static/{G51gMWWv_zPc_nZoCBESi → b_Drjo0YdAiFCInKT62q9}/_buildManifest.js +0 -0
- /package/.next/static/{G51gMWWv_zPc_nZoCBESi → b_Drjo0YdAiFCInKT62q9}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{G51gMWWv_zPc_nZoCBESi → b_Drjo0YdAiFCInKT62q9}/_ssgManifest.js +0 -0
|
@@ -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
|
|
@@ -16,4 +16,6 @@ Toàn bộ việc quản lý cũng được gom vào một chỗ. Bạn có th
|
|
|
16
16
|
|
|
17
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
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
|
+
|
|
19
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ẻ.
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "n9router",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.93",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "n9router",
|
|
9
|
-
"version": "0.3.
|
|
9
|
+
"version": "0.3.93",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"@monaco-editor/react": "^4.7.0",
|
|
@@ -5,12 +5,18 @@ import PropTypes from "prop-types";
|
|
|
5
5
|
import { useParams, useRouter } from "next/navigation";
|
|
6
6
|
import Link from "next/link";
|
|
7
7
|
import Image from "next/image";
|
|
8
|
-
import { Card, Button, Badge, Input, Modal, CardSkeleton, OAuthModal, KiroOAuthWrapper, CursorAuthModal, IFlowCookieModal, GitLabAuthModal, Toggle, Select } from "@/shared/components";
|
|
8
|
+
import { Card, Button, Badge, Input, Modal, CardSkeleton, OAuthModal, KiroOAuthWrapper, CursorAuthModal, IFlowCookieModal, GitLabAuthModal, Toggle, Select, Tooltip } from "@/shared/components";
|
|
9
9
|
import { OAUTH_PROVIDERS, APIKEY_PROVIDERS, FREE_PROVIDERS, FREE_TIER_PROVIDERS, getProviderAlias, isOpenAICompatibleProvider, isAnthropicCompatibleProvider } from "@/shared/constants/providers";
|
|
10
10
|
import { getModelsByProviderId } from "@/shared/constants/models";
|
|
11
11
|
import { useCopyToClipboard } from "@/shared/hooks/useCopyToClipboard";
|
|
12
12
|
import { fetchSuggestedModels } from "@/shared/utils/providerModelsFetcher";
|
|
13
13
|
|
|
14
|
+
const ANTIGRAVITY_TOOLTIP_IMPORT_AGT =
|
|
15
|
+
"Imports accounts from ~/.antigravity_tools on this machine (Antigravity IDE local data). Requires that folder to exist and contain signed-in accounts.";
|
|
16
|
+
|
|
17
|
+
const ANTIGRAVITY_TOOLTIP_IMPORT_REFRESH =
|
|
18
|
+
"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.";
|
|
19
|
+
|
|
14
20
|
export default function ProviderDetailPage() {
|
|
15
21
|
const params = useParams();
|
|
16
22
|
const router = useRouter();
|
|
@@ -26,6 +32,9 @@ export default function ProviderDetailPage() {
|
|
|
26
32
|
const [showEditNodeModal, setShowEditNodeModal] = useState(false);
|
|
27
33
|
const [showBulkProxyModal, setShowBulkProxyModal] = useState(false);
|
|
28
34
|
const [importingAgt, setImportingAgt] = useState(false);
|
|
35
|
+
const [importingAgtRefresh, setImportingAgtRefresh] = useState(false);
|
|
36
|
+
const [showAgtRefreshModal, setShowAgtRefreshModal] = useState(false);
|
|
37
|
+
const [agtRefreshTokenInput, setAgtRefreshTokenInput] = useState("");
|
|
29
38
|
const [importResult, setImportResult] = useState(null);
|
|
30
39
|
const [selectedConnection, setSelectedConnection] = useState(null);
|
|
31
40
|
const [modelAliases, setModelAliases] = useState({});
|
|
@@ -425,6 +434,8 @@ export default function ProviderDetailPage() {
|
|
|
425
434
|
};
|
|
426
435
|
|
|
427
436
|
|
|
437
|
+
const agtImportBusy = importingAgt || importingAgtRefresh;
|
|
438
|
+
|
|
428
439
|
const handleImportFromAgt = async () => {
|
|
429
440
|
setImportingAgt(true);
|
|
430
441
|
setImportResult(null);
|
|
@@ -443,6 +454,36 @@ export default function ProviderDetailPage() {
|
|
|
443
454
|
setImportingAgt(false);
|
|
444
455
|
};
|
|
445
456
|
|
|
457
|
+
const handleImportFromRefreshTokens = async () => {
|
|
458
|
+
if (!agtRefreshTokenInput.trim()) return;
|
|
459
|
+
setImportingAgtRefresh(true);
|
|
460
|
+
setImportResult(null);
|
|
461
|
+
try {
|
|
462
|
+
const res = await fetch("/api/antigravity-tools/import-refresh-tokens", {
|
|
463
|
+
method: "POST",
|
|
464
|
+
headers: { "Content-Type": "application/json" },
|
|
465
|
+
body: JSON.stringify({ text: agtRefreshTokenInput }),
|
|
466
|
+
});
|
|
467
|
+
const data = await res.json();
|
|
468
|
+
if (res.ok) {
|
|
469
|
+
setImportResult(data);
|
|
470
|
+
await fetchConnections();
|
|
471
|
+
setShowAgtRefreshModal(false);
|
|
472
|
+
setAgtRefreshTokenInput("");
|
|
473
|
+
} else {
|
|
474
|
+
setImportResult({ error: data.error || "Import failed" });
|
|
475
|
+
}
|
|
476
|
+
} catch (err) {
|
|
477
|
+
setImportResult({ error: err.message });
|
|
478
|
+
}
|
|
479
|
+
setImportingAgtRefresh(false);
|
|
480
|
+
};
|
|
481
|
+
|
|
482
|
+
const closeAgtRefreshModal = () => {
|
|
483
|
+
if (importingAgtRefresh) return;
|
|
484
|
+
setShowAgtRefreshModal(false);
|
|
485
|
+
};
|
|
486
|
+
|
|
446
487
|
const isSelected = (connectionId) => selectedConnectionIds.includes(connectionId);
|
|
447
488
|
|
|
448
489
|
const connectionsList = (
|
|
@@ -863,7 +904,15 @@ export default function ProviderDetailPage() {
|
|
|
863
904
|
<span>
|
|
864
905
|
{importResult.error
|
|
865
906
|
? `✗ ${importResult.error}`
|
|
866
|
-
:
|
|
907
|
+
: (() => {
|
|
908
|
+
const parts = [
|
|
909
|
+
`imported ${importResult.imported}`,
|
|
910
|
+
`updated ${importResult.updated}`,
|
|
911
|
+
];
|
|
912
|
+
if (importResult.skipped > 0) parts.push(`skipped ${importResult.skipped}`);
|
|
913
|
+
if (importResult.failed > 0) parts.push(`failed ${importResult.failed}`);
|
|
914
|
+
return `✓ ${parts.join(", ")}`;
|
|
915
|
+
})()}
|
|
867
916
|
</span>
|
|
868
917
|
<button onClick={() => setImportResult(null)} className="text-current opacity-60 hover:opacity-100">✕</button>
|
|
869
918
|
</div>
|
|
@@ -887,9 +936,23 @@ export default function ProviderDetailPage() {
|
|
|
887
936
|
{providerId === "iflow" ? "OAuth" : "Add Connection"}
|
|
888
937
|
</Button>
|
|
889
938
|
{providerId === "antigravity" && (
|
|
890
|
-
|
|
891
|
-
{
|
|
892
|
-
|
|
939
|
+
<>
|
|
940
|
+
<Tooltip text={ANTIGRAVITY_TOOLTIP_IMPORT_AGT} position="bottom">
|
|
941
|
+
<Button icon="download" variant="secondary" onClick={handleImportFromAgt} disabled={agtImportBusy}>
|
|
942
|
+
{importingAgt ? "Importing…" : "Import from AGT"}
|
|
943
|
+
</Button>
|
|
944
|
+
</Tooltip>
|
|
945
|
+
<Tooltip text={ANTIGRAVITY_TOOLTIP_IMPORT_REFRESH} position="bottom">
|
|
946
|
+
<Button
|
|
947
|
+
icon="key"
|
|
948
|
+
variant="secondary"
|
|
949
|
+
onClick={() => setShowAgtRefreshModal(true)}
|
|
950
|
+
disabled={agtImportBusy}
|
|
951
|
+
>
|
|
952
|
+
Import refresh tokens
|
|
953
|
+
</Button>
|
|
954
|
+
</Tooltip>
|
|
955
|
+
</>
|
|
893
956
|
)}
|
|
894
957
|
</div>
|
|
895
958
|
)}
|
|
@@ -918,9 +981,24 @@ export default function ProviderDetailPage() {
|
|
|
918
981
|
Add
|
|
919
982
|
</Button>
|
|
920
983
|
{providerId === "antigravity" && (
|
|
921
|
-
|
|
922
|
-
{
|
|
923
|
-
|
|
984
|
+
<>
|
|
985
|
+
<Tooltip text={ANTIGRAVITY_TOOLTIP_IMPORT_AGT} position="bottom">
|
|
986
|
+
<Button size="sm" icon="download" variant="secondary" onClick={handleImportFromAgt} disabled={agtImportBusy}>
|
|
987
|
+
{importingAgt ? "Importing…" : "Import from AGT"}
|
|
988
|
+
</Button>
|
|
989
|
+
</Tooltip>
|
|
990
|
+
<Tooltip text={ANTIGRAVITY_TOOLTIP_IMPORT_REFRESH} position="bottom">
|
|
991
|
+
<Button
|
|
992
|
+
size="sm"
|
|
993
|
+
icon="key"
|
|
994
|
+
variant="secondary"
|
|
995
|
+
onClick={() => setShowAgtRefreshModal(true)}
|
|
996
|
+
disabled={agtImportBusy}
|
|
997
|
+
>
|
|
998
|
+
Refresh tokens
|
|
999
|
+
</Button>
|
|
1000
|
+
</Tooltip>
|
|
1001
|
+
</>
|
|
924
1002
|
)}
|
|
925
1003
|
</div>
|
|
926
1004
|
)}
|
|
@@ -943,6 +1021,43 @@ export default function ProviderDetailPage() {
|
|
|
943
1021
|
|
|
944
1022
|
{bulkActionModal}
|
|
945
1023
|
|
|
1024
|
+
{providerId === "antigravity" && (
|
|
1025
|
+
<Modal isOpen={showAgtRefreshModal} onClose={closeAgtRefreshModal} title="Import accounts (refresh tokens)">
|
|
1026
|
+
<div className="flex flex-col gap-4">
|
|
1027
|
+
<p className="text-sm text-text-muted">
|
|
1028
|
+
Paste one or more Google OAuth refresh tokens. Supported formats: a single token (lines starting with{" "}
|
|
1029
|
+
<code className="text-xs bg-surface-secondary px-1 rounded">1//…</code>
|
|
1030
|
+
), a JSON array with{" "}
|
|
1031
|
+
<code className="text-xs bg-surface-secondary px-1 rounded">refresh_token</code>
|
|
1032
|
+
, or any text containing{" "}
|
|
1033
|
+
<code className="text-xs bg-surface-secondary px-1 rounded">"refresh_token": "…"</code>{" "}
|
|
1034
|
+
(values are extracted automatically).
|
|
1035
|
+
</p>
|
|
1036
|
+
<div className="space-y-2">
|
|
1037
|
+
<label className="block text-sm font-medium text-text-primary">Refresh tokens</label>
|
|
1038
|
+
<textarea
|
|
1039
|
+
value={agtRefreshTokenInput}
|
|
1040
|
+
onChange={(e) => setAgtRefreshTokenInput(e.target.value)}
|
|
1041
|
+
placeholder={`Paste your refresh token(s) here (batch supported)\n\nExample:\n"refresh_token": "example_refresh_token"`}
|
|
1042
|
+
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"
|
|
1043
|
+
disabled={importingAgtRefresh}
|
|
1044
|
+
/>
|
|
1045
|
+
<p className="text-xs text-text-muted">
|
|
1046
|
+
Tip: You can paste multiple tokens or a JSON array to import in batch.
|
|
1047
|
+
</p>
|
|
1048
|
+
</div>
|
|
1049
|
+
<div className="flex gap-2">
|
|
1050
|
+
<Button variant="secondary" fullWidth onClick={closeAgtRefreshModal} disabled={importingAgtRefresh}>
|
|
1051
|
+
Cancel
|
|
1052
|
+
</Button>
|
|
1053
|
+
<Button fullWidth onClick={handleImportFromRefreshTokens} disabled={importingAgtRefresh || !agtRefreshTokenInput.trim()}>
|
|
1054
|
+
{importingAgtRefresh ? "Importing…" : "Import"}
|
|
1055
|
+
</Button>
|
|
1056
|
+
</div>
|
|
1057
|
+
</div>
|
|
1058
|
+
</Modal>
|
|
1059
|
+
)}
|
|
1060
|
+
|
|
946
1061
|
{/* Modals */}
|
|
947
1062
|
{providerId === "kiro" ? (
|
|
948
1063
|
<KiroOAuthWrapper
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { createProviderConnection, getProviderConnections, updateProviderConnection } from "@/lib/localDb";
|
|
2
|
+
import { testSingleConnection } from "@/app/api/providers/[id]/test/testUtils";
|
|
3
|
+
import { ANTIGRAVITY_CONFIG } from "@/lib/oauth/constants/oauth";
|
|
4
|
+
import { refreshGoogleToken } from "open-sse/services/tokenRefresh.js";
|
|
5
|
+
import { getProjectIdForConnection } from "open-sse/services/projectId.js";
|
|
6
|
+
|
|
7
|
+
const noopLog = {
|
|
8
|
+
warn: () => {},
|
|
9
|
+
error: () => {},
|
|
10
|
+
info: () => {},
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
function maskToken(t) {
|
|
14
|
+
if (!t || typeof t !== "string") return "";
|
|
15
|
+
if (t.length <= 16) return `${t.slice(0, 6)}…`;
|
|
16
|
+
return `${t.slice(0, 10)}…${t.slice(-4)}`;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Extract Google OAuth refresh tokens from pasted text:
|
|
21
|
+
* - JSON array of objects with refresh_token or raw strings
|
|
22
|
+
* - Single JSON object with refresh_token
|
|
23
|
+
* - "refresh_token": "..." patterns (e.g. from config dumps)
|
|
24
|
+
* - Lines starting with 1// (typical Google refresh token prefix)
|
|
25
|
+
* - Any 1//… token embedded in free text
|
|
26
|
+
*/
|
|
27
|
+
function extractRefreshTokensFromText(text) {
|
|
28
|
+
if (!text || typeof text !== "string") return [];
|
|
29
|
+
const trimmed = text.trim();
|
|
30
|
+
const out = new Set();
|
|
31
|
+
|
|
32
|
+
const add = (raw) => {
|
|
33
|
+
if (raw == null) return;
|
|
34
|
+
const s = String(raw).trim();
|
|
35
|
+
if (!s) return;
|
|
36
|
+
out.add(s);
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
if (trimmed.startsWith("[")) {
|
|
40
|
+
try {
|
|
41
|
+
const arr = JSON.parse(trimmed);
|
|
42
|
+
if (Array.isArray(arr)) {
|
|
43
|
+
for (const item of arr) {
|
|
44
|
+
if (typeof item === "string") add(item);
|
|
45
|
+
else if (item && typeof item === "object" && item.refresh_token) add(item.refresh_token);
|
|
46
|
+
}
|
|
47
|
+
if (out.size) return [...out];
|
|
48
|
+
}
|
|
49
|
+
} catch {
|
|
50
|
+
/* fall through */
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (trimmed.startsWith("{")) {
|
|
55
|
+
try {
|
|
56
|
+
const obj = JSON.parse(trimmed);
|
|
57
|
+
if (obj && typeof obj === "object" && obj.refresh_token) add(obj.refresh_token);
|
|
58
|
+
if (out.size) return [...out];
|
|
59
|
+
} catch {
|
|
60
|
+
/* fall through */
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const keyPat = /"refresh_token"\s*:\s*"([^"]+)"/g;
|
|
65
|
+
let m;
|
|
66
|
+
while ((m = keyPat.exec(text)) !== null) {
|
|
67
|
+
add(m[1]);
|
|
68
|
+
}
|
|
69
|
+
if (out.size) return [...out];
|
|
70
|
+
|
|
71
|
+
for (const line of text.split(/\r?\n/)) {
|
|
72
|
+
const lt = line.trim();
|
|
73
|
+
if (/^1\/\//.test(lt)) {
|
|
74
|
+
const mm = lt.match(/^(1\/\/[^\s"']+)/);
|
|
75
|
+
if (mm) add(mm[1]);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (out.size) return [...out];
|
|
79
|
+
|
|
80
|
+
const anyPat = /\b(1\/\/[A-Za-z0-9_\-+/=]+)/g;
|
|
81
|
+
while ((m = anyPat.exec(text)) !== null) {
|
|
82
|
+
add(m[1]);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return [...out];
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
async function fetchGoogleUserEmail(accessToken) {
|
|
89
|
+
const url = `${ANTIGRAVITY_CONFIG.userInfoUrl}?alt=json`;
|
|
90
|
+
const res = await fetch(url, {
|
|
91
|
+
headers: { Authorization: `Bearer ${accessToken}` },
|
|
92
|
+
});
|
|
93
|
+
if (!res.ok) {
|
|
94
|
+
const errText = await res.text().catch(() => "");
|
|
95
|
+
throw new Error(`userinfo failed: HTTP ${res.status} ${errText.slice(0, 120)}`);
|
|
96
|
+
}
|
|
97
|
+
return res.json();
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* POST /api/antigravity-tools/import-refresh-tokens
|
|
102
|
+
* Body: { text: string }
|
|
103
|
+
*/
|
|
104
|
+
export async function POST(request) {
|
|
105
|
+
try {
|
|
106
|
+
let body = {};
|
|
107
|
+
try {
|
|
108
|
+
body = await request.json();
|
|
109
|
+
} catch {
|
|
110
|
+
return Response.json({ error: "Invalid JSON body" }, { status: 400 });
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const text = typeof body.text === "string" ? body.text : "";
|
|
114
|
+
const tokens = extractRefreshTokensFromText(text);
|
|
115
|
+
|
|
116
|
+
if (tokens.length === 0) {
|
|
117
|
+
return Response.json(
|
|
118
|
+
{ error: "No refresh tokens found. Paste one token per line, a JSON array, or text containing \"refresh_token\": \"…\"." },
|
|
119
|
+
{ status: 400 }
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const existingConnections = await getProviderConnections({ provider: "antigravity" });
|
|
124
|
+
const existingEmails = new Set(existingConnections.map((c) => c.email).filter(Boolean));
|
|
125
|
+
|
|
126
|
+
let imported = 0;
|
|
127
|
+
let updated = 0;
|
|
128
|
+
const errors = [];
|
|
129
|
+
|
|
130
|
+
for (const refreshToken of tokens) {
|
|
131
|
+
try {
|
|
132
|
+
const refreshed = await refreshGoogleToken(
|
|
133
|
+
refreshToken,
|
|
134
|
+
ANTIGRAVITY_CONFIG.clientId,
|
|
135
|
+
ANTIGRAVITY_CONFIG.clientSecret,
|
|
136
|
+
noopLog
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
if (!refreshed?.accessToken) {
|
|
140
|
+
errors.push({ token: maskToken(refreshToken), error: "Token refresh failed (invalid or revoked refresh token)" });
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
const { accessToken, refreshToken: newRefresh, expiresIn } = refreshed;
|
|
145
|
+
const effectiveRefresh = newRefresh || refreshToken;
|
|
146
|
+
|
|
147
|
+
let expiresAt = null;
|
|
148
|
+
if (expiresIn) {
|
|
149
|
+
expiresAt = new Date(Date.now() + expiresIn * 1000).toISOString();
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const userInfo = await fetchGoogleUserEmail(accessToken);
|
|
153
|
+
const email =
|
|
154
|
+
userInfo.email ||
|
|
155
|
+
(userInfo.id ? `google-${userInfo.id}@google.local` : null);
|
|
156
|
+
|
|
157
|
+
if (!email) {
|
|
158
|
+
errors.push({ token: maskToken(refreshToken), error: "Could not determine account email from Google userinfo" });
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
const isExisting = existingEmails.has(email);
|
|
163
|
+
|
|
164
|
+
const connectionData = {
|
|
165
|
+
provider: "antigravity",
|
|
166
|
+
authType: "oauth",
|
|
167
|
+
email,
|
|
168
|
+
name: userInfo.name || email,
|
|
169
|
+
accessToken,
|
|
170
|
+
refreshToken: effectiveRefresh,
|
|
171
|
+
expiresAt,
|
|
172
|
+
projectId: null,
|
|
173
|
+
isActive: true,
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
const connection = await createProviderConnection(connectionData);
|
|
177
|
+
|
|
178
|
+
const projectId = await getProjectIdForConnection(connection.id, accessToken);
|
|
179
|
+
if (projectId) {
|
|
180
|
+
await updateProviderConnection(connection.id, { projectId });
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
try {
|
|
184
|
+
await testSingleConnection(connection.id);
|
|
185
|
+
} catch (testErr) {
|
|
186
|
+
console.log(`[antigravity-tools/import-refresh-tokens] Test failed for ${email}: ${testErr.message}`);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
if (isExisting) {
|
|
190
|
+
updated++;
|
|
191
|
+
} else {
|
|
192
|
+
imported++;
|
|
193
|
+
existingEmails.add(email);
|
|
194
|
+
}
|
|
195
|
+
} catch (err) {
|
|
196
|
+
errors.push({ token: maskToken(refreshToken), error: err.message || String(err) });
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
const failed = errors.length;
|
|
201
|
+
|
|
202
|
+
console.log(
|
|
203
|
+
`[antigravity-tools/import-refresh-tokens] Done: imported=${imported}, updated=${updated}, failed=${failed}, total=${tokens.length}`
|
|
204
|
+
);
|
|
205
|
+
|
|
206
|
+
return Response.json({
|
|
207
|
+
imported,
|
|
208
|
+
updated,
|
|
209
|
+
skipped: 0,
|
|
210
|
+
failed,
|
|
211
|
+
errors,
|
|
212
|
+
total: tokens.length,
|
|
213
|
+
});
|
|
214
|
+
} catch (error) {
|
|
215
|
+
console.error("[antigravity-tools/import-refresh-tokens] Error:", error);
|
|
216
|
+
return Response.json({ error: error.message }, { status: 500 });
|
|
217
|
+
}
|
|
218
|
+
}
|