@yina-npm/openrouterx 0.4.10 → 0.4.18
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 +250 -1124
- package/app/.next/BUILD_ID +1 -1
- package/app/.next/app-path-routes-manifest.json +16 -4
- package/app/.next/build-manifest.json +3 -3
- package/app/.next/prerender-manifest.json +3 -339
- package/app/.next/react-loadable-manifest.json +1 -8
- package/app/.next/routes-manifest.json +79 -3
- package/app/.next/server/app/(dashboard)/dashboard/admin/keys/page.js +2 -0
- package/app/.next/server/app/(dashboard)/dashboard/admin/keys/page.js.nft.json +1 -0
- package/app/.next/server/app/(dashboard)/dashboard/admin/keys/page_client-reference-manifest.js +1 -0
- package/app/.next/server/app/(dashboard)/dashboard/admin/users/page.js +2 -0
- package/app/.next/server/app/(dashboard)/dashboard/admin/users/page.js.nft.json +1 -0
- package/app/.next/server/app/(dashboard)/dashboard/admin/users/page_client-reference-manifest.js +1 -0
- package/app/.next/server/app/(dashboard)/dashboard/basic-chat/page.js +2 -2
- package/app/.next/server/app/(dashboard)/dashboard/basic-chat/page.js.nft.json +1 -1
- 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.js.nft.json +1 -1
- 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.js.nft.json +1 -1
- 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.js.nft.json +1 -1
- 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.js.nft.json +1 -1
- 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 +23 -17
- package/app/.next/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js.nft.json +1 -1
- 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.js.nft.json +1 -1
- 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 +5 -0
- package/app/.next/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js.nft.json +1 -0
- package/app/.next/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -0
- 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.js.nft.json +1 -1
- 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.js.nft.json +1 -1
- 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.js.nft.json +1 -1
- 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.js.nft.json +1 -1
- 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.js.nft.json +1 -1
- 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.js.nft.json +1 -1
- 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.js.nft.json +1 -1
- 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 +5 -3
- package/app/.next/server/app/(dashboard)/dashboard/proxy-pools/page.js.nft.json +1 -1
- 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.js.nft.json +1 -1
- 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 -0
- package/app/.next/server/app/(dashboard)/dashboard/skills/page.js.nft.json +1 -0
- package/app/.next/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -0
- package/app/.next/server/app/(dashboard)/dashboard/translator/page.js +2 -2
- package/app/.next/server/app/(dashboard)/dashboard/translator/page.js.nft.json +1 -1
- 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.js.nft.json +1 -1
- 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 +5 -0
- package/app/.next/server/app/(dashboard)/dashboard/user/page.js.nft.json +1 -0
- package/app/.next/server/app/(dashboard)/dashboard/user/page_client-reference-manifest.js +1 -0
- package/app/.next/server/app/_global-error/page.js +3 -3
- 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.js.nft.json +1 -1
- 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/login/route.js.nft.json +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 -0
- package/app/.next/server/app/api/auth/me/route.js.nft.json +1 -0
- package/app/.next/server/app/api/auth/me/route_client-reference-manifest.js +1 -0
- 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/route.js +1 -1
- package/app/.next/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -1
- package/app/.next/server/app/api/cli-tools/claude-settings/route.js +2 -2
- package/app/.next/server/app/api/cli-tools/claude-settings/route.js.nft.json +1 -1
- package/app/.next/server/app/api/cli-tools/codex-settings/route.js +3 -3
- package/app/.next/server/app/api/cli-tools/codex-settings/route.js.nft.json +1 -1
- package/app/.next/server/app/api/cli-tools/copilot-settings/route.js +2 -2
- package/app/.next/server/app/api/cli-tools/cowork-settings/route.js +2 -0
- package/app/.next/server/app/api/cli-tools/cowork-settings/route.js.nft.json +1 -0
- package/app/.next/server/app/api/cli-tools/cowork-settings/route_client-reference-manifest.js +1 -0
- package/app/.next/server/app/api/cli-tools/droid-settings/route.js +2 -2
- package/app/.next/server/app/api/cli-tools/droid-settings/route.js.nft.json +1 -1
- package/app/.next/server/app/api/cli-tools/hermes-settings/route.js +7 -7
- package/app/.next/server/app/api/cli-tools/hermes-settings/route.js.nft.json +1 -1
- package/app/.next/server/app/api/cli-tools/openclaw-settings/route.js +2 -2
- package/app/.next/server/app/api/cli-tools/openclaw-settings/route.js.nft.json +1 -1
- package/app/.next/server/app/api/cli-tools/opencode-settings/route.js +2 -2
- package/app/.next/server/app/api/cli-tools/opencode-settings/route.js.nft.json +1 -1
- 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/init/route.js.nft.json +1 -1
- package/app/.next/server/app/api/keys/[id]/route.js +1 -1
- package/app/.next/server/app/api/keys/[id]/route.js.nft.json +1 -1
- package/app/.next/server/app/api/keys/route.js +1 -1
- package/app/.next/server/app/api/keys/route.js.nft.json +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/elevenlabs/voices/route.js.nft.json +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/media-providers/tts/voices/route.js.nft.json +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 -0
- package/app/.next/server/app/api/models/disabled/route.js.nft.json +1 -0
- package/app/.next/server/app/api/models/disabled/route_client-reference-manifest.js +1 -0
- 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 +6 -1
- 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/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]/test/route.js +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/validate/route.js +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/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/require-login/route.js +1 -1
- package/app/.next/server/app/api/settings/route.js +1 -1
- package/app/.next/server/app/api/settings/route.js.nft.json +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 +4 -4
- 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/disable/route.js.nft.json +1 -1
- package/app/.next/server/app/api/tunnel/enable/route.js +1 -1
- package/app/.next/server/app/api/tunnel/enable/route.js.nft.json +1 -1
- package/app/.next/server/app/api/tunnel/status/route.js +1 -1
- package/app/.next/server/app/api/tunnel/status/route.js.nft.json +1 -1
- package/app/.next/server/app/api/tunnel/tailscale-check/route.js +1 -23
- package/app/.next/server/app/api/tunnel/tailscale-check/route.js.nft.json +1 -1
- package/app/.next/server/app/api/tunnel/tailscale-disable/route.js +1 -1
- package/app/.next/server/app/api/tunnel/tailscale-disable/route.js.nft.json +1 -1
- package/app/.next/server/app/api/tunnel/tailscale-enable/route.js +1 -1
- package/app/.next/server/app/api/tunnel/tailscale-enable/route.js.nft.json +1 -1
- package/app/.next/server/app/api/tunnel/tailscale-install/route.js +3 -3
- package/app/.next/server/app/api/tunnel/tailscale-install/route.js.nft.json +1 -1
- package/app/.next/server/app/api/tunnel/tailscale-login/route.js +1 -23
- package/app/.next/server/app/api/tunnel/tailscale-login/route.js.nft.json +1 -1
- package/app/.next/server/app/api/tunnel/tailscale-start-daemon/route.js +2 -2
- package/app/.next/server/app/api/tunnel/tailscale-start-daemon/route.js.nft.json +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 -0
- package/app/.next/server/app/api/usage/api-keys/route.js.nft.json +1 -0
- package/app/.next/server/app/api/usage/api-keys/route_client-reference-manifest.js +1 -0
- package/app/.next/server/app/api/usage/chart/route.js +1 -1
- package/app/.next/server/app/api/usage/chart/route.js.nft.json +1 -1
- package/app/.next/server/app/api/usage/history/route.js +1 -1
- package/app/.next/server/app/api/usage/history/route.js.nft.json +1 -1
- package/app/.next/server/app/api/usage/logs/route.js +1 -1
- package/app/.next/server/app/api/usage/logs/route.js.nft.json +1 -1
- package/app/.next/server/app/api/usage/providers/route.js +1 -1
- package/app/.next/server/app/api/usage/providers/route.js.nft.json +1 -1
- package/app/.next/server/app/api/usage/request-details/route.js +1 -1
- package/app/.next/server/app/api/usage/request-details/route.js.nft.json +1 -1
- package/app/.next/server/app/api/usage/request-logs/route.js +1 -1
- package/app/.next/server/app/api/usage/request-logs/route.js.nft.json +1 -1
- package/app/.next/server/app/api/usage/stats/route.js +1 -1
- package/app/.next/server/app/api/usage/stats/route.js.nft.json +1 -1
- package/app/.next/server/app/api/usage/stream/route.js +4 -4
- package/app/.next/server/app/api/usage/stream/route.js.nft.json +1 -1
- package/app/.next/server/app/api/users/[id]/route.js +1 -0
- package/app/.next/server/app/api/users/[id]/route.js.nft.json +1 -0
- package/app/.next/server/app/api/users/[id]/route_client-reference-manifest.js +1 -0
- package/app/.next/server/app/api/users/route.js +1 -0
- package/app/.next/server/app/api/users/route.js.nft.json +1 -0
- package/app/.next/server/app/api/users/route_client-reference-manifest.js +1 -0
- 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 -0
- package/app/.next/server/app/api/v1/audio/transcriptions/route.js.nft.json +1 -0
- package/app/.next/server/app/api/v1/audio/transcriptions/route_client-reference-manifest.js +1 -0
- 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 +3 -3
- 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 -0
- package/app/.next/server/app/api/v1/models/[kind]/route.js.nft.json +1 -0
- package/app/.next/server/app/api/v1/models/[kind]/route_client-reference-manifest.js +1 -0
- 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.js.nft.json +1 -1
- 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.js.nft.json +1 -1
- 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 +5 -5
- package/app/.next/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +5 -5
- 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 +2 -2
- 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.js.nft.json +1 -1
- 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 +4 -4
- package/app/.next/server/app/landing.segments/_full.segment.rsc +4 -4
- 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 +1 -1
- 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.js.nft.json +1 -1
- 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.js.nft.json +1 -1
- package/app/.next/server/app/page_client-reference-manifest.js +1 -1
- package/app/.next/server/app-paths-manifest.json +16 -4
- package/app/.next/server/chunks/1256.js +1 -0
- package/app/.next/server/chunks/1263.js +3 -0
- package/app/.next/server/chunks/2238.js +23 -0
- package/app/.next/server/chunks/2343.js +1 -0
- package/app/.next/server/chunks/2417.js +1 -1
- package/app/.next/server/chunks/2549.js +1 -1
- package/app/.next/server/chunks/3245.js +1 -1
- package/app/.next/server/chunks/3855.js +1 -1
- package/app/.next/server/chunks/3913.js +2 -2
- package/app/.next/server/chunks/4013.js +1 -0
- package/app/.next/server/chunks/412.js +3 -3
- package/app/.next/server/chunks/4122.js +1 -1
- package/app/.next/server/chunks/4664.js +1 -0
- package/app/.next/server/chunks/4989.js +2 -2
- package/app/.next/server/chunks/5434.js +1 -0
- package/app/.next/server/chunks/5573.js +1 -1
- package/app/.next/server/chunks/5627.js +15 -0
- package/app/.next/server/chunks/5681.js +1 -1
- package/app/.next/server/chunks/6182.js +15 -0
- package/app/.next/server/chunks/6184.js +1 -0
- package/app/.next/server/chunks/7595.js +1 -1
- package/app/.next/server/chunks/7937.js +169 -0
- 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 +42 -2
- package/app/.next/server/chunks/9489.js +1 -1
- package/app/.next/server/chunks/9609.js +1 -1
- package/app/.next/server/chunks/{1220.js → 9641.js} +2 -2
- package/app/.next/server/chunks/9718.js +1 -1
- package/app/.next/server/functions-config-manifest.json +3 -0
- package/app/.next/server/middleware-build-manifest.js +1 -1
- package/app/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/app/.next/server/middleware.js +2 -2
- package/app/.next/server/pages/404.html +1 -1
- package/app/.next/server/pages/500.html +1 -1
- package/app/.next/server/server-reference-manifest.js +1 -1
- package/app/.next/server/server-reference-manifest.json +1 -1
- package/app/.next/static/chunks/1321-e38d25b213a61af7.js +1 -0
- package/app/.next/static/chunks/4295-a6fa5532d32ad57b.js +23 -0
- package/app/.next/static/chunks/5497-ca14fd2ec8ec4965.js +7 -0
- package/app/.next/static/chunks/5555-9189a6eb2a8e87a5.js +3 -0
- package/app/.next/static/chunks/app/(dashboard)/dashboard/admin/keys/page-e7d9455fb9021069.js +1 -0
- package/app/.next/static/chunks/app/(dashboard)/dashboard/admin/users/page-c8e5a4b31bc18425.js +1 -0
- package/app/.next/static/chunks/app/(dashboard)/dashboard/basic-chat/{page-ece69a38800356c3.js → page-a4b2b832a4892e6d.js} +1 -1
- package/app/.next/static/chunks/app/(dashboard)/dashboard/cli-tools/page-ba226c8b3c01dd8d.js +1 -0
- package/app/.next/static/chunks/app/(dashboard)/dashboard/combos/page-cee4e0a7455b73ca.js +1 -0
- package/app/.next/static/chunks/app/(dashboard)/dashboard/console-log/page-fbdc1506f7259342.js +1 -0
- package/app/.next/static/chunks/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page-fe66b224c0368b52.js +59 -0
- package/app/.next/static/chunks/app/(dashboard)/dashboard/media-providers/[kind]/page-9ff3dee6ea964428.js +1 -0
- package/app/.next/static/chunks/app/(dashboard)/dashboard/media-providers/combo/[id]/page-28a10e3cb86b9581.js +4 -0
- package/app/.next/static/chunks/app/(dashboard)/dashboard/media-providers/web/page-eefae72167c9579c.js +1 -0
- package/app/.next/static/chunks/app/(dashboard)/dashboard/mitm/page-99260106103e6a4e.js +1 -0
- package/app/.next/static/chunks/app/(dashboard)/dashboard/profile/page-6289612ce5f7c181.js +1 -0
- package/app/.next/static/chunks/app/(dashboard)/dashboard/providers/[id]/page-ffb5f2c63ae94906.js +1 -0
- package/app/.next/static/chunks/app/(dashboard)/dashboard/providers/page-7dac10f6360f52df.js +1 -0
- package/app/.next/static/chunks/app/(dashboard)/dashboard/proxy-pools/page-abd7d942ceae9293.js +4 -0
- package/app/.next/static/chunks/app/(dashboard)/dashboard/quota/page-52fbe722ba5c5393.js +1 -0
- package/app/.next/static/chunks/app/(dashboard)/dashboard/skills/page-d4518d92737b2728.js +1 -0
- package/app/.next/static/chunks/app/(dashboard)/dashboard/translator/page-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/(dashboard)/dashboard/usage/page-2ae01d48c665f7b4.js +1 -0
- package/app/.next/static/chunks/app/(dashboard)/dashboard/user/page-e9ab0043e9b15204.js +4 -0
- package/app/.next/static/chunks/app/(dashboard)/{layout-91efa9c70d2328e0.js → layout-d368218e0e87c124.js} +1 -1
- package/app/.next/static/chunks/app/_global-error/page-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/auth/login/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/auth/logout/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/auth/me/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/cli-tools/antigravity-mitm/alias/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/cli-tools/antigravity-mitm/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/cli-tools/claude-settings/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/cli-tools/codex-settings/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/cli-tools/copilot-settings/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/cli-tools/cowork-settings/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/cli-tools/droid-settings/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/cli-tools/hermes-settings/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/cli-tools/openclaw-settings/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/cli-tools/opencode-settings/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/cloud/auth/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/cloud/credentials/update/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/cloud/model/resolve/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/cloud/models/alias/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/combos/[id]/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/combos/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/health/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/init/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/keys/[id]/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/keys/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/locale/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/media-providers/tts/deepgram/voices/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/media-providers/tts/elevenlabs/voices/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/media-providers/tts/inworld/voices/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/media-providers/tts/voices/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/models/alias/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/models/availability/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/models/custom/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/models/disabled/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/models/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/models/test/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/oauth/[provider]/[action]/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/oauth/cursor/auto-import/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/oauth/cursor/import/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/oauth/gitlab/pat/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/oauth/iflow/cookie/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/oauth/kiro/auto-import/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/oauth/kiro/import/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/oauth/kiro/social-authorize/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/oauth/kiro/social-exchange/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/pricing/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/provider-nodes/[id]/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/provider-nodes/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/provider-nodes/validate/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/providers/[id]/models/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/providers/[id]/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/providers/[id]/test/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/providers/[id]/test-models/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/providers/client/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/providers/kilo/free-models/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/providers/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/providers/suggested-models/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/providers/test-batch/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/providers/validate/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/proxy-pools/[id]/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/proxy-pools/[id]/test/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/proxy-pools/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/proxy-pools/vercel-deploy/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/settings/database/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/settings/proxy-test/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/settings/require-login/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/settings/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/shutdown/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/tags/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/translator/console-logs/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/translator/console-logs/stream/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/translator/load/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/translator/save/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/translator/send/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/translator/translate/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/tunnel/disable/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/tunnel/enable/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/tunnel/status/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/tunnel/tailscale-check/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/tunnel/tailscale-disable/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/tunnel/tailscale-enable/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/tunnel/tailscale-install/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/tunnel/tailscale-login/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/tunnel/tailscale-start-daemon/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/usage/[connectionId]/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/usage/api-keys/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/usage/chart/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/usage/history/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/usage/logs/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/usage/providers/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/usage/request-details/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/usage/request-logs/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/usage/stats/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/usage/stream/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/users/[id]/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/users/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/v1/api/chat/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/v1/audio/speech/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/v1/audio/transcriptions/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/v1/chat/completions/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/v1/embeddings/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/v1/images/generations/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/v1/messages/count_tokens/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/v1/messages/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/v1/models/[kind]/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/v1/models/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/v1/responses/compact/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/v1/responses/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/v1/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/v1/search/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/v1/web/fetch/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/v1beta/models/[...path]/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/v1beta/models/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/version/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/api/version/update/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/dashboard/settings/pricing/page-ac222da48f591dee.js +1 -0
- package/app/.next/static/chunks/app/login/page-163a87388cf383cc.js +1 -0
- package/app/.next/static/chunks/app/manifest.webmanifest/route-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/app/page-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/next/dist/client/components/builtin/app-error-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/next/dist/client/components/builtin/forbidden-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/next/dist/client/components/builtin/not-found-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/next/dist/client/components/builtin/unauthorized-badb7034e478a358.js +1 -0
- package/app/.next/static/chunks/webpack-d1740476c6ab968a.js +1 -0
- package/app/.next/static/css/326fa3d6432d4810.css +1 -0
- package/app/.next/static/qn5ddCosq_qTH6CJRFJIB/_buildManifest.js +1 -0
- package/app/package.json +1 -1
- package/app/public/i18n/literals/ar.json +4 -4
- package/app/public/i18n/literals/bn.json +4 -4
- package/app/public/i18n/literals/cs.json +4 -4
- package/app/public/i18n/literals/da.json +4 -4
- package/app/public/i18n/literals/de.json +4 -4
- package/app/public/i18n/literals/el.json +4 -4
- package/app/public/i18n/literals/es.json +4 -4
- package/app/public/i18n/literals/fi.json +4 -4
- package/app/public/i18n/literals/fr.json +4 -4
- package/app/public/i18n/literals/he.json +4 -4
- package/app/public/i18n/literals/hi.json +4 -4
- package/app/public/i18n/literals/hu.json +4 -4
- package/app/public/i18n/literals/id.json +4 -4
- package/app/public/i18n/literals/it.json +4 -4
- package/app/public/i18n/literals/ja.json +4 -4
- package/app/public/i18n/literals/ko.json +4 -4
- package/app/public/i18n/literals/nl.json +4 -4
- package/app/public/i18n/literals/no.json +4 -4
- package/app/public/i18n/literals/pl.json +4 -4
- package/app/public/i18n/literals/pt-BR.json +4 -4
- package/app/public/i18n/literals/pt-PT.json +4 -4
- package/app/public/i18n/literals/ro.json +4 -4
- package/app/public/i18n/literals/ru.json +4 -4
- package/app/public/i18n/literals/sv.json +4 -4
- package/app/public/i18n/literals/th.json +4 -4
- package/app/public/i18n/literals/tl.json +4 -4
- package/app/public/i18n/literals/tr.json +4 -4
- package/app/public/i18n/literals/uk.json +4 -4
- package/app/public/i18n/literals/ur.json +4 -4
- package/app/public/i18n/literals/vi.json +4 -4
- package/app/public/i18n/literals/zh-CN.json +404 -127
- package/app/public/i18n/literals/zh-TW.json +4 -4
- package/app/public/providers/alicode-intl.png +0 -0
- package/app/public/providers/alicode.png +0 -0
- package/app/public/providers/aws-polly.png +0 -0
- package/app/public/providers/black-forest-labs.png +0 -0
- package/app/public/providers/byteplus.png +0 -0
- package/app/public/providers/cloudflare-ai.png +0 -0
- package/app/public/providers/fal-ai.png +0 -0
- package/app/public/providers/jina-ai.png +0 -0
- package/app/public/providers/nebius.png +0 -0
- package/app/public/providers/nvidia.png +0 -0
- package/app/public/providers/ollama-local.png +0 -0
- package/app/public/providers/ollama.png +0 -0
- package/app/public/providers/recraft.png +0 -0
- package/app/public/providers/runwayml.png +0 -0
- package/app/public/providers/stability-ai.png +0 -0
- package/app/public/providers/topaz.png +0 -0
- package/app/public/providers/vertex-partner.png +0 -0
- package/app/public/providers/vertex.png +0 -0
- package/app/public/providers/volcengine-ark.png +0 -0
- package/app/public/providers/xiaomi-mimo.png +0 -0
- package/app/src/mitm/dns/dnsConfig.js +77 -32
- package/app/src/mitm/manager.js +109 -28
- package/app/src/mitm/server.js +9 -8
- package/app/src/mitm/winElevated.js +8 -6
- package/app/src/shared/constants/mitmToolHosts.js +12 -0
- package/package.json +1 -1
- package/app/.next/server/app/(dashboard)/dashboard/media-providers/web/combo/[id]/page.js +0 -5
- package/app/.next/server/app/(dashboard)/dashboard/media-providers/web/combo/[id]/page.js.nft.json +0 -1
- package/app/.next/server/app/(dashboard)/dashboard/media-providers/web/combo/[id]/page_client-reference-manifest.js +0 -1
- package/app/.next/server/app/dashboard/basic-chat.html +0 -1
- package/app/.next/server/app/dashboard/basic-chat.meta +0 -17
- package/app/.next/server/app/dashboard/basic-chat.rsc +0 -24
- package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +0 -5
- package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +0 -5
- package/app/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/basic-chat.segments/_full.segment.rsc +0 -24
- package/app/.next/server/app/dashboard/basic-chat.segments/_head.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/basic-chat.segments/_index.segment.rsc +0 -9
- package/app/.next/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/cli-tools.html +0 -1
- package/app/.next/server/app/dashboard/cli-tools.meta +0 -17
- package/app/.next/server/app/dashboard/cli-tools.rsc +0 -25
- package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +0 -5
- package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +0 -5
- package/app/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/cli-tools.segments/_full.segment.rsc +0 -25
- package/app/.next/server/app/dashboard/cli-tools.segments/_head.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/cli-tools.segments/_index.segment.rsc +0 -9
- package/app/.next/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/combos.html +0 -1
- package/app/.next/server/app/dashboard/combos.meta +0 -17
- package/app/.next/server/app/dashboard/combos.rsc +0 -27
- package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +0 -9
- package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +0 -5
- package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +0 -5
- package/app/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/combos.segments/_full.segment.rsc +0 -27
- package/app/.next/server/app/dashboard/combos.segments/_head.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/combos.segments/_index.segment.rsc +0 -9
- package/app/.next/server/app/dashboard/combos.segments/_tree.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/endpoint.html +0 -1
- package/app/.next/server/app/dashboard/endpoint.meta +0 -17
- package/app/.next/server/app/dashboard/endpoint.rsc +0 -25
- package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +0 -5
- package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +0 -5
- package/app/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/endpoint.segments/_full.segment.rsc +0 -25
- package/app/.next/server/app/dashboard/endpoint.segments/_head.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/endpoint.segments/_index.segment.rsc +0 -9
- package/app/.next/server/app/dashboard/endpoint.segments/_tree.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/media-providers/web.html +0 -1
- package/app/.next/server/app/dashboard/media-providers/web.meta +0 -18
- package/app/.next/server/app/dashboard/media-providers/web.rsc +0 -27
- package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +0 -9
- package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web.segment.rsc +0 -5
- package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +0 -5
- package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +0 -5
- package/app/.next/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +0 -27
- package/app/.next/server/app/dashboard/media-providers/web.segments/_head.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/media-providers/web.segments/_index.segment.rsc +0 -9
- package/app/.next/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/mitm.html +0 -1
- package/app/.next/server/app/dashboard/mitm.meta +0 -17
- package/app/.next/server/app/dashboard/mitm.rsc +0 -24
- package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +0 -5
- package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +0 -5
- package/app/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/mitm.segments/_full.segment.rsc +0 -24
- package/app/.next/server/app/dashboard/mitm.segments/_head.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/mitm.segments/_index.segment.rsc +0 -9
- package/app/.next/server/app/dashboard/mitm.segments/_tree.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/profile.html +0 -1
- package/app/.next/server/app/dashboard/profile.meta +0 -17
- package/app/.next/server/app/dashboard/profile.rsc +0 -27
- package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +0 -9
- package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +0 -5
- package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +0 -5
- package/app/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/profile.segments/_full.segment.rsc +0 -27
- package/app/.next/server/app/dashboard/profile.segments/_head.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/profile.segments/_index.segment.rsc +0 -9
- package/app/.next/server/app/dashboard/profile.segments/_tree.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/providers/new.html +0 -1
- package/app/.next/server/app/dashboard/providers/new.meta +0 -18
- package/app/.next/server/app/dashboard/providers/new.rsc +0 -27
- package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +0 -9
- package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +0 -5
- package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +0 -5
- package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +0 -5
- package/app/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/providers/new.segments/_full.segment.rsc +0 -27
- package/app/.next/server/app/dashboard/providers/new.segments/_head.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/providers/new.segments/_index.segment.rsc +0 -9
- package/app/.next/server/app/dashboard/providers/new.segments/_tree.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/providers.html +0 -1
- package/app/.next/server/app/dashboard/providers.meta +0 -17
- package/app/.next/server/app/dashboard/providers.rsc +0 -27
- package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +0 -9
- package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +0 -5
- package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +0 -5
- package/app/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/providers.segments/_full.segment.rsc +0 -27
- package/app/.next/server/app/dashboard/providers.segments/_head.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/providers.segments/_index.segment.rsc +0 -9
- package/app/.next/server/app/dashboard/providers.segments/_tree.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/proxy-pools.html +0 -1
- package/app/.next/server/app/dashboard/proxy-pools.meta +0 -17
- package/app/.next/server/app/dashboard/proxy-pools.rsc +0 -27
- package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +0 -9
- package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +0 -5
- package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +0 -5
- package/app/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +0 -27
- package/app/.next/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +0 -9
- package/app/.next/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/quota.html +0 -2
- package/app/.next/server/app/dashboard/quota.meta +0 -17
- package/app/.next/server/app/dashboard/quota.rsc +0 -25
- package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +0 -7
- package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +0 -5
- package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +0 -5
- package/app/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/quota.segments/_full.segment.rsc +0 -25
- package/app/.next/server/app/dashboard/quota.segments/_head.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/quota.segments/_index.segment.rsc +0 -9
- package/app/.next/server/app/dashboard/quota.segments/_tree.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/translator.html +0 -1
- package/app/.next/server/app/dashboard/translator.meta +0 -17
- package/app/.next/server/app/dashboard/translator.rsc +0 -27
- package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +0 -9
- package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +0 -5
- package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +0 -5
- package/app/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/translator.segments/_full.segment.rsc +0 -27
- package/app/.next/server/app/dashboard/translator.segments/_head.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/translator.segments/_index.segment.rsc +0 -9
- package/app/.next/server/app/dashboard/translator.segments/_tree.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/usage.html +0 -1
- package/app/.next/server/app/dashboard/usage.meta +0 -17
- package/app/.next/server/app/dashboard/usage.rsc +0 -27
- package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +0 -9
- package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +0 -5
- package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +0 -5
- package/app/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/usage.segments/_full.segment.rsc +0 -27
- package/app/.next/server/app/dashboard/usage.segments/_head.segment.rsc +0 -6
- package/app/.next/server/app/dashboard/usage.segments/_index.segment.rsc +0 -9
- package/app/.next/server/app/dashboard/usage.segments/_tree.segment.rsc +0 -6
- package/app/.next/server/app/dashboard.html +0 -1
- package/app/.next/server/app/dashboard.meta +0 -16
- package/app/.next/server/app/dashboard.rsc +0 -25
- package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +0 -6
- package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +0 -5
- package/app/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +0 -6
- package/app/.next/server/app/dashboard.segments/_full.segment.rsc +0 -25
- package/app/.next/server/app/dashboard.segments/_head.segment.rsc +0 -6
- package/app/.next/server/app/dashboard.segments/_index.segment.rsc +0 -9
- package/app/.next/server/app/dashboard.segments/_tree.segment.rsc +0 -6
- package/app/.next/server/chunks/1202.js +0 -3
- package/app/.next/server/chunks/2020.js +0 -1
- package/app/.next/server/chunks/318.js +0 -203
- package/app/.next/server/chunks/5599.js +0 -23
- package/app/.next/server/chunks/6114.js +0 -1
- package/app/.next/server/chunks/6555.js +0 -1
- package/app/.next/server/chunks/7924.js +0 -1
- package/app/.next/server/chunks/8491.js +0 -1
- package/app/.next/server/chunks/9501.js +0 -37
- package/app/.next/static/ahyS0wV6v2JdXWYSEruR6/_buildManifest.js +0 -1
- package/app/.next/static/chunks/1321-4ac1e9664ca05f67.js +0 -1
- package/app/.next/static/chunks/5497-9056ce5497a8e830.js +0 -7
- package/app/.next/static/chunks/5555-c4cf1b2b38d07337.js +0 -3
- package/app/.next/static/chunks/698-438ce154948ce831.js +0 -23
- package/app/.next/static/chunks/8202.1ffc6ce531e066ce.js +0 -1
- package/app/.next/static/chunks/app/(dashboard)/dashboard/cli-tools/page-2f4bb06a89cb1e96.js +0 -1
- package/app/.next/static/chunks/app/(dashboard)/dashboard/combos/page-0d9325464cd6e849.js +0 -1
- package/app/.next/static/chunks/app/(dashboard)/dashboard/console-log/page-d690c6133fec8d11.js +0 -1
- package/app/.next/static/chunks/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page-0494f10cf7d2cae0.js +0 -53
- package/app/.next/static/chunks/app/(dashboard)/dashboard/media-providers/[kind]/page-521aecf4ccb7b03e.js +0 -1
- package/app/.next/static/chunks/app/(dashboard)/dashboard/media-providers/web/combo/[id]/page-d594f315360645f3.js +0 -4
- package/app/.next/static/chunks/app/(dashboard)/dashboard/media-providers/web/page-ec14043bae22768d.js +0 -1
- package/app/.next/static/chunks/app/(dashboard)/dashboard/mitm/page-ed08f60a5fb7f3eb.js +0 -1
- package/app/.next/static/chunks/app/(dashboard)/dashboard/profile/page-478d456890cb93f8.js +0 -1
- package/app/.next/static/chunks/app/(dashboard)/dashboard/providers/[id]/page-7985e45ad78144eb.js +0 -1
- package/app/.next/static/chunks/app/(dashboard)/dashboard/providers/page-9fb9fc4557dbea57.js +0 -1
- package/app/.next/static/chunks/app/(dashboard)/dashboard/proxy-pools/page-4d43dabc1455a54b.js +0 -2
- package/app/.next/static/chunks/app/(dashboard)/dashboard/quota/page-fae4c95586692227.js +0 -1
- package/app/.next/static/chunks/app/(dashboard)/dashboard/translator/page-4fc78ec3c912ea4c.js +0 -1
- package/app/.next/static/chunks/app/(dashboard)/dashboard/usage/page-6204a1c1bfe6aee1.js +0 -1
- package/app/.next/static/chunks/app/_global-error/page-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/auth/login/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/auth/logout/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/cli-tools/antigravity-mitm/alias/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/cli-tools/antigravity-mitm/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/cli-tools/claude-settings/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/cli-tools/codex-settings/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/cli-tools/copilot-settings/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/cli-tools/droid-settings/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/cli-tools/hermes-settings/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/cli-tools/openclaw-settings/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/cli-tools/opencode-settings/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/cloud/auth/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/cloud/credentials/update/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/cloud/model/resolve/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/cloud/models/alias/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/combos/[id]/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/combos/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/health/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/init/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/keys/[id]/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/keys/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/locale/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/media-providers/tts/deepgram/voices/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/media-providers/tts/elevenlabs/voices/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/media-providers/tts/inworld/voices/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/media-providers/tts/voices/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/models/alias/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/models/availability/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/models/custom/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/models/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/models/test/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/oauth/[provider]/[action]/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/oauth/cursor/auto-import/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/oauth/cursor/import/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/oauth/gitlab/pat/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/oauth/iflow/cookie/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/oauth/kiro/auto-import/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/oauth/kiro/import/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/oauth/kiro/social-authorize/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/oauth/kiro/social-exchange/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/pricing/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/provider-nodes/[id]/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/provider-nodes/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/provider-nodes/validate/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/providers/[id]/models/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/providers/[id]/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/providers/[id]/test/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/providers/[id]/test-models/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/providers/client/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/providers/kilo/free-models/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/providers/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/providers/suggested-models/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/providers/test-batch/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/providers/validate/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/proxy-pools/[id]/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/proxy-pools/[id]/test/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/proxy-pools/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/proxy-pools/vercel-deploy/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/settings/database/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/settings/proxy-test/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/settings/require-login/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/settings/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/shutdown/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/tags/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/translator/console-logs/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/translator/console-logs/stream/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/translator/load/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/translator/save/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/translator/send/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/translator/translate/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/tunnel/disable/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/tunnel/enable/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/tunnel/status/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/tunnel/tailscale-check/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/tunnel/tailscale-disable/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/tunnel/tailscale-enable/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/tunnel/tailscale-install/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/tunnel/tailscale-login/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/tunnel/tailscale-start-daemon/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/usage/[connectionId]/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/usage/chart/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/usage/history/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/usage/logs/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/usage/providers/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/usage/request-details/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/usage/request-logs/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/usage/stats/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/usage/stream/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/v1/api/chat/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/v1/audio/speech/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/v1/chat/completions/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/v1/embeddings/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/v1/images/generations/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/v1/messages/count_tokens/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/v1/messages/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/v1/models/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/v1/responses/compact/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/v1/responses/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/v1/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/v1/search/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/v1/web/fetch/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/v1beta/models/[...path]/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/v1beta/models/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/version/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/api/version/update/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/dashboard/settings/pricing/page-5744fe42b927e4e1.js +0 -1
- package/app/.next/static/chunks/app/login/page-4cbcd0b23f8d9304.js +0 -1
- package/app/.next/static/chunks/app/manifest.webmanifest/route-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/app/page-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/next/dist/client/components/builtin/app-error-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/next/dist/client/components/builtin/forbidden-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/next/dist/client/components/builtin/not-found-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/next/dist/client/components/builtin/unauthorized-a95908d3fe52339a.js +0 -1
- package/app/.next/static/chunks/webpack-7fe9f68a976b08ff.js +0 -1
- package/app/.next/static/css/1ef6107a5d5fd71c.css +0 -1
- /package/app/.next/static/{ahyS0wV6v2JdXWYSEruR6 → qn5ddCosq_qTH6CJRFJIB}/_ssgManifest.js +0 -0
|
@@ -110,7 +110,7 @@
|
|
|
110
110
|
"Manage your AI provider connections": "管理您的 AI 提供者連接",
|
|
111
111
|
"Model combos with fallback": "具有備用的模型組合",
|
|
112
112
|
"Monitor your API usage, token consumption, and request logs": "監控您的 API 使用、令牌消耗和請求日誌",
|
|
113
|
-
"Intercept CLI tool traffic and route through
|
|
113
|
+
"Intercept CLI tool traffic and route through OpenRouterX": "攔截 CLI 工具流量並通過 OpenRouterX 路由",
|
|
114
114
|
"Configure CLI tools": "配置 CLI 工具",
|
|
115
115
|
"API endpoint configuration": "API 端點配置",
|
|
116
116
|
"Manage your preferences": "管理您的首選項",
|
|
@@ -175,12 +175,12 @@
|
|
|
175
175
|
"Cert": "證書",
|
|
176
176
|
"Server": "服務器",
|
|
177
177
|
"Purpose:": "目的:",
|
|
178
|
-
"Use Antigravity IDE & GitHub Copilot → with ANY provider/model from
|
|
178
|
+
"Use Antigravity IDE & GitHub Copilot → with ANY provider/model from OpenRouterX": "使用 Antigravity IDE 和 GitHub Copilot → 與 OpenRouterX 中的任何提供者/模型一起",
|
|
179
179
|
"How it works:": "工作原理:",
|
|
180
|
-
"Antigravity/Copilot IDE request → DNS redirect to localhost:443 → MITM proxy intercepts →
|
|
180
|
+
"Antigravity/Copilot IDE request → DNS redirect to localhost:443 → MITM proxy intercepts → OpenRouterX → response to Antigravity/Copilot": "Antigravity/Copilot IDE 請求 → DNS 重定向到 localhost:443 → MITM 代理攔截 → OpenRouterX → 响應到 Antigravity/Copilot",
|
|
181
181
|
"API Key": "API 金鑰",
|
|
182
182
|
"No API keys — create one in Keys page": "沒有 API 金鑰 — 在金鑰頁面中創建一個",
|
|
183
|
-
"
|
|
183
|
+
"sk_openrouterx (default)": "sk_openrouterx(默認)",
|
|
184
184
|
"Server started": "服務器已啟動",
|
|
185
185
|
"Failed to start server": "啟動服務器失敗",
|
|
186
186
|
"Server stopped — all DNS cleared": "服務器已停止 — 已清除所有 DNS",
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -4,7 +4,32 @@ const path = require("path");
|
|
|
4
4
|
const os = require("os");
|
|
5
5
|
const { log, err } = require("../logger");
|
|
6
6
|
const { TOOL_HOSTS } = require("../../shared/constants/mitmToolHosts");
|
|
7
|
-
const { runElevatedPowerShell,
|
|
7
|
+
const { runElevatedPowerShell, isAdmin } = require("../winElevated.js");
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Atomic-ish write for Windows hosts file with rollback on failure.
|
|
11
|
+
* Strategy: write `.new` sibling → rename current to `.bak` → rename `.new` to target.
|
|
12
|
+
* If anything fails mid-way, restore from `.bak`. Same-volume renames are atomic on NTFS.
|
|
13
|
+
*/
|
|
14
|
+
function atomicWriteHostsWin(target, originalContent, newContent) {
|
|
15
|
+
const tmpNew = `${target}.9router.new`;
|
|
16
|
+
const tmpBak = `${target}.9router.bak`;
|
|
17
|
+
try {
|
|
18
|
+
fs.writeFileSync(tmpNew, newContent, "utf8");
|
|
19
|
+
try { fs.unlinkSync(tmpBak); } catch { /* none */ }
|
|
20
|
+
fs.renameSync(target, tmpBak);
|
|
21
|
+
try {
|
|
22
|
+
fs.renameSync(tmpNew, target);
|
|
23
|
+
} catch (e) {
|
|
24
|
+
// Rollback: restore original
|
|
25
|
+
try { fs.renameSync(tmpBak, target); } catch { fs.writeFileSync(target, originalContent, "utf8"); }
|
|
26
|
+
throw e;
|
|
27
|
+
}
|
|
28
|
+
try { fs.unlinkSync(tmpBak); } catch { /* best effort */ }
|
|
29
|
+
} finally {
|
|
30
|
+
try { fs.unlinkSync(tmpNew); } catch { /* already moved or never created */ }
|
|
31
|
+
}
|
|
32
|
+
}
|
|
8
33
|
|
|
9
34
|
const IS_WIN = process.platform === "win32";
|
|
10
35
|
const IS_MAC = process.platform === "darwin";
|
|
@@ -23,6 +48,20 @@ function isSudoAvailable() {
|
|
|
23
48
|
}
|
|
24
49
|
}
|
|
25
50
|
|
|
51
|
+
function canRunSudoWithoutPassword() {
|
|
52
|
+
if (IS_WIN || !isSudoAvailable()) return true;
|
|
53
|
+
try {
|
|
54
|
+
execSync("sudo -n true", { stdio: "ignore", windowsHide: true });
|
|
55
|
+
return true;
|
|
56
|
+
} catch {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function isSudoPasswordRequired() {
|
|
62
|
+
return !IS_WIN && isSudoAvailable() && !canRunSudoWithoutPassword();
|
|
63
|
+
}
|
|
64
|
+
|
|
26
65
|
/**
|
|
27
66
|
* Execute command with sudo password via stdin (macOS/Linux only).
|
|
28
67
|
* Without sudo in PATH (containers), runs via sh — same user, no elevation.
|
|
@@ -51,6 +90,14 @@ function execWithPassword(command, password) {
|
|
|
51
90
|
});
|
|
52
91
|
}
|
|
53
92
|
|
|
93
|
+
/**
|
|
94
|
+
* Trim trailing blank lines/whitespace, ensure file ends with exactly one newline.
|
|
95
|
+
*/
|
|
96
|
+
function normalizeHostsContent(content) {
|
|
97
|
+
const eol = IS_WIN ? "\r\n" : "\n";
|
|
98
|
+
return content.replace(/[\r\n\s]+$/g, "") + eol;
|
|
99
|
+
}
|
|
100
|
+
|
|
54
101
|
/**
|
|
55
102
|
* Flush DNS cache (macOS/Linux)
|
|
56
103
|
*/
|
|
@@ -106,19 +153,23 @@ async function addDNSEntry(tool, sudoPassword) {
|
|
|
106
153
|
return;
|
|
107
154
|
}
|
|
108
155
|
|
|
109
|
-
const entries = entriesToAdd.map(h => `127.0.0.1 ${h}`).join("\n");
|
|
110
|
-
|
|
111
156
|
try {
|
|
112
157
|
if (IS_WIN) {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
const
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
await runElevatedPowerShell(
|
|
158
|
+
// Read → trim → append → atomic write (Node-side, no CLI size limit)
|
|
159
|
+
const current = fs.readFileSync(HOSTS_FILE, "utf8");
|
|
160
|
+
const trimmed = current.replace(/[\r\n\s]+$/g, "");
|
|
161
|
+
const toAppend = entriesToAdd.map(h => `127.0.0.1 ${h}`).join("\r\n");
|
|
162
|
+
const next = `${trimmed}\r\n${toAppend}\r\n`;
|
|
163
|
+
atomicWriteHostsWin(HOSTS_FILE, current, next);
|
|
164
|
+
await runElevatedPowerShell("ipconfig /flushdns | Out-Null");
|
|
120
165
|
} else {
|
|
121
|
-
|
|
166
|
+
const current = fs.readFileSync(HOSTS_FILE, "utf8");
|
|
167
|
+
const trimmed = current.replace(/[\r\n\s]+$/g, "");
|
|
168
|
+
const toAppend = entriesToAdd.map(h => `127.0.0.1 ${h}`).join("\n");
|
|
169
|
+
const next = `${trimmed}\n${toAppend}\n`;
|
|
170
|
+
// Use tee via sudo to overwrite atomically — escape single quotes in content
|
|
171
|
+
const escaped = next.replace(/'/g, "'\\''");
|
|
172
|
+
await execWithPassword(`printf '%s' '${escaped}' | tee ${HOSTS_FILE} > /dev/null`, sudoPassword);
|
|
122
173
|
await flushDNS(sudoPassword);
|
|
123
174
|
}
|
|
124
175
|
log(`🌐 DNS ${tool}: ✅ added ${entriesToAdd.join(", ")}`);
|
|
@@ -143,26 +194,17 @@ async function removeDNSEntry(tool, sudoPassword) {
|
|
|
143
194
|
|
|
144
195
|
try {
|
|
145
196
|
if (IS_WIN) {
|
|
146
|
-
|
|
147
|
-
const
|
|
148
|
-
const
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
$filtered = $lines | Where-Object {
|
|
152
|
-
$line = $_
|
|
153
|
-
-not ($hosts | Where-Object { $line -match [regex]::Escape($_) })
|
|
154
|
-
}
|
|
155
|
-
Set-Content -LiteralPath ${quotePs(HOSTS_FILE)} -Value $filtered
|
|
156
|
-
ipconfig /flushdns | Out-Null
|
|
157
|
-
`;
|
|
158
|
-
await runElevatedPowerShell(script);
|
|
197
|
+
const current = fs.readFileSync(HOSTS_FILE, "utf8");
|
|
198
|
+
const filtered = current.split(/\r?\n/).filter(l => !entriesToRemove.some(h => l.includes(h))).join("\r\n");
|
|
199
|
+
const next = filtered.replace(/[\r\n\s]+$/g, "") + "\r\n";
|
|
200
|
+
atomicWriteHostsWin(HOSTS_FILE, current, next);
|
|
201
|
+
await runElevatedPowerShell("ipconfig /flushdns | Out-Null");
|
|
159
202
|
} else {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
}
|
|
203
|
+
const current = fs.readFileSync(HOSTS_FILE, "utf8");
|
|
204
|
+
const filtered = current.split(/\r?\n/).filter(l => !entriesToRemove.some(h => l.includes(h))).join("\n");
|
|
205
|
+
const next = filtered.replace(/[\r\n\s]+$/g, "") + "\n";
|
|
206
|
+
const escaped = next.replace(/'/g, "'\\''");
|
|
207
|
+
await execWithPassword(`printf '%s' '${escaped}' | tee ${HOSTS_FILE} > /dev/null`, sudoPassword);
|
|
166
208
|
await flushDNS(sudoPassword);
|
|
167
209
|
}
|
|
168
210
|
log(`🌐 DNS ${tool}: ✅ removed ${entriesToRemove.join(", ")}`);
|
|
@@ -196,8 +238,9 @@ function removeAllDNSEntriesSync() {
|
|
|
196
238
|
const content = fs.readFileSync(HOSTS_FILE, "utf8");
|
|
197
239
|
const eol = IS_WIN ? "\r\n" : "\n";
|
|
198
240
|
const filtered = content.split(/\r?\n/).filter(l => !allHosts.some(h => l.includes(h))).join(eol);
|
|
199
|
-
|
|
200
|
-
|
|
241
|
+
const next = filtered.replace(/[\r\n\s]+$/g, "") + eol;
|
|
242
|
+
if (next === content) return;
|
|
243
|
+
fs.writeFileSync(HOSTS_FILE, next, "utf8");
|
|
201
244
|
if (IS_WIN) {
|
|
202
245
|
try { execSync("ipconfig /flushdns", { windowsHide: true, stdio: "ignore" }); } catch { /* ignore */ }
|
|
203
246
|
} else if (IS_MAC) {
|
|
@@ -216,6 +259,8 @@ module.exports = {
|
|
|
216
259
|
removeAllDNSEntriesSync,
|
|
217
260
|
execWithPassword,
|
|
218
261
|
isSudoAvailable,
|
|
262
|
+
canRunSudoWithoutPassword,
|
|
263
|
+
isSudoPasswordRequired,
|
|
219
264
|
checkDNSEntry,
|
|
220
265
|
checkAllDNSStatus,
|
|
221
266
|
};
|
package/app/src/mitm/manager.js
CHANGED
|
@@ -5,7 +5,8 @@ const os = require("os");
|
|
|
5
5
|
const net = require("net");
|
|
6
6
|
const https = require("https");
|
|
7
7
|
const crypto = require("crypto");
|
|
8
|
-
const { addDNSEntry, removeDNSEntry, removeAllDNSEntries, checkAllDNSStatus, TOOL_HOSTS, isSudoAvailable } = require("./dns/dnsConfig");
|
|
8
|
+
const { addDNSEntry, removeDNSEntry, removeAllDNSEntries, removeAllDNSEntriesSync, checkAllDNSStatus, TOOL_HOSTS, isSudoAvailable, isSudoPasswordRequired } = require("./dns/dnsConfig");
|
|
9
|
+
const { isAdmin } = require("./winElevated.js");
|
|
9
10
|
|
|
10
11
|
const IS_WIN = process.platform === "win32";
|
|
11
12
|
const IS_MAC = process.platform === "darwin";
|
|
@@ -108,9 +109,9 @@ function killProcess(pid, force = false, sudoPassword = null) {
|
|
|
108
109
|
} else {
|
|
109
110
|
const sig = force ? "SIGKILL" : "SIGTERM";
|
|
110
111
|
const cmd = `pkill -${sig} -P ${pid} 2>/dev/null; kill -${sig} ${pid} 2>/dev/null`;
|
|
111
|
-
if (sudoPassword) {
|
|
112
|
+
if (sudoPassword || isSudoAvailable()) {
|
|
112
113
|
const { execWithPassword } = require("./dns/dnsConfig");
|
|
113
|
-
execWithPassword(cmd, sudoPassword).catch(() => exec(cmd, { windowsHide: true }, () => { }));
|
|
114
|
+
execWithPassword(cmd, sudoPassword || "").catch(() => exec(cmd, { windowsHide: true }, () => { }));
|
|
114
115
|
} else {
|
|
115
116
|
exec(cmd, { windowsHide: true }, () => { });
|
|
116
117
|
}
|
|
@@ -188,6 +189,55 @@ async function loadEncryptedPassword() {
|
|
|
188
189
|
}
|
|
189
190
|
}
|
|
190
191
|
|
|
192
|
+
async function saveDnsToolState(tool, enabled) {
|
|
193
|
+
if (!_updateSettings || !_getSettings) return;
|
|
194
|
+
try {
|
|
195
|
+
const s = await _getSettings();
|
|
196
|
+
const next = { ...(s.dnsToolEnabled || {}), [tool]: enabled };
|
|
197
|
+
await _updateSettings({ dnsToolEnabled: next });
|
|
198
|
+
} catch (e) {
|
|
199
|
+
err(`Failed to save DNS state: ${e.message}`);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
async function loadDnsToolState() {
|
|
204
|
+
if (!_getSettings) return {};
|
|
205
|
+
try {
|
|
206
|
+
const s = await _getSettings();
|
|
207
|
+
return s.dnsToolEnabled || {};
|
|
208
|
+
} catch {
|
|
209
|
+
return {};
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Re-apply DNS for tools previously enabled — called on app startup after MITM running.
|
|
215
|
+
*/
|
|
216
|
+
async function restoreToolDNS(sudoPassword) {
|
|
217
|
+
const state = await loadDnsToolState();
|
|
218
|
+
const password = sudoPassword || getCachedPassword() || await loadEncryptedPassword();
|
|
219
|
+
for (const [tool, enabled] of Object.entries(state)) {
|
|
220
|
+
if (!enabled || !TOOL_HOSTS[tool]) continue;
|
|
221
|
+
try {
|
|
222
|
+
await addDNSEntry(tool, password);
|
|
223
|
+
} catch (e) {
|
|
224
|
+
err(`DNS ${tool}: restore failed — ${e.message}`);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Check if user has privilege to mutate hosts file.
|
|
231
|
+
* Win: needs admin. Mac/Linux: root OR cached/encrypted sudo password.
|
|
232
|
+
*/
|
|
233
|
+
async function hasDnsPrivilege() {
|
|
234
|
+
if (IS_WIN) return isAdmin();
|
|
235
|
+
if (isAdmin()) return true;
|
|
236
|
+
if (!isSudoPasswordRequired()) return true;
|
|
237
|
+
const pwd = getCachedPassword() || await loadEncryptedPassword();
|
|
238
|
+
return !!pwd;
|
|
239
|
+
}
|
|
240
|
+
|
|
191
241
|
function checkPort443Free() {
|
|
192
242
|
return new Promise((resolve) => {
|
|
193
243
|
const tester = net.createServer();
|
|
@@ -248,9 +298,9 @@ async function killLeftoverMitm(sudoPassword) {
|
|
|
248
298
|
if (!IS_WIN && SERVER_PATH) {
|
|
249
299
|
try {
|
|
250
300
|
const escaped = SERVER_PATH.replace(/'/g, "'\\''");
|
|
251
|
-
if (sudoPassword) {
|
|
301
|
+
if (sudoPassword || isSudoAvailable()) {
|
|
252
302
|
const { execWithPassword } = require("./dns/dnsConfig");
|
|
253
|
-
await execWithPassword(`pkill -SIGKILL -f "${escaped}" 2>/dev/null || true`, sudoPassword).catch(() => { });
|
|
303
|
+
await execWithPassword(`pkill -SIGKILL -f "${escaped}" 2>/dev/null || true`, sudoPassword || "").catch(() => { });
|
|
254
304
|
} else {
|
|
255
305
|
exec(`pkill -SIGKILL -f "${escaped}" 2>/dev/null || true`, { windowsHide: true }, () => { });
|
|
256
306
|
}
|
|
@@ -363,7 +413,26 @@ async function scheduleMitmRestart(apiKey) {
|
|
|
363
413
|
/**
|
|
364
414
|
* Start MITM server only (cert + server, no DNS)
|
|
365
415
|
*/
|
|
366
|
-
async function
|
|
416
|
+
async function killPort443Owner(owner, sudoPassword) {
|
|
417
|
+
if (!owner || !owner.pid) return;
|
|
418
|
+
if (IS_WIN) {
|
|
419
|
+
try {
|
|
420
|
+
execSync(`powershell -NonInteractive -WindowStyle Hidden -Command "Stop-Process -Id ${owner.pid} -Force -ErrorAction SilentlyContinue"`, { windowsHide: true });
|
|
421
|
+
} catch { /* best effort */ }
|
|
422
|
+
} else {
|
|
423
|
+
try {
|
|
424
|
+
const { execWithPassword } = require("./dns/dnsConfig");
|
|
425
|
+
if (sudoPassword || isSudoAvailable()) {
|
|
426
|
+
await execWithPassword(`kill -9 ${owner.pid}`, sudoPassword || "");
|
|
427
|
+
} else {
|
|
428
|
+
execSync(`kill -9 ${owner.pid}`, { windowsHide: true });
|
|
429
|
+
}
|
|
430
|
+
} catch { /* best effort */ }
|
|
431
|
+
}
|
|
432
|
+
await new Promise(r => setTimeout(r, 800));
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
async function startServer(apiKey, sudoPassword, forceKillPort443 = false) {
|
|
367
436
|
if (!serverProcess || serverProcess.killed) {
|
|
368
437
|
try {
|
|
369
438
|
if (fs.existsSync(PID_FILE)) {
|
|
@@ -391,19 +460,19 @@ async function startServer(apiKey, sudoPassword) {
|
|
|
391
460
|
const portStatus = await checkPort443Free();
|
|
392
461
|
if (portStatus === "in-use" || portStatus === "no-permission") {
|
|
393
462
|
const owner = await getPort443Owner(sudoPassword);
|
|
394
|
-
|
|
395
|
-
if (ownerIsNode) {
|
|
396
|
-
log(`Killing orphan node process on port 443 (PID ${owner.pid}, name=${owner.name})...`);
|
|
397
|
-
try {
|
|
398
|
-
const { execWithPassword } = require("./dns/dnsConfig");
|
|
399
|
-
await execWithPassword(`kill -9 ${owner.pid}`, sudoPassword);
|
|
400
|
-
await new Promise(r => setTimeout(r, 800));
|
|
401
|
-
} catch { /* best effort */ }
|
|
402
|
-
} else if (owner) {
|
|
463
|
+
if (owner) {
|
|
403
464
|
const shortName = owner.name.includes("/")
|
|
404
465
|
? owner.name.split("/").filter(Boolean).pop()
|
|
405
466
|
: owner.name;
|
|
406
|
-
|
|
467
|
+
if (forceKillPort443) {
|
|
468
|
+
log(`Killing process on port 443 (PID ${owner.pid}, name=${shortName})...`);
|
|
469
|
+
await killPort443Owner(owner, sudoPassword);
|
|
470
|
+
} else {
|
|
471
|
+
const e = new Error(`Port 443 is already in use by "${shortName}" (PID ${owner.pid}).`);
|
|
472
|
+
e.code = "PORT_443_BUSY";
|
|
473
|
+
e.portOwner = { pid: owner.pid, name: shortName };
|
|
474
|
+
throw e;
|
|
475
|
+
}
|
|
407
476
|
}
|
|
408
477
|
}
|
|
409
478
|
}
|
|
@@ -434,7 +503,7 @@ async function startServer(apiKey, sudoPassword) {
|
|
|
434
503
|
if (linuxNoSystemTrust) {
|
|
435
504
|
log(`🔐 Cert: skipping system trust (no sudo). Install ${rootCACertPath} as a trusted CA on machines that use this proxy.`);
|
|
436
505
|
} else {
|
|
437
|
-
if (!password &&
|
|
506
|
+
if (!password && isSudoPasswordRequired()) {
|
|
438
507
|
throw new Error("Sudo password required to install Root CA certificate");
|
|
439
508
|
}
|
|
440
509
|
try {
|
|
@@ -452,12 +521,19 @@ async function startServer(apiKey, sudoPassword) {
|
|
|
452
521
|
const mitmRouterBase = await resolveMitmRouterBaseUrl();
|
|
453
522
|
log(`🚀 Starting server... (router: ${mitmRouterBase})`);
|
|
454
523
|
if (IS_WIN) {
|
|
455
|
-
//
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
524
|
+
// Check port 443 — ask user before killing
|
|
525
|
+
const winOwner = await getPort443Owner(sudoPassword);
|
|
526
|
+
if (winOwner) {
|
|
527
|
+
if (forceKillPort443) {
|
|
528
|
+
log(`Killing process on port 443 (PID ${winOwner.pid}, name=${winOwner.name})...`);
|
|
529
|
+
await killPort443Owner(winOwner, sudoPassword);
|
|
530
|
+
} else {
|
|
531
|
+
const e = new Error(`Port 443 is already in use by "${winOwner.name}" (PID ${winOwner.pid}).`);
|
|
532
|
+
e.code = "PORT_443_BUSY";
|
|
533
|
+
e.portOwner = { pid: winOwner.pid, name: winOwner.name };
|
|
534
|
+
throw e;
|
|
535
|
+
}
|
|
536
|
+
}
|
|
461
537
|
|
|
462
538
|
// Spawn directly — process already has admin rights
|
|
463
539
|
serverProcess = spawn(
|
|
@@ -603,7 +679,8 @@ async function stopServer(sudoPassword) {
|
|
|
603
679
|
// Direct fs write — bypass PowerShell to avoid parser pitfalls
|
|
604
680
|
const content = fs.readFileSync(hostsFile, "utf8");
|
|
605
681
|
const filtered = content.split(/\r?\n/).filter(l => !allHosts.some(h => l.includes(h))).join("\r\n");
|
|
606
|
-
|
|
682
|
+
const next = filtered.replace(/[\r\n\s]+$/g, "") + "\r\n";
|
|
683
|
+
if (next !== content) fs.writeFileSync(hostsFile, next, "utf8");
|
|
607
684
|
try { require("child_process").execSync("ipconfig /flushdns", { windowsHide: true, stdio: "ignore" }); } catch { /* ignore */ }
|
|
608
685
|
log("🌐 DNS: ✅ all tool hosts removed");
|
|
609
686
|
} else {
|
|
@@ -638,10 +715,10 @@ async function stopServer(sudoPassword) {
|
|
|
638
715
|
async function enableToolDNS(tool, sudoPassword) {
|
|
639
716
|
const status = await getMitmStatus();
|
|
640
717
|
if (!status.running) throw new Error("MITM server is not running. Start the server first.");
|
|
641
|
-
|
|
642
|
-
// Use cached password if not provided
|
|
718
|
+
|
|
643
719
|
const password = sudoPassword || getCachedPassword() || await loadEncryptedPassword();
|
|
644
720
|
await addDNSEntry(tool, password);
|
|
721
|
+
await saveDnsToolState(tool, true);
|
|
645
722
|
return { success: true };
|
|
646
723
|
}
|
|
647
724
|
|
|
@@ -649,9 +726,9 @@ async function enableToolDNS(tool, sudoPassword) {
|
|
|
649
726
|
* Disable DNS for a specific tool
|
|
650
727
|
*/
|
|
651
728
|
async function disableToolDNS(tool, sudoPassword) {
|
|
652
|
-
// Use cached password if not provided
|
|
653
729
|
const password = sudoPassword || getCachedPassword() || await loadEncryptedPassword();
|
|
654
730
|
await removeDNSEntry(tool, password);
|
|
731
|
+
await saveDnsToolState(tool, false);
|
|
655
732
|
return { success: true };
|
|
656
733
|
}
|
|
657
734
|
|
|
@@ -667,7 +744,7 @@ async function trustCert(sudoPassword) {
|
|
|
667
744
|
return;
|
|
668
745
|
}
|
|
669
746
|
const password = sudoPassword || getCachedPassword() || await loadEncryptedPassword();
|
|
670
|
-
if (!password &&
|
|
747
|
+
if (!password && isSudoPasswordRequired()) throw new Error("Sudo password required to trust certificate");
|
|
671
748
|
await installCert(password, rootCACertPath);
|
|
672
749
|
if (password) setCachedPassword(password);
|
|
673
750
|
}
|
|
@@ -690,5 +767,9 @@ module.exports = {
|
|
|
690
767
|
setCachedPassword,
|
|
691
768
|
loadEncryptedPassword,
|
|
692
769
|
clearEncryptedPassword,
|
|
770
|
+
isSudoPasswordRequired,
|
|
693
771
|
initDbHooks,
|
|
772
|
+
restoreToolDNS,
|
|
773
|
+
hasDnsPrivilege,
|
|
774
|
+
removeAllDNSEntriesSync,
|
|
694
775
|
};
|
package/app/src/mitm/server.js
CHANGED
|
@@ -12,9 +12,15 @@ const { getCertForDomain } = require("./cert/generate");
|
|
|
12
12
|
const DB_FILE = path.join(DATA_DIR, "db.json");
|
|
13
13
|
const LOCAL_PORT = 443;
|
|
14
14
|
const IS_WIN = process.platform === "win32";
|
|
15
|
-
const ENABLE_FILE_LOG =
|
|
15
|
+
const ENABLE_FILE_LOG = true;
|
|
16
16
|
const INTERNAL_REQUEST_HEADER = { name: "x-request-source", value: "local" };
|
|
17
17
|
|
|
18
|
+
// Host rewrite for upstream forward: PROD cloudcode-pa is rate-limited (429),
|
|
19
|
+
// daily-cloudcode-pa (dev endpoint) accepts same body+token. Same trick as open-sse.
|
|
20
|
+
const HOST_REWRITE = {
|
|
21
|
+
"cloudcode-pa.googleapis.com": "daily-cloudcode-pa.googleapis.com",
|
|
22
|
+
};
|
|
23
|
+
|
|
18
24
|
// Load handlers — dev/ overrides handlers/ for private implementations
|
|
19
25
|
function loadHandler(name) {
|
|
20
26
|
try { return require(`./dev/${name}`); } catch {}
|
|
@@ -44,7 +50,6 @@ function sniCallback(servername, cb) {
|
|
|
44
50
|
cert: `${certData.cert}\n${rootCAPem}`
|
|
45
51
|
});
|
|
46
52
|
certCache.set(servername, ctx);
|
|
47
|
-
log(`🔐 Cert generated: ${servername}`);
|
|
48
53
|
cb(null, ctx);
|
|
49
54
|
} catch (e) {
|
|
50
55
|
err(`SNI error for ${servername}: ${e.message}`);
|
|
@@ -124,7 +129,8 @@ function getMappedModel(tool, model) {
|
|
|
124
129
|
* Also tees full stream into a dump file when ENABLE_FILE_LOG is on.
|
|
125
130
|
*/
|
|
126
131
|
async function passthrough(req, res, bodyBuffer, onResponse) {
|
|
127
|
-
const
|
|
132
|
+
const originalHost = (req.headers.host || TARGET_HOSTS[0]).split(":")[0];
|
|
133
|
+
const targetHost = HOST_REWRITE[originalHost] || originalHost;
|
|
128
134
|
const targetIP = await resolveTargetIP(targetHost);
|
|
129
135
|
const dumper = ENABLE_FILE_LOG ? createResponseDumper(req, "passthrough") : null;
|
|
130
136
|
|
|
@@ -195,18 +201,13 @@ const server = https.createServer(sslOptions, async (req, res) => {
|
|
|
195
201
|
const isChat = patterns.some(p => req.url.includes(p));
|
|
196
202
|
if (!isChat) return passthrough(req, res, bodyBuffer);
|
|
197
203
|
|
|
198
|
-
log(`🔍 [${tool}] url=${req.url} | bodyLen=${bodyBuffer.length}`);
|
|
199
|
-
|
|
200
204
|
// Cursor uses binary proto — model extraction not possible at this layer.
|
|
201
205
|
// Delegate directly to handler which decodes proto internally.
|
|
202
206
|
if (tool === "cursor") {
|
|
203
|
-
log(`⚡ intercept | cursor | proto`);
|
|
204
207
|
return handlers[tool].intercept(req, res, bodyBuffer, null, passthrough);
|
|
205
208
|
}
|
|
206
209
|
|
|
207
210
|
const model = extractModel(req.url, bodyBuffer);
|
|
208
|
-
log(`🔍 [${tool}] model="${model}"`);
|
|
209
|
-
|
|
210
211
|
const mappedModel = getMappedModel(tool, model);
|
|
211
212
|
const db = fs.existsSync(DB_FILE) ? JSON.parse(fs.readFileSync(DB_FILE, "utf-8")) : {};
|
|
212
213
|
const aliasMappings = db.mitmAlias?.[tool] || {};
|
|
@@ -7,13 +7,15 @@ const IS_WIN = process.platform === "win32";
|
|
|
7
7
|
* Uses `net session` which only succeeds when elevated.
|
|
8
8
|
*/
|
|
9
9
|
function isAdmin() {
|
|
10
|
-
if (
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
10
|
+
if (IS_WIN) {
|
|
11
|
+
try {
|
|
12
|
+
execSync("net session >nul 2>&1", { windowsHide: true, stdio: "ignore" });
|
|
13
|
+
return true;
|
|
14
|
+
} catch {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
16
17
|
}
|
|
18
|
+
return typeof process.getuid === "function" && process.getuid() === 0;
|
|
17
19
|
}
|
|
18
20
|
|
|
19
21
|
/**
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-tool DNS hosts — written to hosts file as 127.0.0.1 when MITM DNS is enabled.
|
|
3
|
+
* Kept in sync with MITM routing; shared by Node (dnsConfig) and dashboard UI.
|
|
4
|
+
*/
|
|
5
|
+
const TOOL_HOSTS = {
|
|
6
|
+
antigravity: ["daily-cloudcode-pa.googleapis.com", "cloudcode-pa.googleapis.com"],
|
|
7
|
+
copilot: ["api.individual.githubcopilot.com"],
|
|
8
|
+
kiro: ["q.us-east-1.amazonaws.com", "codewhisperer.us-east-1.amazonaws.com"],
|
|
9
|
+
cursor: ["api2.cursor.sh"],
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
module.exports = { TOOL_HOSTS };
|