Files
Mohamed Boudra 7b0cace991 Restore Antigravity with Full access and session warnings (#5795)
* Revert "Remove the unreleased Antigravity provider plugin (#5781)"

This reverts commit 9d9d9af993.

* fix(providers): commit plugin notices emitted during session opening

* feat(providers): restore Antigravity with full access and session warnings

* fix(providers): warn once when opening Antigravity sessions

Driver respawn retains the live transcript and unchanged permission posture. Emit the warning only when opening a session, including resume after a daemon restart.
2026-09-30 23:18:05 +01:00

103 lines
3.9 KiB
JavaScript

import { readFileSync, appendFileSync } from "node:fs";
import { createInterface } from "node:readline";
const args = process.argv.slice(2);
const log = process.env.AGY_TEST_LOG;
function record(value) {
if (log) appendFileSync(log, `${JSON.stringify(value)}\n`);
}
record({ args, pid: process.pid, env: process.env.AGY_SESSION_VALUE });
function fixture(name, stream = "stdout") {
return readFileSync(new URL(`./fixtures/${name}.${stream}.ndjson`, import.meta.url), "utf8")
.trim()
.split("\n")
.filter(Boolean)
.map((line) => JSON.parse(line).data);
}
if (args.includes("--version")) {
process.stdout.write(`${process.env.AGY_TEST_VERSION || "1.2.13"}\n`);
process.exit(0);
}
if (args.includes("models")) {
if (process.env.AGY_TEST_AUTH === "missing") {
process.stderr.write(fixture("models-unauthenticated", "stderr").join("\n"));
process.exit(1);
}
process.stdout.write(fixture("models-api-key").join("\n") + "\n");
process.exit(0);
}
if (process.env.AGY_TEST_STARTUP === "auth") {
process.stderr.write(fixture("not-signed-in", "stderr").join("\n"));
process.stdout.write(JSON.stringify(fixture("not-signed-in")[0]) + "\n");
process.exit(1);
}
if (process.env.AGY_TEST_STARTUP === "exit") process.exit(3);
if (process.env.AGY_TEST_STARTUP === "stderr") {
process.stderr.write("Error: authentication required. Run 'agy' to log in, then retry.\n");
process.exit(1);
}
const resumeIndex = args.indexOf("--conversation");
const conversationId =
resumeIndex >= 0 ? args[resumeIndex + 1] : fixture("text-turn")[0].conversation_id;
let denialResults = 0;
function emit(frame) {
const converted = structuredClone(frame);
if (converted.conversation_id !== undefined) converted.conversation_id = conversationId;
if (converted.step_update) converted.step_update.conversation_id = conversationId;
if (converted.result) {
converted.result.conversation_id = conversationId;
if (process.env.AGY_TEST_DENIAL_COUNTS && converted.result.denied_actions?.length) {
converted.result.denied_actions = Array.from(
{ length: Number(process.env.AGY_TEST_DENIAL_COUNTS.split(",")[denialResults++]) },
() => converted.result.denied_actions[0],
);
}
}
process.stdout.write(JSON.stringify(converted) + "\n");
}
const init = fixture("text-turn")[0];
if (args.includes("--model")) init.init.model = args[args.indexOf("--model") + 1];
emit(init);
let interrupted = null;
const turns = new Map();
const lines = createInterface({ input: process.stdin });
lines.on("line", (line) => {
const input = JSON.parse(line);
record({ input });
const text = input.message.content;
let name = "text-turn";
if (text.includes("Attached image: ")) name = "image-file-external";
if (text.includes("TOOLS")) name = "tools-default";
if (text.includes("DENIAL_REPLAY")) name = "denial-replay";
if (text.includes("SUBAGENT")) name = "subagent";
if (text.includes("MULTI")) name = "multi-turn-reasoning";
if (text.includes("RESUME")) name = "resume";
if (text.includes("HANG")) name = "sigint-mid-text";
if (text.includes("TOOL_HANG")) name = "sigint-mid-tool";
const frames = fixture(name).slice(1);
if (name.startsWith("sigint")) {
interrupted = frames[frames.length - 1];
for (const frame of frames.slice(0, -1)) emit(frame);
return;
}
const count = frames.filter((frame) => frame.event === "result").length;
const ordinal = (turns.get(name) || 0) % count;
turns.set(name, ordinal + 1);
let resultCount = 0;
for (const frame of frames) {
if (resultCount === ordinal) emit(frame);
if (frame.event === "result") resultCount += 1;
}
});
process.on("SIGINT", () => {
record({ signal: "SIGINT" });
if (process.env.AGY_TEST_IGNORE_SIGNALS === "yes") return;
if (interrupted) emit(interrupted);
process.exit(1);
});
process.on("SIGTERM", () => {
record({ signal: "SIGTERM" });
if (process.env.AGY_TEST_IGNORE_SIGNALS !== "yes") process.exit(1);
});
lines.on("close", () => process.exit(0));