/ src / lib / chat / session-summary.ts
session-summary.ts
 1  import type { Message, Session } from '@/types'
 2  
 3  const MAX_SESSION_SUMMARY_TEXT = 280
 4  
 5  type SessionSummaryLike = Pick<Session, 'messages'> & Partial<Pick<Session, 'messageCount' | 'lastMessageSummary' | 'lastAssistantAt'>>
 6  
 7  export function getSessionMessageCount(session: SessionSummaryLike): number {
 8    if (typeof session.messageCount === 'number' && Number.isFinite(session.messageCount)) {
 9      return session.messageCount
10    }
11    return Array.isArray(session.messages) ? session.messages.length : 0
12  }
13  
14  export function getSessionLastMessage(session: SessionSummaryLike): Message | null {
15    if (session.lastMessageSummary) return session.lastMessageSummary
16    return Array.isArray(session.messages) && session.messages.length > 0
17      ? session.messages[session.messages.length - 1]
18      : null
19  }
20  
21  export function getSessionLastAssistantAt(session: SessionSummaryLike): number | null {
22    if (typeof session.lastAssistantAt === 'number' && Number.isFinite(session.lastAssistantAt)) {
23      return session.lastAssistantAt
24    }
25    if (!Array.isArray(session.messages)) return null
26    for (let index = session.messages.length - 1; index >= 0; index--) {
27      const message = session.messages[index]
28      if (message?.role === 'assistant' && typeof message.time === 'number') {
29        return message.time
30      }
31    }
32    return null
33  }
34  
35  function summarizeMessage(message: Message | null): Message | null {
36    if (!message) return null
37    return {
38      role: message.role,
39      text: typeof message.text === 'string'
40        ? message.text.slice(0, MAX_SESSION_SUMMARY_TEXT)
41        : '',
42      time: message.time,
43      kind: message.kind,
44      source: message.source,
45      suppressed: message.suppressed,
46      streaming: message.streaming,
47      bookmarked: message.bookmarked,
48    }
49  }
50  
51  export function buildSessionListSummary(session: Session): Session {
52    return {
53      ...session,
54      messages: [],
55      messageCount: Array.isArray(session.messages) ? session.messages.length : 0,
56      lastAssistantAt: getSessionLastAssistantAt(session),
57      lastMessageSummary: summarizeMessage(getSessionLastMessage(session)),
58    }
59  }