feat: 升级至 v0.3.8 — Trace Viewer 叠加修复 + LLM 配置校验改造 + toast 反馈统一
- Trace Viewer 叠加渲染修复 - sendMessage 补 traceSteps/tokenUsage 重置(止血) - TraceStep 加 runId 字段,useAgentStream 按 runId 判定同迭代(稳健改造) - LLM 配置校验中等改造(SettingsModal LLMSettings) - 取消 onChange 实时落库,改为本地 state + Save 按钮统一提交 - 字段级 inline error:Base URL http(s):// 正则、Model 空格校验、contextWindow ≥ 4096 - Provider 切换清空 Model(之前只清 apiKey) - 保存结果改用 metona-toast(不再用 Alert) - toast 反馈机制全面统一(15 处问题修复) - ContextMenu: 原生 confirm/prompt 改 MUI Dialog(新增 useDialogStore + ContextMenuDialogHost) - ContextMenu: 抽 copyWithToast helper 替代散落 7 处静默失败 - OnboardingWizard: 配置保存失败静默改 toast.error - useKeyboardShortcuts: Ctrl+N / Ctrl+Shift+C 失败补 toast - SettingsModal: inheritFiles 失败 toast.warning、handleApply 失败 toast.error - LogsSettings: resultAlert Alert 改 toast(保留 Dialog 确认) - MemoryViewer: 删除失败改 toast(加载/搜索保留 Alert) - TaskList: create/update/delete/无会话改 toast - agent-store: sendMessage/session 失败补 toast(保留 system message) - 删除当前会话同步清空 ChatPanel/DetailPanel - Sidebar confirmDelete + ContextMenu delete 均补 agent-store 重置 - 修复 useSessionStore.removeSession 不触发 agent-store 同步的遗漏
This commit is contained in:
@@ -417,9 +417,10 @@ export function useAgentStream(): void {
|
||||
const traceSteps = store.traceSteps;
|
||||
const lastStep = traceSteps[traceSteps.length - 1];
|
||||
|
||||
// 判断是否需要创建新步骤:同一迭代的首次状态创建新步骤
|
||||
// 判断是否需要创建新步骤:同一 runId + 同一迭代的首次状态创建新步骤
|
||||
// 后续状态转换(EXECUTING/OBSERVING等)追加到 states 数组
|
||||
const isSameIteration = lastStep && lastStep.iteration === data.iteration;
|
||||
// runId 判定:防止跨 run 的事件被误判为同一迭代(如 traceSteps 未清空时残留的旧 step)
|
||||
const isSameIteration = lastStep && lastStep.iteration === data.iteration && lastStep.runId === data.runId;
|
||||
|
||||
if (isSameIteration) {
|
||||
// 同一迭代内的状态转换 → 追加状态到 states 数组,更新当前 state
|
||||
@@ -437,7 +438,8 @@ export function useAgentStream(): void {
|
||||
// MT-2 修复: 当 state === 'TERMINATED' 且 iteration 不匹配时,
|
||||
// 说明 abort 发生在循环条件检查时,currentIteration 已自增但没有对应 step。
|
||||
// 此时不应创建孤立的只含 TERMINATED 的步骤,而是更新最后一个步骤的 states 数组
|
||||
if (data.state === 'TERMINATED' && lastStep) {
|
||||
// runId 一致性检查:仅当 lastStep 属于当前 run 时才 append,避免污染上一条消息的 step
|
||||
if (data.state === 'TERMINATED' && lastStep && lastStep.runId === data.runId) {
|
||||
const currentStates = lastStep.states ?? [lastStep.state];
|
||||
if (currentStates[currentStates.length - 1] !== 'TERMINATED') {
|
||||
store.updateLastTraceStep({
|
||||
@@ -446,9 +448,12 @@ export function useAgentStream(): void {
|
||||
completedAt: Date.now(),
|
||||
});
|
||||
}
|
||||
} else if (data.state === 'TERMINATED' && (!lastStep || lastStep.runId !== data.runId)) {
|
||||
// 跨 run 的孤立 TERMINATED 事件:上一条消息已结束/已 abort,没有当前 run 的 step 可更新
|
||||
// 不创建孤立的只含 TERMINATED 的 step(无意义),仅更新 Agent 状态
|
||||
} else {
|
||||
// 新迭代 → 标记上一步完成,创建新步骤
|
||||
if (lastStep && !lastStep.completedAt) {
|
||||
// 新迭代 → 标记上一步完成(仅当 lastStep 属于当前 run),创建新步骤
|
||||
if (lastStep && !lastStep.completedAt && lastStep.runId === data.runId) {
|
||||
store.updateLastTraceStep({ completedAt: Date.now() });
|
||||
}
|
||||
store.addTraceStep({
|
||||
@@ -457,6 +462,7 @@ export function useAgentStream(): void {
|
||||
state: data.state,
|
||||
states: [data.state],
|
||||
startedAt: Date.now(),
|
||||
runId: data.runId,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user