fix(workbench): seal terminal trace timing (#1993)

This commit is contained in:
Lyon
2026-06-23 23:07:32 +08:00
committed by GitHub
parent 0b6fc63472
commit 6d359bf7e6
@@ -133,7 +133,11 @@ export function mergeRunnerTrace(previous: ChatMessage["runnerTrace"], next: Non
};
}
function mergeTraceTimingProjection(previous: unknown, next: unknown): TraceSnapshot["timing"] | null {
type TraceTimingMergeOptions = {
preserveVisibleTerminalDuration?: boolean;
};
function mergeTraceTimingProjection(previous: unknown, next: unknown, options: TraceTimingMergeOptions = {}): TraceSnapshot["timing"] | null {
const previousTiming = traceTimingCandidate(previous);
const nextTiming = traceTimingCandidate(next);
if (!previousTiming && !nextTiming) return null;
@@ -142,12 +146,16 @@ function mergeTraceTimingProjection(previous: unknown, next: unknown): TraceSnap
const startedAt = earliestTraceTimestamp(previousTiming.startedAt, nextTiming.startedAt);
const lastEventAt = latestTraceTimestamp(previousTiming.lastEventAt, nextTiming.lastEventAt);
const finishedAt = latestTraceTimestamp(previousTiming.finishedAt, nextTiming.finishedAt);
const elapsedDurationMs = traceElapsedMs(startedAt, finishedAt ?? lastEventAt);
const runningElapsedDurationMs = traceElapsedMs(startedAt, lastEventAt);
const terminalElapsedDurationMs = traceElapsedMs(startedAt, finishedAt);
const terminalTiming = traceTimingIsTerminal(next) || finishedAt !== null;
const previousTerminalDurationMs = previousTiming.finishedAt ? previousTiming.durationMs : null;
const preservedVisibleTerminalDurationMs = options.preserveVisibleTerminalDuration && !finishedAt
? firstTraceDuration(previousTiming.durationMs)
: null;
const durationMs = terminalTiming
? maxTraceDuration(previousTiming.durationMs, nextTiming.durationMs, elapsedDurationMs, previousTerminalDurationMs)
: maxTraceDuration(previousTiming.durationMs, nextTiming.durationMs, elapsedDurationMs);
? maxTraceDuration(finishedAt ? nextTiming.durationMs : null, terminalElapsedDurationMs, previousTerminalDurationMs, preservedVisibleTerminalDurationMs)
: maxTraceDuration(previousTiming.durationMs, nextTiming.durationMs, runningElapsedDurationMs);
return {
...previousTiming,
...nextTiming,