fix(workbench): keep per-turn message timing isolated (#1768)

This commit is contained in:
Lyon
2026-06-21 00:56:12 +08:00
committed by GitHub
parent 967969db26
commit cd981355c6
2 changed files with 8 additions and 2 deletions
+3 -1
View File
@@ -585,7 +585,9 @@ function factMessageDto(message, parts = [], facts = {}) {
const traceId = safeTraceId(message?.traceId) ?? null;
const role = textValue(message?.role) || "agent";
const status = normalizeStatus(message?.status);
const timing = factTimingProjection(message, status);
const turn = traceId ? factTurnForTrace(facts, traceId) : null;
const checkpoint = traceId ? factCheckpointForTrace(facts, traceId) : null;
const timing = factTimingProjection(isAssistantLikeRole(role) ? turn ?? checkpoint ?? message : message, status);
const text = projectionText(message?.text, message?.content, message?.message, message?.finalResponse);
const normalizedParts = parts.length > 0
? [...parts].sort(compareFactPartsAsc).map((part) => factPartDto(part, messageId, traceId)).filter(Boolean)
@@ -348,7 +348,11 @@ function normalizeMessageFact(message = {}, index, { traceId, sessionId, convers
const role = textValue(message.role) || "agent";
const status = normalizeWorkbenchStatus(message.status ?? (terminal && role !== "user" ? "completed" : role === "user" ? "sent" : "running"));
const messageTerminal = role !== "user" && TERMINAL_STATUSES.has(status);
const timing = role === "user" ? normalizeTimingProjection(message.timing) ?? emptyTimingProjection() : normalizeTimingProjection(contextTiming) ?? emptyTimingProjection();
const messageTraceId = safeTraceId(message.traceId ?? message.turnId);
const appliesToContextTrace = role !== "user" && Boolean(traceId && messageTraceId && messageTraceId === traceId);
const messageTiming = normalizeTimingProjection(message.timing) ?? normalizeTimingProjection(message);
const contextTimingProjection = appliesToContextTrace ? normalizeTimingProjection(contextTiming) : null;
const timing = role === "user" ? messageTiming ?? emptyTimingProjection() : messageTiming ?? contextTimingProjection ?? emptyTimingProjection();
return {
...message,
messageId,