zevairouter 1.0.148 → 1.0.150

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