Improve replayed run status handling

This commit is contained in:
武阳
2026-05-07 17:19:28 +08:00
parent 5b4f7c2c8d
commit 7837430a63
3 changed files with 130 additions and 21 deletions
@@ -39,6 +39,7 @@ type ClawStoredMessage = {
stop_reason?: string;
metadata?: {
elapsed_ms?: unknown;
kind?: unknown;
placeholder?: unknown;
phase?: unknown;
status?: unknown;
@@ -523,8 +524,11 @@ function getReplayMessages(
messages: readonly ClawStoredMessage[],
runStatus?: ClawRunStatus | null,
) {
if (isActiveRunStatus(runStatus)) return [...messages];
return trimIncompleteReplayTail(messages);
const visibleMessages = isActiveRunStatus(runStatus)
? messages.filter((message) => !isRunStatusMessage(message))
: [...messages];
if (isActiveRunStatus(runStatus)) return visibleMessages;
return trimIncompleteReplayTail(visibleMessages);
}
function shouldShowInterruptedNotice(
@@ -532,6 +536,7 @@ function shouldShowInterruptedNotice(
runStatus?: ClawRunStatus | null,
) {
if (isActiveRunStatus(runStatus)) return false;
if (hasRunStatusMessage(messages, runStatus?.status)) return false;
return (
runStatus?.status === "interrupted" ||
runStatus?.status === "cancelled" ||
@@ -574,6 +579,21 @@ function hasTrailingAssistantToolCall(message?: ClawStoredMessage) {
return message?.role === "assistant" && Boolean(message.tool_calls?.length);
}
function hasRunStatusMessage(
messages: readonly ClawStoredMessage[],
status?: string,
) {
return messages.some(
(message) =>
isRunStatusMessage(message) &&
(!status || message.metadata?.status === status),
);
}
function isRunStatusMessage(message?: ClawStoredMessage) {
return message?.metadata?.kind === "run_status";
}
function normalizeRunTimestampMs(value: unknown) {
if (typeof value !== "number" || !Number.isFinite(value)) return undefined;
return value < 10_000_000_000 ? Math.round(value * 1000) : Math.round(value);