@cortexkit/antigravity-auth-core 1.1.0 → 2.0.1
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 +325 -0
- package/dist/account-manager.d.ts.map +1 -0
- package/dist/account-manager.js +1480 -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 +155 -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 +12 -5
- package/dist/agy-request-metadata.d.ts.map +1 -1
- package/dist/agy-request-metadata.js +64 -38
- package/dist/agy-request-metadata.js.map +1 -1
- package/dist/agy-transport.d.ts +2 -2
- package/dist/agy-transport.d.ts.map +1 -1
- package/dist/agy-transport.js +87 -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 +12 -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 +51 -39
- 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 +9 -3
- package/dist/fingerprint.d.ts.map +1 -1
- package/dist/fingerprint.js +28 -20
- package/dist/fingerprint.js.map +1 -1
- package/dist/index.d.ts +23 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -9
- 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 +5 -5
- package/dist/model-registry.d.ts.map +1 -1
- package/dist/model-registry.js +119 -107
- package/dist/model-registry.js.map +1 -1
- package/dist/project.d.ts +4 -1
- package/dist/project.d.ts.map +1 -1
- package/dist/project.js +84 -31
- package/dist/project.js.map +1 -1
- package/dist/quota-manager.d.ts +203 -0
- package/dist/quota-manager.d.ts.map +1 -0
- package/dist/quota-manager.js +718 -0
- package/dist/quota-manager.js.map +1 -0
- package/dist/quota-types.d.ts +68 -0
- package/dist/quota-types.d.ts.map +1 -0
- package/dist/quota-types.js +50 -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 +1 -1
- package/dist/transform/gemini.d.ts.map +1 -1
- package/dist/transform/gemini.js +111 -85
- 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 +97 -75
- 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
package/dist/project.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AA6B7E,UAAU,mBAAmB;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,kCAAkC,CAAC,EAAE,OAAO,CAAA;CAC7C;AAED,UAAU,qBAAqB;IAC7B,uBAAuB,CAAC,EAAE,MAAM,GAAG;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAClD,WAAW,CAAC,EAAE;QACZ,EAAE,CAAC,EAAE,MAAM,CAAA;KACZ,CAAA;IACD,QAAQ,CAAC,EACL,MAAM,GACN;QACE,EAAE,CAAC,EAAE,MAAM,CAAA;KACZ,CAAA;IACL,YAAY,CAAC,EAAE,mBAAmB,EAAE,CAAA;CACrC;AAoFD;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAYpE;AAED,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAoCvC;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,EAClB,QAAQ,SAAK,EACb,OAAO,SAAO,GACb,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAoD7B;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,oBAAoB,CAAC,CAqJ/B"}
|
package/dist/project.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { ANTIGRAVITY_ENDPOINT_FALLBACKS, ANTIGRAVITY_LOAD_ENDPOINTS, ANTIGRAVITY_ENDPOINT_PROD, ANTIGRAVITY_DEFAULT_PROJECT_ID, } from "./constants.js";
|
|
2
1
|
import { fetchWithAgyCliTransport } from "./agy-transport.js";
|
|
3
2
|
import { formatRefreshParts, parseRefreshParts } from "./auth.js";
|
|
3
|
+
import { ANTIGRAVITY_DEFAULT_PROJECT_ID, ANTIGRAVITY_ENDPOINT_FALLBACKS, ANTIGRAVITY_ENDPOINT_PROD, ANTIGRAVITY_LOAD_ENDPOINTS, } from "./constants.js";
|
|
4
4
|
import { buildAntigravityHarnessBootstrapHeaders, buildAntigravityLoadCodeAssistMetadata, } from "./fingerprint.js";
|
|
5
5
|
import { createLogger } from "./logger.js";
|
|
6
|
-
const log = createLogger(
|
|
6
|
+
const log = createLogger('project');
|
|
7
7
|
/** TTL for project context cache entries (30 minutes). */
|
|
8
8
|
const PROJECT_CONTEXT_CACHE_TTL_MS = 30 * 60 * 1000;
|
|
9
9
|
const projectContextResultCache = new Map();
|
|
@@ -33,7 +33,7 @@ function getDefaultTierId(allowedTiers) {
|
|
|
33
33
|
* Promise-based delay utility.
|
|
34
34
|
*/
|
|
35
35
|
function wait(ms) {
|
|
36
|
-
return new Promise(
|
|
36
|
+
return new Promise((resolve) => {
|
|
37
37
|
setTimeout(resolve, ms);
|
|
38
38
|
});
|
|
39
39
|
}
|
|
@@ -44,20 +44,28 @@ function extractManagedProjectId(payload) {
|
|
|
44
44
|
if (!payload) {
|
|
45
45
|
return undefined;
|
|
46
46
|
}
|
|
47
|
-
if (typeof payload.cloudaicompanionProject ===
|
|
47
|
+
if (typeof payload.cloudaicompanionProject === 'string') {
|
|
48
48
|
return payload.cloudaicompanionProject;
|
|
49
49
|
}
|
|
50
|
-
if (payload.cloudaicompanionProject &&
|
|
50
|
+
if (payload.cloudaicompanionProject &&
|
|
51
|
+
typeof payload.cloudaicompanionProject.id === 'string') {
|
|
51
52
|
return payload.cloudaicompanionProject.id;
|
|
52
53
|
}
|
|
53
54
|
return undefined;
|
|
54
55
|
}
|
|
55
56
|
/**
|
|
56
|
-
* Generates a cache key
|
|
57
|
+
* Generates a stable cache key from the OAuth refresh token itself. Packed
|
|
58
|
+
* project fields may change after discovery, but they still identify the same
|
|
59
|
+
* credential and must hit the same project-context cache entry.
|
|
57
60
|
*/
|
|
61
|
+
function getCacheKeyFromRefresh(refresh) {
|
|
62
|
+
const packedRefresh = refresh?.trim();
|
|
63
|
+
if (!packedRefresh)
|
|
64
|
+
return undefined;
|
|
65
|
+
return parseRefreshParts(packedRefresh).refreshToken.trim() || packedRefresh;
|
|
66
|
+
}
|
|
58
67
|
function getCacheKey(auth) {
|
|
59
|
-
|
|
60
|
-
return refresh ? refresh : undefined;
|
|
68
|
+
return getCacheKeyFromRefresh(auth.refresh);
|
|
61
69
|
}
|
|
62
70
|
/**
|
|
63
71
|
* Clears cached project context results and pending promises, globally or for a refresh key.
|
|
@@ -69,9 +77,12 @@ export function invalidateProjectContextCache(refresh) {
|
|
|
69
77
|
provisionFailedKeys.clear();
|
|
70
78
|
return;
|
|
71
79
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
80
|
+
const cacheKey = getCacheKeyFromRefresh(refresh);
|
|
81
|
+
if (!cacheKey)
|
|
82
|
+
return;
|
|
83
|
+
projectContextPendingCache.delete(cacheKey);
|
|
84
|
+
projectContextResultCache.delete(cacheKey);
|
|
85
|
+
provisionFailedKeys.delete(cacheKey);
|
|
75
86
|
}
|
|
76
87
|
export function clearProvisionFailedKeys() {
|
|
77
88
|
provisionFailedKeys.clear();
|
|
@@ -82,11 +93,14 @@ export function clearProvisionFailedKeys() {
|
|
|
82
93
|
export async function loadManagedProject(accessToken, _projectId) {
|
|
83
94
|
const requestBody = buildBootstrapRequestBody();
|
|
84
95
|
const loadHeaders = buildAntigravityHarnessBootstrapHeaders(accessToken);
|
|
85
|
-
const loadEndpoints = Array.from(new Set([
|
|
96
|
+
const loadEndpoints = Array.from(new Set([
|
|
97
|
+
...ANTIGRAVITY_LOAD_ENDPOINTS,
|
|
98
|
+
...ANTIGRAVITY_ENDPOINT_FALLBACKS,
|
|
99
|
+
]));
|
|
86
100
|
for (const baseEndpoint of loadEndpoints) {
|
|
87
101
|
try {
|
|
88
102
|
const response = await fetchWithAgyCliTransport(`${baseEndpoint}/v1internal:loadCodeAssist`, {
|
|
89
|
-
method:
|
|
103
|
+
method: 'POST',
|
|
90
104
|
headers: loadHeaders,
|
|
91
105
|
body: JSON.stringify(requestBody),
|
|
92
106
|
});
|
|
@@ -96,8 +110,10 @@ export async function loadManagedProject(accessToken, _projectId) {
|
|
|
96
110
|
return (await response.json());
|
|
97
111
|
}
|
|
98
112
|
catch (error) {
|
|
99
|
-
log.debug(
|
|
100
|
-
|
|
113
|
+
log.debug('Failed to load managed project', {
|
|
114
|
+
endpoint: baseEndpoint,
|
|
115
|
+
error: String(error),
|
|
116
|
+
});
|
|
101
117
|
}
|
|
102
118
|
}
|
|
103
119
|
return null;
|
|
@@ -107,17 +123,21 @@ export async function loadManagedProject(accessToken, _projectId) {
|
|
|
107
123
|
*/
|
|
108
124
|
export async function onboardManagedProject(accessToken, tierId, projectId, attempts = 10, delayMs = 5000) {
|
|
109
125
|
const requestBody = { tierId };
|
|
110
|
-
const onboardEndpoints = Array.from(new Set([
|
|
126
|
+
const onboardEndpoints = Array.from(new Set([
|
|
127
|
+
ANTIGRAVITY_ENDPOINT_PROD,
|
|
128
|
+
...ANTIGRAVITY_LOAD_ENDPOINTS,
|
|
129
|
+
...ANTIGRAVITY_ENDPOINT_FALLBACKS,
|
|
130
|
+
]));
|
|
111
131
|
for (const baseEndpoint of onboardEndpoints) {
|
|
112
132
|
for (let attempt = 0; attempt < attempts; attempt += 1) {
|
|
113
133
|
try {
|
|
114
134
|
const response = await fetchWithAgyCliTransport(`${baseEndpoint}/v1internal:onboardUser`, {
|
|
115
|
-
method:
|
|
135
|
+
method: 'POST',
|
|
116
136
|
headers: buildAntigravityHarnessBootstrapHeaders(accessToken),
|
|
117
137
|
body: JSON.stringify(requestBody),
|
|
118
138
|
});
|
|
119
139
|
if (!response.ok) {
|
|
120
|
-
log.debug(
|
|
140
|
+
log.debug('Onboard request failed', {
|
|
121
141
|
endpoint: baseEndpoint,
|
|
122
142
|
status: response.status,
|
|
123
143
|
statusText: response.statusText,
|
|
@@ -134,7 +154,10 @@ export async function onboardManagedProject(accessToken, tierId, projectId, atte
|
|
|
134
154
|
}
|
|
135
155
|
}
|
|
136
156
|
catch (error) {
|
|
137
|
-
log.debug(
|
|
157
|
+
log.debug('Failed to onboard managed project', {
|
|
158
|
+
endpoint: baseEndpoint,
|
|
159
|
+
error: String(error),
|
|
160
|
+
});
|
|
138
161
|
break;
|
|
139
162
|
}
|
|
140
163
|
await wait(delayMs);
|
|
@@ -148,12 +171,12 @@ export async function onboardManagedProject(accessToken, tierId, projectId, atte
|
|
|
148
171
|
export async function ensureProjectContext(auth) {
|
|
149
172
|
const accessToken = auth.access;
|
|
150
173
|
if (!accessToken) {
|
|
151
|
-
return { auth, effectiveProjectId:
|
|
174
|
+
return { auth, effectiveProjectId: '' };
|
|
152
175
|
}
|
|
153
176
|
const cacheKey = getCacheKey(auth);
|
|
154
177
|
if (cacheKey) {
|
|
155
178
|
const cached = projectContextResultCache.get(cacheKey);
|
|
156
|
-
if (cached &&
|
|
179
|
+
if (cached && Date.now() - cached.cachedAt < PROJECT_CONTEXT_CACHE_TTL_MS) {
|
|
157
180
|
return cached.result;
|
|
158
181
|
}
|
|
159
182
|
if (cached) {
|
|
@@ -175,7 +198,7 @@ export async function ensureProjectContext(auth) {
|
|
|
175
198
|
const effectiveProjectId = parts.projectId || fallbackProjectId;
|
|
176
199
|
return { auth, effectiveProjectId };
|
|
177
200
|
}
|
|
178
|
-
const persistManagedProject = async (managedProjectId) => {
|
|
201
|
+
const persistManagedProject = async (managedProjectId, capturedTier) => {
|
|
179
202
|
const updatedAuth = {
|
|
180
203
|
...auth,
|
|
181
204
|
refresh: formatRefreshParts({
|
|
@@ -184,34 +207,64 @@ export async function ensureProjectContext(auth) {
|
|
|
184
207
|
managedProjectId,
|
|
185
208
|
}),
|
|
186
209
|
};
|
|
187
|
-
return {
|
|
210
|
+
return {
|
|
211
|
+
auth: updatedAuth,
|
|
212
|
+
effectiveProjectId: managedProjectId,
|
|
213
|
+
capturedTier,
|
|
214
|
+
};
|
|
188
215
|
};
|
|
189
216
|
// Try to resolve a managed project from Antigravity if possible.
|
|
190
217
|
const loadPayload = await loadManagedProject(accessToken, parts.projectId ?? fallbackProjectId);
|
|
218
|
+
// Capture tier from the loadCodeAssist payload. The raw id is stored
|
|
219
|
+
// as-is; absent payload or missing tier leaves capturedTier undefined.
|
|
220
|
+
const capturedTierId = loadPayload?.currentTier?.id;
|
|
221
|
+
const paidTierId = typeof loadPayload?.paidTier === 'string'
|
|
222
|
+
? loadPayload.paidTier
|
|
223
|
+
: loadPayload?.paidTier?.id;
|
|
224
|
+
const tierFromPayload = capturedTierId
|
|
225
|
+
? {
|
|
226
|
+
id: capturedTierId,
|
|
227
|
+
...(paidTierId ? { paidId: paidTierId } : {}),
|
|
228
|
+
capturedAt: Date.now(),
|
|
229
|
+
}
|
|
230
|
+
: undefined;
|
|
191
231
|
const resolvedManagedProjectId = extractManagedProjectId(loadPayload);
|
|
192
232
|
if (resolvedManagedProjectId) {
|
|
193
|
-
return persistManagedProject(resolvedManagedProjectId);
|
|
233
|
+
return persistManagedProject(resolvedManagedProjectId, tierFromPayload);
|
|
194
234
|
}
|
|
195
235
|
// No managed project found - try to auto-provision one via onboarding.
|
|
196
236
|
// This handles accounts that were added before managed project provisioning was required.
|
|
197
|
-
const tierId = getDefaultTierId(loadPayload?.allowedTiers) ??
|
|
198
|
-
log.debug(
|
|
237
|
+
const tierId = getDefaultTierId(loadPayload?.allowedTiers) ?? 'free-tier';
|
|
238
|
+
log.debug('Auto-provisioning managed project', {
|
|
239
|
+
tierId,
|
|
240
|
+
projectId: parts.projectId,
|
|
241
|
+
});
|
|
199
242
|
const provisionedProjectId = await onboardManagedProject(accessToken, tierId, parts.projectId);
|
|
200
243
|
if (provisionedProjectId) {
|
|
201
|
-
log.debug(
|
|
202
|
-
|
|
244
|
+
log.debug('Successfully provisioned managed project', {
|
|
245
|
+
provisionedProjectId,
|
|
246
|
+
});
|
|
247
|
+
return persistManagedProject(provisionedProjectId, tierFromPayload);
|
|
203
248
|
}
|
|
204
|
-
log.warn(
|
|
249
|
+
log.warn('Failed to provision managed project - account may not work correctly', {
|
|
205
250
|
hasProjectId: !!parts.projectId,
|
|
206
251
|
});
|
|
207
252
|
if (cacheKey) {
|
|
208
253
|
provisionFailedKeys.add(cacheKey);
|
|
209
254
|
}
|
|
210
255
|
if (parts.projectId) {
|
|
211
|
-
return {
|
|
256
|
+
return {
|
|
257
|
+
auth,
|
|
258
|
+
effectiveProjectId: parts.projectId,
|
|
259
|
+
capturedTier: tierFromPayload,
|
|
260
|
+
};
|
|
212
261
|
}
|
|
213
262
|
// No project id present in auth; fall back to the hardcoded id for requests.
|
|
214
|
-
return {
|
|
263
|
+
return {
|
|
264
|
+
auth,
|
|
265
|
+
effectiveProjectId: fallbackProjectId,
|
|
266
|
+
capturedTier: tierFromPayload,
|
|
267
|
+
};
|
|
215
268
|
};
|
|
216
269
|
if (!cacheKey) {
|
|
217
270
|
return resolveContext();
|
package/dist/project.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,203 @@
|
|
|
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 type { AccountMetadataV3 } from './account-types.ts';
|
|
16
|
+
import type { AccountQuotaResult, GeminiCliQuotaSummary, QuotaGroup, QuotaSummary } from './quota-types.ts';
|
|
17
|
+
export declare const QUOTA_MANAGER_DEFAULT_BASE_BACKOFF_MS = 30000;
|
|
18
|
+
export declare const QUOTA_MANAGER_DEFAULT_MAX_BACKOFF_MS: number;
|
|
19
|
+
export declare const QUOTA_MANAGER_DEFAULT_TIMEOUT_MS = 10000;
|
|
20
|
+
/**
|
|
21
|
+
* Signature for the harness-supplied quota fetch callback.
|
|
22
|
+
*
|
|
23
|
+
* `index`/`email`/`updatedAccount` come from the harness — the manager
|
|
24
|
+
* preserves the harness's attribution and only injects status/error info
|
|
25
|
+
* for disabled accounts and failed fetches.
|
|
26
|
+
*/
|
|
27
|
+
export type FetchAccountQuota = (account: AccountMetadataV3, signal: AbortSignal) => Promise<AccountQuotaResult>;
|
|
28
|
+
export interface QuotaManagerOptions {
|
|
29
|
+
fetchAccountQuota: FetchAccountQuota;
|
|
30
|
+
/**
|
|
31
|
+
* Stable identity for an account. Used as cache key + backoff key. Should
|
|
32
|
+
* NOT be the array index — reorders and removals would otherwise corrupt
|
|
33
|
+
* cached state. The harness can hash the refresh token or compose email +
|
|
34
|
+
* a refresh-token fallback.
|
|
35
|
+
*/
|
|
36
|
+
keyOf: (account: AccountMetadataV3) => string;
|
|
37
|
+
now?: () => number;
|
|
38
|
+
baseBackoffMs?: number;
|
|
39
|
+
maxBackoffMs?: number;
|
|
40
|
+
/** Per-fetch active timeout for the harness callback. */
|
|
41
|
+
fetchTimeoutMs?: number;
|
|
42
|
+
}
|
|
43
|
+
export interface RefreshAccountOptions {
|
|
44
|
+
/** Position of the account in the harness-visible array. Preserved on result. */
|
|
45
|
+
index: number;
|
|
46
|
+
/** Bypass backoff (used by manual quota dialogs). */
|
|
47
|
+
force?: boolean;
|
|
48
|
+
}
|
|
49
|
+
export interface RefreshAccountsOptions {
|
|
50
|
+
indexFor: (account: AccountMetadataV3) => number;
|
|
51
|
+
force?: boolean;
|
|
52
|
+
}
|
|
53
|
+
export interface QuotaManager {
|
|
54
|
+
refreshAccount(account: AccountMetadataV3, options: RefreshAccountOptions): Promise<AccountQuotaResult>;
|
|
55
|
+
refreshAccounts(accounts: AccountMetadataV3[], options: RefreshAccountsOptions): Promise<AccountQuotaResult[]>;
|
|
56
|
+
getCached(account: AccountMetadataV3): AccountQuotaResult | undefined;
|
|
57
|
+
getBackoffUntil(account: AccountMetadataV3): number;
|
|
58
|
+
/** Stable hash for an account, used for log labels. */
|
|
59
|
+
hashedLogLabel(prefix: string, account: AccountMetadataV3 | string): string;
|
|
60
|
+
/**
|
|
61
|
+
* Await any in-flight refresh, then cancel and reject subsequent
|
|
62
|
+
* refreshes. Returns a promise so a lifecycle producer can fence its
|
|
63
|
+
* fire-and-forget sidebar writes: awaiting `dispose()` guarantees no
|
|
64
|
+
* refresh is still mid-flight (and therefore cannot enqueue a write)
|
|
65
|
+
* once it resolves.
|
|
66
|
+
*/
|
|
67
|
+
dispose(): Promise<void>;
|
|
68
|
+
/** Pure helpers exposed for tests and adapter wiring. */
|
|
69
|
+
classifyQuotaGroup: typeof classifyQuotaGroup;
|
|
70
|
+
aggregateQuota: typeof aggregateQuota;
|
|
71
|
+
aggregateGeminiCliQuota: typeof aggregateGeminiCliQuota;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Default keyOf — prefers email, falls back to refresh-token hash so the
|
|
75
|
+
* same identity is keyed even when emails are missing.
|
|
76
|
+
*/
|
|
77
|
+
export declare function defaultKeyOf(account: AccountMetadataV3): string;
|
|
78
|
+
export declare function createQuotaManager(options: QuotaManagerOptions): QuotaManager;
|
|
79
|
+
/**
|
|
80
|
+
* Classify a model into its quota group.
|
|
81
|
+
*/
|
|
82
|
+
export declare function classifyQuotaGroup(modelName: string, displayName?: string): QuotaGroup | null;
|
|
83
|
+
export interface FetchAvailableModelEntry {
|
|
84
|
+
quotaInfo?: {
|
|
85
|
+
remainingFraction?: number;
|
|
86
|
+
resetTime?: string;
|
|
87
|
+
};
|
|
88
|
+
displayName?: string;
|
|
89
|
+
modelName?: string;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Aggregate per-model quota entries into group summaries + per-model list.
|
|
93
|
+
*
|
|
94
|
+
* Pure helper — exposed for harness adapters that want to reuse the same
|
|
95
|
+
* aggregation logic without re-implementing it.
|
|
96
|
+
*/
|
|
97
|
+
export declare function aggregateQuota(models?: Record<string, FetchAvailableModelEntry>): QuotaSummary;
|
|
98
|
+
export interface RetrieveUserQuotaBucket {
|
|
99
|
+
remainingAmount?: string;
|
|
100
|
+
remainingFraction?: number;
|
|
101
|
+
resetTime?: string;
|
|
102
|
+
tokenType?: string;
|
|
103
|
+
modelId?: string;
|
|
104
|
+
}
|
|
105
|
+
export interface RetrieveUserQuotaResponse {
|
|
106
|
+
buckets?: RetrieveUserQuotaBucket[];
|
|
107
|
+
}
|
|
108
|
+
export interface FetchAvailableModelsResponse {
|
|
109
|
+
models?: Record<string, FetchAvailableModelEntry>;
|
|
110
|
+
}
|
|
111
|
+
export interface RetrieveUserQuotaSummaryBucket {
|
|
112
|
+
bucketId: string;
|
|
113
|
+
displayName: string;
|
|
114
|
+
window: 'weekly' | '5h';
|
|
115
|
+
resetTime: string;
|
|
116
|
+
remainingFraction: number;
|
|
117
|
+
description?: string;
|
|
118
|
+
}
|
|
119
|
+
export interface RetrieveUserQuotaSummaryGroup {
|
|
120
|
+
displayName: string;
|
|
121
|
+
description?: string;
|
|
122
|
+
buckets: RetrieveUserQuotaSummaryBucket[];
|
|
123
|
+
}
|
|
124
|
+
export interface RetrieveUserQuotaSummaryResponse {
|
|
125
|
+
groups: RetrieveUserQuotaSummaryGroup[];
|
|
126
|
+
description?: string;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Aggregate a retrieveUserQuotaSummary response into a QuotaSummary.
|
|
130
|
+
*
|
|
131
|
+
* Each RUQS group maps to a pool via bucketId prefix. Within a pool,
|
|
132
|
+
* windows are stored shortest-first (5h before weekly, etc.). The pool's
|
|
133
|
+
* `remainingFraction`/`resetTime` derive from the most-constrained window.
|
|
134
|
+
*/
|
|
135
|
+
export declare function aggregateQuotaSummary(response: RetrieveUserQuotaSummaryResponse): QuotaSummary;
|
|
136
|
+
export interface FetchQuotaSummaryOptions {
|
|
137
|
+
accessToken: string;
|
|
138
|
+
/** Managed project ID. Falls back to regular projectId on 403. */
|
|
139
|
+
managedProjectId?: string;
|
|
140
|
+
/** Regular project ID — used as fallback when managedProjectId is missing or returns 403. */
|
|
141
|
+
projectId?: string;
|
|
142
|
+
endpoints: readonly string[];
|
|
143
|
+
timeoutMs?: number;
|
|
144
|
+
userAgent?: string;
|
|
145
|
+
fetchVia?: (url: string, options: RequestInit, extra: {
|
|
146
|
+
timeoutMs: number;
|
|
147
|
+
signal?: AbortSignal | null;
|
|
148
|
+
}) => Promise<Response>;
|
|
149
|
+
}
|
|
150
|
+
export interface FetchQuotaSummaryResult {
|
|
151
|
+
summary: RetrieveUserQuotaSummaryResponse;
|
|
152
|
+
/** True when the result came from the legacy fallback path. */
|
|
153
|
+
fellBackToLegacy?: boolean;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Fetch the windowed quota summary via `retrieveUserQuotaSummary`.
|
|
157
|
+
*
|
|
158
|
+
* Uses the same transport/UA/timeout conventions as `fetchAvailableModels`.
|
|
159
|
+
* On a 429 or 5xx against one endpoint, falls through to the next entry
|
|
160
|
+
* in `options.endpoints` (matching the legacy fetchers' failover
|
|
161
|
+
* convention). On 403 with the managedProjectId, retries with the
|
|
162
|
+
* regular projectId. If that also 403s, falls back to
|
|
163
|
+
* `fetchAvailableModels` so quota never goes dark. On missing
|
|
164
|
+
* managedProjectId, tries projectId first.
|
|
165
|
+
*/
|
|
166
|
+
export declare function fetchQuotaSummary(options: FetchQuotaSummaryOptions): Promise<FetchQuotaSummaryResult>;
|
|
167
|
+
/**
|
|
168
|
+
* Aggregate Gemini CLI quota buckets into a summary.
|
|
169
|
+
*/
|
|
170
|
+
export declare function aggregateGeminiCliQuota(response: RetrieveUserQuotaResponse): GeminiCliQuotaSummary;
|
|
171
|
+
export interface FetchAvailableModelsOptions {
|
|
172
|
+
accessToken: string;
|
|
173
|
+
projectId: string;
|
|
174
|
+
endpoints: readonly string[];
|
|
175
|
+
timeoutMs?: number;
|
|
176
|
+
userAgent?: string;
|
|
177
|
+
/**
|
|
178
|
+
* Override the transport used for the probe. Defaults to
|
|
179
|
+
* `fetchWithActiveTimeout` so callers get the same stream-safe active-fetch
|
|
180
|
+
* timeout that the rest of the core uses.
|
|
181
|
+
*/
|
|
182
|
+
fetchVia?: (url: string, options: RequestInit, extra: {
|
|
183
|
+
timeoutMs: number;
|
|
184
|
+
signal?: AbortSignal | null;
|
|
185
|
+
}) => Promise<Response>;
|
|
186
|
+
}
|
|
187
|
+
export declare function fetchAvailableModels(options: FetchAvailableModelsOptions): Promise<FetchAvailableModelsResponse>;
|
|
188
|
+
export interface FetchGeminiCliQuotaOptions {
|
|
189
|
+
accessToken: string;
|
|
190
|
+
projectId: string;
|
|
191
|
+
endpoints: readonly string[];
|
|
192
|
+
timeoutMs?: number;
|
|
193
|
+
userAgent?: string;
|
|
194
|
+
/**
|
|
195
|
+
* Optional transport override. Production callers omit this; the e2e
|
|
196
|
+
* harness and tests inject a stub. Mirrors `fetchQuotaSummary`'s seam.
|
|
197
|
+
*/
|
|
198
|
+
fetchVia?: (url: string, options: RequestInit, extra: {
|
|
199
|
+
timeoutMs: number;
|
|
200
|
+
}) => Promise<Response>;
|
|
201
|
+
}
|
|
202
|
+
export declare function fetchGeminiCliQuota(options: FetchGeminiCliQuotaOptions): Promise<RetrieveUserQuotaResponse>;
|
|
203
|
+
//# sourceMappingURL=quota-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quota-manager.d.ts","sourceRoot":"","sources":["../src/quota-manager.ts"],"names":[],"mappings":"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"}
|