diff --git a/web/hwlab-cloud-web/src/stores/workbench.ts b/web/hwlab-cloud-web/src/stores/workbench.ts index 62e8bcf3..0811428b 100644 --- a/web/hwlab-cloud-web/src/stores/workbench.ts +++ b/web/hwlab-cloud-web/src/stores/workbench.ts @@ -1419,13 +1419,21 @@ function nonBlockingProjection(projection: ProjectionDiagnostic | null): Project const userMessageId = firstNonEmptyString(lifecycle.userMessageId); const assistantMessageId = firstNonEmptyString(lifecycle.assistantMessageId); const admissionTiming = optimisticAdmissionTimingPatch(lifecycle); - if (!turnId && !userMessageId && !assistantMessageId && canonicalTraceId === traceId) return canonicalTraceId; + const hasAdmissionTiming = Boolean(admissionTiming.timing?.startedAt || admissionTiming.timing?.lastEventAt); + if (!turnId && !userMessageId && !assistantMessageId && !hasAdmissionTiming && canonicalTraceId === traceId) return canonicalTraceId; updateActiveMessages((source) => source.map((message) => { if (message.traceId !== traceId) return message; const runnerTrace = message.runnerTrace ? { ...message.runnerTrace, traceId: canonicalTraceId } : message.runnerTrace; const base = { ...message, traceId: canonicalTraceId, runnerTrace, updatedAt: new Date().toISOString() }; if (message.role === "user" && userMessageId) return { ...base, id: userMessageId, messageId: userMessageId, turnId }; - if (message.role === "agent" && assistantMessageId) return { ...base, ...admissionTiming, id: assistantMessageId, messageId: assistantMessageId, turnId }; + if (message.role === "agent") { + const next = { ...base, ...admissionTiming }; + return { + ...next, + ...(assistantMessageId ? { id: assistantMessageId, messageId: assistantMessageId } : {}), + ...(turnId ? { turnId } : {}) + }; + } return turnId ? { ...base, turnId } : base; })); return canonicalTraceId;