From 3e364c0f9c3a4d8434bd736e96f71edbea3ad049 Mon Sep 17 00:00:00 2001 From: "Jean P.D. Meijer" Date: Wed, 3 Jun 2026 16:46:30 +0200 Subject: [PATCH] fix(app): resolve artifacts listed in unrelated groups --- apps/app/scripts/artifacts.test.ts | 20 ++++++++++++++++++++ apps/app/src/lib/artifacts.ts | 16 +++++++++++++--- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/apps/app/scripts/artifacts.test.ts b/apps/app/scripts/artifacts.test.ts index 36c2e4e00a..4d7ceb3e8d 100644 --- a/apps/app/scripts/artifacts.test.ts +++ b/apps/app/scripts/artifacts.test.ts @@ -58,4 +58,24 @@ describe("getArtifactsFromMessages", () => { exists: true, }); }); + + it("does not include verified targets unrelated to the local message group", () => { + const messages: UIMessage[] = [{ + id: "msg_later", + role: "assistant", + parts: [{ type: "text", text: "Done.", state: "done" }], + }]; + const targets: OpenTarget[] = [{ + id: "file:reports/earlier.csv", + kind: "file", + value: "reports/earlier.csv", + name: "earlier.csv", + preview: "sheet", + confidence: 95, + reason: "write tool metadata", + exists: true, + }]; + + expect(getArtifactsFromMessages(messages, targets)).toEqual([]); + }); }); diff --git a/apps/app/src/lib/artifacts.ts b/apps/app/src/lib/artifacts.ts index a7c98507d7..e8403ba242 100644 --- a/apps/app/src/lib/artifacts.ts +++ b/apps/app/src/lib/artifacts.ts @@ -236,6 +236,15 @@ function getArtifactPathsFromMessage(message: UIMessage) { return paths.map((path) => path?.trim().toLowerCase()).filter((path) => path) as string[]; } +function getArtifactTextFromMessages(messages: UIMessage[]) { + return messages + .flatMap((message) => message.parts.flatMap((part) => { + if (part.type === "text") return [part.text.toLowerCase()]; + return []; + })) + .join("\n"); +} + function addArtifact( artifacts: Map, path: string, @@ -260,6 +269,7 @@ function addArtifact( export function getArtifactsFromMessages(messages: UIMessage[], openTargets: OpenTarget[] = []) { const artifacts = new Map(); + const artifactText = getArtifactTextFromMessages(messages); for (const message of messages) { for (const path of getArtifactPathsFromMessage(message)) { @@ -269,9 +279,9 @@ export function getArtifactsFromMessages(messages: UIMessage[], openTargets: Ope const fallbackMessageId = messages[messages.length - 1]?.id ?? "open-target"; for (const target of openTargets) { - if (isCollectibleArtifactTarget(target)) { - addArtifact(artifacts, target.value, fallbackMessageId, openTargets, target); - } + if (!isCollectibleArtifactTarget(target)) continue; + if (!artifactText.includes(normalizeArtifactPath(target.value).toLowerCase())) continue; + addArtifact(artifacts, target.value, fallbackMessageId, openTargets, target); } return [...artifacts.values()];