zevairouter 1.0.148 → 1.0.149
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 +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/4746.js +1 -1
- package/cli/app/.next-cli-build/server/chunks/5307.js +1 -1
- 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-104e711e028e5a60.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/codebuddyCnBulkImportManager.js +184 -59
- package/src/lib/oauth/services/codebuddyCnPhoneAutomation.js +81 -45
- /package/cli/app/.next-cli-build/static/{kmlfntQuBCJ_ni8__OiKd → w0fFe0wlenV7JedZI_N94}/_buildManifest.js +0 -0
- /package/cli/app/.next-cli-build/static/{kmlfntQuBCJ_ni8__OiKd → w0fFe0wlenV7JedZI_N94}/_ssgManifest.js +0 -0
package/cli/app/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
# v1.0.149 (2026-07-27)
|
|
2
|
+
|
|
3
|
+
## Fixes
|
|
4
|
+
- **Accurate CodeBuddy CN restriction detection**: post-OTP sessions that retain Tencent's `login_risk_state` and repeatedly resolve to Keycloak login are now reported as `failed_restricted` instead of a generic API-key capture failure.
|
|
5
|
+
- **CORS-independent console probing**: account-session checks prefer the browser context request API, preserving cookies, redirect URLs, response status, and login HTML even when in-page fetch is blocked or collapses to HTTP 0.
|
|
6
|
+
- **Safe restricted-account termination**: confirmed restrictions stop OTP resubmission and skip API-key/manual fallback, while summaries count the terminal result correctly and browser resources close immediately.
|
|
7
|
+
|
|
1
8
|
# v1.0.148 (2026-07-27)
|
|
2
9
|
|
|
3
10
|
## Fixes
|
package/cli/app/package.json
CHANGED
package/cli/package.json
CHANGED
package/package.json
CHANGED
|
@@ -83,6 +83,7 @@ const CODEBUDDY_CN_LOW_MEM_MANUAL_TIMEOUT_MS = 3 * 60_000;
|
|
|
83
83
|
const CODEBUDDY_CN_RESOURCE_CLOSE_TIMEOUT_MS = 5_000;
|
|
84
84
|
const CODEBUDDY_CN_FIVESIM_SETTLE_TIMEOUT_MS = 12_000;
|
|
85
85
|
const CODEBUDDY_CN_API_KEY_OUTCOME_UNKNOWN = "CN_API_KEY_OUTCOME_UNKNOWN";
|
|
86
|
+
const CODEBUDDY_CN_ACCOUNT_RESTRICTED = "CN_ACCOUNT_RESTRICTED";
|
|
86
87
|
|
|
87
88
|
// Supported 5sim regions
|
|
88
89
|
const SUPPORTED_REGIONS = new Set(["hongkong", "china", "any"]);
|
|
@@ -163,9 +164,125 @@ async function withTimeoutCleanup(
|
|
|
163
164
|
}
|
|
164
165
|
|
|
165
166
|
function isLoginHtmlProbe(probe) {
|
|
167
|
+
const raw = `${probe?.text || ""} ${probe?.data?._raw || ""} ${probe?.url || ""}`;
|
|
168
|
+
return /<!doctype html|<html|login-pf|\/auth\/realms\//i.test(raw);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
function parseConsoleProbeBody(status, text, extras = {}) {
|
|
172
|
+
const rawText = String(text || "");
|
|
173
|
+
let data = null;
|
|
174
|
+
try {
|
|
175
|
+
data = rawText ? JSON.parse(rawText) : null;
|
|
176
|
+
} catch {
|
|
177
|
+
data = { _raw: rawText.slice(0, 240), _notJson: true };
|
|
178
|
+
}
|
|
179
|
+
return {
|
|
180
|
+
status: Number(status) || 0,
|
|
181
|
+
data,
|
|
182
|
+
text: rawText.slice(0, 240),
|
|
183
|
+
...extras,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function hasRestrictedConsoleEvidence(probe, cookieNames = []) {
|
|
188
|
+
const names = cookieNames instanceof Set ? cookieNames : new Set(cookieNames);
|
|
166
189
|
const raw = `${probe?.text || ""} ${probe?.data?._raw || ""}`;
|
|
167
|
-
|
|
168
|
-
|
|
190
|
+
if (/账号访问受限|安全策略限制|访问受限|account restricted|access restricted/i.test(raw)) {
|
|
191
|
+
return true;
|
|
192
|
+
}
|
|
193
|
+
if (!names.has("login_risk_state")) return false;
|
|
194
|
+
return isLoginHtmlProbe(probe)
|
|
195
|
+
|| probe?.status === 0
|
|
196
|
+
|| probe?.status === 401
|
|
197
|
+
|| probe?.status === 403;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
async function probeCodeBuddyConsoleAccounts({
|
|
201
|
+
context,
|
|
202
|
+
page,
|
|
203
|
+
timeoutMs = CODEBUDDY_CN_CONSOLE_PROBE_TIMEOUT_MS,
|
|
204
|
+
}) {
|
|
205
|
+
const headers = {
|
|
206
|
+
Accept: "application/json, text/plain, */*",
|
|
207
|
+
"x-requested-with": "XMLHttpRequest",
|
|
208
|
+
"X-Domain": "www.codebuddy.cn",
|
|
209
|
+
"X-Product": "SaaS",
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
// The context request shares browser cookies but bypasses page-origin CORS.
|
|
213
|
+
let requestContext = null;
|
|
214
|
+
try {
|
|
215
|
+
requestContext = context?.request || null;
|
|
216
|
+
} catch {
|
|
217
|
+
requestContext = null;
|
|
218
|
+
}
|
|
219
|
+
if (requestContext && typeof requestContext.get === "function") {
|
|
220
|
+
try {
|
|
221
|
+
const response = await requestContext.get(
|
|
222
|
+
"https://www.codebuddy.cn/console/accounts",
|
|
223
|
+
{ headers, timeout: timeoutMs, failOnStatusCode: false },
|
|
224
|
+
);
|
|
225
|
+
const text = await response.text().catch(() => "");
|
|
226
|
+
return parseConsoleProbeBody(response.status(), text, {
|
|
227
|
+
source: "context-request",
|
|
228
|
+
url: response.url(),
|
|
229
|
+
contentType: response.headers()?.["content-type"] || "",
|
|
230
|
+
});
|
|
231
|
+
} catch {
|
|
232
|
+
// Compatibility fallback for older CloakBrowser request contexts.
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
const probeTask = page.evaluate(async ({ requestTimeoutMs, requestHeaders }) => {
|
|
237
|
+
const controller = new AbortController();
|
|
238
|
+
const timer = setTimeout(() => controller.abort(), requestTimeoutMs);
|
|
239
|
+
try {
|
|
240
|
+
const host = window.location.hostname || "www.codebuddy.cn";
|
|
241
|
+
const base = host === "www.codebuddy.cn"
|
|
242
|
+
? `${window.location.origin}`
|
|
243
|
+
: "https://www.codebuddy.cn";
|
|
244
|
+
const response = await fetch(`${base}/console/accounts`, {
|
|
245
|
+
credentials: "include",
|
|
246
|
+
signal: controller.signal,
|
|
247
|
+
headers: requestHeaders,
|
|
248
|
+
});
|
|
249
|
+
const text = await response.text().catch(() => "");
|
|
250
|
+
let data = null;
|
|
251
|
+
try {
|
|
252
|
+
data = text ? JSON.parse(text) : null;
|
|
253
|
+
} catch {
|
|
254
|
+
data = { _raw: String(text || "").slice(0, 240), _notJson: true };
|
|
255
|
+
}
|
|
256
|
+
return {
|
|
257
|
+
status: response.status,
|
|
258
|
+
data,
|
|
259
|
+
text: String(text || "").slice(0, 240),
|
|
260
|
+
source: "page-fetch",
|
|
261
|
+
url: response.url,
|
|
262
|
+
contentType: response.headers.get("content-type") || "",
|
|
263
|
+
};
|
|
264
|
+
} catch (error) {
|
|
265
|
+
return {
|
|
266
|
+
status: 0,
|
|
267
|
+
timedOut: error?.name === "AbortError",
|
|
268
|
+
error: error?.message || String(error),
|
|
269
|
+
source: "page-fetch",
|
|
270
|
+
};
|
|
271
|
+
} finally {
|
|
272
|
+
clearTimeout(timer);
|
|
273
|
+
}
|
|
274
|
+
}, { requestTimeoutMs: timeoutMs, requestHeaders: headers });
|
|
275
|
+
|
|
276
|
+
return withTimeoutCleanup(probeTask, {
|
|
277
|
+
timeoutMs,
|
|
278
|
+
message: `Console account probe timed out after ${timeoutMs / 1000}s`,
|
|
279
|
+
code: "CN_CONSOLE_PROBE_TIMEOUT",
|
|
280
|
+
}).catch((error) => ({
|
|
281
|
+
status: 0,
|
|
282
|
+
timedOut: error?.code === "CN_CONSOLE_PROBE_TIMEOUT",
|
|
283
|
+
error: error?.message || String(error),
|
|
284
|
+
source: "page-fetch",
|
|
285
|
+
}));
|
|
169
286
|
}
|
|
170
287
|
|
|
171
288
|
async function closeResourceBounded(resource) {
|
|
@@ -576,12 +693,13 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
|
|
|
576
693
|
// If automation failed early (e.g. page.goto timeout), the session won't be logged in
|
|
577
694
|
// and API key creation will 401 — so don't waste time. Only try bypass if automation
|
|
578
695
|
// reported "success" or "needs_manual" (meaning submit happened).
|
|
579
|
-
if (automationResult.status
|
|
696
|
+
if (String(automationResult.status || "").startsWith("failed")) {
|
|
580
697
|
// Automation failed before submit — no point trying API key
|
|
581
698
|
const errorMsg = automationResult.error || "Phone registration failed before submit";
|
|
582
|
-
|
|
699
|
+
const failureStatus = automationResult.status || "failed";
|
|
700
|
+
this.finalizeAccount(account, failureStatus, {
|
|
583
701
|
error: errorMsg,
|
|
584
|
-
step:
|
|
702
|
+
step: failureStatus,
|
|
585
703
|
message: errorMsg,
|
|
586
704
|
});
|
|
587
705
|
// Only touch 5sim if we actually bought a number (order is deferred until form ready)
|
|
@@ -702,55 +820,7 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
|
|
|
702
820
|
|| names.has("qcmainCSRFToken")
|
|
703
821
|
|| names.has("x_host_key_access");
|
|
704
822
|
|
|
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
|
-
};
|
|
823
|
+
const probeConsoleAccounts = () => probeCodeBuddyConsoleAccounts({ context, page });
|
|
754
824
|
|
|
755
825
|
const extractAccountList = (probe) => {
|
|
756
826
|
const d = probe?.data;
|
|
@@ -825,6 +895,8 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
|
|
|
825
895
|
let accountsProbe = null;
|
|
826
896
|
let sessionReady = false;
|
|
827
897
|
let lastPayloadSnippet = "";
|
|
898
|
+
let lastMeaningfulProbe = null;
|
|
899
|
+
let restrictedProbeCount = 0;
|
|
828
900
|
|
|
829
901
|
// Event-driven OIDC settle: bounded attempts and no blind multi-second sleeps.
|
|
830
902
|
for (let attempt = 0; attempt < CODEBUDDY_CN_OIDC_MAX_ATTEMPTS; attempt += 1) {
|
|
@@ -861,8 +933,36 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
|
|
|
861
933
|
|
|
862
934
|
accountsProbe = await probeConsoleAccounts();
|
|
863
935
|
accountList = extractAccountList(accountsProbe);
|
|
864
|
-
|
|
936
|
+
if (
|
|
937
|
+
accountsProbe?.status > 0
|
|
938
|
+
|| accountsProbe?.text
|
|
939
|
+
|| accountsProbe?.data
|
|
940
|
+
) {
|
|
941
|
+
lastMeaningfulProbe = accountsProbe;
|
|
942
|
+
}
|
|
943
|
+
lastPayloadSnippet = JSON.stringify(
|
|
944
|
+
accountsProbe?.data
|
|
945
|
+
?? accountsProbe?.text
|
|
946
|
+
?? accountsProbe?.error
|
|
947
|
+
?? null,
|
|
948
|
+
).slice(0, 180);
|
|
865
949
|
const loginHtml = isLoginHtmlProbe(accountsProbe);
|
|
950
|
+
const probeSnap = await cookieSnapshot();
|
|
951
|
+
const probeStrong = hasStrongKeycloak(probeSnap.names);
|
|
952
|
+
if (!probeStrong && hasRestrictedConsoleEvidence(accountsProbe, probeSnap.names)) {
|
|
953
|
+
restrictedProbeCount += 1;
|
|
954
|
+
} else {
|
|
955
|
+
restrictedProbeCount = 0;
|
|
956
|
+
}
|
|
957
|
+
|
|
958
|
+
if (restrictedProbeCount >= 2) {
|
|
959
|
+
throw Object.assign(
|
|
960
|
+
new Error(
|
|
961
|
+
`Tencent restricted the post-OTP session (${restrictedProbeCount} console probes returned login/risk evidence; source=${accountsProbe?.source || "unknown"})`,
|
|
962
|
+
),
|
|
963
|
+
{ code: CODEBUDDY_CN_ACCOUNT_RESTRICTED },
|
|
964
|
+
);
|
|
965
|
+
}
|
|
866
966
|
|
|
867
967
|
if (
|
|
868
968
|
accountsProbe?.status === 200
|
|
@@ -904,15 +1004,23 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
|
|
|
904
1004
|
this.setAccountStep(
|
|
905
1005
|
account,
|
|
906
1006
|
"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)}`,
|
|
1007
|
+
`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
1008
|
);
|
|
909
1009
|
await this.persistJobSnapshot(job, { forcePreview: false });
|
|
910
1010
|
}
|
|
911
1011
|
|
|
912
1012
|
if (!sessionReady) {
|
|
913
1013
|
const snap = await cookieSnapshot();
|
|
914
|
-
|
|
915
|
-
|
|
1014
|
+
const diagnosticProbe = lastMeaningfulProbe || accountsProbe;
|
|
1015
|
+
const restricted = hasRestrictedConsoleEvidence(diagnosticProbe, snap.names)
|
|
1016
|
+
|| (snap.names.has("login_risk_state") && restrictedProbeCount > 0);
|
|
1017
|
+
throw Object.assign(
|
|
1018
|
+
new Error(
|
|
1019
|
+
restricted
|
|
1020
|
+
? `Tencent restricted the post-OTP session (HTTP ${diagnosticProbe?.status || 0}; login_risk_state present; source=${diagnosticProbe?.source || "unknown"})`
|
|
1021
|
+
: `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`,
|
|
1022
|
+
),
|
|
1023
|
+
{ code: restricted ? CODEBUDDY_CN_ACCOUNT_RESTRICTED : "CN_CONSOLE_SESSION_UNAVAILABLE" },
|
|
916
1024
|
);
|
|
917
1025
|
}
|
|
918
1026
|
|
|
@@ -1160,7 +1268,20 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
|
|
|
1160
1268
|
// If API key capture fails after registration, the account is registered
|
|
1161
1269
|
// but we don't have a key. Surface as needs_manual so the operator can
|
|
1162
1270
|
// create the key manually in the opened browser — number is NOT re-bought.
|
|
1271
|
+
const restricted = error?.code === CODEBUDDY_CN_ACCOUNT_RESTRICTED;
|
|
1163
1272
|
const outcomeUnknown = error?.code === CODEBUDDY_CN_API_KEY_OUTCOME_UNKNOWN;
|
|
1273
|
+
if (restricted) {
|
|
1274
|
+
this.finalizeAccount(account, "failed_restricted", {
|
|
1275
|
+
error: `${error.message}. Use a different residential CN/HK proxy with concurrency 1.`,
|
|
1276
|
+
step: "failed_restricted",
|
|
1277
|
+
message: "Tencent restricted the post-OTP session; API-key capture was not attempted",
|
|
1278
|
+
});
|
|
1279
|
+
await settleFiveSimOrder(() => fiveSimClient.finishOrder(fiveSimOrderId));
|
|
1280
|
+
account.runtimeSession = null;
|
|
1281
|
+
await closeContextOrBrowser(context, job);
|
|
1282
|
+
await this.persistJobSnapshot(job, { forcePreview: true });
|
|
1283
|
+
return;
|
|
1284
|
+
}
|
|
1164
1285
|
const failureMessage = outcomeUnknown
|
|
1165
1286
|
? `${error.message}. Check the CodeBuddy keys page before creating another key.`
|
|
1166
1287
|
: error.message;
|
|
@@ -1431,7 +1552,7 @@ function buildCnSummary(accounts = []) {
|
|
|
1431
1552
|
if (status === "success") {
|
|
1432
1553
|
summary.success += 1;
|
|
1433
1554
|
summary.completed += 1;
|
|
1434
|
-
} else if (status
|
|
1555
|
+
} else if (status.startsWith("failed")) {
|
|
1435
1556
|
summary.failed += 1;
|
|
1436
1557
|
summary.completed += 1;
|
|
1437
1558
|
} else if (status === "needs_manual") {
|
|
@@ -1525,7 +1646,11 @@ export const __test__ = {
|
|
|
1525
1646
|
sanitizeCnJob,
|
|
1526
1647
|
defaultPhoneFormatter,
|
|
1527
1648
|
defaultSaveCodeBuddyCnConnection,
|
|
1649
|
+
buildCnSummary,
|
|
1650
|
+
hasRestrictedConsoleEvidence,
|
|
1528
1651
|
isLoginHtmlProbe,
|
|
1652
|
+
parseConsoleProbeBody,
|
|
1653
|
+
probeCodeBuddyConsoleAccounts,
|
|
1529
1654
|
withTimeoutCleanup,
|
|
1530
1655
|
AUTOMATION_LIMITS: {
|
|
1531
1656
|
registrationHardTimeoutMs: CODEBUDDY_CN_ACCOUNT_HARD_TIMEOUT_MS,
|
|
@@ -118,6 +118,34 @@ const IFRAME_ERROR_SELECTORS = [
|
|
|
118
118
|
".kc-feedback-text",
|
|
119
119
|
];
|
|
120
120
|
|
|
121
|
+
const RESTRICTION_COOKIE_NAMES = new Set([
|
|
122
|
+
"login_risk_state",
|
|
123
|
+
]);
|
|
124
|
+
|
|
125
|
+
const RESTRICTION_TEXT_MARKERS = [
|
|
126
|
+
"账号访问受限",
|
|
127
|
+
"安全策略限制",
|
|
128
|
+
"访问受限",
|
|
129
|
+
"account restricted",
|
|
130
|
+
"access restricted",
|
|
131
|
+
];
|
|
132
|
+
|
|
133
|
+
function hasRestrictionCookie(cookies = []) {
|
|
134
|
+
return cookies.some((cookie) => RESTRICTION_COOKIE_NAMES.has(cookie?.name));
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function containsRestrictionText(value) {
|
|
138
|
+
const text = String(value || "").toLowerCase();
|
|
139
|
+
return RESTRICTION_TEXT_MARKERS.some((marker) => text.includes(marker.toLowerCase()));
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function restrictedRegistrationResult(detail = "Tencent risk policy rejected the post-OTP session") {
|
|
143
|
+
return {
|
|
144
|
+
status: "failed_restricted",
|
|
145
|
+
error: `Account restricted after OTP (${detail}). Use a different residential CN/HK proxy with concurrency 1; do not retry this number on the same egress IP.`,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
|
|
121
149
|
function shouldBlockCodeBuddyResource(url, resourceType) {
|
|
122
150
|
const value = String(url || "");
|
|
123
151
|
if (/googletagmanager|googleadservices|google-analytics|doubleclick|facebook|hotjar|clarity\.ms|hm\.baidu|google\.com\/rmkt/i.test(value)) {
|
|
@@ -467,10 +495,8 @@ export async function runCodeBuddyCnPhoneRegistration({
|
|
|
467
495
|
await page.waitForTimeout(preSubmitPauseMs);
|
|
468
496
|
|
|
469
497
|
// Step 9: Click submit (#kc-login)
|
|
470
|
-
// Retry a
|
|
471
|
-
//
|
|
472
|
-
// residential CN proxy is used. Keep the loop short so Chromium cannot pin RAM.
|
|
473
|
-
// After a clean submit, poll for Keycloak cookies (China proxy SPA shell lag).
|
|
498
|
+
// Retry a clean submit only when it had no effect. A confirmed restriction
|
|
499
|
+
// is terminal for this number/IP pair and must not be resubmitted.
|
|
474
500
|
const MAX_SUBMIT_RETRIES = 2;
|
|
475
501
|
const SESSION_WAIT_MS = Math.max(postSubmit, 12_000);
|
|
476
502
|
let submitSuccess = false;
|
|
@@ -486,6 +512,10 @@ export async function runCodeBuddyCnPhoneRegistration({
|
|
|
486
512
|
reportStep("cn_session_cookies", `Keycloak session after iframe detach (${earlySession.cookie})`);
|
|
487
513
|
return { status: "success" };
|
|
488
514
|
}
|
|
515
|
+
if (hasRestrictionCookie(earlySession.cookies)) {
|
|
516
|
+
reportStep("cn_account_restricted", "Tencent login_risk_state present after iframe detached");
|
|
517
|
+
return restrictedRegistrationResult("login_risk_state cookie present");
|
|
518
|
+
}
|
|
489
519
|
return { status: "failed", error: "Lost phone iframe after submit" };
|
|
490
520
|
}
|
|
491
521
|
|
|
@@ -530,30 +560,13 @@ export async function runCodeBuddyCnPhoneRegistration({
|
|
|
530
560
|
currentFrame = (await getPhoneFrame(page)) || currentFrame;
|
|
531
561
|
|
|
532
562
|
// Check for "account restricted" (账号访问受限)
|
|
533
|
-
const restrictionDetected = await checkAccountRestricted(currentFrame);
|
|
563
|
+
const restrictionDetected = await checkAccountRestricted(page, currentFrame);
|
|
534
564
|
if (restrictionDetected) {
|
|
535
|
-
if (retry >= MAX_SUBMIT_RETRIES - 1) {
|
|
536
|
-
return {
|
|
537
|
-
status: "failed",
|
|
538
|
-
error:
|
|
539
|
-
"Account restricted (账号访问受限) after submit. Datacenter/VPS IP is usually blocked — use a residential CN/HK proxy (proxyPoolMode=single), concurrency 1, and retry. Chromium locale is zh-CN; bad egress IP still fails.",
|
|
540
|
-
};
|
|
541
|
-
}
|
|
542
|
-
// Cool-down before reload — immediate refresh+resubmit looks more automated
|
|
543
|
-
const coolMs = 2_500 + Math.floor(Math.random() * 2_000);
|
|
544
565
|
reportStep(
|
|
545
566
|
"cn_account_restricted",
|
|
546
|
-
`Account restricted (attempt ${retry + 1}) —
|
|
567
|
+
`Account restricted after submit (attempt ${retry + 1}) — stopping automatic retries`,
|
|
547
568
|
);
|
|
548
|
-
|
|
549
|
-
await page.reload({ waitUntil: "commit", timeout: nav }).catch(() => {});
|
|
550
|
-
await waitForAnyVisible(page, SPA_READY_SELECTORS, 12_000);
|
|
551
|
-
const phoneTabRetry = await waitForFirstVisibleLocator(page, PHONE_TAB_SELECTORS, { timeout: 8_000 });
|
|
552
|
-
if (phoneTabRetry) {
|
|
553
|
-
await phoneTabRetry.click().catch(() => {});
|
|
554
|
-
await page.locator(PHONE_IFRAME_SELECTOR).waitFor({ state: "attached", timeout: 8_000 }).catch(() => {});
|
|
555
|
-
}
|
|
556
|
-
continue; // Retry submit
|
|
569
|
+
return restrictedRegistrationResult("restriction message detected");
|
|
557
570
|
}
|
|
558
571
|
|
|
559
572
|
// Captcha
|
|
@@ -588,6 +601,10 @@ export async function runCodeBuddyCnPhoneRegistration({
|
|
|
588
601
|
reportStep("cn_session_cookies", `Keycloak session cookies present (${session.cookie}) — registration success`);
|
|
589
602
|
return { status: "success" };
|
|
590
603
|
}
|
|
604
|
+
if (session.reason === "restricted") {
|
|
605
|
+
reportStep("cn_account_restricted", "Restriction detected while waiting for Keycloak session");
|
|
606
|
+
return restrictedRegistrationResult("restriction message detected during session handoff");
|
|
607
|
+
}
|
|
591
608
|
|
|
592
609
|
// Still on login form? Click may not have submitted — retry
|
|
593
610
|
const stillOnForm = await isLoginFormStillVisible(page);
|
|
@@ -605,6 +622,17 @@ export async function runCodeBuddyCnPhoneRegistration({
|
|
|
605
622
|
reportStep("cn_session_cookies", `Keycloak session after home nudge (${sessionAfterHome.cookie})`);
|
|
606
623
|
return { status: "success" };
|
|
607
624
|
}
|
|
625
|
+
if (sessionAfterHome.reason === "restricted") {
|
|
626
|
+
reportStep("cn_account_restricted", "Restriction detected after home handoff");
|
|
627
|
+
return restrictedRegistrationResult("restriction message detected after OIDC handoff");
|
|
628
|
+
}
|
|
629
|
+
if (hasRestrictionCookie(sessionAfterHome.cookies)) {
|
|
630
|
+
reportStep(
|
|
631
|
+
"cn_account_restricted",
|
|
632
|
+
"Home handoff returned no authenticated session and login_risk_state is present",
|
|
633
|
+
);
|
|
634
|
+
return restrictedRegistrationResult("login_risk_state persisted after OIDC handoff");
|
|
635
|
+
}
|
|
608
636
|
|
|
609
637
|
submitSuccess = true;
|
|
610
638
|
break;
|
|
@@ -625,6 +653,13 @@ export async function runCodeBuddyCnPhoneRegistration({
|
|
|
625
653
|
reportStep("cn_registration_success", `Phone registration completed (Keycloak session: ${sessionFinal.cookie})`);
|
|
626
654
|
return { status: "success" };
|
|
627
655
|
}
|
|
656
|
+
if (hasRestrictionCookie(sessionFinal.cookies)) {
|
|
657
|
+
reportStep(
|
|
658
|
+
"cn_account_restricted",
|
|
659
|
+
"No authenticated session and Tencent login_risk_state is present — account restricted",
|
|
660
|
+
);
|
|
661
|
+
return restrictedRegistrationResult("login_risk_state without an authenticated session");
|
|
662
|
+
}
|
|
628
663
|
|
|
629
664
|
const success = await confirmRegistrationSuccess(page, phoneFrame, 10_000);
|
|
630
665
|
if (success) {
|
|
@@ -945,15 +980,13 @@ async function waitForKeycloakSession(page, { timeoutMs = 20_000, reportStep, al
|
|
|
945
980
|
// ignore
|
|
946
981
|
}
|
|
947
982
|
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
}
|
|
983
|
+
const frame = alsoCheckFrame ? await alsoCheckFrame().catch(() => null) : null;
|
|
984
|
+
if (await checkAccountRestricted(page, frame)) {
|
|
985
|
+
return { ok: false, cookies, reason: "restricted" };
|
|
986
|
+
}
|
|
987
|
+
if (frame) {
|
|
954
988
|
const err = await checkIframeError(frame);
|
|
955
989
|
if (err) return { ok: false, cookies, reason: `form_error:${err}` };
|
|
956
|
-
}
|
|
957
990
|
}
|
|
958
991
|
|
|
959
992
|
if (reportStep && Date.now() - lastReport > 4_000) {
|
|
@@ -1035,18 +1068,15 @@ async function collectPostLoginDiagnostics(page) {
|
|
|
1035
1068
|
* Check for "account restricted" message in the iframe (and main page).
|
|
1036
1069
|
* Tencent shows "账号访问受限" when a virtual number / risk policy blocks login.
|
|
1037
1070
|
*/
|
|
1038
|
-
async function checkAccountRestricted(frame) {
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
bodyText.
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
return true;
|
|
1071
|
+
async function checkAccountRestricted(page, frame) {
|
|
1072
|
+
for (const target of [frame, page]) {
|
|
1073
|
+
if (!target) continue;
|
|
1074
|
+
try {
|
|
1075
|
+
const bodyText = await target.evaluate(() => document.body?.innerText || "");
|
|
1076
|
+
if (containsRestrictionText(bodyText)) return true;
|
|
1077
|
+
} catch {
|
|
1078
|
+
// Try the other document.
|
|
1047
1079
|
}
|
|
1048
|
-
} catch {
|
|
1049
|
-
// Ignore
|
|
1050
1080
|
}
|
|
1051
1081
|
return false;
|
|
1052
1082
|
}
|
|
@@ -1132,14 +1162,18 @@ async function detectCaptcha(page, frame, timeout = 5_000) {
|
|
|
1132
1162
|
* API key capture then hard-failed on missing KEYCLOAK_IDENTITY.
|
|
1133
1163
|
*/
|
|
1134
1164
|
async function confirmRegistrationSuccess(page, frame, timeout = 15_000) {
|
|
1135
|
-
|
|
1165
|
+
let cookies = [];
|
|
1136
1166
|
try {
|
|
1137
|
-
|
|
1167
|
+
cookies = await page.context().cookies().catch(() => []);
|
|
1138
1168
|
if (findKeycloakSessionCookie(cookies)) return true;
|
|
1139
1169
|
} catch {
|
|
1140
1170
|
// Ignore
|
|
1141
1171
|
}
|
|
1142
1172
|
|
|
1173
|
+
// Never let generic app chrome override a Tencent restriction signal.
|
|
1174
|
+
if (hasRestrictionCookie(cookies)) return false;
|
|
1175
|
+
if (await isLoginFormStillVisible(page).catch(() => false)) return false;
|
|
1176
|
+
|
|
1143
1177
|
// Strong: logged-in UI chrome (avatar / logout)
|
|
1144
1178
|
for (const sel of LOGGED_IN_SELECTORS) {
|
|
1145
1179
|
try {
|
|
@@ -1154,7 +1188,6 @@ async function confirmRegistrationSuccess(page, frame, timeout = 15_000) {
|
|
|
1154
1188
|
// Soft-but-useful: left /login AND has qcloud_uid (Tencent account cookie)
|
|
1155
1189
|
try {
|
|
1156
1190
|
const url = page.url();
|
|
1157
|
-
const cookies = await page.context().cookies().catch(() => []);
|
|
1158
1191
|
const names = new Set(cookies.map((c) => c.name));
|
|
1159
1192
|
if (
|
|
1160
1193
|
url
|
|
@@ -1194,5 +1227,8 @@ export const __test__ = {
|
|
|
1194
1227
|
CAPTCHA_SELECTORS,
|
|
1195
1228
|
LOGGED_IN_SELECTORS,
|
|
1196
1229
|
KEYCLOAK_SESSION_COOKIE_NAMES,
|
|
1230
|
+
containsRestrictionText,
|
|
1231
|
+
hasRestrictionCookie,
|
|
1232
|
+
restrictedRegistrationResult,
|
|
1197
1233
|
shouldBlockCodeBuddyResource,
|
|
1198
1234
|
};
|
|
File without changes
|
|
File without changes
|