From 50aa93d5f3b85f407cd2eb6a7d9d86e032b8510d Mon Sep 17 00:00:00 2001 From: 134 Date: Tue, 23 Jun 2026 15:25:02 +0800 Subject: [PATCH] fix: route clear canvas requests through confirmation --- lib/canvas/agent-model-planner.ts | 8 +++++++- tests/routes/canvas-chat-helpers.test.ts | 23 +++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/lib/canvas/agent-model-planner.ts b/lib/canvas/agent-model-planner.ts index a13262306..1433e6289 100644 --- a/lib/canvas/agent-model-planner.ts +++ b/lib/canvas/agent-model-planner.ts @@ -136,7 +136,13 @@ function getDecisionNodeIds(params: { function inferHighRiskOperation(userText: string) { const text = userText.toLowerCase(); - if (/删除|删掉|移除/.test(text)) return "delete_nodes"; + if ( + /删除|删掉|删了|删去|移除/.test(text) || + /清空(?:画布|选中|当前|节点|对象|元素|这些|全部)/.test(text) || + /清除(?:选中|当前|节点|对象|元素|这些|全部)/.test(text) + ) { + return "delete_nodes"; + } if (/覆盖|替换当前|替换原图|直接替换|覆盖原图/.test(text)) { return "replace_node_media"; } diff --git a/tests/routes/canvas-chat-helpers.test.ts b/tests/routes/canvas-chat-helpers.test.ts index 92c2ccbad..d27b46300 100644 --- a/tests/routes/canvas-chat-helpers.test.ts +++ b/tests/routes/canvas-chat-helpers.test.ts @@ -266,6 +266,12 @@ test.describe("canvas chat pure helpers", () => { context: plannerContext, }) ).toBe(true); + expect( + shouldConsiderCanvasAgentModelPlanner({ + userText: "清空选中的节点", + context: plannerContext, + }) + ).toBe(true); }); test("treats selected agent slots as canvas routing context", () => { @@ -656,6 +662,23 @@ test.describe("canvas chat pure helpers", () => { riskOperation: "delete_nodes", targetNodeIds: ["image-1", "text-1"], }); + + const clearOutcome = normalizeCanvasAgentModelPlannerDecision({ + decision: { + action: "none", + }, + context: plannerContext, + projectId: plannerContext.projectId || "", + messageId: "message-1", + chatId: "chat-1", + userText: "清除选中的对象", + }); + + expect(clearOutcome).toMatchObject({ + kind: "confirmation_required", + riskOperation: "delete_nodes", + targetNodeIds: ["image-1", "text-1"], + }); }); test("builds pending move-node operation from model-planned high-risk layout", () => {