@cortexkit/pi-antigravity-auth 2.0.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +57 -6
- package/dist/index.js.map +3 -3
- package/dist/stream.d.ts +2 -0
- package/dist/stream.d.ts.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -222,6 +222,35 @@ function createOutput(model) {
|
|
|
222
222
|
timestamp: Date.now()
|
|
223
223
|
};
|
|
224
224
|
}
|
|
225
|
+
function asRecord(value) {
|
|
226
|
+
return value !== null && typeof value === "object" ? value : void 0;
|
|
227
|
+
}
|
|
228
|
+
function describeEmbeddedStreamFailure(chunk) {
|
|
229
|
+
if (chunk.error !== void 0) {
|
|
230
|
+
const error = asRecord(chunk.error);
|
|
231
|
+
if (!error) {
|
|
232
|
+
const detail = typeof chunk.error === "string" ? `: ${chunk.error}` : "";
|
|
233
|
+
return `Antigravity stream error${detail}`;
|
|
234
|
+
}
|
|
235
|
+
const labels = [];
|
|
236
|
+
if (typeof error.status === "string") labels.push(error.status);
|
|
237
|
+
if (typeof error.code === "number" || typeof error.code === "string") {
|
|
238
|
+
labels.push(`code ${String(error.code)}`);
|
|
239
|
+
}
|
|
240
|
+
const details = Array.isArray(error.details) ? error.details : [];
|
|
241
|
+
const reason2 = details.map((detail) => asRecord(detail)?.reason).find((value) => typeof value === "string");
|
|
242
|
+
if (reason2 && !labels.includes(reason2)) labels.push(reason2);
|
|
243
|
+
const label = labels.length > 0 ? ` (${labels.join(", ")})` : "";
|
|
244
|
+
const message2 = typeof error.message === "string" && error.message.length > 0 ? `: ${error.message}` : "";
|
|
245
|
+
return `Antigravity stream error${label}${message2}`;
|
|
246
|
+
}
|
|
247
|
+
const promptFeedback = asRecord(chunk.promptFeedback);
|
|
248
|
+
if (!promptFeedback) return void 0;
|
|
249
|
+
const reason = typeof promptFeedback.blockReason === "string" ? promptFeedback.blockReason : void 0;
|
|
250
|
+
const message = typeof promptFeedback.blockReasonMessage === "string" ? promptFeedback.blockReasonMessage : void 0;
|
|
251
|
+
if (!reason && !message) return void 0;
|
|
252
|
+
return `Antigravity prompt blocked${reason ? ` (${reason})` : ""}${message ? `: ${message}` : ""}`;
|
|
253
|
+
}
|
|
225
254
|
function unwrapChunk(raw) {
|
|
226
255
|
if (raw && typeof raw === "object" && "response" in raw) {
|
|
227
256
|
const inner = raw.response;
|
|
@@ -398,14 +427,17 @@ function streamCortexKitAntigravity(model, context, options) {
|
|
|
398
427
|
void (async () => {
|
|
399
428
|
const output = createOutput(model);
|
|
400
429
|
stream.push({ type: "start", partial: output });
|
|
430
|
+
let response;
|
|
431
|
+
let requestAbort;
|
|
432
|
+
let chunkIterator;
|
|
401
433
|
try {
|
|
402
434
|
const accessToken = options?.apiKey ?? "";
|
|
403
435
|
if (!accessToken)
|
|
404
436
|
throw new Error("Missing Antigravity OAuth access token");
|
|
405
437
|
const sessionKey = getRequestSessionKey(context, options);
|
|
406
|
-
|
|
407
|
-
const requestSignal = options?.signal ? AbortSignal.any([options.signal,
|
|
408
|
-
|
|
438
|
+
requestAbort = new AbortController();
|
|
439
|
+
const requestSignal = options?.signal ? AbortSignal.any([options.signal, requestAbort.signal]) : requestAbort.signal;
|
|
440
|
+
response = await sendAntigravityRequest({
|
|
409
441
|
model,
|
|
410
442
|
context,
|
|
411
443
|
streamOptions: options,
|
|
@@ -449,16 +481,19 @@ function streamCortexKitAntigravity(model, context, options) {
|
|
|
449
481
|
}
|
|
450
482
|
thinkingIndex = -1;
|
|
451
483
|
};
|
|
452
|
-
|
|
484
|
+
chunkIterator = parseGeminiSse(response)[Symbol.asyncIterator]();
|
|
485
|
+
let terminalFinishReason;
|
|
453
486
|
while (true) {
|
|
454
487
|
const next = terminalSeen ? await nextWithTimeout(
|
|
455
488
|
chunkIterator,
|
|
456
489
|
TRAILING_USAGE_TIMEOUT_MS,
|
|
457
|
-
() =>
|
|
490
|
+
() => requestAbort?.abort()
|
|
458
491
|
) : await chunkIterator.next();
|
|
459
492
|
if (!next) break;
|
|
460
493
|
if (next.done) break;
|
|
461
494
|
const chunk = next.value;
|
|
495
|
+
const embeddedFailure = describeEmbeddedStreamFailure(chunk);
|
|
496
|
+
if (embeddedFailure) throw new Error(embeddedFailure);
|
|
462
497
|
updateUsage(model, output, chunk.usageMetadata);
|
|
463
498
|
if (terminalSeen) {
|
|
464
499
|
if (chunk.usageMetadata) break;
|
|
@@ -565,6 +600,7 @@ function streamCortexKitAntigravity(model, context, options) {
|
|
|
565
600
|
output.stopReason = mapFinishReason(candidate.finishReason);
|
|
566
601
|
}
|
|
567
602
|
terminalSeen = true;
|
|
603
|
+
terminalFinishReason = candidate.finishReason;
|
|
568
604
|
const needsTrailingUsage = model.id.toLowerCase().includes("gpt-oss") && !chunk.usageMetadata;
|
|
569
605
|
if (!needsTrailingUsage) break;
|
|
570
606
|
}
|
|
@@ -573,12 +609,22 @@ function streamCortexKitAntigravity(model, context, options) {
|
|
|
573
609
|
try {
|
|
574
610
|
await chunkIterator.return?.(void 0);
|
|
575
611
|
} catch (error) {
|
|
576
|
-
if (!
|
|
612
|
+
if (!requestAbort.signal.aborted) throw error;
|
|
577
613
|
}
|
|
578
614
|
await response.body?.cancel().catch(() => {
|
|
579
615
|
});
|
|
580
616
|
}
|
|
581
617
|
if (options?.signal?.aborted) throw new Error("Request was aborted");
|
|
618
|
+
if (!terminalSeen) {
|
|
619
|
+
throw new Error(
|
|
620
|
+
"Antigravity stream ended without a terminal candidate response"
|
|
621
|
+
);
|
|
622
|
+
}
|
|
623
|
+
if (content.length === 0) {
|
|
624
|
+
throw new Error(
|
|
625
|
+
`Antigravity returned an empty response${terminalFinishReason ? ` (${terminalFinishReason})` : ""}`
|
|
626
|
+
);
|
|
627
|
+
}
|
|
582
628
|
stream.push({
|
|
583
629
|
type: "done",
|
|
584
630
|
reason: output.stopReason,
|
|
@@ -589,6 +635,11 @@ function streamCortexKitAntigravity(model, context, options) {
|
|
|
589
635
|
}
|
|
590
636
|
stream.end();
|
|
591
637
|
} catch (error) {
|
|
638
|
+
requestAbort?.abort();
|
|
639
|
+
await chunkIterator?.return?.(void 0).catch(() => {
|
|
640
|
+
});
|
|
641
|
+
await response?.body?.cancel().catch(() => {
|
|
642
|
+
});
|
|
592
643
|
output.stopReason = options?.signal?.aborted ? "aborted" : "error";
|
|
593
644
|
output.errorMessage = error instanceof Error ? error.message : String(error);
|
|
594
645
|
stream.push({ type: "error", reason: output.stopReason, error: output });
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts", "../src/credential-cache.ts", "../src/stream.ts", "../src/convert.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n authorizeAntigravity,\n exchangeAntigravity,\n getPublicModelDefinitions,\n refreshAntigravityToken,\n} from '@cortexkit/antigravity-auth-core'\nimport type {\n OAuthCredentials,\n OAuthLoginCallbacks,\n} from '@earendil-works/pi-ai'\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent'\n\nimport { rememberPackedRefresh } from './credential-cache.ts'\nimport { streamCortexKitAntigravity } from './stream.ts'\n\nconst ANTIGRAVITY_PROVIDER_ID = 'google-antigravity'\n\nfunction textImageInput(): Array<'text' | 'image'> {\n return ['text', 'image']\n}\n\nasync function loginAntigravity(\n callbacks: OAuthLoginCallbacks,\n): Promise<OAuthCredentials> {\n const auth = await authorizeAntigravity()\n callbacks.onAuth({ url: auth.url })\n const code = await callbacks.onPrompt({\n message: 'Paste the Antigravity OAuth callback URL or code:',\n })\n\n // The state (PKCE verifier + project) is carried in the authorize URL; reuse\n // it so the code exchange can recover the verifier.\n const authState = new URL(auth.url).searchParams.get('state') ?? ''\n\n // Accept either a raw code or a full redirect URL with ?code= and &state=.\n let rawCode = code.trim()\n let state = authState\n try {\n const url = new URL(rawCode)\n const codeParam = url.searchParams.get('code')\n const stateParam = url.searchParams.get('state')\n if (codeParam) rawCode = codeParam\n if (stateParam) state = stateParam\n } catch {\n // Not a URL \u2014 treat the input as a bare authorization code.\n }\n\n const result = await exchangeAntigravity(rawCode, state)\n if (result.type !== 'success') {\n throw new Error(`Antigravity OAuth exchange failed: ${result.error}`)\n }\n\n return {\n refresh: result.refresh,\n access: result.access,\n expires: result.expires,\n }\n}\n\nasync function refreshAntigravityCredentials(\n credentials: OAuthCredentials,\n): Promise<OAuthCredentials> {\n // Stored refresh is `refreshToken|projectId|managedProjectId`.\n const refreshToken = credentials.refresh.split('|')[0] ?? credentials.refresh\n const refreshed = await refreshAntigravityToken(refreshToken)\n // Preserve the project segments packed into the stored refresh string.\n const projectSegments = credentials.refresh.includes('|')\n ? credentials.refresh.slice(credentials.refresh.indexOf('|'))\n : ''\n return {\n refresh: `${refreshed.refresh}${projectSegments}`,\n access: refreshed.access,\n expires: refreshed.expires,\n }\n}\n\nexport default function cortexKitPiAntigravityAuth(pi: ExtensionAPI): void {\n const models = Object.values(getPublicModelDefinitions())\n // Pi's AssistantMessage protocol has no image-output content type. Keep\n // generation-only image routes out of the chat model catalog rather than\n // advertising output that the stream contract cannot represent.\n .filter((model) => !model.modalities.output.includes('image'))\n .map((model) => ({\n id: model.id,\n name: model.name,\n reasoning: model.reasoning,\n input: textImageInput(),\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n contextWindow: model.limit.context,\n maxTokens: model.limit.output,\n }))\n\n pi.registerProvider(ANTIGRAVITY_PROVIDER_ID, {\n name: 'Google Antigravity (CortexKit OAuth)',\n baseUrl: 'https://cloudcode-pa.googleapis.com',\n api: 'google-generative-ai',\n models,\n oauth: {\n name: 'Google Antigravity (CortexKit)',\n login: loginAntigravity,\n refreshToken: refreshAntigravityCredentials,\n getApiKey: (credentials) => {\n // Bridge the packed refresh (refreshToken|projectId|managedProjectId)\n // to the stream, which otherwise only receives the bare access token.\n rememberPackedRefresh(credentials.access, credentials.refresh)\n return credentials.access\n },\n },\n streamSimple: streamCortexKitAntigravity,\n })\n}\n", "/**\n * In-process bridge for the packed refresh string.\n *\n * pi's provider framework extracts the bearer token via `oauth.getApiKey` and\n * passes only that access token to `streamSimple` (as `options.apiKey`). The\n * packed refresh (`refreshToken|projectId|managedProjectId`) that login/refresh\n * resolved is therefore not visible to the stream. We cache it here, keyed by\n * the access token, so the stream can recover the managed-project context and\n * avoid a redundant loadCodeAssist round-trip on every turn.\n */\n\nconst packedRefreshByAccessToken = new Map<string, string>()\n// Single-account extension: keep the map tiny.\nconst MAX_ENTRIES = 4\n\nexport function rememberPackedRefresh(\n accessToken: string,\n packedRefresh: string,\n): void {\n if (!accessToken) return\n if (packedRefreshByAccessToken.has(accessToken)) {\n packedRefreshByAccessToken.delete(accessToken)\n } else if (packedRefreshByAccessToken.size >= MAX_ENTRIES) {\n const oldest = packedRefreshByAccessToken.keys().next().value\n if (oldest !== undefined) packedRefreshByAccessToken.delete(oldest)\n }\n packedRefreshByAccessToken.set(accessToken, packedRefresh)\n}\n\nexport function getPackedRefresh(accessToken: string): string | undefined {\n return packedRefreshByAccessToken.get(accessToken)\n}\n", "import {\n type AgyRequestScope,\n AgyRequestSessionStore,\n ANTIGRAVITY_ENDPOINT,\n buildAgyAgentRequestMetadata,\n buildAntigravityHarnessUserAgent,\n ensureProjectContext,\n fetchWithAgyCliTransport,\n orderAgyRequestPayloadInPlace,\n resolveModelForHeaderStyle,\n} from '@cortexkit/antigravity-auth-core'\nimport {\n type Api,\n type AssistantMessage,\n type AssistantMessageEventStream,\n type Context,\n calculateCost,\n createAssistantMessageEventStream,\n type Model,\n type SimpleStreamOptions,\n type StopReason,\n type TextContent,\n type ThinkingContent,\n type ThinkingLevel,\n type ToolCall,\n} from '@earendil-works/pi-ai'\n\nimport { buildGeminiRequest } from './convert.ts'\nimport { getPackedRefresh } from './credential-cache.ts'\n\nconst STREAM_ACTION = 'streamGenerateContent'\nconst FALLBACK_SESSION_KEY = '__default__'\nconst TRAILING_USAGE_TIMEOUT_MS = 1_000\nconst requestSessions = new AgyRequestSessionStore('')\n\nasync function nextWithTimeout<T>(\n iterator: AsyncIterator<T>,\n timeoutMs: number,\n onTimeout: () => void,\n): Promise<IteratorResult<T> | undefined> {\n let timer: ReturnType<typeof setTimeout> | undefined\n try {\n return await Promise.race([\n iterator.next(),\n new Promise<undefined>((resolve) => {\n timer = setTimeout(() => {\n onTimeout()\n resolve(undefined)\n }, timeoutMs)\n }),\n ])\n } finally {\n if (timer) clearTimeout(timer)\n }\n}\n\nfunction mapFinishReason(reason: string | null | undefined): StopReason {\n switch (reason) {\n case 'STOP':\n return 'stop'\n case 'MAX_TOKENS':\n return 'length'\n default:\n return reason ? 'stop' : 'stop'\n }\n}\n\nfunction createOutput(model: Model<Api>): AssistantMessage {\n return {\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: 'stop',\n timestamp: Date.now(),\n }\n}\n\ninterface GeminiUsageMetadata {\n promptTokenCount?: number\n candidatesTokenCount?: number\n cachedContentTokenCount?: number\n thoughtsTokenCount?: number\n totalTokenCount?: number\n}\n\ninterface GeminiStreamChunk {\n candidates?: Array<{\n content?: { role?: string; parts?: GeminiResponsePart[] }\n finishReason?: string\n }>\n usageMetadata?: GeminiUsageMetadata\n}\n\n/**\n * Antigravity wraps each streamGenerateContent SSE chunk under a `response`\n * key: `data: {\"response\": {\"candidates\": [...], \"usageMetadata\": {...}}}`.\n * Unwrap it so downstream sees the plain Gemini chunk. MITM-verified against\n * agy 1.0.4 on 2026-06-13.\n */\nfunction unwrapChunk(raw: unknown): GeminiStreamChunk {\n if (raw && typeof raw === 'object' && 'response' in raw) {\n const inner = (raw as { response?: unknown }).response\n if (inner && typeof inner === 'object') {\n return inner as GeminiStreamChunk\n }\n }\n return raw as GeminiStreamChunk\n}\n\nexport interface GeminiResponsePart {\n text?: string\n thought?: boolean\n thoughtSignature?: string\n functionCall?: { name?: string; args?: Record<string, unknown>; id?: string }\n}\n\nexport interface GeminiToolCallState {\n pendingThoughtSignature?: string\n}\n\nexport function convertGeminiToolCallPart(\n part: GeminiResponsePart,\n state: GeminiToolCallState,\n): ToolCall | undefined {\n // Antigravity emits a batch signature on a preceding empty thought part;\n // native replay attaches it to the first function call in that batch.\n if (part.thought && !part.text && part.thoughtSignature) {\n state.pendingThoughtSignature = part.thoughtSignature\n }\n\n if (!part.functionCall) return undefined\n\n const thoughtSignature =\n part.thoughtSignature ?? state.pendingThoughtSignature\n state.pendingThoughtSignature = undefined\n\n return {\n type: 'toolCall',\n id: part.functionCall.id ?? `call_${crypto.randomUUID()}`,\n name: part.functionCall.name ?? '',\n arguments: (part.functionCall.args ?? {}) as Record<string, unknown>,\n ...(thoughtSignature ? { thoughtSignature } : {}),\n }\n}\n\nexport function updateUsage(\n model: Model<Api>,\n output: AssistantMessage,\n usage?: GeminiUsageMetadata,\n): void {\n if (!usage) return\n const cacheRead = usage.cachedContentTokenCount ?? output.usage.cacheRead\n // Antigravity reports promptTokenCount as the full (uncached + cached) prompt.\n const promptTotal =\n usage.promptTokenCount ?? output.usage.input + output.usage.cacheRead\n output.usage.input = Math.max(0, promptTotal - cacheRead)\n // candidatesTokenCount excludes thinking; thoughtsTokenCount is billed as\n // output too. totalTokenCount = prompt + candidates + thoughts (MITM-verified).\n if (\n usage.candidatesTokenCount !== undefined ||\n usage.thoughtsTokenCount !== undefined\n ) {\n output.usage.output =\n (usage.candidatesTokenCount ?? 0) + (usage.thoughtsTokenCount ?? 0)\n }\n output.usage.cacheRead = cacheRead\n output.usage.totalTokens =\n output.usage.input +\n output.usage.output +\n output.usage.cacheRead +\n output.usage.cacheWrite\n calculateCost(model, output.usage)\n}\n\nexport async function* parseGeminiSse(\n response: Response,\n): AsyncGenerator<GeminiStreamChunk> {\n if (!response.body) return\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n\n const parseFrame = function* (frame: string): Generator<GeminiStreamChunk> {\n for (const line of frame.split('\\n')) {\n if (!line.startsWith('data:')) continue\n const data = line.slice(5).trim()\n if (!data || data === '[DONE]') continue\n try {\n yield unwrapChunk(JSON.parse(data))\n } catch {\n // Ignore malformed SSE frames.\n }\n }\n }\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n // Antigravity uses CRLF line endings (`\\r\\n\\r\\n` frame separators);\n // normalize so a single boundary check works for both LF and CRLF.\n buffer += decoder.decode(value, { stream: true }).replace(/\\r\\n/g, '\\n')\n let boundary = buffer.indexOf('\\n\\n')\n while (boundary !== -1) {\n const frame = buffer.slice(0, boundary)\n buffer = buffer.slice(boundary + 2)\n boundary = buffer.indexOf('\\n\\n')\n yield* parseFrame(frame)\n }\n }\n // Flush any trailing frame that did not end with a blank-line separator.\n if (buffer.trim()) {\n yield* parseFrame(buffer)\n }\n } finally {\n reader.releaseLock()\n }\n}\n\nfunction getRequestSessionKey(\n context: Context,\n options?: SimpleStreamOptions,\n): string {\n if (options?.sessionId) {\n return options.sessionId\n }\n const firstTimestamp = context.messages[0]?.timestamp\n return firstTimestamp !== undefined\n ? `message:${firstTimestamp}`\n : FALLBACK_SESSION_KEY\n}\n\nexport function finalizePiAntigravityRequest(\n request: Record<string, unknown>,\n wireModel: string,\n scope: AgyRequestScope,\n): string {\n if (Array.isArray(request.tools) && request.tools.length > 0) {\n request.toolConfig = { functionCallingConfig: { mode: 'VALIDATED' } }\n }\n\n const metadata = buildAgyAgentRequestMetadata(\n scope.session,\n request,\n wireModel,\n scope.timestamp,\n { stepCountMode: 'cli' },\n )\n request.labels = metadata.labels\n request.sessionId = metadata.sessionId\n orderAgyRequestPayloadInPlace(request)\n return metadata.requestId\n}\n\nexport function resolvePiAntigravityModel(\n model: Model<Api>,\n reasoning?: ThinkingLevel,\n) {\n const lower = model.id.toLowerCase()\n const supportsAgyTiers =\n model.reasoning &&\n (lower.includes('gemini-3') ||\n (lower.includes('claude') && lower.includes('thinking')))\n\n if (!supportsAgyTiers || !reasoning) {\n return resolveModelForHeaderStyle(model.id, 'antigravity')\n }\n\n const tier =\n reasoning === 'minimal' ? 'low' : reasoning === 'xhigh' ? 'high' : reasoning\n const baseModel = model.id.replace(/-(minimal|low|medium|high|xhigh)$/i, '')\n return resolveModelForHeaderStyle(`${baseModel}-${tier}`, 'antigravity')\n}\n\nasync function sendAntigravityRequest(options: {\n model: Model<Api>\n context: Context\n streamOptions?: SimpleStreamOptions\n accessToken: string\n sessionKey: string\n signal?: AbortSignal\n}): Promise<Response> {\n const resolved = resolvePiAntigravityModel(\n options.model,\n options.streamOptions?.reasoning,\n )\n const wireModel = resolved.actualModel\n\n // Recover the packed refresh (refreshToken|projectId|managedProjectId) that\n // login/refresh resolved; pi only hands the stream the bare access token.\n // With it, ensureProjectContext returns the cached managedProjectId directly\n // instead of re-running loadCodeAssist every turn.\n const packedRefresh = getPackedRefresh(options.accessToken) ?? ''\n const projectContext = await ensureProjectContext({\n type: 'oauth',\n refresh: packedRefresh,\n access: options.accessToken,\n expires: Date.now() + 60_000,\n })\n\n const request = buildGeminiRequest(options.context, {\n provider: options.model.provider,\n model: options.model.id,\n }) as unknown as Record<string, unknown>\n const generationConfig: Record<string, unknown> = {}\n\n if (resolved.thinkingLevel) {\n generationConfig.thinkingConfig = {\n includeThoughts: true,\n thinkingLevel: resolved.thinkingLevel,\n }\n } else if (typeof resolved.thinkingBudget === 'number') {\n generationConfig.thinkingConfig = {\n includeThoughts: true,\n thinkingBudget: resolved.thinkingBudget,\n }\n }\n\n const maxTokens = options.streamOptions?.maxTokens ?? options.model.maxTokens\n if (typeof maxTokens === 'number') {\n generationConfig.maxOutputTokens = maxTokens\n }\n\n if (Object.keys(generationConfig).length > 0) {\n request.generationConfig = generationConfig\n }\n\n const requestScope = requestSessions.beginRequest(options.sessionKey)\n const requestId = finalizePiAntigravityRequest(\n request,\n wireModel,\n requestScope,\n )\n\n const envelope = {\n project: projectContext.effectiveProjectId,\n requestId,\n request,\n model: wireModel,\n userAgent: 'antigravity',\n requestType: 'agent',\n }\n\n const url = `${ANTIGRAVITY_ENDPOINT}/v1internal:${STREAM_ACTION}?alt=sse`\n\n return fetchWithAgyCliTransport(\n url,\n {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${options.accessToken}`,\n 'Content-Type': 'application/json',\n 'User-Agent': buildAntigravityHarnessUserAgent(),\n 'Accept-Encoding': 'gzip',\n },\n body: JSON.stringify(envelope),\n },\n { signal: options.signal ?? options.streamOptions?.signal ?? null },\n )\n}\n\nexport function streamCortexKitAntigravity(\n model: Model<Api>,\n context: Context,\n options?: SimpleStreamOptions,\n): AssistantMessageEventStream {\n const stream = createAssistantMessageEventStream()\n\n void (async () => {\n const output = createOutput(model)\n stream.push({ type: 'start', partial: output })\n\n try {\n const accessToken = options?.apiKey ?? ''\n if (!accessToken)\n throw new Error('Missing Antigravity OAuth access token')\n\n const sessionKey = getRequestSessionKey(context, options)\n const trailingUsageAbort = new AbortController()\n const requestSignal = options?.signal\n ? AbortSignal.any([options.signal, trailingUsageAbort.signal])\n : trailingUsageAbort.signal\n const response = await sendAntigravityRequest({\n model,\n context,\n streamOptions: options,\n accessToken,\n sessionKey,\n signal: requestSignal,\n })\n\n if (!response.ok) {\n throw new Error(\n `Antigravity request failed: HTTP ${response.status} ${await response.text()}`,\n )\n }\n\n const content = output.content as Array<\n TextContent | ThinkingContent | ToolCall\n >\n const toolCallState: GeminiToolCallState = {}\n let textIndex = -1\n let thinkingIndex = -1\n let terminalSeen = false\n\n const closeText = () => {\n if (textIndex === -1) return\n const block = content[textIndex]\n if (block?.type === 'text') {\n stream.push({\n type: 'text_end',\n contentIndex: textIndex,\n content: block.text,\n partial: output,\n })\n }\n textIndex = -1\n }\n\n const closeThinking = () => {\n if (thinkingIndex === -1) return\n const block = content[thinkingIndex]\n if (block?.type === 'thinking') {\n stream.push({\n type: 'thinking_end',\n contentIndex: thinkingIndex,\n content: block.thinking,\n partial: output,\n })\n }\n thinkingIndex = -1\n }\n\n const chunkIterator = parseGeminiSse(response)[Symbol.asyncIterator]()\n while (true) {\n const next = terminalSeen\n ? await nextWithTimeout(\n chunkIterator,\n TRAILING_USAGE_TIMEOUT_MS,\n () => trailingUsageAbort.abort(),\n )\n : await chunkIterator.next()\n if (!next) break\n if (next.done) break\n\n const chunk = next.value\n updateUsage(model, output, chunk.usageMetadata)\n\n if (terminalSeen) {\n if (chunk.usageMetadata) break\n continue\n }\n\n const candidate = chunk.candidates?.[0]\n const parts = candidate?.content?.parts ?? []\n\n for (const part of parts) {\n if (\n !part.thought &&\n !part.functionCall &&\n !part.text &&\n part.thoughtSignature\n ) {\n const block = textIndex === -1 ? undefined : content[textIndex]\n if (block?.type === 'text') {\n block.textSignature = part.thoughtSignature\n } else {\n toolCallState.pendingThoughtSignature = part.thoughtSignature\n }\n continue\n }\n\n const toolCall = convertGeminiToolCallPart(part, toolCallState)\n if (toolCall) {\n closeText()\n closeThinking()\n content.push(toolCall)\n const idx = content.length - 1\n stream.push({\n type: 'toolcall_start',\n contentIndex: idx,\n partial: output,\n })\n stream.push({\n type: 'toolcall_end',\n contentIndex: idx,\n toolCall,\n partial: output,\n })\n output.stopReason = 'toolUse'\n continue\n }\n\n if (part.thought) {\n if (typeof part.text !== 'string' || part.text.length === 0)\n continue\n closeText()\n if (thinkingIndex === -1) {\n content.push({\n type: 'thinking',\n thinking: '',\n ...(part.thoughtSignature\n ? { thinkingSignature: part.thoughtSignature }\n : {}),\n })\n thinkingIndex = content.length - 1\n stream.push({\n type: 'thinking_start',\n contentIndex: thinkingIndex,\n partial: output,\n })\n }\n const block = content[thinkingIndex]\n if (block?.type === 'thinking') {\n block.thinking += part.text\n if (part.thoughtSignature)\n block.thinkingSignature = part.thoughtSignature\n stream.push({\n type: 'thinking_delta',\n contentIndex: thinkingIndex,\n delta: part.text,\n partial: output,\n })\n }\n continue\n }\n\n if (typeof part.text === 'string' && part.text.length > 0) {\n closeThinking()\n if (textIndex === -1) {\n const textSignature =\n part.thoughtSignature ?? toolCallState.pendingThoughtSignature\n toolCallState.pendingThoughtSignature = undefined\n content.push({\n type: 'text',\n text: '',\n ...(textSignature ? { textSignature } : {}),\n })\n textIndex = content.length - 1\n stream.push({\n type: 'text_start',\n contentIndex: textIndex,\n partial: output,\n })\n }\n const block = content[textIndex]\n if (block?.type === 'text') {\n block.text += part.text\n if (part.thoughtSignature)\n block.textSignature = part.thoughtSignature\n stream.push({\n type: 'text_delta',\n contentIndex: textIndex,\n delta: part.text,\n partial: output,\n })\n }\n }\n }\n\n if (candidate?.finishReason) {\n closeText()\n closeThinking()\n if (output.stopReason !== 'toolUse') {\n output.stopReason = mapFinishReason(candidate.finishReason)\n }\n terminalSeen = true\n const needsTrailingUsage =\n model.id.toLowerCase().includes('gpt-oss') && !chunk.usageMetadata\n if (!needsTrailingUsage) break\n }\n }\n\n if (terminalSeen) {\n try {\n await chunkIterator.return?.(undefined)\n } catch (error) {\n if (!trailingUsageAbort.signal.aborted) throw error\n }\n await response.body?.cancel().catch(() => {})\n }\n\n if (options?.signal?.aborted) throw new Error('Request was aborted')\n\n stream.push({\n type: 'done',\n reason: output.stopReason as 'stop' | 'length' | 'toolUse',\n message: output,\n })\n if (output.stopReason === 'stop' || output.stopReason === 'length') {\n requestSessions.completeExecution(sessionKey)\n }\n stream.end()\n } catch (error) {\n output.stopReason = options?.signal?.aborted ? 'aborted' : 'error'\n output.errorMessage =\n 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", "import { toGeminiSchema } from '@cortexkit/antigravity-auth-core'\nimport type {\n AssistantMessage,\n Context,\n ImageContent,\n Message,\n TextContent,\n Tool,\n ToolResultMessage,\n} from '@earendil-works/pi-ai'\n\n/** Gemini `contents` part shapes. */\ntype GeminiPart =\n | { text: string; thought?: boolean; thoughtSignature?: string }\n | { inlineData: { mimeType: string; data: string } }\n | {\n functionCall: { name: string; args: Record<string, unknown>; id: string }\n thoughtSignature?: string\n }\n | {\n functionResponse: {\n name: string\n response: Record<string, unknown>\n id: string\n }\n }\n\ninterface GeminiContent {\n role: 'user' | 'model'\n parts: GeminiPart[]\n}\n\ninterface GeminiTool {\n functionDeclarations: Array<{\n name: string\n description: string\n parameters?: unknown\n }>\n}\n\nexport interface GeminiRequest {\n contents: GeminiContent[]\n tools?: GeminiTool[]\n systemInstruction?: { parts: GeminiPart[] }\n}\n\nfunction sanitize(text: string): string {\n return text.replace(/[\\uD800-\\uDFFF]/gu, '\\uFFFD')\n}\n\nfunction convertUserParts(\n content: Array<TextContent | ImageContent>,\n): GeminiPart[] {\n const parts: GeminiPart[] = []\n for (const item of content) {\n if (item.type === 'text') {\n if (item.text) parts.push({ text: sanitize(item.text) })\n } else if (item.type === 'image' && item.data) {\n parts.push({ inlineData: { mimeType: item.mimeType, data: item.data } })\n }\n }\n return parts\n}\n\nfunction convertAssistantParts(\n message: AssistantMessage,\n preserveSignedHistory: boolean,\n): GeminiPart[] {\n const parts: GeminiPart[] = []\n for (const block of message.content) {\n if (block.type === 'thinking') {\n if (preserveSignedHistory && block.thinking) {\n parts.push({\n text: sanitize(block.thinking),\n thought: true,\n ...(block.thinkingSignature\n ? { thoughtSignature: block.thinkingSignature }\n : {}),\n })\n }\n } else if (block.type === 'text' && block.text.trim()) {\n parts.push({\n text: sanitize(block.text),\n ...(preserveSignedHistory && block.textSignature\n ? { thoughtSignature: block.textSignature }\n : {}),\n })\n } else if (block.type === 'toolCall') {\n parts.push({\n functionCall: {\n name: block.name,\n args: (block.arguments ?? {}) as Record<string, unknown>,\n id: block.id,\n },\n ...(preserveSignedHistory && block.thoughtSignature\n ? { thoughtSignature: block.thoughtSignature }\n : {}),\n })\n }\n }\n return parts\n}\n\nfunction toolResultResponse(\n message: ToolResultMessage,\n): Record<string, unknown> {\n const text = message.content\n .filter((item): item is TextContent => item.type === 'text')\n .map((item) => item.text)\n .join('\\n')\n if (message.isError) {\n return { error: text || 'Error' }\n }\n return { output: text }\n}\n\nexport interface BuildGeminiRequestOptions {\n provider?: string\n model?: string\n}\n\nfunction isSameTargetModel(\n message: AssistantMessage,\n options: BuildGeminiRequestOptions | undefined,\n): boolean {\n if (!options?.provider || !options.model) return true\n return (\n message.provider === options.provider && message.model === options.model\n )\n}\n\nfunction convertMessages(\n messages: Message[],\n options?: BuildGeminiRequestOptions,\n): GeminiContent[] {\n const contents: GeminiContent[] = []\n const callMatchesTarget = new Map<string, boolean>()\n\n for (const message of messages) {\n if (message?.role !== 'assistant') continue\n const matchesTarget = isSameTargetModel(message, options)\n for (const block of message.content) {\n if (block.type === 'toolCall') {\n callMatchesTarget.set(block.id, matchesTarget)\n }\n }\n }\n\n for (const message of messages) {\n if (!message) continue\n\n if (message.role === 'user') {\n const parts =\n typeof message.content === 'string'\n ? message.content.trim()\n ? [{ text: sanitize(message.content) }]\n : []\n : convertUserParts(\n message.content as Array<TextContent | ImageContent>,\n )\n if (parts.length) contents.push({ role: 'user', parts })\n continue\n }\n\n if (message.role === 'assistant') {\n const parts = convertAssistantParts(\n message,\n isSameTargetModel(message, options),\n )\n if (parts.length) contents.push({ role: 'model', parts })\n continue\n }\n\n if (message.role === 'toolResult') {\n const role =\n callMatchesTarget.get(message.toolCallId) === true ? 'model' : 'user'\n const part: GeminiPart = {\n functionResponse: {\n name: message.toolName,\n response: toolResultResponse(message),\n id: message.toolCallId,\n },\n }\n // Gemini groups consecutive function responses into one user turn.\n const last = contents[contents.length - 1]\n if (\n last &&\n last.role === role &&\n last.parts.every((p) => 'functionResponse' in p)\n ) {\n last.parts.push(part)\n } else {\n contents.push({ role, parts: [part] })\n }\n }\n }\n\n return contents\n}\n\nfunction convertTools(tools: Tool[] | undefined): GeminiTool[] | undefined {\n if (!tools?.length) return undefined\n return [\n {\n // Match the agy wire format (MITM-verified): field name is `parameters`\n // (not `parametersJsonSchema`) and schemas are sanitized to Gemini shape\n // (UPPERCASE types, unsupported keywords stripped) via core's toGeminiSchema.\n functionDeclarations: tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n parameters: toGeminiSchema(tool.parameters),\n })),\n },\n ]\n}\n\n/**\n * Convert a pi `Context` into a Gemini `generateContent` request body\n * (the inner `request` object of the Antigravity envelope).\n */\nexport function buildGeminiRequest(\n context: Context,\n options?: BuildGeminiRequestOptions,\n): GeminiRequest {\n const request: GeminiRequest = {\n contents: convertMessages(context.messages, options),\n }\n\n const tools = convertTools(context.tools)\n if (tools) request.tools = tools\n\n if (context.systemPrompt?.trim()) {\n request.systemInstruction = {\n parts: [{ text: sanitize(context.systemPrompt) }],\n }\n }\n\n return request\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
4
|
+
"sourcesContent": ["import {\n authorizeAntigravity,\n exchangeAntigravity,\n getPublicModelDefinitions,\n refreshAntigravityToken,\n} from '@cortexkit/antigravity-auth-core'\nimport type {\n OAuthCredentials,\n OAuthLoginCallbacks,\n} from '@earendil-works/pi-ai'\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent'\n\nimport { rememberPackedRefresh } from './credential-cache.ts'\nimport { streamCortexKitAntigravity } from './stream.ts'\n\nconst ANTIGRAVITY_PROVIDER_ID = 'google-antigravity'\n\nfunction textImageInput(): Array<'text' | 'image'> {\n return ['text', 'image']\n}\n\nasync function loginAntigravity(\n callbacks: OAuthLoginCallbacks,\n): Promise<OAuthCredentials> {\n const auth = await authorizeAntigravity()\n callbacks.onAuth({ url: auth.url })\n const code = await callbacks.onPrompt({\n message: 'Paste the Antigravity OAuth callback URL or code:',\n })\n\n // The state (PKCE verifier + project) is carried in the authorize URL; reuse\n // it so the code exchange can recover the verifier.\n const authState = new URL(auth.url).searchParams.get('state') ?? ''\n\n // Accept either a raw code or a full redirect URL with ?code= and &state=.\n let rawCode = code.trim()\n let state = authState\n try {\n const url = new URL(rawCode)\n const codeParam = url.searchParams.get('code')\n const stateParam = url.searchParams.get('state')\n if (codeParam) rawCode = codeParam\n if (stateParam) state = stateParam\n } catch {\n // Not a URL \u2014 treat the input as a bare authorization code.\n }\n\n const result = await exchangeAntigravity(rawCode, state)\n if (result.type !== 'success') {\n throw new Error(`Antigravity OAuth exchange failed: ${result.error}`)\n }\n\n return {\n refresh: result.refresh,\n access: result.access,\n expires: result.expires,\n }\n}\n\nasync function refreshAntigravityCredentials(\n credentials: OAuthCredentials,\n): Promise<OAuthCredentials> {\n // Stored refresh is `refreshToken|projectId|managedProjectId`.\n const refreshToken = credentials.refresh.split('|')[0] ?? credentials.refresh\n const refreshed = await refreshAntigravityToken(refreshToken)\n // Preserve the project segments packed into the stored refresh string.\n const projectSegments = credentials.refresh.includes('|')\n ? credentials.refresh.slice(credentials.refresh.indexOf('|'))\n : ''\n return {\n refresh: `${refreshed.refresh}${projectSegments}`,\n access: refreshed.access,\n expires: refreshed.expires,\n }\n}\n\nexport default function cortexKitPiAntigravityAuth(pi: ExtensionAPI): void {\n const models = Object.values(getPublicModelDefinitions())\n // Pi's AssistantMessage protocol has no image-output content type. Keep\n // generation-only image routes out of the chat model catalog rather than\n // advertising output that the stream contract cannot represent.\n .filter((model) => !model.modalities.output.includes('image'))\n .map((model) => ({\n id: model.id,\n name: model.name,\n reasoning: model.reasoning,\n input: textImageInput(),\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n contextWindow: model.limit.context,\n maxTokens: model.limit.output,\n }))\n\n pi.registerProvider(ANTIGRAVITY_PROVIDER_ID, {\n name: 'Google Antigravity (CortexKit OAuth)',\n baseUrl: 'https://cloudcode-pa.googleapis.com',\n api: 'google-generative-ai',\n models,\n oauth: {\n name: 'Google Antigravity (CortexKit)',\n login: loginAntigravity,\n refreshToken: refreshAntigravityCredentials,\n getApiKey: (credentials) => {\n // Bridge the packed refresh (refreshToken|projectId|managedProjectId)\n // to the stream, which otherwise only receives the bare access token.\n rememberPackedRefresh(credentials.access, credentials.refresh)\n return credentials.access\n },\n },\n streamSimple: streamCortexKitAntigravity,\n })\n}\n", "/**\n * In-process bridge for the packed refresh string.\n *\n * pi's provider framework extracts the bearer token via `oauth.getApiKey` and\n * passes only that access token to `streamSimple` (as `options.apiKey`). The\n * packed refresh (`refreshToken|projectId|managedProjectId`) that login/refresh\n * resolved is therefore not visible to the stream. We cache it here, keyed by\n * the access token, so the stream can recover the managed-project context and\n * avoid a redundant loadCodeAssist round-trip on every turn.\n */\n\nconst packedRefreshByAccessToken = new Map<string, string>()\n// Single-account extension: keep the map tiny.\nconst MAX_ENTRIES = 4\n\nexport function rememberPackedRefresh(\n accessToken: string,\n packedRefresh: string,\n): void {\n if (!accessToken) return\n if (packedRefreshByAccessToken.has(accessToken)) {\n packedRefreshByAccessToken.delete(accessToken)\n } else if (packedRefreshByAccessToken.size >= MAX_ENTRIES) {\n const oldest = packedRefreshByAccessToken.keys().next().value\n if (oldest !== undefined) packedRefreshByAccessToken.delete(oldest)\n }\n packedRefreshByAccessToken.set(accessToken, packedRefresh)\n}\n\nexport function getPackedRefresh(accessToken: string): string | undefined {\n return packedRefreshByAccessToken.get(accessToken)\n}\n", "import {\n type AgyRequestScope,\n AgyRequestSessionStore,\n ANTIGRAVITY_ENDPOINT,\n buildAgyAgentRequestMetadata,\n buildAntigravityHarnessUserAgent,\n ensureProjectContext,\n fetchWithAgyCliTransport,\n orderAgyRequestPayloadInPlace,\n resolveModelForHeaderStyle,\n} from '@cortexkit/antigravity-auth-core'\nimport {\n type Api,\n type AssistantMessage,\n type AssistantMessageEventStream,\n type Context,\n calculateCost,\n createAssistantMessageEventStream,\n type Model,\n type SimpleStreamOptions,\n type StopReason,\n type TextContent,\n type ThinkingContent,\n type ThinkingLevel,\n type ToolCall,\n} from '@earendil-works/pi-ai'\n\nimport { buildGeminiRequest } from './convert.ts'\nimport { getPackedRefresh } from './credential-cache.ts'\n\nconst STREAM_ACTION = 'streamGenerateContent'\nconst FALLBACK_SESSION_KEY = '__default__'\nconst TRAILING_USAGE_TIMEOUT_MS = 1_000\nconst requestSessions = new AgyRequestSessionStore('')\n\nasync function nextWithTimeout<T>(\n iterator: AsyncIterator<T>,\n timeoutMs: number,\n onTimeout: () => void,\n): Promise<IteratorResult<T> | undefined> {\n let timer: ReturnType<typeof setTimeout> | undefined\n try {\n return await Promise.race([\n iterator.next(),\n new Promise<undefined>((resolve) => {\n timer = setTimeout(() => {\n onTimeout()\n resolve(undefined)\n }, timeoutMs)\n }),\n ])\n } finally {\n if (timer) clearTimeout(timer)\n }\n}\n\nfunction mapFinishReason(reason: string | null | undefined): StopReason {\n switch (reason) {\n case 'STOP':\n return 'stop'\n case 'MAX_TOKENS':\n return 'length'\n default:\n return reason ? 'stop' : 'stop'\n }\n}\n\nfunction createOutput(model: Model<Api>): AssistantMessage {\n return {\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: 'stop',\n timestamp: Date.now(),\n }\n}\n\ninterface GeminiUsageMetadata {\n promptTokenCount?: number\n candidatesTokenCount?: number\n cachedContentTokenCount?: number\n thoughtsTokenCount?: number\n totalTokenCount?: number\n}\n\ninterface GeminiStreamChunk {\n candidates?: Array<{\n content?: { role?: string; parts?: GeminiResponsePart[] }\n finishReason?: string\n }>\n usageMetadata?: GeminiUsageMetadata\n error?: unknown\n promptFeedback?: unknown\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n return value !== null && typeof value === 'object'\n ? (value as Record<string, unknown>)\n : undefined\n}\n\nfunction describeEmbeddedStreamFailure(\n chunk: GeminiStreamChunk,\n): string | undefined {\n if (chunk.error !== undefined) {\n const error = asRecord(chunk.error)\n if (!error) {\n const detail = typeof chunk.error === 'string' ? `: ${chunk.error}` : ''\n return `Antigravity stream error${detail}`\n }\n\n const labels: string[] = []\n if (typeof error.status === 'string') labels.push(error.status)\n if (typeof error.code === 'number' || typeof error.code === 'string') {\n labels.push(`code ${String(error.code)}`)\n }\n const details = Array.isArray(error.details) ? error.details : []\n const reason = details\n .map((detail) => asRecord(detail)?.reason)\n .find((value): value is string => typeof value === 'string')\n if (reason && !labels.includes(reason)) labels.push(reason)\n\n const label = labels.length > 0 ? ` (${labels.join(', ')})` : ''\n const message =\n typeof error.message === 'string' && error.message.length > 0\n ? `: ${error.message}`\n : ''\n return `Antigravity stream error${label}${message}`\n }\n\n const promptFeedback = asRecord(chunk.promptFeedback)\n if (!promptFeedback) return undefined\n const reason =\n typeof promptFeedback.blockReason === 'string'\n ? promptFeedback.blockReason\n : undefined\n const message =\n typeof promptFeedback.blockReasonMessage === 'string'\n ? promptFeedback.blockReasonMessage\n : undefined\n if (!reason && !message) return undefined\n\n return `Antigravity prompt blocked${reason ? ` (${reason})` : ''}${message ? `: ${message}` : ''}`\n}\n\n/**\n * Antigravity wraps each streamGenerateContent SSE chunk under a `response`\n * key: `data: {\"response\": {\"candidates\": [...], \"usageMetadata\": {...}}}`.\n * Unwrap it so downstream sees the plain Gemini chunk. MITM-verified against\n * agy 1.0.4 on 2026-06-13.\n */\nfunction unwrapChunk(raw: unknown): GeminiStreamChunk {\n if (raw && typeof raw === 'object' && 'response' in raw) {\n const inner = (raw as { response?: unknown }).response\n if (inner && typeof inner === 'object') {\n return inner as GeminiStreamChunk\n }\n }\n return raw as GeminiStreamChunk\n}\n\nexport interface GeminiResponsePart {\n text?: string\n thought?: boolean\n thoughtSignature?: string\n functionCall?: { name?: string; args?: Record<string, unknown>; id?: string }\n}\n\nexport interface GeminiToolCallState {\n pendingThoughtSignature?: string\n}\n\nexport function convertGeminiToolCallPart(\n part: GeminiResponsePart,\n state: GeminiToolCallState,\n): ToolCall | undefined {\n // Antigravity emits a batch signature on a preceding empty thought part;\n // native replay attaches it to the first function call in that batch.\n if (part.thought && !part.text && part.thoughtSignature) {\n state.pendingThoughtSignature = part.thoughtSignature\n }\n\n if (!part.functionCall) return undefined\n\n const thoughtSignature =\n part.thoughtSignature ?? state.pendingThoughtSignature\n state.pendingThoughtSignature = undefined\n\n return {\n type: 'toolCall',\n id: part.functionCall.id ?? `call_${crypto.randomUUID()}`,\n name: part.functionCall.name ?? '',\n arguments: (part.functionCall.args ?? {}) as Record<string, unknown>,\n ...(thoughtSignature ? { thoughtSignature } : {}),\n }\n}\n\nexport function updateUsage(\n model: Model<Api>,\n output: AssistantMessage,\n usage?: GeminiUsageMetadata,\n): void {\n if (!usage) return\n const cacheRead = usage.cachedContentTokenCount ?? output.usage.cacheRead\n // Antigravity reports promptTokenCount as the full (uncached + cached) prompt.\n const promptTotal =\n usage.promptTokenCount ?? output.usage.input + output.usage.cacheRead\n output.usage.input = Math.max(0, promptTotal - cacheRead)\n // candidatesTokenCount excludes thinking; thoughtsTokenCount is billed as\n // output too. totalTokenCount = prompt + candidates + thoughts (MITM-verified).\n if (\n usage.candidatesTokenCount !== undefined ||\n usage.thoughtsTokenCount !== undefined\n ) {\n output.usage.output =\n (usage.candidatesTokenCount ?? 0) + (usage.thoughtsTokenCount ?? 0)\n }\n output.usage.cacheRead = cacheRead\n output.usage.totalTokens =\n output.usage.input +\n output.usage.output +\n output.usage.cacheRead +\n output.usage.cacheWrite\n calculateCost(model, output.usage)\n}\n\nexport async function* parseGeminiSse(\n response: Response,\n): AsyncGenerator<GeminiStreamChunk> {\n if (!response.body) return\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n\n const parseFrame = function* (frame: string): Generator<GeminiStreamChunk> {\n for (const line of frame.split('\\n')) {\n if (!line.startsWith('data:')) continue\n const data = line.slice(5).trim()\n if (!data || data === '[DONE]') continue\n try {\n yield unwrapChunk(JSON.parse(data))\n } catch {\n // Ignore malformed SSE frames.\n }\n }\n }\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n // Antigravity uses CRLF line endings (`\\r\\n\\r\\n` frame separators);\n // normalize so a single boundary check works for both LF and CRLF.\n buffer += decoder.decode(value, { stream: true }).replace(/\\r\\n/g, '\\n')\n let boundary = buffer.indexOf('\\n\\n')\n while (boundary !== -1) {\n const frame = buffer.slice(0, boundary)\n buffer = buffer.slice(boundary + 2)\n boundary = buffer.indexOf('\\n\\n')\n yield* parseFrame(frame)\n }\n }\n // Flush any trailing frame that did not end with a blank-line separator.\n if (buffer.trim()) {\n yield* parseFrame(buffer)\n }\n } finally {\n reader.releaseLock()\n }\n}\n\nfunction getRequestSessionKey(\n context: Context,\n options?: SimpleStreamOptions,\n): string {\n if (options?.sessionId) {\n return options.sessionId\n }\n const firstTimestamp = context.messages[0]?.timestamp\n return firstTimestamp !== undefined\n ? `message:${firstTimestamp}`\n : FALLBACK_SESSION_KEY\n}\n\nexport function finalizePiAntigravityRequest(\n request: Record<string, unknown>,\n wireModel: string,\n scope: AgyRequestScope,\n): string {\n if (Array.isArray(request.tools) && request.tools.length > 0) {\n request.toolConfig = { functionCallingConfig: { mode: 'VALIDATED' } }\n }\n\n const metadata = buildAgyAgentRequestMetadata(\n scope.session,\n request,\n wireModel,\n scope.timestamp,\n { stepCountMode: 'cli' },\n )\n request.labels = metadata.labels\n request.sessionId = metadata.sessionId\n orderAgyRequestPayloadInPlace(request)\n return metadata.requestId\n}\n\nexport function resolvePiAntigravityModel(\n model: Model<Api>,\n reasoning?: ThinkingLevel,\n) {\n const lower = model.id.toLowerCase()\n const supportsAgyTiers =\n model.reasoning &&\n (lower.includes('gemini-3') ||\n (lower.includes('claude') && lower.includes('thinking')))\n\n if (!supportsAgyTiers || !reasoning) {\n return resolveModelForHeaderStyle(model.id, 'antigravity')\n }\n\n const tier =\n reasoning === 'minimal' ? 'low' : reasoning === 'xhigh' ? 'high' : reasoning\n const baseModel = model.id.replace(/-(minimal|low|medium|high|xhigh)$/i, '')\n return resolveModelForHeaderStyle(`${baseModel}-${tier}`, 'antigravity')\n}\n\nasync function sendAntigravityRequest(options: {\n model: Model<Api>\n context: Context\n streamOptions?: SimpleStreamOptions\n accessToken: string\n sessionKey: string\n signal?: AbortSignal\n}): Promise<Response> {\n const resolved = resolvePiAntigravityModel(\n options.model,\n options.streamOptions?.reasoning,\n )\n const wireModel = resolved.actualModel\n\n // Recover the packed refresh (refreshToken|projectId|managedProjectId) that\n // login/refresh resolved; pi only hands the stream the bare access token.\n // With it, ensureProjectContext returns the cached managedProjectId directly\n // instead of re-running loadCodeAssist every turn.\n const packedRefresh = getPackedRefresh(options.accessToken) ?? ''\n const projectContext = await ensureProjectContext({\n type: 'oauth',\n refresh: packedRefresh,\n access: options.accessToken,\n expires: Date.now() + 60_000,\n })\n\n const request = buildGeminiRequest(options.context, {\n provider: options.model.provider,\n model: options.model.id,\n }) as unknown as Record<string, unknown>\n const generationConfig: Record<string, unknown> = {}\n\n if (resolved.thinkingLevel) {\n generationConfig.thinkingConfig = {\n includeThoughts: true,\n thinkingLevel: resolved.thinkingLevel,\n }\n } else if (typeof resolved.thinkingBudget === 'number') {\n generationConfig.thinkingConfig = {\n includeThoughts: true,\n thinkingBudget: resolved.thinkingBudget,\n }\n }\n\n const maxTokens = options.streamOptions?.maxTokens ?? options.model.maxTokens\n if (typeof maxTokens === 'number') {\n generationConfig.maxOutputTokens = maxTokens\n }\n\n if (Object.keys(generationConfig).length > 0) {\n request.generationConfig = generationConfig\n }\n\n const requestScope = requestSessions.beginRequest(options.sessionKey)\n const requestId = finalizePiAntigravityRequest(\n request,\n wireModel,\n requestScope,\n )\n\n const envelope = {\n project: projectContext.effectiveProjectId,\n requestId,\n request,\n model: wireModel,\n userAgent: 'antigravity',\n requestType: 'agent',\n }\n\n const url = `${ANTIGRAVITY_ENDPOINT}/v1internal:${STREAM_ACTION}?alt=sse`\n\n return fetchWithAgyCliTransport(\n url,\n {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${options.accessToken}`,\n 'Content-Type': 'application/json',\n 'User-Agent': buildAntigravityHarnessUserAgent(),\n 'Accept-Encoding': 'gzip',\n },\n body: JSON.stringify(envelope),\n },\n { signal: options.signal ?? options.streamOptions?.signal ?? null },\n )\n}\n\nexport function streamCortexKitAntigravity(\n model: Model<Api>,\n context: Context,\n options?: SimpleStreamOptions,\n): AssistantMessageEventStream {\n const stream = createAssistantMessageEventStream()\n\n void (async () => {\n const output = createOutput(model)\n stream.push({ type: 'start', partial: output })\n let response: Response | undefined\n let requestAbort: AbortController | undefined\n let chunkIterator: AsyncIterator<GeminiStreamChunk> | undefined\n\n try {\n const accessToken = options?.apiKey ?? ''\n if (!accessToken)\n throw new Error('Missing Antigravity OAuth access token')\n\n const sessionKey = getRequestSessionKey(context, options)\n requestAbort = new AbortController()\n const requestSignal = options?.signal\n ? AbortSignal.any([options.signal, requestAbort.signal])\n : requestAbort.signal\n response = await sendAntigravityRequest({\n model,\n context,\n streamOptions: options,\n accessToken,\n sessionKey,\n signal: requestSignal,\n })\n\n if (!response.ok) {\n throw new Error(\n `Antigravity request failed: HTTP ${response.status} ${await response.text()}`,\n )\n }\n\n const content = output.content as Array<\n TextContent | ThinkingContent | ToolCall\n >\n const toolCallState: GeminiToolCallState = {}\n let textIndex = -1\n let thinkingIndex = -1\n let terminalSeen = false\n\n const closeText = () => {\n if (textIndex === -1) return\n const block = content[textIndex]\n if (block?.type === 'text') {\n stream.push({\n type: 'text_end',\n contentIndex: textIndex,\n content: block.text,\n partial: output,\n })\n }\n textIndex = -1\n }\n\n const closeThinking = () => {\n if (thinkingIndex === -1) return\n const block = content[thinkingIndex]\n if (block?.type === 'thinking') {\n stream.push({\n type: 'thinking_end',\n contentIndex: thinkingIndex,\n content: block.thinking,\n partial: output,\n })\n }\n thinkingIndex = -1\n }\n\n chunkIterator = parseGeminiSse(response)[Symbol.asyncIterator]()\n let terminalFinishReason: string | undefined\n while (true) {\n const next = terminalSeen\n ? await nextWithTimeout(\n chunkIterator,\n TRAILING_USAGE_TIMEOUT_MS,\n () => requestAbort?.abort(),\n )\n : await chunkIterator.next()\n if (!next) break\n if (next.done) break\n\n const chunk = next.value\n const embeddedFailure = describeEmbeddedStreamFailure(chunk)\n if (embeddedFailure) throw new Error(embeddedFailure)\n updateUsage(model, output, chunk.usageMetadata)\n\n if (terminalSeen) {\n if (chunk.usageMetadata) break\n continue\n }\n\n const candidate = chunk.candidates?.[0]\n const parts = candidate?.content?.parts ?? []\n\n for (const part of parts) {\n if (\n !part.thought &&\n !part.functionCall &&\n !part.text &&\n part.thoughtSignature\n ) {\n const block = textIndex === -1 ? undefined : content[textIndex]\n if (block?.type === 'text') {\n block.textSignature = part.thoughtSignature\n } else {\n toolCallState.pendingThoughtSignature = part.thoughtSignature\n }\n continue\n }\n\n const toolCall = convertGeminiToolCallPart(part, toolCallState)\n if (toolCall) {\n closeText()\n closeThinking()\n content.push(toolCall)\n const idx = content.length - 1\n stream.push({\n type: 'toolcall_start',\n contentIndex: idx,\n partial: output,\n })\n stream.push({\n type: 'toolcall_end',\n contentIndex: idx,\n toolCall,\n partial: output,\n })\n output.stopReason = 'toolUse'\n continue\n }\n\n if (part.thought) {\n if (typeof part.text !== 'string' || part.text.length === 0)\n continue\n closeText()\n if (thinkingIndex === -1) {\n content.push({\n type: 'thinking',\n thinking: '',\n ...(part.thoughtSignature\n ? { thinkingSignature: part.thoughtSignature }\n : {}),\n })\n thinkingIndex = content.length - 1\n stream.push({\n type: 'thinking_start',\n contentIndex: thinkingIndex,\n partial: output,\n })\n }\n const block = content[thinkingIndex]\n if (block?.type === 'thinking') {\n block.thinking += part.text\n if (part.thoughtSignature)\n block.thinkingSignature = part.thoughtSignature\n stream.push({\n type: 'thinking_delta',\n contentIndex: thinkingIndex,\n delta: part.text,\n partial: output,\n })\n }\n continue\n }\n\n if (typeof part.text === 'string' && part.text.length > 0) {\n closeThinking()\n if (textIndex === -1) {\n const textSignature =\n part.thoughtSignature ?? toolCallState.pendingThoughtSignature\n toolCallState.pendingThoughtSignature = undefined\n content.push({\n type: 'text',\n text: '',\n ...(textSignature ? { textSignature } : {}),\n })\n textIndex = content.length - 1\n stream.push({\n type: 'text_start',\n contentIndex: textIndex,\n partial: output,\n })\n }\n const block = content[textIndex]\n if (block?.type === 'text') {\n block.text += part.text\n if (part.thoughtSignature)\n block.textSignature = part.thoughtSignature\n stream.push({\n type: 'text_delta',\n contentIndex: textIndex,\n delta: part.text,\n partial: output,\n })\n }\n }\n }\n\n if (candidate?.finishReason) {\n closeText()\n closeThinking()\n if (output.stopReason !== 'toolUse') {\n output.stopReason = mapFinishReason(candidate.finishReason)\n }\n terminalSeen = true\n terminalFinishReason = candidate.finishReason\n const needsTrailingUsage =\n model.id.toLowerCase().includes('gpt-oss') && !chunk.usageMetadata\n if (!needsTrailingUsage) break\n }\n }\n\n if (terminalSeen) {\n try {\n await chunkIterator.return?.(undefined)\n } catch (error) {\n if (!requestAbort.signal.aborted) throw error\n }\n await response.body?.cancel().catch(() => {})\n }\n\n if (options?.signal?.aborted) throw new Error('Request was aborted')\n if (!terminalSeen) {\n throw new Error(\n 'Antigravity stream ended without a terminal candidate response',\n )\n }\n if (content.length === 0) {\n throw new Error(\n `Antigravity returned an empty response${terminalFinishReason ? ` (${terminalFinishReason})` : ''}`,\n )\n }\n\n stream.push({\n type: 'done',\n reason: output.stopReason as 'stop' | 'length' | 'toolUse',\n message: output,\n })\n if (output.stopReason === 'stop' || output.stopReason === 'length') {\n requestSessions.completeExecution(sessionKey)\n }\n stream.end()\n } catch (error) {\n requestAbort?.abort()\n await chunkIterator?.return?.(undefined).catch(() => {})\n await response?.body?.cancel().catch(() => {})\n output.stopReason = options?.signal?.aborted ? 'aborted' : 'error'\n output.errorMessage =\n 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", "import { toGeminiSchema } from '@cortexkit/antigravity-auth-core'\nimport type {\n AssistantMessage,\n Context,\n ImageContent,\n Message,\n TextContent,\n Tool,\n ToolResultMessage,\n} from '@earendil-works/pi-ai'\n\n/** Gemini `contents` part shapes. */\ntype GeminiPart =\n | { text: string; thought?: boolean; thoughtSignature?: string }\n | { inlineData: { mimeType: string; data: string } }\n | {\n functionCall: { name: string; args: Record<string, unknown>; id: string }\n thoughtSignature?: string\n }\n | {\n functionResponse: {\n name: string\n response: Record<string, unknown>\n id: string\n }\n }\n\ninterface GeminiContent {\n role: 'user' | 'model'\n parts: GeminiPart[]\n}\n\ninterface GeminiTool {\n functionDeclarations: Array<{\n name: string\n description: string\n parameters?: unknown\n }>\n}\n\nexport interface GeminiRequest {\n contents: GeminiContent[]\n tools?: GeminiTool[]\n systemInstruction?: { parts: GeminiPart[] }\n}\n\nfunction sanitize(text: string): string {\n return text.replace(/[\\uD800-\\uDFFF]/gu, '\\uFFFD')\n}\n\nfunction convertUserParts(\n content: Array<TextContent | ImageContent>,\n): GeminiPart[] {\n const parts: GeminiPart[] = []\n for (const item of content) {\n if (item.type === 'text') {\n if (item.text) parts.push({ text: sanitize(item.text) })\n } else if (item.type === 'image' && item.data) {\n parts.push({ inlineData: { mimeType: item.mimeType, data: item.data } })\n }\n }\n return parts\n}\n\nfunction convertAssistantParts(\n message: AssistantMessage,\n preserveSignedHistory: boolean,\n): GeminiPart[] {\n const parts: GeminiPart[] = []\n for (const block of message.content) {\n if (block.type === 'thinking') {\n if (preserveSignedHistory && block.thinking) {\n parts.push({\n text: sanitize(block.thinking),\n thought: true,\n ...(block.thinkingSignature\n ? { thoughtSignature: block.thinkingSignature }\n : {}),\n })\n }\n } else if (block.type === 'text' && block.text.trim()) {\n parts.push({\n text: sanitize(block.text),\n ...(preserveSignedHistory && block.textSignature\n ? { thoughtSignature: block.textSignature }\n : {}),\n })\n } else if (block.type === 'toolCall') {\n parts.push({\n functionCall: {\n name: block.name,\n args: (block.arguments ?? {}) as Record<string, unknown>,\n id: block.id,\n },\n ...(preserveSignedHistory && block.thoughtSignature\n ? { thoughtSignature: block.thoughtSignature }\n : {}),\n })\n }\n }\n return parts\n}\n\nfunction toolResultResponse(\n message: ToolResultMessage,\n): Record<string, unknown> {\n const text = message.content\n .filter((item): item is TextContent => item.type === 'text')\n .map((item) => item.text)\n .join('\\n')\n if (message.isError) {\n return { error: text || 'Error' }\n }\n return { output: text }\n}\n\nexport interface BuildGeminiRequestOptions {\n provider?: string\n model?: string\n}\n\nfunction isSameTargetModel(\n message: AssistantMessage,\n options: BuildGeminiRequestOptions | undefined,\n): boolean {\n if (!options?.provider || !options.model) return true\n return (\n message.provider === options.provider && message.model === options.model\n )\n}\n\nfunction convertMessages(\n messages: Message[],\n options?: BuildGeminiRequestOptions,\n): GeminiContent[] {\n const contents: GeminiContent[] = []\n const callMatchesTarget = new Map<string, boolean>()\n\n for (const message of messages) {\n if (message?.role !== 'assistant') continue\n const matchesTarget = isSameTargetModel(message, options)\n for (const block of message.content) {\n if (block.type === 'toolCall') {\n callMatchesTarget.set(block.id, matchesTarget)\n }\n }\n }\n\n for (const message of messages) {\n if (!message) continue\n\n if (message.role === 'user') {\n const parts =\n typeof message.content === 'string'\n ? message.content.trim()\n ? [{ text: sanitize(message.content) }]\n : []\n : convertUserParts(\n message.content as Array<TextContent | ImageContent>,\n )\n if (parts.length) contents.push({ role: 'user', parts })\n continue\n }\n\n if (message.role === 'assistant') {\n const parts = convertAssistantParts(\n message,\n isSameTargetModel(message, options),\n )\n if (parts.length) contents.push({ role: 'model', parts })\n continue\n }\n\n if (message.role === 'toolResult') {\n const role =\n callMatchesTarget.get(message.toolCallId) === true ? 'model' : 'user'\n const part: GeminiPart = {\n functionResponse: {\n name: message.toolName,\n response: toolResultResponse(message),\n id: message.toolCallId,\n },\n }\n // Gemini groups consecutive function responses into one user turn.\n const last = contents[contents.length - 1]\n if (\n last &&\n last.role === role &&\n last.parts.every((p) => 'functionResponse' in p)\n ) {\n last.parts.push(part)\n } else {\n contents.push({ role, parts: [part] })\n }\n }\n }\n\n return contents\n}\n\nfunction convertTools(tools: Tool[] | undefined): GeminiTool[] | undefined {\n if (!tools?.length) return undefined\n return [\n {\n // Match the agy wire format (MITM-verified): field name is `parameters`\n // (not `parametersJsonSchema`) and schemas are sanitized to Gemini shape\n // (UPPERCASE types, unsupported keywords stripped) via core's toGeminiSchema.\n functionDeclarations: tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n parameters: toGeminiSchema(tool.parameters),\n })),\n },\n ]\n}\n\n/**\n * Convert a pi `Context` into a Gemini `generateContent` request body\n * (the inner `request` object of the Antigravity envelope).\n */\nexport function buildGeminiRequest(\n context: Context,\n options?: BuildGeminiRequestOptions,\n): GeminiRequest {\n const request: GeminiRequest = {\n contents: convertMessages(context.messages, options),\n }\n\n const tools = convertTools(context.tools)\n if (tools) request.tools = tools\n\n if (context.systemPrompt?.trim()) {\n request.systemInstruction = {\n parts: [{ text: sanitize(context.systemPrompt) }],\n }\n }\n\n return request\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["reason", "message"]
|
|
7
7
|
}
|
package/dist/stream.d.ts
CHANGED
package/dist/stream.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,eAAe,EASrB,MAAM,kCAAkC,CAAA;AACzC,OAAO,EACL,KAAK,GAAG,EACR,KAAK,gBAAgB,EACrB,KAAK,2BAA2B,EAChC,KAAK,OAAO,EAGZ,KAAK,KAAK,EACV,KAAK,mBAAmB,EAIxB,KAAK,aAAa,EAClB,KAAK,QAAQ,EACd,MAAM,uBAAuB,CAAA;AA8D9B,UAAU,mBAAmB;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,UAAU,iBAAiB;IACzB,UAAU,CAAC,EAAE,KAAK,CAAC;QACjB,OAAO,CAAC,EAAE;YAAE,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,kBAAkB,EAAE,CAAA;SAAE,CAAA;QACzD,YAAY,CAAC,EAAE,MAAM,CAAA;KACtB,CAAC,CAAA;IACF,aAAa,CAAC,EAAE,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,eAAe,EASrB,MAAM,kCAAkC,CAAA;AACzC,OAAO,EACL,KAAK,GAAG,EACR,KAAK,gBAAgB,EACrB,KAAK,2BAA2B,EAChC,KAAK,OAAO,EAGZ,KAAK,KAAK,EACV,KAAK,mBAAmB,EAIxB,KAAK,aAAa,EAClB,KAAK,QAAQ,EACd,MAAM,uBAAuB,CAAA;AA8D9B,UAAU,mBAAmB;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,UAAU,iBAAiB;IACzB,UAAU,CAAC,EAAE,KAAK,CAAC;QACjB,OAAO,CAAC,EAAE;YAAE,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,kBAAkB,EAAE,CAAA;SAAE,CAAA;QACzD,YAAY,CAAC,EAAE,MAAM,CAAA;KACtB,CAAC,CAAA;IACF,aAAa,CAAC,EAAE,mBAAmB,CAAA;IACnC,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AAoED,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,YAAY,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAC9E;AAED,MAAM,WAAW,mBAAmB;IAClC,uBAAuB,CAAC,EAAE,MAAM,CAAA;CACjC;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,kBAAkB,EACxB,KAAK,EAAE,mBAAmB,GACzB,QAAQ,GAAG,SAAS,CAoBtB;AAED,wBAAgB,WAAW,CACzB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,MAAM,EAAE,gBAAgB,EACxB,KAAK,CAAC,EAAE,mBAAmB,GAC1B,IAAI,CAuBN;AAED,wBAAuB,cAAc,CACnC,QAAQ,EAAE,QAAQ,GACjB,cAAc,CAAC,iBAAiB,CAAC,CAyCnC;AAeD,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,eAAe,GACrB,MAAM,CAgBR;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,SAAS,CAAC,EAAE,aAAa,4DAgB1B;AAyFD,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,mBAAmB,GAC5B,2BAA2B,CAkQ7B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cortexkit/pi-antigravity-auth",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.1",
|
|
4
4
|
"description": "Google Antigravity OAuth extension for pi - access Gemini 3 and Claude 4.6 using Google credentials",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"prepublishOnly": "bun run build"
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@cortexkit/antigravity-auth-core": "2.0.
|
|
46
|
+
"@cortexkit/antigravity-auth-core": "2.0.1"
|
|
47
47
|
},
|
|
48
48
|
"peerDependencies": {
|
|
49
49
|
"@earendil-works/pi-ai": "*",
|