feat(canvas): 画布工作区 - 整合侧栏与风格预设并修复提示词回填
选择性整合 #547,保留主分支节点与工具条设计。新增默认折叠的节点、资产、任务和历史面板,风格与预设保留在节点内,移除重复入口。 补齐工具权限、提示词解析、资源引用保护及数据库迁移,修复提示词清空和连续编辑后的生成配置同步。 验证:前端全量 1925 项测试、构建、类型检查及 lint 通过;后端 go test ./... 通过。真实模型、PostgreSQL 实库与登录态页面验收仍待进行。 Refs #547 Co-authored-by: bensharp <bensharp@qq.com>
This commit is contained in:
1 parent
be5f2733b6
commit
e93bf3ca39
66 files changed
+6127
-97
No files matched your search
@@ -4,7 +4,7 @@ import { buildNodeGenerationInputs, type NodeGenerationInput } from "@/component
|
||||
import { isFrameNode } from "@/lib/canvas/canvas-frame";
|
||||
import { sameNodeSemanticData } from "@/lib/canvas/canvas-project-domain";
|
||||
import { canvasNodeRenderBudget, canvasNodeRenderPadding, CANVAS_MAX_RENDERED_CONNECTIONS, shouldReduceCanvasMediaEffects } from "@/lib/canvas/canvas-performance-mode";
|
||||
import { buildCanvasNodeMentionReferenceMap, buildCanvasResourceReferences } from "@/lib/canvas/canvas-resource-references";
|
||||
import { buildCanvasNodeMentionReferenceMap, buildCanvasResourceReferences, buildToolMentionReference, parseToolMentionTokens } from "@/lib/canvas/canvas-resource-references";
|
||||
import { buildSkillMentionReferences } from "@/lib/canvas/canvas-skill-mentions";
|
||||
import { buildCanvasSpatialIndex, canvasNodeBounds, type CanvasSpatialIndex, type CanvasSpatialIndexEntry } from "@/lib/canvas/canvas-spatial-index";
|
||||
import type { Skill } from "@/services/api/skills";
|
||||
@@ -353,12 +353,32 @@ export function useCanvasRenderModel({
|
||||
);
|
||||
const resourceReferenceByNodeId = useMemo(() => new Map(canvasResourceReferences.map((reference) => [reference.nodeId, reference])), [canvasResourceReferences]);
|
||||
const skillMentionReferences = useMemo(() => buildSkillMentionReferences(addedSkills), [addedSkills]);
|
||||
const toolMentionReferencesByNodeId = useMemo(() => {
|
||||
const map = new Map<string, ReturnType<typeof buildToolMentionReference>[]>();
|
||||
for (const node of semanticNodes) {
|
||||
const text = node.metadata?.composerContent ?? node.metadata?.prompt ?? "";
|
||||
const tokens = parseToolMentionTokens(text);
|
||||
if (!tokens.length) continue;
|
||||
const seen = new Set<number>();
|
||||
const refs: ReturnType<typeof buildToolMentionReference>[] = [];
|
||||
for (const { type, toolId, label, icon } of tokens) {
|
||||
if (seen.has(toolId)) continue;
|
||||
seen.add(toolId);
|
||||
refs.push(buildToolMentionReference(toolId, label, type, icon));
|
||||
}
|
||||
if (refs.length) map.set(node.id, refs);
|
||||
}
|
||||
return map;
|
||||
}, [semanticNodes]);
|
||||
const mentionReferencesByNodeId = useMemo(() => {
|
||||
const map = buildCanvasNodeMentionReferenceMap(semanticNodes, connections, visibleNodes);
|
||||
if (!skillMentionReferences.length) return map;
|
||||
map.forEach((references, nodeId) => map.set(nodeId, [...references, ...skillMentionReferences]));
|
||||
if (!skillMentionReferences.length && toolMentionReferencesByNodeId.size === 0) return map;
|
||||
map.forEach((references, nodeId) => {
|
||||
const extras = [...skillMentionReferences, ...(toolMentionReferencesByNodeId.get(nodeId) ?? [])];
|
||||
if (extras.length) map.set(nodeId, [...references, ...extras]);
|
||||
});
|
||||
return map;
|
||||
}, [connections, semanticNodes, skillMentionReferences, visibleNodes]);
|
||||
}, [connections, semanticNodes, skillMentionReferences, toolMentionReferencesByNodeId, visibleNodes]);
|
||||
|
||||
return {
|
||||
activeDirectorNode,
|
||||
|
||||
Reference in new issue
Block a user