Improve active run timing and turn limits

This commit is contained in:
武阳
2026-05-07 17:51:23 +08:00
parent d57570e527
commit b1868a6401
7 changed files with 68 additions and 24 deletions
@@ -426,7 +426,12 @@ export function toReplayRepository(
role: message.role,
parts,
...(message.role === "assistant"
? { metadata: { sessionId: session.session_id ?? fallbackSessionId } }
? {
metadata: {
sessionId: session.session_id ?? fallbackSessionId,
elapsedMs: normalizeElapsedMs(message.metadata?.elapsed_ms),
},
}
: {}),
} as UIMessage;
const threadMessage = {
@@ -442,7 +447,10 @@ export function toReplayRepository(
unstable_annotations: [],
unstable_data: [],
steps: [],
custom: { sessionId: session.session_id ?? fallbackSessionId },
custom: {
sessionId: session.session_id ?? fallbackSessionId,
elapsedMs: normalizeElapsedMs(message.metadata?.elapsed_ms),
},
},
}
: { metadata: { custom: {} } }),
@@ -536,8 +544,9 @@ function buildActiveRunParts(runStatus: ClawActiveRunStatus) {
? "当前会话已有任务在执行,本轮正在排队。"
: runStatus.current_stage || "后端正在执行这个会话。";
const reasoningText = eventLines.length ? eventLines.join("\n") : fallback;
const runStartedAtMs = normalizeRunTimestampMs(runStatus.started_at);
return [
{ type: "reasoning", text: reasoningText },
{ type: "reasoning", text: reasoningText, runStartedAtMs },
...buildRunToolParts(runStatus.events ?? []),
];
}
@@ -694,6 +703,11 @@ function normalizeRunTimestampMs(value: unknown) {
return value < 10_000_000_000 ? Math.round(value * 1000) : Math.round(value);
}
function normalizeElapsedMs(value: unknown) {
if (typeof value !== "number" || !Number.isFinite(value)) return undefined;
return Math.max(0, Math.round(value));
}
function findLastAssistantContentIndex(messages: readonly ClawStoredMessage[]) {
for (let index = messages.length - 1; index >= 0; index -= 1) {
const message = messages[index];
@@ -1217,11 +1217,20 @@ const ActivityChainSummary: FC<{
}> = ({ messageId, partIndex }) => {
const { openItem } = useActivityPanel();
const startedAtRef = useRef(Date.now());
const [elapsedMs, setElapsedMs] = useState(0);
const runStartedAtMs = useAuiState((s) => {
const metadataRunStartedAtMs = useAuiState((s) => {
const value = readMetadataValue(s.message.metadata, "runStartedAtMs");
return typeof value === "number" && Number.isFinite(value) ? value : null;
});
const contentRunStartedAtMs = useAuiState((s) =>
findNumberInActivityParts(s.message.content, "runStartedAtMs"),
);
const storedElapsedMs = useAuiState((s) => {
const value = readMetadataValue(s.message.metadata, "elapsedMs");
return typeof value === "number" && Number.isFinite(value)
? Math.max(0, Math.round(value))
: null;
});
const [elapsedMs, setElapsedMs] = useState(storedElapsedMs ?? 0);
const label = useAuiState((s) => {
const message = s.message;
const status =
@@ -1238,14 +1247,18 @@ const ActivityChainSummary: FC<{
});
useEffect(() => {
if (!active) return;
const startedAt = runStartedAtMs ?? startedAtRef.current;
if (!active) {
if (storedElapsedMs !== null) setElapsedMs(storedElapsedMs);
return;
}
const startedAt =
metadataRunStartedAtMs ?? contentRunStartedAtMs ?? startedAtRef.current;
setElapsedMs(Math.max(0, Date.now() - startedAt));
const timer = window.setInterval(() => {
setElapsedMs(Math.max(0, Date.now() - startedAt));
}, 1000);
return () => window.clearInterval(timer);
}, [active, runStartedAtMs]);
}, [active, metadataRunStartedAtMs, contentRunStartedAtMs, storedElapsedMs]);
return (
<button
@@ -1272,8 +1285,20 @@ type ActivitySummaryPart = {
result?: unknown;
args?: unknown;
toolName?: string;
runStartedAtMs?: unknown;
};
function findNumberInActivityParts(
content: readonly ActivitySummaryPart[],
key: keyof ActivitySummaryPart,
) {
for (const part of content) {
const value = part[key];
if (typeof value === "number" && Number.isFinite(value)) return value;
}
return null;
}
function summarizeActivityChainLabel(
content: readonly ActivitySummaryPart[],
status: string | undefined,