zevairouter 1.0.73 → 1.0.75
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/CHANGELOG.md +10 -0
- package/README.md +30 -6
- package/cli/app/.next-cli-build/BUILD_ID +1 -1
- package/cli/app/.next-cli-build/app-path-routes-manifest.json +4 -4
- package/cli/app/.next-cli-build/build-manifest.json +2 -2
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/automation/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/context/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/playground/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/pxpipe/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/terminal/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.html +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found.html +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/api/models/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/models/test/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/antigravity/bulk-import/[jobId]/cancel/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/antigravity/bulk-import/[jobId]/manual/[workerId]/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/antigravity/bulk-import/[jobId]/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/antigravity/bulk-import/latest/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/antigravity/bulk-import/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/providers/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/providers/validate/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/terminal/session/[id]/input/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/terminal/session/[id]/resize/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/terminal/session/[id]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/terminal/session/[id]/stream/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/terminal/session/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/version/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/callback.html +1 -1
- package/cli/app/.next-cli-build/server/app/callback.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/callback.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/callback.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/callback.segments/callback.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/automation.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/automation.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard/automation/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard/automation.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/combos.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/context.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/context.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard/context/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard/context.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/playground.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/playground.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard/playground/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard/playground.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/profile.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/quota.html +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/quota.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/translator.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/usage.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/index.html +1 -1
- package/cli/app/.next-cli-build/server/app/index.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/index.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/index.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/landing.html +1 -1
- package/cli/app/.next-cli-build/server/app/landing.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/landing.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/landing.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/landing.segments/landing.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/login.html +1 -1
- package/cli/app/.next-cli-build/server/app/login.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/login.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/login.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/login.segments/login.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app-paths-manifest.json +4 -4
- package/cli/app/.next-cli-build/server/chunks/3110.js +2 -2
- package/cli/app/.next-cli-build/server/chunks/3407.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/415.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/4177.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/4746.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/6896.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/7276.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/7828.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/9489.js +1 -1
- package/cli/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/pages/404.html +1 -1
- package/cli/app/.next-cli-build/server/pages/500.html +1 -1
- package/cli/app/.next-cli-build/static/chunks/{3702-4d2e4b7e4bdf361e.js → 3702-8e77bb853a76a33d.js} +1 -1
- package/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/src/lib/terminal/ptyBridge.py +163 -0
- package/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/src/lib/terminal/ptyBridge.py +163 -0
- package/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/src/lib/terminal/ptyBridge.py +163 -0
- package/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/src/lib/terminal/ptyBridge.py +163 -0
- package/cli/app/package.json +1 -1
- package/cli/package.json +1 -1
- package/open-sse/executors/antigravity.js +10 -1
- package/open-sse/services/projectId.js +206 -49
- package/open-sse/translator/request/openai-to-gemini.js +8 -2
- package/package.json +1 -1
- package/src/lib/oauth/providers.js +23 -53
- package/src/lib/oauth/services/antigravityBulkImportManager.js +49 -1
- package/src/sse/handlers/chat.js +42 -7
- package/src/sse/services/auth.js +1 -1
- /package/cli/app/.next-cli-build/static/{ZmhcxPfn8Y_X2WWVQG99n → aOOVynWc6paXJaYTiERoF}/_buildManifest.js +0 -0
- /package/cli/app/.next-cli-build/static/{ZmhcxPfn8Y_X2WWVQG99n → aOOVynWc6paXJaYTiERoF}/_ssgManifest.js +0 -0
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Project ID Service - Fetch and cache real Project IDs from Google Cloud Code API
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
4
|
* Instead of generating random project IDs (e.g. "useful-spark-a1b2c"),
|
|
6
5
|
* this service fetches the real Project ID bound to the authenticated user's account.
|
|
7
6
|
* This significantly reduces the risk of being flagged by Google's anti-abuse systems.
|
|
7
|
+
*
|
|
8
|
+
* Account types:
|
|
9
|
+
* - free-tier (personal Gmail): loadCodeAssist / onboardUser returns a managed project id
|
|
10
|
+
* - standard-tier + userDefinedCloudaicompanionProject (GSuite/DASHER): caller must supply
|
|
11
|
+
* a real GCP project the user can access (Code Assist license + IAM)
|
|
8
12
|
*/
|
|
9
13
|
|
|
10
14
|
import { CLOUD_CODE_API, LOAD_CODE_ASSIST_HEADERS, LOAD_CODE_ASSIST_METADATA } from "../config/appConstants.js";
|
|
@@ -75,36 +79,72 @@ startCacheCleanup();
|
|
|
75
79
|
|
|
76
80
|
// ─── Public API ───────────────────────────────────────────────────────────────
|
|
77
81
|
|
|
82
|
+
/**
|
|
83
|
+
* Normalize a project id that may be a string or { id }.
|
|
84
|
+
* @param {unknown} value
|
|
85
|
+
* @returns {string|null}
|
|
86
|
+
*/
|
|
87
|
+
export function normalizeProjectId(value) {
|
|
88
|
+
if (typeof value === "string") {
|
|
89
|
+
const id = value.trim();
|
|
90
|
+
return id || null;
|
|
91
|
+
}
|
|
92
|
+
if (value && typeof value === "object" && typeof value.id === "string") {
|
|
93
|
+
const id = value.id.trim();
|
|
94
|
+
return id || null;
|
|
95
|
+
}
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Detect whether a project id looks like a synthetic/random id we used to generate
|
|
101
|
+
* (e.g. "useful-spark-a1b2c"). Real GCP ids and Google-managed free-tier ids are kept.
|
|
102
|
+
* @param {string|null|undefined} projectId
|
|
103
|
+
* @returns {boolean}
|
|
104
|
+
*/
|
|
105
|
+
export function isSyntheticProjectId(projectId) {
|
|
106
|
+
if (!projectId || typeof projectId !== "string") return false;
|
|
107
|
+
// Historical generator: adj-noun-5hex
|
|
108
|
+
return /^(useful|bright|swift|calm|bold)-(fuze|wave|spark|flow|core)-[0-9a-f]{5}$/i.test(projectId.trim());
|
|
109
|
+
}
|
|
110
|
+
|
|
78
111
|
/**
|
|
79
112
|
* Get the Project ID for a connection, with caching.
|
|
80
|
-
* Returns null on failure (callers
|
|
113
|
+
* Returns null on failure (callers must NOT invent a random project id).
|
|
81
114
|
*
|
|
82
115
|
* @param {string} connectionId - The connection identifier for cache keying
|
|
83
116
|
* @param {string} accessToken - Valid OAuth access token
|
|
117
|
+
* @param {{ preferredProjectId?: string|null }} [options]
|
|
84
118
|
* @returns {Promise<string|null>} Real project ID or null
|
|
85
119
|
*/
|
|
86
|
-
export async function getProjectIdForConnection(connectionId, accessToken) {
|
|
120
|
+
export async function getProjectIdForConnection(connectionId, accessToken, options = {}) {
|
|
87
121
|
if (!connectionId || !accessToken) return null;
|
|
88
122
|
|
|
89
|
-
|
|
123
|
+
const preferred = normalizeProjectId(options.preferredProjectId);
|
|
124
|
+
|
|
125
|
+
// Return cached value if still fresh (unless preferred is set and differs)
|
|
90
126
|
const cached = projectIdCache.get(connectionId);
|
|
91
127
|
if (cached && Date.now() - cached.fetchedAt < CACHE_TTL_MS) {
|
|
92
|
-
|
|
128
|
+
if (!preferred || preferred === cached.projectId) {
|
|
129
|
+
return cached.projectId;
|
|
130
|
+
}
|
|
93
131
|
}
|
|
94
132
|
|
|
95
|
-
// Deduplicate concurrent fetches for the same connection
|
|
96
|
-
|
|
97
|
-
|
|
133
|
+
// Deduplicate concurrent fetches for the same connection+preferred
|
|
134
|
+
const pendingKey = preferred ? `${connectionId}::${preferred}` : connectionId;
|
|
135
|
+
if (pendingFetches.has(pendingKey)) {
|
|
136
|
+
return pendingFetches.get(pendingKey).promise;
|
|
98
137
|
}
|
|
99
138
|
|
|
100
|
-
// Each fetch gets its own AbortController so it can be canceled via removeConnection()
|
|
101
139
|
const controller = new AbortController();
|
|
102
140
|
|
|
103
141
|
const promise = (async () => {
|
|
104
142
|
try {
|
|
105
|
-
const projectId = await fetchProjectId(accessToken, controller.signal
|
|
143
|
+
const projectId = await fetchProjectId(accessToken, controller.signal, {
|
|
144
|
+
preferredProjectId: preferred,
|
|
145
|
+
});
|
|
106
146
|
if (projectId) {
|
|
107
|
-
projectIdCache.set(connectionId, {projectId, fetchedAt: Date.now()});
|
|
147
|
+
projectIdCache.set(connectionId, { projectId, fetchedAt: Date.now() });
|
|
108
148
|
return projectId;
|
|
109
149
|
}
|
|
110
150
|
console.warn("[ProjectId] could not fetch projectId for connection", connectionId.slice(0, 8));
|
|
@@ -113,14 +153,38 @@ export async function getProjectIdForConnection(connectionId, accessToken) {
|
|
|
113
153
|
console.warn(`[ProjectId] Error fetching project ID: ${error.message}`);
|
|
114
154
|
return null;
|
|
115
155
|
} finally {
|
|
116
|
-
pendingFetches.delete(
|
|
156
|
+
pendingFetches.delete(pendingKey);
|
|
117
157
|
}
|
|
118
158
|
})();
|
|
119
159
|
|
|
120
|
-
pendingFetches.set(
|
|
160
|
+
pendingFetches.set(pendingKey, { promise, controller, startedAt: Date.now() });
|
|
121
161
|
return promise;
|
|
122
162
|
}
|
|
123
163
|
|
|
164
|
+
/**
|
|
165
|
+
* Resolve project id for an access token without connection caching.
|
|
166
|
+
* Used by OAuth postExchange / bulk import.
|
|
167
|
+
*
|
|
168
|
+
* @param {string} accessToken
|
|
169
|
+
* @param {{ preferredProjectId?: string|null }} [options]
|
|
170
|
+
* @returns {Promise<{ projectId: string|null, tierId: string|null, requiresUserProject: boolean, loadRaw?: object, error?: string }>}
|
|
171
|
+
*/
|
|
172
|
+
export async function resolveCloudCodeProject(accessToken, options = {}) {
|
|
173
|
+
if (!accessToken) {
|
|
174
|
+
return { projectId: null, tierId: null, requiresUserProject: false, error: "missing access token" };
|
|
175
|
+
}
|
|
176
|
+
try {
|
|
177
|
+
return await resolveProjectFromApi(accessToken, undefined, options);
|
|
178
|
+
} catch (error) {
|
|
179
|
+
return {
|
|
180
|
+
projectId: null,
|
|
181
|
+
tierId: null,
|
|
182
|
+
requiresUserProject: false,
|
|
183
|
+
error: error?.message || String(error),
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
124
188
|
/**
|
|
125
189
|
* Invalidate the cached project ID for a connection.
|
|
126
190
|
* Call this when a connection's credentials are fully revoked or refreshed.
|
|
@@ -131,36 +195,46 @@ export function invalidateProjectId(connectionId) {
|
|
|
131
195
|
|
|
132
196
|
/**
|
|
133
197
|
* Fully remove a connection: abort any in-flight fetch and delete its cached project ID.
|
|
134
|
-
* Wire this into your connection close / disconnect lifecycle events to prevent memory leaks.
|
|
135
198
|
*
|
|
136
199
|
* @param {string} connectionId
|
|
137
200
|
*/
|
|
138
201
|
export function removeConnection(connectionId) {
|
|
139
202
|
if (!connectionId) return;
|
|
140
203
|
projectIdCache.delete(connectionId);
|
|
141
|
-
const pending
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
204
|
+
for (const [key, pending] of pendingFetches) {
|
|
205
|
+
if (key === connectionId || key.startsWith(`${connectionId}::`)) {
|
|
206
|
+
try { pending.controller.abort(); } catch (_) { /* ignore */ }
|
|
207
|
+
pendingFetches.delete(key);
|
|
208
|
+
}
|
|
145
209
|
}
|
|
146
210
|
}
|
|
147
211
|
|
|
148
212
|
// ─── Internal helpers ─────────────────────────────────────────────────────────
|
|
149
213
|
|
|
150
214
|
/**
|
|
151
|
-
*
|
|
152
|
-
*
|
|
153
|
-
*
|
|
154
|
-
* @param {string} accessToken
|
|
155
|
-
* @param {AbortSignal} signal
|
|
215
|
+
* @param {string} accessToken
|
|
216
|
+
* @param {AbortSignal} [signal]
|
|
217
|
+
* @param {{ preferredProjectId?: string|null }} [options]
|
|
156
218
|
* @returns {Promise<string|null>}
|
|
157
219
|
*/
|
|
158
|
-
async function fetchProjectId(accessToken, signal) {
|
|
220
|
+
async function fetchProjectId(accessToken, signal, options = {}) {
|
|
221
|
+
const result = await resolveProjectFromApi(accessToken, signal, options);
|
|
222
|
+
return result.projectId;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* @param {string} accessToken
|
|
227
|
+
* @param {AbortSignal} [signal]
|
|
228
|
+
* @param {{ preferredProjectId?: string|null }} [options]
|
|
229
|
+
*/
|
|
230
|
+
async function resolveProjectFromApi(accessToken, signal, options = {}) {
|
|
231
|
+
const preferred = normalizeProjectId(options.preferredProjectId);
|
|
232
|
+
|
|
159
233
|
const response = await fetch(CLOUD_CODE_API.loadCodeAssist, {
|
|
160
234
|
method: "POST",
|
|
161
235
|
headers: { ...LOAD_CODE_ASSIST_HEADERS, "Authorization": `Bearer ${accessToken}` },
|
|
162
236
|
body: JSON.stringify({ metadata: LOAD_CODE_ASSIST_METADATA }),
|
|
163
|
-
signal
|
|
237
|
+
signal,
|
|
164
238
|
});
|
|
165
239
|
|
|
166
240
|
if (!response.ok) {
|
|
@@ -169,44 +243,84 @@ async function fetchProjectId(accessToken, signal) {
|
|
|
169
243
|
}
|
|
170
244
|
|
|
171
245
|
const data = await response.json();
|
|
172
|
-
const
|
|
173
|
-
if (
|
|
246
|
+
const existing = extractProjectId(data);
|
|
247
|
+
if (existing) {
|
|
248
|
+
return {
|
|
249
|
+
projectId: existing,
|
|
250
|
+
tierId: pickTierId(data) || null,
|
|
251
|
+
requiresUserProject: false,
|
|
252
|
+
loadRaw: data,
|
|
253
|
+
};
|
|
254
|
+
}
|
|
174
255
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
256
|
+
const tierInfo = pickTierInfo(data);
|
|
257
|
+
const tierId = tierInfo.tierId || "free-tier";
|
|
258
|
+
const requiresUserProject = !!tierInfo.userDefined;
|
|
259
|
+
|
|
260
|
+
// Workspace / DASHER: free-tier blocked at loadCodeAssist. Chat still works with an
|
|
261
|
+
// existing managed Cloud Code project string (from free-tier peers / stored id) —
|
|
262
|
+
// no GCP console setup required. Only onboard when caller supplies a preferred id.
|
|
263
|
+
if (requiresUserProject) {
|
|
264
|
+
if (!preferred) {
|
|
265
|
+
console.warn(
|
|
266
|
+
"[ProjectId] GSuite/DASHER has no free-tier project from loadCodeAssist; " +
|
|
267
|
+
"caller should reuse a stored/peer managed project id."
|
|
268
|
+
);
|
|
269
|
+
return {
|
|
270
|
+
projectId: null,
|
|
271
|
+
tierId,
|
|
272
|
+
requiresUserProject: true,
|
|
273
|
+
loadRaw: data,
|
|
274
|
+
error: "no managed project on account; use stored or peer projectId",
|
|
275
|
+
};
|
|
185
276
|
}
|
|
277
|
+
const onboarded = await onboardUser(accessToken, tierId, signal, preferred);
|
|
278
|
+
return {
|
|
279
|
+
projectId: onboarded || preferred,
|
|
280
|
+
tierId,
|
|
281
|
+
requiresUserProject: true,
|
|
282
|
+
loadRaw: data,
|
|
283
|
+
error: undefined,
|
|
284
|
+
};
|
|
186
285
|
}
|
|
187
286
|
|
|
188
|
-
|
|
287
|
+
// free-tier / auto project: onboard without a project string
|
|
288
|
+
const onboarded = await onboardUser(accessToken, tierId, signal, null);
|
|
289
|
+
return {
|
|
290
|
+
projectId: onboarded,
|
|
291
|
+
tierId,
|
|
292
|
+
requiresUserProject: false,
|
|
293
|
+
loadRaw: data,
|
|
294
|
+
error: onboarded ? undefined : "onboardUser did not return a project id",
|
|
295
|
+
};
|
|
189
296
|
}
|
|
190
297
|
|
|
191
298
|
/**
|
|
192
299
|
* Fetch project ID via onboardUser endpoint (polls until done).
|
|
193
300
|
*
|
|
194
|
-
* @param {string}
|
|
195
|
-
* @param {string}
|
|
196
|
-
* @param {AbortSignal} externalSignal
|
|
301
|
+
* @param {string} accessToken
|
|
302
|
+
* @param {string} tierID
|
|
303
|
+
* @param {AbortSignal} [externalSignal]
|
|
304
|
+
* @param {string|null} [cloudaicompanionProject] - string project id for standard-tier
|
|
197
305
|
* @returns {Promise<string|null>}
|
|
198
306
|
*/
|
|
199
|
-
async function onboardUser(accessToken, tierID, externalSignal) {
|
|
200
|
-
console.log(
|
|
307
|
+
async function onboardUser(accessToken, tierID, externalSignal, cloudaicompanionProject = null) {
|
|
308
|
+
console.log(
|
|
309
|
+
`[ProjectId] Onboarding user with tier: ${tierID}` +
|
|
310
|
+
(cloudaicompanionProject ? ` project=${cloudaicompanionProject}` : "")
|
|
311
|
+
);
|
|
201
312
|
|
|
202
313
|
const reqBody = { tierId: tierID, metadata: LOAD_CODE_ASSIST_METADATA };
|
|
314
|
+
// API expects a scalar string for cloudaicompanionProject (not {id: ...}).
|
|
315
|
+
if (cloudaicompanionProject) {
|
|
316
|
+
reqBody.cloudaicompanionProject = cloudaicompanionProject;
|
|
317
|
+
}
|
|
318
|
+
|
|
203
319
|
const MAX_ATTEMPTS = 5;
|
|
204
320
|
|
|
205
321
|
for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) {
|
|
206
|
-
// Bail out immediately if the connection was removed
|
|
207
322
|
if (externalSignal?.aborted) return null;
|
|
208
323
|
|
|
209
|
-
// Per-attempt timeout controller; forwards external abort as well
|
|
210
324
|
const localCtrl = new AbortController();
|
|
211
325
|
const timeoutId = setTimeout(() => localCtrl.abort(), 30_000);
|
|
212
326
|
const forwardAbort = () => localCtrl.abort();
|
|
@@ -217,7 +331,7 @@ async function onboardUser(accessToken, tierID, externalSignal) {
|
|
|
217
331
|
method: "POST",
|
|
218
332
|
headers: { ...LOAD_CODE_ASSIST_HEADERS, "Authorization": `Bearer ${accessToken}` },
|
|
219
333
|
body: JSON.stringify(reqBody),
|
|
220
|
-
signal: localCtrl.signal
|
|
334
|
+
signal: localCtrl.signal,
|
|
221
335
|
});
|
|
222
336
|
|
|
223
337
|
clearTimeout(timeoutId);
|
|
@@ -235,10 +349,14 @@ async function onboardUser(accessToken, tierID, externalSignal) {
|
|
|
235
349
|
console.log(`[ProjectId] Successfully onboarded, project ID: ${projectId}`);
|
|
236
350
|
return projectId;
|
|
237
351
|
}
|
|
352
|
+
// Some standard-tier responses echo empty object; fall back to requested project.
|
|
353
|
+
if (cloudaicompanionProject) {
|
|
354
|
+
console.log(`[ProjectId] onboard done without id; using preferred project ${cloudaicompanionProject}`);
|
|
355
|
+
return cloudaicompanionProject;
|
|
356
|
+
}
|
|
238
357
|
throw new Error("onboardUser done but no project_id in response");
|
|
239
358
|
}
|
|
240
359
|
|
|
241
|
-
// Server not done yet – wait and retry
|
|
242
360
|
console.log(`[ProjectId] Onboard attempt ${attempt}/${MAX_ATTEMPTS}: not done yet, waiting...`);
|
|
243
361
|
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
244
362
|
|
|
@@ -246,14 +364,13 @@ async function onboardUser(accessToken, tierID, externalSignal) {
|
|
|
246
364
|
clearTimeout(timeoutId);
|
|
247
365
|
if (error.name === "AbortError") {
|
|
248
366
|
console.warn(`[ProjectId] onboardUser attempt ${attempt} aborted (timeout or connection removed)`);
|
|
249
|
-
if (externalSignal?.aborted) return null;
|
|
367
|
+
if (externalSignal?.aborted) return null;
|
|
250
368
|
continue;
|
|
251
369
|
}
|
|
252
370
|
if (attempt === MAX_ATTEMPTS) {
|
|
253
371
|
console.warn(`[ProjectId] onboardUser failed after ${MAX_ATTEMPTS} attempts: ${error.message}`);
|
|
254
372
|
return null;
|
|
255
373
|
}
|
|
256
|
-
// Continue to next attempt instead of throwing (which would skip remaining retries)
|
|
257
374
|
console.warn(`[ProjectId] onboardUser attempt ${attempt} failed: ${error.message}, retrying...`);
|
|
258
375
|
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
259
376
|
} finally {
|
|
@@ -265,6 +382,46 @@ async function onboardUser(accessToken, tierID, externalSignal) {
|
|
|
265
382
|
return null;
|
|
266
383
|
}
|
|
267
384
|
|
|
385
|
+
function pickTierInfo(data) {
|
|
386
|
+
let tierId = null;
|
|
387
|
+
let userDefined = false;
|
|
388
|
+
|
|
389
|
+
if (data?.currentTier?.id && typeof data.currentTier.id === "string") {
|
|
390
|
+
tierId = data.currentTier.id.trim();
|
|
391
|
+
userDefined = !!data.currentTier.userDefinedCloudaicompanionProject;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
if (Array.isArray(data?.allowedTiers)) {
|
|
395
|
+
for (const tier of data.allowedTiers) {
|
|
396
|
+
if (tier && typeof tier === "object" && tier.isDefault === true && tier.id) {
|
|
397
|
+
tierId = String(tier.id).trim();
|
|
398
|
+
userDefined = !!tier.userDefinedCloudaicompanionProject;
|
|
399
|
+
break;
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
// If no default, prefer free-tier when present (personal accounts).
|
|
403
|
+
if (!tierId) {
|
|
404
|
+
const free = data.allowedTiers.find(t => t?.id === "free-tier");
|
|
405
|
+
if (free) {
|
|
406
|
+
tierId = "free-tier";
|
|
407
|
+
userDefined = !!free.userDefinedCloudaicompanionProject;
|
|
408
|
+
} else if (data.allowedTiers[0]?.id) {
|
|
409
|
+
tierId = String(data.allowedTiers[0].id).trim();
|
|
410
|
+
userDefined = !!data.allowedTiers[0].userDefinedCloudaicompanionProject;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
// free-tier is never user-defined even if flag is missing
|
|
416
|
+
if (tierId === "free-tier") userDefined = false;
|
|
417
|
+
|
|
418
|
+
return { tierId, userDefined };
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
function pickTierId(data) {
|
|
422
|
+
return pickTierInfo(data).tierId;
|
|
423
|
+
}
|
|
424
|
+
|
|
268
425
|
/**
|
|
269
426
|
* Extract project ID from loadCodeAssist response.
|
|
270
427
|
*/
|
|
@@ -269,7 +269,10 @@ export function openaiToGeminiCLIRequest(model, body, stream) {
|
|
|
269
269
|
|
|
270
270
|
// Wrap Gemini CLI format in Cloud Code wrapper
|
|
271
271
|
function wrapInCloudCodeEnvelope(model, geminiCLI, credentials = null, isAntigravity = false) {
|
|
272
|
-
const projectId =
|
|
272
|
+
const projectId =
|
|
273
|
+
credentials?.projectId ||
|
|
274
|
+
credentials?.providerSpecificData?.projectId ||
|
|
275
|
+
generateProjectId();
|
|
273
276
|
|
|
274
277
|
const envelope = {
|
|
275
278
|
project: projectId,
|
|
@@ -318,7 +321,10 @@ function wrapInCloudCodeEnvelope(model, geminiCLI, credentials = null, isAntigra
|
|
|
318
321
|
|
|
319
322
|
// Wrap Claude format in Cloud Code envelope for Antigravity
|
|
320
323
|
function wrapInCloudCodeEnvelopeForClaude(model, claudeRequest, credentials = null) {
|
|
321
|
-
const projectId =
|
|
324
|
+
const projectId =
|
|
325
|
+
credentials?.projectId ||
|
|
326
|
+
credentials?.providerSpecificData?.projectId ||
|
|
327
|
+
generateProjectId();
|
|
322
328
|
|
|
323
329
|
const envelope = {
|
|
324
330
|
project: projectId,
|
package/package.json
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
// Ensure outbound fetch respects HTTP(S)_PROXY/ALL_PROXY in Node runtime
|
|
7
7
|
import "open-sse/index.js";
|
|
8
8
|
import crypto from "crypto";
|
|
9
|
+
import { resolveCloudCodeProject } from "open-sse/services/projectId.js";
|
|
9
10
|
|
|
10
11
|
import { generatePKCE, generateState } from "./utils/pkce";
|
|
11
12
|
import {
|
|
@@ -437,17 +438,6 @@ const PROVIDERS = {
|
|
|
437
438
|
return await response.json();
|
|
438
439
|
},
|
|
439
440
|
postExchange: async (tokens) => {
|
|
440
|
-
// Numeric enums matching Antigravity binary ClientMetadata
|
|
441
|
-
const loadHeaders = {
|
|
442
|
-
"Authorization": `Bearer ${tokens.access_token}`,
|
|
443
|
-
"Content-Type": "application/json",
|
|
444
|
-
"User-Agent": ANTIGRAVITY_CONFIG.loadCodeAssistUserAgent,
|
|
445
|
-
"X-Goog-Api-Client": ANTIGRAVITY_CONFIG.loadCodeAssistApiClient,
|
|
446
|
-
"Client-Metadata": ANTIGRAVITY_CONFIG.loadCodeAssistClientMetadata,
|
|
447
|
-
"x-request-source": "local",
|
|
448
|
-
};
|
|
449
|
-
const metadata = getOAuthClientMetadata();
|
|
450
|
-
|
|
451
441
|
// Fetch user info
|
|
452
442
|
const userInfoRes = await fetch(`${ANTIGRAVITY_CONFIG.userInfoUrl}?alt=json`, {
|
|
453
443
|
headers: {
|
|
@@ -457,52 +447,32 @@ const PROVIDERS = {
|
|
|
457
447
|
});
|
|
458
448
|
const userInfo = userInfoRes.ok ? await userInfoRes.json() : {};
|
|
459
449
|
|
|
460
|
-
//
|
|
450
|
+
// Resolve managed Cloud Code project (loadCodeAssist + free-tier onboard).
|
|
451
|
+
// GSuite/DASHER often has none — bulk save applies peer/bootstrap projectId.
|
|
452
|
+
const preferredProjectId =
|
|
453
|
+
process.env.ANTIGRAVITY_GCP_PROJECT ||
|
|
454
|
+
process.env.ZEVAI_ANTIGRAVITY_GCP_PROJECT ||
|
|
455
|
+
"";
|
|
461
456
|
let projectId = "";
|
|
462
|
-
let tierId = "legacy-tier";
|
|
463
457
|
try {
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
}
|
|
458
|
+
// Cap wait so bulk automation never hangs on Cloud Code onboard retries.
|
|
459
|
+
const resolved = await Promise.race([
|
|
460
|
+
resolveCloudCodeProject(tokens.access_token, {
|
|
461
|
+
preferredProjectId: preferredProjectId || null,
|
|
462
|
+
}),
|
|
463
|
+
new Promise((resolve) =>
|
|
464
|
+
setTimeout(
|
|
465
|
+
() => resolve({ projectId: null, error: "project resolve timed out" }),
|
|
466
|
+
20_000,
|
|
467
|
+
),
|
|
468
|
+
),
|
|
469
|
+
]);
|
|
470
|
+
projectId = resolved.projectId || preferredProjectId || "";
|
|
471
|
+
if (!projectId && resolved.error) {
|
|
472
|
+
console.warn("[Antigravity OAuth] project resolve:", resolved.error);
|
|
480
473
|
}
|
|
481
474
|
} catch (e) {
|
|
482
|
-
console.
|
|
483
|
-
}
|
|
484
|
-
|
|
485
|
-
// Fire-and-forget onboarding — does not block DB save
|
|
486
|
-
if (projectId) {
|
|
487
|
-
const doOnboard = async () => {
|
|
488
|
-
for (let i = 0; i < 10; i++) {
|
|
489
|
-
try {
|
|
490
|
-
const onboardRes = await fetch(ANTIGRAVITY_CONFIG.onboardUserEndpoint, {
|
|
491
|
-
method: "POST",
|
|
492
|
-
headers: loadHeaders,
|
|
493
|
-
body: JSON.stringify({ tierId, metadata }),
|
|
494
|
-
});
|
|
495
|
-
if (onboardRes.ok) {
|
|
496
|
-
const result = await onboardRes.json();
|
|
497
|
-
if (result.done === true) break;
|
|
498
|
-
}
|
|
499
|
-
} catch (e) {
|
|
500
|
-
break;
|
|
501
|
-
}
|
|
502
|
-
await new Promise(resolve => setTimeout(resolve, 5000));
|
|
503
|
-
}
|
|
504
|
-
};
|
|
505
|
-
doOnboard().catch(() => {});
|
|
475
|
+
console.warn("[Antigravity OAuth] project resolve failed:", e?.message || e);
|
|
506
476
|
}
|
|
507
477
|
|
|
508
478
|
return { userInfo, projectId };
|
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
createGenericCallbackMonitor,
|
|
14
14
|
} from "./kiroGoogleAutomation.js";
|
|
15
15
|
import { generateAuthData, exchangeTokens } from "../providers.js";
|
|
16
|
+
import { resolveCloudCodeProject } from "open-sse/services/projectId.js";
|
|
16
17
|
|
|
17
18
|
const ANTIGRAVITY_PROVIDER_ID = "antigravity";
|
|
18
19
|
const ANTIGRAVITY_LABEL = "Antigravity";
|
|
@@ -26,11 +27,57 @@ function getRedirectUri() {
|
|
|
26
27
|
return `http://localhost:${port}/callback`;
|
|
27
28
|
}
|
|
28
29
|
|
|
30
|
+
/**
|
|
31
|
+
* Bootstrap managed Cloud Code project string.
|
|
32
|
+
* Gmail free-tier usually gets its own from loadCodeAssist/onboard.
|
|
33
|
+
* GSuite/DASHER does not — but chat accepts existing managed project strings
|
|
34
|
+
* (no GCP console, no prior Gmail connection required).
|
|
35
|
+
* Prefer env → peers → token resolve → sticky bootstrap id.
|
|
36
|
+
*/
|
|
37
|
+
const ANTIGRAVITY_BOOTSTRAP_PROJECT =
|
|
38
|
+
process.env.ANTIGRAVITY_GCP_PROJECT ||
|
|
39
|
+
process.env.ZEVAI_ANTIGRAVITY_GCP_PROJECT ||
|
|
40
|
+
// Known-working Cloud Code managed project style id (not a user GCP project).
|
|
41
|
+
// Used only when Google returns no free-tier project (typical GSuite/DASHER).
|
|
42
|
+
"woven-tributary-j9tls";
|
|
43
|
+
|
|
44
|
+
async function resolveProjectIdForSave(tokens) {
|
|
45
|
+
let projectId = (tokens.projectId || "").trim();
|
|
46
|
+
if (projectId) return projectId;
|
|
47
|
+
|
|
48
|
+
// 1) Peer connections already on this machine
|
|
49
|
+
try {
|
|
50
|
+
const { getProviderConnections } = await import("../../../models/index.js");
|
|
51
|
+
const peers = await getProviderConnections({ provider: ANTIGRAVITY_PROVIDER_ID, isActive: true });
|
|
52
|
+
for (const peer of peers || []) {
|
|
53
|
+
const peerPid = (peer.projectId || peer.providerSpecificData?.projectId || "").trim();
|
|
54
|
+
if (peerPid) return peerPid;
|
|
55
|
+
}
|
|
56
|
+
} catch {
|
|
57
|
+
// ignore peer lookup failures
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// 2) Token resolve (free-tier Gmail path if postExchange missed it)
|
|
61
|
+
if (tokens.accessToken) {
|
|
62
|
+
try {
|
|
63
|
+
const resolved = await resolveCloudCodeProject(tokens.accessToken);
|
|
64
|
+
if (resolved.projectId) return resolved.projectId;
|
|
65
|
+
} catch {
|
|
66
|
+
// ignore — never block bulk save on project resolve
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// 3) Bootstrap — GSuite bulk on empty machine still gets a usable projectId
|
|
71
|
+
return ANTIGRAVITY_BOOTSTRAP_PROJECT;
|
|
72
|
+
}
|
|
73
|
+
|
|
29
74
|
async function defaultSaveAntigravityConnection({ tokens, email }) {
|
|
30
75
|
const { createProviderConnection } = await import("../../../models/index.js");
|
|
76
|
+
// Top-level projectId is what chat/auth read; also mirror into providerSpecificData.
|
|
77
|
+
const projectId = await resolveProjectIdForSave(tokens);
|
|
31
78
|
const providerSpecificData = {
|
|
32
79
|
authMethod: "oauth",
|
|
33
|
-
projectId
|
|
80
|
+
projectId,
|
|
34
81
|
loginEmail: email,
|
|
35
82
|
automation: "gsuite-bulk",
|
|
36
83
|
};
|
|
@@ -42,6 +89,7 @@ async function defaultSaveAntigravityConnection({ tokens, email }) {
|
|
|
42
89
|
refreshToken: tokens.refreshToken || "",
|
|
43
90
|
email,
|
|
44
91
|
displayName: tokens.displayName || email.split("@")[0],
|
|
92
|
+
projectId,
|
|
45
93
|
providerSpecificData,
|
|
46
94
|
expiresAt: tokens.expiresIn
|
|
47
95
|
? new Date(Date.now() + tokens.expiresIn * 1000).toISOString()
|
package/src/sse/handlers/chat.js
CHANGED
|
@@ -202,13 +202,48 @@ async function handleSingleModelChat(body, modelStr, clientRawRequest = null, re
|
|
|
202
202
|
|
|
203
203
|
const refreshedCredentials = await checkAndRefreshToken(provider, credentials);
|
|
204
204
|
|
|
205
|
-
// Ensure
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
205
|
+
// Ensure Cloud Code project ID is available (P0 fix: cold miss).
|
|
206
|
+
// Gmail free-tier: loadCodeAssist/onboard returns a managed project.
|
|
207
|
+
// GSuite/DASHER: free-tier blocked, but chat still works with an existing
|
|
208
|
+
// managed project string (peer free-tier project or previously stored id).
|
|
209
|
+
// Brand-new random project names usually 403 — avoid inventing when we can reuse.
|
|
210
|
+
if (provider === "antigravity" || provider === "gemini-cli") {
|
|
211
|
+
const preferredProjectId =
|
|
212
|
+
refreshedCredentials.projectId ||
|
|
213
|
+
credentials.projectId ||
|
|
214
|
+
credentials.providerSpecificData?.projectId ||
|
|
215
|
+
null;
|
|
216
|
+
if (preferredProjectId) {
|
|
217
|
+
refreshedCredentials.projectId = preferredProjectId;
|
|
218
|
+
}
|
|
219
|
+
if (!refreshedCredentials.projectId) {
|
|
220
|
+
let pid = await getProjectIdForConnection(
|
|
221
|
+
credentials.connectionId,
|
|
222
|
+
refreshedCredentials.accessToken,
|
|
223
|
+
{ preferredProjectId },
|
|
224
|
+
);
|
|
225
|
+
// Peer fallback: reuse another antigravity connection's managed project id
|
|
226
|
+
// (same behavior users saw historically — no GCP console required for GSuite).
|
|
227
|
+
if (!pid && provider === "antigravity") {
|
|
228
|
+
try {
|
|
229
|
+
const { getProviderConnections } = await import("@/models/index.js");
|
|
230
|
+
const peers = await getProviderConnections({ provider: "antigravity", isActive: true });
|
|
231
|
+
for (const peer of peers || []) {
|
|
232
|
+
if (peer.id === credentials.connectionId) continue;
|
|
233
|
+
const peerPid = peer.projectId || peer.providerSpecificData?.projectId;
|
|
234
|
+
if (peerPid) {
|
|
235
|
+
pid = peerPid;
|
|
236
|
+
break;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
} catch {
|
|
240
|
+
// ignore peer lookup failures
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
if (pid) {
|
|
244
|
+
refreshedCredentials.projectId = pid;
|
|
245
|
+
updateProviderCredentials(credentials.connectionId, { projectId: pid }).catch(() => { });
|
|
246
|
+
}
|
|
212
247
|
}
|
|
213
248
|
}
|
|
214
249
|
|
package/src/sse/services/auth.js
CHANGED
|
@@ -248,7 +248,7 @@ export async function getProviderCredentials(provider, excludeConnectionIds = nu
|
|
|
248
248
|
expiresAt: connection.expiresAt,
|
|
249
249
|
expiresIn: connection.expiresIn,
|
|
250
250
|
lastRefreshAt: connection.lastRefreshAt,
|
|
251
|
-
projectId: connection.projectId,
|
|
251
|
+
projectId: connection.projectId || connection.providerSpecificData?.projectId || null,
|
|
252
252
|
connectionName: connection.displayName || connection.name || connection.email || connection.id,
|
|
253
253
|
copilotToken: connection.providerSpecificData?.copilotToken,
|
|
254
254
|
providerSpecificData: {
|
|
File without changes
|
|
File without changes
|