zevairouter 1.0.83 → 1.0.84

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 (548) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/cli/app/.next-cli-build/BUILD_ID +1 -1
  3. package/cli/app/.next-cli-build/app-path-routes-manifest.json +26 -26
  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.js.nft.json +1 -1
  6. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/automation/page_client-reference-manifest.js +1 -1
  7. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page.js.nft.json +1 -1
  8. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
  9. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js.nft.json +1 -1
  10. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
  11. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -1
  12. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  13. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page.js.nft.json +1 -1
  14. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  15. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page.js.nft.json +1 -1
  16. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
  17. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/context/page.js.nft.json +1 -1
  18. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/context/page_client-reference-manifest.js +1 -1
  19. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -1
  20. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  21. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js.nft.json +1 -1
  22. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
  23. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js.nft.json +1 -1
  24. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
  25. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js.nft.json +1 -1
  26. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
  27. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page.js.nft.json +1 -1
  28. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
  29. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page.js.nft.json +1 -1
  30. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
  31. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/page.js.nft.json +1 -1
  32. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  33. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/playground/page.js.nft.json +1 -1
  34. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/playground/page_client-reference-manifest.js +1 -1
  35. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page.js.nft.json +1 -1
  36. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  37. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page.js.nft.json +1 -1
  38. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  39. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page.js.nft.json +1 -1
  40. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  41. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page.js.nft.json +1 -1
  42. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  43. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page.js.nft.json +1 -1
  44. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
  45. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/pxpipe/page.js.nft.json +1 -1
  46. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/pxpipe/page_client-reference-manifest.js +1 -1
  47. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page.js.nft.json +1 -1
  48. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  49. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/terminal/page.js.nft.json +1 -1
  50. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/terminal/page_client-reference-manifest.js +1 -1
  51. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page.js.nft.json +1 -1
  52. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
  53. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page.js.nft.json +1 -1
  54. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  55. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page.js.nft.json +1 -1
  56. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  57. package/cli/app/.next-cli-build/server/app/_global-error/page.js.nft.json +1 -1
  58. package/cli/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
  59. package/cli/app/.next-cli-build/server/app/_global-error.html +1 -1
  60. package/cli/app/.next-cli-build/server/app/_global-error.rsc +1 -1
  61. package/cli/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
  62. package/cli/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  63. package/cli/app/.next-cli-build/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  64. package/cli/app/.next-cli-build/server/app/_global-error.segments/_head.segment.rsc +1 -1
  65. package/cli/app/.next-cli-build/server/app/_global-error.segments/_index.segment.rsc +1 -1
  66. package/cli/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  67. package/cli/app/.next-cli-build/server/app/_not-found/page.js.nft.json +1 -1
  68. package/cli/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
  69. package/cli/app/.next-cli-build/server/app/_not-found.html +1 -1
  70. package/cli/app/.next-cli-build/server/app/_not-found.rsc +3 -3
  71. package/cli/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +3 -3
  72. package/cli/app/.next-cli-build/server/app/_not-found.segments/_head.segment.rsc +1 -1
  73. package/cli/app/.next-cli-build/server/app/_not-found.segments/_index.segment.rsc +3 -3
  74. package/cli/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  75. package/cli/app/.next-cli-build/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  76. package/cli/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  77. package/cli/app/.next-cli-build/server/app/api/auth/login/route.js.nft.json +1 -1
  78. package/cli/app/.next-cli-build/server/app/api/auth/logout/route.js.nft.json +1 -1
  79. package/cli/app/.next-cli-build/server/app/api/auth/oidc/callback/route.js.nft.json +1 -1
  80. package/cli/app/.next-cli-build/server/app/api/auth/oidc/start/route.js.nft.json +1 -1
  81. package/cli/app/.next-cli-build/server/app/api/auth/oidc/test/route.js.nft.json +1 -1
  82. package/cli/app/.next-cli-build/server/app/api/auth/status/route.js.nft.json +1 -1
  83. package/cli/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js.nft.json +1 -1
  84. package/cli/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
  85. package/cli/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -1
  86. package/cli/app/.next-cli-build/server/app/api/cli-tools/claude-settings/route.js.nft.json +1 -1
  87. package/cli/app/.next-cli-build/server/app/api/cli-tools/cline-settings/route.js.nft.json +1 -1
  88. package/cli/app/.next-cli-build/server/app/api/cli-tools/codex-gateway/accounts/route.js.nft.json +1 -1
  89. package/cli/app/.next-cli-build/server/app/api/cli-tools/codex-settings/route.js.nft.json +1 -1
  90. package/cli/app/.next-cli-build/server/app/api/cli-tools/copilot-settings/route.js.nft.json +1 -1
  91. package/cli/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-registry/route.js.nft.json +1 -1
  92. package/cli/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-tools/route.js.nft.json +1 -1
  93. package/cli/app/.next-cli-build/server/app/api/cli-tools/cowork-settings/route.js.nft.json +1 -1
  94. package/cli/app/.next-cli-build/server/app/api/cli-tools/deepseek-tui-settings/route.js.nft.json +1 -1
  95. package/cli/app/.next-cli-build/server/app/api/cli-tools/droid-settings/route.js.nft.json +1 -1
  96. package/cli/app/.next-cli-build/server/app/api/cli-tools/hermes-settings/route.js.nft.json +1 -1
  97. package/cli/app/.next-cli-build/server/app/api/cli-tools/jcode-settings/route.js.nft.json +1 -1
  98. package/cli/app/.next-cli-build/server/app/api/cli-tools/kilo-settings/route.js.nft.json +1 -1
  99. package/cli/app/.next-cli-build/server/app/api/cli-tools/openclaw-settings/route.js.nft.json +1 -1
  100. package/cli/app/.next-cli-build/server/app/api/cli-tools/opencode-settings/route.js.nft.json +1 -1
  101. package/cli/app/.next-cli-build/server/app/api/combos/[id]/route.js.nft.json +1 -1
  102. package/cli/app/.next-cli-build/server/app/api/combos/route.js.nft.json +1 -1
  103. package/cli/app/.next-cli-build/server/app/api/context/[id]/route.js.nft.json +1 -1
  104. package/cli/app/.next-cli-build/server/app/api/context/bulk/route.js.nft.json +1 -1
  105. package/cli/app/.next-cli-build/server/app/api/context/route.js.nft.json +1 -1
  106. package/cli/app/.next-cli-build/server/app/api/dashboard/chat/completions/route.js.nft.json +1 -1
  107. package/cli/app/.next-cli-build/server/app/api/headroom/extras/route.js.nft.json +1 -1
  108. package/cli/app/.next-cli-build/server/app/api/headroom/proxy/[...path]/route.js.nft.json +1 -1
  109. package/cli/app/.next-cli-build/server/app/api/headroom/restart/route.js.nft.json +1 -1
  110. package/cli/app/.next-cli-build/server/app/api/headroom/start/route.js.nft.json +1 -1
  111. package/cli/app/.next-cli-build/server/app/api/headroom/status/route.js.nft.json +1 -1
  112. package/cli/app/.next-cli-build/server/app/api/headroom/stop/route.js.nft.json +1 -1
  113. package/cli/app/.next-cli-build/server/app/api/health/route.js.nft.json +1 -1
  114. package/cli/app/.next-cli-build/server/app/api/init/route.js.nft.json +1 -1
  115. package/cli/app/.next-cli-build/server/app/api/keys/[id]/route.js.nft.json +1 -1
  116. package/cli/app/.next-cli-build/server/app/api/keys/route.js.nft.json +1 -1
  117. package/cli/app/.next-cli-build/server/app/api/locale/route.js.nft.json +1 -1
  118. package/cli/app/.next-cli-build/server/app/api/mcp/[plugin]/message/route.js.nft.json +1 -1
  119. package/cli/app/.next-cli-build/server/app/api/mcp/[plugin]/sse/route.js.nft.json +1 -1
  120. package/cli/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js.nft.json +1 -1
  121. package/cli/app/.next-cli-build/server/app/api/media-providers/tts/elevenlabs/voices/route.js.nft.json +1 -1
  122. package/cli/app/.next-cli-build/server/app/api/media-providers/tts/inworld/voices/route.js.nft.json +1 -1
  123. package/cli/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js.nft.json +1 -1
  124. package/cli/app/.next-cli-build/server/app/api/media-providers/tts/voices/route.js.nft.json +1 -1
  125. package/cli/app/.next-cli-build/server/app/api/models/alias/route.js.nft.json +1 -1
  126. package/cli/app/.next-cli-build/server/app/api/models/availability/route.js.nft.json +1 -1
  127. package/cli/app/.next-cli-build/server/app/api/models/custom/route.js.nft.json +1 -1
  128. package/cli/app/.next-cli-build/server/app/api/models/disabled/route.js.nft.json +1 -1
  129. package/cli/app/.next-cli-build/server/app/api/models/route.js +1 -1
  130. package/cli/app/.next-cli-build/server/app/api/models/route.js.nft.json +1 -1
  131. package/cli/app/.next-cli-build/server/app/api/models/test/route.js +1 -1
  132. package/cli/app/.next-cli-build/server/app/api/models/test/route.js.nft.json +1 -1
  133. package/cli/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
  134. package/cli/app/.next-cli-build/server/app/api/oauth/antigravity/bulk-import/[jobId]/cancel/route.js.nft.json +1 -1
  135. package/cli/app/.next-cli-build/server/app/api/oauth/antigravity/bulk-import/[jobId]/manual/[workerId]/route.js.nft.json +1 -1
  136. package/cli/app/.next-cli-build/server/app/api/oauth/antigravity/bulk-import/[jobId]/route.js.nft.json +1 -1
  137. package/cli/app/.next-cli-build/server/app/api/oauth/antigravity/bulk-import/latest/route.js.nft.json +1 -1
  138. package/cli/app/.next-cli-build/server/app/api/oauth/antigravity/bulk-import/route.js.nft.json +1 -1
  139. package/cli/app/.next-cli-build/server/app/api/oauth/autoclaw/bulk-import/[jobId]/cancel/route.js.nft.json +1 -1
  140. package/cli/app/.next-cli-build/server/app/api/oauth/autoclaw/bulk-import/[jobId]/manual/[workerId]/route.js.nft.json +1 -1
  141. package/cli/app/.next-cli-build/server/app/api/oauth/autoclaw/bulk-import/[jobId]/route.js.nft.json +1 -1
  142. package/cli/app/.next-cli-build/server/app/api/oauth/autoclaw/bulk-import/latest/route.js.nft.json +1 -1
  143. package/cli/app/.next-cli-build/server/app/api/oauth/autoclaw/bulk-import/route.js.nft.json +1 -1
  144. package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/bulk-import/[jobId]/cancel/route.js.nft.json +1 -1
  145. package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/bulk-import/[jobId]/manual/[workerId]/route.js.nft.json +1 -1
  146. package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/bulk-import/[jobId]/route.js.nft.json +1 -1
  147. package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/bulk-import/latest/route.js.nft.json +1 -1
  148. package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/bulk-import/route.js.nft.json +1 -1
  149. package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/bulk-token/route.js.nft.json +1 -1
  150. package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy/quota-cookie/route.js.nft.json +1 -1
  151. package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/bulk-import/[jobId]/cancel/route.js.nft.json +1 -1
  152. package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/bulk-import/[jobId]/manual/[workerId]/route.js.nft.json +1 -1
  153. package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/bulk-import/[jobId]/route.js.nft.json +1 -1
  154. package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/bulk-import/latest/route.js.nft.json +1 -1
  155. package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/bulk-import/route.js.nft.json +1 -1
  156. package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/bulk-token/route.js.nft.json +1 -1
  157. package/cli/app/.next-cli-build/server/app/api/oauth/codebuddy-cn/quota-cookie/route.js.nft.json +1 -1
  158. package/cli/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js.nft.json +1 -1
  159. package/cli/app/.next-cli-build/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -1
  160. package/cli/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js.nft.json +1 -1
  161. package/cli/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js.nft.json +1 -1
  162. package/cli/app/.next-cli-build/server/app/api/oauth/grok-cli/bulk-import/[jobId]/cancel/route.js.nft.json +1 -1
  163. package/cli/app/.next-cli-build/server/app/api/oauth/grok-cli/bulk-import/[jobId]/manual/[workerId]/route.js.nft.json +1 -1
  164. package/cli/app/.next-cli-build/server/app/api/oauth/grok-cli/bulk-import/[jobId]/route.js.nft.json +1 -1
  165. package/cli/app/.next-cli-build/server/app/api/oauth/grok-cli/bulk-import/latest/route.js.nft.json +1 -1
  166. package/cli/app/.next-cli-build/server/app/api/oauth/grok-cli/bulk-import/route.js.nft.json +1 -1
  167. package/cli/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -1
  168. package/cli/app/.next-cli-build/server/app/api/oauth/kiro/auto-import/route.js.nft.json +1 -1
  169. package/cli/app/.next-cli-build/server/app/api/oauth/kiro/bulk-import/[jobId]/cancel/route.js.nft.json +1 -1
  170. package/cli/app/.next-cli-build/server/app/api/oauth/kiro/bulk-import/[jobId]/manual/[workerId]/route.js.nft.json +1 -1
  171. package/cli/app/.next-cli-build/server/app/api/oauth/kiro/bulk-import/[jobId]/route.js.nft.json +1 -1
  172. package/cli/app/.next-cli-build/server/app/api/oauth/kiro/bulk-import/latest/route.js.nft.json +1 -1
  173. package/cli/app/.next-cli-build/server/app/api/oauth/kiro/bulk-import/route.js.nft.json +1 -1
  174. package/cli/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
  175. package/cli/app/.next-cli-build/server/app/api/oauth/kiro/social-authorize/route.js.nft.json +1 -1
  176. package/cli/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -1
  177. package/cli/app/.next-cli-build/server/app/api/oauth/qoder/bulk-import/[jobId]/cancel/route.js.nft.json +1 -1
  178. package/cli/app/.next-cli-build/server/app/api/oauth/qoder/bulk-import/[jobId]/manual/[workerId]/route.js.nft.json +1 -1
  179. package/cli/app/.next-cli-build/server/app/api/oauth/qoder/bulk-import/[jobId]/route.js.nft.json +1 -1
  180. package/cli/app/.next-cli-build/server/app/api/oauth/qoder/bulk-import/latest/route.js.nft.json +1 -1
  181. package/cli/app/.next-cli-build/server/app/api/oauth/qoder/bulk-import/route.js.nft.json +1 -1
  182. package/cli/app/.next-cli-build/server/app/api/pricing/route.js.nft.json +1 -1
  183. package/cli/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -1
  184. package/cli/app/.next-cli-build/server/app/api/provider-nodes/route.js.nft.json +1 -1
  185. package/cli/app/.next-cli-build/server/app/api/provider-nodes/validate/route.js.nft.json +1 -1
  186. package/cli/app/.next-cli-build/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
  187. package/cli/app/.next-cli-build/server/app/api/providers/[id]/route.js.nft.json +1 -1
  188. package/cli/app/.next-cli-build/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
  189. package/cli/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js +1 -1
  190. package/cli/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js.nft.json +1 -1
  191. package/cli/app/.next-cli-build/server/app/api/providers/bulk-delete/route.js.nft.json +1 -1
  192. package/cli/app/.next-cli-build/server/app/api/providers/client/route.js.nft.json +1 -1
  193. package/cli/app/.next-cli-build/server/app/api/providers/kilo/free-models/route.js.nft.json +1 -1
  194. package/cli/app/.next-cli-build/server/app/api/providers/route.js +1 -1
  195. package/cli/app/.next-cli-build/server/app/api/providers/route.js.nft.json +1 -1
  196. package/cli/app/.next-cli-build/server/app/api/providers/suggested-models/route.js.nft.json +1 -1
  197. package/cli/app/.next-cli-build/server/app/api/providers/test-batch/route.js.nft.json +1 -1
  198. package/cli/app/.next-cli-build/server/app/api/providers/validate/route.js +1 -1
  199. package/cli/app/.next-cli-build/server/app/api/providers/validate/route.js.nft.json +1 -1
  200. package/cli/app/.next-cli-build/server/app/api/proxy-pools/[id]/route.js.nft.json +1 -1
  201. package/cli/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js +1 -1
  202. package/cli/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js.nft.json +1 -1
  203. package/cli/app/.next-cli-build/server/app/api/proxy-pools/cloudflare-deploy/route.js.nft.json +1 -1
  204. package/cli/app/.next-cli-build/server/app/api/proxy-pools/deno-deploy/route.js.nft.json +1 -1
  205. package/cli/app/.next-cli-build/server/app/api/proxy-pools/route.js.nft.json +1 -1
  206. package/cli/app/.next-cli-build/server/app/api/proxy-pools/vercel-deploy/route.js.nft.json +1 -1
  207. package/cli/app/.next-cli-build/server/app/api/pxpipe/health/route.js.nft.json +1 -1
  208. package/cli/app/.next-cli-build/server/app/api/pxpipe/install/route.js.nft.json +1 -1
  209. package/cli/app/.next-cli-build/server/app/api/pxpipe/restart/route.js.nft.json +1 -1
  210. package/cli/app/.next-cli-build/server/app/api/pxpipe/start/route.js.nft.json +1 -1
  211. package/cli/app/.next-cli-build/server/app/api/pxpipe/stats/route.js.nft.json +1 -1
  212. package/cli/app/.next-cli-build/server/app/api/pxpipe/status/route.js.nft.json +1 -1
  213. package/cli/app/.next-cli-build/server/app/api/pxpipe/stop/route.js.nft.json +1 -1
  214. package/cli/app/.next-cli-build/server/app/api/settings/database/route.js.nft.json +1 -1
  215. package/cli/app/.next-cli-build/server/app/api/settings/proxy-test/route.js +1 -1
  216. package/cli/app/.next-cli-build/server/app/api/settings/proxy-test/route.js.nft.json +1 -1
  217. package/cli/app/.next-cli-build/server/app/api/settings/require-login/route.js.nft.json +1 -1
  218. package/cli/app/.next-cli-build/server/app/api/settings/route.js.nft.json +1 -1
  219. package/cli/app/.next-cli-build/server/app/api/shutdown/route.js.nft.json +1 -1
  220. package/cli/app/.next-cli-build/server/app/api/tags/route.js.nft.json +1 -1
  221. package/cli/app/.next-cli-build/server/app/api/terminal/auth/setup/route.js.nft.json +1 -1
  222. package/cli/app/.next-cli-build/server/app/api/terminal/auth/status/route.js.nft.json +1 -1
  223. package/cli/app/.next-cli-build/server/app/api/terminal/auth/unlock/route.js.nft.json +1 -1
  224. package/cli/app/.next-cli-build/server/app/api/terminal/session/[id]/input/route.js.nft.json +1 -1
  225. package/cli/app/.next-cli-build/server/app/api/terminal/session/[id]/resize/route.js.nft.json +1 -1
  226. package/cli/app/.next-cli-build/server/app/api/terminal/session/[id]/route.js.nft.json +1 -1
  227. package/cli/app/.next-cli-build/server/app/api/terminal/session/[id]/stream/route.js.nft.json +1 -1
  228. package/cli/app/.next-cli-build/server/app/api/terminal/session/route.js.nft.json +1 -1
  229. package/cli/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
  230. package/cli/app/.next-cli-build/server/app/api/translator/console-logs/route.js.nft.json +1 -1
  231. package/cli/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
  232. package/cli/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js.nft.json +1 -1
  233. package/cli/app/.next-cli-build/server/app/api/translator/load/route.js.nft.json +1 -1
  234. package/cli/app/.next-cli-build/server/app/api/translator/save/route.js.nft.json +1 -1
  235. package/cli/app/.next-cli-build/server/app/api/translator/send/route.js.nft.json +1 -1
  236. package/cli/app/.next-cli-build/server/app/api/translator/translate/route.js.nft.json +1 -1
  237. package/cli/app/.next-cli-build/server/app/api/tunnel/disable/route.js.nft.json +1 -1
  238. package/cli/app/.next-cli-build/server/app/api/tunnel/enable/route.js.nft.json +1 -1
  239. package/cli/app/.next-cli-build/server/app/api/tunnel/status/route.js.nft.json +1 -1
  240. package/cli/app/.next-cli-build/server/app/api/tunnel/tailscale-check/route.js.nft.json +1 -1
  241. package/cli/app/.next-cli-build/server/app/api/tunnel/tailscale-disable/route.js.nft.json +1 -1
  242. package/cli/app/.next-cli-build/server/app/api/tunnel/tailscale-enable/route.js.nft.json +1 -1
  243. package/cli/app/.next-cli-build/server/app/api/tunnel/tailscale-install/route.js.nft.json +1 -1
  244. package/cli/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
  245. package/cli/app/.next-cli-build/server/app/api/usage/aggregate/route.js.nft.json +1 -1
  246. package/cli/app/.next-cli-build/server/app/api/usage/chart/route.js.nft.json +1 -1
  247. package/cli/app/.next-cli-build/server/app/api/usage/history/route.js.nft.json +1 -1
  248. package/cli/app/.next-cli-build/server/app/api/usage/providers/route.js.nft.json +1 -1
  249. package/cli/app/.next-cli-build/server/app/api/usage/request-details/route.js.nft.json +1 -1
  250. package/cli/app/.next-cli-build/server/app/api/usage/request-logs/route.js.nft.json +1 -1
  251. package/cli/app/.next-cli-build/server/app/api/usage/stats/route.js.nft.json +1 -1
  252. package/cli/app/.next-cli-build/server/app/api/usage/stream/route.js.nft.json +1 -1
  253. package/cli/app/.next-cli-build/server/app/api/v1/api/chat/route.js.nft.json +1 -1
  254. package/cli/app/.next-cli-build/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
  255. package/cli/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js.nft.json +1 -1
  256. package/cli/app/.next-cli-build/server/app/api/v1/audio/voices/route.js.nft.json +1 -1
  257. package/cli/app/.next-cli-build/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
  258. package/cli/app/.next-cli-build/server/app/api/v1/embeddings/route.js.nft.json +1 -1
  259. package/cli/app/.next-cli-build/server/app/api/v1/images/generations/route.js.nft.json +1 -1
  260. package/cli/app/.next-cli-build/server/app/api/v1/messages/count_tokens/route.js.nft.json +1 -1
  261. package/cli/app/.next-cli-build/server/app/api/v1/messages/route.js.nft.json +1 -1
  262. package/cli/app/.next-cli-build/server/app/api/v1/models/[kind]/route.js.nft.json +1 -1
  263. package/cli/app/.next-cli-build/server/app/api/v1/models/info/route.js.nft.json +1 -1
  264. package/cli/app/.next-cli-build/server/app/api/v1/models/route.js.nft.json +1 -1
  265. package/cli/app/.next-cli-build/server/app/api/v1/responses/compact/route.js.nft.json +1 -1
  266. package/cli/app/.next-cli-build/server/app/api/v1/responses/route.js.nft.json +1 -1
  267. package/cli/app/.next-cli-build/server/app/api/v1/route.js.nft.json +1 -1
  268. package/cli/app/.next-cli-build/server/app/api/v1/search/route.js.nft.json +1 -1
  269. package/cli/app/.next-cli-build/server/app/api/v1/web/fetch/route.js.nft.json +1 -1
  270. package/cli/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
  271. package/cli/app/.next-cli-build/server/app/api/v1beta/models/route.js.nft.json +1 -1
  272. package/cli/app/.next-cli-build/server/app/api/version/route.js +1 -1
  273. package/cli/app/.next-cli-build/server/app/api/version/route.js.nft.json +1 -1
  274. package/cli/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
  275. package/cli/app/.next-cli-build/server/app/api/version/shutdown/route.js.nft.json +1 -1
  276. package/cli/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
  277. package/cli/app/.next-cli-build/server/app/api/version/update/route.js.nft.json +1 -1
  278. package/cli/app/.next-cli-build/server/app/callback/page.js.nft.json +1 -1
  279. package/cli/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
  280. package/cli/app/.next-cli-build/server/app/callback.html +1 -1
  281. package/cli/app/.next-cli-build/server/app/callback.rsc +3 -3
  282. package/cli/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +3 -3
  283. package/cli/app/.next-cli-build/server/app/callback.segments/_head.segment.rsc +1 -1
  284. package/cli/app/.next-cli-build/server/app/callback.segments/_index.segment.rsc +3 -3
  285. package/cli/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +1 -1
  286. package/cli/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
  287. package/cli/app/.next-cli-build/server/app/callback.segments/callback.segment.rsc +1 -1
  288. package/cli/app/.next-cli-build/server/app/dashboard/automation.html +1 -1
  289. package/cli/app/.next-cli-build/server/app/dashboard/automation.rsc +5 -5
  290. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard/automation/__PAGE__.segment.rsc +2 -2
  291. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard/automation.segment.rsc +1 -1
  292. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  293. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  294. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_full.segment.rsc +5 -5
  295. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_head.segment.rsc +1 -1
  296. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_index.segment.rsc +3 -3
  297. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_tree.segment.rsc +1 -1
  298. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
  299. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +5 -5
  300. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
  301. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
  302. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  303. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  304. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +5 -5
  305. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
  306. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_index.segment.rsc +3 -3
  307. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +1 -1
  308. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
  309. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +5 -5
  310. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
  311. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
  312. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  313. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  314. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +5 -5
  315. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
  316. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_index.segment.rsc +3 -3
  317. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +1 -1
  318. package/cli/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
  319. package/cli/app/.next-cli-build/server/app/dashboard/combos.rsc +5 -5
  320. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
  321. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
  322. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  323. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  324. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +5 -5
  325. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
  326. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_index.segment.rsc +3 -3
  327. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +1 -1
  328. package/cli/app/.next-cli-build/server/app/dashboard/context.html +1 -1
  329. package/cli/app/.next-cli-build/server/app/dashboard/context.rsc +5 -5
  330. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard/context/__PAGE__.segment.rsc +2 -2
  331. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard/context.segment.rsc +1 -1
  332. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  333. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  334. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_full.segment.rsc +5 -5
  335. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_head.segment.rsc +1 -1
  336. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_index.segment.rsc +3 -3
  337. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_tree.segment.rsc +1 -1
  338. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
  339. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.rsc +5 -5
  340. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
  341. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
  342. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  343. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  344. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +5 -5
  345. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
  346. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_index.segment.rsc +3 -3
  347. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +1 -1
  348. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
  349. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +5 -5
  350. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +2 -2
  351. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web.segment.rsc +1 -1
  352. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
  353. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  354. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  355. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +5 -5
  356. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_head.segment.rsc +1 -1
  357. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_index.segment.rsc +3 -3
  358. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +1 -1
  359. package/cli/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
  360. package/cli/app/.next-cli-build/server/app/dashboard/mitm.rsc +5 -5
  361. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
  362. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
  363. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  364. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  365. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +5 -5
  366. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
  367. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_index.segment.rsc +3 -3
  368. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +1 -1
  369. package/cli/app/.next-cli-build/server/app/dashboard/playground.html +1 -1
  370. package/cli/app/.next-cli-build/server/app/dashboard/playground.rsc +5 -5
  371. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard/playground/__PAGE__.segment.rsc +2 -2
  372. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard/playground.segment.rsc +1 -1
  373. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  374. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  375. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_full.segment.rsc +5 -5
  376. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_head.segment.rsc +1 -1
  377. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_index.segment.rsc +3 -3
  378. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_tree.segment.rsc +1 -1
  379. package/cli/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
  380. package/cli/app/.next-cli-build/server/app/dashboard/profile.rsc +5 -5
  381. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
  382. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
  383. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  384. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  385. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +5 -5
  386. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
  387. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_index.segment.rsc +3 -3
  388. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +1 -1
  389. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
  390. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.rsc +5 -5
  391. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
  392. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
  393. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  394. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  395. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  396. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +5 -5
  397. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
  398. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_index.segment.rsc +3 -3
  399. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +1 -1
  400. package/cli/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
  401. package/cli/app/.next-cli-build/server/app/dashboard/providers.rsc +5 -5
  402. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
  403. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  404. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  405. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  406. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +5 -5
  407. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
  408. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_index.segment.rsc +3 -3
  409. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +1 -1
  410. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
  411. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +5 -5
  412. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
  413. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
  414. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  415. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  416. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +5 -5
  417. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
  418. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +3 -3
  419. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +1 -1
  420. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.html +1 -1
  421. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.rsc +5 -5
  422. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe/__PAGE__.segment.rsc +2 -2
  423. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe.segment.rsc +1 -1
  424. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  425. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  426. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_full.segment.rsc +5 -5
  427. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_head.segment.rsc +1 -1
  428. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_index.segment.rsc +3 -3
  429. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_tree.segment.rsc +1 -1
  430. package/cli/app/.next-cli-build/server/app/dashboard/quota.html +2 -2
  431. package/cli/app/.next-cli-build/server/app/dashboard/quota.rsc +6 -6
  432. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +3 -3
  433. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
  434. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  435. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  436. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +6 -6
  437. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
  438. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_index.segment.rsc +3 -3
  439. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +1 -1
  440. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing/page.js.nft.json +1 -1
  441. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  442. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
  443. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +3 -3
  444. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +3 -3
  445. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
  446. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +3 -3
  447. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +1 -1
  448. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
  449. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
  450. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
  451. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
  452. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.html +1 -1
  453. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.rsc +5 -5
  454. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +2 -2
  455. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver.segment.rsc +1 -1
  456. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  457. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  458. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_full.segment.rsc +5 -5
  459. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_head.segment.rsc +1 -1
  460. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_index.segment.rsc +3 -3
  461. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_tree.segment.rsc +1 -1
  462. package/cli/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
  463. package/cli/app/.next-cli-build/server/app/dashboard/translator.rsc +5 -5
  464. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
  465. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
  466. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  467. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  468. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +5 -5
  469. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
  470. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_index.segment.rsc +3 -3
  471. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +1 -1
  472. package/cli/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
  473. package/cli/app/.next-cli-build/server/app/dashboard/usage.rsc +5 -5
  474. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
  475. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
  476. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  477. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  478. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +5 -5
  479. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
  480. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_index.segment.rsc +3 -3
  481. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +1 -1
  482. package/cli/app/.next-cli-build/server/app/dashboard.html +1 -1
  483. package/cli/app/.next-cli-build/server/app/dashboard.rsc +5 -5
  484. package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
  485. package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  486. package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  487. package/cli/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +5 -5
  488. package/cli/app/.next-cli-build/server/app/dashboard.segments/_head.segment.rsc +1 -1
  489. package/cli/app/.next-cli-build/server/app/dashboard.segments/_index.segment.rsc +3 -3
  490. package/cli/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +1 -1
  491. package/cli/app/.next-cli-build/server/app/index.html +1 -1
  492. package/cli/app/.next-cli-build/server/app/index.rsc +3 -3
  493. package/cli/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  494. package/cli/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +3 -3
  495. package/cli/app/.next-cli-build/server/app/index.segments/_head.segment.rsc +1 -1
  496. package/cli/app/.next-cli-build/server/app/index.segments/_index.segment.rsc +3 -3
  497. package/cli/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +1 -1
  498. package/cli/app/.next-cli-build/server/app/landing/page.js.nft.json +1 -1
  499. package/cli/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
  500. package/cli/app/.next-cli-build/server/app/landing.html +1 -1
  501. package/cli/app/.next-cli-build/server/app/landing.rsc +3 -3
  502. package/cli/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +3 -3
  503. package/cli/app/.next-cli-build/server/app/landing.segments/_head.segment.rsc +1 -1
  504. package/cli/app/.next-cli-build/server/app/landing.segments/_index.segment.rsc +3 -3
  505. package/cli/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +1 -1
  506. package/cli/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +1 -1
  507. package/cli/app/.next-cli-build/server/app/landing.segments/landing.segment.rsc +1 -1
  508. package/cli/app/.next-cli-build/server/app/login/page.js.nft.json +1 -1
  509. package/cli/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
  510. package/cli/app/.next-cli-build/server/app/login.html +1 -1
  511. package/cli/app/.next-cli-build/server/app/login.rsc +4 -4
  512. package/cli/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +4 -4
  513. package/cli/app/.next-cli-build/server/app/login.segments/_head.segment.rsc +1 -1
  514. package/cli/app/.next-cli-build/server/app/login.segments/_index.segment.rsc +3 -3
  515. package/cli/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +1 -1
  516. package/cli/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  517. package/cli/app/.next-cli-build/server/app/login.segments/login.segment.rsc +1 -1
  518. package/cli/app/.next-cli-build/server/app/manifest.webmanifest/route.js.nft.json +1 -1
  519. package/cli/app/.next-cli-build/server/app/page.js.nft.json +1 -1
  520. package/cli/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
  521. package/cli/app/.next-cli-build/server/app-paths-manifest.json +26 -26
  522. package/cli/app/.next-cli-build/server/chunks/1396.js +1 -1
  523. package/cli/app/.next-cli-build/server/chunks/2130.js +1 -0
  524. package/cli/app/.next-cli-build/server/chunks/3155.js +1 -1
  525. package/cli/app/.next-cli-build/server/chunks/3407.js +1 -1
  526. package/cli/app/.next-cli-build/server/chunks/3487.js +1 -1
  527. package/cli/app/.next-cli-build/server/chunks/4746.js +1 -1
  528. package/cli/app/.next-cli-build/server/chunks/5000.js +2 -2
  529. package/cli/app/.next-cli-build/server/chunks/6896.js +1 -1
  530. package/cli/app/.next-cli-build/server/chunks/7774.js +2 -2
  531. package/cli/app/.next-cli-build/server/chunks/8157.js +1 -1
  532. package/cli/app/.next-cli-build/server/chunks/8371.js +1 -1
  533. package/cli/app/.next-cli-build/server/chunks/8590.js +1 -1
  534. package/cli/app/.next-cli-build/server/chunks/891.js +1 -1
  535. package/cli/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
  536. package/cli/app/.next-cli-build/server/pages/404.html +1 -1
  537. package/cli/app/.next-cli-build/server/pages/500.html +1 -1
  538. package/cli/app/.next-cli-build/static/chunks/{3702-790d0c6b750c193e.js → 3702-2ae85ab0e262237e.js} +1 -1
  539. 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/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/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
  540. package/cli/app/package.json +1 -1
  541. package/cli/package.json +1 -1
  542. package/package.json +1 -1
  543. package/src/lib/oauth/services/grokCliBulkImportManager.js +110 -59
  544. package/src/lib/oauth/services/grokXaiEmailAutomation.js +428 -34
  545. package/src/lib/oauth/services/kiroGoogleAutomation.js +518 -161
  546. package/src/lib/oauth/services/tempmailClient.js +146 -18
  547. /package/cli/app/.next-cli-build/static/{FlRjqQtzHVNvcFcCzVDTM → vfxzLlib7n2DZ-lkAYEUg}/_buildManifest.js +0 -0
  548. /package/cli/app/.next-cli-build/static/{FlRjqQtzHVNvcFcCzVDTM → vfxzLlib7n2DZ-lkAYEUg}/_ssgManifest.js +0 -0
@@ -96,14 +96,28 @@ const GOOGLE_LOGIN_BUTTON_SELECTORS = [
96
96
  'a#social-google',
97
97
  'a:has-text("Sign up with Google")',
98
98
  'a:has-text("Log in with Google")',
99
+ 'a:has-text("Login with Google")',
100
+ 'a:has-text("Continue with Google")',
101
+ 'a:has-text("Sign in with Google")',
99
102
  'button:has-text("Sign up with Google")',
100
103
  'button:has-text("Log in with Google")',
104
+ 'button:has-text("Login with Google")',
105
+ 'button:has-text("Continue with Google")',
106
+ 'button:has-text("Sign in with Google")',
101
107
  'button:has-text("Google")',
102
108
  'a:has-text("Google")',
109
+ 'div[role="button"]:has-text("Continue with Google")',
110
+ 'div[role="button"]:has-text("Login with Google")',
103
111
  'div[role="button"]:has-text("Google")',
112
+ 'span:has-text("Continue with Google")',
113
+ 'span:has-text("Login with Google")',
104
114
  'span:has-text("Google")',
105
115
  '[aria-label*="Google"]',
106
116
  '[data-provider*="google" i]',
117
+ // xAI / Grok device + account pages
118
+ 'button:has-text("Login with Google")',
119
+ 'button:has-text("Continue with Google")',
120
+ '[data-testid*="google" i]',
107
121
  ];
108
122
 
109
123
  const TERMS_CHECKBOX_SELECTORS = [
@@ -413,55 +427,40 @@ async function waitForFirstVisibleLocator(page, selector, { timeout = 15_000, po
413
427
  async function fillInputResilient(locator, value, { timeout = 15_000 } = {}) {
414
428
  if (!locator || value == null) return false;
415
429
 
416
- // Primary: click + type with human-like random delay to avoid CAPTCHA triggers.
417
- // Avoid fill() as primary it sets the value instantly which Google detects.
430
+ // Prefer fill() first (fast). CloakBrowser already spoofs input events well
431
+ // enough for Google in practice; slow type is only a fallback for React
432
+ // controlled fields that reject programmatic fill.
418
433
  try {
419
- await locator.click({ timeout: 5_000 });
434
+ await locator.click({ timeout: 3_000 });
420
435
  } catch {
421
436
  /* noop */
422
437
  }
423
438
  try {
424
- await locator.fill("", { timeout: 3_000 });
439
+ await locator.fill(String(value), { timeout: Math.min(timeout, 8_000) });
440
+ const observed = await locator.inputValue().catch(() => "");
441
+ if (observed === value) return true;
442
+ } catch {
443
+ /* fall through to typed input */
444
+ }
445
+
446
+ try {
447
+ await locator.fill("", { timeout: 2_000 });
425
448
  } catch {
426
449
  /* noop */
427
450
  }
428
451
  try {
429
- const delay = Math.floor(40 + Math.random() * 80); // 40-120ms per keystroke
430
- await locator.type(value, { delay, timeout });
452
+ // Light humanization only if fill failed 15–35ms/key (was 40120ms).
453
+ const delay = Math.floor(15 + Math.random() * 20);
454
+ await locator.type(String(value), { delay, timeout });
431
455
  } catch {
432
- // If type() fails, fall back to fill()
433
456
  try {
434
- await locator.fill(value, { timeout });
457
+ await locator.fill(String(value), { timeout });
435
458
  } catch {
436
459
  return false;
437
460
  }
438
461
  }
439
462
 
440
463
  let observed = "";
441
- try {
442
- observed = await locator.inputValue();
443
- } catch {
444
- observed = "";
445
- }
446
- if (observed === value) return true;
447
-
448
- // Final fallback for React/Vue-controlled inputs
449
- try {
450
- await locator.click({ timeout: 5_000 });
451
- } catch {
452
- /* noop */
453
- }
454
- try {
455
- await locator.fill("");
456
- } catch {
457
- /* noop */
458
- }
459
- try {
460
- await locator.type(value, { delay: 50, timeout });
461
- } catch {
462
- return false;
463
- }
464
-
465
464
  try {
466
465
  observed = await locator.inputValue();
467
466
  } catch {
@@ -622,9 +621,16 @@ async function waitThroughGoogleInterstitials(page, reportStep, { maxWaitMs = 20
622
621
  function isProviderPage(page) {
623
622
  try {
624
623
  const url = new URL(page.url());
625
- return /codebuddy\.(ai|cn)$/.test(url.hostname)
626
- || url.hostname.endsWith(".codebuddy.ai")
627
- || url.hostname.endsWith(".codebuddy.cn");
624
+ const host = url.hostname || "";
625
+ return /codebuddy\.(ai|cn)$/.test(host)
626
+ || host.endsWith(".codebuddy.ai")
627
+ || host.endsWith(".codebuddy.cn")
628
+ // xAI / Grok CLI device authorization + account host
629
+ || host === "accounts.x.ai"
630
+ || host === "auth.x.ai"
631
+ || host.endsWith(".x.ai")
632
+ || host === "grok.com"
633
+ || host.endsWith(".grok.com");
628
634
  } catch {
629
635
  return false;
630
636
  }
@@ -1188,6 +1194,38 @@ async function handleCodeBuddyStartedAuthorization(page, reportStep) {
1188
1194
  return true;
1189
1195
  }
1190
1196
 
1197
+ async function providerHasGoogleLogin(page) {
1198
+ try {
1199
+ for (const name of [/continue with google/i, /sign in with google/i, /sign up with google/i, /^google$/i]) {
1200
+ const btn = page.getByRole("button", { name }).first();
1201
+ if (await btn.isVisible({ timeout: 300 }).catch(() => false)) return true;
1202
+ const link = page.getByRole("link", { name }).first();
1203
+ if (await link.isVisible({ timeout: 200 }).catch(() => false)) return true;
1204
+ }
1205
+ } catch {
1206
+ /* ignore */
1207
+ }
1208
+ for (const selector of GOOGLE_LOGIN_BUTTON_SELECTORS) {
1209
+ try {
1210
+ const loc = page.locator(selector).first();
1211
+ if (await loc.isVisible({ timeout: 200 }).catch(() => false)) return true;
1212
+ } catch {
1213
+ /* next */
1214
+ }
1215
+ }
1216
+ return false;
1217
+ }
1218
+
1219
+ function isXaiProviderPage(page) {
1220
+ try {
1221
+ const host = new URL(page.url()).hostname || "";
1222
+ return host === "accounts.x.ai" || host === "auth.x.ai" || host.endsWith(".x.ai")
1223
+ || host === "grok.com" || host.endsWith(".grok.com");
1224
+ } catch {
1225
+ return false;
1226
+ }
1227
+ }
1228
+
1191
1229
  async function handleProviderOnboarding(page, reportStep, serviceLabel) {
1192
1230
  if (!isProviderPage(page) || isGoogleAuthPage(page)) return false;
1193
1231
 
@@ -1208,37 +1246,53 @@ async function handleProviderOnboarding(page, reportStep, serviceLabel) {
1208
1246
  return true;
1209
1247
  }
1210
1248
 
1211
- const selectedNativeRegion = await selectNativeRegionOption(page);
1212
- if (selectedNativeRegion) {
1213
- reportStep("selecting_provider_region", `Selected ${serviceLabel} region`);
1214
- await page.waitForTimeout(700);
1215
- return true;
1216
- }
1249
+ // Region / workspace defaults are CodeBuddy-style — not xAI device approve.
1250
+ // False-positive select matches on xAI wasted the session into "Invalid action".
1251
+ if (!isXaiProviderPage(page)) {
1252
+ const selectedNativeRegion = await selectNativeRegionOption(page);
1253
+ if (selectedNativeRegion) {
1254
+ reportStep("selecting_provider_region", `Selected ${serviceLabel} region`);
1255
+ await page.waitForTimeout(700);
1256
+ return true;
1257
+ }
1258
+
1259
+ const openedRegionMenu = await clickFirstActionable(page, PROVIDER_REGION_TRIGGER_SELECTORS);
1260
+ if (openedRegionMenu) {
1261
+ reportStep("opening_provider_region_selector", `Opening ${serviceLabel} region selector`);
1262
+ await page.waitForTimeout(500);
1263
+ const selectedRegion = await clickFirstActionable(page, PROVIDER_REGION_OPTION_SELECTORS);
1264
+ if (selectedRegion) {
1265
+ reportStep("selecting_provider_region", `Selected ${serviceLabel} region`);
1266
+ await page.waitForTimeout(700);
1267
+ }
1268
+ return true;
1269
+ }
1217
1270
 
1218
- const openedRegionMenu = await clickFirstActionable(page, PROVIDER_REGION_TRIGGER_SELECTORS);
1219
- if (openedRegionMenu) {
1220
- reportStep("opening_provider_region_selector", `Opening ${serviceLabel} region selector`);
1221
- await page.waitForTimeout(500);
1222
1271
  const selectedRegion = await clickFirstActionable(page, PROVIDER_REGION_OPTION_SELECTORS);
1223
1272
  if (selectedRegion) {
1224
1273
  reportStep("selecting_provider_region", `Selected ${serviceLabel} region`);
1225
1274
  await page.waitForTimeout(700);
1275
+ return true;
1276
+ }
1277
+
1278
+ const filledDefaults = await fillProviderOnboardingDefaults(page);
1279
+ if (filledDefaults) {
1280
+ reportStep("filling_provider_onboarding", `Filled ${serviceLabel} onboarding defaults`);
1281
+ await page.waitForTimeout(500);
1282
+ return true;
1226
1283
  }
1227
- return true;
1228
1284
  }
1229
1285
 
1230
- const selectedRegion = await clickFirstActionable(page, PROVIDER_REGION_OPTION_SELECTORS);
1231
- if (selectedRegion) {
1232
- reportStep("selecting_provider_region", `Selected ${serviceLabel} region`);
1233
- await page.waitForTimeout(700);
1234
- return true;
1286
+ // xAI device pages: never click generic Continue/Next/Confirm. Those submit
1287
+ // the device form without a session → "Invalid action" and burn 1–3 minutes.
1288
+ // Only Google SSO (login gate) + Allow/Authorize (clickXaiDeviceAuthorize).
1289
+ if (isXaiProviderPage(page)) {
1290
+ return false;
1235
1291
  }
1236
1292
 
1237
- const filledDefaults = await fillProviderOnboardingDefaults(page);
1238
- if (filledDefaults) {
1239
- reportStep("filling_provider_onboarding", `Filled ${serviceLabel} onboarding defaults`);
1240
- await page.waitForTimeout(500);
1241
- return true;
1293
+ // If Google SSO is still offered, do not mash generic Continue.
1294
+ if (await providerHasGoogleLogin(page)) {
1295
+ return false;
1242
1296
  }
1243
1297
 
1244
1298
  const clickedAction = await clickFirstActionable(page, PROVIDER_ONBOARDING_ACTION_SELECTORS);
@@ -1251,36 +1305,217 @@ async function handleProviderOnboarding(page, reportStep, serviceLabel) {
1251
1305
  return false;
1252
1306
  }
1253
1307
 
1254
- async function handleProviderLoginGate(page, reportStep) {
1308
+ /**
1309
+ * xAI device step 1: "Enter the code shown in your terminal" → Continue.
1310
+ * Only after this do we land on sign-in with "Login with Google".
1311
+ * Never run this after Google login — that re-submits Continue into Invalid action.
1312
+ */
1313
+ async function handleXaiDeviceCodeConfirm(page, reportStep, { alreadyAuthed = false } = {}) {
1314
+ if (!isXaiProviderPage(page)) return false;
1315
+ if (alreadyAuthed) return false;
1316
+ // Already on Google SSO wall — past this step.
1317
+ if (await providerHasGoogleLogin(page)) return false;
1318
+
1319
+ const text = await readPageText(page).catch(() => "");
1320
+ // Logged-in device/approve screens — do not re-click Continue.
1321
+ if (/sign out|log out|device authorized|you can close|invalid action/i.test(text)) {
1322
+ return false;
1323
+ }
1324
+
1325
+ const isCodeConfirm =
1326
+ /enter the code shown in your terminal/i.test(text)
1327
+ || /only enter this code if you just initiated/i.test(text)
1328
+ || (/sign in to grok/i.test(text) && /continue/i.test(text) && !/login with/i.test(text));
1329
+ if (!isCodeConfirm) return false;
1330
+
1331
+ try {
1332
+ const btn = page.getByRole("button", { name: /^Continue$/i }).first();
1333
+ if (await btn.isVisible({ timeout: 600 }).catch(() => false)) {
1334
+ await btn.click({ timeout: 5_000 });
1335
+ reportStep?.("confirming_device_code", "Confirmed device user code on xAI");
1336
+ await page.waitForTimeout(1_200);
1337
+ return true;
1338
+ }
1339
+ } catch {
1340
+ /* fall through */
1341
+ }
1342
+
1343
+ const clicked = await clickFirstActionable(page, [
1344
+ 'button[type="submit"]:has-text("Continue")',
1345
+ 'button:has-text("Continue")',
1346
+ ]);
1347
+ if (clicked) {
1348
+ reportStep?.("confirming_device_code", "Confirmed device user code on xAI");
1349
+ await page.waitForTimeout(1_200);
1350
+ return true;
1351
+ }
1352
+ return false;
1353
+ }
1354
+
1355
+ async function clickGoogleLoginRole(page) {
1356
+ // Role-based matches are more reliable on SPA auth shells (xAI, etc.)
1357
+ // than CSS :has-text alone — especially when the label is nested.
1358
+ const roleNames = [
1359
+ /login with google/i,
1360
+ /log in with google/i,
1361
+ /continue with google/i,
1362
+ /sign up with google/i,
1363
+ /sign in with google/i,
1364
+ /^google$/i,
1365
+ ];
1366
+ for (const name of roleNames) {
1367
+ try {
1368
+ const btn = page.getByRole("button", { name }).first();
1369
+ if (await btn.isVisible({ timeout: 250 }).catch(() => false)) {
1370
+ const enabled = await btn.isEnabled().catch(() => true);
1371
+ if (!enabled) continue;
1372
+ await btn.click({ timeout: 5_000 });
1373
+ return true;
1374
+ }
1375
+ } catch {
1376
+ /* next */
1377
+ }
1378
+ try {
1379
+ const link = page.getByRole("link", { name }).first();
1380
+ if (await link.isVisible({ timeout: 200 }).catch(() => false)) {
1381
+ await link.click({ timeout: 5_000 });
1382
+ return true;
1383
+ }
1384
+ } catch {
1385
+ /* next */
1386
+ }
1387
+ }
1388
+ return false;
1389
+ }
1390
+
1391
+ async function ensureProviderTermsChecked(page, reportStep) {
1392
+ // Returns true only when we newly checked a box (not when already checked).
1393
+ for (const scope of getInteractionScopes(page)) {
1394
+ for (const selector of TERMS_CHECKBOX_SELECTORS) {
1395
+ try {
1396
+ const locator = scope.locator(selector).first();
1397
+ const count = await locator.count().catch(() => 0);
1398
+ if (!count) continue;
1399
+ const visible = await locator.isVisible().catch(() => false);
1400
+ if (!visible) continue;
1401
+ const already = await locator.isChecked().catch(() => false);
1402
+ if (already) return false;
1403
+ const did = await locator.check({ force: true, timeout: 3_000 }).then(() => true).catch(() => false)
1404
+ || await locator.click({ force: true, timeout: 3_000 }).then(() => true).catch(() => false);
1405
+ if (did) {
1406
+ reportStep?.("accepting_provider_terms", "Accepted provider terms for Google login");
1407
+ // xAI enables Google SSO only after the checkbox settles.
1408
+ await page.waitForTimeout(500);
1409
+ return true;
1410
+ }
1411
+ } catch {
1412
+ /* next */
1413
+ }
1414
+ }
1415
+ }
1416
+ return false;
1417
+ }
1418
+
1419
+ async function handleProviderLoginGate(page, reportStep, { allowGoogleClick = true } = {}) {
1255
1420
  if (isGoogleAuthPage(page)) return false;
1256
1421
 
1257
1422
  const confirmedExistingDialog = await clickFirstActionable(page, PRIVACY_CONFIRM_BUTTON_SELECTORS);
1258
1423
  if (confirmedExistingDialog) {
1259
1424
  reportStep("accepting_provider_privacy_dialog", "Confirmed provider privacy agreement dialog");
1260
- await page.waitForTimeout(1000);
1425
+ await page.waitForTimeout(500);
1261
1426
  return true;
1262
1427
  }
1263
1428
 
1264
- const checkedTerms = await checkFirstVisible(page, TERMS_CHECKBOX_SELECTORS);
1265
- if (checkedTerms) {
1266
- reportStep("accepting_provider_terms", "Accepted provider terms for Google login");
1267
- await page.waitForTimeout(400);
1429
+ // Always try terms first — but do NOT treat "already checked" as progress.
1430
+ // Returning true every loop on an already-checked box blocked Google re-click
1431
+ // for ~30–60s after a failed first SSO attempt.
1432
+ const newlyCheckedTerms = await ensureProviderTermsChecked(page, reportStep);
1433
+
1434
+ if (!allowGoogleClick) {
1435
+ return newlyCheckedTerms;
1268
1436
  }
1269
1437
 
1270
- const clickedGoogle = await clickFirstActionable(page, GOOGLE_LOGIN_BUTTON_SELECTORS);
1438
+ // Prefer explicit Google SSO over generic Continue (device code pages
1439
+ // often have both — clicking Continue without a session yields invalid_code).
1440
+ const clickedGoogleRole = await clickGoogleLoginRole(page);
1441
+ const clickedGoogle = clickedGoogleRole || await clickFirstActionable(page, GOOGLE_LOGIN_BUTTON_SELECTORS);
1271
1442
  if (clickedGoogle) {
1272
1443
  reportStep("selecting_google_login", "Selecting Google login");
1273
- await page.waitForTimeout(1000);
1444
+ await page.waitForTimeout(500);
1274
1445
 
1275
1446
  const confirmedDialog = await clickFirstActionable(page, PRIVACY_CONFIRM_BUTTON_SELECTORS);
1276
1447
  if (confirmedDialog) {
1277
1448
  reportStep("accepting_provider_privacy_dialog", "Confirmed provider privacy agreement dialog");
1278
- await page.waitForTimeout(1000);
1449
+ await page.waitForTimeout(500);
1450
+ }
1451
+
1452
+ // Wait for OAuth redirect to Google (or popup) — short timeout; loop retries.
1453
+ try {
1454
+ await page.waitForURL(
1455
+ (url) => {
1456
+ try {
1457
+ const host = new URL(url).hostname;
1458
+ return host === "accounts.google.com"
1459
+ || host.endsWith(".accounts.google.com")
1460
+ || /^accounts\.google\./i.test(host);
1461
+ } catch {
1462
+ return false;
1463
+ }
1464
+ },
1465
+ { timeout: 8_000 },
1466
+ );
1467
+ reportStep("google_login_page", "Reached Google sign-in after provider SSO");
1468
+ } catch {
1469
+ // Popup-based Google SSO: try the newest page
1470
+ try {
1471
+ const ctx = page.context?.();
1472
+ const pages = ctx?.pages?.() || [];
1473
+ for (let i = pages.length - 1; i >= 0; i -= 1) {
1474
+ const p = pages[i];
1475
+ const u = p.url?.() || "";
1476
+ if (/accounts\.google\.com/i.test(u)) {
1477
+ reportStep("google_login_popup", "Google sign-in opened in a popup");
1478
+ break;
1479
+ }
1480
+ }
1481
+ } catch {
1482
+ /* ignore */
1483
+ }
1279
1484
  }
1280
1485
 
1281
1486
  return true;
1282
1487
  }
1283
1488
 
1489
+ return newlyCheckedTerms;
1490
+ }
1491
+
1492
+ /** Fast path for xAI device approve after Google session exists. */
1493
+ async function clickXaiDeviceAuthorize(page, reportStep) {
1494
+ if (!isXaiProviderPage(page)) return false;
1495
+ // Never approve while Google SSO is still on the page — that was thrashing
1496
+ // Continue / Allow before login and landing on "Invalid action".
1497
+ if (await providerHasGoogleLogin(page)) return false;
1498
+
1499
+ // Prefer exact authorize verbs — avoid bare "Continue" (too many false hits).
1500
+ const roles = [
1501
+ /^(Allow|Authorize|Approve|Confirm)$/i,
1502
+ /^(Allow|Authorize|Approve)\b/i,
1503
+ ];
1504
+ for (const re of roles) {
1505
+ try {
1506
+ const btn = page.getByRole("button", { name: re }).first();
1507
+ if (await btn.isVisible({ timeout: 250 }).catch(() => false)) {
1508
+ const label = (await btn.innerText().catch(() => "")) || "";
1509
+ if (/google/i.test(label)) continue;
1510
+ await btn.click({ timeout: 3_000 });
1511
+ reportStep?.("approving_consent", "Approving xAI device authorization");
1512
+ await page.waitForTimeout(600);
1513
+ return true;
1514
+ }
1515
+ } catch {
1516
+ /* next */
1517
+ }
1518
+ }
1284
1519
  return false;
1285
1520
  }
1286
1521
 
@@ -1578,39 +1813,78 @@ export async function runGoogleAccountAutomation({
1578
1813
  // (pwd page stays mounted ~1–3s after Next; re-fill aborts the OAuth chain).
1579
1814
  let passwordSubmittedAt = 0;
1580
1815
  let emailSubmittedAt = 0;
1581
- const PASSWORD_RESUBMIT_COOLDOWN_MS = 25_000;
1582
- const EMAIL_RESUBMIT_COOLDOWN_MS = 12_000;
1816
+ let googleLoginSelectedAt = 0;
1817
+ let seenGoogleAuth = false;
1818
+ let deviceApproveAt = 0;
1819
+ let deviceInvalidReopenAt = 0;
1820
+ let deviceInvalidReopenCount = 0;
1821
+ const PASSWORD_RESUBMIT_COOLDOWN_MS = 18_000;
1822
+ const EMAIL_RESUBMIT_COOLDOWN_MS = 8_000;
1823
+ // Short cooldown: long values blocked re-click after a no-op first SSO attempt.
1824
+ const GOOGLE_SSO_COOLDOWN_MS = 8_000;
1825
+ // Don't hammer Allow — xAI returns rate_limited after rapid device posts.
1826
+ const DEVICE_APPROVE_COOLDOWN_MS = 8_000;
1827
+ const DEVICE_INVALID_REOPEN_COOLDOWN_MS = 8_000;
1828
+ const DEVICE_INVALID_REOPEN_MAX = 3;
1829
+ const isGrokFlow = /grok/i.test(String(serviceLabel || ""));
1830
+ // Grok does not need the long Kiro SetSID / kiro:// interstitial window.
1831
+ const postPasswordInterstitialMs = isGrokFlow ? 10_000 : 25_000;
1832
+ const loopTickMs = isGrokFlow ? 400 : 800;
1583
1833
 
1584
1834
  reportStep(openingStep, openingMessage);
1585
1835
  await page.goto(authUrl, { waitUntil: "domcontentloaded", timeout: 60_000 });
1586
- await page.waitForTimeout(2_000);
1587
- await waitThroughGoogleInterstitials(page, reportStep, interstitialOpts(12_000));
1588
-
1589
- await handleProviderLoginGate(page, reportStep);
1590
- await waitThroughGoogleInterstitials(page, reportStep, interstitialOpts(8_000));
1591
-
1592
- const emailInput = await waitForFirstVisibleLocator(page, EMAIL_INPUT_SELECTOR, { timeout: 15_000 });
1593
- if (emailInput) {
1594
- reportStep("entering_email", "Entering Google email");
1595
- const filled = await fillInputResilient(emailInput, email);
1596
- if (!filled) {
1597
- reportStep("email_fill_failed", "Could not fill the Google email field; will retry in the polling loop");
1598
- } else {
1599
- reportStep("submitting_email", "Submitting email");
1600
- await clickFirstVisible(page, NEXT_BUTTON_SELECTORS);
1601
- emailSubmittedAt = Date.now();
1602
- // Wait for the page to transition away from the email step so the
1603
- // polling loop doesn't immediately re-detect the disappearing email
1604
- // field and type the email value into the password input.
1605
- await page.waitForTimeout(1_500);
1606
- await waitThroughGoogleInterstitials(page, reportStep, interstitialOpts(12_000));
1836
+ await page.waitForTimeout(isGrokFlow ? 700 : 2_000);
1837
+ await waitThroughGoogleInterstitials(page, reportStep, interstitialOpts(isGrokFlow ? 4_000 : 12_000));
1838
+
1839
+ // Provider shells (xAI device, CodeBuddy, …) must pick Google SSO first.
1840
+ // Never type credentials into provider user_code / email fields — that
1841
+ // produced email_fill_failed + invalid_code on accounts.x.ai/oauth2/device.
1842
+ // xAI: confirm device user_code first, then Google SSO.
1843
+ // Retry briefly while SPA mounts Login with Google.
1844
+ for (let attempt = 0; attempt < (isGrokFlow ? 8 : 2); attempt += 1) {
1845
+ if (isGoogleAuthPage(page)) break;
1846
+ if (await handleXaiDeviceCodeConfirm(page, reportStep)) {
1847
+ continue;
1848
+ }
1849
+ if (await handleProviderLoginGate(page, reportStep)) {
1850
+ googleLoginSelectedAt = Date.now();
1851
+ if (isGoogleAuthPage(page)) break;
1852
+ }
1853
+ await page.waitForTimeout(600);
1854
+ }
1855
+ await waitThroughGoogleInterstitials(page, reportStep, interstitialOpts(isGrokFlow ? 4_000 : 8_000));
1856
+
1857
+ // Only fill Google email once we are actually on accounts.google.com.
1858
+ if (isGoogleAuthPage(page)) {
1859
+ seenGoogleAuth = true;
1860
+ const emailInput = await waitForFirstVisibleLocator(page, EMAIL_INPUT_SELECTOR, { timeout: 12_000 });
1861
+ if (emailInput) {
1862
+ reportStep("entering_email", "Entering Google email");
1863
+ const filled = await fillInputResilient(emailInput, email);
1864
+ if (!filled) {
1865
+ reportStep("email_fill_failed", "Could not fill the Google email field; will retry in the polling loop");
1866
+ } else {
1867
+ reportStep("submitting_email", "Submitting email");
1868
+ await clickFirstVisible(page, NEXT_BUTTON_SELECTORS);
1869
+ emailSubmittedAt = Date.now();
1870
+ // Wait for the page to transition away from the email step so the
1871
+ // polling loop doesn't immediately re-detect the disappearing email
1872
+ // field and type the email value into the password input.
1873
+ await page.waitForTimeout(isGrokFlow ? 700 : 1_500);
1874
+ await waitThroughGoogleInterstitials(page, reportStep, interstitialOpts(isGrokFlow ? 5_000 : 12_000));
1875
+ }
1607
1876
  }
1877
+ } else if (isProviderPage(page)) {
1878
+ reportStep(
1879
+ "waiting_for_google_sso",
1880
+ `Provider page still open (${(page.url?.() || "").slice(0, 80)}) — will keep selecting Google login`,
1881
+ );
1608
1882
  }
1609
1883
 
1610
1884
  while (Date.now() - startTime < shortTimeoutMs) {
1611
1885
  const successResult = await Promise.race([
1612
1886
  successPromise.then((result) => ({ kind: "success", result })).catch((error) => ({ kind: "success_error", error })),
1613
- new Promise((resolve) => setTimeout(() => resolve(null), 800)),
1887
+ new Promise((resolve) => setTimeout(() => resolve(null), loopTickMs)),
1614
1888
  ]);
1615
1889
 
1616
1890
  if (successResult?.kind === "success") {
@@ -1630,14 +1904,22 @@ export async function runGoogleAccountAutomation({
1630
1904
  }
1631
1905
 
1632
1906
  // Unblock SetSID / empty Google interstitials before other handlers
1633
- const waited = await waitThroughGoogleInterstitials(page, reportStep, interstitialOpts(8_000));
1907
+ const waited = await waitThroughGoogleInterstitials(
1908
+ page,
1909
+ reportStep,
1910
+ interstitialOpts(isGrokFlow ? 4_000 : 8_000),
1911
+ );
1634
1912
  if (waited) {
1635
1913
  continue;
1636
1914
  }
1637
1915
 
1638
1916
  const handledGoogleConsent = await handleGoogleConsent(page, reportStep);
1639
1917
  if (handledGoogleConsent) {
1640
- await waitThroughGoogleInterstitials(page, reportStep, interstitialOpts(12_000));
1918
+ await waitThroughGoogleInterstitials(
1919
+ page,
1920
+ reportStep,
1921
+ interstitialOpts(isGrokFlow ? 5_000 : 12_000),
1922
+ );
1641
1923
  continue;
1642
1924
  }
1643
1925
 
@@ -1696,92 +1978,167 @@ export async function runGoogleAccountAutomation({
1696
1978
  continue;
1697
1979
  }
1698
1980
 
1699
- const handledProviderOnboarding = await handleProviderOnboarding(page, reportStep, serviceLabel);
1700
- if (handledProviderOnboarding) {
1701
- continue;
1981
+ // xAI rate-limits device authorize after rapid retries — fail fast.
1982
+ if (
1983
+ isProviderPage(page)
1984
+ && (/rate[_ ]?limit/i.test(text) || /error=rate_limited/i.test(page.url?.() || ""))
1985
+ ) {
1986
+ reportStep("device_rate_limited", "xAI device authorization rate-limited");
1987
+ return {
1988
+ status: "failed",
1989
+ error: "xAI rate-limited device authorization. Wait a few minutes and retry (too many rapid device-code attempts).",
1990
+ };
1702
1991
  }
1703
1992
 
1704
- // Check password BEFORE email after submitting the email the password
1705
- // page loads and during the transition the old email input can briefly
1706
- // remain visible; if we checked email first we'd re-type the email
1707
- // address into whatever field is focused (often the password input).
1708
- const passwordInput = await getFirstVisibleLocator(page, PASSWORD_INPUT_SELECTOR);
1709
- if (passwordInput) {
1710
- const sincePw = Date.now() - passwordSubmittedAt;
1711
- if (passwordSubmittedAt && sincePw < PASSWORD_RESUBMIT_COOLDOWN_MS) {
1712
- // Still on (or animating off) the password form after a recent submit —
1713
- // do NOT re-fill; wait for SetSID/consent/callback instead.
1714
- reportStep(
1715
- "waiting_after_password",
1716
- `Password already submitted ${Math.round(sincePw / 1000)}s ago — waiting for Google redirect`,
1717
- );
1718
- await waitThroughGoogleInterstitials(page, reportStep, interstitialOpts(8_000));
1719
- await page.waitForTimeout(500);
1720
- continue;
1721
- }
1722
-
1723
- reportStep("entering_password", "Entering Google password");
1724
- const filled = await fillInputResilient(passwordInput, password);
1725
- if (filled) {
1726
- reportStep("submitting_password", "Submitting password");
1727
- await clickFirstVisible(page, NEXT_BUTTON_SELECTORS);
1728
- passwordSubmittedAt = Date.now();
1729
- // Give Google time to leave the password challenge before the next
1730
- // loop iteration can re-detect the still-mounted password field.
1731
- await Promise.race([
1732
- page.waitForNavigation({ waitUntil: "domcontentloaded", timeout: 8_000 }).catch(() => null),
1733
- page.waitForTimeout(2_500),
1734
- ]);
1735
- // Password submit often lands on empty SetSID while network completes
1736
- // consent→idpresponse→kiro://. Callback monitor (CDP) settles successPromise.
1737
- await waitThroughGoogleInterstitials(page, reportStep, interstitialOpts(25_000));
1738
- } else {
1739
- reportStep("password_fill_failed", "Could not fill the Google password field; retrying loop");
1740
- await page.waitForTimeout(700);
1741
- }
1993
+ // xAI often lands on /oauth2/device/approve with "Invalid action" after
1994
+ // Google consent when the approve form was double-submitted. Re-open the
1995
+ // original device URL (with user_code) a few times not every loop tick.
1996
+ if (
1997
+ isProviderPage(page)
1998
+ && /invalid action|invalid[_ ]?code|code (has )?expired|expired code/i.test(text)
1999
+ && authUrl
2000
+ && seenGoogleAuth
2001
+ && deviceInvalidReopenCount < DEVICE_INVALID_REOPEN_MAX
2002
+ && Date.now() - deviceInvalidReopenAt > DEVICE_INVALID_REOPEN_COOLDOWN_MS
2003
+ ) {
2004
+ deviceInvalidReopenCount += 1;
2005
+ deviceInvalidReopenAt = Date.now();
2006
+ deviceApproveAt = 0;
2007
+ reportStep(
2008
+ "device_invalid_reopen",
2009
+ `Device page error — reopening auth URL (${deviceInvalidReopenCount}/${DEVICE_INVALID_REOPEN_MAX})`,
2010
+ );
2011
+ await page.goto(authUrl, { waitUntil: "domcontentloaded", timeout: 60_000 }).catch(() => null);
2012
+ await page.waitForTimeout(1_800);
1742
2013
  continue;
1743
2014
  }
1744
2015
 
1745
- const nextEmailInput = await getFirstVisibleLocator(page, EMAIL_INPUT_SELECTOR);
1746
- if (nextEmailInput) {
1747
- const sinceEmail = Date.now() - emailSubmittedAt;
1748
- if (emailSubmittedAt && sinceEmail < EMAIL_RESUBMIT_COOLDOWN_MS) {
1749
- reportStep(
1750
- "waiting_after_email",
1751
- `Email already submitted ${Math.round(sinceEmail / 1000)}s ago — waiting for password/next screen`,
1752
- );
1753
- await page.waitForTimeout(800);
1754
- continue;
1755
- }
2016
+ const googleAuthed = Boolean(seenGoogleAuth && passwordSubmittedAt);
1756
2017
 
1757
- reportStep("entering_email", "Entering Google email");
1758
- const filled = await fillInputResilient(nextEmailInput, email);
1759
- if (filled) {
1760
- reportStep("submitting_email", "Submitting email");
1761
- await clickFirstVisible(page, NEXT_BUTTON_SELECTORS);
1762
- emailSubmittedAt = Date.now();
1763
- await page.waitForTimeout(1_500);
1764
- } else {
1765
- reportStep("email_fill_failed", "Could not fill the Google email field; retrying loop");
1766
- }
1767
- await page.waitForTimeout(700);
2018
+ // xAI device user_code confirm (Continue) only before Google login.
2019
+ if (await handleXaiDeviceCodeConfirm(page, reportStep, { alreadyAuthed: googleAuthed })) {
1768
2020
  continue;
1769
2021
  }
1770
2022
 
1771
- const handledProviderGate = await handleProviderLoginGate(page, reportStep);
2023
+ // Provider Google SSO BEFORE generic onboarding Continues.
2024
+ // Cooldown: re-clicking Google mid-redirect restarts OAuth and wastes time.
2025
+ const allowGoogleClick =
2026
+ !googleAuthed
2027
+ && (!googleLoginSelectedAt || Date.now() - googleLoginSelectedAt > GOOGLE_SSO_COOLDOWN_MS);
2028
+ const handledProviderGate = await handleProviderLoginGate(page, reportStep, { allowGoogleClick });
1772
2029
  if (handledProviderGate) {
2030
+ if (allowGoogleClick) googleLoginSelectedAt = Date.now();
1773
2031
  continue;
1774
2032
  }
1775
2033
 
1776
- const clickedApprove = await clickFirstVisible(page, APPROVE_BUTTON_SELECTORS);
1777
- if (clickedApprove) {
1778
- reportStep("approving_consent", `Approving Google or ${serviceLabel} consent`);
1779
- await page.waitForTimeout(700);
2034
+ // xAI device approve ONLY after Google password submitted.
2035
+ if (
2036
+ googleAuthed
2037
+ && Date.now() - deviceApproveAt > DEVICE_APPROVE_COOLDOWN_MS
2038
+ && await clickXaiDeviceAuthorize(page, reportStep)
2039
+ ) {
2040
+ deviceApproveAt = Date.now();
2041
+ continue;
2042
+ }
2043
+
2044
+ const handledProviderOnboarding = await handleProviderOnboarding(page, reportStep, serviceLabel);
2045
+ if (handledProviderOnboarding) {
1780
2046
  continue;
1781
2047
  }
1782
2048
 
2049
+ // Credentials only on accounts.google.com — never into provider shells.
2050
+ if (isGoogleAuthPage(page)) {
2051
+ seenGoogleAuth = true;
2052
+ // Check password BEFORE email — after submitting the email the password
2053
+ // page loads and during the transition the old email input can briefly
2054
+ // remain visible; if we checked email first we'd re-type the email
2055
+ // address into whatever field is focused (often the password input).
2056
+ const passwordInput = await getFirstVisibleLocator(page, PASSWORD_INPUT_SELECTOR);
2057
+ if (passwordInput) {
2058
+ const sincePw = Date.now() - passwordSubmittedAt;
2059
+ if (passwordSubmittedAt && sincePw < PASSWORD_RESUBMIT_COOLDOWN_MS) {
2060
+ // Still on (or animating off) the password form after a recent submit —
2061
+ // do NOT re-fill; wait for SetSID/consent/callback instead.
2062
+ reportStep(
2063
+ "waiting_after_password",
2064
+ `Password already submitted ${Math.round(sincePw / 1000)}s ago — waiting for Google redirect`,
2065
+ );
2066
+ await waitThroughGoogleInterstitials(page, reportStep, interstitialOpts(8_000));
2067
+ await page.waitForTimeout(500);
2068
+ continue;
2069
+ }
2070
+
2071
+ reportStep("entering_password", "Entering Google password");
2072
+ const filled = await fillInputResilient(passwordInput, password);
2073
+ if (filled) {
2074
+ reportStep("submitting_password", "Submitting password");
2075
+ await clickFirstVisible(page, NEXT_BUTTON_SELECTORS);
2076
+ passwordSubmittedAt = Date.now();
2077
+ // Give Google time to leave the password challenge before the next
2078
+ // loop iteration can re-detect the still-mounted password field.
2079
+ await Promise.race([
2080
+ page.waitForNavigation({ waitUntil: "domcontentloaded", timeout: 8_000 }).catch(() => null),
2081
+ page.waitForTimeout(2_500),
2082
+ ]);
2083
+ // Password submit often lands on empty SetSID while network completes
2084
+ // consent→idpresponse→kiro://. Callback monitor (CDP) settles successPromise.
2085
+ // Grok device poll settles faster — shorter interstitial wait.
2086
+ await waitThroughGoogleInterstitials(
2087
+ page,
2088
+ reportStep,
2089
+ interstitialOpts(postPasswordInterstitialMs),
2090
+ );
2091
+ } else {
2092
+ reportStep("password_fill_failed", "Could not fill the Google password field; retrying loop");
2093
+ await page.waitForTimeout(500);
2094
+ }
2095
+ continue;
2096
+ }
2097
+
2098
+ const nextEmailInput = await getFirstVisibleLocator(page, EMAIL_INPUT_SELECTOR);
2099
+ if (nextEmailInput) {
2100
+ const sinceEmail = Date.now() - emailSubmittedAt;
2101
+ if (emailSubmittedAt && sinceEmail < EMAIL_RESUBMIT_COOLDOWN_MS) {
2102
+ reportStep(
2103
+ "waiting_after_email",
2104
+ `Email already submitted ${Math.round(sinceEmail / 1000)}s ago — waiting for password/next screen`,
2105
+ );
2106
+ await page.waitForTimeout(500);
2107
+ continue;
2108
+ }
2109
+
2110
+ reportStep("entering_email", "Entering Google email");
2111
+ const filled = await fillInputResilient(nextEmailInput, email);
2112
+ if (filled) {
2113
+ reportStep("submitting_email", "Submitting email");
2114
+ await clickFirstVisible(page, NEXT_BUTTON_SELECTORS);
2115
+ emailSubmittedAt = Date.now();
2116
+ await page.waitForTimeout(isGrokFlow ? 600 : 1_500);
2117
+ } else {
2118
+ reportStep("email_fill_failed", "Could not fill the Google email field; retrying loop");
2119
+ }
2120
+ await page.waitForTimeout(400);
2121
+ continue;
2122
+ }
2123
+ }
2124
+
2125
+ // On xAI before Google login, APPROVE selectors match "Continue with Google"
2126
+ // via :has-text("Continue") and wreck the device code → Invalid action loop.
2127
+ const mayGenericApprove =
2128
+ isGoogleAuthPage(page)
2129
+ || (seenGoogleAuth && passwordSubmittedAt && !(await providerHasGoogleLogin(page)));
2130
+ if (mayGenericApprove) {
2131
+ const clickedApprove = await clickFirstVisible(page, APPROVE_BUTTON_SELECTORS);
2132
+ if (clickedApprove) {
2133
+ reportStep("approving_consent", `Approving Google or ${serviceLabel} consent`);
2134
+ deviceApproveAt = Date.now();
2135
+ await page.waitForTimeout(isGrokFlow ? 500 : 700);
2136
+ continue;
2137
+ }
2138
+ }
2139
+
1783
2140
  // Periodic diagnostics so jobs aren't opaque "waiting" spam
1784
- if (Math.floor((Date.now() - startTime) / 5000) !== Math.floor((Date.now() - startTime - 700) / 5000)) {
2141
+ if (Math.floor((Date.now() - startTime) / 5000) !== Math.floor((Date.now() - startTime - loopTickMs) / 5000)) {
1785
2142
  const url = page.url?.() || "";
1786
2143
  const snippet = String(text || (await readPageText(page).catch(() => ""))).slice(0, 100).replace(/\s+/g, " ");
1787
2144
  reportStep(
@@ -1791,7 +2148,7 @@ export async function runGoogleAccountAutomation({
1791
2148
  } else {
1792
2149
  reportStep("waiting_for_next_screen", `Waiting for the next Google or ${serviceLabel} screen`);
1793
2150
  }
1794
- await page.waitForTimeout(700);
2151
+ await page.waitForTimeout(loopTickMs);
1795
2152
  }
1796
2153
 
1797
2154
  // Final blocked check before generic needs_manual