zevairouter 1.0.69 → 1.0.72
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/cli/app/.next-cli-build/BUILD_ID +1 -1
- package/cli/app/.next-cli-build/app-path-routes-manifest.json +6 -6
- package/cli/app/.next-cli-build/build-manifest.json +2 -2
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/automation/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/context/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/playground/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/pxpipe/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/terminal/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.html +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found.html +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/api/models/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/models/test/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/providers/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/providers/validate/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/terminal/session/[id]/input/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/terminal/session/[id]/resize/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/terminal/session/[id]/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/terminal/session/[id]/stream/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/terminal/session/route.js.nft.json +1 -1
- package/cli/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/version/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
- package/cli/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/callback.html +1 -1
- package/cli/app/.next-cli-build/server/app/callback.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/callback.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/callback.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/callback.segments/callback.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/automation.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/automation.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard/automation/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard/automation.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/combos.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/context.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/context.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard/context/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard/context.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/playground.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/playground.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard/playground/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard/playground.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/profile.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/quota.html +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/quota.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +6 -6
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/translator.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/usage.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard.html +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +5 -5
- package/cli/app/.next-cli-build/server/app/dashboard.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/dashboard.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/index.html +1 -1
- package/cli/app/.next-cli-build/server/app/index.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/index.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/index.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/landing.html +1 -1
- package/cli/app/.next-cli-build/server/app/landing.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/landing.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/landing.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/landing.segments/landing.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app/login.html +1 -1
- package/cli/app/.next-cli-build/server/app/login.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +4 -4
- package/cli/app/.next-cli-build/server/app/login.segments/_head.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/login.segments/_index.segment.rsc +3 -3
- package/cli/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
- package/cli/app/.next-cli-build/server/app/login.segments/login.segment.rsc +1 -1
- package/cli/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/app-paths-manifest.json +6 -6
- package/cli/app/.next-cli-build/server/chunks/3407.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/4746.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/6896.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/7276.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/8157.js +1 -1
- package/cli/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
- package/cli/app/.next-cli-build/server/pages/404.html +1 -1
- package/cli/app/.next-cli-build/server/pages/500.html +1 -1
- package/cli/app/.next-cli-build/static/chunks/{3702-cf53f29a22776f08.js → 3702-7aa79659b7d2861a.js} +1 -1
- package/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/src/lib/terminal/ptyBridge.py +163 -0
- package/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/src/lib/terminal/ptyBridge.py +163 -0
- package/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/src/lib/terminal/ptyBridge.py +163 -0
- package/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/src/lib/terminal/ptyBridge.py +163 -0
- package/cli/app/package.json +1 -1
- package/cli/package.json +1 -1
- package/package.json +1 -1
- package/src/lib/oauth/services/kiroBulkImportManager.js +30 -10
- package/src/lib/oauth/services/kiroGoogleAutomation.js +294 -36
- /package/cli/app/.next-cli-build/static/{ieCl7ScziCIxUyr4Zck3E → Pt5AQYEcCz-MH9LLUCKC-}/_buildManifest.js +0 -0
- /package/cli/app/.next-cli-build/static/{ieCl7ScziCIxUyr4Zck3E → Pt5AQYEcCz-MH9LLUCKC-}/_ssgManifest.js +0 -0
|
@@ -17,6 +17,8 @@ const TERMINAL_ACCOUNT_STATUSES = new Set([
|
|
|
17
17
|
"failed_invalid_credentials",
|
|
18
18
|
"failed_exchange",
|
|
19
19
|
"failed_timeout",
|
|
20
|
+
"failed_restricted",
|
|
21
|
+
"failed_browser_blocked",
|
|
20
22
|
"cancelled",
|
|
21
23
|
]);
|
|
22
24
|
|
|
@@ -222,6 +224,8 @@ function getFailedCount(accounts) {
|
|
|
222
224
|
|| account.status === "failed_invalid_credentials"
|
|
223
225
|
|| account.status === "failed_exchange"
|
|
224
226
|
|| account.status === "failed_timeout"
|
|
227
|
+
|| account.status === "failed_restricted"
|
|
228
|
+
|| account.status === "failed_browser_blocked"
|
|
225
229
|
)).length;
|
|
226
230
|
}
|
|
227
231
|
|
|
@@ -299,7 +303,7 @@ function sanitizeAccount(account) {
|
|
|
299
303
|
proxyUrl: maskProxyUrl(account.proxyUrl) || null,
|
|
300
304
|
currentStep: account.currentStep || null,
|
|
301
305
|
updatedAt: account.updatedAt || null,
|
|
302
|
-
logs: (account.logs || []).slice(-
|
|
306
|
+
logs: (account.logs || []).slice(-20),
|
|
303
307
|
manualSessionAvailable: Boolean(account.manualSession?.page) && account.status === "needs_manual",
|
|
304
308
|
manualSessionOpened: Boolean(account.manualSession?.opened),
|
|
305
309
|
};
|
|
@@ -354,7 +358,23 @@ export function buildLookupResponse(job, extras = {}) {
|
|
|
354
358
|
|
|
355
359
|
async function defaultBrowserLauncher(job) {
|
|
356
360
|
const { launchBulkImportBrowser } = await import("./bulkImportBrowserEngine.js");
|
|
357
|
-
|
|
361
|
+
const engine = job?.engine || "chromium";
|
|
362
|
+
// Google OAuth now rejects stock headless Chromium after email submit with
|
|
363
|
+
// /v3/signin/rejected ("This browser or app may not be secure"). That is the
|
|
364
|
+
// real reason Kiro bulk ends in needs_manual — not random captcha.
|
|
365
|
+
// Default: headed Chromium (Xvfb auto-starts on Linux). Camoufox can stay
|
|
366
|
+
// headless. Override with ZEVAI_KIRO_HEADLESS=0|1.
|
|
367
|
+
const envHeadless = process.env.ZEVAI_KIRO_HEADLESS;
|
|
368
|
+
let headless;
|
|
369
|
+
if (envHeadless === "1" || envHeadless === "true") headless = true;
|
|
370
|
+
else if (envHeadless === "0" || envHeadless === "false") headless = false;
|
|
371
|
+
else if (engine === "camoufox") headless = true;
|
|
372
|
+
else headless = false;
|
|
373
|
+
return launchBulkImportBrowser({
|
|
374
|
+
engine,
|
|
375
|
+
headless,
|
|
376
|
+
windowSize: { width: 1280, height: 900 },
|
|
377
|
+
});
|
|
358
378
|
}
|
|
359
379
|
|
|
360
380
|
async function defaultSocialExchange(args) {
|
|
@@ -417,15 +437,15 @@ export async function createFreshContext(browser, proxy) {
|
|
|
417
437
|
}
|
|
418
438
|
|
|
419
439
|
const page = await context.newPage();
|
|
420
|
-
//
|
|
440
|
+
// Abort third-party trackers only. Do NOT intercept "**/*" with continue() —
|
|
441
|
+
// Playwright route interception on every request breaks Google→Cognito OAuth
|
|
442
|
+
// redirect chains (consent 302 → idpresponse 302 → kiro:// Location is dropped
|
|
443
|
+
// and the main frame parks forever on empty SetSID).
|
|
421
444
|
try {
|
|
422
|
-
await page.route(
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
}
|
|
427
|
-
return route.continue();
|
|
428
|
-
});
|
|
445
|
+
await page.route(
|
|
446
|
+
/googletagmanager|googleadservices|google-analytics|doubleclick|facebook\.net|hotjar|clarity\.ms|hm\.baidu|sentry\.io|browser\.sentry-cdn/i,
|
|
447
|
+
(route) => route.abort(),
|
|
448
|
+
);
|
|
429
449
|
} catch {
|
|
430
450
|
// ignore if route fails
|
|
431
451
|
}
|
|
@@ -494,18 +494,120 @@ function isGoogleAuthPage(page) {
|
|
|
494
494
|
}
|
|
495
495
|
}
|
|
496
496
|
|
|
497
|
-
// Google bounces flagged (headless) browsers
|
|
498
|
-
//
|
|
499
|
-
//
|
|
497
|
+
// Google bounces flagged (headless) browsers:
|
|
498
|
+
// - myaccount.google.com/not-supported
|
|
499
|
+
// - accounts.google.com/v3/signin/rejected ("This browser or app may not be secure")
|
|
500
|
+
// - about.google drift after consent
|
|
500
501
|
function isBlockedBrowserPage(page) {
|
|
501
502
|
try {
|
|
502
503
|
const url = new URL(page.url());
|
|
503
504
|
if (url.pathname.startsWith("/not-supported")) return true;
|
|
504
505
|
if (url.pathname.includes("/signin/rejected")) return true;
|
|
505
|
-
|
|
506
|
+
if (url.pathname.includes("/rejected")) return true;
|
|
507
|
+
if (url.hostname === "about.google" || url.hostname.endsWith(".about.google")) return true;
|
|
506
508
|
} catch {
|
|
507
|
-
|
|
509
|
+
// fall through to body text
|
|
510
|
+
}
|
|
511
|
+
return false;
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
async function isBlockedBrowser(page) {
|
|
515
|
+
if (isBlockedBrowserPage(page)) return true;
|
|
516
|
+
const text = await readPageText(page).catch(() => "");
|
|
517
|
+
return includesAny(text, [
|
|
518
|
+
"browser or app may not be secure",
|
|
519
|
+
"try using a different browser",
|
|
520
|
+
"couldn't sign you in",
|
|
521
|
+
"couldn\u2019t sign you in",
|
|
522
|
+
"this browser or app may not be secure",
|
|
523
|
+
"browser is not secure",
|
|
524
|
+
]);
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
/**
|
|
528
|
+
* Hook successPromise so interstitial waits can exit as soon as the OAuth
|
|
529
|
+
* callback (kiro://) is captured on the network — even while the main frame
|
|
530
|
+
* stays parked on blank SetSID.
|
|
531
|
+
*/
|
|
532
|
+
function attachSuccessSettledFlag(successPromise) {
|
|
533
|
+
if (!successPromise || typeof successPromise.then !== "function") return;
|
|
534
|
+
if (successPromise.__zevaiSettledHooked) return;
|
|
535
|
+
successPromise.__zevaiSettledHooked = true;
|
|
536
|
+
successPromise.then(
|
|
537
|
+
() => { successPromise.__zevaiSettled = true; },
|
|
538
|
+
() => { successPromise.__zevaiSettled = true; },
|
|
539
|
+
);
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
function isSuccessSettled(successPromise) {
|
|
543
|
+
return Boolean(successPromise && successPromise.__zevaiSettled);
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
/**
|
|
547
|
+
* Google often parks on intermediate pages with empty body after password/consent:
|
|
548
|
+
* accounts.google.com(.xx)/accounts/SetSID
|
|
549
|
+
* AccountChooser, continue, challenge handoffs
|
|
550
|
+
*
|
|
551
|
+
* Do NOT force-navigate consent/idpresponse from here — that aborts the natural
|
|
552
|
+
* network hop that emits Location: kiro://. Wait for auto-redirect / AccountChooser
|
|
553
|
+
* UI, and bail early when successPromise already settled (CDP/page listeners).
|
|
554
|
+
*
|
|
555
|
+
* @returns {boolean} true if still on an interstitial when maxWaitMs elapsed
|
|
556
|
+
*/
|
|
557
|
+
async function waitThroughGoogleInterstitials(page, reportStep, { maxWaitMs = 20_000, successPromise = null } = {}) {
|
|
558
|
+
const start = Date.now();
|
|
559
|
+
let lastUrl = "";
|
|
560
|
+
attachSuccessSettledFlag(successPromise);
|
|
561
|
+
|
|
562
|
+
while (Date.now() - start < maxWaitMs) {
|
|
563
|
+
if (isSuccessSettled(successPromise)) {
|
|
564
|
+
reportStep?.("waiting_google_redirect", "OAuth callback already received — leaving interstitial wait");
|
|
565
|
+
return false;
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
const url = page.url?.() || "";
|
|
569
|
+
const body = String(await readPageText(page).catch(() => "")).trim();
|
|
570
|
+
const isSetSid = /\/accounts\/SetSID/i.test(url);
|
|
571
|
+
const isChooser = /\/AccountChooser/i.test(url);
|
|
572
|
+
const isEmpty = body.length < 30;
|
|
573
|
+
const isInterstitial = isSetSid || (isEmpty && /accounts\.google\./i.test(url));
|
|
574
|
+
|
|
575
|
+
if (!isInterstitial && !isChooser) return false;
|
|
576
|
+
|
|
577
|
+
if (url !== lastUrl) {
|
|
578
|
+
reportStep?.(
|
|
579
|
+
"waiting_google_redirect",
|
|
580
|
+
`Waiting for Google redirect (url=${url.slice(0, 120)} empty=${isEmpty})`,
|
|
581
|
+
);
|
|
582
|
+
lastUrl = url;
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
// Account chooser: click first account row if present
|
|
586
|
+
if (isChooser) {
|
|
587
|
+
const clicked = await clickFirstActionable(page, [
|
|
588
|
+
'div[data-identifier]',
|
|
589
|
+
'div[data-email]',
|
|
590
|
+
'li[data-identifier]',
|
|
591
|
+
'div[role="link"]',
|
|
592
|
+
'div[role="button"]',
|
|
593
|
+
]);
|
|
594
|
+
if (clicked) {
|
|
595
|
+
reportStep?.("selecting_google_account", "Selected account from Google AccountChooser");
|
|
596
|
+
await page.waitForTimeout(1200);
|
|
597
|
+
continue;
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
const waiters = [
|
|
602
|
+
page.waitForNavigation({ waitUntil: "domcontentloaded", timeout: 4_000 }).catch(() => null),
|
|
603
|
+
page.waitForTimeout(1_200),
|
|
604
|
+
];
|
|
605
|
+
if (successPromise && !isSuccessSettled(successPromise)) {
|
|
606
|
+
waiters.push(successPromise.then(() => null).catch(() => null));
|
|
607
|
+
}
|
|
608
|
+
await Promise.race(waiters);
|
|
508
609
|
}
|
|
610
|
+
return true;
|
|
509
611
|
}
|
|
510
612
|
|
|
511
613
|
function isProviderPage(page) {
|
|
@@ -1173,6 +1275,18 @@ async function handleProviderLoginGate(page, reportStep) {
|
|
|
1173
1275
|
return false;
|
|
1174
1276
|
}
|
|
1175
1277
|
|
|
1278
|
+
/**
|
|
1279
|
+
* Capture Kiro OAuth callback (kiro://…?code=…).
|
|
1280
|
+
*
|
|
1281
|
+
* After password, Google parks the main frame on empty SetSID while the network
|
|
1282
|
+
* completes consent → Cognito idpresponse → 302 Location: kiro://…. Custom-protocol
|
|
1283
|
+
* redirects often never become a page navigation, so we listen on:
|
|
1284
|
+
* - page + context request / requestfailed / response (Location header)
|
|
1285
|
+
* - CDP Network (most reliable on headed Chromium / SetSID)
|
|
1286
|
+
*
|
|
1287
|
+
* Never force-navigate idpresponse/consent from the monitor — that aborts the
|
|
1288
|
+
* natural hop before kiro:// is emitted.
|
|
1289
|
+
*/
|
|
1176
1290
|
export function createKiroCallbackMonitor(context, page, timeoutMs = DEFAULT_MANUAL_TIMEOUT_MS) {
|
|
1177
1291
|
let resolveOuter;
|
|
1178
1292
|
let rejectOuter;
|
|
@@ -1202,34 +1316,80 @@ export function createKiroCallbackMonitor(context, page, timeoutMs = DEFAULT_MAN
|
|
|
1202
1316
|
else resolveOuter(result);
|
|
1203
1317
|
}
|
|
1204
1318
|
|
|
1319
|
+
function trySettleFromUrl(rawUrl) {
|
|
1320
|
+
const parsed = parseCallbackUrl(rawUrl || "");
|
|
1321
|
+
if (parsed) settle(parsed);
|
|
1322
|
+
return Boolean(parsed);
|
|
1323
|
+
}
|
|
1324
|
+
|
|
1325
|
+
function trySettleFromResponse(response) {
|
|
1326
|
+
try {
|
|
1327
|
+
trySettleFromUrl(response?.url?.() || "");
|
|
1328
|
+
const headers = typeof response?.headers === "function" ? response.headers() : null;
|
|
1329
|
+
const location = headers?.location || headers?.Location || "";
|
|
1330
|
+
if (location) trySettleFromUrl(location);
|
|
1331
|
+
} catch {
|
|
1332
|
+
/* ignore */
|
|
1333
|
+
}
|
|
1334
|
+
}
|
|
1335
|
+
|
|
1336
|
+
function attachCdpNetwork(trackedPage, ownerCleanups) {
|
|
1337
|
+
void (async () => {
|
|
1338
|
+
try {
|
|
1339
|
+
if (settled) return;
|
|
1340
|
+
const ctx = trackedPage.context?.();
|
|
1341
|
+
if (!ctx?.newCDPSession) return;
|
|
1342
|
+
const session = await ctx.newCDPSession(trackedPage);
|
|
1343
|
+
await session.send("Network.enable").catch(() => null);
|
|
1344
|
+
|
|
1345
|
+
const onCdpResponse = (params) => {
|
|
1346
|
+
try {
|
|
1347
|
+
const headers = params?.response?.headers || {};
|
|
1348
|
+
const loc = headers.location || headers.Location || "";
|
|
1349
|
+
if (loc) trySettleFromUrl(loc);
|
|
1350
|
+
trySettleFromUrl(params?.response?.url || "");
|
|
1351
|
+
} catch {
|
|
1352
|
+
/* ignore */
|
|
1353
|
+
}
|
|
1354
|
+
};
|
|
1355
|
+
const onCdpRequest = (params) => {
|
|
1356
|
+
try {
|
|
1357
|
+
trySettleFromUrl(params?.request?.url || "");
|
|
1358
|
+
} catch {
|
|
1359
|
+
/* ignore */
|
|
1360
|
+
}
|
|
1361
|
+
};
|
|
1362
|
+
|
|
1363
|
+
session.on("Network.responseReceived", onCdpResponse);
|
|
1364
|
+
session.on("Network.requestWillBeSent", onCdpRequest);
|
|
1365
|
+
ownerCleanups.push(() => {
|
|
1366
|
+
try { session.off?.("Network.responseReceived", onCdpResponse); } catch {}
|
|
1367
|
+
try { session.off?.("Network.requestWillBeSent", onCdpRequest); } catch {}
|
|
1368
|
+
void session.detach?.().catch(() => null);
|
|
1369
|
+
});
|
|
1370
|
+
} catch {
|
|
1371
|
+
/* CDP unavailable — page/context listeners remain */
|
|
1372
|
+
}
|
|
1373
|
+
})();
|
|
1374
|
+
}
|
|
1375
|
+
|
|
1205
1376
|
function registerPage(trackedPage, ownerCleanups) {
|
|
1206
1377
|
if (!trackedPage || trackedPages.has(trackedPage)) return;
|
|
1207
1378
|
trackedPages.add(trackedPage);
|
|
1208
1379
|
|
|
1209
|
-
const onFrame = (frame) =>
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
const
|
|
1214
|
-
const parsed = parseCallbackUrl(request?.url?.() || "");
|
|
1215
|
-
if (parsed) settle(parsed);
|
|
1216
|
-
};
|
|
1217
|
-
const onRequestFailed = (request) => {
|
|
1218
|
-
const parsed = parseCallbackUrl(request?.url?.() || "");
|
|
1219
|
-
if (parsed) settle(parsed);
|
|
1220
|
-
};
|
|
1221
|
-
const onLoadState = () => {
|
|
1222
|
-
const parsed = parseCallbackUrl(trackedPage.url?.() || "");
|
|
1223
|
-
if (parsed) settle(parsed);
|
|
1224
|
-
};
|
|
1380
|
+
const onFrame = (frame) => trySettleFromUrl(frame?.url?.() || "");
|
|
1381
|
+
const onRequest = (request) => trySettleFromUrl(request?.url?.() || "");
|
|
1382
|
+
const onRequestFailed = (request) => trySettleFromUrl(request?.url?.() || "");
|
|
1383
|
+
const onResponse = (response) => trySettleFromResponse(response);
|
|
1384
|
+
const onLoadState = () => trySettleFromUrl(trackedPage.url?.() || "");
|
|
1225
1385
|
const onClose = () => {
|
|
1226
|
-
// Cancel/force-close: unblock manual followup instead of hanging 15 min
|
|
1227
1386
|
settle(null, new Error("Browser session closed while waiting for Kiro callback"));
|
|
1228
1387
|
};
|
|
1229
1388
|
|
|
1230
1389
|
trackedPage.on("framenavigated", onFrame);
|
|
1231
1390
|
trackedPage.on("request", onRequest);
|
|
1232
1391
|
trackedPage.on("requestfailed", onRequestFailed);
|
|
1392
|
+
trackedPage.on("response", onResponse);
|
|
1233
1393
|
trackedPage.on("domcontentloaded", onLoadState);
|
|
1234
1394
|
trackedPage.on("load", onLoadState);
|
|
1235
1395
|
trackedPage.on("close", onClose);
|
|
@@ -1238,11 +1398,14 @@ export function createKiroCallbackMonitor(context, page, timeoutMs = DEFAULT_MAN
|
|
|
1238
1398
|
trackedPage.off("framenavigated", onFrame);
|
|
1239
1399
|
trackedPage.off("request", onRequest);
|
|
1240
1400
|
trackedPage.off("requestfailed", onRequestFailed);
|
|
1401
|
+
trackedPage.off("response", onResponse);
|
|
1241
1402
|
trackedPage.off("domcontentloaded", onLoadState);
|
|
1242
1403
|
trackedPage.off("load", onLoadState);
|
|
1243
1404
|
trackedPage.off("close", onClose);
|
|
1244
1405
|
});
|
|
1245
1406
|
|
|
1407
|
+
attachCdpNetwork(trackedPage, ownerCleanups);
|
|
1408
|
+
|
|
1246
1409
|
const current = parseCallbackUrl(trackedPage.url?.() || "");
|
|
1247
1410
|
if (current) settle(current);
|
|
1248
1411
|
}
|
|
@@ -1257,10 +1420,20 @@ export function createKiroCallbackMonitor(context, page, timeoutMs = DEFAULT_MAN
|
|
|
1257
1420
|
const onClose = () => {
|
|
1258
1421
|
settle(null, new Error("Browser context closed while waiting for Kiro callback"));
|
|
1259
1422
|
};
|
|
1423
|
+
const onCtxRequest = (request) => trySettleFromUrl(request?.url?.() || "");
|
|
1424
|
+
const onCtxRequestFailed = (request) => trySettleFromUrl(request?.url?.() || "");
|
|
1425
|
+
const onCtxResponse = (response) => trySettleFromResponse(response);
|
|
1426
|
+
|
|
1260
1427
|
ctx.on("page", onPage);
|
|
1261
1428
|
ctx.on("close", onClose);
|
|
1429
|
+
ctx.on("request", onCtxRequest);
|
|
1430
|
+
ctx.on("requestfailed", onCtxRequestFailed);
|
|
1431
|
+
ctx.on("response", onCtxResponse);
|
|
1262
1432
|
cleanups.push(() => ctx.off("page", onPage));
|
|
1263
1433
|
cleanups.push(() => ctx.off("close", onClose));
|
|
1434
|
+
cleanups.push(() => ctx.off("request", onCtxRequest));
|
|
1435
|
+
cleanups.push(() => ctx.off("requestfailed", onCtxRequestFailed));
|
|
1436
|
+
cleanups.push(() => ctx.off("response", onCtxResponse));
|
|
1264
1437
|
|
|
1265
1438
|
if (pg) registerPage(pg, cleanups);
|
|
1266
1439
|
}
|
|
@@ -1271,7 +1444,6 @@ export function createKiroCallbackMonitor(context, page, timeoutMs = DEFAULT_MAN
|
|
|
1271
1444
|
if (newContext) bind(newContext, newPage);
|
|
1272
1445
|
};
|
|
1273
1446
|
|
|
1274
|
-
// Allow cancel path to force-reject without waiting for timeout
|
|
1275
1447
|
promise.abort = (reason = "Job cancelled") => {
|
|
1276
1448
|
settle(null, new Error(reason));
|
|
1277
1449
|
};
|
|
@@ -1392,11 +1564,21 @@ export async function runGoogleAccountAutomation({
|
|
|
1392
1564
|
onStep?.(step, message);
|
|
1393
1565
|
};
|
|
1394
1566
|
|
|
1567
|
+
const interstitialOpts = (maxWaitMs) => ({ maxWaitMs, successPromise });
|
|
1568
|
+
// Prevent re-submitting email/password while Google is still transitioning
|
|
1569
|
+
// (pwd page stays mounted ~1–3s after Next; re-fill aborts the OAuth chain).
|
|
1570
|
+
let passwordSubmittedAt = 0;
|
|
1571
|
+
let emailSubmittedAt = 0;
|
|
1572
|
+
const PASSWORD_RESUBMIT_COOLDOWN_MS = 25_000;
|
|
1573
|
+
const EMAIL_RESUBMIT_COOLDOWN_MS = 12_000;
|
|
1574
|
+
|
|
1395
1575
|
reportStep(openingStep, openingMessage);
|
|
1396
1576
|
await page.goto(authUrl, { waitUntil: "domcontentloaded", timeout: 60_000 });
|
|
1397
1577
|
await page.waitForTimeout(2_000);
|
|
1578
|
+
await waitThroughGoogleInterstitials(page, reportStep, interstitialOpts(12_000));
|
|
1398
1579
|
|
|
1399
1580
|
await handleProviderLoginGate(page, reportStep);
|
|
1581
|
+
await waitThroughGoogleInterstitials(page, reportStep, interstitialOpts(8_000));
|
|
1400
1582
|
|
|
1401
1583
|
const emailInput = await waitForFirstVisibleLocator(page, EMAIL_INPUT_SELECTOR, { timeout: 15_000 });
|
|
1402
1584
|
if (emailInput) {
|
|
@@ -1407,10 +1589,12 @@ export async function runGoogleAccountAutomation({
|
|
|
1407
1589
|
} else {
|
|
1408
1590
|
reportStep("submitting_email", "Submitting email");
|
|
1409
1591
|
await clickFirstVisible(page, NEXT_BUTTON_SELECTORS);
|
|
1592
|
+
emailSubmittedAt = Date.now();
|
|
1410
1593
|
// Wait for the page to transition away from the email step so the
|
|
1411
1594
|
// polling loop doesn't immediately re-detect the disappearing email
|
|
1412
1595
|
// field and type the email value into the password input.
|
|
1413
|
-
await page.waitForTimeout(
|
|
1596
|
+
await page.waitForTimeout(1_500);
|
|
1597
|
+
await waitThroughGoogleInterstitials(page, reportStep, interstitialOpts(12_000));
|
|
1414
1598
|
}
|
|
1415
1599
|
}
|
|
1416
1600
|
|
|
@@ -1436,20 +1620,31 @@ export async function runGoogleAccountAutomation({
|
|
|
1436
1620
|
};
|
|
1437
1621
|
}
|
|
1438
1622
|
|
|
1623
|
+
// Unblock SetSID / empty Google interstitials before other handlers
|
|
1624
|
+
const waited = await waitThroughGoogleInterstitials(page, reportStep, interstitialOpts(8_000));
|
|
1625
|
+
if (waited) {
|
|
1626
|
+
continue;
|
|
1627
|
+
}
|
|
1628
|
+
|
|
1439
1629
|
const handledGoogleConsent = await handleGoogleConsent(page, reportStep);
|
|
1440
1630
|
if (handledGoogleConsent) {
|
|
1631
|
+
await waitThroughGoogleInterstitials(page, reportStep, interstitialOpts(12_000));
|
|
1441
1632
|
continue;
|
|
1442
1633
|
}
|
|
1443
1634
|
|
|
1444
|
-
// Headless Chromium
|
|
1445
|
-
//
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1635
|
+
// Headless Chromium is rejected after email submit → /v3/signin/rejected
|
|
1636
|
+
// ("This browser or app may not be secure"). Fail fast — do not spin 90s.
|
|
1637
|
+
if (await isBlockedBrowser(page)) {
|
|
1638
|
+
const url = page.url?.() || "";
|
|
1639
|
+
reportStep(
|
|
1640
|
+
"browser_blocked_by_google",
|
|
1641
|
+
`Google blocked this browser (url=${url.slice(0, 120)}). Headless Chromium is rejected — use headed mode or Camoufox.`,
|
|
1642
|
+
);
|
|
1450
1643
|
return {
|
|
1451
|
-
status: "
|
|
1452
|
-
error:
|
|
1644
|
+
status: "failed_browser_blocked",
|
|
1645
|
+
error:
|
|
1646
|
+
"Google blocked the automated browser (\"This browser or app may not be secure\" / signin rejected). " +
|
|
1647
|
+
"Kiro bulk must use headed Chromium (Xvfb on Linux) or the Camoufox engine — not headless Chrome.",
|
|
1453
1648
|
};
|
|
1454
1649
|
}
|
|
1455
1650
|
|
|
@@ -1495,25 +1690,60 @@ export async function runGoogleAccountAutomation({
|
|
|
1495
1690
|
// address into whatever field is focused (often the password input).
|
|
1496
1691
|
const passwordInput = await getFirstVisibleLocator(page, PASSWORD_INPUT_SELECTOR);
|
|
1497
1692
|
if (passwordInput) {
|
|
1693
|
+
const sincePw = Date.now() - passwordSubmittedAt;
|
|
1694
|
+
if (passwordSubmittedAt && sincePw < PASSWORD_RESUBMIT_COOLDOWN_MS) {
|
|
1695
|
+
// Still on (or animating off) the password form after a recent submit —
|
|
1696
|
+
// do NOT re-fill; wait for SetSID/consent/callback instead.
|
|
1697
|
+
reportStep(
|
|
1698
|
+
"waiting_after_password",
|
|
1699
|
+
`Password already submitted ${Math.round(sincePw / 1000)}s ago — waiting for Google redirect`,
|
|
1700
|
+
);
|
|
1701
|
+
await waitThroughGoogleInterstitials(page, reportStep, interstitialOpts(8_000));
|
|
1702
|
+
await page.waitForTimeout(500);
|
|
1703
|
+
continue;
|
|
1704
|
+
}
|
|
1705
|
+
|
|
1498
1706
|
reportStep("entering_password", "Entering Google password");
|
|
1499
1707
|
const filled = await fillInputResilient(passwordInput, password);
|
|
1500
1708
|
if (filled) {
|
|
1501
1709
|
reportStep("submitting_password", "Submitting password");
|
|
1502
1710
|
await clickFirstVisible(page, NEXT_BUTTON_SELECTORS);
|
|
1711
|
+
passwordSubmittedAt = Date.now();
|
|
1712
|
+
// Give Google time to leave the password challenge before the next
|
|
1713
|
+
// loop iteration can re-detect the still-mounted password field.
|
|
1714
|
+
await Promise.race([
|
|
1715
|
+
page.waitForNavigation({ waitUntil: "domcontentloaded", timeout: 8_000 }).catch(() => null),
|
|
1716
|
+
page.waitForTimeout(2_500),
|
|
1717
|
+
]);
|
|
1718
|
+
// Password submit often lands on empty SetSID while network completes
|
|
1719
|
+
// consent→idpresponse→kiro://. Callback monitor (CDP) settles successPromise.
|
|
1720
|
+
await waitThroughGoogleInterstitials(page, reportStep, interstitialOpts(25_000));
|
|
1503
1721
|
} else {
|
|
1504
1722
|
reportStep("password_fill_failed", "Could not fill the Google password field; retrying loop");
|
|
1723
|
+
await page.waitForTimeout(700);
|
|
1505
1724
|
}
|
|
1506
|
-
await page.waitForTimeout(700);
|
|
1507
1725
|
continue;
|
|
1508
1726
|
}
|
|
1509
1727
|
|
|
1510
1728
|
const nextEmailInput = await getFirstVisibleLocator(page, EMAIL_INPUT_SELECTOR);
|
|
1511
1729
|
if (nextEmailInput) {
|
|
1730
|
+
const sinceEmail = Date.now() - emailSubmittedAt;
|
|
1731
|
+
if (emailSubmittedAt && sinceEmail < EMAIL_RESUBMIT_COOLDOWN_MS) {
|
|
1732
|
+
reportStep(
|
|
1733
|
+
"waiting_after_email",
|
|
1734
|
+
`Email already submitted ${Math.round(sinceEmail / 1000)}s ago — waiting for password/next screen`,
|
|
1735
|
+
);
|
|
1736
|
+
await page.waitForTimeout(800);
|
|
1737
|
+
continue;
|
|
1738
|
+
}
|
|
1739
|
+
|
|
1512
1740
|
reportStep("entering_email", "Entering Google email");
|
|
1513
1741
|
const filled = await fillInputResilient(nextEmailInput, email);
|
|
1514
1742
|
if (filled) {
|
|
1515
1743
|
reportStep("submitting_email", "Submitting email");
|
|
1516
1744
|
await clickFirstVisible(page, NEXT_BUTTON_SELECTORS);
|
|
1745
|
+
emailSubmittedAt = Date.now();
|
|
1746
|
+
await page.waitForTimeout(1_500);
|
|
1517
1747
|
} else {
|
|
1518
1748
|
reportStep("email_fill_failed", "Could not fill the Google email field; retrying loop");
|
|
1519
1749
|
}
|
|
@@ -1533,14 +1763,42 @@ export async function runGoogleAccountAutomation({
|
|
|
1533
1763
|
continue;
|
|
1534
1764
|
}
|
|
1535
1765
|
|
|
1536
|
-
|
|
1766
|
+
// Periodic diagnostics so jobs aren't opaque "waiting" spam
|
|
1767
|
+
if (Math.floor((Date.now() - startTime) / 5000) !== Math.floor((Date.now() - startTime - 700) / 5000)) {
|
|
1768
|
+
const url = page.url?.() || "";
|
|
1769
|
+
const snippet = String(text || (await readPageText(page).catch(() => ""))).slice(0, 100).replace(/\s+/g, " ");
|
|
1770
|
+
reportStep(
|
|
1771
|
+
"waiting_for_next_screen",
|
|
1772
|
+
`Waiting for the next Google or ${serviceLabel} screen (url=${url.slice(0, 100)} body=${snippet})`,
|
|
1773
|
+
);
|
|
1774
|
+
} else {
|
|
1775
|
+
reportStep("waiting_for_next_screen", `Waiting for the next Google or ${serviceLabel} screen`);
|
|
1776
|
+
}
|
|
1537
1777
|
await page.waitForTimeout(700);
|
|
1538
1778
|
}
|
|
1539
1779
|
|
|
1540
|
-
|
|
1780
|
+
// Final blocked check before generic needs_manual
|
|
1781
|
+
if (await isBlockedBrowser(page)) {
|
|
1782
|
+
reportStep("browser_blocked_by_google", "Google blocked browser at end of automation window");
|
|
1783
|
+
return {
|
|
1784
|
+
status: "failed_browser_blocked",
|
|
1785
|
+
error:
|
|
1786
|
+
"Google blocked the automated browser (\"This browser or app may not be secure\"). " +
|
|
1787
|
+
"Use headed Chromium (Xvfb) or Camoufox engine.",
|
|
1788
|
+
};
|
|
1789
|
+
}
|
|
1790
|
+
|
|
1791
|
+
const finalUrl = page.url?.() || "";
|
|
1792
|
+
const finalBody = String(await readPageText(page).catch(() => "")).slice(0, 120).replace(/\s+/g, " ");
|
|
1793
|
+
reportStep(
|
|
1794
|
+
"manual_assist_required",
|
|
1795
|
+
`Flow did not complete ${serviceLabel} authorization automatically (url=${finalUrl.slice(0, 100)} body=${finalBody})`,
|
|
1796
|
+
);
|
|
1541
1797
|
return {
|
|
1542
1798
|
status: "needs_manual",
|
|
1543
|
-
error:
|
|
1799
|
+
error:
|
|
1800
|
+
`Manual assist required — ${serviceLabel} authorization did not finish automatically ` +
|
|
1801
|
+
`(last url: ${finalUrl.slice(0, 140)}). If you see "browser may not be secure", switch to headed Chromium/Camoufox.`,
|
|
1544
1802
|
};
|
|
1545
1803
|
}
|
|
1546
1804
|
|
|
File without changes
|
|
File without changes
|