From 2d276feda54c8e65ea0c8b2457dc6c55a93c7208 Mon Sep 17 00:00:00 2001 From: thzxx Date: Sat, 27 Jun 2026 23:06:14 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=BF=AD=E4=BB=A3=E8=AE=A1=E6=95=B0?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20=E2=80=94=20stateChange=20=E4=B9=9F?= =?UTF-8?q?=E6=90=BA=E5=B8=A6=E8=BF=AD=E4=BB=A3=E5=8F=B7=EF=BC=8C=E5=8F=8C?= =?UTF-8?q?=E9=80=9A=E9=81=93=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - IPC handler 将 stateChange 事件转发到渲染进程 - useAgentStream 同时监听 streamEvent 和 stateChange 更新迭代 - 切换会话/发消息时重置 currentIteration 为 0 - 添加 console.log 诊断日志 --- electron/ipc/handlers.ts | 8 ++++++-- src/hooks/useAgentStream.ts | 13 ++++++++++--- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/electron/ipc/handlers.ts b/electron/ipc/handlers.ts index 3433b26..39f55f6 100644 --- a/electron/ipc/handlers.ts +++ b/electron/ipc/handlers.ts @@ -84,9 +84,13 @@ export function registerAllIPCHandlers( } }; - const onStateChange = (data: { previous: string; current: string }) => { + const onStateChange = (data: { previous?: string; current?: string; sessionId?: string; iteration?: number; state?: string }) => { // AGENT 层:记录状态转换 - log.info(`[AGENT] State: ${data.previous} → ${data.current}`); + if (data.previous) log.info(`[AGENT] State: ${data.previous} → ${data.current}`); + // 转发到渲染进程(携带迭代号) + if (!mainWindow.isDestroyed()) { + mainWindow.webContents.send('agent:stateChange', data); + } }; agentLoop.on('streamEvent', onStreamEvent); diff --git a/src/hooks/useAgentStream.ts b/src/hooks/useAgentStream.ts index 4a08357..2f09878 100644 --- a/src/hooks/useAgentStream.ts +++ b/src/hooks/useAgentStream.ts @@ -39,7 +39,8 @@ export function useAgentStream(): void { const store = useAgentStore.getState(); // 每次收到迭代号时同步更新 - if (data.iteration != null) { + if (data.iteration != null && data.iteration !== store.currentIteration) { + console.log(`[useAgentStream] iteration: ${store.currentIteration} → ${data.iteration} (event: ${data.type})`); store.setCurrentIteration(data.iteration); } @@ -195,12 +196,18 @@ export function useAgentStream(): void { }; }, []); - // 监听状态变化事件 + // 监听状态变化事件(含迭代号) useEffect(() => { if (!window.metona?.agent?.onStateChange) return; const unsubscribe = window.metona.agent.onStateChange((state: unknown) => { - // 状态变化由主进程推送,UI 已通过 streamEvent 处理 + const data = state as { sessionId?: string; iteration?: number; state?: string; previous?: string; current?: string }; + if (data.iteration != null) { + const store = useAgentStore.getState(); + if (data.iteration !== store.currentIteration) { + store.setCurrentIteration(data.iteration); + } + } }); return () => unsubscribe();