zevairouter 1.0.149 → 1.0.151

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.
Files changed (333) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/cli/app/.next-cli-build/BUILD_ID +1 -1
  3. package/cli/app/.next-cli-build/app-path-routes-manifest.json +11 -11
  4. package/cli/app/.next-cli-build/build-manifest.json +2 -2
  5. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/automation/page_client-reference-manifest.js +1 -1
  6. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
  7. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
  8. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  9. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  10. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
  11. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/context/page_client-reference-manifest.js +1 -1
  12. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  13. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
  14. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
  15. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
  16. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
  17. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
  18. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  19. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/playground/page_client-reference-manifest.js +1 -1
  20. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  21. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  22. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  23. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  24. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
  25. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/pxpipe/page_client-reference-manifest.js +1 -1
  26. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  27. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/terminal/page_client-reference-manifest.js +1 -1
  28. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
  29. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  30. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  31. package/cli/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
  32. package/cli/app/.next-cli-build/server/app/_global-error.html +1 -1
  33. package/cli/app/.next-cli-build/server/app/_global-error.rsc +1 -1
  34. package/cli/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
  35. package/cli/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  36. package/cli/app/.next-cli-build/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  37. package/cli/app/.next-cli-build/server/app/_global-error.segments/_head.segment.rsc +1 -1
  38. package/cli/app/.next-cli-build/server/app/_global-error.segments/_index.segment.rsc +1 -1
  39. package/cli/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  40. package/cli/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
  41. package/cli/app/.next-cli-build/server/app/_not-found.html +1 -1
  42. package/cli/app/.next-cli-build/server/app/_not-found.rsc +3 -3
  43. package/cli/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +3 -3
  44. package/cli/app/.next-cli-build/server/app/_not-found.segments/_head.segment.rsc +1 -1
  45. package/cli/app/.next-cli-build/server/app/_not-found.segments/_index.segment.rsc +3 -3
  46. package/cli/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  47. package/cli/app/.next-cli-build/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  48. package/cli/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  49. package/cli/app/.next-cli-build/server/app/api/models/route.js +1 -1
  50. package/cli/app/.next-cli-build/server/app/api/oauth/cloudflare-ai/bulk-import/[jobId]/cancel/route.js +1 -1
  51. package/cli/app/.next-cli-build/server/app/api/oauth/cloudflare-ai/bulk-import/[jobId]/manual/[workerId]/route.js +1 -1
  52. package/cli/app/.next-cli-build/server/app/api/oauth/cloudflare-ai/bulk-import/[jobId]/route.js +1 -1
  53. package/cli/app/.next-cli-build/server/app/api/oauth/cloudflare-ai/bulk-import/latest/route.js +1 -1
  54. package/cli/app/.next-cli-build/server/app/api/oauth/cloudflare-ai/bulk-import/route.js +1 -1
  55. package/cli/app/.next-cli-build/server/app/api/oauth/kiro/bulk-import/[jobId]/cancel/route.js +1 -1
  56. package/cli/app/.next-cli-build/server/app/api/oauth/kiro/bulk-import/[jobId]/manual/[workerId]/route.js +1 -1
  57. package/cli/app/.next-cli-build/server/app/api/oauth/kiro/bulk-import/[jobId]/route.js +1 -1
  58. package/cli/app/.next-cli-build/server/app/api/oauth/kiro/bulk-import/latest/route.js +1 -1
  59. package/cli/app/.next-cli-build/server/app/api/oauth/kiro/bulk-import/route.js +1 -1
  60. package/cli/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js +1 -1
  61. package/cli/app/.next-cli-build/server/app/api/oauth/qoder/bulk-import/[jobId]/cancel/route.js +1 -1
  62. package/cli/app/.next-cli-build/server/app/api/oauth/qoder/bulk-import/[jobId]/manual/[workerId]/route.js +1 -1
  63. package/cli/app/.next-cli-build/server/app/api/oauth/qoder/bulk-import/[jobId]/route.js +1 -1
  64. package/cli/app/.next-cli-build/server/app/api/oauth/qoder/bulk-import/latest/route.js +1 -1
  65. package/cli/app/.next-cli-build/server/app/api/oauth/qoder/bulk-import/route.js +1 -1
  66. package/cli/app/.next-cli-build/server/app/api/providers/route.js +1 -1
  67. package/cli/app/.next-cli-build/server/app/api/providers/validate/route.js +1 -1
  68. package/cli/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
  69. package/cli/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
  70. package/cli/app/.next-cli-build/server/app/api/version/route.js +1 -1
  71. package/cli/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
  72. package/cli/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
  73. package/cli/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
  74. package/cli/app/.next-cli-build/server/app/callback.html +1 -1
  75. package/cli/app/.next-cli-build/server/app/callback.rsc +3 -3
  76. package/cli/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +3 -3
  77. package/cli/app/.next-cli-build/server/app/callback.segments/_head.segment.rsc +1 -1
  78. package/cli/app/.next-cli-build/server/app/callback.segments/_index.segment.rsc +3 -3
  79. package/cli/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +1 -1
  80. package/cli/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
  81. package/cli/app/.next-cli-build/server/app/callback.segments/callback.segment.rsc +1 -1
  82. package/cli/app/.next-cli-build/server/app/dashboard/automation.html +1 -1
  83. package/cli/app/.next-cli-build/server/app/dashboard/automation.rsc +5 -5
  84. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard/automation/__PAGE__.segment.rsc +2 -2
  85. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard/automation.segment.rsc +1 -1
  86. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  87. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  88. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_full.segment.rsc +5 -5
  89. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_head.segment.rsc +1 -1
  90. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_index.segment.rsc +3 -3
  91. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_tree.segment.rsc +1 -1
  92. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
  93. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +5 -5
  94. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
  95. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
  96. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  97. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  98. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +5 -5
  99. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
  100. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_index.segment.rsc +3 -3
  101. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +1 -1
  102. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
  103. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +5 -5
  104. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
  105. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
  106. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  107. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  108. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +5 -5
  109. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
  110. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_index.segment.rsc +3 -3
  111. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +1 -1
  112. package/cli/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
  113. package/cli/app/.next-cli-build/server/app/dashboard/combos.rsc +5 -5
  114. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
  115. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
  116. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  117. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  118. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +5 -5
  119. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
  120. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_index.segment.rsc +3 -3
  121. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +1 -1
  122. package/cli/app/.next-cli-build/server/app/dashboard/context.html +1 -1
  123. package/cli/app/.next-cli-build/server/app/dashboard/context.rsc +5 -5
  124. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard/context/__PAGE__.segment.rsc +2 -2
  125. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard/context.segment.rsc +1 -1
  126. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  127. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  128. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_full.segment.rsc +5 -5
  129. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_head.segment.rsc +1 -1
  130. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_index.segment.rsc +3 -3
  131. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_tree.segment.rsc +1 -1
  132. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
  133. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.rsc +5 -5
  134. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
  135. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
  136. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  137. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  138. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +5 -5
  139. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
  140. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_index.segment.rsc +3 -3
  141. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +1 -1
  142. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
  143. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +5 -5
  144. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +2 -2
  145. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web.segment.rsc +1 -1
  146. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
  147. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  148. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  149. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +5 -5
  150. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_head.segment.rsc +1 -1
  151. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_index.segment.rsc +3 -3
  152. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +1 -1
  153. package/cli/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
  154. package/cli/app/.next-cli-build/server/app/dashboard/mitm.rsc +5 -5
  155. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
  156. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
  157. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  158. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  159. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +5 -5
  160. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
  161. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_index.segment.rsc +3 -3
  162. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +1 -1
  163. package/cli/app/.next-cli-build/server/app/dashboard/playground.html +1 -1
  164. package/cli/app/.next-cli-build/server/app/dashboard/playground.rsc +5 -5
  165. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard/playground/__PAGE__.segment.rsc +2 -2
  166. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard/playground.segment.rsc +1 -1
  167. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  168. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  169. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_full.segment.rsc +5 -5
  170. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_head.segment.rsc +1 -1
  171. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_index.segment.rsc +3 -3
  172. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_tree.segment.rsc +1 -1
  173. package/cli/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
  174. package/cli/app/.next-cli-build/server/app/dashboard/profile.rsc +5 -5
  175. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
  176. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
  177. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  178. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  179. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +5 -5
  180. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
  181. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_index.segment.rsc +3 -3
  182. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +1 -1
  183. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
  184. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.rsc +5 -5
  185. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
  186. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
  187. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  188. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  189. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  190. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +5 -5
  191. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
  192. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_index.segment.rsc +3 -3
  193. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +1 -1
  194. package/cli/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
  195. package/cli/app/.next-cli-build/server/app/dashboard/providers.rsc +5 -5
  196. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
  197. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  198. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  199. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  200. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +5 -5
  201. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
  202. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_index.segment.rsc +3 -3
  203. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +1 -1
  204. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
  205. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +5 -5
  206. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
  207. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
  208. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  209. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  210. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +5 -5
  211. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
  212. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +3 -3
  213. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +1 -1
  214. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.html +1 -1
  215. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.rsc +5 -5
  216. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe/__PAGE__.segment.rsc +2 -2
  217. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe.segment.rsc +1 -1
  218. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  219. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  220. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_full.segment.rsc +5 -5
  221. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_head.segment.rsc +1 -1
  222. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_index.segment.rsc +3 -3
  223. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_tree.segment.rsc +1 -1
  224. package/cli/app/.next-cli-build/server/app/dashboard/quota.html +2 -2
  225. package/cli/app/.next-cli-build/server/app/dashboard/quota.rsc +6 -6
  226. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +3 -3
  227. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
  228. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  229. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  230. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +6 -6
  231. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
  232. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_index.segment.rsc +3 -3
  233. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +1 -1
  234. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  235. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
  236. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +3 -3
  237. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +3 -3
  238. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
  239. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +3 -3
  240. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +1 -1
  241. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
  242. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
  243. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
  244. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
  245. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.html +1 -1
  246. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.rsc +5 -5
  247. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +2 -2
  248. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver.segment.rsc +1 -1
  249. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  250. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  251. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_full.segment.rsc +5 -5
  252. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_head.segment.rsc +1 -1
  253. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_index.segment.rsc +3 -3
  254. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_tree.segment.rsc +1 -1
  255. package/cli/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
  256. package/cli/app/.next-cli-build/server/app/dashboard/translator.rsc +5 -5
  257. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
  258. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
  259. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  260. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  261. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +5 -5
  262. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
  263. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_index.segment.rsc +3 -3
  264. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +1 -1
  265. package/cli/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
  266. package/cli/app/.next-cli-build/server/app/dashboard/usage.rsc +5 -5
  267. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
  268. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
  269. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  270. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  271. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +5 -5
  272. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
  273. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_index.segment.rsc +3 -3
  274. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +1 -1
  275. package/cli/app/.next-cli-build/server/app/dashboard.html +1 -1
  276. package/cli/app/.next-cli-build/server/app/dashboard.rsc +5 -5
  277. package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
  278. package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  279. package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  280. package/cli/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +5 -5
  281. package/cli/app/.next-cli-build/server/app/dashboard.segments/_head.segment.rsc +1 -1
  282. package/cli/app/.next-cli-build/server/app/dashboard.segments/_index.segment.rsc +3 -3
  283. package/cli/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +1 -1
  284. package/cli/app/.next-cli-build/server/app/index.html +1 -1
  285. package/cli/app/.next-cli-build/server/app/index.rsc +3 -3
  286. package/cli/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  287. package/cli/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +3 -3
  288. package/cli/app/.next-cli-build/server/app/index.segments/_head.segment.rsc +1 -1
  289. package/cli/app/.next-cli-build/server/app/index.segments/_index.segment.rsc +3 -3
  290. package/cli/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +1 -1
  291. package/cli/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
  292. package/cli/app/.next-cli-build/server/app/landing.html +1 -1
  293. package/cli/app/.next-cli-build/server/app/landing.rsc +4 -4
  294. package/cli/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +4 -4
  295. package/cli/app/.next-cli-build/server/app/landing.segments/_head.segment.rsc +1 -1
  296. package/cli/app/.next-cli-build/server/app/landing.segments/_index.segment.rsc +3 -3
  297. package/cli/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +1 -1
  298. package/cli/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +2 -2
  299. package/cli/app/.next-cli-build/server/app/landing.segments/landing.segment.rsc +1 -1
  300. package/cli/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
  301. package/cli/app/.next-cli-build/server/app/login.html +1 -1
  302. package/cli/app/.next-cli-build/server/app/login.rsc +4 -4
  303. package/cli/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +4 -4
  304. package/cli/app/.next-cli-build/server/app/login.segments/_head.segment.rsc +1 -1
  305. package/cli/app/.next-cli-build/server/app/login.segments/_index.segment.rsc +3 -3
  306. package/cli/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +1 -1
  307. package/cli/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  308. package/cli/app/.next-cli-build/server/app/login.segments/login.segment.rsc +1 -1
  309. package/cli/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
  310. package/cli/app/.next-cli-build/server/app-paths-manifest.json +11 -11
  311. package/cli/app/.next-cli-build/server/chunks/1019.js +1 -1
  312. package/cli/app/.next-cli-build/server/chunks/3155.js +1 -1
  313. package/cli/app/.next-cli-build/server/chunks/4566.js +1 -1
  314. package/cli/app/.next-cli-build/server/chunks/4746.js +1 -1
  315. package/cli/app/.next-cli-build/server/chunks/5000.js +1 -1
  316. package/cli/app/.next-cli-build/server/chunks/5307.js +1 -1
  317. package/cli/app/.next-cli-build/server/chunks/5949.js +3 -3
  318. package/cli/app/.next-cli-build/server/chunks/8306.js +1 -1
  319. package/cli/app/.next-cli-build/server/chunks/8371.js +1 -1
  320. package/cli/app/.next-cli-build/server/chunks/9621.js +1 -1
  321. package/cli/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
  322. package/cli/app/.next-cli-build/server/pages/404.html +1 -1
  323. package/cli/app/.next-cli-build/server/pages/500.html +1 -1
  324. package/cli/app/.next-cli-build/static/chunks/{620-104e711e028e5a60.js → 620-e4b9eeb811dd9f2e.js} +1 -1
  325. package/cli/app/CHANGELOG.md +14 -0
  326. package/cli/app/package.json +1 -1
  327. package/cli/package.json +1 -1
  328. package/package.json +1 -1
  329. package/src/lib/oauth/services/bulkImportBrowserEngine.js +287 -4
  330. package/src/lib/oauth/services/codebuddyCnBulkImportManager.js +216 -7
  331. package/src/lib/oauth/services/kiroBulkImportManager.js +12 -9
  332. /package/cli/app/.next-cli-build/static/{w0fFe0wlenV7JedZI_N94 → nSCRy0gnXuQuQ0zz0lV8w}/_buildManifest.js +0 -0
  333. /package/cli/app/.next-cli-build/static/{w0fFe0wlenV7JedZI_N94 → nSCRy0gnXuQuQ0zz0lV8w}/_ssgManifest.js +0 -0
@@ -40,7 +40,12 @@ import {
40
40
  defaultPollForToken,
41
41
  fetchCodeBuddyLoginAccount,
42
42
  } from "./codebuddyBulkImportManager.js";
43
- import { forceCloseBrowser } from "./bulkImportBrowserEngine.js";
43
+ import {
44
+ forceCloseBrowser,
45
+ getCloakProxyProfile,
46
+ parseProxyEgressIp,
47
+ PROXY_EGRESS_ECHO_URLS,
48
+ } from "./bulkImportBrowserEngine.js";
44
49
 
45
50
  const CODEBUDDY_CN_PROVIDER_ID = "codebuddy-cn";
46
51
  const CODEBUDDY_CN_LABEL = "CodeBuddy CN";
@@ -82,6 +87,7 @@ const CODEBUDDY_CN_MANUAL_TIMEOUT_MS = 8 * 60_000;
82
87
  const CODEBUDDY_CN_LOW_MEM_MANUAL_TIMEOUT_MS = 3 * 60_000;
83
88
  const CODEBUDDY_CN_RESOURCE_CLOSE_TIMEOUT_MS = 5_000;
84
89
  const CODEBUDDY_CN_FIVESIM_SETTLE_TIMEOUT_MS = 12_000;
90
+ const CODEBUDDY_CN_EGRESS_PROBE_TIMEOUT_MS = 6_000;
85
91
  const CODEBUDDY_CN_API_KEY_OUTCOME_UNKNOWN = "CN_API_KEY_OUTCOME_UNKNOWN";
86
92
  const CODEBUDDY_CN_ACCOUNT_RESTRICTED = "CN_ACCOUNT_RESTRICTED";
87
93
 
@@ -127,6 +133,105 @@ function clampCnConcurrency(value) {
127
133
  return Math.min(hardMax, Math.max(CODEBUDDY_CN_MIN_CONCURRENCY, parsed));
128
134
  }
129
135
 
136
+ function resolveCnJobConcurrency(value, { manualProxy = false } = {}) {
137
+ return manualProxy ? 1 : clampCnConcurrency(value);
138
+ }
139
+
140
+ function parseEgressIp(value) {
141
+ return parseProxyEgressIp(value);
142
+ }
143
+
144
+ async function probeCodeBuddyProxyEgress(
145
+ context,
146
+ { timeoutMs = CODEBUDDY_CN_EGRESS_PROBE_TIMEOUT_MS } = {},
147
+ ) {
148
+ let requestContext = null;
149
+ try {
150
+ requestContext = context?.request || null;
151
+ } catch {
152
+ requestContext = null;
153
+ }
154
+ if (!requestContext || typeof requestContext.get !== "function") {
155
+ return { ok: false, ip: null, ips: [], samples: 0, error: "context request unavailable" };
156
+ }
157
+
158
+ const attemptedUrls = [];
159
+ let lastError = null;
160
+ for (const url of PROXY_EGRESS_ECHO_URLS) {
161
+ attemptedUrls.push(url);
162
+ let response = null;
163
+ try {
164
+ response = await requestContext.get(url, {
165
+ timeout: timeoutMs,
166
+ failOnStatusCode: false,
167
+ headers: {
168
+ Accept: "text/plain, application/json;q=0.9, */*;q=0.1",
169
+ "Cache-Control": "no-cache",
170
+ },
171
+ });
172
+ if (response.status() < 200 || response.status() >= 300) {
173
+ lastError = `HTTP ${response.status()}`;
174
+ continue;
175
+ }
176
+ const ip = parseEgressIp(await response.text().catch(() => ""));
177
+ if (!ip) {
178
+ lastError = "exit-IP response was not recognized";
179
+ continue;
180
+ }
181
+ return {
182
+ ok: true,
183
+ ip,
184
+ ips: [ip],
185
+ samples: 1,
186
+ attempts: attemptedUrls.length,
187
+ attemptedUrls,
188
+ unstable: false,
189
+ error: null,
190
+ };
191
+ } catch (error) {
192
+ lastError = error?.name === "TimeoutError"
193
+ ? `timed out after ${timeoutMs}ms`
194
+ : "request failed";
195
+ } finally {
196
+ if (typeof response?.dispose === "function") {
197
+ await Promise.resolve(response.dispose()).catch(() => null);
198
+ }
199
+ }
200
+ }
201
+ return {
202
+ ok: false,
203
+ ip: null,
204
+ ips: [],
205
+ samples: 0,
206
+ attempts: attemptedUrls.length,
207
+ attemptedUrls,
208
+ unstable: false,
209
+ error: lastError || "all exit-IP services failed",
210
+ };
211
+ }
212
+
213
+ function requireStableProxyEgress(probe, expectedIp = null) {
214
+ if (probe?.unstable) {
215
+ throw Object.assign(
216
+ new Error("Manual proxy rotated between exit IPs during preflight; no phone number was purchased"),
217
+ { code: "CN_PROXY_EGRESS_UNSTABLE" },
218
+ );
219
+ }
220
+ if (!probe?.ok || !probe?.ip) {
221
+ throw Object.assign(
222
+ new Error(`Manual proxy exit IP could not be verified (${probe?.error || "no response"}); no phone number was purchased`),
223
+ { code: "CN_PROXY_EGRESS_UNVERIFIED" },
224
+ );
225
+ }
226
+ if (expectedIp && probe.ip !== expectedIp) {
227
+ throw Object.assign(
228
+ new Error("Manual proxy exit IP changed after CloakBrowser GeoIP alignment; no phone number was purchased"),
229
+ { code: "CN_PROXY_EGRESS_CHANGED" },
230
+ );
231
+ }
232
+ return probe.ip;
233
+ }
234
+
130
235
  async function withTimeoutCleanup(
131
236
  task,
132
237
  {
@@ -388,6 +493,7 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
388
493
  proxyUrl,
389
494
  headless,
390
495
  windowSize: { width: 1280, height: 900 },
496
+ requireProxyGeoip: job?.proxyPoolMode === "manual" && Boolean(proxyUrl),
391
497
  });
392
498
  return withTimeoutCleanup(launchTask, {
393
499
  timeoutMs: CODEBUDDY_CN_BROWSER_LAUNCH_TIMEOUT_MS,
@@ -472,7 +578,7 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
472
578
  const job = {
473
579
  jobId,
474
580
  status: "running",
475
- concurrency: clampCnConcurrency(concurrency),
581
+ concurrency: resolveCnJobConcurrency(concurrency, { manualProxy: Boolean(manualProxy) }),
476
582
  proxyPoolMode: manualProxy ? "manual" : (proxyPoolMode || "none"),
477
583
  proxyUrls,
478
584
  region: resolvedRegion,
@@ -496,6 +602,9 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
496
602
  // Unique Chromium fingerprint seed per account (viewport/HW/screen noise).
497
603
  fingerprintSeed: randomUUID(),
498
604
  proxyUrl: null,
605
+ egressIp: null,
606
+ proxyTimezone: null,
607
+ proxyLocale: null,
499
608
  abortController: new AbortController(),
500
609
  status: "queued",
501
610
  error: null,
@@ -544,6 +653,7 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
544
653
  let fiveSimOrderId = null;
545
654
  let smsReceived = false;
546
655
  let context = null;
656
+ let verifiedEgressIp = null;
547
657
 
548
658
  try {
549
659
  // Step 1: Get 5sim API key from settings
@@ -569,16 +679,14 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
569
679
  // Step 2: Create browser context FIRST — if proxy/browser fails, we never buy a number.
570
680
  this.setAccountStep(account, "creating_browser", "Creating browser context (before 5sim order)");
571
681
  await this.persistJobSnapshot(job, { forcePreview: true });
572
- // CloakBrowser stack: zh-CN locale + HK/CN timezone so Tencent risk
573
- // scoring does not see EN-US browser on residential CN/HK egress (common
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();
682
+ // CloakBrowser owns the process-wide fingerprint, timezone, locale, and
683
+ // WebRTC profile. Playwright context overrides would reintroduce CDP tells.
577
684
  const contextTask = createFreshContext(job.browser, account.proxyUrl, {
578
685
  profile: "codebuddy-cn",
579
686
  region: job.region || "hongkong",
580
687
  fingerprintSeed: account.fingerprintSeed,
581
688
  lowMemory: isLowMemHost(),
689
+ nativeCloakProfile: job.proxyPoolMode === "manual",
582
690
  });
583
691
  const freshContext = await withTimeoutCleanup(contextTask, {
584
692
  timeoutMs: CODEBUDDY_CN_CONTEXT_TIMEOUT_MS,
@@ -590,6 +698,27 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
590
698
  const page = freshContext.page;
591
699
  account.runtimeSession = { context, page };
592
700
 
701
+ if (job.proxyPoolMode === "manual" && account.proxyUrl) {
702
+ this.setAccountStep(
703
+ account,
704
+ "checking_proxy_egress",
705
+ "Verifying pasted proxy exit IP before opening the registration form",
706
+ );
707
+ await this.persistJobSnapshot(job, { forcePreview: false });
708
+ const launchProfile = getCloakProxyProfile(job.browser);
709
+ const egressProbe = await probeCodeBuddyProxyEgress(context);
710
+ verifiedEgressIp = requireStableProxyEgress(egressProbe, launchProfile?.egressIp || null);
711
+ account.egressIp = verifiedEgressIp;
712
+ account.proxyTimezone = launchProfile?.timezone || null;
713
+ account.proxyLocale = launchProfile?.locale || null;
714
+ this.setAccountStep(
715
+ account,
716
+ "proxy_egress_ready",
717
+ `Manual proxy verified: ${verifiedEgressIp} (${egressProbe.samples} checks, ${account.proxyTimezone || "timezone unknown"}, ${account.proxyLocale || "locale unknown"})`,
718
+ );
719
+ await this.persistJobSnapshot(job, { forcePreview: false });
720
+ }
721
+
593
722
  if (job.cancelRequested) {
594
723
  throw new Error("Job cancelled before ordering phone number");
595
724
  }
@@ -636,6 +765,22 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
636
765
  if (job.cancelRequested) {
637
766
  throw new Error("Job cancelled before ordering phone number");
638
767
  }
768
+ if (job.proxyPoolMode === "manual" && account.proxyUrl) {
769
+ this.setAccountStep(
770
+ account,
771
+ "rechecking_proxy_egress",
772
+ "Registration form is ready — confirming the pasted proxy stayed sticky",
773
+ );
774
+ await this.persistJobSnapshot(job, { forcePreview: false });
775
+ const secondProbe = await probeCodeBuddyProxyEgress(context);
776
+ requireStableProxyEgress(secondProbe, verifiedEgressIp);
777
+ this.setAccountStep(
778
+ account,
779
+ "proxy_egress_confirmed",
780
+ `Manual proxy remained on ${verifiedEgressIp}; safe to purchase one phone number`,
781
+ );
782
+ await this.persistJobSnapshot(job, { forcePreview: false });
783
+ }
639
784
  this.setAccountStep(
640
785
  account,
641
786
  "ordering_number",
@@ -1483,6 +1628,62 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
1483
1628
  job.manualFollowups.add(followupPromise);
1484
1629
  }
1485
1630
 
1631
+ /**
1632
+ * A pasted proxy is intentionally single-worker. Recycle the whole CloakBrowser
1633
+ * process between accounts so its binary fingerprint and GeoIP profile cannot
1634
+ * leak from one registration into the next.
1635
+ */
1636
+ async runWorker(job, workerId) {
1637
+ if (job.proxyPoolMode !== "manual") {
1638
+ return super.runWorker(job, workerId);
1639
+ }
1640
+
1641
+ while (!job.cancelRequested) {
1642
+ const account = this.dequeueAccount(job, workerId);
1643
+ if (!account) return;
1644
+
1645
+ if (!job.browser) {
1646
+ try {
1647
+ job.browser = await this.browserLauncher({
1648
+ ...job,
1649
+ proxyUrls: account.proxyUrl ? [account.proxyUrl] : job.proxyUrls,
1650
+ });
1651
+ } catch (error) {
1652
+ this.finalizeAccount(account, "failed", {
1653
+ error: error?.message || "Manual proxy browser launch failed",
1654
+ step: "failed",
1655
+ message: error?.message || "Manual proxy browser launch failed",
1656
+ });
1657
+ await this.persistJobSnapshot(job, { forcePreview: true });
1658
+ continue;
1659
+ }
1660
+ }
1661
+
1662
+ try {
1663
+ await this.processAccount(job, account, workerId);
1664
+ } catch (error) {
1665
+ if (account.status === "running") {
1666
+ this.finalizeAccount(account, "failed", {
1667
+ error: error?.message || "Unexpected manual proxy worker failure",
1668
+ step: "failed",
1669
+ message: error?.message || "Unexpected manual proxy worker failure",
1670
+ });
1671
+ await this.persistJobSnapshot(job, { forcePreview: true });
1672
+ }
1673
+ } finally {
1674
+ if (job.manualFollowups.size > 0) {
1675
+ await Promise.allSettled([...job.manualFollowups]);
1676
+ }
1677
+
1678
+ if (job.browser) {
1679
+ const browser = job.browser;
1680
+ job.browser = null;
1681
+ await forceCloseBrowser(browser).catch(() => null);
1682
+ }
1683
+ }
1684
+ }
1685
+ }
1686
+
1486
1687
  /**
1487
1688
  * Override cancelJob to abort in-flight 5sim polls AND force-close the browser.
1488
1689
  * Previous CN override only aborted controllers — Chromium kept spinning (VPS hang).
@@ -1589,6 +1790,9 @@ function sanitizeCnJob(job, extras = {}) {
1589
1790
  phone: account.phone,
1590
1791
  fiveSimOrderId: account.fiveSimOrderId,
1591
1792
  proxyUrl: account.proxyUrl ? maskProxyUrl(account.proxyUrl) : null,
1793
+ egressIp: account.egressIp || null,
1794
+ proxyTimezone: account.proxyTimezone || null,
1795
+ proxyLocale: account.proxyLocale || null,
1592
1796
  status: account.status,
1593
1797
  error: account.error,
1594
1798
  connectionId: account.connectionId,
@@ -1643,14 +1847,18 @@ export {
1643
1847
 
1644
1848
  export const __test__ = {
1645
1849
  clampCnConcurrency,
1850
+ resolveCnJobConcurrency,
1646
1851
  sanitizeCnJob,
1647
1852
  defaultPhoneFormatter,
1648
1853
  defaultSaveCodeBuddyCnConnection,
1649
1854
  buildCnSummary,
1650
1855
  hasRestrictedConsoleEvidence,
1651
1856
  isLoginHtmlProbe,
1857
+ parseEgressIp,
1652
1858
  parseConsoleProbeBody,
1859
+ probeCodeBuddyProxyEgress,
1653
1860
  probeCodeBuddyConsoleAccounts,
1861
+ requireStableProxyEgress,
1654
1862
  withTimeoutCleanup,
1655
1863
  AUTOMATION_LIMITS: {
1656
1864
  registrationHardTimeoutMs: CODEBUDDY_CN_ACCOUNT_HARD_TIMEOUT_MS,
@@ -1665,5 +1873,6 @@ export const __test__ = {
1665
1873
  lowMemoryManualTimeoutMs: CODEBUDDY_CN_LOW_MEM_MANUAL_TIMEOUT_MS,
1666
1874
  resourceCloseTimeoutMs: CODEBUDDY_CN_RESOURCE_CLOSE_TIMEOUT_MS,
1667
1875
  fiveSimSettleTimeoutMs: CODEBUDDY_CN_FIVESIM_SETTLE_TIMEOUT_MS,
1876
+ egressProbeTimeoutMs: CODEBUDDY_CN_EGRESS_PROBE_TIMEOUT_MS,
1668
1877
  },
1669
1878
  };
@@ -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
- opts.profile === "codebuddy-cn" ||
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
- // Regional profile CodeBuddy CN / Tencent risk engine scores EN-US + CN IP heavily.
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 } // Shanghai
452
- : { longitude: 114.1694, latitude: 22.3193 }; // Hong Kong
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;