import { describe, expect, it } from "bun:test"; import type { UIMessage } from "ai"; import type { OpenTarget } from "../src/react-app/domains/session/artifacts/open-target"; import { canOpenArtifact, canPreviewArtifact, getArtifactsFromMessages } from "../src/lib/artifacts"; describe("getArtifactsFromMessages", () => { it("includes verified slide deck targets mentioned in assistant summaries", () => { const messages: UIMessage[] = [{ id: "msg_deck", role: "assistant", parts: [{ type: "text", text: "Updated file: decks/openwork-vertebrae-deck.pptx", state: "done" }], }]; const targets: OpenTarget[] = [{ id: "file:decks/openwork-vertebrae-deck.pptx", kind: "file", value: "decks/openwork-vertebrae-deck.pptx", name: "openwork-vertebrae-deck.pptx", preview: "slides", confidence: 65, reason: "message", exists: true, }]; expect(getArtifactsFromMessages(messages, targets)[0]).toMatchObject({ name: "openwork-vertebrae-deck.pptx", path: "decks/openwork-vertebrae-deck.pptx", type: "slides", legacy_target: { preview: "slides", exists: true }, }); }); it("uses verified relative targets for absolute attachment paths", () => { const messages: UIMessage[] = [{ id: "msg_attachment", role: "assistant", parts: [{ type: "source-document", sourceId: "attachment-source", mediaType: "text/csv", title: "customers.csv", filename: "/Users/test/workspace/customers.csv", }], }]; const targets: OpenTarget[] = [{ id: "file:customers.csv", kind: "file", value: "customers.csv", name: "customers.csv", preview: "sheet", confidence: 95, reason: "attachment source", exists: true, }]; expect(getArtifactsFromMessages(messages, targets)[0]?.legacy_target).toMatchObject({ value: "customers.csv", exists: true, }); }); it("can list artifacts from assistant text without target fallbacks", () => { const messages: UIMessage[] = [{ id: "msg_text", role: "assistant", parts: [{ type: "text", text: "Created reports/artifact-eval.md, decks/update.pptx, and src/widget.tsx", state: "done" }], }]; expect(getArtifactsFromMessages(messages, [], { includeTargetFallbacks: false }).map((artifact) => artifact.path)).toEqual([ "src/widget.tsx", "decks/update.pptx", "reports/artifact-eval.md", ]); }); it("orders verified artifacts by newest update time and marks unsupported previews", () => { const messages: UIMessage[] = [{ id: "msg_order", role: "assistant", parts: [{ type: "text", text: "Created reports/old.md and reports/new.md and src/widget.tsx", state: "done" }], }]; const targets: OpenTarget[] = [ { id: "file:reports/old.md", kind: "file", value: "reports/old.md", name: "old.md", preview: "markdown", confidence: 65, reason: "message", exists: true, updatedAt: 1, }, { id: "file:reports/new.md", kind: "file", value: "reports/new.md", name: "new.md", preview: "markdown", confidence: 65, reason: "message", exists: true, updatedAt: 2, }, ]; const artifacts = getArtifactsFromMessages(messages, targets, { includeTargetFallbacks: false }); expect(artifacts.map((artifact) => artifact.path)).toEqual(["reports/new.md", "reports/old.md", "src/widget.tsx"]); expect(canPreviewArtifact(artifacts[0])).toBe(true); expect(canPreviewArtifact(artifacts[2])).toBe(false); }); it("previews verified code artifacts in the sidebar", () => { const messages: UIMessage[] = [{ id: "msg_unsupported", role: "assistant", parts: [{ type: "text", text: "Created src/widget.tsx", state: "done" }], }]; const targets: OpenTarget[] = [{ id: "file:src/widget.tsx", kind: "file", value: "src/widget.tsx", name: "widget.tsx", preview: "code", confidence: 65, reason: "message", exists: true, }]; const artifact = getArtifactsFromMessages(messages, targets, { includeTargetFallbacks: false })[0]; expect(artifact).toMatchObject({ path: "src/widget.tsx", legacy_target: { exists: true, preview: "code" } }); expect(artifact ? canPreviewArtifact(artifact) : false).toBe(true); expect(artifact ? canOpenArtifact(artifact) : false).toBe(true); }); });