zevairouter 1.0.59 → 1.0.61

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 (326) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/cli/app/.next-cli-build/BUILD_ID +1 -1
  3. package/cli/app/.next-cli-build/app-path-routes-manifest.json +20 -20
  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/grok-cli/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/terminal/session/[id]/input/route.js.nft.json +1 -1
  56. package/cli/app/.next-cli-build/server/app/api/terminal/session/[id]/resize/route.js.nft.json +1 -1
  57. package/cli/app/.next-cli-build/server/app/api/terminal/session/[id]/route.js.nft.json +1 -1
  58. package/cli/app/.next-cli-build/server/app/api/terminal/session/[id]/stream/route.js.nft.json +1 -1
  59. package/cli/app/.next-cli-build/server/app/api/terminal/session/route.js.nft.json +1 -1
  60. package/cli/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
  61. package/cli/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
  62. package/cli/app/.next-cli-build/server/app/api/version/route.js +1 -1
  63. package/cli/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
  64. package/cli/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
  65. package/cli/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
  66. package/cli/app/.next-cli-build/server/app/callback.html +1 -1
  67. package/cli/app/.next-cli-build/server/app/callback.rsc +3 -3
  68. package/cli/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +3 -3
  69. package/cli/app/.next-cli-build/server/app/callback.segments/_head.segment.rsc +1 -1
  70. package/cli/app/.next-cli-build/server/app/callback.segments/_index.segment.rsc +3 -3
  71. package/cli/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +1 -1
  72. package/cli/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
  73. package/cli/app/.next-cli-build/server/app/callback.segments/callback.segment.rsc +1 -1
  74. package/cli/app/.next-cli-build/server/app/dashboard/automation.html +1 -1
  75. package/cli/app/.next-cli-build/server/app/dashboard/automation.rsc +5 -5
  76. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard/automation/__PAGE__.segment.rsc +2 -2
  77. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard/automation.segment.rsc +1 -1
  78. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  79. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  80. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_full.segment.rsc +5 -5
  81. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_head.segment.rsc +1 -1
  82. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_index.segment.rsc +3 -3
  83. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_tree.segment.rsc +1 -1
  84. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
  85. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +5 -5
  86. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
  87. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
  88. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  89. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  90. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +5 -5
  91. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
  92. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_index.segment.rsc +3 -3
  93. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +1 -1
  94. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
  95. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +5 -5
  96. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
  97. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
  98. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  99. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  100. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +5 -5
  101. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
  102. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_index.segment.rsc +3 -3
  103. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +1 -1
  104. package/cli/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
  105. package/cli/app/.next-cli-build/server/app/dashboard/combos.rsc +5 -5
  106. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
  107. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
  108. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  109. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  110. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +5 -5
  111. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
  112. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_index.segment.rsc +3 -3
  113. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +1 -1
  114. package/cli/app/.next-cli-build/server/app/dashboard/context.html +1 -1
  115. package/cli/app/.next-cli-build/server/app/dashboard/context.rsc +5 -5
  116. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard/context/__PAGE__.segment.rsc +2 -2
  117. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard/context.segment.rsc +1 -1
  118. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  119. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  120. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_full.segment.rsc +5 -5
  121. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_head.segment.rsc +1 -1
  122. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_index.segment.rsc +3 -3
  123. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_tree.segment.rsc +1 -1
  124. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
  125. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.rsc +5 -5
  126. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
  127. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
  128. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  129. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  130. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +5 -5
  131. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
  132. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_index.segment.rsc +3 -3
  133. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +1 -1
  134. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
  135. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +5 -5
  136. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +2 -2
  137. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web.segment.rsc +1 -1
  138. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
  139. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  140. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  141. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +5 -5
  142. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_head.segment.rsc +1 -1
  143. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_index.segment.rsc +3 -3
  144. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +1 -1
  145. package/cli/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
  146. package/cli/app/.next-cli-build/server/app/dashboard/mitm.rsc +5 -5
  147. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
  148. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
  149. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  150. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  151. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +5 -5
  152. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
  153. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_index.segment.rsc +3 -3
  154. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +1 -1
  155. package/cli/app/.next-cli-build/server/app/dashboard/playground.html +1 -1
  156. package/cli/app/.next-cli-build/server/app/dashboard/playground.rsc +5 -5
  157. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard/playground/__PAGE__.segment.rsc +2 -2
  158. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard/playground.segment.rsc +1 -1
  159. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  160. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  161. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_full.segment.rsc +5 -5
  162. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_head.segment.rsc +1 -1
  163. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_index.segment.rsc +3 -3
  164. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_tree.segment.rsc +1 -1
  165. package/cli/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
  166. package/cli/app/.next-cli-build/server/app/dashboard/profile.rsc +5 -5
  167. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
  168. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
  169. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  170. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  171. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +5 -5
  172. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
  173. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_index.segment.rsc +3 -3
  174. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +1 -1
  175. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
  176. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.rsc +5 -5
  177. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
  178. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
  179. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  180. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  181. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  182. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +5 -5
  183. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
  184. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_index.segment.rsc +3 -3
  185. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +1 -1
  186. package/cli/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
  187. package/cli/app/.next-cli-build/server/app/dashboard/providers.rsc +5 -5
  188. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
  189. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  190. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  191. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  192. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +5 -5
  193. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
  194. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_index.segment.rsc +3 -3
  195. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +1 -1
  196. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
  197. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +5 -5
  198. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
  199. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
  200. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  201. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  202. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +5 -5
  203. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
  204. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +3 -3
  205. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +1 -1
  206. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.html +1 -1
  207. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.rsc +5 -5
  208. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe/__PAGE__.segment.rsc +2 -2
  209. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe.segment.rsc +1 -1
  210. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  211. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  212. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_full.segment.rsc +5 -5
  213. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_head.segment.rsc +1 -1
  214. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_index.segment.rsc +3 -3
  215. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_tree.segment.rsc +1 -1
  216. package/cli/app/.next-cli-build/server/app/dashboard/quota.html +2 -2
  217. package/cli/app/.next-cli-build/server/app/dashboard/quota.rsc +6 -6
  218. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +3 -3
  219. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
  220. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  221. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  222. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +6 -6
  223. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
  224. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_index.segment.rsc +3 -3
  225. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +1 -1
  226. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  227. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
  228. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +3 -3
  229. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +3 -3
  230. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
  231. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +3 -3
  232. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +1 -1
  233. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
  234. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
  235. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
  236. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
  237. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.html +1 -1
  238. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.rsc +5 -5
  239. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +2 -2
  240. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver.segment.rsc +1 -1
  241. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  242. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  243. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_full.segment.rsc +5 -5
  244. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_head.segment.rsc +1 -1
  245. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_index.segment.rsc +3 -3
  246. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_tree.segment.rsc +1 -1
  247. package/cli/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
  248. package/cli/app/.next-cli-build/server/app/dashboard/translator.rsc +5 -5
  249. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
  250. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
  251. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  252. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  253. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +5 -5
  254. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
  255. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_index.segment.rsc +3 -3
  256. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +1 -1
  257. package/cli/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
  258. package/cli/app/.next-cli-build/server/app/dashboard/usage.rsc +5 -5
  259. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
  260. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
  261. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  262. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  263. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +5 -5
  264. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
  265. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_index.segment.rsc +3 -3
  266. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +1 -1
  267. package/cli/app/.next-cli-build/server/app/dashboard.html +1 -1
  268. package/cli/app/.next-cli-build/server/app/dashboard.rsc +5 -5
  269. package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
  270. package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  271. package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  272. package/cli/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +5 -5
  273. package/cli/app/.next-cli-build/server/app/dashboard.segments/_head.segment.rsc +1 -1
  274. package/cli/app/.next-cli-build/server/app/dashboard.segments/_index.segment.rsc +3 -3
  275. package/cli/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +1 -1
  276. package/cli/app/.next-cli-build/server/app/index.html +1 -1
  277. package/cli/app/.next-cli-build/server/app/index.rsc +3 -3
  278. package/cli/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  279. package/cli/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +3 -3
  280. package/cli/app/.next-cli-build/server/app/index.segments/_head.segment.rsc +1 -1
  281. package/cli/app/.next-cli-build/server/app/index.segments/_index.segment.rsc +3 -3
  282. package/cli/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +1 -1
  283. package/cli/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
  284. package/cli/app/.next-cli-build/server/app/landing.html +1 -1
  285. package/cli/app/.next-cli-build/server/app/landing.rsc +3 -3
  286. package/cli/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +3 -3
  287. package/cli/app/.next-cli-build/server/app/landing.segments/_head.segment.rsc +1 -1
  288. package/cli/app/.next-cli-build/server/app/landing.segments/_index.segment.rsc +3 -3
  289. package/cli/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +1 -1
  290. package/cli/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +1 -1
  291. package/cli/app/.next-cli-build/server/app/landing.segments/landing.segment.rsc +1 -1
  292. package/cli/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
  293. package/cli/app/.next-cli-build/server/app/login.html +1 -1
  294. package/cli/app/.next-cli-build/server/app/login.rsc +4 -4
  295. package/cli/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +4 -4
  296. package/cli/app/.next-cli-build/server/app/login.segments/_head.segment.rsc +1 -1
  297. package/cli/app/.next-cli-build/server/app/login.segments/_index.segment.rsc +3 -3
  298. package/cli/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +1 -1
  299. package/cli/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  300. package/cli/app/.next-cli-build/server/app/login.segments/login.segment.rsc +1 -1
  301. package/cli/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
  302. package/cli/app/.next-cli-build/server/app-paths-manifest.json +20 -20
  303. package/cli/app/.next-cli-build/server/chunks/3407.js +1 -1
  304. package/cli/app/.next-cli-build/server/chunks/3487.js +1 -1
  305. package/cli/app/.next-cli-build/server/chunks/4746.js +1 -1
  306. package/cli/app/.next-cli-build/server/chunks/5949.js +1 -1
  307. package/cli/app/.next-cli-build/server/chunks/6896.js +1 -1
  308. package/cli/app/.next-cli-build/server/chunks/7276.js +1 -1
  309. package/cli/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
  310. package/cli/app/.next-cli-build/server/pages/404.html +1 -1
  311. package/cli/app/.next-cli-build/server/pages/500.html +1 -1
  312. package/cli/app/.next-cli-build/static/chunks/{3702-432214b20516609b.js → 3702-18f5f207de6e9eeb.js} +1 -1
  313. package/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/src/lib/terminal/ptyBridge.py +163 -0
  314. package/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/src/lib/terminal/ptyBridge.py +163 -0
  315. package/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/src/lib/terminal/ptyBridge.py +163 -0
  316. package/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/src/lib/terminal/ptyBridge.py +163 -0
  317. package/cli/app/package.json +1 -1
  318. package/cli/app/src/lib/oauth/services/bulkImportBrowserEngine.js +3 -0
  319. package/cli/package.json +1 -1
  320. package/package.json +1 -1
  321. package/src/app/api/oauth/grok-cli/bulk-import/route.js +4 -0
  322. package/src/lib/oauth/services/bulkImportBrowserEngine.js +3 -0
  323. package/src/lib/oauth/services/grokCliBulkImportManager.js +64 -6
  324. package/src/lib/oauth/services/grokXaiEmailAutomation.js +187 -78
  325. /package/cli/app/.next-cli-build/static/{F1hsNt0zh50goqFQqkGgQ → Fip2gTBHjVyX1dEyiiJZM}/_buildManifest.js +0 -0
  326. /package/cli/app/.next-cli-build/static/{F1hsNt0zh50goqFQqkGgQ → Fip2gTBHjVyX1dEyiiJZM}/_ssgManifest.js +0 -0
@@ -266,7 +266,10 @@ async function launchCloakbrowser({ proxyUrl, headless = false, windowSize = nul
266
266
  humanize: true,
267
267
  };
268
268
  if (proxyUrl) {
269
+ // CloakBrowser docs: string or { server, username, password }; geoip aligns
270
+ // timezone/locale to proxy IP (critical for Turnstile / abusive-pattern checks).
269
271
  launchOpts.proxy = proxyUrl;
272
+ launchOpts.geoip = true;
270
273
  }
271
274
  if (windowSize?.width && windowSize?.height) {
272
275
  launchOpts.viewport = { width: windowSize.width, height: windowSize.height };
@@ -188,7 +188,10 @@ class GrokCliBulkImportManager extends KiroBulkImportManager {
188
188
  proxyUrl = null,
189
189
  } = {}) {
190
190
  super({
191
- browserLauncher: (job) => browserLauncher(proxyUrl, job?.engine),
191
+ // Prefer first pool URL from the job so CloakBrowser launches with proxy+geoip
192
+ // (context-only proxy is not enough for fingerprint/timezone matching).
193
+ browserLauncher: (job) =>
194
+ browserLauncher(job?.proxyUrls?.[0] || proxyUrl || null, job?.engine),
192
195
  googleAutomation: null,
193
196
  socialExchange: null,
194
197
  kiroServiceFactory: null,
@@ -263,11 +266,54 @@ class GrokCliBulkImportManager extends KiroBulkImportManager {
263
266
  return;
264
267
  }
265
268
 
266
- const { context, page } = await createFreshContext(job.browser, account.proxyUrl);
267
- account.runtimeSession = { context, page };
269
+ // CloakBrowser needs proxy+geoip on launch() for antibot. Shared job.browser may
270
+ // have no proxy or a different one — spawn a dedicated browser when needed.
271
+ let browser = job.browser;
272
+ let ownedBrowser = null;
273
+ const accountProxy = account.proxyUrl || null;
274
+ const sharedProxy = job.proxyUrls?.[0] || null;
275
+ const needsOwnBrowser =
276
+ job.engine === "cloakbrowser"
277
+ && accountProxy
278
+ && accountProxy !== sharedProxy;
279
+
280
+ if (needsOwnBrowser || (job.engine === "cloakbrowser" && accountProxy && !sharedProxy)) {
281
+ try {
282
+ const { launchBulkImportBrowser } = await import("./bulkImportBrowserEngine.js");
283
+ ownedBrowser = await launchBulkImportBrowser({
284
+ engine: "cloakbrowser",
285
+ proxyUrl: accountProxy,
286
+ headless: false,
287
+ windowSize: { width: 1280, height: 900 },
288
+ });
289
+ browser = ownedBrowser;
290
+ this.setAccountStep(
291
+ account,
292
+ "proxy_browser",
293
+ `Launched CloakBrowser with account proxy (geoip)`
294
+ );
295
+ } catch (error) {
296
+ this.finalizeAccount(account, "failed", {
297
+ error: error.message || "Failed to launch browser with proxy",
298
+ step: "proxy_launch_failed",
299
+ message: error.message || "Failed to launch browser with proxy",
300
+ });
301
+ await this.persistJobSnapshot(job, { forcePreview: true });
302
+ return;
303
+ }
304
+ }
305
+
306
+ // If browser already launched with this proxy, don't double-apply on context
307
+ const contextProxy = ownedBrowser ? null : accountProxy;
308
+ const { context, page } = await createFreshContext(browser, contextProxy);
309
+ account.runtimeSession = { context, page, ownedBrowser };
268
310
 
269
311
  try {
270
- this.setAccountStep(account, "preparing_worker", `Worker ${workerId} preparing CloakBrowser / xAI flow`);
312
+ this.setAccountStep(
313
+ account,
314
+ "preparing_worker",
315
+ `Worker ${workerId} preparing CloakBrowser / xAI flow${accountProxy ? " (proxied)" : " (direct VPS IP — expect blocks)"}`
316
+ );
271
317
  await this.persistJobSnapshot(job, { forcePreview: true });
272
318
 
273
319
  const onStep = (step, message) => {
@@ -298,14 +344,21 @@ class GrokCliBulkImportManager extends KiroBulkImportManager {
298
344
  });
299
345
 
300
346
  if (signup.status === "needs_manual") {
301
- account.manualSession = { context, page, opened: false, openedAt: null };
347
+ account.manualSession = {
348
+ context,
349
+ page,
350
+ opened: false,
351
+ openedAt: null,
352
+ ownedBrowser,
353
+ };
302
354
  this.finalizeAccount(account, "needs_manual", {
303
355
  error: signup.error,
304
356
  step: signup.step || "awaiting_manual",
305
357
  message: signup.error,
306
358
  });
307
359
  await this.persistJobSnapshot(job, { forcePreview: true });
308
- // keep session open for manual; no token poll yet
360
+ // keep session open for manual; do not close ownedBrowser here
361
+ ownedBrowser = null;
309
362
  return;
310
363
  }
311
364
 
@@ -317,6 +370,7 @@ class GrokCliBulkImportManager extends KiroBulkImportManager {
317
370
  });
318
371
  account.runtimeSession = null;
319
372
  await context.close().catch(() => null);
373
+ if (ownedBrowser) await ownedBrowser.close().catch(() => null);
320
374
  await this.persistJobSnapshot(job, { forcePreview: true });
321
375
  return;
322
376
  }
@@ -347,6 +401,7 @@ class GrokCliBulkImportManager extends KiroBulkImportManager {
347
401
  await this.finalizeSuccess(job, account, auth.tokens, mode);
348
402
  account.runtimeSession = null;
349
403
  await context.close().catch(() => null);
404
+ if (ownedBrowser) await ownedBrowser.close().catch(() => null);
350
405
  await this.persistJobSnapshot(job, { forcePreview: true });
351
406
  return;
352
407
  }
@@ -358,6 +413,7 @@ class GrokCliBulkImportManager extends KiroBulkImportManager {
358
413
  });
359
414
  account.runtimeSession = null;
360
415
  await context.close().catch(() => null);
416
+ if (ownedBrowser) await ownedBrowser.close().catch(() => null);
361
417
  await this.persistJobSnapshot(job, { forcePreview: true });
362
418
  } catch (error) {
363
419
  if (job.cancelRequested) {
@@ -375,9 +431,11 @@ class GrokCliBulkImportManager extends KiroBulkImportManager {
375
431
  }
376
432
  account.runtimeSession = null;
377
433
  await context.close().catch(() => null);
434
+ if (ownedBrowser) await ownedBrowser.close().catch(() => null);
378
435
  await this.persistJobSnapshot(job, { forcePreview: true });
379
436
  } finally {
380
437
  account.password = undefined;
438
+ if (ownedBrowser) await ownedBrowser.close().catch(() => null);
381
439
  }
382
440
  }
383
441
 
@@ -189,6 +189,96 @@ export async function runXaiEmailSignup(page, {
189
189
  return { status: "success", email, password, url };
190
190
  }
191
191
 
192
+ async function clickRoleButton(page, nameRe) {
193
+ try {
194
+ const btn = page.getByRole("button", { name: nameRe }).first();
195
+ if (await btn.isVisible({ timeout: 600 }).catch(() => false)) {
196
+ await btn.click({ timeout: 4_000 });
197
+ return true;
198
+ }
199
+ } catch {
200
+ /* next */
201
+ }
202
+ return false;
203
+ }
204
+
205
+ /** Aggressive consent / continue clicks for xAI device pages. */
206
+ async function clickDeviceAuthorizeControls(page) {
207
+ // Prefer role-based names (more reliable than CSS text on SPA)
208
+ const roles = [
209
+ /^(Allow|Authorize|Approve|Confirm|Yes|Accept)$/i,
210
+ /Allow|Authorize|Approve|Confirm/i,
211
+ /^Continue$/i,
212
+ /Continue/i,
213
+ /^Next$/i,
214
+ /Sign in|Log in|Login/i,
215
+ ];
216
+ for (const re of roles) {
217
+ if (await clickRoleButton(page, re)) return true;
218
+ }
219
+
220
+ // Links styled as buttons
221
+ try {
222
+ const link = page.getByRole("link", { name: /Allow|Authorize|Continue|Confirm/i }).first();
223
+ if (await link.isVisible({ timeout: 400 }).catch(() => false)) {
224
+ await link.click({ timeout: 3_000 });
225
+ return true;
226
+ }
227
+ } catch {
228
+ /* ignore */
229
+ }
230
+
231
+ return Boolean(
232
+ await clickFirst(page, [
233
+ 'button:has-text("Allow")',
234
+ 'button:has-text("Authorize")',
235
+ 'button:has-text("Approve")',
236
+ 'button:has-text("Confirm")',
237
+ 'button:has-text("Continue")',
238
+ 'button:has-text("Next")',
239
+ 'button[type=submit]',
240
+ 'input[type=submit]',
241
+ ])
242
+ );
243
+ }
244
+
245
+ async function ensureEmailLoginOnPage(page, { email, password, onStep, pollOtp }) {
246
+ const report = (step, message) => onStep?.(step, message);
247
+
248
+ if (await page.getByRole("button", { name: /Login with email/i }).count()) {
249
+ await page.getByRole("button", { name: /Login with email/i }).click().catch(() => null);
250
+ await wait(800);
251
+ }
252
+
253
+ if (await page.locator("input[type=email]").first().isVisible().catch(() => false)) {
254
+ report("device_login_email", "Entering email on device page");
255
+ await typeSlow(page.locator("input[type=email]").first(), email, 40);
256
+ await clickDeviceAuthorizeControls(page);
257
+ await wait(1_200);
258
+ }
259
+ if (await page.locator("input[type=password]").first().isVisible().catch(() => false)) {
260
+ report("device_login_password", "Entering password on device page");
261
+ await typeSlow(page.locator("input[type=password]").first(), password, 40);
262
+ await waitForTurnstile(page, { timeoutMs: 45_000, onStep });
263
+ await clickFirst(page, ['button:has-text("Login")', 'button:has-text("Log in")', 'button[type=submit]']);
264
+ await wait(2_500);
265
+ }
266
+
267
+ let text = await pageText(page);
268
+ if (/security code|Verify your email|one time|confirmation code/i.test(text)) {
269
+ report("login_otp", "Login requires OTP — polling tempmail");
270
+ const otp = await pollOtp(email, { timeoutMs: 90_000 });
271
+ if (otp?.code) {
272
+ const codeInput = page.locator("input[name=code], input[autocomplete=one-time-code], input[type=text]").first();
273
+ if (await codeInput.isVisible().catch(() => false)) {
274
+ await typeSlow(codeInput, otp.code, 80);
275
+ }
276
+ await clickDeviceAuthorizeControls(page);
277
+ await wait(2_000);
278
+ }
279
+ }
280
+ }
281
+
192
282
  /**
193
283
  * Login with email+password (session), then authorize a Grok CLI device code.
194
284
  */
@@ -203,78 +293,55 @@ export async function runXaiEmailDeviceAuthorize(page, {
203
293
  cancelCheck,
204
294
  } = {}) {
205
295
  const report = (step, message) => onStep?.(step, message);
296
+ const authorized = { done: false };
206
297
 
207
298
  // Ensure session via sign-in if not already on account
208
299
  const cur = page.url();
209
- if (!/\/account/i.test(cur)) {
300
+ if (!/\/account/i.test(cur) && !/accounts\.x\.ai/i.test(cur)) {
210
301
  report("opening_signin", "Opening xAI email login");
211
302
  await page.goto("https://accounts.x.ai/sign-in", { waitUntil: "domcontentloaded", timeout: 60_000 });
212
303
  await wait(1_000);
213
304
  await dismissCookies(page);
214
-
215
- if (await page.getByRole("button", { name: /Login with email/i }).count()) {
216
- await page.getByRole("button", { name: /Login with email/i }).click();
217
- await wait(800);
218
- }
219
-
220
- if (await page.locator("input[type=email]").first().isVisible().catch(() => false)) {
221
- await typeSlow(page.locator("input[type=email]").first(), email, 40);
222
- await clickFirst(page, ['button:has-text("Next")', 'button:has-text("Continue")']);
223
- await wait(1_500);
224
- }
225
- if (await page.locator("input[type=password]").first().isVisible().catch(() => false)) {
226
- await typeSlow(page.locator("input[type=password]").first(), password, 40);
227
- await waitForTurnstile(page, { timeoutMs: 45_000, onStep });
228
- await clickFirst(page, ['button:has-text("Login")', 'button:has-text("Log in")']);
229
- await wait(3_000);
230
- }
231
-
232
- let text = await pageText(page);
233
- if (/security code|Verify your email|one time/i.test(text)) {
234
- report("login_otp", "Login requires OTP — polling tempmail");
235
- const otp = await pollOtp(email, { timeoutMs: 90_000 });
236
- if (otp?.code) {
237
- await typeSlow(page.locator("input[name=code]").first(), otp.code, 80);
238
- await clickFirst(page, ['button:has-text("Confirm email")', 'button:has-text("Continue")']);
239
- await wait(2_500);
240
- }
241
- }
305
+ await ensureEmailLoginOnPage(page, { email, password, onStep, pollOtp });
242
306
  }
243
307
 
244
308
  report("opening_device", "Opening Grok Build device authorization");
245
309
  await page.goto(verificationUrl, { waitUntil: "domcontentloaded", timeout: 60_000 });
246
- await wait(1_200);
310
+ await wait(1_500);
247
311
  await dismissCookies(page);
248
- await clickFirst(page, ['button:has-text("Continue")']);
312
+ await clickDeviceAuthorizeControls(page);
249
313
  await wait(2_000);
250
314
 
251
315
  // If bounced to login again, do email login on this page
252
- if (await page.getByRole("button", { name: /Login with email/i }).count()) {
253
- await page.getByRole("button", { name: /Login with email/i }).click();
254
- await wait(800);
255
- if (await page.locator("input[type=email]").first().isVisible().catch(() => false)) {
256
- await typeSlow(page.locator("input[type=email]").first(), email, 40);
257
- await clickFirst(page, ['button:has-text("Next")']);
258
- await wait(1_200);
259
- }
260
- if (await page.locator("input[type=password]").first().isVisible().catch(() => false)) {
261
- await typeSlow(page.locator("input[type=password]").first(), password, 40);
262
- await waitForTurnstile(page, { timeoutMs: 45_000, onStep });
263
- await clickFirst(page, ['button:has-text("Login")', 'button:has-text("Log in")']);
264
- await wait(3_000);
265
- }
266
- // re-open device after login
316
+ const bounced = await page.getByRole("button", { name: /Login with email/i }).count()
317
+ || await page.locator("input[type=email]").first().isVisible().catch(() => false);
318
+ if (bounced) {
319
+ report("device_needs_login", "Device page requires login — signing in");
320
+ await ensureEmailLoginOnPage(page, { email, password, onStep, pollOtp });
267
321
  await page.goto(verificationUrl, { waitUntil: "domcontentloaded", timeout: 60_000 });
268
- await wait(1_200);
269
- await clickFirst(page, ['button:has-text("Continue")']);
322
+ await wait(1_500);
323
+ await dismissCookies(page);
324
+ await clickDeviceAuthorizeControls(page);
270
325
  await wait(2_000);
271
326
  }
272
327
 
328
+ // Snapshot first device page for debugging stuck authorize
329
+ try {
330
+ const snap = (await pageText(page)).replace(/\s+/g, " ").slice(0, 160);
331
+ report("device_page", `Device page: ${page.url().slice(0, 80)} · ${snap}`);
332
+ } catch {
333
+ /* ignore */
334
+ }
335
+
273
336
  const pollPromise = (async () => {
274
337
  const start = Date.now();
275
- let interval = 5_000;
276
- while (Date.now() - start < 15 * 60_000) {
338
+ let interval = 4_000;
339
+ while (Date.now() - start < 12 * 60_000) {
277
340
  if (cancelCheck?.()) throw new Error("Job cancelled during token polling");
341
+ if (authorized.done) {
342
+ // short burst after UI says authorized
343
+ await wait(1_500);
344
+ }
278
345
  const result = await pollToken(deviceCode);
279
346
  if (result?.success && result.tokens) return { tokens: result.tokens };
280
347
  if (result?.pending || result?.error === "authorization_pending") {
@@ -287,57 +354,99 @@ export async function runXaiEmailDeviceAuthorize(page, {
287
354
  continue;
288
355
  }
289
356
  if (result?.error && !["authorization_pending", "slow_down"].includes(result.error)) {
290
- // keep polling a bit — page may still authorize
357
+ report("token_poll_note", `Poll: ${result.error}`);
291
358
  await wait(interval);
292
359
  continue;
293
360
  }
294
361
  await wait(interval);
295
362
  }
296
- throw new Error("Timed out waiting for Grok CLI OAuth token");
363
+ throw new Error("Timed out waiting for Grok CLI OAuth token (device may not have been authorized in the browser)");
297
364
  })();
298
365
 
299
- // UI authorize loop in parallel with poll
366
+ // UI authorize loop keep going until poll succeeds or timeout (~same window)
300
367
  const uiLoop = (async () => {
301
- for (let i = 0; i < 20; i++) {
368
+ const start = Date.now();
369
+ let i = 0;
370
+ while (Date.now() - start < 11 * 60_000) {
302
371
  if (cancelCheck?.()) return;
372
+ if (authorized.done) {
373
+ await wait(2_000);
374
+ continue;
375
+ }
376
+
303
377
  const text = await pageText(page);
304
- if (/Device Authorized|device has been authorized|you can close/i.test(text)) {
378
+ const url = page.url();
379
+
380
+ if (/Device Authorized|device has been authorized|you can close|successfully authorized/i.test(text)) {
381
+ authorized.done = true;
305
382
  report("device_authorized", "Device authorized in browser");
306
383
  return;
307
384
  }
308
- // signed-in consent
309
- if (/Authorize Grok Build|Verify your identity|Confirm your identity/i.test(text)) {
310
- await clickFirst(page, [
311
- 'button:has-text("Allow")',
312
- 'button:has-text("Authorize")',
313
- 'button:has-text("Approve")',
314
- 'button:has-text("Continue")',
315
- 'button:has-text("Confirm")',
316
- ]);
385
+
386
+ // Login wall again mid-flow
387
+ if (/Login with email|Sign in to continue|log in to continue/i.test(text)
388
+ || await page.locator("input[type=password]").first().isVisible().catch(() => false)) {
389
+ report("device_relogin", "Re-login required on device page");
390
+ await ensureEmailLoginOnPage(page, { email, password, onStep, pollOtp });
391
+ await page.goto(verificationUrl, { waitUntil: "domcontentloaded", timeout: 60_000 }).catch(() => null);
317
392
  await wait(1_500);
318
393
  continue;
319
394
  }
320
- if (/Redirecting/i.test(text) || /\/account/i.test(page.url())) {
395
+
396
+ // Consent / identity
397
+ if (/Authorize Grok|Grok Build|Verify your identity|Confirm your identity|device code|user code/i.test(text)
398
+ || /oauth2\/device|device\/verify/i.test(url)) {
399
+ const clicked = await clickDeviceAuthorizeControls(page);
400
+ if (clicked && i % 3 === 0) {
401
+ report("device_click", `Clicked authorize control (${i + 1})`);
402
+ }
403
+ // Turnstile sometimes reappears on consent
404
+ await waitForTurnstile(page, { timeoutMs: 12_000, onStep: i % 5 === 0 ? onStep : undefined });
405
+ await wait(1_800);
406
+ i += 1;
407
+ continue;
408
+ }
409
+
410
+ // Redirected away from device flow
411
+ if (/Redirecting/i.test(text) || (/\/account/i.test(url) && !/device/i.test(url))) {
412
+ report("device_reopen", "Re-opening device authorization URL");
321
413
  await page.goto(verificationUrl, { waitUntil: "domcontentloaded", timeout: 60_000 });
322
414
  await wait(1_500);
323
- await clickFirst(page, ['button:has-text("Continue")']);
415
+ await dismissCookies(page);
416
+ await clickDeviceAuthorizeControls(page);
324
417
  await wait(1_500);
418
+ i += 1;
325
419
  continue;
326
420
  }
327
- await clickFirst(page, [
328
- 'button:has-text("Continue")',
329
- 'button:has-text("Allow")',
330
- 'button:has-text("Authorize")',
331
- ]);
332
- await wait(1_500);
421
+
422
+ // Generic: keep trying primary actions + occasional reload
423
+ await clickDeviceAuthorizeControls(page);
424
+ if (i > 0 && i % 8 === 0) {
425
+ report("device_reload", `Reload device page (attempt ${i}) · ${url.slice(0, 60)}`);
426
+ await page.goto(verificationUrl, { waitUntil: "domcontentloaded", timeout: 60_000 }).catch(() => null);
427
+ await wait(1_200);
428
+ await clickDeviceAuthorizeControls(page);
429
+ }
430
+ await wait(1_800);
431
+ i += 1;
333
432
  }
334
433
  })();
335
434
 
336
435
  report("polling_token", "Waiting for device token after authorization");
337
- const [tokenResult] = await Promise.all([
338
- pollPromise,
339
- uiLoop.catch(() => null),
340
- ]);
341
-
342
- return { status: "success", tokens: tokenResult.tokens };
436
+ try {
437
+ const [tokenResult] = await Promise.all([
438
+ pollPromise,
439
+ uiLoop.catch((e) => {
440
+ report("device_ui_note", String(e?.message || e).slice(0, 120));
441
+ return null;
442
+ }),
443
+ ]);
444
+ return { status: "success", tokens: tokenResult.tokens };
445
+ } catch (error) {
446
+ const snap = (await pageText(page).catch(() => "")).replace(/\s+/g, " ").slice(0, 200);
447
+ return {
448
+ status: "failed",
449
+ error: `${error.message || error} · page: ${page.url()} · ${snap}`,
450
+ };
451
+ }
343
452
  }