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 previousTiming = traceTimingCandidate(previous);
const nextTiming = traceTimingCandidate(next); const nextTiming = traceTimingCandidate(next);
if (!previousTiming && !nextTiming) return null; if (!previousTiming && !nextTiming) return null;
@@ -142,12 +146,16 @@ function mergeTraceTimingProjection(previous: unknown, next: unknown): TraceSnap
const startedAt = earliestTraceTimestamp(previousTiming.startedAt, nextTiming.startedAt); const startedAt = earliestTraceTimestamp(previousTiming.startedAt, nextTiming.startedAt);
const lastEventAt = latestTraceTimestamp(previousTiming.lastEventAt, nextTiming.lastEventAt); const lastEventAt = latestTraceTimestamp(previousTiming.lastEventAt, nextTiming.lastEventAt);
const finishedAt = latestTraceTimestamp(previousTiming.finishedAt, nextTiming.finishedAt); 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 terminalTiming = traceTimingIsTerminal(next) || finishedAt !== null;
const previousTerminalDurationMs = previousTiming.finishedAt ? previousTiming.durationMs : null; const previousTerminalDurationMs = previousTiming.finishedAt ? previousTiming.durationMs : null;
const preservedVisibleTerminalDurationMs = options.preserveVisibleTerminalDuration && !finishedAt
? firstTraceDuration(previousTiming.durationMs)
: null;
const durationMs = terminalTiming const durationMs = terminalTiming
? maxTraceDuration(previousTiming.durationMs, nextTiming.durationMs, elapsedDurationMs, previousTerminalDurationMs) ? maxTraceDuration(finishedAt ? nextTiming.durationMs : null, terminalElapsedDurationMs, previousTerminalDurationMs, preservedVisibleTerminalDurationMs)
: maxTraceDuration(previousTiming.durationMs, nextTiming.durationMs, elapsedDurationMs); : maxTraceDuration(previousTiming.durationMs, nextTiming.durationMs, runningElapsedDurationMs);
return { return {
...previousTiming, ...previousTiming,
...nextTiming, ...nextTiming,