选择性整合 #547,保留主分支节点与工具条设计。新增默认折叠的节点、资产、任务和历史面板,风格与预设保留在节点内,移除重复入口。 补齐工具权限、提示词解析、资源引用保护及数据库迁移,修复提示词清空和连续编辑后的生成配置同步。 验证:前端全量 1925 项测试、构建、类型检查及 lint 通过;后端 go test ./... 通过。真实模型、PostgreSQL 实库与登录态页面验收仍待进行。 Refs #547 Co-authored-by: bensharp <bensharp@qq.com>
40 lines
1.8 KiB
TypeScript
40 lines
1.8 KiB
TypeScript
import { getNodeResourceKind } from "@/lib/canvas/node-registry";
|
|
import type { CanvasNodeData, CanvasNodeMetadata } from "@/types/canvas";
|
|
import { synchronizeGenerationSpec } from "@/lib/canvas/generation-contract";
|
|
|
|
export type WriteCanvasNodePromptOptions = {
|
|
metadata?: CanvasNodeMetadata;
|
|
clearPromptTemplate?: boolean;
|
|
};
|
|
|
|
/**
|
|
* A generated or authored result is committed once the node registry exposes it
|
|
* as a resource. Text-like resources additionally require persisted content so
|
|
* a draft prompt alone is not mistaken for a submitted result.
|
|
*/
|
|
export function canvasNodeHasCommittedContent(node: CanvasNodeData) {
|
|
const resourceKind = getNodeResourceKind(node);
|
|
if (resourceKind === "text") return Boolean(node.metadata?.content?.trim());
|
|
return resourceKind !== null;
|
|
}
|
|
|
|
/**
|
|
* Update the editable prompt draft without replacing the prompt snapshot that
|
|
* produced an existing result. Callers may provide sanitized task metadata,
|
|
* but prompt ownership remains centralized here.
|
|
*/
|
|
export function writeCanvasNodePrompt(node: CanvasNodeData, prompt: string, options: WriteCanvasNodePromptOptions = {}) {
|
|
const metadata = options.metadata ?? node.metadata;
|
|
const clearPromptTemplate = options.clearPromptTemplate ?? Boolean(metadata?.promptTemplateOperation);
|
|
const promptTemplateMetadata = clearPromptTemplate
|
|
? { promptTemplateOperation: undefined, promptTemplateVariables: undefined }
|
|
: {};
|
|
// 显式提交草稿补丁,否则已有 generationSpec 会把旧提示词投影回编辑框。
|
|
return synchronizeGenerationSpec(
|
|
{ ...node, metadata },
|
|
canvasNodeHasCommittedContent(node)
|
|
? { ...promptTemplateMetadata, composerContent: prompt }
|
|
: { ...promptTemplateMetadata, prompt, composerContent: prompt },
|
|
);
|
|
}
|