pi-provider-antigravity 0.2.1 → 0.3.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/index.js +186 -180
- package/dist/index.js.map +3 -3
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -172,48 +172,85 @@ function parseStoredCredentials(rawApiKey) {
|
|
|
172
172
|
return { token: rawApiKey, projectId: "aicode-consumers" };
|
|
173
173
|
}
|
|
174
174
|
|
|
175
|
-
// src/catalog.ts
|
|
175
|
+
// src/catalog-view.ts
|
|
176
|
+
function formatModelDisplayName(baseId, rawDisplayName) {
|
|
177
|
+
if (rawDisplayName) {
|
|
178
|
+
const cleaned = rawDisplayName.replace(/\s*\([^)]*\)/g, "").trim();
|
|
179
|
+
if (cleaned.length > 0) {
|
|
180
|
+
return cleaned;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
const words = baseId.split("-").map((w) => {
|
|
184
|
+
if (/^\d+(\.\d+)?$/.test(w)) return w;
|
|
185
|
+
return w.charAt(0).toUpperCase() + w.slice(1);
|
|
186
|
+
});
|
|
187
|
+
return words.join(" ");
|
|
188
|
+
}
|
|
189
|
+
function formatTokenCount(n) {
|
|
190
|
+
if (typeof n !== "number") return "n/a";
|
|
191
|
+
if (n % 1048576 === 0) return `${n / 1048576}M`;
|
|
192
|
+
if (n % 1024 === 0) return `${n / 1024}k`;
|
|
193
|
+
if (n % 1e3 === 0) return `${n / 1e3}k`;
|
|
194
|
+
return `${Math.round(n / 1024)}k`;
|
|
195
|
+
}
|
|
196
|
+
function formatModelsList(catalog) {
|
|
197
|
+
const sorts = catalog.agentModelSorts;
|
|
198
|
+
const recommendedOnly = Array.isArray(sorts) && sorts.length > 0;
|
|
199
|
+
const rank = new Map((sorts || []).map((id, i) => [id, i]));
|
|
200
|
+
const models = (recommendedOnly ? catalog.models.filter((m) => rank.has(m.id)) : catalog.models.slice()).sort(
|
|
201
|
+
(a, b) => (rank.get(a.id) ?? Number.MAX_SAFE_INTEGER) - (rank.get(b.id) ?? Number.MAX_SAFE_INTEGER) || a.id.localeCompare(b.id)
|
|
202
|
+
);
|
|
203
|
+
const rows = models.map((m) => {
|
|
204
|
+
const flags = [];
|
|
205
|
+
if (m.supportsThinking) flags.push("thinking");
|
|
206
|
+
if (m.supportsImages) flags.push("images");
|
|
207
|
+
return {
|
|
208
|
+
id: m.id,
|
|
209
|
+
name: formatModelDisplayName(m.id, m.displayName || m.id),
|
|
210
|
+
ctx: `${formatTokenCount(m.maxTokens)}/${formatTokenCount(m.maxOutputTokens)}`,
|
|
211
|
+
feat: flags.length > 0 ? flags.join(", ") : "-",
|
|
212
|
+
rem: typeof m.remainingFraction === "number" ? `${Math.round(m.remainingFraction * 100)}%` : "N/A"
|
|
213
|
+
};
|
|
214
|
+
});
|
|
215
|
+
const headers = { id: "Model", name: "Name", ctx: "Context", feat: "Features", rem: "Rem" };
|
|
216
|
+
const w = {
|
|
217
|
+
id: Math.max(headers.id.length, ...rows.map((r) => r.id.length)),
|
|
218
|
+
name: Math.max(headers.name.length, ...rows.map((r) => r.name.length)),
|
|
219
|
+
ctx: Math.max(headers.ctx.length, ...rows.map((r) => r.ctx.length)),
|
|
220
|
+
feat: Math.max(headers.feat.length, ...rows.map((r) => r.feat.length))
|
|
221
|
+
};
|
|
222
|
+
const lines = [
|
|
223
|
+
`Available Antigravity Models (${models.length}${recommendedOnly ? " recommended" : ""}):`,
|
|
224
|
+
` ${headers.id.padEnd(w.id)} ${headers.name.padEnd(w.name)} ${headers.ctx.padEnd(w.ctx)} ${headers.feat.padEnd(w.feat)} ${headers.rem}`
|
|
225
|
+
];
|
|
226
|
+
for (const r of rows) {
|
|
227
|
+
lines.push(
|
|
228
|
+
` ${r.id.padEnd(w.id)} ${r.name.padEnd(w.name)} ${r.ctx.padEnd(w.ctx)} ${r.feat.padEnd(w.feat)} ${r.rem.padStart(4)}`
|
|
229
|
+
);
|
|
230
|
+
}
|
|
231
|
+
return lines.join("\n");
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// src/model-catalog.ts
|
|
176
235
|
function extractBaseModelId(runtimeId) {
|
|
177
236
|
if (runtimeId === "gemini-pro-agent") return "gemini-3.1-pro";
|
|
178
237
|
if (runtimeId.startsWith("gemini-3.1-pro-")) return "gemini-3.1-pro";
|
|
179
238
|
return runtimeId.replace(/-(?:high|medium|low|tiered|thinking|agent|extra-low)$/, "");
|
|
180
239
|
}
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
"gemini-
|
|
185
|
-
"gemini-
|
|
186
|
-
|
|
187
|
-
"
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
"
|
|
191
|
-
"
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
"gemini-3.6-flash": "MODEL_PLACEHOLDER_M71",
|
|
196
|
-
"gemini-3.6-flash-high": "MODEL_PLACEHOLDER_M71",
|
|
197
|
-
"gemini-3.6-flash-medium": "MODEL_PLACEHOLDER_M72",
|
|
198
|
-
"gemini-3.6-flash-low": "MODEL_PLACEHOLDER_M73",
|
|
199
|
-
// Gemini 3.5 Flash
|
|
200
|
-
"gemini-3.5-flash": "MODEL_PLACEHOLDER_M84",
|
|
201
|
-
"gemini-3.5-flash-low": "MODEL_PLACEHOLDER_M20",
|
|
202
|
-
"gemini-3.5-flash-extra-low": "MODEL_PLACEHOLDER_M187",
|
|
203
|
-
"gemini-3-flash-agent": "MODEL_PLACEHOLDER_M84",
|
|
204
|
-
// Gemini 3.1 Pro
|
|
205
|
-
"gemini-3.1-pro": "MODEL_PLACEHOLDER_M16",
|
|
206
|
-
"gemini-3.1-pro-high": "MODEL_PLACEHOLDER_M37",
|
|
207
|
-
"gemini-3.1-pro-low": "MODEL_PLACEHOLDER_M36",
|
|
208
|
-
"gemini-pro-agent": "MODEL_PLACEHOLDER_M16",
|
|
209
|
-
// Claude
|
|
210
|
-
"claude-sonnet-4-6": "MODEL_PLACEHOLDER_M35",
|
|
211
|
-
"claude-opus-4-6": "MODEL_PLACEHOLDER_M26",
|
|
212
|
-
"claude-opus-4-6-thinking": "MODEL_PLACEHOLDER_M26",
|
|
213
|
-
// GPT-OSS
|
|
214
|
-
"gpt-oss-120b": "MODEL_OPENAI_GPT_OSS_120B_MEDIUM",
|
|
215
|
-
"gpt-oss-120b-medium": "MODEL_OPENAI_GPT_OSS_120B_MEDIUM"
|
|
216
|
-
};
|
|
240
|
+
function isCompatibleFamily(msgModel, targetModelId) {
|
|
241
|
+
if (!msgModel || !targetModelId) return true;
|
|
242
|
+
if (msgModel === targetModelId) return true;
|
|
243
|
+
const isMsgGemini = msgModel.startsWith("gemini-");
|
|
244
|
+
const isTargetGemini = targetModelId.startsWith("gemini-");
|
|
245
|
+
if (isMsgGemini && isTargetGemini) return true;
|
|
246
|
+
const isMsgClaude = msgModel.startsWith("claude-");
|
|
247
|
+
const isTargetClaude = targetModelId.startsWith("claude-");
|
|
248
|
+
if (isMsgClaude && isTargetClaude) return true;
|
|
249
|
+
const isMsgGpt = msgModel.startsWith("gpt-");
|
|
250
|
+
const isTargetGpt = targetModelId.startsWith("gpt-");
|
|
251
|
+
if (isMsgGpt && isTargetGpt) return true;
|
|
252
|
+
return extractBaseModelId(msgModel) === extractBaseModelId(targetModelId);
|
|
253
|
+
}
|
|
217
254
|
function getThinkingConfig(modelId, effort) {
|
|
218
255
|
const isOff = effort === "off" || effort === "none";
|
|
219
256
|
if (isOff) {
|
|
@@ -245,22 +282,41 @@ function getThinkingConfig(modelId, effort) {
|
|
|
245
282
|
}
|
|
246
283
|
return { includeThoughts: true, thinkingBudget: -1 };
|
|
247
284
|
}
|
|
285
|
+
function buildThinkingMap(models) {
|
|
286
|
+
return Object.fromEntries(
|
|
287
|
+
models.map((m) => [
|
|
288
|
+
m.id,
|
|
289
|
+
{
|
|
290
|
+
...typeof m.thinkingBudget === "number" ? { budget: m.thinkingBudget } : {},
|
|
291
|
+
supportsThinking: m.supportsThinking ?? false
|
|
292
|
+
}
|
|
293
|
+
])
|
|
294
|
+
);
|
|
295
|
+
}
|
|
248
296
|
var activeStore = {
|
|
249
|
-
enums: {
|
|
297
|
+
enums: {},
|
|
250
298
|
runtimeIds: [],
|
|
299
|
+
thinking: {},
|
|
300
|
+
deprecated: {},
|
|
251
301
|
version: 0
|
|
252
302
|
};
|
|
253
303
|
function getCatalogSnapshot() {
|
|
254
304
|
return {
|
|
255
305
|
enums: { ...activeStore.enums },
|
|
256
306
|
runtimeIds: [...activeStore.runtimeIds],
|
|
307
|
+
thinking: Object.fromEntries(
|
|
308
|
+
Object.entries(activeStore.thinking ?? {}).map(([id, info]) => [id, { ...info }])
|
|
309
|
+
),
|
|
310
|
+
deprecated: { ...activeStore.deprecated ?? {} },
|
|
257
311
|
version: activeStore.version
|
|
258
312
|
};
|
|
259
313
|
}
|
|
260
|
-
function updateCatalogStore(enums, runtimeIds) {
|
|
314
|
+
function updateCatalogStore(enums, runtimeIds, thinking = {}, deprecated = {}) {
|
|
261
315
|
activeStore = {
|
|
262
|
-
enums: { ...
|
|
316
|
+
enums: { ...enums },
|
|
263
317
|
runtimeIds: [...new Set(runtimeIds)],
|
|
318
|
+
thinking: { ...thinking },
|
|
319
|
+
deprecated: { ...deprecated },
|
|
264
320
|
version: activeStore.version + 1
|
|
265
321
|
};
|
|
266
322
|
}
|
|
@@ -271,39 +327,6 @@ function resolveRuntimeModelId(modelId, effort, availableRuntimeIds = activeStor
|
|
|
271
327
|
const isOff = effort === "off" || effort === "none";
|
|
272
328
|
const isLow = isOff || effort === "low" || effort === "minimal";
|
|
273
329
|
const isMedium = effort === "medium";
|
|
274
|
-
if (modelId === "gemini-3.8-flash") {
|
|
275
|
-
if (isLow) return "gemini-3.8-flash-low";
|
|
276
|
-
if (isMedium) return "gemini-3.8-flash-medium";
|
|
277
|
-
return "gemini-3.8-flash-high";
|
|
278
|
-
}
|
|
279
|
-
if (modelId === "gemini-3.7-flash") {
|
|
280
|
-
if (isLow) return "gemini-3.7-flash-low";
|
|
281
|
-
if (isMedium) return "gemini-3.7-flash-medium";
|
|
282
|
-
return "gemini-3.7-flash-high";
|
|
283
|
-
}
|
|
284
|
-
if (modelId === "gemini-3.6-flash") {
|
|
285
|
-
if (isLow) return "gemini-3.6-flash-low";
|
|
286
|
-
if (isMedium) return "gemini-3.6-flash-medium";
|
|
287
|
-
return "gemini-3.6-flash-high";
|
|
288
|
-
}
|
|
289
|
-
if (modelId === "gemini-3.5-flash") {
|
|
290
|
-
if (isLow) return "gemini-3.5-flash-extra-low";
|
|
291
|
-
if (isMedium) return "gemini-3.5-flash-low";
|
|
292
|
-
return "gemini-3-flash-agent";
|
|
293
|
-
}
|
|
294
|
-
if (modelId === "gemini-3.1-pro") {
|
|
295
|
-
if (effort === "high" || effort === "xhigh") return "gemini-pro-agent";
|
|
296
|
-
return "gemini-3.1-pro-low";
|
|
297
|
-
}
|
|
298
|
-
if (modelId === "claude-opus-4-6") {
|
|
299
|
-
return "claude-opus-4-6-thinking";
|
|
300
|
-
}
|
|
301
|
-
if (modelId === "claude-sonnet-4-6") {
|
|
302
|
-
return "claude-sonnet-4-6";
|
|
303
|
-
}
|
|
304
|
-
if (modelId === "gpt-oss-120b") {
|
|
305
|
-
return "gpt-oss-120b-medium";
|
|
306
|
-
}
|
|
307
330
|
if (Array.isArray(availableRuntimeIds) && availableRuntimeIds.length > 0) {
|
|
308
331
|
const candidates = [];
|
|
309
332
|
if (isLow) {
|
|
@@ -338,27 +361,49 @@ function resolveRuntimeModelId(modelId, effort, availableRuntimeIds = activeStor
|
|
|
338
361
|
return modelId;
|
|
339
362
|
}
|
|
340
363
|
function resolveModelPlan(publicModelId, effort, snapshot = getCatalogSnapshot()) {
|
|
341
|
-
const runtimeModelId =
|
|
364
|
+
const runtimeModelId = followRenames(
|
|
365
|
+
resolveRuntimeModelId(publicModelId, effort, snapshot.runtimeIds),
|
|
366
|
+
snapshot
|
|
367
|
+
);
|
|
368
|
+
const modelEnum = snapshot.enums[runtimeModelId];
|
|
369
|
+
if (!modelEnum) {
|
|
370
|
+
throw new Error(
|
|
371
|
+
`Unknown model "${runtimeModelId}" (not in catalog snapshot v${snapshot.version}). Run /antigravity refresh and pick a current model.`
|
|
372
|
+
);
|
|
373
|
+
}
|
|
342
374
|
return {
|
|
343
375
|
runtimeModelId,
|
|
344
|
-
modelEnum
|
|
345
|
-
thinkingConfig:
|
|
376
|
+
modelEnum,
|
|
377
|
+
thinkingConfig: resolveThinkingConfig(runtimeModelId, effort, snapshot),
|
|
346
378
|
isNonGemini: !runtimeModelId.startsWith("gemini-"),
|
|
347
379
|
isClaude: runtimeModelId.startsWith("claude-")
|
|
348
380
|
};
|
|
349
381
|
}
|
|
350
|
-
function
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
382
|
+
function followRenames(runtimeModelId, snapshot) {
|
|
383
|
+
const renamed = snapshot.deprecated;
|
|
384
|
+
if (!renamed) return runtimeModelId;
|
|
385
|
+
let current = runtimeModelId;
|
|
386
|
+
const seen = /* @__PURE__ */ new Set([current]);
|
|
387
|
+
while (renamed[current] && !seen.has(renamed[current])) {
|
|
388
|
+
current = renamed[current];
|
|
389
|
+
seen.add(current);
|
|
390
|
+
}
|
|
391
|
+
return current;
|
|
392
|
+
}
|
|
393
|
+
function resolveThinkingConfig(runtimeModelId, effort, snapshot = getCatalogSnapshot()) {
|
|
394
|
+
if (effort === "off" || effort === "none") {
|
|
395
|
+
return { includeThoughts: false, thinkingBudget: 0 };
|
|
396
|
+
}
|
|
397
|
+
const info = snapshot.thinking?.[runtimeModelId];
|
|
398
|
+
if (info) {
|
|
399
|
+
if (typeof info.budget === "number") {
|
|
400
|
+
return { includeThoughts: true, thinkingBudget: info.budget };
|
|
401
|
+
}
|
|
402
|
+
if (!info.supportsThinking) {
|
|
403
|
+
return { includeThoughts: false, thinkingBudget: 0 };
|
|
355
404
|
}
|
|
356
405
|
}
|
|
357
|
-
|
|
358
|
-
if (/^\d+(\.\d+)?$/.test(w)) return w;
|
|
359
|
-
return w.charAt(0).toUpperCase() + w.slice(1);
|
|
360
|
-
});
|
|
361
|
-
return words.join(" ");
|
|
406
|
+
return getThinkingConfig(runtimeModelId, effort);
|
|
362
407
|
}
|
|
363
408
|
function estimateModelCost(_baseId) {
|
|
364
409
|
return { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };
|
|
@@ -412,11 +457,15 @@ function buildDynamicPublicModels(catalog) {
|
|
|
412
457
|
}
|
|
413
458
|
return orderedBaseIds.map((baseId) => synthesizeDynamicModel(baseId, runtimeGroups.get(baseId)));
|
|
414
459
|
}
|
|
460
|
+
|
|
461
|
+
// src/catalog-refresh.ts
|
|
415
462
|
async function refreshCatalog(context) {
|
|
416
463
|
const storedEnums = context.stored?.["pi-provider-antigravity"]?.modelEnums;
|
|
417
464
|
const storedRuntimeIds = context.stored?.["pi-provider-antigravity"]?.runtimeIds;
|
|
418
|
-
|
|
419
|
-
|
|
465
|
+
const storedThinking = context.stored?.["pi-provider-antigravity"]?.thinking;
|
|
466
|
+
const storedDeprecated = context.stored?.["pi-provider-antigravity"]?.deprecated;
|
|
467
|
+
if ((storedEnums || storedRuntimeIds || storedThinking || storedDeprecated) && getCatalogSnapshot().version === 0) {
|
|
468
|
+
updateCatalogStore(storedEnums || {}, storedRuntimeIds || [], storedThinking || {}, storedDeprecated || {});
|
|
420
469
|
}
|
|
421
470
|
if (!context.allowNetwork) {
|
|
422
471
|
return context.stored?.models || [];
|
|
@@ -428,7 +477,9 @@ async function refreshCatalog(context) {
|
|
|
428
477
|
}
|
|
429
478
|
const { token, projectId } = parseStoredCredentials(apiKey);
|
|
430
479
|
const catalog = await fetchAvailableModelsCatalog(token, projectId, DEFAULT_ENDPOINT, context.signal);
|
|
431
|
-
|
|
480
|
+
const thinking = buildThinkingMap(catalog.models);
|
|
481
|
+
const deprecated = catalog.deprecated || {};
|
|
482
|
+
updateCatalogStore(catalog.modelEnums, catalog.models.map((m) => m.id), thinking, deprecated);
|
|
432
483
|
const dynamicModels = buildDynamicPublicModels(catalog);
|
|
433
484
|
if (context.publish) {
|
|
434
485
|
await context.publish({
|
|
@@ -437,7 +488,9 @@ async function refreshCatalog(context) {
|
|
|
437
488
|
checkedAt: Date.now(),
|
|
438
489
|
"pi-provider-antigravity": {
|
|
439
490
|
modelEnums: catalog.modelEnums,
|
|
440
|
-
runtimeIds: catalog.models.map((m) => m.id)
|
|
491
|
+
runtimeIds: catalog.models.map((m) => m.id),
|
|
492
|
+
thinking,
|
|
493
|
+
deprecated
|
|
441
494
|
}
|
|
442
495
|
}
|
|
443
496
|
});
|
|
@@ -465,6 +518,8 @@ function parseAvailableModels(data) {
|
|
|
465
518
|
remainingFraction: quotaInfo.remainingFraction,
|
|
466
519
|
resetTime: quotaInfo.resetTime,
|
|
467
520
|
supportsThinking: Boolean(info.supportsThinking),
|
|
521
|
+
thinkingBudget: typeof info.thinkingBudget === "number" ? info.thinkingBudget : void 0,
|
|
522
|
+
minThinkingBudget: typeof info.minThinkingBudget === "number" ? info.minThinkingBudget : void 0,
|
|
468
523
|
supportsImages: Boolean(info.supportsImages),
|
|
469
524
|
maxTokens: typeof info.maxTokens === "number" ? info.maxTokens : void 0,
|
|
470
525
|
maxOutputTokens: typeof info.maxOutputTokens === "number" ? info.maxOutputTokens : void 0
|
|
@@ -483,10 +538,20 @@ function parseAvailableModels(data) {
|
|
|
483
538
|
}
|
|
484
539
|
}
|
|
485
540
|
models.sort((a, b) => a.id.localeCompare(b.id));
|
|
541
|
+
const deprecated = {};
|
|
542
|
+
const rawDeprecated = data.deprecatedModelIds;
|
|
543
|
+
if (rawDeprecated && typeof rawDeprecated === "object") {
|
|
544
|
+
for (const [oldId, info] of Object.entries(rawDeprecated)) {
|
|
545
|
+
if (info && typeof info.newModelId === "string") {
|
|
546
|
+
deprecated[oldId] = info.newModelId;
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
}
|
|
486
550
|
return {
|
|
487
551
|
models,
|
|
488
552
|
modelEnums,
|
|
489
|
-
...agentModelSorts.length > 0 ? { agentModelSorts } : {}
|
|
553
|
+
...agentModelSorts.length > 0 ? { agentModelSorts } : {},
|
|
554
|
+
...Object.keys(deprecated).length > 0 ? { deprecated } : {}
|
|
490
555
|
};
|
|
491
556
|
}
|
|
492
557
|
async function fetchAvailableModelsCatalog(token, projectId = "aicode-consumers", endpoint = DEFAULT_ENDPOINT, signal) {
|
|
@@ -503,50 +568,6 @@ async function fetchAvailableModelsCatalog(token, projectId = "aicode-consumers"
|
|
|
503
568
|
const json = await res.json();
|
|
504
569
|
return parseAvailableModels(json);
|
|
505
570
|
}
|
|
506
|
-
function formatTokenCount(n) {
|
|
507
|
-
if (typeof n !== "number") return "n/a";
|
|
508
|
-
if (n % 1048576 === 0) return `${n / 1048576}M`;
|
|
509
|
-
if (n % 1024 === 0) return `${n / 1024}k`;
|
|
510
|
-
if (n % 1e3 === 0) return `${n / 1e3}k`;
|
|
511
|
-
return `${Math.round(n / 1024)}k`;
|
|
512
|
-
}
|
|
513
|
-
function formatModelsList(catalog) {
|
|
514
|
-
const sorts = catalog.agentModelSorts;
|
|
515
|
-
const recommendedOnly = Array.isArray(sorts) && sorts.length > 0;
|
|
516
|
-
const rank = new Map((sorts || []).map((id, i) => [id, i]));
|
|
517
|
-
const models = (recommendedOnly ? catalog.models.filter((m) => rank.has(m.id)) : catalog.models.slice()).sort(
|
|
518
|
-
(a, b) => (rank.get(a.id) ?? Number.MAX_SAFE_INTEGER) - (rank.get(b.id) ?? Number.MAX_SAFE_INTEGER) || a.id.localeCompare(b.id)
|
|
519
|
-
);
|
|
520
|
-
const rows = models.map((m) => {
|
|
521
|
-
const flags = [];
|
|
522
|
-
if (m.supportsThinking) flags.push("thinking");
|
|
523
|
-
if (m.supportsImages) flags.push("images");
|
|
524
|
-
return {
|
|
525
|
-
id: m.id,
|
|
526
|
-
name: formatModelDisplayName(m.id, m.displayName || m.id),
|
|
527
|
-
ctx: `${formatTokenCount(m.maxTokens)}/${formatTokenCount(m.maxOutputTokens)}`,
|
|
528
|
-
feat: flags.length > 0 ? flags.join(", ") : "-",
|
|
529
|
-
rem: typeof m.remainingFraction === "number" ? `${Math.round(m.remainingFraction * 100)}%` : "N/A"
|
|
530
|
-
};
|
|
531
|
-
});
|
|
532
|
-
const headers = { id: "Model", name: "Name", ctx: "Context", feat: "Features", rem: "Rem" };
|
|
533
|
-
const w = {
|
|
534
|
-
id: Math.max(headers.id.length, ...rows.map((r) => r.id.length)),
|
|
535
|
-
name: Math.max(headers.name.length, ...rows.map((r) => r.name.length)),
|
|
536
|
-
ctx: Math.max(headers.ctx.length, ...rows.map((r) => r.ctx.length)),
|
|
537
|
-
feat: Math.max(headers.feat.length, ...rows.map((r) => r.feat.length))
|
|
538
|
-
};
|
|
539
|
-
const lines = [
|
|
540
|
-
`Available Antigravity Models (${models.length}${recommendedOnly ? " recommended" : ""}):`,
|
|
541
|
-
` ${headers.id.padEnd(w.id)} ${headers.name.padEnd(w.name)} ${headers.ctx.padEnd(w.ctx)} ${headers.feat.padEnd(w.feat)} ${headers.rem}`
|
|
542
|
-
];
|
|
543
|
-
for (const r of rows) {
|
|
544
|
-
lines.push(
|
|
545
|
-
` ${r.id.padEnd(w.id)} ${r.name.padEnd(w.name)} ${r.ctx.padEnd(w.ctx)} ${r.feat.padEnd(w.feat)} ${r.rem.padStart(4)}`
|
|
546
|
-
);
|
|
547
|
-
}
|
|
548
|
-
return lines.join("\n");
|
|
549
|
-
}
|
|
550
571
|
|
|
551
572
|
// src/stream.ts
|
|
552
573
|
import {
|
|
@@ -572,6 +593,20 @@ function createSseFeed() {
|
|
|
572
593
|
stopReason,
|
|
573
594
|
...lastThoughtSignature ? { thoughtSignature: lastThoughtSignature } : {}
|
|
574
595
|
});
|
|
596
|
+
const attachLoneSignature = () => {
|
|
597
|
+
if (!lastThoughtSignature) return;
|
|
598
|
+
const thinking = content.find((b) => b.type === "thinking");
|
|
599
|
+
if (thinking && !thinking.thoughtSignature) {
|
|
600
|
+
thinking.thoughtSignature = lastThoughtSignature;
|
|
601
|
+
} else if (!thinking) {
|
|
602
|
+
for (let i = content.length - 1; i >= 0; i--) {
|
|
603
|
+
if (content[i].type === "text" && !content[i].thoughtSignature) {
|
|
604
|
+
content[i].thoughtSignature = lastThoughtSignature;
|
|
605
|
+
break;
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
};
|
|
575
610
|
const closeOpenBlock = (events) => {
|
|
576
611
|
if (openType === null) return;
|
|
577
612
|
const index = content.length - 1;
|
|
@@ -676,14 +711,8 @@ function createSseFeed() {
|
|
|
676
711
|
if (buffer.trim() !== "") processLine(buffer, events);
|
|
677
712
|
buffer = "";
|
|
678
713
|
closeOpenBlock(events);
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
result() {
|
|
682
|
-
return {
|
|
683
|
-
content,
|
|
684
|
-
usage: { ...usage },
|
|
685
|
-
stopReason
|
|
686
|
-
};
|
|
714
|
+
attachLoneSignature();
|
|
715
|
+
return { ...snapshot(events), content };
|
|
687
716
|
}
|
|
688
717
|
};
|
|
689
718
|
}
|
|
@@ -700,20 +729,6 @@ function resolveThoughtSignature(isSameProviderAndModel, sig) {
|
|
|
700
729
|
if (!isSameProviderAndModel) return void 0;
|
|
701
730
|
return isValidThoughtSignature(sig) ? sig : void 0;
|
|
702
731
|
}
|
|
703
|
-
function isCompatibleModelFamily(msgModel, targetModelId) {
|
|
704
|
-
if (!msgModel || !targetModelId) return true;
|
|
705
|
-
if (msgModel === targetModelId) return true;
|
|
706
|
-
const isMsgGemini = msgModel.startsWith("gemini-");
|
|
707
|
-
const isTargetGemini = targetModelId.startsWith("gemini-");
|
|
708
|
-
if (isMsgGemini && isTargetGemini) return true;
|
|
709
|
-
const isMsgClaude = msgModel.startsWith("claude-");
|
|
710
|
-
const isTargetClaude = targetModelId.startsWith("claude-");
|
|
711
|
-
if (isMsgClaude && isTargetClaude) return true;
|
|
712
|
-
const isMsgGpt = msgModel.startsWith("gpt-");
|
|
713
|
-
const isTargetGpt = targetModelId.startsWith("gpt-");
|
|
714
|
-
if (isMsgGpt && isTargetGpt) return true;
|
|
715
|
-
return extractBaseModelId(msgModel) === extractBaseModelId(targetModelId);
|
|
716
|
-
}
|
|
717
732
|
function deriveSessionId(context, explicitSessionId) {
|
|
718
733
|
if (explicitSessionId && typeof explicitSessionId === "string" && explicitSessionId.trim().length > 0) {
|
|
719
734
|
return explicitSessionId.trim();
|
|
@@ -841,7 +856,7 @@ function translateTurnTrace(context, runtimeModelId) {
|
|
|
841
856
|
continue;
|
|
842
857
|
}
|
|
843
858
|
const isSameProvider = !msg.provider || msg.provider === PROVIDER_ID;
|
|
844
|
-
const isSameModel =
|
|
859
|
+
const isSameModel = isCompatibleFamily(msg.model, runtimeModelId);
|
|
845
860
|
const isSameProviderAndModel = isSameProvider && isSameModel;
|
|
846
861
|
const parts = [];
|
|
847
862
|
let pendingThinkingSig;
|
|
@@ -1127,13 +1142,6 @@ function streamAntigravity(model, context, options) {
|
|
|
1127
1142
|
};
|
|
1128
1143
|
}
|
|
1129
1144
|
};
|
|
1130
|
-
const applyStopReason = (r) => {
|
|
1131
|
-
if (r === "stop") {
|
|
1132
|
-
if (output.stopReason === "pending") output.stopReason = "stop";
|
|
1133
|
-
} else {
|
|
1134
|
-
output.stopReason = r;
|
|
1135
|
-
}
|
|
1136
|
-
};
|
|
1137
1145
|
const translate = (events) => {
|
|
1138
1146
|
for (const ev of events) {
|
|
1139
1147
|
if (ev.kind === "text_start" || ev.kind === "thinking_start") {
|
|
@@ -1161,7 +1169,7 @@ function streamAntigravity(model, context, options) {
|
|
|
1161
1169
|
} else if (ev.kind === "toolCall") {
|
|
1162
1170
|
const toolCall = {
|
|
1163
1171
|
type: "toolCall",
|
|
1164
|
-
id: ev.block.id
|
|
1172
|
+
id: ev.block.id,
|
|
1165
1173
|
name: ev.block.name,
|
|
1166
1174
|
arguments: ev.block.arguments || {},
|
|
1167
1175
|
thoughtSignature: ev.block.thoughtSignature
|
|
@@ -1188,24 +1196,23 @@ function streamAntigravity(model, context, options) {
|
|
|
1188
1196
|
if (done) break;
|
|
1189
1197
|
const fed = feed.feed(decoder.decode(value, { stream: true }));
|
|
1190
1198
|
applyUsage(fed.usage);
|
|
1191
|
-
|
|
1199
|
+
output.stopReason = fed.stopReason;
|
|
1192
1200
|
translate(fed.events);
|
|
1193
1201
|
}
|
|
1194
1202
|
const closing = feed.close();
|
|
1195
1203
|
applyUsage(closing.usage);
|
|
1196
|
-
|
|
1204
|
+
output.stopReason = closing.stopReason;
|
|
1197
1205
|
translate(closing.events);
|
|
1198
|
-
|
|
1199
|
-
const
|
|
1200
|
-
if (
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
}
|
|
1206
|
+
closing.content.forEach((block, index) => {
|
|
1207
|
+
const sig = block.thoughtSignature;
|
|
1208
|
+
if (!sig) return;
|
|
1209
|
+
const target = output.content[index];
|
|
1210
|
+
if (target?.type === "thinking" && !target.thinkingSignature) {
|
|
1211
|
+
target.thinkingSignature = sig;
|
|
1212
|
+
} else if (target?.type === "text" && !target.textSignature) {
|
|
1213
|
+
target.textSignature = sig;
|
|
1207
1214
|
}
|
|
1208
|
-
}
|
|
1215
|
+
});
|
|
1209
1216
|
const doneReason = output.stopReason === "toolUse" || output.stopReason === "length" ? output.stopReason : "stop";
|
|
1210
1217
|
stream.push({
|
|
1211
1218
|
type: "done",
|
|
@@ -1418,7 +1425,6 @@ function index_default(pi) {
|
|
|
1418
1425
|
export {
|
|
1419
1426
|
PROVIDER_ID,
|
|
1420
1427
|
PROVIDER_NAME,
|
|
1421
|
-
index_default as default
|
|
1422
|
-
extractBaseModelId
|
|
1428
|
+
index_default as default
|
|
1423
1429
|
};
|
|
1424
1430
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/auth.ts", "../src/protocol.ts", "../src/catalog.ts", "../src/stream.ts", "../src/parser.ts", "../src/builder.ts", "../src/quota.ts", "../src/commands.ts", "../src/index.ts"],
|
|
4
|
-
"sourcesContent": ["import { createHash, randomBytes } from \"node:crypto\";\nimport type { OAuthCredentials, OAuthLoginCallbacks } from \"@earendil-works/pi-ai\";\nimport { buildAntigravityHeaders, DEFAULT_ENDPOINT } from \"./protocol.ts\";\n\nexport const REDIRECT_URI = \"https://antigravity.google/oauth-callback\";\nexport const AUTH_URL = \"https://accounts.google.com/o/oauth2/auth\";\nexport const TOKEN_URL = \"https://oauth2.googleapis.com/token\";\nexport const OAUTH_CALLBACK_TIMEOUT_MS = 5 * 60 * 1000;\n\nexport const SCOPES = [\n \"https://www.googleapis.com/auth/cloud-platform\",\n \"https://www.googleapis.com/auth/userinfo.email\",\n \"https://www.googleapis.com/auth/userinfo.profile\",\n \"https://www.googleapis.com/auth/cclog\",\n \"https://www.googleapis.com/auth/experimentsandconfigs\",\n \"https://www.googleapis.com/auth/aicode\",\n \"openid\",\n];\n\nexport const CLIENT_ID =\n process.env.ANTIGRAVITY_CLIENT_ID ||\n Buffer.from(\n \"MTA3MTAwNjA2MDU5MS10bWhzc2luMmgyMWxjcmUyMzV2dG9sb2poNGc0MDNlcC5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbQ==\",\n \"base64\"\n ).toString(\"utf-8\");\n\nexport const CLIENT_SECRET =\n process.env.ANTIGRAVITY_CLIENT_SECRET ||\n Buffer.from(\"R09DU1BYLUs1OEZXUjQ4NkxkTEoxbUxCOHNYQzR6NnFEQWY=\", \"base64\").toString(\"utf-8\");\n\nfunction base64Url(buf: Buffer): string {\n return buf.toString(\"base64url\");\n}\n\nexport function extractCodeFromInput(rawInput: string): string {\n let code = rawInput.trim();\n if (!code) {\n throw new Error(\"No authorization code provided\");\n }\n\n if (code.startsWith(\"code=\")) {\n code = code.slice(5).trim();\n if (!code) {\n throw new Error(\"No authorization code provided\");\n }\n }\n\n // Reject callback URLs and other non-code input here instead of passing\n // garbage downstream (Google rejects those with a bare invalid_grant).\n // Note: real codes contain \"/\" (e.g. \"4/0ATs\u2026\"), so only reject\n // characters a code can never contain.\n if (/[\\s:?#&=%+]/.test(code)) {\n throw new Error(\"Invalid authorization code: paste the code value itself, not the callback URL\");\n }\n\n return code;\n}\n\nfunction generatePKCE(): { verifier: string; challenge: string } {\n const verifier = base64Url(randomBytes(32));\n const challenge = base64Url(createHash(\"sha256\").update(verifier).digest());\n return { verifier, challenge };\n}\n\nexport async function fetchProjectId(\n token: string,\n endpoint = DEFAULT_ENDPOINT,\n signal?: AbortSignal\n): Promise<string> {\n try {\n const res = await fetch(`${endpoint}/v1internal:loadCodeAssist`, {\n method: \"POST\",\n headers: buildAntigravityHeaders(token),\n body: JSON.stringify({ metadata: { ideType: \"ANTIGRAVITY\" } }),\n signal,\n });\n if (res.ok) {\n const data = (await res.json()) as { cloudaicompanionProject?: string };\n if (data.cloudaicompanionProject) {\n return data.cloudaicompanionProject;\n }\n }\n } catch {\n // Fall back to standard project\n }\n return \"aicode-consumers\";\n}\n\nexport async function loginAntigravity(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials> {\n const { verifier, challenge } = generatePKCE();\n // state is still sent for agy wire parity, but never validated back:\n // with code-only paste the callback URL (and its state) never reaches us.\n const state = randomBytes(16).toString(\"hex\");\n\n const authParams = new URLSearchParams({\n client_id: CLIENT_ID,\n response_type: \"code\",\n redirect_uri: REDIRECT_URI,\n scope: SCOPES.join(\" \"),\n code_challenge: challenge,\n code_challenge_method: \"S256\",\n state,\n access_type: \"offline\",\n prompt: \"consent\",\n });\n\n const authUrl = `${AUTH_URL}?${authParams.toString()}`;\n callbacks.onAuth({ url: authUrl });\n\n const manualPromptPromise = (async () => {\n const input = await callbacks.onPrompt({\n message: \"Paste authorization code from browser:\",\n });\n return extractCodeFromInput(input);\n })();\n\n const timeout = new Promise<never>((_, rej) =>\n setTimeout(() => rej(new Error(\"Timed out waiting for authorization code (5 minutes)\")), OAUTH_CALLBACK_TIMEOUT_MS)\n );\n\n const code = await Promise.race([manualPromptPromise, timeout]);\n\n const tokenParams = new URLSearchParams({\n client_id: CLIENT_ID,\n client_secret: CLIENT_SECRET,\n code,\n grant_type: \"authorization_code\",\n redirect_uri: REDIRECT_URI,\n code_verifier: verifier,\n });\n\n const tokenRes = await fetch(TOKEN_URL, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: tokenParams.toString(),\n });\n\n if (!tokenRes.ok) {\n const errText = await tokenRes.text();\n throw new Error(`Failed to exchange token (${tokenRes.status}): ${errText}`);\n }\n\n const tokens = (await tokenRes.json()) as {\n access_token: string;\n refresh_token?: string;\n expires_in?: number;\n };\n const projectId = await fetchProjectId(tokens.access_token);\n\n return {\n refresh: tokens.refresh_token || \"\",\n access: JSON.stringify({ token: tokens.access_token, projectId }),\n expires: Date.now() + (tokens.expires_in || 3600) * 1000,\n };\n}\n\nexport async function refreshAntigravityToken(\n credentials: OAuthCredentials,\n signal?: AbortSignal\n): Promise<OAuthCredentials> {\n const params = new URLSearchParams({\n client_id: CLIENT_ID,\n client_secret: CLIENT_SECRET,\n refresh_token: credentials.refresh,\n grant_type: \"refresh_token\",\n });\n\n const res = await fetch(TOKEN_URL, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: params.toString(),\n signal,\n });\n\n if (!res.ok) {\n const errText = await res.text();\n throw new Error(`Failed to refresh token (${res.status}): ${errText}`);\n }\n\n const tokens = (await res.json()) as {\n access_token: string;\n refresh_token?: string;\n expires_in?: number;\n };\n\n let existingProjectId = \"aicode-consumers\";\n try {\n const parsed = JSON.parse(credentials.access);\n if (parsed.projectId) existingProjectId = parsed.projectId;\n } catch {\n // ignore\n }\n\n // Re-resolve: a login-time lookup failure pins the \"aicode-consumers\"\n // default forever unless refresh retries it. A failed lookup yields that\n // same default, which must never clobber a known value.\n const freshProjectId = await fetchProjectId(tokens.access_token, DEFAULT_ENDPOINT, signal);\n const projectId = freshProjectId !== \"aicode-consumers\" ? freshProjectId : existingProjectId;\n\n return {\n refresh: tokens.refresh_token || credentials.refresh,\n access: JSON.stringify({ token: tokens.access_token, projectId }),\n expires: Date.now() + (tokens.expires_in || 3600) * 1000,\n };\n}\n\nexport function getApiKey(credentials: OAuthCredentials): string {\n return credentials.access;\n}\n\nexport function parseStoredCredentials(rawApiKey: string): { token: string; projectId: string } {\n try {\n const parsed = JSON.parse(rawApiKey);\n if (parsed.token) {\n return { token: parsed.token, projectId: parsed.projectId || \"aicode-consumers\" };\n }\n } catch {\n // If plain token\n }\n return { token: rawApiKey, projectId: \"aicode-consumers\" };\n}\n", "export const DEFAULT_ENDPOINT = \"https://daily-cloudcode-pa.googleapis.com\";\nexport const DEFAULT_USER_AGENT =\n \"antigravity/cli/1.1.27 (aidev_client; os_type=linux; arch=amd64; cl=976543523; auth_method=consumer)\";\n\nexport const PROVIDER_ID = \"antigravity\";\n\n/**\n * Builds the canonical HTTP request headers matching the official agy CLI Wire Fingerprint.\n */\nexport function buildAntigravityHeaders(token: string, userAgent = DEFAULT_USER_AGENT): Record<string, string> {\n return {\n Host: \"daily-cloudcode-pa.googleapis.com\",\n \"User-Agent\": userAgent,\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n };\n}\n", "import type { Model } from \"@earendil-works/pi-ai\";\nimport { DEFAULT_ENDPOINT, PROVIDER_ID, buildAntigravityHeaders } from \"./protocol.ts\";\nimport { parseStoredCredentials } from \"./auth.ts\";\n\nexport function extractBaseModelId(runtimeId: string): string {\n if (runtimeId === \"gemini-pro-agent\") return \"gemini-3.1-pro\";\n if (runtimeId.startsWith(\"gemini-3.1-pro-\")) return \"gemini-3.1-pro\";\n\n return runtimeId.replace(/-(?:high|medium|low|tiered|thinking|agent|extra-low)$/, \"\");\n}\n\n/**\n * Static fallback model enums captured directly from agy CLI models.resp.json.\n * Single definition: Model Catalog merges these with the active snapshot,\n * and the request builder falls back to them when no snapshot enums apply.\n */\nexport const STATIC_MODEL_ENUMS: Record<string, string> = {\n // Gemini 3.8 Flash\n \"gemini-3.8-flash\": \"MODEL_PLACEHOLDER_M318\",\n \"gemini-3.8-flash-high\": \"MODEL_PLACEHOLDER_M318\",\n \"gemini-3.8-flash-medium\": \"MODEL_PLACEHOLDER_M319\",\n \"gemini-3.8-flash-low\": \"MODEL_PLACEHOLDER_M320\",\n \"gemini-3.8-flash-tiered\": \"MODEL_PLACEHOLDER_M322\",\n // Gemini 3.7 Flash\n \"gemini-3.7-flash\": \"MODEL_PLACEHOLDER_M298\",\n \"gemini-3.7-flash-high\": \"MODEL_PLACEHOLDER_M298\",\n \"gemini-3.7-flash-medium\": \"MODEL_PLACEHOLDER_M299\",\n \"gemini-3.7-flash-low\": \"MODEL_PLACEHOLDER_M300\",\n \"gemini-3.7-flash-tiered\": \"MODEL_PLACEHOLDER_M301\",\n // Gemini 3.6 Flash\n \"gemini-3.6-flash\": \"MODEL_PLACEHOLDER_M71\",\n \"gemini-3.6-flash-high\": \"MODEL_PLACEHOLDER_M71\",\n \"gemini-3.6-flash-medium\": \"MODEL_PLACEHOLDER_M72\",\n \"gemini-3.6-flash-low\": \"MODEL_PLACEHOLDER_M73\",\n // Gemini 3.5 Flash\n \"gemini-3.5-flash\": \"MODEL_PLACEHOLDER_M84\",\n \"gemini-3.5-flash-low\": \"MODEL_PLACEHOLDER_M20\",\n \"gemini-3.5-flash-extra-low\": \"MODEL_PLACEHOLDER_M187\",\n \"gemini-3-flash-agent\": \"MODEL_PLACEHOLDER_M84\",\n // Gemini 3.1 Pro\n \"gemini-3.1-pro\": \"MODEL_PLACEHOLDER_M16\",\n \"gemini-3.1-pro-high\": \"MODEL_PLACEHOLDER_M37\",\n \"gemini-3.1-pro-low\": \"MODEL_PLACEHOLDER_M36\",\n \"gemini-pro-agent\": \"MODEL_PLACEHOLDER_M16\",\n // Claude\n \"claude-sonnet-4-6\": \"MODEL_PLACEHOLDER_M35\",\n \"claude-opus-4-6\": \"MODEL_PLACEHOLDER_M26\",\n \"claude-opus-4-6-thinking\": \"MODEL_PLACEHOLDER_M26\",\n // GPT-OSS\n \"gpt-oss-120b\": \"MODEL_OPENAI_GPT_OSS_120B_MEDIUM\",\n \"gpt-oss-120b-medium\": \"MODEL_OPENAI_GPT_OSS_120B_MEDIUM\",\n};\n\nexport function getThinkingConfig(modelId: string, effort?: string): { includeThoughts: boolean; thinkingBudget: number } {\n const isOff = effort === \"off\" || effort === \"none\";\n if (isOff) {\n return { includeThoughts: false, thinkingBudget: 0 };\n }\n\n // Gemini 3.8 / 3.7 / 3.6 Flash\n if (modelId.includes(\"flash\")) {\n if (effort === \"high\" || effort === \"xhigh\" || modelId.endsWith(\"-high\") || modelId.endsWith(\"-agent\")) {\n return { includeThoughts: true, thinkingBudget: -1 };\n }\n if (effort === \"medium\" || modelId.endsWith(\"-medium\")) {\n return { includeThoughts: true, thinkingBudget: 4000 };\n }\n if (effort === \"low\" || effort === \"minimal\" || modelId.endsWith(\"-low\")) {\n return { includeThoughts: true, thinkingBudget: 1000 };\n }\n return { includeThoughts: true, thinkingBudget: -1 };\n }\n\n // Gemini 3.1 Pro\n if (modelId.includes(\"pro\")) {\n if (effort === \"low\" || effort === \"minimal\" || modelId.endsWith(\"-low\")) {\n return { includeThoughts: true, thinkingBudget: 1001 };\n }\n return { includeThoughts: true, thinkingBudget: 10001 };\n }\n\n // Claude models\n if (modelId.startsWith(\"claude-\")) {\n return { includeThoughts: true, thinkingBudget: 1024 };\n }\n\n // GPT-OSS 120B\n if (modelId.startsWith(\"gpt-oss-\")) {\n return { includeThoughts: true, thinkingBudget: 8192 };\n }\n\n return { includeThoughts: true, thinkingBudget: -1 };\n}\n\nexport interface AvailableModelItem {\n id: string;\n displayName?: string;\n modelEnum?: string;\n remainingFraction?: number;\n resetTime?: string;\n supportsThinking?: boolean;\n supportsImages?: boolean;\n maxTokens?: number;\n maxOutputTokens?: number;\n}\n\nexport interface AvailableModelsCatalog {\n models: AvailableModelItem[];\n modelEnums: Record<string, string>;\n agentModelSorts?: string[];\n}\n\n// Active catalog state: single versioned snapshot. refreshCatalog owns writes;\n// request paths take one snapshot per call so enums and runtime IDs always come\n// from the same refresh generation (see Model Plan in CONTEXT.md).\nexport interface CatalogSnapshot {\n enums: Record<string, string>;\n runtimeIds: string[];\n version: number;\n}\n\nlet activeStore: CatalogSnapshot = {\n enums: { ...STATIC_MODEL_ENUMS },\n runtimeIds: [],\n version: 0,\n};\n\nexport function getCatalogSnapshot(): CatalogSnapshot {\n return {\n enums: { ...activeStore.enums },\n runtimeIds: [...activeStore.runtimeIds],\n version: activeStore.version,\n };\n}\n\nfunction updateCatalogStore(enums: Record<string, string>, runtimeIds: string[]): void {\n // A fresh generation is complete: replace instead of merging, so enums for\n // server-removed models are evicted instead of pinned forever.\n activeStore = {\n enums: { ...STATIC_MODEL_ENUMS, ...enums },\n runtimeIds: [...new Set(runtimeIds)],\n version: activeStore.version + 1,\n };\n}\n\nfunction resolveRuntimeModelId(\n modelId: string,\n effort?: string,\n availableRuntimeIds: string[] = activeStore.runtimeIds\n): string {\n if (\n modelId.endsWith(\"-high\") ||\n modelId.endsWith(\"-medium\") ||\n modelId.endsWith(\"-low\") ||\n modelId.endsWith(\"-thinking\") ||\n modelId.endsWith(\"-agent\") ||\n modelId.endsWith(\"-extra-low\") ||\n modelId.endsWith(\"-tiered\")\n ) {\n return modelId;\n }\n\n const isOff = effort === \"off\" || effort === \"none\";\n const isLow = isOff || effort === \"low\" || effort === \"minimal\";\n const isMedium = effort === \"medium\";\n\n // Known specific models with legacy parity mappings\n if (modelId === \"gemini-3.8-flash\") {\n if (isLow) return \"gemini-3.8-flash-low\";\n if (isMedium) return \"gemini-3.8-flash-medium\";\n return \"gemini-3.8-flash-high\";\n }\n\n if (modelId === \"gemini-3.7-flash\") {\n if (isLow) return \"gemini-3.7-flash-low\";\n if (isMedium) return \"gemini-3.7-flash-medium\";\n return \"gemini-3.7-flash-high\";\n }\n\n if (modelId === \"gemini-3.6-flash\") {\n if (isLow) return \"gemini-3.6-flash-low\";\n if (isMedium) return \"gemini-3.6-flash-medium\";\n return \"gemini-3.6-flash-high\";\n }\n\n if (modelId === \"gemini-3.5-flash\") {\n if (isLow) return \"gemini-3.5-flash-extra-low\";\n if (isMedium) return \"gemini-3.5-flash-low\";\n return \"gemini-3-flash-agent\";\n }\n\n if (modelId === \"gemini-3.1-pro\") {\n if (effort === \"high\" || effort === \"xhigh\") return \"gemini-pro-agent\";\n return \"gemini-3.1-pro-low\";\n }\n\n if (modelId === \"claude-opus-4-6\") {\n return \"claude-opus-4-6-thinking\";\n }\n\n if (modelId === \"claude-sonnet-4-6\") {\n return \"claude-sonnet-4-6\";\n }\n\n if (modelId === \"gpt-oss-120b\") {\n return \"gpt-oss-120b-medium\";\n }\n\n // Dynamic tier resolution for newly introduced models (e.g. gemini-3.9-flash, claude-opus-4-7, etc.)\n if (Array.isArray(availableRuntimeIds) && availableRuntimeIds.length > 0) {\n const candidates: string[] = [];\n if (isLow) {\n candidates.push(`${modelId}-low`, `${modelId}-extra-low`, modelId);\n } else if (isMedium) {\n candidates.push(`${modelId}-medium`, modelId);\n } else {\n candidates.push(`${modelId}-high`, `${modelId}-thinking`, `${modelId}-agent`, modelId);\n }\n\n for (const cand of candidates) {\n if (availableRuntimeIds.includes(cand)) {\n return cand;\n }\n }\n }\n\n // Fallback heuristics when runtime ID catalog is not available\n if (modelId.includes(\"flash\")) {\n if (isLow) return `${modelId}-low`;\n if (isMedium) return `${modelId}-medium`;\n return `${modelId}-high`;\n }\n\n if (modelId.includes(\"pro\")) {\n if (isLow) return `${modelId}-low`;\n return `${modelId}-high`;\n }\n\n if (modelId.startsWith(\"claude-\")) {\n if (modelId.includes(\"opus\")) return `${modelId}-thinking`;\n return modelId;\n }\n\n if (modelId.startsWith(\"gpt-\")) {\n return `${modelId}-medium`;\n }\n\n return modelId;\n}\n\nexport interface ModelPlan {\n runtimeModelId: string;\n modelEnum: string;\n thinkingConfig: { includeThoughts: boolean; thinkingBudget: number };\n isNonGemini: boolean;\n isClaude: boolean;\n}\n\n/**\n * Resolves one Model Plan (see CONTEXT.md) from a single snapshot generation:\n * Runtime Model ID, model enum, thinking budget, and the non-Gemini flag that\n * switches tool schema mode. Pass an explicit snapshot in tests; otherwise the\n * live snapshot is read once, so enums and runtime IDs never mix generations.\n */\nexport function resolveModelPlan(\n publicModelId: string,\n effort?: string,\n snapshot: CatalogSnapshot = getCatalogSnapshot()\n): ModelPlan {\n const runtimeModelId = resolveRuntimeModelId(publicModelId, effort, snapshot.runtimeIds);\n return {\n runtimeModelId,\n modelEnum: snapshot.enums[runtimeModelId] || \"\",\n thinkingConfig: getThinkingConfig(runtimeModelId, effort),\n isNonGemini: !runtimeModelId.startsWith(\"gemini-\"),\n isClaude: runtimeModelId.startsWith(\"claude-\"),\n };\n}\n\nexport function formatModelDisplayName(baseId: string, rawDisplayName?: string): string {\n if (rawDisplayName) {\n const cleaned = rawDisplayName.replace(/\\s*\\([^)]*\\)/g, \"\").trim();\n if (cleaned.length > 0) {\n return cleaned;\n }\n }\n const words = baseId.split(\"-\").map((w) => {\n if (/^\\d+(\\.\\d+)?$/.test(w)) return w;\n return w.charAt(0).toUpperCase() + w.slice(1);\n });\n return words.join(\" \");\n}\n\n// Antigravity is quota-based with no per-token billing, so every model\n// reports zero cost instead of fictitious Gemini API prices.\n// Revisit if a metered paid tier ever appears.\nexport function estimateModelCost(_baseId: string): Model<any>[\"cost\"] {\n return { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };\n}\n\nexport function synthesizeDynamicModel(baseId: string, items: AvailableModelItem[]): Model<any> {\n const repItem = items.find((it) => it.id === `${baseId}-high` || it.id === baseId) || items[0];\n\n const isFlash = baseId.includes(\"flash\");\n const isClaude = baseId.startsWith(\"claude-\");\n const isGpt = baseId.startsWith(\"gpt-\");\n\n // Static fallbacks mirror captures/agy_cli_1.1.27/models.resp.json\n // (Claude maxTokens 250000 / maxOutputTokens 64000, also seen on the wire\n // in stream_turn8/9). Live refresh overwrites these with catalog values.\n const defaultContext = isFlash ? 1048576 : isClaude ? 250000 : isGpt ? 128000 : 1048576;\n const defaultMaxOutput = isClaude ? 64000 : isGpt ? 32768 : 65536;\n\n return {\n id: baseId,\n name: formatModelDisplayName(baseId, repItem?.displayName),\n provider: PROVIDER_ID,\n api: \"antigravity-api\",\n baseUrl: DEFAULT_ENDPOINT,\n reasoning: repItem?.supportsThinking ?? true,\n input: repItem?.supportsImages ? [\"text\", \"image\"] : [\"text\"],\n cost: estimateModelCost(baseId),\n contextWindow: repItem?.maxTokens || defaultContext,\n maxTokens: repItem?.maxOutputTokens || defaultMaxOutput,\n };\n}\n\nexport function buildDynamicPublicModels(catalog?: AvailableModelsCatalog): Array<Model<any>> {\n if (!catalog || !Array.isArray(catalog.models) || catalog.models.length === 0) {\n return [];\n }\n\n // Filter eligible models according to agentModelSorts (strict agy CLI parity)\n const agentSortIds = catalog.agentModelSorts;\n const eligibleItems =\n Array.isArray(agentSortIds) && agentSortIds.length > 0\n ? catalog.models.filter((m) => agentSortIds.includes(m.id))\n : catalog.models;\n\n const runtimeGroups = new Map<string, AvailableModelItem[]>();\n for (const item of eligibleItems) {\n const baseId = extractBaseModelId(item.id);\n const list = runtimeGroups.get(baseId) || [];\n list.push(item);\n runtimeGroups.set(baseId, list);\n }\n\n // Preserve recommended ordering from agentModelSorts\n const orderedBaseIds: string[] = [];\n if (Array.isArray(agentSortIds)) {\n for (const sortId of agentSortIds) {\n const baseId = extractBaseModelId(sortId);\n if (runtimeGroups.has(baseId) && !orderedBaseIds.includes(baseId)) {\n orderedBaseIds.push(baseId);\n }\n }\n }\n\n for (const baseId of runtimeGroups.keys()) {\n if (!orderedBaseIds.includes(baseId)) {\n orderedBaseIds.push(baseId);\n }\n }\n\n return orderedBaseIds.map((baseId) => synthesizeDynamicModel(baseId, runtimeGroups.get(baseId)!));\n}\n\nexport async function refreshCatalog(context: any): Promise<Array<Model<any>>> {\n // Restore from context.stored first for offline restart support,\n // but only into a pristine store: a failed refresh must not clobber a\n // fresher in-memory snapshot with older persisted data.\n const storedEnums = context.stored?.[\"pi-provider-antigravity\"]?.modelEnums;\n const storedRuntimeIds = context.stored?.[\"pi-provider-antigravity\"]?.runtimeIds;\n if ((storedEnums || storedRuntimeIds) && getCatalogSnapshot().version === 0) {\n updateCatalogStore(storedEnums || {}, storedRuntimeIds || []);\n }\n\n if (!context.allowNetwork) {\n return context.stored?.models || [];\n }\n\n try {\n const apiKey = context.credential?.access;\n if (!apiKey) {\n return context.stored?.models || [];\n }\n\n const { token, projectId } = parseStoredCredentials(apiKey);\n const catalog = await fetchAvailableModelsCatalog(token, projectId, DEFAULT_ENDPOINT, context.signal);\n updateCatalogStore(catalog.modelEnums, catalog.models.map((m) => m.id));\n\n const dynamicModels = buildDynamicPublicModels(catalog);\n\n // Publish to Pi models-store.json\n if (context.publish) {\n await context.publish({\n persist: {\n models: dynamicModels,\n checkedAt: Date.now(),\n \"pi-provider-antigravity\": {\n modelEnums: catalog.modelEnums,\n runtimeIds: catalog.models.map((m) => m.id),\n },\n },\n });\n }\n\n return dynamicModels;\n } catch {\n return context.stored?.models || [];\n }\n}\n\nexport function parseAvailableModels(data: any): AvailableModelsCatalog {\n const models: AvailableModelItem[] = [];\n const modelEnums: Record<string, string> = {};\n\n const modelsObj = data.models || {};\n for (const [id, info] of Object.entries<any>(modelsObj)) {\n if (id.startsWith(\"tab_\") || id.startsWith(\"chat_\")) continue; // hide internal completions\n\n const modelEnum = typeof info.model === \"string\" ? info.model : undefined;\n if (modelEnum) {\n modelEnums[id] = modelEnum;\n }\n\n const quotaInfo = info.quotaInfo || {};\n models.push({\n id,\n displayName: info.displayName || info.label || id,\n modelEnum,\n remainingFraction: quotaInfo.remainingFraction,\n resetTime: quotaInfo.resetTime,\n supportsThinking: Boolean(info.supportsThinking),\n supportsImages: Boolean(info.supportsImages),\n maxTokens: typeof info.maxTokens === \"number\" ? info.maxTokens : undefined,\n maxOutputTokens: typeof info.maxOutputTokens === \"number\" ? info.maxOutputTokens : undefined,\n });\n }\n\n const agentModelSorts: string[] = [];\n if (Array.isArray(data.agentModelSorts)) {\n for (const sortGroup of data.agentModelSorts) {\n if (Array.isArray(sortGroup.groups)) {\n for (const group of sortGroup.groups) {\n if (Array.isArray(group.modelIds)) {\n agentModelSorts.push(...group.modelIds);\n }\n }\n }\n }\n }\n\n models.sort((a, b) => a.id.localeCompare(b.id));\n\n return {\n models,\n modelEnums,\n ...(agentModelSorts.length > 0 ? { agentModelSorts } : {}),\n };\n}\n\nexport async function fetchAvailableModelsCatalog(\n token: string,\n projectId = \"aicode-consumers\",\n endpoint = DEFAULT_ENDPOINT,\n signal?: AbortSignal\n): Promise<AvailableModelsCatalog> {\n const res = await fetch(`${endpoint}/v1internal:fetchAvailableModels`, {\n method: \"POST\",\n headers: buildAntigravityHeaders(token),\n body: JSON.stringify({ project: projectId }),\n signal,\n });\n if (!res.ok) {\n const errText = await res.text();\n throw new Error(`Failed to fetch models (${res.status}): ${errText}`);\n }\n const json = await res.json();\n return parseAvailableModels(json);\n}\n\nfunction formatTokenCount(n?: number): string {\n if (typeof n !== \"number\") return \"n/a\";\n if (n % 1048576 === 0) return `${n / 1048576}M`;\n if (n % 1024 === 0) return `${n / 1024}k`;\n if (n % 1000 === 0) return `${n / 1000}k`;\n // ponytail: odd values (e.g. 65535) round to nearest KiB instead of a noisy decimal\n return `${Math.round(n / 1024)}k`;\n}\n\nexport function formatModelsList(catalog: AvailableModelsCatalog): string {\n const sorts = catalog.agentModelSorts;\n const recommendedOnly = Array.isArray(sorts) && sorts.length > 0;\n const rank = new Map((sorts || []).map((id, i) => [id, i]));\n\n const models = (recommendedOnly ? catalog.models.filter((m) => rank.has(m.id)) : catalog.models.slice()).sort(\n (a, b) => (rank.get(a.id) ?? Number.MAX_SAFE_INTEGER) - (rank.get(b.id) ?? Number.MAX_SAFE_INTEGER) ||\n a.id.localeCompare(b.id)\n );\n\n const rows = models.map((m) => {\n const flags: string[] = [];\n if (m.supportsThinking) flags.push(\"thinking\");\n if (m.supportsImages) flags.push(\"images\");\n return {\n id: m.id,\n name: formatModelDisplayName(m.id, m.displayName || m.id),\n ctx: `${formatTokenCount(m.maxTokens)}/${formatTokenCount(m.maxOutputTokens)}`,\n feat: flags.length > 0 ? flags.join(\", \") : \"-\",\n rem: typeof m.remainingFraction === \"number\" ? `${Math.round(m.remainingFraction * 100)}%` : \"N/A\",\n };\n });\n\n const headers = { id: \"Model\", name: \"Name\", ctx: \"Context\", feat: \"Features\", rem: \"Rem\" };\n const w = {\n id: Math.max(headers.id.length, ...rows.map((r) => r.id.length)),\n name: Math.max(headers.name.length, ...rows.map((r) => r.name.length)),\n ctx: Math.max(headers.ctx.length, ...rows.map((r) => r.ctx.length)),\n feat: Math.max(headers.feat.length, ...rows.map((r) => r.feat.length)),\n };\n\n const lines: string[] = [\n `Available Antigravity Models (${models.length}${recommendedOnly ? \" recommended\" : \"\"}):`,\n ` ${headers.id.padEnd(w.id)} ${headers.name.padEnd(w.name)} ${headers.ctx.padEnd(w.ctx)} ${headers.feat.padEnd(w.feat)} ${headers.rem}`,\n ];\n for (const r of rows) {\n lines.push(\n ` ${r.id.padEnd(w.id)} ${r.name.padEnd(w.name)} ${r.ctx.padEnd(w.ctx)} ${r.feat.padEnd(w.feat)} ${r.rem.padStart(4)}`\n );\n }\n\n return lines.join(\"\\n\");\n}\n", "import {\n type AssistantMessage,\n type AssistantMessageEventStream,\n type Context,\n type Model,\n type SimpleStreamOptions,\n type TextContent,\n type ThinkingContent,\n createAssistantMessageEventStream,\n} from \"@earendil-works/pi-ai\";\nimport { parseStoredCredentials } from \"./auth.ts\";\nimport { createSseFeed, type SseBlockEvent } from \"./parser.ts\";\nimport { buildAntigravityRequestBody } from \"./builder.ts\";\nimport { buildAntigravityHeaders, DEFAULT_ENDPOINT } from \"./protocol.ts\";\nimport { resolveModelPlan, getCatalogSnapshot } from \"./catalog.ts\";\n\nexport function streamAntigravity(\n model: Model<any>,\n context: Context,\n options?: SimpleStreamOptions\n): AssistantMessageEventStream {\n const stream = createAssistantMessageEventStream();\n\n (async () => {\n const output: AssistantMessage = {\n role: \"assistant\",\n content: [],\n api: model.api,\n provider: model.provider,\n model: model.id,\n usage: {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n totalTokens: 0,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n },\n stopReason: \"pending\",\n timestamp: Date.now(),\n };\n\n try {\n stream.push({ type: \"start\", partial: output });\n\n const rawApiKey = options?.apiKey;\n if (!rawApiKey) {\n throw new Error(\"Missing Antigravity credentials. Run /login antigravity first.\");\n }\n\n const { token, projectId } = parseStoredCredentials(rawApiKey);\n\n const effort = options?.reasoning;\n // trajectoryId is provider-specific (absent from the SDK options\n // type), so read it via runtime-checked `in` narrowing instead of a cast.\n const trajectoryId =\n options && \"trajectoryId\" in options && typeof options.trajectoryId === \"string\"\n ? options.trajectoryId\n : undefined;\n const snapshot = getCatalogSnapshot();\n const plan = resolveModelPlan(model.id, effort, snapshot);\n\n const requestBody = buildAntigravityRequestBody({\n projectId,\n plan,\n context,\n sessionId: options?.sessionId,\n trajectoryId,\n maxOutputTokens: model.maxTokens,\n toolChoice: options?.toolChoice,\n });\n\n const res = await fetch(`${DEFAULT_ENDPOINT}/v1internal:streamGenerateContent?alt=sse`, {\n method: \"POST\",\n headers: buildAntigravityHeaders(token),\n body: JSON.stringify(requestBody),\n signal: options?.signal,\n });\n\n if (!res.ok) {\n const errText = await res.text();\n throw new Error(`Antigravity stream failed (${res.status}): ${errText}`);\n }\n\n if (!res.body) {\n throw new Error(\"No response stream received from Antigravity.\");\n }\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n const feed = createSseFeed();\n\n const applyUsage = (u: { input: number; output: number; cacheRead: number; total: number }) => {\n output.usage.input = u.input;\n output.usage.cacheRead = u.cacheRead;\n output.usage.output = u.output;\n output.usage.totalTokens = u.total;\n\n if (model.cost) {\n const c = model.cost;\n const inputCost = (output.usage.input * (c.input || 0)) / 1_000_000;\n const outputCost = (output.usage.output * (c.output || 0)) / 1_000_000;\n const cacheCost = (output.usage.cacheRead * (c.cacheRead || 0)) / 1_000_000;\n output.usage.cost = {\n input: inputCost,\n output: outputCost,\n cacheRead: cacheCost,\n cacheWrite: 0,\n total: inputCost + outputCost + cacheCost,\n };\n }\n };\n\n const applyStopReason = (r: \"stop\" | \"toolUse\" | \"length\" | \"error\") => {\n if (r === \"stop\") {\n if (output.stopReason === \"pending\") output.stopReason = \"stop\";\n } else {\n output.stopReason = r;\n }\n };\n\n const translate = (events: SseBlockEvent[]) => {\n for (const ev of events) {\n if (ev.kind === \"text_start\" || ev.kind === \"thinking_start\") {\n const isThinking = ev.kind === \"thinking_start\";\n output.content.push(\n isThinking ? { type: \"thinking\", thinking: \"\" } : { type: \"text\", text: \"\" }\n );\n stream.push(\n isThinking\n ? { type: \"thinking_start\", contentIndex: ev.index, partial: output }\n : { type: \"text_start\", contentIndex: ev.index, partial: output }\n );\n } else if (ev.kind === \"text_delta\" || ev.kind === \"thinking_delta\") {\n const block = output.content[ev.index];\n if (ev.kind === \"text_delta\" && block?.type === \"text\") {\n block.text += ev.delta;\n stream.push({ type: \"text_delta\", contentIndex: ev.index, delta: ev.delta, partial: output });\n } else if (ev.kind === \"thinking_delta\" && block?.type === \"thinking\") {\n block.thinking += ev.delta;\n if (ev.thoughtSignature) block.thinkingSignature = ev.thoughtSignature;\n stream.push({ type: \"thinking_delta\", contentIndex: ev.index, delta: ev.delta, partial: output });\n }\n } else if (ev.kind === \"text_end\" || ev.kind === \"thinking_end\") {\n stream.push(\n ev.kind === \"text_end\"\n ? { type: \"text_end\", contentIndex: ev.index, content: ev.content, partial: output }\n : { type: \"thinking_end\", contentIndex: ev.index, content: ev.content, partial: output }\n );\n } else if (ev.kind === \"toolCall\") {\n const toolCall = {\n type: \"toolCall\" as const,\n id: ev.block.id || `call_${output.content.length}`,\n name: ev.block.name as string,\n arguments: ev.block.arguments || {},\n thoughtSignature: ev.block.thoughtSignature,\n };\n\n output.content.push(toolCall);\n\n stream.push({ type: \"toolcall_start\", contentIndex: ev.index, partial: output });\n stream.push({\n type: \"toolcall_delta\",\n contentIndex: ev.index,\n delta: JSON.stringify(toolCall.arguments),\n partial: output,\n });\n stream.push({\n type: \"toolcall_end\",\n contentIndex: ev.index,\n toolCall: toolCall,\n partial: output,\n });\n }\n }\n };\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const fed = feed.feed(decoder.decode(value, { stream: true }));\n applyUsage(fed.usage);\n applyStopReason(fed.stopReason);\n translate(fed.events);\n }\n\n const closing = feed.close();\n applyUsage(closing.usage);\n applyStopReason(closing.stopReason);\n translate(closing.events);\n\n if (closing.thoughtSignature) {\n const thinkingBlock = output.content.find((c): c is ThinkingContent => c.type === \"thinking\");\n if (thinkingBlock && !thinkingBlock.thinkingSignature) {\n thinkingBlock.thinkingSignature = closing.thoughtSignature;\n } else if (!thinkingBlock) {\n // Lone-signature turn (no thinking block): the signature rides the\n // last text block's canonical textSignature, never the message.\n const textBlock = [...output.content].reverse().find((c): c is TextContent => c.type === \"text\");\n if (textBlock && !textBlock.textSignature) {\n textBlock.textSignature = closing.thoughtSignature;\n }\n }\n }\n\n const doneReason: \"stop\" | \"toolUse\" | \"length\" =\n output.stopReason === \"toolUse\" || output.stopReason === \"length\"\n ? output.stopReason\n : \"stop\";\n\n stream.push({\n type: \"done\",\n reason: doneReason,\n message: output,\n });\n stream.end();\n } catch (error) {\n output.stopReason = options?.signal?.aborted ? \"aborted\" : \"error\";\n output.errorMessage = error instanceof Error ? error.message : String(error);\n stream.push({ type: \"error\", reason: output.stopReason, error: output });\n stream.end();\n }\n })();\n\n return stream;\n}\n", "export interface ParsedBlock {\n type: \"text\" | \"thinking\" | \"toolCall\";\n text?: string;\n thinking?: string;\n thoughtSignature?: string;\n id?: string;\n name?: string;\n arguments?: Record<string, any>;\n}\n\nexport interface ParsedStreamResult {\n content: ParsedBlock[];\n usage: {\n input: number;\n output: number;\n cacheRead: number;\n total: number;\n };\n stopReason: \"stop\" | \"toolUse\" | \"length\" | \"error\";\n}\n\nexport type SseBlockEvent =\n | { kind: \"text_start\" | \"thinking_start\"; index: number }\n | { kind: \"text_delta\" | \"thinking_delta\"; index: number; delta: string; thoughtSignature?: string }\n | { kind: \"text_end\" | \"thinking_end\"; index: number; content: string }\n | { kind: \"toolCall\"; index: number; block: ParsedBlock };\n\nexport interface SseFeedOutput {\n events: SseBlockEvent[];\n usage: ParsedStreamResult[\"usage\"];\n stopReason: ParsedStreamResult[\"stopReason\"];\n thoughtSignature?: string;\n}\n\n/**\n * Stateful incremental SSE reader: the single module that understands the\n * Antigravity Wire Fingerprint on the wire. Feed raw response chunks as they\n * arrive; line buffering, block accumulation, usage, and stopReason all live\n * here. Callers only translate BlockEvents (thin adapters).\n */\nexport function createSseFeed(): {\n feed(chunk: string): SseFeedOutput;\n close(): SseFeedOutput;\n result(): ParsedStreamResult;\n} {\n const content: ParsedBlock[] = [];\n const usage = {\n input: 0,\n output: 0,\n cacheRead: 0,\n total: 0,\n };\n let stopReason: ParsedStreamResult[\"stopReason\"] = \"stop\";\n let lastThoughtSignature: string | undefined;\n let buffer = \"\";\n let openType: \"text\" | \"thinking\" | null = null;\n\n const snapshot = (events: SseBlockEvent[]): SseFeedOutput => ({\n events,\n usage: { ...usage },\n stopReason,\n ...(lastThoughtSignature ? { thoughtSignature: lastThoughtSignature } : {}),\n });\n\n const closeOpenBlock = (events: SseBlockEvent[]): void => {\n if (openType === null) return;\n const index = content.length - 1;\n const block = content[index];\n if (openType === \"thinking\") {\n events.push({ kind: \"thinking_end\", index, content: block.thinking || \"\" });\n } else {\n events.push({ kind: \"text_end\", index, content: block.text || \"\" });\n }\n openType = null;\n };\n\n const processLine = (rawLine: string, events: SseBlockEvent[]): void => {\n const line = rawLine.trim();\n if (!line.startsWith(\"data:\")) return;\n\n const dataStr = line.slice(5).trim();\n if (!dataStr || dataStr === \"[DONE]\") return;\n\n let payload: any;\n try {\n payload = JSON.parse(dataStr);\n } catch {\n return;\n }\n\n const response = payload.response || payload;\n\n // Usage metadata (promptTokenCount includes cached tokens per Google spec).\n // output counts thinking tokens too, mirroring the pi-ai Google adapter:\n // usageMetadata reports candidates and thoughts separately.\n if (response.usageMetadata) {\n const um = response.usageMetadata;\n const promptTokens = typeof um.promptTokenCount === \"number\" ? um.promptTokenCount : 0;\n const cacheRead = typeof um.cachedContentTokenCount === \"number\" ? um.cachedContentTokenCount : 0;\n usage.input = Math.max(0, promptTokens - cacheRead);\n usage.cacheRead = cacheRead;\n const candidates = typeof um.candidatesTokenCount === \"number\" ? um.candidatesTokenCount : 0;\n const thoughts = typeof um.thoughtsTokenCount === \"number\" ? um.thoughtsTokenCount : 0;\n usage.output = candidates + thoughts;\n if (typeof um.totalTokenCount === \"number\") usage.total = um.totalTokenCount;\n }\n\n const candidate = response.candidates?.[0];\n if (!candidate) return;\n\n // Sticky: length/error/toolUse are never downgraded by a later STOP.\n // Mirrors pi-ai mapStopReasonString: only STOP is benign, MAX_TOKENS is\n // length, every other reason (SAFETY, RECITATION, BLOCKLIST, ...) is error.\n if (candidate.finishReason === \"MAX_TOKENS\") {\n stopReason = \"length\";\n } else if (typeof candidate.finishReason === \"string\" && candidate.finishReason !== \"STOP\") {\n stopReason = \"error\";\n }\n\n const parts = candidate.content?.parts || [];\n for (const part of parts) {\n if (part.thoughtSignature) {\n lastThoughtSignature = part.thoughtSignature;\n }\n\n if (part.thought) {\n if (openType !== \"thinking\") {\n closeOpenBlock(events);\n content.push({ type: \"thinking\", thinking: \"\" });\n events.push({ kind: \"thinking_start\", index: content.length - 1 });\n openType = \"thinking\";\n }\n const block = content[content.length - 1];\n const delta = part.text || \"\";\n block.thinking = (block.thinking || \"\") + delta;\n if (part.thoughtSignature) {\n block.thoughtSignature = part.thoughtSignature;\n }\n events.push({\n kind: \"thinking_delta\",\n index: content.length - 1,\n delta,\n ...(part.thoughtSignature ? { thoughtSignature: part.thoughtSignature } : {}),\n });\n } else if (part.functionCall) {\n closeOpenBlock(events);\n stopReason = \"toolUse\";\n const block: ParsedBlock = {\n type: \"toolCall\",\n id: part.functionCall.id || `call_${content.length}`,\n name: part.functionCall.name,\n arguments: part.functionCall.args || {},\n thoughtSignature: part.thoughtSignature || lastThoughtSignature,\n };\n content.push(block);\n events.push({ kind: \"toolCall\", index: content.length - 1, block });\n } else if (part.text !== undefined) {\n if (openType !== \"text\") {\n closeOpenBlock(events);\n content.push({ type: \"text\", text: \"\" });\n events.push({ kind: \"text_start\", index: content.length - 1 });\n openType = \"text\";\n }\n const block = content[content.length - 1];\n block.text = (block.text || \"\") + part.text;\n events.push({ kind: \"text_delta\", index: content.length - 1, delta: part.text });\n }\n }\n };\n\n return {\n feed(chunk: string): SseFeedOutput {\n const events: SseBlockEvent[] = [];\n buffer += chunk;\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() || \"\";\n for (const rawLine of lines) processLine(rawLine, events);\n return snapshot(events);\n },\n close(): SseFeedOutput {\n const events: SseBlockEvent[] = [];\n if (buffer.trim() !== \"\") processLine(buffer, events);\n buffer = \"\";\n closeOpenBlock(events);\n return snapshot(events);\n },\n result(): ParsedStreamResult {\n return {\n content,\n usage: { ...usage },\n stopReason,\n };\n },\n };\n}\n\n", "import { createHash, randomUUID } from \"node:crypto\";\nimport type { ModelPlan } from \"./catalog.ts\";\nimport { extractBaseModelId } from \"./catalog.ts\";\nimport { PROVIDER_ID } from \"./protocol.ts\";\n\nexport interface BuildRequestBodyParams {\n projectId: string;\n plan: ModelPlan;\n context: {\n systemPrompt?: string;\n messages: Array<any>;\n tools?: Array<any>;\n };\n sessionId?: string;\n trajectoryId?: string;\n maxOutputTokens?: number;\n toolChoice?: string;\n}\n\nconst BASE64_SIGNATURE_PATTERN = /^[A-Za-z0-9+/_-]+={0,2}$/;\n\n/**\n * Verifies that a thought signature candidate is a valid base64 string suitable\n * for Google Protobuf TYPE_BYTES fields in JSON mapping.\n */\nfunction isValidThoughtSignature(sig: unknown): sig is string {\n if (typeof sig !== \"string\" || sig.length === 0) return false;\n if (sig.includes(\"=\") && sig.length % 4 !== 0) return false;\n return BASE64_SIGNATURE_PATTERN.test(sig);\n}\n\n/**\n * Resolves a thoughtSignature candidate only when coming from the same provider and\n * compatible model family, and only when formatted as valid base64.\n */\nfunction resolveThoughtSignature(\n isSameProviderAndModel: boolean,\n sig: unknown\n): string | undefined {\n if (!isSameProviderAndModel) return undefined;\n return isValidThoughtSignature(sig) ? sig : undefined;\n}\n\n/**\n * Checks model family compatibility for thoughtSignature replay.\n * Official agy CLI wire captures demonstrate that:\n * - Gemini models (gemini-3.7, gemini-3.8, etc.) share thoughtSignatures seamlessly.\n * - Claude models replay thoughtSignatures within the Claude family, part-split\n * like Gemini (1.1.27 stream_turn8/9 counter-capture).\n * - Non-Gemini models (Claude, GPT-OSS) do NOT share signatures with Gemini models.\n */\nfunction isCompatibleModelFamily(msgModel?: string, targetModelId?: string): boolean {\n if (!msgModel || !targetModelId) return true;\n if (msgModel === targetModelId) return true;\n\n const isMsgGemini = msgModel.startsWith(\"gemini-\");\n const isTargetGemini = targetModelId.startsWith(\"gemini-\");\n if (isMsgGemini && isTargetGemini) return true;\n\n const isMsgClaude = msgModel.startsWith(\"claude-\");\n const isTargetClaude = targetModelId.startsWith(\"claude-\");\n if (isMsgClaude && isTargetClaude) return true;\n\n const isMsgGpt = msgModel.startsWith(\"gpt-\");\n const isTargetGpt = targetModelId.startsWith(\"gpt-\");\n if (isMsgGpt && isTargetGpt) return true;\n\n return extractBaseModelId(msgModel) === extractBaseModelId(targetModelId);\n}\n\n/**\n * Deterministically derives a persistent session ID from the initial conversation turn.\n */\nfunction deriveSessionId(\n context: { messages?: Array<any>; systemPrompt?: string },\n explicitSessionId?: string\n): string {\n if (explicitSessionId && typeof explicitSessionId === \"string\" && explicitSessionId.trim().length > 0) {\n return explicitSessionId.trim();\n }\n\n const firstMsg = context.messages?.[0];\n if (!firstMsg) {\n return randomUUID();\n }\n\n const seedContent =\n typeof firstMsg.content === \"string\"\n ? firstMsg.content\n : JSON.stringify(firstMsg.content || \"\");\n\n const hash = createHash(\"sha256\")\n .update(`antigravity:conversation:${seedContent}`)\n .digest()\n .subarray(0, 16);\n\n hash[6] = (hash[6] & 0x0f) | 0x40; // v4 UUID\n hash[8] = (hash[8] & 0x3f) | 0x80;\n const hex = [...hash].map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n\n/**\n * Computes deterministic v5 UUID trajectory ID from the session ID.\n */\nfunction resolveSessionTrajectory(sessionId: string): string {\n const bytes = createHash(\"sha1\").update(`antigravity:${sessionId}`).digest().subarray(0, 16);\n bytes[6] = (bytes[6] & 0x0f) | 0x50; // v5 UUID\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n const hex = [...bytes].map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n\n/**\n * Computes signed 64-bit integer session ID matching official agy CLI Wire Fingerprint.\n */\nfunction resolveNumericSessionId(sessionId: string): string {\n if (/^-?\\d+$/.test(sessionId)) {\n return sessionId;\n }\n const hash = createHash(\"sha256\").update(`antigravity:session:${sessionId}`).digest();\n return hash.readBigInt64BE(0).toString();\n}\n\n/**\n * Normalizes tool call IDs for cross-provider compatibility.\n */\nfunction normalizeToolCallId(id: string | undefined): string | undefined {\n if (!id || typeof id !== \"string\") return id;\n return id.replace(/[^a-zA-Z0-9_-]/g, \"_\").slice(0, 64);\n}\n\nconst CUSTOM_TOOL_SCHEMA_ALLOW = new Set([\n \"type\",\n \"description\",\n \"properties\",\n \"required\",\n \"items\",\n \"enum\",\n]);\n\nfunction stripMetaSchema(schema: unknown): unknown {\n if (!schema || typeof schema !== \"object\" || Array.isArray(schema)) return schema;\n const omit = new Set([\"$schema\", \"$id\", \"$defs\", \"definitions\"]);\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(schema)) {\n if (!omit.has(key)) out[key] = stripMetaSchema(value);\n }\n return out;\n}\n\nfunction normalizeCustomToolSchema(schema: unknown): unknown {\n if (!schema || typeof schema !== \"object\") return schema;\n if (Array.isArray(schema)) return schema.map(normalizeCustomToolSchema);\n\n const s = schema as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(s)) {\n if (!CUSTOM_TOOL_SCHEMA_ALLOW.has(key)) {\n // Map string const to single-item enum for Claude bridge compatibility\n if (key === \"const\" && s.enum === undefined && typeof value === \"string\") {\n out.enum = [value];\n }\n continue;\n }\n if (key === \"type\" && Array.isArray(value)) {\n const scalar = value.find((e) => typeof e === \"string\" && e !== \"null\");\n if (scalar) out.type = scalar;\n continue;\n }\n if (key === \"properties\" && value && typeof value === \"object\" && !Array.isArray(value)) {\n const props: Record<string, unknown> = {};\n for (const [propName, propSchema] of Object.entries(value as Record<string, unknown>)) {\n props[propName] = normalizeCustomToolSchema(propSchema);\n }\n out.properties = props;\n continue;\n }\n if (key === \"enum\" && Array.isArray(value) && !value.every((e) => typeof e === \"string\")) {\n continue;\n }\n out[key] = normalizeCustomToolSchema(value);\n }\n return out;\n}\n\n/**\n * Strict agy parity: versioned captures (1.1.26/1.1.27, every declaration)\n * always use legacy `parameters`, never `parametersJsonSchema` \u2014 for Gemini\n * and non-Gemini models alike. Captured declarations also carry no\n * anyOf/patternProperties/const keys, hence the normalization below.\n */\nfunction convertTools(\n tools: Array<any> | undefined\n): Array<{ functionDeclarations: Array<any> }> | undefined {\n if (!tools?.length) return undefined;\n return [\n {\n functionDeclarations: tools.map((tool) => {\n const schema = stripMetaSchema(tool.parameters) || { type: \"object\", properties: {} };\n return {\n name: tool.name,\n description: tool.description,\n parameters: normalizeCustomToolSchema(schema),\n };\n }),\n },\n ];\n}\n\n/**\n * Translates one Turn Trace (see CONTEXT.md) into Antigravity wire contents.\n */\nfunction translateTurnTrace(\n context: { messages?: Array<any>; systemPrompt?: string },\n runtimeModelId: string\n): Array<any> {\n const contents: Array<any> = [];\n const messages = context.messages || [];\n\n for (const msg of messages) {\n if (msg.role === \"user\") {\n const parts: Array<any> = [];\n if (typeof msg.content === \"string\") {\n parts.push({ text: msg.content });\n } else if (Array.isArray(msg.content)) {\n for (const item of msg.content) {\n if (item.type === \"text\") {\n parts.push({ text: item.text });\n } else if (item.type === \"image\") {\n parts.push({\n inlineData: {\n mimeType: item.mimeType || \"image/png\",\n data: item.data,\n },\n });\n }\n }\n }\n if (parts.length > 0) {\n contents.push({ role: \"user\", parts });\n }\n } else if (msg.role === \"assistant\") {\n if (msg.stopReason === \"error\" || msg.stopReason === \"aborted\") {\n continue;\n }\n\n const isSameProvider = !msg.provider || msg.provider === PROVIDER_ID;\n const isSameModel = isCompatibleModelFamily(msg.model, runtimeModelId);\n const isSameProviderAndModel = isSameProvider && isSameModel;\n\n const parts: Array<any> = [];\n // agy CLI shape (1.1.27 turn4 fixture): a thinking replay never carries its\n // own signature \u2014 it stays pending and rides on the NEXT text/functionCall\n // part. Only when the turn ends with no carrying part does it fall back\n // onto the last part (uncovered edge, same as the message-level fallback).\n // Signature fields are canonical SDK spellings only (textSignature /\n // thinkingSignature on blocks, thoughtSignature on toolCalls). No\n // legacy-spelling reads: pre-#26 sessions are abandoned (see #26).\n let pendingThinkingSig: string | undefined;\n if (typeof msg.content === \"string\") {\n parts.push({ text: msg.content });\n } else if (Array.isArray(msg.content)) {\n for (const item of msg.content) {\n if (item.type === \"text\") {\n const part: any = { text: item.text };\n const sig =\n resolveThoughtSignature(\n isSameProviderAndModel,\n item.textSignature\n ) || pendingThinkingSig;\n if (sig) {\n part.thoughtSignature = sig;\n pendingThinkingSig = undefined;\n }\n parts.push(part);\n } else if (item.type === \"thinking\") {\n const candidateSig = item.thinkingSignature;\n const isForeignReasoning =\n !isSameProviderAndModel ||\n (typeof candidateSig === \"string\" && candidateSig.trim().startsWith(\"{\"));\n\n if (!isForeignReasoning) {\n // No thoughtSignature here by design: it stays pending for the\n // next text/functionCall part (agy CLI part-split shape).\n const part: any = {\n thought: true,\n text: item.thinking || \"\",\n };\n const sig = resolveThoughtSignature(true, candidateSig);\n if (sig) {\n pendingThinkingSig = sig;\n }\n parts.push(part);\n } else {\n // Cross-provider/model or foreign reasoning item: drop foreign signature and\n // serialize reasoning text (or summary) as plain text so the model retains\n // conversation context without failing Google's TYPE_BYTES base64 validation.\n let text = item.thinking || \"\";\n if (!text && typeof candidateSig === \"string\" && candidateSig.trim().startsWith(\"{\")) {\n try {\n const parsed = JSON.parse(candidateSig);\n if (Array.isArray(parsed.summary)) {\n text = parsed.summary\n .filter((s: any) => s && typeof s.text === \"string\")\n .map((s: any) => s.text)\n .join(\"\\n\");\n }\n } catch {\n // Ignore JSON parse errors\n }\n }\n if (text && text.trim() !== \"\") {\n parts.push({ text });\n }\n }\n } else if (item.type === \"tool_use\" || item.type === \"toolCall\") {\n const part: any = {\n functionCall: {\n id: normalizeToolCallId(item.id),\n name: item.name,\n args: item.input || item.arguments || {},\n },\n };\n const sig =\n resolveThoughtSignature(\n isSameProviderAndModel,\n item.thoughtSignature\n ) || pendingThinkingSig;\n if (sig) {\n part.thoughtSignature = sig;\n pendingThinkingSig = undefined;\n }\n parts.push(part);\n }\n }\n }\n if (parts.length > 0) {\n if (pendingThinkingSig && !parts.some((p) => p.thoughtSignature)) {\n parts[parts.length - 1].thoughtSignature = pendingThinkingSig;\n }\n contents.push({ role: \"model\", parts });\n }\n } else if (msg.role === \"toolResult\") {\n let toolName = msg.toolName || msg.name;\n if (!toolName && (msg.toolCallId || msg.id)) {\n const rawTargetId = msg.toolCallId || msg.id;\n const normTargetId = normalizeToolCallId(rawTargetId);\n for (const prev of messages) {\n if (prev.role === \"assistant\" && Array.isArray(prev.content)) {\n const found = prev.content.find(\n (c: any) =>\n (c.type === \"tool_use\" || c.type === \"toolCall\") &&\n (c.id === rawTargetId || normalizeToolCallId(c.id) === normTargetId)\n );\n if (found) {\n toolName = found.name;\n break;\n }\n }\n }\n }\n\n let toolText = \"\";\n const imageParts: Array<any> = [];\n\n if (Array.isArray(msg.content)) {\n const textParts: string[] = [];\n for (const c of msg.content) {\n if (typeof c === \"string\") {\n textParts.push(c);\n } else if (c.type === \"text\") {\n textParts.push(c.text);\n } else if (c.type === \"image\") {\n imageParts.push({\n inlineData: {\n mimeType: c.mimeType || \"image/png\",\n data: c.data,\n },\n });\n } else {\n textParts.push(JSON.stringify(c));\n }\n }\n toolText = textParts.join(\"\\n\");\n } else if (typeof msg.content === \"string\") {\n toolText = msg.content;\n } else if (msg.content) {\n toolText = JSON.stringify(msg.content);\n }\n\n // Strict agy parity (captured 2026-09-05 via mitmdump, agy 1.1.26):\n // - response is always { output: string }, never a top-level list.\n // - error tool results also use the \"output\" key.\n const responseObj = { output: toolText };\n\n const functionResponse: any = {\n name: toolName || \"tool\",\n response: responseObj,\n };\n\n const rawCallId = msg.toolCallId || msg.id;\n const callId = normalizeToolCallId(rawCallId);\n if (callId) {\n functionResponse.id = callId;\n }\n\n if (imageParts.length > 0) {\n functionResponse.parts = imageParts;\n }\n\n contents.push({\n role: \"model\",\n parts: [{ functionResponse }],\n });\n }\n }\n\n // Antigravity rejects requests ending with an incomplete model turn.\n if (contents.length > 0) {\n const lastContent = contents[contents.length - 1];\n if (\n lastContent.role === \"model\" &&\n !lastContent.parts?.some((p: any) => p.functionResponse)\n ) {\n contents.push({\n role: \"user\",\n parts: [{ text: \"continue\" }],\n });\n }\n }\n\n return contents;\n}\n\n/**\n * Builds the complete Antigravity Wire Fingerprint request envelope.\n * Encapsulates session identity derivation, Thought Signature replay,\n * Turn Trace translation, and tool schema normalization.\n */\nexport function buildAntigravityRequestBody(params: BuildRequestBodyParams): Record<string, any> {\n const {\n projectId,\n plan,\n context,\n maxOutputTokens = 65536,\n } = params;\n const runtimeModelId = plan.runtimeModelId;\n\n const sessionId = deriveSessionId(context, params.sessionId);\n const trajectoryId =\n params.trajectoryId && typeof params.trajectoryId === \"string\" && params.trajectoryId.trim().length > 0\n ? params.trajectoryId.trim()\n : resolveSessionTrajectory(sessionId);\n const contents = translateTurnTrace(context, runtimeModelId);\n\n // Request ID sequence increments by completed assistant turns\n const requestIndex = context.messages.filter((m) => m.role === \"assistant\").length;\n const requestId = `agent/${sessionId}/${Date.now()}/${trajectoryId}/${contents.length}`;\n\n const modelEnum = plan.modelEnum;\n\n const labels: Record<string, string> = {\n last_step_index: String(Math.max(0, contents.length - 1)),\n model_enum: modelEnum,\n request_id: `${trajectoryId}-${requestIndex}`,\n trajectory_id: trajectoryId,\n used_claude: String(plan.isClaude),\n used_claude_conservative: String(plan.isClaude),\n used_non_gemini_model: String(plan.isNonGemini),\n };\n\n const generationConfig: Record<string, any> = {\n maxOutputTokens,\n thinkingConfig: plan.thinkingConfig,\n };\n\n const request: Record<string, any> = {\n contents,\n };\n\n if (context.systemPrompt) {\n request.systemInstruction = {\n role: \"user\",\n parts: [{ text: context.systemPrompt }],\n };\n }\n\n const tools = convertTools(context.tools);\n if (tools) {\n request.tools = tools;\n }\n\n if (params.toolChoice && params.toolChoice !== \"auto\" && params.toolChoice !== \"Auto\") {\n let mode = \"AUTO\";\n const tc = String(params.toolChoice).toLowerCase();\n if (tc === \"none\") mode = \"NONE\";\n else if (tc === \"any\" || tc === \"required\") mode = \"ANY\";\n request.toolConfig = {\n functionCallingConfig: {\n mode,\n },\n };\n }\n\n request.labels = labels;\n request.generationConfig = generationConfig;\n request.sessionId = resolveNumericSessionId(sessionId);\n\n return {\n project: projectId,\n requestId,\n request,\n model: runtimeModelId,\n userAgent: \"antigravity\",\n requestType: \"agent\",\n };\n}\n", "import { buildAntigravityHeaders, DEFAULT_ENDPOINT } from \"./protocol.ts\";\n\nexport interface QuotaBucket {\n bucketId: string;\n displayName: string;\n window?: string;\n resetTime?: string;\n description?: string;\n remainingFraction: number;\n}\n\nexport interface QuotaGroup {\n displayName: string;\n description?: string;\n buckets: QuotaBucket[];\n}\n\nexport interface QuotaSummary {\n groups: QuotaGroup[];\n description?: string;\n}\n\nexport function renderProgressBar(fraction: number, width = 10): string {\n const clamped = Math.max(0, Math.min(1, fraction));\n const filled = Math.round(clamped * width);\n return `[${\"#\".repeat(filled)}${\"-\".repeat(width - filled)}]`;\n}\n\ntype QuotaWindowKind = \"5h\" | \"weekly\" | \"other\";\n\nconst QUOTA_WINDOW_RANK: Record<QuotaWindowKind, number> = {\n \"5h\": 0,\n weekly: 1,\n other: 2,\n};\n\nfunction classifyQuotaWindow(bucket: QuotaBucket): QuotaWindowKind {\n const s = `${bucket.window || \"\"} ${bucket.displayName || \"\"} ${bucket.bucketId || \"\"}`.toLowerCase();\n if (s.includes(\"5h\") || s.includes(\"five\") || s.includes(\"rolling\")) return \"5h\";\n if (s.includes(\"week\")) return \"weekly\";\n return \"other\";\n}\n\nfunction shortWindowLabel(bucket: QuotaBucket, kind: QuotaWindowKind): string {\n if (kind === \"5h\") return \"5h\";\n if (kind === \"weekly\") return \"Wk\";\n return bucket.displayName || bucket.bucketId || \"Quota\";\n}\n\nfunction sortQuotaBuckets(buckets: QuotaBucket[]): QuotaBucket[] {\n return buckets\n .slice()\n .sort((a, b) => QUOTA_WINDOW_RANK[classifyQuotaWindow(a)] - QUOTA_WINDOW_RANK[classifyQuotaWindow(b)]);\n}\n\nfunction formatResetRemaining(resetTime?: string): string | null {\n if (!resetTime) return null;\n const ts = Date.parse(resetTime);\n if (!Number.isFinite(ts)) return null;\n const delta = ts - Date.now();\n if (delta <= 0) return \"ready\";\n const totalMin = Math.ceil(delta / 60000);\n const days = Math.floor(totalMin / (60 * 24));\n const hours = Math.floor((totalMin % (60 * 24)) / 60);\n const mins = totalMin % 60;\n if (days > 0) return `in ${days}d ${hours}h`;\n if (hours > 0) return `in ${hours}h ${mins}m`;\n return `in ${mins}m`;\n}\n\nexport function parseQuotaSummary(data: any): QuotaSummary {\n const groups: QuotaGroup[] = [];\n\n for (const g of data.groups || []) {\n const buckets: QuotaBucket[] = [];\n for (const b of g.buckets || []) {\n buckets.push({\n bucketId: b.bucketId || \"unknown\",\n displayName: b.displayName || b.bucketId || \"Limit\",\n window: b.window,\n resetTime: b.resetTime,\n description: b.description,\n remainingFraction: typeof b.remainingFraction === \"number\" ? b.remainingFraction : 1,\n });\n }\n groups.push({\n displayName: g.displayName || \"Quota Group\",\n description: g.description,\n buckets,\n });\n }\n\n return {\n groups,\n description: data.description,\n };\n}\n\nexport function formatQuotaSummary(summary: QuotaSummary): string {\n const lines: string[] = [];\n\n for (const group of summary.groups) {\n if (lines.length > 0) lines.push(\"\");\n lines.push(`${group.displayName}`);\n for (const b of sortQuotaBuckets(group.buckets)) {\n const pct = Math.round(b.remainingFraction * 100);\n const label = shortWindowLabel(b, classifyQuotaWindow(b)).padEnd(3);\n const reset = formatResetRemaining(b.resetTime);\n const suffix = reset && pct < 100 ? ` (${reset})` : \"\";\n lines.push(` ${label} ${renderProgressBar(b.remainingFraction)} ${String(pct).padStart(3)}% left${suffix}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nexport async function fetchQuotaSummary(\n token: string,\n projectId = \"aicode-consumers\",\n endpoint = DEFAULT_ENDPOINT,\n signal?: AbortSignal\n): Promise<QuotaSummary> {\n const res = await fetch(`${endpoint}/v1internal:retrieveUserQuotaSummary`, {\n method: \"POST\",\n headers: buildAntigravityHeaders(token),\n body: JSON.stringify({ project: projectId }),\n signal,\n });\n if (!res.ok) {\n const errText = await res.text();\n throw new Error(`Failed to fetch quota summary (${res.status}): ${errText}`);\n }\n const json = await res.json();\n return parseQuotaSummary(json);\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { parseStoredCredentials } from \"./auth.ts\";\nimport { DEFAULT_ENDPOINT, PROVIDER_ID } from \"./protocol.ts\";\nimport {\n fetchQuotaSummary,\n formatQuotaSummary,\n} from \"./quota.ts\";\nimport {\n fetchAvailableModelsCatalog,\n formatModelsList,\n} from \"./catalog.ts\";\n\nconst USAGE_TEXT =\n \"Usage: /antigravity <command>\\n\\nCommands:\\n usage Show 5h and weekly quota pool limits\\n models List recommended models with context window and remaining quota (alias: model)\\n refresh Force refresh model catalog\\n login Run /login antigravity\";\n\ninterface FetchSubcommand {\n progress: string;\n errLabel: string;\n run: (token: string, projectId: string, signal?: AbortSignal) => Promise<string>;\n}\n\nconst FETCH_SUBCOMMANDS: Record<string, FetchSubcommand> = {\n usage: {\n progress: \"Fetching quota summary\u2026\",\n errLabel: \"usage\",\n run: (token, projectId, signal) =>\n fetchQuotaSummary(token, projectId, DEFAULT_ENDPOINT, signal).then(formatQuotaSummary),\n },\n models: {\n progress: \"Fetching available models\u2026\",\n errLabel: \"models\",\n run: (token, projectId, signal) =>\n fetchAvailableModelsCatalog(token, projectId, DEFAULT_ENDPOINT, signal).then(formatModelsList),\n },\n};\n\nfunction emitOutput(ctx: ExtensionCommandContext, text: string, type: \"info\" | \"warning\" | \"error\" = \"info\"): void {\n if (ctx.hasUI) {\n ctx.ui.notify(text, type);\n } else {\n if (type === \"error\" || type === \"warning\") console.error(text);\n else console.log(text);\n }\n}\n\nexport async function resolveToken(\n ctx: ExtensionCommandContext\n): Promise<{ token: string; projectId: string } | null> {\n const apiKey = await ctx.modelRegistry?.getApiKeyForProvider?.(PROVIDER_ID);\n if (!apiKey) return null;\n return parseStoredCredentials(apiKey);\n}\n\nasync function runWithToken(\n ctx: ExtensionCommandContext,\n cmd: FetchSubcommand\n): Promise<void> {\n const creds = await resolveToken(ctx);\n if (!creds) {\n emitOutput(ctx, \"Not logged in. Run /login antigravity first.\", \"warning\");\n return;\n }\n try {\n if (ctx.hasUI) ctx.ui.notify(cmd.progress, \"info\");\n emitOutput(ctx, await cmd.run(creds.token, creds.projectId, ctx.signal));\n } catch (err: any) {\n emitOutput(ctx, `Failed to fetch ${cmd.errLabel}: ${err.message}`, \"error\");\n }\n}\n\nexport function parseAntigravitySubcommand(args: string): string {\n const sub = (args || \"\").trim().toLowerCase();\n // \"model\" is an alias of \"models\"\n return sub === \"model\" ? \"models\" : sub;\n}\n\nexport async function runAntigravitySubcommand(args: string, ctx: ExtensionCommandContext): Promise<void> {\n const sub = parseAntigravitySubcommand(args);\n\n const fetchCmd = FETCH_SUBCOMMANDS[sub];\n if (fetchCmd) {\n await runWithToken(ctx, fetchCmd);\n return;\n }\n\n if (sub === \"refresh\") {\n try {\n if (ctx.hasUI) ctx.ui.notify(\"Refreshing models\u2026\", \"info\");\n await ctx.modelRegistry?.refresh?.({ force: true, providers: [PROVIDER_ID], signal: ctx.signal });\n emitOutput(ctx, \"Antigravity models refreshed successfully.\");\n } catch (err: any) {\n emitOutput(ctx, `Failed to refresh: ${err.message}`, \"error\");\n }\n return;\n }\n\n if (sub === \"login\") {\n if (ctx.hasUI) {\n ctx.ui.setEditorText(\"/login antigravity\");\n ctx.ui.notify(\"Press Enter to log in to Antigravity.\", \"info\");\n } else {\n emitOutput(ctx, \"Please run /login antigravity to authenticate.\");\n }\n return;\n }\n\n emitOutput(ctx, USAGE_TEXT);\n}\n", "import type { ExtensionAPI, ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { loginAntigravity, refreshAntigravityToken, getApiKey } from \"./auth.ts\";\nimport { DEFAULT_ENDPOINT, PROVIDER_ID } from \"./protocol.ts\";\nimport { extractBaseModelId, refreshCatalog } from \"./catalog.ts\";\nimport { streamAntigravity } from \"./stream.ts\";\nimport { runAntigravitySubcommand } from \"./commands.ts\";\n\nexport { PROVIDER_ID, extractBaseModelId };\nexport const PROVIDER_NAME = \"Antigravity\";\n\nexport default function (pi: ExtensionAPI): void {\n pi.registerProvider(PROVIDER_ID, {\n name: PROVIDER_NAME,\n baseUrl: DEFAULT_ENDPOINT,\n api: \"antigravity-api\",\n models: [], // Purely dynamic provider per Pi SDK architecture\n oauth: {\n name: PROVIDER_NAME,\n login: loginAntigravity,\n refreshToken: refreshAntigravityToken,\n getApiKey,\n },\n streamSimple: streamAntigravity,\n refreshModels: async (context: any) => refreshCatalog(context),\n });\n\n pi.registerCommand(\"antigravity\", {\n description: \"Antigravity provider commands (/antigravity [usage|models|refresh|login])\",\n handler: async (args: string, ctx: ExtensionCommandContext) => {\n await runAntigravitySubcommand(args, ctx);\n },\n });\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
3
|
+
"sources": ["../src/auth.ts", "../src/protocol.ts", "../src/catalog-view.ts", "../src/model-catalog.ts", "../src/catalog-refresh.ts", "../src/stream.ts", "../src/parser.ts", "../src/builder.ts", "../src/quota.ts", "../src/commands.ts", "../src/index.ts"],
|
|
4
|
+
"sourcesContent": ["import { createHash, randomBytes } from \"node:crypto\";\nimport type { OAuthCredentials, OAuthLoginCallbacks } from \"@earendil-works/pi-ai\";\nimport { buildAntigravityHeaders, DEFAULT_ENDPOINT } from \"./protocol.ts\";\n\nexport const REDIRECT_URI = \"https://antigravity.google/oauth-callback\";\nexport const AUTH_URL = \"https://accounts.google.com/o/oauth2/auth\";\nexport const TOKEN_URL = \"https://oauth2.googleapis.com/token\";\nexport const OAUTH_CALLBACK_TIMEOUT_MS = 5 * 60 * 1000;\n\nexport const SCOPES = [\n \"https://www.googleapis.com/auth/cloud-platform\",\n \"https://www.googleapis.com/auth/userinfo.email\",\n \"https://www.googleapis.com/auth/userinfo.profile\",\n \"https://www.googleapis.com/auth/cclog\",\n \"https://www.googleapis.com/auth/experimentsandconfigs\",\n \"https://www.googleapis.com/auth/aicode\",\n \"openid\",\n];\n\nexport const CLIENT_ID =\n process.env.ANTIGRAVITY_CLIENT_ID ||\n Buffer.from(\n \"MTA3MTAwNjA2MDU5MS10bWhzc2luMmgyMWxjcmUyMzV2dG9sb2poNGc0MDNlcC5hcHBzLmdvb2dsZXVzZXJjb250ZW50LmNvbQ==\",\n \"base64\"\n ).toString(\"utf-8\");\n\nexport const CLIENT_SECRET =\n process.env.ANTIGRAVITY_CLIENT_SECRET ||\n Buffer.from(\"R09DU1BYLUs1OEZXUjQ4NkxkTEoxbUxCOHNYQzR6NnFEQWY=\", \"base64\").toString(\"utf-8\");\n\nfunction base64Url(buf: Buffer): string {\n return buf.toString(\"base64url\");\n}\n\nexport function extractCodeFromInput(rawInput: string): string {\n let code = rawInput.trim();\n if (!code) {\n throw new Error(\"No authorization code provided\");\n }\n\n if (code.startsWith(\"code=\")) {\n code = code.slice(5).trim();\n if (!code) {\n throw new Error(\"No authorization code provided\");\n }\n }\n\n // Reject callback URLs and other non-code input here instead of passing\n // garbage downstream (Google rejects those with a bare invalid_grant).\n // Note: real codes contain \"/\" (e.g. \"4/0ATs\u2026\"), so only reject\n // characters a code can never contain.\n if (/[\\s:?#&=%+]/.test(code)) {\n throw new Error(\"Invalid authorization code: paste the code value itself, not the callback URL\");\n }\n\n return code;\n}\n\nfunction generatePKCE(): { verifier: string; challenge: string } {\n const verifier = base64Url(randomBytes(32));\n const challenge = base64Url(createHash(\"sha256\").update(verifier).digest());\n return { verifier, challenge };\n}\n\nexport async function fetchProjectId(\n token: string,\n endpoint = DEFAULT_ENDPOINT,\n signal?: AbortSignal\n): Promise<string> {\n try {\n const res = await fetch(`${endpoint}/v1internal:loadCodeAssist`, {\n method: \"POST\",\n headers: buildAntigravityHeaders(token),\n body: JSON.stringify({ metadata: { ideType: \"ANTIGRAVITY\" } }),\n signal,\n });\n if (res.ok) {\n const data = (await res.json()) as { cloudaicompanionProject?: string };\n if (data.cloudaicompanionProject) {\n return data.cloudaicompanionProject;\n }\n }\n } catch {\n // Fall back to standard project\n }\n return \"aicode-consumers\";\n}\n\nexport async function loginAntigravity(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials> {\n const { verifier, challenge } = generatePKCE();\n // state is still sent for agy wire parity, but never validated back:\n // with code-only paste the callback URL (and its state) never reaches us.\n const state = randomBytes(16).toString(\"hex\");\n\n const authParams = new URLSearchParams({\n client_id: CLIENT_ID,\n response_type: \"code\",\n redirect_uri: REDIRECT_URI,\n scope: SCOPES.join(\" \"),\n code_challenge: challenge,\n code_challenge_method: \"S256\",\n state,\n access_type: \"offline\",\n prompt: \"consent\",\n });\n\n const authUrl = `${AUTH_URL}?${authParams.toString()}`;\n callbacks.onAuth({ url: authUrl });\n\n const manualPromptPromise = (async () => {\n const input = await callbacks.onPrompt({\n message: \"Paste authorization code from browser:\",\n });\n return extractCodeFromInput(input);\n })();\n\n const timeout = new Promise<never>((_, rej) =>\n setTimeout(() => rej(new Error(\"Timed out waiting for authorization code (5 minutes)\")), OAUTH_CALLBACK_TIMEOUT_MS)\n );\n\n const code = await Promise.race([manualPromptPromise, timeout]);\n\n const tokenParams = new URLSearchParams({\n client_id: CLIENT_ID,\n client_secret: CLIENT_SECRET,\n code,\n grant_type: \"authorization_code\",\n redirect_uri: REDIRECT_URI,\n code_verifier: verifier,\n });\n\n const tokenRes = await fetch(TOKEN_URL, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: tokenParams.toString(),\n });\n\n if (!tokenRes.ok) {\n const errText = await tokenRes.text();\n throw new Error(`Failed to exchange token (${tokenRes.status}): ${errText}`);\n }\n\n const tokens = (await tokenRes.json()) as {\n access_token: string;\n refresh_token?: string;\n expires_in?: number;\n };\n const projectId = await fetchProjectId(tokens.access_token);\n\n return {\n refresh: tokens.refresh_token || \"\",\n access: JSON.stringify({ token: tokens.access_token, projectId }),\n expires: Date.now() + (tokens.expires_in || 3600) * 1000,\n };\n}\n\nexport async function refreshAntigravityToken(\n credentials: OAuthCredentials,\n signal?: AbortSignal\n): Promise<OAuthCredentials> {\n const params = new URLSearchParams({\n client_id: CLIENT_ID,\n client_secret: CLIENT_SECRET,\n refresh_token: credentials.refresh,\n grant_type: \"refresh_token\",\n });\n\n const res = await fetch(TOKEN_URL, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: params.toString(),\n signal,\n });\n\n if (!res.ok) {\n const errText = await res.text();\n throw new Error(`Failed to refresh token (${res.status}): ${errText}`);\n }\n\n const tokens = (await res.json()) as {\n access_token: string;\n refresh_token?: string;\n expires_in?: number;\n };\n\n let existingProjectId = \"aicode-consumers\";\n try {\n const parsed = JSON.parse(credentials.access);\n if (parsed.projectId) existingProjectId = parsed.projectId;\n } catch {\n // ignore\n }\n\n // Re-resolve: a login-time lookup failure pins the \"aicode-consumers\"\n // default forever unless refresh retries it. A failed lookup yields that\n // same default, which must never clobber a known value.\n const freshProjectId = await fetchProjectId(tokens.access_token, DEFAULT_ENDPOINT, signal);\n const projectId = freshProjectId !== \"aicode-consumers\" ? freshProjectId : existingProjectId;\n\n return {\n refresh: tokens.refresh_token || credentials.refresh,\n access: JSON.stringify({ token: tokens.access_token, projectId }),\n expires: Date.now() + (tokens.expires_in || 3600) * 1000,\n };\n}\n\nexport function getApiKey(credentials: OAuthCredentials): string {\n return credentials.access;\n}\n\nexport function parseStoredCredentials(rawApiKey: string): { token: string; projectId: string } {\n try {\n const parsed = JSON.parse(rawApiKey);\n if (parsed.token) {\n return { token: parsed.token, projectId: parsed.projectId || \"aicode-consumers\" };\n }\n } catch {\n // If plain token\n }\n return { token: rawApiKey, projectId: \"aicode-consumers\" };\n}\n", "export const DEFAULT_ENDPOINT = \"https://daily-cloudcode-pa.googleapis.com\";\nexport const DEFAULT_USER_AGENT =\n \"antigravity/cli/1.1.27 (aidev_client; os_type=linux; arch=amd64; cl=976543523; auth_method=consumer)\";\n\nexport const PROVIDER_ID = \"antigravity\";\n\n/**\n * Builds the canonical HTTP request headers matching the official agy CLI Wire Fingerprint.\n */\nexport function buildAntigravityHeaders(token: string, userAgent = DEFAULT_USER_AGENT): Record<string, string> {\n return {\n Host: \"daily-cloudcode-pa.googleapis.com\",\n \"User-Agent\": userAgent,\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${token}`,\n };\n}\n", "import type { AvailableModelsCatalog } from \"./model-catalog.ts\";\n\n/**\n * Model Catalog presentation (pure, in-process): display-name rules and the\n * Subcommand table format. No network, no snapshot access \u2014 everything enters\n * as plain CatalogSnapshot / AvailableModelsCatalog values, so tests pin the\n * rendered output without fetching. Owned here (not in catalog-refresh.ts)\n * so the wire module keeps only fetch/parse/publish.\n */\nexport function formatModelDisplayName(baseId: string, rawDisplayName?: string): string {\n if (rawDisplayName) {\n const cleaned = rawDisplayName.replace(/\\s*\\([^)]*\\)/g, \"\").trim();\n if (cleaned.length > 0) {\n return cleaned;\n }\n }\n const words = baseId.split(\"-\").map((w) => {\n if (/^\\d+(\\.\\d+)?$/.test(w)) return w;\n return w.charAt(0).toUpperCase() + w.slice(1);\n });\n return words.join(\" \");\n}\n\nfunction formatTokenCount(n?: number): string {\n if (typeof n !== \"number\") return \"n/a\";\n if (n % 1048576 === 0) return `${n / 1048576}M`;\n if (n % 1024 === 0) return `${n / 1024}k`;\n if (n % 1000 === 0) return `${n / 1000}k`;\n // ponytail: odd values (e.g. 65535) round to nearest KiB instead of a noisy decimal\n return `${Math.round(n / 1024)}k`;\n}\n\nexport function formatModelsList(catalog: AvailableModelsCatalog): string {\n const sorts = catalog.agentModelSorts;\n const recommendedOnly = Array.isArray(sorts) && sorts.length > 0;\n const rank = new Map((sorts || []).map((id, i) => [id, i]));\n\n const models = (recommendedOnly ? catalog.models.filter((m) => rank.has(m.id)) : catalog.models.slice()).sort(\n (a, b) => (rank.get(a.id) ?? Number.MAX_SAFE_INTEGER) - (rank.get(b.id) ?? Number.MAX_SAFE_INTEGER) ||\n a.id.localeCompare(b.id)\n );\n\n const rows = models.map((m) => {\n const flags: string[] = [];\n if (m.supportsThinking) flags.push(\"thinking\");\n if (m.supportsImages) flags.push(\"images\");\n return {\n id: m.id,\n name: formatModelDisplayName(m.id, m.displayName || m.id),\n ctx: `${formatTokenCount(m.maxTokens)}/${formatTokenCount(m.maxOutputTokens)}`,\n feat: flags.length > 0 ? flags.join(\", \") : \"-\",\n rem: typeof m.remainingFraction === \"number\" ? `${Math.round(m.remainingFraction * 100)}%` : \"N/A\",\n };\n });\n\n const headers = { id: \"Model\", name: \"Name\", ctx: \"Context\", feat: \"Features\", rem: \"Rem\" };\n const w = {\n id: Math.max(headers.id.length, ...rows.map((r) => r.id.length)),\n name: Math.max(headers.name.length, ...rows.map((r) => r.name.length)),\n ctx: Math.max(headers.ctx.length, ...rows.map((r) => r.ctx.length)),\n feat: Math.max(headers.feat.length, ...rows.map((r) => r.feat.length)),\n };\n\n const lines: string[] = [\n `Available Antigravity Models (${models.length}${recommendedOnly ? \" recommended\" : \"\"}):`,\n ` ${headers.id.padEnd(w.id)} ${headers.name.padEnd(w.name)} ${headers.ctx.padEnd(w.ctx)} ${headers.feat.padEnd(w.feat)} ${headers.rem}`,\n ];\n for (const r of rows) {\n lines.push(\n ` ${r.id.padEnd(w.id)} ${r.name.padEnd(w.name)} ${r.ctx.padEnd(w.ctx)} ${r.feat.padEnd(w.feat)} ${r.rem.padStart(4)}`\n );\n }\n\n return lines.join(\"\\n\");\n}\n", "import type { Model } from \"@earendil-works/pi-ai\";\nimport { DEFAULT_ENDPOINT, PROVIDER_ID } from \"./protocol.ts\";\nimport { formatModelDisplayName } from \"./catalog-view.ts\";\n\n/**\n * Model Catalog map (pure, in-process): Public Model ID \u2194 Runtime Model ID\n * mapping, Model Plan resolution, the versioned snapshot store, and Pi Model\n * synthesis. No network, no credentials, no persistence \u2014 the wire side\n * (fetch/parse/publish) lives in catalog-refresh.ts and talks to this\n * module only through CatalogSnapshot values and updateCatalogStore;\n * presentation (display names, table format) lives in catalog-view.ts.\n */\nexport function extractBaseModelId(runtimeId: string): string {\n if (runtimeId === \"gemini-pro-agent\") return \"gemini-3.1-pro\";\n if (runtimeId.startsWith(\"gemini-3.1-pro-\")) return \"gemini-3.1-pro\";\n\n return runtimeId.replace(/-(?:high|medium|low|tiered|thinking|agent|extra-low)$/, \"\");\n}\n\n/**\n * Checks Model Family compatibility for thoughtSignature replay.\n * Official agy CLI wire captures demonstrate that:\n * - Gemini models (gemini-3.7, gemini-3.8, etc.) share thoughtSignatures seamlessly.\n * - Claude models replay thoughtSignatures within the Claude family, part-split\n * like Gemini (1.1.27 stream_turn8/9 counter-capture).\n * - Non-Gemini models (Claude, GPT-OSS) do NOT share signatures with Gemini models.\n */\nexport function isCompatibleFamily(msgModel?: string, targetModelId?: string): boolean {\n if (!msgModel || !targetModelId) return true;\n if (msgModel === targetModelId) return true;\n\n const isMsgGemini = msgModel.startsWith(\"gemini-\");\n const isTargetGemini = targetModelId.startsWith(\"gemini-\");\n if (isMsgGemini && isTargetGemini) return true;\n\n const isMsgClaude = msgModel.startsWith(\"claude-\");\n const isTargetClaude = targetModelId.startsWith(\"claude-\");\n if (isMsgClaude && isTargetClaude) return true;\n\n const isMsgGpt = msgModel.startsWith(\"gpt-\");\n const isTargetGpt = targetModelId.startsWith(\"gpt-\");\n if (isMsgGpt && isTargetGpt) return true;\n\n return extractBaseModelId(msgModel) === extractBaseModelId(targetModelId);\n}\n\nexport function getThinkingConfig(modelId: string, effort?: string): { includeThoughts: boolean; thinkingBudget: number } {\n const isOff = effort === \"off\" || effort === \"none\";\n if (isOff) {\n return { includeThoughts: false, thinkingBudget: 0 };\n }\n\n // Gemini 3.8 / 3.7 / 3.6 Flash\n if (modelId.includes(\"flash\")) {\n if (effort === \"high\" || effort === \"xhigh\" || modelId.endsWith(\"-high\") || modelId.endsWith(\"-agent\")) {\n return { includeThoughts: true, thinkingBudget: -1 };\n }\n if (effort === \"medium\" || modelId.endsWith(\"-medium\")) {\n return { includeThoughts: true, thinkingBudget: 4000 };\n }\n if (effort === \"low\" || effort === \"minimal\" || modelId.endsWith(\"-low\")) {\n return { includeThoughts: true, thinkingBudget: 1000 };\n }\n return { includeThoughts: true, thinkingBudget: -1 };\n }\n\n // Gemini 3.1 Pro\n if (modelId.includes(\"pro\")) {\n if (effort === \"low\" || effort === \"minimal\" || modelId.endsWith(\"-low\")) {\n return { includeThoughts: true, thinkingBudget: 1001 };\n }\n return { includeThoughts: true, thinkingBudget: 10001 };\n }\n\n // Claude models\n if (modelId.startsWith(\"claude-\")) {\n return { includeThoughts: true, thinkingBudget: 1024 };\n }\n\n // GPT-OSS 120B\n if (modelId.startsWith(\"gpt-oss-\")) {\n return { includeThoughts: true, thinkingBudget: 8192 };\n }\n\n return { includeThoughts: true, thinkingBudget: -1 };\n}\n\nexport interface AvailableModelItem {\n id: string;\n displayName?: string;\n modelEnum?: string;\n remainingFraction?: number;\n resetTime?: string;\n supportsThinking?: boolean;\n thinkingBudget?: number;\n minThinkingBudget?: number;\n supportsImages?: boolean;\n maxTokens?: number;\n maxOutputTokens?: number;\n}\n\nexport interface AvailableModelsCatalog {\n models: AvailableModelItem[];\n modelEnums: Record<string, string>;\n agentModelSorts?: string[];\n deprecated?: Record<string, string>;\n}\n\n// Active catalog state: single versioned snapshot. refreshCatalog owns writes;\n// request paths take one snapshot per call so enums, runtime IDs, and thinking\n// configs always come from the same refresh generation (see Model Plan in CONTEXT.md).\nexport interface CatalogThinking {\n budget?: number;\n supportsThinking?: boolean;\n}\n\nexport interface CatalogSnapshot {\n enums: Record<string, string>;\n runtimeIds: string[];\n thinking?: Record<string, CatalogThinking>;\n deprecated?: Record<string, string>;\n version: number;\n}\n\n/**\n * Builds the per-Runtime-ID thinking lookup for a snapshot generation from\n * parsed catalog items. Pure: shared by the refresh path and tests so both\n * derive the same snapshot shape from one parse.\n */\nexport function buildThinkingMap(models: AvailableModelItem[]): Record<string, CatalogThinking> {\n return Object.fromEntries(\n models.map((m) => [\n m.id,\n {\n ...(typeof m.thinkingBudget === \"number\" ? { budget: m.thinkingBudget } : {}),\n supportsThinking: m.supportsThinking ?? false,\n },\n ]),\n );\n}\n\nlet activeStore: CatalogSnapshot = {\n enums: {},\n runtimeIds: [],\n thinking: {},\n deprecated: {},\n version: 0,\n};\n\nexport function getCatalogSnapshot(): CatalogSnapshot {\n return {\n enums: { ...activeStore.enums },\n runtimeIds: [...activeStore.runtimeIds],\n thinking: Object.fromEntries(\n Object.entries(activeStore.thinking ?? {}).map(([id, info]) => [id, { ...info }]),\n ),\n deprecated: { ...(activeStore.deprecated ?? {}) },\n version: activeStore.version,\n };\n}\n\n/**\n * Records one complete refresh generation. Wire-side only: the sole writer is\n * the refresh path in catalog-refresh.ts. Request paths never call this \u2014\n * they read via getCatalogSnapshot and pass the snapshot explicitly.\n */\nexport function updateCatalogStore(\n enums: Record<string, string>,\n runtimeIds: string[],\n thinking: Record<string, CatalogThinking> = {},\n deprecated: Record<string, string> = {}\n): void {\n // A fresh generation is complete: replace instead of merging, so enums for\n // server-removed models are evicted instead of pinned forever.\n activeStore = {\n enums: { ...enums },\n runtimeIds: [...new Set(runtimeIds)],\n thinking: { ...thinking },\n deprecated: { ...deprecated },\n version: activeStore.version + 1,\n };\n}\n\nfunction resolveRuntimeModelId(\n modelId: string,\n effort?: string,\n availableRuntimeIds: string[] = activeStore.runtimeIds\n): string {\n if (\n modelId.endsWith(\"-high\") ||\n modelId.endsWith(\"-medium\") ||\n modelId.endsWith(\"-low\") ||\n modelId.endsWith(\"-thinking\") ||\n modelId.endsWith(\"-agent\") ||\n modelId.endsWith(\"-extra-low\") ||\n modelId.endsWith(\"-tiered\")\n ) {\n return modelId;\n }\n\n const isOff = effort === \"off\" || effort === \"none\";\n const isLow = isOff || effort === \"low\" || effort === \"minimal\";\n const isMedium = effort === \"medium\";\n\n // Tier resolution against the live snapshot: effort picks suffix candidates\n // in preference order, the first one the server lists wins \u2014 so newly\n // released models (e.g. gemini-3.9-flash) resolve with no code change.\n if (Array.isArray(availableRuntimeIds) && availableRuntimeIds.length > 0) {\n const candidates: string[] = [];\n if (isLow) {\n candidates.push(`${modelId}-low`, `${modelId}-extra-low`, modelId);\n } else if (isMedium) {\n candidates.push(`${modelId}-medium`, modelId);\n } else {\n candidates.push(`${modelId}-high`, `${modelId}-thinking`, `${modelId}-agent`, modelId);\n }\n\n for (const cand of candidates) {\n if (availableRuntimeIds.includes(cand)) {\n return cand;\n }\n }\n }\n\n // Fallback heuristics when runtime ID catalog is not available\n if (modelId.includes(\"flash\")) {\n if (isLow) return `${modelId}-low`;\n if (isMedium) return `${modelId}-medium`;\n return `${modelId}-high`;\n }\n\n if (modelId.includes(\"pro\")) {\n if (isLow) return `${modelId}-low`;\n return `${modelId}-high`;\n }\n\n if (modelId.startsWith(\"claude-\")) {\n if (modelId.includes(\"opus\")) return `${modelId}-thinking`;\n return modelId;\n }\n\n if (modelId.startsWith(\"gpt-\")) {\n return `${modelId}-medium`;\n }\n\n return modelId;\n}\n\nexport interface ModelPlan {\n runtimeModelId: string;\n modelEnum: string;\n thinkingConfig: { includeThoughts: boolean; thinkingBudget: number };\n isNonGemini: boolean;\n isClaude: boolean;\n}\n\n/**\n * Resolves one Model Plan (see CONTEXT.md) from a single snapshot generation:\n * Runtime Model ID, model enum, thinking budget, and the non-Gemini flag that\n * switches tool schema mode. Pass an explicit snapshot in tests; otherwise the\n * live snapshot is read once, so enums and runtime IDs never mix generations.\n */\nexport function resolveModelPlan(\n publicModelId: string,\n effort?: string,\n snapshot: CatalogSnapshot = getCatalogSnapshot()\n): ModelPlan {\n const runtimeModelId = followRenames(\n resolveRuntimeModelId(publicModelId, effort, snapshot.runtimeIds),\n snapshot\n );\n const modelEnum = snapshot.enums[runtimeModelId];\n if (!modelEnum) {\n // Fail fast: a retired or mistyped ID must surface here with guidance,\n // not as a cryptic server rejection for an empty model_enum label.\n throw new Error(\n `Unknown model \"${runtimeModelId}\" (not in catalog snapshot v${snapshot.version}). ` +\n `Run /antigravity refresh and pick a current model.`\n );\n }\n return {\n runtimeModelId,\n modelEnum,\n thinkingConfig: resolveThinkingConfig(runtimeModelId, effort, snapshot),\n isNonGemini: !runtimeModelId.startsWith(\"gemini-\"),\n isClaude: runtimeModelId.startsWith(\"claude-\"),\n };\n}\n\n/**\n * Follows server-directed renames (deprecatedModelIds), e.g.\n * gemini-3.1-pro-high \u2192 gemini-pro-agent. Applied uniformly to derived and\n * explicitly passed IDs: the server lists the old ID as deprecated, so new\n * code must not keep sending it. Cycles terminate via the visited set.\n */\nfunction followRenames(runtimeModelId: string, snapshot: CatalogSnapshot): string {\n const renamed = snapshot.deprecated;\n if (!renamed) return runtimeModelId;\n let current = runtimeModelId;\n const seen = new Set<string>([current]);\n while (renamed[current] && !seen.has(renamed[current])) {\n current = renamed[current];\n seen.add(current);\n }\n return current;\n}\n\n/**\n * Resolves the thinking config for one Runtime Model ID from a single snapshot\n * generation. Snapshot wire values win; the hardcoded heuristic below only\n * serves snapshots without per-ID thinking data (pre-budget persists) and\n * models the wire marks as non-thinking resolve to disabled thoughts.\n */\nfunction resolveThinkingConfig(\n runtimeModelId: string,\n effort?: string,\n snapshot: CatalogSnapshot = getCatalogSnapshot()\n): { includeThoughts: boolean; thinkingBudget: number } {\n if (effort === \"off\" || effort === \"none\") {\n return { includeThoughts: false, thinkingBudget: 0 };\n }\n const info = snapshot.thinking?.[runtimeModelId];\n if (info) {\n if (typeof info.budget === \"number\") {\n return { includeThoughts: true, thinkingBudget: info.budget };\n }\n if (!info.supportsThinking) {\n return { includeThoughts: false, thinkingBudget: 0 };\n }\n }\n return getThinkingConfig(runtimeModelId, effort);\n}\n\n// Antigravity is quota-based with no per-token billing, so every model\n// reports zero cost instead of fictitious Gemini API prices.\n// Revisit if a metered paid tier ever appears.\nexport function estimateModelCost(_baseId: string): Model<any>[\"cost\"] {\n return { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };\n}\n\nexport function synthesizeDynamicModel(baseId: string, items: AvailableModelItem[]): Model<any> {\n const repItem = items.find((it) => it.id === `${baseId}-high` || it.id === baseId) || items[0];\n\n const isFlash = baseId.includes(\"flash\");\n const isClaude = baseId.startsWith(\"claude-\");\n const isGpt = baseId.startsWith(\"gpt-\");\n\n // Static fallbacks mirror captures/agy_cli_1.1.27/models.resp.json\n // (Claude maxTokens 250000 / maxOutputTokens 64000, also seen on the wire\n // in stream_turn8/9). Live refresh overwrites these with catalog values.\n const defaultContext = isFlash ? 1048576 : isClaude ? 250000 : isGpt ? 128000 : 1048576;\n const defaultMaxOutput = isClaude ? 64000 : isGpt ? 32768 : 65536;\n\n return {\n id: baseId,\n name: formatModelDisplayName(baseId, repItem?.displayName),\n provider: PROVIDER_ID,\n api: \"antigravity-api\",\n baseUrl: DEFAULT_ENDPOINT,\n reasoning: repItem?.supportsThinking ?? true,\n input: repItem?.supportsImages ? [\"text\", \"image\"] : [\"text\"],\n cost: estimateModelCost(baseId),\n contextWindow: repItem?.maxTokens || defaultContext,\n maxTokens: repItem?.maxOutputTokens || defaultMaxOutput,\n };\n}\n\nexport function buildDynamicPublicModels(catalog?: AvailableModelsCatalog): Array<Model<any>> {\n if (!catalog || !Array.isArray(catalog.models) || catalog.models.length === 0) {\n return [];\n }\n\n // Filter eligible models according to agentModelSorts (strict agy CLI parity)\n const agentSortIds = catalog.agentModelSorts;\n const eligibleItems =\n Array.isArray(agentSortIds) && agentSortIds.length > 0\n ? catalog.models.filter((m) => agentSortIds.includes(m.id))\n : catalog.models;\n\n const runtimeGroups = new Map<string, AvailableModelItem[]>();\n for (const item of eligibleItems) {\n const baseId = extractBaseModelId(item.id);\n const list = runtimeGroups.get(baseId) || [];\n list.push(item);\n runtimeGroups.set(baseId, list);\n }\n\n // Preserve recommended ordering from agentModelSorts\n const orderedBaseIds: string[] = [];\n if (Array.isArray(agentSortIds)) {\n for (const sortId of agentSortIds) {\n const baseId = extractBaseModelId(sortId);\n if (runtimeGroups.has(baseId) && !orderedBaseIds.includes(baseId)) {\n orderedBaseIds.push(baseId);\n }\n }\n }\n\n for (const baseId of runtimeGroups.keys()) {\n if (!orderedBaseIds.includes(baseId)) {\n orderedBaseIds.push(baseId);\n }\n }\n\n return orderedBaseIds.map((baseId) => synthesizeDynamicModel(baseId, runtimeGroups.get(baseId)!));\n}\n", "import { DEFAULT_ENDPOINT, buildAntigravityHeaders } from \"./protocol.ts\";\nimport { parseStoredCredentials } from \"./auth.ts\";\nimport type { AvailableModelItem, AvailableModelsCatalog } from \"./model-catalog.ts\";\nimport { buildDynamicPublicModels, buildThinkingMap, getCatalogSnapshot, updateCatalogStore } from \"./model-catalog.ts\";\nimport type { Model } from \"@earendil-works/pi-ai\";\n\n/**\n * Model Catalog refresh (wire, ports & adapters): fetchAvailableModels fetch,\n * Capture Fixture-shaped parse, and Catalog Persistence publish.\n * Produces AvailableModelsCatalog values and records generations via\n * updateCatalogStore; all pure mapping lives in model-catalog.ts and all\n * presentation (formatModelsList) lives in catalog-view.ts.\n */\nexport async function refreshCatalog(context: any): Promise<Array<Model<any>>> {\n // Restore from context.stored first for offline restart support,\n // but only into a pristine store: a failed refresh must not clobber a\n // fresher in-memory snapshot with older persisted data.\n const storedEnums = context.stored?.[\"pi-provider-antigravity\"]?.modelEnums;\n const storedRuntimeIds = context.stored?.[\"pi-provider-antigravity\"]?.runtimeIds;\n const storedThinking = context.stored?.[\"pi-provider-antigravity\"]?.thinking;\n const storedDeprecated = context.stored?.[\"pi-provider-antigravity\"]?.deprecated;\n if ((storedEnums || storedRuntimeIds || storedThinking || storedDeprecated) && getCatalogSnapshot().version === 0) {\n updateCatalogStore(storedEnums || {}, storedRuntimeIds || [], storedThinking || {}, storedDeprecated || {});\n }\n\n if (!context.allowNetwork) {\n return context.stored?.models || [];\n }\n\n try {\n const apiKey = context.credential?.access;\n if (!apiKey) {\n return context.stored?.models || [];\n }\n\n const { token, projectId } = parseStoredCredentials(apiKey);\n const catalog = await fetchAvailableModelsCatalog(token, projectId, DEFAULT_ENDPOINT, context.signal);\n const thinking = buildThinkingMap(catalog.models);\n const deprecated = catalog.deprecated || {};\n updateCatalogStore(catalog.modelEnums, catalog.models.map((m) => m.id), thinking, deprecated);\n\n const dynamicModels = buildDynamicPublicModels(catalog);\n\n // Publish to Pi models-store.json\n if (context.publish) {\n await context.publish({\n persist: {\n models: dynamicModels,\n checkedAt: Date.now(),\n \"pi-provider-antigravity\": {\n modelEnums: catalog.modelEnums,\n runtimeIds: catalog.models.map((m) => m.id),\n thinking,\n deprecated,\n },\n },\n });\n }\n\n return dynamicModels;\n } catch {\n return context.stored?.models || [];\n }\n}\n\nexport function parseAvailableModels(data: any): AvailableModelsCatalog {\n const models: AvailableModelItem[] = [];\n const modelEnums: Record<string, string> = {};\n\n const modelsObj = data.models || {};\n for (const [id, info] of Object.entries<any>(modelsObj)) {\n if (id.startsWith(\"tab_\") || id.startsWith(\"chat_\")) continue; // hide internal completions\n\n const modelEnum = typeof info.model === \"string\" ? info.model : undefined;\n if (modelEnum) {\n modelEnums[id] = modelEnum;\n }\n\n const quotaInfo = info.quotaInfo || {};\n models.push({\n id,\n displayName: info.displayName || info.label || id,\n modelEnum,\n remainingFraction: quotaInfo.remainingFraction,\n resetTime: quotaInfo.resetTime,\n supportsThinking: Boolean(info.supportsThinking),\n thinkingBudget: typeof info.thinkingBudget === \"number\" ? info.thinkingBudget : undefined,\n minThinkingBudget: typeof info.minThinkingBudget === \"number\" ? info.minThinkingBudget : undefined,\n supportsImages: Boolean(info.supportsImages),\n maxTokens: typeof info.maxTokens === \"number\" ? info.maxTokens : undefined,\n maxOutputTokens: typeof info.maxOutputTokens === \"number\" ? info.maxOutputTokens : undefined,\n });\n }\n\n const agentModelSorts: string[] = [];\n if (Array.isArray(data.agentModelSorts)) {\n for (const sortGroup of data.agentModelSorts) {\n if (Array.isArray(sortGroup.groups)) {\n for (const group of sortGroup.groups) {\n if (Array.isArray(group.modelIds)) {\n agentModelSorts.push(...group.modelIds);\n }\n }\n }\n }\n }\n\n models.sort((a, b) => a.id.localeCompare(b.id));\n\n // Server-directed renames (old Runtime Model ID \u2192 current one).\n const deprecated: Record<string, string> = {};\n const rawDeprecated = (data as any).deprecatedModelIds;\n if (rawDeprecated && typeof rawDeprecated === \"object\") {\n for (const [oldId, info] of Object.entries<any>(rawDeprecated)) {\n if (info && typeof info.newModelId === \"string\") {\n deprecated[oldId] = info.newModelId;\n }\n }\n }\n\n return {\n models,\n modelEnums,\n ...(agentModelSorts.length > 0 ? { agentModelSorts } : {}),\n ...(Object.keys(deprecated).length > 0 ? { deprecated } : {}),\n };\n}\n\nexport async function fetchAvailableModelsCatalog(\n token: string,\n projectId = \"aicode-consumers\",\n endpoint = DEFAULT_ENDPOINT,\n signal?: AbortSignal\n): Promise<AvailableModelsCatalog> {\n const res = await fetch(`${endpoint}/v1internal:fetchAvailableModels`, {\n method: \"POST\",\n headers: buildAntigravityHeaders(token),\n body: JSON.stringify({ project: projectId }),\n signal,\n });\n if (!res.ok) {\n const errText = await res.text();\n throw new Error(`Failed to fetch models (${res.status}): ${errText}`);\n }\n const json = await res.json();\n return parseAvailableModels(json);\n}\n\n\n", "import {\n type AssistantMessage,\n type AssistantMessageEventStream,\n type Context,\n type Model,\n type SimpleStreamOptions,\n type TextContent,\n type ThinkingContent,\n createAssistantMessageEventStream,\n} from \"@earendil-works/pi-ai\";\nimport { parseStoredCredentials } from \"./auth.ts\";\nimport { createSseFeed, type SseBlockEvent } from \"./parser.ts\";\nimport { buildAntigravityRequestBody } from \"./builder.ts\";\nimport { buildAntigravityHeaders, DEFAULT_ENDPOINT } from \"./protocol.ts\";\nimport { resolveModelPlan, getCatalogSnapshot } from \"./model-catalog.ts\";\n\nexport function streamAntigravity(\n model: Model<any>,\n context: Context,\n options?: SimpleStreamOptions\n): AssistantMessageEventStream {\n const stream = createAssistantMessageEventStream();\n\n (async () => {\n const output: AssistantMessage = {\n role: \"assistant\",\n content: [],\n api: model.api,\n provider: model.provider,\n model: model.id,\n usage: {\n input: 0,\n output: 0,\n cacheRead: 0,\n cacheWrite: 0,\n totalTokens: 0,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n },\n stopReason: \"pending\",\n timestamp: Date.now(),\n };\n\n try {\n stream.push({ type: \"start\", partial: output });\n\n const rawApiKey = options?.apiKey;\n if (!rawApiKey) {\n throw new Error(\"Missing Antigravity credentials. Run /login antigravity first.\");\n }\n\n const { token, projectId } = parseStoredCredentials(rawApiKey);\n\n const effort = options?.reasoning;\n // trajectoryId is provider-specific (absent from the SDK options\n // type), so read it via runtime-checked `in` narrowing instead of a cast.\n const trajectoryId =\n options && \"trajectoryId\" in options && typeof options.trajectoryId === \"string\"\n ? options.trajectoryId\n : undefined;\n const snapshot = getCatalogSnapshot();\n const plan = resolveModelPlan(model.id, effort, snapshot);\n\n const requestBody = buildAntigravityRequestBody({\n projectId,\n plan,\n context,\n sessionId: options?.sessionId,\n trajectoryId,\n maxOutputTokens: model.maxTokens,\n toolChoice: options?.toolChoice,\n });\n\n const res = await fetch(`${DEFAULT_ENDPOINT}/v1internal:streamGenerateContent?alt=sse`, {\n method: \"POST\",\n headers: buildAntigravityHeaders(token),\n body: JSON.stringify(requestBody),\n signal: options?.signal,\n });\n\n if (!res.ok) {\n const errText = await res.text();\n throw new Error(`Antigravity stream failed (${res.status}): ${errText}`);\n }\n\n if (!res.body) {\n throw new Error(\"No response stream received from Antigravity.\");\n }\n\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n const feed = createSseFeed();\n\n const applyUsage = (u: { input: number; output: number; cacheRead: number; total: number }) => {\n output.usage.input = u.input;\n output.usage.cacheRead = u.cacheRead;\n output.usage.output = u.output;\n output.usage.totalTokens = u.total;\n\n if (model.cost) {\n const c = model.cost;\n const inputCost = (output.usage.input * (c.input || 0)) / 1_000_000;\n const outputCost = (output.usage.output * (c.output || 0)) / 1_000_000;\n const cacheCost = (output.usage.cacheRead * (c.cacheRead || 0)) / 1_000_000;\n output.usage.cost = {\n input: inputCost,\n output: outputCost,\n cacheRead: cacheCost,\n cacheWrite: 0,\n total: inputCost + outputCost + cacheCost,\n };\n }\n };\n\n const translate = (events: SseBlockEvent[]) => {\n for (const ev of events) {\n if (ev.kind === \"text_start\" || ev.kind === \"thinking_start\") {\n const isThinking = ev.kind === \"thinking_start\";\n output.content.push(\n isThinking ? { type: \"thinking\", thinking: \"\" } : { type: \"text\", text: \"\" }\n );\n stream.push(\n isThinking\n ? { type: \"thinking_start\", contentIndex: ev.index, partial: output }\n : { type: \"text_start\", contentIndex: ev.index, partial: output }\n );\n } else if (ev.kind === \"text_delta\" || ev.kind === \"thinking_delta\") {\n const block = output.content[ev.index];\n if (ev.kind === \"text_delta\" && block?.type === \"text\") {\n block.text += ev.delta;\n stream.push({ type: \"text_delta\", contentIndex: ev.index, delta: ev.delta, partial: output });\n } else if (ev.kind === \"thinking_delta\" && block?.type === \"thinking\") {\n block.thinking += ev.delta;\n if (ev.thoughtSignature) block.thinkingSignature = ev.thoughtSignature;\n stream.push({ type: \"thinking_delta\", contentIndex: ev.index, delta: ev.delta, partial: output });\n }\n } else if (ev.kind === \"text_end\" || ev.kind === \"thinking_end\") {\n stream.push(\n ev.kind === \"text_end\"\n ? { type: \"text_end\", contentIndex: ev.index, content: ev.content, partial: output }\n : { type: \"thinking_end\", contentIndex: ev.index, content: ev.content, partial: output }\n );\n } else if (ev.kind === \"toolCall\") {\n const toolCall = {\n type: \"toolCall\" as const,\n id: ev.block.id,\n name: ev.block.name as string,\n arguments: ev.block.arguments || {},\n thoughtSignature: ev.block.thoughtSignature,\n };\n\n output.content.push(toolCall);\n\n stream.push({ type: \"toolcall_start\", contentIndex: ev.index, partial: output });\n stream.push({\n type: \"toolcall_delta\",\n contentIndex: ev.index,\n delta: JSON.stringify(toolCall.arguments),\n partial: output,\n });\n stream.push({\n type: \"toolcall_end\",\n contentIndex: ev.index,\n toolCall: toolCall,\n partial: output,\n });\n }\n }\n };\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n const fed = feed.feed(decoder.decode(value, { stream: true }));\n applyUsage(fed.usage);\n output.stopReason = fed.stopReason;\n translate(fed.events);\n }\n\n const closing = feed.close();\n applyUsage(closing.usage);\n output.stopReason = closing.stopReason;\n translate(closing.events);\n\n // Signature placement comes from the feed's final content: thinking\n // blocks take thinkingSignature, text blocks take textSignature.\n closing.content.forEach((block, index) => {\n const sig = block.thoughtSignature;\n if (!sig) return;\n const target = output.content[index];\n if (target?.type === \"thinking\" && !target.thinkingSignature) {\n target.thinkingSignature = sig;\n } else if (target?.type === \"text\" && !target.textSignature) {\n target.textSignature = sig;\n }\n });\n\n const doneReason: \"stop\" | \"toolUse\" | \"length\" =\n output.stopReason === \"toolUse\" || output.stopReason === \"length\"\n ? output.stopReason\n : \"stop\";\n\n stream.push({\n type: \"done\",\n reason: doneReason,\n message: output,\n });\n stream.end();\n } catch (error) {\n output.stopReason = options?.signal?.aborted ? \"aborted\" : \"error\";\n output.errorMessage = error instanceof Error ? error.message : String(error);\n stream.push({ type: \"error\", reason: output.stopReason, error: output });\n stream.end();\n }\n })();\n\n return stream;\n}\n", "export interface ParsedBlock {\n type: \"text\" | \"thinking\" | \"toolCall\";\n text?: string;\n thinking?: string;\n thoughtSignature?: string;\n id?: string;\n name?: string;\n arguments?: Record<string, any>;\n}\n\nexport interface ParsedStreamResult {\n content: ParsedBlock[];\n usage: {\n input: number;\n output: number;\n cacheRead: number;\n total: number;\n };\n stopReason: \"stop\" | \"toolUse\" | \"length\" | \"error\";\n}\n\nexport type SseBlockEvent =\n | { kind: \"text_start\" | \"thinking_start\"; index: number }\n | { kind: \"text_delta\" | \"thinking_delta\"; index: number; delta: string; thoughtSignature?: string }\n | { kind: \"text_end\" | \"thinking_end\"; index: number; content: string }\n | { kind: \"toolCall\"; index: number; block: ParsedBlock & { id: string } };\n\nexport interface SseFeedOutput {\n events: SseBlockEvent[];\n usage: ParsedStreamResult[\"usage\"];\n stopReason: ParsedStreamResult[\"stopReason\"];\n thoughtSignature?: string;\n /** Final assembled blocks (signatures attached). Only present on close(). */\n content?: ParsedBlock[];\n}\n\n/**\n * Stateful incremental SSE reader: the single module that understands the\n * Antigravity Wire Fingerprint on the wire. Feed raw response chunks as they\n * arrive; line buffering, block accumulation, usage, stopReason, and lone\n * Thought Signature attachment all live here. Callers only translate\n * BlockEvents (thin adapters). close() is the single final surface: terminal\n * events plus the fully assembled content.\n */\nexport function createSseFeed(): {\n feed(chunk: string): SseFeedOutput;\n close(): SseFeedOutput & { content: ParsedBlock[] };\n} {\n const content: ParsedBlock[] = [];\n const usage = {\n input: 0,\n output: 0,\n cacheRead: 0,\n total: 0,\n };\n let stopReason: ParsedStreamResult[\"stopReason\"] = \"stop\";\n let lastThoughtSignature: string | undefined;\n let buffer = \"\";\n let openType: \"text\" | \"thinking\" | null = null;\n\n const snapshot = (events: SseBlockEvent[]): SseFeedOutput => ({\n events,\n usage: { ...usage },\n stopReason,\n ...(lastThoughtSignature ? { thoughtSignature: lastThoughtSignature } : {}),\n });\n\n // Lone-signature turn: a Thought Signature that arrived detached from any\n // thinking part rides the first thinking block, else the last text block.\n // Runs once at close, so the final content carries the placement policy\n // instead of every caller re-deriving it.\n const attachLoneSignature = (): void => {\n if (!lastThoughtSignature) return;\n const thinking = content.find((b) => b.type === \"thinking\");\n if (thinking && !thinking.thoughtSignature) {\n thinking.thoughtSignature = lastThoughtSignature;\n } else if (!thinking) {\n for (let i = content.length - 1; i >= 0; i--) {\n if (content[i].type === \"text\" && !content[i].thoughtSignature) {\n content[i].thoughtSignature = lastThoughtSignature;\n break;\n }\n }\n }\n };\n\n const closeOpenBlock = (events: SseBlockEvent[]): void => {\n if (openType === null) return;\n const index = content.length - 1;\n const block = content[index];\n if (openType === \"thinking\") {\n events.push({ kind: \"thinking_end\", index, content: block.thinking || \"\" });\n } else {\n events.push({ kind: \"text_end\", index, content: block.text || \"\" });\n }\n openType = null;\n };\n\n const processLine = (rawLine: string, events: SseBlockEvent[]): void => {\n const line = rawLine.trim();\n if (!line.startsWith(\"data:\")) return;\n\n const dataStr = line.slice(5).trim();\n if (!dataStr || dataStr === \"[DONE]\") return;\n\n let payload: any;\n try {\n payload = JSON.parse(dataStr);\n } catch {\n return;\n }\n\n const response = payload.response || payload;\n\n // Usage metadata (promptTokenCount includes cached tokens per Google spec).\n // output counts thinking tokens too, mirroring the pi-ai Google adapter:\n // usageMetadata reports candidates and thoughts separately.\n if (response.usageMetadata) {\n const um = response.usageMetadata;\n const promptTokens = typeof um.promptTokenCount === \"number\" ? um.promptTokenCount : 0;\n const cacheRead = typeof um.cachedContentTokenCount === \"number\" ? um.cachedContentTokenCount : 0;\n usage.input = Math.max(0, promptTokens - cacheRead);\n usage.cacheRead = cacheRead;\n const candidates = typeof um.candidatesTokenCount === \"number\" ? um.candidatesTokenCount : 0;\n const thoughts = typeof um.thoughtsTokenCount === \"number\" ? um.thoughtsTokenCount : 0;\n usage.output = candidates + thoughts;\n if (typeof um.totalTokenCount === \"number\") usage.total = um.totalTokenCount;\n }\n\n const candidate = response.candidates?.[0];\n if (!candidate) return;\n\n // Sticky: length/error/toolUse are never downgraded by a later STOP.\n // Mirrors pi-ai mapStopReasonString: only STOP is benign, MAX_TOKENS is\n // length, every other reason (SAFETY, RECITATION, BLOCKLIST, ...) is error.\n if (candidate.finishReason === \"MAX_TOKENS\") {\n stopReason = \"length\";\n } else if (typeof candidate.finishReason === \"string\" && candidate.finishReason !== \"STOP\") {\n stopReason = \"error\";\n }\n\n const parts = candidate.content?.parts || [];\n for (const part of parts) {\n if (part.thoughtSignature) {\n lastThoughtSignature = part.thoughtSignature;\n }\n\n if (part.thought) {\n if (openType !== \"thinking\") {\n closeOpenBlock(events);\n content.push({ type: \"thinking\", thinking: \"\" });\n events.push({ kind: \"thinking_start\", index: content.length - 1 });\n openType = \"thinking\";\n }\n const block = content[content.length - 1];\n const delta = part.text || \"\";\n block.thinking = (block.thinking || \"\") + delta;\n if (part.thoughtSignature) {\n block.thoughtSignature = part.thoughtSignature;\n }\n events.push({\n kind: \"thinking_delta\",\n index: content.length - 1,\n delta,\n ...(part.thoughtSignature ? { thoughtSignature: part.thoughtSignature } : {}),\n });\n } else if (part.functionCall) {\n closeOpenBlock(events);\n stopReason = \"toolUse\";\n const block: ParsedBlock & { id: string } = {\n type: \"toolCall\",\n id: part.functionCall.id || `call_${content.length}`,\n name: part.functionCall.name,\n arguments: part.functionCall.args || {},\n thoughtSignature: part.thoughtSignature || lastThoughtSignature,\n };\n content.push(block);\n events.push({ kind: \"toolCall\", index: content.length - 1, block });\n } else if (part.text !== undefined) {\n if (openType !== \"text\") {\n closeOpenBlock(events);\n content.push({ type: \"text\", text: \"\" });\n events.push({ kind: \"text_start\", index: content.length - 1 });\n openType = \"text\";\n }\n const block = content[content.length - 1];\n block.text = (block.text || \"\") + part.text;\n events.push({ kind: \"text_delta\", index: content.length - 1, delta: part.text });\n }\n }\n };\n\n return {\n feed(chunk: string): SseFeedOutput {\n const events: SseBlockEvent[] = [];\n buffer += chunk;\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() || \"\";\n for (const rawLine of lines) processLine(rawLine, events);\n return snapshot(events);\n },\n close(): SseFeedOutput & { content: ParsedBlock[] } {\n const events: SseBlockEvent[] = [];\n if (buffer.trim() !== \"\") processLine(buffer, events);\n buffer = \"\";\n closeOpenBlock(events);\n attachLoneSignature();\n return { ...snapshot(events), content };\n },\n };\n}\n\n", "import { createHash, randomUUID } from \"node:crypto\";\nimport type { ModelPlan } from \"./model-catalog.ts\";\nimport { isCompatibleFamily } from \"./model-catalog.ts\";\nimport { PROVIDER_ID } from \"./protocol.ts\";\n\nexport interface BuildRequestBodyParams {\n projectId: string;\n plan: ModelPlan;\n context: {\n systemPrompt?: string;\n messages: Array<any>;\n tools?: Array<any>;\n };\n sessionId?: string;\n trajectoryId?: string;\n maxOutputTokens?: number;\n toolChoice?: string;\n}\n\nconst BASE64_SIGNATURE_PATTERN = /^[A-Za-z0-9+/_-]+={0,2}$/;\n\n/**\n * Verifies that a thought signature candidate is a valid base64 string suitable\n * for Google Protobuf TYPE_BYTES fields in JSON mapping.\n */\nfunction isValidThoughtSignature(sig: unknown): sig is string {\n if (typeof sig !== \"string\" || sig.length === 0) return false;\n if (sig.includes(\"=\") && sig.length % 4 !== 0) return false;\n return BASE64_SIGNATURE_PATTERN.test(sig);\n}\n\n/**\n * Resolves a thoughtSignature candidate only when coming from the same provider and\n * compatible model family, and only when formatted as valid base64.\n */\nfunction resolveThoughtSignature(\n isSameProviderAndModel: boolean,\n sig: unknown\n): string | undefined {\n if (!isSameProviderAndModel) return undefined;\n return isValidThoughtSignature(sig) ? sig : undefined;\n}\n\n/**\n * Deterministically derives a persistent session ID from the initial conversation turn.\n */\nfunction deriveSessionId(\n context: { messages?: Array<any>; systemPrompt?: string },\n explicitSessionId?: string\n): string {\n if (explicitSessionId && typeof explicitSessionId === \"string\" && explicitSessionId.trim().length > 0) {\n return explicitSessionId.trim();\n }\n\n const firstMsg = context.messages?.[0];\n if (!firstMsg) {\n return randomUUID();\n }\n\n const seedContent =\n typeof firstMsg.content === \"string\"\n ? firstMsg.content\n : JSON.stringify(firstMsg.content || \"\");\n\n const hash = createHash(\"sha256\")\n .update(`antigravity:conversation:${seedContent}`)\n .digest()\n .subarray(0, 16);\n\n hash[6] = (hash[6] & 0x0f) | 0x40; // v4 UUID\n hash[8] = (hash[8] & 0x3f) | 0x80;\n const hex = [...hash].map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n\n/**\n * Computes deterministic v5 UUID trajectory ID from the session ID.\n */\nfunction resolveSessionTrajectory(sessionId: string): string {\n const bytes = createHash(\"sha1\").update(`antigravity:${sessionId}`).digest().subarray(0, 16);\n bytes[6] = (bytes[6] & 0x0f) | 0x50; // v5 UUID\n bytes[8] = (bytes[8] & 0x3f) | 0x80;\n const hex = [...bytes].map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n\n/**\n * Computes signed 64-bit integer session ID matching official agy CLI Wire Fingerprint.\n */\nfunction resolveNumericSessionId(sessionId: string): string {\n if (/^-?\\d+$/.test(sessionId)) {\n return sessionId;\n }\n const hash = createHash(\"sha256\").update(`antigravity:session:${sessionId}`).digest();\n return hash.readBigInt64BE(0).toString();\n}\n\n/**\n * Normalizes tool call IDs for cross-provider compatibility.\n */\nfunction normalizeToolCallId(id: string | undefined): string | undefined {\n if (!id || typeof id !== \"string\") return id;\n return id.replace(/[^a-zA-Z0-9_-]/g, \"_\").slice(0, 64);\n}\n\nconst CUSTOM_TOOL_SCHEMA_ALLOW = new Set([\n \"type\",\n \"description\",\n \"properties\",\n \"required\",\n \"items\",\n \"enum\",\n]);\n\nfunction stripMetaSchema(schema: unknown): unknown {\n if (!schema || typeof schema !== \"object\" || Array.isArray(schema)) return schema;\n const omit = new Set([\"$schema\", \"$id\", \"$defs\", \"definitions\"]);\n const out: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(schema)) {\n if (!omit.has(key)) out[key] = stripMetaSchema(value);\n }\n return out;\n}\n\nfunction normalizeCustomToolSchema(schema: unknown): unknown {\n if (!schema || typeof schema !== \"object\") return schema;\n if (Array.isArray(schema)) return schema.map(normalizeCustomToolSchema);\n\n const s = schema as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(s)) {\n if (!CUSTOM_TOOL_SCHEMA_ALLOW.has(key)) {\n // Map string const to single-item enum for Claude bridge compatibility\n if (key === \"const\" && s.enum === undefined && typeof value === \"string\") {\n out.enum = [value];\n }\n continue;\n }\n if (key === \"type\" && Array.isArray(value)) {\n const scalar = value.find((e) => typeof e === \"string\" && e !== \"null\");\n if (scalar) out.type = scalar;\n continue;\n }\n if (key === \"properties\" && value && typeof value === \"object\" && !Array.isArray(value)) {\n const props: Record<string, unknown> = {};\n for (const [propName, propSchema] of Object.entries(value as Record<string, unknown>)) {\n props[propName] = normalizeCustomToolSchema(propSchema);\n }\n out.properties = props;\n continue;\n }\n if (key === \"enum\" && Array.isArray(value) && !value.every((e) => typeof e === \"string\")) {\n continue;\n }\n out[key] = normalizeCustomToolSchema(value);\n }\n return out;\n}\n\n/**\n * Strict agy parity: versioned captures (1.1.26/1.1.27, every declaration)\n * always use legacy `parameters`, never `parametersJsonSchema` \u2014 for Gemini\n * and non-Gemini models alike. Captured declarations also carry no\n * anyOf/patternProperties/const keys, hence the normalization below.\n */\nfunction convertTools(\n tools: Array<any> | undefined\n): Array<{ functionDeclarations: Array<any> }> | undefined {\n if (!tools?.length) return undefined;\n return [\n {\n functionDeclarations: tools.map((tool) => {\n const schema = stripMetaSchema(tool.parameters) || { type: \"object\", properties: {} };\n return {\n name: tool.name,\n description: tool.description,\n parameters: normalizeCustomToolSchema(schema),\n };\n }),\n },\n ];\n}\n\n/**\n * Translates one Turn Trace (see CONTEXT.md) into Antigravity wire contents.\n */\nfunction translateTurnTrace(\n context: { messages?: Array<any>; systemPrompt?: string },\n runtimeModelId: string\n): Array<any> {\n const contents: Array<any> = [];\n const messages = context.messages || [];\n\n for (const msg of messages) {\n if (msg.role === \"user\") {\n const parts: Array<any> = [];\n if (typeof msg.content === \"string\") {\n parts.push({ text: msg.content });\n } else if (Array.isArray(msg.content)) {\n for (const item of msg.content) {\n if (item.type === \"text\") {\n parts.push({ text: item.text });\n } else if (item.type === \"image\") {\n parts.push({\n inlineData: {\n mimeType: item.mimeType || \"image/png\",\n data: item.data,\n },\n });\n }\n }\n }\n if (parts.length > 0) {\n contents.push({ role: \"user\", parts });\n }\n } else if (msg.role === \"assistant\") {\n if (msg.stopReason === \"error\" || msg.stopReason === \"aborted\") {\n continue;\n }\n\n const isSameProvider = !msg.provider || msg.provider === PROVIDER_ID;\n const isSameModel = isCompatibleFamily(msg.model, runtimeModelId);\n const isSameProviderAndModel = isSameProvider && isSameModel;\n\n const parts: Array<any> = [];\n // agy CLI shape (1.1.27 turn4 fixture): a thinking replay never carries its\n // own signature \u2014 it stays pending and rides on the NEXT text/functionCall\n // part. Only when the turn ends with no carrying part does it fall back\n // onto the last part (uncovered edge, same as the message-level fallback).\n // Signature fields are canonical SDK spellings only (textSignature /\n // thinkingSignature on blocks, thoughtSignature on toolCalls). No\n // legacy-spelling reads: pre-#26 sessions are abandoned (see #26).\n let pendingThinkingSig: string | undefined;\n if (typeof msg.content === \"string\") {\n parts.push({ text: msg.content });\n } else if (Array.isArray(msg.content)) {\n for (const item of msg.content) {\n if (item.type === \"text\") {\n const part: any = { text: item.text };\n const sig =\n resolveThoughtSignature(\n isSameProviderAndModel,\n item.textSignature\n ) || pendingThinkingSig;\n if (sig) {\n part.thoughtSignature = sig;\n pendingThinkingSig = undefined;\n }\n parts.push(part);\n } else if (item.type === \"thinking\") {\n const candidateSig = item.thinkingSignature;\n const isForeignReasoning =\n !isSameProviderAndModel ||\n (typeof candidateSig === \"string\" && candidateSig.trim().startsWith(\"{\"));\n\n if (!isForeignReasoning) {\n // No thoughtSignature here by design: it stays pending for the\n // next text/functionCall part (agy CLI part-split shape).\n const part: any = {\n thought: true,\n text: item.thinking || \"\",\n };\n const sig = resolveThoughtSignature(true, candidateSig);\n if (sig) {\n pendingThinkingSig = sig;\n }\n parts.push(part);\n } else {\n // Cross-provider/model or foreign reasoning item: drop foreign signature and\n // serialize reasoning text (or summary) as plain text so the model retains\n // conversation context without failing Google's TYPE_BYTES base64 validation.\n let text = item.thinking || \"\";\n if (!text && typeof candidateSig === \"string\" && candidateSig.trim().startsWith(\"{\")) {\n try {\n const parsed = JSON.parse(candidateSig);\n if (Array.isArray(parsed.summary)) {\n text = parsed.summary\n .filter((s: any) => s && typeof s.text === \"string\")\n .map((s: any) => s.text)\n .join(\"\\n\");\n }\n } catch {\n // Ignore JSON parse errors\n }\n }\n if (text && text.trim() !== \"\") {\n parts.push({ text });\n }\n }\n } else if (item.type === \"tool_use\" || item.type === \"toolCall\") {\n const part: any = {\n functionCall: {\n id: normalizeToolCallId(item.id),\n name: item.name,\n args: item.input || item.arguments || {},\n },\n };\n const sig =\n resolveThoughtSignature(\n isSameProviderAndModel,\n item.thoughtSignature\n ) || pendingThinkingSig;\n if (sig) {\n part.thoughtSignature = sig;\n pendingThinkingSig = undefined;\n }\n parts.push(part);\n }\n }\n }\n if (parts.length > 0) {\n if (pendingThinkingSig && !parts.some((p) => p.thoughtSignature)) {\n parts[parts.length - 1].thoughtSignature = pendingThinkingSig;\n }\n contents.push({ role: \"model\", parts });\n }\n } else if (msg.role === \"toolResult\") {\n let toolName = msg.toolName || msg.name;\n if (!toolName && (msg.toolCallId || msg.id)) {\n const rawTargetId = msg.toolCallId || msg.id;\n const normTargetId = normalizeToolCallId(rawTargetId);\n for (const prev of messages) {\n if (prev.role === \"assistant\" && Array.isArray(prev.content)) {\n const found = prev.content.find(\n (c: any) =>\n (c.type === \"tool_use\" || c.type === \"toolCall\") &&\n (c.id === rawTargetId || normalizeToolCallId(c.id) === normTargetId)\n );\n if (found) {\n toolName = found.name;\n break;\n }\n }\n }\n }\n\n let toolText = \"\";\n const imageParts: Array<any> = [];\n\n if (Array.isArray(msg.content)) {\n const textParts: string[] = [];\n for (const c of msg.content) {\n if (typeof c === \"string\") {\n textParts.push(c);\n } else if (c.type === \"text\") {\n textParts.push(c.text);\n } else if (c.type === \"image\") {\n imageParts.push({\n inlineData: {\n mimeType: c.mimeType || \"image/png\",\n data: c.data,\n },\n });\n } else {\n textParts.push(JSON.stringify(c));\n }\n }\n toolText = textParts.join(\"\\n\");\n } else if (typeof msg.content === \"string\") {\n toolText = msg.content;\n } else if (msg.content) {\n toolText = JSON.stringify(msg.content);\n }\n\n // Strict agy parity (captured 2026-09-05 via mitmdump, agy 1.1.26):\n // - response is always { output: string }, never a top-level list.\n // - error tool results also use the \"output\" key.\n const responseObj = { output: toolText };\n\n const functionResponse: any = {\n name: toolName || \"tool\",\n response: responseObj,\n };\n\n const rawCallId = msg.toolCallId || msg.id;\n const callId = normalizeToolCallId(rawCallId);\n if (callId) {\n functionResponse.id = callId;\n }\n\n if (imageParts.length > 0) {\n functionResponse.parts = imageParts;\n }\n\n contents.push({\n role: \"model\",\n parts: [{ functionResponse }],\n });\n }\n }\n\n // Antigravity rejects requests ending with an incomplete model turn.\n if (contents.length > 0) {\n const lastContent = contents[contents.length - 1];\n if (\n lastContent.role === \"model\" &&\n !lastContent.parts?.some((p: any) => p.functionResponse)\n ) {\n contents.push({\n role: \"user\",\n parts: [{ text: \"continue\" }],\n });\n }\n }\n\n return contents;\n}\n\n/**\n * Builds the complete Antigravity Wire Fingerprint request envelope.\n * Encapsulates session identity derivation, Thought Signature replay,\n * Turn Trace translation, and tool schema normalization.\n */\nexport function buildAntigravityRequestBody(params: BuildRequestBodyParams): Record<string, any> {\n const {\n projectId,\n plan,\n context,\n maxOutputTokens = 65536,\n } = params;\n const runtimeModelId = plan.runtimeModelId;\n\n const sessionId = deriveSessionId(context, params.sessionId);\n const trajectoryId =\n params.trajectoryId && typeof params.trajectoryId === \"string\" && params.trajectoryId.trim().length > 0\n ? params.trajectoryId.trim()\n : resolveSessionTrajectory(sessionId);\n const contents = translateTurnTrace(context, runtimeModelId);\n\n // Request ID sequence increments by completed assistant turns\n const requestIndex = context.messages.filter((m) => m.role === \"assistant\").length;\n const requestId = `agent/${sessionId}/${Date.now()}/${trajectoryId}/${contents.length}`;\n\n const modelEnum = plan.modelEnum;\n\n const labels: Record<string, string> = {\n last_step_index: String(Math.max(0, contents.length - 1)),\n model_enum: modelEnum,\n request_id: `${trajectoryId}-${requestIndex}`,\n trajectory_id: trajectoryId,\n used_claude: String(plan.isClaude),\n used_claude_conservative: String(plan.isClaude),\n used_non_gemini_model: String(plan.isNonGemini),\n };\n\n const generationConfig: Record<string, any> = {\n maxOutputTokens,\n thinkingConfig: plan.thinkingConfig,\n };\n\n const request: Record<string, any> = {\n contents,\n };\n\n if (context.systemPrompt) {\n request.systemInstruction = {\n role: \"user\",\n parts: [{ text: context.systemPrompt }],\n };\n }\n\n const tools = convertTools(context.tools);\n if (tools) {\n request.tools = tools;\n }\n\n if (params.toolChoice && params.toolChoice !== \"auto\" && params.toolChoice !== \"Auto\") {\n let mode = \"AUTO\";\n const tc = String(params.toolChoice).toLowerCase();\n if (tc === \"none\") mode = \"NONE\";\n else if (tc === \"any\" || tc === \"required\") mode = \"ANY\";\n request.toolConfig = {\n functionCallingConfig: {\n mode,\n },\n };\n }\n\n request.labels = labels;\n request.generationConfig = generationConfig;\n request.sessionId = resolveNumericSessionId(sessionId);\n\n return {\n project: projectId,\n requestId,\n request,\n model: runtimeModelId,\n userAgent: \"antigravity\",\n requestType: \"agent\",\n };\n}\n", "import { buildAntigravityHeaders, DEFAULT_ENDPOINT } from \"./protocol.ts\";\n\nexport interface QuotaBucket {\n bucketId: string;\n displayName: string;\n window?: string;\n resetTime?: string;\n description?: string;\n remainingFraction: number;\n}\n\nexport interface QuotaGroup {\n displayName: string;\n description?: string;\n buckets: QuotaBucket[];\n}\n\nexport interface QuotaSummary {\n groups: QuotaGroup[];\n description?: string;\n}\n\nexport function renderProgressBar(fraction: number, width = 10): string {\n const clamped = Math.max(0, Math.min(1, fraction));\n const filled = Math.round(clamped * width);\n return `[${\"#\".repeat(filled)}${\"-\".repeat(width - filled)}]`;\n}\n\ntype QuotaWindowKind = \"5h\" | \"weekly\" | \"other\";\n\nconst QUOTA_WINDOW_RANK: Record<QuotaWindowKind, number> = {\n \"5h\": 0,\n weekly: 1,\n other: 2,\n};\n\nfunction classifyQuotaWindow(bucket: QuotaBucket): QuotaWindowKind {\n const s = `${bucket.window || \"\"} ${bucket.displayName || \"\"} ${bucket.bucketId || \"\"}`.toLowerCase();\n if (s.includes(\"5h\") || s.includes(\"five\") || s.includes(\"rolling\")) return \"5h\";\n if (s.includes(\"week\")) return \"weekly\";\n return \"other\";\n}\n\nfunction shortWindowLabel(bucket: QuotaBucket, kind: QuotaWindowKind): string {\n if (kind === \"5h\") return \"5h\";\n if (kind === \"weekly\") return \"Wk\";\n return bucket.displayName || bucket.bucketId || \"Quota\";\n}\n\nfunction sortQuotaBuckets(buckets: QuotaBucket[]): QuotaBucket[] {\n return buckets\n .slice()\n .sort((a, b) => QUOTA_WINDOW_RANK[classifyQuotaWindow(a)] - QUOTA_WINDOW_RANK[classifyQuotaWindow(b)]);\n}\n\nfunction formatResetRemaining(resetTime?: string): string | null {\n if (!resetTime) return null;\n const ts = Date.parse(resetTime);\n if (!Number.isFinite(ts)) return null;\n const delta = ts - Date.now();\n if (delta <= 0) return \"ready\";\n const totalMin = Math.ceil(delta / 60000);\n const days = Math.floor(totalMin / (60 * 24));\n const hours = Math.floor((totalMin % (60 * 24)) / 60);\n const mins = totalMin % 60;\n if (days > 0) return `in ${days}d ${hours}h`;\n if (hours > 0) return `in ${hours}h ${mins}m`;\n return `in ${mins}m`;\n}\n\nexport function parseQuotaSummary(data: any): QuotaSummary {\n const groups: QuotaGroup[] = [];\n\n for (const g of data.groups || []) {\n const buckets: QuotaBucket[] = [];\n for (const b of g.buckets || []) {\n buckets.push({\n bucketId: b.bucketId || \"unknown\",\n displayName: b.displayName || b.bucketId || \"Limit\",\n window: b.window,\n resetTime: b.resetTime,\n description: b.description,\n remainingFraction: typeof b.remainingFraction === \"number\" ? b.remainingFraction : 1,\n });\n }\n groups.push({\n displayName: g.displayName || \"Quota Group\",\n description: g.description,\n buckets,\n });\n }\n\n return {\n groups,\n description: data.description,\n };\n}\n\nexport function formatQuotaSummary(summary: QuotaSummary): string {\n const lines: string[] = [];\n\n for (const group of summary.groups) {\n if (lines.length > 0) lines.push(\"\");\n lines.push(`${group.displayName}`);\n for (const b of sortQuotaBuckets(group.buckets)) {\n const pct = Math.round(b.remainingFraction * 100);\n const label = shortWindowLabel(b, classifyQuotaWindow(b)).padEnd(3);\n const reset = formatResetRemaining(b.resetTime);\n const suffix = reset && pct < 100 ? ` (${reset})` : \"\";\n lines.push(` ${label} ${renderProgressBar(b.remainingFraction)} ${String(pct).padStart(3)}% left${suffix}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nexport async function fetchQuotaSummary(\n token: string,\n projectId = \"aicode-consumers\",\n endpoint = DEFAULT_ENDPOINT,\n signal?: AbortSignal\n): Promise<QuotaSummary> {\n const res = await fetch(`${endpoint}/v1internal:retrieveUserQuotaSummary`, {\n method: \"POST\",\n headers: buildAntigravityHeaders(token),\n body: JSON.stringify({ project: projectId }),\n signal,\n });\n if (!res.ok) {\n const errText = await res.text();\n throw new Error(`Failed to fetch quota summary (${res.status}): ${errText}`);\n }\n const json = await res.json();\n return parseQuotaSummary(json);\n}\n", "import type { ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { parseStoredCredentials } from \"./auth.ts\";\nimport { DEFAULT_ENDPOINT, PROVIDER_ID } from \"./protocol.ts\";\nimport {\n fetchQuotaSummary,\n formatQuotaSummary,\n} from \"./quota.ts\";\nimport {\n fetchAvailableModelsCatalog,\n} from \"./catalog-refresh.ts\";\nimport {\n formatModelsList,\n} from \"./catalog-view.ts\";\n\nconst USAGE_TEXT =\n \"Usage: /antigravity <command>\\n\\nCommands:\\n usage Show 5h and weekly quota pool limits\\n models List recommended models with context window and remaining quota (alias: model)\\n refresh Force refresh model catalog\\n login Run /login antigravity\";\n\ninterface FetchSubcommand {\n progress: string;\n errLabel: string;\n run: (token: string, projectId: string, signal?: AbortSignal) => Promise<string>;\n}\n\nconst FETCH_SUBCOMMANDS: Record<string, FetchSubcommand> = {\n usage: {\n progress: \"Fetching quota summary\u2026\",\n errLabel: \"usage\",\n run: (token, projectId, signal) =>\n fetchQuotaSummary(token, projectId, DEFAULT_ENDPOINT, signal).then(formatQuotaSummary),\n },\n models: {\n progress: \"Fetching available models\u2026\",\n errLabel: \"models\",\n run: (token, projectId, signal) =>\n fetchAvailableModelsCatalog(token, projectId, DEFAULT_ENDPOINT, signal).then(formatModelsList),\n },\n};\n\nfunction emitOutput(ctx: ExtensionCommandContext, text: string, type: \"info\" | \"warning\" | \"error\" = \"info\"): void {\n if (ctx.hasUI) {\n ctx.ui.notify(text, type);\n } else {\n if (type === \"error\" || type === \"warning\") console.error(text);\n else console.log(text);\n }\n}\n\nexport async function resolveToken(\n ctx: ExtensionCommandContext\n): Promise<{ token: string; projectId: string } | null> {\n const apiKey = await ctx.modelRegistry?.getApiKeyForProvider?.(PROVIDER_ID);\n if (!apiKey) return null;\n return parseStoredCredentials(apiKey);\n}\n\nasync function runWithToken(\n ctx: ExtensionCommandContext,\n cmd: FetchSubcommand\n): Promise<void> {\n const creds = await resolveToken(ctx);\n if (!creds) {\n emitOutput(ctx, \"Not logged in. Run /login antigravity first.\", \"warning\");\n return;\n }\n try {\n if (ctx.hasUI) ctx.ui.notify(cmd.progress, \"info\");\n emitOutput(ctx, await cmd.run(creds.token, creds.projectId, ctx.signal));\n } catch (err: any) {\n emitOutput(ctx, `Failed to fetch ${cmd.errLabel}: ${err.message}`, \"error\");\n }\n}\n\nexport function parseAntigravitySubcommand(args: string): string {\n const sub = (args || \"\").trim().toLowerCase();\n // \"model\" is an alias of \"models\"\n return sub === \"model\" ? \"models\" : sub;\n}\n\nexport async function runAntigravitySubcommand(args: string, ctx: ExtensionCommandContext): Promise<void> {\n const sub = parseAntigravitySubcommand(args);\n\n const fetchCmd = FETCH_SUBCOMMANDS[sub];\n if (fetchCmd) {\n await runWithToken(ctx, fetchCmd);\n return;\n }\n\n if (sub === \"refresh\") {\n try {\n if (ctx.hasUI) ctx.ui.notify(\"Refreshing models\u2026\", \"info\");\n await ctx.modelRegistry?.refresh?.({ force: true, providers: [PROVIDER_ID], signal: ctx.signal });\n emitOutput(ctx, \"Antigravity models refreshed successfully.\");\n } catch (err: any) {\n emitOutput(ctx, `Failed to refresh: ${err.message}`, \"error\");\n }\n return;\n }\n\n if (sub === \"login\") {\n if (ctx.hasUI) {\n ctx.ui.setEditorText(\"/login antigravity\");\n ctx.ui.notify(\"Press Enter to log in to Antigravity.\", \"info\");\n } else {\n emitOutput(ctx, \"Please run /login antigravity to authenticate.\");\n }\n return;\n }\n\n emitOutput(ctx, USAGE_TEXT);\n}\n", "import type { ExtensionAPI, ExtensionCommandContext } from \"@earendil-works/pi-coding-agent\";\nimport { loginAntigravity, refreshAntigravityToken, getApiKey } from \"./auth.ts\";\nimport { DEFAULT_ENDPOINT, PROVIDER_ID } from \"./protocol.ts\";\nimport { refreshCatalog } from \"./catalog-refresh.ts\";\nimport { streamAntigravity } from \"./stream.ts\";\nimport { runAntigravitySubcommand } from \"./commands.ts\";\n\nexport { PROVIDER_ID };\nexport const PROVIDER_NAME = \"Antigravity\";\n\nexport default function (pi: ExtensionAPI): void {\n pi.registerProvider(PROVIDER_ID, {\n name: PROVIDER_NAME,\n baseUrl: DEFAULT_ENDPOINT,\n api: \"antigravity-api\",\n models: [], // Purely dynamic provider per Pi SDK architecture\n oauth: {\n name: PROVIDER_NAME,\n login: loginAntigravity,\n refreshToken: refreshAntigravityToken,\n getApiKey,\n },\n streamSimple: streamAntigravity,\n refreshModels: async (context: any) => refreshCatalog(context),\n });\n\n pi.registerCommand(\"antigravity\", {\n description: \"Antigravity provider commands (/antigravity [usage|models|refresh|login])\",\n handler: async (args: string, ctx: ExtensionCommandContext) => {\n await runAntigravitySubcommand(args, ctx);\n },\n });\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["createHash", "createHash"]
|
|
7
7
|
}
|