export function normalizeCanvasAgentClientIntentText(value: unknown) { return String(value || "") .replace(/\u200b/g, " ") .replace(/\s+/g, " ") .trim() .toLowerCase(); } const CANVAS_AGENT_IMAGE_GENERATION_OR_EDIT_REGEX = /(生成|生图|出图|画一张|来一张|做一张|做图|做视频|生成视频|视频生成|换背景|背景换|白底|去背景|删除背景|抠图|高清|增强|超清|超分|修图|重绘|扩图|扩展画幅|局部重绘|风格化|海报|主图|logo)/i; const CANVAS_AGENT_VIEW_CONTROL_REGEX = /(看全局|看全部|缩小看|适配全部|适配画布|聚焦选中|聚焦结果|聚焦刚生成|对比.{0,8}(原图|新图|结果|版本)|(原图|新图|结果|版本).{0,8}对比|focus selection|focus latest|fit all|zoom in|zoom out|pan to)|(画布|视角|镜头|viewport|canvas).{0,12}(放大|缩小|缩放|聚焦|定位|居中|看全局|看全部|移动|平移|拖动|zoom|fit|focus|pan)|(放大|缩小|缩放|聚焦|定位|居中|zoom|fit|focus).{0,12}(画布|视角|镜头|全局|全部|选中|选择|刚生成|结果|节点|对象|图片|图)/i; const CANVAS_AGENT_SLOT_MANAGEMENT_REGEX = /(新建|创建|添加|插入|放置|加一个|建一个).{0,10}(图片|视频|ui|画面|空)?(槽位|slot|空框|占位框|框)|(槽位|slot|空框|占位框).{0,10}(新建|创建|添加|插入|放置)/i; const CANVAS_AGENT_SLOT_FILL_CONTEXT_REGEX = /(填充|生成|生图|出图|画一张|来一张|做一张|做图|做视频|视频生成|生成视频|放到|放进|放入|在这里|这个空框|这个槽位|选中槽位|槽位|slot|空框|占位框)/i; const CANVAS_AGENT_STRUCTURAL_OPERATION_REGEX = /(删除|移除|移动|挪动|排列|对齐|重命名|改名|连线|连接|添加批注|批注|备注|标注|添加文字|文字节点|更新文字|修改文字).{0,14}(画布|节点|对象|元素|图片|图|文本|便签|选中|这些|它们|这个)|(画布|节点|对象|元素|图片|图|文本|便签|选中|这些|它们|这个).{0,14}(删除|移除|移动|挪动|排列|对齐|重命名|改名|连线|连接|添加批注|批注|备注|标注|添加文字|文字节点|更新文字|修改文字)/i; export function hasCanvasAgentNonGenerativeControlIntent(value: unknown) { const text = normalizeCanvasAgentClientIntentText(value); if (!text) return false; if (CANVAS_AGENT_VIEW_CONTROL_REGEX.test(text)) return true; if (CANVAS_AGENT_IMAGE_GENERATION_OR_EDIT_REGEX.test(text)) return false; return ( CANVAS_AGENT_SLOT_MANAGEMENT_REGEX.test(text) || CANVAS_AGENT_STRUCTURAL_OPERATION_REGEX.test(text) ); } export function hasCanvasAgentSlotFillContextIntent(value: unknown) { const text = normalizeCanvasAgentClientIntentText(value); if (!text) return false; return CANVAS_AGENT_SLOT_FILL_CONTEXT_REGEX.test(text); } export function shouldBypassCanvasImagePointsPrecheckForAgentControl(params: { text: unknown; activeComposerMode?: string | null; attachmentCount?: number; hasSkillTag?: boolean; hasWorkflowContext?: boolean; isDetailGenerationMode?: boolean; agentEnabled?: boolean; }) { if (params.activeComposerMode === "agent") return true; if (params.agentEnabled === false) return false; if ((params.attachmentCount || 0) > 0) return false; if (params.hasSkillTag || params.hasWorkflowContext || params.isDetailGenerationMode) { return false; } return hasCanvasAgentNonGenerativeControlIntent(params.text); } export function shouldPreserveCanvasAgentSlotOnlyContext(params: { text: unknown; activeComposerMode?: string | null; selectedAgentSlotCount?: number; attachmentCount?: number; hasSkillTag?: boolean; hasWorkflowContext?: boolean; isDetailGenerationMode?: boolean; agentEnabled?: boolean; }) { if ((params.selectedAgentSlotCount || 0) <= 0) return false; if (params.activeComposerMode === "agent") return true; if (params.agentEnabled === false) return false; if ((params.attachmentCount || 0) > 0) return false; if (params.hasSkillTag || params.hasWorkflowContext || params.isDetailGenerationMode) { return false; } return hasCanvasAgentSlotFillContextIntent(params.text); }