diff --git a/web/src/components/canvas/canvas-assistant-panel.tsx b/web/src/components/canvas/canvas-assistant-panel.tsx index 8809fb7b1..4aa378190 100644 --- a/web/src/components/canvas/canvas-assistant-panel.tsx +++ b/web/src/components/canvas/canvas-assistant-panel.tsx @@ -829,7 +829,8 @@ export function CanvasAssistantPanel({ } const ops = onlineToolToOps(name, args, current, effectiveConfig); const result = await executeOps(ops, { source: "online", conversationId: sessionId, messageId: messageId || sessionId }); - return { ok: result.ok, message: result.changed ? canvasAgentPostconditionMessage(result) : result.noopReason, data: result }; + const { snapshot: _snapshot, before: _before, after: _after, ...cleanData } = result; + return { ok: result.ok, message: result.changed ? canvasAgentPostconditionMessage(result) : result.noopReason, data: cleanData }; } catch (error) { if (isAgentSessionPollingAbort(error)) throw error; return { ok: false, message: error instanceof Error ? error.message : "工具执行失败" }; diff --git a/web/src/services/user-data-sync.ts b/web/src/services/user-data-sync.ts index a801b3231..948646fc0 100644 --- a/web/src/services/user-data-sync.ts +++ b/web/src/services/user-data-sync.ts @@ -369,7 +369,7 @@ async function saveRemoteUserDataBatch(uploaded: Map) { message: "正在保存画布结构", }); } - await upsertRemoteCanvasProject(remotePayload); + await upsertRemoteCanvasProject(sanitizeCanvasProjectForRemoteSync(remotePayload)); acknowledgedProjects.set(source.id, source); if (total > 0) useSyncProgressStore.getState().setProjectProgress(source.id, null); } catch (error) { @@ -513,3 +513,42 @@ function numberValue(value: unknown) { const number = Number(value); return Number.isFinite(number) && number > 0 ? number : undefined; } + +function sanitizeCanvasProjectForRemoteSync(project: T): T { + if (!project || typeof project !== "object") return project; + const clone = { ...(project as Record) }; + if (Array.isArray(clone.chatSessions)) { + clone.chatSessions = clone.chatSessions.map((session) => { + if (!session || typeof session !== "object") return session; + const s = { ...(session as Record) }; + if (Array.isArray(s.messages)) { + s.messages = s.messages.map((message) => { + if (!message || typeof message !== "object" || !message.detail) return message; + const m = { ...(message as Record) }; + if (m.detail && typeof m.detail === "object") { + const d = { ...(m.detail as Record) }; + if (Array.isArray(d.results)) { + d.results = d.results.map((r) => { + if (!r || typeof r !== "object") return r; + const res = { ...(r as Record) }; + if (res.result && typeof res.result === "object") { + const inner = { ...(res.result as Record) }; + if (inner.data && typeof inner.data === "object") { + const { snapshot: _s, before: _b, after: _a, ...restData } = inner.data as Record; + inner.data = restData; + } + res.result = inner; + } + return res; + }); + } + m.detail = d; + } + return m; + }); + } + return s; + }); + } + return clone as T; +}