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
@@ -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,