feat: 升级至 v0.3.7 — 前后端状态同步与错误处理全量修复
核心引擎修复: - CE-1: 上下文压缩摘要 role 从 system 改为 user,避免被 adapter 过滤 - CE-2: 工具失败时优先使用 error 字段(engine/openai-format/ollama 三处) - P0-1: DeadLoopError 终止时正确传 error 参数,前端可见 ERROR 事件 - MT-1: 新增 waitForAbort 方法,abortSession 等待 run 结束再返回 - MT-2: TERMINATED 状态到达时标记步骤完成,避免 Trace Viewer 转圈 - MT-3: 压缩边界检测孤立 tool 消息,避免 API 400 错误 - isRetryableError 与 catch 分支统一 toLowerCase IPC 与主进程修复: - P0-2: createAdapter 配置缺失返回 null,FALLBACK_ADAPTER 兜底 - P0-3: reloadAdapter 失败返回 success:false 通知前端 - P1-5: 校验失败发 ERROR+DONE 流事件,防止 isStreaming 卡死 - P1-6: configLoaded 标志,配置加载前禁用发送按钮 - P1-7: MCP initialize 移到 agentLoop 后,完成后同步工具 - P2-11: beforeLoad 在 loadURL 前注册 IPC handler - P2-12: provider 切换竞态保护 前端状态同步修复: - clearSessions 后同步清空前端会话与消息状态 - clearMemories 通过 memoryVersion 触发 MemoryViewer 重新加载 - ContextMenu 4 个 session 操作补全 IPC 调用与 try/catch - useConfig 配置保存失败回滚 UI 并提示 - handleToggle 工具切换失败回滚单个工具状态 错误处理全量补全: - 所有 await window.metona 调用补全 try/catch 与 toast 反馈 - MCP addServer/toggleServer/removeServer 检查返回值 - showItemInFolder 检查返回值(handleOpen/handleOpenInFolder) - sse-stream/ollama NDJSON 解析失败改为 log.warn - adapter throwHttpError 带 status 属性供 isRetryableError 判断
This commit is contained in:
+27
-10
@@ -428,20 +428,37 @@ export function useAgentStream(): void {
|
||||
store.updateLastTraceStep({
|
||||
state: data.state,
|
||||
states: [...currentStates, data.state],
|
||||
// MT-2 修复: TERMINATED 状态到达时,标记步骤为已完成
|
||||
// 防止 abort 后最后一个步骤永远显示转圈
|
||||
...(data.state === 'TERMINATED' ? { completedAt: Date.now() } : {}),
|
||||
});
|
||||
}
|
||||
} else {
|
||||
// 新迭代 → 标记上一步完成,创建新步骤
|
||||
if (lastStep && !lastStep.completedAt) {
|
||||
store.updateLastTraceStep({ completedAt: Date.now() });
|
||||
// MT-2 修复: 当 state === 'TERMINATED' 且 iteration 不匹配时,
|
||||
// 说明 abort 发生在循环条件检查时,currentIteration 已自增但没有对应 step。
|
||||
// 此时不应创建孤立的只含 TERMINATED 的步骤,而是更新最后一个步骤的 states 数组
|
||||
if (data.state === 'TERMINATED' && lastStep) {
|
||||
const currentStates = lastStep.states ?? [lastStep.state];
|
||||
if (currentStates[currentStates.length - 1] !== 'TERMINATED') {
|
||||
store.updateLastTraceStep({
|
||||
state: 'TERMINATED',
|
||||
states: [...currentStates, 'TERMINATED'],
|
||||
completedAt: Date.now(),
|
||||
});
|
||||
}
|
||||
} else {
|
||||
// 新迭代 → 标记上一步完成,创建新步骤
|
||||
if (lastStep && !lastStep.completedAt) {
|
||||
store.updateLastTraceStep({ completedAt: Date.now() });
|
||||
}
|
||||
store.addTraceStep({
|
||||
id: `trace_${data.iteration}_${data.state}_${Date.now()}`,
|
||||
iteration: data.iteration,
|
||||
state: data.state,
|
||||
states: [data.state],
|
||||
startedAt: Date.now(),
|
||||
});
|
||||
}
|
||||
store.addTraceStep({
|
||||
id: `trace_${data.iteration}_${data.state}_${Date.now()}`,
|
||||
iteration: data.iteration,
|
||||
state: data.state,
|
||||
states: [data.state],
|
||||
startedAt: Date.now(),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user