diff --git a/frontend/src/components/workspace/messages/message-list.tsx b/frontend/src/components/workspace/messages/message-list.tsx index 83e783cbb..d03ef19dc 100644 --- a/frontend/src/components/workspace/messages/message-list.tsx +++ b/frontend/src/components/workspace/messages/message-list.tsx @@ -691,6 +691,8 @@ export function MessageList({ return ; } + const artifactPaths = extractArtifactsFromThread(thread); + return ( <> ; }) { - return thread.values.artifacts ?? []; + return thread.values.artifacts ?? EMPTY_ARTIFACT_PATHS; } export function resolveArtifactURL(absolutePath: string, threadId: string) { diff --git a/frontend/tests/unit/core/artifacts/utils.test.ts b/frontend/tests/unit/core/artifacts/utils.test.ts index 091f652f2..29377bac9 100644 --- a/frontend/tests/unit/core/artifacts/utils.test.ts +++ b/frontend/tests/unit/core/artifacts/utils.test.ts @@ -74,6 +74,19 @@ describe("artifact URL helpers", () => { ).toBe("/demo/threads/thread-1/user-data/outputs/style.css"); }); + test("returns stable artifact path references", async () => { + const { extractArtifactsFromThread } = await loadFreshArtifactUtils(); + const threadWithoutArtifacts = { values: {} }; + const artifacts = ["/mnt/user-data/outputs/chart.png"]; + + expect(extractArtifactsFromThread(threadWithoutArtifacts)).toBe( + extractArtifactsFromThread(threadWithoutArtifacts), + ); + expect(extractArtifactsFromThread({ values: { artifacts } })).toBe( + artifacts, + ); + }); + test("resolves a relative message image when it uniquely matches an artifact", async () => { const { resolveMessageImageURL } = await loadFreshArtifactUtils(); const artifacts = [