@cortexkit/opencode-antigravity-auth 1.0.0

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 (271) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +714 -0
  3. package/dist/index.d.ts +4 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +15175 -0
  6. package/dist/index.js.map +7 -0
  7. package/dist/src/antigravity/oauth.d.ts +2 -0
  8. package/dist/src/antigravity/oauth.d.ts.map +1 -0
  9. package/dist/src/antigravity/oauth.js +3 -0
  10. package/dist/src/antigravity/oauth.js.map +1 -0
  11. package/dist/src/constants.d.ts +2 -0
  12. package/dist/src/constants.d.ts.map +1 -0
  13. package/dist/src/constants.js +3 -0
  14. package/dist/src/constants.js.map +1 -0
  15. package/dist/src/hooks/auto-update-checker/cache.d.ts +3 -0
  16. package/dist/src/hooks/auto-update-checker/cache.d.ts.map +1 -0
  17. package/dist/src/hooks/auto-update-checker/cache.js +71 -0
  18. package/dist/src/hooks/auto-update-checker/cache.js.map +1 -0
  19. package/dist/src/hooks/auto-update-checker/checker.d.ts +16 -0
  20. package/dist/src/hooks/auto-update-checker/checker.d.ts.map +1 -0
  21. package/dist/src/hooks/auto-update-checker/checker.js +234 -0
  22. package/dist/src/hooks/auto-update-checker/checker.js.map +1 -0
  23. package/dist/src/hooks/auto-update-checker/constants.d.ts +9 -0
  24. package/dist/src/hooks/auto-update-checker/constants.d.ts.map +1 -0
  25. package/dist/src/hooks/auto-update-checker/constants.js +23 -0
  26. package/dist/src/hooks/auto-update-checker/constants.js.map +1 -0
  27. package/dist/src/hooks/auto-update-checker/index.d.ts +34 -0
  28. package/dist/src/hooks/auto-update-checker/index.d.ts.map +1 -0
  29. package/dist/src/hooks/auto-update-checker/index.js +122 -0
  30. package/dist/src/hooks/auto-update-checker/index.js.map +1 -0
  31. package/dist/src/hooks/auto-update-checker/logging.d.ts +3 -0
  32. package/dist/src/hooks/auto-update-checker/logging.d.ts.map +1 -0
  33. package/dist/src/hooks/auto-update-checker/logging.js +9 -0
  34. package/dist/src/hooks/auto-update-checker/logging.js.map +1 -0
  35. package/dist/src/hooks/auto-update-checker/types.d.ts +25 -0
  36. package/dist/src/hooks/auto-update-checker/types.d.ts.map +1 -0
  37. package/dist/src/hooks/auto-update-checker/types.js +1 -0
  38. package/dist/src/hooks/auto-update-checker/types.js.map +1 -0
  39. package/dist/src/plugin/accounts.d.ts +232 -0
  40. package/dist/src/plugin/accounts.d.ts.map +1 -0
  41. package/dist/src/plugin/accounts.js +1163 -0
  42. package/dist/src/plugin/accounts.js.map +1 -0
  43. package/dist/src/plugin/agy-transport.d.ts +2 -0
  44. package/dist/src/plugin/agy-transport.d.ts.map +1 -0
  45. package/dist/src/plugin/agy-transport.js +3 -0
  46. package/dist/src/plugin/agy-transport.js.map +1 -0
  47. package/dist/src/plugin/auth-doctor.d.ts +30 -0
  48. package/dist/src/plugin/auth-doctor.d.ts.map +1 -0
  49. package/dist/src/plugin/auth-doctor.js +144 -0
  50. package/dist/src/plugin/auth-doctor.js.map +1 -0
  51. package/dist/src/plugin/auth-drift.d.ts +13 -0
  52. package/dist/src/plugin/auth-drift.d.ts.map +1 -0
  53. package/dist/src/plugin/auth-drift.js +70 -0
  54. package/dist/src/plugin/auth-drift.js.map +1 -0
  55. package/dist/src/plugin/auth.d.ts +2 -0
  56. package/dist/src/plugin/auth.d.ts.map +1 -0
  57. package/dist/src/plugin/auth.js +3 -0
  58. package/dist/src/plugin/auth.js.map +1 -0
  59. package/dist/src/plugin/cache/index.d.ts +5 -0
  60. package/dist/src/plugin/cache/index.d.ts.map +1 -0
  61. package/dist/src/plugin/cache/index.js +5 -0
  62. package/dist/src/plugin/cache/index.js.map +1 -0
  63. package/dist/src/plugin/cache/signature-cache.d.ts +111 -0
  64. package/dist/src/plugin/cache/signature-cache.d.ts.map +1 -0
  65. package/dist/src/plugin/cache/signature-cache.js +375 -0
  66. package/dist/src/plugin/cache/signature-cache.js.map +1 -0
  67. package/dist/src/plugin/cache.d.ts +44 -0
  68. package/dist/src/plugin/cache.d.ts.map +1 -0
  69. package/dist/src/plugin/cache.js +247 -0
  70. package/dist/src/plugin/cache.js.map +1 -0
  71. package/dist/src/plugin/cli.d.ts +44 -0
  72. package/dist/src/plugin/cli.d.ts.map +1 -0
  73. package/dist/src/plugin/cli.js +153 -0
  74. package/dist/src/plugin/cli.js.map +1 -0
  75. package/dist/src/plugin/config/index.d.ts +16 -0
  76. package/dist/src/plugin/config/index.d.ts.map +1 -0
  77. package/dist/src/plugin/config/index.js +16 -0
  78. package/dist/src/plugin/config/index.js.map +1 -0
  79. package/dist/src/plugin/config/loader.d.ts +36 -0
  80. package/dist/src/plugin/config/loader.d.ts.map +1 -0
  81. package/dist/src/plugin/config/loader.js +140 -0
  82. package/dist/src/plugin/config/loader.js.map +1 -0
  83. package/dist/src/plugin/config/models.d.ts +3 -0
  84. package/dist/src/plugin/config/models.d.ts.map +1 -0
  85. package/dist/src/plugin/config/models.js +2 -0
  86. package/dist/src/plugin/config/models.js.map +1 -0
  87. package/dist/src/plugin/config/schema.d.ts +141 -0
  88. package/dist/src/plugin/config/schema.d.ts.map +1 -0
  89. package/dist/src/plugin/config/schema.js +504 -0
  90. package/dist/src/plugin/config/schema.js.map +1 -0
  91. package/dist/src/plugin/config/updater.d.ts +55 -0
  92. package/dist/src/plugin/config/updater.d.ts.map +1 -0
  93. package/dist/src/plugin/config/updater.js +127 -0
  94. package/dist/src/plugin/config/updater.js.map +1 -0
  95. package/dist/src/plugin/core/streaming/index.d.ts +3 -0
  96. package/dist/src/plugin/core/streaming/index.d.ts.map +1 -0
  97. package/dist/src/plugin/core/streaming/index.js +3 -0
  98. package/dist/src/plugin/core/streaming/index.js.map +1 -0
  99. package/dist/src/plugin/core/streaming/transformer.d.ts +12 -0
  100. package/dist/src/plugin/core/streaming/transformer.d.ts.map +1 -0
  101. package/dist/src/plugin/core/streaming/transformer.js +447 -0
  102. package/dist/src/plugin/core/streaming/transformer.js.map +1 -0
  103. package/dist/src/plugin/core/streaming/types.d.ts +34 -0
  104. package/dist/src/plugin/core/streaming/types.d.ts.map +1 -0
  105. package/dist/src/plugin/core/streaming/types.js +1 -0
  106. package/dist/src/plugin/core/streaming/types.js.map +1 -0
  107. package/dist/src/plugin/debug.d.ts +94 -0
  108. package/dist/src/plugin/debug.d.ts.map +1 -0
  109. package/dist/src/plugin/debug.js +383 -0
  110. package/dist/src/plugin/debug.js.map +1 -0
  111. package/dist/src/plugin/errors.d.ts +28 -0
  112. package/dist/src/plugin/errors.d.ts.map +1 -0
  113. package/dist/src/plugin/errors.js +42 -0
  114. package/dist/src/plugin/errors.js.map +1 -0
  115. package/dist/src/plugin/fingerprint.d.ts +2 -0
  116. package/dist/src/plugin/fingerprint.d.ts.map +1 -0
  117. package/dist/src/plugin/fingerprint.js +3 -0
  118. package/dist/src/plugin/fingerprint.js.map +1 -0
  119. package/dist/src/plugin/gemini-dump.d.ts +47 -0
  120. package/dist/src/plugin/gemini-dump.d.ts.map +1 -0
  121. package/dist/src/plugin/gemini-dump.js +238 -0
  122. package/dist/src/plugin/gemini-dump.js.map +1 -0
  123. package/dist/src/plugin/image-saver.d.ts +25 -0
  124. package/dist/src/plugin/image-saver.d.ts.map +1 -0
  125. package/dist/src/plugin/image-saver.js +86 -0
  126. package/dist/src/plugin/image-saver.js.map +1 -0
  127. package/dist/src/plugin/logger.d.ts +23 -0
  128. package/dist/src/plugin/logger.d.ts.map +1 -0
  129. package/dist/src/plugin/logger.js +80 -0
  130. package/dist/src/plugin/logger.js.map +1 -0
  131. package/dist/src/plugin/logging-utils.d.ts +23 -0
  132. package/dist/src/plugin/logging-utils.d.ts.map +1 -0
  133. package/dist/src/plugin/logging-utils.js +92 -0
  134. package/dist/src/plugin/logging-utils.js.map +1 -0
  135. package/dist/src/plugin/model-registry.d.ts +2 -0
  136. package/dist/src/plugin/model-registry.d.ts.map +1 -0
  137. package/dist/src/plugin/model-registry.js +3 -0
  138. package/dist/src/plugin/model-registry.js.map +1 -0
  139. package/dist/src/plugin/project.d.ts +2 -0
  140. package/dist/src/plugin/project.d.ts.map +1 -0
  141. package/dist/src/plugin/project.js +3 -0
  142. package/dist/src/plugin/project.js.map +1 -0
  143. package/dist/src/plugin/prompt-context.d.ts +18 -0
  144. package/dist/src/plugin/prompt-context.d.ts.map +1 -0
  145. package/dist/src/plugin/prompt-context.js +99 -0
  146. package/dist/src/plugin/prompt-context.js.map +1 -0
  147. package/dist/src/plugin/quota.d.ts +44 -0
  148. package/dist/src/plugin/quota.d.ts.map +1 -0
  149. package/dist/src/plugin/quota.js +336 -0
  150. package/dist/src/plugin/quota.js.map +1 -0
  151. package/dist/src/plugin/recovery/constants.d.ts +22 -0
  152. package/dist/src/plugin/recovery/constants.d.ts.map +1 -0
  153. package/dist/src/plugin/recovery/constants.js +43 -0
  154. package/dist/src/plugin/recovery/constants.js.map +1 -0
  155. package/dist/src/plugin/recovery/index.d.ts +12 -0
  156. package/dist/src/plugin/recovery/index.d.ts.map +1 -0
  157. package/dist/src/plugin/recovery/index.js +12 -0
  158. package/dist/src/plugin/recovery/index.js.map +1 -0
  159. package/dist/src/plugin/recovery/storage.d.ts +24 -0
  160. package/dist/src/plugin/recovery/storage.d.ts.map +1 -0
  161. package/dist/src/plugin/recovery/storage.js +354 -0
  162. package/dist/src/plugin/recovery/storage.js.map +1 -0
  163. package/dist/src/plugin/recovery/types.d.ts +116 -0
  164. package/dist/src/plugin/recovery/types.d.ts.map +1 -0
  165. package/dist/src/plugin/recovery/types.js +6 -0
  166. package/dist/src/plugin/recovery/types.js.map +1 -0
  167. package/dist/src/plugin/recovery.d.ts +61 -0
  168. package/dist/src/plugin/recovery.d.ts.map +1 -0
  169. package/dist/src/plugin/recovery.js +381 -0
  170. package/dist/src/plugin/recovery.js.map +1 -0
  171. package/dist/src/plugin/refresh-queue.d.ts +100 -0
  172. package/dist/src/plugin/refresh-queue.d.ts.map +1 -0
  173. package/dist/src/plugin/refresh-queue.js +247 -0
  174. package/dist/src/plugin/refresh-queue.js.map +1 -0
  175. package/dist/src/plugin/request-helpers.d.ts +278 -0
  176. package/dist/src/plugin/request-helpers.d.ts.map +1 -0
  177. package/dist/src/plugin/request-helpers.js +2323 -0
  178. package/dist/src/plugin/request-helpers.js.map +1 -0
  179. package/dist/src/plugin/request.d.ts +102 -0
  180. package/dist/src/plugin/request.d.ts.map +1 -0
  181. package/dist/src/plugin/request.js +1658 -0
  182. package/dist/src/plugin/request.js.map +1 -0
  183. package/dist/src/plugin/rotation.d.ts +169 -0
  184. package/dist/src/plugin/rotation.d.ts.map +1 -0
  185. package/dist/src/plugin/rotation.js +328 -0
  186. package/dist/src/plugin/rotation.js.map +1 -0
  187. package/dist/src/plugin/search.d.ts +25 -0
  188. package/dist/src/plugin/search.d.ts.map +1 -0
  189. package/dist/src/plugin/search.js +200 -0
  190. package/dist/src/plugin/search.js.map +1 -0
  191. package/dist/src/plugin/server.d.ts +23 -0
  192. package/dist/src/plugin/server.d.ts.map +1 -0
  193. package/dist/src/plugin/server.js +324 -0
  194. package/dist/src/plugin/server.js.map +1 -0
  195. package/dist/src/plugin/storage.d.ts +150 -0
  196. package/dist/src/plugin/storage.d.ts.map +1 -0
  197. package/dist/src/plugin/storage.js +628 -0
  198. package/dist/src/plugin/storage.js.map +1 -0
  199. package/dist/src/plugin/stores/signature-store.d.ts +5 -0
  200. package/dist/src/plugin/stores/signature-store.d.ts.map +1 -0
  201. package/dist/src/plugin/stores/signature-store.js +25 -0
  202. package/dist/src/plugin/stores/signature-store.js.map +1 -0
  203. package/dist/src/plugin/thinking-recovery.d.ts +90 -0
  204. package/dist/src/plugin/thinking-recovery.d.ts.map +1 -0
  205. package/dist/src/plugin/thinking-recovery.js +330 -0
  206. package/dist/src/plugin/thinking-recovery.js.map +1 -0
  207. package/dist/src/plugin/token.d.ts +19 -0
  208. package/dist/src/plugin/token.d.ts.map +1 -0
  209. package/dist/src/plugin/token.js +130 -0
  210. package/dist/src/plugin/token.js.map +1 -0
  211. package/dist/src/plugin/transform/claude.d.ts +92 -0
  212. package/dist/src/plugin/transform/claude.d.ts.map +1 -0
  213. package/dist/src/plugin/transform/claude.js +280 -0
  214. package/dist/src/plugin/transform/claude.js.map +1 -0
  215. package/dist/src/plugin/transform/cross-model-sanitizer.d.ts +2 -0
  216. package/dist/src/plugin/transform/cross-model-sanitizer.d.ts.map +1 -0
  217. package/dist/src/plugin/transform/cross-model-sanitizer.js +3 -0
  218. package/dist/src/plugin/transform/cross-model-sanitizer.js.map +1 -0
  219. package/dist/src/plugin/transform/gemini.d.ts +100 -0
  220. package/dist/src/plugin/transform/gemini.d.ts.map +1 -0
  221. package/dist/src/plugin/transform/gemini.js +446 -0
  222. package/dist/src/plugin/transform/gemini.js.map +1 -0
  223. package/dist/src/plugin/transform/index.d.ts +2 -0
  224. package/dist/src/plugin/transform/index.d.ts.map +1 -0
  225. package/dist/src/plugin/transform/index.js +3 -0
  226. package/dist/src/plugin/transform/index.js.map +1 -0
  227. package/dist/src/plugin/transform/model-resolver.d.ts +2 -0
  228. package/dist/src/plugin/transform/model-resolver.d.ts.map +1 -0
  229. package/dist/src/plugin/transform/model-resolver.js +3 -0
  230. package/dist/src/plugin/transform/model-resolver.js.map +1 -0
  231. package/dist/src/plugin/transform/types.d.ts +2 -0
  232. package/dist/src/plugin/transform/types.d.ts.map +1 -0
  233. package/dist/src/plugin/transform/types.js +3 -0
  234. package/dist/src/plugin/transform/types.js.map +1 -0
  235. package/dist/src/plugin/types.d.ts +80 -0
  236. package/dist/src/plugin/types.d.ts.map +1 -0
  237. package/dist/src/plugin/types.js +1 -0
  238. package/dist/src/plugin/types.js.map +1 -0
  239. package/dist/src/plugin/ui/ansi.d.ts +32 -0
  240. package/dist/src/plugin/ui/ansi.d.ts.map +1 -0
  241. package/dist/src/plugin/ui/ansi.js +52 -0
  242. package/dist/src/plugin/ui/ansi.js.map +1 -0
  243. package/dist/src/plugin/ui/auth-menu.d.ts +59 -0
  244. package/dist/src/plugin/ui/auth-menu.d.ts.map +1 -0
  245. package/dist/src/plugin/ui/auth-menu.js +362 -0
  246. package/dist/src/plugin/ui/auth-menu.js.map +1 -0
  247. package/dist/src/plugin/ui/confirm.d.ts +2 -0
  248. package/dist/src/plugin/ui/confirm.d.ts.map +1 -0
  249. package/dist/src/plugin/ui/confirm.js +15 -0
  250. package/dist/src/plugin/ui/confirm.js.map +1 -0
  251. package/dist/src/plugin/ui/model-status.d.ts +28 -0
  252. package/dist/src/plugin/ui/model-status.d.ts.map +1 -0
  253. package/dist/src/plugin/ui/model-status.js +80 -0
  254. package/dist/src/plugin/ui/model-status.js.map +1 -0
  255. package/dist/src/plugin/ui/quota-status.d.ts +82 -0
  256. package/dist/src/plugin/ui/quota-status.d.ts.map +1 -0
  257. package/dist/src/plugin/ui/quota-status.js +251 -0
  258. package/dist/src/plugin/ui/quota-status.js.map +1 -0
  259. package/dist/src/plugin/ui/select.d.ts +23 -0
  260. package/dist/src/plugin/ui/select.d.ts.map +1 -0
  261. package/dist/src/plugin/ui/select.js +254 -0
  262. package/dist/src/plugin/ui/select.js.map +1 -0
  263. package/dist/src/plugin/version.d.ts +2 -0
  264. package/dist/src/plugin/version.d.ts.map +1 -0
  265. package/dist/src/plugin/version.js +3 -0
  266. package/dist/src/plugin/version.js.map +1 -0
  267. package/dist/src/plugin.d.ts +32 -0
  268. package/dist/src/plugin.d.ts.map +1 -0
  269. package/dist/src/plugin.js +3125 -0
  270. package/dist/src/plugin.js.map +1 -0
  271. package/package.json +70 -0
@@ -0,0 +1,52 @@
1
+ /**
2
+ * ANSI escape codes and key parsing for interactive CLI menus.
3
+ * Works cross-platform (Windows/Mac/Linux).
4
+ */
5
+ export const ANSI = {
6
+ // Cursor control
7
+ hide: '\x1b[?25l',
8
+ show: '\x1b[?25h',
9
+ up: (n = 1) => `\x1b[${n}A`,
10
+ down: (n = 1) => `\x1b[${n}B`,
11
+ clearLine: '\x1b[2K',
12
+ clearScreen: '\x1b[2J',
13
+ moveTo: (row, col) => `\x1b[${row};${col}H`,
14
+ // Styles
15
+ cyan: '\x1b[36m',
16
+ green: '\x1b[32m',
17
+ red: '\x1b[31m',
18
+ yellow: '\x1b[33m',
19
+ dim: '\x1b[2m',
20
+ bold: '\x1b[1m',
21
+ reset: '\x1b[0m',
22
+ inverse: '\x1b[7m',
23
+ };
24
+ /**
25
+ * Parse raw keyboard input buffer into a key action.
26
+ * Handles Windows/Mac/Linux differences in arrow key sequences.
27
+ */
28
+ export function parseKey(data) {
29
+ const s = data.toString();
30
+ // Arrow keys (ANSI escape sequences)
31
+ // Standard: \x1b[A (up), \x1b[B (down)
32
+ // Application mode: \x1bOA (up), \x1bOB (down)
33
+ if (s === '\x1b[A' || s === '\x1bOA')
34
+ return 'up';
35
+ if (s === '\x1b[B' || s === '\x1bOB')
36
+ return 'down';
37
+ // Enter (CR or LF)
38
+ if (s === '\r' || s === '\n')
39
+ return 'enter';
40
+ if (s === '\x03')
41
+ return 'escape';
42
+ if (s === '\x1b')
43
+ return 'escape-start';
44
+ return null;
45
+ }
46
+ /**
47
+ * Check if the terminal supports interactive input.
48
+ */
49
+ export function isTTY() {
50
+ return Boolean(process.stdin.isTTY);
51
+ }
52
+ //# sourceMappingURL=ansi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ansi.js","sourceRoot":"","sources":["../../../../src/plugin/ui/ansi.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,iBAAiB;IACjB,IAAI,EAAE,WAAW;IACjB,IAAI,EAAE,WAAW;IACjB,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG;IAC3B,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG;IAC7B,SAAS,EAAE,SAAS;IACpB,WAAW,EAAE,SAAS;IACtB,MAAM,EAAE,CAAC,GAAW,EAAE,GAAW,EAAE,EAAE,CAAC,QAAQ,GAAG,IAAI,GAAG,GAAG;IAE3D,SAAS;IACT,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,UAAU;IACjB,GAAG,EAAE,UAAU;IACf,MAAM,EAAE,UAAU;IAClB,GAAG,EAAE,SAAS;IACd,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,SAAS;IAChB,OAAO,EAAE,SAAS;CACV,CAAC;AAIX;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;IAE1B,qCAAqC;IACrC,uCAAuC;IACvC,+CAA+C;IAC/C,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAClD,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC;IAEpD,mBAAmB;IACnB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,OAAO,CAAC;IAE7C,IAAI,CAAC,KAAK,MAAM;QAAE,OAAO,QAAQ,CAAC;IAElC,IAAI,CAAC,KAAK,MAAM;QAAE,OAAO,cAAc,CAAC;IAExC,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,KAAK;IACnB,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,59 @@
1
+ import type { CooldownReason } from '../accounts';
2
+ import type { QuotaGroupSummary } from '../quota';
3
+ import type { FingerprintVersion } from '../fingerprint';
4
+ export type AccountStatus = 'active' | 'rate-limited' | 'expired' | 'verification-required' | 'unknown';
5
+ export interface AccountInfo {
6
+ email?: string;
7
+ index: number;
8
+ addedAt?: number;
9
+ lastUsed?: number;
10
+ status?: AccountStatus;
11
+ isCurrentAccount?: boolean;
12
+ enabled?: boolean;
13
+ quotaSummary?: string;
14
+ cooldownMs?: number;
15
+ cooldownReason?: CooldownReason;
16
+ cachedQuota?: Partial<Record<string, QuotaGroupSummary>>;
17
+ cachedPerModelQuota?: {
18
+ modelId: string;
19
+ displayName?: string;
20
+ group: string | null;
21
+ remainingFraction: number;
22
+ resetTime?: string;
23
+ }[];
24
+ fingerprintHistory?: FingerprintVersion[];
25
+ }
26
+ export type AuthMenuAction = {
27
+ type: 'add';
28
+ } | {
29
+ type: 'select-account';
30
+ account: AccountInfo;
31
+ } | {
32
+ type: 'delete-all';
33
+ } | {
34
+ type: 'check';
35
+ } | {
36
+ type: 'doctor';
37
+ } | {
38
+ type: 'repair';
39
+ } | {
40
+ type: 'current';
41
+ } | {
42
+ type: 'verify';
43
+ } | {
44
+ type: 'verify-all';
45
+ } | {
46
+ type: 'configure-models';
47
+ } | {
48
+ type: 'cancel';
49
+ };
50
+ export type AccountAction = 'back' | 'delete' | 'refresh' | 'toggle' | 'verify' | 'restore-fingerprint' | 'switch-account' | 'cancel';
51
+ export interface FingerprintRestoreResult {
52
+ action: 'restore-fingerprint';
53
+ historyIndex: number;
54
+ }
55
+ export declare function showAuthMenu(accounts: AccountInfo[]): Promise<AuthMenuAction>;
56
+ export declare function showFingerprintHistory(history: FingerprintVersion[], accountLabel: string): Promise<number | null>;
57
+ export declare function showAccountDetails(account: AccountInfo): Promise<AccountAction>;
58
+ export { isTTY } from './ansi';
59
+ //# sourceMappingURL=auth-menu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-menu.d.ts","sourceRoot":"","sources":["../../../../src/plugin/ui/auth-menu.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAQlD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzD,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,cAAc,GAAG,SAAS,GAAG,uBAAuB,GAAG,SAAS,CAAC;AAExG,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,WAAW,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACzD,mBAAmB,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,iBAAiB,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACvI,kBAAkB,CAAC,EAAE,kBAAkB,EAAE,CAAC;CAC3C;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,GACf;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GACtB;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GACtB;IAAE,IAAI,EAAE,kBAAkB,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AACvB,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,qBAAqB,GAAG,gBAAgB,GAAG,QAAQ,CAAC;AAEtI,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,qBAAqB,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;CACtB;AAyOD,wBAAsB,YAAY,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CA+CnF;AAUD,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,kBAAkB,EAAE,EAC7B,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA0BxB;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,CA6DrF;AACD,OAAO,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC"}
@@ -0,0 +1,362 @@
1
+ import { ANSI } from './ansi';
2
+ import { select } from './select';
3
+ import { confirm } from './confirm';
4
+ import { classifyGroupStatus, classifyOverallQuotaHealth, buildCooldownStatus, formatQuotaStatusBadge, formatWaitDuration, } from './quota-status';
5
+ function formatRelativeTime(timestamp) {
6
+ if (!timestamp)
7
+ return 'never';
8
+ const days = Math.floor((Date.now() - timestamp) / 86400000);
9
+ if (days === 0)
10
+ return 'today';
11
+ if (days === 1)
12
+ return 'yesterday';
13
+ if (days < 7)
14
+ return `${days}d ago`;
15
+ if (days < 30)
16
+ return `${Math.floor(days / 7)}w ago`;
17
+ return new Date(timestamp).toLocaleDateString();
18
+ }
19
+ function formatDate(timestamp) {
20
+ if (!timestamp)
21
+ return 'unknown';
22
+ return new Date(timestamp).toLocaleDateString();
23
+ }
24
+ function getStatusBadge(status, account) {
25
+ // Cooldown takes priority — account is temporarily unavailable
26
+ if (account?.cooldownMs !== undefined && account.cooldownMs > 0) {
27
+ const cooldownStatus = buildCooldownStatus(account.cooldownMs, account.cooldownReason);
28
+ return ` ${formatQuotaStatusBadge(cooldownStatus)}`;
29
+ }
30
+ // For "active" accounts, check if quota data shows exhaustion
31
+ if (status === 'active' && account?.cachedQuota) {
32
+ const overall = classifyOverallQuotaHealth(account.cachedQuota);
33
+ if (overall.health === 'exhausted') {
34
+ const suffix = overall.maxResetMs
35
+ ? ` resets in ${formatWaitDuration(overall.maxResetMs)}`
36
+ : '';
37
+ return ` ${ANSI.red}[exhausted${suffix}]${ANSI.reset}`;
38
+ }
39
+ if (overall.health === 'partial') {
40
+ return ` ${ANSI.yellow}[limited]${ANSI.reset}`;
41
+ }
42
+ }
43
+ // Then check account-level status
44
+ switch (status) {
45
+ case 'active': return ` ${ANSI.green}[active]${ANSI.reset}`;
46
+ case 'rate-limited': return ` ${ANSI.yellow}[rate-limited]${ANSI.reset}`;
47
+ case 'expired': return ` ${ANSI.red}[expired]${ANSI.reset}`;
48
+ case 'verification-required': return ` ${ANSI.red}[needs verification]${ANSI.reset}`;
49
+ default: return '';
50
+ }
51
+ }
52
+ function getAccountTier(acc) {
53
+ if (acc.isCurrentAccount)
54
+ return 0;
55
+ if (acc.enabled === false)
56
+ return 6;
57
+ if (acc.status === 'active') {
58
+ const overall = classifyOverallQuotaHealth(acc.cachedQuota);
59
+ if (overall.health === 'exhausted')
60
+ return 3;
61
+ if (overall.health === 'partial')
62
+ return 2;
63
+ return 1;
64
+ }
65
+ if (acc.status === 'rate-limited')
66
+ return 4;
67
+ return 5; // expired, verification-required, unknown
68
+ }
69
+ function getHealthLabel(acc) {
70
+ if (acc.enabled === false)
71
+ return 'disabled';
72
+ if (acc.status === 'active') {
73
+ const overall = classifyOverallQuotaHealth(acc.cachedQuota);
74
+ if (overall.health === 'exhausted')
75
+ return 'exhausted';
76
+ if (overall.health === 'partial')
77
+ return 'limited';
78
+ return 'active';
79
+ }
80
+ if (acc.status === 'rate-limited')
81
+ return 'rate-limited';
82
+ if (acc.status === 'expired')
83
+ return 'expired';
84
+ return 'other';
85
+ }
86
+ const QUOTA_KEYS = [
87
+ { key: 'claude', label: 'Claude' },
88
+ { key: 'gemini-pro', label: 'Gemini Pro' },
89
+ { key: 'gemini-flash', label: 'Gemini Flash' },
90
+ ];
91
+ function parseResetTimeToMs(resetTime) {
92
+ if (!resetTime)
93
+ return null;
94
+ const timestamp = Date.parse(resetTime);
95
+ if (!Number.isFinite(timestamp))
96
+ return null;
97
+ const ms = timestamp - Date.now();
98
+ return ms > 0 ? ms : null;
99
+ }
100
+ function buildModelBreakdown(accounts) {
101
+ const results = [];
102
+ for (const { key, label } of QUOTA_KEYS) {
103
+ let availableCount = 0;
104
+ let exhaustedCount = 0;
105
+ let maxResetMs;
106
+ for (const acc of accounts) {
107
+ if (acc.enabled === false)
108
+ continue;
109
+ // Prefer per-model data when available for more accurate counting
110
+ if (acc.cachedPerModelQuota && acc.cachedPerModelQuota.length > 0) {
111
+ const modelsInGroup = acc.cachedPerModelQuota.filter(m => m.group === key);
112
+ if (modelsInGroup.length === 0)
113
+ continue;
114
+ // Account is exhausted for this group if ALL models in the group are at 0%
115
+ const allExhausted = modelsInGroup.every(m => m.remainingFraction <= 0);
116
+ if (allExhausted) {
117
+ // Check staleness: skip if all reset times are in the past
118
+ const freshExhausted = modelsInGroup.some(m => {
119
+ const resetMs = parseResetTimeToMs(m.resetTime);
120
+ return resetMs !== null && resetMs > 0;
121
+ });
122
+ if (freshExhausted) {
123
+ exhaustedCount++;
124
+ for (const m of modelsInGroup) {
125
+ const resetMs = parseResetTimeToMs(m.resetTime);
126
+ if (resetMs !== null && resetMs > 0 && (maxResetMs === undefined || resetMs > maxResetMs)) {
127
+ maxResetMs = resetMs;
128
+ }
129
+ }
130
+ }
131
+ else {
132
+ availableCount++;
133
+ }
134
+ }
135
+ else {
136
+ availableCount++;
137
+ }
138
+ }
139
+ else {
140
+ // Fall back to group-level cachedQuota
141
+ const group = acc.cachedQuota?.[key];
142
+ if (!group || typeof group.remainingFraction !== 'number')
143
+ continue;
144
+ if (group.remainingFraction <= 0) {
145
+ // Skip stale exhaustion: if resetTime is missing or in the past,
146
+ // Google has likely already reset the quota — count as available
147
+ const resetMs = parseResetTimeToMs(group.resetTime);
148
+ if (resetMs !== null && resetMs > 0) {
149
+ exhaustedCount++;
150
+ if (maxResetMs === undefined || resetMs > maxResetMs) {
151
+ maxResetMs = resetMs;
152
+ }
153
+ }
154
+ else {
155
+ availableCount++;
156
+ }
157
+ }
158
+ else {
159
+ availableCount++;
160
+ }
161
+ }
162
+ }
163
+ if (exhaustedCount > 0 || availableCount > 0) {
164
+ const parts = [];
165
+ if (availableCount > 0)
166
+ parts.push(`${availableCount} available`);
167
+ if (exhaustedCount > 0) {
168
+ const resetSuffix = maxResetMs !== undefined
169
+ ? ` ~${formatWaitDuration(maxResetMs)}`
170
+ : '';
171
+ parts.push(`${exhaustedCount} exhausted${resetSuffix}`);
172
+ }
173
+ results.push(`${label}: ${parts.join(', ')}`);
174
+ }
175
+ }
176
+ return results;
177
+ }
178
+ function buildAccountSummary(accounts) {
179
+ const counts = {};
180
+ for (const acc of accounts) {
181
+ const label = getHealthLabel(acc);
182
+ counts[label] = (counts[label] ?? 0) + 1;
183
+ }
184
+ const order = ['active', 'limited', 'exhausted', 'rate-limited', 'expired', 'disabled', 'other'];
185
+ const parts = order
186
+ .filter(label => (counts[label] ?? 0) > 0)
187
+ .map(label => `${counts[label]} ${label}`);
188
+ // Per-model exhaustion breakdown
189
+ const modelBreakdown = buildModelBreakdown(accounts);
190
+ const countsLine = parts.length > 0 ? `Accounts (${parts.join(', ')})` : 'Accounts';
191
+ const modelLine = modelBreakdown.length > 0 ? modelBreakdown.join(', ') : '';
192
+ return { countsLine, modelLine };
193
+ }
194
+ function buildAccountHint(account) {
195
+ if (account.quotaSummary) {
196
+ // For [limited] accounts, strip per-account "resets in Xh Ym" since the
197
+ // summary header already shows aggregate reset times — avoids 22 identical
198
+ // "Claude exhausted resets in 120h 33m" lines
199
+ const overall = classifyOverallQuotaHealth(account.cachedQuota);
200
+ if (overall.health === 'partial') {
201
+ return account.quotaSummary.replace(/\s*resets in \S+/g, '');
202
+ }
203
+ return account.quotaSummary;
204
+ }
205
+ if (account.lastUsed) {
206
+ return `used ${formatRelativeTime(account.lastUsed)}`;
207
+ }
208
+ return '';
209
+ }
210
+ function buildAccountMenuItems(accounts) {
211
+ const sorted = accounts.slice().sort((a, b) => getAccountTier(a) - getAccountTier(b));
212
+ const items = [];
213
+ let prevTier = -1;
214
+ for (let i = 0; i < sorted.length; i++) {
215
+ const account = sorted[i];
216
+ const tier = getAccountTier(account);
217
+ // Insert separator between tiers (but not before the first account)
218
+ if (prevTier !== -1 && tier !== prevTier) {
219
+ items.push({ label: '', value: { type: 'cancel' }, separator: true });
220
+ }
221
+ prevTier = tier;
222
+ const displayNum = i + 1;
223
+ // Current account shows only [current] — no status badge to avoid double-badge noise
224
+ const statusBadge = account.isCurrentAccount ? '' : getStatusBadge(account.status, account);
225
+ const currentBadge = account.isCurrentAccount ? ` ${ANSI.cyan}[current]${ANSI.reset}` : '';
226
+ const disabledBadge = account.enabled === false ? ` ${ANSI.red}[disabled]${ANSI.reset}` : '';
227
+ const baseLabel = account.email || `Account ${displayNum}`;
228
+ const numbered = `${displayNum}. ${baseLabel}`;
229
+ const fullLabel = `${numbered}${currentBadge}${statusBadge}${disabledBadge}`;
230
+ items.push({
231
+ label: fullLabel,
232
+ hint: buildAccountHint(account),
233
+ value: { type: 'select-account', account },
234
+ });
235
+ }
236
+ return items;
237
+ }
238
+ export async function showAuthMenu(accounts) {
239
+ const items = [
240
+ { label: 'Actions', value: { type: 'cancel' }, kind: 'heading' },
241
+ { label: 'Add account', value: { type: 'add' }, color: 'cyan' },
242
+ { label: 'Auth current', value: { type: 'current' }, color: 'cyan' },
243
+ { label: 'Check quotas', value: { type: 'check' }, color: 'cyan' },
244
+ { label: 'Repair auth', value: { type: 'repair' }, color: 'yellow' },
245
+ { label: 'Auth doctor', value: { type: 'doctor' }, color: 'cyan' },
246
+ { label: 'Verify one account', value: { type: 'verify' }, color: 'cyan' },
247
+ { label: 'Verify all accounts', value: { type: 'verify-all' }, color: 'cyan' },
248
+ { label: 'Configure models in opencode.json', value: { type: 'configure-models' }, color: 'cyan' },
249
+ { label: '', value: { type: 'cancel' }, separator: true },
250
+ ...(() => {
251
+ const { countsLine, modelLine } = buildAccountSummary(accounts);
252
+ const lines = [
253
+ { label: countsLine, value: { type: 'cancel' }, kind: 'heading' },
254
+ ];
255
+ if (modelLine) {
256
+ lines.push({ label: modelLine, value: { type: 'cancel' }, kind: 'heading' });
257
+ }
258
+ return lines;
259
+ })(),
260
+ ...buildAccountMenuItems(accounts),
261
+ { label: '', value: { type: 'cancel' }, separator: true },
262
+ { label: 'Danger zone', value: { type: 'cancel' }, kind: 'heading' },
263
+ { label: 'Delete all accounts', value: { type: 'delete-all' }, color: 'red' },
264
+ ];
265
+ while (true) {
266
+ const result = await select(items, {
267
+ message: 'Google accounts (Antigravity)',
268
+ subtitle: 'Select an action or account',
269
+ clearScreen: true,
270
+ });
271
+ if (!result)
272
+ return { type: 'cancel' };
273
+ if (result.type === 'delete-all') {
274
+ const confirmed = await confirm('Delete ALL accounts? This cannot be undone.');
275
+ if (!confirmed)
276
+ continue;
277
+ }
278
+ return result;
279
+ }
280
+ }
281
+ function formatFingerprintReason(reason) {
282
+ switch (reason) {
283
+ case 'initial': return 'initial';
284
+ case 'regenerated': return 'regenerated';
285
+ case 'restored': return 'restored';
286
+ }
287
+ }
288
+ export async function showFingerprintHistory(history, accountLabel) {
289
+ const items = [
290
+ { label: 'Back', value: null },
291
+ { label: '', value: null, separator: true },
292
+ { label: 'Fingerprint history', value: null, kind: 'heading' },
293
+ ...history.map((entry, index) => {
294
+ const deviceShort = entry.fingerprint.deviceId.slice(0, 8);
295
+ const reasonBadge = `${ANSI.dim}[${formatFingerprintReason(entry.reason)}]${ANSI.reset}`;
296
+ const label = `${index + 1}. ${deviceShort}... ${reasonBadge}`;
297
+ const hint = formatRelativeTime(entry.timestamp);
298
+ return {
299
+ label,
300
+ hint,
301
+ value: index,
302
+ color: 'cyan',
303
+ };
304
+ }),
305
+ ];
306
+ const result = await select(items, {
307
+ message: `Restore fingerprint — ${accountLabel}`,
308
+ subtitle: 'Select a previous fingerprint to restore',
309
+ clearScreen: true,
310
+ });
311
+ return result ?? null;
312
+ }
313
+ export async function showAccountDetails(account) {
314
+ const label = account.email || `Account ${account.index + 1}`;
315
+ const badge = getStatusBadge(account.status, account);
316
+ const disabledBadge = account.enabled === false ? ` ${ANSI.red}[disabled]${ANSI.reset}` : '';
317
+ const header = `${label}${badge}${disabledBadge}`;
318
+ const subtitleParts = [
319
+ `Added: ${formatDate(account.addedAt)}`,
320
+ `Last used: ${formatRelativeTime(account.lastUsed)}`,
321
+ ];
322
+ const hasHistory = (account.fingerprintHistory?.length ?? 0) > 0;
323
+ while (true) {
324
+ const menuItems = [
325
+ { label: 'Back', value: 'back' },
326
+ ];
327
+ if (!account.isCurrentAccount) {
328
+ menuItems.push({
329
+ label: 'Switch to this account',
330
+ value: 'switch-account',
331
+ color: 'green',
332
+ });
333
+ }
334
+ menuItems.push({ label: 'Verify account access', value: 'verify', color: 'cyan' }, { label: account.enabled === false ? 'Enable account' : 'Disable account', value: 'toggle', color: account.enabled === false ? 'green' : 'yellow' }, { label: 'Refresh token', value: 'refresh', color: 'cyan' });
335
+ if (hasHistory) {
336
+ menuItems.push({
337
+ label: `Restore fingerprint (${account.fingerprintHistory.length} saved)`,
338
+ value: 'restore-fingerprint',
339
+ color: 'cyan',
340
+ });
341
+ }
342
+ menuItems.push({ label: 'Delete this account', value: 'delete', color: 'red' });
343
+ const result = await select(menuItems, {
344
+ message: header,
345
+ subtitle: subtitleParts.join(' | '),
346
+ clearScreen: true,
347
+ });
348
+ if (result === 'delete') {
349
+ const confirmed = await confirm(`Delete ${label}?`);
350
+ if (!confirmed)
351
+ continue;
352
+ }
353
+ if (result === 'refresh') {
354
+ const confirmed = await confirm(`Re-authenticate ${label}?`);
355
+ if (!confirmed)
356
+ continue;
357
+ }
358
+ return result ?? 'cancel';
359
+ }
360
+ }
361
+ export { isTTY } from './ansi';
362
+ //# sourceMappingURL=auth-menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-menu.js","sourceRoot":"","sources":["../../../../src/plugin/ui/auth-menu.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function confirm(message: string, defaultYes?: boolean): Promise<boolean>;
2
+ //# sourceMappingURL=confirm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirm.d.ts","sourceRoot":"","sources":["../../../../src/plugin/ui/confirm.ts"],"names":[],"mappings":"AAEA,wBAAsB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAanF"}
@@ -0,0 +1,15 @@
1
+ import { select } from './select';
2
+ export async function confirm(message, defaultYes = false) {
3
+ const items = defaultYes
4
+ ? [
5
+ { label: 'Yes', value: true },
6
+ { label: 'No', value: false },
7
+ ]
8
+ : [
9
+ { label: 'No', value: false },
10
+ { label: 'Yes', value: true },
11
+ ];
12
+ const result = await select(items, { message });
13
+ return result ?? false;
14
+ }
15
+ //# sourceMappingURL=confirm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirm.js","sourceRoot":"","sources":["../../../../src/plugin/ui/confirm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAe,EAAE,UAAU,GAAG,KAAK;IAC/D,MAAM,KAAK,GAAG,UAAU;QACtB,CAAC,CAAC;YACE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE;YAC7B,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE;SAC9B;QACH,CAAC,CAAC;YACE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE;YAC7B,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE;SAC9B,CAAC;IAEN,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAChD,OAAO,MAAM,IAAI,KAAK,CAAC;AACzB,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { CooldownReason } from "../accounts";
2
+ import type { QuotaGroupSummary } from "../quota";
3
+ import type { QuotaStatusInfo } from "./quota-status";
4
+ /**
5
+ * Per-account status data for a specific model family.
6
+ * Extracted from AccountManager by the caller; kept simple for testability.
7
+ */
8
+ export interface ModelAccountStatus {
9
+ coolingDown: boolean;
10
+ cooldownMs: number;
11
+ cooldownReason?: CooldownReason;
12
+ rateLimited: boolean;
13
+ rateLimitWaitMs: number;
14
+ quotaGroup?: QuotaGroupSummary;
15
+ }
16
+ /**
17
+ * Determine per-model availability status by aggregating across accounts.
18
+ *
19
+ * Rules:
20
+ * 1. If ANY enabled account can serve the model → READY (or LOW if all
21
+ * available accounts have low quota).
22
+ * 2. If ALL accounts are blocked:
23
+ * - All cooling down → COOLDOWN with min cooldown time
24
+ * - Any rate-limited → WAIT with min wait time
25
+ * 3. Fail-open: returns READY when no accounts or no quota data exist.
26
+ */
27
+ export declare function getModelStatusFromAccounts(accounts: readonly ModelAccountStatus[]): QuotaStatusInfo;
28
+ //# sourceMappingURL=model-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-status.d.ts","sourceRoot":"","sources":["../../../../src/plugin/ui/model-status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAMjD,OAAO,KAAK,EAAE,eAAe,EAAc,MAAM,gBAAgB,CAAA;AAEjE;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,OAAO,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,cAAc,CAAA;IAC/B,WAAW,EAAE,OAAO,CAAA;IACpB,eAAe,EAAE,MAAM,CAAA;IACvB,UAAU,CAAC,EAAE,iBAAiB,CAAA;CAC/B;AAcD;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,SAAS,kBAAkB,EAAE,GACtC,eAAe,CAqBjB"}
@@ -0,0 +1,80 @@
1
+ import { classifyGroupStatus, buildCooldownStatus, buildWaitStatus, } from "./quota-status";
2
+ /**
3
+ * Priority ranking for quota labels — higher is more available.
4
+ * Used to pick the best (most optimistic) status across accounts.
5
+ */
6
+ const STATUS_PRIORITY = {
7
+ READY: 4,
8
+ LOW: 3,
9
+ WAIT: 2,
10
+ EXHAUSTED: 1,
11
+ COOLDOWN: 0,
12
+ };
13
+ /**
14
+ * Determine per-model availability status by aggregating across accounts.
15
+ *
16
+ * Rules:
17
+ * 1. If ANY enabled account can serve the model → READY (or LOW if all
18
+ * available accounts have low quota).
19
+ * 2. If ALL accounts are blocked:
20
+ * - All cooling down → COOLDOWN with min cooldown time
21
+ * - Any rate-limited → WAIT with min wait time
22
+ * 3. Fail-open: returns READY when no accounts or no quota data exist.
23
+ */
24
+ export function getModelStatusFromAccounts(accounts) {
25
+ if (accounts.length === 0) {
26
+ return { label: "READY" };
27
+ }
28
+ const available = [];
29
+ const blocked = [];
30
+ for (const account of accounts) {
31
+ if (!account.coolingDown && !account.rateLimited) {
32
+ available.push(account);
33
+ }
34
+ else {
35
+ blocked.push(account);
36
+ }
37
+ }
38
+ if (available.length > 0) {
39
+ return resolveAvailableStatus(available);
40
+ }
41
+ return resolveBlockedStatus(blocked);
42
+ }
43
+ /**
44
+ * Among accounts that can serve right now, pick the best quota status.
45
+ * If none have quota data, fail-open to READY.
46
+ */
47
+ function resolveAvailableStatus(accounts) {
48
+ let best = null;
49
+ for (const account of accounts) {
50
+ if (!account.quotaGroup)
51
+ continue;
52
+ const status = classifyGroupStatus(account.quotaGroup);
53
+ if (!best || STATUS_PRIORITY[status.label] > STATUS_PRIORITY[best.label]) {
54
+ best = status;
55
+ }
56
+ }
57
+ return best ?? { label: "READY" };
58
+ }
59
+ /**
60
+ * All accounts are blocked — determine the dominant blocking reason and
61
+ * the soonest time any account becomes available.
62
+ */
63
+ function resolveBlockedStatus(accounts) {
64
+ const allCooling = accounts.every((a) => a.coolingDown);
65
+ if (allCooling) {
66
+ const cooldownTimes = accounts
67
+ .map((a) => a.cooldownMs)
68
+ .filter((ms) => ms > 0);
69
+ const minMs = cooldownTimes.length > 0 ? Math.min(...cooldownTimes) : 0;
70
+ const reason = accounts[0]?.cooldownReason;
71
+ return buildCooldownStatus(minMs, reason);
72
+ }
73
+ // Mix of cooldown + rate-limited, or all rate-limited → WAIT
74
+ const waitTimes = accounts
75
+ .map((a) => (a.coolingDown ? a.cooldownMs : a.rateLimitWaitMs))
76
+ .filter((ms) => ms > 0);
77
+ const minMs = waitTimes.length > 0 ? Math.min(...waitTimes) : undefined;
78
+ return buildWaitStatus(minMs);
79
+ }
80
+ //# sourceMappingURL=model-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-status.js","sourceRoot":"","sources":["../../../../src/plugin/ui/model-status.ts"],"names":[],"mappings":"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"}