@yina-npm/openrouterx 0.4.22 → 0.4.24
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/README.md +2 -0
- package/app/.next/BUILD_ID +1 -1
- package/app/.next/app-path-routes-manifest.json +3 -1
- package/app/.next/build-manifest.json +2 -2
- package/app/.next/routes-manifest.json +12 -0
- package/app/.next/server/app/(dashboard)/dashboard/admin/keys/page.js +2 -2
- package/app/.next/server/app/(dashboard)/dashboard/admin/keys/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/admin/users/page.js +2 -2
- package/app/.next/server/app/(dashboard)/dashboard/admin/users/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/basic-chat/page.js +2 -2
- package/app/.next/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/cli-tools/page.js +2 -2
- package/app/.next/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/combos/page.js +2 -2
- package/app/.next/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/console-log/page.js +2 -2
- package/app/.next/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/endpoint/page.js +2 -2
- package/app/.next/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js +12 -12
- package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js +2 -2
- package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js +3 -3
- package/app/.next/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/media-providers/web/page.js +2 -2
- package/app/.next/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/mitm/page.js +2 -2
- package/app/.next/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/page.js +2 -2
- package/app/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/profile/page.js +2 -2
- package/app/.next/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page.js +2 -2
- package/app/.next/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/providers/new/page.js +2 -2
- package/app/.next/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/providers/page.js +2 -2
- package/app/.next/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/proxy-pools/page.js +2 -2
- package/app/.next/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/quota/page.js +2 -2
- package/app/.next/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/skills/page.js +2 -2
- package/app/.next/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/translator/page.js +2 -2
- package/app/.next/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/usage/page.js +2 -2
- package/app/.next/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/user/page.js +2 -2
- package/app/.next/server/app/(dashboard)/dashboard/user/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/_global-error/page.js +2 -2
- package/app/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/_global-error.html +1 -1
- package/app/.next/server/app/_global-error.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/app/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/app/.next/server/app/_not-found/page.js +2 -2
- package/app/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/_not-found.html +1 -1
- package/app/.next/server/app/_not-found.rsc +4 -4
- package/app/.next/server/app/_not-found.segments/_full.segment.rsc +4 -4
- package/app/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
- package/app/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/app/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/app/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/app/.next/server/app/api/auth/login/route.js +1 -1
- package/app/.next/server/app/api/auth/logout/route.js +1 -1
- package/app/.next/server/app/api/auth/me/route.js +1 -1
- package/app/.next/server/app/api/cli-tools/antigravity-mitm/alias/route.js +2 -2
- package/app/.next/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
- package/app/.next/server/app/api/cli-tools/antigravity-mitm/inject-auth/route.js +1 -0
- package/app/.next/server/app/api/cli-tools/antigravity-mitm/inject-auth/route.js.nft.json +1 -0
- package/app/.next/server/app/api/cli-tools/antigravity-mitm/inject-auth/route_client-reference-manifest.js +1 -0
- package/app/.next/server/app/api/cli-tools/antigravity-mitm/restart/route.js +1 -0
- package/app/.next/server/app/api/cli-tools/antigravity-mitm/restart/route.js.nft.json +1 -0
- package/app/.next/server/app/api/cli-tools/antigravity-mitm/restart/route_client-reference-manifest.js +1 -0
- package/app/.next/server/app/api/cli-tools/antigravity-mitm/route.js +1 -1
- package/app/.next/server/app/api/cli-tools/antigravity-mitm/test/route.js +1 -1
- package/app/.next/server/app/api/cli-tools/claude-settings/route.js +2 -2
- package/app/.next/server/app/api/cli-tools/codex-settings/route.js +2 -2
- package/app/.next/server/app/api/cli-tools/copilot-settings/route.js +1 -1
- package/app/.next/server/app/api/cli-tools/cowork-mcp-registry/route.js +1 -1
- package/app/.next/server/app/api/cli-tools/cowork-settings/route.js +2 -2
- package/app/.next/server/app/api/cli-tools/droid-settings/route.js +2 -2
- package/app/.next/server/app/api/cli-tools/hermes-settings/route.js +2 -2
- package/app/.next/server/app/api/cli-tools/openclaw-settings/route.js +2 -2
- package/app/.next/server/app/api/cli-tools/opencode-settings/route.js +2 -2
- package/app/.next/server/app/api/cloud/auth/route.js +1 -1
- package/app/.next/server/app/api/cloud/credentials/update/route.js +1 -1
- package/app/.next/server/app/api/cloud/model/resolve/route.js +1 -1
- package/app/.next/server/app/api/cloud/models/alias/route.js +1 -1
- package/app/.next/server/app/api/combos/[id]/route.js +1 -1
- package/app/.next/server/app/api/combos/route.js +1 -1
- package/app/.next/server/app/api/health/route.js +1 -1
- package/app/.next/server/app/api/init/route.js +1 -1
- package/app/.next/server/app/api/keys/[id]/route.js +1 -1
- package/app/.next/server/app/api/keys/route.js +1 -1
- package/app/.next/server/app/api/locale/route.js +1 -1
- package/app/.next/server/app/api/media-providers/tts/deepgram/voices/route.js +1 -1
- package/app/.next/server/app/api/media-providers/tts/elevenlabs/voices/route.js +1 -1
- package/app/.next/server/app/api/media-providers/tts/inworld/voices/route.js +1 -1
- package/app/.next/server/app/api/media-providers/tts/voices/route.js +1 -1
- package/app/.next/server/app/api/models/alias/route.js +1 -1
- package/app/.next/server/app/api/models/availability/route.js +1 -1
- package/app/.next/server/app/api/models/custom/route.js +1 -1
- package/app/.next/server/app/api/models/disabled/route.js +1 -1
- package/app/.next/server/app/api/models/route.js +1 -1
- package/app/.next/server/app/api/models/test/route.js +1 -1
- package/app/.next/server/app/api/models/test/route.js.nft.json +1 -1
- package/app/.next/server/app/api/oauth/[provider]/[action]/route.js +2 -2
- package/app/.next/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/oauth/cursor/auto-import/route.js +2 -2
- package/app/.next/server/app/api/oauth/cursor/import/route.js +1 -1
- package/app/.next/server/app/api/oauth/gitlab/pat/route.js +1 -1
- package/app/.next/server/app/api/oauth/iflow/cookie/route.js +1 -1
- package/app/.next/server/app/api/oauth/kiro/auto-import/route.js +1 -1
- package/app/.next/server/app/api/oauth/kiro/import/route.js +1 -1
- package/app/.next/server/app/api/oauth/kiro/social-authorize/route.js +1 -1
- package/app/.next/server/app/api/oauth/kiro/social-exchange/route.js +1 -1
- package/app/.next/server/app/api/pricing/route.js +1 -1
- package/app/.next/server/app/api/provider-nodes/[id]/route.js +1 -1
- package/app/.next/server/app/api/provider-nodes/route.js +1 -1
- package/app/.next/server/app/api/provider-nodes/route.js.nft.json +1 -1
- package/app/.next/server/app/api/provider-nodes/validate/route.js +1 -1
- package/app/.next/server/app/api/providers/[id]/models/route.js +1 -1
- package/app/.next/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
- package/app/.next/server/app/api/providers/[id]/route.js +1 -1
- package/app/.next/server/app/api/providers/[id]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/providers/[id]/test/route.js +1 -1
- package/app/.next/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
- package/app/.next/server/app/api/providers/[id]/test-models/route.js +1 -1
- package/app/.next/server/app/api/providers/client/route.js +1 -1
- package/app/.next/server/app/api/providers/client/route.js.nft.json +1 -1
- package/app/.next/server/app/api/providers/kilo/free-models/route.js +1 -1
- package/app/.next/server/app/api/providers/route.js +1 -1
- package/app/.next/server/app/api/providers/route.js.nft.json +1 -1
- package/app/.next/server/app/api/providers/suggested-models/route.js +1 -1
- package/app/.next/server/app/api/providers/test-batch/route.js +1 -1
- package/app/.next/server/app/api/providers/test-batch/route.js.nft.json +1 -1
- package/app/.next/server/app/api/providers/validate/route.js +1 -1
- package/app/.next/server/app/api/providers/validate/route.js.nft.json +1 -1
- package/app/.next/server/app/api/proxy-pools/[id]/route.js +1 -1
- package/app/.next/server/app/api/proxy-pools/[id]/test/route.js +1 -1
- package/app/.next/server/app/api/proxy-pools/[id]/test/route.js.nft.json +1 -1
- package/app/.next/server/app/api/proxy-pools/route.js +1 -1
- package/app/.next/server/app/api/proxy-pools/vercel-deploy/route.js +2 -2
- package/app/.next/server/app/api/settings/database/route.js +1 -1
- package/app/.next/server/app/api/settings/proxy-test/route.js +1 -1
- package/app/.next/server/app/api/settings/proxy-test/route.js.nft.json +1 -1
- package/app/.next/server/app/api/settings/require-login/route.js +1 -1
- package/app/.next/server/app/api/settings/route.js +1 -1
- package/app/.next/server/app/api/shutdown/route.js +1 -1
- package/app/.next/server/app/api/tags/route.js +1 -1
- package/app/.next/server/app/api/translator/console-logs/route.js +1 -1
- package/app/.next/server/app/api/translator/console-logs/stream/route.js +2 -2
- package/app/.next/server/app/api/translator/load/route.js +1 -1
- package/app/.next/server/app/api/translator/save/route.js +1 -1
- package/app/.next/server/app/api/translator/send/route.js +1 -1
- package/app/.next/server/app/api/translator/send/route.js.nft.json +1 -1
- package/app/.next/server/app/api/translator/translate/route.js +1 -1
- package/app/.next/server/app/api/translator/translate/route.js.nft.json +1 -1
- package/app/.next/server/app/api/tunnel/disable/route.js +1 -1
- package/app/.next/server/app/api/tunnel/enable/route.js +1 -1
- package/app/.next/server/app/api/tunnel/status/route.js +1 -1
- package/app/.next/server/app/api/tunnel/tailscale-check/route.js +1 -1
- package/app/.next/server/app/api/tunnel/tailscale-disable/route.js +1 -1
- package/app/.next/server/app/api/tunnel/tailscale-enable/route.js +1 -1
- package/app/.next/server/app/api/tunnel/tailscale-install/route.js +1 -1
- package/app/.next/server/app/api/tunnel/tailscale-login/route.js +1 -1
- package/app/.next/server/app/api/tunnel/tailscale-start-daemon/route.js +1 -1
- package/app/.next/server/app/api/usage/[connectionId]/route.js +1 -1
- package/app/.next/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/usage/api-keys/route.js +1 -1
- package/app/.next/server/app/api/usage/chart/route.js +1 -1
- package/app/.next/server/app/api/usage/history/route.js +1 -1
- package/app/.next/server/app/api/usage/logs/route.js +1 -1
- package/app/.next/server/app/api/usage/providers/route.js +1 -1
- package/app/.next/server/app/api/usage/request-details/route.js +1 -1
- package/app/.next/server/app/api/usage/request-logs/route.js +1 -1
- package/app/.next/server/app/api/usage/stats/route.js +1 -1
- package/app/.next/server/app/api/usage/stream/route.js +2 -2
- package/app/.next/server/app/api/users/[id]/route.js +1 -1
- package/app/.next/server/app/api/users/route.js +1 -1
- package/app/.next/server/app/api/v1/api/chat/route.js +1 -1
- package/app/.next/server/app/api/v1/api/chat/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/audio/speech/route.js +1 -1
- package/app/.next/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/audio/transcriptions/route.js +1 -1
- package/app/.next/server/app/api/v1/audio/transcriptions/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/audio/voices/route.js +1 -1
- package/app/.next/server/app/api/v1/chat/completions/route.js +1 -1
- package/app/.next/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/embeddings/route.js +1 -1
- package/app/.next/server/app/api/v1/embeddings/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/images/generations/route.js +2 -2
- package/app/.next/server/app/api/v1/images/generations/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/messages/count_tokens/route.js +1 -1
- package/app/.next/server/app/api/v1/messages/route.js +1 -1
- package/app/.next/server/app/api/v1/messages/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/models/[kind]/route.js +1 -1
- package/app/.next/server/app/api/v1/models/[kind]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/models/info/route.js +1 -1
- package/app/.next/server/app/api/v1/models/route.js +1 -1
- package/app/.next/server/app/api/v1/models/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/responses/compact/route.js +1 -1
- package/app/.next/server/app/api/v1/responses/compact/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/responses/route.js +1 -1
- package/app/.next/server/app/api/v1/responses/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/route.js +1 -1
- package/app/.next/server/app/api/v1/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/search/route.js +1 -1
- package/app/.next/server/app/api/v1/search/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1/web/fetch/route.js +1 -1
- package/app/.next/server/app/api/v1/web/fetch/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1beta/models/[...path]/route.js +1 -1
- package/app/.next/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/v1beta/models/route.js +1 -1
- package/app/.next/server/app/api/version/route.js +1 -1
- package/app/.next/server/app/api/version/update/route.js +1 -1
- package/app/.next/server/app/callback/page.js +2 -2
- package/app/.next/server/app/callback/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/callback.html +1 -1
- package/app/.next/server/app/callback.rsc +4 -4
- package/app/.next/server/app/callback.segments/_full.segment.rsc +4 -4
- package/app/.next/server/app/callback.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/callback.segments/_index.segment.rsc +4 -4
- package/app/.next/server/app/callback.segments/_tree.segment.rsc +2 -2
- package/app/.next/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
- package/app/.next/server/app/callback.segments/callback.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/settings/pricing/page.js +2 -2
- package/app/.next/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/dashboard/settings/pricing.html +1 -1
- package/app/.next/server/app/dashboard/settings/pricing.rsc +4 -4
- package/app/.next/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +4 -4
- package/app/.next/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +4 -4
- package/app/.next/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +2 -2
- package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
- package/app/.next/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
- package/app/.next/server/app/favicon.ico/route.js +1 -1
- package/app/.next/server/app/index.html +1 -1
- package/app/.next/server/app/index.rsc +4 -4
- package/app/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/app/.next/server/app/index.segments/_full.segment.rsc +4 -4
- package/app/.next/server/app/index.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/index.segments/_index.segment.rsc +4 -4
- package/app/.next/server/app/index.segments/_tree.segment.rsc +2 -2
- package/app/.next/server/app/landing/page.js +2 -2
- package/app/.next/server/app/landing/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/landing.html +1 -1
- package/app/.next/server/app/landing.rsc +5 -5
- package/app/.next/server/app/landing.segments/_full.segment.rsc +5 -5
- package/app/.next/server/app/landing.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/landing.segments/_index.segment.rsc +4 -4
- package/app/.next/server/app/landing.segments/_tree.segment.rsc +2 -2
- package/app/.next/server/app/landing.segments/landing/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/landing.segments/landing.segment.rsc +1 -1
- package/app/.next/server/app/login/page.js +2 -2
- package/app/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app/login.html +1 -1
- package/app/.next/server/app/login.rsc +5 -5
- package/app/.next/server/app/login.segments/_full.segment.rsc +5 -5
- package/app/.next/server/app/login.segments/_head.segment.rsc +1 -1
- package/app/.next/server/app/login.segments/_index.segment.rsc +4 -4
- package/app/.next/server/app/login.segments/_tree.segment.rsc +2 -2
- package/app/.next/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
- package/app/.next/server/app/login.segments/login.segment.rsc +1 -1
- package/app/.next/server/app/manifest.webmanifest/route.js +2 -2
- package/app/.next/server/app/page.js +2 -2
- package/app/.next/server/app/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app-paths-manifest.json +3 -1
- package/app/.next/server/chunks/1679.js +1 -0
- package/app/.next/server/chunks/2506.js +2 -2
- package/app/.next/server/chunks/2574.js +1 -0
- package/app/.next/server/chunks/3110.js +14 -0
- package/app/.next/server/chunks/3605.js +1 -0
- package/app/.next/server/chunks/3855.js +1 -1
- package/app/.next/server/chunks/3913.js +1 -1
- package/app/.next/server/chunks/4122.js +1 -1
- package/app/.next/server/chunks/4664.js +1 -1
- package/app/.next/server/chunks/4989.js +2 -2
- package/app/.next/server/chunks/5627.js +6 -4
- package/app/.next/server/chunks/5681.js +1 -1
- package/app/.next/server/chunks/6108.js +1 -1
- package/app/.next/server/chunks/6182.js +5 -4
- package/app/.next/server/chunks/6774.js +1 -1
- package/app/.next/server/chunks/7341.js +1 -1
- package/app/.next/server/chunks/7595.js +1 -1
- package/app/.next/server/chunks/7937.js +7 -16
- package/app/.next/server/chunks/8590.js +1 -1
- package/app/.next/server/chunks/8760.js +1 -1
- package/app/.next/server/chunks/8895.js +1 -1
- package/app/.next/server/chunks/9489.js +1 -1
- package/app/.next/server/chunks/9547.js +4 -14
- package/app/.next/server/chunks/9609.js +1 -1
- package/app/.next/server/chunks/9718.js +1 -1
- package/app/.next/server/functions-config-manifest.json +1 -0
- package/app/.next/server/middleware-build-manifest.js +1 -1
- package/app/.next/server/middleware.js +3 -3
- package/app/.next/server/pages/404.html +1 -1
- package/app/.next/server/pages/500.html +1 -1
- package/app/.next/static/SQn85l_D0P4BshNJQkGiZ/_buildManifest.js +1 -0
- package/app/.next/static/chunks/1321-e48fd14f5bef6d7a.js +1 -0
- package/app/.next/static/chunks/2336-36a1f30358e691c6.js +28 -0
- package/app/.next/static/chunks/app/(dashboard)/dashboard/admin/users/page-adc5d5e8da3a0761.js +1 -0
- package/app/.next/static/chunks/app/(dashboard)/dashboard/media-providers/[kind]/[id]/{page-eb5193b550d3e8de.js → page-c77fedcd9ba7bcac.js} +14 -14
- package/app/.next/static/chunks/app/(dashboard)/dashboard/profile/page-ceb9bffbc34711bc.js +1 -0
- package/app/.next/static/chunks/app/(dashboard)/dashboard/translator/page-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/_global-error/page-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/auth/login/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/auth/logout/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/auth/me/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/cli-tools/antigravity-mitm/alias/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/cli-tools/antigravity-mitm/inject-auth/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/cli-tools/antigravity-mitm/restart/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/cli-tools/antigravity-mitm/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/cli-tools/antigravity-mitm/test/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/cli-tools/claude-settings/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/cli-tools/codex-settings/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/cli-tools/copilot-settings/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/cli-tools/cowork-mcp-registry/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/cli-tools/cowork-settings/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/cli-tools/droid-settings/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/cli-tools/hermes-settings/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/cli-tools/openclaw-settings/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/cli-tools/opencode-settings/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/cloud/auth/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/cloud/credentials/update/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/cloud/model/resolve/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/cloud/models/alias/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/combos/[id]/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/combos/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/health/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/init/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/keys/[id]/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/keys/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/locale/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/media-providers/tts/deepgram/voices/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/media-providers/tts/elevenlabs/voices/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/media-providers/tts/inworld/voices/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/media-providers/tts/voices/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/models/alias/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/models/availability/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/models/custom/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/models/disabled/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/models/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/models/test/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/oauth/[provider]/[action]/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/oauth/cursor/auto-import/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/oauth/cursor/import/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/oauth/gitlab/pat/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/oauth/iflow/cookie/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/oauth/kiro/auto-import/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/oauth/kiro/import/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/oauth/kiro/social-authorize/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/oauth/kiro/social-exchange/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/pricing/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/provider-nodes/[id]/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/provider-nodes/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/provider-nodes/validate/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/providers/[id]/models/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/providers/[id]/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/providers/[id]/test/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/providers/[id]/test-models/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/providers/client/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/providers/kilo/free-models/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/providers/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/providers/suggested-models/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/providers/test-batch/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/providers/validate/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/proxy-pools/[id]/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/proxy-pools/[id]/test/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/proxy-pools/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/proxy-pools/vercel-deploy/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/settings/database/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/settings/proxy-test/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/settings/require-login/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/settings/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/shutdown/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/tags/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/translator/console-logs/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/translator/console-logs/stream/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/translator/load/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/translator/save/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/translator/send/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/translator/translate/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/tunnel/disable/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/tunnel/enable/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/tunnel/status/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/tunnel/tailscale-check/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/tunnel/tailscale-disable/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/tunnel/tailscale-enable/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/tunnel/tailscale-install/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/tunnel/tailscale-login/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/tunnel/tailscale-start-daemon/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/usage/[connectionId]/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/usage/api-keys/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/usage/chart/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/usage/history/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/usage/logs/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/usage/providers/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/usage/request-details/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/usage/request-logs/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/usage/stats/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/usage/stream/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/users/[id]/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/users/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/v1/api/chat/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/v1/audio/speech/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/v1/audio/transcriptions/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/v1/audio/voices/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/v1/chat/completions/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/v1/embeddings/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/v1/images/generations/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/v1/messages/count_tokens/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/v1/messages/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/v1/models/[kind]/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/v1/models/info/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/v1/models/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/v1/responses/compact/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/v1/responses/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/v1/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/v1/search/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/v1/web/fetch/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/v1beta/models/[...path]/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/v1beta/models/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/version/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/api/version/update/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/landing/{page-c7ae6a40e2a2228d.js → page-4644660041715534.js} +1 -1
- package/app/.next/static/chunks/app/manifest.webmanifest/route-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/app/page-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/next/dist/client/components/builtin/app-error-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/next/dist/client/components/builtin/forbidden-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/next/dist/client/components/builtin/not-found-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/chunks/next/dist/client/components/builtin/unauthorized-6ec61ce021cdb9a6.js +1 -0
- package/app/.next/static/css/d726e4e5a2cfbfd1.css +1 -0
- package/app/package.json +1 -1
- package/app/public/providers/commandcode.png +0 -0
- package/app/src/mitm/antigravityAvailableModels.fixture.json +632 -0
- package/app/src/mitm/antigravityModels.js +265 -0
- package/app/src/mitm/cert/install.js +13 -8
- package/app/src/mitm/cert/rootCA.js +20 -5
- package/app/src/mitm/config.js +30 -3
- package/app/src/mitm/dns/dnsConfig.js +115 -2
- package/app/src/mitm/handlers/antigravity.js +29 -2
- package/app/src/mitm/handlers/openrouter.js +82 -3
- package/app/src/mitm/logger.js +1 -1
- package/app/src/mitm/manager.js +11 -3
- package/app/src/mitm/server.js +219 -18
- package/app/src/shared/constants/mitmToolHosts.js +5 -1
- package/package.json +1 -1
- package/src/cli/api/client.js +2 -2
- package/src/cli/terminalUI.js +2 -2
- package/src/cli/tray/autostart.js +25 -24
- package/src/cli/tray/tray.js +3 -3
- package/app/.next/server/chunks/2343.js +0 -1
- package/app/.next/static/5xyYjBoSvv2Kb5BwIi7pF/_buildManifest.js +0 -1
- package/app/.next/static/chunks/1321-8d71ef3958ddd91f.js +0 -1
- package/app/.next/static/chunks/2336-9fd2cc8ed73b0db4.js +0 -38
- package/app/.next/static/chunks/app/(dashboard)/dashboard/admin/users/page-15091159f6d63fb7.js +0 -1
- package/app/.next/static/chunks/app/(dashboard)/dashboard/profile/page-6289612ce5f7c181.js +0 -1
- package/app/.next/static/chunks/app/(dashboard)/dashboard/translator/page-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/_global-error/page-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/auth/login/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/auth/logout/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/auth/me/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/cli-tools/antigravity-mitm/alias/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/cli-tools/antigravity-mitm/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/cli-tools/antigravity-mitm/test/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/cli-tools/claude-settings/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/cli-tools/codex-settings/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/cli-tools/copilot-settings/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/cli-tools/cowork-mcp-registry/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/cli-tools/cowork-settings/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/cli-tools/droid-settings/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/cli-tools/hermes-settings/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/cli-tools/openclaw-settings/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/cli-tools/opencode-settings/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/cloud/auth/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/cloud/credentials/update/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/cloud/model/resolve/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/cloud/models/alias/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/combos/[id]/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/combos/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/health/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/init/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/keys/[id]/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/keys/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/locale/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/media-providers/tts/deepgram/voices/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/media-providers/tts/elevenlabs/voices/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/media-providers/tts/inworld/voices/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/media-providers/tts/voices/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/models/alias/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/models/availability/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/models/custom/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/models/disabled/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/models/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/models/test/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/oauth/[provider]/[action]/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/oauth/cursor/auto-import/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/oauth/cursor/import/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/oauth/gitlab/pat/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/oauth/iflow/cookie/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/oauth/kiro/auto-import/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/oauth/kiro/import/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/oauth/kiro/social-authorize/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/oauth/kiro/social-exchange/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/pricing/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/provider-nodes/[id]/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/provider-nodes/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/provider-nodes/validate/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/providers/[id]/models/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/providers/[id]/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/providers/[id]/test/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/providers/[id]/test-models/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/providers/client/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/providers/kilo/free-models/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/providers/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/providers/suggested-models/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/providers/test-batch/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/providers/validate/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/proxy-pools/[id]/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/proxy-pools/[id]/test/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/proxy-pools/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/proxy-pools/vercel-deploy/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/settings/database/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/settings/proxy-test/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/settings/require-login/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/settings/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/shutdown/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/tags/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/translator/console-logs/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/translator/console-logs/stream/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/translator/load/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/translator/save/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/translator/send/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/translator/translate/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/tunnel/disable/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/tunnel/enable/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/tunnel/status/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/tunnel/tailscale-check/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/tunnel/tailscale-disable/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/tunnel/tailscale-enable/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/tunnel/tailscale-install/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/tunnel/tailscale-login/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/tunnel/tailscale-start-daemon/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/usage/[connectionId]/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/usage/api-keys/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/usage/chart/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/usage/history/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/usage/logs/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/usage/providers/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/usage/request-details/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/usage/request-logs/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/usage/stats/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/usage/stream/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/users/[id]/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/users/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/v1/api/chat/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/v1/audio/speech/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/v1/audio/transcriptions/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/v1/audio/voices/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/v1/chat/completions/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/v1/embeddings/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/v1/images/generations/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/v1/messages/count_tokens/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/v1/messages/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/v1/models/[kind]/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/v1/models/info/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/v1/models/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/v1/responses/compact/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/v1/responses/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/v1/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/v1/search/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/v1/web/fetch/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/v1beta/models/[...path]/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/v1beta/models/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/version/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/api/version/update/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/manifest.webmanifest/route-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/app/page-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/next/dist/client/components/builtin/app-error-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/next/dist/client/components/builtin/forbidden-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/next/dist/client/components/builtin/not-found-e26f08039efe859c.js +0 -1
- package/app/.next/static/chunks/next/dist/client/components/builtin/unauthorized-e26f08039efe859c.js +0 -1
- package/app/.next/static/css/48caf49054c81db9.css +0 -1
- /package/app/.next/static/{5xyYjBoSvv2Kb5BwIi7pF → SQn85l_D0P4BshNJQkGiZ}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
const REAL_AVAILABLE_MODELS_FIXTURE = require("./antigravityAvailableModels.fixture.json");
|
|
2
|
+
|
|
3
|
+
const BASE_MODEL_EXPERIMENTS = {
|
|
4
|
+
experiments: {
|
|
5
|
+
CASCADE_USE_EXPERIMENT_CHECKPOINTER: {
|
|
6
|
+
stringValue: JSON.stringify({
|
|
7
|
+
strategy: "CHECKPOINT_STRATEGY_SINGLE_PROMPT",
|
|
8
|
+
max_token_limit: "128000",
|
|
9
|
+
token_threshold: "50000",
|
|
10
|
+
max_overhead_ratio: "0.15",
|
|
11
|
+
moving_window_size: "1",
|
|
12
|
+
enabled: true,
|
|
13
|
+
max_output_tokens: "16384",
|
|
14
|
+
checkpoint_model: "MODEL_PLACEHOLDER_M50",
|
|
15
|
+
retry_config: {
|
|
16
|
+
max_retries: 0,
|
|
17
|
+
initial_sleep_duration_ms: 1000,
|
|
18
|
+
exponential_multiplier: 2,
|
|
19
|
+
include_error_feedback: false,
|
|
20
|
+
},
|
|
21
|
+
}, null, 4),
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const COMMON_CODE_MIME_TYPES = {
|
|
27
|
+
"application/json": true,
|
|
28
|
+
"application/pdf": true,
|
|
29
|
+
"application/rtf": true,
|
|
30
|
+
"application/x-ipynb+json": true,
|
|
31
|
+
"application/x-javascript": true,
|
|
32
|
+
"application/x-python-code": true,
|
|
33
|
+
"application/x-typescript": true,
|
|
34
|
+
"image/heic": true,
|
|
35
|
+
"image/heif": true,
|
|
36
|
+
"image/jpeg": true,
|
|
37
|
+
"image/png": true,
|
|
38
|
+
"image/webp": true,
|
|
39
|
+
"text/css": true,
|
|
40
|
+
"text/csv": true,
|
|
41
|
+
"text/html": true,
|
|
42
|
+
"text/javascript": true,
|
|
43
|
+
"text/markdown": true,
|
|
44
|
+
"text/plain": true,
|
|
45
|
+
"text/rtf": true,
|
|
46
|
+
"text/x-python": true,
|
|
47
|
+
"text/x-python-script": true,
|
|
48
|
+
"text/x-typescript": true,
|
|
49
|
+
"text/xml": true,
|
|
50
|
+
"video/mp4": true,
|
|
51
|
+
"video/webm": true,
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
function quota(resetDays = 7) {
|
|
55
|
+
const resetTime = new Date(Date.now() + resetDays * 24 * 60 * 60 * 1000).toISOString();
|
|
56
|
+
return { remainingFraction: 1, resetTime };
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function geminiModel(displayName, model, options = {}) {
|
|
60
|
+
return {
|
|
61
|
+
displayName,
|
|
62
|
+
supportsImages: true,
|
|
63
|
+
supportsThinking: true,
|
|
64
|
+
thinkingBudget: options.thinkingBudget ?? 1024,
|
|
65
|
+
minThinkingBudget: options.minThinkingBudget ?? 128,
|
|
66
|
+
recommended: true,
|
|
67
|
+
maxTokens: 1048576,
|
|
68
|
+
maxOutputTokens: 65535,
|
|
69
|
+
tokenizerType: "LLAMA_WITH_SPECIAL",
|
|
70
|
+
quotaInfo: quota(options.resetDays),
|
|
71
|
+
model,
|
|
72
|
+
apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
|
|
73
|
+
modelProvider: "MODEL_PROVIDER_GOOGLE",
|
|
74
|
+
supportsVideo: true,
|
|
75
|
+
supportedMimeTypes: COMMON_CODE_MIME_TYPES,
|
|
76
|
+
requiresImageOutputOutsideFunctionResponses: options.requiresImageOutputOutsideFunctionResponses,
|
|
77
|
+
modelExperiments: BASE_MODEL_EXPERIMENTS,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function anthropicModel(displayName, model) {
|
|
82
|
+
return {
|
|
83
|
+
displayName,
|
|
84
|
+
supportsImages: true,
|
|
85
|
+
supportsThinking: true,
|
|
86
|
+
thinkingBudget: 1024,
|
|
87
|
+
recommended: true,
|
|
88
|
+
maxTokens: 250000,
|
|
89
|
+
maxOutputTokens: 64000,
|
|
90
|
+
tokenizerType: "LLAMA_WITH_SPECIAL",
|
|
91
|
+
quotaInfo: quota(),
|
|
92
|
+
model,
|
|
93
|
+
apiProvider: "API_PROVIDER_ANTHROPIC_VERTEX",
|
|
94
|
+
modelProvider: "MODEL_PROVIDER_ANTHROPIC",
|
|
95
|
+
supportedMimeTypes: {
|
|
96
|
+
"image/heic": true,
|
|
97
|
+
"image/heif": true,
|
|
98
|
+
"image/jpeg": true,
|
|
99
|
+
"image/png": true,
|
|
100
|
+
"image/webp": true,
|
|
101
|
+
},
|
|
102
|
+
modelExperiments: BASE_MODEL_EXPERIMENTS,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function openAiModel(displayName, model) {
|
|
107
|
+
return {
|
|
108
|
+
displayName,
|
|
109
|
+
supportsThinking: true,
|
|
110
|
+
thinkingBudget: 8192,
|
|
111
|
+
recommended: true,
|
|
112
|
+
maxTokens: 131072,
|
|
113
|
+
maxOutputTokens: 32768,
|
|
114
|
+
tokenizerType: "LLAMA_WITH_SPECIAL",
|
|
115
|
+
quotaInfo: quota(),
|
|
116
|
+
model,
|
|
117
|
+
apiProvider: "API_PROVIDER_OPENAI_VERTEX",
|
|
118
|
+
modelProvider: "MODEL_PROVIDER_OPENAI",
|
|
119
|
+
modelExperiments: BASE_MODEL_EXPERIMENTS,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function tabModel(model, maxTokens = 16384) {
|
|
124
|
+
return {
|
|
125
|
+
maxTokens,
|
|
126
|
+
maxOutputTokens: 4096,
|
|
127
|
+
tokenizerType: "QWEN2",
|
|
128
|
+
quotaInfo: { remainingFraction: 1 },
|
|
129
|
+
model,
|
|
130
|
+
apiProvider: "API_PROVIDER_INTERNAL",
|
|
131
|
+
supportsCumulativeContext: true,
|
|
132
|
+
supportsEstimateTokenCounter: true,
|
|
133
|
+
isInternal: true,
|
|
134
|
+
promptTemplaterType: "PROMPT_TEMPLATER_TYPE_CHATML",
|
|
135
|
+
toolFormatterType: "TOOL_FORMATTER_TYPE_XML",
|
|
136
|
+
requiresLeadInGeneration: true,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
function googleTabModel(model, maxTokens = 16384) {
|
|
141
|
+
return {
|
|
142
|
+
maxTokens,
|
|
143
|
+
maxOutputTokens: 4096,
|
|
144
|
+
tokenizerType: "LLAMA_WITH_SPECIAL",
|
|
145
|
+
quotaInfo: { remainingFraction: 1 },
|
|
146
|
+
model,
|
|
147
|
+
apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
|
|
148
|
+
modelProvider: "MODEL_PROVIDER_GOOGLE",
|
|
149
|
+
supportsCumulativeContext: true,
|
|
150
|
+
supportsEstimateTokenCounter: true,
|
|
151
|
+
isInternal: true,
|
|
152
|
+
promptTemplaterType: "PROMPT_TEMPLATER_TYPE_CHATML",
|
|
153
|
+
toolFormatterType: "TOOL_FORMATTER_TYPE_XML",
|
|
154
|
+
requiresLeadInGeneration: true,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function imageModel(displayName, model) {
|
|
159
|
+
return {
|
|
160
|
+
displayName,
|
|
161
|
+
supportsImages: true,
|
|
162
|
+
maxTokens: 32768,
|
|
163
|
+
maxOutputTokens: 8192,
|
|
164
|
+
tokenizerType: "LLAMA_WITH_SPECIAL",
|
|
165
|
+
quotaInfo: quota(),
|
|
166
|
+
model,
|
|
167
|
+
apiProvider: "API_PROVIDER_GOOGLE_GEMINI",
|
|
168
|
+
modelProvider: "MODEL_PROVIDER_GOOGLE",
|
|
169
|
+
supportedMimeTypes: COMMON_CODE_MIME_TYPES,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
function freshResetTime(days = 7) {
|
|
174
|
+
return new Date(Date.now() + days * 24 * 60 * 60 * 1000).toISOString();
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function cloneFixtureWithFreshQuota() {
|
|
178
|
+
const payload = JSON.parse(JSON.stringify(REAL_AVAILABLE_MODELS_FIXTURE));
|
|
179
|
+
const agentIds = new Set(
|
|
180
|
+
(payload.agentModelSorts || [])
|
|
181
|
+
.flatMap((sort) => sort.groups || [])
|
|
182
|
+
.flatMap((group) => group.modelIds || []),
|
|
183
|
+
);
|
|
184
|
+
|
|
185
|
+
for (const [id, model] of Object.entries(payload.models || {})) {
|
|
186
|
+
if (!model.quotaInfo) model.quotaInfo = { remainingFraction: 1 };
|
|
187
|
+
model.quotaInfo.remainingFraction = typeof model.quotaInfo.remainingFraction === "number"
|
|
188
|
+
? model.quotaInfo.remainingFraction
|
|
189
|
+
: 1;
|
|
190
|
+
if (model.quotaInfo.resetTime) {
|
|
191
|
+
model.quotaInfo.resetTime = freshResetTime(agentIds.has(id) ? 7 : 1);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
return payload;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
function buildAntigravityAvailableModelsResponse() {
|
|
199
|
+
if (REAL_AVAILABLE_MODELS_FIXTURE?.models) return cloneFixtureWithFreshQuota();
|
|
200
|
+
|
|
201
|
+
const models = {
|
|
202
|
+
"gemini-2.5-flash-thinking": geminiModel("Gemini 3.1 Flash Lite", "MODEL_GOOGLE_GEMINI_2_5_FLASH_THINKING"),
|
|
203
|
+
"gemini-2.5-pro": geminiModel("Gemini 2.5 Pro", "MODEL_GOOGLE_GEMINI_2_5_PRO", {
|
|
204
|
+
requiresImageOutputOutsideFunctionResponses: true,
|
|
205
|
+
}),
|
|
206
|
+
"gemini-2.5-flash-lite": geminiModel("Gemini 3.1 Flash Lite", "MODEL_GOOGLE_GEMINI_2_5_FLASH_LITE"),
|
|
207
|
+
"gemini-2.5-flash": geminiModel("Gemini 3.1 Flash Lite", "MODEL_GOOGLE_GEMINI_2_5_FLASH"),
|
|
208
|
+
"gemini-3.1-flash-lite": geminiModel("Gemini 3.1 Flash Lite", "MODEL_PLACEHOLDER_M50"),
|
|
209
|
+
"gemini-3.1-pro-high": geminiModel("Gemini 3.1 Pro (High)", "MODEL_PLACEHOLDER_M37", {
|
|
210
|
+
thinkingBudget: 10001,
|
|
211
|
+
}),
|
|
212
|
+
"gemini-3.1-pro-low": geminiModel("Gemini 3.1 Pro (Low)", "MODEL_PLACEHOLDER_M36", {
|
|
213
|
+
thinkingBudget: 1001,
|
|
214
|
+
}),
|
|
215
|
+
"gemini-3-flash-agent": geminiModel("Gemini 3 Flash", "MODEL_PLACEHOLDER_M84", {
|
|
216
|
+
thinkingBudget: -1,
|
|
217
|
+
minThinkingBudget: 32,
|
|
218
|
+
}),
|
|
219
|
+
"gemini-3-flash": geminiModel("Gemini 3 Flash", "MODEL_PLACEHOLDER_M18", {
|
|
220
|
+
thinkingBudget: -1,
|
|
221
|
+
minThinkingBudget: 32,
|
|
222
|
+
}),
|
|
223
|
+
"gemini-3.1-flash-image": imageModel("Gemini 3.1 Flash Image", "MODEL_PLACEHOLDER_M21"),
|
|
224
|
+
"claude-sonnet-4-6": anthropicModel("Claude Sonnet 4.6 (Thinking)", "MODEL_PLACEHOLDER_M35"),
|
|
225
|
+
"claude-opus-4-6-thinking": anthropicModel("Claude Opus 4.6 (Thinking)", "MODEL_PLACEHOLDER_M26"),
|
|
226
|
+
"gpt-oss-120b-medium": openAiModel("GPT-OSS 120B (Medium)", "MODEL_OPENAI_GPT_OSS_120B_MEDIUM"),
|
|
227
|
+
"tab_flash_lite_preview": googleTabModel("MODEL_PLACEHOLDER_M19"),
|
|
228
|
+
"tab_jump_flash_lite_preview": googleTabModel("MODEL_PLACEHOLDER_M28"),
|
|
229
|
+
"chat_20706": tabModel("MODEL_CHAT_20706"),
|
|
230
|
+
"chat_23310": tabModel("MODEL_CHAT_23310", 32768),
|
|
231
|
+
};
|
|
232
|
+
|
|
233
|
+
return {
|
|
234
|
+
models,
|
|
235
|
+
defaultAgentModelId: "gemini-3.1-pro-high",
|
|
236
|
+
agentModelSorts: [
|
|
237
|
+
{
|
|
238
|
+
displayName: "Recommended",
|
|
239
|
+
groups: [
|
|
240
|
+
{
|
|
241
|
+
modelIds: [
|
|
242
|
+
"gemini-3.1-pro-high",
|
|
243
|
+
"gemini-3.1-pro-low",
|
|
244
|
+
"gemini-3-flash-agent",
|
|
245
|
+
"claude-sonnet-4-6",
|
|
246
|
+
"claude-opus-4-6-thinking",
|
|
247
|
+
"gpt-oss-120b-medium",
|
|
248
|
+
],
|
|
249
|
+
},
|
|
250
|
+
],
|
|
251
|
+
},
|
|
252
|
+
],
|
|
253
|
+
commandModelIds: ["gemini-3-flash"],
|
|
254
|
+
tabModelIds: ["chat_20706", "chat_23310"],
|
|
255
|
+
imageGenerationModelIds: [],
|
|
256
|
+
mqueryModelIds: ["gemini-3.1-flash-lite"],
|
|
257
|
+
webSearchModelIds: ["gemini-3.1-flash-lite"],
|
|
258
|
+
commitMessageModelIds: ["gemini-3-flash"],
|
|
259
|
+
audioTranscriptionModelIds: [],
|
|
260
|
+
experimentIds: [],
|
|
261
|
+
tieredModelIds: {},
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
module.exports = { buildAntigravityAvailableModelsResponse };
|
|
@@ -4,11 +4,14 @@ const { exec } = require("child_process");
|
|
|
4
4
|
const { execWithPassword, isSudoAvailable } = require("../dns/dnsConfig.js");
|
|
5
5
|
const { runElevatedPowerShell, quotePs } = require("../winElevated.js");
|
|
6
6
|
const { log, err } = require("../logger");
|
|
7
|
+
const { ROOT_CA_CN } = require("./rootCA.js");
|
|
7
8
|
|
|
8
9
|
const IS_WIN = process.platform === "win32";
|
|
9
10
|
const IS_MAC = process.platform === "darwin";
|
|
10
11
|
const LINUX_CERT_DIR = "/usr/local/share/ca-certificates";
|
|
11
|
-
const
|
|
12
|
+
const LEGACY_ROOT_CA_CN = "9Router MITM Root CA";
|
|
13
|
+
const LINUX_CERT_FILE = `${LINUX_CERT_DIR}/openrouterx-root-ca.crt`;
|
|
14
|
+
const LEGACY_LINUX_CERT_FILE = `${LINUX_CERT_DIR}/9router-root-ca.crt`;
|
|
12
15
|
|
|
13
16
|
// Get SHA1 fingerprint from cert file using Node.js crypto
|
|
14
17
|
function getCertFingerprint(certPath) {
|
|
@@ -84,7 +87,10 @@ async function installCert(sudoPassword, certPath) {
|
|
|
84
87
|
|
|
85
88
|
async function installCertMac(sudoPassword, certPath) {
|
|
86
89
|
// Remove all old certs with same name first to avoid duplicate/stale cert conflict
|
|
87
|
-
const deleteOld =
|
|
90
|
+
const deleteOld = [
|
|
91
|
+
`security delete-certificate -c "${LEGACY_ROOT_CA_CN}" /Library/Keychains/System.keychain 2>/dev/null || true`,
|
|
92
|
+
`security delete-certificate -c "${ROOT_CA_CN}" /Library/Keychains/System.keychain 2>/dev/null || true`,
|
|
93
|
+
].join(" && ");
|
|
88
94
|
const install = `security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain "${certPath}"`;
|
|
89
95
|
try {
|
|
90
96
|
await execWithPassword(`${deleteOld} && ${install}`, sudoPassword);
|
|
@@ -99,6 +105,7 @@ async function installCertWindows(certPath) {
|
|
|
99
105
|
// Auto-elevate via UAC popup if not admin (zero popup if already admin).
|
|
100
106
|
// Delete any stale cert with same CN before adding to avoid duplicates.
|
|
101
107
|
const script = `
|
|
108
|
+
certutil -delstore Root ${quotePs(LEGACY_ROOT_CA_CN)} 2>$null | Out-Null
|
|
102
109
|
certutil -delstore Root ${quotePs(ROOT_CA_CN)} 2>$null | Out-Null
|
|
103
110
|
$exit = & certutil -addstore Root ${quotePs(certPath)} 2>&1
|
|
104
111
|
if ($LASTEXITCODE -ne 0) { throw "certutil exit $LASTEXITCODE" }
|
|
@@ -153,8 +160,7 @@ async function uninstallCertWindows() {
|
|
|
153
160
|
}
|
|
154
161
|
|
|
155
162
|
function checkCertInstalledLinux() {
|
|
156
|
-
|
|
157
|
-
return Promise.resolve(fs.existsSync(certFile));
|
|
163
|
+
return Promise.resolve(fs.existsSync(LINUX_CERT_FILE));
|
|
158
164
|
}
|
|
159
165
|
|
|
160
166
|
async function installCertLinux(sudoPassword, certPath) {
|
|
@@ -162,9 +168,9 @@ async function installCertLinux(sudoPassword, certPath) {
|
|
|
162
168
|
log(`🔐 Cert: cannot install to system store without sudo — trust this file on clients: ${certPath}`);
|
|
163
169
|
return;
|
|
164
170
|
}
|
|
165
|
-
const destFile =
|
|
171
|
+
const destFile = LINUX_CERT_FILE;
|
|
166
172
|
// Try update-ca-certificates (Debian/Ubuntu), fallback to update-ca-trust (Fedora/RHEL)
|
|
167
|
-
const cmd = `cp "${certPath}" "${destFile}" && (update-ca-certificates 2>/dev/null || update-ca-trust 2>/dev/null || true)`;
|
|
173
|
+
const cmd = `rm -f "${LEGACY_LINUX_CERT_FILE}" && cp "${certPath}" "${destFile}" && (update-ca-certificates 2>/dev/null || update-ca-trust 2>/dev/null || true)`;
|
|
168
174
|
try {
|
|
169
175
|
await execWithPassword(cmd, sudoPassword);
|
|
170
176
|
log("🔐 Cert: ✅ installed to Linux trust store");
|
|
@@ -177,8 +183,7 @@ async function uninstallCertLinux(sudoPassword) {
|
|
|
177
183
|
if (!isSudoAvailable()) {
|
|
178
184
|
return;
|
|
179
185
|
}
|
|
180
|
-
const
|
|
181
|
-
const cmd = `rm -f "${destFile}" && (update-ca-certificates 2>/dev/null || update-ca-trust 2>/dev/null || true)`;
|
|
186
|
+
const cmd = `rm -f "${LINUX_CERT_FILE}" "${LEGACY_LINUX_CERT_FILE}" && (update-ca-certificates 2>/dev/null || update-ca-trust 2>/dev/null || true)`;
|
|
182
187
|
try {
|
|
183
188
|
await execWithPassword(cmd, sudoPassword);
|
|
184
189
|
log("🔐 Cert: ✅ uninstalled from Linux trust store");
|
|
@@ -5,6 +5,8 @@ const { MITM_DIR } = require("../paths");
|
|
|
5
5
|
|
|
6
6
|
const ROOT_CA_KEY_PATH = path.join(MITM_DIR, "rootCA.key");
|
|
7
7
|
const ROOT_CA_CERT_PATH = path.join(MITM_DIR, "rootCA.crt");
|
|
8
|
+
const ROOT_CA_CN = "OpenRouterX MITM Root CA";
|
|
9
|
+
const ROOT_CA_ORG = "OpenRouterX";
|
|
8
10
|
|
|
9
11
|
/**
|
|
10
12
|
* Check if cert file is expired or expiring within 30 days
|
|
@@ -19,18 +21,29 @@ function isCertExpired(certPath) {
|
|
|
19
21
|
}
|
|
20
22
|
}
|
|
21
23
|
|
|
24
|
+
function isOpenRouterXRootCA(certPath) {
|
|
25
|
+
try {
|
|
26
|
+
const cert = forge.pki.certificateFromPem(fs.readFileSync(certPath, "utf8"));
|
|
27
|
+
const cn = cert.subject.getField("CN")?.value;
|
|
28
|
+
const org = cert.subject.getField("O")?.value;
|
|
29
|
+
return cn === ROOT_CA_CN && org === ROOT_CA_ORG;
|
|
30
|
+
} catch {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
22
35
|
/**
|
|
23
36
|
* Generate Root CA certificate (only once, auto-regenerate if expired)
|
|
24
37
|
* This Root CA will sign all dynamic leaf certificates
|
|
25
38
|
*/
|
|
26
39
|
async function generateRootCA() {
|
|
27
40
|
const exists = fs.existsSync(ROOT_CA_KEY_PATH) && fs.existsSync(ROOT_CA_CERT_PATH);
|
|
28
|
-
if (exists && !isCertExpired(ROOT_CA_CERT_PATH)) {
|
|
41
|
+
if (exists && !isCertExpired(ROOT_CA_CERT_PATH) && isOpenRouterXRootCA(ROOT_CA_CERT_PATH)) {
|
|
29
42
|
console.log("✅ Root CA already exists");
|
|
30
43
|
return { key: ROOT_CA_KEY_PATH, cert: ROOT_CA_CERT_PATH };
|
|
31
44
|
}
|
|
32
45
|
if (exists) {
|
|
33
|
-
console.log("🔐 Root CA expired or
|
|
46
|
+
console.log("🔐 Root CA expired, stale, or branded for legacy 9Router — regenerating...");
|
|
34
47
|
try { fs.unlinkSync(ROOT_CA_KEY_PATH); } catch { /* ignore */ }
|
|
35
48
|
try { fs.unlinkSync(ROOT_CA_CERT_PATH); } catch { /* ignore */ }
|
|
36
49
|
}
|
|
@@ -53,8 +66,8 @@ async function generateRootCA() {
|
|
|
53
66
|
cert.validity.notAfter.setFullYear(cert.validity.notBefore.getFullYear() + 10);
|
|
54
67
|
|
|
55
68
|
const attrs = [
|
|
56
|
-
{ name: "commonName", value:
|
|
57
|
-
{ name: "organizationName", value:
|
|
69
|
+
{ name: "commonName", value: ROOT_CA_CN },
|
|
70
|
+
{ name: "organizationName", value: ROOT_CA_ORG },
|
|
58
71
|
{ name: "countryName", value: "US" }
|
|
59
72
|
];
|
|
60
73
|
|
|
@@ -169,5 +182,7 @@ module.exports = {
|
|
|
169
182
|
generateLeafCert,
|
|
170
183
|
isCertExpired,
|
|
171
184
|
ROOT_CA_CERT_PATH,
|
|
172
|
-
ROOT_CA_KEY_PATH
|
|
185
|
+
ROOT_CA_KEY_PATH,
|
|
186
|
+
ROOT_CA_CN,
|
|
187
|
+
ROOT_CA_ORG
|
|
173
188
|
};
|
package/app/src/mitm/config.js
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
const TARGET_HOSTS = [
|
|
4
4
|
"daily-cloudcode-pa.googleapis.com",
|
|
5
5
|
"cloudcode-pa.googleapis.com",
|
|
6
|
+
"daily-cloudcode-pa.sandbox.googleapis.com",
|
|
6
7
|
"api.individual.githubcopilot.com",
|
|
7
8
|
"q.us-east-1.amazonaws.com",
|
|
8
9
|
"api2.cursor.sh",
|
|
@@ -15,12 +16,38 @@ const URL_PATTERNS = {
|
|
|
15
16
|
copilot: ["/chat/completions", "/v1/messages", "/responses"],
|
|
16
17
|
kiro: ["/generateAssistantResponse"],
|
|
17
18
|
cursor: ["/BidiAppend", "/RunSSE", "/RunPoll", "/Run"],
|
|
18
|
-
openrouter: [
|
|
19
|
+
openrouter: [
|
|
20
|
+
"/models",
|
|
21
|
+
"/api/v1/models",
|
|
22
|
+
"/api/v1/key",
|
|
23
|
+
"/api/v1/auth/key",
|
|
24
|
+
"/chat/completions",
|
|
25
|
+
"/v1/chat/completions",
|
|
26
|
+
"/api/v1/chat/completions",
|
|
27
|
+
"/v1/messages",
|
|
28
|
+
"/responses",
|
|
29
|
+
"/api/v1/responses",
|
|
30
|
+
],
|
|
19
31
|
};
|
|
20
32
|
|
|
21
33
|
// Synonym map: rawModel from request → canonical alias key in mitmAlias DB
|
|
22
34
|
const MODEL_SYNONYMS = {
|
|
23
|
-
antigravity: {
|
|
35
|
+
antigravity: {
|
|
36
|
+
"gemini-default": "gemini-3-flash",
|
|
37
|
+
"gemini-3-flash-agent": "gemini-3-flash",
|
|
38
|
+
"gemini-3.1-flash-lite": "gemini-3-flash",
|
|
39
|
+
"gemini-2.5-flash-lite": "gemini-3-flash",
|
|
40
|
+
"gemini-2.5-flash": "gemini-3-flash",
|
|
41
|
+
__defaults: {
|
|
42
|
+
"gemini-3.1-pro-high": "gemini-3.1-pro-high",
|
|
43
|
+
"gemini-3.1-pro-low": "gemini-3.1-pro-low",
|
|
44
|
+
"gemini-3-flash-agent": "cx/gpt-5.5",
|
|
45
|
+
"gemini-3-flash": "cx/gpt-5.5",
|
|
46
|
+
"claude-sonnet-4-6": "claude-sonnet-4-6",
|
|
47
|
+
"claude-opus-4-6-thinking": "claude-opus-4-6-thinking",
|
|
48
|
+
"gpt-oss-120b-medium": "gpt-oss-120b-medium",
|
|
49
|
+
},
|
|
50
|
+
},
|
|
24
51
|
};
|
|
25
52
|
|
|
26
53
|
// URL substrings whose request/response should NOT be dumped to file (telemetry, polling, empty)
|
|
@@ -35,7 +62,7 @@ const LOG_BLACKLIST_URL_PARTS = [
|
|
|
35
62
|
function getToolForHost(host) {
|
|
36
63
|
const h = (host || "").split(":")[0];
|
|
37
64
|
if (h === "api.individual.githubcopilot.com") return "copilot";
|
|
38
|
-
if (h === "daily-cloudcode-pa.googleapis.com" || h === "cloudcode-pa.googleapis.com") return "antigravity";
|
|
65
|
+
if (h === "daily-cloudcode-pa.googleapis.com" || h === "cloudcode-pa.googleapis.com" || h === "daily-cloudcode-pa.sandbox.googleapis.com") return "antigravity";
|
|
39
66
|
if (h === "q.us-east-1.amazonaws.com") return "kiro";
|
|
40
67
|
if (h === "api2.cursor.sh") return "cursor";
|
|
41
68
|
if (h === "openrouter.ai" || h === "api.openrouter.ai") return "openrouter";
|
|
@@ -12,8 +12,8 @@ const { runElevatedPowerShell, isAdmin } = require("../winElevated.js");
|
|
|
12
12
|
* If anything fails mid-way, restore from `.bak`. Same-volume renames are atomic on NTFS.
|
|
13
13
|
*/
|
|
14
14
|
function atomicWriteHostsWin(target, originalContent, newContent) {
|
|
15
|
-
const tmpNew = `${target}.
|
|
16
|
-
const tmpBak = `${target}.
|
|
15
|
+
const tmpNew = `${target}.openrouterx.new`;
|
|
16
|
+
const tmpBak = `${target}.openrouterx.bak`;
|
|
17
17
|
try {
|
|
18
18
|
fs.writeFileSync(tmpNew, newContent, "utf8");
|
|
19
19
|
try { fs.unlinkSync(tmpBak); } catch { /* none */ }
|
|
@@ -36,6 +36,18 @@ const IS_MAC = process.platform === "darwin";
|
|
|
36
36
|
const HOSTS_FILE = IS_WIN
|
|
37
37
|
? path.join(process.env.SystemRoot || "C:\\Windows", "System32", "drivers", "etc", "hosts")
|
|
38
38
|
: "/etc/hosts";
|
|
39
|
+
const MAC_PF_ANTIGRAVITY_ANCHOR = "com.apple/openrouterx-mitm-antigravity";
|
|
40
|
+
const MAC_ANTIGRAVITY_FALLBACK_IPS = [
|
|
41
|
+
"216.239.32.223",
|
|
42
|
+
"216.239.34.223",
|
|
43
|
+
"216.239.36.223",
|
|
44
|
+
"216.239.38.223",
|
|
45
|
+
];
|
|
46
|
+
const MAC_ANTIGRAVITY_LEGACY_SHARED_IP_PREFIXES = [
|
|
47
|
+
"142.250.",
|
|
48
|
+
"142.251.",
|
|
49
|
+
"172.217.",
|
|
50
|
+
];
|
|
39
51
|
|
|
40
52
|
/** True when `sudo` exists (e.g. missing on minimal Docker images like Alpine). */
|
|
41
53
|
function isSudoAvailable() {
|
|
@@ -110,6 +122,97 @@ async function flushDNS(sudoPassword) {
|
|
|
110
122
|
}
|
|
111
123
|
}
|
|
112
124
|
|
|
125
|
+
function shellQuoteSingle(str) {
|
|
126
|
+
return `'${String(str).replace(/'/g, "'\\''")}'`;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function getDefaultMacInterface() {
|
|
130
|
+
if (!IS_MAC) return "";
|
|
131
|
+
try {
|
|
132
|
+
const out = execSync("route -n get default 2>/dev/null | awk '/interface:/{print $2; exit}'", {
|
|
133
|
+
encoding: "utf8",
|
|
134
|
+
windowsHide: true,
|
|
135
|
+
}).trim();
|
|
136
|
+
return out || "en0";
|
|
137
|
+
} catch {
|
|
138
|
+
return "en0";
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
async function getMacAntigravityRedirectIPs() {
|
|
143
|
+
return [...MAC_ANTIGRAVITY_FALLBACK_IPS];
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function getMacLoopbackIPv4Aliases() {
|
|
147
|
+
if (!IS_MAC) return [];
|
|
148
|
+
try {
|
|
149
|
+
const out = execSync("ifconfig lo0", { encoding: "utf8", windowsHide: true });
|
|
150
|
+
return [...out.matchAll(/^\s+inet\s+(\d+\.\d+\.\d+\.\d+)\s+/gm)].map((m) => m[1]);
|
|
151
|
+
} catch {
|
|
152
|
+
return [];
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
function getMacLegacyAntigravityAliases() {
|
|
157
|
+
return getMacLoopbackIPv4Aliases().filter((ip) =>
|
|
158
|
+
MAC_ANTIGRAVITY_LEGACY_SHARED_IP_PREFIXES.some((prefix) => ip.startsWith(prefix))
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
async function enableMacAntigravityRedirect(sudoPassword) {
|
|
163
|
+
if (!IS_MAC) return;
|
|
164
|
+
const ips = await getMacAntigravityRedirectIPs();
|
|
165
|
+
if (ips.length === 0) return;
|
|
166
|
+
|
|
167
|
+
await enableMacAntigravityLoopbackAliases(sudoPassword, ips);
|
|
168
|
+
|
|
169
|
+
const iface = getDefaultMacInterface();
|
|
170
|
+
const rules = [
|
|
171
|
+
`table <openrouterx_antigravity> persist { ${ips.join(", ")} }`,
|
|
172
|
+
`rdr pass on ${iface} inet proto tcp from any to <openrouterx_antigravity> port 443 -> 127.0.0.1 port 443`,
|
|
173
|
+
"",
|
|
174
|
+
].join("\n");
|
|
175
|
+
const command = [
|
|
176
|
+
"pfctl -E >/dev/null 2>&1 || true",
|
|
177
|
+
`printf '%s' ${shellQuoteSingle(rules)} | pfctl -a ${shellQuoteSingle(MAC_PF_ANTIGRAVITY_ANCHOR)} -f -`,
|
|
178
|
+
].join(" && ");
|
|
179
|
+
|
|
180
|
+
await execWithPassword(command, sudoPassword);
|
|
181
|
+
log(`🌐 PF antigravity: ✅ redirect active on ${iface} (${ips.length} IPs)`);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
async function disableMacAntigravityRedirect(sudoPassword) {
|
|
185
|
+
if (!IS_MAC) return;
|
|
186
|
+
const ips = [...new Set([
|
|
187
|
+
...await getMacAntigravityRedirectIPs(),
|
|
188
|
+
...getMacLegacyAntigravityAliases(),
|
|
189
|
+
])];
|
|
190
|
+
await execWithPassword(`pfctl -a ${shellQuoteSingle(MAC_PF_ANTIGRAVITY_ANCHOR)} -F all >/dev/null 2>&1 || true`, sudoPassword);
|
|
191
|
+
await disableMacAntigravityLoopbackAliases(sudoPassword, ips);
|
|
192
|
+
log("🌐 PF antigravity: ✅ redirect removed");
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
async function enableMacAntigravityLoopbackAliases(sudoPassword, ips) {
|
|
196
|
+
if (!IS_MAC || !ips.length) return;
|
|
197
|
+
const commands = ips.map((ip) => `ifconfig lo0 alias ${ip}/32 2>/dev/null || true`);
|
|
198
|
+
await execWithPassword(commands.join("; "), sudoPassword);
|
|
199
|
+
log(`🌐 lo0 antigravity: ✅ aliases active (${ips.length} IPs)`);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
async function disableMacAntigravityLoopbackAliases(sudoPassword, ips) {
|
|
203
|
+
if (!IS_MAC || !ips.length) return;
|
|
204
|
+
const commands = ips.map((ip) => `ifconfig lo0 -alias ${ip} 2>/dev/null || true`);
|
|
205
|
+
await execWithPassword(commands.join("; "), sudoPassword);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
async function ensureToolNetworkRedirect(tool, sudoPassword) {
|
|
209
|
+
if (tool === "antigravity") await enableMacAntigravityRedirect(sudoPassword);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
async function removeToolNetworkRedirect(tool, sudoPassword) {
|
|
213
|
+
if (tool === "antigravity") await disableMacAntigravityRedirect(sudoPassword);
|
|
214
|
+
}
|
|
215
|
+
|
|
113
216
|
/**
|
|
114
217
|
* Check if DNS entry exists for a specific host
|
|
115
218
|
*/
|
|
@@ -150,6 +253,7 @@ async function addDNSEntry(tool, sudoPassword) {
|
|
|
150
253
|
const entriesToAdd = hosts.filter(h => !checkDNSEntry(h));
|
|
151
254
|
if (entriesToAdd.length === 0) {
|
|
152
255
|
log(`🌐 DNS ${tool}: already active`);
|
|
256
|
+
await ensureToolNetworkRedirect(tool, sudoPassword);
|
|
153
257
|
return;
|
|
154
258
|
}
|
|
155
259
|
|
|
@@ -172,6 +276,7 @@ async function addDNSEntry(tool, sudoPassword) {
|
|
|
172
276
|
await execWithPassword(`printf '%s' '${escaped}' | tee ${HOSTS_FILE} > /dev/null`, sudoPassword);
|
|
173
277
|
await flushDNS(sudoPassword);
|
|
174
278
|
}
|
|
279
|
+
await ensureToolNetworkRedirect(tool, sudoPassword);
|
|
175
280
|
log(`🌐 DNS ${tool}: ✅ added ${entriesToAdd.join(", ")}`);
|
|
176
281
|
} catch (error) {
|
|
177
282
|
const msg = error.message?.includes("incorrect password") ? "Wrong sudo password" : `Failed to add DNS entry: ${error.message}`;
|
|
@@ -189,6 +294,7 @@ async function removeDNSEntry(tool, sudoPassword) {
|
|
|
189
294
|
const entriesToRemove = hosts.filter(h => checkDNSEntry(h));
|
|
190
295
|
if (entriesToRemove.length === 0) {
|
|
191
296
|
log(`🌐 DNS ${tool}: already inactive`);
|
|
297
|
+
await removeToolNetworkRedirect(tool, sudoPassword);
|
|
192
298
|
return;
|
|
193
299
|
}
|
|
194
300
|
|
|
@@ -207,6 +313,7 @@ async function removeDNSEntry(tool, sudoPassword) {
|
|
|
207
313
|
await execWithPassword(`printf '%s' '${escaped}' | tee ${HOSTS_FILE} > /dev/null`, sudoPassword);
|
|
208
314
|
await flushDNS(sudoPassword);
|
|
209
315
|
}
|
|
316
|
+
await removeToolNetworkRedirect(tool, sudoPassword);
|
|
210
317
|
log(`🌐 DNS ${tool}: ✅ removed ${entriesToRemove.join(", ")}`);
|
|
211
318
|
} catch (error) {
|
|
212
319
|
const msg = error.message?.includes("incorrect password") ? "Wrong sudo password" : `Failed to remove DNS entry: ${error.message}`;
|
|
@@ -233,6 +340,12 @@ async function removeAllDNSEntries(sudoPassword) {
|
|
|
233
340
|
*/
|
|
234
341
|
function removeAllDNSEntriesSync() {
|
|
235
342
|
try {
|
|
343
|
+
if (IS_MAC) {
|
|
344
|
+
try { execSync(`pfctl -a ${MAC_PF_ANTIGRAVITY_ANCHOR} -F all >/dev/null 2>&1 || true`, { stdio: "ignore" }); } catch { /* ignore */ }
|
|
345
|
+
for (const ip of MAC_ANTIGRAVITY_FALLBACK_IPS) {
|
|
346
|
+
try { execSync(`ifconfig lo0 -alias ${ip} 2>/dev/null || true`, { stdio: "ignore" }); } catch { /* ignore */ }
|
|
347
|
+
}
|
|
348
|
+
}
|
|
236
349
|
if (!fs.existsSync(HOSTS_FILE)) return;
|
|
237
350
|
const allHosts = Object.values(TOOL_HOSTS).flat();
|
|
238
351
|
const content = fs.readFileSync(HOSTS_FILE, "utf8");
|
|
@@ -1,12 +1,18 @@
|
|
|
1
|
-
const { err, createResponseDumper } = require("../logger");
|
|
1
|
+
const { log, err, createResponseDumper } = require("../logger");
|
|
2
2
|
const { fetchRouter, pipeSSE } = require("./base");
|
|
3
3
|
|
|
4
|
+
const NO_CREDENTIALS_MARKER = "No active credentials for provider";
|
|
5
|
+
|
|
4
6
|
/**
|
|
5
7
|
* Intercept Antigravity request — forward Gemini body as-is to /v1/chat/completions.
|
|
6
8
|
* Router auto-detects format via body.userAgent==="antigravity" + body.request.contents,
|
|
7
9
|
* runs antigravity→openai→provider→openai→antigravity translators internally.
|
|
10
|
+
*
|
|
11
|
+
* Graceful fallback: if Router returns 404 because no provider credentials are
|
|
12
|
+
* configured, passthrough to the real upstream so Antigravity works out-of-the-box
|
|
13
|
+
* without requiring a login in the Router dashboard.
|
|
8
14
|
*/
|
|
9
|
-
async function intercept(req, res, bodyBuffer, mappedModel) {
|
|
15
|
+
async function intercept(req, res, bodyBuffer, mappedModel, passthrough) {
|
|
10
16
|
const dumper = createResponseDumper(req, "intercept-antigravity");
|
|
11
17
|
const isStream = req.url.includes(":streamGenerateContent");
|
|
12
18
|
try {
|
|
@@ -14,6 +20,27 @@ async function intercept(req, res, bodyBuffer, mappedModel) {
|
|
|
14
20
|
if (body.model) body.model = mappedModel;
|
|
15
21
|
|
|
16
22
|
const routerRes = await fetchRouter(body, "/v1/chat/completions", req.headers);
|
|
23
|
+
|
|
24
|
+
// Graceful fallback: no credentials in Router → passthrough to real upstream
|
|
25
|
+
if (routerRes.status === 404) {
|
|
26
|
+
const text = await routerRes.text();
|
|
27
|
+
if (text.includes(NO_CREDENTIALS_MARKER)) {
|
|
28
|
+
log(`⏩ passthrough | antigravity | no credentials for mapped model "${mappedModel || "unknown"}" — forwarding to real upstream`);
|
|
29
|
+
if (dumper) {
|
|
30
|
+
dumper.writeHeader(routerRes.status, Object.fromEntries(routerRes.headers));
|
|
31
|
+
dumper.writeChunk(text);
|
|
32
|
+
dumper.end();
|
|
33
|
+
}
|
|
34
|
+
return passthrough(req, res, bodyBuffer);
|
|
35
|
+
}
|
|
36
|
+
// Other 404 errors: propagate as-is
|
|
37
|
+
if (!res.headersSent) {
|
|
38
|
+
res.writeHead(404, { "Content-Type": "application/json" });
|
|
39
|
+
res.end(text);
|
|
40
|
+
}
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
|
|
17
44
|
await pipeSSE(routerRes, res, dumper);
|
|
18
45
|
} catch (error) {
|
|
19
46
|
err(`[antigravity] ${error.message}`);
|