import { describe, expect, it } from "vitest"; import { createRequire } from "module"; import { MITM_TOOLS } from "../../src/shared/constants/cliTools.js"; // config.js is the CJS MITM bundle module (dependency-isolated for the runtime copy). const require = createRequire(import.meta.url); const { MODEL_NO_MAP } = require("../../src/mitm/config.js"); // All assertions below are grounded in a live MITM dump capture of Antigravity's // streamGenerateContent requests (see AI_JOURNAL): the agent loop sends // `gemini-3.5-flash-low`, tab-autocomplete sends `tab_jump_flash_lite_preview` / // `tab_flash_lite_preview`. describe("Antigravity MITM model handling", () => { const ag = MITM_TOOLS.antigravity; it("flags the out-of-box agent/Default model mandatory", () => { expect(ag.defaultModels.find((m) => m.id === "gemini-3.5-flash-low")?.mandatory).toBe(true); }); it("leaves models not proven auto-sent optional", () => { for (const id of ["gemini-3-flash-agent", "gemini-3.1-pro-low", "claude-sonnet-4-6", "gpt-oss-120b-medium"]) { expect(ag.defaultModels.find((m) => m.id === id)?.mandatory).toBeFalsy(); } }); // Tab-autocomplete is latency-critical inline completion — it must passthrough natively, // never get re-routed onto a chat-model mapping by the broad `flash` pattern. it.each(["tab_jump_flash_lite_preview", "tab_flash_lite_preview"])( "excludes tab-autocomplete model '%s' from re-routing", (id) => { expect((MODEL_NO_MAP.antigravity || []).some((re) => re.test(id))).toBe(true); } ); it("does not exclude real agent models from re-routing", () => { for (const id of ["gemini-3.5-flash-low", "gemini-3-flash-agent", "claude-sonnet-4-6"]) { expect((MODEL_NO_MAP.antigravity || []).some((re) => re.test(id))).toBe(false); } }); });