import { type D1, newId, queryDb } from "./db"; export interface SessionEvent { id: string; session_id: string; task_id: string; event_type: string; event_data: any; created_at: string; } export async function createSessionEvent( db: D1, event: { session_id: string; task_id: string; event_type: string; event_data: any }, ): Promise { const id = newId(); const now = new Date().toISOString(); const dataStr = JSON.stringify(event.event_data); await queryDb(db, "INSERT INTO session_events (id, session_id, task_id, event_type, event_data, created_at) VALUES ($1, $2, $3, $4, $5, $6)", [ id, event.session_id, event.task_id, event.event_type, dataStr, now, ]); return { id, session_id: event.session_id, task_id: event.task_id, event_type: event.event_type, event_data: event.event_data, created_at: now, }; } export async function createSessionEventsBatch( db: D1, sessionId: string, taskId: string, events: Array<{ type: string; data: unknown; timestamp?: string }>, ): Promise { if (events.length === 0) return 0; let count = 0; for (const event of events) { const id = newId(); const now = event.timestamp || new Date().toISOString(); const dataStr = JSON.stringify(event.data); await queryDb(db, "INSERT INTO session_events (id, session_id, task_id, event_type, event_data, created_at) VALUES ($1, $2, $3, $4, $5, $6)", [ id, sessionId, taskId, event.type, dataStr, now, ]); count++; } return count; } export async function listSessionEvents(db: D1, taskId: string, sessionId?: string, since?: string): Promise { let queryStr = "SELECT id, session_id, task_id, event_type, event_data, created_at FROM session_events WHERE task_id = $1"; const params: unknown[] = [taskId]; if (sessionId) { params.push(sessionId); queryStr += ` AND session_id = $${params.length}`; } if (since) { params.push(since); queryStr += ` AND created_at > $${params.length}`; } queryStr += " ORDER BY created_at ASC"; const res = await queryDb(db, queryStr, params); return res.rows.map((row: any) => { let event_data = row.event_data; if (typeof event_data === "string") { try { event_data = JSON.parse(event_data); } catch { // Leave as-is } } return { id: row.id, session_id: row.session_id, task_id: row.task_id, event_type: row.event_type, event_data, created_at: row.created_at, }; }); }