Fix session file and elapsed replay state

This commit is contained in:
武阳
2026-05-08 17:45:32 +08:00
parent 1af0a6f0ea
commit b5a4c208d5
4 changed files with 108 additions and 20 deletions
@@ -414,6 +414,10 @@ export function toReplayRepository(
message.role !== "assistant" ||
!toolParts.length ||
index === lastAssistantContentIndex;
const elapsedMs =
message.role === "assistant"
? resolveReplayElapsedMs(replayMessages, index)
: undefined;
const parts = (
message.role === "assistant" && toolParts.length
? shouldShowAssistantText
@@ -429,7 +433,7 @@ export function toReplayRepository(
? {
metadata: {
sessionId: session.session_id ?? fallbackSessionId,
elapsedMs: normalizeElapsedMs(message.metadata?.elapsed_ms),
elapsedMs,
},
}
: {}),
@@ -449,7 +453,7 @@ export function toReplayRepository(
steps: [],
custom: {
sessionId: session.session_id ?? fallbackSessionId,
elapsedMs: normalizeElapsedMs(message.metadata?.elapsed_ms),
elapsedMs,
},
},
}
@@ -708,6 +712,22 @@ function normalizeElapsedMs(value: unknown) {
return Math.max(0, Math.round(value));
}
function resolveReplayElapsedMs(
messages: readonly ClawStoredMessage[],
index: number,
) {
const current = normalizeElapsedMs(messages[index]?.metadata?.elapsed_ms);
if (current !== undefined) return current;
for (let i = index + 1; i < messages.length; i += 1) {
const message = messages[i];
if (message?.role === "user") return undefined;
if (message?.role !== "assistant") continue;
const elapsedMs = normalizeElapsedMs(message.metadata?.elapsed_ms);
if (elapsedMs !== undefined) return elapsedMs;
}
return undefined;
}
function findLastAssistantContentIndex(messages: readonly ClawStoredMessage[]) {
for (let index = messages.length - 1; index >= 0; index -= 1) {
const message = messages[index];