zevairouter 1.0.149 → 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 +7 -0
- package/cli/app/.next-cli-build/BUILD_ID +1 -1
- package/cli/app/.next-cli-build/app-path-routes-manifest.json +10 -10
- 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 +10 -10
- 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-104e711e028e5a60.js → 620-4698719a19477138.js} +1 -1
- package/cli/app/CHANGELOG.md +7 -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 +211 -7
- package/src/lib/oauth/services/kiroBulkImportManager.js +12 -9
- /package/cli/app/.next-cli-build/static/{w0fFe0wlenV7JedZI_N94 → STIs6ehtw793h3BxKhNWo}/_buildManifest.js +0 -0
- /package/cli/app/.next-cli-build/static/{w0fFe0wlenV7JedZI_N94 → STIs6ehtw793h3BxKhNWo}/_ssgManifest.js +0 -0
package/cli/app/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
# v1.0.150 (2026-07-27)
|
|
2
|
+
|
|
3
|
+
## Fixes
|
|
4
|
+
- **Coherent pasted-proxy browser identity**: CodeBuddy CN manual-proxy jobs now preserve CloakBrowser's binary-level exit IP, WebRTC, timezone, locale, and native viewport instead of overwriting them from the SMS number region.
|
|
5
|
+
- **Safe sticky-egress preflight**: manual proxies are verified against multiple exit-IP services at launch and immediately before the 5sim purchase, so unverifiable, rotating, or changed exits fail before a phone number is ordered.
|
|
6
|
+
- **Isolated manual registrations**: pasted-proxy jobs enforce one worker and recycle the complete CloakBrowser process between accounts, including cleanup after unexpected worker failures, without changing Proxy Pool selection or data.
|
|
7
|
+
|
|
1
8
|
# v1.0.149 (2026-07-27)
|
|
2
9
|
|
|
3
10
|
## Fixes
|
package/cli/app/package.json
CHANGED
package/cli/package.json
CHANGED
package/package.json
CHANGED
|
@@ -12,6 +12,7 @@ const requireFromHere = createRequire(import.meta.url);
|
|
|
12
12
|
export const DEFAULT_BULK_IMPORT_ENGINE = "cloakbrowser";
|
|
13
13
|
|
|
14
14
|
const SUPPORTED_ENGINES = new Set(["cloakbrowser"]);
|
|
15
|
+
const CLOAK_PROXY_PROFILES = new WeakMap();
|
|
15
16
|
|
|
16
17
|
export function normalizeBulkImportEngine(value) {
|
|
17
18
|
if (typeof value !== "string" || !value.trim()) return DEFAULT_BULK_IMPORT_ENGINE;
|
|
@@ -212,7 +213,31 @@ export async function newStealthContext(browser, options = {}) {
|
|
|
212
213
|
* Prefer headed (headless=false); Turnstile / Google bot checks often fail headless.
|
|
213
214
|
* Auto-installs into ~/.zevai/runtime via cloakbrowserRuntime.
|
|
214
215
|
*/
|
|
215
|
-
|
|
216
|
+
export function extractCloakProxyProfile(args = []) {
|
|
217
|
+
const readFlag = (name) => {
|
|
218
|
+
const prefix = `${name}=`;
|
|
219
|
+
const value = (args || []).find((arg) => String(arg).startsWith(prefix));
|
|
220
|
+
return value ? String(value).slice(prefix.length) : null;
|
|
221
|
+
};
|
|
222
|
+
return {
|
|
223
|
+
egressIp: readFlag("--fingerprint-webrtc-ip"),
|
|
224
|
+
timezone: readFlag("--fingerprint-timezone"),
|
|
225
|
+
locale: readFlag("--fingerprint-locale") || readFlag("--lang"),
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
export function getCloakProxyProfile(browser) {
|
|
230
|
+
return browser && typeof browser === "object"
|
|
231
|
+
? CLOAK_PROXY_PROFILES.get(browser) || null
|
|
232
|
+
: null;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
async function launchCloakbrowser({
|
|
236
|
+
proxyUrl,
|
|
237
|
+
headless = false,
|
|
238
|
+
windowSize = null,
|
|
239
|
+
requireProxyGeoip = false,
|
|
240
|
+
} = {}) {
|
|
216
241
|
const { ensureDisplayForHeadedBrowser } = await import("./displayEnv.js");
|
|
217
242
|
|
|
218
243
|
const runtime = loadRuntimeHelper("cloakbrowserRuntime");
|
|
@@ -259,18 +284,65 @@ async function launchCloakbrowser({ proxyUrl, headless = false, windowSize = nul
|
|
|
259
284
|
launchOpts.geoip = true;
|
|
260
285
|
}
|
|
261
286
|
if (windowSize?.width && windowSize?.height) {
|
|
262
|
-
|
|
287
|
+
// Keep headed contexts at viewport:null so dimensions follow the real Xvfb
|
|
288
|
+
// window. A Playwright viewport here overrides CloakBrowser's coherent window.
|
|
289
|
+
launchOpts.args = [`--window-size=${windowSize.width},${windowSize.height}`];
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
let effectiveLaunchOpts = launchOpts;
|
|
293
|
+
let proxyProfile = null;
|
|
294
|
+
if (proxyUrl && requireProxyGeoip) {
|
|
295
|
+
if (typeof cloak.buildLaunchOptions !== "function") {
|
|
296
|
+
const error = new Error("CloakBrowser runtime cannot verify proxy GeoIP before launch");
|
|
297
|
+
error.code = "CLOAKBROWSER_PROXY_GEOIP_UNSUPPORTED";
|
|
298
|
+
throw error;
|
|
299
|
+
}
|
|
300
|
+
// Slow residential CONNECT handshakes regularly exceed CloakBrowser's 5s
|
|
301
|
+
// default. Resolve once with a bounded 12s budget, then reuse those flags.
|
|
302
|
+
const previousGeoipTimeout = process.env.CLOAKBROWSER_GEOIP_TIMEOUT_SECONDS;
|
|
303
|
+
if (!previousGeoipTimeout) process.env.CLOAKBROWSER_GEOIP_TIMEOUT_SECONDS = "12";
|
|
304
|
+
let resolved;
|
|
305
|
+
try {
|
|
306
|
+
resolved = await cloak.buildLaunchOptions(launchOpts);
|
|
307
|
+
} finally {
|
|
308
|
+
if (previousGeoipTimeout === undefined) {
|
|
309
|
+
delete process.env.CLOAKBROWSER_GEOIP_TIMEOUT_SECONDS;
|
|
310
|
+
} else {
|
|
311
|
+
process.env.CLOAKBROWSER_GEOIP_TIMEOUT_SECONDS = previousGeoipTimeout;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
proxyProfile = extractCloakProxyProfile(resolved?.args || []);
|
|
315
|
+
if (!proxyProfile.egressIp || !proxyProfile.timezone || !proxyProfile.locale) {
|
|
316
|
+
const error = new Error(
|
|
317
|
+
"Manual proxy exit GeoIP could not be verified; no phone number was purchased",
|
|
318
|
+
);
|
|
319
|
+
error.code = "CLOAKBROWSER_PROXY_GEOIP_UNAVAILABLE";
|
|
320
|
+
throw error;
|
|
321
|
+
}
|
|
322
|
+
effectiveLaunchOpts = {
|
|
323
|
+
...launchOpts,
|
|
324
|
+
args: resolved.args || launchOpts.args,
|
|
325
|
+
geoip: false,
|
|
326
|
+
};
|
|
263
327
|
}
|
|
264
328
|
|
|
265
329
|
try {
|
|
266
330
|
// Do not wrap with stock stealth scripts — CloakBrowser patches at binary level.
|
|
267
|
-
|
|
331
|
+
const browser = await cloak.launch(effectiveLaunchOpts);
|
|
332
|
+
if (proxyProfile) {
|
|
333
|
+
CLOAK_PROXY_PROFILES.set(browser, Object.freeze({ ...proxyProfile }));
|
|
334
|
+
}
|
|
335
|
+
return browser;
|
|
268
336
|
} catch (error) {
|
|
269
337
|
const msg = String(error?.message || error || "");
|
|
270
338
|
if (!useHeadless && /XServer|DISPLAY|Missing X server|headed browser|no DISPLAY/i.test(msg)) {
|
|
271
339
|
const display = ensureDisplayForHeadedBrowser();
|
|
272
340
|
if (display.ok) {
|
|
273
|
-
|
|
341
|
+
const browser = await cloak.launch(effectiveLaunchOpts);
|
|
342
|
+
if (proxyProfile) {
|
|
343
|
+
CLOAK_PROXY_PROFILES.set(browser, Object.freeze({ ...proxyProfile }));
|
|
344
|
+
}
|
|
345
|
+
return browser;
|
|
274
346
|
}
|
|
275
347
|
const friendly = new Error(
|
|
276
348
|
`${msg}\n\nVPS has no display. Install a virtual screen then retry:\n` +
|
|
@@ -299,6 +371,7 @@ export async function launchBulkImportBrowser({
|
|
|
299
371
|
proxyUrl,
|
|
300
372
|
headless = false,
|
|
301
373
|
windowSize = null,
|
|
374
|
+
requireProxyGeoip = false,
|
|
302
375
|
} = {}) {
|
|
303
376
|
// engine arg kept for API compatibility; always cloakbrowser.
|
|
304
377
|
void normalizeBulkImportEngine(engine);
|
|
@@ -306,6 +379,7 @@ export async function launchBulkImportBrowser({
|
|
|
306
379
|
proxyUrl,
|
|
307
380
|
headless: headless === true,
|
|
308
381
|
windowSize,
|
|
382
|
+
requireProxyGeoip,
|
|
309
383
|
});
|
|
310
384
|
}
|
|
311
385
|
|
|
@@ -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,8 +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";
|
|
86
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
|
+
];
|
|
87
97
|
|
|
88
98
|
// Supported 5sim regions
|
|
89
99
|
const SUPPORTED_REGIONS = new Set(["hongkong", "china", "any"]);
|
|
@@ -127,6 +137,96 @@ function clampCnConcurrency(value) {
|
|
|
127
137
|
return Math.min(hardMax, Math.max(CODEBUDDY_CN_MIN_CONCURRENCY, parsed));
|
|
128
138
|
}
|
|
129
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
|
+
|
|
130
230
|
async function withTimeoutCleanup(
|
|
131
231
|
task,
|
|
132
232
|
{
|
|
@@ -388,6 +488,7 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
|
|
|
388
488
|
proxyUrl,
|
|
389
489
|
headless,
|
|
390
490
|
windowSize: { width: 1280, height: 900 },
|
|
491
|
+
requireProxyGeoip: job?.proxyPoolMode === "manual" && Boolean(proxyUrl),
|
|
391
492
|
});
|
|
392
493
|
return withTimeoutCleanup(launchTask, {
|
|
393
494
|
timeoutMs: CODEBUDDY_CN_BROWSER_LAUNCH_TIMEOUT_MS,
|
|
@@ -472,7 +573,7 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
|
|
|
472
573
|
const job = {
|
|
473
574
|
jobId,
|
|
474
575
|
status: "running",
|
|
475
|
-
concurrency:
|
|
576
|
+
concurrency: resolveCnJobConcurrency(concurrency, { manualProxy: Boolean(manualProxy) }),
|
|
476
577
|
proxyPoolMode: manualProxy ? "manual" : (proxyPoolMode || "none"),
|
|
477
578
|
proxyUrls,
|
|
478
579
|
region: resolvedRegion,
|
|
@@ -496,6 +597,9 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
|
|
|
496
597
|
// Unique Chromium fingerprint seed per account (viewport/HW/screen noise).
|
|
497
598
|
fingerprintSeed: randomUUID(),
|
|
498
599
|
proxyUrl: null,
|
|
600
|
+
egressIp: null,
|
|
601
|
+
proxyTimezone: null,
|
|
602
|
+
proxyLocale: null,
|
|
499
603
|
abortController: new AbortController(),
|
|
500
604
|
status: "queued",
|
|
501
605
|
error: null,
|
|
@@ -544,6 +648,7 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
|
|
|
544
648
|
let fiveSimOrderId = null;
|
|
545
649
|
let smsReceived = false;
|
|
546
650
|
let context = null;
|
|
651
|
+
let verifiedEgressIp = null;
|
|
547
652
|
|
|
548
653
|
try {
|
|
549
654
|
// Step 1: Get 5sim API key from settings
|
|
@@ -569,16 +674,14 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
|
|
|
569
674
|
// Step 2: Create browser context FIRST — if proxy/browser fails, we never buy a number.
|
|
570
675
|
this.setAccountStep(account, "creating_browser", "Creating browser context (before 5sim order)");
|
|
571
676
|
await this.persistJobSnapshot(job, { forcePreview: true });
|
|
572
|
-
// CloakBrowser
|
|
573
|
-
//
|
|
574
|
-
// cause of 账号访问受限 right after OTP). Per-account fingerprint seed —
|
|
575
|
-
// sticky residential IP alone still clusters if every session shares HW.
|
|
576
|
-
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.
|
|
577
679
|
const contextTask = createFreshContext(job.browser, account.proxyUrl, {
|
|
578
680
|
profile: "codebuddy-cn",
|
|
579
681
|
region: job.region || "hongkong",
|
|
580
682
|
fingerprintSeed: account.fingerprintSeed,
|
|
581
683
|
lowMemory: isLowMemHost(),
|
|
684
|
+
nativeCloakProfile: job.proxyPoolMode === "manual",
|
|
582
685
|
});
|
|
583
686
|
const freshContext = await withTimeoutCleanup(contextTask, {
|
|
584
687
|
timeoutMs: CODEBUDDY_CN_CONTEXT_TIMEOUT_MS,
|
|
@@ -590,6 +693,27 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
|
|
|
590
693
|
const page = freshContext.page;
|
|
591
694
|
account.runtimeSession = { context, page };
|
|
592
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
|
+
|
|
593
717
|
if (job.cancelRequested) {
|
|
594
718
|
throw new Error("Job cancelled before ordering phone number");
|
|
595
719
|
}
|
|
@@ -636,6 +760,22 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
|
|
|
636
760
|
if (job.cancelRequested) {
|
|
637
761
|
throw new Error("Job cancelled before ordering phone number");
|
|
638
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
|
+
}
|
|
639
779
|
this.setAccountStep(
|
|
640
780
|
account,
|
|
641
781
|
"ordering_number",
|
|
@@ -1483,6 +1623,62 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
|
|
|
1483
1623
|
job.manualFollowups.add(followupPromise);
|
|
1484
1624
|
}
|
|
1485
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
|
+
|
|
1486
1682
|
/**
|
|
1487
1683
|
* Override cancelJob to abort in-flight 5sim polls AND force-close the browser.
|
|
1488
1684
|
* Previous CN override only aborted controllers — Chromium kept spinning (VPS hang).
|
|
@@ -1589,6 +1785,9 @@ function sanitizeCnJob(job, extras = {}) {
|
|
|
1589
1785
|
phone: account.phone,
|
|
1590
1786
|
fiveSimOrderId: account.fiveSimOrderId,
|
|
1591
1787
|
proxyUrl: account.proxyUrl ? maskProxyUrl(account.proxyUrl) : null,
|
|
1788
|
+
egressIp: account.egressIp || null,
|
|
1789
|
+
proxyTimezone: account.proxyTimezone || null,
|
|
1790
|
+
proxyLocale: account.proxyLocale || null,
|
|
1592
1791
|
status: account.status,
|
|
1593
1792
|
error: account.error,
|
|
1594
1793
|
connectionId: account.connectionId,
|
|
@@ -1643,14 +1842,18 @@ export {
|
|
|
1643
1842
|
|
|
1644
1843
|
export const __test__ = {
|
|
1645
1844
|
clampCnConcurrency,
|
|
1845
|
+
resolveCnJobConcurrency,
|
|
1646
1846
|
sanitizeCnJob,
|
|
1647
1847
|
defaultPhoneFormatter,
|
|
1648
1848
|
defaultSaveCodeBuddyCnConnection,
|
|
1649
1849
|
buildCnSummary,
|
|
1650
1850
|
hasRestrictedConsoleEvidence,
|
|
1651
1851
|
isLoginHtmlProbe,
|
|
1852
|
+
parseEgressIp,
|
|
1652
1853
|
parseConsoleProbeBody,
|
|
1854
|
+
probeCodeBuddyProxyEgress,
|
|
1653
1855
|
probeCodeBuddyConsoleAccounts,
|
|
1856
|
+
requireStableProxyEgress,
|
|
1654
1857
|
withTimeoutCleanup,
|
|
1655
1858
|
AUTOMATION_LIMITS: {
|
|
1656
1859
|
registrationHardTimeoutMs: CODEBUDDY_CN_ACCOUNT_HARD_TIMEOUT_MS,
|
|
@@ -1665,5 +1868,6 @@ export const __test__ = {
|
|
|
1665
1868
|
lowMemoryManualTimeoutMs: CODEBUDDY_CN_LOW_MEM_MANUAL_TIMEOUT_MS,
|
|
1666
1869
|
resourceCloseTimeoutMs: CODEBUDDY_CN_RESOURCE_CLOSE_TIMEOUT_MS,
|
|
1667
1870
|
fiveSimSettleTimeoutMs: CODEBUDDY_CN_FIVESIM_SETTLE_TIMEOUT_MS,
|
|
1871
|
+
egressProbeTimeoutMs: CODEBUDDY_CN_EGRESS_PROBE_TIMEOUT_MS,
|
|
1668
1872
|
},
|
|
1669
1873
|
};
|
|
@@ -384,10 +384,13 @@ export { parsePlaywrightProxy };
|
|
|
384
384
|
* @param {"hongkong"|"china"|string} [opts.region] Used by codebuddy-cn profile
|
|
385
385
|
* @param {string|number} [opts.fingerprintSeed] Per-account seed for viewport/HW fingerprint
|
|
386
386
|
* @param {boolean} [opts.randomizeFingerprint] Force fingerprint even outside codebuddy-cn
|
|
387
|
+
* @param {boolean} [opts.nativeCloakProfile] Keep CloakBrowser's binary profile untouched
|
|
387
388
|
*/
|
|
388
389
|
export async function createFreshContext(browser, proxy, opts = {}) {
|
|
389
390
|
let effectiveProxy = proxy;
|
|
390
391
|
let socksBridge = null;
|
|
392
|
+
const useNativeCloakProfile =
|
|
393
|
+
opts.profile === "codebuddy-cn" && opts.nativeCloakProfile === true;
|
|
391
394
|
|
|
392
395
|
// Chromium cannot authenticate SOCKS5 — bridge to local HTTP proxy first
|
|
393
396
|
if (proxy) {
|
|
@@ -406,9 +409,8 @@ export async function createFreshContext(browser, proxy, opts = {}) {
|
|
|
406
409
|
// Per-account fingerprint (viewport + navigator.* + screen) via init script.
|
|
407
410
|
// Sticky residential IP alone still clusters if every session shares the same HW profile.
|
|
408
411
|
const wantFingerprint =
|
|
409
|
-
|
|
410
|
-
opts.randomizeFingerprint === true ||
|
|
411
|
-
opts.fingerprintSeed != null;
|
|
412
|
+
!useNativeCloakProfile
|
|
413
|
+
&& (opts.randomizeFingerprint === true || opts.fingerprintSeed != null);
|
|
412
414
|
let fingerprint = null;
|
|
413
415
|
if (wantFingerprint) {
|
|
414
416
|
try {
|
|
@@ -434,22 +436,20 @@ export async function createFreshContext(browser, proxy, opts = {}) {
|
|
|
434
436
|
fingerprint = null;
|
|
435
437
|
}
|
|
436
438
|
}
|
|
437
|
-
if (!contextOptions.viewport) {
|
|
439
|
+
if (!contextOptions.viewport && !useNativeCloakProfile) {
|
|
438
440
|
contextOptions.viewport = { width: 1280, height: 900 };
|
|
439
441
|
}
|
|
440
442
|
// Ignore HTTPS errors common through residential proxies / MITM chains
|
|
441
443
|
contextOptions.ignoreHTTPSErrors = true;
|
|
442
444
|
|
|
443
|
-
|
|
444
|
-
if (opts.profile === "codebuddy-cn") {
|
|
445
|
+
if (opts.profile === "codebuddy-cn" && !useNativeCloakProfile) {
|
|
445
446
|
const isChinaMainland = String(opts.region || "").toLowerCase() === "china";
|
|
446
447
|
contextOptions.locale = "zh-CN";
|
|
447
448
|
contextOptions.languages = ["zh-CN", "zh", "en-US", "en"];
|
|
448
449
|
contextOptions.timezoneId = isChinaMainland ? "Asia/Shanghai" : "Asia/Hong_Kong";
|
|
449
|
-
// Approximate city coords matching default 5sim regions (HK vs mainland)
|
|
450
450
|
contextOptions.geolocation = isChinaMainland
|
|
451
|
-
? { longitude: 121.4737, latitude: 31.2304 }
|
|
452
|
-
: { longitude: 114.1694, latitude: 22.3193 };
|
|
451
|
+
? { longitude: 121.4737, latitude: 31.2304 }
|
|
452
|
+
: { longitude: 114.1694, latitude: 22.3193 };
|
|
453
453
|
contextOptions.permissions = ["geolocation"];
|
|
454
454
|
contextOptions.extraHTTPHeaders = {
|
|
455
455
|
...(contextOptions.extraHTTPHeaders || {}),
|
|
@@ -457,6 +457,9 @@ export async function createFreshContext(browser, proxy, opts = {}) {
|
|
|
457
457
|
};
|
|
458
458
|
}
|
|
459
459
|
|
|
460
|
+
// A pasted proxy inherits CloakBrowser's binary-level locale/timezone/WebRTC
|
|
461
|
+
// profile. Phone country and residential proxy country may legitimately differ.
|
|
462
|
+
|
|
460
463
|
// Allow callers to override any field
|
|
461
464
|
if (opts.locale) contextOptions.locale = opts.locale;
|
|
462
465
|
if (opts.timezoneId) contextOptions.timezoneId = opts.timezoneId;
|
|
File without changes
|
|
File without changes
|