zevairouter 1.0.148 → 1.0.149

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