Fix active run elapsed restore
This commit is contained in:
@@ -1357,6 +1357,7 @@ def create_app(state: AgentState) -> FastAPI:
|
|||||||
started_event = {
|
started_event = {
|
||||||
'type': 'run_started',
|
'type': 'run_started',
|
||||||
'run_id': run_record.run_id,
|
'run_id': run_record.run_id,
|
||||||
|
'started_at': run_record.started_at,
|
||||||
'session_id': requested_session_id or '',
|
'session_id': requested_session_id or '',
|
||||||
'account_id': request.account_id or '',
|
'account_id': request.account_id or '',
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -78,6 +78,9 @@ type ClawActiveRunStatus = ClawRunStatus & {
|
|||||||
|
|
||||||
type ClawRunEvent = {
|
type ClawRunEvent = {
|
||||||
type?: string;
|
type?: string;
|
||||||
|
started_at?: unknown;
|
||||||
|
recorded_at?: unknown;
|
||||||
|
elapsed_ms?: unknown;
|
||||||
tool_name?: string;
|
tool_name?: string;
|
||||||
tool_call_id?: string;
|
tool_call_id?: string;
|
||||||
arguments?: unknown;
|
arguments?: unknown;
|
||||||
@@ -500,6 +503,7 @@ export function toReplayRepository(
|
|||||||
}
|
}
|
||||||
if (isActiveRunStatus(runStatus)) {
|
if (isActiveRunStatus(runStatus)) {
|
||||||
const id = `${fallbackSessionId}-run-${runStatus.run_id ?? "active"}`;
|
const id = `${fallbackSessionId}-run-${runStatus.run_id ?? "active"}`;
|
||||||
|
const runStartedAtMs = resolveRunStartedAtMs(runStatus);
|
||||||
const parts = buildActiveRunParts(runStatus) as UIMessage["parts"];
|
const parts = buildActiveRunParts(runStatus) as UIMessage["parts"];
|
||||||
const uiMessage: UIMessage = {
|
const uiMessage: UIMessage = {
|
||||||
id,
|
id,
|
||||||
@@ -508,7 +512,7 @@ export function toReplayRepository(
|
|||||||
metadata: {
|
metadata: {
|
||||||
sessionId: session.session_id ?? fallbackSessionId,
|
sessionId: session.session_id ?? fallbackSessionId,
|
||||||
runId: runStatus.run_id,
|
runId: runStatus.run_id,
|
||||||
runStartedAtMs: normalizeRunTimestampMs(runStatus.started_at),
|
runStartedAtMs,
|
||||||
},
|
},
|
||||||
} as UIMessage;
|
} as UIMessage;
|
||||||
const threadMessage = {
|
const threadMessage = {
|
||||||
@@ -525,7 +529,7 @@ export function toReplayRepository(
|
|||||||
custom: {
|
custom: {
|
||||||
sessionId: session.session_id ?? fallbackSessionId,
|
sessionId: session.session_id ?? fallbackSessionId,
|
||||||
runId: runStatus.run_id,
|
runId: runStatus.run_id,
|
||||||
runStartedAtMs: normalizeRunTimestampMs(runStatus.started_at),
|
runStartedAtMs,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
} as ThreadMessage;
|
} as ThreadMessage;
|
||||||
@@ -552,7 +556,7 @@ function buildActiveRunParts(runStatus: ClawActiveRunStatus) {
|
|||||||
? "当前会话已有任务在执行,本轮正在排队。"
|
? "当前会话已有任务在执行,本轮正在排队。"
|
||||||
: runStatus.current_stage || "后端正在执行这个会话。";
|
: runStatus.current_stage || "后端正在执行这个会话。";
|
||||||
const reasoningText = eventLines.length ? eventLines.join("\n") : fallback;
|
const reasoningText = eventLines.length ? eventLines.join("\n") : fallback;
|
||||||
const runStartedAtMs = normalizeRunTimestampMs(runStatus.started_at);
|
const runStartedAtMs = resolveRunStartedAtMs(runStatus);
|
||||||
return [
|
return [
|
||||||
{ type: "reasoning", text: reasoningText, runStartedAtMs },
|
{ type: "reasoning", text: reasoningText, runStartedAtMs },
|
||||||
...buildRunToolParts(runStatus.events ?? []),
|
...buildRunToolParts(runStatus.events ?? []),
|
||||||
@@ -723,6 +727,34 @@ function normalizeElapsedMs(value: unknown) {
|
|||||||
return Math.max(0, Math.round(value));
|
return Math.max(0, Math.round(value));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function resolveRunStartedAtMs(runStatus: ClawRunStatus) {
|
||||||
|
const direct = normalizeRunTimestampMs(runStatus.started_at);
|
||||||
|
if (direct !== undefined) return direct;
|
||||||
|
|
||||||
|
for (const event of runStatus.events ?? []) {
|
||||||
|
if (event.type !== "run_started") continue;
|
||||||
|
const eventStarted = normalizeRunTimestampMs(event.started_at);
|
||||||
|
if (eventStarted !== undefined) return eventStarted;
|
||||||
|
const recordedAt = normalizeRunTimestampMs(event.recorded_at);
|
||||||
|
if (recordedAt !== undefined) return recordedAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const event of runStatus.events ?? []) {
|
||||||
|
const recordedAt = normalizeRunTimestampMs(event.recorded_at);
|
||||||
|
const elapsedMs = normalizeElapsedMs(event.elapsed_ms);
|
||||||
|
if (recordedAt !== undefined && elapsedMs !== undefined) {
|
||||||
|
return Math.max(0, recordedAt - elapsedMs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const event of runStatus.events ?? []) {
|
||||||
|
const recordedAt = normalizeRunTimestampMs(event.recorded_at);
|
||||||
|
if (recordedAt !== undefined) return recordedAt;
|
||||||
|
}
|
||||||
|
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
function resolveReplayElapsedMs(
|
function resolveReplayElapsedMs(
|
||||||
messages: readonly ClawStoredMessage[],
|
messages: readonly ClawStoredMessage[],
|
||||||
index: number,
|
index: number,
|
||||||
|
|||||||
@@ -1475,7 +1475,11 @@ const ActivityChainSummary: FC<{
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const startedAt =
|
const startedAt =
|
||||||
metadataRunStartedAtMs ?? contentRunStartedAtMs ?? startedAtRef.current;
|
metadataRunStartedAtMs ??
|
||||||
|
contentRunStartedAtMs ??
|
||||||
|
(storedElapsedMs === null
|
||||||
|
? startedAtRef.current
|
||||||
|
: Date.now() - storedElapsedMs);
|
||||||
setElapsedMs(Math.max(0, Date.now() - startedAt));
|
setElapsedMs(Math.max(0, Date.now() - startedAt));
|
||||||
const timer = window.setInterval(() => {
|
const timer = window.setInterval(() => {
|
||||||
setElapsedMs(Math.max(0, Date.now() - startedAt));
|
setElapsedMs(Math.max(0, Date.now() - startedAt));
|
||||||
|
|||||||
Reference in New Issue
Block a user