claude-use 11.9.0 → 11.11.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/cli.cjs CHANGED
@@ -27010,12 +27010,12 @@ var init_schema = __esm({
27010
27010
  ANTIGRAVITY_TIERS = ["fable", "opus", "sonnet", "haiku"];
27011
27011
  ANTIGRAVITY_EFFORTS = ["none", "low", "medium", "high", "xhigh", "max"];
27012
27012
  ANTIGRAVITY_DEFAULT_MODE = "cloud";
27013
- ANTIGRAVITY_DEFAULT_MODEL = "gemini-2.5-pro";
27013
+ ANTIGRAVITY_DEFAULT_MODEL = "gemini-3.8-flash-high";
27014
27014
  ANTIGRAVITY_DEFAULT_TIER_MODELS = Object.freeze({
27015
- fable: "gemini-2.5-pro",
27016
- opus: "gemini-2.5-pro",
27017
- sonnet: "gemini-2.5-flash",
27018
- haiku: "gemini-2.5-flash"
27015
+ fable: "gemini-3.8-flash-high",
27016
+ opus: "gemini-3.8-flash-high",
27017
+ sonnet: "gemini-3.8-flash-medium",
27018
+ haiku: "gemini-3.8-flash-low"
27019
27019
  });
27020
27020
  ANTIGRAVITY_DEFAULT_EFFORT = "low";
27021
27021
  AntigravityProviderConfigSchema = external_exports.strictObject({
@@ -33419,7 +33419,7 @@ function isRateLimitHeader(name) {
33419
33419
  const lower = name.toLowerCase();
33420
33420
  return lower === "retry-after" || lower.startsWith("anthropic-ratelimit-") || lower.startsWith("x-ratelimit-") || lower.startsWith("ratelimit") || lower.startsWith("x-codex-");
33421
33421
  }
33422
- var USAGE_SCHEMA_VERSION, VersionSchema, InstantSchema, TokenCountSchema, TokenUsageSchema, LIMIT_KINDS, LimitClassificationSchema, UsageRecordSchema, QuotaWindowSchema, ExtraUsageSpendSchema, UnifiedRateLimitSchema, RateLimitStateSchema, LimitEventSchema, ProviderQuotaWindowSchema, ProviderQuotaSchema, ProviderUsageStateSchema, AccountMetadataSchema, UsageSnapshotSchema;
33422
+ var USAGE_SCHEMA_VERSION, VersionSchema, InstantSchema, TokenCountSchema, TokenUsageSchema, LIMIT_KINDS, LimitClassificationSchema, UsageRecordSchema, QuotaWindowSchema, ExtraUsageSpendSchema, UnifiedRateLimitSchema, RateLimitStateSchema, LimitEventSchema, ProviderQuotaWindowSchema, ProviderAccountSchema, ProviderQuotaSchema, ProviderUsageStateSchema, AccountMetadataSchema, UsageSnapshotSchema;
33423
33423
  var init_schema2 = __esm({
33424
33424
  "src/usage/schema.ts"() {
33425
33425
  "use strict";
@@ -33551,12 +33551,18 @@ var init_schema2 = __esm({
33551
33551
  used: external_exports.number().nonnegative().optional(),
33552
33552
  remaining: external_exports.number().nonnegative().optional()
33553
33553
  });
33554
+ ProviderAccountSchema = external_exports.strictObject({
33555
+ email: external_exports.string().optional(),
33556
+ accountId: external_exports.string().optional()
33557
+ });
33554
33558
  ProviderQuotaSchema = external_exports.strictObject({
33555
33559
  observedAt: InstantSchema,
33556
33560
  /** Which usage endpoint produced it (`z.ai`). */
33557
33561
  source: external_exports.string(),
33558
33562
  /** The subscription level the endpoint reports, when it does. */
33559
33563
  level: external_exports.string().optional(),
33564
+ /** The account the provider's credential belongs to, when its endpoint reports it. */
33565
+ account: ProviderAccountSchema.optional(),
33560
33566
  windows: external_exports.array(ProviderQuotaWindowSchema)
33561
33567
  });
33562
33568
  ProviderUsageStateSchema = external_exports.strictObject({
@@ -33962,11 +33968,33 @@ function formatCredentialSummary(summary) {
33962
33968
  function describeCredential(credential) {
33963
33969
  return formatCredentialSummary(summariseCredential(credential));
33964
33970
  }
33971
+ function isRecord2(value2) {
33972
+ return typeof value2 === "object" && value2 !== null && !Array.isArray(value2);
33973
+ }
33974
+ function unpackKeyringToken(raw) {
33975
+ const trimmed = raw.trim();
33976
+ if (!trimmed.startsWith(GO_KEYRING_BASE64_PREFIX)) {
33977
+ return trimmed;
33978
+ }
33979
+ try {
33980
+ const base64Str = trimmed.slice(GO_KEYRING_BASE64_PREFIX.length);
33981
+ const decoded = Buffer.from(base64Str, "base64").toString("utf8");
33982
+ const parsed = JSON.parse(decoded);
33983
+ if (isRecord2(parsed) && isRecord2(parsed.token)) {
33984
+ const accessToken = parsed.token.access_token;
33985
+ if (typeof accessToken === "string" && accessToken.trim() !== "") {
33986
+ return accessToken.trim();
33987
+ }
33988
+ }
33989
+ } catch {
33990
+ }
33991
+ return trimmed;
33992
+ }
33965
33993
  function trySource(source, params) {
33966
33994
  const none = (reason, warn = false) => ({ ok: false, reason, warn });
33967
33995
  if ("env" in source) {
33968
33996
  const value2 = params.env[source.env];
33969
- return value2 === void 0 || value2 === "" ? none("is unset or empty") : { ok: true, token: value2 };
33997
+ return value2 === void 0 || value2 === "" ? none("is unset or empty") : { ok: true, token: unpackKeyringToken(value2) };
33970
33998
  }
33971
33999
  if ("literal" in source) {
33972
34000
  return { ok: true, token: source.literal };
@@ -33982,7 +34010,7 @@ function trySource(source, params) {
33982
34010
  true
33983
34011
  );
33984
34012
  }
33985
- const token2 = read.content.trim();
34013
+ const token2 = unpackKeyringToken(read.content.trim());
33986
34014
  return token2 === "" ? none("is empty") : { ok: true, token: token2 };
33987
34015
  }
33988
34016
  const argv = commandArgv(source);
@@ -34000,7 +34028,7 @@ function trySource(source, params) {
34000
34028
  const outcome = result.status === null ? "could not be run or was killed by a signal" : `exited with status ${String(result.status)}`;
34001
34029
  return none(`${outcome}${stderr === "" ? "" : `: ${stderr}`}`);
34002
34030
  }
34003
- const token = result.stdout.trim();
34031
+ const token = unpackKeyringToken(result.stdout.trim());
34004
34032
  return token === "" ? none("printed no token") : { ok: true, token };
34005
34033
  }
34006
34034
  function warmCommandFor(subject) {
@@ -34044,7 +34072,7 @@ function credentialVariables(target, token) {
34044
34072
  CLAUDE_CODE_OAUTH_TOKEN: target === "oauthToken" ? token : void 0
34045
34073
  };
34046
34074
  }
34047
- var CREDENTIAL_UNAVAILABLE_EXIT, CREDENTIAL_COMMAND_TIMEOUT_MS, CREDENTIAL_INTERACTIVE_TIMEOUT_MS, GROUP_OTHER_PERMISSION_BITS, PERMISSION_BITS2, OCTAL_RADIX2;
34075
+ var CREDENTIAL_UNAVAILABLE_EXIT, CREDENTIAL_COMMAND_TIMEOUT_MS, CREDENTIAL_INTERACTIVE_TIMEOUT_MS, GROUP_OTHER_PERMISSION_BITS, PERMISSION_BITS2, OCTAL_RADIX2, GO_KEYRING_BASE64_PREFIX;
34048
34076
  var init_credential = __esm({
34049
34077
  "src/credential.ts"() {
34050
34078
  "use strict";
@@ -34055,6 +34083,7 @@ var init_credential = __esm({
34055
34083
  GROUP_OTHER_PERMISSION_BITS = 63;
34056
34084
  PERMISSION_BITS2 = 511;
34057
34085
  OCTAL_RADIX2 = 8;
34086
+ GO_KEYRING_BASE64_PREFIX = "go-keyring-base64:";
34058
34087
  }
34059
34088
  });
34060
34089
 
@@ -34064,7 +34093,7 @@ var init_package = __esm({
34064
34093
  "package.json"() {
34065
34094
  package_default = {
34066
34095
  name: "claude-use",
34067
- version: "11.9.0",
34096
+ version: "11.11.0",
34068
34097
  description: "A profile manager and launcher for Claude Code that lets one person run multiple logins from one machine while controlling what gets shared between them.",
34069
34098
  license: "MIT",
34070
34099
  author: "Joseph Mearman <joseph@mearman.co.uk>",
@@ -34666,13 +34695,16 @@ function decoderFor(encoding) {
34666
34695
  return void 0;
34667
34696
  }
34668
34697
  }
34669
- function destinationOf(path59) {
34698
+ function destinationOf(path59, sessionProvider) {
34670
34699
  const scoped = parseProviderPath(path59);
34671
- return scoped === void 0 ? { provider: ANTHROPIC_PROVIDER, endpoint: path59 } : { provider: scoped.provider, endpoint: scoped.rest };
34700
+ if (scoped !== void 0) {
34701
+ return { provider: scoped.provider, endpoint: scoped.rest };
34702
+ }
34703
+ return { provider: sessionProvider ?? ANTHROPIC_PROVIDER, endpoint: path59 };
34672
34704
  }
34673
34705
  function buildRecord(event, context) {
34674
34706
  const { scan } = context;
34675
- const { provider, endpoint } = destinationOf(event.path);
34707
+ const { provider, endpoint } = destinationOf(event.path, event.session.provider);
34676
34708
  const rateLimitHeaders = rateLimitHeadersOf(event.headers);
34677
34709
  const limit = classifyLimit({ status: event.status, headers: rateLimitHeaders ?? {}, error: scan?.error, nowMs: context.endedAt });
34678
34710
  const requestId = headerValue(event.headers, "request-id");
@@ -35634,14 +35666,14 @@ function providerJsonPath(paths, name) {
35634
35666
  function providerExists(paths, name) {
35635
35667
  return import_node_fs10.default.existsSync(providerJsonPath(paths, name));
35636
35668
  }
35637
- function isRecord2(value2) {
35669
+ function isRecord3(value2) {
35638
35670
  return typeof value2 === "object" && value2 !== null && !Array.isArray(value2);
35639
35671
  }
35640
35672
  function legacyProviderConversion(raw) {
35641
- if (!isRecord2(raw) || "credential" in raw) {
35673
+ if (!isRecord3(raw) || "credential" in raw) {
35642
35674
  return void 0;
35643
35675
  }
35644
- const env = isRecord2(raw.env) ? raw.env : void 0;
35676
+ const env = isRecord3(raw.env) ? raw.env : void 0;
35645
35677
  const legacyEnvKeys = env === void 0 ? [] : Object.keys(env).filter((key) => LEGACY_ENV_CREDENTIAL_KEYS.includes(key));
35646
35678
  const fields = [...LEGACY_PROVIDER_FIELDS.filter((field) => field in raw), ...legacyEnvKeys.map((key) => `env.${key}`)];
35647
35679
  if (fields.length === 0) {
@@ -63958,6 +63990,125 @@ var init_identityClaude = __esm({
63958
63990
  }
63959
63991
  });
63960
63992
 
63993
+ // src/antigravity/cloudUpstream.ts
63994
+ function isCcpaEndpoint(endpoint) {
63995
+ return endpoint.includes("cloudcode-pa.googleapis.com");
63996
+ }
63997
+ function buildCloudUrl(config2, model) {
63998
+ const { cloud } = config2;
63999
+ if (cloud.projectId !== void 0 && cloud.location !== void 0) {
64000
+ const base2 = cloud.endpoint ?? `https://${cloud.location}-aiplatform.googleapis.com`;
64001
+ return `${base2}/v1/projects/${cloud.projectId}/locations/${cloud.location}/publishers/google/models/${encodeURIComponent(model)}:streamGenerateContent?alt=sse`;
64002
+ }
64003
+ const base = cloud.endpoint ?? CCPA_ENDPOINT;
64004
+ if (isCcpaEndpoint(base)) {
64005
+ return `${base}/v1internal:streamGenerateContent?alt=sse`;
64006
+ }
64007
+ return `${base}/v1beta/models/${encodeURIComponent(model)}:streamGenerateContent?alt=sse`;
64008
+ }
64009
+ function buildCloudHeaders(token, credentialTarget, endpoint) {
64010
+ const headers = {
64011
+ "Content-Type": "application/json",
64012
+ Accept: "text/event-stream"
64013
+ };
64014
+ const target = credentialTarget ?? "bearer";
64015
+ if (target === "apiKey") {
64016
+ headers["x-goog-api-key"] = token;
64017
+ } else {
64018
+ headers.Authorization = `Bearer ${token}`;
64019
+ }
64020
+ const base = endpoint ?? CCPA_ENDPOINT;
64021
+ if (isCcpaEndpoint(base)) {
64022
+ headers["User-Agent"] = CCPA_USER_AGENT;
64023
+ }
64024
+ return headers;
64025
+ }
64026
+ function buildCloudRequestBody(params) {
64027
+ const base = params.config.cloud.endpoint ?? CCPA_ENDPOINT;
64028
+ if (isCcpaEndpoint(base)) {
64029
+ return JSON.stringify({
64030
+ project: params.config.cloud.projectId ?? CCPA_DEFAULT_PROJECT_ID,
64031
+ requestId: `agent/${(0, import_node_crypto16.randomUUID)()}/${String(Date.now())}/1`,
64032
+ request: params.request,
64033
+ model: params.model,
64034
+ userAgent: "antigravity"
64035
+ });
64036
+ }
64037
+ return JSON.stringify(params.request);
64038
+ }
64039
+ function isRecord4(value2) {
64040
+ return typeof value2 === "object" && value2 !== null && !Array.isArray(value2);
64041
+ }
64042
+ function isGeminiChunk(value2) {
64043
+ return isRecord4(value2);
64044
+ }
64045
+ async function* callCloudAntigravity(params, fetchFn = fetch) {
64046
+ const url2 = buildCloudUrl(params.config, params.model);
64047
+ const headers = buildCloudHeaders(params.token, params.credentialTarget, params.config.cloud.endpoint);
64048
+ const body = buildCloudRequestBody(params);
64049
+ const response = await fetchFn(url2, {
64050
+ method: "POST",
64051
+ headers,
64052
+ body,
64053
+ signal: params.signal
64054
+ });
64055
+ if (!response.ok) {
64056
+ const errorText = await response.text();
64057
+ const retryAfter = response.headers.get("retry-after");
64058
+ throw new AntigravityUpstreamError(response.status, errorText, retryAfter);
64059
+ }
64060
+ if (response.body === null) {
64061
+ return;
64062
+ }
64063
+ const decoder = new TextDecoder("utf-8");
64064
+ let buffer2 = "";
64065
+ const sseDataPrefix = "data:";
64066
+ for await (const rawChunk of response.body) {
64067
+ const chunk = rawChunk instanceof Uint8Array ? rawChunk : Buffer.from(String(rawChunk));
64068
+ buffer2 += decoder.decode(chunk, { stream: true });
64069
+ const lines = buffer2.split("\n");
64070
+ buffer2 = lines.pop() ?? "";
64071
+ for (const line of lines) {
64072
+ const trimmed = line.trim();
64073
+ if (trimmed.startsWith(sseDataPrefix)) {
64074
+ const jsonStr = trimmed.slice(sseDataPrefix.length).trim();
64075
+ if (jsonStr.length > 0) {
64076
+ try {
64077
+ const parsed = JSON.parse(jsonStr);
64078
+ if (isRecord4(parsed)) {
64079
+ const unwrapped = isRecord4(parsed.response) ? parsed.response : parsed;
64080
+ if (isGeminiChunk(unwrapped)) {
64081
+ yield unwrapped;
64082
+ }
64083
+ }
64084
+ } catch {
64085
+ }
64086
+ }
64087
+ }
64088
+ }
64089
+ }
64090
+ }
64091
+ var import_node_crypto16, CCPA_ENDPOINT, CCPA_DEFAULT_PROJECT_ID, CCPA_USER_AGENT, AntigravityUpstreamError;
64092
+ var init_cloudUpstream = __esm({
64093
+ "src/antigravity/cloudUpstream.ts"() {
64094
+ "use strict";
64095
+ import_node_crypto16 = require("node:crypto");
64096
+ CCPA_ENDPOINT = "https://daily-cloudcode-pa.googleapis.com";
64097
+ CCPA_DEFAULT_PROJECT_ID = "aicode-consumers";
64098
+ CCPA_USER_AGENT = "antigravity/cli/1.3.5 (aidev_client; os_type=darwin; arch=arm64; cl=998863838; auth_method=consumer)";
64099
+ AntigravityUpstreamError = class extends Error {
64100
+ status;
64101
+ retryAfter;
64102
+ constructor(status, message, retryAfter) {
64103
+ super(`Google Antigravity API error (${String(status)}): ${message}`);
64104
+ this.name = "AntigravityUpstreamError";
64105
+ this.status = status;
64106
+ this.retryAfter = retryAfter;
64107
+ }
64108
+ };
64109
+ }
64110
+ });
64111
+
63961
64112
  // src/usage/providerQuota.ts
63962
64113
  function zaiWindow(limit) {
63963
64114
  const unitMs = ZAI_UNIT_MS.get(limit.unit);
@@ -64001,11 +64152,12 @@ function quotaFreshnessMs(quota) {
64001
64152
  const lengths = quota.windows.flatMap((window) => window.periodMs === void 0 ? [] : [window.periodMs]);
64002
64153
  return lengths.length === 0 ? Number.POSITIVE_INFINITY : Math.min(...lengths) / PERCENT3;
64003
64154
  }
64004
- var ProviderQuotaError, MS_PER_SECOND6, SECONDS_PER_HOUR, HOURS_PER_DAY3, DAYS_PER_MONTH, PERCENT3, HTTP_OK, ZAI_SOURCE, ZAI_HOST, ZAI_QUOTA_URL, ZAI_UNIT_HOURS, ZAI_UNIT_MONTHS, ZAI_UNIT_MS, ZAI_MEASURES, ZaiLimitSchema, ZaiResponseSchema, zaiQuotaAdapter, OPENROUTER_SOURCE, OPENROUTER_HOST, OPENROUTER_KEY_URL, OPENROUTER_CREDITS_URL, HTTP_FORBIDDEN, MS_PER_DAY2, OpenRouterKeySchema, OpenRouterCreditsSchema, openRouterQuotaAdapter, PROVIDER_QUOTA_ADAPTERS;
64155
+ var ProviderQuotaError, MS_PER_SECOND6, SECONDS_PER_HOUR, HOURS_PER_DAY3, DAYS_PER_MONTH, PERCENT3, HTTP_OK, ZAI_SOURCE, ZAI_HOST, ZAI_QUOTA_URL, ZAI_UNIT_HOURS, ZAI_UNIT_MONTHS, ZAI_UNIT_MS, ZAI_MEASURES, ZaiLimitSchema, ZaiResponseSchema, zaiQuotaAdapter, OPENROUTER_SOURCE, OPENROUTER_HOST, OPENROUTER_KEY_URL, OPENROUTER_CREDITS_URL, HTTP_FORBIDDEN, MS_PER_DAY2, OpenRouterKeySchema, OpenRouterCreditsSchema, openRouterQuotaAdapter, ANTIGRAVITY_SOURCE, ANTIGRAVITY_HOST, ANTIGRAVITY_QUOTA_URL, GOOGLE_TOKENINFO_URL, FIVE_HOURS2, DAYS_PER_WEEK, FIVE_HOURS_MS, WEEK_MS, AntigravityBucketSchema, AntigravitySummarySchema, GoogleTokenInfoSchema, ANTIGRAVITY_WINDOW_MS, antigravityQuotaAdapter, PROVIDER_QUOTA_ADAPTERS;
64005
64156
  var init_providerQuota = __esm({
64006
64157
  "src/usage/providerQuota.ts"() {
64007
64158
  "use strict";
64008
64159
  init_zod();
64160
+ init_cloudUpstream();
64009
64161
  init_schema2();
64010
64162
  ProviderQuotaError = class extends Error {
64011
64163
  constructor(source, detail) {
@@ -64119,7 +64271,71 @@ var init_providerQuota = __esm({
64119
64271
  });
64120
64272
  }
64121
64273
  };
64122
- PROVIDER_QUOTA_ADAPTERS = [zaiQuotaAdapter, openRouterQuotaAdapter];
64274
+ ANTIGRAVITY_SOURCE = "Cloud Code";
64275
+ ANTIGRAVITY_HOST = "daily-cloudcode-pa.googleapis.com";
64276
+ ANTIGRAVITY_QUOTA_URL = `https://${ANTIGRAVITY_HOST}/v1internal:retrieveUserQuotaSummary`;
64277
+ GOOGLE_TOKENINFO_URL = "https://oauth2.googleapis.com/tokeninfo";
64278
+ FIVE_HOURS2 = 5;
64279
+ DAYS_PER_WEEK = 7;
64280
+ FIVE_HOURS_MS = FIVE_HOURS2 * SECONDS_PER_HOUR * MS_PER_SECOND6;
64281
+ WEEK_MS = DAYS_PER_WEEK * HOURS_PER_DAY3 * SECONDS_PER_HOUR * MS_PER_SECOND6;
64282
+ AntigravityBucketSchema = external_exports.object({
64283
+ bucketId: external_exports.string(),
64284
+ remainingFraction: external_exports.number().optional(),
64285
+ resetTime: external_exports.string().optional()
64286
+ });
64287
+ AntigravitySummarySchema = external_exports.object({ groups: external_exports.array(external_exports.object({ buckets: external_exports.array(AntigravityBucketSchema) })) });
64288
+ GoogleTokenInfoSchema = external_exports.object({
64289
+ email: external_exports.string().optional(),
64290
+ sub: external_exports.string().optional()
64291
+ });
64292
+ ANTIGRAVITY_WINDOW_MS = { "gemini-5h": FIVE_HOURS_MS, "3p-5h": FIVE_HOURS_MS, "gemini-weekly": WEEK_MS, "3p-weekly": WEEK_MS };
64293
+ antigravityQuotaAdapter = {
64294
+ source: ANTIGRAVITY_SOURCE,
64295
+ matches: (baseUrl) => URL.canParse(baseUrl) && new URL(baseUrl).hostname === ANTIGRAVITY_HOST,
64296
+ fetch: async (apiKey, http8, signal, nowMs) => {
64297
+ const headers = { authorization: `Bearer ${apiKey}`, "content-type": "application/json", "user-agent": CCPA_USER_AGENT };
64298
+ const summaryResponse = await http8(ANTIGRAVITY_QUOTA_URL, headers, signal, { method: "POST", body: JSON.stringify({ project: "aicode-consumers" }) });
64299
+ if (summaryResponse.status !== HTTP_OK) {
64300
+ throw new ProviderQuotaError(ANTIGRAVITY_SOURCE, `answered HTTP ${String(summaryResponse.status)}`);
64301
+ }
64302
+ let summaryBody;
64303
+ try {
64304
+ summaryBody = JSON.parse(summaryResponse.text);
64305
+ } catch {
64306
+ throw new ProviderQuotaError(ANTIGRAVITY_SOURCE, "answered something that is not JSON");
64307
+ }
64308
+ const parsed = AntigravitySummarySchema.safeParse(summaryBody);
64309
+ if (!parsed.success) {
64310
+ throw new ProviderQuotaError(ANTIGRAVITY_SOURCE, `answered an unexpected shape: ${parsed.error.issues.map((issue2) => `${issue2.path.join(".")}: ${issue2.message}`).join("; ")}`);
64311
+ }
64312
+ const tokenResponse = await http8(`${GOOGLE_TOKENINFO_URL}?access_token=${encodeURIComponent(apiKey)}`, { accept: "application/json" }, signal);
64313
+ let account;
64314
+ if (tokenResponse.status === HTTP_OK) {
64315
+ try {
64316
+ const tokenInfo = GoogleTokenInfoSchema.parse(JSON.parse(tokenResponse.text));
64317
+ if (tokenInfo.email !== void 0 || tokenInfo.sub !== void 0) {
64318
+ account = { ...tokenInfo.email === void 0 ? {} : { email: tokenInfo.email }, ...tokenInfo.sub === void 0 ? {} : { accountId: tokenInfo.sub } };
64319
+ }
64320
+ } catch {
64321
+ }
64322
+ }
64323
+ return ProviderQuotaSchema.parse({
64324
+ observedAt: new Date(nowMs).toISOString(),
64325
+ source: ANTIGRAVITY_SOURCE,
64326
+ ...account === void 0 ? {} : { account },
64327
+ windows: parsed.data.groups.flatMap(
64328
+ (group) => group.buckets.map((bucket) => ({
64329
+ measures: bucket.bucketId,
64330
+ ...ANTIGRAVITY_WINDOW_MS[bucket.bucketId] === void 0 ? {} : { periodMs: ANTIGRAVITY_WINDOW_MS[bucket.bucketId] },
64331
+ utilization: bucket.remainingFraction === void 0 ? 0 : 1 - bucket.remainingFraction,
64332
+ ...bucket.resetTime === void 0 ? {} : { resetsAt: bucket.resetTime }
64333
+ }))
64334
+ )
64335
+ });
64336
+ }
64337
+ };
64338
+ PROVIDER_QUOTA_ADAPTERS = [zaiQuotaAdapter, openRouterQuotaAdapter, antigravityQuotaAdapter];
64123
64339
  }
64124
64340
  });
64125
64341
 
@@ -64194,11 +64410,15 @@ function createQuotaRefresher(deps) {
64194
64410
  function createProviderLookup(ports) {
64195
64411
  return (name) => {
64196
64412
  const definition = loadProvider(ports.providersDir, name, ports.fs);
64197
- if (definition === void 0 || !isHttpProvider(definition)) {
64413
+ if (definition === void 0) {
64414
+ return void 0;
64415
+ }
64416
+ const baseUrl = isAntigravityProvider(definition) ? "https://daily-cloudcode-pa.googleapis.com" : isHttpProvider(definition) ? definition.baseUrl : void 0;
64417
+ if (baseUrl === void 0) {
64198
64418
  return void 0;
64199
64419
  }
64200
64420
  return {
64201
- baseUrl: definition.baseUrl,
64421
+ baseUrl,
64202
64422
  apiKey: () => {
64203
64423
  const resolution = resolveCredential({ credential: definition.credential, env: ports.env, port: ports.credentials, subject: `provider ${name}` });
64204
64424
  if (!resolution.ok) {
@@ -112646,7 +112866,7 @@ function registerCodexCommand(program2, deps) {
112646
112866
  }
112647
112867
 
112648
112868
  // src/frontdoor/commands.ts
112649
- var import_node_crypto23 = require("node:crypto");
112869
+ var import_node_crypto24 = require("node:crypto");
112650
112870
  var import_node_path51 = __toESM(require("node:path"), 1);
112651
112871
  var import_node_fs19 = __toESM(require("node:fs"), 1);
112652
112872
  init_commandDeps();
@@ -113929,11 +114149,11 @@ init_capability();
113929
114149
  init_capture();
113930
114150
 
113931
114151
  // src/frontdoor/connect.ts
113932
- var import_node_crypto17 = require("node:crypto");
114152
+ var import_node_crypto18 = require("node:crypto");
113933
114153
  var fs17 = __toESM(require("node:fs"), 1);
113934
114154
 
113935
114155
  // src/frontdoor/x509.ts
113936
- var import_node_crypto16 = require("node:crypto");
114156
+ var import_node_crypto17 = require("node:crypto");
113937
114157
  var import_node_net = __toESM(require("node:net"), 1);
113938
114158
  var TAG_BOOLEAN = 1;
113939
114159
  var TAG_INTEGER = 2;
@@ -114085,7 +114305,7 @@ function ipBytes(address) {
114085
114305
  return bytes;
114086
114306
  }
114087
114307
  function keyIdentifier(publicKey) {
114088
- return (0, import_node_crypto16.createHash)("sha1").update(publicKey.export({ type: "pkcs1", format: "der" })).digest();
114308
+ return (0, import_node_crypto17.createHash)("sha1").update(publicKey.export({ type: "pkcs1", format: "der" })).digest();
114089
114309
  }
114090
114310
  function readElement(buffer2, offset) {
114091
114311
  const tag = buffer2[offset];
@@ -114131,7 +114351,7 @@ ${body.join("\n")}
114131
114351
  `;
114132
114352
  }
114133
114353
  function randomSerial() {
114134
- const bytes = (0, import_node_crypto16.randomBytes)(SERIAL_NUMBER_BYTES);
114354
+ const bytes = (0, import_node_crypto17.randomBytes)(SERIAL_NUMBER_BYTES);
114135
114355
  bytes[0] = (bytes[0] ?? 0) & BASE_128_PAYLOAD_MASK | HIGH_BIT >> 1;
114136
114356
  return bytes;
114137
114357
  }
@@ -114146,7 +114366,7 @@ function assemble(spec) {
114146
114366
  spec.subjectPublicKey.export({ type: "spki", format: "der" }),
114147
114367
  tlv(TAG_EXTENSIONS, sequence(...spec.extensions))
114148
114368
  );
114149
- const signature = (0, import_node_crypto16.sign)("sha256", tbs, spec.signingKey);
114369
+ const signature = (0, import_node_crypto17.sign)("sha256", tbs, spec.signingKey);
114150
114370
  return sequence(tbs, SIGNATURE_ALGORITHM, wholeBitString(signature));
114151
114371
  }
114152
114372
  function subjectKeyIdentifierExtension(publicKey) {
@@ -114156,7 +114376,7 @@ function basicConstraintsExtension(isCa) {
114156
114376
  return extension(OID_BASIC_CONSTRAINTS, true, sequence(...isCa ? [boolean4(true)] : []));
114157
114377
  }
114158
114378
  function rsaKeyPair() {
114159
- return (0, import_node_crypto16.generateKeyPairSync)("rsa", { modulusLength: RSA_MODULUS_BITS });
114379
+ return (0, import_node_crypto17.generateKeyPairSync)("rsa", { modulusLength: RSA_MODULUS_BITS });
114160
114380
  }
114161
114381
  function keyPem(privateKey) {
114162
114382
  return privateKey.export({ type: "pkcs8", format: "pem" });
@@ -114180,8 +114400,8 @@ function issueLeafCertificate(ca2, names, notBefore, notAfter) {
114180
114400
  if (commonName === void 0) {
114181
114401
  throw new Error("a leaf certificate needs at least one name");
114182
114402
  }
114183
- const caCertificate = new import_node_crypto16.X509Certificate(ca2.certPem);
114184
- const caPrivateKey = (0, import_node_crypto16.createPrivateKey)(ca2.keyPem);
114403
+ const caCertificate = new import_node_crypto17.X509Certificate(ca2.certPem);
114404
+ const caPrivateKey = (0, import_node_crypto17.createPrivateKey)(ca2.keyPem);
114185
114405
  const { publicKey, privateKey } = rsaKeyPair();
114186
114406
  const generalNames = names.map((name) => import_node_net.default.isIP(name) === 0 ? tlv(TAG_GENERAL_NAME_DNS, Buffer.from(name, "ascii")) : tlv(TAG_GENERAL_NAME_IP, ipBytes(name)));
114187
114407
  const der = assemble({
@@ -114536,8 +114756,8 @@ function ensureCa(store, generate) {
114536
114756
  }
114537
114757
  function caParses(ca2) {
114538
114758
  try {
114539
- new import_node_crypto17.X509Certificate(ca2.certPem);
114540
- (0, import_node_crypto17.createPrivateKey)(ca2.keyPem);
114759
+ new import_node_crypto18.X509Certificate(ca2.certPem);
114760
+ (0, import_node_crypto18.createPrivateKey)(ca2.keyPem);
114541
114761
  return true;
114542
114762
  } catch {
114543
114763
  return false;
@@ -114864,7 +115084,7 @@ var LiveTaskSchema = external_exports.strictObject({
114864
115084
  observedAt: external_exports.number()
114865
115085
  });
114866
115086
  var SYSTEM_SUBTYPES = ["task_started", "task_progress", "task_updated", "task_notification", "background_tasks_changed"];
114867
- function isRecord3(value2) {
115087
+ function isRecord5(value2) {
114868
115088
  return typeof value2 === "object" && value2 !== null && !Array.isArray(value2);
114869
115089
  }
114870
115090
  function stringField(record2, field) {
@@ -114881,7 +115101,7 @@ function booleanField(record2, field) {
114881
115101
  }
114882
115102
  function usageOf(record2) {
114883
115103
  const raw = record2.usage;
114884
- if (!isRecord3(raw)) {
115104
+ if (!isRecord5(raw)) {
114885
115105
  return void 0;
114886
115106
  }
114887
115107
  const totalTokens = numberField(raw, "total_tokens");
@@ -114913,7 +115133,7 @@ function bounded(book) {
114913
115133
  return book;
114914
115134
  }
114915
115135
  function applyAgentTaskEvent(book, sessionId, payload, observedAt2) {
114916
- if (!isRecord3(payload) || payload.type !== "system") {
115136
+ if (!isRecord5(payload) || payload.type !== "system") {
114917
115137
  return book;
114918
115138
  }
114919
115139
  const subtype = payload.subtype;
@@ -114929,8 +115149,8 @@ function applyAgentTaskEvent(book, sessionId, payload, observedAt2) {
114929
115149
  if (subtype === "background_tasks_changed") {
114930
115150
  const tasks = Array.isArray(payload.tasks) ? payload.tasks : [];
114931
115151
  for (const raw of tasks) {
114932
- const taskId2 = isRecord3(raw) ? stringField(raw, "task_id") : void 0;
114933
- if (isRecord3(raw) && taskId2 !== void 0) {
115152
+ const taskId2 = isRecord5(raw) ? stringField(raw, "task_id") : void 0;
115153
+ if (isRecord5(raw) && taskId2 !== void 0) {
114934
115154
  upsert(taskId2, { runId: stringField(raw, "run_id"), taskType: stringField(raw, "task_type"), description: stringField(raw, "description") });
114935
115155
  }
114936
115156
  }
@@ -114953,7 +115173,7 @@ function applyAgentTaskEvent(book, sessionId, payload, observedAt2) {
114953
115173
  } else if (subtype === "task_progress") {
114954
115174
  upsert(taskId, { ...common, subagentType: stringField(payload, "subagent_type"), lastToolName: stringField(payload, "last_tool_name"), usage: usageOf(payload) });
114955
115175
  } else if (subtype === "task_updated") {
114956
- const patch = isRecord3(payload.patch) ? payload.patch : {};
115176
+ const patch = isRecord5(payload.patch) ? payload.patch : {};
114957
115177
  upsert(taskId, { runId: stringField(payload, "run_id"), status: stringField(patch, "status") });
114958
115178
  } else {
114959
115179
  upsert(taskId, { ...common, status: stringField(payload, "status"), outputFile: stringField(payload, "output_file"), summary: stringField(payload, "summary"), usage: usageOf(payload) });
@@ -115035,7 +115255,7 @@ function sessionCreateId(body) {
115035
115255
  const id2 = session.id;
115036
115256
  return typeof id2 === "string" && id2.startsWith(RC_SESSION_ID_PREFIX) ? id2 : void 0;
115037
115257
  }
115038
- function isRecord4(value2) {
115258
+ function isRecord6(value2) {
115039
115259
  return typeof value2 === "object" && value2 !== null && !Array.isArray(value2);
115040
115260
  }
115041
115261
  function parseJsonObject(body) {
@@ -115045,7 +115265,7 @@ function parseJsonObject(body) {
115045
115265
  } catch {
115046
115266
  return void 0;
115047
115267
  }
115048
- return isRecord4(parsed) ? parsed : void 0;
115268
+ return isRecord6(parsed) ? parsed : void 0;
115049
115269
  }
115050
115270
  function nonEmptyString(record2, field) {
115051
115271
  const value2 = record2 === void 0 ? void 0 : record2[field];
@@ -115066,11 +115286,11 @@ function payloadEventsOf(body) {
115066
115286
  }
115067
115287
  const payloads = [];
115068
115288
  for (const event of events) {
115069
- if (!isRecord4(event)) {
115289
+ if (!isRecord6(event)) {
115070
115290
  continue;
115071
115291
  }
115072
115292
  const payload = event.payload;
115073
- if (!isRecord4(payload)) {
115293
+ if (!isRecord6(payload)) {
115074
115294
  continue;
115075
115295
  }
115076
115296
  payloads.push(payload);
@@ -115085,7 +115305,7 @@ function pendingOfControlRequestPayload(payload) {
115085
115305
  if (requestId === void 0) {
115086
115306
  return void 0;
115087
115307
  }
115088
- const request7 = isRecord4(payload.request) ? payload.request : void 0;
115308
+ const request7 = isRecord6(payload.request) ? payload.request : void 0;
115089
115309
  const subtype = nonEmptyString(request7, "subtype");
115090
115310
  const type2 = subtype ?? "control_request";
115091
115311
  let summary = "";
@@ -115102,7 +115322,7 @@ function answeredRequestIdsOfControlResponsePayload(payload) {
115102
115322
  if (payload.type !== "control_response") {
115103
115323
  return [];
115104
115324
  }
115105
- const response = isRecord4(payload.response) ? payload.response : void 0;
115325
+ const response = isRecord6(payload.response) ? payload.response : void 0;
115106
115326
  const id2 = nonEmptyString(response, "request_id") ?? nonEmptyString(payload, "request_id") ?? nonEmptyString(payload, "uuid");
115107
115327
  return id2 === void 0 ? [] : [id2];
115108
115328
  }
@@ -115331,7 +115551,7 @@ function createRcSessionTracker(deps) {
115331
115551
  return;
115332
115552
  }
115333
115553
  entry.sequenceNum = entry.sequenceNum === void 0 || event.sequence_num > entry.sequenceNum ? event.sequence_num : entry.sequenceNum;
115334
- if (!isRecord4(event.payload)) {
115554
+ if (!isRecord6(event.payload)) {
115335
115555
  return;
115336
115556
  }
115337
115557
  entry.liveTasks = applyAgentTaskEvent(entry.liveTasks, sessionId, event.payload, deps.now());
@@ -120209,7 +120429,7 @@ var HTTP_METHODS_UP_TO_V31 = [
120209
120429
  function operationFields(convert) {
120210
120430
  return Object.fromEntries(HTTP_METHODS_UP_TO_V31.map((method) => [method, convert]));
120211
120431
  }
120212
- function isRecord5(value2) {
120432
+ function isRecord7(value2) {
120213
120433
  if (typeof value2 !== "object" || value2 === null) {
120214
120434
  return false;
120215
120435
  }
@@ -120229,7 +120449,7 @@ function setOwn2(object3, key, value2) {
120229
120449
  }
120230
120450
  }
120231
120451
  function cloneValue(value2, seen) {
120232
- if (!(Array.isArray(value2) || isRecord5(value2))) {
120452
+ if (!(Array.isArray(value2) || isRecord7(value2))) {
120233
120453
  return value2;
120234
120454
  }
120235
120455
  const existing = seen.get(value2);
@@ -120252,14 +120472,14 @@ function cloneValue(value2, seen) {
120252
120472
  return out;
120253
120473
  }
120254
120474
  function deepClone(value2) {
120255
- if (!(Array.isArray(value2) || isRecord5(value2))) {
120475
+ if (!(Array.isArray(value2) || isRecord7(value2))) {
120256
120476
  return value2;
120257
120477
  }
120258
120478
  return cloneValue(value2, /* @__PURE__ */ new WeakMap());
120259
120479
  }
120260
120480
  var converting = /* @__PURE__ */ new WeakMap();
120261
120481
  function convertRecord(value2, fields, finish) {
120262
- if (!isRecord5(value2)) {
120482
+ if (!isRecord7(value2)) {
120263
120483
  return deepClone(value2);
120264
120484
  }
120265
120485
  const inProgress = converting.get(value2);
@@ -120285,7 +120505,7 @@ function convertRecord(value2, fields, finish) {
120285
120505
  }
120286
120506
  }
120287
120507
  function mapRecord(value2, convert) {
120288
- if (!isRecord5(value2)) {
120508
+ if (!isRecord7(value2)) {
120289
120509
  return deepClone(value2);
120290
120510
  }
120291
120511
  const out = {};
@@ -120304,7 +120524,7 @@ function mapArray(value2, convert) {
120304
120524
  return value2.map((item) => convert(item)).filter((item) => item !== DROP);
120305
120525
  }
120306
120526
  function getRef(value2) {
120307
- if (isRecord5(value2) && typeof value2.$ref === "string") {
120527
+ if (isRecord7(value2) && typeof value2.$ref === "string") {
120308
120528
  return value2.$ref;
120309
120529
  }
120310
120530
  return void 0;
@@ -120510,7 +120730,7 @@ function convertSchema2(schema) {
120510
120730
  if (schema === false) {
120511
120731
  return { not: {} };
120512
120732
  }
120513
- if (isRecord5(schema) && typeof schema.$ref === "string" && Object.keys(schema).length === 1) {
120733
+ if (isRecord7(schema) && typeof schema.$ref === "string" && Object.keys(schema).length === 1) {
120514
120734
  return { $ref: schema.$ref };
120515
120735
  }
120516
120736
  return convertRecord(schema, SCHEMA_FIELDS, finishSchema);
@@ -120522,7 +120742,7 @@ function resolveSchemeType(name, schemes, seen) {
120522
120742
  return void 0;
120523
120743
  }
120524
120744
  const scheme = schemes[name];
120525
- if (!isRecord5(scheme)) {
120745
+ if (!isRecord7(scheme)) {
120526
120746
  return void 0;
120527
120747
  }
120528
120748
  if (typeof scheme.type === "string") {
@@ -120539,11 +120759,11 @@ function resolveSchemeType(name, schemes, seen) {
120539
120759
  return void 0;
120540
120760
  }
120541
120761
  function createContext(spec) {
120542
- const components = isRecord5(spec) ? spec.components : void 0;
120543
- const pathItems = isRecord5(components) ? components.pathItems : void 0;
120544
- const schemes = isRecord5(components) ? components.securitySchemes : void 0;
120762
+ const components = isRecord7(spec) ? spec.components : void 0;
120763
+ const pathItems = isRecord7(components) ? components.pathItems : void 0;
120764
+ const schemes = isRecord7(components) ? components.securitySchemes : void 0;
120545
120765
  const schemeTypes = /* @__PURE__ */ new Map();
120546
- if (isRecord5(schemes)) {
120766
+ if (isRecord7(schemes)) {
120547
120767
  for (const name of Object.keys(schemes)) {
120548
120768
  const type2 = resolveSchemeType(name, schemes, /* @__PURE__ */ new Set());
120549
120769
  if (type2 !== void 0) {
@@ -120553,7 +120773,7 @@ function createContext(spec) {
120553
120773
  }
120554
120774
  return {
120555
120775
  inlining: /* @__PURE__ */ new Set(),
120556
- pathItems: isRecord5(pathItems) ? pathItems : void 0,
120776
+ pathItems: isRecord7(pathItems) ? pathItems : void 0,
120557
120777
  schemeTypes
120558
120778
  };
120559
120779
  }
@@ -120561,7 +120781,7 @@ function isMutualTls(name, context) {
120561
120781
  return context.schemeTypes.get(name) === "mutualTLS";
120562
120782
  }
120563
120783
  function convertRequirement(value2, context) {
120564
- if (!isRecord5(value2)) {
120784
+ if (!isRecord7(value2)) {
120565
120785
  return deepClone(value2);
120566
120786
  }
120567
120787
  const entries = Object.entries(value2);
@@ -120661,10 +120881,10 @@ function resolvePathItemRef(value2, context) {
120661
120881
  return void 0;
120662
120882
  }
120663
120883
  const target = context.pathItems[name];
120664
- return isRecord5(target) ? [name, target] : void 0;
120884
+ return isRecord7(target) ? [name, target] : void 0;
120665
120885
  }
120666
120886
  function convertPathItem(value2, context) {
120667
- if (!isRecord5(value2)) {
120887
+ if (!isRecord7(value2)) {
120668
120888
  return deepClone(value2);
120669
120889
  }
120670
120890
  const resolved = resolvePathItemRef(value2, context);
@@ -120764,7 +120984,7 @@ function convertExample(value2) {
120764
120984
  });
120765
120985
  }
120766
120986
  function isQuerystringParameter(value2) {
120767
- return isRecord5(value2) && value2.in === "querystring";
120987
+ return isRecord7(value2) && value2.in === "querystring";
120768
120988
  }
120769
120989
  function isRemovedRef(value2, removed) {
120770
120990
  const ref = getRef(value2);
@@ -120780,7 +121000,7 @@ function convertParameterOrHeader2(value2, context) {
120780
121000
  style: (item) => item === "cookie" ? DROP : deepClone(item)
120781
121001
  },
120782
121002
  (out, parameter) => {
120783
- const lostContent = isRecord5(parameter.content) && Object.keys(parameter.content).length > 0 && isRecord5(out.content) && Object.keys(out.content).length === 0;
121003
+ const lostContent = isRecord7(parameter.content) && Object.keys(parameter.content).length > 0 && isRecord7(out.content) && Object.keys(out.content).length === 0;
120784
121004
  return lostContent ? DROP : out;
120785
121005
  }
120786
121006
  );
@@ -120901,7 +121121,7 @@ function convertComponents2(value2, context) {
120901
121121
  });
120902
121122
  }
120903
121123
  function losesEntireContent(value2, mediaTypes) {
120904
- if (!(isRecord5(value2) && isRecord5(value2.content))) {
121124
+ if (!(isRecord7(value2) && isRecord7(value2.content))) {
120905
121125
  return false;
120906
121126
  }
120907
121127
  const entries = Object.values(value2.content);
@@ -120909,7 +121129,7 @@ function losesEntireContent(value2, mediaTypes) {
120909
121129
  }
120910
121130
  function indexRemovedComponentRefs(map2, prefix, mediaTypes, isDirectlyRemoved) {
120911
121131
  const removed = /* @__PURE__ */ new Set();
120912
- if (!isRecord5(map2)) {
121132
+ if (!isRecord7(map2)) {
120913
121133
  return removed;
120914
121134
  }
120915
121135
  const entries = Object.entries(map2);
@@ -120931,12 +121151,12 @@ function indexRemovedComponentRefs(map2, prefix, mediaTypes, isDirectlyRemoved)
120931
121151
  return removed;
120932
121152
  }
120933
121153
  function createContext2(spec) {
120934
- const components = isRecord5(spec) ? spec.components : void 0;
120935
- const mediaTypes = isRecord5(components) && isRecord5(components.mediaTypes) ? components.mediaTypes : void 0;
121154
+ const components = isRecord7(spec) ? spec.components : void 0;
121155
+ const mediaTypes = isRecord7(components) && isRecord7(components.mediaTypes) ? components.mediaTypes : void 0;
120936
121156
  return {
120937
121157
  mediaTypes,
120938
- removedHeaderRefs: indexRemovedComponentRefs(isRecord5(components) ? components.headers : void 0, HEADERS_REF_PREFIX, mediaTypes, () => false),
120939
- removedParameterRefs: indexRemovedComponentRefs(isRecord5(components) ? components.parameters : void 0, PARAMETERS_REF_PREFIX, mediaTypes, isQuerystringParameter)
121158
+ removedHeaderRefs: indexRemovedComponentRefs(isRecord7(components) ? components.headers : void 0, HEADERS_REF_PREFIX, mediaTypes, () => false),
121159
+ removedParameterRefs: indexRemovedComponentRefs(isRecord7(components) ? components.parameters : void 0, PARAMETERS_REF_PREFIX, mediaTypes, isQuerystringParameter)
120940
121160
  };
120941
121161
  }
120942
121162
  function convertJsonSchemaDialect(value2) {
@@ -126705,7 +126925,7 @@ var import_consumers = require("node:stream/consumers");
126705
126925
  init_route();
126706
126926
 
126707
126927
  // src/frontdoor/lineage.ts
126708
- var import_node_crypto18 = require("node:crypto");
126928
+ var import_node_crypto19 = require("node:crypto");
126709
126929
  var CACHE_MARKER_KEY = '"cache_control"';
126710
126930
  var THREAD_MEMBER_KEYS = /* @__PURE__ */ new Set(['"model"', '"system"', '"tools"']);
126711
126931
  var MESSAGES_KEY = '"messages"';
@@ -126782,8 +127002,8 @@ function nextToken(body, from) {
126782
127002
  return SCALAR;
126783
127003
  }
126784
127004
  function walk(body, hashing, parentAfter) {
126785
- const thread = (0, import_node_crypto18.createHash)("sha256");
126786
- const messages = (0, import_node_crypto18.createHash)("sha256");
127005
+ const thread = (0, import_node_crypto19.createHash)("sha256");
127006
+ const messages = (0, import_node_crypto19.createHash)("sha256");
126787
127007
  let parentDigest;
126788
127008
  let elements = 0;
126789
127009
  let depth = 0;
@@ -126904,7 +127124,7 @@ function lineageOf(body) {
126904
127124
  }
126905
127125
  const parentAfter = counted.elements > MESSAGES_PER_TURN ? counted.elements - MESSAGES_PER_TURN : void 0;
126906
127126
  const hashed = walk(body, true, parentAfter);
126907
- const combine = (messagesDigest) => (0, import_node_crypto18.createHash)("sha256").update(hashed.threadDigest).update(messagesDigest).digest("hex");
127127
+ const combine = (messagesDigest) => (0, import_node_crypto19.createHash)("sha256").update(hashed.threadDigest).update(messagesDigest).digest("hex");
126908
127128
  return { ownKey: combine(hashed.messagesDigest), parentKey: hashed.parentDigest === void 0 ? void 0 : combine(hashed.parentDigest) };
126909
127129
  }
126910
127130
 
@@ -127289,7 +127509,7 @@ init_load();
127289
127509
  init_schema();
127290
127510
 
127291
127511
  // src/codex/translate.ts
127292
- var import_node_crypto19 = require("node:crypto");
127512
+ var import_node_crypto20 = require("node:crypto");
127293
127513
  init_schema();
127294
127514
 
127295
127515
  // src/codex/anthropic.ts
@@ -127404,7 +127624,7 @@ function shortToolName(name, names) {
127404
127624
  if (name.length <= CODEX_TOOL_NAME_LIMIT) {
127405
127625
  return name;
127406
127626
  }
127407
- const hash2 = (0, import_node_crypto19.createHash)("sha256").update(name).digest("hex").slice(0, TOOL_NAME_HASH_CHARS);
127627
+ const hash2 = (0, import_node_crypto20.createHash)("sha256").update(name).digest("hex").slice(0, TOOL_NAME_HASH_CHARS);
127408
127628
  const shortened = `${name.slice(0, CODEX_TOOL_NAME_LIMIT - TOOL_NAME_HASH_CHARS - 1)}_${hash2}`;
127409
127629
  names.set(shortened, name);
127410
127630
  return shortened;
@@ -127529,7 +127749,25 @@ function translateRequest(body, config2) {
127529
127749
  }
127530
127750
 
127531
127751
  // src/antigravity/translate.ts
127532
- var import_node_crypto20 = require("node:crypto");
127752
+ var import_node_crypto21 = require("node:crypto");
127753
+
127754
+ // src/antigravity/signatures.ts
127755
+ var MAX_REMEMBERED = 1024;
127756
+ var signatures = /* @__PURE__ */ new Map();
127757
+ function rememberToolCallSignature(toolUseId, signature) {
127758
+ signatures.set(toolUseId, signature);
127759
+ if (signatures.size > MAX_REMEMBERED) {
127760
+ const oldest = signatures.keys().next();
127761
+ if (oldest.done !== true) {
127762
+ signatures.delete(oldest.value);
127763
+ }
127764
+ }
127765
+ }
127766
+ function toolCallSignatureOf(toolUseId) {
127767
+ return signatures.get(toolUseId);
127768
+ }
127769
+
127770
+ // src/antigravity/translate.ts
127533
127771
  init_schema();
127534
127772
  function resolveAntigravityConfig(config2) {
127535
127773
  const overrides = config2?.models;
@@ -127596,7 +127834,7 @@ function shortToolName2(name, names) {
127596
127834
  if (sanitized.length <= ANTIGRAVITY_TOOL_NAME_LIMIT) {
127597
127835
  result = sanitized;
127598
127836
  } else {
127599
- const hash2 = (0, import_node_crypto20.createHash)("sha256").update(name).digest("hex").slice(0, TOOL_NAME_HASH_CHARS2);
127837
+ const hash2 = (0, import_node_crypto21.createHash)("sha256").update(name).digest("hex").slice(0, TOOL_NAME_HASH_CHARS2);
127600
127838
  const prefix = sanitized.slice(0, ANTIGRAVITY_TOOL_NAME_LIMIT - TOOL_NAME_HASH_CHARS2 - 1);
127601
127839
  result = `${prefix}_${hash2}`;
127602
127840
  }
@@ -127625,7 +127863,7 @@ function turnBlocks2(message) {
127625
127863
  }
127626
127864
  return blocks.map((block2) => isTextBlock(block2) ? { ...block2, text: systemReminder2(block2.text) } : block2);
127627
127865
  }
127628
- function isRecord6(value2) {
127866
+ function isRecord8(value2) {
127629
127867
  return typeof value2 === "object" && value2 !== null && !Array.isArray(value2);
127630
127868
  }
127631
127869
  function messagesToGeminiContents(messages, names, toolIdToName) {
@@ -127667,11 +127905,14 @@ function messagesToGeminiContents(messages, names, toolIdToName) {
127667
127905
  } else if (isToolUseBlock(block2)) {
127668
127906
  const sanitizedName = shortToolName2(block2.name, names);
127669
127907
  toolIdToName.set(block2.id, sanitizedName);
127908
+ const signature = toolCallSignatureOf(block2.id);
127670
127909
  ensureRole("model").push({
127671
127910
  functionCall: {
127672
127911
  name: sanitizedName,
127673
- args: isRecord6(block2.input) ? block2.input : {}
127674
- }
127912
+ args: isRecord8(block2.input) ? block2.input : {}
127913
+ },
127914
+ // The relay remembered the signature the backend attached to this exact call; echoing it back is what the backend requires of a repeated function call.
127915
+ ...signature === void 0 ? {} : { thoughtSignature: signature }
127675
127916
  });
127676
127917
  } else if (isToolResultBlock(block2)) {
127677
127918
  const toolName = toolIdToName.get(block2.tool_use_id) ?? "unknown_tool";
@@ -127688,21 +127929,110 @@ function messagesToGeminiContents(messages, names, toolIdToName) {
127688
127929
  return contents;
127689
127930
  }
127690
127931
  var EMPTY_SCHEMA = { type: "object", properties: {} };
127932
+ var GEMINI_SCHEMA_KEYS = /* @__PURE__ */ new Set(["type", "format", "description", "nullable", "enum", "anyOf", "items", "properties", "required", "minimum", "maximum", "minItems", "maxItems"]);
127933
+ function describeSchemaValue(node2) {
127934
+ if (!isRecord8(node2)) {
127935
+ return "any value";
127936
+ }
127937
+ const type2 = node2.type;
127938
+ const name = typeof type2 === "string" ? type2 : Array.isArray(type2) && typeof type2[0] === "string" ? type2[0] : "value";
127939
+ if (name === "array") {
127940
+ return `a list of ${describeSchemaValue(node2.items)}`;
127941
+ }
127942
+ return name === "object" ? "an object" : `a ${name}`;
127943
+ }
127944
+ function toGeminiSchema(node2) {
127945
+ if (!isRecord8(node2)) {
127946
+ return node2;
127947
+ }
127948
+ const out = {};
127949
+ const notes = [];
127950
+ let nullable2 = false;
127951
+ for (const [key, value2] of Object.entries(node2)) {
127952
+ if (key === "type" && Array.isArray(value2)) {
127953
+ const named = value2.filter((entry) => entry !== "null");
127954
+ if (named.length > 0 && typeof named[0] === "string") {
127955
+ out.type = named[0];
127956
+ }
127957
+ nullable2 = value2.includes("null");
127958
+ continue;
127959
+ }
127960
+ if (!GEMINI_SCHEMA_KEYS.has(key)) {
127961
+ if (key === "additionalProperties" && value2 !== false) {
127962
+ notes.push(`Each value is ${describeSchemaValue(value2)}.`);
127963
+ } else if (key === "propertyNames" && isRecord8(value2) && typeof value2.pattern === "string") {
127964
+ notes.push(`Keys match ${value2.pattern}.`);
127965
+ }
127966
+ continue;
127967
+ }
127968
+ out[key] = value2;
127969
+ }
127970
+ if (out.type === "null") {
127971
+ delete out.type;
127972
+ }
127973
+ if (nullable2 && out.type !== void 0) {
127974
+ out.nullable = true;
127975
+ }
127976
+ if (notes.length > 0) {
127977
+ const description = typeof out.description === "string" ? out.description : "";
127978
+ out.description = `${description}${description === "" ? "" : " "}${notes.join(" ")}`;
127979
+ }
127980
+ if ("properties" in out && isRecord8(out.properties)) {
127981
+ out.properties = Object.fromEntries(Object.entries(out.properties).map(([name, child]) => [name, toGeminiSchema(child)]));
127982
+ }
127983
+ if ("items" in out) {
127984
+ out.items = toGeminiSchema(out.items);
127985
+ } else if (out.type === "array") {
127986
+ out.items = {};
127987
+ }
127988
+ if (Array.isArray(out.anyOf)) {
127989
+ out.anyOf = out.anyOf.map(toGeminiSchema);
127990
+ }
127991
+ return out;
127992
+ }
127691
127993
  function mapTools2(tools, names) {
127692
127994
  if (tools === void 0 || tools.length === 0) {
127693
127995
  return void 0;
127694
127996
  }
127695
- const declarations = tools.map((tool) => ({
127696
- name: shortToolName2(tool.name, names),
127697
- description: tool.description,
127698
- parameters: tool.input_schema ?? EMPTY_SCHEMA
127699
- }));
127997
+ const declarations = tools.map((tool) => {
127998
+ const converted = tool.input_schema === void 0 ? void 0 : toGeminiSchema(tool.input_schema);
127999
+ return {
128000
+ name: shortToolName2(tool.name, names),
128001
+ description: tool.description,
128002
+ parameters: isRecord8(converted) ? converted : EMPTY_SCHEMA
128003
+ };
128004
+ });
127700
128005
  return [{ functionDeclarations: declarations }];
127701
128006
  }
128007
+ var EFFORT_SUFFIXES = /* @__PURE__ */ new Set(["low", "medium", "high"]);
128008
+ function effortSuffixOf(level) {
128009
+ if (level === "medium") {
128010
+ return "medium";
128011
+ }
128012
+ return level === "none" || level === "low" ? "low" : "high";
128013
+ }
128014
+ function splitEffortSuffix(model) {
128015
+ const index = model.lastIndexOf("-");
128016
+ if (index === -1) {
128017
+ return void 0;
128018
+ }
128019
+ const suffix = model.slice(index + 1);
128020
+ return EFFORT_SUFFIXES.has(suffix) ? { base: model.slice(0, index), suffix } : void 0;
128021
+ }
128022
+ function completeEffortSuffix(model, request7, config2) {
128023
+ if (splitEffortSuffix(model) !== void 0) {
128024
+ return model;
128025
+ }
128026
+ const configured = [config2.defaultModel, ...Object.values(config2.models)];
128027
+ const effort = request7.output_config?.effort;
128028
+ const level = ANTIGRAVITY_EFFORTS.find((candidate) => candidate === effort) ?? config2.effort;
128029
+ const suffixed = `${model}-${effortSuffixOf(level)}`;
128030
+ return configured.some((entry) => entry === suffixed || splitEffortSuffix(entry)?.base === model) ? suffixed : model;
128031
+ }
127702
128032
  function translateRequest2(request7, config2) {
127703
128033
  const toolNames = /* @__PURE__ */ new Map();
127704
128034
  const toolIdToName = /* @__PURE__ */ new Map();
127705
- const model = mapModel2(request7.model ?? "", config2);
128035
+ const model = completeEffortSuffix(mapModel2(request7.model ?? "", config2), request7, config2);
127706
128036
  const thinkingBudget = mapEffort2(request7, config2);
127707
128037
  const systemInstruction = systemToInstruction(request7.system);
127708
128038
  const contents = messagesToGeminiContents(request7.messages, toolNames, toolIdToName);
@@ -127720,6 +128050,190 @@ function translateRequest2(request7, config2) {
127720
128050
  };
127721
128051
  }
127722
128052
 
128053
+ // src/antigravity/quota.ts
128054
+ init_cloudUpstream();
128055
+ var MS_PER_SECOND8 = 1e3;
128056
+ var DEFAULT_RETRY_AFTER_SECONDS = 60;
128057
+ var PERCENT_MULTIPLIER = 100;
128058
+ var EXHAUSTED_PERCENT = "100";
128059
+ var GEMINI_5H_KEYS = ["gemini-5h", "gemini_5h", "gemini"];
128060
+ var GEMINI_WEEKLY_KEYS = ["gemini-weekly", "gemini_weekly"];
128061
+ var THIRD_PARTY_5H_KEYS = ["3p-5h", "claude-5h", "3p_5h", "claude_5h", "claude"];
128062
+ var THIRD_PARTY_WEEKLY_KEYS = ["3p-weekly", "claude-weekly", "3p_weekly", "claude_weekly"];
128063
+ function findBucket(quota, keys) {
128064
+ for (const key of keys) {
128065
+ const bucket = quota[key];
128066
+ if (bucket !== void 0) {
128067
+ return bucket;
128068
+ }
128069
+ }
128070
+ return void 0;
128071
+ }
128072
+ function calculateUtilization(remainingFraction) {
128073
+ if (remainingFraction === void 0 || !Number.isFinite(remainingFraction)) {
128074
+ return void 0;
128075
+ }
128076
+ const clampedRem = Math.max(0, Math.min(1, remainingFraction));
128077
+ const used = Math.max(0, 1 - clampedRem);
128078
+ return String(Math.round(used * PERCENT_MULTIPLIER));
128079
+ }
128080
+ function calculateResetTimestamp(nowSec, resetInSeconds) {
128081
+ if (resetInSeconds === void 0 || !Number.isFinite(resetInSeconds) || resetInSeconds < 0) {
128082
+ return void 0;
128083
+ }
128084
+ return String(nowSec + Math.ceil(resetInSeconds));
128085
+ }
128086
+ function parseRetryAfterSeconds(raw, defaultSeconds = DEFAULT_RETRY_AFTER_SECONDS) {
128087
+ if (raw === null || raw === void 0 || raw.trim() === "") {
128088
+ return defaultSeconds;
128089
+ }
128090
+ const numeric = Number(raw);
128091
+ if (Number.isFinite(numeric) && numeric > 0) {
128092
+ return Math.ceil(numeric);
128093
+ }
128094
+ const parsedDate = Date.parse(raw);
128095
+ if (!Number.isNaN(parsedDate)) {
128096
+ const diffSec = Math.ceil((parsedDate - Date.now()) / MS_PER_SECOND8);
128097
+ return Math.max(1, diffSec);
128098
+ }
128099
+ return defaultSeconds;
128100
+ }
128101
+ function unifiedAntigravityQuotaHeaders(params) {
128102
+ const rejected = params.rejected === true;
128103
+ const nowSec = Math.floor(params.nowMs / MS_PER_SECOND8);
128104
+ const headers = {
128105
+ "anthropic-ratelimit-unified-status": rejected ? "rejected" : "allowed"
128106
+ };
128107
+ const modelLower = (params.model ?? "").toLowerCase();
128108
+ const isGemini = modelLower.includes("gemini");
128109
+ const fiveHourKeys = isGemini ? GEMINI_5H_KEYS : THIRD_PARTY_5H_KEYS;
128110
+ const weeklyKeys = isGemini ? GEMINI_WEEKLY_KEYS : THIRD_PARTY_WEEKLY_KEYS;
128111
+ const quota = params.quota ?? {};
128112
+ const b5h = findBucket(quota, fiveHourKeys);
128113
+ const bWk = findBucket(quota, weeklyKeys);
128114
+ const used5h = calculateUtilization(b5h?.remaining_fraction);
128115
+ const reset5h = calculateResetTimestamp(nowSec, b5h?.reset_in_seconds);
128116
+ const used7d = calculateUtilization(bWk?.remaining_fraction);
128117
+ const reset7d = calculateResetTimestamp(nowSec, bWk?.reset_in_seconds);
128118
+ let earliestResetSec;
128119
+ if (used5h !== void 0 && reset5h !== void 0) {
128120
+ headers["anthropic-ratelimit-unified-5h-utilization"] = used5h;
128121
+ headers["anthropic-ratelimit-unified-5h-reset"] = reset5h;
128122
+ earliestResetSec = Number(reset5h);
128123
+ }
128124
+ if (used7d !== void 0 && reset7d !== void 0) {
128125
+ headers["anthropic-ratelimit-unified-7d-utilization"] = used7d;
128126
+ headers["anthropic-ratelimit-unified-7d-reset"] = reset7d;
128127
+ const reset7dSec = Number(reset7d);
128128
+ earliestResetSec = earliestResetSec === void 0 ? reset7dSec : Math.min(earliestResetSec, reset7dSec);
128129
+ }
128130
+ if (rejected) {
128131
+ const retrySec = params.retryAfterSeconds ?? DEFAULT_RETRY_AFTER_SECONDS;
128132
+ const fallbackReset = String(nowSec + retrySec);
128133
+ if (headers["anthropic-ratelimit-unified-5h-utilization"] === void 0) {
128134
+ headers["anthropic-ratelimit-unified-5h-utilization"] = EXHAUSTED_PERCENT;
128135
+ headers["anthropic-ratelimit-unified-5h-reset"] = fallbackReset;
128136
+ }
128137
+ if (headers["anthropic-ratelimit-unified-7d-utilization"] === void 0) {
128138
+ headers["anthropic-ratelimit-unified-7d-utilization"] = EXHAUSTED_PERCENT;
128139
+ headers["anthropic-ratelimit-unified-7d-reset"] = fallbackReset;
128140
+ }
128141
+ earliestResetSec = earliestResetSec === void 0 ? nowSec + retrySec : Math.min(earliestResetSec, nowSec + retrySec);
128142
+ }
128143
+ if (earliestResetSec !== void 0) {
128144
+ headers["anthropic-ratelimit-unified-reset"] = String(earliestResetSec);
128145
+ }
128146
+ return headers;
128147
+ }
128148
+ function isRecord9(value2) {
128149
+ return typeof value2 === "object" && value2 !== null && !Array.isArray(value2);
128150
+ }
128151
+ function bucketToEntry(bucket, nowMs) {
128152
+ if (!isRecord9(bucket) || typeof bucket.bucketId !== "string") {
128153
+ return void 0;
128154
+ }
128155
+ const remainingFraction = typeof bucket.remainingFraction === "number" && Number.isFinite(bucket.remainingFraction) ? bucket.remainingFraction : void 0;
128156
+ const resetMs = typeof bucket.resetTime === "string" ? Date.parse(bucket.resetTime) : Number.NaN;
128157
+ const resetInSeconds = Number.isNaN(resetMs) ? void 0 : Math.max(0, Math.ceil((resetMs - nowMs) / MS_PER_SECOND8));
128158
+ if (remainingFraction === void 0 && resetInSeconds === void 0) {
128159
+ return void 0;
128160
+ }
128161
+ return {
128162
+ key: bucket.bucketId,
128163
+ entry: {
128164
+ ...remainingFraction === void 0 ? {} : { remaining_fraction: remainingFraction },
128165
+ ...resetInSeconds === void 0 ? {} : { reset_in_seconds: resetInSeconds }
128166
+ }
128167
+ };
128168
+ }
128169
+ async function fetchAntigravityQuotaSummary(params) {
128170
+ const fetchFn = params.fetchFn ?? fetch;
128171
+ let response;
128172
+ try {
128173
+ response = await fetchFn(`${params.endpoint ?? CCPA_ENDPOINT}/v1internal:retrieveUserQuotaSummary`, {
128174
+ method: "POST",
128175
+ headers: {
128176
+ "Content-Type": "application/json",
128177
+ Authorization: `Bearer ${params.token}`,
128178
+ "User-Agent": CCPA_USER_AGENT
128179
+ },
128180
+ body: JSON.stringify({ project: params.projectId ?? CCPA_DEFAULT_PROJECT_ID })
128181
+ });
128182
+ } catch {
128183
+ return void 0;
128184
+ }
128185
+ if (!response.ok) {
128186
+ return void 0;
128187
+ }
128188
+ let parsed;
128189
+ try {
128190
+ parsed = await response.json();
128191
+ } catch {
128192
+ return void 0;
128193
+ }
128194
+ if (!isRecord9(parsed) || !Array.isArray(parsed.groups)) {
128195
+ return void 0;
128196
+ }
128197
+ const map2 = {};
128198
+ for (const group of parsed.groups) {
128199
+ if (!isRecord9(group) || !Array.isArray(group.buckets)) {
128200
+ continue;
128201
+ }
128202
+ for (const bucket of group.buckets) {
128203
+ const read = bucketToEntry(bucket, params.nowMs);
128204
+ if (read !== void 0) {
128205
+ map2[read.key] = read.entry;
128206
+ }
128207
+ }
128208
+ }
128209
+ return Object.keys(map2).length > 0 ? map2 : void 0;
128210
+ }
128211
+ var ANTIGRAVITY_QUOTA_REFRESH_MS = 6e4;
128212
+ function createCachedAntigravityQuotaSource(params) {
128213
+ let cachedAt = Number.NEGATIVE_INFINITY;
128214
+ let cached2;
128215
+ let refresh;
128216
+ const refreshMs = params.refreshMs ?? ANTIGRAVITY_QUOTA_REFRESH_MS;
128217
+ const run = async () => {
128218
+ const nowMs = params.now();
128219
+ const read = await params.fetchSummary(nowMs);
128220
+ if (read !== void 0) {
128221
+ cached2 = read;
128222
+ }
128223
+ cachedAt = params.now();
128224
+ };
128225
+ return () => {
128226
+ const nowMs = params.now();
128227
+ if (nowMs - cachedAt < refreshMs) {
128228
+ return cached2;
128229
+ }
128230
+ refresh ??= run().finally(() => {
128231
+ refresh = void 0;
128232
+ });
128233
+ return cached2;
128234
+ };
128235
+ }
128236
+
127723
128237
  // src/frontdoor/providerRoute.ts
127724
128238
  init_credential();
127725
128239
  init_providersStore();
@@ -127856,10 +128370,10 @@ function quotaHeaders(upstream) {
127856
128370
  }
127857
128371
  return headers;
127858
128372
  }
127859
- var EXHAUSTED_PERCENT = "100";
128373
+ var EXHAUSTED_PERCENT2 = "100";
127860
128374
  function unifiedQuotaHeaders(upstream, rejected, quotaError) {
127861
128375
  const headers = { "anthropic-ratelimit-unified-status": rejected ? "rejected" : "allowed" };
127862
- const used7d = upstream.get("x-codex-primary-used-percent") ?? (rejected ? EXHAUSTED_PERCENT : null);
128376
+ const used7d = upstream.get("x-codex-primary-used-percent") ?? (rejected ? EXHAUSTED_PERCENT2 : null);
127863
128377
  const reset7d = upstream.get("x-codex-primary-reset-at") ?? (quotaError?.resets_at === void 0 ? null : String(quotaError.resets_at));
127864
128378
  if (used7d !== null && reset7d !== null) {
127865
128379
  headers["anthropic-ratelimit-unified-7d-utilization"] = used7d;
@@ -127880,17 +128394,17 @@ function unifiedQuotaHeaders(upstream, rejected, quotaError) {
127880
128394
  }
127881
128395
  return headers;
127882
128396
  }
127883
- var MS_PER_SECOND8 = 1e3;
128397
+ var MS_PER_SECOND9 = 1e3;
127884
128398
  function buildUsageSnapshot(upstream, quotaError, nowMs) {
127885
- const used7 = upstream.get("x-codex-primary-used-percent") ?? (quotaError === void 0 ? null : EXHAUSTED_PERCENT);
128399
+ const used7 = upstream.get("x-codex-primary-used-percent") ?? (quotaError === void 0 ? null : EXHAUSTED_PERCENT2);
127886
128400
  const reset7 = upstream.get("x-codex-primary-reset-at") ?? (quotaError?.resets_at === void 0 ? null : String(quotaError.resets_at));
127887
- const sevenDay = used7 !== null && reset7 !== null ? { used_percentage: Number(used7), resets_at: new Date(Number(reset7) * MS_PER_SECOND8).toISOString() } : void 0;
128401
+ const sevenDay = used7 !== null && reset7 !== null ? { used_percentage: Number(used7), resets_at: new Date(Number(reset7) * MS_PER_SECOND9).toISOString() } : void 0;
127888
128402
  let fiveHour;
127889
128403
  if (Number(upstream.get("x-codex-secondary-window-minutes")) > 0) {
127890
128404
  const used5 = upstream.get("x-codex-secondary-used-percent");
127891
128405
  const reset5 = upstream.get("x-codex-secondary-reset-at");
127892
128406
  if (used5 !== null && reset5 !== null) {
127893
- fiveHour = { used_percentage: Number(used5), resets_at: new Date(Number(reset5) * MS_PER_SECOND8).toISOString() };
128407
+ fiveHour = { used_percentage: Number(used5), resets_at: new Date(Number(reset5) * MS_PER_SECOND9).toISOString() };
127894
128408
  }
127895
128409
  }
127896
128410
  if (sevenDay === void 0 && fiveHour === void 0) {
@@ -128313,7 +128827,7 @@ function createCodexRouteMount(ports, upstreamBase, provider) {
128313
128827
  }
128314
128828
 
128315
128829
  // src/antigravity/route.ts
128316
- var import_node_crypto21 = require("node:crypto");
128830
+ var import_node_crypto22 = require("node:crypto");
128317
128831
  init_route();
128318
128832
 
128319
128833
  // src/antigravity/relay.ts
@@ -128384,7 +128898,7 @@ function createAntigravityRelay(params) {
128384
128898
  const candidate = chunk.candidates?.[0];
128385
128899
  if (candidate?.content?.parts !== void 0) {
128386
128900
  for (const part of candidate.content.parts) {
128387
- if ("text" in part && typeof part.text === "string" && part.text.length > 0) {
128901
+ if ("text" in part && typeof part.text === "string" && (part.thoughtSignature === void 0 || part.text.length > 0)) {
128388
128902
  if (activeBlockType !== "text") {
128389
128903
  closeActiveBlock();
128390
128904
  currentBlockIndex += 1;
@@ -128414,6 +128928,9 @@ function createAntigravityRelay(params) {
128414
128928
  const callName = part.functionCall.name;
128415
128929
  const originalName = params.toolNames.get(callName) ?? callName;
128416
128930
  const callId = params.fallbackId();
128931
+ if (typeof part.thoughtSignature === "string") {
128932
+ rememberToolCallSignature(callId, part.thoughtSignature);
128933
+ }
128417
128934
  frames.push({
128418
128935
  event: "content_block_start",
128419
128936
  data: {
@@ -128487,81 +129004,8 @@ function createAntigravityRelay(params) {
128487
129004
  return { pushChunk, finish };
128488
129005
  }
128489
129006
 
128490
- // src/antigravity/cloudUpstream.ts
128491
- var GEMINI_API_BASE_URL = "https://generativelanguage.googleapis.com";
128492
- function buildCloudUrl(config2, model) {
128493
- const { cloud } = config2;
128494
- if (cloud.projectId !== void 0 && cloud.location !== void 0) {
128495
- const base2 = cloud.endpoint ?? `https://${cloud.location}-aiplatform.googleapis.com`;
128496
- return `${base2}/v1/projects/${cloud.projectId}/locations/${cloud.location}/publishers/google/models/${encodeURIComponent(model)}:streamGenerateContent?alt=sse`;
128497
- }
128498
- const base = cloud.endpoint ?? GEMINI_API_BASE_URL;
128499
- return `${base}/v1beta/models/${encodeURIComponent(model)}:streamGenerateContent?alt=sse`;
128500
- }
128501
- function buildCloudHeaders(token, credentialTarget) {
128502
- const headers = {
128503
- "Content-Type": "application/json",
128504
- Accept: "text/event-stream"
128505
- };
128506
- if (credentialTarget === "apiKey") {
128507
- headers["x-goog-api-key"] = token;
128508
- } else {
128509
- headers.Authorization = `Bearer ${token}`;
128510
- }
128511
- return headers;
128512
- }
128513
- var AntigravityUpstreamError = class extends Error {
128514
- status;
128515
- retryAfter;
128516
- constructor(status, message, retryAfter) {
128517
- super(`Google Antigravity API error (${String(status)}): ${message}`);
128518
- this.name = "AntigravityUpstreamError";
128519
- this.status = status;
128520
- this.retryAfter = retryAfter;
128521
- }
128522
- };
128523
- async function* callCloudAntigravity(params, fetchFn = fetch) {
128524
- const url2 = buildCloudUrl(params.config, params.model);
128525
- const headers = buildCloudHeaders(params.token, params.credentialTarget);
128526
- const response = await fetchFn(url2, {
128527
- method: "POST",
128528
- headers,
128529
- body: JSON.stringify(params.request),
128530
- signal: params.signal
128531
- });
128532
- if (!response.ok) {
128533
- const errorText = await response.text();
128534
- const retryAfter = response.headers.get("retry-after");
128535
- throw new AntigravityUpstreamError(response.status, errorText, retryAfter);
128536
- }
128537
- if (response.body === null) {
128538
- return;
128539
- }
128540
- const decoder = new TextDecoder("utf-8");
128541
- let buffer2 = "";
128542
- const sseDataPrefix = "data:";
128543
- for await (const rawChunk of response.body) {
128544
- const chunk = rawChunk instanceof Uint8Array ? rawChunk : Buffer.from(String(rawChunk));
128545
- buffer2 += decoder.decode(chunk, { stream: true });
128546
- const lines = buffer2.split("\n");
128547
- buffer2 = lines.pop() ?? "";
128548
- for (const line of lines) {
128549
- const trimmed = line.trim();
128550
- if (trimmed.startsWith(sseDataPrefix)) {
128551
- const jsonStr = trimmed.slice(sseDataPrefix.length).trim();
128552
- if (jsonStr.length > 0) {
128553
- try {
128554
- const parsed = JSON.parse(jsonStr);
128555
- if (typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)) {
128556
- yield parsed;
128557
- }
128558
- } catch {
128559
- }
128560
- }
128561
- }
128562
- }
128563
- }
128564
- }
129007
+ // src/antigravity/route.ts
129008
+ init_cloudUpstream();
128565
129009
 
128566
129010
  // src/antigravity/localUpstream.ts
128567
129011
  var import_node_child_process6 = require("node:child_process");
@@ -128631,7 +129075,7 @@ var AcpStreamMessageSchema = external_exports.looseObject({
128631
129075
  chunk: external_exports.looseObject({}).optional()
128632
129076
  }).optional()
128633
129077
  });
128634
- function isRecord7(value2) {
129078
+ function isRecord10(value2) {
128635
129079
  return typeof value2 === "object" && value2 !== null && !Array.isArray(value2);
128636
129080
  }
128637
129081
  function normalizeFinishReason(reason) {
@@ -128656,7 +129100,7 @@ function parseJsonRecord(raw) {
128656
129100
  }
128657
129101
  try {
128658
129102
  const parsed = JSON.parse(raw);
128659
- if (isRecord7(parsed)) {
129103
+ if (isRecord10(parsed)) {
128660
129104
  return parsed;
128661
129105
  }
128662
129106
  } catch {
@@ -128742,104 +129186,9 @@ async function* callLocalAntigravity(params) {
128742
129186
  }
128743
129187
  }
128744
129188
 
128745
- // src/antigravity/quota.ts
128746
- var MS_PER_SECOND9 = 1e3;
128747
- var DEFAULT_RETRY_AFTER_SECONDS = 60;
128748
- var PERCENT_MULTIPLIER = 100;
128749
- var EXHAUSTED_PERCENT2 = "100";
128750
- var GEMINI_5H_KEYS = ["gemini-5h", "gemini_5h", "gemini"];
128751
- var GEMINI_WEEKLY_KEYS = ["gemini-weekly", "gemini_weekly"];
128752
- var THIRD_PARTY_5H_KEYS = ["3p-5h", "claude-5h", "3p_5h", "claude_5h", "claude"];
128753
- var THIRD_PARTY_WEEKLY_KEYS = ["3p-weekly", "claude-weekly", "3p_weekly", "claude_weekly"];
128754
- function findBucket(quota, keys) {
128755
- for (const key of keys) {
128756
- const bucket = quota[key];
128757
- if (bucket !== void 0) {
128758
- return bucket;
128759
- }
128760
- }
128761
- return void 0;
128762
- }
128763
- function calculateUtilization(remainingFraction) {
128764
- if (remainingFraction === void 0 || !Number.isFinite(remainingFraction)) {
128765
- return void 0;
128766
- }
128767
- const clampedRem = Math.max(0, Math.min(1, remainingFraction));
128768
- const used = Math.max(0, 1 - clampedRem);
128769
- return String(Math.round(used * PERCENT_MULTIPLIER));
128770
- }
128771
- function calculateResetTimestamp(nowSec, resetInSeconds) {
128772
- if (resetInSeconds === void 0 || !Number.isFinite(resetInSeconds) || resetInSeconds < 0) {
128773
- return void 0;
128774
- }
128775
- return String(nowSec + Math.ceil(resetInSeconds));
128776
- }
128777
- function parseRetryAfterSeconds(raw, defaultSeconds = DEFAULT_RETRY_AFTER_SECONDS) {
128778
- if (raw === null || raw === void 0 || raw.trim() === "") {
128779
- return defaultSeconds;
128780
- }
128781
- const numeric = Number(raw);
128782
- if (Number.isFinite(numeric) && numeric > 0) {
128783
- return Math.ceil(numeric);
128784
- }
128785
- const parsedDate = Date.parse(raw);
128786
- if (!Number.isNaN(parsedDate)) {
128787
- const diffSec = Math.ceil((parsedDate - Date.now()) / MS_PER_SECOND9);
128788
- return Math.max(1, diffSec);
128789
- }
128790
- return defaultSeconds;
128791
- }
128792
- function unifiedAntigravityQuotaHeaders(params) {
128793
- const rejected = params.rejected === true;
128794
- const nowSec = Math.floor(params.nowMs / MS_PER_SECOND9);
128795
- const headers = {
128796
- "anthropic-ratelimit-unified-status": rejected ? "rejected" : "allowed"
128797
- };
128798
- const modelLower = (params.model ?? "").toLowerCase();
128799
- const isGemini = modelLower.includes("gemini");
128800
- const fiveHourKeys = isGemini ? GEMINI_5H_KEYS : THIRD_PARTY_5H_KEYS;
128801
- const weeklyKeys = isGemini ? GEMINI_WEEKLY_KEYS : THIRD_PARTY_WEEKLY_KEYS;
128802
- const quota = params.quota ?? {};
128803
- const b5h = findBucket(quota, fiveHourKeys);
128804
- const bWk = findBucket(quota, weeklyKeys);
128805
- const used5h = calculateUtilization(b5h?.remaining_fraction);
128806
- const reset5h = calculateResetTimestamp(nowSec, b5h?.reset_in_seconds);
128807
- const used7d = calculateUtilization(bWk?.remaining_fraction);
128808
- const reset7d = calculateResetTimestamp(nowSec, bWk?.reset_in_seconds);
128809
- let earliestResetSec;
128810
- if (used5h !== void 0 && reset5h !== void 0) {
128811
- headers["anthropic-ratelimit-unified-5h-utilization"] = used5h;
128812
- headers["anthropic-ratelimit-unified-5h-reset"] = reset5h;
128813
- earliestResetSec = Number(reset5h);
128814
- }
128815
- if (used7d !== void 0 && reset7d !== void 0) {
128816
- headers["anthropic-ratelimit-unified-7d-utilization"] = used7d;
128817
- headers["anthropic-ratelimit-unified-7d-reset"] = reset7d;
128818
- const reset7dSec = Number(reset7d);
128819
- earliestResetSec = earliestResetSec === void 0 ? reset7dSec : Math.min(earliestResetSec, reset7dSec);
128820
- }
128821
- if (rejected) {
128822
- const retrySec = params.retryAfterSeconds ?? DEFAULT_RETRY_AFTER_SECONDS;
128823
- const fallbackReset = String(nowSec + retrySec);
128824
- if (headers["anthropic-ratelimit-unified-5h-utilization"] === void 0) {
128825
- headers["anthropic-ratelimit-unified-5h-utilization"] = EXHAUSTED_PERCENT2;
128826
- headers["anthropic-ratelimit-unified-5h-reset"] = fallbackReset;
128827
- }
128828
- if (headers["anthropic-ratelimit-unified-7d-utilization"] === void 0) {
128829
- headers["anthropic-ratelimit-unified-7d-utilization"] = EXHAUSTED_PERCENT2;
128830
- headers["anthropic-ratelimit-unified-7d-reset"] = fallbackReset;
128831
- }
128832
- earliestResetSec = earliestResetSec === void 0 ? nowSec + retrySec : Math.min(earliestResetSec, nowSec + retrySec);
128833
- }
128834
- if (earliestResetSec !== void 0) {
128835
- headers["anthropic-ratelimit-unified-reset"] = String(earliestResetSec);
128836
- }
128837
- return headers;
128838
- }
128839
-
128840
129189
  // src/antigravity/route.ts
128841
129190
  function createAntigravityRoute(ports) {
128842
- const fallbackId = ports.fallbackId ?? (() => (0, import_node_crypto21.randomUUID)());
129191
+ const fallbackId = ports.fallbackId ?? (() => (0, import_node_crypto22.randomUUID)());
128843
129192
  return async (request7) => {
128844
129193
  await Promise.resolve();
128845
129194
  if (request7.method !== "POST") {
@@ -129240,9 +129589,43 @@ async function scanRequestHead(request7, wholeBody = false) {
129240
129589
  }
129241
129590
 
129242
129591
  // src/frontdoor/providerRoute.ts
129592
+ var isRcSelfHostPath = (path59) => path59 === "/v1/code/sessions" || path59.startsWith("/v1/code/sessions/") || path59 === "/v1/sessions" || path59.startsWith("/v1/sessions/");
129593
+ function scopeSessionProviderPath(request7) {
129594
+ if (request7.session.provider === void 0) {
129595
+ return request7;
129596
+ }
129597
+ const path59 = new URL(request7.url, "http://127.0.0.1").pathname;
129598
+ if (!path59.startsWith("/v1/") || isRcSelfHostPath(path59)) {
129599
+ return request7;
129600
+ }
129601
+ return { ...request7, url: `${PROVIDER_PATH_PREFIX}${encodeURIComponent(request7.session.provider)}${request7.url}` };
129602
+ }
129243
129603
  function createProviderRouteResolver(deps) {
129244
- const isRcSelfHostPath = (path59) => path59 === "/v1/code/sessions" || path59.startsWith("/v1/code/sessions/") || path59 === "/v1/sessions" || path59.startsWith("/v1/sessions/");
129245
129604
  const oauthRoute = createPassthroughRoute("anthropic", { baseUrl: `https://${CONNECT_INTERCEPT_HOST}:${String(HTTPS_PORT)}`, stripPrefix: void 0, headroomUpstream: void 0 });
129605
+ const antigravityQuotaSources = /* @__PURE__ */ new Map();
129606
+ const antigravityQuotaOf = (provider, definition, config2) => {
129607
+ const existing = antigravityQuotaSources.get(provider);
129608
+ if (existing !== void 0) {
129609
+ return existing;
129610
+ }
129611
+ const source = createCachedAntigravityQuotaSource({
129612
+ now: () => Date.now(),
129613
+ fetchSummary: async (nowMs) => {
129614
+ const res = resolveCredential({ credential: definition.credential, env: deps.env, port: deps.credentials, subject: `provider ${provider}` });
129615
+ if (!res.ok) {
129616
+ return void 0;
129617
+ }
129618
+ return fetchAntigravityQuotaSummary({
129619
+ token: res.credential.token,
129620
+ endpoint: config2.cloud.endpoint ?? void 0,
129621
+ projectId: config2.cloud.projectId ?? void 0,
129622
+ nowMs
129623
+ });
129624
+ }
129625
+ });
129626
+ antigravityQuotaSources.set(provider, source);
129627
+ return source;
129628
+ };
129246
129629
  const passthroughByTarget = /* @__PURE__ */ new Map();
129247
129630
  const passthroughFor = (name, target) => {
129248
129631
  const key = `${name}\0${target.baseUrl}\0${target.stripPrefix ?? ""}\0${target.headroomUpstream ?? ""}`;
@@ -129261,9 +129644,6 @@ function createProviderRouteResolver(deps) {
129261
129644
  if (deps.rcSelfHostRoute !== void 0 && isRcSelfHostPath(path59)) {
129262
129645
  return { ok: true, route: deps.rcSelfHostRoute };
129263
129646
  }
129264
- if (request7.session.provider !== void 0 && path59.startsWith("/v1/") && !isRcSelfHostPath(path59)) {
129265
- return resolve2({ ...request7, url: `${PROVIDER_PATH_PREFIX}${encodeURIComponent(request7.session.provider)}${request7.url}` });
129266
- }
129267
129647
  return path59.startsWith("/v1/") ? { ok: true, route: oauthRoute } : { ok: false, status: HTTP_STATUS.notFound, message: `no such endpoint: ${path59}` };
129268
129648
  }
129269
129649
  const { provider } = scoped;
@@ -129313,7 +129693,8 @@ function createProviderRouteResolver(deps) {
129313
129693
  token: res.credential.token,
129314
129694
  credentialTarget: antigravityProvider.credential.target
129315
129695
  };
129316
- }
129696
+ },
129697
+ quotaSource: antigravityQuotaOf(provider, antigravityProvider, config2)
129317
129698
  },
129318
129699
  directOrigin2(deps.directPort()),
129319
129700
  provider
@@ -129343,7 +129724,9 @@ function createProviderRouteResolver(deps) {
129343
129724
  }
129344
129725
  });
129345
129726
  return async (request7) => {
129346
- let current = request7;
129727
+ const scopedRequest = scopeSessionProviderPath(request7);
129728
+ const serveScoped = (resolution) => scopedRequest === request7 ? resolution : { ok: true, route: servingRewritten(resolution.route, scopedRequest) };
129729
+ let current = scopedRequest;
129347
129730
  let replay;
129348
129731
  const visited = /* @__PURE__ */ new Set();
129349
129732
  for (; ; ) {
@@ -129365,7 +129748,7 @@ function createProviderRouteResolver(deps) {
129365
129748
  }
129366
129749
  if (routes === void 0 || routes.length === 0) {
129367
129750
  const resolution = resolve2(current);
129368
- return resolution.ok && replay !== void 0 ? { ok: true, route: servingRewritten(resolution.route, { ...replay, url: current.url }) } : resolution;
129751
+ return resolution.ok && replay !== void 0 ? { ok: true, route: servingRewritten(resolution.route, { ...replay, url: current.url }) } : resolution.ok ? serveScoped(resolution) : resolution;
129369
129752
  }
129370
129753
  const whole = routes.some((entry) => entry.model !== void 0 || referencesFact(entry.when, "request.hasImage"));
129371
129754
  const snapshot = deps.usageSnapshotOf?.(current.session.identity);
@@ -129377,7 +129760,7 @@ function createProviderRouteResolver(deps) {
129377
129760
  const scan = await scanRequestHead(current, whole);
129378
129761
  if (scan.replayed === void 0) {
129379
129762
  const resolution = resolve2(current);
129380
- return resolution.ok && replay !== void 0 ? { ok: true, route: servingRewritten(resolution.route, { ...replay, url: current.url }) } : resolution;
129763
+ return resolution.ok && replay !== void 0 ? { ok: true, route: servingRewritten(resolution.route, { ...replay, url: current.url }) } : resolution.ok ? serveScoped(resolution) : resolution;
129381
129764
  }
129382
129765
  replay = scan.replayed;
129383
129766
  const requestFacts = {
@@ -129439,7 +129822,7 @@ function attachingProviderCredential(route, deps) {
129439
129822
  init_realFrontDoorPort();
129440
129823
 
129441
129824
  // src/frontdoor/rcCommands.ts
129442
- var import_node_crypto22 = require("node:crypto");
129825
+ var import_node_crypto23 = require("node:crypto");
129443
129826
  init_commandDeps();
129444
129827
  init_cliError();
129445
129828
  init_realPorts();
@@ -129478,15 +129861,15 @@ function readFrontDoorControlMaterial(fsPort, paths, purpose) {
129478
129861
 
129479
129862
  // src/frontdoor/rcLiveUsage.ts
129480
129863
  var RC_RATE_LIMIT_EVENT_TYPE = "rate_limit_event";
129481
- function isRecord8(value2) {
129864
+ function isRecord11(value2) {
129482
129865
  return typeof value2 === "object" && value2 !== null && !Array.isArray(value2);
129483
129866
  }
129484
129867
  function rcRateLimitInfoOf(event) {
129485
129868
  const payload = event.envelope.payload;
129486
- if (!isRecord8(payload) || payload.type !== RC_RATE_LIMIT_EVENT_TYPE) {
129869
+ if (!isRecord11(payload) || payload.type !== RC_RATE_LIMIT_EVENT_TYPE) {
129487
129870
  return void 0;
129488
129871
  }
129489
- if (!isRecord8(payload.rate_limit_info)) {
129872
+ if (!isRecord11(payload.rate_limit_info)) {
129490
129873
  return void 0;
129491
129874
  }
129492
129875
  const parsed = RcRateLimitInfoSchema.safeParse(payload.rate_limit_info);
@@ -129522,7 +129905,7 @@ var RC_SELF_HOST_SCOPE_LIST = ["user:profile", "user:inference", "user:sessions:
129522
129905
  var RC_SELF_HOST_OAUTH_TOKEN_TTL_SECONDS = 3600;
129523
129906
  var MS_PER_SECOND10 = 1e3;
129524
129907
  var HTTP_SERVICE_UNAVAILABLE = 503;
129525
- function isRecord9(value2) {
129908
+ function isRecord12(value2) {
129526
129909
  return typeof value2 === "object" && value2 !== null && !Array.isArray(value2);
129527
129910
  }
129528
129911
  function parseJsonObject2(body) {
@@ -129532,7 +129915,7 @@ function parseJsonObject2(body) {
129532
129915
  } catch {
129533
129916
  return void 0;
129534
129917
  }
129535
- return isRecord9(parsed) ? parsed : void 0;
129918
+ return isRecord12(parsed) ? parsed : void 0;
129536
129919
  }
129537
129920
  function growthBookFeatures() {
129538
129921
  return {
@@ -129626,7 +130009,7 @@ var RC_SELF_HOST_RECORD_DIR = "rc-selfhost";
129626
130009
  var RC_SELF_HOST_RECORD_FILE = "credential.json";
129627
130010
  var SELF_HOST_EMAIL = "selfhost@agent-shim.invalid";
129628
130011
  var SELF_HOST_SUBSCRIPTION_TYPE = "max";
129629
- function isRecord10(value2) {
130012
+ function isRecord13(value2) {
129630
130013
  return typeof value2 === "object" && value2 !== null && !Array.isArray(value2);
129631
130014
  }
129632
130015
  function readJsonObject(fs24, file2) {
@@ -129640,7 +130023,7 @@ function readJsonObject(fs24, file2) {
129640
130023
  } catch {
129641
130024
  return void 0;
129642
130025
  }
129643
- return isRecord10(parsed) ? parsed : void 0;
130026
+ return isRecord13(parsed) ? parsed : void 0;
129644
130027
  }
129645
130028
  function readRcSelfHostRecord(fs24, frontdoorDir) {
129646
130029
  const parsed = readJsonObject(fs24, import_node_path49.default.join(frontdoorDir, RC_SELF_HOST_RECORD_DIR, RC_SELF_HOST_RECORD_FILE));
@@ -129664,7 +130047,7 @@ function mintRcSelfHostCredential(deps) {
129664
130047
  const recordFile = import_node_path49.default.join(recordDir, RC_SELF_HOST_RECORD_FILE);
129665
130048
  const previousRecord = readRcSelfHostRecord(deps.fs, deps.frontdoorDir);
129666
130049
  const existingCredentials = readJsonObject(deps.fs, credentialsFile);
129667
- const existingOauth = isRecord10(existingCredentials?.claudeAiOauth) ? existingCredentials.claudeAiOauth : void 0;
130050
+ const existingOauth = isRecord13(existingCredentials?.claudeAiOauth) ? existingCredentials.claudeAiOauth : void 0;
129668
130051
  const existingToken = typeof existingOauth?.accessToken === "string" && existingOauth.accessToken !== "" ? existingOauth.accessToken : void 0;
129669
130052
  const existingIsOwn = existingToken !== void 0 && previousRecord?.accessToken === existingToken;
129670
130053
  if (existingToken !== void 0 && !existingIsOwn && !deps.force) {
@@ -129681,7 +130064,7 @@ function mintRcSelfHostCredential(deps) {
129681
130064
  deps.fs.writeFilePrivate(credentialsFile, `${JSON.stringify({ ...existingCredentials, claudeAiOauth: { accessToken, refreshToken, expiresAt: null, scopes: [...RC_SELF_HOST_SCOPE_LIST], subscriptionType: SELF_HOST_SUBSCRIPTION_TYPE, rateLimitTier: null } }, null, 2)}
129682
130065
  `);
129683
130066
  const claudeJson = readJsonObject(deps.fs, claudeJsonFile) ?? {};
129684
- const existingBlock = (value2) => isRecord10(value2) ? value2 : {};
130067
+ const existingBlock = (value2) => isRecord13(value2) ? value2 : {};
129685
130068
  deps.fs.writeFilePrivate(claudeJsonFile, `${JSON.stringify({
129686
130069
  ...claudeJson,
129687
130070
  oauthAccount: {
@@ -130046,8 +130429,8 @@ function registerRcCommand(frontdoor, paths) {
130046
130429
  identitiesDir: paths.identitiesDir,
130047
130430
  frontdoorDir: paths.frontdoorDir,
130048
130431
  identity,
130049
- newUuid: import_node_crypto22.randomUUID,
130050
- randomToken: () => (0, import_node_crypto22.randomBytes)(MINTED_TOKEN_RANDOM_BYTES).toString("base64url"),
130432
+ newUuid: import_node_crypto23.randomUUID,
130433
+ randomToken: () => (0, import_node_crypto23.randomBytes)(MINTED_TOKEN_RANDOM_BYTES).toString("base64url"),
130051
130434
  force: options.force === true,
130052
130435
  now: () => Date.now()
130053
130436
  });
@@ -130068,11 +130451,11 @@ var import_node_path50 = __toESM(require("node:path"), 1);
130068
130451
  function isSafeSessionId(sessionId) {
130069
130452
  return /^[A-Za-z0-9_-]+$/.test(sessionId);
130070
130453
  }
130071
- function isRecord11(value2) {
130454
+ function isRecord14(value2) {
130072
130455
  return typeof value2 === "object" && value2 !== null && !Array.isArray(value2);
130073
130456
  }
130074
130457
  function credentialOfJson(parsed) {
130075
- if (!isRecord11(parsed)) {
130458
+ if (!isRecord14(parsed)) {
130076
130459
  return void 0;
130077
130460
  }
130078
130461
  const { authorization, anthropicVersion, anthropicClientPlatform } = parsed;
@@ -130102,7 +130485,7 @@ function createRcCredentialStore(fs24, dir) {
130102
130485
  } catch {
130103
130486
  return void 0;
130104
130487
  }
130105
- return isRecord11(parsed) ? parsed : void 0;
130488
+ return isRecord14(parsed) ? parsed : void 0;
130106
130489
  };
130107
130490
  return {
130108
130491
  read: (sessionId) => {
@@ -130670,7 +131053,7 @@ init_capability();
130670
131053
  // src/frontdoor/rcSelfHostEndpoints.ts
130671
131054
  var RC_SOURCE_WORKER = "worker";
130672
131055
  var RC_SOURCE_CLIENT = "client";
130673
- function isRecord12(value2) {
131056
+ function isRecord15(value2) {
130674
131057
  return typeof value2 === "object" && value2 !== null && !Array.isArray(value2);
130675
131058
  }
130676
131059
  function parseJsonObject3(body) {
@@ -130680,7 +131063,7 @@ function parseJsonObject3(body) {
130680
131063
  } catch {
130681
131064
  return void 0;
130682
131065
  }
130683
- return isRecord12(parsed) ? parsed : void 0;
131066
+ return isRecord15(parsed) ? parsed : void 0;
130684
131067
  }
130685
131068
  function nonEmptyString2(record2, field) {
130686
131069
  const value2 = record2 === void 0 ? void 0 : record2[field];
@@ -130754,7 +131137,7 @@ async function serveRcClientChannels(ctx, tail, method, maxBatchEvents) {
130754
131137
  }
130755
131138
  const results = [];
130756
131139
  for (const event of events) {
130757
- if (!isRecord12(event) || !isRecord12(event.payload)) {
131140
+ if (!isRecord15(event) || !isRecord15(event.payload)) {
130758
131141
  await ctx.answerJson(response, HTTP_STATUS.badRequest, { type: "error", error: { type: "invalid_request_error", message: "every event in a teleport write is an object carrying one payload object" } });
130759
131142
  return true;
130760
131143
  }
@@ -130854,7 +131237,7 @@ async function serveRcCompatSessions(ctx, pathname, compatPath) {
130854
131237
  // src/frontdoor/rcSelfHostConversations.ts
130855
131238
  var RC_CONVERSATIONS_PATH_PREFIX = "/v1/code/conversations";
130856
131239
  var RC_CONVERSATION_ID_PREFIX = "conv_";
130857
- function isRecord13(value2) {
131240
+ function isRecord16(value2) {
130858
131241
  return typeof value2 === "object" && value2 !== null && !Array.isArray(value2);
130859
131242
  }
130860
131243
  function parseJsonObject4(body) {
@@ -130864,7 +131247,7 @@ function parseJsonObject4(body) {
130864
131247
  } catch {
130865
131248
  return void 0;
130866
131249
  }
130867
- return isRecord13(parsed) ? parsed : void 0;
131250
+ return isRecord16(parsed) ? parsed : void 0;
130868
131251
  }
130869
131252
  function nonEmptyString3(record2, field) {
130870
131253
  const value2 = record2 === void 0 ? void 0 : record2[field];
@@ -130918,7 +131301,7 @@ async function serveRcConversations(ctx, pathname, method) {
130918
131301
  }
130919
131302
  const results = [];
130920
131303
  for (const event of events) {
130921
- if (!isRecord13(event) || !isRecord13(event.payload)) {
131304
+ if (!isRecord16(event) || !isRecord16(event.payload)) {
130922
131305
  await ctx.answerJson(response, HTTP_STATUS.badRequest, { type: "error", error: { type: "invalid_request_error", message: "every event in a write is an object carrying one payload object" } });
130923
131306
  return;
130924
131307
  }
@@ -131211,7 +131594,7 @@ var RC_SELF_HOST_WORKER_EPOCH = 1;
131211
131594
  var RC_STREAM_EVENT_NAME = "client_event";
131212
131595
  var CONFLICT_REASON_HEADER2 = "x-ccr-conflict-reason";
131213
131596
  var CONFLICT_REASON_EPOCH_STALE = "epoch_stale";
131214
- function isRecord14(value2) {
131597
+ function isRecord17(value2) {
131215
131598
  return typeof value2 === "object" && value2 !== null && !Array.isArray(value2);
131216
131599
  }
131217
131600
  function isWebSearchRefusal(value2) {
@@ -131295,7 +131678,7 @@ function parseJsonObject5(body) {
131295
131678
  } catch {
131296
131679
  return void 0;
131297
131680
  }
131298
- return isRecord14(parsed) ? parsed : void 0;
131681
+ return isRecord17(parsed) ? parsed : void 0;
131299
131682
  }
131300
131683
  function mintWorkerJwt(randomToken, issuedAt) {
131301
131684
  const encode3 = (value2) => Buffer.from(JSON.stringify(value2), "utf8").toString("base64url");
@@ -131555,7 +131938,7 @@ data: ${JSON.stringify(envelope)}
131555
131938
  if (status !== void 0) {
131556
131939
  session.workerStatus = status;
131557
131940
  }
131558
- if (isRecord14(body?.external_metadata)) {
131941
+ if (isRecord17(body?.external_metadata)) {
131559
131942
  session.externalMetadata = body.external_metadata;
131560
131943
  }
131561
131944
  await answerJson2(response, HTTP_STATUS.ok, {});
@@ -131585,7 +131968,7 @@ data: ${JSON.stringify(envelope)}
131585
131968
  }
131586
131969
  const results = [];
131587
131970
  for (const event of events) {
131588
- if (!isRecord14(event) || !isRecord14(event.payload)) {
131971
+ if (!isRecord17(event) || !isRecord17(event.payload)) {
131589
131972
  await answerJson2(response, HTTP_STATUS.badRequest, { type: "error", error: { type: "invalid_request_error", message: "every event in a batch is an object carrying one payload object" } });
131590
131973
  return;
131591
131974
  }
@@ -131618,7 +132001,7 @@ data: ${JSON.stringify(envelope)}
131618
132001
  return;
131619
132002
  }
131620
132003
  for (const event of events) {
131621
- if (isRecord14(event)) {
132004
+ if (isRecord17(event)) {
131622
132005
  session.internalEvents.push({ eventId: deps.newUuid(), body: event });
131623
132006
  }
131624
132007
  }
@@ -131714,7 +132097,7 @@ data: ${JSON.stringify(envelope)}
131714
132097
  }
131715
132098
  const results = [];
131716
132099
  for (const event of events) {
131717
- if (!isRecord14(event) || !isRecord14(event.payload)) {
132100
+ if (!isRecord17(event) || !isRecord17(event.payload)) {
131718
132101
  await answerJson2(response, HTTP_STATUS.badRequest, { type: "error", error: { type: "invalid_request_error", message: "every event in a write is an object carrying one payload object" } });
131719
132102
  return;
131720
132103
  }
@@ -131904,7 +132287,7 @@ function createSseParser() {
131904
132287
  }
131905
132288
  };
131906
132289
  }
131907
- function isRecord15(value2) {
132290
+ function isRecord18(value2) {
131908
132291
  return typeof value2 === "object" && value2 !== null && !Array.isArray(value2);
131909
132292
  }
131910
132293
  function sequenceNumOf(value2) {
@@ -131926,7 +132309,7 @@ function parseRcStreamEnvelope(parsed) {
131926
132309
  } catch {
131927
132310
  return void 0;
131928
132311
  }
131929
- if (!isRecord15(data)) {
132312
+ if (!isRecord18(data)) {
131930
132313
  return void 0;
131931
132314
  }
131932
132315
  const eventType = data.event_type;
@@ -132354,8 +132737,8 @@ init_realPorts();
132354
132737
  init_quotaRefresh();
132355
132738
 
132356
132739
  // src/usage/quotaHttp.ts
132357
- var realQuotaHttpGet = async (url2, headers, signal) => {
132358
- const response = await fetch(url2, { method: "GET", headers: { ...headers }, signal });
132740
+ var realQuotaHttpGet = async (url2, headers, signal, options) => {
132741
+ const response = await fetch(url2, { method: options?.method ?? "GET", headers: { ...headers }, ...options?.body === void 0 ? {} : { body: options.body }, signal });
132359
132742
  return { status: response.status, text: await response.text() };
132360
132743
  };
132361
132744
 
@@ -132433,8 +132816,8 @@ function realFrontDoorSupervisorPorts(paths) {
132433
132816
  };
132434
132817
  const rcSelfHostSurface = rcSelfHost ? createRcSelfHostSurface({
132435
132818
  now: () => Date.now(),
132436
- newUuid: import_node_crypto23.randomUUID,
132437
- randomToken: () => (0, import_node_crypto23.randomBytes)(MINTED_TOKEN_RANDOM_BYTES).toString("base64url"),
132819
+ newUuid: import_node_crypto24.randomUUID,
132820
+ randomToken: () => (0, import_node_crypto24.randomBytes)(MINTED_TOKEN_RANDOM_BYTES).toString("base64url"),
132438
132821
  credentialRecord: () => readRcSelfHostRecord(realFarmFs, paths.frontdoorDir),
132439
132822
  webFetch: realRcWebFetch({ allowPrivate: rcWebFetchAllowsPrivateFromEnv(process.env) }),
132440
132823
  log
@@ -132457,7 +132840,7 @@ function realFrontDoorSupervisorPorts(paths) {
132457
132840
  saveSequenceNum: rcCredentialStore.writeCursor,
132458
132841
  dial: rcSelfHost ? lateRcStreamDial(rcSelfHostDialTarget) : realRcStreamDial(),
132459
132842
  fanout: rcFanout,
132460
- newClientId: import_node_crypto23.randomUUID,
132843
+ newClientId: import_node_crypto24.randomUUID,
132461
132844
  backoffMs: RC_STREAM_BACKOFF_MS,
132462
132845
  sleep: async (ms2) => {
132463
132846
  await new Promise((resolve2) => {
@@ -132469,7 +132852,7 @@ function realFrontDoorSupervisorPorts(paths) {
132469
132852
  }
132470
132853
  });
132471
132854
  const routingSnapshots = /* @__PURE__ */ new Map();
132472
- const rcControlToken = (0, import_node_crypto23.randomUUID)();
132855
+ const rcControlToken = (0, import_node_crypto24.randomUUID)();
132473
132856
  const resolveRoute = rcObservingResolver(
132474
132857
  createProviderRouteResolver({
132475
132858
  fs: realFsPort,
@@ -132585,9 +132968,9 @@ function realFrontDoorSupervisorPorts(paths) {
132585
132968
  now: () => Date.now(),
132586
132969
  headroomSocket: () => headroomSocketTarget(realFarmFs, realHeadroomSocketTrust, paths),
132587
132970
  // The per-generation capability the direct listener demands: held only in this process's memory, so a loopback process that discovers the direct port still cannot use it.
132588
- hopSecret: (0, import_node_crypto23.randomUUID)(),
132971
+ hopSecret: (0, import_node_crypto24.randomUUID)(),
132589
132972
  headroomDecision,
132590
- custody: createCredentialCustody(() => (0, import_node_crypto23.randomUUID)()),
132973
+ custody: createCredentialCustody(() => (0, import_node_crypto24.randomUUID)()),
132591
132974
  log
132592
132975
  });
132593
132976
  const onListenerError = (name) => (error63) => {
@@ -132610,9 +132993,9 @@ function realFrontDoorSupervisorPorts(paths) {
132610
132993
  startProviderListener: async (preferredPort) => {
132611
132994
  const authority = loadCa();
132612
132995
  const rcDial = rcSelfHost ? lateRcEventDial(rcSelfHostDialTarget) : realRcEventDial();
132613
- const rcInject = async (sessionId, text2) => await injectRcUserMessage({ credentialOf: rcTracker.credentialOf, noteSequenceNums: rcTracker.noteSequenceNums, dial: rcDial, newUuid: import_node_crypto23.randomUUID }, sessionId, text2);
132996
+ const rcInject = async (sessionId, text2) => await injectRcUserMessage({ credentialOf: rcTracker.credentialOf, noteSequenceNums: rcTracker.noteSequenceNums, dial: rcDial, newUuid: import_node_crypto24.randomUUID }, sessionId, text2);
132614
132997
  const rcAnswer = async (sessionId, requestId, decision) => await answerRcControlRequest({ credentialOf: rcTracker.credentialOf, pendingOf: (id2) => rcTracker.pendingOf(id2), completePending: rcTracker.completePending, noteSequenceNums: rcTracker.noteSequenceNums, dial: rcDial }, sessionId, requestId, decision);
132615
- const rcControlRequestDeps = { credentialOf: rcTracker.credentialOf, noteSequenceNums: rcTracker.noteSequenceNums, dial: rcDial, newUuid: import_node_crypto23.randomUUID };
132998
+ const rcControlRequestDeps = { credentialOf: rcTracker.credentialOf, noteSequenceNums: rcTracker.noteSequenceNums, dial: rcDial, newUuid: import_node_crypto24.randomUUID };
132616
132999
  const rcInterrupt = async (sessionId) => await interruptRcSession(rcControlRequestDeps, sessionId);
132617
133000
  const rcSetModel = async (sessionId, model) => await setRcSessionModel(rcControlRequestDeps, sessionId, model);
132618
133001
  const rcSetPermissionMode = async (sessionId, mode) => await setRcSessionPermissionMode(rcControlRequestDeps, sessionId, mode);
@@ -132711,7 +133094,7 @@ function realFrontDoorSupervisorPorts(paths) {
132711
133094
  },
132712
133095
  startConnectListener: async (preferredPort) => {
132713
133096
  const wantedTransparentPort = process.env.AGENT_SHIM_TRANSPARENT_SURFACE === void 0 ? void 0 : Number(process.env.AGENT_SHIM_TRANSPARENT_SURFACE);
132714
- const transparentCapability = wantedTransparentPort === void 0 || Number.isNaN(wantedTransparentPort) ? void 0 : (0, import_node_crypto23.randomUUID)();
133097
+ const transparentCapability = wantedTransparentPort === void 0 || Number.isNaN(wantedTransparentPort) ? void 0 : (0, import_node_crypto24.randomUUID)();
132715
133098
  if (transparentCapability !== void 0) {
132716
133099
  writeFrontDoorSession(realFarmFs, paths.frontdoorSessionsDir, { pid: process.pid, startedAt: Date.now(), token: transparentCapability });
132717
133100
  }