diff --git a/frontend/app/app/assistant.tsx b/frontend/app/app/assistant.tsx index f03613e..f423acb 100644 --- a/frontend/app/app/assistant.tsx +++ b/frontend/app/app/assistant.tsx @@ -34,6 +34,14 @@ export const Assistant = () => { const lastSessionId = getLastSessionId(messages); const selectedResumeSessionId = messages.length > 1 ? selectedSessionId : null; + const outgoingSessionId = + lastSessionId ?? selectedResumeSessionId ?? options.id; + if (typeof window !== "undefined" && outgoingSessionId) { + window.localStorage.setItem( + "claw.activeSessionId", + outgoingSessionId, + ); + } return { body: { diff --git a/frontend/app/components/assistant-ui/activity-panel.tsx b/frontend/app/components/assistant-ui/activity-panel.tsx index 561f028..8c506e1 100644 --- a/frontend/app/components/assistant-ui/activity-panel.tsx +++ b/frontend/app/components/assistant-ui/activity-panel.tsx @@ -42,6 +42,7 @@ type ActivityContextValue = { mode: "activity" | "files"; selectedId: string | null; sessionId: string | null; + filesRefreshToken: number; openItem: (id: string) => void; openFiles: (sessionId?: string | null) => void; close: () => void; @@ -54,6 +55,7 @@ export function ActivityProvider({ children }: { children: ReactNode }) { const [mode, setMode] = useState<"activity" | "files">("activity"); const [selectedId, setSelectedId] = useState(null); const [sessionId, setSessionId] = useState(null); + const [filesRefreshToken, setFilesRefreshToken] = useState(0); const openItem = useCallback((id: string) => { setMode("activity"); setSelectedId(id); @@ -67,6 +69,7 @@ export function ActivityProvider({ children }: { children: ReactNode }) { ? window.localStorage.getItem("claw.activeSessionId") : null), ); + setFilesRefreshToken((value) => value + 1); setOpen(true); }, []); const close = useCallback(() => setOpen(false), []); @@ -76,11 +79,21 @@ export function ActivityProvider({ children }: { children: ReactNode }) { mode, selectedId, sessionId, + filesRefreshToken, openItem, openFiles, close, }), - [open, mode, selectedId, sessionId, openItem, openFiles, close], + [ + open, + mode, + selectedId, + sessionId, + filesRefreshToken, + openItem, + openFiles, + close, + ], ); return ( @@ -112,8 +125,15 @@ type ActivityItem = { }; export function ActivityPanel() { - const { open, mode, selectedId, sessionId, openItem, close } = - useActivityPanel(); + const { + open, + mode, + selectedId, + sessionId, + filesRefreshToken, + openItem, + close, + } = useActivityPanel(); const messages = useAuiState((s) => s.thread.messages); const items = useMemo(() => collectActivityItems(messages), [messages]); const selectedMessageId = selectedId ? activityMessageId(selectedId) : null; @@ -137,7 +157,13 @@ export function ActivityPanel() { if (!open) return null; if (mode === "files") { - return ; + return ( + + ); } return ( @@ -245,8 +271,17 @@ function SessionFilesPanel({ } } loadFiles(); + const handleRefresh = () => { + loadFiles(); + }; + window.addEventListener("claw-sessions-changed", handleRefresh); + window.addEventListener("claw-session-files-changed", handleRefresh); + window.addEventListener("focus", handleRefresh); return () => { cancelled = true; + window.removeEventListener("claw-sessions-changed", handleRefresh); + window.removeEventListener("claw-session-files-changed", handleRefresh); + window.removeEventListener("focus", handleRefresh); }; }, [sessionId]);