@expiren/opencode-antigravity-auth 1.6.17 → 1.6.19

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 (62) hide show
  1. package/dist/index.js +600 -81
  2. package/dist/index.js.map +4 -4
  3. package/dist/src/constants.d.ts +13 -0
  4. package/dist/src/constants.d.ts.map +1 -1
  5. package/dist/src/constants.js +19 -1
  6. package/dist/src/constants.js.map +1 -1
  7. package/dist/src/plugin/auth-doctor.d.ts +30 -0
  8. package/dist/src/plugin/auth-doctor.d.ts.map +1 -0
  9. package/dist/src/plugin/auth-doctor.js +144 -0
  10. package/dist/src/plugin/auth-doctor.js.map +1 -0
  11. package/dist/src/plugin/auth-drift.d.ts +13 -0
  12. package/dist/src/plugin/auth-drift.d.ts.map +1 -0
  13. package/dist/src/plugin/auth-drift.js +70 -0
  14. package/dist/src/plugin/auth-drift.js.map +1 -0
  15. package/dist/src/plugin/cli.d.ts +12 -2
  16. package/dist/src/plugin/cli.d.ts.map +1 -1
  17. package/dist/src/plugin/cli.js +36 -3
  18. package/dist/src/plugin/cli.js.map +1 -1
  19. package/dist/src/plugin/config/models.d.ts +2 -32
  20. package/dist/src/plugin/config/models.d.ts.map +1 -1
  21. package/dist/src/plugin/config/models.js +1 -113
  22. package/dist/src/plugin/config/models.js.map +1 -1
  23. package/dist/src/plugin/config/schema.js +2 -2
  24. package/dist/src/plugin/config/schema.js.map +1 -1
  25. package/dist/src/plugin/model-registry.d.ts +46 -0
  26. package/dist/src/plugin/model-registry.d.ts.map +1 -0
  27. package/dist/src/plugin/model-registry.js +180 -0
  28. package/dist/src/plugin/model-registry.js.map +1 -0
  29. package/dist/src/plugin/quota.d.ts +1 -0
  30. package/dist/src/plugin/quota.d.ts.map +1 -1
  31. package/dist/src/plugin/quota.js +8 -5
  32. package/dist/src/plugin/quota.js.map +1 -1
  33. package/dist/src/plugin/request.d.ts.map +1 -1
  34. package/dist/src/plugin/request.js +9 -9
  35. package/dist/src/plugin/request.js.map +1 -1
  36. package/dist/src/plugin/transform/claude.d.ts +1 -0
  37. package/dist/src/plugin/transform/claude.d.ts.map +1 -1
  38. package/dist/src/plugin/transform/claude.js +13 -0
  39. package/dist/src/plugin/transform/claude.js.map +1 -1
  40. package/dist/src/plugin/transform/model-resolver.d.ts.map +1 -1
  41. package/dist/src/plugin/transform/model-resolver.js +4 -26
  42. package/dist/src/plugin/transform/model-resolver.js.map +1 -1
  43. package/dist/src/plugin/ui/auth-menu.d.ts +25 -1
  44. package/dist/src/plugin/ui/auth-menu.d.ts.map +1 -1
  45. package/dist/src/plugin/ui/auth-menu.js +72 -16
  46. package/dist/src/plugin/ui/auth-menu.js.map +1 -1
  47. package/dist/src/plugin/ui/model-status.d.ts +28 -0
  48. package/dist/src/plugin/ui/model-status.d.ts.map +1 -0
  49. package/dist/src/plugin/ui/model-status.js +80 -0
  50. package/dist/src/plugin/ui/model-status.js.map +1 -0
  51. package/dist/src/plugin/ui/quota-status.d.ts +67 -0
  52. package/dist/src/plugin/ui/quota-status.d.ts.map +1 -0
  53. package/dist/src/plugin/ui/quota-status.js +194 -0
  54. package/dist/src/plugin/ui/quota-status.js.map +1 -0
  55. package/dist/src/plugin/version.d.ts +8 -1
  56. package/dist/src/plugin/version.d.ts.map +1 -1
  57. package/dist/src/plugin/version.js +8 -1
  58. package/dist/src/plugin/version.js.map +1 -1
  59. package/dist/src/plugin.d.ts.map +1 -1
  60. package/dist/src/plugin.js +66 -5
  61. package/dist/src/plugin.js.map +1 -1
  62. package/package.json +1 -1
@@ -1,6 +1,7 @@
1
1
  import { ANSI } from './ansi';
2
2
  import { select } from './select';
3
3
  import { confirm } from './confirm';
4
+ import { classifyGroupStatus, buildCooldownStatus, formatQuotaStatusBadge, } from './quota-status';
4
5
  function formatRelativeTime(timestamp) {
5
6
  if (!timestamp)
6
7
  return 'never';
@@ -20,12 +21,18 @@ function formatDate(timestamp) {
20
21
  return 'unknown';
21
22
  return new Date(timestamp).toLocaleDateString();
22
23
  }
23
- function getStatusBadge(status) {
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
+ // Then check account-level status
24
31
  switch (status) {
25
- case 'active': return `${ANSI.green}[active]${ANSI.reset}`;
26
- case 'rate-limited': return `${ANSI.yellow}[rate-limited]${ANSI.reset}`;
27
- case 'expired': return `${ANSI.red}[expired]${ANSI.reset}`;
28
- case 'verification-required': return `${ANSI.red}[needs verification]${ANSI.reset}`;
32
+ case 'active': return ` ${ANSI.green}[active]${ANSI.reset}`;
33
+ case 'rate-limited': return ` ${ANSI.yellow}[rate-limited]${ANSI.reset}`;
34
+ case 'expired': return ` ${ANSI.red}[expired]${ANSI.reset}`;
35
+ case 'verification-required': return ` ${ANSI.red}[needs verification]${ANSI.reset}`;
29
36
  default: return '';
30
37
  }
31
38
  }
@@ -33,22 +40,25 @@ export async function showAuthMenu(accounts) {
33
40
  const items = [
34
41
  { label: 'Actions', value: { type: 'cancel' }, kind: 'heading' },
35
42
  { label: 'Add account', value: { type: 'add' }, color: 'cyan' },
43
+ { label: 'Auth current', value: { type: 'current' }, color: 'cyan' },
36
44
  { label: 'Check quotas', value: { type: 'check' }, color: 'cyan' },
45
+ { label: 'Repair auth', value: { type: 'repair' }, color: 'yellow' },
46
+ { label: 'Auth doctor', value: { type: 'doctor' }, color: 'cyan' },
37
47
  { label: 'Verify one account', value: { type: 'verify' }, color: 'cyan' },
38
48
  { label: 'Verify all accounts', value: { type: 'verify-all' }, color: 'cyan' },
39
49
  { label: 'Configure models in opencode.json', value: { type: 'configure-models' }, color: 'cyan' },
40
50
  { label: '', value: { type: 'cancel' }, separator: true },
41
51
  { label: 'Accounts', value: { type: 'cancel' }, kind: 'heading' },
42
52
  ...accounts.map(account => {
43
- const statusBadge = getStatusBadge(account.status);
53
+ const statusBadge = getStatusBadge(account.status, account);
44
54
  const currentBadge = account.isCurrentAccount ? ` ${ANSI.cyan}[current]${ANSI.reset}` : '';
45
55
  const disabledBadge = account.enabled === false ? ` ${ANSI.red}[disabled]${ANSI.reset}` : '';
46
56
  const baseLabel = account.email || `Account ${account.index + 1}`;
47
57
  const numbered = `${account.index + 1}. ${baseLabel}`;
48
- const fullLabel = `${numbered}${currentBadge}${statusBadge ? ' ' + statusBadge : ''}${disabledBadge}`;
58
+ const fullLabel = `${numbered}${currentBadge}${statusBadge}${disabledBadge}`;
49
59
  return {
50
60
  label: fullLabel,
51
- hint: account.lastUsed ? `used ${formatRelativeTime(account.lastUsed)}` : '',
61
+ hint: account.quotaSummary ?? (account.lastUsed ? `used ${formatRelativeTime(account.lastUsed)}` : ''),
52
62
  value: { type: 'select-account', account },
53
63
  };
54
64
  }),
@@ -72,23 +82,69 @@ export async function showAuthMenu(accounts) {
72
82
  return result;
73
83
  }
74
84
  }
85
+ function formatFingerprintReason(reason) {
86
+ switch (reason) {
87
+ case 'initial': return 'initial';
88
+ case 'regenerated': return 'regenerated';
89
+ case 'restored': return 'restored';
90
+ }
91
+ }
92
+ export async function showFingerprintHistory(history, accountLabel) {
93
+ const items = [
94
+ { label: 'Back', value: null },
95
+ { label: '', value: null, separator: true },
96
+ { label: 'Fingerprint history', value: null, kind: 'heading' },
97
+ ...history.map((entry, index) => {
98
+ const deviceShort = entry.deviceId.slice(0, 8);
99
+ const reasonBadge = `${ANSI.dim}[${formatFingerprintReason(entry.reason)}]${ANSI.reset}`;
100
+ const label = `${index + 1}. ${deviceShort}... ${reasonBadge}`;
101
+ const hint = formatRelativeTime(entry.timestamp);
102
+ return {
103
+ label,
104
+ hint,
105
+ value: index,
106
+ color: 'cyan',
107
+ };
108
+ }),
109
+ ];
110
+ const result = await select(items, {
111
+ message: `Restore fingerprint — ${accountLabel}`,
112
+ subtitle: 'Select a previous fingerprint to restore',
113
+ clearScreen: true,
114
+ });
115
+ return result ?? null;
116
+ }
75
117
  export async function showAccountDetails(account) {
76
118
  const label = account.email || `Account ${account.index + 1}`;
77
- const badge = getStatusBadge(account.status);
119
+ const badge = getStatusBadge(account.status, account);
78
120
  const disabledBadge = account.enabled === false ? ` ${ANSI.red}[disabled]${ANSI.reset}` : '';
79
- const header = `${label}${badge ? ' ' + badge : ''}${disabledBadge}`;
121
+ const header = `${label}${badge}${disabledBadge}`;
80
122
  const subtitleParts = [
81
123
  `Added: ${formatDate(account.addedAt)}`,
82
124
  `Last used: ${formatRelativeTime(account.lastUsed)}`,
83
125
  ];
126
+ const hasHistory = (account.fingerprintHistory?.length ?? 0) > 0;
84
127
  while (true) {
85
- const result = await select([
128
+ const menuItems = [
86
129
  { label: 'Back', value: 'back' },
87
- { label: 'Verify account access', value: 'verify', color: 'cyan' },
88
- { label: account.enabled === false ? 'Enable account' : 'Disable account', value: 'toggle', color: account.enabled === false ? 'green' : 'yellow' },
89
- { label: 'Refresh token', value: 'refresh', color: 'cyan' },
90
- { label: 'Delete this account', value: 'delete', color: 'red' },
91
- ], {
130
+ ];
131
+ if (!account.isCurrentAccount) {
132
+ menuItems.push({
133
+ label: 'Switch to this account',
134
+ value: 'switch-account',
135
+ color: 'green',
136
+ });
137
+ }
138
+ 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' });
139
+ if (hasHistory) {
140
+ menuItems.push({
141
+ label: `Restore fingerprint (${account.fingerprintHistory.length} saved)`,
142
+ value: 'restore-fingerprint',
143
+ color: 'cyan',
144
+ });
145
+ }
146
+ menuItems.push({ label: 'Delete this account', value: 'delete', color: 'red' });
147
+ const result = await select(menuItems, {
92
148
  message: header,
93
149
  subtitle: subtitleParts.join(' | '),
94
150
  clearScreen: true,
@@ -1 +1 @@
1
- {"version":3,"file":"auth-menu.js","sourceRoot":"","sources":["../../../../src/plugin/ui/auth-menu.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auth-menu.js","sourceRoot":"","sources":["../../../../src/plugin/ui/auth-menu.ts"],"names":[],"mappings":"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"}
@@ -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":"AAEA,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,GAChB,MAAM,gBAAgB,CAAA;AAgBvB;;;GAGG;AACH,MAAM,eAAe,GAA+B;IAClD,KAAK,EAAE,CAAC;IACR,GAAG,EAAE,CAAC;IACN,IAAI,EAAE,CAAC;IACP,SAAS,EAAE,CAAC;IACZ,QAAQ,EAAE,CAAC;CACZ,CAAA;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,0BAA0B,CACxC,QAAuC;IAEvC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAA;IAC3B,CAAC;IAED,MAAM,SAAS,GAAyB,EAAE,CAAA;IAC1C,MAAM,OAAO,GAAyB,EAAE,CAAA;IAExC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YACjD,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACzB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACvB,CAAC;IACH,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,sBAAsB,CAAC,SAAS,CAAC,CAAA;IAC1C,CAAC;IAED,OAAO,oBAAoB,CAAC,OAAO,CAAC,CAAA;AACtC,CAAC;AAED;;;GAGG;AACH,SAAS,sBAAsB,CAC7B,QAAuC;IAEvC,IAAI,IAAI,GAA2B,IAAI,CAAA;IAEvC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,UAAU;YAAE,SAAQ;QACjC,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;QACtD,IAAI,CAAC,IAAI,IAAI,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACzE,IAAI,GAAG,MAAM,CAAA;QACf,CAAC;IACH,CAAC;IAED,OAAO,IAAI,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAA;AACnC,CAAC;AAED;;;GAGG;AACH,SAAS,oBAAoB,CAC3B,QAAuC;IAEvC,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAA;IAEvD,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,aAAa,GAAG,QAAQ;aAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;aACxB,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;QACzB,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACvE,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,cAAc,CAAA;QAC1C,OAAO,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IAC3C,CAAC;IAED,6DAA6D;IAC7D,MAAM,SAAS,GAAG,QAAQ;SACvB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;SAC9D,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;IAEzB,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACvE,OAAO,eAAe,CAAC,KAAK,CAAC,CAAA;AAC/B,CAAC"}
@@ -0,0 +1,67 @@
1
+ import type { QuotaGroupSummary } from "../quota";
2
+ import type { CooldownReason } from "../accounts";
3
+ /**
4
+ * Quota-aware status labels for models and accounts.
5
+ *
6
+ * Labels:
7
+ * [READY] — quota available, no rate limits
8
+ * [WAIT Xm] — rate-limited, resets in X minutes
9
+ * [EXHAUSTED] — quota fully consumed (0%), reset time known
10
+ * [COOLDOWN] — account cooling down (auth failure, network error, etc.)
11
+ * [LOW] — quota below 20% but still available
12
+ */
13
+ export type QuotaLabel = "READY" | "WAIT" | "EXHAUSTED" | "COOLDOWN" | "LOW";
14
+ export interface QuotaStatusInfo {
15
+ label: QuotaLabel;
16
+ waitMs?: number;
17
+ cooldownReason?: CooldownReason;
18
+ }
19
+ /**
20
+ * Format a duration in milliseconds to a compact human-readable string.
21
+ * Used for wait/cooldown labels.
22
+ */
23
+ export declare function formatWaitDuration(ms: number): string;
24
+ /**
25
+ * Classify a quota group's status based on remaining fraction and reset time.
26
+ */
27
+ export declare function classifyGroupStatus(group: QuotaGroupSummary | undefined): QuotaStatusInfo;
28
+ /**
29
+ * Build a cooldown status for an account that is cooling down.
30
+ */
31
+ export declare function buildCooldownStatus(cooldownMs: number, reason?: CooldownReason): QuotaStatusInfo;
32
+ /**
33
+ * Build a rate-limited (WAIT) status with optional wait time.
34
+ */
35
+ export declare function buildWaitStatus(waitMs?: number): QuotaStatusInfo;
36
+ /**
37
+ * Format a QuotaStatusInfo into a colored ANSI badge string.
38
+ *
39
+ * Examples:
40
+ * [READY]
41
+ * [WAIT 3m 20s]
42
+ * [EXHAUSTED resets in 2h 15m]
43
+ * [COOLDOWN auth-failure]
44
+ * [LOW]
45
+ */
46
+ export declare function formatQuotaStatusBadge(status: QuotaStatusInfo): string;
47
+ /**
48
+ * Format a plain-text (no ANSI) quota status label.
49
+ * Suitable for hints and non-colored contexts.
50
+ */
51
+ export declare function formatQuotaStatusPlain(status: QuotaStatusInfo): string;
52
+ /**
53
+ * Build a quota summary string with status labels for cached quota data.
54
+ * Used in auth menu account hints.
55
+ *
56
+ * Example: "Claude READY 80%, Gemini Pro LOW 15%, Gemini Flash EXHAUSTED"
57
+ */
58
+ export declare function formatCachedQuotaWithStatus(cachedQuota: Partial<Record<string, {
59
+ remainingFraction?: number;
60
+ resetTime?: string;
61
+ }>> | undefined): string | undefined;
62
+ /**
63
+ * Format a per-group quota status badge for the "Check quotas" output.
64
+ * Combines the progress bar with a status label.
65
+ */
66
+ export declare function formatGroupQuotaBadge(remaining?: number, resetTime?: string): string;
67
+ //# sourceMappingURL=quota-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quota-status.d.ts","sourceRoot":"","sources":["../../../../src/plugin/ui/quota-status.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAc,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD;;;;;;;;;GASG;AAEH,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,MAAM,GAAG,WAAW,GAAG,UAAU,GAAG,KAAK,CAAA;AAE5E,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,UAAU,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,cAAc,CAAC,EAAE,cAAc,CAAA;CAChC;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAYrD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,iBAAiB,GAAG,SAAS,GACnC,eAAe,CA2BjB;AAcD;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,cAAc,GACtB,eAAe,CAMjB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,eAAe,CAKhE;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAiCtE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAiCtE;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE;IAAE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,GAAG,SAAS,GACnG,MAAM,GAAG,SAAS,CAuBpB;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,CAAC,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CAQR"}
@@ -0,0 +1,194 @@
1
+ import { ANSI } from "./ansi";
2
+ /**
3
+ * Format a duration in milliseconds to a compact human-readable string.
4
+ * Used for wait/cooldown labels.
5
+ */
6
+ export function formatWaitDuration(ms) {
7
+ if (ms < 1000)
8
+ return `${ms}ms`;
9
+ const seconds = Math.ceil(ms / 1000);
10
+ if (seconds < 60)
11
+ return `${seconds}s`;
12
+ const minutes = Math.floor(seconds / 60);
13
+ const remainingSeconds = seconds % 60;
14
+ if (minutes < 60) {
15
+ return remainingSeconds > 0 ? `${minutes}m ${remainingSeconds}s` : `${minutes}m`;
16
+ }
17
+ const hours = Math.floor(minutes / 60);
18
+ const remainingMinutes = minutes % 60;
19
+ return remainingMinutes > 0 ? `${hours}h ${remainingMinutes}m` : `${hours}h`;
20
+ }
21
+ /**
22
+ * Classify a quota group's status based on remaining fraction and reset time.
23
+ */
24
+ export function classifyGroupStatus(group) {
25
+ if (!group) {
26
+ return { label: "READY" };
27
+ }
28
+ const remaining = group.remainingFraction;
29
+ // No remaining fraction data — treat as ready (fail-open)
30
+ if (typeof remaining !== "number" || !Number.isFinite(remaining)) {
31
+ return { label: "READY" };
32
+ }
33
+ // Exhausted: 0% remaining
34
+ if (remaining <= 0) {
35
+ const waitMs = parseResetTimeToMs(group.resetTime);
36
+ if (waitMs !== null && waitMs > 0) {
37
+ return { label: "EXHAUSTED", waitMs };
38
+ }
39
+ return { label: "EXHAUSTED" };
40
+ }
41
+ // Low: below 20%
42
+ if (remaining < 0.2) {
43
+ return { label: "LOW" };
44
+ }
45
+ return { label: "READY" };
46
+ }
47
+ /**
48
+ * Parse an ISO reset time string to milliseconds-until-reset.
49
+ * Returns null if the time is invalid or already past.
50
+ */
51
+ function parseResetTimeToMs(resetTime) {
52
+ if (!resetTime)
53
+ return null;
54
+ const timestamp = Date.parse(resetTime);
55
+ if (!Number.isFinite(timestamp))
56
+ return null;
57
+ const ms = timestamp - Date.now();
58
+ return ms > 0 ? ms : null;
59
+ }
60
+ /**
61
+ * Build a cooldown status for an account that is cooling down.
62
+ */
63
+ export function buildCooldownStatus(cooldownMs, reason) {
64
+ return {
65
+ label: "COOLDOWN",
66
+ waitMs: cooldownMs > 0 ? cooldownMs : undefined,
67
+ cooldownReason: reason,
68
+ };
69
+ }
70
+ /**
71
+ * Build a rate-limited (WAIT) status with optional wait time.
72
+ */
73
+ export function buildWaitStatus(waitMs) {
74
+ if (waitMs !== undefined && waitMs > 0) {
75
+ return { label: "WAIT", waitMs };
76
+ }
77
+ return { label: "WAIT" };
78
+ }
79
+ /**
80
+ * Format a QuotaStatusInfo into a colored ANSI badge string.
81
+ *
82
+ * Examples:
83
+ * [READY]
84
+ * [WAIT 3m 20s]
85
+ * [EXHAUSTED resets in 2h 15m]
86
+ * [COOLDOWN auth-failure]
87
+ * [LOW]
88
+ */
89
+ export function formatQuotaStatusBadge(status) {
90
+ switch (status.label) {
91
+ case "READY":
92
+ return `${ANSI.green}[READY]${ANSI.reset}`;
93
+ case "LOW":
94
+ return `${ANSI.yellow}[LOW]${ANSI.reset}`;
95
+ case "WAIT": {
96
+ const suffix = status.waitMs
97
+ ? ` ${formatWaitDuration(status.waitMs)}`
98
+ : "";
99
+ return `${ANSI.yellow}[WAIT${suffix}]${ANSI.reset}`;
100
+ }
101
+ case "EXHAUSTED": {
102
+ const suffix = status.waitMs
103
+ ? ` resets in ${formatWaitDuration(status.waitMs)}`
104
+ : "";
105
+ return `${ANSI.red}[EXHAUSTED${suffix}]${ANSI.reset}`;
106
+ }
107
+ case "COOLDOWN": {
108
+ const parts = ["COOLDOWN"];
109
+ if (status.cooldownReason) {
110
+ parts.push(status.cooldownReason);
111
+ }
112
+ if (status.waitMs) {
113
+ parts.push(formatWaitDuration(status.waitMs));
114
+ }
115
+ return `${ANSI.red}[${parts.join(" ")}]${ANSI.reset}`;
116
+ }
117
+ }
118
+ }
119
+ /**
120
+ * Format a plain-text (no ANSI) quota status label.
121
+ * Suitable for hints and non-colored contexts.
122
+ */
123
+ export function formatQuotaStatusPlain(status) {
124
+ switch (status.label) {
125
+ case "READY":
126
+ return "READY";
127
+ case "LOW":
128
+ return "LOW";
129
+ case "WAIT": {
130
+ const suffix = status.waitMs
131
+ ? ` ${formatWaitDuration(status.waitMs)}`
132
+ : "";
133
+ return `WAIT${suffix}`;
134
+ }
135
+ case "EXHAUSTED": {
136
+ const suffix = status.waitMs
137
+ ? ` resets in ${formatWaitDuration(status.waitMs)}`
138
+ : "";
139
+ return `EXHAUSTED${suffix}`;
140
+ }
141
+ case "COOLDOWN": {
142
+ const parts = ["COOLDOWN"];
143
+ if (status.cooldownReason) {
144
+ parts.push(status.cooldownReason);
145
+ }
146
+ if (status.waitMs) {
147
+ parts.push(formatWaitDuration(status.waitMs));
148
+ }
149
+ return parts.join(" ");
150
+ }
151
+ }
152
+ }
153
+ /**
154
+ * Build a quota summary string with status labels for cached quota data.
155
+ * Used in auth menu account hints.
156
+ *
157
+ * Example: "Claude READY 80%, Gemini Pro LOW 15%, Gemini Flash EXHAUSTED"
158
+ */
159
+ export function formatCachedQuotaWithStatus(cachedQuota) {
160
+ if (!cachedQuota) {
161
+ return undefined;
162
+ }
163
+ const entries = [
164
+ { key: "claude", label: "Claude" },
165
+ { key: "gemini-pro", label: "Gemini Pro" },
166
+ { key: "gemini-flash", label: "Gemini Flash" },
167
+ ].flatMap(({ key, label }) => {
168
+ const value = cachedQuota[key]?.remainingFraction;
169
+ if (typeof value !== "number" || !Number.isFinite(value)) {
170
+ return [];
171
+ }
172
+ const pct = Math.round(Math.max(0, Math.min(1, value)) * 100);
173
+ const status = classifyGroupStatus(cachedQuota[key]);
174
+ if (status.label === "READY") {
175
+ return [`${label} ${pct}%`];
176
+ }
177
+ return [`${label} ${formatQuotaStatusPlain(status)} ${pct}%`];
178
+ });
179
+ return entries.length > 0 ? entries.join(", ") : undefined;
180
+ }
181
+ /**
182
+ * Format a per-group quota status badge for the "Check quotas" output.
183
+ * Combines the progress bar with a status label.
184
+ */
185
+ export function formatGroupQuotaBadge(remaining, resetTime) {
186
+ const group = {
187
+ remainingFraction: remaining,
188
+ resetTime,
189
+ modelCount: 1,
190
+ };
191
+ const status = classifyGroupStatus(group);
192
+ return formatQuotaStatusBadge(status);
193
+ }
194
+ //# sourceMappingURL=quota-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quota-status.js","sourceRoot":"","sources":["../../../../src/plugin/ui/quota-status.ts"],"names":[],"mappings":"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"}
@@ -11,9 +11,16 @@
11
11
  *
12
12
  * @see https://github.com/lbjlaq/Antigravity-Manager (src-tauri/src/constants.rs)
13
13
  */
14
+ type VersionSource = "api" | "changelog" | "fallback";
15
+ export interface AntigravityVersionResolution {
16
+ version: string;
17
+ source: VersionSource;
18
+ }
14
19
  /**
15
20
  * Fetch the latest Antigravity version and update the global constant.
16
21
  * Safe to call before logger is initialized (will silently skip logging).
17
22
  */
18
- export declare function initAntigravityVersion(): Promise<void>;
23
+ export declare function getAntigravityVersionResolution(): AntigravityVersionResolution;
24
+ export declare function initAntigravityVersion(): Promise<AntigravityVersionResolution>;
25
+ export {};
19
26
  //# sourceMappingURL=version.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../src/plugin/version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAkCH;;;GAGG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC,CA8B5D"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../src/plugin/version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAWH,KAAK,aAAa,GAAG,KAAK,GAAG,WAAW,GAAG,UAAU,CAAC;AAEtD,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,aAAa,CAAC;CACvB;AAyBD;;;GAGG;AACH,wBAAgB,+BAA+B,IAAI,4BAA4B,CAE9E;AAED,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,4BAA4B,CAAC,CAiCpF"}
@@ -18,6 +18,7 @@ const CHANGELOG_URL = "https://antigravity.google/changelog";
18
18
  const FETCH_TIMEOUT_MS = 5000;
19
19
  const CHANGELOG_SCAN_CHARS = 5000;
20
20
  const VERSION_REGEX = /\d+\.\d+\.\d+/;
21
+ let lastResolution = null;
21
22
  function parseVersion(text) {
22
23
  const match = text.match(VERSION_REGEX);
23
24
  return match ? match[0] : null;
@@ -45,6 +46,9 @@ async function tryFetchVersion(url, maxChars) {
45
46
  * Fetch the latest Antigravity version and update the global constant.
46
47
  * Safe to call before logger is initialized (will silently skip logging).
47
48
  */
49
+ export function getAntigravityVersionResolution() {
50
+ return lastResolution ?? { version: getAntigravityVersion(), source: "fallback" };
51
+ }
48
52
  export async function initAntigravityVersion() {
49
53
  const log = createLogger("version");
50
54
  const fallback = getAntigravityVersion();
@@ -66,7 +70,8 @@ export async function initAntigravityVersion() {
66
70
  source = "fallback";
67
71
  setAntigravityVersion(fallback);
68
72
  log.info("version-fetch-failed", { fallback });
69
- return;
73
+ lastResolution = { version: fallback, source };
74
+ return lastResolution;
70
75
  }
71
76
  }
72
77
  if (version !== fallback) {
@@ -76,5 +81,7 @@ export async function initAntigravityVersion() {
76
81
  log.debug("version-unchanged", { version, source });
77
82
  }
78
83
  setAntigravityVersion(version);
84
+ lastResolution = { version, source };
85
+ return lastResolution;
79
86
  }
80
87
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/plugin/version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,MAAM,WAAW,GAAG,mEAAmE,CAAC;AACxF,MAAM,aAAa,GAAG,sCAAsC,CAAC;AAC7D,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAC9B,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAClC,MAAM,aAAa,GAAG,eAAe,CAAC;AAItC,SAAS,YAAY,CAAC,IAAY;IAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IACxC,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACjC,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,GAAW,EAAE,QAAiB;IAC3D,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,gBAAgB,CAAC,CAAC;IACvE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QACjE,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAC9B,IAAI,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACjC,IAAI,QAAQ;YAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC7C,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,qBAAqB,EAAE,CAAC;IACzC,IAAI,OAAsB,CAAC;IAC3B,IAAI,MAAqB,CAAC;IAE1B,0BAA0B;IAC1B,OAAO,GAAG,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC;IAC7C,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,GAAG,KAAK,CAAC;IACjB,CAAC;SAAM,CAAC;QACN,+BAA+B;QAC/B,OAAO,GAAG,MAAM,eAAe,CAAC,aAAa,EAAE,oBAAoB,CAAC,CAAC;QACrE,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,GAAG,WAAW,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,4BAA4B;YAC5B,MAAM,GAAG,UAAU,CAAC;YACpB,qBAAqB,CAAC,QAAQ,CAAC,CAAC;YAChC,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC/C,OAAO;QACT,CAAC;IACH,CAAC;IAED,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IACvE,CAAC;SAAM,CAAC;QACN,GAAG,CAAC,KAAK,CAAC,mBAAmB,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,qBAAqB,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/plugin/version.ts"],"names":[],"mappings":"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"}