diff --git a/components/canvas/CanvasChatPanel.tsx b/components/canvas/CanvasChatPanel.tsx index a4e9e0018..22f897b2f 100644 --- a/components/canvas/CanvasChatPanel.tsx +++ b/components/canvas/CanvasChatPanel.tsx @@ -5175,6 +5175,12 @@ export function CanvasChatPanel({ useEffect(() => { if (!hasHydratedHistoryRef.current) return; + const activeStreamState = streamImageGenerationStateByChatId[activeChatId]; + const shouldDeferAssistantMediaAutosync = + activeStreamState?.phase === "queued" || + activeStreamState?.phase === "processing" || + activeStreamState?.phase === "finalizing"; + if (shouldDeferAssistantMediaAutosync) return; let cancelled = false; @@ -5515,6 +5521,7 @@ export function CanvasChatPanel({ cancelled = true; }; }, [ + activeChatId, messages, addNode, nodes, @@ -5522,6 +5529,7 @@ export function CanvasChatPanel({ clearStreamImageGenerationStateForChat, focusCanvasOnNode, selectNodes, + streamImageGenerationStateByChatId, updateNode, ]); diff --git a/lib/canvas/agent-mutations.ts b/lib/canvas/agent-mutations.ts index b72362333..adfc93700 100644 --- a/lib/canvas/agent-mutations.ts +++ b/lib/canvas/agent-mutations.ts @@ -115,15 +115,32 @@ function buildMediaNode(params: { }) { const now = new Date().toISOString(); const type = mediaNodeType(params.item); + const itemMetadata = + params.item.metadata && + typeof params.item.metadata === "object" && + !Array.isArray(params.item.metadata) + ? params.item.metadata + : {}; + const planMetadata = + params.plan.metadata && + typeof params.plan.metadata === "object" && + !Array.isArray(params.plan.metadata) + ? params.plan.metadata + : {}; + const sourceMessageId = String( + itemMetadata.messageId || planMetadata.messageId || "" + ).trim(); const metadata = { - ...(params.plan.metadata || {}), - ...(params.item.metadata || {}), + ...planMetadata, + ...itemMetadata, generatedByAgent: true, canvasAgentOperationId: params.plan.operationId, canvasAgentOperation: params.plan.operation, canvasAgentMediaItemId: params.item.mediaItemId, canvasAgentPlacement: params.plan.placement, canvasAgentPlacementStrategy: params.plan.placementStrategy, + sourceMessageId: sourceMessageId || undefined, + sourceImageKey: type === "image" && sourceMessageId ? params.item.url : undefined, sourceNodeIds: params.sourceNodeIds, revisionOf: params.plan.operation === "append_revision" diff --git a/tests/routes/canvas-chat-helpers.test.ts b/tests/routes/canvas-chat-helpers.test.ts index d27b46300..ac4f2c910 100644 --- a/tests/routes/canvas-chat-helpers.test.ts +++ b/tests/routes/canvas-chat-helpers.test.ts @@ -1095,6 +1095,9 @@ test.describe("canvas chat pure helpers", () => { url: "https://cdn.example.com/revision.png", title: "白底版本", prompt: "换成白底", + metadata: { + messageId: "assistant-append-1", + }, }, ], }, @@ -1118,6 +1121,8 @@ test.describe("canvas chat pure helpers", () => { canvasAgentOperationId: "op-append-1", canvasAgentMediaItemId: "media-append-1", revisionOf: "image-1", + sourceMessageId: "assistant-append-1", + sourceImageKey: "https://cdn.example.com/revision.png", }, }, });