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 }