/**
* Smoke test for the Antigravity extension.
*
* Run from the repo root (after /login google-antigravity):
* npx tsx packages/coding-agent/examples/extensions/google-antigravity/test.ts
*/
import { readFileSync } from "node:fs";
import { homedir } from "node:os";
import { join } from "node:path";
import { type Api, type Context, type Model, registerApiProvider, streamSimple } from "@earendil-works/pi-ai";
import { STATIC_PROVIDER_MODELS } from "./models.js";
import { streamAntigravity } from "./stream.js";
function getAgentDir(): string {
const envDir = process.env.PRIME_AGENT_CODING_AGENT_DIR ?? process.env.PI_CODING_AGENT_DIR;
if (envDir) {
if (envDir === "~") return homedir();
if (envDir.startsWith("~/")) return join(homedir(), envDir.slice(2));
return envDir;
}
return join(homedir(), ".prime", "agent");
}
async function main() {
const modelId = process.argv[2] || "claude-sonnet-4-6";
const modelConfig = STATIC_PROVIDER_MODELS.find((m) => m.id === modelId);
if (!modelConfig) {
console.error(`Unknown model: ${modelId}`);
console.error("Available:", STATIC_PROVIDER_MODELS.map((m) => m.id).join(", "));
process.exit(1);
}
type Credential = { type?: string; access?: string; projectId?: string };
const authPath = join(getAgentDir(), "auth.json");
const auth = JSON.parse(readFileSync(authPath, "utf-8")) as Record<string, Credential | Credential[]>;
const stored = auth["google-antigravity"];
const credential = (Array.isArray(stored) ? stored : [stored]).find(
(entry) => entry?.type === "oauth" && typeof entry.access === "string" && entry.access.length > 0,
);
const access = credential?.access;
if (!access) {
console.error("No google-antigravity credentials. Run /login google-antigravity first.");
process.exit(1);
}
const apiKey = JSON.stringify({ token: access, projectId: credential?.projectId ?? "" });
registerApiProvider({
api: "google-antigravity" as Api,
stream: (model, context, options) => streamAntigravity(model, context, options),
streamSimple: (model, context, options) => streamAntigravity(model, context, options),
});
const model: Model<Api> = {
id: modelConfig.id,
name: modelConfig.name,
api: "google-antigravity" as Api,
provider: "google-antigravity",
baseUrl: "https://daily-cloudcode-pa.googleapis.com",
reasoning: modelConfig.reasoning,
input: modelConfig.input,
cost: modelConfig.cost,
contextWindow: modelConfig.contextWindow,
maxTokens: modelConfig.maxTokens,
};
const context: Context = {
messages: [{ role: "user", content: "Say hello in exactly 3 words.", timestamp: Date.now() }],
};
const s = streamSimple(model, context, { apiKey, maxTokens: 100, reasoning: "low" });
for await (const event of s) {
if (event.type === "thinking_delta") process.stdout.write(event.delta);
else if (event.type === "text_delta") process.stdout.write(event.delta);
else if (event.type === "error") console.error("\nError:", event.error.errorMessage);
else if (event.type === "done") console.log("\n\nDone!", event.reason, event.message.usage);
}
}
main().catch((error) => {
console.error(error);
process.exit(1);
});