/ src / lib / server / eval / store.ts
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  }