const MUTATION_INTENT = /(?:设计|创建|生成|添加|增加|新增|修改|调整|编辑|删除|移动|旋转|缩放|布置|装修|建造|搭建|修复|design|create|generate|add|modify|update|edit|delete|remove|move|rotate|scale|furnish|build|repair|fix)/i export function requiresPascalMutation(messages: unknown[]): boolean { const latestUserMessage = [...messages] .reverse() .find( (message) => Boolean(message) && typeof message === 'object' && (message as { role?: unknown }).role === 'user', ) as { parts?: unknown } | undefined if (!Array.isArray(latestUserMessage?.parts)) return false const text = latestUserMessage.parts .filter((part): part is { text: string; type: 'text' } => Boolean( part && typeof part === 'object' && (part as { type?: unknown }).type === 'text' && typeof (part as { text?: unknown }).text === 'string', ), ) .map((part) => part.text) .join(' ') return MUTATION_INTENT.test(text) } export function pascalAgentStepPolicy(params: { hasMutation: boolean mutationRequired: boolean mutationToolNames: string[] stepNumber: number }): { activeTools?: string[]; toolChoice: 'auto' | 'required' } { if (!(params.mutationRequired && !params.hasMutation)) return { toolChoice: 'auto' } if (params.stepNumber < 2) return { toolChoice: 'required' } return { activeTools: params.mutationToolNames, toolChoice: 'required', } }