zevairouter 1.0.149 → 1.0.150

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (315) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/cli/app/.next-cli-build/BUILD_ID +1 -1
  3. package/cli/app/.next-cli-build/app-path-routes-manifest.json +10 -10
  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 +10 -10
  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-104e711e028e5a60.js → 620-4698719a19477138.js} +1 -1
  307. package/cli/app/CHANGELOG.md +7 -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 +211 -7
  313. package/src/lib/oauth/services/kiroBulkImportManager.js +12 -9
  314. /package/cli/app/.next-cli-build/static/{w0fFe0wlenV7JedZI_N94 → STIs6ehtw793h3BxKhNWo}/_buildManifest.js +0 -0
  315. /package/cli/app/.next-cli-build/static/{w0fFe0wlenV7JedZI_N94 → STIs6ehtw793h3BxKhNWo}/_ssgManifest.js +0 -0
@@ -1,3 +1,10 @@
1
+ # v1.0.150 (2026-07-27)
2
+
3
+ ## Fixes
4
+ - **Coherent pasted-proxy browser identity**: CodeBuddy CN manual-proxy jobs now preserve CloakBrowser's binary-level exit IP, WebRTC, timezone, locale, and native viewport instead of overwriting them from the SMS number region.
5
+ - **Safe sticky-egress preflight**: manual proxies are verified against multiple exit-IP services at launch and immediately before the 5sim purchase, so unverifiable, rotating, or changed exits fail before a phone number is ordered.
6
+ - **Isolated manual registrations**: pasted-proxy jobs enforce one worker and recycle the complete CloakBrowser process between accounts, including cleanup after unexpected worker failures, without changing Proxy Pool selection or data.
7
+
1
8
  # v1.0.149 (2026-07-27)
2
9
 
3
10
  ## Fixes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zevairouter",
3
- "version": "1.0.149",
3
+ "version": "1.0.150",
4
4
  "description": "Self-hosted AI router: many providers, one OpenAI-compatible /v1 endpoint and dashboard",
5
5
  "bin": {
6
6
  "zevai": "./cli/cli.js"
package/cli/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zevairouter-cli",
3
- "version": "1.0.149",
3
+ "version": "1.0.150",
4
4
  "description": "ZevaiRouter CLI - Start and manage ZevaiRouter server",
5
5
  "bin": {
6
6
  "zevai": "./cli.js"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zevairouter",
3
- "version": "1.0.149",
3
+ "version": "1.0.150",
4
4
  "description": "Self-hosted AI router: many providers, one OpenAI-compatible /v1 endpoint and dashboard",
5
5
  "bin": {
6
6
  "zevai": "./cli/cli.js"
@@ -12,6 +12,7 @@ const requireFromHere = createRequire(import.meta.url);
12
12
  export const DEFAULT_BULK_IMPORT_ENGINE = "cloakbrowser";
13
13
 
14
14
  const SUPPORTED_ENGINES = new Set(["cloakbrowser"]);
15
+ const CLOAK_PROXY_PROFILES = new WeakMap();
15
16
 
16
17
  export function normalizeBulkImportEngine(value) {
17
18
  if (typeof value !== "string" || !value.trim()) return DEFAULT_BULK_IMPORT_ENGINE;
@@ -212,7 +213,31 @@ export async function newStealthContext(browser, options = {}) {
212
213
  * Prefer headed (headless=false); Turnstile / Google bot checks often fail headless.
213
214
  * Auto-installs into ~/.zevai/runtime via cloakbrowserRuntime.
214
215
  */
215
- async function launchCloakbrowser({ proxyUrl, headless = false, windowSize = null } = {}) {
216
+ export function extractCloakProxyProfile(args = []) {
217
+ const readFlag = (name) => {
218
+ const prefix = `${name}=`;
219
+ const value = (args || []).find((arg) => String(arg).startsWith(prefix));
220
+ return value ? String(value).slice(prefix.length) : null;
221
+ };
222
+ return {
223
+ egressIp: readFlag("--fingerprint-webrtc-ip"),
224
+ timezone: readFlag("--fingerprint-timezone"),
225
+ locale: readFlag("--fingerprint-locale") || readFlag("--lang"),
226
+ };
227
+ }
228
+
229
+ export function getCloakProxyProfile(browser) {
230
+ return browser && typeof browser === "object"
231
+ ? CLOAK_PROXY_PROFILES.get(browser) || null
232
+ : null;
233
+ }
234
+
235
+ async function launchCloakbrowser({
236
+ proxyUrl,
237
+ headless = false,
238
+ windowSize = null,
239
+ requireProxyGeoip = false,
240
+ } = {}) {
216
241
  const { ensureDisplayForHeadedBrowser } = await import("./displayEnv.js");
217
242
 
218
243
  const runtime = loadRuntimeHelper("cloakbrowserRuntime");
@@ -259,18 +284,65 @@ async function launchCloakbrowser({ proxyUrl, headless = false, windowSize = nul
259
284
  launchOpts.geoip = true;
260
285
  }
261
286
  if (windowSize?.width && windowSize?.height) {
262
- launchOpts.viewport = { width: windowSize.width, height: windowSize.height };
287
+ // Keep headed contexts at viewport:null so dimensions follow the real Xvfb
288
+ // window. A Playwright viewport here overrides CloakBrowser's coherent window.
289
+ launchOpts.args = [`--window-size=${windowSize.width},${windowSize.height}`];
290
+ }
291
+
292
+ let effectiveLaunchOpts = launchOpts;
293
+ let proxyProfile = null;
294
+ if (proxyUrl && requireProxyGeoip) {
295
+ if (typeof cloak.buildLaunchOptions !== "function") {
296
+ const error = new Error("CloakBrowser runtime cannot verify proxy GeoIP before launch");
297
+ error.code = "CLOAKBROWSER_PROXY_GEOIP_UNSUPPORTED";
298
+ throw error;
299
+ }
300
+ // Slow residential CONNECT handshakes regularly exceed CloakBrowser's 5s
301
+ // default. Resolve once with a bounded 12s budget, then reuse those flags.
302
+ const previousGeoipTimeout = process.env.CLOAKBROWSER_GEOIP_TIMEOUT_SECONDS;
303
+ if (!previousGeoipTimeout) process.env.CLOAKBROWSER_GEOIP_TIMEOUT_SECONDS = "12";
304
+ let resolved;
305
+ try {
306
+ resolved = await cloak.buildLaunchOptions(launchOpts);
307
+ } finally {
308
+ if (previousGeoipTimeout === undefined) {
309
+ delete process.env.CLOAKBROWSER_GEOIP_TIMEOUT_SECONDS;
310
+ } else {
311
+ process.env.CLOAKBROWSER_GEOIP_TIMEOUT_SECONDS = previousGeoipTimeout;
312
+ }
313
+ }
314
+ proxyProfile = extractCloakProxyProfile(resolved?.args || []);
315
+ if (!proxyProfile.egressIp || !proxyProfile.timezone || !proxyProfile.locale) {
316
+ const error = new Error(
317
+ "Manual proxy exit GeoIP could not be verified; no phone number was purchased",
318
+ );
319
+ error.code = "CLOAKBROWSER_PROXY_GEOIP_UNAVAILABLE";
320
+ throw error;
321
+ }
322
+ effectiveLaunchOpts = {
323
+ ...launchOpts,
324
+ args: resolved.args || launchOpts.args,
325
+ geoip: false,
326
+ };
263
327
  }
264
328
 
265
329
  try {
266
330
  // Do not wrap with stock stealth scripts — CloakBrowser patches at binary level.
267
- return await cloak.launch(launchOpts);
331
+ const browser = await cloak.launch(effectiveLaunchOpts);
332
+ if (proxyProfile) {
333
+ CLOAK_PROXY_PROFILES.set(browser, Object.freeze({ ...proxyProfile }));
334
+ }
335
+ return browser;
268
336
  } catch (error) {
269
337
  const msg = String(error?.message || error || "");
270
338
  if (!useHeadless && /XServer|DISPLAY|Missing X server|headed browser|no DISPLAY/i.test(msg)) {
271
339
  const display = ensureDisplayForHeadedBrowser();
272
340
  if (display.ok) {
273
- return cloak.launch(launchOpts);
341
+ const browser = await cloak.launch(effectiveLaunchOpts);
342
+ if (proxyProfile) {
343
+ CLOAK_PROXY_PROFILES.set(browser, Object.freeze({ ...proxyProfile }));
344
+ }
345
+ return browser;
274
346
  }
275
347
  const friendly = new Error(
276
348
  `${msg}\n\nVPS has no display. Install a virtual screen then retry:\n` +
@@ -299,6 +371,7 @@ export async function launchBulkImportBrowser({
299
371
  proxyUrl,
300
372
  headless = false,
301
373
  windowSize = null,
374
+ requireProxyGeoip = false,
302
375
  } = {}) {
303
376
  // engine arg kept for API compatibility; always cloakbrowser.
304
377
  void normalizeBulkImportEngine(engine);
@@ -306,6 +379,7 @@ export async function launchBulkImportBrowser({
306
379
  proxyUrl,
307
380
  headless: headless === true,
308
381
  windowSize,
382
+ requireProxyGeoip,
309
383
  });
310
384
  }
311
385
 
@@ -18,6 +18,7 @@
18
18
  */
19
19
 
20
20
  import { randomUUID } from "crypto";
21
+ import net from "node:net";
21
22
  import {
22
23
  KiroBulkImportManager,
23
24
  buildLookupResponse,
@@ -40,7 +41,10 @@ import {
40
41
  defaultPollForToken,
41
42
  fetchCodeBuddyLoginAccount,
42
43
  } from "./codebuddyBulkImportManager.js";
43
- import { 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,8 +86,14 @@ const CODEBUDDY_CN_MANUAL_TIMEOUT_MS = 8 * 60_000;
82
86
  const CODEBUDDY_CN_LOW_MEM_MANUAL_TIMEOUT_MS = 3 * 60_000;
83
87
  const CODEBUDDY_CN_RESOURCE_CLOSE_TIMEOUT_MS = 5_000;
84
88
  const CODEBUDDY_CN_FIVESIM_SETTLE_TIMEOUT_MS = 12_000;
89
+ const CODEBUDDY_CN_EGRESS_PROBE_TIMEOUT_MS = 6_000;
85
90
  const CODEBUDDY_CN_API_KEY_OUTCOME_UNKNOWN = "CN_API_KEY_OUTCOME_UNKNOWN";
86
91
  const CODEBUDDY_CN_ACCOUNT_RESTRICTED = "CN_ACCOUNT_RESTRICTED";
92
+ const CODEBUDDY_CN_EGRESS_ECHO_URLS = [
93
+ "https://api.ipify.org",
94
+ "https://checkip.amazonaws.com",
95
+ "https://ifconfig.me/ip",
96
+ ];
87
97
 
88
98
  // Supported 5sim regions
89
99
  const SUPPORTED_REGIONS = new Set(["hongkong", "china", "any"]);
@@ -127,6 +137,96 @@ function clampCnConcurrency(value) {
127
137
  return Math.min(hardMax, Math.max(CODEBUDDY_CN_MIN_CONCURRENCY, parsed));
128
138
  }
129
139
 
140
+ function resolveCnJobConcurrency(value, { manualProxy = false } = {}) {
141
+ return manualProxy ? 1 : clampCnConcurrency(value);
142
+ }
143
+
144
+ function parseEgressIp(value) {
145
+ const raw = String(value || "").trim();
146
+ if (net.isIP(raw)) return raw;
147
+ try {
148
+ const parsed = JSON.parse(raw);
149
+ const ip = String(parsed?.ip || parsed?.query || "").trim();
150
+ return net.isIP(ip) ? ip : null;
151
+ } catch {
152
+ return null;
153
+ }
154
+ }
155
+
156
+ async function probeCodeBuddyProxyEgress(
157
+ context,
158
+ { timeoutMs = CODEBUDDY_CN_EGRESS_PROBE_TIMEOUT_MS } = {},
159
+ ) {
160
+ let requestContext = null;
161
+ try {
162
+ requestContext = context?.request || null;
163
+ } catch {
164
+ requestContext = null;
165
+ }
166
+ if (!requestContext || typeof requestContext.get !== "function") {
167
+ return { ok: false, ip: null, ips: [], samples: 0, error: "context request unavailable" };
168
+ }
169
+
170
+ const results = await Promise.all(CODEBUDDY_CN_EGRESS_ECHO_URLS.map(async (url) => {
171
+ let response = null;
172
+ try {
173
+ response = await requestContext.get(url, {
174
+ timeout: timeoutMs,
175
+ failOnStatusCode: false,
176
+ headers: {
177
+ Accept: "text/plain, application/json;q=0.9, */*;q=0.1",
178
+ "Cache-Control": "no-cache",
179
+ },
180
+ });
181
+ if (response.status() < 200 || response.status() >= 300) return null;
182
+ return parseEgressIp(await response.text().catch(() => ""));
183
+ } catch {
184
+ return null;
185
+ } finally {
186
+ if (typeof response?.dispose === "function") {
187
+ await Promise.resolve(response.dispose()).catch(() => null);
188
+ }
189
+ }
190
+ }));
191
+
192
+ const successful = results.filter(Boolean);
193
+ const ips = [...new Set(successful)];
194
+ return {
195
+ ok: ips.length === 1,
196
+ ip: ips.length === 1 ? ips[0] : null,
197
+ ips,
198
+ samples: successful.length,
199
+ unstable: ips.length > 1,
200
+ error: ips.length === 0
201
+ ? "all exit-IP services failed"
202
+ : ips.length > 1
203
+ ? `proxy returned ${ips.length} exit IPs in one probe`
204
+ : null,
205
+ };
206
+ }
207
+
208
+ function requireStableProxyEgress(probe, expectedIp = null) {
209
+ if (probe?.unstable) {
210
+ throw Object.assign(
211
+ new Error("Manual proxy rotated between exit IPs during preflight; no phone number was purchased"),
212
+ { code: "CN_PROXY_EGRESS_UNSTABLE" },
213
+ );
214
+ }
215
+ if (!probe?.ok || !probe?.ip) {
216
+ throw Object.assign(
217
+ new Error(`Manual proxy exit IP could not be verified (${probe?.error || "no response"}); no phone number was purchased`),
218
+ { code: "CN_PROXY_EGRESS_UNVERIFIED" },
219
+ );
220
+ }
221
+ if (expectedIp && probe.ip !== expectedIp) {
222
+ throw Object.assign(
223
+ new Error("Manual proxy exit IP changed after CloakBrowser GeoIP alignment; no phone number was purchased"),
224
+ { code: "CN_PROXY_EGRESS_CHANGED" },
225
+ );
226
+ }
227
+ return probe.ip;
228
+ }
229
+
130
230
  async function withTimeoutCleanup(
131
231
  task,
132
232
  {
@@ -388,6 +488,7 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
388
488
  proxyUrl,
389
489
  headless,
390
490
  windowSize: { width: 1280, height: 900 },
491
+ requireProxyGeoip: job?.proxyPoolMode === "manual" && Boolean(proxyUrl),
391
492
  });
392
493
  return withTimeoutCleanup(launchTask, {
393
494
  timeoutMs: CODEBUDDY_CN_BROWSER_LAUNCH_TIMEOUT_MS,
@@ -472,7 +573,7 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
472
573
  const job = {
473
574
  jobId,
474
575
  status: "running",
475
- concurrency: clampCnConcurrency(concurrency),
576
+ concurrency: resolveCnJobConcurrency(concurrency, { manualProxy: Boolean(manualProxy) }),
476
577
  proxyPoolMode: manualProxy ? "manual" : (proxyPoolMode || "none"),
477
578
  proxyUrls,
478
579
  region: resolvedRegion,
@@ -496,6 +597,9 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
496
597
  // Unique Chromium fingerprint seed per account (viewport/HW/screen noise).
497
598
  fingerprintSeed: randomUUID(),
498
599
  proxyUrl: null,
600
+ egressIp: null,
601
+ proxyTimezone: null,
602
+ proxyLocale: null,
499
603
  abortController: new AbortController(),
500
604
  status: "queued",
501
605
  error: null,
@@ -544,6 +648,7 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
544
648
  let fiveSimOrderId = null;
545
649
  let smsReceived = false;
546
650
  let context = null;
651
+ let verifiedEgressIp = null;
547
652
 
548
653
  try {
549
654
  // Step 1: Get 5sim API key from settings
@@ -569,16 +674,14 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
569
674
  // Step 2: Create browser context FIRST — if proxy/browser fails, we never buy a number.
570
675
  this.setAccountStep(account, "creating_browser", "Creating browser context (before 5sim order)");
571
676
  await this.persistJobSnapshot(job, { forcePreview: true });
572
- // CloakBrowser 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();
677
+ // CloakBrowser owns the process-wide fingerprint, timezone, locale, and
678
+ // WebRTC profile. Playwright context overrides would reintroduce CDP tells.
577
679
  const contextTask = createFreshContext(job.browser, account.proxyUrl, {
578
680
  profile: "codebuddy-cn",
579
681
  region: job.region || "hongkong",
580
682
  fingerprintSeed: account.fingerprintSeed,
581
683
  lowMemory: isLowMemHost(),
684
+ nativeCloakProfile: job.proxyPoolMode === "manual",
582
685
  });
583
686
  const freshContext = await withTimeoutCleanup(contextTask, {
584
687
  timeoutMs: CODEBUDDY_CN_CONTEXT_TIMEOUT_MS,
@@ -590,6 +693,27 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
590
693
  const page = freshContext.page;
591
694
  account.runtimeSession = { context, page };
592
695
 
696
+ if (job.proxyPoolMode === "manual" && account.proxyUrl) {
697
+ this.setAccountStep(
698
+ account,
699
+ "checking_proxy_egress",
700
+ "Verifying pasted proxy exit IP before opening the registration form",
701
+ );
702
+ await this.persistJobSnapshot(job, { forcePreview: false });
703
+ const launchProfile = getCloakProxyProfile(job.browser);
704
+ const egressProbe = await probeCodeBuddyProxyEgress(context);
705
+ verifiedEgressIp = requireStableProxyEgress(egressProbe, launchProfile?.egressIp || null);
706
+ account.egressIp = verifiedEgressIp;
707
+ account.proxyTimezone = launchProfile?.timezone || null;
708
+ account.proxyLocale = launchProfile?.locale || null;
709
+ this.setAccountStep(
710
+ account,
711
+ "proxy_egress_ready",
712
+ `Manual proxy verified: ${verifiedEgressIp} (${egressProbe.samples} checks, ${account.proxyTimezone || "timezone unknown"}, ${account.proxyLocale || "locale unknown"})`,
713
+ );
714
+ await this.persistJobSnapshot(job, { forcePreview: false });
715
+ }
716
+
593
717
  if (job.cancelRequested) {
594
718
  throw new Error("Job cancelled before ordering phone number");
595
719
  }
@@ -636,6 +760,22 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
636
760
  if (job.cancelRequested) {
637
761
  throw new Error("Job cancelled before ordering phone number");
638
762
  }
763
+ if (job.proxyPoolMode === "manual" && account.proxyUrl) {
764
+ this.setAccountStep(
765
+ account,
766
+ "rechecking_proxy_egress",
767
+ "Registration form is ready — confirming the pasted proxy stayed sticky",
768
+ );
769
+ await this.persistJobSnapshot(job, { forcePreview: false });
770
+ const secondProbe = await probeCodeBuddyProxyEgress(context);
771
+ requireStableProxyEgress(secondProbe, verifiedEgressIp);
772
+ this.setAccountStep(
773
+ account,
774
+ "proxy_egress_confirmed",
775
+ `Manual proxy remained on ${verifiedEgressIp}; safe to purchase one phone number`,
776
+ );
777
+ await this.persistJobSnapshot(job, { forcePreview: false });
778
+ }
639
779
  this.setAccountStep(
640
780
  account,
641
781
  "ordering_number",
@@ -1483,6 +1623,62 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
1483
1623
  job.manualFollowups.add(followupPromise);
1484
1624
  }
1485
1625
 
1626
+ /**
1627
+ * A pasted proxy is intentionally single-worker. Recycle the whole CloakBrowser
1628
+ * process between accounts so its binary fingerprint and GeoIP profile cannot
1629
+ * leak from one registration into the next.
1630
+ */
1631
+ async runWorker(job, workerId) {
1632
+ if (job.proxyPoolMode !== "manual") {
1633
+ return super.runWorker(job, workerId);
1634
+ }
1635
+
1636
+ while (!job.cancelRequested) {
1637
+ const account = this.dequeueAccount(job, workerId);
1638
+ if (!account) return;
1639
+
1640
+ if (!job.browser) {
1641
+ try {
1642
+ job.browser = await this.browserLauncher({
1643
+ ...job,
1644
+ proxyUrls: account.proxyUrl ? [account.proxyUrl] : job.proxyUrls,
1645
+ });
1646
+ } catch (error) {
1647
+ this.finalizeAccount(account, "failed", {
1648
+ error: error?.message || "Manual proxy browser launch failed",
1649
+ step: "failed",
1650
+ message: error?.message || "Manual proxy browser launch failed",
1651
+ });
1652
+ await this.persistJobSnapshot(job, { forcePreview: true });
1653
+ continue;
1654
+ }
1655
+ }
1656
+
1657
+ try {
1658
+ await this.processAccount(job, account, workerId);
1659
+ } catch (error) {
1660
+ if (account.status === "running") {
1661
+ this.finalizeAccount(account, "failed", {
1662
+ error: error?.message || "Unexpected manual proxy worker failure",
1663
+ step: "failed",
1664
+ message: error?.message || "Unexpected manual proxy worker failure",
1665
+ });
1666
+ await this.persistJobSnapshot(job, { forcePreview: true });
1667
+ }
1668
+ } finally {
1669
+ if (job.manualFollowups.size > 0) {
1670
+ await Promise.allSettled([...job.manualFollowups]);
1671
+ }
1672
+
1673
+ if (job.browser) {
1674
+ const browser = job.browser;
1675
+ job.browser = null;
1676
+ await forceCloseBrowser(browser).catch(() => null);
1677
+ }
1678
+ }
1679
+ }
1680
+ }
1681
+
1486
1682
  /**
1487
1683
  * Override cancelJob to abort in-flight 5sim polls AND force-close the browser.
1488
1684
  * Previous CN override only aborted controllers — Chromium kept spinning (VPS hang).
@@ -1589,6 +1785,9 @@ function sanitizeCnJob(job, extras = {}) {
1589
1785
  phone: account.phone,
1590
1786
  fiveSimOrderId: account.fiveSimOrderId,
1591
1787
  proxyUrl: account.proxyUrl ? maskProxyUrl(account.proxyUrl) : null,
1788
+ egressIp: account.egressIp || null,
1789
+ proxyTimezone: account.proxyTimezone || null,
1790
+ proxyLocale: account.proxyLocale || null,
1592
1791
  status: account.status,
1593
1792
  error: account.error,
1594
1793
  connectionId: account.connectionId,
@@ -1643,14 +1842,18 @@ export {
1643
1842
 
1644
1843
  export const __test__ = {
1645
1844
  clampCnConcurrency,
1845
+ resolveCnJobConcurrency,
1646
1846
  sanitizeCnJob,
1647
1847
  defaultPhoneFormatter,
1648
1848
  defaultSaveCodeBuddyCnConnection,
1649
1849
  buildCnSummary,
1650
1850
  hasRestrictedConsoleEvidence,
1651
1851
  isLoginHtmlProbe,
1852
+ parseEgressIp,
1652
1853
  parseConsoleProbeBody,
1854
+ probeCodeBuddyProxyEgress,
1653
1855
  probeCodeBuddyConsoleAccounts,
1856
+ requireStableProxyEgress,
1654
1857
  withTimeoutCleanup,
1655
1858
  AUTOMATION_LIMITS: {
1656
1859
  registrationHardTimeoutMs: CODEBUDDY_CN_ACCOUNT_HARD_TIMEOUT_MS,
@@ -1665,5 +1868,6 @@ export const __test__ = {
1665
1868
  lowMemoryManualTimeoutMs: CODEBUDDY_CN_LOW_MEM_MANUAL_TIMEOUT_MS,
1666
1869
  resourceCloseTimeoutMs: CODEBUDDY_CN_RESOURCE_CLOSE_TIMEOUT_MS,
1667
1870
  fiveSimSettleTimeoutMs: CODEBUDDY_CN_FIVESIM_SETTLE_TIMEOUT_MS,
1871
+ egressProbeTimeoutMs: CODEBUDDY_CN_EGRESS_PROBE_TIMEOUT_MS,
1668
1872
  },
1669
1873
  };
@@ -384,10 +384,13 @@ export { parsePlaywrightProxy };
384
384
  * @param {"hongkong"|"china"|string} [opts.region] Used by codebuddy-cn profile
385
385
  * @param {string|number} [opts.fingerprintSeed] Per-account seed for viewport/HW fingerprint
386
386
  * @param {boolean} [opts.randomizeFingerprint] Force fingerprint even outside codebuddy-cn
387
+ * @param {boolean} [opts.nativeCloakProfile] Keep CloakBrowser's binary profile untouched
387
388
  */
388
389
  export async function createFreshContext(browser, proxy, opts = {}) {
389
390
  let effectiveProxy = proxy;
390
391
  let socksBridge = null;
392
+ const useNativeCloakProfile =
393
+ opts.profile === "codebuddy-cn" && opts.nativeCloakProfile === true;
391
394
 
392
395
  // Chromium cannot authenticate SOCKS5 — bridge to local HTTP proxy first
393
396
  if (proxy) {
@@ -406,9 +409,8 @@ export async function createFreshContext(browser, proxy, opts = {}) {
406
409
  // Per-account fingerprint (viewport + navigator.* + screen) via init script.
407
410
  // Sticky residential IP alone still clusters if every session shares the same HW profile.
408
411
  const wantFingerprint =
409
- 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;