fix: seal terminal Workbench message timing (#2114)

This commit is contained in:
Lyon
2026-06-25 11:49:22 +08:00
committed by GitHub
parent 7a88ce49c9
commit 270cc8f7cd
+13 -2
View File
@@ -627,9 +627,10 @@ export const useWorkbenchStore = defineStore("workbench", () => {
const traceId = firstNonEmptyString(message.traceId, message.runnerTrace?.traceId, previous?.traceId, previous?.runnerTrace?.traceId);
const authority = traceId ? traceAuthorityById.value[traceId] ?? null : null;
const preservedTrace = authority ?? previous?.runnerTrace ?? null;
if (!preservedTrace) return message;
const terminalSealPatch = messageTerminalSealPatchForProjectionMerge(message, previous);
if (!preservedTrace) return { ...message, ...terminalSealPatch };
const runnerTrace = message.runnerTrace ? mergeRunnerTrace(message.runnerTrace, preservedTrace) : preservedTrace;
return { ...message, ...messageTimingPatch(message), runnerTrace };
return { ...message, ...terminalSealPatch, runnerTrace };
}
function findExistingProjectionMessage(message: ChatMessage, existing: ChatMessage[]): ChatMessage | null {
@@ -1868,6 +1869,16 @@ function messageTimingPatchForMerge(message: ChatMessage, value: unknown): Parti
return messageTimingPatch(message);
}
function messageTerminalSealPatchForProjectionMerge(message: ChatMessage, previous: ChatMessage | null): Partial<ChatMessage> {
const incomingTimingPatch = messageTimingPatch(message);
if (!previous || !isTerminalMessageStatus(previous.status)) return incomingTimingPatch;
const patch: Partial<ChatMessage> = { status: previous.status, traceAutoLifecycle: previous.traceAutoLifecycle ?? "terminal" };
if (typeof previous.text === "string" && previous.text.trim()) patch.text = previous.text;
const previousTiming = normalizeTimingProjection(previous);
if (previousTiming?.durationMs == null) return { ...incomingTimingPatch, ...patch };
return { ...messageTimingPatch(previous), ...patch };
}
function messageStatusPatchForTerminalMerge(message: ChatMessage, resultStatus: string | null, terminal: boolean): Partial<ChatMessage> {
if (!terminal || isTerminalMessageStatus(message.status)) return {};
if (resultStatus && isTerminalMessageStatus(resultStatus)) return { status: resultStatus as ChatMessage["status"] };