| 260 | * Get messages for a specific chat session |
| 261 | */ |
| 262 | export function getSegmentMessages( |
| 263 | db: DatabaseAdapter, |
| 264 | segmentId: number, |
| 265 | limit: number = 500 |
| 266 | ): SegmentMessagesData | null { |
| 267 | if (!hasTable(db, 'segment')) return null |
| 268 | |
| 269 | const session = db |
| 270 | .prepare( |
| 271 | `SELECT id, start_ts as startTs, end_ts as endTs, message_count as messageCount |
| 272 | FROM segment WHERE id = ?` |
| 273 | ) |
| 274 | .get(segmentId) as { id: number; startTs: number; endTs: number; messageCount: number } | undefined |
| 275 | |
| 276 | if (!session) return null |
| 277 | |
| 278 | const messages = db |
| 279 | .prepare( |
| 280 | `SELECT m.id, mb.id as senderId, |
| 281 | COALESCE(mb.group_nickname, mb.account_name, mb.platform_id) as senderName, |
| 282 | mb.platform_id as senderPlatformId, |
| 283 | m.content, m.ts as timestamp |
| 284 | FROM message_context mc |
| 285 | JOIN message m ON m.id = mc.message_id |
| 286 | JOIN member mb ON mb.id = m.sender_id |
| 287 | WHERE mc.segment_id = ? ORDER BY m.ts ASC LIMIT ?` |
| 288 | ) |
| 289 | .all(segmentId, limit) as unknown as SessionPreviewMessage[] |
| 290 | |
| 291 | const participantsSet = new Set<string>() |
| 292 | for (const msg of messages) { |
| 293 | participantsSet.add(msg.senderName) |
| 294 | } |
| 295 | |
| 296 | return { |
| 297 | segmentId: session.id, |
| 298 | startTs: session.startTs, |
| 299 | endTs: session.endTs, |
| 300 | messageCount: session.messageCount, |
| 301 | returnedCount: messages.length, |
| 302 | participants: Array.from(participantsSet), |
| 303 | messages, |
| 304 | } |
| 305 | } |
| 306 | |
| 307 | /** |
| 308 | * Get session summaries (only sessions that have AI-generated summaries) |