zevairouter 1.0.69 → 1.0.72

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 (321) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/cli/app/.next-cli-build/BUILD_ID +1 -1
  3. package/cli/app/.next-cli-build/app-path-routes-manifest.json +6 -6
  4. package/cli/app/.next-cli-build/build-manifest.json +2 -2
  5. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/automation/page_client-reference-manifest.js +1 -1
  6. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
  7. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
  8. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
  9. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
  10. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
  11. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/context/page_client-reference-manifest.js +1 -1
  12. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
  13. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
  14. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
  15. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
  16. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
  17. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
  18. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
  19. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/playground/page_client-reference-manifest.js +1 -1
  20. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
  21. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
  22. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
  23. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
  24. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
  25. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/pxpipe/page_client-reference-manifest.js +1 -1
  26. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
  27. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/terminal/page_client-reference-manifest.js +1 -1
  28. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
  29. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
  30. package/cli/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
  31. package/cli/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
  32. package/cli/app/.next-cli-build/server/app/_global-error.html +1 -1
  33. package/cli/app/.next-cli-build/server/app/_global-error.rsc +1 -1
  34. package/cli/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
  35. package/cli/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  36. package/cli/app/.next-cli-build/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  37. package/cli/app/.next-cli-build/server/app/_global-error.segments/_head.segment.rsc +1 -1
  38. package/cli/app/.next-cli-build/server/app/_global-error.segments/_index.segment.rsc +1 -1
  39. package/cli/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  40. package/cli/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
  41. package/cli/app/.next-cli-build/server/app/_not-found.html +1 -1
  42. package/cli/app/.next-cli-build/server/app/_not-found.rsc +3 -3
  43. package/cli/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +3 -3
  44. package/cli/app/.next-cli-build/server/app/_not-found.segments/_head.segment.rsc +1 -1
  45. package/cli/app/.next-cli-build/server/app/_not-found.segments/_index.segment.rsc +3 -3
  46. package/cli/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  47. package/cli/app/.next-cli-build/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  48. package/cli/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  49. package/cli/app/.next-cli-build/server/app/api/models/route.js +1 -1
  50. package/cli/app/.next-cli-build/server/app/api/models/test/route.js +1 -1
  51. package/cli/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js +1 -1
  52. package/cli/app/.next-cli-build/server/app/api/providers/route.js +1 -1
  53. package/cli/app/.next-cli-build/server/app/api/providers/validate/route.js +1 -1
  54. package/cli/app/.next-cli-build/server/app/api/terminal/session/[id]/input/route.js.nft.json +1 -1
  55. package/cli/app/.next-cli-build/server/app/api/terminal/session/[id]/resize/route.js.nft.json +1 -1
  56. package/cli/app/.next-cli-build/server/app/api/terminal/session/[id]/route.js.nft.json +1 -1
  57. package/cli/app/.next-cli-build/server/app/api/terminal/session/[id]/stream/route.js.nft.json +1 -1
  58. package/cli/app/.next-cli-build/server/app/api/terminal/session/route.js.nft.json +1 -1
  59. package/cli/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
  60. package/cli/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
  61. package/cli/app/.next-cli-build/server/app/api/version/route.js +1 -1
  62. package/cli/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
  63. package/cli/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
  64. package/cli/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
  65. package/cli/app/.next-cli-build/server/app/callback.html +1 -1
  66. package/cli/app/.next-cli-build/server/app/callback.rsc +3 -3
  67. package/cli/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +3 -3
  68. package/cli/app/.next-cli-build/server/app/callback.segments/_head.segment.rsc +1 -1
  69. package/cli/app/.next-cli-build/server/app/callback.segments/_index.segment.rsc +3 -3
  70. package/cli/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +1 -1
  71. package/cli/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +1 -1
  72. package/cli/app/.next-cli-build/server/app/callback.segments/callback.segment.rsc +1 -1
  73. package/cli/app/.next-cli-build/server/app/dashboard/automation.html +1 -1
  74. package/cli/app/.next-cli-build/server/app/dashboard/automation.rsc +5 -5
  75. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard/automation/__PAGE__.segment.rsc +2 -2
  76. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard/automation.segment.rsc +1 -1
  77. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  78. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  79. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_full.segment.rsc +5 -5
  80. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_head.segment.rsc +1 -1
  81. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_index.segment.rsc +3 -3
  82. package/cli/app/.next-cli-build/server/app/dashboard/automation.segments/_tree.segment.rsc +1 -1
  83. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
  84. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +5 -5
  85. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +2 -2
  86. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat.segment.rsc +1 -1
  87. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  88. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  89. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +5 -5
  90. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_head.segment.rsc +1 -1
  91. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_index.segment.rsc +3 -3
  92. package/cli/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +1 -1
  93. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
  94. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +5 -5
  95. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +2 -2
  96. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools.segment.rsc +1 -1
  97. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  98. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  99. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +5 -5
  100. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_head.segment.rsc +1 -1
  101. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_index.segment.rsc +3 -3
  102. package/cli/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +1 -1
  103. package/cli/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
  104. package/cli/app/.next-cli-build/server/app/dashboard/combos.rsc +5 -5
  105. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +2 -2
  106. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos.segment.rsc +1 -1
  107. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  108. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  109. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +5 -5
  110. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_head.segment.rsc +1 -1
  111. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_index.segment.rsc +3 -3
  112. package/cli/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +1 -1
  113. package/cli/app/.next-cli-build/server/app/dashboard/context.html +1 -1
  114. package/cli/app/.next-cli-build/server/app/dashboard/context.rsc +5 -5
  115. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard/context/__PAGE__.segment.rsc +2 -2
  116. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard/context.segment.rsc +1 -1
  117. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  118. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  119. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_full.segment.rsc +5 -5
  120. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_head.segment.rsc +1 -1
  121. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_index.segment.rsc +3 -3
  122. package/cli/app/.next-cli-build/server/app/dashboard/context.segments/_tree.segment.rsc +1 -1
  123. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
  124. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.rsc +5 -5
  125. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +2 -2
  126. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint.segment.rsc +1 -1
  127. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  128. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  129. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +5 -5
  130. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_head.segment.rsc +1 -1
  131. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_index.segment.rsc +3 -3
  132. package/cli/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +1 -1
  133. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
  134. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +5 -5
  135. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +2 -2
  136. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web.segment.rsc +1 -1
  137. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers.segment.rsc +1 -1
  138. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  139. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  140. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +5 -5
  141. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_head.segment.rsc +1 -1
  142. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_index.segment.rsc +3 -3
  143. package/cli/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +1 -1
  144. package/cli/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
  145. package/cli/app/.next-cli-build/server/app/dashboard/mitm.rsc +5 -5
  146. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +2 -2
  147. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm.segment.rsc +1 -1
  148. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  149. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  150. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +5 -5
  151. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_head.segment.rsc +1 -1
  152. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_index.segment.rsc +3 -3
  153. package/cli/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +1 -1
  154. package/cli/app/.next-cli-build/server/app/dashboard/playground.html +1 -1
  155. package/cli/app/.next-cli-build/server/app/dashboard/playground.rsc +5 -5
  156. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard/playground/__PAGE__.segment.rsc +2 -2
  157. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard/playground.segment.rsc +1 -1
  158. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  159. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  160. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_full.segment.rsc +5 -5
  161. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_head.segment.rsc +1 -1
  162. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_index.segment.rsc +3 -3
  163. package/cli/app/.next-cli-build/server/app/dashboard/playground.segments/_tree.segment.rsc +1 -1
  164. package/cli/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
  165. package/cli/app/.next-cli-build/server/app/dashboard/profile.rsc +5 -5
  166. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +2 -2
  167. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile.segment.rsc +1 -1
  168. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  169. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  170. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +5 -5
  171. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_head.segment.rsc +1 -1
  172. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_index.segment.rsc +3 -3
  173. package/cli/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +1 -1
  174. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
  175. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.rsc +5 -5
  176. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +2 -2
  177. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new.segment.rsc +1 -1
  178. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  179. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  180. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  181. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +5 -5
  182. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_head.segment.rsc +1 -1
  183. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_index.segment.rsc +3 -3
  184. package/cli/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +1 -1
  185. package/cli/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
  186. package/cli/app/.next-cli-build/server/app/dashboard/providers.rsc +5 -5
  187. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +2 -2
  188. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers.segment.rsc +1 -1
  189. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  190. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  191. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +5 -5
  192. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_head.segment.rsc +1 -1
  193. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_index.segment.rsc +3 -3
  194. package/cli/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +1 -1
  195. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
  196. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +5 -5
  197. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +2 -2
  198. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools.segment.rsc +1 -1
  199. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  200. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  201. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +5 -5
  202. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_head.segment.rsc +1 -1
  203. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_index.segment.rsc +3 -3
  204. package/cli/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +1 -1
  205. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.html +1 -1
  206. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.rsc +5 -5
  207. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe/__PAGE__.segment.rsc +2 -2
  208. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe.segment.rsc +1 -1
  209. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  210. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  211. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_full.segment.rsc +5 -5
  212. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_head.segment.rsc +1 -1
  213. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_index.segment.rsc +3 -3
  214. package/cli/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_tree.segment.rsc +1 -1
  215. package/cli/app/.next-cli-build/server/app/dashboard/quota.html +2 -2
  216. package/cli/app/.next-cli-build/server/app/dashboard/quota.rsc +6 -6
  217. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +3 -3
  218. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota.segment.rsc +1 -1
  219. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  220. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  221. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +6 -6
  222. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_head.segment.rsc +1 -1
  223. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_index.segment.rsc +3 -3
  224. package/cli/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +1 -1
  225. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
  226. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
  227. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +3 -3
  228. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +3 -3
  229. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_head.segment.rsc +1 -1
  230. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_index.segment.rsc +3 -3
  231. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +1 -1
  232. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +1 -1
  233. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing.segment.rsc +1 -1
  234. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings.segment.rsc +1 -1
  235. package/cli/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard.segment.rsc +1 -1
  236. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.html +1 -1
  237. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.rsc +5 -5
  238. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +2 -2
  239. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver.segment.rsc +1 -1
  240. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  241. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  242. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_full.segment.rsc +5 -5
  243. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_head.segment.rsc +1 -1
  244. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_index.segment.rsc +3 -3
  245. package/cli/app/.next-cli-build/server/app/dashboard/token-saver.segments/_tree.segment.rsc +1 -1
  246. package/cli/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
  247. package/cli/app/.next-cli-build/server/app/dashboard/translator.rsc +5 -5
  248. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +2 -2
  249. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator.segment.rsc +1 -1
  250. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  251. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  252. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +5 -5
  253. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_head.segment.rsc +1 -1
  254. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_index.segment.rsc +3 -3
  255. package/cli/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +1 -1
  256. package/cli/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
  257. package/cli/app/.next-cli-build/server/app/dashboard/usage.rsc +5 -5
  258. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +2 -2
  259. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage.segment.rsc +1 -1
  260. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  261. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  262. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +5 -5
  263. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_head.segment.rsc +1 -1
  264. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_index.segment.rsc +3 -3
  265. package/cli/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +1 -1
  266. package/cli/app/.next-cli-build/server/app/dashboard.html +1 -1
  267. package/cli/app/.next-cli-build/server/app/dashboard.rsc +5 -5
  268. package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +2 -2
  269. package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard.segment.rsc +1 -1
  270. package/cli/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk.segment.rsc +2 -2
  271. package/cli/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +5 -5
  272. package/cli/app/.next-cli-build/server/app/dashboard.segments/_head.segment.rsc +1 -1
  273. package/cli/app/.next-cli-build/server/app/dashboard.segments/_index.segment.rsc +3 -3
  274. package/cli/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +1 -1
  275. package/cli/app/.next-cli-build/server/app/index.html +1 -1
  276. package/cli/app/.next-cli-build/server/app/index.rsc +3 -3
  277. package/cli/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  278. package/cli/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +3 -3
  279. package/cli/app/.next-cli-build/server/app/index.segments/_head.segment.rsc +1 -1
  280. package/cli/app/.next-cli-build/server/app/index.segments/_index.segment.rsc +3 -3
  281. package/cli/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +1 -1
  282. package/cli/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
  283. package/cli/app/.next-cli-build/server/app/landing.html +1 -1
  284. package/cli/app/.next-cli-build/server/app/landing.rsc +3 -3
  285. package/cli/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +3 -3
  286. package/cli/app/.next-cli-build/server/app/landing.segments/_head.segment.rsc +1 -1
  287. package/cli/app/.next-cli-build/server/app/landing.segments/_index.segment.rsc +3 -3
  288. package/cli/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +1 -1
  289. package/cli/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +1 -1
  290. package/cli/app/.next-cli-build/server/app/landing.segments/landing.segment.rsc +1 -1
  291. package/cli/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
  292. package/cli/app/.next-cli-build/server/app/login.html +1 -1
  293. package/cli/app/.next-cli-build/server/app/login.rsc +4 -4
  294. package/cli/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +4 -4
  295. package/cli/app/.next-cli-build/server/app/login.segments/_head.segment.rsc +1 -1
  296. package/cli/app/.next-cli-build/server/app/login.segments/_index.segment.rsc +3 -3
  297. package/cli/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +1 -1
  298. package/cli/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +2 -2
  299. package/cli/app/.next-cli-build/server/app/login.segments/login.segment.rsc +1 -1
  300. package/cli/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
  301. package/cli/app/.next-cli-build/server/app-paths-manifest.json +6 -6
  302. package/cli/app/.next-cli-build/server/chunks/3407.js +1 -1
  303. package/cli/app/.next-cli-build/server/chunks/4746.js +1 -1
  304. package/cli/app/.next-cli-build/server/chunks/6896.js +1 -1
  305. package/cli/app/.next-cli-build/server/chunks/7276.js +1 -1
  306. package/cli/app/.next-cli-build/server/chunks/8157.js +1 -1
  307. package/cli/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
  308. package/cli/app/.next-cli-build/server/pages/404.html +1 -1
  309. package/cli/app/.next-cli-build/server/pages/500.html +1 -1
  310. package/cli/app/.next-cli-build/static/chunks/{3702-cf53f29a22776f08.js → 3702-7aa79659b7d2861a.js} +1 -1
  311. 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/src/lib/terminal/ptyBridge.py +163 -0
  312. 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/src/lib/terminal/ptyBridge.py +163 -0
  313. package/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/src/lib/terminal/ptyBridge.py +163 -0
  314. package/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/cli/app/src/lib/terminal/ptyBridge.py +163 -0
  315. package/cli/app/package.json +1 -1
  316. package/cli/package.json +1 -1
  317. package/package.json +1 -1
  318. package/src/lib/oauth/services/kiroBulkImportManager.js +30 -10
  319. package/src/lib/oauth/services/kiroGoogleAutomation.js +294 -36
  320. /package/cli/app/.next-cli-build/static/{ieCl7ScziCIxUyr4Zck3E → Pt5AQYEcCz-MH9LLUCKC-}/_buildManifest.js +0 -0
  321. /package/cli/app/.next-cli-build/static/{ieCl7ScziCIxUyr4Zck3E → Pt5AQYEcCz-MH9LLUCKC-}/_ssgManifest.js +0 -0
@@ -17,6 +17,8 @@ const TERMINAL_ACCOUNT_STATUSES = new Set([
17
17
  "failed_invalid_credentials",
18
18
  "failed_exchange",
19
19
  "failed_timeout",
20
+ "failed_restricted",
21
+ "failed_browser_blocked",
20
22
  "cancelled",
21
23
  ]);
22
24
 
@@ -222,6 +224,8 @@ function getFailedCount(accounts) {
222
224
  || account.status === "failed_invalid_credentials"
223
225
  || account.status === "failed_exchange"
224
226
  || account.status === "failed_timeout"
227
+ || account.status === "failed_restricted"
228
+ || account.status === "failed_browser_blocked"
225
229
  )).length;
226
230
  }
227
231
 
@@ -299,7 +303,7 @@ function sanitizeAccount(account) {
299
303
  proxyUrl: maskProxyUrl(account.proxyUrl) || null,
300
304
  currentStep: account.currentStep || null,
301
305
  updatedAt: account.updatedAt || null,
302
- logs: (account.logs || []).slice(-8),
306
+ logs: (account.logs || []).slice(-20),
303
307
  manualSessionAvailable: Boolean(account.manualSession?.page) && account.status === "needs_manual",
304
308
  manualSessionOpened: Boolean(account.manualSession?.opened),
305
309
  };
@@ -354,7 +358,23 @@ export function buildLookupResponse(job, extras = {}) {
354
358
 
355
359
  async function defaultBrowserLauncher(job) {
356
360
  const { launchBulkImportBrowser } = await import("./bulkImportBrowserEngine.js");
357
- return launchBulkImportBrowser({ engine: job?.engine || "chromium" });
361
+ const engine = job?.engine || "chromium";
362
+ // Google OAuth now rejects stock headless Chromium after email submit with
363
+ // /v3/signin/rejected ("This browser or app may not be secure"). That is the
364
+ // real reason Kiro bulk ends in needs_manual — not random captcha.
365
+ // Default: headed Chromium (Xvfb auto-starts on Linux). Camoufox can stay
366
+ // headless. Override with ZEVAI_KIRO_HEADLESS=0|1.
367
+ const envHeadless = process.env.ZEVAI_KIRO_HEADLESS;
368
+ let headless;
369
+ if (envHeadless === "1" || envHeadless === "true") headless = true;
370
+ else if (envHeadless === "0" || envHeadless === "false") headless = false;
371
+ else if (engine === "camoufox") headless = true;
372
+ else headless = false;
373
+ return launchBulkImportBrowser({
374
+ engine,
375
+ headless,
376
+ windowSize: { width: 1280, height: 900 },
377
+ });
358
378
  }
359
379
 
360
380
  async function defaultSocialExchange(args) {
@@ -417,15 +437,15 @@ export async function createFreshContext(browser, proxy) {
417
437
  }
418
438
 
419
439
  const page = await context.newPage();
420
- // Residential proxies often hang on third-party trackers; abort so SPA can boot
440
+ // Abort third-party trackers only. Do NOT intercept "**/*" with continue() —
441
+ // Playwright route interception on every request breaks Google→Cognito OAuth
442
+ // redirect chains (consent 302 → idpresponse 302 → kiro:// Location is dropped
443
+ // and the main frame parks forever on empty SetSID).
421
444
  try {
422
- await page.route("**/*", (route) => {
423
- const u = route.request().url();
424
- if (/googletagmanager|googleadservices|google-analytics|doubleclick|facebook\.net|hotjar|clarity\.ms|hm\.baidu|sentry\.io|browser\.sentry-cdn/i.test(u)) {
425
- return route.abort();
426
- }
427
- return route.continue();
428
- });
445
+ await page.route(
446
+ /googletagmanager|googleadservices|google-analytics|doubleclick|facebook\.net|hotjar|clarity\.ms|hm\.baidu|sentry\.io|browser\.sentry-cdn/i,
447
+ (route) => route.abort(),
448
+ );
429
449
  } catch {
430
450
  // ignore if route fails
431
451
  }
@@ -494,18 +494,120 @@ function isGoogleAuthPage(page) {
494
494
  }
495
495
  }
496
496
 
497
- // Google bounces flagged (headless) browsers to myaccount.google.com/not-supported
498
- // at the OAuth consent step; from there the page often drifts to about.google.
499
- // Newer flows use /v3/signin/rejected with "This browser or app may not be secure".
497
+ // Google bounces flagged (headless) browsers:
498
+ // - myaccount.google.com/not-supported
499
+ // - accounts.google.com/v3/signin/rejected ("This browser or app may not be secure")
500
+ // - about.google drift after consent
500
501
  function isBlockedBrowserPage(page) {
501
502
  try {
502
503
  const url = new URL(page.url());
503
504
  if (url.pathname.startsWith("/not-supported")) return true;
504
505
  if (url.pathname.includes("/signin/rejected")) return true;
505
- return url.hostname === "about.google" || url.hostname.endsWith(".about.google");
506
+ if (url.pathname.includes("/rejected")) return true;
507
+ if (url.hostname === "about.google" || url.hostname.endsWith(".about.google")) return true;
506
508
  } catch {
507
- return false;
509
+ // fall through to body text
510
+ }
511
+ return false;
512
+ }
513
+
514
+ async function isBlockedBrowser(page) {
515
+ if (isBlockedBrowserPage(page)) return true;
516
+ const text = await readPageText(page).catch(() => "");
517
+ return includesAny(text, [
518
+ "browser or app may not be secure",
519
+ "try using a different browser",
520
+ "couldn't sign you in",
521
+ "couldn\u2019t sign you in",
522
+ "this browser or app may not be secure",
523
+ "browser is not secure",
524
+ ]);
525
+ }
526
+
527
+ /**
528
+ * Hook successPromise so interstitial waits can exit as soon as the OAuth
529
+ * callback (kiro://) is captured on the network — even while the main frame
530
+ * stays parked on blank SetSID.
531
+ */
532
+ function attachSuccessSettledFlag(successPromise) {
533
+ if (!successPromise || typeof successPromise.then !== "function") return;
534
+ if (successPromise.__zevaiSettledHooked) return;
535
+ successPromise.__zevaiSettledHooked = true;
536
+ successPromise.then(
537
+ () => { successPromise.__zevaiSettled = true; },
538
+ () => { successPromise.__zevaiSettled = true; },
539
+ );
540
+ }
541
+
542
+ function isSuccessSettled(successPromise) {
543
+ return Boolean(successPromise && successPromise.__zevaiSettled);
544
+ }
545
+
546
+ /**
547
+ * Google often parks on intermediate pages with empty body after password/consent:
548
+ * accounts.google.com(.xx)/accounts/SetSID
549
+ * AccountChooser, continue, challenge handoffs
550
+ *
551
+ * Do NOT force-navigate consent/idpresponse from here — that aborts the natural
552
+ * network hop that emits Location: kiro://. Wait for auto-redirect / AccountChooser
553
+ * UI, and bail early when successPromise already settled (CDP/page listeners).
554
+ *
555
+ * @returns {boolean} true if still on an interstitial when maxWaitMs elapsed
556
+ */
557
+ async function waitThroughGoogleInterstitials(page, reportStep, { maxWaitMs = 20_000, successPromise = null } = {}) {
558
+ const start = Date.now();
559
+ let lastUrl = "";
560
+ attachSuccessSettledFlag(successPromise);
561
+
562
+ while (Date.now() - start < maxWaitMs) {
563
+ if (isSuccessSettled(successPromise)) {
564
+ reportStep?.("waiting_google_redirect", "OAuth callback already received — leaving interstitial wait");
565
+ return false;
566
+ }
567
+
568
+ const url = page.url?.() || "";
569
+ const body = String(await readPageText(page).catch(() => "")).trim();
570
+ const isSetSid = /\/accounts\/SetSID/i.test(url);
571
+ const isChooser = /\/AccountChooser/i.test(url);
572
+ const isEmpty = body.length < 30;
573
+ const isInterstitial = isSetSid || (isEmpty && /accounts\.google\./i.test(url));
574
+
575
+ if (!isInterstitial && !isChooser) return false;
576
+
577
+ if (url !== lastUrl) {
578
+ reportStep?.(
579
+ "waiting_google_redirect",
580
+ `Waiting for Google redirect (url=${url.slice(0, 120)} empty=${isEmpty})`,
581
+ );
582
+ lastUrl = url;
583
+ }
584
+
585
+ // Account chooser: click first account row if present
586
+ if (isChooser) {
587
+ const clicked = await clickFirstActionable(page, [
588
+ 'div[data-identifier]',
589
+ 'div[data-email]',
590
+ 'li[data-identifier]',
591
+ 'div[role="link"]',
592
+ 'div[role="button"]',
593
+ ]);
594
+ if (clicked) {
595
+ reportStep?.("selecting_google_account", "Selected account from Google AccountChooser");
596
+ await page.waitForTimeout(1200);
597
+ continue;
598
+ }
599
+ }
600
+
601
+ const waiters = [
602
+ page.waitForNavigation({ waitUntil: "domcontentloaded", timeout: 4_000 }).catch(() => null),
603
+ page.waitForTimeout(1_200),
604
+ ];
605
+ if (successPromise && !isSuccessSettled(successPromise)) {
606
+ waiters.push(successPromise.then(() => null).catch(() => null));
607
+ }
608
+ await Promise.race(waiters);
508
609
  }
610
+ return true;
509
611
  }
510
612
 
511
613
  function isProviderPage(page) {
@@ -1173,6 +1275,18 @@ async function handleProviderLoginGate(page, reportStep) {
1173
1275
  return false;
1174
1276
  }
1175
1277
 
1278
+ /**
1279
+ * Capture Kiro OAuth callback (kiro://…?code=…).
1280
+ *
1281
+ * After password, Google parks the main frame on empty SetSID while the network
1282
+ * completes consent → Cognito idpresponse → 302 Location: kiro://…. Custom-protocol
1283
+ * redirects often never become a page navigation, so we listen on:
1284
+ * - page + context request / requestfailed / response (Location header)
1285
+ * - CDP Network (most reliable on headed Chromium / SetSID)
1286
+ *
1287
+ * Never force-navigate idpresponse/consent from the monitor — that aborts the
1288
+ * natural hop before kiro:// is emitted.
1289
+ */
1176
1290
  export function createKiroCallbackMonitor(context, page, timeoutMs = DEFAULT_MANUAL_TIMEOUT_MS) {
1177
1291
  let resolveOuter;
1178
1292
  let rejectOuter;
@@ -1202,34 +1316,80 @@ export function createKiroCallbackMonitor(context, page, timeoutMs = DEFAULT_MAN
1202
1316
  else resolveOuter(result);
1203
1317
  }
1204
1318
 
1319
+ function trySettleFromUrl(rawUrl) {
1320
+ const parsed = parseCallbackUrl(rawUrl || "");
1321
+ if (parsed) settle(parsed);
1322
+ return Boolean(parsed);
1323
+ }
1324
+
1325
+ function trySettleFromResponse(response) {
1326
+ try {
1327
+ trySettleFromUrl(response?.url?.() || "");
1328
+ const headers = typeof response?.headers === "function" ? response.headers() : null;
1329
+ const location = headers?.location || headers?.Location || "";
1330
+ if (location) trySettleFromUrl(location);
1331
+ } catch {
1332
+ /* ignore */
1333
+ }
1334
+ }
1335
+
1336
+ function attachCdpNetwork(trackedPage, ownerCleanups) {
1337
+ void (async () => {
1338
+ try {
1339
+ if (settled) return;
1340
+ const ctx = trackedPage.context?.();
1341
+ if (!ctx?.newCDPSession) return;
1342
+ const session = await ctx.newCDPSession(trackedPage);
1343
+ await session.send("Network.enable").catch(() => null);
1344
+
1345
+ const onCdpResponse = (params) => {
1346
+ try {
1347
+ const headers = params?.response?.headers || {};
1348
+ const loc = headers.location || headers.Location || "";
1349
+ if (loc) trySettleFromUrl(loc);
1350
+ trySettleFromUrl(params?.response?.url || "");
1351
+ } catch {
1352
+ /* ignore */
1353
+ }
1354
+ };
1355
+ const onCdpRequest = (params) => {
1356
+ try {
1357
+ trySettleFromUrl(params?.request?.url || "");
1358
+ } catch {
1359
+ /* ignore */
1360
+ }
1361
+ };
1362
+
1363
+ session.on("Network.responseReceived", onCdpResponse);
1364
+ session.on("Network.requestWillBeSent", onCdpRequest);
1365
+ ownerCleanups.push(() => {
1366
+ try { session.off?.("Network.responseReceived", onCdpResponse); } catch {}
1367
+ try { session.off?.("Network.requestWillBeSent", onCdpRequest); } catch {}
1368
+ void session.detach?.().catch(() => null);
1369
+ });
1370
+ } catch {
1371
+ /* CDP unavailable — page/context listeners remain */
1372
+ }
1373
+ })();
1374
+ }
1375
+
1205
1376
  function registerPage(trackedPage, ownerCleanups) {
1206
1377
  if (!trackedPage || trackedPages.has(trackedPage)) return;
1207
1378
  trackedPages.add(trackedPage);
1208
1379
 
1209
- const onFrame = (frame) => {
1210
- const parsed = parseCallbackUrl(frame?.url?.() || "");
1211
- if (parsed) settle(parsed);
1212
- };
1213
- const onRequest = (request) => {
1214
- const parsed = parseCallbackUrl(request?.url?.() || "");
1215
- if (parsed) settle(parsed);
1216
- };
1217
- const onRequestFailed = (request) => {
1218
- const parsed = parseCallbackUrl(request?.url?.() || "");
1219
- if (parsed) settle(parsed);
1220
- };
1221
- const onLoadState = () => {
1222
- const parsed = parseCallbackUrl(trackedPage.url?.() || "");
1223
- if (parsed) settle(parsed);
1224
- };
1380
+ const onFrame = (frame) => trySettleFromUrl(frame?.url?.() || "");
1381
+ const onRequest = (request) => trySettleFromUrl(request?.url?.() || "");
1382
+ const onRequestFailed = (request) => trySettleFromUrl(request?.url?.() || "");
1383
+ const onResponse = (response) => trySettleFromResponse(response);
1384
+ const onLoadState = () => trySettleFromUrl(trackedPage.url?.() || "");
1225
1385
  const onClose = () => {
1226
- // Cancel/force-close: unblock manual followup instead of hanging 15 min
1227
1386
  settle(null, new Error("Browser session closed while waiting for Kiro callback"));
1228
1387
  };
1229
1388
 
1230
1389
  trackedPage.on("framenavigated", onFrame);
1231
1390
  trackedPage.on("request", onRequest);
1232
1391
  trackedPage.on("requestfailed", onRequestFailed);
1392
+ trackedPage.on("response", onResponse);
1233
1393
  trackedPage.on("domcontentloaded", onLoadState);
1234
1394
  trackedPage.on("load", onLoadState);
1235
1395
  trackedPage.on("close", onClose);
@@ -1238,11 +1398,14 @@ export function createKiroCallbackMonitor(context, page, timeoutMs = DEFAULT_MAN
1238
1398
  trackedPage.off("framenavigated", onFrame);
1239
1399
  trackedPage.off("request", onRequest);
1240
1400
  trackedPage.off("requestfailed", onRequestFailed);
1401
+ trackedPage.off("response", onResponse);
1241
1402
  trackedPage.off("domcontentloaded", onLoadState);
1242
1403
  trackedPage.off("load", onLoadState);
1243
1404
  trackedPage.off("close", onClose);
1244
1405
  });
1245
1406
 
1407
+ attachCdpNetwork(trackedPage, ownerCleanups);
1408
+
1246
1409
  const current = parseCallbackUrl(trackedPage.url?.() || "");
1247
1410
  if (current) settle(current);
1248
1411
  }
@@ -1257,10 +1420,20 @@ export function createKiroCallbackMonitor(context, page, timeoutMs = DEFAULT_MAN
1257
1420
  const onClose = () => {
1258
1421
  settle(null, new Error("Browser context closed while waiting for Kiro callback"));
1259
1422
  };
1423
+ const onCtxRequest = (request) => trySettleFromUrl(request?.url?.() || "");
1424
+ const onCtxRequestFailed = (request) => trySettleFromUrl(request?.url?.() || "");
1425
+ const onCtxResponse = (response) => trySettleFromResponse(response);
1426
+
1260
1427
  ctx.on("page", onPage);
1261
1428
  ctx.on("close", onClose);
1429
+ ctx.on("request", onCtxRequest);
1430
+ ctx.on("requestfailed", onCtxRequestFailed);
1431
+ ctx.on("response", onCtxResponse);
1262
1432
  cleanups.push(() => ctx.off("page", onPage));
1263
1433
  cleanups.push(() => ctx.off("close", onClose));
1434
+ cleanups.push(() => ctx.off("request", onCtxRequest));
1435
+ cleanups.push(() => ctx.off("requestfailed", onCtxRequestFailed));
1436
+ cleanups.push(() => ctx.off("response", onCtxResponse));
1264
1437
 
1265
1438
  if (pg) registerPage(pg, cleanups);
1266
1439
  }
@@ -1271,7 +1444,6 @@ export function createKiroCallbackMonitor(context, page, timeoutMs = DEFAULT_MAN
1271
1444
  if (newContext) bind(newContext, newPage);
1272
1445
  };
1273
1446
 
1274
- // Allow cancel path to force-reject without waiting for timeout
1275
1447
  promise.abort = (reason = "Job cancelled") => {
1276
1448
  settle(null, new Error(reason));
1277
1449
  };
@@ -1392,11 +1564,21 @@ export async function runGoogleAccountAutomation({
1392
1564
  onStep?.(step, message);
1393
1565
  };
1394
1566
 
1567
+ const interstitialOpts = (maxWaitMs) => ({ maxWaitMs, successPromise });
1568
+ // Prevent re-submitting email/password while Google is still transitioning
1569
+ // (pwd page stays mounted ~1–3s after Next; re-fill aborts the OAuth chain).
1570
+ let passwordSubmittedAt = 0;
1571
+ let emailSubmittedAt = 0;
1572
+ const PASSWORD_RESUBMIT_COOLDOWN_MS = 25_000;
1573
+ const EMAIL_RESUBMIT_COOLDOWN_MS = 12_000;
1574
+
1395
1575
  reportStep(openingStep, openingMessage);
1396
1576
  await page.goto(authUrl, { waitUntil: "domcontentloaded", timeout: 60_000 });
1397
1577
  await page.waitForTimeout(2_000);
1578
+ await waitThroughGoogleInterstitials(page, reportStep, interstitialOpts(12_000));
1398
1579
 
1399
1580
  await handleProviderLoginGate(page, reportStep);
1581
+ await waitThroughGoogleInterstitials(page, reportStep, interstitialOpts(8_000));
1400
1582
 
1401
1583
  const emailInput = await waitForFirstVisibleLocator(page, EMAIL_INPUT_SELECTOR, { timeout: 15_000 });
1402
1584
  if (emailInput) {
@@ -1407,10 +1589,12 @@ export async function runGoogleAccountAutomation({
1407
1589
  } else {
1408
1590
  reportStep("submitting_email", "Submitting email");
1409
1591
  await clickFirstVisible(page, NEXT_BUTTON_SELECTORS);
1592
+ emailSubmittedAt = Date.now();
1410
1593
  // Wait for the page to transition away from the email step so the
1411
1594
  // polling loop doesn't immediately re-detect the disappearing email
1412
1595
  // field and type the email value into the password input.
1413
- await page.waitForTimeout(2_500);
1596
+ await page.waitForTimeout(1_500);
1597
+ await waitThroughGoogleInterstitials(page, reportStep, interstitialOpts(12_000));
1414
1598
  }
1415
1599
  }
1416
1600
 
@@ -1436,20 +1620,31 @@ export async function runGoogleAccountAutomation({
1436
1620
  };
1437
1621
  }
1438
1622
 
1623
+ // Unblock SetSID / empty Google interstitials before other handlers
1624
+ const waited = await waitThroughGoogleInterstitials(page, reportStep, interstitialOpts(8_000));
1625
+ if (waited) {
1626
+ continue;
1627
+ }
1628
+
1439
1629
  const handledGoogleConsent = await handleGoogleConsent(page, reportStep);
1440
1630
  if (handledGoogleConsent) {
1631
+ await waitThroughGoogleInterstitials(page, reportStep, interstitialOpts(12_000));
1441
1632
  continue;
1442
1633
  }
1443
1634
 
1444
- // Headless Chromium gets bounced to myaccount.google.com/not-supported at the
1445
- // OAuth consent step. From there the broad Google-button selectors wander onto
1446
- // about.google and loop until timeout. Detect the dead-end and bail to manual
1447
- // (the Camoufox engine avoids this by not being flagged as headless).
1448
- if (isBlockedBrowserPage(page)) {
1449
- reportStep("manual_assist_required", "Google blocked the automated browser (not-supported). Use the Camoufox engine or complete manually.");
1635
+ // Headless Chromium is rejected after email submit → /v3/signin/rejected
1636
+ // ("This browser or app may not be secure"). Fail fast do not spin 90s.
1637
+ if (await isBlockedBrowser(page)) {
1638
+ const url = page.url?.() || "";
1639
+ reportStep(
1640
+ "browser_blocked_by_google",
1641
+ `Google blocked this browser (url=${url.slice(0, 120)}). Headless Chromium is rejected — use headed mode or Camoufox.`,
1642
+ );
1450
1643
  return {
1451
- status: "needs_manual",
1452
- error: "Google blocked the automated browser at the OAuth consent step (not-supported page). Switch to the Camoufox engine or finish this account manually.",
1644
+ status: "failed_browser_blocked",
1645
+ error:
1646
+ "Google blocked the automated browser (\"This browser or app may not be secure\" / signin rejected). " +
1647
+ "Kiro bulk must use headed Chromium (Xvfb on Linux) or the Camoufox engine — not headless Chrome.",
1453
1648
  };
1454
1649
  }
1455
1650
 
@@ -1495,25 +1690,60 @@ export async function runGoogleAccountAutomation({
1495
1690
  // address into whatever field is focused (often the password input).
1496
1691
  const passwordInput = await getFirstVisibleLocator(page, PASSWORD_INPUT_SELECTOR);
1497
1692
  if (passwordInput) {
1693
+ const sincePw = Date.now() - passwordSubmittedAt;
1694
+ if (passwordSubmittedAt && sincePw < PASSWORD_RESUBMIT_COOLDOWN_MS) {
1695
+ // Still on (or animating off) the password form after a recent submit —
1696
+ // do NOT re-fill; wait for SetSID/consent/callback instead.
1697
+ reportStep(
1698
+ "waiting_after_password",
1699
+ `Password already submitted ${Math.round(sincePw / 1000)}s ago — waiting for Google redirect`,
1700
+ );
1701
+ await waitThroughGoogleInterstitials(page, reportStep, interstitialOpts(8_000));
1702
+ await page.waitForTimeout(500);
1703
+ continue;
1704
+ }
1705
+
1498
1706
  reportStep("entering_password", "Entering Google password");
1499
1707
  const filled = await fillInputResilient(passwordInput, password);
1500
1708
  if (filled) {
1501
1709
  reportStep("submitting_password", "Submitting password");
1502
1710
  await clickFirstVisible(page, NEXT_BUTTON_SELECTORS);
1711
+ passwordSubmittedAt = Date.now();
1712
+ // Give Google time to leave the password challenge before the next
1713
+ // loop iteration can re-detect the still-mounted password field.
1714
+ await Promise.race([
1715
+ page.waitForNavigation({ waitUntil: "domcontentloaded", timeout: 8_000 }).catch(() => null),
1716
+ page.waitForTimeout(2_500),
1717
+ ]);
1718
+ // Password submit often lands on empty SetSID while network completes
1719
+ // consent→idpresponse→kiro://. Callback monitor (CDP) settles successPromise.
1720
+ await waitThroughGoogleInterstitials(page, reportStep, interstitialOpts(25_000));
1503
1721
  } else {
1504
1722
  reportStep("password_fill_failed", "Could not fill the Google password field; retrying loop");
1723
+ await page.waitForTimeout(700);
1505
1724
  }
1506
- await page.waitForTimeout(700);
1507
1725
  continue;
1508
1726
  }
1509
1727
 
1510
1728
  const nextEmailInput = await getFirstVisibleLocator(page, EMAIL_INPUT_SELECTOR);
1511
1729
  if (nextEmailInput) {
1730
+ const sinceEmail = Date.now() - emailSubmittedAt;
1731
+ if (emailSubmittedAt && sinceEmail < EMAIL_RESUBMIT_COOLDOWN_MS) {
1732
+ reportStep(
1733
+ "waiting_after_email",
1734
+ `Email already submitted ${Math.round(sinceEmail / 1000)}s ago — waiting for password/next screen`,
1735
+ );
1736
+ await page.waitForTimeout(800);
1737
+ continue;
1738
+ }
1739
+
1512
1740
  reportStep("entering_email", "Entering Google email");
1513
1741
  const filled = await fillInputResilient(nextEmailInput, email);
1514
1742
  if (filled) {
1515
1743
  reportStep("submitting_email", "Submitting email");
1516
1744
  await clickFirstVisible(page, NEXT_BUTTON_SELECTORS);
1745
+ emailSubmittedAt = Date.now();
1746
+ await page.waitForTimeout(1_500);
1517
1747
  } else {
1518
1748
  reportStep("email_fill_failed", "Could not fill the Google email field; retrying loop");
1519
1749
  }
@@ -1533,14 +1763,42 @@ export async function runGoogleAccountAutomation({
1533
1763
  continue;
1534
1764
  }
1535
1765
 
1536
- reportStep("waiting_for_next_screen", `Waiting for the next Google or ${serviceLabel} screen`);
1766
+ // Periodic diagnostics so jobs aren't opaque "waiting" spam
1767
+ if (Math.floor((Date.now() - startTime) / 5000) !== Math.floor((Date.now() - startTime - 700) / 5000)) {
1768
+ const url = page.url?.() || "";
1769
+ const snippet = String(text || (await readPageText(page).catch(() => ""))).slice(0, 100).replace(/\s+/g, " ");
1770
+ reportStep(
1771
+ "waiting_for_next_screen",
1772
+ `Waiting for the next Google or ${serviceLabel} screen (url=${url.slice(0, 100)} body=${snippet})`,
1773
+ );
1774
+ } else {
1775
+ reportStep("waiting_for_next_screen", `Waiting for the next Google or ${serviceLabel} screen`);
1776
+ }
1537
1777
  await page.waitForTimeout(700);
1538
1778
  }
1539
1779
 
1540
- reportStep("manual_assist_required", `Flow did not complete ${serviceLabel} authorization automatically`);
1780
+ // Final blocked check before generic needs_manual
1781
+ if (await isBlockedBrowser(page)) {
1782
+ reportStep("browser_blocked_by_google", "Google blocked browser at end of automation window");
1783
+ return {
1784
+ status: "failed_browser_blocked",
1785
+ error:
1786
+ "Google blocked the automated browser (\"This browser or app may not be secure\"). " +
1787
+ "Use headed Chromium (Xvfb) or Camoufox engine.",
1788
+ };
1789
+ }
1790
+
1791
+ const finalUrl = page.url?.() || "";
1792
+ const finalBody = String(await readPageText(page).catch(() => "")).slice(0, 120).replace(/\s+/g, " ");
1793
+ reportStep(
1794
+ "manual_assist_required",
1795
+ `Flow did not complete ${serviceLabel} authorization automatically (url=${finalUrl.slice(0, 100)} body=${finalBody})`,
1796
+ );
1541
1797
  return {
1542
1798
  status: "needs_manual",
1543
- error: `Manual assist required in the browser session because the login flow did not complete ${serviceLabel} authorization automatically.`,
1799
+ error:
1800
+ `Manual assist required — ${serviceLabel} authorization did not finish automatically ` +
1801
+ `(last url: ${finalUrl.slice(0, 140)}). If you see "browser may not be secure", switch to headed Chromium/Camoufox.`,
1544
1802
  };
1545
1803
  }
1546
1804