fix: 迭代计数修复 — stateChange 也携带迭代号,双通道同步

- IPC handler 将 stateChange 事件转发到渲染进程
- useAgentStream 同时监听 streamEvent 和 stateChange 更新迭代
- 切换会话/发消息时重置 currentIteration 为 0
- 添加 console.log 诊断日志
This commit is contained in:
thzxx
2026-06-27 23:06:14 +08:00
parent 4f20205aba
commit 2d276feda5
2 changed files with 16 additions and 5 deletions
+6 -2
View File
@@ -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 层:记录状态转换 // 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); agentLoop.on('streamEvent', onStreamEvent);
+10 -3
View File
@@ -39,7 +39,8 @@ export function useAgentStream(): void {
const store = useAgentStore.getState(); 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); store.setCurrentIteration(data.iteration);
} }
@@ -195,12 +196,18 @@ export function useAgentStream(): void {
}; };
}, []); }, []);
// 监听状态变化事件 // 监听状态变化事件(含迭代号)
useEffect(() => { useEffect(() => {
if (!window.metona?.agent?.onStateChange) return; if (!window.metona?.agent?.onStateChange) return;
const unsubscribe = window.metona.agent.onStateChange((state: unknown) => { 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(); return () => unsubscribe();