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