Revert "fix(workbench): smooth visible agent timing labels (#2005)"

This reverts commit d4bcf7deb5.
This commit is contained in:
lyon
2026-06-24 19:23:29 +08:00
parent 452524f80a
commit fa8d7bf6e0
@@ -28,14 +28,6 @@ const { following, keepBottomAfterUpdate, onScroll: onPanelScroll, scrollToBotto
const detailMessageId = ref<string | null>(null);
const displayedDurationFloorMs = new Map<string, number>();
const sealedDurationMs = new Map<string, number>();
type VisibleTimingSample = {
durationMs?: number;
durationObservedAtMs?: number;
lastEventAgeMs?: number;
lastEventObservedAtMs?: number;
lastEventSourceMs?: number;
};
const visibleTimingSamples = new Map<string, VisibleTimingSample>();
const visibleMessages = computed(() => workbench.sessionDetailLoading ? [] : workbench.activeMessages);
const hasRunningAgentMessages = computed(() => visibleMessages.value.some(isRunningMessage));
const { nowMs } = useWorkbenchNowTicker(hasRunningAgentMessages);
@@ -74,9 +66,6 @@ watch(visibleMessages, (messages) => {
for (const key of Array.from(sealedDurationMs.keys())) {
if (!visibleKeys.has(key)) sealedDurationMs.delete(key);
}
for (const key of Array.from(visibleTimingSamples.keys())) {
if (!visibleKeys.has(key)) visibleTimingSamples.delete(key);
}
}, { immediate: true });
function openDetails(message: ChatMessage): void {
@@ -280,12 +269,8 @@ function messageDurationMeta(message: ChatMessage): { text: string; label: strin
function monotonicDisplayDurationMs(message: ChatMessage, durationMs: number | null): number | null {
if (durationMs === null) return null;
const key = messageDurationFloorKey(message);
const sample = visibleTimingSamples.get(key) ?? {};
const previous = sample.durationMs ?? displayedDurationFloorMs.get(key);
const next = smoothVisibleIncreasingDurationMs(previous, sample.durationObservedAtMs, durationMs, nowMs.value);
sample.durationMs = next;
sample.durationObservedAtMs = nowMs.value;
visibleTimingSamples.set(key, sample);
const previous = displayedDurationFloorMs.get(key);
const next = previous === undefined ? durationMs : Math.max(previous, durationMs);
if (next !== previous) displayedDurationFloorMs.set(key, next);
return next;
}
@@ -296,21 +281,12 @@ function sealedDisplayDurationMs(message: ChatMessage, durationMs: number | null
const sealedFloor = sealedDurationMs.get(key);
const previous = maxDefinedDurationMs(runningFloor, sealedFloor);
displayedDurationFloorMs.delete(key);
visibleTimingSamples.delete(key);
if (durationMs === null) return previous ?? null;
const next = previous === null ? durationMs : Math.max(previous, durationMs);
if (next !== previous) sealedDurationMs.set(key, next);
return next;
}
function smoothVisibleIncreasingDurationMs(previous: number | undefined, previousObservedAtMs: number | undefined, targetMs: number, observedAtMs: number): number {
const target = Math.max(0, Math.trunc(targetMs));
if (previous === undefined || !Number.isFinite(previous)) return target;
const elapsedSincePreviousSample = Number.isFinite(previousObservedAtMs) ? Math.max(0, observedAtMs - Number(previousObservedAtMs)) : 0;
const visibleCeiling = previous + elapsedSincePreviousSample;
return Math.max(previous, Math.min(target, Math.trunc(visibleCeiling)));
}
function maxDefinedDurationMs(...values: Array<number | undefined>): number | null {
let maximum: number | null = null;
for (const value of values) {
@@ -343,34 +319,12 @@ function migrateVisibleTimingAliases(primary: string, aliases: unknown[]): void
function messageActivityMeta(message: ChatMessage): { text: string; label: string } | null {
if (!isRunningMessage(message)) return null;
const timing = messageTimingForDisplay(message);
const ageMs = visibleLastEventAgeMs(message, timing?.lastEventAt);
const ageMs = durationSince(timing?.lastEventAt);
if (ageMs === null) return null;
const value = formatDuration(ageMs) + "前";
return { text: `最近 ${value}`, label: `最近事件:${value}` };
}
function visibleLastEventAgeMs(message: ChatMessage, timestamp: unknown): number | null {
const eventAtMs = timestampMs(timestamp);
if (eventAtMs === null) return null;
const key = messageDurationFloorKey(message);
const sample = visibleTimingSamples.get(key) ?? {};
const now = nowMs.value;
const targetAgeMs = Math.max(0, now - eventAtMs);
let nextAgeMs: number;
if (sample.lastEventAgeMs === undefined || !Number.isFinite(sample.lastEventAgeMs)) {
nextAgeMs = targetAgeMs;
} else if (sample.lastEventSourceMs !== undefined && eventAtMs > sample.lastEventSourceMs) {
nextAgeMs = 0;
} else {
nextAgeMs = smoothVisibleIncreasingDurationMs(sample.lastEventAgeMs, sample.lastEventObservedAtMs, targetAgeMs, now);
}
sample.lastEventAgeMs = nextAgeMs;
sample.lastEventObservedAtMs = now;
sample.lastEventSourceMs = eventAtMs;
visibleTimingSamples.set(key, sample);
return nextAgeMs;
}
function messageTimingForDisplay(message: ChatMessage): ChatMessage["timing"] {
// The main message card consumes only the durable message timing projection.
// Trace timing belongs to TraceTimeline/details; letting trace hydration drive the