export type CanvasAgentOperationErrorCode = | "STALE_CANVAS_REVISION" | "CANVAS_AGENT_CONFIRMATION_REQUIRED" | "CANVAS_AGENT_CONFLICT" | "CANVAS_AGENT_WRITEBACK_DISABLED" | "CANVAS_AGENT_WRITEBACK_FAILED"; const CANVAS_AGENT_OPERATION_ERROR_CODES = new Set([ "STALE_CANVAS_REVISION", "CANVAS_AGENT_CONFIRMATION_REQUIRED", "CANVAS_AGENT_CONFLICT", "CANVAS_AGENT_WRITEBACK_DISABLED", "CANVAS_AGENT_WRITEBACK_FAILED", ]); export function normalizeCanvasAgentOperationErrorCode( value: unknown ): CanvasAgentOperationErrorCode { const code = String(value || "").trim(); return CANVAS_AGENT_OPERATION_ERROR_CODES.has(code) ? (code as CanvasAgentOperationErrorCode) : "CANVAS_AGENT_WRITEBACK_FAILED"; } export function getCanvasAgentOperationErrorMessage(params: { code?: unknown; fallbackMessage?: string; }) { const code = normalizeCanvasAgentOperationErrorCode(params.code); if (code === "STALE_CANVAS_REVISION") { return "画布已更新,生成结果已保留在对话中。请刷新画布后重新确认写回。"; } if (code === "CANVAS_AGENT_CONFIRMATION_REQUIRED") { return "这个画布操作需要确认后再执行,生成结果已保留在对话中。"; } if (code === "CANVAS_AGENT_CONFLICT") { return "画布目标状态有冲突,生成结果已保留在对话中。请检查槽位或刷新后重试。"; } if (code === "CANVAS_AGENT_WRITEBACK_DISABLED") { return "当前画布 Agent 写回处于灰度保护,未修改画布。"; } const fallback = String(params.fallbackMessage || "").trim(); return fallback || "画布写回失败,生成结果已保留在对话中。"; }