zevairouter 1.0.148 → 1.0.150
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 +14 -0
- package/cli/app/.next-cli-build/BUILD_ID +1 -1
- package/cli/app/.next-cli-build/app-path-routes-manifest.json +8 -8
- 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/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/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 +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_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 +8 -8
- package/cli/app/.next-cli-build/server/chunks/3155.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/4566.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/5949.js +3 -3
- package/cli/app/.next-cli-build/server/chunks/8306.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/8371.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/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-16902cd352ef1d97.js → 620-4698719a19477138.js} +1 -1
- package/cli/app/CHANGELOG.md +14 -0
- package/cli/app/package.json +1 -1
- package/cli/package.json +1 -1
- package/package.json +1 -1
- package/src/lib/oauth/services/bulkImportBrowserEngine.js +78 -4
- package/src/lib/oauth/services/codebuddyCnBulkImportManager.js +395 -66
- package/src/lib/oauth/services/codebuddyCnPhoneAutomation.js +81 -45
- package/src/lib/oauth/services/kiroBulkImportManager.js +12 -9
- /package/cli/app/.next-cli-build/static/{kmlfntQuBCJ_ni8__OiKd → STIs6ehtw793h3BxKhNWo}/_buildManifest.js +0 -0
- /package/cli/app/.next-cli-build/static/{kmlfntQuBCJ_ni8__OiKd → STIs6ehtw793h3BxKhNWo}/_ssgManifest.js +0 -0
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
20
|
import { randomUUID } from "crypto";
|
|
21
|
+
import net from "node:net";
|
|
21
22
|
import {
|
|
22
23
|
KiroBulkImportManager,
|
|
23
24
|
buildLookupResponse,
|
|
@@ -40,7 +41,10 @@ import {
|
|
|
40
41
|
defaultPollForToken,
|
|
41
42
|
fetchCodeBuddyLoginAccount,
|
|
42
43
|
} from "./codebuddyBulkImportManager.js";
|
|
43
|
-
import {
|
|
44
|
+
import {
|
|
45
|
+
forceCloseBrowser,
|
|
46
|
+
getCloakProxyProfile,
|
|
47
|
+
} from "./bulkImportBrowserEngine.js";
|
|
44
48
|
|
|
45
49
|
const CODEBUDDY_CN_PROVIDER_ID = "codebuddy-cn";
|
|
46
50
|
const CODEBUDDY_CN_LABEL = "CodeBuddy CN";
|
|
@@ -82,7 +86,14 @@ const CODEBUDDY_CN_MANUAL_TIMEOUT_MS = 8 * 60_000;
|
|
|
82
86
|
const CODEBUDDY_CN_LOW_MEM_MANUAL_TIMEOUT_MS = 3 * 60_000;
|
|
83
87
|
const CODEBUDDY_CN_RESOURCE_CLOSE_TIMEOUT_MS = 5_000;
|
|
84
88
|
const CODEBUDDY_CN_FIVESIM_SETTLE_TIMEOUT_MS = 12_000;
|
|
89
|
+
const CODEBUDDY_CN_EGRESS_PROBE_TIMEOUT_MS = 6_000;
|
|
85
90
|
const CODEBUDDY_CN_API_KEY_OUTCOME_UNKNOWN = "CN_API_KEY_OUTCOME_UNKNOWN";
|
|
91
|
+
const CODEBUDDY_CN_ACCOUNT_RESTRICTED = "CN_ACCOUNT_RESTRICTED";
|
|
92
|
+
const CODEBUDDY_CN_EGRESS_ECHO_URLS = [
|
|
93
|
+
"https://api.ipify.org",
|
|
94
|
+
"https://checkip.amazonaws.com",
|
|
95
|
+
"https://ifconfig.me/ip",
|
|
96
|
+
];
|
|
86
97
|
|
|
87
98
|
// Supported 5sim regions
|
|
88
99
|
const SUPPORTED_REGIONS = new Set(["hongkong", "china", "any"]);
|
|
@@ -126,6 +137,96 @@ function clampCnConcurrency(value) {
|
|
|
126
137
|
return Math.min(hardMax, Math.max(CODEBUDDY_CN_MIN_CONCURRENCY, parsed));
|
|
127
138
|
}
|
|
128
139
|
|
|
140
|
+
function resolveCnJobConcurrency(value, { manualProxy = false } = {}) {
|
|
141
|
+
return manualProxy ? 1 : clampCnConcurrency(value);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function parseEgressIp(value) {
|
|
145
|
+
const raw = String(value || "").trim();
|
|
146
|
+
if (net.isIP(raw)) return raw;
|
|
147
|
+
try {
|
|
148
|
+
const parsed = JSON.parse(raw);
|
|
149
|
+
const ip = String(parsed?.ip || parsed?.query || "").trim();
|
|
150
|
+
return net.isIP(ip) ? ip : null;
|
|
151
|
+
} catch {
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
async function probeCodeBuddyProxyEgress(
|
|
157
|
+
context,
|
|
158
|
+
{ timeoutMs = CODEBUDDY_CN_EGRESS_PROBE_TIMEOUT_MS } = {},
|
|
159
|
+
) {
|
|
160
|
+
let requestContext = null;
|
|
161
|
+
try {
|
|
162
|
+
requestContext = context?.request || null;
|
|
163
|
+
} catch {
|
|
164
|
+
requestContext = null;
|
|
165
|
+
}
|
|
166
|
+
if (!requestContext || typeof requestContext.get !== "function") {
|
|
167
|
+
return { ok: false, ip: null, ips: [], samples: 0, error: "context request unavailable" };
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const results = await Promise.all(CODEBUDDY_CN_EGRESS_ECHO_URLS.map(async (url) => {
|
|
171
|
+
let response = null;
|
|
172
|
+
try {
|
|
173
|
+
response = await requestContext.get(url, {
|
|
174
|
+
timeout: timeoutMs,
|
|
175
|
+
failOnStatusCode: false,
|
|
176
|
+
headers: {
|
|
177
|
+
Accept: "text/plain, application/json;q=0.9, */*;q=0.1",
|
|
178
|
+
"Cache-Control": "no-cache",
|
|
179
|
+
},
|
|
180
|
+
});
|
|
181
|
+
if (response.status() < 200 || response.status() >= 300) return null;
|
|
182
|
+
return parseEgressIp(await response.text().catch(() => ""));
|
|
183
|
+
} catch {
|
|
184
|
+
return null;
|
|
185
|
+
} finally {
|
|
186
|
+
if (typeof response?.dispose === "function") {
|
|
187
|
+
await Promise.resolve(response.dispose()).catch(() => null);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}));
|
|
191
|
+
|
|
192
|
+
const successful = results.filter(Boolean);
|
|
193
|
+
const ips = [...new Set(successful)];
|
|
194
|
+
return {
|
|
195
|
+
ok: ips.length === 1,
|
|
196
|
+
ip: ips.length === 1 ? ips[0] : null,
|
|
197
|
+
ips,
|
|
198
|
+
samples: successful.length,
|
|
199
|
+
unstable: ips.length > 1,
|
|
200
|
+
error: ips.length === 0
|
|
201
|
+
? "all exit-IP services failed"
|
|
202
|
+
: ips.length > 1
|
|
203
|
+
? `proxy returned ${ips.length} exit IPs in one probe`
|
|
204
|
+
: null,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
function requireStableProxyEgress(probe, expectedIp = null) {
|
|
209
|
+
if (probe?.unstable) {
|
|
210
|
+
throw Object.assign(
|
|
211
|
+
new Error("Manual proxy rotated between exit IPs during preflight; no phone number was purchased"),
|
|
212
|
+
{ code: "CN_PROXY_EGRESS_UNSTABLE" },
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
if (!probe?.ok || !probe?.ip) {
|
|
216
|
+
throw Object.assign(
|
|
217
|
+
new Error(`Manual proxy exit IP could not be verified (${probe?.error || "no response"}); no phone number was purchased`),
|
|
218
|
+
{ code: "CN_PROXY_EGRESS_UNVERIFIED" },
|
|
219
|
+
);
|
|
220
|
+
}
|
|
221
|
+
if (expectedIp && probe.ip !== expectedIp) {
|
|
222
|
+
throw Object.assign(
|
|
223
|
+
new Error("Manual proxy exit IP changed after CloakBrowser GeoIP alignment; no phone number was purchased"),
|
|
224
|
+
{ code: "CN_PROXY_EGRESS_CHANGED" },
|
|
225
|
+
);
|
|
226
|
+
}
|
|
227
|
+
return probe.ip;
|
|
228
|
+
}
|
|
229
|
+
|
|
129
230
|
async function withTimeoutCleanup(
|
|
130
231
|
task,
|
|
131
232
|
{
|
|
@@ -163,9 +264,125 @@ async function withTimeoutCleanup(
|
|
|
163
264
|
}
|
|
164
265
|
|
|
165
266
|
function isLoginHtmlProbe(probe) {
|
|
267
|
+
const raw = `${probe?.text || ""} ${probe?.data?._raw || ""} ${probe?.url || ""}`;
|
|
268
|
+
return /<!doctype html|<html|login-pf|\/auth\/realms\//i.test(raw);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
function parseConsoleProbeBody(status, text, extras = {}) {
|
|
272
|
+
const rawText = String(text || "");
|
|
273
|
+
let data = null;
|
|
274
|
+
try {
|
|
275
|
+
data = rawText ? JSON.parse(rawText) : null;
|
|
276
|
+
} catch {
|
|
277
|
+
data = { _raw: rawText.slice(0, 240), _notJson: true };
|
|
278
|
+
}
|
|
279
|
+
return {
|
|
280
|
+
status: Number(status) || 0,
|
|
281
|
+
data,
|
|
282
|
+
text: rawText.slice(0, 240),
|
|
283
|
+
...extras,
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
function hasRestrictedConsoleEvidence(probe, cookieNames = []) {
|
|
288
|
+
const names = cookieNames instanceof Set ? cookieNames : new Set(cookieNames);
|
|
166
289
|
const raw = `${probe?.text || ""} ${probe?.data?._raw || ""}`;
|
|
167
|
-
|
|
168
|
-
|
|
290
|
+
if (/账号访问受限|安全策略限制|访问受限|account restricted|access restricted/i.test(raw)) {
|
|
291
|
+
return true;
|
|
292
|
+
}
|
|
293
|
+
if (!names.has("login_risk_state")) return false;
|
|
294
|
+
return isLoginHtmlProbe(probe)
|
|
295
|
+
|| probe?.status === 0
|
|
296
|
+
|| probe?.status === 401
|
|
297
|
+
|| probe?.status === 403;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
async function probeCodeBuddyConsoleAccounts({
|
|
301
|
+
context,
|
|
302
|
+
page,
|
|
303
|
+
timeoutMs = CODEBUDDY_CN_CONSOLE_PROBE_TIMEOUT_MS,
|
|
304
|
+
}) {
|
|
305
|
+
const headers = {
|
|
306
|
+
Accept: "application/json, text/plain, */*",
|
|
307
|
+
"x-requested-with": "XMLHttpRequest",
|
|
308
|
+
"X-Domain": "www.codebuddy.cn",
|
|
309
|
+
"X-Product": "SaaS",
|
|
310
|
+
};
|
|
311
|
+
|
|
312
|
+
// The context request shares browser cookies but bypasses page-origin CORS.
|
|
313
|
+
let requestContext = null;
|
|
314
|
+
try {
|
|
315
|
+
requestContext = context?.request || null;
|
|
316
|
+
} catch {
|
|
317
|
+
requestContext = null;
|
|
318
|
+
}
|
|
319
|
+
if (requestContext && typeof requestContext.get === "function") {
|
|
320
|
+
try {
|
|
321
|
+
const response = await requestContext.get(
|
|
322
|
+
"https://www.codebuddy.cn/console/accounts",
|
|
323
|
+
{ headers, timeout: timeoutMs, failOnStatusCode: false },
|
|
324
|
+
);
|
|
325
|
+
const text = await response.text().catch(() => "");
|
|
326
|
+
return parseConsoleProbeBody(response.status(), text, {
|
|
327
|
+
source: "context-request",
|
|
328
|
+
url: response.url(),
|
|
329
|
+
contentType: response.headers()?.["content-type"] || "",
|
|
330
|
+
});
|
|
331
|
+
} catch {
|
|
332
|
+
// Compatibility fallback for older CloakBrowser request contexts.
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
const probeTask = page.evaluate(async ({ requestTimeoutMs, requestHeaders }) => {
|
|
337
|
+
const controller = new AbortController();
|
|
338
|
+
const timer = setTimeout(() => controller.abort(), requestTimeoutMs);
|
|
339
|
+
try {
|
|
340
|
+
const host = window.location.hostname || "www.codebuddy.cn";
|
|
341
|
+
const base = host === "www.codebuddy.cn"
|
|
342
|
+
? `${window.location.origin}`
|
|
343
|
+
: "https://www.codebuddy.cn";
|
|
344
|
+
const response = await fetch(`${base}/console/accounts`, {
|
|
345
|
+
credentials: "include",
|
|
346
|
+
signal: controller.signal,
|
|
347
|
+
headers: requestHeaders,
|
|
348
|
+
});
|
|
349
|
+
const text = await response.text().catch(() => "");
|
|
350
|
+
let data = null;
|
|
351
|
+
try {
|
|
352
|
+
data = text ? JSON.parse(text) : null;
|
|
353
|
+
} catch {
|
|
354
|
+
data = { _raw: String(text || "").slice(0, 240), _notJson: true };
|
|
355
|
+
}
|
|
356
|
+
return {
|
|
357
|
+
status: response.status,
|
|
358
|
+
data,
|
|
359
|
+
text: String(text || "").slice(0, 240),
|
|
360
|
+
source: "page-fetch",
|
|
361
|
+
url: response.url,
|
|
362
|
+
contentType: response.headers.get("content-type") || "",
|
|
363
|
+
};
|
|
364
|
+
} catch (error) {
|
|
365
|
+
return {
|
|
366
|
+
status: 0,
|
|
367
|
+
timedOut: error?.name === "AbortError",
|
|
368
|
+
error: error?.message || String(error),
|
|
369
|
+
source: "page-fetch",
|
|
370
|
+
};
|
|
371
|
+
} finally {
|
|
372
|
+
clearTimeout(timer);
|
|
373
|
+
}
|
|
374
|
+
}, { requestTimeoutMs: timeoutMs, requestHeaders: headers });
|
|
375
|
+
|
|
376
|
+
return withTimeoutCleanup(probeTask, {
|
|
377
|
+
timeoutMs,
|
|
378
|
+
message: `Console account probe timed out after ${timeoutMs / 1000}s`,
|
|
379
|
+
code: "CN_CONSOLE_PROBE_TIMEOUT",
|
|
380
|
+
}).catch((error) => ({
|
|
381
|
+
status: 0,
|
|
382
|
+
timedOut: error?.code === "CN_CONSOLE_PROBE_TIMEOUT",
|
|
383
|
+
error: error?.message || String(error),
|
|
384
|
+
source: "page-fetch",
|
|
385
|
+
}));
|
|
169
386
|
}
|
|
170
387
|
|
|
171
388
|
async function closeResourceBounded(resource) {
|
|
@@ -271,6 +488,7 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
|
|
|
271
488
|
proxyUrl,
|
|
272
489
|
headless,
|
|
273
490
|
windowSize: { width: 1280, height: 900 },
|
|
491
|
+
requireProxyGeoip: job?.proxyPoolMode === "manual" && Boolean(proxyUrl),
|
|
274
492
|
});
|
|
275
493
|
return withTimeoutCleanup(launchTask, {
|
|
276
494
|
timeoutMs: CODEBUDDY_CN_BROWSER_LAUNCH_TIMEOUT_MS,
|
|
@@ -355,7 +573,7 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
|
|
|
355
573
|
const job = {
|
|
356
574
|
jobId,
|
|
357
575
|
status: "running",
|
|
358
|
-
concurrency:
|
|
576
|
+
concurrency: resolveCnJobConcurrency(concurrency, { manualProxy: Boolean(manualProxy) }),
|
|
359
577
|
proxyPoolMode: manualProxy ? "manual" : (proxyPoolMode || "none"),
|
|
360
578
|
proxyUrls,
|
|
361
579
|
region: resolvedRegion,
|
|
@@ -379,6 +597,9 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
|
|
|
379
597
|
// Unique Chromium fingerprint seed per account (viewport/HW/screen noise).
|
|
380
598
|
fingerprintSeed: randomUUID(),
|
|
381
599
|
proxyUrl: null,
|
|
600
|
+
egressIp: null,
|
|
601
|
+
proxyTimezone: null,
|
|
602
|
+
proxyLocale: null,
|
|
382
603
|
abortController: new AbortController(),
|
|
383
604
|
status: "queued",
|
|
384
605
|
error: null,
|
|
@@ -427,6 +648,7 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
|
|
|
427
648
|
let fiveSimOrderId = null;
|
|
428
649
|
let smsReceived = false;
|
|
429
650
|
let context = null;
|
|
651
|
+
let verifiedEgressIp = null;
|
|
430
652
|
|
|
431
653
|
try {
|
|
432
654
|
// Step 1: Get 5sim API key from settings
|
|
@@ -452,16 +674,14 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
|
|
|
452
674
|
// Step 2: Create browser context FIRST — if proxy/browser fails, we never buy a number.
|
|
453
675
|
this.setAccountStep(account, "creating_browser", "Creating browser context (before 5sim order)");
|
|
454
676
|
await this.persistJobSnapshot(job, { forcePreview: true });
|
|
455
|
-
// CloakBrowser
|
|
456
|
-
//
|
|
457
|
-
// cause of 账号访问受限 right after OTP). Per-account fingerprint seed —
|
|
458
|
-
// sticky residential IP alone still clusters if every session shares HW.
|
|
459
|
-
if (!account.fingerprintSeed) account.fingerprintSeed = randomUUID();
|
|
677
|
+
// CloakBrowser owns the process-wide fingerprint, timezone, locale, and
|
|
678
|
+
// WebRTC profile. Playwright context overrides would reintroduce CDP tells.
|
|
460
679
|
const contextTask = createFreshContext(job.browser, account.proxyUrl, {
|
|
461
680
|
profile: "codebuddy-cn",
|
|
462
681
|
region: job.region || "hongkong",
|
|
463
682
|
fingerprintSeed: account.fingerprintSeed,
|
|
464
683
|
lowMemory: isLowMemHost(),
|
|
684
|
+
nativeCloakProfile: job.proxyPoolMode === "manual",
|
|
465
685
|
});
|
|
466
686
|
const freshContext = await withTimeoutCleanup(contextTask, {
|
|
467
687
|
timeoutMs: CODEBUDDY_CN_CONTEXT_TIMEOUT_MS,
|
|
@@ -473,6 +693,27 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
|
|
|
473
693
|
const page = freshContext.page;
|
|
474
694
|
account.runtimeSession = { context, page };
|
|
475
695
|
|
|
696
|
+
if (job.proxyPoolMode === "manual" && account.proxyUrl) {
|
|
697
|
+
this.setAccountStep(
|
|
698
|
+
account,
|
|
699
|
+
"checking_proxy_egress",
|
|
700
|
+
"Verifying pasted proxy exit IP before opening the registration form",
|
|
701
|
+
);
|
|
702
|
+
await this.persistJobSnapshot(job, { forcePreview: false });
|
|
703
|
+
const launchProfile = getCloakProxyProfile(job.browser);
|
|
704
|
+
const egressProbe = await probeCodeBuddyProxyEgress(context);
|
|
705
|
+
verifiedEgressIp = requireStableProxyEgress(egressProbe, launchProfile?.egressIp || null);
|
|
706
|
+
account.egressIp = verifiedEgressIp;
|
|
707
|
+
account.proxyTimezone = launchProfile?.timezone || null;
|
|
708
|
+
account.proxyLocale = launchProfile?.locale || null;
|
|
709
|
+
this.setAccountStep(
|
|
710
|
+
account,
|
|
711
|
+
"proxy_egress_ready",
|
|
712
|
+
`Manual proxy verified: ${verifiedEgressIp} (${egressProbe.samples} checks, ${account.proxyTimezone || "timezone unknown"}, ${account.proxyLocale || "locale unknown"})`,
|
|
713
|
+
);
|
|
714
|
+
await this.persistJobSnapshot(job, { forcePreview: false });
|
|
715
|
+
}
|
|
716
|
+
|
|
476
717
|
if (job.cancelRequested) {
|
|
477
718
|
throw new Error("Job cancelled before ordering phone number");
|
|
478
719
|
}
|
|
@@ -519,6 +760,22 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
|
|
|
519
760
|
if (job.cancelRequested) {
|
|
520
761
|
throw new Error("Job cancelled before ordering phone number");
|
|
521
762
|
}
|
|
763
|
+
if (job.proxyPoolMode === "manual" && account.proxyUrl) {
|
|
764
|
+
this.setAccountStep(
|
|
765
|
+
account,
|
|
766
|
+
"rechecking_proxy_egress",
|
|
767
|
+
"Registration form is ready — confirming the pasted proxy stayed sticky",
|
|
768
|
+
);
|
|
769
|
+
await this.persistJobSnapshot(job, { forcePreview: false });
|
|
770
|
+
const secondProbe = await probeCodeBuddyProxyEgress(context);
|
|
771
|
+
requireStableProxyEgress(secondProbe, verifiedEgressIp);
|
|
772
|
+
this.setAccountStep(
|
|
773
|
+
account,
|
|
774
|
+
"proxy_egress_confirmed",
|
|
775
|
+
`Manual proxy remained on ${verifiedEgressIp}; safe to purchase one phone number`,
|
|
776
|
+
);
|
|
777
|
+
await this.persistJobSnapshot(job, { forcePreview: false });
|
|
778
|
+
}
|
|
522
779
|
this.setAccountStep(
|
|
523
780
|
account,
|
|
524
781
|
"ordering_number",
|
|
@@ -576,12 +833,13 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
|
|
|
576
833
|
// If automation failed early (e.g. page.goto timeout), the session won't be logged in
|
|
577
834
|
// and API key creation will 401 — so don't waste time. Only try bypass if automation
|
|
578
835
|
// reported "success" or "needs_manual" (meaning submit happened).
|
|
579
|
-
if (automationResult.status
|
|
836
|
+
if (String(automationResult.status || "").startsWith("failed")) {
|
|
580
837
|
// Automation failed before submit — no point trying API key
|
|
581
838
|
const errorMsg = automationResult.error || "Phone registration failed before submit";
|
|
582
|
-
|
|
839
|
+
const failureStatus = automationResult.status || "failed";
|
|
840
|
+
this.finalizeAccount(account, failureStatus, {
|
|
583
841
|
error: errorMsg,
|
|
584
|
-
step:
|
|
842
|
+
step: failureStatus,
|
|
585
843
|
message: errorMsg,
|
|
586
844
|
});
|
|
587
845
|
// Only touch 5sim if we actually bought a number (order is deferred until form ready)
|
|
@@ -702,55 +960,7 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
|
|
|
702
960
|
|| names.has("qcmainCSRFToken")
|
|
703
961
|
|| names.has("x_host_key_access");
|
|
704
962
|
|
|
705
|
-
const probeConsoleAccounts =
|
|
706
|
-
const probeTask = page.evaluate(async ({ timeoutMs }) => {
|
|
707
|
-
const controller = new AbortController();
|
|
708
|
-
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
709
|
-
try {
|
|
710
|
-
// Relative /console/accounts fails on Tencent/Keycloak login hosts.
|
|
711
|
-
const host = window.location.hostname || "www.codebuddy.cn";
|
|
712
|
-
const base = host === "www.codebuddy.cn"
|
|
713
|
-
? `${window.location.origin}`
|
|
714
|
-
: "https://www.codebuddy.cn";
|
|
715
|
-
const res = await fetch(`${base}/console/accounts`, {
|
|
716
|
-
credentials: "include",
|
|
717
|
-
signal: controller.signal,
|
|
718
|
-
headers: {
|
|
719
|
-
Accept: "application/json, text/plain, */*",
|
|
720
|
-
"x-requested-with": "XMLHttpRequest",
|
|
721
|
-
"X-Domain": "www.codebuddy.cn",
|
|
722
|
-
"X-Product": "SaaS",
|
|
723
|
-
},
|
|
724
|
-
});
|
|
725
|
-
const text = await res.text().catch(() => "");
|
|
726
|
-
let data = null;
|
|
727
|
-
try {
|
|
728
|
-
data = text ? JSON.parse(text) : null;
|
|
729
|
-
} catch {
|
|
730
|
-
data = { _raw: String(text || "").slice(0, 240), _notJson: true };
|
|
731
|
-
}
|
|
732
|
-
return { status: res.status, data, text: String(text || "").slice(0, 240) };
|
|
733
|
-
} catch (error) {
|
|
734
|
-
return {
|
|
735
|
-
status: 0,
|
|
736
|
-
timedOut: error?.name === "AbortError",
|
|
737
|
-
error: error?.message || String(error),
|
|
738
|
-
};
|
|
739
|
-
} finally {
|
|
740
|
-
clearTimeout(timer);
|
|
741
|
-
}
|
|
742
|
-
}, { timeoutMs: CODEBUDDY_CN_CONSOLE_PROBE_TIMEOUT_MS });
|
|
743
|
-
|
|
744
|
-
return withTimeoutCleanup(probeTask, {
|
|
745
|
-
timeoutMs: CODEBUDDY_CN_CONSOLE_PROBE_TIMEOUT_MS,
|
|
746
|
-
message: `Console account probe timed out after ${CODEBUDDY_CN_CONSOLE_PROBE_TIMEOUT_MS / 1000}s`,
|
|
747
|
-
code: "CN_CONSOLE_PROBE_TIMEOUT",
|
|
748
|
-
}).catch((error) => ({
|
|
749
|
-
status: 0,
|
|
750
|
-
timedOut: error?.code === "CN_CONSOLE_PROBE_TIMEOUT",
|
|
751
|
-
error: error?.message || String(error),
|
|
752
|
-
}));
|
|
753
|
-
};
|
|
963
|
+
const probeConsoleAccounts = () => probeCodeBuddyConsoleAccounts({ context, page });
|
|
754
964
|
|
|
755
965
|
const extractAccountList = (probe) => {
|
|
756
966
|
const d = probe?.data;
|
|
@@ -825,6 +1035,8 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
|
|
|
825
1035
|
let accountsProbe = null;
|
|
826
1036
|
let sessionReady = false;
|
|
827
1037
|
let lastPayloadSnippet = "";
|
|
1038
|
+
let lastMeaningfulProbe = null;
|
|
1039
|
+
let restrictedProbeCount = 0;
|
|
828
1040
|
|
|
829
1041
|
// Event-driven OIDC settle: bounded attempts and no blind multi-second sleeps.
|
|
830
1042
|
for (let attempt = 0; attempt < CODEBUDDY_CN_OIDC_MAX_ATTEMPTS; attempt += 1) {
|
|
@@ -861,8 +1073,36 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
|
|
|
861
1073
|
|
|
862
1074
|
accountsProbe = await probeConsoleAccounts();
|
|
863
1075
|
accountList = extractAccountList(accountsProbe);
|
|
864
|
-
|
|
1076
|
+
if (
|
|
1077
|
+
accountsProbe?.status > 0
|
|
1078
|
+
|| accountsProbe?.text
|
|
1079
|
+
|| accountsProbe?.data
|
|
1080
|
+
) {
|
|
1081
|
+
lastMeaningfulProbe = accountsProbe;
|
|
1082
|
+
}
|
|
1083
|
+
lastPayloadSnippet = JSON.stringify(
|
|
1084
|
+
accountsProbe?.data
|
|
1085
|
+
?? accountsProbe?.text
|
|
1086
|
+
?? accountsProbe?.error
|
|
1087
|
+
?? null,
|
|
1088
|
+
).slice(0, 180);
|
|
865
1089
|
const loginHtml = isLoginHtmlProbe(accountsProbe);
|
|
1090
|
+
const probeSnap = await cookieSnapshot();
|
|
1091
|
+
const probeStrong = hasStrongKeycloak(probeSnap.names);
|
|
1092
|
+
if (!probeStrong && hasRestrictedConsoleEvidence(accountsProbe, probeSnap.names)) {
|
|
1093
|
+
restrictedProbeCount += 1;
|
|
1094
|
+
} else {
|
|
1095
|
+
restrictedProbeCount = 0;
|
|
1096
|
+
}
|
|
1097
|
+
|
|
1098
|
+
if (restrictedProbeCount >= 2) {
|
|
1099
|
+
throw Object.assign(
|
|
1100
|
+
new Error(
|
|
1101
|
+
`Tencent restricted the post-OTP session (${restrictedProbeCount} console probes returned login/risk evidence; source=${accountsProbe?.source || "unknown"})`,
|
|
1102
|
+
),
|
|
1103
|
+
{ code: CODEBUDDY_CN_ACCOUNT_RESTRICTED },
|
|
1104
|
+
);
|
|
1105
|
+
}
|
|
866
1106
|
|
|
867
1107
|
if (
|
|
868
1108
|
accountsProbe?.status === 200
|
|
@@ -904,15 +1144,23 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
|
|
|
904
1144
|
this.setAccountStep(
|
|
905
1145
|
account,
|
|
906
1146
|
"resolving_enterprise",
|
|
907
|
-
`Console not ready (HTTP ${accountsProbe?.status || 0}, accounts=${accountList.length}${loginHtml ? ", login HTML" : ""}) — ${attempt + 1}/${CODEBUDDY_CN_OIDC_MAX_ATTEMPTS} body=${lastPayloadSnippet.slice(0, 80)}`,
|
|
1147
|
+
`Console not ready (HTTP ${accountsProbe?.status || 0}, accounts=${accountList.length}${loginHtml ? ", login HTML" : ""}, source=${accountsProbe?.source || "unknown"}) — ${attempt + 1}/${CODEBUDDY_CN_OIDC_MAX_ATTEMPTS} body=${lastPayloadSnippet.slice(0, 80)}`,
|
|
908
1148
|
);
|
|
909
1149
|
await this.persistJobSnapshot(job, { forcePreview: false });
|
|
910
1150
|
}
|
|
911
1151
|
|
|
912
1152
|
if (!sessionReady) {
|
|
913
1153
|
const snap = await cookieSnapshot();
|
|
914
|
-
|
|
915
|
-
|
|
1154
|
+
const diagnosticProbe = lastMeaningfulProbe || accountsProbe;
|
|
1155
|
+
const restricted = hasRestrictedConsoleEvidence(diagnosticProbe, snap.names)
|
|
1156
|
+
|| (snap.names.has("login_risk_state") && restrictedProbeCount > 0);
|
|
1157
|
+
throw Object.assign(
|
|
1158
|
+
new Error(
|
|
1159
|
+
restricted
|
|
1160
|
+
? `Tencent restricted the post-OTP session (HTTP ${diagnosticProbe?.status || 0}; login_risk_state present; source=${diagnosticProbe?.source || "unknown"})`
|
|
1161
|
+
: `Console accounts unavailable after login (HTTP ${diagnosticProbe?.status || 0}; cookies: ${snap.list.slice(0, 18).join(",") || "(none)"}; body=${lastPayloadSnippet.slice(0, 120)}; probeError=${accountsProbe?.error || "none"}) — session not accepted for API key`,
|
|
1162
|
+
),
|
|
1163
|
+
{ code: restricted ? CODEBUDDY_CN_ACCOUNT_RESTRICTED : "CN_CONSOLE_SESSION_UNAVAILABLE" },
|
|
916
1164
|
);
|
|
917
1165
|
}
|
|
918
1166
|
|
|
@@ -1160,7 +1408,20 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
|
|
|
1160
1408
|
// If API key capture fails after registration, the account is registered
|
|
1161
1409
|
// but we don't have a key. Surface as needs_manual so the operator can
|
|
1162
1410
|
// create the key manually in the opened browser — number is NOT re-bought.
|
|
1411
|
+
const restricted = error?.code === CODEBUDDY_CN_ACCOUNT_RESTRICTED;
|
|
1163
1412
|
const outcomeUnknown = error?.code === CODEBUDDY_CN_API_KEY_OUTCOME_UNKNOWN;
|
|
1413
|
+
if (restricted) {
|
|
1414
|
+
this.finalizeAccount(account, "failed_restricted", {
|
|
1415
|
+
error: `${error.message}. Use a different residential CN/HK proxy with concurrency 1.`,
|
|
1416
|
+
step: "failed_restricted",
|
|
1417
|
+
message: "Tencent restricted the post-OTP session; API-key capture was not attempted",
|
|
1418
|
+
});
|
|
1419
|
+
await settleFiveSimOrder(() => fiveSimClient.finishOrder(fiveSimOrderId));
|
|
1420
|
+
account.runtimeSession = null;
|
|
1421
|
+
await closeContextOrBrowser(context, job);
|
|
1422
|
+
await this.persistJobSnapshot(job, { forcePreview: true });
|
|
1423
|
+
return;
|
|
1424
|
+
}
|
|
1164
1425
|
const failureMessage = outcomeUnknown
|
|
1165
1426
|
? `${error.message}. Check the CodeBuddy keys page before creating another key.`
|
|
1166
1427
|
: error.message;
|
|
@@ -1362,6 +1623,62 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
|
|
|
1362
1623
|
job.manualFollowups.add(followupPromise);
|
|
1363
1624
|
}
|
|
1364
1625
|
|
|
1626
|
+
/**
|
|
1627
|
+
* A pasted proxy is intentionally single-worker. Recycle the whole CloakBrowser
|
|
1628
|
+
* process between accounts so its binary fingerprint and GeoIP profile cannot
|
|
1629
|
+
* leak from one registration into the next.
|
|
1630
|
+
*/
|
|
1631
|
+
async runWorker(job, workerId) {
|
|
1632
|
+
if (job.proxyPoolMode !== "manual") {
|
|
1633
|
+
return super.runWorker(job, workerId);
|
|
1634
|
+
}
|
|
1635
|
+
|
|
1636
|
+
while (!job.cancelRequested) {
|
|
1637
|
+
const account = this.dequeueAccount(job, workerId);
|
|
1638
|
+
if (!account) return;
|
|
1639
|
+
|
|
1640
|
+
if (!job.browser) {
|
|
1641
|
+
try {
|
|
1642
|
+
job.browser = await this.browserLauncher({
|
|
1643
|
+
...job,
|
|
1644
|
+
proxyUrls: account.proxyUrl ? [account.proxyUrl] : job.proxyUrls,
|
|
1645
|
+
});
|
|
1646
|
+
} catch (error) {
|
|
1647
|
+
this.finalizeAccount(account, "failed", {
|
|
1648
|
+
error: error?.message || "Manual proxy browser launch failed",
|
|
1649
|
+
step: "failed",
|
|
1650
|
+
message: error?.message || "Manual proxy browser launch failed",
|
|
1651
|
+
});
|
|
1652
|
+
await this.persistJobSnapshot(job, { forcePreview: true });
|
|
1653
|
+
continue;
|
|
1654
|
+
}
|
|
1655
|
+
}
|
|
1656
|
+
|
|
1657
|
+
try {
|
|
1658
|
+
await this.processAccount(job, account, workerId);
|
|
1659
|
+
} catch (error) {
|
|
1660
|
+
if (account.status === "running") {
|
|
1661
|
+
this.finalizeAccount(account, "failed", {
|
|
1662
|
+
error: error?.message || "Unexpected manual proxy worker failure",
|
|
1663
|
+
step: "failed",
|
|
1664
|
+
message: error?.message || "Unexpected manual proxy worker failure",
|
|
1665
|
+
});
|
|
1666
|
+
await this.persistJobSnapshot(job, { forcePreview: true });
|
|
1667
|
+
}
|
|
1668
|
+
} finally {
|
|
1669
|
+
if (job.manualFollowups.size > 0) {
|
|
1670
|
+
await Promise.allSettled([...job.manualFollowups]);
|
|
1671
|
+
}
|
|
1672
|
+
|
|
1673
|
+
if (job.browser) {
|
|
1674
|
+
const browser = job.browser;
|
|
1675
|
+
job.browser = null;
|
|
1676
|
+
await forceCloseBrowser(browser).catch(() => null);
|
|
1677
|
+
}
|
|
1678
|
+
}
|
|
1679
|
+
}
|
|
1680
|
+
}
|
|
1681
|
+
|
|
1365
1682
|
/**
|
|
1366
1683
|
* Override cancelJob to abort in-flight 5sim polls AND force-close the browser.
|
|
1367
1684
|
* Previous CN override only aborted controllers — Chromium kept spinning (VPS hang).
|
|
@@ -1431,7 +1748,7 @@ function buildCnSummary(accounts = []) {
|
|
|
1431
1748
|
if (status === "success") {
|
|
1432
1749
|
summary.success += 1;
|
|
1433
1750
|
summary.completed += 1;
|
|
1434
|
-
} else if (status
|
|
1751
|
+
} else if (status.startsWith("failed")) {
|
|
1435
1752
|
summary.failed += 1;
|
|
1436
1753
|
summary.completed += 1;
|
|
1437
1754
|
} else if (status === "needs_manual") {
|
|
@@ -1468,6 +1785,9 @@ function sanitizeCnJob(job, extras = {}) {
|
|
|
1468
1785
|
phone: account.phone,
|
|
1469
1786
|
fiveSimOrderId: account.fiveSimOrderId,
|
|
1470
1787
|
proxyUrl: account.proxyUrl ? maskProxyUrl(account.proxyUrl) : null,
|
|
1788
|
+
egressIp: account.egressIp || null,
|
|
1789
|
+
proxyTimezone: account.proxyTimezone || null,
|
|
1790
|
+
proxyLocale: account.proxyLocale || null,
|
|
1471
1791
|
status: account.status,
|
|
1472
1792
|
error: account.error,
|
|
1473
1793
|
connectionId: account.connectionId,
|
|
@@ -1522,10 +1842,18 @@ export {
|
|
|
1522
1842
|
|
|
1523
1843
|
export const __test__ = {
|
|
1524
1844
|
clampCnConcurrency,
|
|
1845
|
+
resolveCnJobConcurrency,
|
|
1525
1846
|
sanitizeCnJob,
|
|
1526
1847
|
defaultPhoneFormatter,
|
|
1527
1848
|
defaultSaveCodeBuddyCnConnection,
|
|
1849
|
+
buildCnSummary,
|
|
1850
|
+
hasRestrictedConsoleEvidence,
|
|
1528
1851
|
isLoginHtmlProbe,
|
|
1852
|
+
parseEgressIp,
|
|
1853
|
+
parseConsoleProbeBody,
|
|
1854
|
+
probeCodeBuddyProxyEgress,
|
|
1855
|
+
probeCodeBuddyConsoleAccounts,
|
|
1856
|
+
requireStableProxyEgress,
|
|
1529
1857
|
withTimeoutCleanup,
|
|
1530
1858
|
AUTOMATION_LIMITS: {
|
|
1531
1859
|
registrationHardTimeoutMs: CODEBUDDY_CN_ACCOUNT_HARD_TIMEOUT_MS,
|
|
@@ -1540,5 +1868,6 @@ export const __test__ = {
|
|
|
1540
1868
|
lowMemoryManualTimeoutMs: CODEBUDDY_CN_LOW_MEM_MANUAL_TIMEOUT_MS,
|
|
1541
1869
|
resourceCloseTimeoutMs: CODEBUDDY_CN_RESOURCE_CLOSE_TIMEOUT_MS,
|
|
1542
1870
|
fiveSimSettleTimeoutMs: CODEBUDDY_CN_FIVESIM_SETTLE_TIMEOUT_MS,
|
|
1871
|
+
egressProbeTimeoutMs: CODEBUDDY_CN_EGRESS_PROBE_TIMEOUT_MS,
|
|
1543
1872
|
},
|
|
1544
1873
|
};
|