import { useCallback } from 'react' import { getSessionAPI, getAllSessionsAPI } from '@/api/os' import { useStore } from '../store' import { toast } from 'sonner' import { ChatMessage, ToolCall, ReasoningMessage, ChatEntry } from '@/types/os' import { getJsonMarkdown } from '@/lib/utils' interface SessionResponse { session_id: string agent_id: string user_id: string | null runs?: ChatEntry[] memory: { runs?: ChatEntry[] chats?: ChatEntry[] } agent_data: Record } interface LoaderArgs { entityType: 'agent' | 'team' | null agentId?: string | null teamId?: string | null dbId: string | null } const useSessionLoader = () => { const setMessages = useStore((state) => state.setMessages) const selectedEndpoint = useStore((state) => state.selectedEndpoint) const setIsSessionsLoading = useStore((state) => state.setIsSessionsLoading) const setSessionsData = useStore((state) => state.setSessionsData) const getSessions = useCallback( async ({ entityType, agentId, teamId, dbId }: LoaderArgs) => { const selectedId = entityType === 'agent' ? agentId : teamId if (!selectedEndpoint || !entityType || !selectedId || !dbId) return try { setIsSessionsLoading(true) const sessions = await getAllSessionsAPI( selectedEndpoint, entityType, selectedId, dbId ) console.log('Fetched sessions:', sessions) setSessionsData(sessions.data ?? []) } catch { toast.error('Error loading sessions') setSessionsData([]) } finally { setIsSessionsLoading(false) } }, [selectedEndpoint, setSessionsData, setIsSessionsLoading] ) const getSession = useCallback( async ( { entityType, agentId, teamId, dbId }: LoaderArgs, sessionId: string ) => { const selectedId = entityType === 'agent' ? agentId : teamId if ( !selectedEndpoint || !sessionId || !entityType || !selectedId || !dbId ) return console.log(entityType) try { const response: SessionResponse = await getSessionAPI( selectedEndpoint, entityType, sessionId, dbId ) console.log('Fetched session:', response) if (response) { if (Array.isArray(response)) { const messagesFor = response.flatMap((run) => { const filteredMessages: ChatMessage[] = [] if (run) { filteredMessages.push({ role: 'user', content: run.run_input ?? '', created_at: run.created_at }) } if (run) { const toolCalls = [ ...(run.tools ?? []), ...(run.extra_data?.reasoning_messages ?? []).reduce( (acc: ToolCall[], msg: ReasoningMessage) => { if (msg.role === 'tool') { acc.push({ role: msg.role, content: msg.content, tool_call_id: msg.tool_call_id ?? '', tool_name: msg.tool_name ?? '', tool_args: msg.tool_args ?? {}, tool_call_error: msg.tool_call_error ?? false, metrics: msg.metrics ?? { time: 0 }, created_at: msg.created_at ?? Math.floor(Date.now() / 1000) }) } return acc }, [] ) ] filteredMessages.push({ role: 'agent', content: (run.content as string) ?? '', tool_calls: toolCalls.length > 0 ? toolCalls : undefined, extra_data: run.extra_data, images: run.images, videos: run.videos, audio: run.audio, response_audio: run.response_audio, created_at: run.created_at }) } return filteredMessages }) const processedMessages = messagesFor.map( (message: ChatMessage) => { if (Array.isArray(message.content)) { const textContent = message.content .filter((item: { type: string }) => item.type === 'text') .map((item) => item.text) .join(' ') return { ...message, content: textContent } } if (typeof message.content !== 'string') { return { ...message, content: getJsonMarkdown(message.content) } } return message } ) setMessages(processedMessages) return processedMessages } } } catch { return null } }, [selectedEndpoint, setMessages] ) return { getSession, getSessions } } export default useSessionLoader