store.ts
1 import Database from 'better-sqlite3' 2 import path from 'path' 3 import type { EvalRun } from './types' 4 import { DATA_DIR } from '../data-dir' 5 6 const DB_PATH = path.join(DATA_DIR, 'eval-runs.db') 7 8 let db: Database.Database | null = null 9 10 function getDb(): Database.Database { 11 if (!db) { 12 db = new Database(DB_PATH) 13 db.pragma('journal_mode = WAL') 14 db.exec(`CREATE TABLE IF NOT EXISTS eval_runs ( 15 id TEXT PRIMARY KEY, 16 data TEXT NOT NULL 17 )`) 18 } 19 return db 20 } 21 22 export function saveEvalRun(run: EvalRun): void { 23 getDb().prepare('INSERT OR REPLACE INTO eval_runs (id, data) VALUES (?, ?)').run(run.id, JSON.stringify(run)) 24 } 25 26 export function getEvalRun(id: string): EvalRun | null { 27 const row = getDb().prepare('SELECT data FROM eval_runs WHERE id = ?').get(id) as { data: string } | undefined 28 return row ? JSON.parse(row.data) as EvalRun : null 29 } 30 31 export function listEvalRuns(limit = 50): EvalRun[] { 32 const rows = getDb().prepare('SELECT data FROM eval_runs ORDER BY rowid DESC LIMIT ?').all(limit) as { data: string }[] 33 return rows.map(r => JSON.parse(r.data) as EvalRun) 34 } 35 36 export function listEvalRunsByAgent(agentId: string, limit = 50): EvalRun[] { 37 return listEvalRuns(limit * 2).filter(r => r.agentId === agentId).slice(0, limit) 38 }