zevairouter 1.0.110 → 1.0.112

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 (320) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/cli/app/.next-cli-build/BUILD_ID +1 -1
  3. package/cli/app/.next-cli-build/app-path-routes-manifest.json +7 -7
  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/models/test/route.js +1 -1
  51. package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/bulk-import/route.js +1 -1
  52. package/cli/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js +1 -1
  53. package/cli/app/.next-cli-build/server/app/api/providers/route.js +1 -1
  54. package/cli/app/.next-cli-build/server/app/api/providers/validate/route.js +1 -1
  55. package/cli/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
  56. package/cli/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
  57. package/cli/app/.next-cli-build/server/app/api/version/route.js +1 -1
  58. package/cli/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
  59. package/cli/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
  60. package/cli/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
  61. package/cli/app/.next-cli-build/server/app/callback.html +1 -1
  62. package/cli/app/.next-cli-build/server/app/callback.rsc +3 -3
  63. package/cli/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +3 -3
  64. package/cli/app/.next-cli-build/server/app/callback.segments/_head.segment.rsc +1 -1
  65. package/cli/app/.next-cli-build/server/app/callback.segments/_index.segment.rsc +3 -3
  66. package/cli/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +1 -1
  67. package/cli/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
  68. package/cli/app/.next-cli-build/server/app/callback.segments/callback.segment.rsc +1 -1
  69. package/cli/app/.next-cli-build/server/app/dashboard/automation.html +1 -1
  70. package/cli/app/.next-cli-build/server/app/dashboard/automation.rsc +5 -5
  71. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard/automation/__PAGE__.segment.rsc +2 -2
  72. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard/automation.segment.rsc +1 -1
  73. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  74. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  75. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_full.segment.rsc +5 -5
  76. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_head.segment.rsc +1 -1
  77. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_index.segment.rsc +3 -3
  78. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_tree.segment.rsc +1 -1
  79. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
  80. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +5 -5
  81. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
  82. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
  83. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  84. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  85. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +5 -5
  86. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
  87. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_index.segment.rsc +3 -3
  88. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +1 -1
  89. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
  90. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +5 -5
  91. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
  92. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
  93. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  94. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  95. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +5 -5
  96. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
  97. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_index.segment.rsc +3 -3
  98. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +1 -1
  99. package/cli/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
  100. package/cli/app/.next-cli-build/server/app/dashboard/combos.rsc +5 -5
  101. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
  102. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
  103. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  104. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  105. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +5 -5
  106. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
  107. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_index.segment.rsc +3 -3
  108. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +1 -1
  109. package/cli/app/.next-cli-build/server/app/dashboard/context.html +1 -1
  110. package/cli/app/.next-cli-build/server/app/dashboard/context.rsc +5 -5
  111. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard/context/__PAGE__.segment.rsc +2 -2
  112. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard/context.segment.rsc +1 -1
  113. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  114. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  115. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_full.segment.rsc +5 -5
  116. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_head.segment.rsc +1 -1
  117. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_index.segment.rsc +3 -3
  118. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_tree.segment.rsc +1 -1
  119. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
  120. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.rsc +5 -5
  121. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
  122. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
  123. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  124. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  125. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +5 -5
  126. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
  127. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_index.segment.rsc +3 -3
  128. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +1 -1
  129. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
  130. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +5 -5
  131. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +2 -2
  132. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web.segment.rsc +1 -1
  133. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
  134. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  135. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  136. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +5 -5
  137. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_head.segment.rsc +1 -1
  138. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_index.segment.rsc +3 -3
  139. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +1 -1
  140. package/cli/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
  141. package/cli/app/.next-cli-build/server/app/dashboard/mitm.rsc +5 -5
  142. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
  143. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
  144. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  145. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  146. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +5 -5
  147. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
  148. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_index.segment.rsc +3 -3
  149. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +1 -1
  150. package/cli/app/.next-cli-build/server/app/dashboard/playground.html +1 -1
  151. package/cli/app/.next-cli-build/server/app/dashboard/playground.rsc +5 -5
  152. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard/playground/__PAGE__.segment.rsc +2 -2
  153. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard/playground.segment.rsc +1 -1
  154. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  155. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  156. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_full.segment.rsc +5 -5
  157. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_head.segment.rsc +1 -1
  158. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_index.segment.rsc +3 -3
  159. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_tree.segment.rsc +1 -1
  160. package/cli/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
  161. package/cli/app/.next-cli-build/server/app/dashboard/profile.rsc +5 -5
  162. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
  163. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
  164. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  165. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  166. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +5 -5
  167. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
  168. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_index.segment.rsc +3 -3
  169. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +1 -1
  170. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
  171. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.rsc +5 -5
  172. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
  173. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
  174. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  175. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  176. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  177. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +5 -5
  178. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
  179. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_index.segment.rsc +3 -3
  180. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +1 -1
  181. package/cli/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
  182. package/cli/app/.next-cli-build/server/app/dashboard/providers.rsc +5 -5
  183. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
  184. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  185. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  186. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  187. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +5 -5
  188. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
  189. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_index.segment.rsc +3 -3
  190. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +1 -1
  191. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
  192. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +5 -5
  193. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
  194. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
  195. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  196. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  197. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +5 -5
  198. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
  199. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +3 -3
  200. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +1 -1
  201. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.html +1 -1
  202. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.rsc +5 -5
  203. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe/__PAGE__.segment.rsc +2 -2
  204. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe.segment.rsc +1 -1
  205. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  206. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  207. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_full.segment.rsc +5 -5
  208. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_head.segment.rsc +1 -1
  209. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_index.segment.rsc +3 -3
  210. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_tree.segment.rsc +1 -1
  211. package/cli/app/.next-cli-build/server/app/dashboard/quota.html +2 -2
  212. package/cli/app/.next-cli-build/server/app/dashboard/quota.rsc +6 -6
  213. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +3 -3
  214. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
  215. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  216. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  217. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +6 -6
  218. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
  219. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_index.segment.rsc +3 -3
  220. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +1 -1
  221. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  222. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
  223. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +3 -3
  224. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +3 -3
  225. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
  226. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +3 -3
  227. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +1 -1
  228. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
  229. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
  230. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
  231. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
  232. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.html +1 -1
  233. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.rsc +5 -5
  234. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +2 -2
  235. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver.segment.rsc +1 -1
  236. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  237. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  238. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_full.segment.rsc +5 -5
  239. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_head.segment.rsc +1 -1
  240. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_index.segment.rsc +3 -3
  241. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_tree.segment.rsc +1 -1
  242. package/cli/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
  243. package/cli/app/.next-cli-build/server/app/dashboard/translator.rsc +5 -5
  244. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
  245. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
  246. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  247. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  248. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +5 -5
  249. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
  250. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_index.segment.rsc +3 -3
  251. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +1 -1
  252. package/cli/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
  253. package/cli/app/.next-cli-build/server/app/dashboard/usage.rsc +5 -5
  254. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
  255. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
  256. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  257. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  258. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +5 -5
  259. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
  260. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_index.segment.rsc +3 -3
  261. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +1 -1
  262. package/cli/app/.next-cli-build/server/app/dashboard.html +1 -1
  263. package/cli/app/.next-cli-build/server/app/dashboard.rsc +5 -5
  264. package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
  265. package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  266. package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  267. package/cli/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +5 -5
  268. package/cli/app/.next-cli-build/server/app/dashboard.segments/_head.segment.rsc +1 -1
  269. package/cli/app/.next-cli-build/server/app/dashboard.segments/_index.segment.rsc +3 -3
  270. package/cli/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +1 -1
  271. package/cli/app/.next-cli-build/server/app/index.html +1 -1
  272. package/cli/app/.next-cli-build/server/app/index.rsc +3 -3
  273. package/cli/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  274. package/cli/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +3 -3
  275. package/cli/app/.next-cli-build/server/app/index.segments/_head.segment.rsc +1 -1
  276. package/cli/app/.next-cli-build/server/app/index.segments/_index.segment.rsc +3 -3
  277. package/cli/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +1 -1
  278. package/cli/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
  279. package/cli/app/.next-cli-build/server/app/landing.html +1 -1
  280. package/cli/app/.next-cli-build/server/app/landing.rsc +3 -3
  281. package/cli/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +3 -3
  282. package/cli/app/.next-cli-build/server/app/landing.segments/_head.segment.rsc +1 -1
  283. package/cli/app/.next-cli-build/server/app/landing.segments/_index.segment.rsc +3 -3
  284. package/cli/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +1 -1
  285. package/cli/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +1 -1
  286. package/cli/app/.next-cli-build/server/app/landing.segments/landing.segment.rsc +1 -1
  287. package/cli/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
  288. package/cli/app/.next-cli-build/server/app/login.html +1 -1
  289. package/cli/app/.next-cli-build/server/app/login.rsc +4 -4
  290. package/cli/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +4 -4
  291. package/cli/app/.next-cli-build/server/app/login.segments/_head.segment.rsc +1 -1
  292. package/cli/app/.next-cli-build/server/app/login.segments/_index.segment.rsc +3 -3
  293. package/cli/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +1 -1
  294. package/cli/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  295. package/cli/app/.next-cli-build/server/app/login.segments/login.segment.rsc +1 -1
  296. package/cli/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
  297. package/cli/app/.next-cli-build/server/app-paths-manifest.json +7 -7
  298. package/cli/app/.next-cli-build/server/chunks/3155.js +1 -1
  299. package/cli/app/.next-cli-build/server/chunks/3407.js +1 -1
  300. package/cli/app/.next-cli-build/server/chunks/412.js +1 -1
  301. package/cli/app/.next-cli-build/server/chunks/4746.js +1 -1
  302. package/cli/app/.next-cli-build/server/chunks/6896.js +1 -1
  303. package/cli/app/.next-cli-build/server/chunks/8371.js +1 -1
  304. package/cli/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
  305. package/cli/app/.next-cli-build/server/middleware.js +1 -1
  306. package/cli/app/.next-cli-build/server/pages/404.html +1 -1
  307. package/cli/app/.next-cli-build/server/pages/500.html +1 -1
  308. package/cli/app/.next-cli-build/static/chunks/{3702-75768c44a4c60005.js → 3702-c51727f16ee4ce40.js} +1 -1
  309. package/cli/app/.next-cli-build/static/chunks/{5497-3ba9ab4bf3a9facb.js → 5497-bc9dbb3f8c0e03af.js} +1 -1
  310. package/cli/app/CHANGELOG.md +11 -0
  311. package/cli/app/package.json +1 -1
  312. package/cli/package.json +1 -1
  313. package/package.json +1 -1
  314. package/src/app/api/oauth/codebuddy-cn/bulk-import/route.js +1 -0
  315. package/src/dashboardGuard.js +3 -1
  316. package/src/lib/oauth/services/codebuddyCnBulkImportManager.js +37 -9
  317. package/src/lib/oauth/services/codebuddyCnPhoneAutomation.js +19 -3
  318. package/src/shared/components/CodeBuddyCnPhoneRegisterModal.js +17 -2
  319. /package/cli/app/.next-cli-build/static/{-vY51mS-VaNLvQLi9SSDj → vxKMMzG3TCmmTGqCkXv7N}/_buildManifest.js +0 -0
  320. /package/cli/app/.next-cli-build/static/{-vY51mS-VaNLvQLi9SSDj → vxKMMzG3TCmmTGqCkXv7N}/_ssgManifest.js +0 -0
@@ -1,7 +1,18 @@
1
+ # v1.0.112 (2026-07-21)
2
+
3
+ ## Features
4
+ - **CodeBuddy CN bulk import — manual proxy URL**: the automation previously only accepted proxies from DB proxy pools (`proxyPoolMode` + `proxyPoolId`). The register modal now has a "Manual Proxy URL" field — paste any `http(s)://` or `socks4/5://` proxy (e.g. a sticky residential URL you haven't added to a pool) and it takes precedence over pool selection (dropdown auto-disables). The manager validates the scheme, marks the job `proxyPoolMode: "manual"`, and every account in the job runs through that proxy.
5
+
6
+ # v1.0.111 (2026-07-21)
7
+
8
+ ## Fixes
9
+ - **CodeBuddy CN bulk import — SPA "did not boot" + API key 401** (re-release): v1.0.110 was published before these changes were committed, so the live build never contained them. This release ships them. (1) Tencent's privacy-consent dialog (a `同意` button) gates the login UI depending on the egress IP — the automation now waits up to 6s for the consent button and dismisses it (logs `cn_consent_dismissed`) before the normal SPA-ready wait, instead of timing out with `html=2670`. (2) API key creation now retries up to 3 rounds on 401/403 (openresty edge rejecting half-synced Keycloak cookies), nudging the OIDC re-handoff and waiting for a strong Keycloak session with 8s/16s/24s backoff.
10
+
1
11
  # v1.0.110 (2026-07-21)
2
12
 
3
13
  ## Fixes
4
14
  - **CLI Tools: OpenCode page crash ("This page couldn't load")**: `OpenCodeToolCard` line 72 had a broken optional chain — `status?.config?.agent?.explorer?.model?.startsWith("zevai/") || status.config?.agent...` — when `status` was `null` (tool not installed), the second operand `status.config` threw `TypeError: Cannot read properties of null (reading 'config')` during render, crashing the entire page. Fixed by extracting `explorerModel` with a full optional chain and using it for both the condition and the value. Also added `isOpen` guard to `ModelSelectModal.groupedModels` useMemo to skip heavy per-provider computation when the modal is closed (prevents hydration lag with many connections). Verified with headless-Chrome repro: page renders clean, zero pageerror.
15
+ - **CodeBuddy CN bulk import — SPA "did not boot" + API key 401**: two compounding fixes in the phone-automation flow. (1) Tencent's privacy-consent dialog (a `同意` button) gates the login UI depending on the egress IP — the automation waited for the SPA to be "ready" while the consent modal blocked it, so it timed out with `html=2670`. The flow now waits up to 6s for the consent button, dismisses it (logs `cn_consent_dismissed`), then proceeds with the normal SPA-ready wait. (2) When API key creation returned 401/403 (openresty edge rejecting half-synced Keycloak cookies, common on slow proxies), the flow now retries up to 3 rounds — nudging the OIDC re-handoff and waiting for a strong Keycloak session with 8s/16s/24s backoff — instead of failing on the first attempt. Error messages now surface the edge-proxy-blocked case explicitly.
5
16
 
6
17
  # v1.0.109 (2026-07-21)
7
18
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zevairouter",
3
- "version": "1.0.110",
3
+ "version": "1.0.112",
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.110",
3
+ "version": "1.0.112",
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.110",
3
+ "version": "1.0.112",
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"
@@ -44,6 +44,7 @@ export async function POST(request) {
44
44
  engine: body?.engine,
45
45
  proxyPoolMode: body?.proxyPoolMode,
46
46
  proxyPoolId: body?.proxyPoolId,
47
+ manualProxyUrl: typeof body?.manualProxyUrl === "string" && body.manualProxyUrl.trim() ? body.manualProxyUrl.trim() : null,
47
48
  region,
48
49
  });
49
50
 
@@ -191,10 +191,12 @@ export async function proxy(request) {
191
191
  // Always protected - require valid JWT or local CLI token (machineId-based)
192
192
  if (ALWAYS_PROTECTED.some((p) => pathname.startsWith(p))) {
193
193
  const isTerminalApi = pathname.startsWith("/api/terminal");
194
- // Terminal allows requireLogin=false path (still needs secondary terminal password).
194
+ // Local browser with requireLogin=false can reach sensitive routes (e.g. DB import);
195
+ // remote still requires JWT/CLI token. Same trust level as LOCAL_ONLY_PATHS.
195
196
  const dashboardOk =
196
197
  (await hasValidCliToken(request))
197
198
  || (await hasValidToken(request))
199
+ || (isLocalRequest(request) && (await isAuthenticated(request)))
198
200
  || (isTerminalApi && (await isAuthenticated(request)));
199
201
 
200
202
  if (!dashboardOk) {
@@ -204,7 +204,7 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
204
204
  * @param {string} [opts.proxyPoolId]
205
205
  * @param {string} [opts.region] 5sim region (hongkong|china|any)
206
206
  */
207
- async startJob({ count, concurrency, engine, proxyPoolMode, proxyPoolId, region }) {
207
+ async startJob({ count, concurrency, engine, proxyPoolMode, proxyPoolId, manualProxyUrl, region }) {
208
208
  // Validate count
209
209
  const countNum = Number.parseInt(count, 10);
210
210
  if (!Number.isFinite(countNum) || countNum < 1) {
@@ -232,9 +232,19 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
232
232
  // Validate region
233
233
  const resolvedRegion = SUPPORTED_REGIONS.has(region) ? region : DEFAULT_REGION;
234
234
 
235
- // Resolve proxy pool URLs for round-robin assignment (copy from base)
235
+ // Resolve proxy URLs: manual URL takes precedence over pool selection.
236
236
  let proxyUrls = [];
237
- if (proxyPoolMode === "all") {
237
+ const manualProxy = typeof manualProxyUrl === "string" ? manualProxyUrl.trim() : "";
238
+ if (manualProxy) {
239
+ // Basic scheme check — Playwright needs a parseable http(s)/socks URL.
240
+ if (!/^(https?|socks4|socks5):\/\/.+/i.test(manualProxy)) {
241
+ throw Object.assign(
242
+ new Error("manualProxyUrl must be a valid proxy URL (http://, https://, socks4://, or socks5://)"),
243
+ { error: "manualProxyUrl must be a valid proxy URL (http://, https://, socks4://, or socks5://)" },
244
+ );
245
+ }
246
+ proxyUrls = [manualProxy];
247
+ } else if (proxyPoolMode === "all") {
238
248
  const pools = await getProxyPools({ isActive: true });
239
249
  proxyUrls = pools.map((p) => p.proxyUrl).filter(Boolean);
240
250
  } else if (proxyPoolMode === "single" && proxyPoolId) {
@@ -256,7 +266,7 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
256
266
  status: "running",
257
267
  concurrency: clampCnConcurrency(concurrency),
258
268
  engine: resolvedEngine,
259
- proxyPoolMode: proxyPoolMode || "none",
269
+ proxyPoolMode: manualProxy ? "manual" : (proxyPoolMode || "none"),
260
270
  proxyUrls,
261
271
  region: resolvedRegion,
262
272
  createdAt,
@@ -835,10 +845,16 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
835
845
  apiKeyResult = await createKeyOnPage(PERSONAL_ENTERPRISE_ID).catch(() => null);
836
846
  }
837
847
 
838
- // One more full nudge cycle if key creation returned 401/403 (session half-baked)
839
- const status = apiKeyResult?.status;
840
- if (!apiKeyResult?.ok && (status === 401 || status === 403 || status === 0 || !apiKeyResult)) {
841
- this.setAccountStep(account, "retrying_api_key", "API key 401/403 re-running OIDC handoff then retry");
848
+ // Retry loop on 401/403 openresty edge blocks create-key when Keycloak
849
+ // cookies are half-synced (common on slow proxies). Nudge OIDC handoff,
850
+ // wait for strong session, then retry. Up to 3 rounds with backoff.
851
+ const isAuthBlocked = (r) => !r?.ok && (r?.status === 401 || r?.status === 403 || r?.status === 0 || !r);
852
+ for (let round = 1; round <= 3 && isAuthBlocked(apiKeyResult); round += 1) {
853
+ this.setAccountStep(
854
+ account,
855
+ "retrying_api_key",
856
+ `API key 401/403 — OIDC re-handoff round ${round}/3 (waiting strong session)`,
857
+ );
842
858
  await this.persistJobSnapshot(job, { forcePreview: true });
843
859
  for (const path of [
844
860
  "https://www.codebuddy.cn/",
@@ -848,14 +864,26 @@ export class CodeBuddyCnBulkImportManager extends KiroBulkImportManager {
848
864
  await page.goto(path, { waitUntil: "domcontentloaded", timeout: 45_000 }).catch(() => null);
849
865
  await waitAfterNav();
850
866
  }
867
+ // Wait for strong Keycloak cookie — openresty accepts api-keys only after full session.
868
+ await waitUntil(async () => {
869
+ const snap = await cookieSnapshot();
870
+ return hasStrongKeycloak(snap.names);
871
+ }, { timeout: 8_000 * round, interval: 300 }).catch(() => null);
851
872
  apiKeyResult = await createKeyOnPage(PERSONAL_ENTERPRISE_ID).catch(() => null);
852
873
  }
853
874
 
854
875
  const businessCode = apiKeyResult?.data?.code;
855
876
  const businessOk = businessCode === 0 || businessCode === 200 || typeof businessCode === "undefined";
856
877
  if (!apiKeyResult || !apiKeyResult.ok || !apiKeyResult.data || !businessOk) {
878
+ // Surface openresty HTML block (_raw) clearly instead of opaque "code=n/a".
879
+ const rawSnippet = typeof apiKeyResult?.data?._raw === "string"
880
+ ? apiKeyResult.data._raw.replace(/\s+/g, " ").slice(0, 120)
881
+ : null;
882
+ const edgeNote = rawSnippet && /openresty|nginx|Authorization Required/i.test(rawSnippet)
883
+ ? " [edge proxy blocked — session half-baked]"
884
+ : "";
857
885
  throw new Error(
858
- `API key creation failed (HTTP ${apiKeyResult?.status ?? "no-response"}, code=${businessCode ?? "n/a"}): ${JSON.stringify(apiKeyResult?.data ?? null).slice(0, 200)}`,
886
+ `API key creation failed (HTTP ${apiKeyResult?.status ?? "no-response"}, code=${businessCode ?? "n/a"})${edgeNote}: ${JSON.stringify(apiKeyResult?.data ?? null).slice(0, 200)}`,
859
887
  );
860
888
  }
861
889
 
@@ -65,6 +65,14 @@ const SPA_READY_SELECTORS = [
65
65
  ".login-phone-box",
66
66
  ];
67
67
 
68
+ // Tencent privacy-consent dialog that gates the login UI behind a 同意 button.
69
+ // Some proxy egress IPs trigger it every load; others never see it.
70
+ const CONSENT_BUTTON_SELECTORS = [
71
+ "button:has-text('同意')",
72
+ "text=同意并继续",
73
+ "text=同意",
74
+ ];
75
+
68
76
  // Iframe selector
69
77
  const PHONE_IFRAME_SELECTOR = "#phone-iframe";
70
78
 
@@ -204,11 +212,19 @@ export async function runCodeBuddyCnPhoneRegistration({
204
212
  });
205
213
  throwIfCancelled();
206
214
 
207
- // Give the SPA a short moment to mount React/Vue after document commit
208
- await page.waitForTimeout(1_500);
215
+ // Wait for document to finish parsing (readyState interactive/complete) scales to
216
+ // proxy speed instead of a fixed 1.5s that fires too early on slow China proxies
217
+ await page.waitForFunction(() => document.readyState !== "loading", { timeout: 10_000 }).catch(() => {});
209
218
  throwIfCancelled();
210
219
 
211
- // SPA shell loads first; wait for any login UI marker (not networkidle — long-lived sockets)
220
+ // SPA shell loads first; dismiss privacy-consent dialog if it gates the login UI,
221
+ // then wait for any login UI marker (not networkidle — long-lived sockets)
222
+ const consentBtn = await waitForFirstVisibleLocator(page, CONSENT_BUTTON_SELECTORS, { timeout: 6_000 });
223
+ if (consentBtn) {
224
+ await consentBtn.click().catch(() => {});
225
+ reportStep("cn_consent_dismissed", "Privacy consent dialog dismissed (同意)");
226
+ await page.waitForTimeout(1_000);
227
+ }
212
228
  const spaReady = await waitForAnyVisible(page, SPA_READY_SELECTORS, SPA_TIMEOUT_MS);
213
229
  throwIfCancelled();
214
230
  if (!spaReady) {
@@ -57,6 +57,7 @@ export default function CodeBuddyCnPhoneRegisterModal({ isOpen, onClose, onSucce
57
57
  const [engine, setEngine] = useState(DEFAULT_ENGINE);
58
58
  const [proxyPoolSelection, setProxyPoolSelection] = useState("");
59
59
  const [proxyPools, setProxyPools] = useState([]);
60
+ const [manualProxyUrl, setManualProxyUrl] = useState("");
60
61
  const [fiveSimApiKey, setFiveSimApiKey] = useState("");
61
62
  const [fiveSimKeyConfigured, setFiveSimKeyConfigured] = useState(false);
62
63
  const [savingKey, setSavingKey] = useState(false);
@@ -184,6 +185,7 @@ export default function CodeBuddyCnPhoneRegisterModal({ isOpen, onClose, onSucce
184
185
 
185
186
  let proxyPoolMode = "none";
186
187
  let proxyPoolId = null;
188
+ const trimmedManualProxy = manualProxyUrl.trim();
187
189
  if (proxyPoolSelection === "all") {
188
190
  proxyPoolMode = "all";
189
191
  } else if (proxyPoolSelection && proxyPoolSelection !== "") {
@@ -201,6 +203,7 @@ export default function CodeBuddyCnPhoneRegisterModal({ isOpen, onClose, onSucce
201
203
  engine,
202
204
  proxyPoolMode,
203
205
  proxyPoolId,
206
+ manualProxyUrl: trimmedManualProxy || null,
204
207
  region,
205
208
  }),
206
209
  });
@@ -216,7 +219,7 @@ export default function CodeBuddyCnPhoneRegisterModal({ isOpen, onClose, onSucce
216
219
  startInFlightRef.current = false;
217
220
  setImporting(false);
218
221
  }
219
- }, [count, region, concurrency, engine, proxyPoolSelection, fiveSimKeyConfigured, storageKey, importing, runningJob]);
222
+ }, [count, region, concurrency, engine, proxyPoolSelection, manualProxyUrl, fiveSimKeyConfigured, storageKey, importing, runningJob]);
220
223
 
221
224
  // Cancel job
222
225
  const handleCancelJob = useCallback(async () => {
@@ -370,7 +373,7 @@ export default function CodeBuddyCnPhoneRegisterModal({ isOpen, onClose, onSucce
370
373
  className="w-full rounded-lg border border-border bg-background px-3 py-2 text-sm text-text-main focus:border-primary focus:outline-none"
371
374
  value={proxyPoolSelection}
372
375
  onChange={(e) => setProxyPoolSelection(e.target.value)}
373
- disabled={importing}
376
+ disabled={importing || !!manualProxyUrl.trim()}
374
377
  >
375
378
  <option value="">None</option>
376
379
  <option value="all">All Active Pools (round-robin)</option>
@@ -381,6 +384,18 @@ export default function CodeBuddyCnPhoneRegisterModal({ isOpen, onClose, onSucce
381
384
  </div>
382
385
  </div>
383
386
 
387
+ <div>
388
+ <label className="mb-1 block text-xs font-medium text-text-muted">Manual Proxy URL (optional, overrides pool)</label>
389
+ <input
390
+ type="text"
391
+ className="w-full rounded-lg border border-border bg-background px-3 py-2 text-sm text-text-main focus:border-primary focus:outline-none"
392
+ placeholder="http://user:pass@host:port or socks5://host:port"
393
+ value={manualProxyUrl}
394
+ onChange={(e) => setManualProxyUrl(e.target.value)}
395
+ disabled={importing}
396
+ />
397
+ </div>
398
+
384
399
  {error && (
385
400
  <div className="rounded-lg bg-red-500/10 p-3 text-sm text-red-400">{error}</div>
386
401
  )}