@eddyskywalker/dsh-chatgpt-subscription 0.2.9 → 0.2.11

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/lib/index.js CHANGED
@@ -203,6 +203,7 @@ function resolveCodexModel(model, preferences) {
203
203
  const status = preferences?.status();
204
204
  const configuredContextWindow = isConfigurableContextModelId(model) ? status?.contextWindowOverrides[model] : void 0;
205
205
  const efforts = reasoningEffortsForModel(model);
206
+ const defaultEffort = efforts.includes(entry.defaultReasoningEffort) ? entry.defaultReasoningEffort : efforts[0];
206
207
  return {
207
208
  provider: PROVIDER_ID$1,
208
209
  id: model,
@@ -215,7 +216,7 @@ function resolveCodexModel(model, preferences) {
215
216
  id: ReasoningEffortId(effort),
216
217
  name: effort
217
218
  })),
218
- defaultEffort: ReasoningEffortId(entry.defaultReasoningEffort)
219
+ ...defaultEffort ? { defaultEffort: ReasoningEffortId(defaultEffort) } : {}
219
220
  }
220
221
  };
221
222
  }
@@ -3567,9 +3568,11 @@ const PROVIDER_ID = "antigravity";
3567
3568
  const STREAM_IDLE_TIMEOUT_MS = 3e5;
3568
3569
  const STREAM_IDLE_TIMEOUT_CODE = "LLM_STREAM_IDLE_TIMEOUT";
3569
3570
  const DISCOVERY_TIMEOUT_MS = 8e3;
3570
- const PROJECT_CACHE_TTL_MS = 1800 * 1e3;
3571
3571
  const OAUTH_CALLBACK_TIMEOUT_MS = 300 * 1e3;
3572
3572
  const ENDPOINT_FALLBACKS = ["https://daily-cloudcode-pa.googleapis.com", "https://cloudcode-pa.googleapis.com"];
3573
+ const FREE_TIER_ID = "free-tier";
3574
+ const ONBOARD_TIMEOUT_MS = 3e4;
3575
+ const ONBOARD_POLL_INTERVAL_MS = 1e3;
3573
3576
  const REDIRECT_PATH = "/oauth-callback";
3574
3577
  const AUTH_URL = "https://accounts.google.com/o/oauth2/v2/auth";
3575
3578
  const TOKEN_URL = "https://oauth2.googleapis.com/token";
@@ -4201,13 +4204,13 @@ var FileModelSettingsStore = class {
4201
4204
  return next;
4202
4205
  }
4203
4206
  };
4204
- //#endregion
4205
- //#region src/host/antigravity/client.ts
4206
- const projectCache = /* @__PURE__ */ new Map();
4207
4207
  let cachedQuota;
4208
+ let quotaFetchInFlight = null;
4208
4209
  const PLATFORM = process.platform === "darwin" ? "MACOS" : process.platform === "win32" ? "WINDOWS" : "LINUX";
4209
4210
  function defaultUserAgent() {
4210
- return `antigravity/1.15.8 ${process.platform === "darwin" ? "darwin" : process.platform === "win32" ? "windows" : "linux"}/${process.arch === "x64" ? "amd64" : process.arch}`;
4211
+ const version = process.env.DSH_ANTIGRAVITY_VERSION || "2.8.0";
4212
+ const cl = process.env.DSH_ANTIGRAVITY_CL || "963137146";
4213
+ return `antigravity/hub/${version} (aidev_client; os_type=${process.env.DSH_ANTIGRAVITY_OS || "darwin"}; arch=${process.env.DSH_ANTIGRAVITY_ARCH || "arm64"}; cl=${cl})`;
4211
4214
  }
4212
4215
  function antigravityHeaders(token) {
4213
4216
  return {
@@ -4253,50 +4256,97 @@ function extractProjectId(data) {
4253
4256
  }
4254
4257
  }
4255
4258
  }
4256
- async function listCloudAICompanionProjects(token, fetchFn = fetch) {
4259
+ async function loadCodeAssistDetail(token, fetchFn = fetch, signal) {
4260
+ const metadata = {
4261
+ ideType: "ANTIGRAVITY",
4262
+ platform: "PLATFORM_UNSPECIFIED",
4263
+ pluginType: "GEMINI"
4264
+ };
4257
4265
  for (const endpoint of endpointCandidates()) try {
4258
- const response = await fetchFn(`${endpoint}/v1internal:listCloudAICompanionProjects`, {
4266
+ const response = await fetchFn(`${endpoint}/v1internal:loadCodeAssist`, {
4259
4267
  method: "POST",
4260
- headers: antigravityHeaders(token),
4261
- body: JSON.stringify({}),
4262
- signal: AbortSignal.timeout(DISCOVERY_TIMEOUT_MS)
4268
+ headers: jsonHeaders(token),
4269
+ body: JSON.stringify({ metadata }),
4270
+ signal: signal ? AbortSignal.any([signal, AbortSignal.timeout(DISCOVERY_TIMEOUT_MS)]) : AbortSignal.timeout(DISCOVERY_TIMEOUT_MS)
4263
4271
  });
4264
4272
  if (!response.ok) continue;
4265
- return extractProjectId(await response.json());
4273
+ const data = await response.json();
4274
+ const projectId = extractProjectId(data);
4275
+ const allowedTiers = Array.isArray(data.allowedTiers) ? data.allowedTiers : [];
4276
+ const ineligibleTiers = Array.isArray(data.ineligibleTiers) ? data.ineligibleTiers : [];
4277
+ return {
4278
+ currentTier: data.currentTier || null,
4279
+ paidTier: data.paidTier || null,
4280
+ allowedTiers,
4281
+ ineligibleTiers,
4282
+ projectId,
4283
+ raw: data
4284
+ };
4266
4285
  } catch {}
4267
4286
  }
4268
- async function loadCodeAssist(token, fetchFn = fetch) {
4269
- const cached = projectCache.get(token);
4270
- if (cached && cached.expiresAt > Date.now()) return cached.projectId;
4271
- const body = JSON.stringify({ metadata: {
4272
- ideType: "ANTIGRAVITY",
4273
- platform: "PLATFORM_UNSPECIFIED",
4274
- pluginType: "GEMINI"
4275
- } });
4287
+ async function onboardUser(token, fetchFn = fetch, signal) {
4288
+ const deadline = Date.now() + ONBOARD_TIMEOUT_MS;
4289
+ const body = JSON.stringify({
4290
+ tierId: FREE_TIER_ID,
4291
+ metadata: { ideType: "ANTIGRAVITY" }
4292
+ });
4276
4293
  for (const endpoint of endpointCandidates()) try {
4277
- const response = await fetchFn(`${endpoint}/v1internal:loadCodeAssist`, {
4294
+ const remainingTime = Math.max(1e3, deadline - Date.now());
4295
+ const timeoutSignal = AbortSignal.timeout(remainingTime);
4296
+ const callSignal = signal ? AbortSignal.any([signal, timeoutSignal]) : timeoutSignal;
4297
+ const response = await fetchFn(`${endpoint}/v1internal:onboardUser`, {
4278
4298
  method: "POST",
4279
- headers: antigravityHeaders(token),
4299
+ headers: jsonHeaders(token),
4280
4300
  body,
4281
- signal: AbortSignal.timeout(DISCOVERY_TIMEOUT_MS)
4301
+ signal: callSignal
4282
4302
  });
4283
- if (!response.ok) continue;
4284
- const project = extractProjectId(await response.json());
4285
- if (project) {
4286
- projectCache.set(token, {
4287
- projectId: project,
4288
- expiresAt: Date.now() + PROJECT_CACHE_TTL_MS
4289
- });
4290
- return project;
4303
+ if (!response.ok) {
4304
+ const errorText = await response.text().catch(() => "");
4305
+ throw new Error(`onboardUser failed: ${response.status} ${response.statusText}: ${errorText}`);
4291
4306
  }
4292
- const listProj = await listCloudAICompanionProjects(token, fetchFn);
4293
- if (listProj) {
4294
- projectCache.set(token, {
4295
- projectId: listProj,
4296
- expiresAt: Date.now() + PROJECT_CACHE_TTL_MS
4307
+ let operation = await response.json();
4308
+ while (true) {
4309
+ if (operation.done === true) {
4310
+ if (operation.error) {
4311
+ const msg = operation.error.message || `Error code ${operation.error.code}`;
4312
+ throw new Error(`OnboardUser operation failed: ${msg}`);
4313
+ }
4314
+ return;
4315
+ }
4316
+ const waitMs = Math.min(ONBOARD_POLL_INTERVAL_MS, Math.max(100, deadline - Date.now()));
4317
+ if (Date.now() >= deadline) throw new Error(`onboardUser timed out after ${ONBOARD_TIMEOUT_MS}ms`);
4318
+ await new Promise((r) => setTimeout(r, waitMs));
4319
+ if (signal?.aborted) throw new Error("OAuth login cancelled");
4320
+ const operationName = operation.name || "";
4321
+ if (!operationName) throw new Error("onboardUser returned an operation without a name");
4322
+ const pollTime = Math.max(1e3, deadline - Date.now());
4323
+ const pollTimeoutSignal = AbortSignal.timeout(pollTime);
4324
+ const pollSignal = signal ? AbortSignal.any([signal, pollTimeoutSignal]) : pollTimeoutSignal;
4325
+ const pollResp = await fetchFn(`${endpoint}/v1internal/${operationName}`, {
4326
+ method: "GET",
4327
+ headers: jsonHeaders(token),
4328
+ signal: pollSignal
4297
4329
  });
4298
- return listProj;
4330
+ if (!pollResp.ok) {
4331
+ const pollErr = await pollResp.text().catch(() => "");
4332
+ throw new Error(`onboardUser operation poll failed: ${pollResp.status}: ${pollErr}`);
4333
+ }
4334
+ operation = await pollResp.json();
4299
4335
  }
4336
+ } catch (err) {
4337
+ if (Date.now() >= deadline || signal?.aborted) throw err;
4338
+ }
4339
+ }
4340
+ async function listCloudAICompanionProjects(token, fetchFn = fetch) {
4341
+ for (const endpoint of endpointCandidates()) try {
4342
+ const response = await fetchFn(`${endpoint}/v1internal:listCloudAICompanionProjects`, {
4343
+ method: "POST",
4344
+ headers: antigravityHeaders(token),
4345
+ body: JSON.stringify({}),
4346
+ signal: AbortSignal.timeout(DISCOVERY_TIMEOUT_MS)
4347
+ });
4348
+ if (!response.ok) continue;
4349
+ return extractProjectId(await response.json());
4300
4350
  } catch {}
4301
4351
  }
4302
4352
  async function postJson(path, token, body, fetchFn = fetch) {
@@ -4364,50 +4414,63 @@ function parseCatalogModels(data) {
4364
4414
  }
4365
4415
  return list;
4366
4416
  }
4367
- async function fetchAccountQuota(store = new FileCredentialStore(), modelSettings, fetchFn = fetch) {
4368
- const { token, projectId: credentialProjectId } = await ensureApiKey(store, fetchFn);
4369
- const [assistResult, summaryResult] = await Promise.all([postJson("/v1internal:loadCodeAssist", token, { metadata: {
4370
- ideType: "ANTIGRAVITY",
4371
- platform: "PLATFORM_UNSPECIFIED",
4372
- pluginType: "GEMINI"
4373
- } }, fetchFn).catch(() => null), postJson("/v1internal:retrieveUserQuotaSummary", token, {}, fetchFn).catch(() => null)]);
4374
- const discoveredProject = assistResult ? extractProjectId(assistResult.data) : void 0;
4375
- const projectId = credentialProjectId || discoveredProject || "antigravity-default";
4376
- const modelsData = (await postJson("/v1internal:fetchAvailableModels", token, { project: projectId }, fetchFn).catch(() => null))?.data;
4377
- const { groups, description } = summaryResult ? parseQuotaSummary(summaryResult.data) : { groups: [] };
4378
- const catalogModels = modelsData ? parseCatalogModels(modelsData) : [];
4379
- const assistData = assistResult?.data || {};
4380
- const currentTier = assistData.currentTier;
4381
- const paidTier = assistData.paidTier;
4382
- const planLabel = paidTier?.name || currentTier?.name || void 0;
4383
- cachedQuota = {
4384
- projectId,
4385
- endpoint: summaryResult?.endpoint || ENDPOINT_FALLBACKS[0],
4386
- planLabel,
4387
- productTier: currentTier,
4388
- paidTier,
4389
- groups,
4390
- groupDescription: description,
4391
- models: catalogModels.map((m) => ({
4392
- modelId: m.id,
4393
- displayName: m.name,
4394
- description: m.description
4395
- })),
4396
- catalogModels,
4397
- fetchedAt: Date.now()
4398
- };
4399
- if (modelSettings && catalogModels.length > 0) {
4400
- const current = await modelSettings.read();
4401
- const isFirstTime = current.catalogModels.length === 0 && current.enabledModelIds.length === 0;
4402
- const catalogIds = new Set(catalogModels.map((m) => m.id));
4403
- const mergedEnabled = isFirstTime ? catalogModels.map((m) => m.id) : current.enabledModelIds.filter((id) => catalogIds.has(id));
4404
- await modelSettings.setCatalogModels(catalogModels, { enabledModelIds: mergedEnabled });
4405
- }
4406
- return cachedQuota;
4417
+ async function fetchAccountQuota(store = new FileCredentialStore(), modelSettings, fetchFn = fetch, force = false) {
4418
+ if (!force && cachedQuota && Date.now() - (cachedQuota.fetchedAt || 0) < 12e4) return cachedQuota;
4419
+ if (quotaFetchInFlight) return quotaFetchInFlight;
4420
+ quotaFetchInFlight = (async () => {
4421
+ try {
4422
+ const { token, projectId: credentialProjectId } = await ensureApiKey(store, fetchFn);
4423
+ const [assistResult, summaryResult] = await Promise.all([postJson("/v1internal:loadCodeAssist", token, { metadata: {
4424
+ ideType: "ANTIGRAVITY",
4425
+ platform: "PLATFORM_UNSPECIFIED",
4426
+ pluginType: "GEMINI"
4427
+ } }, fetchFn).catch(() => null), postJson("/v1internal:retrieveUserQuotaSummary", token, {}, fetchFn).catch(() => null)]);
4428
+ const discoveredProject = assistResult ? extractProjectId(assistResult.data) : void 0;
4429
+ const projectId = credentialProjectId || discoveredProject || "antigravity-default";
4430
+ const modelsData = (await postJson("/v1internal:fetchAvailableModels", token, { project: projectId }, fetchFn).catch(() => null))?.data;
4431
+ const { groups, description } = summaryResult ? parseQuotaSummary(summaryResult.data) : { groups: [] };
4432
+ const catalogModels = modelsData ? parseCatalogModels(modelsData) : [];
4433
+ const assistData = assistResult?.data || {};
4434
+ const currentTier = assistData.currentTier;
4435
+ const paidTier = assistData.paidTier;
4436
+ const planLabel = paidTier?.name || currentTier?.name || void 0;
4437
+ cachedQuota = {
4438
+ projectId,
4439
+ endpoint: summaryResult?.endpoint || ENDPOINT_FALLBACKS[0],
4440
+ planLabel,
4441
+ productTier: currentTier,
4442
+ paidTier,
4443
+ groups,
4444
+ groupDescription: description,
4445
+ models: catalogModels.map((m) => ({
4446
+ modelId: m.id,
4447
+ displayName: m.name,
4448
+ description: m.description
4449
+ })),
4450
+ catalogModels,
4451
+ fetchedAt: Date.now()
4452
+ };
4453
+ if (modelSettings && catalogModels.length > 0) {
4454
+ const current = await modelSettings.read();
4455
+ const isFirstTime = current.catalogModels.length === 0 && current.enabledModelIds.length === 0;
4456
+ const catalogIds = new Set(catalogModels.map((m) => m.id));
4457
+ const mergedEnabled = isFirstTime ? catalogModels.map((m) => m.id) : current.enabledModelIds.filter((id) => catalogIds.has(id));
4458
+ await modelSettings.setCatalogModels(catalogModels, { enabledModelIds: mergedEnabled });
4459
+ }
4460
+ return cachedQuota;
4461
+ } finally {
4462
+ quotaFetchInFlight = null;
4463
+ }
4464
+ })();
4465
+ return quotaFetchInFlight;
4407
4466
  }
4408
4467
  function getCachedQuota() {
4409
4468
  return cachedQuota;
4410
4469
  }
4470
+ function clearCachedQuota() {
4471
+ cachedQuota = void 0;
4472
+ quotaFetchInFlight = null;
4473
+ }
4411
4474
  //#endregion
4412
4475
  //#region src/host/antigravity/oauth.ts
4413
4476
  let webLoginFlow = { status: "idle" };
@@ -4552,7 +4615,36 @@ function startCallbackServer(expectedState) {
4552
4615
  });
4553
4616
  });
4554
4617
  }
4555
- async function exchangeOAuthCode(code, verifier, callbackUrl, fetchFn = fetch) {
4618
+ function extractGoogleValidationUrl(text) {
4619
+ const match = /https:\/\/[^\s"'><]+/i.exec(text);
4620
+ return match ? match[0] : void 0;
4621
+ }
4622
+ function assertFreeTierEligible(payload) {
4623
+ if (payload.allowedTiers?.some((tier) => tier.id === "free-tier") === true) return;
4624
+ const ineligibility = payload.ineligibleTiers?.find((c) => c.tierId === FREE_TIER_ID);
4625
+ if (!ineligibility?.reasonMessage) return;
4626
+ const validation = ineligibility.validationUrl ? `\nValidation URL: ${ineligibility.validationUrl}` : "";
4627
+ const err = /* @__PURE__ */ new Error(`${ineligibility.reasonMessage}${validation}`);
4628
+ if (ineligibility.validationUrl) err.validationUrl = ineligibility.validationUrl;
4629
+ throw err;
4630
+ }
4631
+ async function discoverAntigravityProject(token, fetchFn = fetch, signal, onProgress) {
4632
+ onProgress?.("正在检查 Cloud Code Assist 账号状态...");
4633
+ const initial = await loadCodeAssistDetail(token, fetchFn, signal);
4634
+ if (!initial) throw new Error("无法连接到 Cloud Code Assist 服务,请检查网络连接");
4635
+ assertFreeTierEligible(initial);
4636
+ if (initial.allowedTiers?.some((tier) => tier.id === "free-tier") === true && !initial.currentTier) {
4637
+ onProgress?.("正在为新账号开通 Antigravity 免费额度...");
4638
+ await onboardUser(token, fetchFn, signal);
4639
+ onProgress?.("正在获取专属项目 (Project ID)...");
4640
+ const refreshed = await loadCodeAssistDetail(token, fetchFn, signal);
4641
+ if (refreshed?.projectId) return refreshed.projectId;
4642
+ } else if (initial.projectId) return initial.projectId;
4643
+ const fallback = await listCloudAICompanionProjects(token, fetchFn);
4644
+ if (fallback) return fallback;
4645
+ return initial.projectId;
4646
+ }
4647
+ async function exchangeOAuthCode(code, verifier, callbackUrl, fetchFn = fetch, signal, onProgress) {
4556
4648
  const tokenResponse = await fetchFn(TOKEN_URL, {
4557
4649
  method: "POST",
4558
4650
  headers: { "Content-Type": "application/x-www-form-urlencoded" },
@@ -4563,7 +4655,8 @@ async function exchangeOAuthCode(code, verifier, callbackUrl, fetchFn = fetch) {
4563
4655
  grant_type: "authorization_code",
4564
4656
  redirect_uri: callbackUrl,
4565
4657
  code_verifier: verifier
4566
- }).toString()
4658
+ }).toString(),
4659
+ signal
4567
4660
  });
4568
4661
  if (!tokenResponse.ok) throw new Error(`Token exchange failed: ${sanitizeOAuthProviderError(await tokenResponse.text())}`);
4569
4662
  const tokenData = await tokenResponse.json();
@@ -4571,7 +4664,7 @@ async function exchangeOAuthCode(code, verifier, callbackUrl, fetchFn = fetch) {
4571
4664
  const accessToken = typeof tokenData.access_token === "string" ? tokenData.access_token : "";
4572
4665
  const expiresIn = typeof tokenData.expires_in === "number" ? tokenData.expires_in : 3600;
4573
4666
  if (!refreshToken) throw new Error("No refresh token received. Re-run login and allow offline access.");
4574
- const [email, discoveredProject] = await Promise.all([getUserEmail(accessToken, fetchFn), loadCodeAssist(accessToken, fetchFn).catch(() => void 0)]);
4667
+ const [email, discoveredProject] = await Promise.all([getUserEmail(accessToken, fetchFn), discoverAntigravityProject(accessToken, fetchFn, signal, onProgress)]);
4575
4668
  return {
4576
4669
  refresh: refreshToken,
4577
4670
  refresh_token: refreshToken,
@@ -4583,7 +4676,7 @@ async function exchangeOAuthCode(code, verifier, callbackUrl, fetchFn = fetch) {
4583
4676
  email
4584
4677
  };
4585
4678
  }
4586
- async function beginWebLogin(store, fetchFn = fetch) {
4679
+ async function beginWebLogin(store, fetchFn = fetch, signal) {
4587
4680
  if (webLoginFlow.status === "pending") return { ...webLoginFlow };
4588
4681
  const { verifier, challenge } = generatePKCE();
4589
4682
  const state = base64Url(randomBytes(32));
@@ -4603,20 +4696,28 @@ async function beginWebLogin(store, fetchFn = fetch) {
4603
4696
  prompt: "consent"
4604
4697
  }).toString()}`,
4605
4698
  startedAt: Date.now(),
4606
- error: void 0
4699
+ progress: "等待浏览器授权...",
4700
+ error: void 0,
4701
+ validationUrl: void 0
4607
4702
  };
4608
4703
  (async () => {
4609
4704
  try {
4610
4705
  const { code, state: returnedState } = await waitForCode();
4611
4706
  if (returnedState !== state) throw new Error("OAuth state mismatch");
4612
- const credentials = await exchangeOAuthCode(code, verifier, callbackUrl, fetchFn);
4707
+ const credentials = await exchangeOAuthCode(code, verifier, callbackUrl, fetchFn, signal, (stage) => {
4708
+ webLoginFlow.progress = stage;
4709
+ });
4613
4710
  await store.write(credentials);
4614
4711
  webLoginFlow.status = "complete";
4615
4712
  webLoginFlow.email = credentials.email;
4616
4713
  webLoginFlow.completedAt = Date.now();
4714
+ webLoginFlow.progress = "授权成功";
4617
4715
  } catch (error) {
4618
4716
  webLoginFlow.status = "error";
4619
- webLoginFlow.error = error instanceof Error ? error.message : String(error);
4717
+ const errText = error instanceof Error ? error.message : String(error);
4718
+ webLoginFlow.error = errText;
4719
+ const validationUrl = error?.validationUrl || extractGoogleValidationUrl(errText);
4720
+ if (validationUrl) webLoginFlow.validationUrl = validationUrl;
4620
4721
  webLoginFlow.completedAt = Date.now();
4621
4722
  } finally {
4622
4723
  server.close();
@@ -4652,7 +4753,8 @@ async function refreshAntigravityToken(credentials, fetchFn = fetch) {
4652
4753
  access: accessToken,
4653
4754
  access_token: accessToken,
4654
4755
  expires: Date.now() + expiresIn * 1e3 - 300 * 1e3,
4655
- expires_at: Date.now() + expiresIn * 1e3 - 300 * 1e3
4756
+ expires_at: Date.now() + expiresIn * 1e3 - 300 * 1e3,
4757
+ projectId: credentials.projectId
4656
4758
  };
4657
4759
  }
4658
4760
  async function ensureApiKey(store, fetchFn = fetch) {
@@ -4668,7 +4770,7 @@ async function ensureApiKey(store, fetchFn = fetch) {
4668
4770
  projectId: credentials.projectId
4669
4771
  };
4670
4772
  }
4671
- async function loginAndSave(store, signal, onUrl, fetchFn = fetch) {
4773
+ async function loginAndSave(store, signal, onUrl, fetchFn = fetch, onProgress) {
4672
4774
  const { verifier, challenge } = generatePKCE();
4673
4775
  const state = base64Url(randomBytes(32));
4674
4776
  const { server, waitForCode } = await startCallbackServer(state);
@@ -4690,7 +4792,7 @@ async function loginAndSave(store, signal, onUrl, fetchFn = fetch) {
4690
4792
  if (signal?.aborted) throw new Error("OAuth login aborted");
4691
4793
  const { code, state: returnedState } = await waitForCode();
4692
4794
  if (returnedState !== state) throw new Error("OAuth state mismatch");
4693
- const credentials = await exchangeOAuthCode(code, verifier, callbackUrl, fetchFn);
4795
+ const credentials = await exchangeOAuthCode(code, verifier, callbackUrl, fetchFn, signal, onProgress);
4694
4796
  await store.write(credentials);
4695
4797
  return credentials;
4696
4798
  } finally {
@@ -5248,6 +5350,12 @@ function closeStream(state) {
5248
5350
  }
5249
5351
  //#endregion
5250
5352
  //#region src/host/antigravity/adapter.ts
5353
+ function resolveDefaultReasoningEffort(efforts, configuredEffort) {
5354
+ if (configuredEffort && efforts.includes(configuredEffort)) return ReasoningEffortId(configuredEffort);
5355
+ if (efforts.includes("medium")) return ReasoningEffortId("medium");
5356
+ if (efforts.includes("low")) return ReasoningEffortId("low");
5357
+ if (efforts.length > 0) return ReasoningEffortId(efforts[0]);
5358
+ }
5251
5359
  var AntigravityAdapter = class extends LlmAdapter {
5252
5360
  store;
5253
5361
  modelSettings;
@@ -5266,6 +5374,8 @@ var AntigravityAdapter = class extends LlmAdapter {
5266
5374
  name: PROVIDER_NAME
5267
5375
  };
5268
5376
  }
5377
+ providerRetryPolicy() {}
5378
+ imageRequestPricing(_provider, _model) {}
5269
5379
  async listModels(provider) {
5270
5380
  const prov = provider || "antigravity";
5271
5381
  const settings = this.preferences ? this.preferences.status() : await this.modelSettings.read();
@@ -5298,7 +5408,7 @@ var AntigravityAdapter = class extends LlmAdapter {
5298
5408
  "medium",
5299
5409
  "high"
5300
5410
  ];
5301
- const defaultEffort = settings.defaultReasoningEffort || "medium";
5411
+ const defaultEffortId = resolveDefaultReasoningEffort(efforts, settings.defaultReasoningEffort);
5302
5412
  return {
5303
5413
  provider,
5304
5414
  id: model.id,
@@ -5311,7 +5421,7 @@ var AntigravityAdapter = class extends LlmAdapter {
5311
5421
  id: ReasoningEffortId(effort),
5312
5422
  name: effort
5313
5423
  })),
5314
- defaultEffort: ReasoningEffortId(defaultEffort)
5424
+ ...defaultEffortId ? { defaultEffort: defaultEffortId } : {}
5315
5425
  } } : {}
5316
5426
  };
5317
5427
  }
@@ -5473,6 +5583,10 @@ function registerAntigravityRoutes(ctx, store, modelSettings, preferences, fetch
5473
5583
  try {
5474
5584
  if (path === "status" || path === "") {
5475
5585
  if (request.method !== "GET") return sendMethodNotAllowed(response);
5586
+ const credentials = await store.read();
5587
+ const authenticated = !!(credentials?.access || credentials?.access_token);
5588
+ const cached = getCachedQuota();
5589
+ if (authenticated && (!cached || Date.now() - (cached.fetchedAt || 0) > 12e4)) await fetchAccountQuota(store, modelSettings, fetchFn).catch(() => void 0);
5476
5590
  return sendJson(response, 200, {
5477
5591
  ok: true,
5478
5592
  value: await getAntigravityWebStatus(store, modelSettings, preferences)
@@ -5494,7 +5608,7 @@ function registerAntigravityRoutes(ctx, store, modelSettings, preferences, fetch
5494
5608
  }
5495
5609
  if (path === "quota") {
5496
5610
  if (request.method !== "GET" && request.method !== "POST") return sendMethodNotAllowed(response);
5497
- const quota = await fetchAccountQuota(store, modelSettings, fetchFn);
5611
+ const quota = await fetchAccountQuota(store, modelSettings, fetchFn, true);
5498
5612
  return sendJson(response, 200, {
5499
5613
  ok: true,
5500
5614
  value: {
@@ -5532,6 +5646,7 @@ function registerAntigravityRoutes(ctx, store, modelSettings, preferences, fetch
5532
5646
  if (path === "logout") {
5533
5647
  if (request.method !== "POST") return sendMethodNotAllowed(response);
5534
5648
  await store.delete();
5649
+ clearCachedQuota();
5535
5650
  return sendJson(response, 200, {
5536
5651
  ok: true,
5537
5652
  value: await getAntigravityWebStatus(store, modelSettings)
@@ -5619,4 +5734,4 @@ function localWebServerBaseUrl(host, port) {
5619
5734
  return `http://${host === "0.0.0.0" ? "127.0.0.1" : host}:${port}`;
5620
5735
  }
5621
5736
  //#endregion
5622
- export { AntigravityAdapter, CodexChatGptAdapter, FileCredentialStore, FileModelSettingsStore, LinuxFileTokenStore, MacKeychainTokenStore, OAuthService, ProxyManager, ResponsesClient, UsageService, WindowsDpapiTokenStore, apply, beginWebLogin, createCodexFetchProvider, createCodexImageTool, createCodexSearchProvider, createPlatformTokenStore, credentialPath, detectSystemProxy, fetchAccountQuota, getCachedQuota, inject, loginAndSave, mapCodexUsage, modelSettingsPath, parseCodexUsage, parseResponsesStream, refreshAntigravityToken };
5737
+ export { AntigravityAdapter, CodexChatGptAdapter, FileCredentialStore, FileModelSettingsStore, LinuxFileTokenStore, MacKeychainTokenStore, OAuthService, ProxyManager, ResponsesClient, UsageService, WindowsDpapiTokenStore, apply, beginWebLogin, clearCachedQuota, createCodexFetchProvider, createCodexImageTool, createCodexSearchProvider, createPlatformTokenStore, credentialPath, detectSystemProxy, fetchAccountQuota, getCachedQuota, inject, loginAndSave, mapCodexUsage, modelSettingsPath, parseCodexUsage, parseResponsesStream, refreshAntigravityToken };
@@ -1 +1 @@
1
- {"version":3,"file":"AntigravityComposerQuota.d.ts","sourceRoot":"","sources":["../../../../src/client/antigravity/AntigravityComposerQuota.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAA;AAC3E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mDAAmD,CAAA;AAC5F,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AAEjF,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAmB7C,KAAK,KAAK,GAAG,YAAY,CAAC,0BAA0B,CAAC,GACnD,WAAW,CAAC,OAAO,cAAc,CAAC,GAAG;IACnC,SAAS,EAAE,aAAa,CAAC,mBAAmB,CAAC,CAAA;IAC7C,kBAAkB,EAAE,MAAM,IAAI,CAAA;CAC/B,CAAA;AAqCH,wBAAgB,wBAAwB,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,EAAE,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAgF3G"}
1
+ {"version":3,"file":"AntigravityComposerQuota.d.ts","sourceRoot":"","sources":["../../../../src/client/antigravity/AntigravityComposerQuota.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAA;AAC3E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mDAAmD,CAAA;AAC5F,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AAEjF,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAmB7C,KAAK,KAAK,GAAG,YAAY,CAAC,0BAA0B,CAAC,GACnD,WAAW,CAAC,OAAO,cAAc,CAAC,GAAG;IACnC,SAAS,EAAE,aAAa,CAAC,mBAAmB,CAAC,CAAA;IAC7C,kBAAkB,EAAE,MAAM,IAAI,CAAA;CAC/B,CAAA;AAqCH,wBAAgB,wBAAwB,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,EAAE,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAyF3G"}
@@ -1 +1 @@
1
- {"version":3,"file":"AntigravitySection.d.ts","sourceRoot":"","sources":["../../../../src/client/antigravity/AntigravitySection.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2C,MAAM,OAAO,CAAA;AAM/D,UAAU,KAAK;IACb,aAAa,CAAC,EAAE,MAAM,IAAI,CAAA;IAC1B,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAA;CAChC;AAiBD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOlE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIpD;AAuBD,wBAAgB,kBAAkB,CAAC,EAAE,aAAa,EAAE,kBAAkB,EAAE,EAAE,KAAK,GAAG,KAAK,CAAC,YAAY,CAuanG"}
1
+ {"version":3,"file":"AntigravitySection.d.ts","sourceRoot":"","sources":["../../../../src/client/antigravity/AntigravitySection.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2C,MAAM,OAAO,CAAA;AAM/D,UAAU,KAAK;IACb,aAAa,CAAC,EAAE,MAAM,IAAI,CAAA;IAC1B,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAA;CAChC;AAiBD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOlE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIpD;AAuBD,wBAAgB,kBAAkB,CAAC,EAAE,aAAa,EAAE,kBAAkB,EAAE,EAAE,KAAK,GAAG,KAAK,CAAC,YAAY,CAmdnG"}
@@ -264,6 +264,6 @@ export declare const dictionaries: {
264
264
  readonly retry: "重试";
265
265
  readonly unknown: "未知";
266
266
  };
267
- en: Record<"tokens" | "title" | "intro" | "account" | "signedOut" | "signedIn" | "plan" | "accountId" | "expires" | "storage" | "storageWindows" | "storageMacKeychain" | "storageLinuxFile" | "storageMemory" | "storageUnavailable" | "securityWindows" | "securityMacKeychain" | "securityLinuxFile" | "securityMemory" | "securityUnavailable" | "signIn" | "signInAgain" | "cancel" | "signOut" | "refreshToken" | "pending" | "popupBlocked" | "continueLogin" | "loading" | "connection" | "provider" | "connectionState" | "connected" | "untested" | "testConnection" | "testing" | "latency" | "models" | "modelsHint" | "proxySettings" | "proxyMode" | "proxyModeHint" | "proxyModeAuto" | "proxyModeCustom" | "proxyModeDirect" | "customProxyUrl" | "customProxyUrlHint" | "customProxyUrlPlaceholder" | "saveProxyUrl" | "proxyDetected" | "proxyDetectedEffective" | "proxyNoneDetected" | "proxyDirectHint" | "enhancements" | "fastMode" | "fastModeHint" | "outputVerbosity" | "outputVerbosityHint" | "verbosityLow" | "verbosityMedium" | "verbosityHigh" | "reasoningSummary" | "reasoningSummaryHint" | "summaryAuto" | "summaryConcise" | "summaryDetailed" | "summaryNone" | "searchProvider" | "searchProviderHint" | "searchProviderDsh" | "searchProviderCodex" | "providerDefault" | "subagentEnhancements" | "subagentContextWindow" | "subagentContextWindowHint" | "subagentMaxDepth" | "subagentMaxDepthHint" | "subagentDisabled" | "levels" | "contextWindows" | "contextWindowsHint" | "contextWindow" | "contextWindowInvalid" | "saveContextWindow" | "save" | "quickQuota" | "quickQuotaHint" | "quota" | "quotaIntro" | "refreshQuota" | "refreshing" | "noQuota" | "quotaSignedOut" | "stale" | "updated" | "primary" | "secondary" | "limitWindow" | "used" | "remaining" | "available" | "unavailable" | "unlimited" | "credits" | "monthlySpend" | "resetCredits" | "resetCreditExpires" | "useResetCredit" | "usingResetCredit" | "useResetCreditConfirm" | "resetCreditUsed" | "spendControlReached" | "limit" | "exhausted" | "resets" | "quickQuotaLabel" | "quickQuotaLoading" | "imageToolRunning" | "imageToolDone" | "imageToolFailed" | "image" | "openImage" | "openNamedImage" | "imageLoading" | "imageLoadFailed" | "imagePreviewClose" | "imagePreviewOpenOriginal" | "retry" | "unknown", string>;
267
+ en: Record<"quota" | "account" | "storage" | "stale" | "pending" | "tokens" | "title" | "intro" | "signedOut" | "signedIn" | "plan" | "accountId" | "expires" | "storageWindows" | "storageMacKeychain" | "storageLinuxFile" | "storageMemory" | "storageUnavailable" | "securityWindows" | "securityMacKeychain" | "securityLinuxFile" | "securityMemory" | "securityUnavailable" | "signIn" | "signInAgain" | "cancel" | "signOut" | "refreshToken" | "popupBlocked" | "continueLogin" | "loading" | "connection" | "provider" | "connectionState" | "connected" | "untested" | "testConnection" | "testing" | "latency" | "models" | "modelsHint" | "proxySettings" | "proxyMode" | "proxyModeHint" | "proxyModeAuto" | "proxyModeCustom" | "proxyModeDirect" | "customProxyUrl" | "customProxyUrlHint" | "customProxyUrlPlaceholder" | "saveProxyUrl" | "proxyDetected" | "proxyDetectedEffective" | "proxyNoneDetected" | "proxyDirectHint" | "enhancements" | "fastMode" | "fastModeHint" | "outputVerbosity" | "outputVerbosityHint" | "verbosityLow" | "verbosityMedium" | "verbosityHigh" | "reasoningSummary" | "reasoningSummaryHint" | "summaryAuto" | "summaryConcise" | "summaryDetailed" | "summaryNone" | "searchProvider" | "searchProviderHint" | "searchProviderDsh" | "searchProviderCodex" | "providerDefault" | "subagentEnhancements" | "subagentContextWindow" | "subagentContextWindowHint" | "subagentMaxDepth" | "subagentMaxDepthHint" | "subagentDisabled" | "levels" | "contextWindows" | "contextWindowsHint" | "contextWindow" | "contextWindowInvalid" | "saveContextWindow" | "save" | "quickQuota" | "quickQuotaHint" | "quotaIntro" | "refreshQuota" | "refreshing" | "noQuota" | "quotaSignedOut" | "updated" | "primary" | "secondary" | "limitWindow" | "used" | "remaining" | "available" | "unavailable" | "unlimited" | "credits" | "monthlySpend" | "resetCredits" | "resetCreditExpires" | "useResetCredit" | "usingResetCredit" | "useResetCreditConfirm" | "resetCreditUsed" | "spendControlReached" | "limit" | "exhausted" | "resets" | "quickQuotaLabel" | "quickQuotaLoading" | "imageToolRunning" | "imageToolDone" | "imageToolFailed" | "image" | "openImage" | "openNamedImage" | "imageLoading" | "imageLoadFailed" | "imagePreviewClose" | "imagePreviewOpenOriginal" | "retry" | "unknown", string>;
268
268
  };
269
269
  //# sourceMappingURL=locales.d.ts.map
@@ -1,5 +1,6 @@
1
- import { LlmAdapter, type GenerateOptions, type LlmModelInfo, type LlmProviderInfo, type LlmResolvedModelInfo, type PreparedAdapterCall, type StreamChunk } from '@deepseek-ai/dsh-llm';
1
+ import { LlmAdapter, ReasoningEffortId, type GenerateOptions, type LlmModelInfo, type LlmProviderInfo, type LlmResolvedModelInfo, type PreparedAdapterCall, type StreamChunk } from '@deepseek-ai/dsh-llm';
2
2
  import { FileCredentialStore, FileModelSettingsStore, type AntigravityPreferenceStore } from './token-store.ts';
3
+ export declare function resolveDefaultReasoningEffort(efforts: readonly string[], configuredEffort?: string | null): ReasoningEffortId | undefined;
3
4
  export declare class AntigravityAdapter extends LlmAdapter {
4
5
  private readonly store;
5
6
  private readonly modelSettings;
@@ -9,6 +10,8 @@ export declare class AntigravityAdapter extends LlmAdapter {
9
10
  fetchFn?: typeof fetch;
10
11
  });
11
12
  providerInfo(provider: string): LlmProviderInfo;
13
+ providerRetryPolicy(): undefined;
14
+ imageRequestPricing(_provider?: string, _model?: string): undefined;
12
15
  listModels(provider?: string): Promise<readonly LlmModelInfo[]>;
13
16
  resolveModel(provider: string, modelId: string, signal?: AbortSignal): Promise<LlmResolvedModelInfo>;
14
17
  prepareCall(provider: string, model: string, signal?: AbortSignal): Promise<PreparedAdapterCall>;
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../src/host/antigravity/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EAGV,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,WAAW,EACjB,MAAM,sBAAsB,CAAA;AAU7B,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,KAAK,0BAA0B,EAAE,MAAM,kBAAkB,CAAA;AAM/G,qBAAa,kBAAmB,SAAQ,UAAU;IAE9C,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAHP,KAAK,sBAA4B,EACjC,aAAa,yBAA+B,EAC5C,WAAW,CAAC,EAAE,0BAA0B,YAAA,EACxC,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,OAAO,KAAK,CAAA;KAAO;IAK3D,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe;IAIzC,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC;IAkB/D,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAqCpG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAO/F,MAAM,CAAC,OAAO,EAAE,eAAe,GAAG,aAAa,CAAC,WAAW,CAAC;YAwBpD,aAAa;CAwG7B"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../src/host/antigravity/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EAEV,iBAAiB,EACjB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,WAAW,EACjB,MAAM,sBAAsB,CAAA;AAU7B,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,KAAK,0BAA0B,EAAE,MAAM,kBAAkB,CAAA;AAM/G,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,GAC/B,iBAAiB,GAAG,SAAS,CAc/B;AAED,qBAAa,kBAAmB,SAAQ,UAAU;IAE9C,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAHP,KAAK,sBAA4B,EACjC,aAAa,yBAA+B,EAC5C,WAAW,CAAC,EAAE,0BAA0B,YAAA,EACxC,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,OAAO,KAAK,CAAA;KAAO;IAK3D,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe;IAI/C,mBAAmB,IAAI,SAAS;IAIhC,mBAAmB,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS;IAI7D,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,YAAY,EAAE,CAAC;IAkB/D,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAqCpG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAO/F,MAAM,CAAC,OAAO,EAAE,eAAe,GAAG,aAAa,CAAC,WAAW,CAAC;YAwBpD,aAAa;CAwG7B"}
@@ -1,9 +1,30 @@
1
1
  import { FileCredentialStore, FileModelSettingsStore, type AntigravityCatalogModel } from './token-store.ts';
2
2
  import type { AntigravityAccountQuota, AntigravityQuotaGroup } from '../../shared/antigravity-contracts.ts';
3
+ export declare const ANTIGRAVITY_QUOTA_CACHE_TTL_MS: number;
3
4
  export declare function defaultUserAgent(): string;
4
5
  export declare function antigravityHeaders(token: string): Record<string, string>;
5
6
  export declare function jsonHeaders(token: string): Record<string, string>;
6
7
  export declare function endpointCandidates(): string[];
8
+ export interface AntigravityTierInfo {
9
+ id?: string;
10
+ name?: string;
11
+ description?: string;
12
+ }
13
+ export interface AntigravityIneligibleTier {
14
+ tierId?: string;
15
+ reasonMessage?: string;
16
+ validationUrl?: string;
17
+ }
18
+ export interface LoadCodeAssistDetailResult {
19
+ currentTier?: AntigravityTierInfo | null;
20
+ paidTier?: AntigravityTierInfo | null;
21
+ allowedTiers?: AntigravityTierInfo[];
22
+ ineligibleTiers?: AntigravityIneligibleTier[];
23
+ projectId?: string;
24
+ raw?: Record<string, unknown>;
25
+ }
26
+ export declare function loadCodeAssistDetail(token: string, fetchFn?: typeof fetch, signal?: AbortSignal): Promise<LoadCodeAssistDetailResult | undefined>;
27
+ export declare function onboardUser(token: string, fetchFn?: typeof fetch, signal?: AbortSignal): Promise<void>;
7
28
  export declare function listCloudAICompanionProjects(token: string, fetchFn?: typeof fetch): Promise<string | undefined>;
8
29
  export declare function loadCodeAssist(token: string, fetchFn?: typeof fetch): Promise<string | undefined>;
9
30
  export declare function postJson(path: string, token: string, body: Record<string, unknown>, fetchFn?: typeof fetch): Promise<{
@@ -16,6 +37,7 @@ export declare function parseQuotaSummary(data: unknown): {
16
37
  description?: string;
17
38
  };
18
39
  export declare function parseCatalogModels(data: unknown): AntigravityCatalogModel[];
19
- export declare function fetchAccountQuota(store?: FileCredentialStore, modelSettings?: FileModelSettingsStore, fetchFn?: typeof fetch): Promise<AntigravityAccountQuota>;
40
+ export declare function fetchAccountQuota(store?: FileCredentialStore, modelSettings?: FileModelSettingsStore, fetchFn?: typeof fetch, force?: boolean): Promise<AntigravityAccountQuota>;
20
41
  export declare function getCachedQuota(): AntigravityAccountQuota | undefined;
42
+ export declare function clearCachedQuota(): void;
21
43
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/host/antigravity/client.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,KAAK,uBAAuB,EAC7B,MAAM,kBAAkB,CAAA;AAEzB,OAAO,KAAK,EACV,uBAAuB,EACvB,qBAAqB,EACtB,MAAM,uCAAuC,CAAA;AAO9C,wBAAgB,gBAAgB,IAAI,MAAM,CAIzC;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAaxE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAKjE;AAED,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAI7C;AA+BD,wBAAsB,4BAA4B,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,OAAO,KAAa,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAgB5H;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,OAAO,KAAa,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAsC9G;AAED,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,GAAE,OAAO,KAAa,GAC5B,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,CAoB9D;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG;IAChD,MAAM,EAAE,qBAAqB,EAAE,CAAA;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAyCA;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,uBAAuB,EAAE,CAmB3E;AAED,wBAAsB,iBAAiB,CACrC,KAAK,sBAA4B,EACjC,aAAa,CAAC,EAAE,sBAAsB,EACtC,OAAO,GAAE,OAAO,KAAa,GAC5B,OAAO,CAAC,uBAAuB,CAAC,CAoDlC;AAED,wBAAgB,cAAc,IAAI,uBAAuB,GAAG,SAAS,CAEpE"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/host/antigravity/client.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { type Server } from 'node:http';
2
2
  import { FileCredentialStore, type AntigravityCredentials } from './token-store.ts';
3
+ import { type LoadCodeAssistDetailResult } from './client.ts';
3
4
  export interface WebLoginFlowState {
4
5
  status: 'idle' | 'pending' | 'complete' | 'error';
5
6
  authUrl?: string;
@@ -7,6 +8,8 @@ export interface WebLoginFlowState {
7
8
  completedAt?: number;
8
9
  email?: string;
9
10
  error?: string;
11
+ validationUrl?: string;
12
+ progress?: string;
10
13
  }
11
14
  export declare function callbackPort(): number;
12
15
  export declare function resolveCallbackHost(raw?: string | undefined): string;
@@ -26,13 +29,16 @@ export declare function startCallbackServer(expectedState: string): Promise<{
26
29
  state: string;
27
30
  }>;
28
31
  }>;
29
- export declare function exchangeOAuthCode(code: string, verifier: string, callbackUrl: string, fetchFn?: typeof fetch): Promise<AntigravityCredentials>;
30
- export declare function beginWebLogin(store: FileCredentialStore, fetchFn?: typeof fetch): Promise<WebLoginFlowState>;
32
+ export declare function extractGoogleValidationUrl(text: string): string | undefined;
33
+ export declare function assertFreeTierEligible(payload: LoadCodeAssistDetailResult): void;
34
+ export declare function discoverAntigravityProject(token: string, fetchFn?: typeof fetch, signal?: AbortSignal, onProgress?: (stage: string) => void): Promise<string | undefined>;
35
+ export declare function exchangeOAuthCode(code: string, verifier: string, callbackUrl: string, fetchFn?: typeof fetch, signal?: AbortSignal, onProgress?: (stage: string) => void): Promise<AntigravityCredentials>;
36
+ export declare function beginWebLogin(store: FileCredentialStore, fetchFn?: typeof fetch, signal?: AbortSignal): Promise<WebLoginFlowState>;
31
37
  export declare function getWebLoginStatus(): WebLoginFlowState;
32
38
  export declare function refreshAntigravityToken(credentials: AntigravityCredentials, fetchFn?: typeof fetch): Promise<AntigravityCredentials>;
33
39
  export declare function ensureApiKey(store: FileCredentialStore, fetchFn?: typeof fetch): Promise<{
34
40
  token: string;
35
41
  projectId?: string;
36
42
  }>;
37
- export declare function loginAndSave(store: FileCredentialStore, signal?: AbortSignal, onUrl?: (url: string) => void, fetchFn?: typeof fetch): Promise<AntigravityCredentials>;
43
+ export declare function loginAndSave(store: FileCredentialStore, signal?: AbortSignal, onUrl?: (url: string) => void, fetchFn?: typeof fetch, onProgress?: (stage: string) => void): Promise<AntigravityCredentials>;
38
44
  //# sourceMappingURL=oauth.d.ts.map