import sharp from "sharp"; import { beforeEach, describe, expect, it, vi } from "vitest"; const { infoMock, warnMock } = vi.hoisted(() => ({ infoMock: vi.fn(), warnMock: vi.fn(), })); vi.mock("../logging/subsystem.js", () => { const makeLogger = () => ({ subsystem: "agents/tool-images", isEnabled: () => true, trace: vi.fn(), debug: vi.fn(), info: infoMock, warn: warnMock, error: vi.fn(), fatal: vi.fn(), raw: vi.fn(), child: () => makeLogger(), }); return { createSubsystemLogger: () => makeLogger() }; }); import { sanitizeContentBlocksImages } from "./tool-images.js"; async function createLargePng(): Promise { const width = 2400; const height = 680; const raw = Buffer.alloc(width * height * 3, 0x7f); return await sharp(raw, { raw: { width, height, channels: 3 }, }) .png({ compressionLevel: 0 }) .toBuffer(); } describe("tool-images log context", () => { beforeEach(() => { infoMock.mockClear(); warnMock.mockClear(); }); it("includes filename from MEDIA text", async () => { const png = await createLargePng(); const blocks = [ { type: "text" as const, text: "MEDIA:/tmp/snapshots/camera-front.png" }, { type: "image" as const, data: png.toString("base64"), mimeType: "image/png" }, ]; await sanitizeContentBlocksImages(blocks, "nodes:camera_snap"); const message = infoMock.mock.calls[0]?.[0]; expect(typeof message).toBe("string"); expect(String(message)).toContain("camera-front.png"); }); it("includes filename from read label", async () => { const png = await createLargePng(); const blocks = [ { type: "image" as const, data: png.toString("base64"), mimeType: "image/png" }, ]; await sanitizeContentBlocksImages(blocks, "read:/tmp/images/sample-diagram.png"); const message = infoMock.mock.calls[0]?.[0]; expect(typeof message).toBe("string"); expect(String(message)).toContain("sample-diagram.png"); }); });