n9router 0.3.94 → 0.3.95
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/build-manifest.json +3 -3
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/basic-chat/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/combos/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/console-log/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/mitm/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/profile/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/[id]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/new/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/proxy-pools/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/quota/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/translator/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/usage/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_global-error.html +1 -1
- package/.next/standalone/.next/server/app/_global-error.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +10 -10
- package/.next/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +10 -10
- package/.next/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +5 -5
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/api/antigravity-tools/import/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/antigravity-tools/import-refresh-tokens/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/login/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cloud/auth/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cloud/credentials/update/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cloud/model/resolve/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/cloud/models/alias/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/combos/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/combos/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/init/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/internal/request-detail/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/internal/usage/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/keys/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/keys/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/models/alias/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/models/availability/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/models/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/models/test/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/oauth/cursor/import/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/oauth/gitlab/pat/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/pricing/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/provider-nodes/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/providers/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/providers/[id]/test-models/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/providers/client/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/providers/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/providers/test-batch/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/providers/validate/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/proxy-pools/[id]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/proxy-pools/[id]/test/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/proxy-pools/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/settings/database/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/settings/require-login/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/settings/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/translator/send/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/translator/translate/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/tunnel/disable/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/tunnel/enable/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/tunnel/status/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/usage/chart/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/usage/history/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/usage/logs/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/usage/providers/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/usage/request-details/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/usage/request-logs/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/usage/stats/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/usage/stream/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/api/chat/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/embeddings/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/messages/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/models/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1/responses/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/callback/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/callback/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/callback.html +1 -1
- package/.next/standalone/.next/server/app/callback.rsc +12 -12
- package/.next/standalone/.next/server/app/callback.segments/_full.segment.rsc +12 -12
- package/.next/standalone/.next/server/app/callback.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/callback.segments/_index.segment.rsc +5 -5
- package/.next/standalone/.next/server/app/callback.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/callback.segments/callback/__PAGE__.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/callback.segments/callback.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/basic-chat.html +1 -1
- package/.next/standalone/.next/server/app/dashboard/basic-chat.rsc +12 -12
- package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/_full.segment.rsc +12 -12
- package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/_index.segment.rsc +5 -5
- package/.next/standalone/.next/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/cli-tools.html +1 -1
- package/.next/standalone/.next/server/app/dashboard/cli-tools.rsc +12 -12
- package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/_full.segment.rsc +12 -12
- package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/_index.segment.rsc +5 -5
- package/.next/standalone/.next/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/combos.html +1 -1
- package/.next/standalone/.next/server/app/dashboard/combos.rsc +13 -13
- package/.next/standalone/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/combos.segments/_full.segment.rsc +13 -13
- package/.next/standalone/.next/server/app/dashboard/combos.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/combos.segments/_index.segment.rsc +5 -5
- package/.next/standalone/.next/server/app/dashboard/combos.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/endpoint.html +1 -1
- package/.next/standalone/.next/server/app/dashboard/endpoint.rsc +12 -12
- package/.next/standalone/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/endpoint.segments/_full.segment.rsc +12 -12
- package/.next/standalone/.next/server/app/dashboard/endpoint.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/endpoint.segments/_index.segment.rsc +5 -5
- package/.next/standalone/.next/server/app/dashboard/endpoint.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/mitm.html +1 -1
- package/.next/standalone/.next/server/app/dashboard/mitm.rsc +12 -12
- package/.next/standalone/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/mitm.segments/_full.segment.rsc +12 -12
- package/.next/standalone/.next/server/app/dashboard/mitm.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/mitm.segments/_index.segment.rsc +5 -5
- package/.next/standalone/.next/server/app/dashboard/mitm.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/profile.html +1 -1
- package/.next/standalone/.next/server/app/dashboard/profile.rsc +13 -13
- package/.next/standalone/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/profile.segments/_full.segment.rsc +13 -13
- package/.next/standalone/.next/server/app/dashboard/profile.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/profile.segments/_index.segment.rsc +5 -5
- package/.next/standalone/.next/server/app/dashboard/profile.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/providers/new.html +1 -1
- package/.next/standalone/.next/server/app/dashboard/providers/new.rsc +13 -13
- package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/providers/new.segments/_full.segment.rsc +13 -13
- package/.next/standalone/.next/server/app/dashboard/providers/new.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/providers/new.segments/_index.segment.rsc +5 -5
- package/.next/standalone/.next/server/app/dashboard/providers/new.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/providers.html +1 -1
- package/.next/standalone/.next/server/app/dashboard/providers.rsc +13 -13
- package/.next/standalone/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/providers.segments/_full.segment.rsc +13 -13
- package/.next/standalone/.next/server/app/dashboard/providers.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/providers.segments/_index.segment.rsc +5 -5
- package/.next/standalone/.next/server/app/dashboard/providers.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/proxy-pools.html +1 -1
- package/.next/standalone/.next/server/app/dashboard/proxy-pools.rsc +13 -13
- package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +13 -13
- package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +5 -5
- package/.next/standalone/.next/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/quota.html +2 -2
- package/.next/standalone/.next/server/app/dashboard/quota.rsc +13 -13
- package/.next/standalone/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/quota.segments/_full.segment.rsc +13 -13
- package/.next/standalone/.next/server/app/dashboard/quota.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/quota.segments/_index.segment.rsc +5 -5
- package/.next/standalone/.next/server/app/dashboard/quota.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/settings/pricing/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/dashboard/settings/pricing.html +1 -1
- package/.next/standalone/.next/server/app/dashboard/settings/pricing.rsc +12 -12
- package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +12 -12
- package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +5 -5
- package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/translator.html +1 -1
- package/.next/standalone/.next/server/app/dashboard/translator.rsc +13 -13
- package/.next/standalone/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/translator.segments/_full.segment.rsc +13 -13
- package/.next/standalone/.next/server/app/dashboard/translator.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/translator.segments/_index.segment.rsc +5 -5
- package/.next/standalone/.next/server/app/dashboard/translator.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard/usage.html +1 -1
- package/.next/standalone/.next/server/app/dashboard/usage.rsc +13 -13
- package/.next/standalone/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/usage.segments/_full.segment.rsc +13 -13
- package/.next/standalone/.next/server/app/dashboard/usage.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard/usage.segments/_index.segment.rsc +5 -5
- package/.next/standalone/.next/server/app/dashboard/usage.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/dashboard.html +1 -1
- package/.next/standalone/.next/server/app/dashboard.rsc +12 -12
- package/.next/standalone/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard.segments/_full.segment.rsc +12 -12
- package/.next/standalone/.next/server/app/dashboard.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/dashboard.segments/_index.segment.rsc +5 -5
- package/.next/standalone/.next/server/app/dashboard.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +10 -10
- package/.next/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
- package/.next/standalone/.next/server/app/index.segments/_full.segment.rsc +10 -10
- package/.next/standalone/.next/server/app/index.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/index.segments/_index.segment.rsc +5 -5
- package/.next/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/landing/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/landing/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/landing.html +1 -1
- package/.next/standalone/.next/server/app/landing.rsc +12 -12
- package/.next/standalone/.next/server/app/landing.segments/_full.segment.rsc +12 -12
- package/.next/standalone/.next/server/app/landing.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/landing.segments/_index.segment.rsc +5 -5
- package/.next/standalone/.next/server/app/landing.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/landing.segments/landing/__PAGE__.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/landing.segments/landing.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/login/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login.html +1 -1
- package/.next/standalone/.next/server/app/login.rsc +12 -12
- package/.next/standalone/.next/server/app/login.segments/_full.segment.rsc +12 -12
- package/.next/standalone/.next/server/app/login.segments/_head.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/login.segments/_index.segment.rsc +5 -5
- package/.next/standalone/.next/server/app/login.segments/_tree.segment.rsc +1 -1
- package/.next/standalone/.next/server/app/login.segments/login/__PAGE__.segment.rsc +4 -4
- package/.next/standalone/.next/server/app/login.segments/login.segment.rsc +3 -3
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0.yvcis._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0148t9m._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0b802lh._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0kpc-o6._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0lc~.sk._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0lp_pm5._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0pwrfp1._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0uw3x8s._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0y.reft._.js +1 -1
- package/.next/standalone/.next/server/chunks/[root-of-the-server]__0y5ae.7._.js +1 -1
- package/.next/standalone/.next/server/chunks/_0__-aqg._.js +1 -1
- package/.next/standalone/.next/server/chunks/_0_ovl1h._.js +1 -1
- package/.next/standalone/.next/server/chunks/ssr/src_0_xhepz._.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +3 -3
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/{static/chunks/02suuzz60dp3d.js → standalone/.next/static/chunks/11q6656-lc_oz.js} +1 -1
- package/.next/standalone/mitm/server.js +3 -2
- package/.next/standalone/mitm/tokenPool.js +108 -8
- package/.next/standalone/package-lock.json +2 -2
- package/.next/standalone/package.json +1 -1
- package/.next/standalone/plans/tauri-app/01-scope-and-architecture.md +218 -0
- package/.next/standalone/plans/tauri-app/02-backend-plan.md +237 -0
- package/.next/standalone/plans/tauri-app/03-tauri-native-plan.md +194 -0
- package/.next/standalone/plans/tauri-app/04-react-ui-plan.md +155 -0
- package/.next/standalone/plans/tauri-app/05-delivery-phases.md +171 -0
- package/.next/standalone/plans/tauri-app/README.md +87 -0
- package/.next/standalone/src/mitm/server.js +3 -2
- package/.next/standalone/src/mitm/tokenPool.js +108 -8
- package/.next/{standalone/.next/static/chunks/02suuzz60dp3d.js → static/chunks/11q6656-lc_oz.js} +1 -1
- package/package.json +1 -1
- /package/.next/standalone/.next/static/{SBId4_Ewcg0cJ2p2zlKeg → 03mW5vaG0Fogum-tDkkOQ}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{SBId4_Ewcg0cJ2p2zlKeg → 03mW5vaG0Fogum-tDkkOQ}/_clientMiddlewareManifest.js +0 -0
- /package/.next/standalone/.next/static/{SBId4_Ewcg0cJ2p2zlKeg → 03mW5vaG0Fogum-tDkkOQ}/_ssgManifest.js +0 -0
- /package/.next/static/{SBId4_Ewcg0cJ2p2zlKeg → 03mW5vaG0Fogum-tDkkOQ}/_buildManifest.js +0 -0
- /package/.next/static/{SBId4_Ewcg0cJ2p2zlKeg → 03mW5vaG0Fogum-tDkkOQ}/_clientMiddlewareManifest.js +0 -0
- /package/.next/static/{SBId4_Ewcg0cJ2p2zlKeg → 03mW5vaG0Fogum-tDkkOQ}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
# Backend Plan
|
|
2
|
+
|
|
3
|
+
## Goal
|
|
4
|
+
|
|
5
|
+
Create a standalone local backend service that replaces only the needed Next.js APIs for the desktop app.
|
|
6
|
+
|
|
7
|
+
The backend must remain OS-agnostic so the same service can run unchanged on macOS, Windows, and Linux.
|
|
8
|
+
|
|
9
|
+
## Backend responsibilities
|
|
10
|
+
|
|
11
|
+
- manage Antigravity accounts and settings
|
|
12
|
+
- expose APIs for desktop UI
|
|
13
|
+
- host OAuth helper flow
|
|
14
|
+
- run and control MITM server
|
|
15
|
+
- maintain token swap state
|
|
16
|
+
- persist usage and request detail records
|
|
17
|
+
- avoid embedding OS-specific privilege logic that should live in Tauri
|
|
18
|
+
|
|
19
|
+
## Source modules to extract
|
|
20
|
+
|
|
21
|
+
### Keep mostly as-is
|
|
22
|
+
|
|
23
|
+
- `src/mitm/server.js`
|
|
24
|
+
- `src/mitm/tokenPool.js`
|
|
25
|
+
- `src/mitm/usageTracker.js`
|
|
26
|
+
- `src/mitm/config.js`
|
|
27
|
+
- `src/mitm/handlers/antigravity.js`
|
|
28
|
+
- `src/mitm/logger.js`
|
|
29
|
+
- `src/mitm/paths.js`
|
|
30
|
+
- `src/lib/localDb.js`
|
|
31
|
+
- `src/lib/usageDb.js`
|
|
32
|
+
- `src/lib/oauth/services/antigravity.js`
|
|
33
|
+
- `open-sse/services/projectId.js`
|
|
34
|
+
|
|
35
|
+
### Replace Next-specific wrappers
|
|
36
|
+
|
|
37
|
+
- `src/app/api/cli-tools/antigravity-mitm/route.js`
|
|
38
|
+
- `src/app/api/antigravity-tools/import/route.js`
|
|
39
|
+
- `src/app/api/usage/stats/route.js`
|
|
40
|
+
- `src/app/api/usage/history/route.js`
|
|
41
|
+
- `src/app/api/usage/request-details/route.js`
|
|
42
|
+
- `src/app/api/internal/usage/route.js`
|
|
43
|
+
- `src/app/api/internal/request-detail/route.js`
|
|
44
|
+
|
|
45
|
+
## Backend package structure
|
|
46
|
+
|
|
47
|
+
```text
|
|
48
|
+
apps/desktop-backend/
|
|
49
|
+
src/
|
|
50
|
+
server/
|
|
51
|
+
app.ts
|
|
52
|
+
routes/
|
|
53
|
+
services/
|
|
54
|
+
accounts/
|
|
55
|
+
mitm/
|
|
56
|
+
tokenSwap/
|
|
57
|
+
usage/
|
|
58
|
+
storage/
|
|
59
|
+
shared/
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Required REST API
|
|
63
|
+
|
|
64
|
+
### Accounts
|
|
65
|
+
|
|
66
|
+
- `GET /api/accounts/antigravity`
|
|
67
|
+
- `POST /api/accounts/antigravity/oauth/start`
|
|
68
|
+
- `POST /api/accounts/antigravity/oauth/complete`
|
|
69
|
+
- `POST /api/accounts/antigravity/import`
|
|
70
|
+
- `PATCH /api/accounts/antigravity/:id`
|
|
71
|
+
- `DELETE /api/accounts/antigravity/:id`
|
|
72
|
+
|
|
73
|
+
### MITM and DNS
|
|
74
|
+
|
|
75
|
+
- `GET /api/mitm/status`
|
|
76
|
+
- `POST /api/mitm/start`
|
|
77
|
+
- `POST /api/mitm/stop`
|
|
78
|
+
- `POST /api/mitm/dns/enable`
|
|
79
|
+
- `POST /api/mitm/dns/disable`
|
|
80
|
+
- `POST /api/mitm/cert/trust`
|
|
81
|
+
- `POST /api/mitm/cert/untrust`
|
|
82
|
+
|
|
83
|
+
Note:
|
|
84
|
+
|
|
85
|
+
- backend routes may delegate privileged actions to Tauri-native commands
|
|
86
|
+
- the UI-facing contract should stay identical on all OSes
|
|
87
|
+
|
|
88
|
+
### Token swap
|
|
89
|
+
|
|
90
|
+
- `GET /api/token-swap/status`
|
|
91
|
+
- `PATCH /api/token-swap/settings`
|
|
92
|
+
- `GET /api/token-swap/pool`
|
|
93
|
+
|
|
94
|
+
### Usage
|
|
95
|
+
|
|
96
|
+
- `GET /api/usage/stats`
|
|
97
|
+
- `GET /api/usage/history`
|
|
98
|
+
- `GET /api/usage/request-details`
|
|
99
|
+
- `GET /api/usage/logs`
|
|
100
|
+
- `POST /api/internal/usage`
|
|
101
|
+
- `POST /api/internal/request-detail`
|
|
102
|
+
|
|
103
|
+
## Implementation steps
|
|
104
|
+
|
|
105
|
+
### 1. Extract persistence layer
|
|
106
|
+
|
|
107
|
+
Tasks:
|
|
108
|
+
|
|
109
|
+
- move `localDb` and `usageDb` into backend package
|
|
110
|
+
- remove `@/` alias imports
|
|
111
|
+
- create shared app data path resolver
|
|
112
|
+
- preserve current data shapes for compatibility
|
|
113
|
+
|
|
114
|
+
Definition of done:
|
|
115
|
+
|
|
116
|
+
- backend can read existing `db.json`
|
|
117
|
+
- backend can read/write `usage.json` and `log.txt`
|
|
118
|
+
|
|
119
|
+
### 2. Extract Antigravity account service
|
|
120
|
+
|
|
121
|
+
Tasks:
|
|
122
|
+
|
|
123
|
+
- move OAuth service logic
|
|
124
|
+
- adapt callback flow to backend route or local callback listener
|
|
125
|
+
- implement account import from `~/.antigravity_tools`
|
|
126
|
+
- preserve project ID handling
|
|
127
|
+
|
|
128
|
+
Definition of done:
|
|
129
|
+
|
|
130
|
+
- user can add account via browser OAuth
|
|
131
|
+
- user can import existing local Antigravity accounts
|
|
132
|
+
|
|
133
|
+
### 3. Extract MITM server service
|
|
134
|
+
|
|
135
|
+
Tasks:
|
|
136
|
+
|
|
137
|
+
- encapsulate MITM start/stop/health operations
|
|
138
|
+
- convert current manager API into backend services
|
|
139
|
+
- separate privileged operations behind Tauri bridge
|
|
140
|
+
- preserve current host matching and request interception logic
|
|
141
|
+
- remove direct dependency on platform shell commands where possible
|
|
142
|
+
|
|
143
|
+
Definition of done:
|
|
144
|
+
|
|
145
|
+
- backend can start/stop MITM
|
|
146
|
+
- backend can report running state, cert status, DNS status
|
|
147
|
+
|
|
148
|
+
### 4. Extract token swap logic
|
|
149
|
+
|
|
150
|
+
Tasks:
|
|
151
|
+
|
|
152
|
+
- preserve round-robin and sticky strategy behavior
|
|
153
|
+
- preserve cooldown maps:
|
|
154
|
+
- quota cooldown
|
|
155
|
+
- auth cooldown
|
|
156
|
+
- model cooldown
|
|
157
|
+
- expose pool state for UI
|
|
158
|
+
|
|
159
|
+
Definition of done:
|
|
160
|
+
|
|
161
|
+
- MITM can route through pooled Antigravity accounts
|
|
162
|
+
- pool state is queryable from the UI
|
|
163
|
+
|
|
164
|
+
### 5. Extract usage APIs
|
|
165
|
+
|
|
166
|
+
Tasks:
|
|
167
|
+
|
|
168
|
+
- port stats endpoint
|
|
169
|
+
- port request details endpoint
|
|
170
|
+
- port internal ingestion endpoints
|
|
171
|
+
- preserve request detail merge behavior
|
|
172
|
+
|
|
173
|
+
Definition of done:
|
|
174
|
+
|
|
175
|
+
- usage tracker can post records to backend
|
|
176
|
+
- UI can fetch aggregate and detail views
|
|
177
|
+
|
|
178
|
+
## Backend refactors required
|
|
179
|
+
|
|
180
|
+
### Remove Next coupling
|
|
181
|
+
|
|
182
|
+
- replace `NextResponse` with Express response helpers
|
|
183
|
+
- replace route module exports with Express routers
|
|
184
|
+
- replace lazy `@/lib/*` imports with package-local imports
|
|
185
|
+
|
|
186
|
+
### Add explicit config
|
|
187
|
+
|
|
188
|
+
- `APP_DATA_DIR`
|
|
189
|
+
- `BACKEND_PORT`
|
|
190
|
+
- `MITM_PORT`
|
|
191
|
+
- `INTERNAL_API_TOKEN` or local loopback guard
|
|
192
|
+
- `PLATFORM` or equivalent runtime flag only if strictly required for diagnostics, not feature branching
|
|
193
|
+
|
|
194
|
+
### Normalize module system
|
|
195
|
+
|
|
196
|
+
The current code mixes ESM and CJS. The backend package should choose one runtime model.
|
|
197
|
+
|
|
198
|
+
Recommendation:
|
|
199
|
+
|
|
200
|
+
- backend app in ESM/TypeScript
|
|
201
|
+
- keep MITM internals in CJS temporarily if extraction is faster
|
|
202
|
+
- wrap with compatibility adapters
|
|
203
|
+
|
|
204
|
+
## Risks
|
|
205
|
+
|
|
206
|
+
### High
|
|
207
|
+
|
|
208
|
+
- current MITM manager mixes process management and privileged actions
|
|
209
|
+
- current code expects localhost APIs at fixed ports
|
|
210
|
+
- current path aliases are tied to the existing repo root
|
|
211
|
+
- 443 binding behavior differs across macOS, Windows, and Linux
|
|
212
|
+
|
|
213
|
+
### Medium
|
|
214
|
+
|
|
215
|
+
- account import paths differ by OS
|
|
216
|
+
- request detail and usage writes may race under heavier load
|
|
217
|
+
- native action failures may be misreported if backend owns too much platform logic
|
|
218
|
+
|
|
219
|
+
## Backend test plan
|
|
220
|
+
|
|
221
|
+
- unit:
|
|
222
|
+
- token pool cooldown behavior
|
|
223
|
+
- usage merge behavior
|
|
224
|
+
- account import parsing
|
|
225
|
+
- integration:
|
|
226
|
+
- OAuth happy path with mocked responses
|
|
227
|
+
- MITM status/start/stop lifecycle
|
|
228
|
+
- internal usage ingestion
|
|
229
|
+
- manual:
|
|
230
|
+
- intercept real Antigravity traffic
|
|
231
|
+
- verify rotation across multiple accounts
|
|
232
|
+
|
|
233
|
+
## Cross-platform backend acceptance
|
|
234
|
+
|
|
235
|
+
- same backend bundle starts under Tauri on macOS, Windows, and Linux
|
|
236
|
+
- no backend route assumes `/etc/hosts`, Windows cert store, or `sudo` directly
|
|
237
|
+
- all OS-specific failures are returned as structured errors, not raw shell output
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
# Tauri Native Plan
|
|
2
|
+
|
|
3
|
+
## Goal
|
|
4
|
+
|
|
5
|
+
Use Tauri as the desktop control plane and native privilege boundary.
|
|
6
|
+
|
|
7
|
+
Windows and Linux support are required for v1, alongside macOS.
|
|
8
|
+
|
|
9
|
+
## Native responsibilities
|
|
10
|
+
|
|
11
|
+
- determine app data directories
|
|
12
|
+
- manage secure secret persistence
|
|
13
|
+
- request elevation when needed
|
|
14
|
+
- modify cert trust and hosts/DNS entries
|
|
15
|
+
- start/stop backend process
|
|
16
|
+
- surface backend and OS status to UI
|
|
17
|
+
- normalize OS-specific privilege flows into one stable app behavior
|
|
18
|
+
|
|
19
|
+
## Why these responsibilities belong in Tauri
|
|
20
|
+
|
|
21
|
+
Current Node code directly handles:
|
|
22
|
+
|
|
23
|
+
- sudo password flow
|
|
24
|
+
- hosts file changes
|
|
25
|
+
- cert store changes
|
|
26
|
+
- process launching
|
|
27
|
+
|
|
28
|
+
That works in a web app context, but it is the wrong long-term boundary for a desktop product. Native desktop concerns should live in the shell layer.
|
|
29
|
+
|
|
30
|
+
## Native command set
|
|
31
|
+
|
|
32
|
+
### Process control
|
|
33
|
+
|
|
34
|
+
- `start_backend`
|
|
35
|
+
- `stop_backend`
|
|
36
|
+
- `backend_status`
|
|
37
|
+
- `start_mitm`
|
|
38
|
+
- `stop_mitm`
|
|
39
|
+
|
|
40
|
+
### Certificate operations
|
|
41
|
+
|
|
42
|
+
- `generate_root_ca`
|
|
43
|
+
- `trust_root_ca`
|
|
44
|
+
- `untrust_root_ca`
|
|
45
|
+
- `cert_status`
|
|
46
|
+
|
|
47
|
+
### DNS / hosts operations
|
|
48
|
+
|
|
49
|
+
- `enable_antigravity_dns`
|
|
50
|
+
- `disable_antigravity_dns`
|
|
51
|
+
- `dns_status`
|
|
52
|
+
|
|
53
|
+
### Secure storage
|
|
54
|
+
|
|
55
|
+
- `store_secret`
|
|
56
|
+
- `read_secret`
|
|
57
|
+
- `delete_secret`
|
|
58
|
+
|
|
59
|
+
## Tauri app structure
|
|
60
|
+
|
|
61
|
+
```text
|
|
62
|
+
apps/desktop-shell/
|
|
63
|
+
src-tauri/
|
|
64
|
+
src/
|
|
65
|
+
commands/
|
|
66
|
+
backend.rs
|
|
67
|
+
cert.rs
|
|
68
|
+
dns.rs
|
|
69
|
+
secrets.rs
|
|
70
|
+
state.rs
|
|
71
|
+
main.rs
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Implementation steps
|
|
75
|
+
|
|
76
|
+
### 1. Backend supervision
|
|
77
|
+
|
|
78
|
+
Tasks:
|
|
79
|
+
|
|
80
|
+
- start Express backend sidecar on app launch
|
|
81
|
+
- wait for health endpoint
|
|
82
|
+
- stop backend gracefully on quit
|
|
83
|
+
- restart on crash with bounded retries
|
|
84
|
+
|
|
85
|
+
Definition of done:
|
|
86
|
+
|
|
87
|
+
- desktop app always knows whether backend is healthy
|
|
88
|
+
|
|
89
|
+
### 2. Certificate management
|
|
90
|
+
|
|
91
|
+
Tasks:
|
|
92
|
+
|
|
93
|
+
- decide ownership of root CA files
|
|
94
|
+
- call backend or shared library to generate CA if absent
|
|
95
|
+
- trust/untrust via native OS-specific implementation
|
|
96
|
+
- report:
|
|
97
|
+
- exists
|
|
98
|
+
- trusted
|
|
99
|
+
- expired
|
|
100
|
+
|
|
101
|
+
Definition of done:
|
|
102
|
+
|
|
103
|
+
- user can trust the cert from desktop UI without raw password entry in the React layer
|
|
104
|
+
|
|
105
|
+
### 3. DNS / hosts control
|
|
106
|
+
|
|
107
|
+
Tasks:
|
|
108
|
+
|
|
109
|
+
- own `/etc/hosts` or Windows hosts mutation via native command
|
|
110
|
+
- flush DNS cache as required per OS
|
|
111
|
+
- expose enabled/disabled status for Antigravity host set
|
|
112
|
+
|
|
113
|
+
Definition of done:
|
|
114
|
+
|
|
115
|
+
- DNS toggling is reliable and idempotent
|
|
116
|
+
|
|
117
|
+
### 4. Secret storage
|
|
118
|
+
|
|
119
|
+
Tasks:
|
|
120
|
+
|
|
121
|
+
- store refresh-sensitive material outside plain UI state
|
|
122
|
+
- persist OAuth or local-service secrets in secure storage where possible
|
|
123
|
+
- avoid long-term Node-managed encrypted sudo-password cache design
|
|
124
|
+
|
|
125
|
+
Definition of done:
|
|
126
|
+
|
|
127
|
+
- desktop app no longer depends on plain password caching in JS globals
|
|
128
|
+
|
|
129
|
+
## OS-specific notes
|
|
130
|
+
|
|
131
|
+
### macOS
|
|
132
|
+
|
|
133
|
+
- hosts mutation and certificate trust require privileged operations
|
|
134
|
+
- DNS cache flush must handle `mDNSResponder`
|
|
135
|
+
- test on recent supported macOS versions, not only one machine
|
|
136
|
+
|
|
137
|
+
### Windows
|
|
138
|
+
|
|
139
|
+
- hosts path and cert store differ
|
|
140
|
+
- UAC elevation flow is mandatory
|
|
141
|
+
- process binding to 443 may need elevated startup path
|
|
142
|
+
- avoid shell-window popups during common actions
|
|
143
|
+
- certificate trust should target the Windows root store explicitly
|
|
144
|
+
|
|
145
|
+
### Linux
|
|
146
|
+
|
|
147
|
+
- distro differences in DNS flush behavior
|
|
148
|
+
- `sudo` may not exist in all environments
|
|
149
|
+
- root trust path can vary
|
|
150
|
+
- define a supported baseline, such as Ubuntu/Debian first, then document others as best effort
|
|
151
|
+
- if system trust installation cannot be fully automated on some distros, surface guided remediation in UI
|
|
152
|
+
|
|
153
|
+
## Cross-platform design constraints
|
|
154
|
+
|
|
155
|
+
- React UI must never need to know platform-specific shell commands
|
|
156
|
+
- backend must not directly own elevation or cert-store logic
|
|
157
|
+
- Tauri commands must return normalized status objects across all OSes
|
|
158
|
+
- every privileged action must have:
|
|
159
|
+
- success result
|
|
160
|
+
- actionable failure message
|
|
161
|
+
- remediation hint when possible
|
|
162
|
+
|
|
163
|
+
## Native risks
|
|
164
|
+
|
|
165
|
+
- binding port 443
|
|
166
|
+
- cert trust differences across OS versions
|
|
167
|
+
- installer permissions and first-run UX
|
|
168
|
+
|
|
169
|
+
## Native verification
|
|
170
|
+
|
|
171
|
+
- backend launches automatically
|
|
172
|
+
- cert can be trusted/untrusted
|
|
173
|
+
- hosts entries can be enabled/disabled
|
|
174
|
+
- app surfaces actionable errors instead of raw shell failures
|
|
175
|
+
|
|
176
|
+
## Per-OS exit criteria
|
|
177
|
+
|
|
178
|
+
### macOS
|
|
179
|
+
|
|
180
|
+
- MITM can be started
|
|
181
|
+
- Antigravity hosts can be enabled and disabled
|
|
182
|
+
- cert can be trusted
|
|
183
|
+
|
|
184
|
+
### Windows
|
|
185
|
+
|
|
186
|
+
- backend and MITM can be started from installed app
|
|
187
|
+
- UAC flow works for hosts and cert operations
|
|
188
|
+
- cert can be trusted in Windows root store
|
|
189
|
+
|
|
190
|
+
### Linux
|
|
191
|
+
|
|
192
|
+
- backend and MITM can be started from installed app
|
|
193
|
+
- hosts mutation works on supported distro baseline
|
|
194
|
+
- documented cert trust flow works for supported distro baseline
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# React UI Plan
|
|
2
|
+
|
|
3
|
+
## Goal
|
|
4
|
+
|
|
5
|
+
Ship a desktop-first operations UI for Antigravity MITM, token swap, and usage analytics.
|
|
6
|
+
|
|
7
|
+
The UI must support macOS, Windows, and Linux without changing information architecture.
|
|
8
|
+
|
|
9
|
+
## UI principles
|
|
10
|
+
|
|
11
|
+
- operational clarity over marketing polish
|
|
12
|
+
- fast state visibility
|
|
13
|
+
- desktop layout first
|
|
14
|
+
- no hidden state for cert, DNS, MITM, or account cooldowns
|
|
15
|
+
|
|
16
|
+
## Routes / screens
|
|
17
|
+
|
|
18
|
+
### 1. Accounts
|
|
19
|
+
|
|
20
|
+
Purpose:
|
|
21
|
+
|
|
22
|
+
- connect Antigravity accounts
|
|
23
|
+
- import existing accounts
|
|
24
|
+
- manage active/inactive status
|
|
25
|
+
|
|
26
|
+
Sections:
|
|
27
|
+
|
|
28
|
+
- account list
|
|
29
|
+
- add account button
|
|
30
|
+
- import from local install
|
|
31
|
+
- token expiry and refresh state
|
|
32
|
+
- project ID / account metadata if useful
|
|
33
|
+
|
|
34
|
+
### 2. MITM
|
|
35
|
+
|
|
36
|
+
Purpose:
|
|
37
|
+
|
|
38
|
+
- operate cert, DNS, and server lifecycle
|
|
39
|
+
|
|
40
|
+
Sections:
|
|
41
|
+
|
|
42
|
+
- cert status card
|
|
43
|
+
- backend status card
|
|
44
|
+
- MITM status card
|
|
45
|
+
- DNS state for Antigravity hosts
|
|
46
|
+
- start/stop and enable/disable actions
|
|
47
|
+
|
|
48
|
+
### 3. Token Swap
|
|
49
|
+
|
|
50
|
+
Purpose:
|
|
51
|
+
|
|
52
|
+
- visualize and configure pool behavior
|
|
53
|
+
|
|
54
|
+
Sections:
|
|
55
|
+
|
|
56
|
+
- enabled toggle
|
|
57
|
+
- strategy selector
|
|
58
|
+
- sticky round-robin settings if retained
|
|
59
|
+
- account pool table
|
|
60
|
+
- cooldown badges
|
|
61
|
+
- active eligibility summary
|
|
62
|
+
|
|
63
|
+
### 4. Usage
|
|
64
|
+
|
|
65
|
+
Purpose:
|
|
66
|
+
|
|
67
|
+
- inspect intercepted traffic and cost estimates
|
|
68
|
+
|
|
69
|
+
Sections:
|
|
70
|
+
|
|
71
|
+
- overview cards
|
|
72
|
+
- recent requests
|
|
73
|
+
- request details table
|
|
74
|
+
- detail drawer
|
|
75
|
+
- filters by provider/account/model/date
|
|
76
|
+
|
|
77
|
+
## Components to reuse from current app
|
|
78
|
+
|
|
79
|
+
- cards and layout primitives from `src/shared/components`
|
|
80
|
+
- MITM screen ideas from `src/app/(dashboard)/dashboard/mitm/MitmPageClient.js`
|
|
81
|
+
- usage screens from `src/app/(dashboard)/dashboard/usage/*`
|
|
82
|
+
|
|
83
|
+
## UI package structure
|
|
84
|
+
|
|
85
|
+
```text
|
|
86
|
+
apps/desktop-ui/
|
|
87
|
+
src/
|
|
88
|
+
app/
|
|
89
|
+
pages/
|
|
90
|
+
features/
|
|
91
|
+
accounts/
|
|
92
|
+
mitm/
|
|
93
|
+
token-swap/
|
|
94
|
+
usage/
|
|
95
|
+
shared/
|
|
96
|
+
api/
|
|
97
|
+
components/
|
|
98
|
+
types/
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## API client plan
|
|
102
|
+
|
|
103
|
+
- single typed client for all backend endpoints
|
|
104
|
+
- polling for status endpoints
|
|
105
|
+
- optimistic updates only where safe
|
|
106
|
+
- explicit loading and error states
|
|
107
|
+
|
|
108
|
+
## State plan
|
|
109
|
+
|
|
110
|
+
- route-local state for filters and forms
|
|
111
|
+
- small shared store for:
|
|
112
|
+
- backend health
|
|
113
|
+
- MITM status
|
|
114
|
+
- DNS status
|
|
115
|
+
- current account summary
|
|
116
|
+
|
|
117
|
+
## UX requirements
|
|
118
|
+
|
|
119
|
+
- clear destructive or privileged action prompts
|
|
120
|
+
- direct explanation when cert trust or hosts mutation fails
|
|
121
|
+
- visible distinction between:
|
|
122
|
+
- MITM server not running
|
|
123
|
+
- DNS not enabled
|
|
124
|
+
- cert not trusted
|
|
125
|
+
- no eligible token-swap accounts
|
|
126
|
+
- platform-specific remediation copy when an operation is blocked by OS permissions or unsupported configuration
|
|
127
|
+
|
|
128
|
+
## Cross-platform UI requirements
|
|
129
|
+
|
|
130
|
+
- no OS should expose raw shell commands as the primary remediation path
|
|
131
|
+
- Windows users should see UAC-oriented guidance
|
|
132
|
+
- Linux users should see distro-aware guidance where automation is partial
|
|
133
|
+
- macOS users should see cert and DNS-specific guidance when trust or cache flush fails
|
|
134
|
+
|
|
135
|
+
## UI milestones
|
|
136
|
+
|
|
137
|
+
### MVP
|
|
138
|
+
|
|
139
|
+
- accounts list and import
|
|
140
|
+
- MITM status and controls
|
|
141
|
+
- token swap status and pool table
|
|
142
|
+
- usage overview and detail list
|
|
143
|
+
|
|
144
|
+
### Post-MVP
|
|
145
|
+
|
|
146
|
+
- richer request detail rendering
|
|
147
|
+
- live event stream for in-progress requests
|
|
148
|
+
- tray quick actions
|
|
149
|
+
|
|
150
|
+
## UI verification
|
|
151
|
+
|
|
152
|
+
- all major states are visible without reading logs
|
|
153
|
+
- user can tell exactly why interception is not working
|
|
154
|
+
- token swap pool is understandable without opening raw JSON
|
|
155
|
+
- Windows and Linux states are presented as first-class supported flows, not fallback/debug views
|