zevairouter 1.0.82 → 1.0.84
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 +13 -0
- package/cli/app/.next-cli-build/BUILD_ID +1 -1
- package/cli/app/.next-cli-build/app-path-routes-manifest.json +24 -24
- package/cli/app/.next-cli-build/build-manifest.json +2 -2
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/automation/page.js.nft.json +1 -1
- 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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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/auth/login/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/auth/logout/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/auth/oidc/callback/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/auth/oidc/start/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/auth/oidc/test/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/auth/status/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/cli-tools/claude-settings/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/cli-tools/cline-settings/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/cli-tools/codex-gateway/accounts/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/cli-tools/codex-settings/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/cli-tools/copilot-settings/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-registry/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-tools/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/cli-tools/cowork-settings/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/cli-tools/deepseek-tui-settings/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/cli-tools/droid-settings/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/cli-tools/hermes-settings/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/cli-tools/jcode-settings/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/cli-tools/kilo-settings/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/cli-tools/openclaw-settings/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/cli-tools/opencode-settings/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/combos/[id]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/combos/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/context/[id]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/context/bulk/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/context/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/dashboard/chat/completions/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/headroom/extras/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/headroom/proxy/[...path]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/headroom/restart/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/headroom/start/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/headroom/status/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/headroom/stop/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/health/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/init/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/keys/[id]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/keys/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/locale/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/mcp/[plugin]/message/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/mcp/[plugin]/sse/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/media-providers/tts/elevenlabs/voices/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/media-providers/tts/inworld/voices/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/media-providers/tts/voices/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/models/alias/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/models/availability/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/models/custom/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/models/disabled/route.js.nft.json +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/route.js.nft.json +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/models/test/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/antigravity/bulk-import/[jobId]/cancel/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/antigravity/bulk-import/[jobId]/manual/[workerId]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/antigravity/bulk-import/[jobId]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/antigravity/bulk-import/latest/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/antigravity/bulk-import/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/autoclaw/bulk-import/[jobId]/cancel/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/autoclaw/bulk-import/[jobId]/manual/[workerId]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/autoclaw/bulk-import/[jobId]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/autoclaw/bulk-import/latest/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/autoclaw/bulk-import/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/bulk-import/[jobId]/cancel/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/bulk-import/[jobId]/manual/[workerId]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/bulk-import/[jobId]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/bulk-import/latest/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/bulk-import/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/bulk-token/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/quota-cookie/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/bulk-import/[jobId]/cancel/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/bulk-import/[jobId]/manual/[workerId]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/bulk-import/[jobId]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/bulk-import/latest/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/bulk-import/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/bulk-token/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/quota-cookie/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/grok-cli/bulk-import/[jobId]/cancel/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/grok-cli/bulk-import/[jobId]/manual/[workerId]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/grok-cli/bulk-import/[jobId]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/grok-cli/bulk-import/latest/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/grok-cli/bulk-import/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/kiro/auto-import/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/kiro/bulk-import/[jobId]/cancel/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/kiro/bulk-import/[jobId]/manual/[workerId]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/kiro/bulk-import/[jobId]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/kiro/bulk-import/latest/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/kiro/bulk-import/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/kiro/social-authorize/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/qoder/bulk-import/[jobId]/cancel/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/qoder/bulk-import/[jobId]/manual/[workerId]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/qoder/bulk-import/[jobId]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/qoder/bulk-import/latest/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/qoder/bulk-import/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/pricing/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/provider-nodes/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/provider-nodes/validate/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/providers/[id]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/providers/[id]/test/route.js.nft.json +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/[id]/test-models/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/providers/bulk-delete/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/providers/client/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/providers/kilo/free-models/route.js.nft.json +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/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/providers/suggested-models/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/providers/test-batch/route.js.nft.json +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/providers/validate/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/proxy-pools/[id]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/proxy-pools/cloudflare-deploy/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/proxy-pools/deno-deploy/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/proxy-pools/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/proxy-pools/vercel-deploy/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/pxpipe/health/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/pxpipe/install/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/pxpipe/restart/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/pxpipe/start/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/pxpipe/stats/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/pxpipe/status/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/pxpipe/stop/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/settings/database/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/settings/proxy-test/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/settings/proxy-test/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/settings/require-login/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/settings/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/shutdown/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/tags/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/terminal/auth/setup/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/terminal/auth/status/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/terminal/auth/unlock/route.js.nft.json +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/route.js.nft.json +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/translator/console-logs/stream/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/translator/load/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/translator/save/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/translator/send/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/translator/translate/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/tunnel/disable/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/tunnel/enable/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/tunnel/status/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/tunnel/tailscale-check/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/tunnel/tailscale-disable/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/tunnel/tailscale-enable/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/tunnel/tailscale-install/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/usage/aggregate/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/usage/chart/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/usage/history/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/usage/providers/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/usage/request-details/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/usage/request-logs/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/usage/stats/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/usage/stream/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1/api/chat/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1/audio/voices/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1/embeddings/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1/images/generations/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1/messages/count_tokens/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1/messages/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1/models/[kind]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1/models/info/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1/models/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1/responses/compact/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1/responses/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1/search/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1/web/fetch/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1beta/models/route.js.nft.json +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/route.js.nft.json +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/shutdown/route.js.nft.json +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/api/version/update/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/callback/page.js.nft.json +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.js.nft.json +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.js.nft.json +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.js.nft.json +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/manifest.webmanifest/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/page.js.nft.json +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 +24 -24
- package/cli/app/.next-cli-build/server/chunks/1396.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/2130.js +1 -0
- package/cli/app/.next-cli-build/server/chunks/3155.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/3407.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/3487.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/4746.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/5000.js +2 -2
- package/cli/app/.next-cli-build/server/chunks/6896.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/7774.js +2 -2
- package/cli/app/.next-cli-build/server/chunks/8157.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/8371.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/8590.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/891.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-8bcbe9f21ef7a39f.js → 3702-2ae85ab0e262237e.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/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/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/cli.js +124 -1
- package/cli/package.json +1 -1
- package/package.json +1 -1
- package/src/lib/oauth/services/grokCliBulkImportManager.js +110 -59
- package/src/lib/oauth/services/grokXaiEmailAutomation.js +428 -34
- package/src/lib/oauth/services/kiroGoogleAutomation.js +518 -161
- package/src/lib/oauth/services/tempmailClient.js +146 -18
- /package/cli/app/.next-cli-build/static/{nVDxJht6esrgJRNsO9HaO → vfxzLlib7n2DZ-lkAYEUg}/_buildManifest.js +0 -0
- /package/cli/app/.next-cli-build/static/{nVDxJht6esrgJRNsO9HaO → vfxzLlib7n2DZ-lkAYEUg}/_ssgManifest.js +0 -0
|
@@ -96,14 +96,28 @@ const GOOGLE_LOGIN_BUTTON_SELECTORS = [
|
|
|
96
96
|
'a#social-google',
|
|
97
97
|
'a:has-text("Sign up with Google")',
|
|
98
98
|
'a:has-text("Log in with Google")',
|
|
99
|
+
'a:has-text("Login with Google")',
|
|
100
|
+
'a:has-text("Continue with Google")',
|
|
101
|
+
'a:has-text("Sign in with Google")',
|
|
99
102
|
'button:has-text("Sign up with Google")',
|
|
100
103
|
'button:has-text("Log in with Google")',
|
|
104
|
+
'button:has-text("Login with Google")',
|
|
105
|
+
'button:has-text("Continue with Google")',
|
|
106
|
+
'button:has-text("Sign in with Google")',
|
|
101
107
|
'button:has-text("Google")',
|
|
102
108
|
'a:has-text("Google")',
|
|
109
|
+
'div[role="button"]:has-text("Continue with Google")',
|
|
110
|
+
'div[role="button"]:has-text("Login with Google")',
|
|
103
111
|
'div[role="button"]:has-text("Google")',
|
|
112
|
+
'span:has-text("Continue with Google")',
|
|
113
|
+
'span:has-text("Login with Google")',
|
|
104
114
|
'span:has-text("Google")',
|
|
105
115
|
'[aria-label*="Google"]',
|
|
106
116
|
'[data-provider*="google" i]',
|
|
117
|
+
// xAI / Grok device + account pages
|
|
118
|
+
'button:has-text("Login with Google")',
|
|
119
|
+
'button:has-text("Continue with Google")',
|
|
120
|
+
'[data-testid*="google" i]',
|
|
107
121
|
];
|
|
108
122
|
|
|
109
123
|
const TERMS_CHECKBOX_SELECTORS = [
|
|
@@ -413,55 +427,40 @@ async function waitForFirstVisibleLocator(page, selector, { timeout = 15_000, po
|
|
|
413
427
|
async function fillInputResilient(locator, value, { timeout = 15_000 } = {}) {
|
|
414
428
|
if (!locator || value == null) return false;
|
|
415
429
|
|
|
416
|
-
//
|
|
417
|
-
//
|
|
430
|
+
// Prefer fill() first (fast). CloakBrowser already spoofs input events well
|
|
431
|
+
// enough for Google in practice; slow type is only a fallback for React
|
|
432
|
+
// controlled fields that reject programmatic fill.
|
|
418
433
|
try {
|
|
419
|
-
await locator.click({ timeout:
|
|
434
|
+
await locator.click({ timeout: 3_000 });
|
|
420
435
|
} catch {
|
|
421
436
|
/* noop */
|
|
422
437
|
}
|
|
423
438
|
try {
|
|
424
|
-
await locator.fill(
|
|
439
|
+
await locator.fill(String(value), { timeout: Math.min(timeout, 8_000) });
|
|
440
|
+
const observed = await locator.inputValue().catch(() => "");
|
|
441
|
+
if (observed === value) return true;
|
|
442
|
+
} catch {
|
|
443
|
+
/* fall through to typed input */
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
try {
|
|
447
|
+
await locator.fill("", { timeout: 2_000 });
|
|
425
448
|
} catch {
|
|
426
449
|
/* noop */
|
|
427
450
|
}
|
|
428
451
|
try {
|
|
429
|
-
|
|
430
|
-
|
|
452
|
+
// Light humanization only if fill failed — 15–35ms/key (was 40–120ms).
|
|
453
|
+
const delay = Math.floor(15 + Math.random() * 20);
|
|
454
|
+
await locator.type(String(value), { delay, timeout });
|
|
431
455
|
} catch {
|
|
432
|
-
// If type() fails, fall back to fill()
|
|
433
456
|
try {
|
|
434
|
-
await locator.fill(value, { timeout });
|
|
457
|
+
await locator.fill(String(value), { timeout });
|
|
435
458
|
} catch {
|
|
436
459
|
return false;
|
|
437
460
|
}
|
|
438
461
|
}
|
|
439
462
|
|
|
440
463
|
let observed = "";
|
|
441
|
-
try {
|
|
442
|
-
observed = await locator.inputValue();
|
|
443
|
-
} catch {
|
|
444
|
-
observed = "";
|
|
445
|
-
}
|
|
446
|
-
if (observed === value) return true;
|
|
447
|
-
|
|
448
|
-
// Final fallback for React/Vue-controlled inputs
|
|
449
|
-
try {
|
|
450
|
-
await locator.click({ timeout: 5_000 });
|
|
451
|
-
} catch {
|
|
452
|
-
/* noop */
|
|
453
|
-
}
|
|
454
|
-
try {
|
|
455
|
-
await locator.fill("");
|
|
456
|
-
} catch {
|
|
457
|
-
/* noop */
|
|
458
|
-
}
|
|
459
|
-
try {
|
|
460
|
-
await locator.type(value, { delay: 50, timeout });
|
|
461
|
-
} catch {
|
|
462
|
-
return false;
|
|
463
|
-
}
|
|
464
|
-
|
|
465
464
|
try {
|
|
466
465
|
observed = await locator.inputValue();
|
|
467
466
|
} catch {
|
|
@@ -622,9 +621,16 @@ async function waitThroughGoogleInterstitials(page, reportStep, { maxWaitMs = 20
|
|
|
622
621
|
function isProviderPage(page) {
|
|
623
622
|
try {
|
|
624
623
|
const url = new URL(page.url());
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
||
|
|
624
|
+
const host = url.hostname || "";
|
|
625
|
+
return /codebuddy\.(ai|cn)$/.test(host)
|
|
626
|
+
|| host.endsWith(".codebuddy.ai")
|
|
627
|
+
|| host.endsWith(".codebuddy.cn")
|
|
628
|
+
// xAI / Grok CLI device authorization + account host
|
|
629
|
+
|| host === "accounts.x.ai"
|
|
630
|
+
|| host === "auth.x.ai"
|
|
631
|
+
|| host.endsWith(".x.ai")
|
|
632
|
+
|| host === "grok.com"
|
|
633
|
+
|| host.endsWith(".grok.com");
|
|
628
634
|
} catch {
|
|
629
635
|
return false;
|
|
630
636
|
}
|
|
@@ -1188,6 +1194,38 @@ async function handleCodeBuddyStartedAuthorization(page, reportStep) {
|
|
|
1188
1194
|
return true;
|
|
1189
1195
|
}
|
|
1190
1196
|
|
|
1197
|
+
async function providerHasGoogleLogin(page) {
|
|
1198
|
+
try {
|
|
1199
|
+
for (const name of [/continue with google/i, /sign in with google/i, /sign up with google/i, /^google$/i]) {
|
|
1200
|
+
const btn = page.getByRole("button", { name }).first();
|
|
1201
|
+
if (await btn.isVisible({ timeout: 300 }).catch(() => false)) return true;
|
|
1202
|
+
const link = page.getByRole("link", { name }).first();
|
|
1203
|
+
if (await link.isVisible({ timeout: 200 }).catch(() => false)) return true;
|
|
1204
|
+
}
|
|
1205
|
+
} catch {
|
|
1206
|
+
/* ignore */
|
|
1207
|
+
}
|
|
1208
|
+
for (const selector of GOOGLE_LOGIN_BUTTON_SELECTORS) {
|
|
1209
|
+
try {
|
|
1210
|
+
const loc = page.locator(selector).first();
|
|
1211
|
+
if (await loc.isVisible({ timeout: 200 }).catch(() => false)) return true;
|
|
1212
|
+
} catch {
|
|
1213
|
+
/* next */
|
|
1214
|
+
}
|
|
1215
|
+
}
|
|
1216
|
+
return false;
|
|
1217
|
+
}
|
|
1218
|
+
|
|
1219
|
+
function isXaiProviderPage(page) {
|
|
1220
|
+
try {
|
|
1221
|
+
const host = new URL(page.url()).hostname || "";
|
|
1222
|
+
return host === "accounts.x.ai" || host === "auth.x.ai" || host.endsWith(".x.ai")
|
|
1223
|
+
|| host === "grok.com" || host.endsWith(".grok.com");
|
|
1224
|
+
} catch {
|
|
1225
|
+
return false;
|
|
1226
|
+
}
|
|
1227
|
+
}
|
|
1228
|
+
|
|
1191
1229
|
async function handleProviderOnboarding(page, reportStep, serviceLabel) {
|
|
1192
1230
|
if (!isProviderPage(page) || isGoogleAuthPage(page)) return false;
|
|
1193
1231
|
|
|
@@ -1208,37 +1246,53 @@ async function handleProviderOnboarding(page, reportStep, serviceLabel) {
|
|
|
1208
1246
|
return true;
|
|
1209
1247
|
}
|
|
1210
1248
|
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
await page
|
|
1215
|
-
|
|
1216
|
-
|
|
1249
|
+
// Region / workspace defaults are CodeBuddy-style — not xAI device approve.
|
|
1250
|
+
// False-positive select matches on xAI wasted the session into "Invalid action".
|
|
1251
|
+
if (!isXaiProviderPage(page)) {
|
|
1252
|
+
const selectedNativeRegion = await selectNativeRegionOption(page);
|
|
1253
|
+
if (selectedNativeRegion) {
|
|
1254
|
+
reportStep("selecting_provider_region", `Selected ${serviceLabel} region`);
|
|
1255
|
+
await page.waitForTimeout(700);
|
|
1256
|
+
return true;
|
|
1257
|
+
}
|
|
1258
|
+
|
|
1259
|
+
const openedRegionMenu = await clickFirstActionable(page, PROVIDER_REGION_TRIGGER_SELECTORS);
|
|
1260
|
+
if (openedRegionMenu) {
|
|
1261
|
+
reportStep("opening_provider_region_selector", `Opening ${serviceLabel} region selector`);
|
|
1262
|
+
await page.waitForTimeout(500);
|
|
1263
|
+
const selectedRegion = await clickFirstActionable(page, PROVIDER_REGION_OPTION_SELECTORS);
|
|
1264
|
+
if (selectedRegion) {
|
|
1265
|
+
reportStep("selecting_provider_region", `Selected ${serviceLabel} region`);
|
|
1266
|
+
await page.waitForTimeout(700);
|
|
1267
|
+
}
|
|
1268
|
+
return true;
|
|
1269
|
+
}
|
|
1217
1270
|
|
|
1218
|
-
const openedRegionMenu = await clickFirstActionable(page, PROVIDER_REGION_TRIGGER_SELECTORS);
|
|
1219
|
-
if (openedRegionMenu) {
|
|
1220
|
-
reportStep("opening_provider_region_selector", `Opening ${serviceLabel} region selector`);
|
|
1221
|
-
await page.waitForTimeout(500);
|
|
1222
1271
|
const selectedRegion = await clickFirstActionable(page, PROVIDER_REGION_OPTION_SELECTORS);
|
|
1223
1272
|
if (selectedRegion) {
|
|
1224
1273
|
reportStep("selecting_provider_region", `Selected ${serviceLabel} region`);
|
|
1225
1274
|
await page.waitForTimeout(700);
|
|
1275
|
+
return true;
|
|
1276
|
+
}
|
|
1277
|
+
|
|
1278
|
+
const filledDefaults = await fillProviderOnboardingDefaults(page);
|
|
1279
|
+
if (filledDefaults) {
|
|
1280
|
+
reportStep("filling_provider_onboarding", `Filled ${serviceLabel} onboarding defaults`);
|
|
1281
|
+
await page.waitForTimeout(500);
|
|
1282
|
+
return true;
|
|
1226
1283
|
}
|
|
1227
|
-
return true;
|
|
1228
1284
|
}
|
|
1229
1285
|
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
|
-
return
|
|
1286
|
+
// xAI device pages: never click generic Continue/Next/Confirm. Those submit
|
|
1287
|
+
// the device form without a session → "Invalid action" and burn 1–3 minutes.
|
|
1288
|
+
// Only Google SSO (login gate) + Allow/Authorize (clickXaiDeviceAuthorize).
|
|
1289
|
+
if (isXaiProviderPage(page)) {
|
|
1290
|
+
return false;
|
|
1235
1291
|
}
|
|
1236
1292
|
|
|
1237
|
-
|
|
1238
|
-
if (
|
|
1239
|
-
|
|
1240
|
-
await page.waitForTimeout(500);
|
|
1241
|
-
return true;
|
|
1293
|
+
// If Google SSO is still offered, do not mash generic Continue.
|
|
1294
|
+
if (await providerHasGoogleLogin(page)) {
|
|
1295
|
+
return false;
|
|
1242
1296
|
}
|
|
1243
1297
|
|
|
1244
1298
|
const clickedAction = await clickFirstActionable(page, PROVIDER_ONBOARDING_ACTION_SELECTORS);
|
|
@@ -1251,36 +1305,217 @@ async function handleProviderOnboarding(page, reportStep, serviceLabel) {
|
|
|
1251
1305
|
return false;
|
|
1252
1306
|
}
|
|
1253
1307
|
|
|
1254
|
-
|
|
1308
|
+
/**
|
|
1309
|
+
* xAI device step 1: "Enter the code shown in your terminal" → Continue.
|
|
1310
|
+
* Only after this do we land on sign-in with "Login with Google".
|
|
1311
|
+
* Never run this after Google login — that re-submits Continue into Invalid action.
|
|
1312
|
+
*/
|
|
1313
|
+
async function handleXaiDeviceCodeConfirm(page, reportStep, { alreadyAuthed = false } = {}) {
|
|
1314
|
+
if (!isXaiProviderPage(page)) return false;
|
|
1315
|
+
if (alreadyAuthed) return false;
|
|
1316
|
+
// Already on Google SSO wall — past this step.
|
|
1317
|
+
if (await providerHasGoogleLogin(page)) return false;
|
|
1318
|
+
|
|
1319
|
+
const text = await readPageText(page).catch(() => "");
|
|
1320
|
+
// Logged-in device/approve screens — do not re-click Continue.
|
|
1321
|
+
if (/sign out|log out|device authorized|you can close|invalid action/i.test(text)) {
|
|
1322
|
+
return false;
|
|
1323
|
+
}
|
|
1324
|
+
|
|
1325
|
+
const isCodeConfirm =
|
|
1326
|
+
/enter the code shown in your terminal/i.test(text)
|
|
1327
|
+
|| /only enter this code if you just initiated/i.test(text)
|
|
1328
|
+
|| (/sign in to grok/i.test(text) && /continue/i.test(text) && !/login with/i.test(text));
|
|
1329
|
+
if (!isCodeConfirm) return false;
|
|
1330
|
+
|
|
1331
|
+
try {
|
|
1332
|
+
const btn = page.getByRole("button", { name: /^Continue$/i }).first();
|
|
1333
|
+
if (await btn.isVisible({ timeout: 600 }).catch(() => false)) {
|
|
1334
|
+
await btn.click({ timeout: 5_000 });
|
|
1335
|
+
reportStep?.("confirming_device_code", "Confirmed device user code on xAI");
|
|
1336
|
+
await page.waitForTimeout(1_200);
|
|
1337
|
+
return true;
|
|
1338
|
+
}
|
|
1339
|
+
} catch {
|
|
1340
|
+
/* fall through */
|
|
1341
|
+
}
|
|
1342
|
+
|
|
1343
|
+
const clicked = await clickFirstActionable(page, [
|
|
1344
|
+
'button[type="submit"]:has-text("Continue")',
|
|
1345
|
+
'button:has-text("Continue")',
|
|
1346
|
+
]);
|
|
1347
|
+
if (clicked) {
|
|
1348
|
+
reportStep?.("confirming_device_code", "Confirmed device user code on xAI");
|
|
1349
|
+
await page.waitForTimeout(1_200);
|
|
1350
|
+
return true;
|
|
1351
|
+
}
|
|
1352
|
+
return false;
|
|
1353
|
+
}
|
|
1354
|
+
|
|
1355
|
+
async function clickGoogleLoginRole(page) {
|
|
1356
|
+
// Role-based matches are more reliable on SPA auth shells (xAI, etc.)
|
|
1357
|
+
// than CSS :has-text alone — especially when the label is nested.
|
|
1358
|
+
const roleNames = [
|
|
1359
|
+
/login with google/i,
|
|
1360
|
+
/log in with google/i,
|
|
1361
|
+
/continue with google/i,
|
|
1362
|
+
/sign up with google/i,
|
|
1363
|
+
/sign in with google/i,
|
|
1364
|
+
/^google$/i,
|
|
1365
|
+
];
|
|
1366
|
+
for (const name of roleNames) {
|
|
1367
|
+
try {
|
|
1368
|
+
const btn = page.getByRole("button", { name }).first();
|
|
1369
|
+
if (await btn.isVisible({ timeout: 250 }).catch(() => false)) {
|
|
1370
|
+
const enabled = await btn.isEnabled().catch(() => true);
|
|
1371
|
+
if (!enabled) continue;
|
|
1372
|
+
await btn.click({ timeout: 5_000 });
|
|
1373
|
+
return true;
|
|
1374
|
+
}
|
|
1375
|
+
} catch {
|
|
1376
|
+
/* next */
|
|
1377
|
+
}
|
|
1378
|
+
try {
|
|
1379
|
+
const link = page.getByRole("link", { name }).first();
|
|
1380
|
+
if (await link.isVisible({ timeout: 200 }).catch(() => false)) {
|
|
1381
|
+
await link.click({ timeout: 5_000 });
|
|
1382
|
+
return true;
|
|
1383
|
+
}
|
|
1384
|
+
} catch {
|
|
1385
|
+
/* next */
|
|
1386
|
+
}
|
|
1387
|
+
}
|
|
1388
|
+
return false;
|
|
1389
|
+
}
|
|
1390
|
+
|
|
1391
|
+
async function ensureProviderTermsChecked(page, reportStep) {
|
|
1392
|
+
// Returns true only when we newly checked a box (not when already checked).
|
|
1393
|
+
for (const scope of getInteractionScopes(page)) {
|
|
1394
|
+
for (const selector of TERMS_CHECKBOX_SELECTORS) {
|
|
1395
|
+
try {
|
|
1396
|
+
const locator = scope.locator(selector).first();
|
|
1397
|
+
const count = await locator.count().catch(() => 0);
|
|
1398
|
+
if (!count) continue;
|
|
1399
|
+
const visible = await locator.isVisible().catch(() => false);
|
|
1400
|
+
if (!visible) continue;
|
|
1401
|
+
const already = await locator.isChecked().catch(() => false);
|
|
1402
|
+
if (already) return false;
|
|
1403
|
+
const did = await locator.check({ force: true, timeout: 3_000 }).then(() => true).catch(() => false)
|
|
1404
|
+
|| await locator.click({ force: true, timeout: 3_000 }).then(() => true).catch(() => false);
|
|
1405
|
+
if (did) {
|
|
1406
|
+
reportStep?.("accepting_provider_terms", "Accepted provider terms for Google login");
|
|
1407
|
+
// xAI enables Google SSO only after the checkbox settles.
|
|
1408
|
+
await page.waitForTimeout(500);
|
|
1409
|
+
return true;
|
|
1410
|
+
}
|
|
1411
|
+
} catch {
|
|
1412
|
+
/* next */
|
|
1413
|
+
}
|
|
1414
|
+
}
|
|
1415
|
+
}
|
|
1416
|
+
return false;
|
|
1417
|
+
}
|
|
1418
|
+
|
|
1419
|
+
async function handleProviderLoginGate(page, reportStep, { allowGoogleClick = true } = {}) {
|
|
1255
1420
|
if (isGoogleAuthPage(page)) return false;
|
|
1256
1421
|
|
|
1257
1422
|
const confirmedExistingDialog = await clickFirstActionable(page, PRIVACY_CONFIRM_BUTTON_SELECTORS);
|
|
1258
1423
|
if (confirmedExistingDialog) {
|
|
1259
1424
|
reportStep("accepting_provider_privacy_dialog", "Confirmed provider privacy agreement dialog");
|
|
1260
|
-
await page.waitForTimeout(
|
|
1425
|
+
await page.waitForTimeout(500);
|
|
1261
1426
|
return true;
|
|
1262
1427
|
}
|
|
1263
1428
|
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1429
|
+
// Always try terms first — but do NOT treat "already checked" as progress.
|
|
1430
|
+
// Returning true every loop on an already-checked box blocked Google re-click
|
|
1431
|
+
// for ~30–60s after a failed first SSO attempt.
|
|
1432
|
+
const newlyCheckedTerms = await ensureProviderTermsChecked(page, reportStep);
|
|
1433
|
+
|
|
1434
|
+
if (!allowGoogleClick) {
|
|
1435
|
+
return newlyCheckedTerms;
|
|
1268
1436
|
}
|
|
1269
1437
|
|
|
1270
|
-
|
|
1438
|
+
// Prefer explicit Google SSO over generic Continue (device code pages
|
|
1439
|
+
// often have both — clicking Continue without a session yields invalid_code).
|
|
1440
|
+
const clickedGoogleRole = await clickGoogleLoginRole(page);
|
|
1441
|
+
const clickedGoogle = clickedGoogleRole || await clickFirstActionable(page, GOOGLE_LOGIN_BUTTON_SELECTORS);
|
|
1271
1442
|
if (clickedGoogle) {
|
|
1272
1443
|
reportStep("selecting_google_login", "Selecting Google login");
|
|
1273
|
-
await page.waitForTimeout(
|
|
1444
|
+
await page.waitForTimeout(500);
|
|
1274
1445
|
|
|
1275
1446
|
const confirmedDialog = await clickFirstActionable(page, PRIVACY_CONFIRM_BUTTON_SELECTORS);
|
|
1276
1447
|
if (confirmedDialog) {
|
|
1277
1448
|
reportStep("accepting_provider_privacy_dialog", "Confirmed provider privacy agreement dialog");
|
|
1278
|
-
await page.waitForTimeout(
|
|
1449
|
+
await page.waitForTimeout(500);
|
|
1450
|
+
}
|
|
1451
|
+
|
|
1452
|
+
// Wait for OAuth redirect to Google (or popup) — short timeout; loop retries.
|
|
1453
|
+
try {
|
|
1454
|
+
await page.waitForURL(
|
|
1455
|
+
(url) => {
|
|
1456
|
+
try {
|
|
1457
|
+
const host = new URL(url).hostname;
|
|
1458
|
+
return host === "accounts.google.com"
|
|
1459
|
+
|| host.endsWith(".accounts.google.com")
|
|
1460
|
+
|| /^accounts\.google\./i.test(host);
|
|
1461
|
+
} catch {
|
|
1462
|
+
return false;
|
|
1463
|
+
}
|
|
1464
|
+
},
|
|
1465
|
+
{ timeout: 8_000 },
|
|
1466
|
+
);
|
|
1467
|
+
reportStep("google_login_page", "Reached Google sign-in after provider SSO");
|
|
1468
|
+
} catch {
|
|
1469
|
+
// Popup-based Google SSO: try the newest page
|
|
1470
|
+
try {
|
|
1471
|
+
const ctx = page.context?.();
|
|
1472
|
+
const pages = ctx?.pages?.() || [];
|
|
1473
|
+
for (let i = pages.length - 1; i >= 0; i -= 1) {
|
|
1474
|
+
const p = pages[i];
|
|
1475
|
+
const u = p.url?.() || "";
|
|
1476
|
+
if (/accounts\.google\.com/i.test(u)) {
|
|
1477
|
+
reportStep("google_login_popup", "Google sign-in opened in a popup");
|
|
1478
|
+
break;
|
|
1479
|
+
}
|
|
1480
|
+
}
|
|
1481
|
+
} catch {
|
|
1482
|
+
/* ignore */
|
|
1483
|
+
}
|
|
1279
1484
|
}
|
|
1280
1485
|
|
|
1281
1486
|
return true;
|
|
1282
1487
|
}
|
|
1283
1488
|
|
|
1489
|
+
return newlyCheckedTerms;
|
|
1490
|
+
}
|
|
1491
|
+
|
|
1492
|
+
/** Fast path for xAI device approve after Google session exists. */
|
|
1493
|
+
async function clickXaiDeviceAuthorize(page, reportStep) {
|
|
1494
|
+
if (!isXaiProviderPage(page)) return false;
|
|
1495
|
+
// Never approve while Google SSO is still on the page — that was thrashing
|
|
1496
|
+
// Continue / Allow before login and landing on "Invalid action".
|
|
1497
|
+
if (await providerHasGoogleLogin(page)) return false;
|
|
1498
|
+
|
|
1499
|
+
// Prefer exact authorize verbs — avoid bare "Continue" (too many false hits).
|
|
1500
|
+
const roles = [
|
|
1501
|
+
/^(Allow|Authorize|Approve|Confirm)$/i,
|
|
1502
|
+
/^(Allow|Authorize|Approve)\b/i,
|
|
1503
|
+
];
|
|
1504
|
+
for (const re of roles) {
|
|
1505
|
+
try {
|
|
1506
|
+
const btn = page.getByRole("button", { name: re }).first();
|
|
1507
|
+
if (await btn.isVisible({ timeout: 250 }).catch(() => false)) {
|
|
1508
|
+
const label = (await btn.innerText().catch(() => "")) || "";
|
|
1509
|
+
if (/google/i.test(label)) continue;
|
|
1510
|
+
await btn.click({ timeout: 3_000 });
|
|
1511
|
+
reportStep?.("approving_consent", "Approving xAI device authorization");
|
|
1512
|
+
await page.waitForTimeout(600);
|
|
1513
|
+
return true;
|
|
1514
|
+
}
|
|
1515
|
+
} catch {
|
|
1516
|
+
/* next */
|
|
1517
|
+
}
|
|
1518
|
+
}
|
|
1284
1519
|
return false;
|
|
1285
1520
|
}
|
|
1286
1521
|
|
|
@@ -1578,39 +1813,78 @@ export async function runGoogleAccountAutomation({
|
|
|
1578
1813
|
// (pwd page stays mounted ~1–3s after Next; re-fill aborts the OAuth chain).
|
|
1579
1814
|
let passwordSubmittedAt = 0;
|
|
1580
1815
|
let emailSubmittedAt = 0;
|
|
1581
|
-
|
|
1582
|
-
|
|
1816
|
+
let googleLoginSelectedAt = 0;
|
|
1817
|
+
let seenGoogleAuth = false;
|
|
1818
|
+
let deviceApproveAt = 0;
|
|
1819
|
+
let deviceInvalidReopenAt = 0;
|
|
1820
|
+
let deviceInvalidReopenCount = 0;
|
|
1821
|
+
const PASSWORD_RESUBMIT_COOLDOWN_MS = 18_000;
|
|
1822
|
+
const EMAIL_RESUBMIT_COOLDOWN_MS = 8_000;
|
|
1823
|
+
// Short cooldown: long values blocked re-click after a no-op first SSO attempt.
|
|
1824
|
+
const GOOGLE_SSO_COOLDOWN_MS = 8_000;
|
|
1825
|
+
// Don't hammer Allow — xAI returns rate_limited after rapid device posts.
|
|
1826
|
+
const DEVICE_APPROVE_COOLDOWN_MS = 8_000;
|
|
1827
|
+
const DEVICE_INVALID_REOPEN_COOLDOWN_MS = 8_000;
|
|
1828
|
+
const DEVICE_INVALID_REOPEN_MAX = 3;
|
|
1829
|
+
const isGrokFlow = /grok/i.test(String(serviceLabel || ""));
|
|
1830
|
+
// Grok does not need the long Kiro SetSID / kiro:// interstitial window.
|
|
1831
|
+
const postPasswordInterstitialMs = isGrokFlow ? 10_000 : 25_000;
|
|
1832
|
+
const loopTickMs = isGrokFlow ? 400 : 800;
|
|
1583
1833
|
|
|
1584
1834
|
reportStep(openingStep, openingMessage);
|
|
1585
1835
|
await page.goto(authUrl, { waitUntil: "domcontentloaded", timeout: 60_000 });
|
|
1586
|
-
await page.waitForTimeout(2_000);
|
|
1587
|
-
await waitThroughGoogleInterstitials(page, reportStep, interstitialOpts(12_000));
|
|
1588
|
-
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
|
|
1593
|
-
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
if (
|
|
1597
|
-
|
|
1598
|
-
}
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
|
|
1836
|
+
await page.waitForTimeout(isGrokFlow ? 700 : 2_000);
|
|
1837
|
+
await waitThroughGoogleInterstitials(page, reportStep, interstitialOpts(isGrokFlow ? 4_000 : 12_000));
|
|
1838
|
+
|
|
1839
|
+
// Provider shells (xAI device, CodeBuddy, …) must pick Google SSO first.
|
|
1840
|
+
// Never type credentials into provider user_code / email fields — that
|
|
1841
|
+
// produced email_fill_failed + invalid_code on accounts.x.ai/oauth2/device.
|
|
1842
|
+
// xAI: confirm device user_code first, then Google SSO.
|
|
1843
|
+
// Retry briefly while SPA mounts Login with Google.
|
|
1844
|
+
for (let attempt = 0; attempt < (isGrokFlow ? 8 : 2); attempt += 1) {
|
|
1845
|
+
if (isGoogleAuthPage(page)) break;
|
|
1846
|
+
if (await handleXaiDeviceCodeConfirm(page, reportStep)) {
|
|
1847
|
+
continue;
|
|
1848
|
+
}
|
|
1849
|
+
if (await handleProviderLoginGate(page, reportStep)) {
|
|
1850
|
+
googleLoginSelectedAt = Date.now();
|
|
1851
|
+
if (isGoogleAuthPage(page)) break;
|
|
1852
|
+
}
|
|
1853
|
+
await page.waitForTimeout(600);
|
|
1854
|
+
}
|
|
1855
|
+
await waitThroughGoogleInterstitials(page, reportStep, interstitialOpts(isGrokFlow ? 4_000 : 8_000));
|
|
1856
|
+
|
|
1857
|
+
// Only fill Google email once we are actually on accounts.google.com.
|
|
1858
|
+
if (isGoogleAuthPage(page)) {
|
|
1859
|
+
seenGoogleAuth = true;
|
|
1860
|
+
const emailInput = await waitForFirstVisibleLocator(page, EMAIL_INPUT_SELECTOR, { timeout: 12_000 });
|
|
1861
|
+
if (emailInput) {
|
|
1862
|
+
reportStep("entering_email", "Entering Google email");
|
|
1863
|
+
const filled = await fillInputResilient(emailInput, email);
|
|
1864
|
+
if (!filled) {
|
|
1865
|
+
reportStep("email_fill_failed", "Could not fill the Google email field; will retry in the polling loop");
|
|
1866
|
+
} else {
|
|
1867
|
+
reportStep("submitting_email", "Submitting email");
|
|
1868
|
+
await clickFirstVisible(page, NEXT_BUTTON_SELECTORS);
|
|
1869
|
+
emailSubmittedAt = Date.now();
|
|
1870
|
+
// Wait for the page to transition away from the email step so the
|
|
1871
|
+
// polling loop doesn't immediately re-detect the disappearing email
|
|
1872
|
+
// field and type the email value into the password input.
|
|
1873
|
+
await page.waitForTimeout(isGrokFlow ? 700 : 1_500);
|
|
1874
|
+
await waitThroughGoogleInterstitials(page, reportStep, interstitialOpts(isGrokFlow ? 5_000 : 12_000));
|
|
1875
|
+
}
|
|
1607
1876
|
}
|
|
1877
|
+
} else if (isProviderPage(page)) {
|
|
1878
|
+
reportStep(
|
|
1879
|
+
"waiting_for_google_sso",
|
|
1880
|
+
`Provider page still open (${(page.url?.() || "").slice(0, 80)}) — will keep selecting Google login`,
|
|
1881
|
+
);
|
|
1608
1882
|
}
|
|
1609
1883
|
|
|
1610
1884
|
while (Date.now() - startTime < shortTimeoutMs) {
|
|
1611
1885
|
const successResult = await Promise.race([
|
|
1612
1886
|
successPromise.then((result) => ({ kind: "success", result })).catch((error) => ({ kind: "success_error", error })),
|
|
1613
|
-
new Promise((resolve) => setTimeout(() => resolve(null),
|
|
1887
|
+
new Promise((resolve) => setTimeout(() => resolve(null), loopTickMs)),
|
|
1614
1888
|
]);
|
|
1615
1889
|
|
|
1616
1890
|
if (successResult?.kind === "success") {
|
|
@@ -1630,14 +1904,22 @@ export async function runGoogleAccountAutomation({
|
|
|
1630
1904
|
}
|
|
1631
1905
|
|
|
1632
1906
|
// Unblock SetSID / empty Google interstitials before other handlers
|
|
1633
|
-
const waited = await waitThroughGoogleInterstitials(
|
|
1907
|
+
const waited = await waitThroughGoogleInterstitials(
|
|
1908
|
+
page,
|
|
1909
|
+
reportStep,
|
|
1910
|
+
interstitialOpts(isGrokFlow ? 4_000 : 8_000),
|
|
1911
|
+
);
|
|
1634
1912
|
if (waited) {
|
|
1635
1913
|
continue;
|
|
1636
1914
|
}
|
|
1637
1915
|
|
|
1638
1916
|
const handledGoogleConsent = await handleGoogleConsent(page, reportStep);
|
|
1639
1917
|
if (handledGoogleConsent) {
|
|
1640
|
-
await waitThroughGoogleInterstitials(
|
|
1918
|
+
await waitThroughGoogleInterstitials(
|
|
1919
|
+
page,
|
|
1920
|
+
reportStep,
|
|
1921
|
+
interstitialOpts(isGrokFlow ? 5_000 : 12_000),
|
|
1922
|
+
);
|
|
1641
1923
|
continue;
|
|
1642
1924
|
}
|
|
1643
1925
|
|
|
@@ -1696,92 +1978,167 @@ export async function runGoogleAccountAutomation({
|
|
|
1696
1978
|
continue;
|
|
1697
1979
|
}
|
|
1698
1980
|
|
|
1699
|
-
|
|
1700
|
-
if (
|
|
1701
|
-
|
|
1981
|
+
// xAI rate-limits device authorize after rapid retries — fail fast.
|
|
1982
|
+
if (
|
|
1983
|
+
isProviderPage(page)
|
|
1984
|
+
&& (/rate[_ ]?limit/i.test(text) || /error=rate_limited/i.test(page.url?.() || ""))
|
|
1985
|
+
) {
|
|
1986
|
+
reportStep("device_rate_limited", "xAI device authorization rate-limited");
|
|
1987
|
+
return {
|
|
1988
|
+
status: "failed",
|
|
1989
|
+
error: "xAI rate-limited device authorization. Wait a few minutes and retry (too many rapid device-code attempts).",
|
|
1990
|
+
};
|
|
1702
1991
|
}
|
|
1703
1992
|
|
|
1704
|
-
//
|
|
1705
|
-
//
|
|
1706
|
-
//
|
|
1707
|
-
|
|
1708
|
-
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
|
|
1713
|
-
|
|
1714
|
-
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
|
|
1724
|
-
const filled = await fillInputResilient(passwordInput, password);
|
|
1725
|
-
if (filled) {
|
|
1726
|
-
reportStep("submitting_password", "Submitting password");
|
|
1727
|
-
await clickFirstVisible(page, NEXT_BUTTON_SELECTORS);
|
|
1728
|
-
passwordSubmittedAt = Date.now();
|
|
1729
|
-
// Give Google time to leave the password challenge before the next
|
|
1730
|
-
// loop iteration can re-detect the still-mounted password field.
|
|
1731
|
-
await Promise.race([
|
|
1732
|
-
page.waitForNavigation({ waitUntil: "domcontentloaded", timeout: 8_000 }).catch(() => null),
|
|
1733
|
-
page.waitForTimeout(2_500),
|
|
1734
|
-
]);
|
|
1735
|
-
// Password submit often lands on empty SetSID while network completes
|
|
1736
|
-
// consent→idpresponse→kiro://. Callback monitor (CDP) settles successPromise.
|
|
1737
|
-
await waitThroughGoogleInterstitials(page, reportStep, interstitialOpts(25_000));
|
|
1738
|
-
} else {
|
|
1739
|
-
reportStep("password_fill_failed", "Could not fill the Google password field; retrying loop");
|
|
1740
|
-
await page.waitForTimeout(700);
|
|
1741
|
-
}
|
|
1993
|
+
// xAI often lands on /oauth2/device/approve with "Invalid action" after
|
|
1994
|
+
// Google consent when the approve form was double-submitted. Re-open the
|
|
1995
|
+
// original device URL (with user_code) a few times — not every loop tick.
|
|
1996
|
+
if (
|
|
1997
|
+
isProviderPage(page)
|
|
1998
|
+
&& /invalid action|invalid[_ ]?code|code (has )?expired|expired code/i.test(text)
|
|
1999
|
+
&& authUrl
|
|
2000
|
+
&& seenGoogleAuth
|
|
2001
|
+
&& deviceInvalidReopenCount < DEVICE_INVALID_REOPEN_MAX
|
|
2002
|
+
&& Date.now() - deviceInvalidReopenAt > DEVICE_INVALID_REOPEN_COOLDOWN_MS
|
|
2003
|
+
) {
|
|
2004
|
+
deviceInvalidReopenCount += 1;
|
|
2005
|
+
deviceInvalidReopenAt = Date.now();
|
|
2006
|
+
deviceApproveAt = 0;
|
|
2007
|
+
reportStep(
|
|
2008
|
+
"device_invalid_reopen",
|
|
2009
|
+
`Device page error — reopening auth URL (${deviceInvalidReopenCount}/${DEVICE_INVALID_REOPEN_MAX})`,
|
|
2010
|
+
);
|
|
2011
|
+
await page.goto(authUrl, { waitUntil: "domcontentloaded", timeout: 60_000 }).catch(() => null);
|
|
2012
|
+
await page.waitForTimeout(1_800);
|
|
1742
2013
|
continue;
|
|
1743
2014
|
}
|
|
1744
2015
|
|
|
1745
|
-
const
|
|
1746
|
-
if (nextEmailInput) {
|
|
1747
|
-
const sinceEmail = Date.now() - emailSubmittedAt;
|
|
1748
|
-
if (emailSubmittedAt && sinceEmail < EMAIL_RESUBMIT_COOLDOWN_MS) {
|
|
1749
|
-
reportStep(
|
|
1750
|
-
"waiting_after_email",
|
|
1751
|
-
`Email already submitted ${Math.round(sinceEmail / 1000)}s ago — waiting for password/next screen`,
|
|
1752
|
-
);
|
|
1753
|
-
await page.waitForTimeout(800);
|
|
1754
|
-
continue;
|
|
1755
|
-
}
|
|
2016
|
+
const googleAuthed = Boolean(seenGoogleAuth && passwordSubmittedAt);
|
|
1756
2017
|
|
|
1757
|
-
|
|
1758
|
-
|
|
1759
|
-
if (filled) {
|
|
1760
|
-
reportStep("submitting_email", "Submitting email");
|
|
1761
|
-
await clickFirstVisible(page, NEXT_BUTTON_SELECTORS);
|
|
1762
|
-
emailSubmittedAt = Date.now();
|
|
1763
|
-
await page.waitForTimeout(1_500);
|
|
1764
|
-
} else {
|
|
1765
|
-
reportStep("email_fill_failed", "Could not fill the Google email field; retrying loop");
|
|
1766
|
-
}
|
|
1767
|
-
await page.waitForTimeout(700);
|
|
2018
|
+
// xAI device user_code confirm (Continue) — only before Google login.
|
|
2019
|
+
if (await handleXaiDeviceCodeConfirm(page, reportStep, { alreadyAuthed: googleAuthed })) {
|
|
1768
2020
|
continue;
|
|
1769
2021
|
}
|
|
1770
2022
|
|
|
1771
|
-
|
|
2023
|
+
// Provider Google SSO BEFORE generic onboarding Continues.
|
|
2024
|
+
// Cooldown: re-clicking Google mid-redirect restarts OAuth and wastes time.
|
|
2025
|
+
const allowGoogleClick =
|
|
2026
|
+
!googleAuthed
|
|
2027
|
+
&& (!googleLoginSelectedAt || Date.now() - googleLoginSelectedAt > GOOGLE_SSO_COOLDOWN_MS);
|
|
2028
|
+
const handledProviderGate = await handleProviderLoginGate(page, reportStep, { allowGoogleClick });
|
|
1772
2029
|
if (handledProviderGate) {
|
|
2030
|
+
if (allowGoogleClick) googleLoginSelectedAt = Date.now();
|
|
1773
2031
|
continue;
|
|
1774
2032
|
}
|
|
1775
2033
|
|
|
1776
|
-
|
|
1777
|
-
if (
|
|
1778
|
-
|
|
1779
|
-
|
|
2034
|
+
// xAI device approve ONLY after Google password submitted.
|
|
2035
|
+
if (
|
|
2036
|
+
googleAuthed
|
|
2037
|
+
&& Date.now() - deviceApproveAt > DEVICE_APPROVE_COOLDOWN_MS
|
|
2038
|
+
&& await clickXaiDeviceAuthorize(page, reportStep)
|
|
2039
|
+
) {
|
|
2040
|
+
deviceApproveAt = Date.now();
|
|
2041
|
+
continue;
|
|
2042
|
+
}
|
|
2043
|
+
|
|
2044
|
+
const handledProviderOnboarding = await handleProviderOnboarding(page, reportStep, serviceLabel);
|
|
2045
|
+
if (handledProviderOnboarding) {
|
|
1780
2046
|
continue;
|
|
1781
2047
|
}
|
|
1782
2048
|
|
|
2049
|
+
// Credentials only on accounts.google.com — never into provider shells.
|
|
2050
|
+
if (isGoogleAuthPage(page)) {
|
|
2051
|
+
seenGoogleAuth = true;
|
|
2052
|
+
// Check password BEFORE email — after submitting the email the password
|
|
2053
|
+
// page loads and during the transition the old email input can briefly
|
|
2054
|
+
// remain visible; if we checked email first we'd re-type the email
|
|
2055
|
+
// address into whatever field is focused (often the password input).
|
|
2056
|
+
const passwordInput = await getFirstVisibleLocator(page, PASSWORD_INPUT_SELECTOR);
|
|
2057
|
+
if (passwordInput) {
|
|
2058
|
+
const sincePw = Date.now() - passwordSubmittedAt;
|
|
2059
|
+
if (passwordSubmittedAt && sincePw < PASSWORD_RESUBMIT_COOLDOWN_MS) {
|
|
2060
|
+
// Still on (or animating off) the password form after a recent submit —
|
|
2061
|
+
// do NOT re-fill; wait for SetSID/consent/callback instead.
|
|
2062
|
+
reportStep(
|
|
2063
|
+
"waiting_after_password",
|
|
2064
|
+
`Password already submitted ${Math.round(sincePw / 1000)}s ago — waiting for Google redirect`,
|
|
2065
|
+
);
|
|
2066
|
+
await waitThroughGoogleInterstitials(page, reportStep, interstitialOpts(8_000));
|
|
2067
|
+
await page.waitForTimeout(500);
|
|
2068
|
+
continue;
|
|
2069
|
+
}
|
|
2070
|
+
|
|
2071
|
+
reportStep("entering_password", "Entering Google password");
|
|
2072
|
+
const filled = await fillInputResilient(passwordInput, password);
|
|
2073
|
+
if (filled) {
|
|
2074
|
+
reportStep("submitting_password", "Submitting password");
|
|
2075
|
+
await clickFirstVisible(page, NEXT_BUTTON_SELECTORS);
|
|
2076
|
+
passwordSubmittedAt = Date.now();
|
|
2077
|
+
// Give Google time to leave the password challenge before the next
|
|
2078
|
+
// loop iteration can re-detect the still-mounted password field.
|
|
2079
|
+
await Promise.race([
|
|
2080
|
+
page.waitForNavigation({ waitUntil: "domcontentloaded", timeout: 8_000 }).catch(() => null),
|
|
2081
|
+
page.waitForTimeout(2_500),
|
|
2082
|
+
]);
|
|
2083
|
+
// Password submit often lands on empty SetSID while network completes
|
|
2084
|
+
// consent→idpresponse→kiro://. Callback monitor (CDP) settles successPromise.
|
|
2085
|
+
// Grok device poll settles faster — shorter interstitial wait.
|
|
2086
|
+
await waitThroughGoogleInterstitials(
|
|
2087
|
+
page,
|
|
2088
|
+
reportStep,
|
|
2089
|
+
interstitialOpts(postPasswordInterstitialMs),
|
|
2090
|
+
);
|
|
2091
|
+
} else {
|
|
2092
|
+
reportStep("password_fill_failed", "Could not fill the Google password field; retrying loop");
|
|
2093
|
+
await page.waitForTimeout(500);
|
|
2094
|
+
}
|
|
2095
|
+
continue;
|
|
2096
|
+
}
|
|
2097
|
+
|
|
2098
|
+
const nextEmailInput = await getFirstVisibleLocator(page, EMAIL_INPUT_SELECTOR);
|
|
2099
|
+
if (nextEmailInput) {
|
|
2100
|
+
const sinceEmail = Date.now() - emailSubmittedAt;
|
|
2101
|
+
if (emailSubmittedAt && sinceEmail < EMAIL_RESUBMIT_COOLDOWN_MS) {
|
|
2102
|
+
reportStep(
|
|
2103
|
+
"waiting_after_email",
|
|
2104
|
+
`Email already submitted ${Math.round(sinceEmail / 1000)}s ago — waiting for password/next screen`,
|
|
2105
|
+
);
|
|
2106
|
+
await page.waitForTimeout(500);
|
|
2107
|
+
continue;
|
|
2108
|
+
}
|
|
2109
|
+
|
|
2110
|
+
reportStep("entering_email", "Entering Google email");
|
|
2111
|
+
const filled = await fillInputResilient(nextEmailInput, email);
|
|
2112
|
+
if (filled) {
|
|
2113
|
+
reportStep("submitting_email", "Submitting email");
|
|
2114
|
+
await clickFirstVisible(page, NEXT_BUTTON_SELECTORS);
|
|
2115
|
+
emailSubmittedAt = Date.now();
|
|
2116
|
+
await page.waitForTimeout(isGrokFlow ? 600 : 1_500);
|
|
2117
|
+
} else {
|
|
2118
|
+
reportStep("email_fill_failed", "Could not fill the Google email field; retrying loop");
|
|
2119
|
+
}
|
|
2120
|
+
await page.waitForTimeout(400);
|
|
2121
|
+
continue;
|
|
2122
|
+
}
|
|
2123
|
+
}
|
|
2124
|
+
|
|
2125
|
+
// On xAI before Google login, APPROVE selectors match "Continue with Google"
|
|
2126
|
+
// via :has-text("Continue") and wreck the device code → Invalid action loop.
|
|
2127
|
+
const mayGenericApprove =
|
|
2128
|
+
isGoogleAuthPage(page)
|
|
2129
|
+
|| (seenGoogleAuth && passwordSubmittedAt && !(await providerHasGoogleLogin(page)));
|
|
2130
|
+
if (mayGenericApprove) {
|
|
2131
|
+
const clickedApprove = await clickFirstVisible(page, APPROVE_BUTTON_SELECTORS);
|
|
2132
|
+
if (clickedApprove) {
|
|
2133
|
+
reportStep("approving_consent", `Approving Google or ${serviceLabel} consent`);
|
|
2134
|
+
deviceApproveAt = Date.now();
|
|
2135
|
+
await page.waitForTimeout(isGrokFlow ? 500 : 700);
|
|
2136
|
+
continue;
|
|
2137
|
+
}
|
|
2138
|
+
}
|
|
2139
|
+
|
|
1783
2140
|
// Periodic diagnostics so jobs aren't opaque "waiting" spam
|
|
1784
|
-
if (Math.floor((Date.now() - startTime) / 5000) !== Math.floor((Date.now() - startTime -
|
|
2141
|
+
if (Math.floor((Date.now() - startTime) / 5000) !== Math.floor((Date.now() - startTime - loopTickMs) / 5000)) {
|
|
1785
2142
|
const url = page.url?.() || "";
|
|
1786
2143
|
const snippet = String(text || (await readPageText(page).catch(() => ""))).slice(0, 100).replace(/\s+/g, " ");
|
|
1787
2144
|
reportStep(
|
|
@@ -1791,7 +2148,7 @@ export async function runGoogleAccountAutomation({
|
|
|
1791
2148
|
} else {
|
|
1792
2149
|
reportStep("waiting_for_next_screen", `Waiting for the next Google or ${serviceLabel} screen`);
|
|
1793
2150
|
}
|
|
1794
|
-
await page.waitForTimeout(
|
|
2151
|
+
await page.waitForTimeout(loopTickMs);
|
|
1795
2152
|
}
|
|
1796
2153
|
|
|
1797
2154
|
// Final blocked check before generic needs_manual
|