From 52cb3cad06e5eff4e3e1ca81e8ab6208266061e8 Mon Sep 17 00:00:00 2001 From: wuyang6 Date: Thu, 14 May 2026 14:25:45 +0800 Subject: [PATCH] Refresh current thread when run settles --- .../app/components/assistant-ui/thread.tsx | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/frontend/app/components/assistant-ui/thread.tsx b/frontend/app/components/assistant-ui/thread.tsx index 8ce26d4..75efeaa 100644 --- a/frontend/app/components/assistant-ui/thread.tsx +++ b/frontend/app/components/assistant-ui/thread.tsx @@ -168,6 +168,7 @@ function scheduleSessionListRefresh() { export const Thread: FC = () => { useRefreshReplayedRun(); + useRefreshCurrentRun(); return ( s.thread.isRunning); + const sessionId = useCurrentThreadSessionId({ + includePending: true, + includeActive: true, + }); + const activeRunRef = useRef(null); + const appliedTerminalRef = useRef(null); + + useEffect(() => { + if (!sessionId) return; + let cancelled = false; + + async function refreshIfSettled() { + if (!sessionId) return; + const runStatus = await fetchLatestRunStatus(sessionId); + if (cancelled) return; + if (runStatus?.status === "queued" || runStatus?.status === "running") { + activeRunRef.current = runStatus.run_id ?? "active"; + return; + } + if (!runtimeRunning && !activeRunRef.current) return; + const terminalKey = [ + runStatus?.run_id ?? activeRunRef.current ?? "unknown", + runStatus?.status ?? "idle", + runStatus?.finished_at ?? "", + runStatus?.elapsed_ms ?? "", + ].join(":"); + if (appliedTerminalRef.current === terminalKey) return; + const response = await fetch(`/api/claw/sessions/${sessionId}`, { + cache: "no-store", + }); + if (!response.ok || cancelled) return; + const payload = await response.json(); + replaySession( + sessionId, + toReplayRepository(payload, sessionId, runStatus), + ); + activeRunRef.current = null; + appliedTerminalRef.current = terminalKey; + scheduleSessionListRefresh(); + } + + refreshIfSettled(); + const interval = window.setInterval(refreshIfSettled, 1500); + return () => { + cancelled = true; + window.clearInterval(interval); + }; + }, [runtimeRunning, sessionId, replaySession]); +} + function useReplayedRunState() { const active = useAuiState((s) => s.thread.messages.some((message) => isReplayRunMessageId(message.id)),