diff --git a/web/hwlab-cloud-web/src/stores/workbench.ts b/web/hwlab-cloud-web/src/stores/workbench.ts index 5ce51465..40fd20b0 100644 --- a/web/hwlab-cloud-web/src/stores/workbench.ts +++ b/web/hwlab-cloud-web/src/stores/workbench.ts @@ -503,15 +503,24 @@ export const useWorkbenchStore = defineStore("workbench", () => { function syncTurnStatusToMessage(traceId: string, result: AgentChatResultResponse | TraceSnapshot): void { const authoritySessionId = traceResultSessionId(result); updateTraceMessages(traceId, authoritySessionId, (message) => { - const runnerTrace = mergeTerminalResultTrace(message.runnerTrace, result as AgentChatResultResponse); + const resultStatus = normalizedStatusText((result as AgentChatResultResponse).status) ?? null; + const terminal = (result as AgentChatResultResponse).terminal === true || isTerminalMessageStatus(resultStatus); + const resultError = normalizeAgentError((result as AgentChatResultResponse).error ?? null); + const resultProjection = projectionFromResult(result as AgentChatResultResponse); + const mergedRunnerTrace = mergeTerminalResultTrace(message.runnerTrace, result as AgentChatResultResponse); + const runnerTrace = terminal && !resultError && !resultProjection ? clearRunnerTraceTransientDiagnostics(mergedRunnerTrace) : mergedRunnerTrace; rememberTraceAuthority(runnerTrace); - const error = normalizeAgentError((result as AgentChatResultResponse).error ?? runnerTrace?.error ?? message.error); + const error = resultError ?? (terminal ? null : normalizeAgentError(runnerTrace?.error ?? message.error)); const agentRun = agentRunFromResult(result as AgentChatResultResponse, runnerTrace) ?? agentRunFromMessage(message); - const projection = projectionFromResult(result as AgentChatResultResponse) ?? runnerTrace.projection ?? message.projection ?? null; - return { ...message, ...messageTimingPatch(result), runnerTrace, error: error ?? message.error ?? null, projection, projectionStatus: projection?.projectionStatus ?? null, projectionHealth: projection?.projectionHealth ?? null, blocker: projection?.blocker ?? null, agentRun: agentRun ?? undefined, updatedAt: new Date().toISOString() }; + const projection = resultProjection ?? (terminal ? null : runnerTrace.projection ?? message.projection ?? null); + return { ...message, ...messageTimingPatch(result), runnerTrace, error, projection, projectionStatus: projection?.projectionStatus ?? null, projectionHealth: projection?.projectionHealth ?? null, blocker: projection?.blocker ?? null, agentRun: agentRun ?? undefined, updatedAt: new Date().toISOString() }; }); } + function clearRunnerTraceTransientDiagnostics(trace: NonNullable): NonNullable { + return { ...trace, error: undefined, projection: null, projectionStatus: null, projectionHealth: null, staleMs: null, blocker: null }; + } + async function submitMessage(text: string): Promise { const value = text.trim(); if (!value) return false;