fix(*): 画布生成与邮件 - 合并 PR #423 并修复恢复关联和规格报价

保留 PR 原始提交,合并待测试文档双方内容。补齐摘要 nodeId 消费端,修复缺省质量的 <nil> 匹配,并移除报价面板按价格档篡改自动质量的行为。

验证:前端完整测试脚本 1139 项通过,生产构建通过;后端相关专项通过。全量后端存在 4 项基线可复现失败;另一次资源清理测试出现 SQLite 表锁,合并分支与基线单独重跑通过。未执行真实 SMTP、浏览器端到端或收费生成。
This commit is contained in:
ddCat
2026-09-06 04:44:16 +08:00
16 changed files with 441 additions and 34 deletions

View File

@@ -11,6 +11,15 @@ import { CanvasNodeType, type CanvasNodeData } from "../src/types/canvas";
import { onlineToolToOps } from "../src/components/canvas/canvas-assistant-panel";
import { generationTaskShowsProgress, generationTaskStageLabel, generationTaskStatusLabel } from "../src/lib/generation-task-display";
import { generationErrorMessage } from "../src/lib/generation-error";
import { generationTaskNodeId } from "../src/lib/canvas/canvas-generation-task-sync";
test("canvas recovery reads node identity from task summaries without full task input", () => {
const task: GenerationTask = { id: "task-summary", type: "canvas_image", status: "running", prompt: "", attempts: 1, createdAt: "", updatedAt: "", clientContext: { nodeId: "node-summary" } };
expect(generationTaskNodeId(task)).toBe("node-summary");
expect(generationTaskNodeId({ ...task, inputJson: "invalid json" })).toBe("node-summary");
expect(generationTaskNodeId({ ...task, clientContext: undefined, inputJson: JSON.stringify({ metadata: { nodeId: "node-detail" } }) })).toBe("node-detail");
expect(generationTaskNodeId({ ...task, clientContext: undefined })).toBe("");
});
function compactSource(source: string) {
return source.replace(/\s+/g, " ").trim();