@cortexkit/antigravity-auth-core 1.0.1 → 2.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.
- package/dist/account-manager.d.ts +281 -0
- package/dist/account-manager.d.ts.map +1 -0
- package/dist/account-manager.js +1378 -0
- package/dist/account-manager.js.map +1 -0
- package/dist/account-storage.d.ts +162 -0
- package/dist/account-storage.d.ts.map +1 -0
- package/dist/account-storage.js +635 -0
- package/dist/account-storage.js.map +1 -0
- package/dist/account-types.d.ts +136 -0
- package/dist/account-types.d.ts.map +1 -0
- package/dist/account-types.js +9 -0
- package/dist/account-types.js.map +1 -0
- package/dist/agy-request-metadata.d.ts +61 -0
- package/dist/agy-request-metadata.d.ts.map +1 -0
- package/dist/agy-request-metadata.js +197 -0
- package/dist/agy-request-metadata.js.map +1 -0
- package/dist/agy-transport.d.ts +2 -2
- package/dist/agy-transport.d.ts.map +1 -1
- package/dist/agy-transport.js +88 -74
- package/dist/agy-transport.js.map +1 -1
- package/dist/antigravity/oauth.d.ts +3 -2
- package/dist/antigravity/oauth.d.ts.map +1 -1
- package/dist/antigravity/oauth.js +65 -55
- package/dist/antigravity/oauth.js.map +1 -1
- package/dist/atomic-write.d.ts +23 -0
- package/dist/atomic-write.d.ts.map +1 -0
- package/dist/atomic-write.js +47 -0
- package/dist/atomic-write.js.map +1 -0
- package/dist/auth-types.d.ts +2 -2
- package/dist/auth-types.d.ts.map +1 -1
- package/dist/auth.d.ts +1 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +9 -6
- package/dist/auth.js.map +1 -1
- package/dist/constants.d.ts +19 -12
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +52 -45
- package/dist/constants.js.map +1 -1
- package/dist/fetch-timeout.d.ts +26 -0
- package/dist/fetch-timeout.d.ts.map +1 -0
- package/dist/fetch-timeout.js +43 -0
- package/dist/fetch-timeout.js.map +1 -0
- package/dist/file-lock.d.ts +79 -0
- package/dist/file-lock.d.ts.map +1 -0
- package/dist/file-lock.js +438 -0
- package/dist/file-lock.js.map +1 -0
- package/dist/fingerprint.d.ts +13 -7
- package/dist/fingerprint.d.ts.map +1 -1
- package/dist/fingerprint.js +34 -24
- package/dist/fingerprint.js.map +1 -1
- package/dist/index.d.ts +23 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -8
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +1 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +10 -10
- package/dist/logger.js.map +1 -1
- package/dist/model-registry.d.ts +6 -5
- package/dist/model-registry.d.ts.map +1 -1
- package/dist/model-registry.js +124 -91
- package/dist/model-registry.js.map +1 -1
- package/dist/project.d.ts +1 -1
- package/dist/project.d.ts.map +1 -1
- package/dist/project.js +53 -25
- package/dist/project.js.map +1 -1
- package/dist/quota-manager.d.ts +140 -0
- package/dist/quota-manager.d.ts.map +1 -0
- package/dist/quota-manager.js +481 -0
- package/dist/quota-manager.js.map +1 -0
- package/dist/quota-types.d.ts +49 -0
- package/dist/quota-types.d.ts.map +1 -0
- package/dist/quota-types.js +10 -0
- package/dist/quota-types.js.map +1 -0
- package/dist/rotation.d.ts +175 -0
- package/dist/rotation.d.ts.map +1 -0
- package/dist/rotation.js +391 -0
- package/dist/rotation.js.map +1 -0
- package/dist/transform/claude.d.ts +1 -1
- package/dist/transform/claude.d.ts.map +1 -1
- package/dist/transform/claude.js +63 -41
- package/dist/transform/claude.js.map +1 -1
- package/dist/transform/cross-model-sanitizer.d.ts +1 -1
- package/dist/transform/cross-model-sanitizer.d.ts.map +1 -1
- package/dist/transform/cross-model-sanitizer.js +19 -16
- package/dist/transform/cross-model-sanitizer.js.map +1 -1
- package/dist/transform/gemini.d.ts +10 -3
- package/dist/transform/gemini.d.ts.map +1 -1
- package/dist/transform/gemini.js +142 -73
- package/dist/transform/gemini.js.map +1 -1
- package/dist/transform/index.d.ts +9 -9
- package/dist/transform/index.d.ts.map +1 -1
- package/dist/transform/index.js +6 -6
- package/dist/transform/index.js.map +1 -1
- package/dist/transform/model-resolver.d.ts +5 -5
- package/dist/transform/model-resolver.d.ts.map +1 -1
- package/dist/transform/model-resolver.js +118 -76
- package/dist/transform/model-resolver.js.map +1 -1
- package/dist/transform/types.d.ts +5 -5
- package/dist/transform/types.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +14 -16
- package/dist/version.js.map +1 -1
- package/package.json +16 -10
|
@@ -0,0 +1,481 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Harness-agnostic attributed quota manager.
|
|
3
|
+
*
|
|
4
|
+
* Owns the per-account quota cache, in-flight de-duplication, and exponential
|
|
5
|
+
* backoff that backgrounds proactive quota refreshes. The manager has no host
|
|
6
|
+
* dependencies — harnesses supply a `fetchAccountQuota` callback that returns
|
|
7
|
+
* the already-attributed `AccountQuotaResult` (with `index`, `email`,
|
|
8
|
+
* `updatedAccount`, etc.) so core stays harness-agnostic.
|
|
9
|
+
*
|
|
10
|
+
* Manual quota dialogs must force a refresh even when background refresh is
|
|
11
|
+
* backed off; proactive refreshes must dedupe by stable account identity and
|
|
12
|
+
* respect backoff. Account identity is supplied via `keyOf` so reorders/
|
|
13
|
+
* removals of the underlying array do not invalidate cache entries.
|
|
14
|
+
*/
|
|
15
|
+
import { createHash } from 'node:crypto';
|
|
16
|
+
import { fetchWithActiveTimeout } from "./fetch-timeout.js";
|
|
17
|
+
import { buildAntigravityHarnessUserAgent } from "./fingerprint.js";
|
|
18
|
+
import { createLogger } from "./logger.js";
|
|
19
|
+
import { getQuotaGroupForModel } from "./model-registry.js";
|
|
20
|
+
import { getModelFamily } from "./transform/model-resolver.js";
|
|
21
|
+
const log = createLogger('quota-manager');
|
|
22
|
+
export const QUOTA_MANAGER_DEFAULT_BASE_BACKOFF_MS = 30_000;
|
|
23
|
+
export const QUOTA_MANAGER_DEFAULT_MAX_BACKOFF_MS = 10 * 60 * 1000;
|
|
24
|
+
export const QUOTA_MANAGER_DEFAULT_TIMEOUT_MS = 10_000;
|
|
25
|
+
/**
|
|
26
|
+
* Default keyOf — prefers email, falls back to refresh-token hash so the
|
|
27
|
+
* same identity is keyed even when emails are missing.
|
|
28
|
+
*/
|
|
29
|
+
export function defaultKeyOf(account) {
|
|
30
|
+
if (account.email)
|
|
31
|
+
return `e:${account.email.toLowerCase()}`;
|
|
32
|
+
const token = account.refreshToken || '';
|
|
33
|
+
return `t:${createHash('sha256').update(token).digest('hex').slice(0, 16)}`;
|
|
34
|
+
}
|
|
35
|
+
export function createQuotaManager(options) {
|
|
36
|
+
const now = options.now ?? (() => Date.now());
|
|
37
|
+
const baseBackoffMs = options.baseBackoffMs ?? QUOTA_MANAGER_DEFAULT_BASE_BACKOFF_MS;
|
|
38
|
+
const maxBackoffMs = options.maxBackoffMs ?? QUOTA_MANAGER_DEFAULT_MAX_BACKOFF_MS;
|
|
39
|
+
const fetchTimeoutMs = options.fetchTimeoutMs ?? QUOTA_MANAGER_DEFAULT_TIMEOUT_MS;
|
|
40
|
+
const state = new Map();
|
|
41
|
+
let disposed = false;
|
|
42
|
+
const keyOf = (account) => options.keyOf(account);
|
|
43
|
+
const recordSuccess = (key) => {
|
|
44
|
+
const entry = state.get(key);
|
|
45
|
+
if (!entry)
|
|
46
|
+
return;
|
|
47
|
+
entry.consecutiveFailures = 0;
|
|
48
|
+
entry.backoffUntil = 0;
|
|
49
|
+
};
|
|
50
|
+
const recordFailure = (key) => {
|
|
51
|
+
const current = now();
|
|
52
|
+
const entry = state.get(key) ?? {
|
|
53
|
+
consecutiveFailures: 0,
|
|
54
|
+
backoffUntil: 0,
|
|
55
|
+
};
|
|
56
|
+
const failures = entry.consecutiveFailures + 1;
|
|
57
|
+
const backoffMs = Math.min(maxBackoffMs, baseBackoffMs * 2 ** (failures - 1));
|
|
58
|
+
entry.consecutiveFailures = failures;
|
|
59
|
+
entry.backoffUntil = current + backoffMs;
|
|
60
|
+
state.set(key, entry);
|
|
61
|
+
return { backoffMs, backoffUntil: entry.backoffUntil };
|
|
62
|
+
};
|
|
63
|
+
const cacheResult = (key, result) => {
|
|
64
|
+
const entry = state.get(key) ?? {
|
|
65
|
+
consecutiveFailures: 0,
|
|
66
|
+
backoffUntil: 0,
|
|
67
|
+
};
|
|
68
|
+
entry.cached = result;
|
|
69
|
+
state.set(key, entry);
|
|
70
|
+
};
|
|
71
|
+
const buildDisabledResult = (account, index) => ({
|
|
72
|
+
index,
|
|
73
|
+
email: account.email,
|
|
74
|
+
status: 'disabled',
|
|
75
|
+
disabled: true,
|
|
76
|
+
quota: undefined,
|
|
77
|
+
geminiCliQuota: undefined,
|
|
78
|
+
updatedAccount: undefined,
|
|
79
|
+
});
|
|
80
|
+
const buildSkippedResult = (account, index, backoffUntil) => {
|
|
81
|
+
const cached = state.get(keyOf(account))?.cached;
|
|
82
|
+
if (cached) {
|
|
83
|
+
return { ...cached, index };
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
index,
|
|
87
|
+
email: account.email,
|
|
88
|
+
status: 'error',
|
|
89
|
+
error: `quota refresh skipped (backoff until ${new Date(backoffUntil).toISOString()})`,
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
const refreshAccount = async (account, refreshOptions) => {
|
|
93
|
+
if (disposed) {
|
|
94
|
+
return {
|
|
95
|
+
index: refreshOptions.index,
|
|
96
|
+
email: account.email,
|
|
97
|
+
status: 'error',
|
|
98
|
+
error: 'quota manager disposed',
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
const { index, force = false } = refreshOptions;
|
|
102
|
+
const key = keyOf(account);
|
|
103
|
+
if (account.enabled === false) {
|
|
104
|
+
const result = buildDisabledResult(account, index);
|
|
105
|
+
cacheResult(key, result);
|
|
106
|
+
return result;
|
|
107
|
+
}
|
|
108
|
+
const current = now();
|
|
109
|
+
const entry = state.get(key);
|
|
110
|
+
if (!force && entry && entry.backoffUntil > current) {
|
|
111
|
+
return buildSkippedResult(account, index, entry.backoffUntil);
|
|
112
|
+
}
|
|
113
|
+
const inflight = entry?.inflight;
|
|
114
|
+
if (inflight) {
|
|
115
|
+
// Reuse the cached result of the in-flight fetch, but preserve this
|
|
116
|
+
// caller's requested index for attribution.
|
|
117
|
+
const cached = await inflight;
|
|
118
|
+
return { ...cached, index };
|
|
119
|
+
}
|
|
120
|
+
const controller = new AbortController();
|
|
121
|
+
const stored = state.get(key) ?? {
|
|
122
|
+
consecutiveFailures: 0,
|
|
123
|
+
backoffUntil: 0,
|
|
124
|
+
};
|
|
125
|
+
stored.controller = controller;
|
|
126
|
+
state.set(key, stored);
|
|
127
|
+
const promise = (async () => {
|
|
128
|
+
try {
|
|
129
|
+
const signal = AbortSignal.timeout(fetchTimeoutMs);
|
|
130
|
+
const composite = controller.signal.aborted
|
|
131
|
+
? controller.signal
|
|
132
|
+
: AbortSignal.any([controller.signal, signal]);
|
|
133
|
+
const result = await options.fetchAccountQuota(account, composite);
|
|
134
|
+
if (controller.signal.aborted) {
|
|
135
|
+
throw new Error('quota manager disposed mid-fetch');
|
|
136
|
+
}
|
|
137
|
+
const attributed = { ...result, index };
|
|
138
|
+
cacheResult(key, attributed);
|
|
139
|
+
// Adapter contract: `fetchAccountQuota` resolves with an
|
|
140
|
+
// attributed result. Failures should arrive as `{ status: 'error' }`
|
|
141
|
+
// rather than throwing — treat them like thrown failures so backoff
|
|
142
|
+
// actually protects the account from re-hammering. `disabled` and
|
|
143
|
+
// `ok` both count as success (no fetch happened, or it succeeded).
|
|
144
|
+
if (result.status === 'error') {
|
|
145
|
+
const { backoffMs } = recordFailure(key);
|
|
146
|
+
log.debug('quota-refresh-failed', {
|
|
147
|
+
key: hashKey(key),
|
|
148
|
+
backoffMs,
|
|
149
|
+
error: result.error ?? 'attributed error result',
|
|
150
|
+
});
|
|
151
|
+
return attributed;
|
|
152
|
+
}
|
|
153
|
+
recordSuccess(key);
|
|
154
|
+
return attributed;
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
158
|
+
if (disposed || controller.signal.aborted) {
|
|
159
|
+
const failureResult = {
|
|
160
|
+
index,
|
|
161
|
+
email: account.email,
|
|
162
|
+
status: 'error',
|
|
163
|
+
error: message,
|
|
164
|
+
};
|
|
165
|
+
cacheResult(key, failureResult);
|
|
166
|
+
return failureResult;
|
|
167
|
+
}
|
|
168
|
+
const { backoffMs } = recordFailure(key);
|
|
169
|
+
log.debug('quota-refresh-failed', {
|
|
170
|
+
key: hashKey(key),
|
|
171
|
+
backoffMs,
|
|
172
|
+
error: message,
|
|
173
|
+
});
|
|
174
|
+
const failureResult = {
|
|
175
|
+
index,
|
|
176
|
+
email: account.email,
|
|
177
|
+
status: 'error',
|
|
178
|
+
error: message,
|
|
179
|
+
};
|
|
180
|
+
cacheResult(key, failureResult);
|
|
181
|
+
return failureResult;
|
|
182
|
+
}
|
|
183
|
+
finally {
|
|
184
|
+
const finished = state.get(key);
|
|
185
|
+
if (finished) {
|
|
186
|
+
finished.inflight = undefined;
|
|
187
|
+
finished.controller = undefined;
|
|
188
|
+
state.set(key, finished);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
})();
|
|
192
|
+
stored.inflight = promise;
|
|
193
|
+
state.set(key, stored);
|
|
194
|
+
return promise;
|
|
195
|
+
};
|
|
196
|
+
const refreshAccounts = async (accounts, refreshOptions) => {
|
|
197
|
+
const results = [];
|
|
198
|
+
for (const account of accounts) {
|
|
199
|
+
const index = refreshOptions.indexFor(account);
|
|
200
|
+
const result = await refreshAccount(account, {
|
|
201
|
+
index,
|
|
202
|
+
force: refreshOptions.force,
|
|
203
|
+
});
|
|
204
|
+
results.push(result);
|
|
205
|
+
}
|
|
206
|
+
return results;
|
|
207
|
+
};
|
|
208
|
+
const getCached = (account) => {
|
|
209
|
+
const entry = state.get(keyOf(account));
|
|
210
|
+
return entry?.cached;
|
|
211
|
+
};
|
|
212
|
+
const getBackoffUntil = (account) => {
|
|
213
|
+
return state.get(keyOf(account))?.backoffUntil ?? 0;
|
|
214
|
+
};
|
|
215
|
+
const hashedLogLabel = (prefix, account) => {
|
|
216
|
+
const identity = typeof account === 'string' ? account : keyOf(account);
|
|
217
|
+
return `${prefix} ${hashKey(identity)}`;
|
|
218
|
+
};
|
|
219
|
+
const dispose = async () => {
|
|
220
|
+
if (disposed)
|
|
221
|
+
return;
|
|
222
|
+
disposed = true;
|
|
223
|
+
// Snapshot the in-flight refreshes before aborting — the refresh
|
|
224
|
+
// `finally` clears `entry.inflight` as each promise settles, so we
|
|
225
|
+
// must capture the promises first.
|
|
226
|
+
const pending = Array.from(state.values(), (entry) => entry.inflight).filter((promise) => promise != null);
|
|
227
|
+
// Abort so a genuinely-stuck fetch unwinds promptly (the refresh
|
|
228
|
+
// catches the abort and resolves with an error result rather than
|
|
229
|
+
// hanging dispose), then AWAIT the settled promises. Awaiting after
|
|
230
|
+
// the abort still fences the producer: the opencode quota wrapper's
|
|
231
|
+
// fire-and-forget sidebar write runs in the continuation after the
|
|
232
|
+
// core refresh resolves, so by the time dispose() resolves that
|
|
233
|
+
// write has already been enqueued onto the sidebar chain and the
|
|
234
|
+
// subsequent lifecycle drain will flush it.
|
|
235
|
+
for (const [, entry] of state) {
|
|
236
|
+
entry.controller?.abort();
|
|
237
|
+
}
|
|
238
|
+
if (pending.length > 0) {
|
|
239
|
+
// Each refresh swallows its own errors and resolves; awaiting is a
|
|
240
|
+
// fence, never a rejection surface.
|
|
241
|
+
await Promise.allSettled(pending);
|
|
242
|
+
}
|
|
243
|
+
for (const [, entry] of state) {
|
|
244
|
+
entry.inflight = undefined;
|
|
245
|
+
}
|
|
246
|
+
};
|
|
247
|
+
return {
|
|
248
|
+
refreshAccount,
|
|
249
|
+
refreshAccounts,
|
|
250
|
+
getCached,
|
|
251
|
+
getBackoffUntil,
|
|
252
|
+
hashedLogLabel,
|
|
253
|
+
dispose,
|
|
254
|
+
classifyQuotaGroup,
|
|
255
|
+
aggregateQuota,
|
|
256
|
+
aggregateGeminiCliQuota,
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
function hashKey(key) {
|
|
260
|
+
return createHash('sha256').update(key).digest('hex').slice(0, 8);
|
|
261
|
+
}
|
|
262
|
+
// ============================================================================
|
|
263
|
+
// Pure helpers — also exported for adapter use.
|
|
264
|
+
// ============================================================================
|
|
265
|
+
/**
|
|
266
|
+
* Classify a model into its quota group.
|
|
267
|
+
*/
|
|
268
|
+
export function classifyQuotaGroup(modelName, displayName) {
|
|
269
|
+
const registryGroup = getQuotaGroupForModel(modelName);
|
|
270
|
+
if (registryGroup) {
|
|
271
|
+
return registryGroup;
|
|
272
|
+
}
|
|
273
|
+
const combined = `${modelName} ${displayName ?? ''}`.toLowerCase();
|
|
274
|
+
if (combined.includes('claude')) {
|
|
275
|
+
return 'claude';
|
|
276
|
+
}
|
|
277
|
+
const isGemini3 = combined.includes('gemini-3') || combined.includes('gemini 3');
|
|
278
|
+
if (!isGemini3) {
|
|
279
|
+
return null;
|
|
280
|
+
}
|
|
281
|
+
const family = getModelFamily(modelName);
|
|
282
|
+
return family === 'gemini-flash' ? 'gemini-flash' : 'gemini-pro';
|
|
283
|
+
}
|
|
284
|
+
function normalizeRemainingFraction(value) {
|
|
285
|
+
if (typeof value !== 'number' || !Number.isFinite(value)) {
|
|
286
|
+
return 0;
|
|
287
|
+
}
|
|
288
|
+
if (value < 0)
|
|
289
|
+
return 0;
|
|
290
|
+
if (value > 1)
|
|
291
|
+
return 1;
|
|
292
|
+
return value;
|
|
293
|
+
}
|
|
294
|
+
function parseResetTime(resetTime) {
|
|
295
|
+
if (!resetTime)
|
|
296
|
+
return null;
|
|
297
|
+
const timestamp = Date.parse(resetTime);
|
|
298
|
+
if (!Number.isFinite(timestamp)) {
|
|
299
|
+
return null;
|
|
300
|
+
}
|
|
301
|
+
return timestamp;
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Aggregate per-model quota entries into group summaries + per-model list.
|
|
305
|
+
*
|
|
306
|
+
* Pure helper — exposed for harness adapters that want to reuse the same
|
|
307
|
+
* aggregation logic without re-implementing it.
|
|
308
|
+
*/
|
|
309
|
+
export function aggregateQuota(models) {
|
|
310
|
+
const groups = {};
|
|
311
|
+
const perModel = [];
|
|
312
|
+
if (!models) {
|
|
313
|
+
return { groups, perModel, modelCount: 0 };
|
|
314
|
+
}
|
|
315
|
+
let totalCount = 0;
|
|
316
|
+
for (const [modelName, entry] of Object.entries(models)) {
|
|
317
|
+
const group = classifyQuotaGroup(modelName, entry.displayName ?? entry.modelName);
|
|
318
|
+
const quotaInfo = entry.quotaInfo;
|
|
319
|
+
const remainingFraction = quotaInfo
|
|
320
|
+
? normalizeRemainingFraction(quotaInfo.remainingFraction)
|
|
321
|
+
: undefined;
|
|
322
|
+
const resetTime = quotaInfo?.resetTime;
|
|
323
|
+
const resetTimestamp = parseResetTime(resetTime);
|
|
324
|
+
totalCount += 1;
|
|
325
|
+
perModel.push({
|
|
326
|
+
modelId: modelName,
|
|
327
|
+
displayName: entry.displayName ?? entry.modelName,
|
|
328
|
+
group,
|
|
329
|
+
remainingFraction: remainingFraction ?? 0,
|
|
330
|
+
resetTime,
|
|
331
|
+
});
|
|
332
|
+
if (!group) {
|
|
333
|
+
continue;
|
|
334
|
+
}
|
|
335
|
+
const existing = groups[group];
|
|
336
|
+
const nextCount = (existing?.modelCount ?? 0) + 1;
|
|
337
|
+
const nextRemaining = remainingFraction === undefined
|
|
338
|
+
? existing?.remainingFraction
|
|
339
|
+
: existing?.remainingFraction === undefined
|
|
340
|
+
? remainingFraction
|
|
341
|
+
: Math.min(existing.remainingFraction, remainingFraction);
|
|
342
|
+
let nextResetTime = existing?.resetTime;
|
|
343
|
+
if (resetTimestamp !== null) {
|
|
344
|
+
if (!existing?.resetTime) {
|
|
345
|
+
nextResetTime = resetTime;
|
|
346
|
+
}
|
|
347
|
+
else {
|
|
348
|
+
const existingTimestamp = parseResetTime(existing.resetTime);
|
|
349
|
+
if (existingTimestamp === null || resetTimestamp < existingTimestamp) {
|
|
350
|
+
nextResetTime = resetTime;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
groups[group] = {
|
|
355
|
+
remainingFraction: nextRemaining,
|
|
356
|
+
resetTime: nextResetTime,
|
|
357
|
+
modelCount: nextCount,
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
perModel.sort((a, b) => a.modelId.localeCompare(b.modelId));
|
|
361
|
+
return { groups, perModel, modelCount: totalCount };
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Aggregate Gemini CLI quota buckets into a summary.
|
|
365
|
+
*/
|
|
366
|
+
export function aggregateGeminiCliQuota(response) {
|
|
367
|
+
const models = [];
|
|
368
|
+
if (!response.buckets || response.buckets.length === 0) {
|
|
369
|
+
return { models };
|
|
370
|
+
}
|
|
371
|
+
for (const bucket of response.buckets) {
|
|
372
|
+
if (!bucket.modelId) {
|
|
373
|
+
continue;
|
|
374
|
+
}
|
|
375
|
+
const modelId = bucket.modelId;
|
|
376
|
+
const isRelevantModel = modelId.startsWith('gemini-3-') ||
|
|
377
|
+
modelId.startsWith('gemini-3.') ||
|
|
378
|
+
modelId.startsWith('gemini-2.5-');
|
|
379
|
+
if (!isRelevantModel) {
|
|
380
|
+
continue;
|
|
381
|
+
}
|
|
382
|
+
models.push({
|
|
383
|
+
modelId: bucket.modelId,
|
|
384
|
+
remainingFraction: normalizeRemainingFraction(bucket.remainingFraction),
|
|
385
|
+
resetTime: bucket.resetTime,
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
models.sort((a, b) => a.modelId.localeCompare(b.modelId));
|
|
389
|
+
return { models };
|
|
390
|
+
}
|
|
391
|
+
export async function fetchAvailableModels(options) {
|
|
392
|
+
const timeoutMs = options.timeoutMs ?? QUOTA_MANAGER_DEFAULT_TIMEOUT_MS;
|
|
393
|
+
const userAgent = options.userAgent ?? buildAntigravityHarnessUserAgent();
|
|
394
|
+
const errors = [];
|
|
395
|
+
const transport = options.fetchVia ?? defaultTransport;
|
|
396
|
+
for (const endpoint of options.endpoints) {
|
|
397
|
+
const body = options.projectId ? { project: options.projectId } : {};
|
|
398
|
+
try {
|
|
399
|
+
const response = await transport(`${endpoint}/v1internal:fetchAvailableModels`, {
|
|
400
|
+
method: 'POST',
|
|
401
|
+
headers: {
|
|
402
|
+
'User-Agent': userAgent,
|
|
403
|
+
Authorization: `Bearer ${options.accessToken}`,
|
|
404
|
+
'Content-Type': 'application/json',
|
|
405
|
+
'Accept-Encoding': 'gzip',
|
|
406
|
+
},
|
|
407
|
+
body: JSON.stringify(body),
|
|
408
|
+
}, { timeoutMs });
|
|
409
|
+
if (response.ok) {
|
|
410
|
+
return (await response.json());
|
|
411
|
+
}
|
|
412
|
+
const status = response.status;
|
|
413
|
+
if (status === 403 && options.projectId) {
|
|
414
|
+
try {
|
|
415
|
+
const retryResponse = await transport(`${endpoint}/v1internal:fetchAvailableModels`, {
|
|
416
|
+
method: 'POST',
|
|
417
|
+
headers: {
|
|
418
|
+
'User-Agent': userAgent,
|
|
419
|
+
Authorization: `Bearer ${options.accessToken}`,
|
|
420
|
+
'Content-Type': 'application/json',
|
|
421
|
+
'Accept-Encoding': 'gzip',
|
|
422
|
+
},
|
|
423
|
+
body: JSON.stringify({}),
|
|
424
|
+
}, { timeoutMs });
|
|
425
|
+
if (retryResponse.ok) {
|
|
426
|
+
return (await retryResponse.json());
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
catch {
|
|
430
|
+
// Fall through to next endpoint
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
if (status === 429 || status >= 500) {
|
|
434
|
+
const message = await response.text().catch(() => '');
|
|
435
|
+
const snippet = message.trim().slice(0, 200);
|
|
436
|
+
errors.push(`fetchAvailableModels ${status} at ${endpoint}${snippet ? `: ${snippet}` : ''}`);
|
|
437
|
+
continue;
|
|
438
|
+
}
|
|
439
|
+
const message = await response.text().catch(() => '');
|
|
440
|
+
const snippet = message.trim().slice(0, 200);
|
|
441
|
+
errors.push(`fetchAvailableModels ${status} at ${endpoint}${snippet ? `: ${snippet}` : ''}`);
|
|
442
|
+
break;
|
|
443
|
+
}
|
|
444
|
+
catch (error) {
|
|
445
|
+
errors.push(`fetchAvailableModels network error at ${endpoint}: ${error instanceof Error ? error.message : String(error)}`);
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
throw new Error(errors.join('; ') || 'fetchAvailableModels failed');
|
|
449
|
+
}
|
|
450
|
+
export async function fetchGeminiCliQuota(options) {
|
|
451
|
+
const timeoutMs = options.timeoutMs ?? QUOTA_MANAGER_DEFAULT_TIMEOUT_MS;
|
|
452
|
+
const userAgent = options.userAgent ?? buildAntigravityHarnessUserAgent();
|
|
453
|
+
for (const endpoint of options.endpoints) {
|
|
454
|
+
const body = options.projectId ? { project: options.projectId } : {};
|
|
455
|
+
try {
|
|
456
|
+
const response = await defaultTransport(`${endpoint}/v1internal:retrieveUserQuota`, {
|
|
457
|
+
method: 'POST',
|
|
458
|
+
headers: {
|
|
459
|
+
Authorization: `Bearer ${options.accessToken}`,
|
|
460
|
+
'Content-Type': 'application/json',
|
|
461
|
+
'User-Agent': userAgent,
|
|
462
|
+
},
|
|
463
|
+
body: JSON.stringify(body),
|
|
464
|
+
}, { timeoutMs });
|
|
465
|
+
if (response.ok) {
|
|
466
|
+
return (await response.json());
|
|
467
|
+
}
|
|
468
|
+
const status = response.status;
|
|
469
|
+
if (status === 429 || status >= 500) {
|
|
470
|
+
continue;
|
|
471
|
+
}
|
|
472
|
+
return { buckets: [] };
|
|
473
|
+
}
|
|
474
|
+
catch { }
|
|
475
|
+
}
|
|
476
|
+
return { buckets: [] };
|
|
477
|
+
}
|
|
478
|
+
async function defaultTransport(url, init, options) {
|
|
479
|
+
return fetchWithActiveTimeout(url, init, { timeoutMs: options.timeoutMs });
|
|
480
|
+
}
|
|
481
|
+
//# sourceMappingURL=quota-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quota-manager.js","sourceRoot":"","sources":["../src/quota-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Harness-agnostic quota types.
|
|
3
|
+
*
|
|
4
|
+
* Quota group / per-model / CLI summary shapes shared between the core
|
|
5
|
+
* quota helpers and any harness that wants to display quota status. Kept
|
|
6
|
+
* separate from `account-types.ts` so quota evolution does not force a
|
|
7
|
+
* migration on the persisted account pool.
|
|
8
|
+
*/
|
|
9
|
+
import type { AccountMetadataV3 } from './account-types.ts';
|
|
10
|
+
export type QuotaGroup = 'claude' | 'gemini-pro' | 'gemini-flash' | 'gpt-oss';
|
|
11
|
+
export interface QuotaGroupSummary {
|
|
12
|
+
remainingFraction?: number;
|
|
13
|
+
resetTime?: string;
|
|
14
|
+
modelCount: number;
|
|
15
|
+
}
|
|
16
|
+
export interface PerModelQuotaEntry {
|
|
17
|
+
modelId: string;
|
|
18
|
+
displayName?: string;
|
|
19
|
+
group: QuotaGroup | null;
|
|
20
|
+
remainingFraction: number;
|
|
21
|
+
resetTime?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface QuotaSummary {
|
|
24
|
+
groups: Partial<Record<QuotaGroup, QuotaGroupSummary>>;
|
|
25
|
+
perModel?: PerModelQuotaEntry[];
|
|
26
|
+
modelCount: number;
|
|
27
|
+
error?: string;
|
|
28
|
+
}
|
|
29
|
+
export interface GeminiCliQuotaModel {
|
|
30
|
+
modelId: string;
|
|
31
|
+
remainingFraction: number;
|
|
32
|
+
resetTime?: string;
|
|
33
|
+
}
|
|
34
|
+
export interface GeminiCliQuotaSummary {
|
|
35
|
+
models: GeminiCliQuotaModel[];
|
|
36
|
+
error?: string;
|
|
37
|
+
}
|
|
38
|
+
export type AccountQuotaStatus = 'ok' | 'disabled' | 'error';
|
|
39
|
+
export interface AccountQuotaResult {
|
|
40
|
+
index: number;
|
|
41
|
+
email?: string;
|
|
42
|
+
status: AccountQuotaStatus;
|
|
43
|
+
error?: string;
|
|
44
|
+
disabled?: boolean;
|
|
45
|
+
quota?: QuotaSummary;
|
|
46
|
+
geminiCliQuota?: GeminiCliQuotaSummary;
|
|
47
|
+
updatedAccount?: AccountMetadataV3;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=quota-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quota-types.d.ts","sourceRoot":"","sources":["../src/quota-types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAE3D,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,YAAY,GAAG,cAAc,GAAG,SAAS,CAAA;AAE7E,MAAM,WAAW,iBAAiB;IAChC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,UAAU,GAAG,IAAI,CAAA;IACxB,iBAAiB,EAAE,MAAM,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC,CAAA;IACtD,QAAQ,CAAC,EAAE,kBAAkB,EAAE,CAAA;IAC/B,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAA;IACf,iBAAiB,EAAE,MAAM,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,mBAAmB,EAAE,CAAA;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,MAAM,kBAAkB,GAAG,IAAI,GAAG,UAAU,GAAG,OAAO,CAAA;AAE5D,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,kBAAkB,CAAA;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,KAAK,CAAC,EAAE,YAAY,CAAA;IACpB,cAAc,CAAC,EAAE,qBAAqB,CAAA;IACtC,cAAc,CAAC,EAAE,iBAAiB,CAAA;CACnC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Harness-agnostic quota types.
|
|
3
|
+
*
|
|
4
|
+
* Quota group / per-model / CLI summary shapes shared between the core
|
|
5
|
+
* quota helpers and any harness that wants to display quota status. Kept
|
|
6
|
+
* separate from `account-types.ts` so quota evolution does not force a
|
|
7
|
+
* migration on the persisted account pool.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=quota-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quota-types.js","sourceRoot":"","sources":["../src/quota-types.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|