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();