@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
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) {
|
|
@@ -194,14 +217,19 @@ export async function ensureProjectContext(auth) {
|
|
|
194
217
|
}
|
|
195
218
|
// No managed project found - try to auto-provision one via onboarding.
|
|
196
219
|
// This handles accounts that were added before managed project provisioning was required.
|
|
197
|
-
const tierId = getDefaultTierId(loadPayload?.allowedTiers) ??
|
|
198
|
-
log.debug(
|
|
220
|
+
const tierId = getDefaultTierId(loadPayload?.allowedTiers) ?? 'free-tier';
|
|
221
|
+
log.debug('Auto-provisioning managed project', {
|
|
222
|
+
tierId,
|
|
223
|
+
projectId: parts.projectId,
|
|
224
|
+
});
|
|
199
225
|
const provisionedProjectId = await onboardManagedProject(accessToken, tierId, parts.projectId);
|
|
200
226
|
if (provisionedProjectId) {
|
|
201
|
-
log.debug(
|
|
227
|
+
log.debug('Successfully provisioned managed project', {
|
|
228
|
+
provisionedProjectId,
|
|
229
|
+
});
|
|
202
230
|
return persistManagedProject(provisionedProjectId);
|
|
203
231
|
}
|
|
204
|
-
log.warn(
|
|
232
|
+
log.warn('Failed to provision managed project - account may not work correctly', {
|
|
205
233
|
hasProjectId: !!parts.projectId,
|
|
206
234
|
});
|
|
207
235
|
if (cacheKey) {
|
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,140 @@
|
|
|
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
|
+
/**
|
|
112
|
+
* Aggregate Gemini CLI quota buckets into a summary.
|
|
113
|
+
*/
|
|
114
|
+
export declare function aggregateGeminiCliQuota(response: RetrieveUserQuotaResponse): GeminiCliQuotaSummary;
|
|
115
|
+
export interface FetchAvailableModelsOptions {
|
|
116
|
+
accessToken: string;
|
|
117
|
+
projectId: string;
|
|
118
|
+
endpoints: readonly string[];
|
|
119
|
+
timeoutMs?: number;
|
|
120
|
+
userAgent?: string;
|
|
121
|
+
/**
|
|
122
|
+
* Override the transport used for the probe. Defaults to
|
|
123
|
+
* `fetchWithActiveTimeout` so callers get the same stream-safe active-fetch
|
|
124
|
+
* timeout that the rest of the core uses.
|
|
125
|
+
*/
|
|
126
|
+
fetchVia?: (url: string, options: RequestInit, extra: {
|
|
127
|
+
timeoutMs: number;
|
|
128
|
+
signal?: AbortSignal | null;
|
|
129
|
+
}) => Promise<Response>;
|
|
130
|
+
}
|
|
131
|
+
export declare function fetchAvailableModels(options: FetchAvailableModelsOptions): Promise<FetchAvailableModelsResponse>;
|
|
132
|
+
export interface FetchGeminiCliQuotaOptions {
|
|
133
|
+
accessToken: string;
|
|
134
|
+
projectId: string;
|
|
135
|
+
endpoints: readonly string[];
|
|
136
|
+
timeoutMs?: number;
|
|
137
|
+
userAgent?: string;
|
|
138
|
+
}
|
|
139
|
+
export declare function fetchGeminiCliQuota(options: FetchGeminiCliQuotaOptions): Promise<RetrieveUserQuotaResponse>;
|
|
140
|
+
//# 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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"}
|