| 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<string, unknown> | |
| } | |
| 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 | |