chore(release): 版本发布 - 发布 v1.2.8.rc3 候选版本

修复生产前端 Rolldown 分包循环依赖白屏,补齐画布引用排序与素材 payload 合同,并同步工作流生成素材字段。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
ddCatandCursor committed 2026-09-10 13:49:12 +08:00
1 parent 01084c9a0f
commit 916043fb5a
21 files changed
+535 -37

No files matched your search

+45 -1
View File
@@ -1,6 +1,6 @@
import { describe, expect, test } from "bun:test";
import { autoMentionCanvasResourceReferences, findCanvasResourceAutoLinkMatch, type CanvasResourceReference, applyCanvasConnectionPromptSync, buildAssetMentionReferences, buildCanvasNodeMentionReferenceMap, buildNodeMentionReferences, buildOrderedCanvasResourceReferences, canvasResourceMentionToken, collectUpstreamVideoNodes, imageGenerationReferenceConnections } from "../src/lib/canvas/canvas-resource-references";
import { autoMentionCanvasResourceReferences, findCanvasResourceAutoLinkMatch, type CanvasResourceReference, applyCanvasConnectionPromptSync, buildAssetMentionReferences, buildCanvasNodeMentionReferenceMap, buildNodeMentionReferences, buildOrderedCanvasResourceReferences, canvasResourceMentionToken, collectUpstreamVideoNodes, imageGenerationReferenceConnections, reorderCanvasResourceConnections } from "../src/lib/canvas/canvas-resource-references";
import { canvasNodeToAsset } from "../src/lib/canvas/canvas-node-asset";
import { buildNodeGenerationInputs } from "../src/components/canvas/canvas-node-generation";
import { CanvasNodeType, type CanvasConnection, type CanvasNodeData } from "../src/types/canvas";
@@ -227,6 +227,21 @@ describe("canvas resource mention slots", () => {
expect(uploadedReference?.storageKey).toBe("video:user:source");
});
test("绘图引用保留本地预览定位信息", () => {
const drawing: CanvasNodeData = {
id: "drawing-a",
type: CanvasNodeType.Drawing,
title: "草图 A",
position: { x: 0, y: 0 },
width: 100,
height: 100,
metadata: { drawingId: "drawing-document-a", drawingRevision: 3 },
};
const target = videoNode("target");
const [reference] = buildNodeMentionReferences(target, [drawing, target], [connection(drawing.id, target.id)]);
expect(reference).toMatchObject({ kind: "image", label: "绘图1", drawingId: "drawing-document-a", drawingRevision: 3 });
});
test("画布节点引用只保存类型位置,不保存节点 ID", () => {
const target = videoNode("target");
const image = imageNode("image-a");
@@ -339,3 +354,32 @@ describe("image generation reference connections", () => {
expect(copied.every((item) => item.toNodeId === "result")).toBe(true);
});
});
describe("reorder canvas resource connections", () => {
test("直接引用按指定顺序换位并同步编号提示词", () => {
const imageA = imageNode("image-a");
const imageB = imageNode("image-b");
const target = { ...videoNode("target"), metadata: { composerContent: "比较 @图片1 和 @图片2" } };
const nodes = [imageA, imageB, target];
const previousConnections = [connection(imageA.id, target.id), connection(imageB.id, target.id)];
const nextConnections = reorderCanvasResourceConnections(target.id, [imageB.id, imageA.id], nodes, previousConnections);
expect(nextConnections.map((item) => item.fromNodeId)).toEqual([imageB.id, imageA.id]);
const nextNodes = applyCanvasConnectionPromptSync(nodes, previousConnections, nodes, nextConnections);
expect(nextNodes.find((node) => node.id === target.id)?.metadata?.composerContent).toBe("比较 @图片2 和 @图片1");
});
test("配置节点承接的引用可排序且不改变主链和无关连线", () => {
const imageA = imageNode("image-a");
const imageB = imageNode("image-b");
const target = videoNode("target");
const config: CanvasNodeData = { id: "config", type: CanvasNodeType.Config, title: "config", position: { x: 0, y: 0 }, width: 100, height: 100, metadata: {} };
const other = videoNode("other");
const main = connection(target.id, config.id);
const unrelated = connection(imageA.id, other.id);
const previousConnections = [main, connection(imageA.id, config.id), unrelated, connection(imageB.id, config.id)];
const nextConnections = reorderCanvasResourceConnections(target.id, [imageB.id, imageA.id], [imageA, imageB, target, config, other], previousConnections);
expect(nextConnections).toEqual([main, connection(imageB.id, config.id), unrelated, connection(imageA.id, config.id)]);
expect(nextConnections[0]).toBe(main);
expect(nextConnections[2]).toBe(unrelated);
});
});