import path from "node:path"; import { beforeEach, describe, expect, it, vi } from "vitest"; const ensureSandboxWorkspaceForSession = vi.hoisted(() => vi.fn()); vi.mock("../../agents/sandbox.js", () => ({ ensureSandboxWorkspaceForSession, })); import { createReplyMediaPathNormalizer } from "./reply-media-paths.js"; describe("createReplyMediaPathNormalizer", () => { beforeEach(() => { ensureSandboxWorkspaceForSession.mockReset().mockResolvedValue(null); }); it("resolves workspace-relative media against the agent workspace", async () => { const normalize = createReplyMediaPathNormalizer({ cfg: {}, sessionKey: "session-key", workspaceDir: "/tmp/agent-workspace", }); const result = await normalize({ mediaUrls: ["./out/photo.png"], }); expect(result).toMatchObject({ mediaUrl: path.join("/tmp/agent-workspace", "out", "photo.png"), mediaUrls: [path.join("/tmp/agent-workspace", "out", "photo.png")], }); }); it("maps sandbox-relative media back to the host sandbox workspace", async () => { ensureSandboxWorkspaceForSession.mockResolvedValue({ workspaceDir: "/tmp/sandboxes/session-1", containerWorkdir: "/workspace", }); const normalize = createReplyMediaPathNormalizer({ cfg: {}, sessionKey: "session-key", workspaceDir: "/tmp/agent-workspace", }); const result = await normalize({ mediaUrls: ["./out/photo.png", "file:///workspace/screens/final.png"], }); expect(result).toMatchObject({ mediaUrl: path.join("/tmp/sandboxes/session-1", "out", "photo.png"), mediaUrls: [ path.join("/tmp/sandboxes/session-1", "out", "photo.png"), path.join("/tmp/sandboxes/session-1", "screens", "final.png"), ], }); }); });