From c033e75ba14d09642e5ec8bb6c62c62ddfe40630 Mon Sep 17 00:00:00 2001 From: 134 Date: Tue, 23 Jun 2026 17:34:35 +0800 Subject: [PATCH] fix: open chat for annotation edits --- components/canvas/CanvasChatPanel.tsx | 19 +++++++++++++++ components/canvas/nodes/ImageNode.tsx | 24 +++++++++++++++---- ...框Agent模式升级开发文档-借鉴Cowart-2026-06-22.md | 2 ++ 3 files changed, 40 insertions(+), 5 deletions(-) diff --git a/components/canvas/CanvasChatPanel.tsx b/components/canvas/CanvasChatPanel.tsx index 48b7e3821..d860ccfdf 100644 --- a/components/canvas/CanvasChatPanel.tsx +++ b/components/canvas/CanvasChatPanel.tsx @@ -3598,8 +3598,14 @@ export function CanvasChatPanel({ nodeId?: string; label?: string; }; + type PendingCanvasAgentAnnotationEditRequest = { + nodeId?: string; + title?: string; + annotationCount?: number; + }; const targetWindow = window as Window & { __canvasAgentPendingSlotFillRequest?: PendingCanvasAgentSlotFillRequest; + __canvasAgentPendingAnnotationEditRequest?: PendingCanvasAgentAnnotationEditRequest; }; const focusComposerWithPrompt = (prompt: string) => { @@ -3645,6 +3651,10 @@ export function CanvasChatPanel({ annotationCount?: number; }> ).detail; + const pending = targetWindow.__canvasAgentPendingAnnotationEditRequest; + if (!pending?.nodeId || pending.nodeId === detail?.nodeId) { + delete targetWindow.__canvasAgentPendingAnnotationEditRequest; + } const nodeId = String(detail?.nodeId || "").trim(); if (nodeId) { pendingCanvasAgentAnnotationEditTargetRef.current = { @@ -3679,6 +3689,15 @@ export function CanvasChatPanel({ }) ); } + const pendingAnnotationEditRequest = + targetWindow.__canvasAgentPendingAnnotationEditRequest; + if (pendingAnnotationEditRequest) { + handleAgentAnnotationEditRequest( + new CustomEvent("canvas-agent-annotation-edit-request", { + detail: pendingAnnotationEditRequest, + }) + ); + } return () => { window.removeEventListener( "canvas-agent-slot-fill-request", diff --git a/components/canvas/nodes/ImageNode.tsx b/components/canvas/nodes/ImageNode.tsx index c342bc2f9..1e5f955c3 100644 --- a/components/canvas/nodes/ImageNode.tsx +++ b/components/canvas/nodes/ImageNode.tsx @@ -6680,16 +6680,30 @@ export function ImageNode({ return; } + const detail = { + nodeId: node.id, + title: displayTitle, + annotationCount: canvasAgentAnnotations.length, + }; + const targetWindow = window as Window & { + __canvasAgentPendingAnnotationEditRequest?: typeof detail; + }; + selectNode(node.id, false); - window.dispatchEvent( - new CustomEvent("canvas-agent-annotation-edit-request", { + targetWindow.__canvasAgentPendingAnnotationEditRequest = detail; + targetWindow.dispatchEvent( + new CustomEvent("canvas-open-chat-panel-request", { detail: { - nodeId: node.id, - title: displayTitle, - annotationCount: canvasAgentAnnotations.length, + reason: "agent-annotation-edit", + nodeId: detail.nodeId, }, }) ); + targetWindow.dispatchEvent( + new CustomEvent("canvas-agent-annotation-edit-request", { + detail, + }) + ); }, [ canvasAgentAnnotations.length, displayTitle, diff --git a/docs/无限画布对话框Agent模式升级开发文档-借鉴Cowart-2026-06-22.md b/docs/无限画布对话框Agent模式升级开发文档-借鉴Cowart-2026-06-22.md index b5a723c12..f319c7a14 100644 --- a/docs/无限画布对话框Agent模式升级开发文档-借鉴Cowart-2026-06-22.md +++ b/docs/无限画布对话框Agent模式升级开发文档-借鉴Cowart-2026-06-22.md @@ -1388,6 +1388,7 @@ metadata: { 2. 将 annotations 放入 `CanvasAgentContext`。 3. 自动在输入框插入一句:“按这张图上的批注修改”。 4. 用户可直接发送,也可补充文字。 +5. 若右侧对话面板关闭或 lazy 未挂载,需要先展开对话框,并缓存一次 pending annotation edit request,确保 prompt 与目标图不丢。 ### 10.3 Agent 规则 @@ -1621,6 +1622,7 @@ lib/ai/runtime/middlewares/canvas-agent-clarification-gate.ts - 图片节点 metadata 支持 annotations - 图片节点 UI 支持添加文本批注/框选批注 - `CanvasAgentContext` 输出 annotations +- “按批注修改”会展开对话框并在面板未挂载时保留 pending request - Agent prompt 加入标注编辑规则 - 编辑结果使用 `append_revision`