feat(canvas): 云端 Agent - 完成策略分层、节点能力注册与可解释审批改造
This commit is contained in:
@@ -72,6 +72,7 @@ import { CanvasDirectorNodePanel } from "@/components/canvas/director/canvas-dir
|
||||
import { CanvasVersionCompareModal } from "@/components/canvas/canvas-version-compare-modal";
|
||||
import { useFocusMode } from "@/hooks/use-focus-mode";
|
||||
import { connectCanvasTextMention } from "@/lib/canvas/canvas-text-mention";
|
||||
import { writeCanvasNodePrompt } from "@/lib/canvas/canvas-node-prompt";
|
||||
import {
|
||||
applyCanvasConnectionPromptSync,
|
||||
buildCanvasAgentMentionReferences,
|
||||
@@ -81,7 +82,6 @@ import {
|
||||
normalizeCanvasNodeMentionTokens,
|
||||
reorderCanvasResourceConnections,
|
||||
replaceCanvasReferenceMentions,
|
||||
writeCanvasNodePrompt,
|
||||
type CanvasResourceReference,
|
||||
} from "@/lib/canvas/canvas-resource-references";
|
||||
import { CanvasConnectionCreateMenu, CanvasNodePanelOverlay, type PendingConnectionCreate } from "@/components/canvas/canvas-workspace-overlays";
|
||||
@@ -2521,7 +2521,7 @@ function InfiniteCanvasPage() {
|
||||
) : null}
|
||||
</div>
|
||||
|
||||
<CanvasCloudAgentPanel canvasId={projectId} nodeCount={nodes.length} references={agentMentionReferences} open={assistantOpen} onOpen={openAgent} onCollapse={closeAgent} onFocusNode={(nodeId) => {
|
||||
<CanvasCloudAgentPanel canvasId={projectId} domainProjectId={currentProject?.projectId} nodeCount={nodes.length} references={agentMentionReferences} open={assistantOpen} onOpen={openAgent} onCollapse={closeAgent} onFocusNode={(nodeId) => {
|
||||
if (!nodesRef.current.some((node) => node.id === nodeId)) { message.info("该节点已删除或尚未同步到画布"); return; }
|
||||
focusCanvasNode(nodeId);
|
||||
}} />
|
||||
|
||||
@@ -6,6 +6,7 @@ import { saveAs } from "file-saver";
|
||||
import { NODE_DEFAULT_SIZE } from "@/constant/canvas";
|
||||
import { FOLDER_COLLAPSED_HEIGHT, FOLDER_COLLAPSED_WIDTH, FRAME_COLLAPSED_HEIGHT, FRAME_COLLAPSED_WIDTH, getFrameChildIds, isCanvasFolderNode, isFrameNode } from "@/lib/canvas/canvas-frame";
|
||||
import { buildCanvasMediaDownloadFileName } from "@/lib/canvas/canvas-media-download";
|
||||
import { writeCanvasNodePrompt } from "@/lib/canvas/canvas-node-prompt";
|
||||
import { applyBatchPrimaryImage, applyNodeConfigPatch } from "@/lib/canvas/canvas-project-domain";
|
||||
import { resetGenerationTaskMetadata } from "@/lib/canvas/canvas-project-generation";
|
||||
import { CONTENT_MODERATION_ERROR_CODE, isContentModerationError } from "@/lib/generation-error";
|
||||
@@ -162,16 +163,16 @@ export function useCanvasNodeEditor({
|
||||
const handleNodePromptChange = useCallback((nodeId: string, prompt: string) => {
|
||||
setNodes((current) => current.map((node) => {
|
||||
if (node.id !== nodeId) return node;
|
||||
const hasExistingContent = (node.type === CanvasNodeType.Text && Boolean(node.metadata?.content?.trim())) || (node.type === CanvasNodeType.Image && Boolean(node.metadata?.content));
|
||||
const previousPrompt = node.metadata?.composerContent ?? node.metadata?.prompt ?? "";
|
||||
const promptChanged = prompt !== previousPrompt;
|
||||
const moderationFailure = node.metadata?.generationErrorCode === CONTENT_MODERATION_ERROR_CODE || isContentModerationError(node.metadata?.errorDetails);
|
||||
const metadata = moderationFailure && prompt !== previousPrompt
|
||||
const metadata = moderationFailure && promptChanged
|
||||
? resetGenerationTaskMetadata(node.metadata, node.metadata?.content ? "success" : "idle")
|
||||
: node.metadata;
|
||||
const promptTemplateMetadata = prompt !== previousPrompt && metadata?.promptTemplateOperation
|
||||
? { promptTemplateOperation: undefined, promptTemplateVariables: undefined }
|
||||
: {};
|
||||
return { ...node, metadata: hasExistingContent ? { ...metadata, ...promptTemplateMetadata, composerContent: prompt } : { ...metadata, ...promptTemplateMetadata, prompt, composerContent: prompt } };
|
||||
return writeCanvasNodePrompt(node, prompt, {
|
||||
metadata,
|
||||
clearPromptTemplate: promptChanged && Boolean(metadata?.promptTemplateOperation),
|
||||
});
|
||||
}));
|
||||
}, [setNodes]);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user