zevairouter 1.0.154 → 1.0.155
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 +29 -0
- package/DOCKER.md +403 -0
- package/README.md +49 -22
- package/README.zh-CN.md +18 -11
- package/cli/LICENSE +1 -22
- package/cli/app/.next-cli-build/BUILD_ID +1 -1
- package/cli/app/.next-cli-build/app-path-routes-manifest.json +9 -9
- package/cli/app/.next-cli-build/build-manifest.json +2 -2
- package/cli/app/.next-cli-build/required-server-files.json +4 -4
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/automation/page.js +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 +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 +2 -2
- 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 +2 -2
- 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 +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 +2 -2
- 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 +2 -2
- 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 +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 +2 -2
- 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 +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 +2 -2
- 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 +2 -2
- 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 +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 +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 +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 +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 +2 -2
- 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 +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 +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 +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 +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 +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 +2 -2
- 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 +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 +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 +2 -2
- 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 +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 +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/login/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/auth/logout/route.js +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/logout/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/auth/oidc/callback/route.js +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/callback/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/auth/oidc/start/route.js +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/start/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/auth/oidc/test/route.js +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/oidc/test/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/auth/status/route.js +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/auth/status/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/cache/stats/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/cache/stats/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/cache/stats/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/changelog/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/changelog/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/changelog/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js +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/all-statuses/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js +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/alias/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/route.js +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/antigravity-mitm/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/cli-tools/claude-settings/route.js +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/claude-settings/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/cli-tools/cline-settings/route.js +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/cline-settings/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/cli-tools/codex-gateway/accounts/route.js +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-gateway/accounts/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/cli-tools/codex-settings/route.js +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/codex-settings/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/cli-tools/copilot-settings/route.js +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/copilot-settings/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-registry/route.js +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-registry/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-tools/route.js +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-mcp-tools/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/cli-tools/cowork-settings/route.js +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/cowork-settings/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/cli-tools/deepseek-tui-settings/route.js +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/deepseek-tui-settings/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/cli-tools/droid-settings/route.js +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/droid-settings/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/cli-tools/hermes-settings/route.js +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/hermes-settings/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/cli-tools/jcode-settings/route.js +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/jcode-settings/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/cli-tools/kilo-settings/route.js +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/kilo-settings/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/cli-tools/openclaw-settings/route.js +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/openclaw-settings/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/cli-tools/opencode-settings/route.js +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/cli-tools/opencode-settings/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/combos/[id]/route.js +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/[id]/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/combos/route.js +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/combos/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/context/[id]/route.js +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/[id]/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/context/bulk/route.js +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/bulk/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/context/route.js +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/context/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/dashboard/chat/completions/route.js +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/dashboard/chat/completions/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/dashboard/cli-tools/keys/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/dashboard/cli-tools/keys/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/dashboard/cli-tools/keys/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/dashboard/media/[operation]/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/dashboard/media/[operation]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/dashboard/media/[operation]/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/headroom/extras/route.js +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/extras/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/headroom/proxy/[...path]/route.js +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/proxy/[...path]/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/headroom/restart/route.js +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/restart/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/headroom/start/route.js +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/start/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/headroom/status/route.js +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/status/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/headroom/stop/route.js +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/headroom/stop/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/health/ready/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/health/ready/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/health/ready/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/health/route.js +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/health/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/init/route.js +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/init/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/keys/[id]/rotate/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/keys/[id]/rotate/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/keys/[id]/rotate/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/keys/[id]/route.js +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/[id]/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/keys/route.js +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/keys/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/locale/route.js +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/locale/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/mcp/[plugin]/message/route.js +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]/message/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/mcp/[plugin]/sse/route.js +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/mcp/[plugin]/sse/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js +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/deepgram/voices/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/media-providers/tts/elevenlabs/voices/route.js +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/elevenlabs/voices/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/media-providers/tts/inworld/voices/route.js +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/inworld/voices/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js +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/minimax/voices/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/media-providers/tts/voices/route.js +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/media-providers/tts/voices/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/metrics/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/metrics/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/metrics/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/models/alias/route.js +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/alias/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/models/availability/route.js +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/availability/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/models/custom/route.js +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/custom/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/models/disabled/route.js +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/disabled/route_client-reference-manifest.js +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/route_client-reference-manifest.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/models/test/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/models/test/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js +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/[provider]/[action]/route_client-reference-manifest.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]/cancel/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/antigravity/bulk-import/[jobId]/cancel/route_client-reference-manifest.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]/manual/[workerId]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/antigravity/bulk-import/[jobId]/manual/[workerId]/route_client-reference-manifest.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/[jobId]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/antigravity/bulk-import/[jobId]/route_client-reference-manifest.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/latest/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/antigravity/bulk-import/latest/route_client-reference-manifest.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/oauth/antigravity/bulk-import/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/antigravity/bulk-import/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/cloudflare-ai/bulk-import/[jobId]/cancel/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/cloudflare-ai/bulk-import/[jobId]/cancel/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/cloudflare-ai/bulk-import/[jobId]/cancel/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/cloudflare-ai/bulk-import/[jobId]/manual/[workerId]/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/cloudflare-ai/bulk-import/[jobId]/manual/[workerId]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/cloudflare-ai/bulk-import/[jobId]/manual/[workerId]/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/cloudflare-ai/bulk-import/[jobId]/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/cloudflare-ai/bulk-import/[jobId]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/cloudflare-ai/bulk-import/[jobId]/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/cloudflare-ai/bulk-import/latest/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/cloudflare-ai/bulk-import/latest/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/cloudflare-ai/bulk-import/latest/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/cloudflare-ai/bulk-import/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/cloudflare-ai/bulk-import/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/cloudflare-ai/bulk-import/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/bulk-import/[jobId]/cancel/route.js +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]/cancel/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/bulk-import/[jobId]/manual/[workerId]/route.js +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]/manual/[workerId]/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/bulk-import/[jobId]/route.js +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/[jobId]/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/bulk-import/latest/route.js +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/latest/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/bulk-import/route.js +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-import/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/bulk-token/route.js +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/bulk-token/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/quota-cookie/route.js +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/quota-cookie/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/bulk-import/[jobId]/cancel/route.js +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]/cancel/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/bulk-import/[jobId]/manual/[workerId]/route.js +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]/manual/[workerId]/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/bulk-import/[jobId]/route.js +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/[jobId]/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/bulk-import/latest/route.js +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/latest/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/bulk-import/route.js +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-import/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/bulk-token/route.js +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/bulk-token/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/quota-cookie/route.js +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/codebuddy-cn/quota-cookie/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js +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/codex/import-token/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/cursor/auto-import/route.js +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/auto-import/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js +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/cursor/import/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js +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/gitlab/pat/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js +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/iflow/cookie/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/kiro/auto-import/route.js +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/auto-import/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/kiro/bulk-import/[jobId]/cancel/route.js +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]/cancel/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/kiro/bulk-import/[jobId]/manual/[workerId]/route.js +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]/manual/[workerId]/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/kiro/bulk-import/[jobId]/route.js +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/[jobId]/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/kiro/bulk-import/latest/route.js +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/latest/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/kiro/bulk-import/route.js +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/bulk-import/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js +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/import/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/kiro/social-authorize/route.js +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-authorize/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js +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/kiro/social-exchange/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/qoder/bulk-import/[jobId]/cancel/route.js +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]/cancel/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/qoder/bulk-import/[jobId]/manual/[workerId]/route.js +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]/manual/[workerId]/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/qoder/bulk-import/[jobId]/route.js +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/[jobId]/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/qoder/bulk-import/latest/route.js +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/latest/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/oauth/qoder/bulk-import/route.js +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/oauth/qoder/bulk-import/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/pricing/route.js +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/pricing/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js +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/[id]/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/provider-nodes/route.js +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/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/provider-nodes/validate/route.js +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/provider-nodes/validate/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/providers/[id]/models/route.js +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]/models/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/providers/[id]/route.js +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]/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/providers/[id]/test/route.js +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/route_client-reference-manifest.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/[id]/test-models/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/providers/[id]/test-models/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/providers/bulk-delete/route.js +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/bulk-delete/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/providers/client/route.js +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/client/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/providers/kilo/free-models/route.js +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/kilo/free-models/route_client-reference-manifest.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/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/providers/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/providers/suggested-models/route.js +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/suggested-models/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/providers/test-batch/route.js +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/test-batch/route_client-reference-manifest.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/providers/validate/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/providers/validate/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/proxy-pools/[id]/route.js +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]/route_client-reference-manifest.js +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/[id]/test/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/proxy-pools/cloudflare-deploy/route.js +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/cloudflare-deploy/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/proxy-pools/deno-deploy/route.js +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/deno-deploy/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/proxy-pools/route.js +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/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/proxy-pools/vercel-deploy/route.js +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/proxy-pools/vercel-deploy/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/pxpipe/health/route.js +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/health/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/pxpipe/install/route.js +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/install/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/pxpipe/restart/route.js +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/restart/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/pxpipe/start/route.js +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/start/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/pxpipe/stats/route.js +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/stats/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/pxpipe/status/route.js +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/status/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/pxpipe/stop/route.js +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/pxpipe/stop/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/settings/database/route.js +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/database/route_client-reference-manifest.js +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/proxy-test/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/settings/require-login/route.js +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/require-login/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/settings/route.js +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/settings/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/shutdown/route.js +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/shutdown/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/tags/route.js +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/tags/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/terminal/auth/setup/route.js +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/setup/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/terminal/auth/status/route.js +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/status/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/terminal/auth/unlock/route.js +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/auth/unlock/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/terminal/session/[id]/input/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]/input/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/terminal/session/[id]/resize/route.js +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]/resize/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/terminal/session/[id]/route.js +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]/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/terminal/session/[id]/stream/route.js +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/[id]/stream/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/terminal/session/route.js +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/terminal/session/route_client-reference-manifest.js +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/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +2 -2
- 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/console-logs/stream/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/translator/load/route.js +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/load/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/translator/save/route.js +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/save/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/translator/send/route.js +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/send/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/translator/translate/route.js +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/translator/translate/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/tunnel/disable/route.js +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/disable/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/tunnel/enable/route.js +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/enable/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/tunnel/status/route.js +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/status/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/tunnel/tailscale-check/route.js +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-check/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/tunnel/tailscale-disable/route.js +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-disable/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/tunnel/tailscale-enable/route.js +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-enable/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/tunnel/tailscale-install/route.js +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/tunnel/tailscale-install/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js +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/[connectionId]/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/usage/aggregate/route.js +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/aggregate/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/usage/chart/route.js +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/chart/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/usage/history/route.js +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/history/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/usage/providers/route.js +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/providers/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/usage/request-details/route.js +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-details/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/usage/request-logs/route.js +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/request-logs/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/usage/stats/route.js +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/stats/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/usage/stream/route.js +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/usage/stream/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1/api/chat/route.js +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/api/chat/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1/audio/speech/route.js +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/speech/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js +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/transcriptions/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1/audio/voices/route.js +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/audio/voices/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1/chat/completions/route.js +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/chat/completions/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1/embeddings/route.js +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/embeddings/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1/images/generations/route.js +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/images/generations/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1/messages/count_tokens/route.js +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/count_tokens/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1/messages/route.js +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/messages/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1/models/[kind]/route.js +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/[kind]/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1/models/info/route.js +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/info/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1/models/route.js +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/models/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1/responses/compact/route.js +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/compact/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1/responses/route.js +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/responses/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1/route.js +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/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1/search/route.js +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/search/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1/web/fetch/route.js +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/v1/web/fetch/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js +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/[...path]/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/v1beta/models/route.js +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/v1beta/models/route_client-reference-manifest.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/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/version/route_client-reference-manifest.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/shutdown/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/version/shutdown/route_client-reference-manifest.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/api/version/update/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/version/update/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/callback/page.js +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 +2 -2
- 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 +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 +4 -4
- package/cli/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +4 -4
- 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 +2 -2
- 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 +2 -2
- 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/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/page.js +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 +9 -9
- package/cli/app/.next-cli-build/server/chunks/2030.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/3155.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/319.js +3 -3
- package/cli/app/.next-cli-build/server/chunks/4650.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/4746.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/5307.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/5469.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/5949.js +12 -11
- package/cli/app/.next-cli-build/server/chunks/8242.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/8306.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/9372.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/9621.js +1 -1
- package/cli/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/next-font-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/next-font-manifest.json +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/{620-a13f0f7b318585ab.js → 620-90911eeb765ca4bd.js} +1 -1
- package/cli/app/.next-cli-build/static/chunks/app/login/page-f7df7d9a053d65b7.js +1 -0
- package/cli/app/CHANGELOG.md +29 -0
- package/cli/app/cli/hooks/postinstall.js +82 -50
- package/cli/app/cli/hooks/safeGlobalInstall.js +178 -10
- package/cli/app/cli/hooks/startupRuntime.js +31 -0
- package/cli/app/cli/hooks/streamCommand.js +63 -0
- package/cli/app/package.json +46 -39
- package/cli/app/server.js +1 -1
- package/cli/cli.js +708 -248
- package/cli/hooks/postinstall.js +82 -50
- package/cli/hooks/safeGlobalInstall.js +178 -10
- package/cli/hooks/startupRuntime.js +31 -0
- package/cli/hooks/streamCommand.js +63 -0
- package/cli/package.json +6 -5
- package/cli/src/cli/systemdEnv.js +93 -0
- package/cli/src/cli/tray/autostart.js +55 -21
- package/cli/src/cli/tray/tray.js +1 -1
- package/cli/src/cli/updateRuntimeState.js +976 -0
- package/package.json +46 -39
- package/scripts/start-standalone.mjs +24 -15
- package/cli/app/.next-cli-build/static/chunks/app/login/page-9ea3f794879db097.js +0 -1
- package/i18n/README.ja-JP.md +0 -34
- package/i18n/README.ru.md +0 -34
- package/i18n/README.vi.md +0 -34
- package/i18n/README.zh-CN.md +0 -34
- package/images/screenshots/automation.png +0 -0
- package/images/screenshots/endpoint.png +0 -0
- package/images/screenshots/playground.png +0 -0
- package/images/screenshots/providers.png +0 -0
- package/images/screenshots/usage.png +0 -0
- package/images/zevairouter.png +0 -0
- package/jsconfig.json +0 -12
- package/next.config.mjs +0 -96
- package/open-sse/config/appConstants.js +0 -230
- package/open-sse/config/codexInstructions.js +0 -119
- package/open-sse/config/constants.js +0 -4
- package/open-sse/config/defaultThinkingSignature.js +0 -12
- package/open-sse/config/errorConfig.js +0 -92
- package/open-sse/config/googleTtsLanguages.js +0 -62
- package/open-sse/config/kiroConstants.js +0 -360
- package/open-sse/config/models.js +0 -13
- package/open-sse/config/ollamaModels.js +0 -19
- package/open-sse/config/providerModels.js +0 -1058
- package/open-sse/config/providers.js +0 -543
- package/open-sse/config/runtimeConfig.js +0 -72
- package/open-sse/config/ttsModels.js +0 -129
- package/open-sse/context/injectContext.js +0 -82
- package/open-sse/executors/antigravity.js +0 -605
- package/open-sse/executors/autoclaw.js +0 -121
- package/open-sse/executors/azure.js +0 -57
- package/open-sse/executors/base.js +0 -221
- package/open-sse/executors/codebuddy-cn.js +0 -31
- package/open-sse/executors/codex.js +0 -484
- package/open-sse/executors/commandcode.js +0 -88
- package/open-sse/executors/cursor.js +0 -795
- package/open-sse/executors/default.js +0 -532
- package/open-sse/executors/gemini-cli.js +0 -89
- package/open-sse/executors/github.js +0 -383
- package/open-sse/executors/grok-cli.js +0 -397
- package/open-sse/executors/grok-web.js +0 -345
- package/open-sse/executors/iflow.js +0 -108
- package/open-sse/executors/index.js +0 -92
- package/open-sse/executors/kimchi.js +0 -123
- package/open-sse/executors/kiro.js +0 -537
- package/open-sse/executors/mimo-free.js +0 -156
- package/open-sse/executors/ollama-local.js +0 -14
- package/open-sse/executors/opencode-go.js +0 -41
- package/open-sse/executors/opencode.js +0 -32
- package/open-sse/executors/perplexity-web.js +0 -507
- package/open-sse/executors/qoder.js +0 -468
- package/open-sse/executors/qwen.js +0 -129
- package/open-sse/executors/vertex.js +0 -131
- package/open-sse/executors/xiaomi-tokenplan.js +0 -19
- package/open-sse/handlers/chatCore/nonStreamingHandler.js +0 -261
- package/open-sse/handlers/chatCore/requestDetail.js +0 -112
- package/open-sse/handlers/chatCore/sseToJsonHandler.js +0 -540
- package/open-sse/handlers/chatCore/streamingHandler.js +0 -125
- package/open-sse/handlers/chatCore.js +0 -398
- package/open-sse/handlers/embeddingProviders/_base.js +0 -4
- package/open-sse/handlers/embeddingProviders/gemini.js +0 -57
- package/open-sse/handlers/embeddingProviders/index.js +0 -23
- package/open-sse/handlers/embeddingProviders/openai.js +0 -39
- package/open-sse/handlers/embeddingProviders/openaiCompatNode.js +0 -16
- package/open-sse/handlers/embeddingsCore.js +0 -126
- package/open-sse/handlers/fetch/index.js +0 -237
- package/open-sse/handlers/imageGenerationCore.js +0 -189
- package/open-sse/handlers/imageProviders/_base.js +0 -31
- package/open-sse/handlers/imageProviders/blackForestLabs.js +0 -46
- package/open-sse/handlers/imageProviders/cloudflareAi.js +0 -181
- package/open-sse/handlers/imageProviders/codex.js +0 -201
- package/open-sse/handlers/imageProviders/comfyui.js +0 -11
- package/open-sse/handlers/imageProviders/falAi.js +0 -44
- package/open-sse/handlers/imageProviders/gemini.js +0 -28
- package/open-sse/handlers/imageProviders/huggingface.js +0 -25
- package/open-sse/handlers/imageProviders/index.js +0 -40
- package/open-sse/handlers/imageProviders/nanobanana.js +0 -61
- package/open-sse/handlers/imageProviders/openai.js +0 -40
- package/open-sse/handlers/imageProviders/runwayml.js +0 -50
- package/open-sse/handlers/imageProviders/sdwebui.js +0 -20
- package/open-sse/handlers/imageProviders/stabilityAi.js +0 -37
- package/open-sse/handlers/responsesHandler.js +0 -46
- package/open-sse/handlers/search/callers.js +0 -371
- package/open-sse/handlers/search/chatSearch.js +0 -409
- package/open-sse/handlers/search/index.js +0 -201
- package/open-sse/handlers/search/normalizers.js +0 -223
- package/open-sse/handlers/sttCore.js +0 -194
- package/open-sse/handlers/ttsCore.js +0 -74
- package/open-sse/handlers/ttsProviders/_base.js +0 -39
- package/open-sse/handlers/ttsProviders/edgeTts.js +0 -92
- package/open-sse/handlers/ttsProviders/elevenlabs.js +0 -51
- package/open-sse/handlers/ttsProviders/gemini.js +0 -120
- package/open-sse/handlers/ttsProviders/genericFormats.js +0 -169
- package/open-sse/handlers/ttsProviders/googleTts.js +0 -57
- package/open-sse/handlers/ttsProviders/index.js +0 -50
- package/open-sse/handlers/ttsProviders/localDevice.js +0 -90
- package/open-sse/handlers/ttsProviders/minimax.js +0 -59
- package/open-sse/handlers/ttsProviders/openai.js +0 -33
- package/open-sse/handlers/ttsProviders/openrouter.js +0 -73
- package/open-sse/index.js +0 -82
- package/open-sse/rtk/applyFilter.js +0 -15
- package/open-sse/rtk/autodetect.js +0 -111
- package/open-sse/rtk/caveman.js +0 -100
- package/open-sse/rtk/cavemanPrompts.js +0 -78
- package/open-sse/rtk/constants.js +0 -55
- package/open-sse/rtk/filters/buildOutput.js +0 -127
- package/open-sse/rtk/filters/dedupLog.js +0 -44
- package/open-sse/rtk/filters/find.js +0 -49
- package/open-sse/rtk/filters/gitDiff.js +0 -92
- package/open-sse/rtk/filters/gitStatus.js +0 -117
- package/open-sse/rtk/filters/grep.js +0 -48
- package/open-sse/rtk/filters/ls.js +0 -79
- package/open-sse/rtk/filters/readNumbered.js +0 -27
- package/open-sse/rtk/filters/searchList.js +0 -52
- package/open-sse/rtk/filters/smartTruncate.js +0 -15
- package/open-sse/rtk/filters/tree.js +0 -32
- package/open-sse/rtk/headroom.js +0 -348
- package/open-sse/rtk/index.js +0 -155
- package/open-sse/rtk/ponytail.js +0 -91
- package/open-sse/rtk/ponytailPrompts.js +0 -44
- package/open-sse/rtk/pxpipe.js +0 -104
- package/open-sse/rtk/registry.js +0 -38
- package/open-sse/services/accountFallback.js +0 -467
- package/open-sse/services/antigravityHeaderScrub.js +0 -78
- package/open-sse/services/antigravityIdentity.js +0 -115
- package/open-sse/services/antigravityObfuscation.js +0 -92
- package/open-sse/services/clinepassModels.js +0 -63
- package/open-sse/services/combo.js +0 -189
- package/open-sse/services/compact.js +0 -71
- package/open-sse/services/copilotModels.js +0 -155
- package/open-sse/services/kimchiModels.js +0 -176
- package/open-sse/services/kiroModels.js +0 -320
- package/open-sse/services/model.js +0 -281
- package/open-sse/services/oauthCredentialManager.js +0 -151
- package/open-sse/services/projectId.js +0 -463
- package/open-sse/services/provider.js +0 -356
- package/open-sse/services/qoderModels.js +0 -216
- package/open-sse/services/tokenRefresh.js +0 -949
- package/open-sse/services/usage.js +0 -2415
- package/open-sse/transformer/responsesTransformer.js +0 -509
- package/open-sse/transformer/streamToJsonConverter.js +0 -151
- package/open-sse/translator/formats.js +0 -36
- package/open-sse/translator/helpers/claudeHelper.js +0 -217
- package/open-sse/translator/helpers/geminiHelper.js +0 -372
- package/open-sse/translator/helpers/imageHelper.js +0 -98
- package/open-sse/translator/helpers/maxTokensHelper.js +0 -27
- package/open-sse/translator/helpers/openaiHelper.js +0 -130
- package/open-sse/translator/helpers/responsesApiHelper.js +0 -214
- package/open-sse/translator/helpers/toolCallHelper.js +0 -148
- package/open-sse/translator/index.js +0 -254
- package/open-sse/translator/request/antigravity-to-openai.js +0 -255
- package/open-sse/translator/request/claude-to-openai.js +0 -278
- package/open-sse/translator/request/gemini-to-openai.js +0 -147
- package/open-sse/translator/request/openai-responses.js +0 -212
- package/open-sse/translator/request/openai-to-claude.js +0 -427
- package/open-sse/translator/request/openai-to-commandcode.js +0 -178
- package/open-sse/translator/request/openai-to-cursor.js +0 -195
- package/open-sse/translator/request/openai-to-gemini.js +0 -478
- package/open-sse/translator/request/openai-to-kiro.js +0 -641
- package/open-sse/translator/request/openai-to-kiro.old.js +0 -278
- package/open-sse/translator/request/openai-to-ollama.js +0 -192
- package/open-sse/translator/request/openai-to-vertex.js +0 -42
- package/open-sse/translator/response/claude-to-openai.js +0 -206
- package/open-sse/translator/response/commandcode-to-openai.js +0 -197
- package/open-sse/translator/response/cursor-to-openai.js +0 -30
- package/open-sse/translator/response/gemini-to-openai.js +0 -245
- package/open-sse/translator/response/kiro-to-openai.js +0 -195
- package/open-sse/translator/response/ollama-to-openai.js +0 -152
- package/open-sse/translator/response/openai-responses.js +0 -624
- package/open-sse/translator/response/openai-to-antigravity.js +0 -122
- package/open-sse/translator/response/openai-to-claude.js +0 -266
- package/open-sse/utils/bypassHandler.js +0 -298
- package/open-sse/utils/claudeCloaking.js +0 -155
- package/open-sse/utils/claudeHeaderCache.js +0 -70
- package/open-sse/utils/clientDetector.js +0 -64
- package/open-sse/utils/cursorChecksum.js +0 -152
- package/open-sse/utils/cursorProtobuf.js +0 -907
- package/open-sse/utils/debugLog.js +0 -14
- package/open-sse/utils/error.js +0 -147
- package/open-sse/utils/ollamaTransform.js +0 -85
- package/open-sse/utils/proxyFetch.js +0 -369
- package/open-sse/utils/reasoningContentInjector.js +0 -79
- package/open-sse/utils/requestLogger.js +0 -251
- package/open-sse/utils/responsesStreamHelpers.js +0 -106
- package/open-sse/utils/sessionManager.js +0 -231
- package/open-sse/utils/stream.js +0 -590
- package/open-sse/utils/streamHandler.js +0 -274
- package/open-sse/utils/streamHelpers.js +0 -122
- package/open-sse/utils/thinkingSuffix.js +0 -64
- package/open-sse/utils/toolDeduper.js +0 -49
- package/open-sse/utils/usageTracking.js +0 -351
- package/postcss.config.mjs +0 -14
- package/public/favicon.svg +0 -16
- package/public/file.svg +0 -1
- package/public/globe.svg +0 -1
- package/public/i18n/literals/ar.json +0 -195
- package/public/i18n/literals/bn.json +0 -195
- package/public/i18n/literals/cs.json +0 -195
- package/public/i18n/literals/da.json +0 -195
- package/public/i18n/literals/de.json +0 -195
- package/public/i18n/literals/el.json +0 -195
- package/public/i18n/literals/es.json +0 -195
- package/public/i18n/literals/fi.json +0 -195
- package/public/i18n/literals/fr.json +0 -195
- package/public/i18n/literals/he.json +0 -195
- package/public/i18n/literals/hi.json +0 -195
- package/public/i18n/literals/hu.json +0 -195
- package/public/i18n/literals/id.json +0 -195
- package/public/i18n/literals/it.json +0 -195
- package/public/i18n/literals/ja.json +0 -195
- package/public/i18n/literals/ko.json +0 -195
- package/public/i18n/literals/nl.json +0 -195
- package/public/i18n/literals/no.json +0 -195
- package/public/i18n/literals/pl.json +0 -195
- package/public/i18n/literals/pt-BR.json +0 -195
- package/public/i18n/literals/pt-PT.json +0 -195
- package/public/i18n/literals/ro.json +0 -195
- package/public/i18n/literals/ru.json +0 -195
- package/public/i18n/literals/sv.json +0 -195
- package/public/i18n/literals/th.json +0 -195
- package/public/i18n/literals/tl.json +0 -195
- package/public/i18n/literals/tr.json +0 -195
- package/public/i18n/literals/uk.json +0 -195
- package/public/i18n/literals/ur.json +0 -195
- package/public/i18n/literals/vi.json +0 -195
- package/public/i18n/literals/zh-CN.json +0 -772
- package/public/i18n/literals/zh-TW.json +0 -195
- package/public/icons/discord.svg +0 -4
- package/public/icons/icon-192.svg +0 -16
- package/public/icons/icon-512.svg +0 -16
- package/public/next.svg +0 -1
- package/public/providers/alicode-intl.png +0 -0
- package/public/providers/alicode.png +0 -0
- package/public/providers/amp.png +0 -0
- package/public/providers/anthropic-m.png +0 -0
- package/public/providers/anthropic.png +0 -0
- package/public/providers/antigravity.png +0 -0
- package/public/providers/assemblyai.png +0 -0
- package/public/providers/autoclaw.png +0 -0
- package/public/providers/aws-polly.png +0 -0
- package/public/providers/azure.png +0 -0
- package/public/providers/black-forest-labs.png +0 -0
- package/public/providers/blackbox.png +0 -0
- package/public/providers/brave-search.png +0 -0
- package/public/providers/byteplus.png +0 -0
- package/public/providers/cartesia.png +0 -0
- package/public/providers/cerebras.png +0 -0
- package/public/providers/chutes.png +0 -0
- package/public/providers/claude.png +0 -0
- package/public/providers/cline.png +0 -0
- package/public/providers/clinepass.png +0 -0
- package/public/providers/cloudflare-ai.png +0 -0
- package/public/providers/codebuddy-cn.png +0 -0
- package/public/providers/codebuddy.png +0 -0
- package/public/providers/codebuddy.svg +0 -37
- package/public/providers/codex.png +0 -0
- package/public/providers/cohere.png +0 -0
- package/public/providers/comfyui.png +0 -0
- package/public/providers/commandcode.png +0 -0
- package/public/providers/continue.png +0 -0
- package/public/providers/copilot.png +0 -0
- package/public/providers/coqui.png +0 -0
- package/public/providers/cursor.png +0 -0
- package/public/providers/deepgram.png +0 -0
- package/public/providers/deepseek-tui.png +0 -0
- package/public/providers/deepseek.png +0 -0
- package/public/providers/droid.png +0 -0
- package/public/providers/edge-tts.png +0 -0
- package/public/providers/elevenlabs.png +0 -0
- package/public/providers/exa.png +0 -0
- package/public/providers/fal-ai.png +0 -0
- package/public/providers/firecrawl.png +0 -0
- package/public/providers/fireworks.png +0 -0
- package/public/providers/gemini-cli.png +0 -0
- package/public/providers/gemini.png +0 -0
- package/public/providers/github.png +0 -0
- package/public/providers/glm-cn.png +0 -0
- package/public/providers/glm.png +0 -0
- package/public/providers/google-pse.png +0 -0
- package/public/providers/google-tts.png +0 -0
- package/public/providers/grok-cli.png +0 -0
- package/public/providers/grok-web.png +0 -0
- package/public/providers/groq.png +0 -0
- package/public/providers/hermes.png +0 -0
- package/public/providers/huggingface.png +0 -0
- package/public/providers/hyperbolic.png +0 -0
- package/public/providers/iflow.png +0 -0
- package/public/providers/inworld.png +0 -0
- package/public/providers/jcode.png +0 -0
- package/public/providers/jina-ai.png +0 -0
- package/public/providers/jina-reader.png +0 -0
- package/public/providers/kilocode.png +0 -0
- package/public/providers/kimchi.png +0 -0
- package/public/providers/kimchi.svg +0 -4
- package/public/providers/kimi-coding.png +0 -0
- package/public/providers/kimi.png +0 -0
- package/public/providers/kiro.png +0 -0
- package/public/providers/linkup.png +0 -0
- package/public/providers/local-device.png +0 -0
- package/public/providers/mimo-free.png +0 -0
- package/public/providers/minimax-cn.png +0 -0
- package/public/providers/minimax.png +0 -0
- package/public/providers/mistral.png +0 -0
- package/public/providers/nanobanana.png +0 -0
- package/public/providers/nebius.png +0 -0
- package/public/providers/nvidia.png +0 -0
- package/public/providers/oai-cc.png +0 -0
- package/public/providers/oai-r.png +0 -0
- package/public/providers/ollama-local.png +0 -0
- package/public/providers/ollama.png +0 -0
- package/public/providers/openai.png +0 -0
- package/public/providers/openclaw.png +0 -0
- package/public/providers/opencode-go.png +0 -0
- package/public/providers/opencode.png +0 -0
- package/public/providers/openrouter.png +0 -0
- package/public/providers/perplexity-agent.png +0 -0
- package/public/providers/perplexity-web.png +0 -0
- package/public/providers/perplexity.png +0 -0
- package/public/providers/playht.png +0 -0
- package/public/providers/qoder.png +0 -0
- package/public/providers/qwen.png +0 -0
- package/public/providers/recraft.png +0 -0
- package/public/providers/roo.png +0 -0
- package/public/providers/runwayml.png +0 -0
- package/public/providers/sdwebui.png +0 -0
- package/public/providers/searchapi.png +0 -0
- package/public/providers/searxng.png +0 -0
- package/public/providers/serper.png +0 -0
- package/public/providers/siliconflow.png +0 -0
- package/public/providers/stability-ai.png +0 -0
- package/public/providers/tavily.png +0 -0
- package/public/providers/together.png +0 -0
- package/public/providers/topaz.png +0 -0
- package/public/providers/tortoise.png +0 -0
- package/public/providers/vertex-partner.png +0 -0
- package/public/providers/vertex.png +0 -0
- package/public/providers/volcengine-ark.png +0 -0
- package/public/providers/voyage-ai.png +0 -0
- package/public/providers/xai.png +0 -0
- package/public/providers/xiaomi-mimo.png +0 -0
- package/public/providers/xiaomi-tokenplan.png +0 -0
- package/public/providers/youcom.png +0 -0
- package/public/sw.js +0 -22
- package/public/vercel.svg +0 -1
- package/public/window.svg +0 -1
- package/scripts/translate-readme.js +0 -201
- package/src/app/(dashboard)/dashboard/automation/page.js +0 -774
- package/src/app/(dashboard)/dashboard/basic-chat/BasicChatPageClient.js +0 -1592
- package/src/app/(dashboard)/dashboard/basic-chat/page.js +0 -5
- package/src/app/(dashboard)/dashboard/cli-tools/CLIToolsPageClient.js +0 -81
- package/src/app/(dashboard)/dashboard/cli-tools/[toolId]/ToolDetailClient.js +0 -173
- package/src/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js +0 -11
- package/src/app/(dashboard)/dashboard/cli-tools/components/AntigravityToolCard.js +0 -487
- package/src/app/(dashboard)/dashboard/cli-tools/components/ApiKeySelect.js +0 -14
- package/src/app/(dashboard)/dashboard/cli-tools/components/BaseUrlSelect.js +0 -176
- package/src/app/(dashboard)/dashboard/cli-tools/components/ClaudeToolCard.js +0 -396
- package/src/app/(dashboard)/dashboard/cli-tools/components/ClineToolCard.js +0 -307
- package/src/app/(dashboard)/dashboard/cli-tools/components/CodexToolCard.js +0 -466
- package/src/app/(dashboard)/dashboard/cli-tools/components/CopilotToolCard.js +0 -330
- package/src/app/(dashboard)/dashboard/cli-tools/components/CoworkToolCard.js +0 -646
- package/src/app/(dashboard)/dashboard/cli-tools/components/DeepSeekTuiToolCard.js +0 -344
- package/src/app/(dashboard)/dashboard/cli-tools/components/DefaultToolCard.js +0 -271
- package/src/app/(dashboard)/dashboard/cli-tools/components/DroidToolCard.js +0 -421
- package/src/app/(dashboard)/dashboard/cli-tools/components/EndpointPresetControl.js +0 -129
- package/src/app/(dashboard)/dashboard/cli-tools/components/HermesToolCard.js +0 -323
- package/src/app/(dashboard)/dashboard/cli-tools/components/JcodeToolCard.js +0 -386
- package/src/app/(dashboard)/dashboard/cli-tools/components/KiloToolCard.js +0 -280
- package/src/app/(dashboard)/dashboard/cli-tools/components/MitmLinkCard.js +0 -40
- package/src/app/(dashboard)/dashboard/cli-tools/components/MitmServerCard.js +0 -329
- package/src/app/(dashboard)/dashboard/cli-tools/components/MitmToolCard.js +0 -320
- package/src/app/(dashboard)/dashboard/cli-tools/components/OpenClawToolCard.js +0 -394
- package/src/app/(dashboard)/dashboard/cli-tools/components/OpenCodeToolCard.js +0 -512
- package/src/app/(dashboard)/dashboard/cli-tools/components/ToolSummaryCard.js +0 -40
- package/src/app/(dashboard)/dashboard/cli-tools/components/cliEndpointMatch.js +0 -13
- package/src/app/(dashboard)/dashboard/cli-tools/components/index.js +0 -19
- package/src/app/(dashboard)/dashboard/cli-tools/page.js +0 -7
- package/src/app/(dashboard)/dashboard/combos/page.js +0 -615
- package/src/app/(dashboard)/dashboard/console-log/ConsoleLogClient.js +0 -118
- package/src/app/(dashboard)/dashboard/console-log/page.js +0 -8
- package/src/app/(dashboard)/dashboard/context/page.js +0 -276
- package/src/app/(dashboard)/dashboard/endpoint/EndpointPageClient.js +0 -1594
- package/src/app/(dashboard)/dashboard/endpoint/endpointConstants.js +0 -32
- package/src/app/(dashboard)/dashboard/endpoint/page.js +0 -7
- package/src/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js +0 -1907
- package/src/app/(dashboard)/dashboard/media-providers/[kind]/page.js +0 -289
- package/src/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js +0 -413
- package/src/app/(dashboard)/dashboard/media-providers/web/page.js +0 -209
- package/src/app/(dashboard)/dashboard/mitm/MitmPageClient.js +0 -121
- package/src/app/(dashboard)/dashboard/mitm/page.js +0 -5
- package/src/app/(dashboard)/dashboard/page.js +0 -7
- package/src/app/(dashboard)/dashboard/playground/page.js +0 -5
- package/src/app/(dashboard)/dashboard/profile/page.js +0 -1284
- package/src/app/(dashboard)/dashboard/providers/[id]/AddApiKeyModal.js +0 -389
- package/src/app/(dashboard)/dashboard/providers/[id]/AddCustomModelModal.js +0 -126
- package/src/app/(dashboard)/dashboard/providers/[id]/CompatibleModelsSection.js +0 -250
- package/src/app/(dashboard)/dashboard/providers/[id]/ConnectionRow.js +0 -295
- package/src/app/(dashboard)/dashboard/providers/[id]/CooldownTimer.js +0 -42
- package/src/app/(dashboard)/dashboard/providers/[id]/EditCompatibleNodeModal.js +0 -162
- package/src/app/(dashboard)/dashboard/providers/[id]/ModelRow.js +0 -99
- package/src/app/(dashboard)/dashboard/providers/[id]/PassthroughModelsSection.js +0 -183
- package/src/app/(dashboard)/dashboard/providers/[id]/page.js +0 -2170
- package/src/app/(dashboard)/dashboard/providers/[id]/page.new.js +0 -1726
- package/src/app/(dashboard)/dashboard/providers/components/ConnectionsCard.js +0 -486
- package/src/app/(dashboard)/dashboard/providers/components/ModelAvailabilityBadge.js +0 -186
- package/src/app/(dashboard)/dashboard/providers/components/ModelsCard.js +0 -295
- package/src/app/(dashboard)/dashboard/providers/new/page.js +0 -220
- package/src/app/(dashboard)/dashboard/providers/page.js +0 -1518
- package/src/app/(dashboard)/dashboard/proxy-pools/page.js +0 -1107
- package/src/app/(dashboard)/dashboard/pxpipe/PxpipeClient.js +0 -284
- package/src/app/(dashboard)/dashboard/pxpipe/page.js +0 -5
- package/src/app/(dashboard)/dashboard/quota/page.js +0 -11
- package/src/app/(dashboard)/dashboard/terminal/TerminalPageClient.js +0 -735
- package/src/app/(dashboard)/dashboard/terminal/page.js +0 -7
- package/src/app/(dashboard)/dashboard/token-saver/TokenSaverClient.js +0 -1018
- package/src/app/(dashboard)/dashboard/token-saver/page.js +0 -5
- package/src/app/(dashboard)/dashboard/translator/page.js +0 -303
- package/src/app/(dashboard)/dashboard/usage/components/OverviewCards.js +0 -87
- package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/ProviderLimitCard.js +0 -183
- package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/QuotaProgressBar.js +0 -127
- package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/QuotaTable.js +0 -269
- package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/index.js +0 -1571
- package/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/utils.js +0 -320
- package/src/app/(dashboard)/dashboard/usage/components/ProviderTopology.js +0 -468
- package/src/app/(dashboard)/dashboard/usage/components/RequestDetailsTab.js +0 -454
- package/src/app/(dashboard)/dashboard/usage/components/UsageChart.js +0 -155
- package/src/app/(dashboard)/dashboard/usage/components/UsageTable.js +0 -253
- package/src/app/(dashboard)/dashboard/usage/page.js +0 -75
- package/src/app/(dashboard)/layout.js +0 -6
- package/src/app/api/auth/login/route.js +0 -76
- package/src/app/api/auth/logout/route.js +0 -14
- package/src/app/api/auth/oidc/callback/route.js +0 -87
- package/src/app/api/auth/oidc/start/route.js +0 -52
- package/src/app/api/auth/oidc/test/route.js +0 -86
- package/src/app/api/auth/status/route.js +0 -45
- package/src/app/api/cache/stats/route.js +0 -13
- package/src/app/api/changelog/route.js +0 -48
- package/src/app/api/cli-tools/all-statuses/route.js +0 -46
- package/src/app/api/cli-tools/antigravity-mitm/alias/route.js +0 -53
- package/src/app/api/cli-tools/antigravity-mitm/route.js +0 -202
- package/src/app/api/cli-tools/claude-settings/route.js +0 -203
- package/src/app/api/cli-tools/cline-settings/route.js +0 -133
- package/src/app/api/cli-tools/codex-gateway/accounts/route.js +0 -16
- package/src/app/api/cli-tools/codex-settings/route.js +0 -271
- package/src/app/api/cli-tools/copilot-settings/route.js +0 -153
- package/src/app/api/cli-tools/cowork-mcp-registry/route.js +0 -77
- package/src/app/api/cli-tools/cowork-mcp-tools/route.js +0 -95
- package/src/app/api/cli-tools/cowork-settings/route.js +0 -412
- package/src/app/api/cli-tools/deepseek-tui-settings/route.js +0 -164
- package/src/app/api/cli-tools/droid-settings/route.js +0 -213
- package/src/app/api/cli-tools/hermes-settings/route.js +0 -175
- package/src/app/api/cli-tools/jcode-settings/route.js +0 -216
- package/src/app/api/cli-tools/kilo-settings/route.js +0 -131
- package/src/app/api/cli-tools/openclaw-settings/route.js +0 -292
- package/src/app/api/cli-tools/opencode-settings/route.js +0 -259
- package/src/app/api/combos/[id]/route.js +0 -81
- package/src/app/api/combos/route.js +0 -48
- package/src/app/api/context/[id]/route.js +0 -35
- package/src/app/api/context/bulk/route.js +0 -25
- package/src/app/api/context/route.js +0 -33
- package/src/app/api/dashboard/chat/completions/route.js +0 -74
- package/src/app/api/dashboard/cli-tools/keys/route.js +0 -33
- package/src/app/api/dashboard/media/[operation]/route.js +0 -60
- package/src/app/api/headroom/extras/route.js +0 -46
- package/src/app/api/headroom/proxy/[...path]/route.js +0 -104
- package/src/app/api/headroom/restart/route.js +0 -35
- package/src/app/api/headroom/start/route.js +0 -35
- package/src/app/api/headroom/status/route.js +0 -18
- package/src/app/api/headroom/stop/route.js +0 -14
- package/src/app/api/health/ready/route.js +0 -21
- package/src/app/api/health/route.js +0 -15
- package/src/app/api/init/route.js +0 -12
- package/src/app/api/keys/[id]/rotate/route.js +0 -14
- package/src/app/api/keys/[id]/route.js +0 -119
- package/src/app/api/keys/route.js +0 -56
- package/src/app/api/locale/route.js +0 -30
- package/src/app/api/mcp/[plugin]/message/route.js +0 -21
- package/src/app/api/mcp/[plugin]/sse/route.js +0 -37
- package/src/app/api/media-providers/tts/deepgram/voices/route.js +0 -65
- package/src/app/api/media-providers/tts/elevenlabs/voices/route.js +0 -71
- package/src/app/api/media-providers/tts/inworld/voices/route.js +0 -61
- package/src/app/api/media-providers/tts/minimax/voices/route.js +0 -113
- package/src/app/api/media-providers/tts/voices/route.js +0 -99
- package/src/app/api/metrics/route.js +0 -33
- package/src/app/api/models/alias/route.js +0 -53
- package/src/app/api/models/availability/route.js +0 -103
- package/src/app/api/models/custom/route.js +0 -48
- package/src/app/api/models/disabled/route.js +0 -50
- package/src/app/api/models/route.js +0 -68
- package/src/app/api/models/test/ping.js +0 -191
- package/src/app/api/models/test/route.js +0 -14
- package/src/app/api/oauth/[provider]/[action]/route.js +0 -340
- package/src/app/api/oauth/antigravity/bulk-import/[jobId]/cancel/route.js +0 -19
- package/src/app/api/oauth/antigravity/bulk-import/[jobId]/manual/[workerId]/route.js +0 -30
- package/src/app/api/oauth/antigravity/bulk-import/[jobId]/route.js +0 -23
- package/src/app/api/oauth/antigravity/bulk-import/latest/route.js +0 -24
- package/src/app/api/oauth/antigravity/bulk-import/route.js +0 -51
- package/src/app/api/oauth/cloudflare-ai/bulk-import/[jobId]/cancel/route.js +0 -19
- package/src/app/api/oauth/cloudflare-ai/bulk-import/[jobId]/manual/[workerId]/route.js +0 -30
- package/src/app/api/oauth/cloudflare-ai/bulk-import/[jobId]/route.js +0 -25
- package/src/app/api/oauth/cloudflare-ai/bulk-import/latest/route.js +0 -27
- package/src/app/api/oauth/cloudflare-ai/bulk-import/route.js +0 -56
- package/src/app/api/oauth/codebuddy/bulk-import/[jobId]/cancel/route.js +0 -19
- package/src/app/api/oauth/codebuddy/bulk-import/[jobId]/manual/[workerId]/route.js +0 -30
- package/src/app/api/oauth/codebuddy/bulk-import/[jobId]/route.js +0 -23
- package/src/app/api/oauth/codebuddy/bulk-import/latest/route.js +0 -25
- package/src/app/api/oauth/codebuddy/bulk-import/route.js +0 -51
- package/src/app/api/oauth/codebuddy/bulk-token/route.js +0 -118
- package/src/app/api/oauth/codebuddy/quota-cookie/route.js +0 -133
- package/src/app/api/oauth/codebuddy-cn/bulk-import/[jobId]/cancel/route.js +0 -19
- package/src/app/api/oauth/codebuddy-cn/bulk-import/[jobId]/manual/[workerId]/route.js +0 -30
- package/src/app/api/oauth/codebuddy-cn/bulk-import/[jobId]/route.js +0 -26
- package/src/app/api/oauth/codebuddy-cn/bulk-import/latest/route.js +0 -27
- package/src/app/api/oauth/codebuddy-cn/bulk-import/route.js +0 -61
- package/src/app/api/oauth/codebuddy-cn/bulk-token/route.js +0 -119
- package/src/app/api/oauth/codebuddy-cn/quota-cookie/route.js +0 -28
- package/src/app/api/oauth/codex/import-token/route.js +0 -96
- package/src/app/api/oauth/cursor/auto-import/route.js +0 -257
- package/src/app/api/oauth/cursor/import/route.js +0 -100
- package/src/app/api/oauth/gitlab/pat/route.js +0 -62
- package/src/app/api/oauth/iflow/cookie/route.js +0 -137
- package/src/app/api/oauth/kiro/auto-import/route.js +0 -85
- package/src/app/api/oauth/kiro/bulk-import/[jobId]/cancel/route.js +0 -19
- package/src/app/api/oauth/kiro/bulk-import/[jobId]/manual/[workerId]/route.js +0 -30
- package/src/app/api/oauth/kiro/bulk-import/[jobId]/route.js +0 -23
- package/src/app/api/oauth/kiro/bulk-import/latest/route.js +0 -25
- package/src/app/api/oauth/kiro/bulk-import/route.js +0 -51
- package/src/app/api/oauth/kiro/import/route.js +0 -110
- package/src/app/api/oauth/kiro/social-authorize/route.js +0 -27
- package/src/app/api/oauth/kiro/social-exchange/route.js +0 -41
- package/src/app/api/oauth/qoder/bulk-import/[jobId]/cancel/route.js +0 -19
- package/src/app/api/oauth/qoder/bulk-import/[jobId]/manual/[workerId]/route.js +0 -30
- package/src/app/api/oauth/qoder/bulk-import/[jobId]/route.js +0 -23
- package/src/app/api/oauth/qoder/bulk-import/latest/route.js +0 -24
- package/src/app/api/oauth/qoder/bulk-import/route.js +0 -49
- package/src/app/api/pricing/route.js +0 -134
- package/src/app/api/provider-nodes/[id]/route.js +0 -101
- package/src/app/api/provider-nodes/route.js +0 -104
- package/src/app/api/provider-nodes/validate/route.js +0 -201
- package/src/app/api/providers/[id]/models/route.js +0 -605
- package/src/app/api/providers/[id]/route.js +0 -251
- package/src/app/api/providers/[id]/test/route.js +0 -23
- package/src/app/api/providers/[id]/test/testUtils.js +0 -811
- package/src/app/api/providers/[id]/test-models/route.js +0 -66
- package/src/app/api/providers/bulk-delete/route.js +0 -60
- package/src/app/api/providers/client/route.js +0 -136
- package/src/app/api/providers/kilo/free-models/route.js +0 -55
- package/src/app/api/providers/route.js +0 -278
- package/src/app/api/providers/suggested-models/filters.js +0 -20
- package/src/app/api/providers/suggested-models/route.js +0 -34
- package/src/app/api/providers/test-batch/route.js +0 -131
- package/src/app/api/providers/validate/route.js +0 -637
- package/src/app/api/proxy-pools/[id]/route.js +0 -135
- package/src/app/api/proxy-pools/[id]/test/route.js +0 -72
- package/src/app/api/proxy-pools/cloudflare-deploy/route.js +0 -145
- package/src/app/api/proxy-pools/deno-deploy/route.js +0 -175
- package/src/app/api/proxy-pools/route.js +0 -112
- package/src/app/api/proxy-pools/vercel-deploy/route.js +0 -142
- package/src/app/api/pxpipe/health/route.js +0 -16
- package/src/app/api/pxpipe/install/route.js +0 -20
- package/src/app/api/pxpipe/logs/route.js +0 -21
- package/src/app/api/pxpipe/restart/route.js +0 -16
- package/src/app/api/pxpipe/start/route.js +0 -26
- package/src/app/api/pxpipe/stats/route.js +0 -17
- package/src/app/api/pxpipe/status/route.js +0 -21
- package/src/app/api/pxpipe/stop/route.js +0 -16
- package/src/app/api/settings/database/route.js +0 -36
- package/src/app/api/settings/proxy-test/route.js +0 -23
- package/src/app/api/settings/require-login/route.js +0 -15
- package/src/app/api/settings/route.js +0 -115
- package/src/app/api/shutdown/route.js +0 -24
- package/src/app/api/tags/route.js +0 -18
- package/src/app/api/terminal/auth/setup/route.js +0 -72
- package/src/app/api/terminal/auth/status/route.js +0 -27
- package/src/app/api/terminal/auth/unlock/route.js +0 -69
- package/src/app/api/terminal/session/[id]/input/route.js +0 -32
- package/src/app/api/terminal/session/[id]/resize/route.js +0 -18
- package/src/app/api/terminal/session/[id]/route.js +0 -37
- package/src/app/api/terminal/session/[id]/stream/route.js +0 -100
- package/src/app/api/terminal/session/route.js +0 -30
- package/src/app/api/translator/console-logs/route.js +0 -24
- package/src/app/api/translator/console-logs/stream/route.js +0 -79
- package/src/app/api/translator/load/route.js +0 -45
- package/src/app/api/translator/save/route.js +0 -44
- package/src/app/api/translator/send/route.js +0 -94
- package/src/app/api/translator/translate/route.js +0 -90
- package/src/app/api/tunnel/disable/route.js +0 -12
- package/src/app/api/tunnel/enable/route.js +0 -16
- package/src/app/api/tunnel/status/route.js +0 -13
- package/src/app/api/tunnel/tailscale-check/route.js +0 -50
- package/src/app/api/tunnel/tailscale-disable/route.js +0 -12
- package/src/app/api/tunnel/tailscale-enable/route.js +0 -12
- package/src/app/api/tunnel/tailscale-install/route.js +0 -72
- package/src/app/api/usage/[connectionId]/route.js +0 -40
- package/src/app/api/usage/aggregate/route.js +0 -126
- package/src/app/api/usage/chart/route.js +0 -21
- package/src/app/api/usage/history/route.js +0 -12
- package/src/app/api/usage/logs/route.js +0 -12
- package/src/app/api/usage/providers/route.js +0 -42
- package/src/app/api/usage/request-details/route.js +0 -57
- package/src/app/api/usage/request-logs/route.js +0 -13
- package/src/app/api/usage/stats/route.js +0 -23
- package/src/app/api/usage/stream/route.js +0 -142
- package/src/app/api/v1/api/chat/route.js +0 -37
- package/src/app/api/v1/audio/speech/route.js +0 -16
- package/src/app/api/v1/audio/transcriptions/route.js +0 -19
- package/src/app/api/v1/audio/voices/route.js +0 -68
- package/src/app/api/v1/chat/completions/route.js +0 -35
- package/src/app/api/v1/embeddings/route.js +0 -21
- package/src/app/api/v1/images/generations/route.js +0 -16
- package/src/app/api/v1/messages/count_tokens/route.js +0 -59
- package/src/app/api/v1/messages/route.js +0 -36
- package/src/app/api/v1/models/[kind]/route.js +0 -55
- package/src/app/api/v1/models/info/route.js +0 -110
- package/src/app/api/v1/models/route.js +0 -497
- package/src/app/api/v1/responses/compact/route.js +0 -55
- package/src/app/api/v1/responses/route.js +0 -30
- package/src/app/api/v1/route.js +0 -1
- package/src/app/api/v1/search/route.js +0 -21
- package/src/app/api/v1/web/fetch/route.js +0 -21
- package/src/app/api/v1beta/models/[...path]/route.js +0 -368
- package/src/app/api/v1beta/models/route.js +0 -44
- package/src/app/api/version/route.js +0 -198
- package/src/app/api/version/shutdown/route.js +0 -15
- package/src/app/api/version/update/route.js +0 -21
- package/src/app/callback/page.js +0 -149
- package/src/app/dashboard/settings/pricing/page.js +0 -174
- package/src/app/globals.css +0 -659
- package/src/app/landing/components/AnimatedBackground.js +0 -57
- package/src/app/landing/components/Features.js +0 -133
- package/src/app/landing/components/FlowAnimation.js +0 -175
- package/src/app/landing/components/Footer.js +0 -61
- package/src/app/landing/components/GetStarted.js +0 -97
- package/src/app/landing/components/HeroSection.js +0 -72
- package/src/app/landing/components/HowItWorks.js +0 -66
- package/src/app/landing/components/Navigation.js +0 -77
- package/src/app/landing/page.js +0 -106
- package/src/app/layout.js +0 -48
- package/src/app/login/page.js +0 -197
- package/src/app/manifest.js +0 -30
- package/src/app/page.js +0 -5
- package/src/dashboardGuard.js +0 -288
- package/src/i18n/RuntimeI18nProvider.js +0 -27
- package/src/i18n/config.js +0 -146
- package/src/i18n/runtime.js +0 -162
- package/src/lib/alerter.js +0 -122
- package/src/lib/appUpdater.js +0 -204
- package/src/lib/auth/dashboardSession.js +0 -68
- package/src/lib/auth/loginLimiter.js +0 -52
- package/src/lib/auth/oidc.js +0 -303
- package/src/lib/auth/terminalSession.js +0 -88
- package/src/lib/autoclaw/constants.js +0 -63
- package/src/lib/consoleLogBuffer.js +0 -79
- package/src/lib/dataDir.js +0 -29
- package/src/lib/db/adapters/betterSqliteAdapter.js +0 -58
- package/src/lib/db/adapters/bunSqliteAdapter.js +0 -65
- package/src/lib/db/adapters/nodeSqliteAdapter.js +0 -86
- package/src/lib/db/adapters/sqljsAdapter.js +0 -207
- package/src/lib/db/backup.js +0 -36
- package/src/lib/db/dataDirMigration.js +0 -52
- package/src/lib/db/driver.js +0 -131
- package/src/lib/db/helpers/jsonCol.js +0 -9
- package/src/lib/db/helpers/kvStore.js +0 -39
- package/src/lib/db/helpers/metaStore.js +0 -22
- package/src/lib/db/index.js +0 -218
- package/src/lib/db/maintenance.js +0 -78
- package/src/lib/db/migrate.js +0 -295
- package/src/lib/db/migrations/001-initial.js +0 -17
- package/src/lib/db/migrations/index.js +0 -10
- package/src/lib/db/paths.js +0 -21
- package/src/lib/db/repos/aliasRepo.js +0 -62
- package/src/lib/db/repos/apiKeysRepo.js +0 -193
- package/src/lib/db/repos/combosRepo.js +0 -73
- package/src/lib/db/repos/connectionsRepo.js +0 -247
- package/src/lib/db/repos/contextFilesRepo.js +0 -124
- package/src/lib/db/repos/disabledModelsRepo.js +0 -56
- package/src/lib/db/repos/nodesRepo.js +0 -95
- package/src/lib/db/repos/pricingRepo.js +0 -108
- package/src/lib/db/repos/proxyPoolsRepo.js +0 -103
- package/src/lib/db/repos/quotaCacheRepo.js +0 -80
- package/src/lib/db/repos/requestDetailsRepo.js +0 -275
- package/src/lib/db/repos/settingsRepo.js +0 -120
- package/src/lib/db/repos/usageRepo.js +0 -935
- package/src/lib/db/schema.js +0 -193
- package/src/lib/db/version.js +0 -21
- package/src/lib/disabledModelsDb.js +0 -4
- package/src/lib/headroom/detect.js +0 -192
- package/src/lib/headroom/process.js +0 -327
- package/src/lib/localDb.js +0 -26
- package/src/lib/mcp/stdioSseBridge.js +0 -198
- package/src/lib/mitmAliasCache.js +0 -46
- package/src/lib/network/connectionProxy.js +0 -187
- package/src/lib/network/initOutboundProxy.js +0 -25
- package/src/lib/network/outboundProxy.js +0 -82
- package/src/lib/network/proxyTest.js +0 -91
- package/src/lib/oauth/constants/oauth.js +0 -337
- package/src/lib/oauth/constants/xai.js +0 -61
- package/src/lib/oauth/providers.js +0 -1821
- package/src/lib/oauth/services/antigravity.js +0 -321
- package/src/lib/oauth/services/antigravityBulkImportManager.js +0 -364
- package/src/lib/oauth/services/autoclawTokenMonitor.js +0 -145
- package/src/lib/oauth/services/bulkImportBrowserEngine.js +0 -756
- package/src/lib/oauth/services/claude.js +0 -136
- package/src/lib/oauth/services/cloudflareAiBulkImportManager.js +0 -503
- package/src/lib/oauth/services/codebuddyAutomation.js +0 -6
- package/src/lib/oauth/services/codebuddyBulkImportManager.js +0 -1033
- package/src/lib/oauth/services/codebuddyCnBulkImportManager.js +0 -2088
- package/src/lib/oauth/services/codebuddyCnPhoneAutomation.js +0 -1294
- package/src/lib/oauth/services/codex.js +0 -144
- package/src/lib/oauth/services/cursor.js +0 -179
- package/src/lib/oauth/services/displayEnv.js +0 -134
- package/src/lib/oauth/services/fiveSimClient.js +0 -567
- package/src/lib/oauth/services/gemini.js +0 -240
- package/src/lib/oauth/services/github.js +0 -225
- package/src/lib/oauth/services/googleAutomation.js +0 -9
- package/src/lib/oauth/services/iflow.js +0 -202
- package/src/lib/oauth/services/index.js +0 -17
- package/src/lib/oauth/services/kiro.js +0 -334
- package/src/lib/oauth/services/kiroBulkImportManager.js +0 -1522
- package/src/lib/oauth/services/kiroConnections.js +0 -93
- package/src/lib/oauth/services/kiroGoogleAutomation.js +0 -2587
- package/src/lib/oauth/services/oauth.js +0 -157
- package/src/lib/oauth/services/openai.js +0 -123
- package/src/lib/oauth/services/proxyUtils.js +0 -26
- package/src/lib/oauth/services/qoder.js +0 -233
- package/src/lib/oauth/services/qoderBulkImportManager.js +0 -340
- package/src/lib/oauth/services/qwen.js +0 -170
- package/src/lib/oauth/services/socksHttpBridge.js +0 -165
- package/src/lib/oauth/services/tempmailClient.js +0 -288
- package/src/lib/oauth/services/xai.js +0 -238
- package/src/lib/oauth/utils/banner.js +0 -63
- package/src/lib/oauth/utils/pkce.js +0 -39
- package/src/lib/oauth/utils/server.js +0 -415
- package/src/lib/oauth/utils/ui.js +0 -48
- package/src/lib/providerConnectionSanitizer.js +0 -180
- package/src/lib/providerNormalization.js +0 -45
- package/src/lib/pxpipe/events.js +0 -125
- package/src/lib/pxpipe/install.js +0 -123
- package/src/lib/pxpipe/loader.js +0 -70
- package/src/lib/pxpipe/service.js +0 -49
- package/src/lib/qoder/constants.js +0 -64
- package/src/lib/qoder/cosy.js +0 -175
- package/src/lib/qoder/encoding.js +0 -55
- package/src/lib/requestDetailsDb.js +0 -4
- package/src/lib/responseCache.js +0 -169
- package/src/lib/safeFetch.js +0 -167
- package/src/lib/systemSpecs.js +0 -167
- package/src/lib/terminal/ptyBridge.py +0 -163
- package/src/lib/terminal/sessionManager.js +0 -434
- package/src/lib/tunnel/cloudflare/cloudflared.js +0 -460
- package/src/lib/tunnel/cloudflare/config.js +0 -9
- package/src/lib/tunnel/cloudflare/healthCheck.js +0 -29
- package/src/lib/tunnel/cloudflare/manager.js +0 -151
- package/src/lib/tunnel/cloudflare/pid.js +0 -23
- package/src/lib/tunnel/index.js +0 -48
- package/src/lib/tunnel/shared/dnsResolver.js +0 -17
- package/src/lib/tunnel/shared/internetCheck.js +0 -26
- package/src/lib/tunnel/shared/state.js +0 -41
- package/src/lib/tunnel/shared/watchdogConfig.js +0 -8
- package/src/lib/tunnel/tailscale/config.js +0 -7
- package/src/lib/tunnel/tailscale/healthCheck.js +0 -29
- package/src/lib/tunnel/tailscale/manager.js +0 -129
- package/src/lib/tunnel/tailscale/tailscale.js +0 -790
- package/src/lib/updater/updater.js +0 -327
- package/src/lib/usage/fetcher.js +0 -208
- package/src/lib/usage/quotaRefresh.js +0 -100
- package/src/lib/usage/quotaService.js +0 -206
- package/src/lib/usageDb.js +0 -7
- package/src/mitm/antigravityIdeVersion.js +0 -50
- package/src/mitm/cert/generate.js +0 -32
- package/src/mitm/cert/install.js +0 -274
- package/src/mitm/cert/rootCA.js +0 -173
- package/src/mitm/config.js +0 -87
- package/src/mitm/dbReader.js +0 -22
- package/src/mitm/dns/dnsConfig.js +0 -266
- package/src/mitm/handlers/antigravity.js +0 -33
- package/src/mitm/handlers/base.js +0 -226
- package/src/mitm/handlers/copilot.js +0 -35
- package/src/mitm/handlers/cursor.js +0 -15
- package/src/mitm/handlers/kiro.js +0 -533
- package/src/mitm/logger.js +0 -106
- package/src/mitm/manager.js +0 -862
- package/src/mitm/paths.js +0 -32
- package/src/mitm/server.js +0 -447
- package/src/mitm/winElevated.js +0 -81
- package/src/models/index.js +0 -38
- package/src/proxy.js +0 -5
- package/src/shared/components/AddCustomEmbeddingModal.js +0 -184
- package/src/shared/components/Avatar.js +0 -88
- package/src/shared/components/Badge.js +0 -54
- package/src/shared/components/BulkAccountAutomationModal.js +0 -640
- package/src/shared/components/Button.js +0 -57
- package/src/shared/components/Card.js +0 -116
- package/src/shared/components/ChangelogModal.js +0 -108
- package/src/shared/components/CodeBuddyCnPhoneRegisterModal.js +0 -563
- package/src/shared/components/CodeBuddyQuotaCookieModal.js +0 -109
- package/src/shared/components/ComboFormModal.js +0 -176
- package/src/shared/components/CursorAuthModal.js +0 -213
- package/src/shared/components/Drawer.js +0 -82
- package/src/shared/components/EditConnectionModal.js +0 -287
- package/src/shared/components/Footer.js +0 -132
- package/src/shared/components/GitLabAuthModal.js +0 -194
- package/src/shared/components/Header.js +0 -399
- package/src/shared/components/HeaderLanguage.js +0 -48
- package/src/shared/components/HeaderMenu.js +0 -127
- package/src/shared/components/IFlowCookieModal.js +0 -132
- package/src/shared/components/Input.js +0 -76
- package/src/shared/components/KiroAuthModal.js +0 -1169
- package/src/shared/components/KiroOAuthWrapper.js +0 -150
- package/src/shared/components/KiroSocialOAuthModal.js +0 -205
- package/src/shared/components/LanguageSwitcher.js +0 -192
- package/src/shared/components/Loading.js +0 -75
- package/src/shared/components/ManualConfigModal.js +0 -44
- package/src/shared/components/McpMarketplaceModal.js +0 -255
- package/src/shared/components/Modal.js +0 -196
- package/src/shared/components/ModelSelectModal.js +0 -547
- package/src/shared/components/NoAuthProxyCard.js +0 -134
- package/src/shared/components/OAuthModal.js +0 -709
- package/src/shared/components/Pagination.js +0 -150
- package/src/shared/components/PricingModal.js +0 -209
- package/src/shared/components/ProviderIcon.js +0 -68
- package/src/shared/components/ProviderInfoCard.js +0 -82
- package/src/shared/components/RequestLogger.js +0 -122
- package/src/shared/components/SegmentedControl.js +0 -53
- package/src/shared/components/Select.js +0 -67
- package/src/shared/components/Sidebar.js +0 -486
- package/src/shared/components/ThemeProvider.js +0 -15
- package/src/shared/components/ThemeToggle.js +0 -42
- package/src/shared/components/Toggle.js +0 -95
- package/src/shared/components/Tooltip.js +0 -25
- package/src/shared/components/UsageStats.js +0 -571
- package/src/shared/components/index.js +0 -46
- package/src/shared/components/layouts/AuthLayout.js +0 -29
- package/src/shared/components/layouts/DashboardLayout.js +0 -121
- package/src/shared/components/layouts/index.js +0 -4
- package/src/shared/constants/automationProviders.js +0 -23
- package/src/shared/constants/cliTools.js +0 -397
- package/src/shared/constants/colors.js +0 -77
- package/src/shared/constants/config.js +0 -98
- package/src/shared/constants/coworkPlugins.js +0 -75
- package/src/shared/constants/index.js +0 -4
- package/src/shared/constants/locales.js +0 -36
- package/src/shared/constants/mitmToolHosts.js +0 -12
- package/src/shared/constants/models.js +0 -38
- package/src/shared/constants/pricing.js +0 -311
- package/src/shared/constants/providers.js +0 -450
- package/src/shared/constants/ttsProviders.js +0 -138
- package/src/shared/hooks/index.js +0 -2
- package/src/shared/hooks/useCopyToClipboard.js +0 -43
- package/src/shared/hooks/useModelLockUntil.js +0 -18
- package/src/shared/hooks/useTheme.js +0 -60
- package/src/shared/services/bootstrap.js +0 -12
- package/src/shared/services/initializeApp.js +0 -294
- package/src/shared/utils/api.js +0 -93
- package/src/shared/utils/apiKey.js +0 -98
- package/src/shared/utils/asyncPolling.js +0 -27
- package/src/shared/utils/clineAuth.js +0 -37
- package/src/shared/utils/cn.js +0 -11
- package/src/shared/utils/codexCliConfig.js +0 -44
- package/src/shared/utils/connectionStatus.js +0 -168
- package/src/shared/utils/dashboardMedia.js +0 -19
- package/src/shared/utils/index.js +0 -40
- package/src/shared/utils/machine.js +0 -6
- package/src/shared/utils/machineId.js +0 -66
- package/src/shared/utils/modelLockTimer.js +0 -32
- package/src/shared/utils/providerModelsFetcher.js +0 -30
- package/src/shared/utils/usageStats.js +0 -10
- package/src/sse/handlers/chat.js +0 -445
- package/src/sse/handlers/embeddings.js +0 -141
- package/src/sse/handlers/fetch.js +0 -213
- package/src/sse/handlers/imageGeneration.js +0 -142
- package/src/sse/handlers/search.js +0 -206
- package/src/sse/handlers/streamFailure.js +0 -34
- package/src/sse/handlers/stt.js +0 -88
- package/src/sse/handlers/tts.js +0 -114
- package/src/sse/services/auth.js +0 -576
- package/src/sse/services/codexGateway.js +0 -215
- package/src/sse/services/model.js +0 -99
- package/src/sse/services/tokenRefresh.js +0 -319
- package/src/sse/utils/logger.js +0 -75
- package/src/store/headerSearchStore.js +0 -19
- package/src/store/index.js +0 -6
- package/src/store/notificationStore.js +0 -45
- package/src/store/providerStore.js +0 -55
- package/src/store/settingsStore.js +0 -51
- package/src/store/themeStore.js +0 -54
- package/src/store/userStore.js +0 -20
- package/start.sh +0 -4
- /package/cli/app/.next-cli-build/static/{SC3btW1lCuB9q-iyIwwWK → sRgS_5eNahHOIlOLEqVvI}/_buildManifest.js +0 -0
- /package/cli/app/.next-cli-build/static/{SC3btW1lCuB9q-iyIwwWK → sRgS_5eNahHOIlOLEqVvI}/_ssgManifest.js +0 -0
|
@@ -1,2587 +0,0 @@
|
|
|
1
|
-
const DEFAULT_SHORT_TIMEOUT_MS = 90_000;
|
|
2
|
-
const DEFAULT_MANUAL_TIMEOUT_MS = 15 * 60_000;
|
|
3
|
-
|
|
4
|
-
// Comma-separated CSS selector. Includes Google's stable ID, mobile/legacy form
|
|
5
|
-
// names, and aria-label fallbacks for English + Indonesian. Multi-language
|
|
6
|
-
// aria-label support matters because Google renders the form in the user's
|
|
7
|
-
// browser locale (so "Email or phone" becomes "Email atau nomor telepon" for
|
|
8
|
-
// id-ID accounts and similar for other locales).
|
|
9
|
-
export const EMAIL_INPUT_SELECTOR = [
|
|
10
|
-
'input[type="email"]',
|
|
11
|
-
'input[autocomplete="username"]',
|
|
12
|
-
'input#identifierId',
|
|
13
|
-
'input[name="identifier"]',
|
|
14
|
-
'input[name="Email"]',
|
|
15
|
-
'input[type="text"][autofocus]',
|
|
16
|
-
'input[aria-label*="Email" i]',
|
|
17
|
-
'input[aria-label*="email" i]',
|
|
18
|
-
'input[aria-label*="phone" i]',
|
|
19
|
-
'input[aria-label*="telepon" i]',
|
|
20
|
-
].join(", ");
|
|
21
|
-
|
|
22
|
-
export const PASSWORD_INPUT_SELECTOR = [
|
|
23
|
-
'input[type="password"]',
|
|
24
|
-
'input[name="Passwd"]',
|
|
25
|
-
'input[name="password"]',
|
|
26
|
-
'input[aria-label*="Password" i]',
|
|
27
|
-
'input[aria-label*="password" i]',
|
|
28
|
-
'input[aria-label*="Sandi" i]',
|
|
29
|
-
'input[aria-label*="kata sandi" i]',
|
|
30
|
-
].join(", ");
|
|
31
|
-
|
|
32
|
-
const NEXT_BUTTON_SELECTORS = [
|
|
33
|
-
'button:has-text("Next")',
|
|
34
|
-
'button:has-text("Berikutnya")',
|
|
35
|
-
'button:has-text("Continue")',
|
|
36
|
-
'div[role="button"]:has-text("Next")',
|
|
37
|
-
'div[role="button"]:has-text("Berikutnya")',
|
|
38
|
-
'#identifierNext button',
|
|
39
|
-
'#passwordNext button',
|
|
40
|
-
];
|
|
41
|
-
|
|
42
|
-
const APPROVE_BUTTON_SELECTORS = [
|
|
43
|
-
'#submit_approve_access',
|
|
44
|
-
'#submit_approve_access button',
|
|
45
|
-
'#confirm',
|
|
46
|
-
'form#tos_form input[type="submit"]',
|
|
47
|
-
'button[jsname]:has-text("Allow")',
|
|
48
|
-
'button:has-text("Allow")',
|
|
49
|
-
'[role="button"]:has-text("Allow")',
|
|
50
|
-
'input[type="submit"][value="Allow"]',
|
|
51
|
-
'input[type="button"][value="Allow"]',
|
|
52
|
-
'button[jsname]:has-text("Izinkan")',
|
|
53
|
-
'button:has-text("Izinkan")',
|
|
54
|
-
'[role="button"]:has-text("Izinkan")',
|
|
55
|
-
'button:has-text("Continue")',
|
|
56
|
-
'button:has-text("Next")',
|
|
57
|
-
'button:has-text("Yes")',
|
|
58
|
-
'button:has-text("Accept")',
|
|
59
|
-
'button:has-text("Lanjutkan")',
|
|
60
|
-
'button:has-text("Berikutnya")',
|
|
61
|
-
'button:has-text("Setuju")',
|
|
62
|
-
'button:has-text("Saya mengerti")',
|
|
63
|
-
'button:has-text("Oke")',
|
|
64
|
-
'button:has-text("OK")',
|
|
65
|
-
'button:has-text("Got it")',
|
|
66
|
-
'button:has-text("I understand")',
|
|
67
|
-
'div[role="button"]:has-text("Continue")',
|
|
68
|
-
'div[role="button"]:has-text("Next")',
|
|
69
|
-
'div[role="button"]:has-text("Allow")',
|
|
70
|
-
'div[role="button"]:has-text("Lanjutkan")',
|
|
71
|
-
'div[role="button"]:has-text("Berikutnya")',
|
|
72
|
-
'div[role="button"]:has-text("Izinkan")',
|
|
73
|
-
'div[role="button"]:has-text("Setuju")',
|
|
74
|
-
'div[role="button"]:has-text("Saya mengerti")',
|
|
75
|
-
'div[role="button"]:has-text("Oke")',
|
|
76
|
-
'div[role="button"]:has-text("OK")',
|
|
77
|
-
'div[role="button"]:has-text("Got it")',
|
|
78
|
-
'div[role="button"]:has-text("I understand")',
|
|
79
|
-
'input[type="button"][value="Saya mengerti"]',
|
|
80
|
-
'input[type="submit"][value="Saya mengerti"]',
|
|
81
|
-
];
|
|
82
|
-
|
|
83
|
-
const SKIP_BUTTON_SELECTORS = [
|
|
84
|
-
'button:has-text("Skip")',
|
|
85
|
-
'button:has-text("Lewati")',
|
|
86
|
-
'button:has-text("Not now")',
|
|
87
|
-
'button:has-text("Bukan sekarang")',
|
|
88
|
-
'button:has-text("No thanks")',
|
|
89
|
-
'button:has-text("Tidak sekarang")',
|
|
90
|
-
'div[role="button"]:has-text("Skip")',
|
|
91
|
-
'div[role="button"]:has-text("Not now")',
|
|
92
|
-
];
|
|
93
|
-
|
|
94
|
-
const GOOGLE_LOGIN_BUTTON_SELECTORS = [
|
|
95
|
-
'#social-google',
|
|
96
|
-
'a#social-google',
|
|
97
|
-
'a:has-text("Sign up with Google")',
|
|
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")',
|
|
102
|
-
'button:has-text("Sign up with Google")',
|
|
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")',
|
|
107
|
-
// Cloudflare dash: visible label is just "Google", aria is "Continue with Google"
|
|
108
|
-
'button[aria-label*="Continue with Google" i]',
|
|
109
|
-
'button[aria-label*="Google" i]',
|
|
110
|
-
'button:has-text("Google")',
|
|
111
|
-
'a:has-text("Google")',
|
|
112
|
-
'div[role="button"]:has-text("Continue with Google")',
|
|
113
|
-
'div[role="button"]:has-text("Login with Google")',
|
|
114
|
-
'div[role="button"]:has-text("Google")',
|
|
115
|
-
'span:has-text("Continue with Google")',
|
|
116
|
-
'span:has-text("Login with Google")',
|
|
117
|
-
'span:has-text("Google")',
|
|
118
|
-
'[aria-label*="Google" i]',
|
|
119
|
-
'[data-provider*="google" i]',
|
|
120
|
-
// xAI / Grok device + account pages
|
|
121
|
-
'button:has-text("Login with Google")',
|
|
122
|
-
'button:has-text("Continue with Google")',
|
|
123
|
-
'[data-testid*="google" i]',
|
|
124
|
-
];
|
|
125
|
-
|
|
126
|
-
/** OneTrust / cookie walls that block the first Google click (Cloudflare login). */
|
|
127
|
-
const COOKIE_DISMISS_SELECTORS = [
|
|
128
|
-
'#onetrust-accept-btn-handler',
|
|
129
|
-
'#onetrust-reject-all-handler',
|
|
130
|
-
'#accept-recommended-btn-handler',
|
|
131
|
-
'button:has-text("Allow All")',
|
|
132
|
-
'button:has-text("Reject All")',
|
|
133
|
-
'button:has-text("Accept All")',
|
|
134
|
-
'button:has-text("Accept all")',
|
|
135
|
-
'button:has-text("Confirm My Choices")',
|
|
136
|
-
];
|
|
137
|
-
|
|
138
|
-
const TERMS_CHECKBOX_SELECTORS = [
|
|
139
|
-
'#agree-policy-account',
|
|
140
|
-
'#agree-policy',
|
|
141
|
-
'#agree-policy-sso',
|
|
142
|
-
'input[type="checkbox"][id*="agree" i]',
|
|
143
|
-
'input[type="checkbox"][name*="agree" i]',
|
|
144
|
-
'input[type="checkbox"][id*="policy" i]',
|
|
145
|
-
'input[type="checkbox"][name*="policy" i]',
|
|
146
|
-
'input[type="checkbox"][id*="terms" i]',
|
|
147
|
-
'input[type="checkbox"][name*="terms" i]',
|
|
148
|
-
'.login-checkbox input[type="checkbox"]',
|
|
149
|
-
'[class*="checkbox"] input[type="checkbox"]',
|
|
150
|
-
'[class*="agree"] input[type="checkbox"]',
|
|
151
|
-
'input[type="checkbox"]',
|
|
152
|
-
];
|
|
153
|
-
|
|
154
|
-
const PRIVACY_CONFIRM_BUTTON_SELECTORS = [
|
|
155
|
-
'.ui-dialog button:has-text("Confirm")',
|
|
156
|
-
'dialog button:has-text("Confirm")',
|
|
157
|
-
'button:has-text("Confirm")',
|
|
158
|
-
'button:has-text("I agree")',
|
|
159
|
-
'button:has-text("Agree")',
|
|
160
|
-
'button:has-text("\u540c\u610f")',
|
|
161
|
-
'button:has-text("\u786e\u8ba4")',
|
|
162
|
-
];
|
|
163
|
-
|
|
164
|
-
const PROVIDER_ONBOARDING_ACTION_SELECTORS = [
|
|
165
|
-
'button:has-text("Continue")',
|
|
166
|
-
'[role="button"]:has-text("Continue")',
|
|
167
|
-
'button:has-text("Get started")',
|
|
168
|
-
'button:has-text("GET STARTED")',
|
|
169
|
-
'input[type="submit"][value="GET STARTED"]',
|
|
170
|
-
'button:has-text("Start")',
|
|
171
|
-
'button:has-text("Confirm")',
|
|
172
|
-
'button:has-text("Done")',
|
|
173
|
-
'button:has-text("Next")',
|
|
174
|
-
'button:has-text("Skip")',
|
|
175
|
-
'button:has-text("Not now")',
|
|
176
|
-
'button:has-text("Save")',
|
|
177
|
-
'button:has-text("Create")',
|
|
178
|
-
'button:has-text("Enter")',
|
|
179
|
-
'button:has-text("Launch")',
|
|
180
|
-
'button:has-text("Use CodeBuddy")',
|
|
181
|
-
'button:has-text("Go to CodeBuddy")',
|
|
182
|
-
];
|
|
183
|
-
|
|
184
|
-
const PROVIDER_REGION_TRIGGER_SELECTORS = [
|
|
185
|
-
'select',
|
|
186
|
-
'[role="combobox"]',
|
|
187
|
-
'.page-region [role="combobox"]',
|
|
188
|
-
'.page-region .t-select',
|
|
189
|
-
'.page-region [class*="t-select"]',
|
|
190
|
-
'.page-region [class*="select"]',
|
|
191
|
-
'.page-region input[placeholder]',
|
|
192
|
-
'button:has-text("Region")',
|
|
193
|
-
'[role="button"]:has-text("Region")',
|
|
194
|
-
'button:has-text("Select region")',
|
|
195
|
-
'[role="button"]:has-text("Select region")',
|
|
196
|
-
'button:has-text("Data region")',
|
|
197
|
-
'[aria-label*="region" i]',
|
|
198
|
-
'[placeholder*="region" i]',
|
|
199
|
-
];
|
|
200
|
-
|
|
201
|
-
const PROVIDER_REGION_OPTION_SELECTORS = [
|
|
202
|
-
'text=/^Indonesia$/i',
|
|
203
|
-
'text=/^ID$/i',
|
|
204
|
-
'text=/^Singapore$/i',
|
|
205
|
-
'text=/^SG$/i',
|
|
206
|
-
'text=/^Japan$/i',
|
|
207
|
-
'text=/^JP$/i',
|
|
208
|
-
'text=/^Thailand$/i',
|
|
209
|
-
'text=/^TH$/i',
|
|
210
|
-
'text=/^Global$/i',
|
|
211
|
-
'text=/^International$/i',
|
|
212
|
-
'text=/^United States$/i',
|
|
213
|
-
'text=/^US$/i',
|
|
214
|
-
'text=/^Asia Pacific$/i',
|
|
215
|
-
'text=/^Hong Kong$/i',
|
|
216
|
-
'text=/^Default$/i',
|
|
217
|
-
];
|
|
218
|
-
|
|
219
|
-
const PROVIDER_ONBOARDING_INPUT_DEFAULTS = [
|
|
220
|
-
{ selector: 'input[name*="workspace" i]', value: "Default" },
|
|
221
|
-
{ selector: 'input[placeholder*="workspace" i]', value: "Default" },
|
|
222
|
-
{ selector: 'input[name*="team" i]', value: "Default" },
|
|
223
|
-
{ selector: 'input[placeholder*="team" i]', value: "Default" },
|
|
224
|
-
{ selector: 'input[name*="name" i]', value: "Default" },
|
|
225
|
-
{ selector: 'input[placeholder*="name" i]', value: "Default" },
|
|
226
|
-
];
|
|
227
|
-
|
|
228
|
-
const INVALID_CREDENTIAL_MARKERS = [
|
|
229
|
-
"wrong password",
|
|
230
|
-
"incorrect password",
|
|
231
|
-
"couldn't find your google account",
|
|
232
|
-
"couldn\u2019t find your google account",
|
|
233
|
-
"enter a valid email",
|
|
234
|
-
"couldn\u2019t sign you in",
|
|
235
|
-
"couldn't sign you in",
|
|
236
|
-
"invalid email or password",
|
|
237
|
-
"password is incorrect",
|
|
238
|
-
];
|
|
239
|
-
|
|
240
|
-
const MANUAL_ASSIST_MARKERS = [
|
|
241
|
-
"2-step verification",
|
|
242
|
-
"2-step verification required",
|
|
243
|
-
"verify it\u2019s you",
|
|
244
|
-
"verify it's you",
|
|
245
|
-
"check your phone",
|
|
246
|
-
"confirm it\u2019s you",
|
|
247
|
-
"confirm it's you",
|
|
248
|
-
"recovery email",
|
|
249
|
-
"recovery phone",
|
|
250
|
-
"suspicious sign-in prevented",
|
|
251
|
-
"unusual activity detected",
|
|
252
|
-
"captcha",
|
|
253
|
-
"i'm not a robot",
|
|
254
|
-
"im not a robot",
|
|
255
|
-
"not a robot",
|
|
256
|
-
"recaptcha",
|
|
257
|
-
"select all images",
|
|
258
|
-
"select all squares",
|
|
259
|
-
"try again later",
|
|
260
|
-
"browser or app may not be secure",
|
|
261
|
-
"try using a different browser",
|
|
262
|
-
"couldn\u2019t sign you in",
|
|
263
|
-
"couldn't sign you in",
|
|
264
|
-
"this browser or app may not be secure",
|
|
265
|
-
];
|
|
266
|
-
|
|
267
|
-
const RESTRICTED_ACCOUNT_MARKERS = [
|
|
268
|
-
"restricted",
|
|
269
|
-
"account has been restricted",
|
|
270
|
-
"account is restricted",
|
|
271
|
-
"account has been suspended",
|
|
272
|
-
"account is suspended",
|
|
273
|
-
"account has been disabled",
|
|
274
|
-
"account is disabled",
|
|
275
|
-
"account has been banned",
|
|
276
|
-
"account is banned",
|
|
277
|
-
"access denied",
|
|
278
|
-
"account blocked",
|
|
279
|
-
"your account has been",
|
|
280
|
-
"violation of terms",
|
|
281
|
-
"terms of service violation",
|
|
282
|
-
"temporarily locked",
|
|
283
|
-
"permanently locked",
|
|
284
|
-
"account locked",
|
|
285
|
-
"akun dibatasi",
|
|
286
|
-
"akun diblokir",
|
|
287
|
-
"akun ditangguhkan",
|
|
288
|
-
];
|
|
289
|
-
|
|
290
|
-
const GOOGLE_ONBOARDING_MARKERS = [
|
|
291
|
-
"welcome to your new google account",
|
|
292
|
-
"selamat datang di akun google baru anda",
|
|
293
|
-
"welcome to your new account",
|
|
294
|
-
"selamat datang di akun baru",
|
|
295
|
-
"privacy and terms",
|
|
296
|
-
"privasi dan persyaratan",
|
|
297
|
-
"personalize your google services",
|
|
298
|
-
"personalisasikan layanan google anda",
|
|
299
|
-
"add recovery phone",
|
|
300
|
-
"tambahkan nomor telepon pemulihan",
|
|
301
|
-
"choose your settings",
|
|
302
|
-
"pilih setelan anda",
|
|
303
|
-
];
|
|
304
|
-
|
|
305
|
-
const GOOGLE_WORKSPACE_WELCOME_MARKERS = [
|
|
306
|
-
"welcome to your new account",
|
|
307
|
-
"selamat datang di akun baru",
|
|
308
|
-
"your administrator decides which",
|
|
309
|
-
"administrator anda memutuskan layanan",
|
|
310
|
-
"your organisation administrator manages",
|
|
311
|
-
"your organization administrator manages",
|
|
312
|
-
];
|
|
313
|
-
|
|
314
|
-
const KIRO_CALLBACK_PREFIX = "kiro://kiro.kiroAgent/authenticate-success";
|
|
315
|
-
|
|
316
|
-
function parseCallbackUrl(rawUrl) {
|
|
317
|
-
if (!rawUrl || !rawUrl.startsWith(KIRO_CALLBACK_PREFIX)) return null;
|
|
318
|
-
|
|
319
|
-
const queryIndex = rawUrl.indexOf("?");
|
|
320
|
-
const params = new URLSearchParams(queryIndex >= 0 ? rawUrl.slice(queryIndex + 1) : "");
|
|
321
|
-
const code = params.get("code");
|
|
322
|
-
const state = params.get("state");
|
|
323
|
-
|
|
324
|
-
if (!code) return null;
|
|
325
|
-
|
|
326
|
-
return {
|
|
327
|
-
callbackUrl: rawUrl,
|
|
328
|
-
code,
|
|
329
|
-
state,
|
|
330
|
-
};
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
function getInteractionScopes(page) {
|
|
334
|
-
const frames = typeof page.frames === "function" ? page.frames() : [];
|
|
335
|
-
return [page, ...frames.filter((frame) => frame !== page.mainFrame?.())];
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
async function clickFirstVisible(page, selectors) {
|
|
339
|
-
for (const scope of getInteractionScopes(page)) {
|
|
340
|
-
for (const selector of selectors) {
|
|
341
|
-
const locator = scope.locator(selector).first();
|
|
342
|
-
const count = await locator.count().catch(() => 0);
|
|
343
|
-
if (!count) continue;
|
|
344
|
-
|
|
345
|
-
const visible = await locator.isVisible().catch(() => false);
|
|
346
|
-
if (!visible) continue;
|
|
347
|
-
|
|
348
|
-
await locator.click({ timeout: 5_000 }).catch(() => null);
|
|
349
|
-
return true;
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
return false;
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
async function clickFirstActionable(page, selectors) {
|
|
357
|
-
for (const scope of getInteractionScopes(page)) {
|
|
358
|
-
for (const selector of selectors) {
|
|
359
|
-
const locator = scope.locator(selector).first();
|
|
360
|
-
const count = await locator.count().catch(() => 0);
|
|
361
|
-
if (!count) continue;
|
|
362
|
-
|
|
363
|
-
await locator.scrollIntoViewIfNeeded().catch(() => null);
|
|
364
|
-
|
|
365
|
-
const visible = await locator.isVisible().catch(() => false);
|
|
366
|
-
if (!visible) continue;
|
|
367
|
-
|
|
368
|
-
const enabled = await locator.isEnabled().catch(() => true);
|
|
369
|
-
if (!enabled) continue;
|
|
370
|
-
|
|
371
|
-
const clicked = await locator.click({ timeout: 5_000 }).then(() => true).catch(() => false);
|
|
372
|
-
if (clicked) return true;
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
return false;
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
async function checkFirstVisible(page, selectors) {
|
|
380
|
-
for (const scope of getInteractionScopes(page)) {
|
|
381
|
-
for (const selector of selectors) {
|
|
382
|
-
const locator = scope.locator(selector).first();
|
|
383
|
-
const count = await locator.count().catch(() => 0);
|
|
384
|
-
if (!count) continue;
|
|
385
|
-
|
|
386
|
-
const checked = await locator.isChecked().catch(() => false);
|
|
387
|
-
if (checked) return true;
|
|
388
|
-
|
|
389
|
-
const visible = await locator.isVisible().catch(() => false);
|
|
390
|
-
const didCheck = visible
|
|
391
|
-
? await locator.check({ force: true, timeout: 5_000 }).then(() => true).catch(() => false)
|
|
392
|
-
: false;
|
|
393
|
-
if (didCheck) return true;
|
|
394
|
-
|
|
395
|
-
const clicked = visible
|
|
396
|
-
? await locator.click({ force: true, timeout: 5_000 }).then(() => true).catch(() => false)
|
|
397
|
-
: false;
|
|
398
|
-
if (clicked) return true;
|
|
399
|
-
|
|
400
|
-
const domChecked = await scope.evaluate((candidateSelector) => {
|
|
401
|
-
const input = document.querySelector(candidateSelector);
|
|
402
|
-
if (!(input instanceof HTMLInputElement)) return false;
|
|
403
|
-
input.checked = true;
|
|
404
|
-
input.dispatchEvent(new Event("input", { bubbles: true }));
|
|
405
|
-
input.dispatchEvent(new Event("change", { bubbles: true }));
|
|
406
|
-
return input.checked;
|
|
407
|
-
}, selector).catch(() => false);
|
|
408
|
-
if (domChecked) return true;
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
return false;
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
async function getFirstVisibleLocator(page, selector) {
|
|
416
|
-
for (const scope of getInteractionScopes(page)) {
|
|
417
|
-
const locator = scope.locator(selector).first();
|
|
418
|
-
const count = await locator.count().catch(() => 0);
|
|
419
|
-
if (!count) continue;
|
|
420
|
-
|
|
421
|
-
const visible = await locator.isVisible().catch(() => false);
|
|
422
|
-
if (!visible) continue;
|
|
423
|
-
|
|
424
|
-
return locator;
|
|
425
|
-
}
|
|
426
|
-
|
|
427
|
-
return null;
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
async function waitForFirstVisibleLocator(page, selector, { timeout = 15_000, pollInterval = 150 } = {}) {
|
|
431
|
-
const deadline = Date.now() + timeout;
|
|
432
|
-
while (Date.now() < deadline) {
|
|
433
|
-
const found = await getFirstVisibleLocator(page, selector);
|
|
434
|
-
if (found) return found;
|
|
435
|
-
const remaining = deadline - Date.now();
|
|
436
|
-
if (remaining <= 0) break;
|
|
437
|
-
await new Promise((r) => setTimeout(r, Math.min(pollInterval, remaining)));
|
|
438
|
-
}
|
|
439
|
-
return null;
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
/** Tiny yield only — never use multi-second sleeps for “maybe page will load”. */
|
|
443
|
-
function yieldMs(ms = 50) {
|
|
444
|
-
return new Promise((r) => setTimeout(r, ms));
|
|
445
|
-
}
|
|
446
|
-
|
|
447
|
-
/**
|
|
448
|
-
* Wait until a condition is true, polling fast. Replaces fixed sleep after clicks.
|
|
449
|
-
* @returns {Promise<boolean>} true if condition met before timeout
|
|
450
|
-
*/
|
|
451
|
-
async function waitUntil(checkFn, { timeout = 8_000, interval = 100 } = {}) {
|
|
452
|
-
const deadline = Date.now() + timeout;
|
|
453
|
-
while (Date.now() < deadline) {
|
|
454
|
-
try {
|
|
455
|
-
if (await checkFn()) return true;
|
|
456
|
-
} catch {
|
|
457
|
-
/* retry */
|
|
458
|
-
}
|
|
459
|
-
await yieldMs(interval);
|
|
460
|
-
}
|
|
461
|
-
return false;
|
|
462
|
-
}
|
|
463
|
-
|
|
464
|
-
function isGoogleHostname(url) {
|
|
465
|
-
try {
|
|
466
|
-
const host = new URL(url).hostname;
|
|
467
|
-
return host === "accounts.google.com"
|
|
468
|
-
|| host.endsWith(".accounts.google.com")
|
|
469
|
-
|| /^accounts\.google\./i.test(host);
|
|
470
|
-
} catch {
|
|
471
|
-
return false;
|
|
472
|
-
}
|
|
473
|
-
}
|
|
474
|
-
|
|
475
|
-
/** After navigation/click: wait for URL change or next UI, not a fixed sleep. */
|
|
476
|
-
async function waitForPageAdvance(page, {
|
|
477
|
-
fromUrl = "",
|
|
478
|
-
urlMatch = null,
|
|
479
|
-
selector = null,
|
|
480
|
-
timeout = 8_000,
|
|
481
|
-
} = {}) {
|
|
482
|
-
const startUrl = fromUrl || page.url?.() || "";
|
|
483
|
-
return waitUntil(async () => {
|
|
484
|
-
const url = page.url?.() || "";
|
|
485
|
-
if (urlMatch) {
|
|
486
|
-
if (typeof urlMatch === "function" && urlMatch(url)) return true;
|
|
487
|
-
if (urlMatch instanceof RegExp && urlMatch.test(url)) return true;
|
|
488
|
-
}
|
|
489
|
-
if (url && url !== startUrl && !url.startsWith("about:")) return true;
|
|
490
|
-
if (selector) {
|
|
491
|
-
const found = await getFirstVisibleLocator(page, selector);
|
|
492
|
-
if (found) return true;
|
|
493
|
-
}
|
|
494
|
-
return false;
|
|
495
|
-
}, { timeout, interval: 80 });
|
|
496
|
-
}
|
|
497
|
-
|
|
498
|
-
async function fillInputResilient(locator, value, { timeout = 15_000 } = {}) {
|
|
499
|
-
if (!locator || value == null) return false;
|
|
500
|
-
|
|
501
|
-
// Prefer fill() first (fast); slow type is only a fallback for React
|
|
502
|
-
// controlled fields that reject programmatic fill.
|
|
503
|
-
try {
|
|
504
|
-
await locator.click({ timeout: 3_000 });
|
|
505
|
-
} catch {
|
|
506
|
-
/* noop */
|
|
507
|
-
}
|
|
508
|
-
try {
|
|
509
|
-
await locator.fill(String(value), { timeout: Math.min(timeout, 8_000) });
|
|
510
|
-
const observed = await locator.inputValue().catch(() => "");
|
|
511
|
-
if (observed === value) return true;
|
|
512
|
-
} catch {
|
|
513
|
-
/* fall through to typed input */
|
|
514
|
-
}
|
|
515
|
-
|
|
516
|
-
try {
|
|
517
|
-
await locator.fill("", { timeout: 2_000 });
|
|
518
|
-
} catch {
|
|
519
|
-
/* noop */
|
|
520
|
-
}
|
|
521
|
-
try {
|
|
522
|
-
// Light humanization only if fill failed — 15–35ms/key (was 40–120ms).
|
|
523
|
-
const delay = Math.floor(15 + Math.random() * 20);
|
|
524
|
-
await locator.type(String(value), { delay, timeout });
|
|
525
|
-
} catch {
|
|
526
|
-
try {
|
|
527
|
-
await locator.fill(String(value), { timeout });
|
|
528
|
-
} catch {
|
|
529
|
-
return false;
|
|
530
|
-
}
|
|
531
|
-
}
|
|
532
|
-
|
|
533
|
-
let observed = "";
|
|
534
|
-
try {
|
|
535
|
-
observed = await locator.inputValue();
|
|
536
|
-
} catch {
|
|
537
|
-
observed = "";
|
|
538
|
-
}
|
|
539
|
-
return observed === value;
|
|
540
|
-
}
|
|
541
|
-
|
|
542
|
-
function parseSelectorList(selector) {
|
|
543
|
-
return String(selector || "")
|
|
544
|
-
.split(",")
|
|
545
|
-
.map((s) => s.trim())
|
|
546
|
-
.filter(Boolean);
|
|
547
|
-
}
|
|
548
|
-
|
|
549
|
-
async function readPageText(page) {
|
|
550
|
-
const chunks = [];
|
|
551
|
-
for (const scope of getInteractionScopes(page)) {
|
|
552
|
-
try {
|
|
553
|
-
chunks.push(await scope.evaluate(() => document.body?.innerText || ""));
|
|
554
|
-
} catch {
|
|
555
|
-
// Cross-origin frames can be unreadable; ignore them.
|
|
556
|
-
}
|
|
557
|
-
}
|
|
558
|
-
return chunks.join("\n");
|
|
559
|
-
}
|
|
560
|
-
|
|
561
|
-
function includesAny(text, markers) {
|
|
562
|
-
const normalized = String(text || "").toLowerCase();
|
|
563
|
-
return markers.some((marker) => normalized.includes(marker));
|
|
564
|
-
}
|
|
565
|
-
|
|
566
|
-
function isGoogleAuthPage(page) {
|
|
567
|
-
try {
|
|
568
|
-
const url = new URL(page.url());
|
|
569
|
-
return url.hostname === "accounts.google.com"
|
|
570
|
-
|| url.hostname.endsWith(".accounts.google.com")
|
|
571
|
-
|| /^accounts\.google\./i.test(url.hostname);
|
|
572
|
-
} catch {
|
|
573
|
-
return false;
|
|
574
|
-
}
|
|
575
|
-
}
|
|
576
|
-
|
|
577
|
-
/** Fast bulk path: skip multi-second sleeps (Grok, Cloudflare, etc.). */
|
|
578
|
-
function isGrokish(serviceLabel) {
|
|
579
|
-
return /grok|cloudflare/i.test(String(serviceLabel || ""));
|
|
580
|
-
}
|
|
581
|
-
|
|
582
|
-
function isCloudflareLoginUrl(url) {
|
|
583
|
-
try {
|
|
584
|
-
const u = new URL(url || "");
|
|
585
|
-
return u.hostname === "dash.cloudflare.com" && u.pathname.includes("/login");
|
|
586
|
-
} catch {
|
|
587
|
-
return false;
|
|
588
|
-
}
|
|
589
|
-
}
|
|
590
|
-
|
|
591
|
-
async function dismissCookieBanners(page, reportStep) {
|
|
592
|
-
// Cookie / OneTrust modals steal the first clicks (CF login shows "Allow All").
|
|
593
|
-
// Fast path: one scan — must stay cheap because the main automation loop
|
|
594
|
-
// calls this on every tick (dashboard harvest must not burn 2s here).
|
|
595
|
-
for (const selector of COOKIE_DISMISS_SELECTORS) {
|
|
596
|
-
try {
|
|
597
|
-
const loc = page.locator(selector).first();
|
|
598
|
-
if (await loc.isVisible({ timeout: 100 }).catch(() => false)) {
|
|
599
|
-
// noWaitAfter: banner click must not wait on any incidental navigation
|
|
600
|
-
await loc.click({ timeout: 2_000, noWaitAfter: true }).catch(() => null);
|
|
601
|
-
reportStep?.("dismissing_cookies", "Dismissed cookie / privacy banner");
|
|
602
|
-
return true;
|
|
603
|
-
}
|
|
604
|
-
} catch {
|
|
605
|
-
/* next */
|
|
606
|
-
}
|
|
607
|
-
}
|
|
608
|
-
const viaApi = await page.evaluate(() => {
|
|
609
|
-
try {
|
|
610
|
-
if (typeof window.OneTrust?.AllowAll === "function") {
|
|
611
|
-
const banner = document.querySelector(
|
|
612
|
-
"#onetrust-banner-sdk, #onetrust-consent-sdk, #onetrust-accept-btn-handler",
|
|
613
|
-
);
|
|
614
|
-
// Only invoke when a banner is actually present — AllowAll on every
|
|
615
|
-
// loop tick is wasteful and can re-open consent UI.
|
|
616
|
-
if (!banner) return false;
|
|
617
|
-
window.OneTrust.AllowAll();
|
|
618
|
-
return true;
|
|
619
|
-
}
|
|
620
|
-
const btn = document.querySelector("#onetrust-accept-btn-handler");
|
|
621
|
-
if (btn && btn.offsetParent !== null) {
|
|
622
|
-
btn.click();
|
|
623
|
-
return true;
|
|
624
|
-
}
|
|
625
|
-
} catch {
|
|
626
|
-
/* ignore */
|
|
627
|
-
}
|
|
628
|
-
return false;
|
|
629
|
-
}).catch(() => false);
|
|
630
|
-
if (viaApi) {
|
|
631
|
-
reportStep?.("dismissing_cookies", "Dismissed cookie / privacy banner");
|
|
632
|
-
return true;
|
|
633
|
-
}
|
|
634
|
-
return false;
|
|
635
|
-
}
|
|
636
|
-
|
|
637
|
-
// Google bounces flagged (headless) browsers:
|
|
638
|
-
// - myaccount.google.com/not-supported
|
|
639
|
-
// - accounts.google.com/v3/signin/rejected ("This browser or app may not be secure")
|
|
640
|
-
// - about.google drift after consent
|
|
641
|
-
function isBlockedBrowserPage(page) {
|
|
642
|
-
try {
|
|
643
|
-
const url = new URL(page.url());
|
|
644
|
-
if (url.pathname.startsWith("/not-supported")) return true;
|
|
645
|
-
if (url.pathname.includes("/signin/rejected")) return true;
|
|
646
|
-
if (url.pathname.includes("/rejected")) return true;
|
|
647
|
-
if (url.hostname === "about.google" || url.hostname.endsWith(".about.google")) return true;
|
|
648
|
-
} catch {
|
|
649
|
-
// fall through to body text
|
|
650
|
-
}
|
|
651
|
-
return false;
|
|
652
|
-
}
|
|
653
|
-
|
|
654
|
-
async function isBlockedBrowser(page) {
|
|
655
|
-
if (isBlockedBrowserPage(page)) return true;
|
|
656
|
-
const text = await readPageText(page).catch(() => "");
|
|
657
|
-
return includesAny(text, [
|
|
658
|
-
"browser or app may not be secure",
|
|
659
|
-
"try using a different browser",
|
|
660
|
-
"couldn't sign you in",
|
|
661
|
-
"couldn\u2019t sign you in",
|
|
662
|
-
"this browser or app may not be secure",
|
|
663
|
-
"browser is not secure",
|
|
664
|
-
]);
|
|
665
|
-
}
|
|
666
|
-
|
|
667
|
-
/**
|
|
668
|
-
* Hook successPromise so interstitial waits can exit as soon as the OAuth
|
|
669
|
-
* callback (kiro://) is captured on the network — even while the main frame
|
|
670
|
-
* stays parked on blank SetSID.
|
|
671
|
-
*/
|
|
672
|
-
function attachSuccessSettledFlag(successPromise) {
|
|
673
|
-
if (!successPromise || typeof successPromise.then !== "function") return;
|
|
674
|
-
if (successPromise.__zevaiSettledHooked) return;
|
|
675
|
-
successPromise.__zevaiSettledHooked = true;
|
|
676
|
-
successPromise.then(
|
|
677
|
-
() => { successPromise.__zevaiSettled = true; },
|
|
678
|
-
() => { successPromise.__zevaiSettled = true; },
|
|
679
|
-
);
|
|
680
|
-
}
|
|
681
|
-
|
|
682
|
-
function isSuccessSettled(successPromise) {
|
|
683
|
-
return Boolean(successPromise && successPromise.__zevaiSettled);
|
|
684
|
-
}
|
|
685
|
-
|
|
686
|
-
/**
|
|
687
|
-
* Google often parks on intermediate pages with empty body after password/consent:
|
|
688
|
-
* accounts.google.com(.xx)/accounts/SetSID
|
|
689
|
-
* AccountChooser, continue, challenge handoffs
|
|
690
|
-
*
|
|
691
|
-
* Do NOT force-navigate consent/idpresponse from here — that aborts the natural
|
|
692
|
-
* network hop that emits Location: kiro://. Wait for auto-redirect / AccountChooser
|
|
693
|
-
* UI, and bail early when successPromise already settled (CDP/page listeners).
|
|
694
|
-
*
|
|
695
|
-
* @returns {boolean} true if still on an interstitial when maxWaitMs elapsed
|
|
696
|
-
*/
|
|
697
|
-
async function waitThroughGoogleInterstitials(page, reportStep, { maxWaitMs = 20_000, successPromise = null } = {}) {
|
|
698
|
-
const start = Date.now();
|
|
699
|
-
let lastUrl = "";
|
|
700
|
-
attachSuccessSettledFlag(successPromise);
|
|
701
|
-
|
|
702
|
-
while (Date.now() - start < maxWaitMs) {
|
|
703
|
-
if (isSuccessSettled(successPromise)) {
|
|
704
|
-
reportStep?.("waiting_google_redirect", "OAuth callback already received — leaving interstitial wait");
|
|
705
|
-
return false;
|
|
706
|
-
}
|
|
707
|
-
|
|
708
|
-
const url = page.url?.() || "";
|
|
709
|
-
const body = String(await readPageText(page).catch(() => "")).trim();
|
|
710
|
-
const isSetSid = /\/accounts\/SetSID/i.test(url);
|
|
711
|
-
const isChooser = /\/AccountChooser/i.test(url);
|
|
712
|
-
const isEmpty = body.length < 30;
|
|
713
|
-
const isInterstitial = isSetSid || (isEmpty && /accounts\.google\./i.test(url));
|
|
714
|
-
|
|
715
|
-
if (!isInterstitial && !isChooser) return false;
|
|
716
|
-
|
|
717
|
-
if (url !== lastUrl) {
|
|
718
|
-
reportStep?.(
|
|
719
|
-
"waiting_google_redirect",
|
|
720
|
-
`Waiting for Google redirect (url=${url.slice(0, 120)} empty=${isEmpty})`,
|
|
721
|
-
);
|
|
722
|
-
lastUrl = url;
|
|
723
|
-
}
|
|
724
|
-
|
|
725
|
-
// Account chooser: click first account row if present
|
|
726
|
-
if (isChooser) {
|
|
727
|
-
const clicked = await clickFirstActionable(page, [
|
|
728
|
-
'div[data-identifier]',
|
|
729
|
-
'div[data-email]',
|
|
730
|
-
'li[data-identifier]',
|
|
731
|
-
'div[role="link"]',
|
|
732
|
-
'div[role="button"]',
|
|
733
|
-
]);
|
|
734
|
-
if (clicked) {
|
|
735
|
-
reportStep?.("selecting_google_account", "Selected account from Google AccountChooser");
|
|
736
|
-
await waitForPageAdvance(page, { timeout: 5_000 });
|
|
737
|
-
continue;
|
|
738
|
-
}
|
|
739
|
-
}
|
|
740
|
-
|
|
741
|
-
const waiters = [
|
|
742
|
-
page.waitForNavigation({ waitUntil: "domcontentloaded", timeout: 3_000 }).catch(() => null),
|
|
743
|
-
// Cap idle wait low — exit as soon as URL/body changes or success settles.
|
|
744
|
-
yieldMs(400),
|
|
745
|
-
];
|
|
746
|
-
if (successPromise && !isSuccessSettled(successPromise)) {
|
|
747
|
-
waiters.push(successPromise.then(() => null).catch(() => null));
|
|
748
|
-
}
|
|
749
|
-
await Promise.race(waiters);
|
|
750
|
-
}
|
|
751
|
-
return true;
|
|
752
|
-
}
|
|
753
|
-
|
|
754
|
-
function isProviderPage(page) {
|
|
755
|
-
try {
|
|
756
|
-
const url = new URL(page.url());
|
|
757
|
-
const host = url.hostname || "";
|
|
758
|
-
return /codebuddy\.(ai|cn)$/.test(host)
|
|
759
|
-
|| host.endsWith(".codebuddy.ai")
|
|
760
|
-
|| host.endsWith(".codebuddy.cn")
|
|
761
|
-
// xAI / Grok CLI device authorization + account host
|
|
762
|
-
|| host === "accounts.x.ai"
|
|
763
|
-
|| host === "auth.x.ai"
|
|
764
|
-
|| host.endsWith(".x.ai")
|
|
765
|
-
|| host === "grok.com"
|
|
766
|
-
|| host.endsWith(".grok.com")
|
|
767
|
-
// Cloudflare dashboard (Workers AI bulk)
|
|
768
|
-
|| host === "dash.cloudflare.com"
|
|
769
|
-
|| host.endsWith(".cloudflare.com");
|
|
770
|
-
} catch {
|
|
771
|
-
return false;
|
|
772
|
-
}
|
|
773
|
-
}
|
|
774
|
-
|
|
775
|
-
async function handleGoogleConsent(page, reportStep) {
|
|
776
|
-
if (!isGoogleAuthPage(page)) return false;
|
|
777
|
-
|
|
778
|
-
const text = await readPageText(page);
|
|
779
|
-
const looksLikeConsent = /wants to access|ingin mengakses|akses ke akun google|allow/i.test(text);
|
|
780
|
-
if (!looksLikeConsent) return false;
|
|
781
|
-
|
|
782
|
-
await page.evaluate(() => {
|
|
783
|
-
const root = document.scrollingElement || document.documentElement || document.body;
|
|
784
|
-
if (root) root.scrollTop = root.scrollHeight;
|
|
785
|
-
window.scrollTo(0, document.body?.scrollHeight || document.documentElement?.scrollHeight || 0);
|
|
786
|
-
}).catch(() => null);
|
|
787
|
-
await page.waitForTimeout(300);
|
|
788
|
-
|
|
789
|
-
const clickedApprove = await clickFirstActionable(page, APPROVE_BUTTON_SELECTORS);
|
|
790
|
-
if (clickedApprove) {
|
|
791
|
-
reportStep("approving_google_consent", "Approving Google OAuth consent");
|
|
792
|
-
await page.waitForTimeout(1000);
|
|
793
|
-
return true;
|
|
794
|
-
}
|
|
795
|
-
|
|
796
|
-
return false;
|
|
797
|
-
}
|
|
798
|
-
|
|
799
|
-
async function handleGoogleOnboarding(page, pageText) {
|
|
800
|
-
const text = String(pageText || "");
|
|
801
|
-
if (!includesAny(text, GOOGLE_ONBOARDING_MARKERS)) {
|
|
802
|
-
return false;
|
|
803
|
-
}
|
|
804
|
-
|
|
805
|
-
await page.evaluate(() => {
|
|
806
|
-
const root = document.scrollingElement || document.documentElement || document.body;
|
|
807
|
-
if (root) root.scrollTop = root.scrollHeight;
|
|
808
|
-
window.scrollTo(0, document.body?.scrollHeight || document.documentElement?.scrollHeight || 0);
|
|
809
|
-
}).catch(() => null);
|
|
810
|
-
await page.waitForTimeout(500);
|
|
811
|
-
|
|
812
|
-
// Workspace welcome ("Welcome to your new account" for @domain.com) has
|
|
813
|
-
// only one valid action: the primary "I understand" button. There is no
|
|
814
|
-
// skip option \u2014 clicking nothing leaves the worker stuck polling forever
|
|
815
|
-
// while the headless tab sits on the consent screen. Prioritise the
|
|
816
|
-
// primary action selector before the generic skip pass so we don't fall
|
|
817
|
-
// through to a non-existent "Not now" link.
|
|
818
|
-
if (includesAny(text, GOOGLE_WORKSPACE_WELCOME_MARKERS)) {
|
|
819
|
-
const acknowledged = await clickFirstActionable(page, APPROVE_BUTTON_SELECTORS);
|
|
820
|
-
if (acknowledged) {
|
|
821
|
-
await page.waitForTimeout(700);
|
|
822
|
-
return true;
|
|
823
|
-
}
|
|
824
|
-
const submittedFromDom = await page.evaluate(() => {
|
|
825
|
-
const candidates = [
|
|
826
|
-
document.getElementById("confirm"),
|
|
827
|
-
document.querySelector('form#tos_form input[type="submit"]'),
|
|
828
|
-
document.querySelector('input[type="submit"][value="Saya mengerti"]'),
|
|
829
|
-
document.querySelector('input[type="submit"][value="I understand"]'),
|
|
830
|
-
].filter(Boolean);
|
|
831
|
-
const btn = candidates[0];
|
|
832
|
-
if (!btn) return false;
|
|
833
|
-
btn.scrollIntoView({ block: "center" });
|
|
834
|
-
btn.click();
|
|
835
|
-
return true;
|
|
836
|
-
}).catch(() => false);
|
|
837
|
-
if (submittedFromDom) {
|
|
838
|
-
await page.waitForTimeout(800);
|
|
839
|
-
return true;
|
|
840
|
-
}
|
|
841
|
-
const formSubmitted = await page.evaluate(() => {
|
|
842
|
-
const form = document.getElementById("tos_form");
|
|
843
|
-
if (!form) return false;
|
|
844
|
-
form.submit();
|
|
845
|
-
return true;
|
|
846
|
-
}).catch(() => false);
|
|
847
|
-
if (formSubmitted) {
|
|
848
|
-
await page.waitForTimeout(800);
|
|
849
|
-
return true;
|
|
850
|
-
}
|
|
851
|
-
}
|
|
852
|
-
|
|
853
|
-
const clickedSkip = await clickFirstActionable(page, SKIP_BUTTON_SELECTORS);
|
|
854
|
-
if (clickedSkip) {
|
|
855
|
-
await page.waitForTimeout(700);
|
|
856
|
-
return true;
|
|
857
|
-
}
|
|
858
|
-
|
|
859
|
-
const clickedContinue = await clickFirstActionable(page, APPROVE_BUTTON_SELECTORS);
|
|
860
|
-
if (clickedContinue) {
|
|
861
|
-
await page.waitForTimeout(700);
|
|
862
|
-
return true;
|
|
863
|
-
}
|
|
864
|
-
|
|
865
|
-
return false;
|
|
866
|
-
}
|
|
867
|
-
|
|
868
|
-
async function selectNativeRegionOption(page) {
|
|
869
|
-
const preferred = /global|international|singapore|united states|^us$|asia|hong kong|default/i;
|
|
870
|
-
|
|
871
|
-
for (const scope of getInteractionScopes(page)) {
|
|
872
|
-
const selects = scope.locator("select");
|
|
873
|
-
const count = await selects.count().catch(() => 0);
|
|
874
|
-
for (let index = 0; index < count; index += 1) {
|
|
875
|
-
const select = selects.nth(index);
|
|
876
|
-
const visible = await select.isVisible().catch(() => false);
|
|
877
|
-
const enabled = await select.isEnabled().catch(() => true);
|
|
878
|
-
if (!visible || !enabled) continue;
|
|
879
|
-
|
|
880
|
-
const value = await select.evaluate((element, patternSource) => {
|
|
881
|
-
const matcher = new RegExp(patternSource, "i");
|
|
882
|
-
const options = [...element.options].filter((option) => !option.disabled && option.value !== "");
|
|
883
|
-
const preferredOption = options.find((option) => matcher.test(`${option.label} ${option.textContent} ${option.value}`));
|
|
884
|
-
return (preferredOption || options[0])?.value || "";
|
|
885
|
-
}, preferred.source).catch(() => "");
|
|
886
|
-
|
|
887
|
-
if (!value) continue;
|
|
888
|
-
const selected = await select.selectOption(value).then(() => true).catch(() => false);
|
|
889
|
-
if (selected) return true;
|
|
890
|
-
}
|
|
891
|
-
}
|
|
892
|
-
|
|
893
|
-
return false;
|
|
894
|
-
}
|
|
895
|
-
|
|
896
|
-
async function fillProviderOnboardingDefaults(page) {
|
|
897
|
-
let filled = false;
|
|
898
|
-
|
|
899
|
-
for (const scope of getInteractionScopes(page)) {
|
|
900
|
-
for (const { selector, value } of PROVIDER_ONBOARDING_INPUT_DEFAULTS) {
|
|
901
|
-
const locator = scope.locator(selector).first();
|
|
902
|
-
const count = await locator.count().catch(() => 0);
|
|
903
|
-
if (!count) continue;
|
|
904
|
-
|
|
905
|
-
const visible = await locator.isVisible().catch(() => false);
|
|
906
|
-
const enabled = await locator.isEnabled().catch(() => true);
|
|
907
|
-
if (!visible || !enabled) continue;
|
|
908
|
-
|
|
909
|
-
const currentValue = await locator.inputValue().catch(() => "");
|
|
910
|
-
if (currentValue) continue;
|
|
911
|
-
|
|
912
|
-
const didFill = await locator.fill(value, { timeout: 5_000 }).then(() => true).catch(() => false);
|
|
913
|
-
if (didFill) filled = true;
|
|
914
|
-
}
|
|
915
|
-
}
|
|
916
|
-
|
|
917
|
-
return filled;
|
|
918
|
-
}
|
|
919
|
-
|
|
920
|
-
async function clickLocatorCenter(page, locator) {
|
|
921
|
-
await locator.scrollIntoViewIfNeeded().catch(() => null);
|
|
922
|
-
const visible = await locator.isVisible().catch(() => false);
|
|
923
|
-
const enabled = await locator.isEnabled().catch(() => true);
|
|
924
|
-
if (!visible || !enabled) return false;
|
|
925
|
-
|
|
926
|
-
const box = await locator.boundingBox().catch(() => null);
|
|
927
|
-
if (!box || box.width <= 0 || box.height <= 0) return false;
|
|
928
|
-
|
|
929
|
-
const x = box.x + box.width / 2;
|
|
930
|
-
const y = box.y + box.height / 2;
|
|
931
|
-
await page.mouse.move(x, y);
|
|
932
|
-
await page.mouse.down();
|
|
933
|
-
await page.mouse.up();
|
|
934
|
-
return true;
|
|
935
|
-
}
|
|
936
|
-
|
|
937
|
-
async function clickVisibleLocatorByText(page, selector, patterns) {
|
|
938
|
-
for (const scope of getInteractionScopes(page)) {
|
|
939
|
-
const locators = scope.locator(selector);
|
|
940
|
-
const count = Math.min(await locators.count().catch(() => 0), 80);
|
|
941
|
-
const candidates = [];
|
|
942
|
-
|
|
943
|
-
for (let index = 0; index < count; index += 1) {
|
|
944
|
-
const locator = locators.nth(index);
|
|
945
|
-
const visible = await locator.isVisible().catch(() => false);
|
|
946
|
-
if (!visible) continue;
|
|
947
|
-
|
|
948
|
-
const text = (await locator.innerText({ timeout: 1_000 }).catch(() => "")
|
|
949
|
-
|| await locator.textContent({ timeout: 1_000 }).catch(() => "")
|
|
950
|
-
|| "").trim();
|
|
951
|
-
if (!text) continue;
|
|
952
|
-
candidates.push({ locator, text });
|
|
953
|
-
}
|
|
954
|
-
|
|
955
|
-
for (const pattern of patterns) {
|
|
956
|
-
const candidate = candidates.find((item) => pattern.test(item.text));
|
|
957
|
-
if (!candidate) continue;
|
|
958
|
-
const clicked = await clickLocatorCenter(page, candidate.locator).catch(() => false);
|
|
959
|
-
if (clicked) return candidate.text;
|
|
960
|
-
}
|
|
961
|
-
|
|
962
|
-
if (candidates[0]) {
|
|
963
|
-
const clicked = await clickLocatorCenter(page, candidates[0].locator).catch(() => false);
|
|
964
|
-
if (clicked) return candidates[0].text;
|
|
965
|
-
}
|
|
966
|
-
}
|
|
967
|
-
|
|
968
|
-
return "";
|
|
969
|
-
}
|
|
970
|
-
|
|
971
|
-
async function clickFirstVisibleLocatorCenter(page, selectors) {
|
|
972
|
-
for (const scope of getInteractionScopes(page)) {
|
|
973
|
-
for (const selector of selectors) {
|
|
974
|
-
const locators = scope.locator(selector);
|
|
975
|
-
const count = Math.min(await locators.count().catch(() => 0), 20);
|
|
976
|
-
for (let index = 0; index < count; index += 1) {
|
|
977
|
-
const locator = locators.nth(index);
|
|
978
|
-
const clicked = await clickLocatorCenter(page, locator).catch(() => false);
|
|
979
|
-
if (clicked) return true;
|
|
980
|
-
}
|
|
981
|
-
}
|
|
982
|
-
}
|
|
983
|
-
|
|
984
|
-
return false;
|
|
985
|
-
}
|
|
986
|
-
|
|
987
|
-
async function handleCodeBuddyRegionPageViaApi(page, reportStep) {
|
|
988
|
-
if (!isProviderPage(page) || isGoogleAuthPage(page)) return false;
|
|
989
|
-
|
|
990
|
-
const result = await page.evaluate(async () => {
|
|
991
|
-
const bodyText = document.body?.innerText || "";
|
|
992
|
-
const looksLikeRegionPage = document.querySelector(".page-region")
|
|
993
|
-
|| /select\s+region|region|country|area|get started|complete/i.test(bodyText);
|
|
994
|
-
if (!looksLikeRegionPage) return null;
|
|
995
|
-
|
|
996
|
-
try {
|
|
997
|
-
const response = await fetch("https://www.codebuddy.ai/console/login/account", {
|
|
998
|
-
method: "POST",
|
|
999
|
-
credentials: "include",
|
|
1000
|
-
headers: {
|
|
1001
|
-
accept: "application/json, text/plain, */*",
|
|
1002
|
-
"content-type": "application/json",
|
|
1003
|
-
"x-requested-with": "XMLHttpRequest",
|
|
1004
|
-
"x-domain": window.location.hostname || "www.codebuddy.ai",
|
|
1005
|
-
},
|
|
1006
|
-
referrer: "https://www.codebuddy.ai/register/user/complete",
|
|
1007
|
-
body: JSON.stringify({
|
|
1008
|
-
attributes: {
|
|
1009
|
-
countryCode: ["62"],
|
|
1010
|
-
countryFullName: ["Indonesia"],
|
|
1011
|
-
countryName: ["ID"],
|
|
1012
|
-
},
|
|
1013
|
-
}),
|
|
1014
|
-
});
|
|
1015
|
-
|
|
1016
|
-
const text = await response.text().catch(() => "");
|
|
1017
|
-
let data = null;
|
|
1018
|
-
try {
|
|
1019
|
-
data = text ? JSON.parse(text) : null;
|
|
1020
|
-
} catch {
|
|
1021
|
-
data = { raw: text };
|
|
1022
|
-
}
|
|
1023
|
-
|
|
1024
|
-
if (response.ok && (!data || data.code === 0 || data.code === 200 || typeof data.code === "undefined")) {
|
|
1025
|
-
return { action: "submitted_via_api" };
|
|
1026
|
-
}
|
|
1027
|
-
|
|
1028
|
-
return {
|
|
1029
|
-
action: "api_failed",
|
|
1030
|
-
status: response.status,
|
|
1031
|
-
code: data?.code,
|
|
1032
|
-
message: data?.msg || data?.message || text || `HTTP ${response.status}`,
|
|
1033
|
-
};
|
|
1034
|
-
} catch (error) {
|
|
1035
|
-
return {
|
|
1036
|
-
action: "api_failed",
|
|
1037
|
-
message: error?.message || "region submit request failed",
|
|
1038
|
-
};
|
|
1039
|
-
}
|
|
1040
|
-
}).catch(() => null);
|
|
1041
|
-
|
|
1042
|
-
if (!result?.action) return false;
|
|
1043
|
-
|
|
1044
|
-
if (result.action === "submitted_via_api") {
|
|
1045
|
-
reportStep("submitting_codebuddy_region", "Submitted CodeBuddy region via account API");
|
|
1046
|
-
await page.waitForTimeout(1500);
|
|
1047
|
-
return true;
|
|
1048
|
-
}
|
|
1049
|
-
|
|
1050
|
-
reportStep(
|
|
1051
|
-
"codebuddy_region_api_failed",
|
|
1052
|
-
result.message
|
|
1053
|
-
? `CodeBuddy region API submit failed: ${result.message}`
|
|
1054
|
-
: "CodeBuddy region API submit failed"
|
|
1055
|
-
);
|
|
1056
|
-
return false;
|
|
1057
|
-
}
|
|
1058
|
-
|
|
1059
|
-
async function handleCodeBuddyRegionPageWithMouse(page, reportStep) {
|
|
1060
|
-
if (!isProviderPage(page) || isGoogleAuthPage(page)) return false;
|
|
1061
|
-
|
|
1062
|
-
const isRegionPage = await page.locator(".page-region").first().count().then(Boolean).catch(() => false);
|
|
1063
|
-
if (!isRegionPage) return false;
|
|
1064
|
-
|
|
1065
|
-
const optionPatterns = [
|
|
1066
|
-
/indonesia|^id$|\u5370\u5ea6\u5c3c\u897f\u4e9a/i,
|
|
1067
|
-
/singapore|^sg$|\u65b0\u52a0\u5761/i,
|
|
1068
|
-
/japan|^jp$|\u65e5\u672c/i,
|
|
1069
|
-
/thailand|^th$|\u6cf0\u56fd/i,
|
|
1070
|
-
/global|international|default/i,
|
|
1071
|
-
];
|
|
1072
|
-
|
|
1073
|
-
const submitClicked = await clickFirstVisibleLocatorCenter(page, [
|
|
1074
|
-
".page-region [class*='28B894']",
|
|
1075
|
-
".page-region button:has-text('Get started')",
|
|
1076
|
-
".page-region button:has-text('Start')",
|
|
1077
|
-
".page-region button:has-text('Submit')",
|
|
1078
|
-
".page-region button:has-text('Continue')",
|
|
1079
|
-
".page-region [role='button']:has-text('Get started')",
|
|
1080
|
-
".page-region [role='button']:has-text('Start')",
|
|
1081
|
-
".page-region [role='button']:has-text('Submit')",
|
|
1082
|
-
".page-region [role='button']:has-text('Continue')",
|
|
1083
|
-
]);
|
|
1084
|
-
if (submitClicked) {
|
|
1085
|
-
reportStep("submitting_codebuddy_region", "Submitted CodeBuddy region selection");
|
|
1086
|
-
await page.waitForTimeout(1200);
|
|
1087
|
-
return true;
|
|
1088
|
-
}
|
|
1089
|
-
|
|
1090
|
-
const visibleOption = await clickVisibleLocatorByText(
|
|
1091
|
-
page,
|
|
1092
|
-
"ul.dropdown-section li, .dropdown-section li, [role='option'], .t-select-option, [class*='option']",
|
|
1093
|
-
optionPatterns
|
|
1094
|
-
);
|
|
1095
|
-
if (visibleOption) {
|
|
1096
|
-
reportStep("selecting_codebuddy_region", `Selected CodeBuddy region: ${visibleOption}`);
|
|
1097
|
-
await page.waitForTimeout(900);
|
|
1098
|
-
return true;
|
|
1099
|
-
}
|
|
1100
|
-
|
|
1101
|
-
const opened = await clickFirstVisibleLocatorCenter(page, [
|
|
1102
|
-
".page-region .t-select",
|
|
1103
|
-
".page-region [class*='t-select']",
|
|
1104
|
-
".page-region [role='combobox']",
|
|
1105
|
-
".page-region input[placeholder]",
|
|
1106
|
-
".page-region [class*='select']",
|
|
1107
|
-
".page-region [class*='cursor-pointer']",
|
|
1108
|
-
]);
|
|
1109
|
-
if (!opened) return false;
|
|
1110
|
-
|
|
1111
|
-
reportStep("opening_codebuddy_region_selector", "Opening CodeBuddy region selector");
|
|
1112
|
-
await page.waitForTimeout(600);
|
|
1113
|
-
|
|
1114
|
-
const openedOption = await clickVisibleLocatorByText(
|
|
1115
|
-
page,
|
|
1116
|
-
"ul.dropdown-section li, .dropdown-section li, [role='option'], .t-select-option, [class*='option']",
|
|
1117
|
-
optionPatterns
|
|
1118
|
-
);
|
|
1119
|
-
if (openedOption) {
|
|
1120
|
-
reportStep("selecting_codebuddy_region", `Selected CodeBuddy region: ${openedOption}`);
|
|
1121
|
-
await page.waitForTimeout(900);
|
|
1122
|
-
}
|
|
1123
|
-
|
|
1124
|
-
return true;
|
|
1125
|
-
}
|
|
1126
|
-
|
|
1127
|
-
async function handleCodeBuddyRegionPage(page, reportStep) {
|
|
1128
|
-
if (!isProviderPage(page) || isGoogleAuthPage(page)) return false;
|
|
1129
|
-
|
|
1130
|
-
const handledViaApi = await handleCodeBuddyRegionPageViaApi(page, reportStep);
|
|
1131
|
-
if (handledViaApi) return true;
|
|
1132
|
-
|
|
1133
|
-
const handledWithMouse = await handleCodeBuddyRegionPageWithMouse(page, reportStep);
|
|
1134
|
-
if (handledWithMouse) return true;
|
|
1135
|
-
|
|
1136
|
-
for (const scope of getInteractionScopes(page)) {
|
|
1137
|
-
const result = await scope.evaluate(() => {
|
|
1138
|
-
const visible = (element) => {
|
|
1139
|
-
if (!(element instanceof HTMLElement)) return false;
|
|
1140
|
-
const style = window.getComputedStyle(element);
|
|
1141
|
-
if (style.visibility === "hidden" || style.display === "none" || Number(style.opacity) === 0) return false;
|
|
1142
|
-
const rect = element.getBoundingClientRect();
|
|
1143
|
-
return rect.width > 0 && rect.height > 0;
|
|
1144
|
-
};
|
|
1145
|
-
|
|
1146
|
-
const root = document.querySelector(".page-region");
|
|
1147
|
-
const bodyText = document.body?.innerText || "";
|
|
1148
|
-
const looksLikeRegionPage = root
|
|
1149
|
-
|| /select\s+region|region|country|area|get started|complete/i.test(bodyText);
|
|
1150
|
-
if (!looksLikeRegionPage) return null;
|
|
1151
|
-
|
|
1152
|
-
const clickElement = (element) => {
|
|
1153
|
-
element.scrollIntoView({ block: "center", inline: "center" });
|
|
1154
|
-
for (const type of ["pointerdown", "mousedown", "pointerup", "mouseup", "click"]) {
|
|
1155
|
-
element.dispatchEvent(new MouseEvent(type, {
|
|
1156
|
-
bubbles: true,
|
|
1157
|
-
cancelable: true,
|
|
1158
|
-
view: window,
|
|
1159
|
-
buttons: type.endsWith("down") ? 1 : 0,
|
|
1160
|
-
}));
|
|
1161
|
-
}
|
|
1162
|
-
};
|
|
1163
|
-
|
|
1164
|
-
const optionPatterns = [
|
|
1165
|
-
/indonesia|^id$|\u5370\u5ea6\u5c3c\u897f\u4e9a/i,
|
|
1166
|
-
/singapore|^sg$|\u65b0\u52a0\u5761/i,
|
|
1167
|
-
/japan|^jp$|\u65e5\u672c/i,
|
|
1168
|
-
/thailand|^th$|\u6cf0\u56fd/i,
|
|
1169
|
-
/global|international|default/i,
|
|
1170
|
-
];
|
|
1171
|
-
|
|
1172
|
-
const searchRoot = root || document.body;
|
|
1173
|
-
const submitSelectors = [
|
|
1174
|
-
"button",
|
|
1175
|
-
"[role='button']",
|
|
1176
|
-
"input[type='submit']",
|
|
1177
|
-
".t-button",
|
|
1178
|
-
"[class*='button']",
|
|
1179
|
-
"[class*='28B894']",
|
|
1180
|
-
];
|
|
1181
|
-
const submitButtons = [...searchRoot.querySelectorAll(submitSelectors.join(","))]
|
|
1182
|
-
.filter(visible)
|
|
1183
|
-
.filter((element) => {
|
|
1184
|
-
const text = `${element.innerText || ""} ${element.getAttribute("aria-label") || ""} ${element.getAttribute("value") || ""}`;
|
|
1185
|
-
const className = element.getAttribute("class") || "";
|
|
1186
|
-
return /submit|start|continue|confirm|done|get started|complete|\u5b8c\u6210|\u5f00\u59cb|\u786e\u5b9a|\u4e0b\u4e00\u6b65/i.test(text)
|
|
1187
|
-
|| className.includes("28B894");
|
|
1188
|
-
});
|
|
1189
|
-
|
|
1190
|
-
if (submitButtons.length) {
|
|
1191
|
-
clickElement(submitButtons[0]);
|
|
1192
|
-
return { action: "submitted" };
|
|
1193
|
-
}
|
|
1194
|
-
|
|
1195
|
-
const optionSelectors = [
|
|
1196
|
-
"ul.dropdown-section li",
|
|
1197
|
-
".dropdown-section li",
|
|
1198
|
-
"[role='option']",
|
|
1199
|
-
".t-select-option",
|
|
1200
|
-
"[class*='option']",
|
|
1201
|
-
"[class*='dropdown'] li",
|
|
1202
|
-
];
|
|
1203
|
-
const options = [...document.querySelectorAll(optionSelectors.join(","))]
|
|
1204
|
-
.filter(visible)
|
|
1205
|
-
.filter((element) => (element.innerText || element.textContent || "").trim());
|
|
1206
|
-
|
|
1207
|
-
if (options.length) {
|
|
1208
|
-
const option = optionPatterns
|
|
1209
|
-
.map((pattern) => options.find((element) => pattern.test((element.innerText || element.textContent || "").trim())))
|
|
1210
|
-
.find(Boolean) || options[0];
|
|
1211
|
-
const label = (option.innerText || option.textContent || "").trim();
|
|
1212
|
-
clickElement(option);
|
|
1213
|
-
return { action: "selected", label };
|
|
1214
|
-
}
|
|
1215
|
-
|
|
1216
|
-
const controlSelectors = [
|
|
1217
|
-
"[role='combobox']",
|
|
1218
|
-
".t-select",
|
|
1219
|
-
"[class*='t-select']",
|
|
1220
|
-
"[class*='select']",
|
|
1221
|
-
"input[placeholder]",
|
|
1222
|
-
".text-sm",
|
|
1223
|
-
"[class*='cursor-pointer']",
|
|
1224
|
-
];
|
|
1225
|
-
const controls = [...searchRoot.querySelectorAll(controlSelectors.join(","))]
|
|
1226
|
-
.filter(visible)
|
|
1227
|
-
.filter((element) => {
|
|
1228
|
-
const text = `${element.innerText || ""} ${element.getAttribute("placeholder") || ""} ${element.getAttribute("aria-label") || ""}`;
|
|
1229
|
-
return /region|country|area|select|placeholder|\u5730\u533a|\u56fd\u5bb6|\u9009\u62e9/i.test(text)
|
|
1230
|
-
|| element.matches?.(".t-select,[class*='t-select'],input[placeholder],[class*='select']");
|
|
1231
|
-
});
|
|
1232
|
-
|
|
1233
|
-
if (controls.length) {
|
|
1234
|
-
clickElement(controls[0]);
|
|
1235
|
-
return { action: "opened" };
|
|
1236
|
-
}
|
|
1237
|
-
|
|
1238
|
-
return null;
|
|
1239
|
-
}).catch(() => null);
|
|
1240
|
-
|
|
1241
|
-
if (!result?.action) continue;
|
|
1242
|
-
|
|
1243
|
-
if (result.action === "selected") {
|
|
1244
|
-
reportStep("selecting_codebuddy_region", `Selected CodeBuddy region${result.label ? `: ${result.label}` : ""}`);
|
|
1245
|
-
await page.waitForTimeout(700);
|
|
1246
|
-
return true;
|
|
1247
|
-
}
|
|
1248
|
-
|
|
1249
|
-
if (result.action === "submitted") {
|
|
1250
|
-
reportStep("submitting_codebuddy_region", "Submitted CodeBuddy region selection");
|
|
1251
|
-
await page.waitForTimeout(1200);
|
|
1252
|
-
return true;
|
|
1253
|
-
}
|
|
1254
|
-
|
|
1255
|
-
reportStep("opening_codebuddy_region_selector", "Opening CodeBuddy region selector");
|
|
1256
|
-
await page.waitForTimeout(700);
|
|
1257
|
-
return true;
|
|
1258
|
-
}
|
|
1259
|
-
|
|
1260
|
-
return false;
|
|
1261
|
-
}
|
|
1262
|
-
|
|
1263
|
-
async function handleCodeBuddyStartedAuthorization(page, reportStep) {
|
|
1264
|
-
if (!isProviderPage(page) || isGoogleAuthPage(page)) return false;
|
|
1265
|
-
|
|
1266
|
-
const result = await page.evaluate(async () => {
|
|
1267
|
-
const url = new URL(window.location.href);
|
|
1268
|
-
if (!/\/started\/?$/.test(url.pathname)) return null;
|
|
1269
|
-
|
|
1270
|
-
const platform = url.searchParams.get("platform") || "CLI";
|
|
1271
|
-
const state = url.searchParams.get("state");
|
|
1272
|
-
if (!state) return null;
|
|
1273
|
-
|
|
1274
|
-
const domains = [window.location.hostname || "www.codebuddy.ai"].filter(Boolean);
|
|
1275
|
-
for (const domain of [...new Set(domains)]) {
|
|
1276
|
-
const authUrl = new URL("/console/auth/login", window.location.origin);
|
|
1277
|
-
authUrl.searchParams.set("platform", platform);
|
|
1278
|
-
authUrl.searchParams.set("state", state);
|
|
1279
|
-
authUrl.searchParams.set("domain", domain);
|
|
1280
|
-
|
|
1281
|
-
try {
|
|
1282
|
-
const response = await fetch(authUrl.toString(), {
|
|
1283
|
-
method: "GET",
|
|
1284
|
-
credentials: "include",
|
|
1285
|
-
redirect: "manual",
|
|
1286
|
-
headers: {
|
|
1287
|
-
"x-requested-with": "XMLHttpRequest",
|
|
1288
|
-
"X-Domain": domain,
|
|
1289
|
-
},
|
|
1290
|
-
});
|
|
1291
|
-
if (response.type === "opaqueredirect" || (response.status >= 300 && response.status < 400)) {
|
|
1292
|
-
return { action: "attempted", domain, message: "redirected" };
|
|
1293
|
-
}
|
|
1294
|
-
const text = await response.text();
|
|
1295
|
-
let data = null;
|
|
1296
|
-
try {
|
|
1297
|
-
data = text ? JSON.parse(text) : null;
|
|
1298
|
-
} catch {
|
|
1299
|
-
data = { raw: text };
|
|
1300
|
-
}
|
|
1301
|
-
if (response.ok && (!data || data.code === 0 || data.code === 200 || typeof data.code === "undefined")) {
|
|
1302
|
-
return { action: "authorized", domain };
|
|
1303
|
-
}
|
|
1304
|
-
if (response.ok) {
|
|
1305
|
-
return { action: "attempted", domain, code: data?.code, message: data?.msg || data?.message || "" };
|
|
1306
|
-
}
|
|
1307
|
-
} catch (error) {
|
|
1308
|
-
// Try the next domain variant.
|
|
1309
|
-
}
|
|
1310
|
-
}
|
|
1311
|
-
|
|
1312
|
-
return { action: "failed" };
|
|
1313
|
-
}).catch(() => null);
|
|
1314
|
-
|
|
1315
|
-
if (!result?.action || result.action === "failed") return false;
|
|
1316
|
-
|
|
1317
|
-
if (result.action === "authorized") {
|
|
1318
|
-
reportStep("authorizing_codebuddy_cli_state", "Authorized CodeBuddy CLI login state");
|
|
1319
|
-
await page.waitForTimeout(1200);
|
|
1320
|
-
return true;
|
|
1321
|
-
}
|
|
1322
|
-
|
|
1323
|
-
reportStep(
|
|
1324
|
-
"authorizing_codebuddy_cli_state",
|
|
1325
|
-
result.message
|
|
1326
|
-
? `Attempted CodeBuddy CLI login state authorization: ${result.message}`
|
|
1327
|
-
: "Attempted CodeBuddy CLI login state authorization"
|
|
1328
|
-
);
|
|
1329
|
-
await page.waitForTimeout(1200);
|
|
1330
|
-
return true;
|
|
1331
|
-
}
|
|
1332
|
-
|
|
1333
|
-
async function providerHasGoogleLogin(page) {
|
|
1334
|
-
try {
|
|
1335
|
-
for (const name of [/continue with google/i, /sign in with google/i, /sign up with google/i, /^google$/i]) {
|
|
1336
|
-
const btn = page.getByRole("button", { name }).first();
|
|
1337
|
-
if (await btn.isVisible({ timeout: 300 }).catch(() => false)) return true;
|
|
1338
|
-
const link = page.getByRole("link", { name }).first();
|
|
1339
|
-
if (await link.isVisible({ timeout: 200 }).catch(() => false)) return true;
|
|
1340
|
-
}
|
|
1341
|
-
} catch {
|
|
1342
|
-
/* ignore */
|
|
1343
|
-
}
|
|
1344
|
-
for (const selector of GOOGLE_LOGIN_BUTTON_SELECTORS) {
|
|
1345
|
-
try {
|
|
1346
|
-
const loc = page.locator(selector).first();
|
|
1347
|
-
if (await loc.isVisible({ timeout: 200 }).catch(() => false)) return true;
|
|
1348
|
-
} catch {
|
|
1349
|
-
/* next */
|
|
1350
|
-
}
|
|
1351
|
-
}
|
|
1352
|
-
return false;
|
|
1353
|
-
}
|
|
1354
|
-
|
|
1355
|
-
function isXaiProviderPage(page) {
|
|
1356
|
-
try {
|
|
1357
|
-
const host = new URL(page.url()).hostname || "";
|
|
1358
|
-
return host === "accounts.x.ai" || host === "auth.x.ai" || host.endsWith(".x.ai")
|
|
1359
|
-
|| host === "grok.com" || host.endsWith(".grok.com");
|
|
1360
|
-
} catch {
|
|
1361
|
-
return false;
|
|
1362
|
-
}
|
|
1363
|
-
}
|
|
1364
|
-
|
|
1365
|
-
async function handleProviderOnboarding(page, reportStep, serviceLabel) {
|
|
1366
|
-
if (!isProviderPage(page) || isGoogleAuthPage(page)) return false;
|
|
1367
|
-
|
|
1368
|
-
const confirmedPrivacy = await clickFirstActionable(page, PRIVACY_CONFIRM_BUTTON_SELECTORS);
|
|
1369
|
-
if (confirmedPrivacy) {
|
|
1370
|
-
reportStep("accepting_provider_privacy_dialog", `Confirmed ${serviceLabel} privacy or terms dialog`);
|
|
1371
|
-
await page.waitForTimeout(800);
|
|
1372
|
-
return true;
|
|
1373
|
-
}
|
|
1374
|
-
|
|
1375
|
-
const handledCodeBuddyStarted = await handleCodeBuddyStartedAuthorization(page, reportStep);
|
|
1376
|
-
if (handledCodeBuddyStarted) {
|
|
1377
|
-
return true;
|
|
1378
|
-
}
|
|
1379
|
-
|
|
1380
|
-
const handledCodeBuddyRegion = await handleCodeBuddyRegionPage(page, reportStep);
|
|
1381
|
-
if (handledCodeBuddyRegion) {
|
|
1382
|
-
return true;
|
|
1383
|
-
}
|
|
1384
|
-
|
|
1385
|
-
// Region / workspace defaults are CodeBuddy-style — not xAI device approve.
|
|
1386
|
-
// False-positive select matches on xAI wasted the session into "Invalid action".
|
|
1387
|
-
if (!isXaiProviderPage(page)) {
|
|
1388
|
-
const selectedNativeRegion = await selectNativeRegionOption(page);
|
|
1389
|
-
if (selectedNativeRegion) {
|
|
1390
|
-
reportStep("selecting_provider_region", `Selected ${serviceLabel} region`);
|
|
1391
|
-
await page.waitForTimeout(700);
|
|
1392
|
-
return true;
|
|
1393
|
-
}
|
|
1394
|
-
|
|
1395
|
-
const openedRegionMenu = await clickFirstActionable(page, PROVIDER_REGION_TRIGGER_SELECTORS);
|
|
1396
|
-
if (openedRegionMenu) {
|
|
1397
|
-
reportStep("opening_provider_region_selector", `Opening ${serviceLabel} region selector`);
|
|
1398
|
-
await page.waitForTimeout(500);
|
|
1399
|
-
const selectedRegion = await clickFirstActionable(page, PROVIDER_REGION_OPTION_SELECTORS);
|
|
1400
|
-
if (selectedRegion) {
|
|
1401
|
-
reportStep("selecting_provider_region", `Selected ${serviceLabel} region`);
|
|
1402
|
-
await page.waitForTimeout(700);
|
|
1403
|
-
}
|
|
1404
|
-
return true;
|
|
1405
|
-
}
|
|
1406
|
-
|
|
1407
|
-
const selectedRegion = await clickFirstActionable(page, PROVIDER_REGION_OPTION_SELECTORS);
|
|
1408
|
-
if (selectedRegion) {
|
|
1409
|
-
reportStep("selecting_provider_region", `Selected ${serviceLabel} region`);
|
|
1410
|
-
await page.waitForTimeout(700);
|
|
1411
|
-
return true;
|
|
1412
|
-
}
|
|
1413
|
-
|
|
1414
|
-
const filledDefaults = await fillProviderOnboardingDefaults(page);
|
|
1415
|
-
if (filledDefaults) {
|
|
1416
|
-
reportStep("filling_provider_onboarding", `Filled ${serviceLabel} onboarding defaults`);
|
|
1417
|
-
await page.waitForTimeout(500);
|
|
1418
|
-
return true;
|
|
1419
|
-
}
|
|
1420
|
-
}
|
|
1421
|
-
|
|
1422
|
-
// xAI device pages: never click generic Continue/Next/Confirm. Those submit
|
|
1423
|
-
// the device form without a session → "Invalid action" and burn 1–3 minutes.
|
|
1424
|
-
// Only Google SSO (login gate) + Allow/Authorize (clickXaiDeviceAuthorize).
|
|
1425
|
-
if (isXaiProviderPage(page)) {
|
|
1426
|
-
return false;
|
|
1427
|
-
}
|
|
1428
|
-
|
|
1429
|
-
// Cloudflare dashboard / login: "Allow All" cookie + "Sign in" must not be
|
|
1430
|
-
// treated as provider onboarding Continues.
|
|
1431
|
-
try {
|
|
1432
|
-
const host = new URL(page.url()).hostname || "";
|
|
1433
|
-
if (host === "dash.cloudflare.com" || host.endsWith(".cloudflare.com")) {
|
|
1434
|
-
return false;
|
|
1435
|
-
}
|
|
1436
|
-
} catch {
|
|
1437
|
-
/* ignore */
|
|
1438
|
-
}
|
|
1439
|
-
|
|
1440
|
-
// If Google SSO is still offered, do not mash generic Continue.
|
|
1441
|
-
if (await providerHasGoogleLogin(page)) {
|
|
1442
|
-
return false;
|
|
1443
|
-
}
|
|
1444
|
-
|
|
1445
|
-
const clickedAction = await clickFirstActionable(page, PROVIDER_ONBOARDING_ACTION_SELECTORS);
|
|
1446
|
-
if (clickedAction) {
|
|
1447
|
-
reportStep("continuing_provider_onboarding", `Continuing ${serviceLabel} onboarding`);
|
|
1448
|
-
await page.waitForTimeout(1000);
|
|
1449
|
-
return true;
|
|
1450
|
-
}
|
|
1451
|
-
|
|
1452
|
-
return false;
|
|
1453
|
-
}
|
|
1454
|
-
|
|
1455
|
-
/**
|
|
1456
|
-
* xAI device step 1: "Enter the code shown in your terminal" → Continue.
|
|
1457
|
-
* Only after this do we land on sign-in with "Login with Google".
|
|
1458
|
-
* Never run this after Google login — that re-submits Continue into Invalid action.
|
|
1459
|
-
*/
|
|
1460
|
-
async function handleXaiDeviceCodeConfirm(page, reportStep, { alreadyAuthed = false } = {}) {
|
|
1461
|
-
if (!isXaiProviderPage(page)) return false;
|
|
1462
|
-
if (alreadyAuthed) return false;
|
|
1463
|
-
// Already on Google SSO wall — past this step.
|
|
1464
|
-
if (await providerHasGoogleLogin(page)) return false;
|
|
1465
|
-
|
|
1466
|
-
const text = await readPageText(page).catch(() => "");
|
|
1467
|
-
// Logged-in device/approve screens — do not re-click Continue.
|
|
1468
|
-
if (/sign out|log out|device authorized|you can close|invalid action/i.test(text)) {
|
|
1469
|
-
return false;
|
|
1470
|
-
}
|
|
1471
|
-
|
|
1472
|
-
const isCodeConfirm =
|
|
1473
|
-
/enter the code shown in your terminal/i.test(text)
|
|
1474
|
-
|| /only enter this code if you just initiated/i.test(text)
|
|
1475
|
-
|| (/sign in to grok/i.test(text) && /continue/i.test(text) && !/login with/i.test(text));
|
|
1476
|
-
if (!isCodeConfirm) return false;
|
|
1477
|
-
|
|
1478
|
-
const fromUrl = page.url?.() || "";
|
|
1479
|
-
let clicked = false;
|
|
1480
|
-
try {
|
|
1481
|
-
const btn = page.getByRole("button", { name: /^Continue$/i }).first();
|
|
1482
|
-
if (await btn.isVisible({ timeout: 300 }).catch(() => false)) {
|
|
1483
|
-
await btn.click({ timeout: 5_000 });
|
|
1484
|
-
clicked = true;
|
|
1485
|
-
}
|
|
1486
|
-
} catch {
|
|
1487
|
-
/* fall through */
|
|
1488
|
-
}
|
|
1489
|
-
if (!clicked) {
|
|
1490
|
-
clicked = await clickFirstActionable(page, [
|
|
1491
|
-
'button[type="submit"]:has-text("Continue")',
|
|
1492
|
-
'button:has-text("Continue")',
|
|
1493
|
-
]);
|
|
1494
|
-
}
|
|
1495
|
-
if (!clicked) return false;
|
|
1496
|
-
|
|
1497
|
-
reportStep?.("confirming_device_code", "Confirmed device user code on xAI");
|
|
1498
|
-
// Event-driven: next screen is Login with Google or URL change — no fixed 1.2s sleep.
|
|
1499
|
-
// GOOGLE_LOGIN_BUTTON_SELECTORS is a string[] — never .split() it.
|
|
1500
|
-
await waitForPageAdvance(page, {
|
|
1501
|
-
fromUrl,
|
|
1502
|
-
urlMatch: (u) => /sign-in|login|oauth/i.test(u) && u !== fromUrl,
|
|
1503
|
-
selector: [
|
|
1504
|
-
...GOOGLE_LOGIN_BUTTON_SELECTORS.slice(0, 8),
|
|
1505
|
-
'button:has-text("Login with Google")',
|
|
1506
|
-
'button:has-text("Login with email")',
|
|
1507
|
-
].join(", "),
|
|
1508
|
-
timeout: 10_000,
|
|
1509
|
-
});
|
|
1510
|
-
return true;
|
|
1511
|
-
}
|
|
1512
|
-
|
|
1513
|
-
/**
|
|
1514
|
-
* Click a Google SSO control without waiting for the cross-origin navigation.
|
|
1515
|
-
*
|
|
1516
|
-
* Playwright's default click() waits for navigations started by the action.
|
|
1517
|
-
* CF → accounts.google.com through a residential proxy often exceeds 5s, so the
|
|
1518
|
-
* click "fails" even though OAuth already started — then we re-click for 30–40s.
|
|
1519
|
-
*/
|
|
1520
|
-
async function clickSsoControl(page, locator) {
|
|
1521
|
-
const enabled = await locator.isEnabled().catch(() => true);
|
|
1522
|
-
if (!enabled) return false;
|
|
1523
|
-
await locator.scrollIntoViewIfNeeded().catch(() => null);
|
|
1524
|
-
const clicked = await locator
|
|
1525
|
-
.click({ timeout: 2_500, force: true, noWaitAfter: true })
|
|
1526
|
-
.then(() => true)
|
|
1527
|
-
.catch(() => false);
|
|
1528
|
-
if (clicked) return true;
|
|
1529
|
-
// Trusted mouse path (also does not wait on navigation).
|
|
1530
|
-
return clickLocatorCenter(page, locator).catch(() => false);
|
|
1531
|
-
}
|
|
1532
|
-
|
|
1533
|
-
async function clickGoogleLoginRole(page) {
|
|
1534
|
-
// Role-based matches are more reliable on SPA auth shells (xAI, CF, etc.)
|
|
1535
|
-
// than CSS :has-text alone — especially when the label is nested / aria-only.
|
|
1536
|
-
const roleNames = [
|
|
1537
|
-
/continue with google/i,
|
|
1538
|
-
/login with google/i,
|
|
1539
|
-
/log in with google/i,
|
|
1540
|
-
/sign up with google/i,
|
|
1541
|
-
/sign in with google/i,
|
|
1542
|
-
/^google$/i,
|
|
1543
|
-
];
|
|
1544
|
-
for (const name of roleNames) {
|
|
1545
|
-
try {
|
|
1546
|
-
const btn = page.getByRole("button", { name }).first();
|
|
1547
|
-
if (await btn.isVisible({ timeout: 250 }).catch(() => false)) {
|
|
1548
|
-
if (await clickSsoControl(page, btn)) return true;
|
|
1549
|
-
}
|
|
1550
|
-
} catch {
|
|
1551
|
-
/* next */
|
|
1552
|
-
}
|
|
1553
|
-
try {
|
|
1554
|
-
const link = page.getByRole("link", { name }).first();
|
|
1555
|
-
if (await link.isVisible({ timeout: 200 }).catch(() => false)) {
|
|
1556
|
-
if (await clickSsoControl(page, link)) return true;
|
|
1557
|
-
}
|
|
1558
|
-
} catch {
|
|
1559
|
-
/* next */
|
|
1560
|
-
}
|
|
1561
|
-
}
|
|
1562
|
-
// Cloudflare: button text "Google", aria-label "Continue with Google"
|
|
1563
|
-
try {
|
|
1564
|
-
const ariaBtn = page.locator('button[aria-label*="Google" i]').first();
|
|
1565
|
-
if (await ariaBtn.isVisible({ timeout: 200 }).catch(() => false)) {
|
|
1566
|
-
if (await clickSsoControl(page, ariaBtn)) return true;
|
|
1567
|
-
}
|
|
1568
|
-
} catch {
|
|
1569
|
-
/* ignore */
|
|
1570
|
-
}
|
|
1571
|
-
// Last resort: CSS text match with noWaitAfter
|
|
1572
|
-
try {
|
|
1573
|
-
const textBtn = page.locator('button:has-text("Google")').first();
|
|
1574
|
-
if (await textBtn.isVisible({ timeout: 150 }).catch(() => false)) {
|
|
1575
|
-
if (await clickSsoControl(page, textBtn)) return true;
|
|
1576
|
-
}
|
|
1577
|
-
} catch {
|
|
1578
|
-
/* ignore */
|
|
1579
|
-
}
|
|
1580
|
-
return false;
|
|
1581
|
-
}
|
|
1582
|
-
|
|
1583
|
-
async function ensureProviderTermsChecked(page, reportStep) {
|
|
1584
|
-
// Returns true only when we newly checked a box (not when already checked).
|
|
1585
|
-
for (const scope of getInteractionScopes(page)) {
|
|
1586
|
-
for (const selector of TERMS_CHECKBOX_SELECTORS) {
|
|
1587
|
-
try {
|
|
1588
|
-
const locator = scope.locator(selector).first();
|
|
1589
|
-
const count = await locator.count().catch(() => 0);
|
|
1590
|
-
if (!count) continue;
|
|
1591
|
-
const visible = await locator.isVisible().catch(() => false);
|
|
1592
|
-
if (!visible) continue;
|
|
1593
|
-
const already = await locator.isChecked().catch(() => false);
|
|
1594
|
-
if (already) return false;
|
|
1595
|
-
const did = await locator.check({ force: true, timeout: 3_000 }).then(() => true).catch(() => false)
|
|
1596
|
-
|| await locator.click({ force: true, timeout: 3_000 }).then(() => true).catch(() => false);
|
|
1597
|
-
if (did) {
|
|
1598
|
-
reportStep?.("accepting_provider_terms", "Accepted provider terms for Google login");
|
|
1599
|
-
// Wait until Google button enables — not a blind sleep.
|
|
1600
|
-
await waitUntil(
|
|
1601
|
-
async () => {
|
|
1602
|
-
try {
|
|
1603
|
-
const btn = page.getByRole("button", { name: /google/i }).first();
|
|
1604
|
-
return (await btn.isVisible().catch(() => false))
|
|
1605
|
-
&& (await btn.isEnabled().catch(() => true));
|
|
1606
|
-
} catch {
|
|
1607
|
-
return true;
|
|
1608
|
-
}
|
|
1609
|
-
},
|
|
1610
|
-
{ timeout: 2_000, interval: 80 },
|
|
1611
|
-
);
|
|
1612
|
-
return true;
|
|
1613
|
-
}
|
|
1614
|
-
} catch {
|
|
1615
|
-
/* next */
|
|
1616
|
-
}
|
|
1617
|
-
}
|
|
1618
|
-
}
|
|
1619
|
-
return false;
|
|
1620
|
-
}
|
|
1621
|
-
|
|
1622
|
-
async function handleProviderLoginGate(page, reportStep, { allowGoogleClick = true } = {}) {
|
|
1623
|
-
if (isGoogleAuthPage(page)) return false;
|
|
1624
|
-
|
|
1625
|
-
await dismissCookieBanners(page, reportStep);
|
|
1626
|
-
|
|
1627
|
-
const confirmedExistingDialog = await clickFirstActionable(page, PRIVACY_CONFIRM_BUTTON_SELECTORS);
|
|
1628
|
-
if (confirmedExistingDialog) {
|
|
1629
|
-
reportStep("accepting_provider_privacy_dialog", "Confirmed provider privacy agreement dialog");
|
|
1630
|
-
return true;
|
|
1631
|
-
}
|
|
1632
|
-
|
|
1633
|
-
// Always try terms first — but do NOT treat "already checked" as progress.
|
|
1634
|
-
// Returning true every loop on an already-checked box blocked Google re-click
|
|
1635
|
-
// for ~30–60s after a failed first SSO attempt.
|
|
1636
|
-
const newlyCheckedTerms = await ensureProviderTermsChecked(page, reportStep);
|
|
1637
|
-
|
|
1638
|
-
if (!allowGoogleClick) {
|
|
1639
|
-
return newlyCheckedTerms;
|
|
1640
|
-
}
|
|
1641
|
-
|
|
1642
|
-
// Prefer explicit Google SSO over generic Continue (device code pages
|
|
1643
|
-
// often have both — clicking Continue without a session yields invalid_code).
|
|
1644
|
-
// Cloudflare: click Google SSO only — never the CF email "Sign in" form.
|
|
1645
|
-
const clickedGoogleRole = await clickGoogleLoginRole(page);
|
|
1646
|
-
let clickedGoogle = clickedGoogleRole;
|
|
1647
|
-
if (!clickedGoogle) {
|
|
1648
|
-
// Selector fallback with noWaitAfter (clickFirstActionable waits on nav — bad for SSO).
|
|
1649
|
-
for (const selector of GOOGLE_LOGIN_BUTTON_SELECTORS.slice(0, 16)) {
|
|
1650
|
-
try {
|
|
1651
|
-
const loc = page.locator(selector).first();
|
|
1652
|
-
if (await loc.isVisible({ timeout: 100 }).catch(() => false)) {
|
|
1653
|
-
if (await clickSsoControl(page, loc)) {
|
|
1654
|
-
clickedGoogle = true;
|
|
1655
|
-
break;
|
|
1656
|
-
}
|
|
1657
|
-
}
|
|
1658
|
-
} catch {
|
|
1659
|
-
/* next */
|
|
1660
|
-
}
|
|
1661
|
-
}
|
|
1662
|
-
}
|
|
1663
|
-
if (clickedGoogle) {
|
|
1664
|
-
reportStep("selecting_google_login", "Selecting Google login");
|
|
1665
|
-
|
|
1666
|
-
const confirmedDialog = await clickFirstActionable(page, PRIVACY_CONFIRM_BUTTON_SELECTORS);
|
|
1667
|
-
if (confirmedDialog) {
|
|
1668
|
-
reportStep("accepting_provider_privacy_dialog", "Confirmed provider privacy agreement dialog");
|
|
1669
|
-
}
|
|
1670
|
-
|
|
1671
|
-
// Wait for OAuth redirect to Google (or email field) — event-driven.
|
|
1672
|
-
// CF→Google through proxy can take a few seconds; click already returned (noWaitAfter).
|
|
1673
|
-
const onCf = isCloudflareLoginUrl(page.url?.() || "");
|
|
1674
|
-
const reached = await waitForPageAdvance(page, {
|
|
1675
|
-
urlMatch: (u) => isGoogleHostname(u),
|
|
1676
|
-
selector: EMAIL_INPUT_SELECTOR,
|
|
1677
|
-
timeout: onCf ? 10_000 : 12_000,
|
|
1678
|
-
});
|
|
1679
|
-
if (reached || isGoogleAuthPage(page)) {
|
|
1680
|
-
reportStep("google_login_page", "Reached Google sign-in after provider SSO");
|
|
1681
|
-
} else {
|
|
1682
|
-
// Popup-based Google SSO
|
|
1683
|
-
try {
|
|
1684
|
-
const ctx = page.context?.();
|
|
1685
|
-
const pages = ctx?.pages?.() || [];
|
|
1686
|
-
for (let i = pages.length - 1; i >= 0; i -= 1) {
|
|
1687
|
-
const p = pages[i];
|
|
1688
|
-
const u = p.url?.() || "";
|
|
1689
|
-
if (isGoogleHostname(u)) {
|
|
1690
|
-
reportStep("google_login_popup", "Google sign-in opened in a popup");
|
|
1691
|
-
break;
|
|
1692
|
-
}
|
|
1693
|
-
}
|
|
1694
|
-
} catch {
|
|
1695
|
-
/* ignore */
|
|
1696
|
-
}
|
|
1697
|
-
}
|
|
1698
|
-
|
|
1699
|
-
return true;
|
|
1700
|
-
}
|
|
1701
|
-
|
|
1702
|
-
return newlyCheckedTerms;
|
|
1703
|
-
}
|
|
1704
|
-
|
|
1705
|
-
/** Fast path for xAI device approve after Google session exists. */
|
|
1706
|
-
async function clickXaiDeviceAuthorize(page, reportStep) {
|
|
1707
|
-
if (!isXaiProviderPage(page)) return false;
|
|
1708
|
-
// Never approve while Google SSO is still on the page — that was thrashing
|
|
1709
|
-
// Continue / Allow before login and landing on "Invalid action".
|
|
1710
|
-
if (await providerHasGoogleLogin(page)) return false;
|
|
1711
|
-
|
|
1712
|
-
// Prefer exact authorize verbs — avoid bare "Continue" (too many false hits).
|
|
1713
|
-
const roles = [
|
|
1714
|
-
/^(Allow|Authorize|Approve|Confirm)$/i,
|
|
1715
|
-
/^(Allow|Authorize|Approve)\b/i,
|
|
1716
|
-
];
|
|
1717
|
-
for (const re of roles) {
|
|
1718
|
-
try {
|
|
1719
|
-
const btn = page.getByRole("button", { name: re }).first();
|
|
1720
|
-
if (await btn.isVisible({ timeout: 200 }).catch(() => false)) {
|
|
1721
|
-
const label = (await btn.innerText().catch(() => "")) || "";
|
|
1722
|
-
if (/google/i.test(label)) continue;
|
|
1723
|
-
await btn.click({ timeout: 3_000 });
|
|
1724
|
-
reportStep?.("approving_consent", "Approving xAI device authorization");
|
|
1725
|
-
return true;
|
|
1726
|
-
}
|
|
1727
|
-
} catch {
|
|
1728
|
-
/* next */
|
|
1729
|
-
}
|
|
1730
|
-
}
|
|
1731
|
-
return false;
|
|
1732
|
-
}
|
|
1733
|
-
|
|
1734
|
-
/**
|
|
1735
|
-
* Capture Kiro OAuth callback (kiro://…?code=…).
|
|
1736
|
-
*
|
|
1737
|
-
* After password, Google parks the main frame on empty SetSID while the network
|
|
1738
|
-
* completes consent → Cognito idpresponse → 302 Location: kiro://…. Custom-protocol
|
|
1739
|
-
* redirects often never become a page navigation, so we listen on:
|
|
1740
|
-
* - page + context request / requestfailed / response (Location header)
|
|
1741
|
-
* - CDP Network (most reliable on headed Chromium / SetSID)
|
|
1742
|
-
*
|
|
1743
|
-
* Never force-navigate idpresponse/consent from the monitor — that aborts the
|
|
1744
|
-
* natural hop before kiro:// is emitted.
|
|
1745
|
-
*/
|
|
1746
|
-
export function createKiroCallbackMonitor(context, page, timeoutMs = DEFAULT_MANUAL_TIMEOUT_MS) {
|
|
1747
|
-
let resolveOuter;
|
|
1748
|
-
let rejectOuter;
|
|
1749
|
-
const promise = new Promise((resolve, reject) => {
|
|
1750
|
-
resolveOuter = resolve;
|
|
1751
|
-
rejectOuter = reject;
|
|
1752
|
-
});
|
|
1753
|
-
|
|
1754
|
-
let settled = false;
|
|
1755
|
-
const trackedPages = new Set();
|
|
1756
|
-
const contextCleanups = new Map();
|
|
1757
|
-
const timeoutHandle = setTimeout(() => {
|
|
1758
|
-
settle(null, new Error("Timed out waiting for Kiro callback"));
|
|
1759
|
-
}, timeoutMs);
|
|
1760
|
-
|
|
1761
|
-
function settle(result, error = null) {
|
|
1762
|
-
if (settled) return;
|
|
1763
|
-
settled = true;
|
|
1764
|
-
clearTimeout(timeoutHandle);
|
|
1765
|
-
for (const fns of contextCleanups.values()) {
|
|
1766
|
-
for (const fn of fns) {
|
|
1767
|
-
try { fn(); } catch {}
|
|
1768
|
-
}
|
|
1769
|
-
}
|
|
1770
|
-
contextCleanups.clear();
|
|
1771
|
-
if (error) rejectOuter(error);
|
|
1772
|
-
else resolveOuter(result);
|
|
1773
|
-
}
|
|
1774
|
-
|
|
1775
|
-
function trySettleFromUrl(rawUrl) {
|
|
1776
|
-
const parsed = parseCallbackUrl(rawUrl || "");
|
|
1777
|
-
if (parsed) settle(parsed);
|
|
1778
|
-
return Boolean(parsed);
|
|
1779
|
-
}
|
|
1780
|
-
|
|
1781
|
-
function trySettleFromResponse(response) {
|
|
1782
|
-
try {
|
|
1783
|
-
trySettleFromUrl(response?.url?.() || "");
|
|
1784
|
-
const headers = typeof response?.headers === "function" ? response.headers() : null;
|
|
1785
|
-
const location = headers?.location || headers?.Location || "";
|
|
1786
|
-
if (location) trySettleFromUrl(location);
|
|
1787
|
-
} catch {
|
|
1788
|
-
/* ignore */
|
|
1789
|
-
}
|
|
1790
|
-
}
|
|
1791
|
-
|
|
1792
|
-
function attachCdpNetwork(trackedPage, ownerCleanups) {
|
|
1793
|
-
void (async () => {
|
|
1794
|
-
try {
|
|
1795
|
-
if (settled) return;
|
|
1796
|
-
const ctx = trackedPage.context?.();
|
|
1797
|
-
if (!ctx?.newCDPSession) return;
|
|
1798
|
-
const session = await ctx.newCDPSession(trackedPage);
|
|
1799
|
-
await session.send("Network.enable").catch(() => null);
|
|
1800
|
-
|
|
1801
|
-
const onCdpResponse = (params) => {
|
|
1802
|
-
try {
|
|
1803
|
-
const headers = params?.response?.headers || {};
|
|
1804
|
-
const loc = headers.location || headers.Location || "";
|
|
1805
|
-
if (loc) trySettleFromUrl(loc);
|
|
1806
|
-
trySettleFromUrl(params?.response?.url || "");
|
|
1807
|
-
} catch {
|
|
1808
|
-
/* ignore */
|
|
1809
|
-
}
|
|
1810
|
-
};
|
|
1811
|
-
const onCdpRequest = (params) => {
|
|
1812
|
-
try {
|
|
1813
|
-
trySettleFromUrl(params?.request?.url || "");
|
|
1814
|
-
} catch {
|
|
1815
|
-
/* ignore */
|
|
1816
|
-
}
|
|
1817
|
-
};
|
|
1818
|
-
|
|
1819
|
-
session.on("Network.responseReceived", onCdpResponse);
|
|
1820
|
-
session.on("Network.requestWillBeSent", onCdpRequest);
|
|
1821
|
-
ownerCleanups.push(() => {
|
|
1822
|
-
try { session.off?.("Network.responseReceived", onCdpResponse); } catch {}
|
|
1823
|
-
try { session.off?.("Network.requestWillBeSent", onCdpRequest); } catch {}
|
|
1824
|
-
void session.detach?.().catch(() => null);
|
|
1825
|
-
});
|
|
1826
|
-
} catch {
|
|
1827
|
-
/* CDP unavailable — page/context listeners remain */
|
|
1828
|
-
}
|
|
1829
|
-
})();
|
|
1830
|
-
}
|
|
1831
|
-
|
|
1832
|
-
function registerPage(trackedPage, ownerCleanups) {
|
|
1833
|
-
if (!trackedPage || trackedPages.has(trackedPage)) return;
|
|
1834
|
-
trackedPages.add(trackedPage);
|
|
1835
|
-
|
|
1836
|
-
const onFrame = (frame) => trySettleFromUrl(frame?.url?.() || "");
|
|
1837
|
-
const onRequest = (request) => trySettleFromUrl(request?.url?.() || "");
|
|
1838
|
-
const onRequestFailed = (request) => trySettleFromUrl(request?.url?.() || "");
|
|
1839
|
-
const onResponse = (response) => trySettleFromResponse(response);
|
|
1840
|
-
const onLoadState = () => trySettleFromUrl(trackedPage.url?.() || "");
|
|
1841
|
-
const onClose = () => {
|
|
1842
|
-
settle(null, new Error("Browser session closed while waiting for Kiro callback"));
|
|
1843
|
-
};
|
|
1844
|
-
|
|
1845
|
-
trackedPage.on("framenavigated", onFrame);
|
|
1846
|
-
trackedPage.on("request", onRequest);
|
|
1847
|
-
trackedPage.on("requestfailed", onRequestFailed);
|
|
1848
|
-
trackedPage.on("response", onResponse);
|
|
1849
|
-
trackedPage.on("domcontentloaded", onLoadState);
|
|
1850
|
-
trackedPage.on("load", onLoadState);
|
|
1851
|
-
trackedPage.on("close", onClose);
|
|
1852
|
-
|
|
1853
|
-
ownerCleanups.push(() => {
|
|
1854
|
-
trackedPage.off("framenavigated", onFrame);
|
|
1855
|
-
trackedPage.off("request", onRequest);
|
|
1856
|
-
trackedPage.off("requestfailed", onRequestFailed);
|
|
1857
|
-
trackedPage.off("response", onResponse);
|
|
1858
|
-
trackedPage.off("domcontentloaded", onLoadState);
|
|
1859
|
-
trackedPage.off("load", onLoadState);
|
|
1860
|
-
trackedPage.off("close", onClose);
|
|
1861
|
-
});
|
|
1862
|
-
|
|
1863
|
-
attachCdpNetwork(trackedPage, ownerCleanups);
|
|
1864
|
-
|
|
1865
|
-
const current = parseCallbackUrl(trackedPage.url?.() || "");
|
|
1866
|
-
if (current) settle(current);
|
|
1867
|
-
}
|
|
1868
|
-
|
|
1869
|
-
function bind(ctx, pg) {
|
|
1870
|
-
if (settled) return;
|
|
1871
|
-
if (contextCleanups.has(ctx)) return;
|
|
1872
|
-
const cleanups = [];
|
|
1873
|
-
contextCleanups.set(ctx, cleanups);
|
|
1874
|
-
|
|
1875
|
-
const onPage = (newPage) => registerPage(newPage, cleanups);
|
|
1876
|
-
const onClose = () => {
|
|
1877
|
-
settle(null, new Error("Browser context closed while waiting for Kiro callback"));
|
|
1878
|
-
};
|
|
1879
|
-
const onCtxRequest = (request) => trySettleFromUrl(request?.url?.() || "");
|
|
1880
|
-
const onCtxRequestFailed = (request) => trySettleFromUrl(request?.url?.() || "");
|
|
1881
|
-
const onCtxResponse = (response) => trySettleFromResponse(response);
|
|
1882
|
-
|
|
1883
|
-
ctx.on("page", onPage);
|
|
1884
|
-
ctx.on("close", onClose);
|
|
1885
|
-
ctx.on("request", onCtxRequest);
|
|
1886
|
-
ctx.on("requestfailed", onCtxRequestFailed);
|
|
1887
|
-
ctx.on("response", onCtxResponse);
|
|
1888
|
-
cleanups.push(() => ctx.off("page", onPage));
|
|
1889
|
-
cleanups.push(() => ctx.off("close", onClose));
|
|
1890
|
-
cleanups.push(() => ctx.off("request", onCtxRequest));
|
|
1891
|
-
cleanups.push(() => ctx.off("requestfailed", onCtxRequestFailed));
|
|
1892
|
-
cleanups.push(() => ctx.off("response", onCtxResponse));
|
|
1893
|
-
|
|
1894
|
-
if (pg) registerPage(pg, cleanups);
|
|
1895
|
-
}
|
|
1896
|
-
|
|
1897
|
-
bind(context, page);
|
|
1898
|
-
|
|
1899
|
-
promise.rebind = ({ context: newContext, page: newPage } = {}) => {
|
|
1900
|
-
if (newContext) bind(newContext, newPage);
|
|
1901
|
-
};
|
|
1902
|
-
|
|
1903
|
-
promise.abort = (reason = "Job cancelled") => {
|
|
1904
|
-
settle(null, new Error(reason));
|
|
1905
|
-
};
|
|
1906
|
-
|
|
1907
|
-
return promise;
|
|
1908
|
-
}
|
|
1909
|
-
|
|
1910
|
-
// Parse any OAuth redirect callback URL (e.g. http://localhost:8080/callback?code=...)
|
|
1911
|
-
// against a configurable prefix. Returns { callbackUrl, code, state } or null.
|
|
1912
|
-
function parseCallbackUrlWithPrefix(rawUrl, prefix) {
|
|
1913
|
-
if (!rawUrl || !prefix || !rawUrl.startsWith(prefix)) return null;
|
|
1914
|
-
const queryIndex = rawUrl.indexOf("?");
|
|
1915
|
-
const params = new URLSearchParams(queryIndex >= 0 ? rawUrl.slice(queryIndex + 1) : "");
|
|
1916
|
-
const code = params.get("code");
|
|
1917
|
-
const state = params.get("state");
|
|
1918
|
-
if (!code) return null;
|
|
1919
|
-
return { callbackUrl: rawUrl, code, state };
|
|
1920
|
-
}
|
|
1921
|
-
|
|
1922
|
-
// Generic version of createKiroCallbackMonitor for authorization_code providers
|
|
1923
|
-
// whose redirect_uri is an http(s) loopback (e.g. Antigravity → http://localhost:8080/callback).
|
|
1924
|
-
// The browser may fail to actually load the loopback (connection refused), but the
|
|
1925
|
-
// request/framenavigated/requestfailed events still fire with the URL+code, which we capture.
|
|
1926
|
-
export function createGenericCallbackMonitor(context, page, { prefix, timeoutMs = DEFAULT_MANUAL_TIMEOUT_MS } = {}) {
|
|
1927
|
-
let resolveOuter;
|
|
1928
|
-
let rejectOuter;
|
|
1929
|
-
const promise = new Promise((resolve, reject) => {
|
|
1930
|
-
resolveOuter = resolve;
|
|
1931
|
-
rejectOuter = reject;
|
|
1932
|
-
});
|
|
1933
|
-
|
|
1934
|
-
let settled = false;
|
|
1935
|
-
const trackedPages = new Set();
|
|
1936
|
-
const contextCleanups = new Map();
|
|
1937
|
-
const timeoutHandle = setTimeout(() => {
|
|
1938
|
-
settle(null, new Error("Timed out waiting for OAuth callback"));
|
|
1939
|
-
}, timeoutMs);
|
|
1940
|
-
|
|
1941
|
-
function settle(result, error = null) {
|
|
1942
|
-
if (settled) return;
|
|
1943
|
-
settled = true;
|
|
1944
|
-
clearTimeout(timeoutHandle);
|
|
1945
|
-
for (const fns of contextCleanups.values()) {
|
|
1946
|
-
for (const fn of fns) {
|
|
1947
|
-
try { fn(); } catch {}
|
|
1948
|
-
}
|
|
1949
|
-
}
|
|
1950
|
-
contextCleanups.clear();
|
|
1951
|
-
if (error) rejectOuter(error);
|
|
1952
|
-
else resolveOuter(result);
|
|
1953
|
-
}
|
|
1954
|
-
|
|
1955
|
-
function registerPage(trackedPage, ownerCleanups) {
|
|
1956
|
-
if (!trackedPage || trackedPages.has(trackedPage)) return;
|
|
1957
|
-
trackedPages.add(trackedPage);
|
|
1958
|
-
|
|
1959
|
-
const check = (url) => {
|
|
1960
|
-
const parsed = parseCallbackUrlWithPrefix(url || "", prefix);
|
|
1961
|
-
if (parsed) settle(parsed);
|
|
1962
|
-
};
|
|
1963
|
-
const onFrame = (frame) => check(frame?.url?.() || "");
|
|
1964
|
-
const onRequest = (request) => check(request?.url?.() || "");
|
|
1965
|
-
const onRequestFailed = (request) => check(request?.url?.() || "");
|
|
1966
|
-
const onLoadState = () => check(trackedPage.url?.() || "");
|
|
1967
|
-
|
|
1968
|
-
trackedPage.on("framenavigated", onFrame);
|
|
1969
|
-
trackedPage.on("request", onRequest);
|
|
1970
|
-
trackedPage.on("requestfailed", onRequestFailed);
|
|
1971
|
-
trackedPage.on("domcontentloaded", onLoadState);
|
|
1972
|
-
trackedPage.on("load", onLoadState);
|
|
1973
|
-
|
|
1974
|
-
ownerCleanups.push(() => {
|
|
1975
|
-
trackedPage.off("framenavigated", onFrame);
|
|
1976
|
-
trackedPage.off("request", onRequest);
|
|
1977
|
-
trackedPage.off("requestfailed", onRequestFailed);
|
|
1978
|
-
trackedPage.off("domcontentloaded", onLoadState);
|
|
1979
|
-
trackedPage.off("load", onLoadState);
|
|
1980
|
-
});
|
|
1981
|
-
|
|
1982
|
-
check(trackedPage.url?.() || "");
|
|
1983
|
-
}
|
|
1984
|
-
|
|
1985
|
-
function bind(ctx, pg) {
|
|
1986
|
-
if (settled) return;
|
|
1987
|
-
if (contextCleanups.has(ctx)) return;
|
|
1988
|
-
const cleanups = [];
|
|
1989
|
-
contextCleanups.set(ctx, cleanups);
|
|
1990
|
-
const onPage = (newPage) => registerPage(newPage, cleanups);
|
|
1991
|
-
ctx.on("page", onPage);
|
|
1992
|
-
cleanups.push(() => ctx.off("page", onPage));
|
|
1993
|
-
if (pg) registerPage(pg, cleanups);
|
|
1994
|
-
}
|
|
1995
|
-
|
|
1996
|
-
bind(context, page);
|
|
1997
|
-
promise.rebind = ({ context: newContext, page: newPage } = {}) => {
|
|
1998
|
-
if (newContext) bind(newContext, newPage);
|
|
1999
|
-
};
|
|
2000
|
-
|
|
2001
|
-
return promise;
|
|
2002
|
-
}
|
|
2003
|
-
|
|
2004
|
-
export async function runGoogleAccountAutomation({
|
|
2005
|
-
page,
|
|
2006
|
-
authUrl,
|
|
2007
|
-
email,
|
|
2008
|
-
password,
|
|
2009
|
-
successPromise,
|
|
2010
|
-
shortTimeoutMs = DEFAULT_SHORT_TIMEOUT_MS,
|
|
2011
|
-
serviceLabel = "provider",
|
|
2012
|
-
openingStep = "opening_google_oauth",
|
|
2013
|
-
openingMessage = "Opening Google OAuth page",
|
|
2014
|
-
successStep = "oauth_success_received",
|
|
2015
|
-
successMessage = "OAuth success received",
|
|
2016
|
-
onStep,
|
|
2017
|
-
/** When true, skip page.goto(authUrl) — caller already navigated (e.g. CF pre-click Google). */
|
|
2018
|
-
skipGoto = false,
|
|
2019
|
-
/** Caller already clicked Google SSO; wait for accounts.google.com before re-clicking. */
|
|
2020
|
-
expectGoogleSoon = false,
|
|
2021
|
-
}) {
|
|
2022
|
-
const startTime = Date.now();
|
|
2023
|
-
const reportStep = (step, message) => {
|
|
2024
|
-
onStep?.(step, message);
|
|
2025
|
-
};
|
|
2026
|
-
|
|
2027
|
-
const interstitialOpts = (maxWaitMs) => ({ maxWaitMs, successPromise });
|
|
2028
|
-
// Prevent re-submitting email/password while Google is still transitioning
|
|
2029
|
-
// (pwd page stays mounted ~1–3s after Next; re-fill aborts the OAuth chain).
|
|
2030
|
-
let passwordSubmittedAt = 0;
|
|
2031
|
-
let emailSubmittedAt = 0;
|
|
2032
|
-
let googleLoginSelectedAt = 0;
|
|
2033
|
-
let seenGoogleAuth = false;
|
|
2034
|
-
let deviceApproveAt = 0;
|
|
2035
|
-
let deviceInvalidReopenAt = 0;
|
|
2036
|
-
let deviceInvalidReopenCount = 0;
|
|
2037
|
-
// Cooldowns prevent double-submit only — not artificial pacing.
|
|
2038
|
-
const PASSWORD_RESUBMIT_COOLDOWN_MS = isGrokish(serviceLabel) ? 6_000 : 18_000;
|
|
2039
|
-
// Longer email cooldown for fast bulk — Google identifier page can sit 5–10s
|
|
2040
|
-
// after Next; re-typing the whole email wastes another 10–15s.
|
|
2041
|
-
const EMAIL_RESUBMIT_COOLDOWN_MS = isGrokish(serviceLabel) ? 12_000 : 8_000;
|
|
2042
|
-
const GOOGLE_SSO_COOLDOWN_MS = isGrokish(serviceLabel) ? 3_000 : 8_000;
|
|
2043
|
-
// Don't hammer Allow — xAI rate_limits rapid device posts.
|
|
2044
|
-
const DEVICE_APPROVE_COOLDOWN_MS = 3_000;
|
|
2045
|
-
const DEVICE_INVALID_REOPEN_COOLDOWN_MS = 4_000;
|
|
2046
|
-
const DEVICE_INVALID_REOPEN_MAX = 3;
|
|
2047
|
-
const isGrokFlow = isGrokish(serviceLabel);
|
|
2048
|
-
// Grok does not need the long Kiro SetSID / kiro:// interstitial window.
|
|
2049
|
-
const postPasswordInterstitialMs = isGrokFlow ? 4_000 : 25_000;
|
|
2050
|
-
// Loop poll: race successPromise — keep tiny so fast networks aren't stalled.
|
|
2051
|
-
const loopTickMs = isGrokFlow ? 120 : 500;
|
|
2052
|
-
|
|
2053
|
-
let alreadyOnGoogle = skipGoto && isGoogleAuthPage(page);
|
|
2054
|
-
if (!skipGoto) {
|
|
2055
|
-
reportStep(openingStep, openingMessage);
|
|
2056
|
-
await page.goto(authUrl, { waitUntil: "domcontentloaded", timeout: 60_000 });
|
|
2057
|
-
await dismissCookieBanners(page, reportStep);
|
|
2058
|
-
} else if (alreadyOnGoogle) {
|
|
2059
|
-
reportStep("google_login_page", "Already on Google sign-in — filling credentials");
|
|
2060
|
-
} else if (expectGoogleSoon) {
|
|
2061
|
-
// CF (etc.) already clicked Google — wait for redirect, do NOT re-goto / re-click yet.
|
|
2062
|
-
reportStep("waiting_google_redirect", "Waiting for Google after provider SSO click");
|
|
2063
|
-
const reached = await waitUntil(() => isGoogleAuthPage(page), {
|
|
2064
|
-
timeout: 25_000,
|
|
2065
|
-
interval: 100,
|
|
2066
|
-
});
|
|
2067
|
-
if (reached) {
|
|
2068
|
-
alreadyOnGoogle = true;
|
|
2069
|
-
googleLoginSelectedAt = Date.now();
|
|
2070
|
-
reportStep("google_login_page", "Reached Google sign-in after provider SSO");
|
|
2071
|
-
} else {
|
|
2072
|
-
reportStep("google_redirect_slow", "Google redirect slow — will retry SSO click");
|
|
2073
|
-
}
|
|
2074
|
-
} else {
|
|
2075
|
-
reportStep(openingStep, openingMessage);
|
|
2076
|
-
await dismissCookieBanners(page, reportStep);
|
|
2077
|
-
}
|
|
2078
|
-
|
|
2079
|
-
// Cloudflare login always shows email/password fields — do NOT treat those as
|
|
2080
|
-
// "ready for Google email fill". Wait for Google SSO button / Google page only.
|
|
2081
|
-
const onCfLogin = isCloudflareLoginUrl(page.url?.() || "") || /cloudflare/i.test(String(serviceLabel || ""));
|
|
2082
|
-
|
|
2083
|
-
if (!alreadyOnGoogle) {
|
|
2084
|
-
await waitUntil(
|
|
2085
|
-
async () => {
|
|
2086
|
-
if (isGoogleAuthPage(page)) return true;
|
|
2087
|
-
if (await getFirstVisibleLocator(
|
|
2088
|
-
page,
|
|
2089
|
-
'button[aria-label*="Google" i], button:has-text("Continue with Google"), button:has-text("Login with Google"), button:has-text("Google")',
|
|
2090
|
-
)) {
|
|
2091
|
-
return true;
|
|
2092
|
-
}
|
|
2093
|
-
if (!onCfLogin && (await getFirstVisibleLocator(page, EMAIL_INPUT_SELECTOR))) {
|
|
2094
|
-
return true;
|
|
2095
|
-
}
|
|
2096
|
-
if (!onCfLogin && (await getFirstVisibleLocator(page, 'button:has-text("Continue")'))) {
|
|
2097
|
-
return true;
|
|
2098
|
-
}
|
|
2099
|
-
return false;
|
|
2100
|
-
},
|
|
2101
|
-
{ timeout: isGrokFlow ? 8_000 : 12_000, interval: 80 },
|
|
2102
|
-
);
|
|
2103
|
-
if (!isGrokFlow) {
|
|
2104
|
-
await waitThroughGoogleInterstitials(page, reportStep, interstitialOpts(8_000));
|
|
2105
|
-
}
|
|
2106
|
-
|
|
2107
|
-
// Provider shells (xAI device, CodeBuddy, Cloudflare, …) must pick Google SSO first.
|
|
2108
|
-
// Never type credentials into provider email fields (CF has its own email/password).
|
|
2109
|
-
for (let attempt = 0; attempt < (isGrokFlow || onCfLogin ? 8 : 2); attempt += 1) {
|
|
2110
|
-
if (isGoogleAuthPage(page)) break;
|
|
2111
|
-
await dismissCookieBanners(page, reportStep);
|
|
2112
|
-
if (await handleXaiDeviceCodeConfirm(page, reportStep)) {
|
|
2113
|
-
continue;
|
|
2114
|
-
}
|
|
2115
|
-
if (await handleProviderLoginGate(page, reportStep)) {
|
|
2116
|
-
googleLoginSelectedAt = Date.now();
|
|
2117
|
-
if (isGoogleAuthPage(page)) break;
|
|
2118
|
-
// Gate already waited for Google URL; only brief yield if still on provider.
|
|
2119
|
-
await yieldMs(50);
|
|
2120
|
-
continue;
|
|
2121
|
-
}
|
|
2122
|
-
// SPA not ready — poll for Google SSO (not CF email form).
|
|
2123
|
-
const ready = await waitUntil(
|
|
2124
|
-
async () =>
|
|
2125
|
-
isGoogleAuthPage(page)
|
|
2126
|
-
|| (await providerHasGoogleLogin(page))
|
|
2127
|
-
|| /enter the code|login with google|continue with google/i.test(
|
|
2128
|
-
await readPageText(page).catch(() => ""),
|
|
2129
|
-
),
|
|
2130
|
-
{ timeout: 600, interval: 80 },
|
|
2131
|
-
);
|
|
2132
|
-
if (!ready) await yieldMs(80);
|
|
2133
|
-
}
|
|
2134
|
-
if (!isGrokFlow) {
|
|
2135
|
-
await waitThroughGoogleInterstitials(page, reportStep, interstitialOpts(6_000));
|
|
2136
|
-
}
|
|
2137
|
-
}
|
|
2138
|
-
|
|
2139
|
-
// Only fill Google email once we are actually on accounts.google.com.
|
|
2140
|
-
if (isGoogleAuthPage(page)) {
|
|
2141
|
-
seenGoogleAuth = true;
|
|
2142
|
-
const emailInput = await waitForFirstVisibleLocator(page, EMAIL_INPUT_SELECTOR, { timeout: 10_000 });
|
|
2143
|
-
if (emailInput) {
|
|
2144
|
-
reportStep("entering_email", "Entering Google email");
|
|
2145
|
-
const filled = await fillInputResilient(emailInput, email);
|
|
2146
|
-
if (!filled) {
|
|
2147
|
-
reportStep("email_fill_failed", "Could not fill the Google email field; will retry in the polling loop");
|
|
2148
|
-
} else {
|
|
2149
|
-
reportStep("submitting_email", "Submitting email");
|
|
2150
|
-
await clickFirstVisible(page, NEXT_BUTTON_SELECTORS);
|
|
2151
|
-
emailSubmittedAt = Date.now();
|
|
2152
|
-
// Wait for password field (or leave email step) — not fixed sleep.
|
|
2153
|
-
await waitForPageAdvance(page, {
|
|
2154
|
-
selector: PASSWORD_INPUT_SELECTOR,
|
|
2155
|
-
timeout: isGrokFlow ? 8_000 : 12_000,
|
|
2156
|
-
});
|
|
2157
|
-
if (!isGrokFlow) {
|
|
2158
|
-
await waitThroughGoogleInterstitials(page, reportStep, interstitialOpts(8_000));
|
|
2159
|
-
}
|
|
2160
|
-
}
|
|
2161
|
-
}
|
|
2162
|
-
} else if (isProviderPage(page)) {
|
|
2163
|
-
reportStep(
|
|
2164
|
-
"waiting_for_google_sso",
|
|
2165
|
-
`Provider page still open (${(page.url?.() || "").slice(0, 80)}) — will keep selecting Google login`,
|
|
2166
|
-
);
|
|
2167
|
-
}
|
|
2168
|
-
|
|
2169
|
-
while (Date.now() - startTime < shortTimeoutMs) {
|
|
2170
|
-
const successResult = await Promise.race([
|
|
2171
|
-
successPromise.then((result) => ({ kind: "success", result })).catch((error) => ({ kind: "success_error", error })),
|
|
2172
|
-
new Promise((resolve) => setTimeout(() => resolve(null), loopTickMs)),
|
|
2173
|
-
]);
|
|
2174
|
-
|
|
2175
|
-
if (successResult?.kind === "success") {
|
|
2176
|
-
reportStep(successStep, successMessage);
|
|
2177
|
-
return {
|
|
2178
|
-
status: "success",
|
|
2179
|
-
...successResult.result,
|
|
2180
|
-
};
|
|
2181
|
-
}
|
|
2182
|
-
|
|
2183
|
-
if (successResult?.kind === "success_error") {
|
|
2184
|
-
reportStep("oauth_timeout", `Timed out waiting for ${serviceLabel} authorization`);
|
|
2185
|
-
return {
|
|
2186
|
-
status: "failed_timeout",
|
|
2187
|
-
error: successResult.error?.message || `Timed out waiting for ${serviceLabel} authorization`,
|
|
2188
|
-
};
|
|
2189
|
-
}
|
|
2190
|
-
|
|
2191
|
-
// Cloudflare: after Google password, land on dash — park on harvest promise.
|
|
2192
|
-
// Do NOT thrash cookie dismiss / generic Approve (starves token API work).
|
|
2193
|
-
if (
|
|
2194
|
-
isGrokFlow
|
|
2195
|
-
&& seenGoogleAuth
|
|
2196
|
-
&& passwordSubmittedAt
|
|
2197
|
-
&& /cloudflare/i.test(String(serviceLabel || ""))
|
|
2198
|
-
) {
|
|
2199
|
-
try {
|
|
2200
|
-
const u = new URL(page.url?.() || "");
|
|
2201
|
-
const onDash =
|
|
2202
|
-
u.hostname === "dash.cloudflare.com"
|
|
2203
|
-
&& !u.pathname.includes("/login")
|
|
2204
|
-
&& !u.href.includes("oidcJwt");
|
|
2205
|
-
if (onDash) {
|
|
2206
|
-
reportStep(
|
|
2207
|
-
"waiting_cf_harvest",
|
|
2208
|
-
"On Cloudflare dashboard — waiting for Workers AI token harvest",
|
|
2209
|
-
);
|
|
2210
|
-
// Yield the page: only race success (longer tick while harvesting).
|
|
2211
|
-
const parked = await Promise.race([
|
|
2212
|
-
successPromise
|
|
2213
|
-
.then((result) => ({ kind: "success", result }))
|
|
2214
|
-
.catch((error) => ({ kind: "success_error", error })),
|
|
2215
|
-
yieldMs(2_000).then(() => null),
|
|
2216
|
-
]);
|
|
2217
|
-
if (parked?.kind === "success") {
|
|
2218
|
-
reportStep(successStep, successMessage);
|
|
2219
|
-
return { status: "success", ...parked.result };
|
|
2220
|
-
}
|
|
2221
|
-
if (parked?.kind === "success_error") {
|
|
2222
|
-
reportStep("oauth_timeout", `Timed out waiting for ${serviceLabel} authorization`);
|
|
2223
|
-
return {
|
|
2224
|
-
status: "failed_timeout",
|
|
2225
|
-
error: parked.error?.message || `Timed out waiting for ${serviceLabel} authorization`,
|
|
2226
|
-
};
|
|
2227
|
-
}
|
|
2228
|
-
continue;
|
|
2229
|
-
}
|
|
2230
|
-
} catch {
|
|
2231
|
-
/* fall through */
|
|
2232
|
-
}
|
|
2233
|
-
}
|
|
2234
|
-
|
|
2235
|
-
// Unblock SetSID / empty Google interstitials before other handlers
|
|
2236
|
-
const waited = await waitThroughGoogleInterstitials(
|
|
2237
|
-
page,
|
|
2238
|
-
reportStep,
|
|
2239
|
-
interstitialOpts(isGrokFlow ? 2_500 : 8_000),
|
|
2240
|
-
);
|
|
2241
|
-
if (waited) {
|
|
2242
|
-
continue;
|
|
2243
|
-
}
|
|
2244
|
-
|
|
2245
|
-
const handledGoogleConsent = await handleGoogleConsent(page, reportStep);
|
|
2246
|
-
if (handledGoogleConsent) {
|
|
2247
|
-
if (!isGrokFlow) {
|
|
2248
|
-
await waitThroughGoogleInterstitials(page, reportStep, interstitialOpts(12_000));
|
|
2249
|
-
} else {
|
|
2250
|
-
await waitForPageAdvance(page, { timeout: 4_000 });
|
|
2251
|
-
}
|
|
2252
|
-
continue;
|
|
2253
|
-
}
|
|
2254
|
-
|
|
2255
|
-
// Headless Chromium is rejected after email submit → /v3/signin/rejected
|
|
2256
|
-
// ("This browser or app may not be secure"). Fail fast — do not spin 90s.
|
|
2257
|
-
if (await isBlockedBrowser(page)) {
|
|
2258
|
-
const url = page.url?.() || "";
|
|
2259
|
-
reportStep(
|
|
2260
|
-
"browser_blocked_by_google",
|
|
2261
|
-
`Google blocked this browser (url=${url.slice(0, 120)}). Use headed CloakBrowser (Xvfb on Linux).`,
|
|
2262
|
-
);
|
|
2263
|
-
return {
|
|
2264
|
-
status: "failed_browser_blocked",
|
|
2265
|
-
error:
|
|
2266
|
-
"Google blocked the automated browser (\"This browser or app may not be secure\" / signin rejected). " +
|
|
2267
|
-
"Kiro bulk must use headed CloakBrowser (Xvfb on Linux), not headless Chrome.",
|
|
2268
|
-
};
|
|
2269
|
-
}
|
|
2270
|
-
|
|
2271
|
-
const text = await readPageText(page);
|
|
2272
|
-
if (includesAny(text, INVALID_CREDENTIAL_MARKERS)) {
|
|
2273
|
-
reportStep("invalid_credentials", "Google rejected the supplied email or password");
|
|
2274
|
-
return {
|
|
2275
|
-
status: "failed_invalid_credentials",
|
|
2276
|
-
error: "Google rejected the supplied email or password.",
|
|
2277
|
-
};
|
|
2278
|
-
}
|
|
2279
|
-
|
|
2280
|
-
if (includesAny(text, RESTRICTED_ACCOUNT_MARKERS)) {
|
|
2281
|
-
reportStep("account_restricted", "Account is restricted, suspended, or banned by the provider");
|
|
2282
|
-
return {
|
|
2283
|
-
status: "failed_restricted",
|
|
2284
|
-
error: "Account is restricted, suspended, or banned. Skipping.",
|
|
2285
|
-
};
|
|
2286
|
-
}
|
|
2287
|
-
|
|
2288
|
-
if (includesAny(text, MANUAL_ASSIST_MARKERS)) {
|
|
2289
|
-
const isCaptcha = /captcha|recaptcha|not a robot|select all images|select all squares/i.test(text);
|
|
2290
|
-
reportStep(
|
|
2291
|
-
isCaptcha ? "google_captcha" : "manual_assist_required",
|
|
2292
|
-
isCaptcha
|
|
2293
|
-
? "Google CAPTCHA / bot check"
|
|
2294
|
-
: "Google requested CAPTCHA, 2FA, or recovery verification",
|
|
2295
|
-
);
|
|
2296
|
-
return {
|
|
2297
|
-
status: "needs_manual",
|
|
2298
|
-
error: isCaptcha
|
|
2299
|
-
? "Google CAPTCHA (bot check). Not fixed by lowering workers — use headed CloakBrowser with Xvfb, a residential proxy, and avoid blocking Google domains. Open manual assist to solve CAPTCHA once."
|
|
2300
|
-
: "Manual assist required in the browser session (CAPTCHA, 2FA, recovery, or suspicious-login challenge).",
|
|
2301
|
-
};
|
|
2302
|
-
}
|
|
2303
|
-
|
|
2304
|
-
const handledOnboarding = await handleGoogleOnboarding(page, text);
|
|
2305
|
-
if (handledOnboarding) {
|
|
2306
|
-
reportStep("google_onboarding", "Accepted Google onboarding or privacy prompt");
|
|
2307
|
-
continue;
|
|
2308
|
-
}
|
|
2309
|
-
|
|
2310
|
-
// xAI rate-limits device authorize after rapid retries — fail fast.
|
|
2311
|
-
if (
|
|
2312
|
-
isProviderPage(page)
|
|
2313
|
-
&& (/rate[_ ]?limit/i.test(text) || /error=rate_limited/i.test(page.url?.() || ""))
|
|
2314
|
-
) {
|
|
2315
|
-
reportStep("device_rate_limited", "xAI device authorization rate-limited");
|
|
2316
|
-
return {
|
|
2317
|
-
status: "failed",
|
|
2318
|
-
error: "xAI rate-limited device authorization. Wait a few minutes and retry (too many rapid device-code attempts).",
|
|
2319
|
-
};
|
|
2320
|
-
}
|
|
2321
|
-
|
|
2322
|
-
// xAI often lands on /oauth2/device/approve with "Invalid action" after
|
|
2323
|
-
// Google consent when the approve form was double-submitted. Re-open the
|
|
2324
|
-
// original device URL (with user_code) a few times — not every loop tick.
|
|
2325
|
-
if (
|
|
2326
|
-
isProviderPage(page)
|
|
2327
|
-
&& /invalid action|invalid[_ ]?code|code (has )?expired|expired code/i.test(text)
|
|
2328
|
-
&& authUrl
|
|
2329
|
-
&& seenGoogleAuth
|
|
2330
|
-
&& deviceInvalidReopenCount < DEVICE_INVALID_REOPEN_MAX
|
|
2331
|
-
&& Date.now() - deviceInvalidReopenAt > DEVICE_INVALID_REOPEN_COOLDOWN_MS
|
|
2332
|
-
) {
|
|
2333
|
-
deviceInvalidReopenCount += 1;
|
|
2334
|
-
deviceInvalidReopenAt = Date.now();
|
|
2335
|
-
deviceApproveAt = 0;
|
|
2336
|
-
reportStep(
|
|
2337
|
-
"device_invalid_reopen",
|
|
2338
|
-
`Device page error — reopening auth URL (${deviceInvalidReopenCount}/${DEVICE_INVALID_REOPEN_MAX})`,
|
|
2339
|
-
);
|
|
2340
|
-
await page.goto(authUrl, { waitUntil: "domcontentloaded", timeout: 60_000 }).catch(() => null);
|
|
2341
|
-
await waitUntil(
|
|
2342
|
-
async () =>
|
|
2343
|
-
(await getFirstVisibleLocator(page, 'button:has-text("Continue"), button:has-text("Allow"), button:has-text("Authorize")'))
|
|
2344
|
-
|| (await providerHasGoogleLogin(page)),
|
|
2345
|
-
{ timeout: 4_000, interval: 80 },
|
|
2346
|
-
);
|
|
2347
|
-
continue;
|
|
2348
|
-
}
|
|
2349
|
-
|
|
2350
|
-
const googleAuthed = Boolean(seenGoogleAuth && passwordSubmittedAt);
|
|
2351
|
-
|
|
2352
|
-
// xAI device user_code confirm (Continue) — only before Google login.
|
|
2353
|
-
if (await handleXaiDeviceCodeConfirm(page, reportStep, { alreadyAuthed: googleAuthed })) {
|
|
2354
|
-
continue;
|
|
2355
|
-
}
|
|
2356
|
-
|
|
2357
|
-
// Provider Google SSO BEFORE generic onboarding Continues.
|
|
2358
|
-
// Cooldown: re-clicking Google mid-redirect restarts OAuth and wastes time.
|
|
2359
|
-
const allowGoogleClick =
|
|
2360
|
-
!googleAuthed
|
|
2361
|
-
&& (!googleLoginSelectedAt || Date.now() - googleLoginSelectedAt > GOOGLE_SSO_COOLDOWN_MS);
|
|
2362
|
-
const handledProviderGate = await handleProviderLoginGate(page, reportStep, { allowGoogleClick });
|
|
2363
|
-
if (handledProviderGate) {
|
|
2364
|
-
if (allowGoogleClick) googleLoginSelectedAt = Date.now();
|
|
2365
|
-
continue;
|
|
2366
|
-
}
|
|
2367
|
-
|
|
2368
|
-
// xAI device approve ONLY after Google password submitted.
|
|
2369
|
-
if (
|
|
2370
|
-
googleAuthed
|
|
2371
|
-
&& Date.now() - deviceApproveAt > DEVICE_APPROVE_COOLDOWN_MS
|
|
2372
|
-
&& await clickXaiDeviceAuthorize(page, reportStep)
|
|
2373
|
-
) {
|
|
2374
|
-
deviceApproveAt = Date.now();
|
|
2375
|
-
continue;
|
|
2376
|
-
}
|
|
2377
|
-
|
|
2378
|
-
const handledProviderOnboarding = await handleProviderOnboarding(page, reportStep, serviceLabel);
|
|
2379
|
-
if (handledProviderOnboarding) {
|
|
2380
|
-
continue;
|
|
2381
|
-
}
|
|
2382
|
-
|
|
2383
|
-
// Credentials only on accounts.google.com — never into provider shells.
|
|
2384
|
-
if (isGoogleAuthPage(page)) {
|
|
2385
|
-
seenGoogleAuth = true;
|
|
2386
|
-
// Check password BEFORE email — after submitting the email the password
|
|
2387
|
-
// page loads and during the transition the old email input can briefly
|
|
2388
|
-
// remain visible; if we checked email first we'd re-type the email
|
|
2389
|
-
// address into whatever field is focused (often the password input).
|
|
2390
|
-
const passwordInput = await getFirstVisibleLocator(page, PASSWORD_INPUT_SELECTOR);
|
|
2391
|
-
if (passwordInput) {
|
|
2392
|
-
const sincePw = Date.now() - passwordSubmittedAt;
|
|
2393
|
-
if (passwordSubmittedAt && sincePw < PASSWORD_RESUBMIT_COOLDOWN_MS) {
|
|
2394
|
-
// Still on (or animating off) the password form after a recent submit —
|
|
2395
|
-
// do NOT re-fill; wait for SetSID/consent/callback instead.
|
|
2396
|
-
reportStep(
|
|
2397
|
-
"waiting_after_password",
|
|
2398
|
-
`Password already submitted ${Math.round(sincePw / 1000)}s ago — waiting for Google redirect`,
|
|
2399
|
-
);
|
|
2400
|
-
await waitThroughGoogleInterstitials(
|
|
2401
|
-
page,
|
|
2402
|
-
reportStep,
|
|
2403
|
-
interstitialOpts(isGrokFlow ? 2_000 : 6_000),
|
|
2404
|
-
);
|
|
2405
|
-
continue;
|
|
2406
|
-
}
|
|
2407
|
-
|
|
2408
|
-
reportStep("entering_password", "Entering Google password");
|
|
2409
|
-
const filled = await fillInputResilient(passwordInput, password);
|
|
2410
|
-
if (filled) {
|
|
2411
|
-
reportStep("submitting_password", "Submitting password");
|
|
2412
|
-
const prePwUrl = page.url?.() || "";
|
|
2413
|
-
await clickFirstVisible(page, NEXT_BUTTON_SELECTORS);
|
|
2414
|
-
passwordSubmittedAt = Date.now();
|
|
2415
|
-
// Leave password challenge via navigation / URL change / success — no 2.5s sleep.
|
|
2416
|
-
await Promise.race([
|
|
2417
|
-
page.waitForNavigation({ waitUntil: "domcontentloaded", timeout: isGrokFlow ? 6_000 : 10_000 }).catch(() => null),
|
|
2418
|
-
waitForPageAdvance(page, { fromUrl: prePwUrl, timeout: isGrokFlow ? 6_000 : 10_000 }),
|
|
2419
|
-
successPromise.then(() => null).catch(() => null),
|
|
2420
|
-
]);
|
|
2421
|
-
await waitThroughGoogleInterstitials(
|
|
2422
|
-
page,
|
|
2423
|
-
reportStep,
|
|
2424
|
-
interstitialOpts(postPasswordInterstitialMs),
|
|
2425
|
-
);
|
|
2426
|
-
} else {
|
|
2427
|
-
reportStep("password_fill_failed", "Could not fill the Google password field; retrying loop");
|
|
2428
|
-
await yieldMs(100);
|
|
2429
|
-
}
|
|
2430
|
-
continue;
|
|
2431
|
-
}
|
|
2432
|
-
|
|
2433
|
-
const nextEmailInput = await getFirstVisibleLocator(page, EMAIL_INPUT_SELECTOR);
|
|
2434
|
-
if (nextEmailInput) {
|
|
2435
|
-
const sinceEmail = Date.now() - emailSubmittedAt;
|
|
2436
|
-
if (emailSubmittedAt && sinceEmail < EMAIL_RESUBMIT_COOLDOWN_MS) {
|
|
2437
|
-
reportStep(
|
|
2438
|
-
"waiting_after_email",
|
|
2439
|
-
`Email already submitted ${Math.round(sinceEmail / 1000)}s ago — waiting for password/next screen`,
|
|
2440
|
-
);
|
|
2441
|
-
await waitForPageAdvance(page, {
|
|
2442
|
-
selector: PASSWORD_INPUT_SELECTOR,
|
|
2443
|
-
timeout: Math.max(200, EMAIL_RESUBMIT_COOLDOWN_MS - sinceEmail),
|
|
2444
|
-
});
|
|
2445
|
-
continue;
|
|
2446
|
-
}
|
|
2447
|
-
|
|
2448
|
-
reportStep("entering_email", "Entering Google email");
|
|
2449
|
-
const filled = await fillInputResilient(nextEmailInput, email);
|
|
2450
|
-
if (filled) {
|
|
2451
|
-
reportStep("submitting_email", "Submitting email");
|
|
2452
|
-
await clickFirstVisible(page, NEXT_BUTTON_SELECTORS);
|
|
2453
|
-
emailSubmittedAt = Date.now();
|
|
2454
|
-
await waitForPageAdvance(page, {
|
|
2455
|
-
selector: PASSWORD_INPUT_SELECTOR,
|
|
2456
|
-
timeout: isGrokFlow ? 6_000 : 10_000,
|
|
2457
|
-
});
|
|
2458
|
-
} else {
|
|
2459
|
-
reportStep("email_fill_failed", "Could not fill the Google email field; retrying loop");
|
|
2460
|
-
await yieldMs(80);
|
|
2461
|
-
}
|
|
2462
|
-
continue;
|
|
2463
|
-
}
|
|
2464
|
-
}
|
|
2465
|
-
|
|
2466
|
-
// On xAI before Google login, APPROVE selectors match "Continue with Google"
|
|
2467
|
-
// via :has-text("Continue") and wreck the device code → Invalid action loop.
|
|
2468
|
-
// On Cloudflare login, "Allow All" cookies + "Sign in" must not be mashed.
|
|
2469
|
-
await dismissCookieBanners(page, reportStep);
|
|
2470
|
-
const onCfHost = (() => {
|
|
2471
|
-
try {
|
|
2472
|
-
const h = new URL(page.url()).hostname || "";
|
|
2473
|
-
return h === "dash.cloudflare.com" || h.endsWith(".cloudflare.com");
|
|
2474
|
-
} catch {
|
|
2475
|
-
return false;
|
|
2476
|
-
}
|
|
2477
|
-
})();
|
|
2478
|
-
const mayGenericApprove =
|
|
2479
|
-
isGoogleAuthPage(page)
|
|
2480
|
-
|| (
|
|
2481
|
-
seenGoogleAuth
|
|
2482
|
-
&& passwordSubmittedAt
|
|
2483
|
-
&& !(await providerHasGoogleLogin(page))
|
|
2484
|
-
&& !isCloudflareLoginUrl(page.url?.() || "")
|
|
2485
|
-
);
|
|
2486
|
-
if (mayGenericApprove && !isCloudflareLoginUrl(page.url?.() || "")) {
|
|
2487
|
-
// Avoid OneTrust "Allow All" as if it were OAuth approve when still mid-flow
|
|
2488
|
-
const clickedApprove = await clickFirstVisible(page, APPROVE_BUTTON_SELECTORS);
|
|
2489
|
-
if (clickedApprove) {
|
|
2490
|
-
reportStep("approving_consent", `Approving Google or ${serviceLabel} consent`);
|
|
2491
|
-
deviceApproveAt = Date.now();
|
|
2492
|
-
await waitForPageAdvance(page, { timeout: isGrokFlow ? 2_000 : 4_000 });
|
|
2493
|
-
continue;
|
|
2494
|
-
}
|
|
2495
|
-
}
|
|
2496
|
-
// Cloudflare login stuck: keep hammering Google SSO only
|
|
2497
|
-
if (onCfHost && !seenGoogleAuth && (await handleProviderLoginGate(page, reportStep))) {
|
|
2498
|
-
googleLoginSelectedAt = Date.now();
|
|
2499
|
-
continue;
|
|
2500
|
-
}
|
|
2501
|
-
|
|
2502
|
-
// Periodic diagnostics so jobs aren't opaque "waiting" spam
|
|
2503
|
-
if (Math.floor((Date.now() - startTime) / 5000) !== Math.floor((Date.now() - startTime - loopTickMs) / 5000)) {
|
|
2504
|
-
const url = page.url?.() || "";
|
|
2505
|
-
const snippet = String(text || (await readPageText(page).catch(() => ""))).slice(0, 100).replace(/\s+/g, " ");
|
|
2506
|
-
reportStep(
|
|
2507
|
-
"waiting_for_next_screen",
|
|
2508
|
-
`Waiting for the next Google or ${serviceLabel} screen (url=${url.slice(0, 100)} body=${snippet})`,
|
|
2509
|
-
);
|
|
2510
|
-
} else {
|
|
2511
|
-
reportStep("waiting_for_next_screen", `Waiting for the next Google or ${serviceLabel} screen`);
|
|
2512
|
-
}
|
|
2513
|
-
// Only yield — next loop races successPromise + handlers. Fast net = fast exit.
|
|
2514
|
-
await yieldMs(loopTickMs);
|
|
2515
|
-
}
|
|
2516
|
-
|
|
2517
|
-
// Final blocked check before generic needs_manual
|
|
2518
|
-
if (await isBlockedBrowser(page)) {
|
|
2519
|
-
reportStep("browser_blocked_by_google", "Google blocked browser at end of automation window");
|
|
2520
|
-
return {
|
|
2521
|
-
status: "failed_browser_blocked",
|
|
2522
|
-
error:
|
|
2523
|
-
"Google blocked the automated browser (\"This browser or app may not be secure\"). " +
|
|
2524
|
-
"Use headed CloakBrowser (Xvfb).",
|
|
2525
|
-
};
|
|
2526
|
-
}
|
|
2527
|
-
|
|
2528
|
-
const finalUrl = page.url?.() || "";
|
|
2529
|
-
const finalBody = String(await readPageText(page).catch(() => "")).slice(0, 120).replace(/\s+/g, " ");
|
|
2530
|
-
reportStep(
|
|
2531
|
-
"manual_assist_required",
|
|
2532
|
-
`Flow did not complete ${serviceLabel} authorization automatically (url=${finalUrl.slice(0, 100)} body=${finalBody})`,
|
|
2533
|
-
);
|
|
2534
|
-
return {
|
|
2535
|
-
status: "needs_manual",
|
|
2536
|
-
error:
|
|
2537
|
-
`Manual assist required — ${serviceLabel} authorization did not finish automatically ` +
|
|
2538
|
-
`(last url: ${finalUrl.slice(0, 140)}). If you see "browser may not be secure", use headed CloakBrowser.`,
|
|
2539
|
-
};
|
|
2540
|
-
}
|
|
2541
|
-
|
|
2542
|
-
export async function runKiroGoogleAutomation({
|
|
2543
|
-
page,
|
|
2544
|
-
authUrl,
|
|
2545
|
-
email,
|
|
2546
|
-
password,
|
|
2547
|
-
callbackPromise,
|
|
2548
|
-
shortTimeoutMs = DEFAULT_SHORT_TIMEOUT_MS,
|
|
2549
|
-
onStep,
|
|
2550
|
-
}) {
|
|
2551
|
-
return runGoogleAccountAutomation({
|
|
2552
|
-
page,
|
|
2553
|
-
authUrl,
|
|
2554
|
-
email,
|
|
2555
|
-
password,
|
|
2556
|
-
successPromise: callbackPromise,
|
|
2557
|
-
shortTimeoutMs,
|
|
2558
|
-
serviceLabel: "Kiro",
|
|
2559
|
-
openingStep: "opening_google_oauth",
|
|
2560
|
-
openingMessage: "Opening Google OAuth page",
|
|
2561
|
-
successStep: "kiro_callback_received",
|
|
2562
|
-
successMessage: "Kiro callback received",
|
|
2563
|
-
onStep,
|
|
2564
|
-
});
|
|
2565
|
-
}
|
|
2566
|
-
|
|
2567
|
-
export {
|
|
2568
|
-
handleCodeBuddyRegionPage,
|
|
2569
|
-
handleProviderOnboarding,
|
|
2570
|
-
handleCodeBuddyStartedAuthorization,
|
|
2571
|
-
isProviderPage,
|
|
2572
|
-
};
|
|
2573
|
-
|
|
2574
|
-
export const __test__ = {
|
|
2575
|
-
waitForFirstVisibleLocator,
|
|
2576
|
-
fillInputResilient,
|
|
2577
|
-
parseSelectorList,
|
|
2578
|
-
getFirstVisibleLocator,
|
|
2579
|
-
waitForPageAdvance,
|
|
2580
|
-
waitUntil,
|
|
2581
|
-
handleXaiDeviceCodeConfirm,
|
|
2582
|
-
GOOGLE_LOGIN_BUTTON_SELECTORS,
|
|
2583
|
-
isGrokish,
|
|
2584
|
-
dismissCookieBanners,
|
|
2585
|
-
clickGoogleLoginRole,
|
|
2586
|
-
isCloudflareLoginUrl,
|
|
2587
|
-
};
|