@deepagents/evals 7.3.0 → 7.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,YAAY,EAGb,MAAM,aAAa,CAAC;AAMrB,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,UAAU,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,cAAe,SAAQ,OAAO;IAC7C,MAAM,EAAE,KAAK,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;CAC9E;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,QAAA,MAAM,YAAY,6CAA8C,CAAC;AAEjE,KAAK,SAAS,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAyL/C,qBAAa,QAAQ;;gBA6CP,QAAQ,CAAC,EAAE,MAAM,GAAG,YAAY;IAyB5C,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ;IASnC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAS1C,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAI3C,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAIzC,SAAS,CAAC,GAAG,EAAE;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAClC,GAAG,MAAM;IAgBV,SAAS,CACP,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,WAAW,GAAG,QAAQ,EAC9B,OAAO,CAAC,EAAE,UAAU,GACnB,IAAI;IAMP,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI;IA0BlC,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI;IAerC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAKzC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE;IAWpC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE;IAQlC,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,SAAM,GAAG,cAAc,EAAE;IAiCjE,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,SAAM,GAAG,UAAU;IA6DzD,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IASnD,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAkB1E,UAAU,IAAI,QAAQ,EAAE;IAOxB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS;IAiBtD,WAAW,IAAI,SAAS,EAAE;IAO1B,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAS5C,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAI9B,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAa1B,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAI3B,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;CAG9B"}
@@ -1,5 +1,6 @@
1
1
  // packages/evals/src/store/index.ts
2
2
  import { Declaration } from "@zukhruf/sqlite-drift";
3
+ import { open } from "@zukhruf/sqlite-open";
3
4
  import { transaction } from "@zukhruf/sqlite-transaction";
4
5
  import { mkdirSync } from "node:fs";
5
6
  import { dirname } from "node:path";
@@ -218,12 +219,10 @@ var RunStore = class {
218
219
  } else {
219
220
  const dbPath = pathOrDb ?? ".evals/store.db";
220
221
  mkdirSync(dirname(dbPath), { recursive: true });
221
- this.#db = new DatabaseSync(dbPath);
222
+ this.#db = open(dbPath);
222
223
  }
223
224
  this.#db.exec(`
224
- PRAGMA journal_mode = WAL;
225
225
  PRAGMA synchronous = NORMAL;
226
- PRAGMA busy_timeout = 5000;
227
226
  `);
228
227
  const runsTable = this.#get(
229
228
  { name: "text" },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/store/index.ts", "../../src/store/ddl.sqlite.ts"],
4
- "sourcesContent": ["import { Declaration } from '@zukhruf/sqlite-drift';\nimport { transaction } from '@zukhruf/sqlite-transaction';\nimport { mkdirSync } from 'node:fs';\nimport { dirname } from 'node:path';\nimport {\n DatabaseSync,\n type SQLInputValue,\n type SQLOutputValue,\n} from 'node:sqlite';\n\nimport { statements } from './ddl.sqlite.ts';\n\nconst schema = new Declaration(statements, { rows: 'keep' });\n\nexport interface SuiteRow {\n id: string;\n name: string;\n created_at: number;\n}\n\nexport interface RunRow {\n id: string;\n suite_id: string;\n name: string;\n model: string;\n config: Record<string, unknown> | null;\n started_at: number;\n finished_at: number | null;\n status: RunStatus;\n summary: RunSummary | null;\n}\n\nexport interface CaseRow {\n id: string;\n run_id: string;\n idx: number;\n input: unknown;\n output: string | null;\n expected: unknown | null;\n latency_ms: number | null;\n tokens_in: number | null;\n tokens_out: number | null;\n error: string | null;\n}\n\nexport interface CaseWithScores extends CaseRow {\n scores: Array<{ scorer_name: string; score: number; reason: string | null }>;\n}\n\nexport interface ScoreRow {\n id: string;\n case_id: string;\n scorer_name: string;\n score: number;\n reason: string | null;\n}\n\nexport interface RunSummary {\n totalCases: number;\n passCount: number;\n failCount: number;\n meanScores: Record<string, number>;\n totalLatencyMs: number;\n totalTokensIn: number;\n totalTokensOut: number;\n}\n\nexport interface PromptRow {\n id: string;\n name: string;\n version: number;\n content: string;\n created_at: number;\n}\n\nexport interface CaseData {\n id: string;\n run_id: string;\n idx: number;\n input: unknown;\n output: string | null;\n expected?: unknown;\n latency_ms: number;\n tokens_in: number;\n tokens_out: number;\n error?: string;\n}\n\nexport interface ScoreData {\n id: string;\n case_id: string;\n scorer_name: string;\n score: number;\n reason?: string;\n}\n\nconst RUN_STATUSES = ['running', 'completed', 'failed'] as const;\n\ntype RunStatus = (typeof RUN_STATUSES)[number];\n\nfunction isRunStatus(value: string): value is RunStatus {\n return RUN_STATUSES.some((status) => status === value);\n}\n\ntype SqlRow = Record<string, SQLOutputValue>;\n\n/** What node:sqlite returns for each kind of column the store reads. */\ninterface ColumnTypes {\n text: string;\n 'text?': string | null;\n number: number;\n 'number?': number | null;\n}\n\ntype ColumnType = keyof ColumnTypes;\n\ntype Columns = Readonly<Record<string, ColumnType>>;\n\ntype RowOf<C extends Columns> = { -readonly [K in keyof C]: ColumnTypes[C[K]] };\n\nfunction matchesColumn(\n value: SQLOutputValue | undefined,\n type: ColumnType,\n): boolean {\n switch (type) {\n case 'text':\n return typeof value === 'string';\n case 'text?':\n return value === null || typeof value === 'string';\n case 'number':\n return typeof value === 'number';\n case 'number?':\n return value === null || typeof value === 'number';\n }\n}\n\nfunction mismatchedColumns(row: SqlRow, columns: Columns): string[] {\n return Object.entries(columns)\n .filter(([name, type]) => !matchesColumn(row[name], type))\n .map(([name]) => name);\n}\n\nfunction hasColumns<C extends Columns>(\n row: SqlRow,\n columns: C,\n): row is SqlRow & RowOf<C> {\n return mismatchedColumns(row, columns).length === 0;\n}\n\nfunction readRow<C extends Columns>(\n row: SqlRow,\n columns: C,\n sql: string,\n): RowOf<C> {\n if (hasColumns(row, columns)) return row;\n throw new TypeError(\n `Unexpected values in columns ${mismatchedColumns(row, columns).join(', ')} of a row from: ${oneLine(sql)}`,\n );\n}\n\nfunction oneLine(sql: string): string {\n return sql.replace(/\\s+/g, ' ').trim();\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isRunSummary(value: unknown): value is RunSummary {\n return (\n isRecord(value) &&\n typeof value.totalCases === 'number' &&\n typeof value.passCount === 'number' &&\n typeof value.failCount === 'number' &&\n typeof value.totalLatencyMs === 'number' &&\n typeof value.totalTokensIn === 'number' &&\n typeof value.totalTokensOut === 'number' &&\n isRecord(value.meanScores) &&\n Object.values(value.meanScores).every((score) => typeof score === 'number')\n );\n}\n\nfunction parseJson<T>(\n text: string,\n guard: (value: unknown) => value is T,\n source: string,\n): T {\n const value: unknown = JSON.parse(text);\n if (guard(value)) return value;\n throw new TypeError(`Unexpected JSON in ${source}`);\n}\n\nconst suiteColumns = {\n id: 'text',\n name: 'text',\n created_at: 'number',\n} as const;\n\nconst runColumns = {\n id: 'text',\n suite_id: 'text',\n name: 'text',\n model: 'text',\n config: 'text?',\n started_at: 'number',\n finished_at: 'number?',\n status: 'text',\n summary: 'text?',\n} as const;\n\nconst caseColumns = {\n id: 'text',\n run_id: 'text',\n idx: 'number',\n input: 'text',\n output: 'text?',\n expected: 'text?',\n latency_ms: 'number?',\n tokens_in: 'number?',\n tokens_out: 'number?',\n error: 'text?',\n} as const;\n\nconst promptColumns = {\n id: 'text',\n name: 'text',\n version: 'number',\n content: 'text',\n created_at: 'number',\n} as const;\n\nfunction toSuite(row: RowOf<typeof suiteColumns>): SuiteRow {\n return { id: row.id, name: row.name, created_at: row.created_at };\n}\n\nfunction toRun(row: RowOf<typeof runColumns>): RunRow {\n if (!isRunStatus(row.status)) {\n throw new TypeError(`Unexpected status \"${row.status}\" of run ${row.id}`);\n }\n return {\n id: row.id,\n suite_id: row.suite_id,\n name: row.name,\n model: row.model,\n config: row.config\n ? parseJson(row.config, isRecord, `config of run ${row.id}`)\n : null,\n started_at: row.started_at,\n finished_at: row.finished_at,\n status: row.status,\n summary: row.summary\n ? parseJson(row.summary, isRunSummary, `summary of run ${row.id}`)\n : null,\n };\n}\n\nfunction toCase(row: RowOf<typeof caseColumns>): CaseRow {\n const input: unknown = JSON.parse(row.input);\n const expected: unknown = row.expected ? JSON.parse(row.expected) : null;\n return {\n id: row.id,\n run_id: row.run_id,\n idx: row.idx,\n input,\n output: row.output,\n expected,\n latency_ms: row.latency_ms,\n tokens_in: row.tokens_in,\n tokens_out: row.tokens_out,\n error: row.error,\n };\n}\n\nfunction toPrompt(row: RowOf<typeof promptColumns>): PromptRow {\n return {\n id: row.id,\n name: row.name,\n version: row.version,\n content: row.content,\n created_at: row.created_at,\n };\n}\n\nexport class RunStore {\n #db: DatabaseSync;\n #statements = new Map<string, ReturnType<DatabaseSync['prepare']>>();\n\n #stmt(sql: string): ReturnType<DatabaseSync['prepare']> {\n let stmt = this.#statements.get(sql);\n if (!stmt) {\n stmt = this.#db.prepare(sql);\n this.#statements.set(sql, stmt);\n }\n return stmt;\n }\n\n #get<const C extends Columns>(\n columns: C,\n sql: string,\n ...params: SQLInputValue[]\n ): RowOf<C> | undefined {\n const row = this.#stmt(sql).get(...params);\n return row === undefined ? undefined : readRow(row, columns, sql);\n }\n\n /** Reads an aggregate query, which returns exactly one row. */\n #one<const C extends Columns>(\n columns: C,\n sql: string,\n ...params: SQLInputValue[]\n ): RowOf<C> {\n const row = this.#get(columns, sql, ...params);\n if (row === undefined) {\n throw new Error(`Expected one row from: ${oneLine(sql)}`);\n }\n return row;\n }\n\n #all<const C extends Columns>(\n columns: C,\n sql: string,\n ...params: SQLInputValue[]\n ): RowOf<C>[] {\n return this.#stmt(sql)\n .all(...params)\n .map((row) => readRow(row, columns, sql));\n }\n\n constructor(pathOrDb?: string | DatabaseSync) {\n if (pathOrDb instanceof DatabaseSync) {\n this.#db = pathOrDb;\n } else {\n const dbPath = pathOrDb ?? '.evals/store.db';\n mkdirSync(dirname(dbPath), { recursive: true });\n this.#db = new DatabaseSync(dbPath);\n }\n this.#db.exec(`\n PRAGMA journal_mode = WAL;\n PRAGMA synchronous = NORMAL;\n PRAGMA busy_timeout = 5000;\n `);\n const runsTable = this.#get(\n { name: 'text' },\n \"SELECT name FROM sqlite_schema WHERE type = 'table' AND name = 'runs'\",\n );\n if (runsTable !== undefined) {\n // Runs from layouts before suite_id was required have no suite. With\n // foreign keys on, deleting them also deletes their cases and scores.\n this.#db.exec(\n 'DELETE FROM runs WHERE suite_id IS NULL OR NOT EXISTS (SELECT 1 FROM suites WHERE suites.id = runs.suite_id)',\n );\n }\n schema.apply(this.#db);\n }\n\n createSuite(name: string): SuiteRow {\n const id = crypto.randomUUID();\n const now = Date.now();\n this.#stmt(\n 'INSERT INTO suites (id, name, created_at) VALUES (?, ?, ?)',\n ).run(id, name, now);\n return { id, name, created_at: now };\n }\n\n getSuite(id: string): SuiteRow | undefined {\n const row = this.#get(\n suiteColumns,\n 'SELECT * FROM suites WHERE id = ?',\n id,\n );\n return row ? toSuite(row) : undefined;\n }\n\n renameSuite(id: string, name: string): void {\n this.#stmt('UPDATE suites SET name = ? WHERE id = ?').run(name, id);\n }\n\n renameRun(id: string, name: string): void {\n this.#stmt('UPDATE runs SET name = ? WHERE id = ?').run(name, id);\n }\n\n createRun(run: {\n suite_id: string;\n name: string;\n model: string;\n config?: Record<string, unknown>;\n }): string {\n const id = crypto.randomUUID();\n const now = Date.now();\n this.#stmt(\n 'INSERT INTO runs (id, suite_id, name, model, config, started_at) VALUES (?, ?, ?, ?, ?, ?)',\n ).run(\n id,\n run.suite_id,\n run.name,\n run.model,\n run.config ? JSON.stringify(run.config) : null,\n now,\n );\n return id;\n }\n\n finishRun(\n runId: string,\n status: 'completed' | 'failed',\n summary?: RunSummary,\n ): void {\n this.#stmt(\n 'UPDATE runs SET finished_at = ?, status = ?, summary = ? WHERE id = ?',\n ).run(Date.now(), status, summary ? JSON.stringify(summary) : null, runId);\n }\n\n saveCases(cases: CaseData[]): void {\n transaction(\n this.#db,\n () => {\n const stmt = this.#stmt(\n 'INSERT INTO cases (id, run_id, idx, input, output, expected, latency_ms, tokens_in, tokens_out, error) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)',\n );\n for (const c of cases) {\n stmt.run(\n c.id,\n c.run_id,\n c.idx,\n JSON.stringify(c.input),\n c.output,\n c.expected != null ? JSON.stringify(c.expected) : null,\n c.latency_ms,\n c.tokens_in,\n c.tokens_out,\n c.error ?? null,\n );\n }\n },\n { mode: 'deferred' },\n );\n }\n\n saveScores(scores: ScoreData[]): void {\n transaction(\n this.#db,\n () => {\n const stmt = this.#stmt(\n 'INSERT INTO scores (id, case_id, scorer_name, score, reason) VALUES (?, ?, ?, ?, ?)',\n );\n for (const s of scores) {\n stmt.run(s.id, s.case_id, s.scorer_name, s.score, s.reason ?? null);\n }\n },\n { mode: 'deferred' },\n );\n }\n\n getRun(runId: string): RunRow | undefined {\n const row = this.#get(runColumns, 'SELECT * FROM runs WHERE id = ?', runId);\n return row ? toRun(row) : undefined;\n }\n\n listRuns(suiteId?: string): RunRow[] {\n const rows = suiteId\n ? this.#all(\n runColumns,\n 'SELECT * FROM runs WHERE suite_id = ? ORDER BY started_at',\n suiteId,\n )\n : this.#all(runColumns, 'SELECT * FROM runs ORDER BY started_at');\n return rows.map(toRun);\n }\n\n getCases(runId: string): CaseRow[] {\n return this.#all(\n caseColumns,\n 'SELECT * FROM cases WHERE run_id = ? ORDER BY idx',\n runId,\n ).map(toCase);\n }\n\n getFailingCases(runId: string, threshold = 0.5): CaseWithScores[] {\n const rows = this.#all(\n {\n ...caseColumns,\n scorer_name: 'text',\n score: 'number',\n score_reason: 'text?',\n },\n `SELECT c.*, s.scorer_name, s.score, s.reason as score_reason\n FROM cases c\n JOIN scores s ON s.case_id = c.id\n WHERE c.run_id = ? AND s.score < ?\n ORDER BY c.idx`,\n runId,\n threshold,\n );\n\n const caseMap = new Map<string, CaseWithScores>();\n for (const row of rows) {\n let c = caseMap.get(row.id);\n if (!c) {\n c = { ...toCase(row), scores: [] };\n caseMap.set(row.id, c);\n }\n c.scores.push({\n scorer_name: row.scorer_name,\n score: row.score,\n reason: row.score_reason,\n });\n }\n return Array.from(caseMap.values());\n }\n\n getRunSummary(runId: string, threshold = 0.5): RunSummary {\n const totals = this.#one(\n {\n totalCases: 'number',\n totalLatencyMs: 'number',\n totalTokensIn: 'number',\n totalTokensOut: 'number',\n },\n `SELECT\n COUNT(DISTINCT c.id) as totalCases,\n COALESCE(SUM(c.latency_ms), 0) as totalLatencyMs,\n COALESCE(SUM(c.tokens_in), 0) as totalTokensIn,\n COALESCE(SUM(c.tokens_out), 0) as totalTokensOut\n FROM cases c WHERE c.run_id = ?`,\n runId,\n );\n\n const scorerMeans = this.#all(\n { scorer_name: 'text', meanScore: 'number' },\n `SELECT s.scorer_name, AVG(s.score) as meanScore\n FROM scores s\n JOIN cases c ON c.id = s.case_id\n WHERE c.run_id = ?\n GROUP BY s.scorer_name`,\n runId,\n );\n\n const meanScores: Record<string, number> = {};\n for (const row of scorerMeans) {\n meanScores[row.scorer_name] = row.meanScore;\n }\n\n const passFail = this.#all(\n { id: 'text', minScore: 'number' },\n `SELECT c.id,\n MIN(s.score) as minScore\n FROM cases c\n JOIN scores s ON s.case_id = c.id\n WHERE c.run_id = ?\n GROUP BY c.id`,\n runId,\n );\n\n let passCount = 0;\n let failCount = 0;\n for (const row of passFail) {\n if (row.minScore >= threshold) passCount++;\n else failCount++;\n }\n\n return {\n totalCases: totals.totalCases,\n passCount,\n failCount,\n meanScores,\n totalLatencyMs: totals.totalLatencyMs,\n totalTokensIn: totals.totalTokensIn,\n totalTokensOut: totals.totalTokensOut,\n };\n }\n\n findSuiteByName(name: string): SuiteRow | undefined {\n const row = this.#get(\n suiteColumns,\n 'SELECT * FROM suites WHERE name = ? ORDER BY created_at DESC LIMIT 1',\n name,\n );\n return row ? toSuite(row) : undefined;\n }\n\n getLatestCompletedRun(suiteId: string, model?: string): RunRow | undefined {\n const row = model\n ? this.#get(\n runColumns,\n 'SELECT * FROM runs WHERE suite_id = ? AND status = ? AND model = ? ORDER BY started_at DESC LIMIT 1',\n suiteId,\n 'completed',\n model,\n )\n : this.#get(\n runColumns,\n 'SELECT * FROM runs WHERE suite_id = ? AND status = ? ORDER BY started_at DESC LIMIT 1',\n suiteId,\n 'completed',\n );\n return row ? toRun(row) : undefined;\n }\n\n listSuites(): SuiteRow[] {\n return this.#all(\n suiteColumns,\n 'SELECT * FROM suites ORDER BY created_at DESC',\n ).map(toSuite);\n }\n\n createPrompt(name: string, content: string): PromptRow {\n const id = crypto.randomUUID();\n const now = Date.now();\n\n const { latestVersion } = this.#one(\n { latestVersion: 'number?' },\n 'SELECT MAX(version) as latestVersion FROM prompts WHERE name = ?',\n name,\n );\n const version = (latestVersion ?? 0) + 1;\n\n this.#stmt(\n 'INSERT INTO prompts (id, name, version, content, created_at) VALUES (?, ?, ?, ?, ?)',\n ).run(id, name, version, content, now);\n return { id, name, version, content, created_at: now };\n }\n\n listPrompts(): PromptRow[] {\n return this.#all(\n promptColumns,\n 'SELECT * FROM prompts ORDER BY name COLLATE NOCASE ASC, version DESC',\n ).map(toPrompt);\n }\n\n getPrompt(id: string): PromptRow | undefined {\n const row = this.#get(\n promptColumns,\n 'SELECT * FROM prompts WHERE id = ?',\n id,\n );\n return row ? toPrompt(row) : undefined;\n }\n\n deletePrompt(id: string): void {\n this.#stmt('DELETE FROM prompts WHERE id = ?').run(id);\n }\n\n resetRun(id: string): void {\n transaction(\n this.#db,\n () => {\n this.#stmt('DELETE FROM cases WHERE run_id = ?').run(id);\n this.#stmt(\n 'UPDATE runs SET status = ?, started_at = ?, finished_at = NULL, summary = NULL WHERE id = ?',\n ).run('running', Date.now(), id);\n },\n { mode: 'deferred' },\n );\n }\n\n deleteRun(id: string): void {\n this.#stmt('DELETE FROM runs WHERE id = ?').run(id);\n }\n\n deleteSuite(id: string): void {\n this.#stmt('DELETE FROM suites WHERE id = ?').run(id);\n }\n}\n", "export const statements = [\n `CREATE TABLE suites (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)\n)`,\n `CREATE TABLE runs (\n id TEXT PRIMARY KEY,\n suite_id TEXT NOT NULL,\n name TEXT NOT NULL,\n model TEXT NOT NULL,\n config TEXT,\n started_at INTEGER NOT NULL,\n finished_at INTEGER,\n status TEXT NOT NULL DEFAULT 'running' CHECK(status IN ('running', 'completed', 'failed')),\n summary TEXT,\n FOREIGN KEY (suite_id) REFERENCES suites(id) ON DELETE CASCADE\n)`,\n `CREATE INDEX idx_runs_suite_id ON runs(suite_id)`,\n `CREATE INDEX idx_runs_started_at ON runs(started_at)`,\n `CREATE TABLE cases (\n id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL,\n idx INTEGER NOT NULL,\n input TEXT NOT NULL,\n output TEXT,\n expected TEXT,\n latency_ms INTEGER,\n tokens_in INTEGER,\n tokens_out INTEGER,\n error TEXT,\n FOREIGN KEY (run_id) REFERENCES runs(id) ON DELETE CASCADE\n)`,\n `CREATE INDEX idx_cases_run_id ON cases(run_id)`,\n `CREATE TABLE scores (\n id TEXT PRIMARY KEY,\n case_id TEXT NOT NULL,\n scorer_name TEXT NOT NULL,\n score REAL NOT NULL,\n reason TEXT,\n FOREIGN KEY (case_id) REFERENCES cases(id) ON DELETE CASCADE\n)`,\n `CREATE INDEX idx_scores_case_id ON scores(case_id)`,\n `CREATE TABLE prompts (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n version INTEGER NOT NULL DEFAULT 1,\n content TEXT NOT NULL,\n created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000),\n UNIQUE(name, version)\n)`,\n `CREATE INDEX idx_prompts_created_at ON prompts(created_at)`,\n `CREATE INDEX idx_prompts_name_version ON prompts(name, version DESC)`,\n];\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Declaration } from '@zukhruf/sqlite-drift';\nimport { open } from '@zukhruf/sqlite-open';\nimport { transaction } from '@zukhruf/sqlite-transaction';\nimport { mkdirSync } from 'node:fs';\nimport { dirname } from 'node:path';\nimport {\n DatabaseSync,\n type SQLInputValue,\n type SQLOutputValue,\n} from 'node:sqlite';\n\nimport { statements } from './ddl.sqlite.ts';\n\nconst schema = new Declaration(statements, { rows: 'keep' });\n\nexport interface SuiteRow {\n id: string;\n name: string;\n created_at: number;\n}\n\nexport interface RunRow {\n id: string;\n suite_id: string;\n name: string;\n model: string;\n config: Record<string, unknown> | null;\n started_at: number;\n finished_at: number | null;\n status: RunStatus;\n summary: RunSummary | null;\n}\n\nexport interface CaseRow {\n id: string;\n run_id: string;\n idx: number;\n input: unknown;\n output: string | null;\n expected: unknown | null;\n latency_ms: number | null;\n tokens_in: number | null;\n tokens_out: number | null;\n error: string | null;\n}\n\nexport interface CaseWithScores extends CaseRow {\n scores: Array<{ scorer_name: string; score: number; reason: string | null }>;\n}\n\nexport interface ScoreRow {\n id: string;\n case_id: string;\n scorer_name: string;\n score: number;\n reason: string | null;\n}\n\nexport interface RunSummary {\n totalCases: number;\n passCount: number;\n failCount: number;\n meanScores: Record<string, number>;\n totalLatencyMs: number;\n totalTokensIn: number;\n totalTokensOut: number;\n}\n\nexport interface PromptRow {\n id: string;\n name: string;\n version: number;\n content: string;\n created_at: number;\n}\n\nexport interface CaseData {\n id: string;\n run_id: string;\n idx: number;\n input: unknown;\n output: string | null;\n expected?: unknown;\n latency_ms: number;\n tokens_in: number;\n tokens_out: number;\n error?: string;\n}\n\nexport interface ScoreData {\n id: string;\n case_id: string;\n scorer_name: string;\n score: number;\n reason?: string;\n}\n\nconst RUN_STATUSES = ['running', 'completed', 'failed'] as const;\n\ntype RunStatus = (typeof RUN_STATUSES)[number];\n\nfunction isRunStatus(value: string): value is RunStatus {\n return RUN_STATUSES.some((status) => status === value);\n}\n\ntype SqlRow = Record<string, SQLOutputValue>;\n\n/** What node:sqlite returns for each kind of column the store reads. */\ninterface ColumnTypes {\n text: string;\n 'text?': string | null;\n number: number;\n 'number?': number | null;\n}\n\ntype ColumnType = keyof ColumnTypes;\n\ntype Columns = Readonly<Record<string, ColumnType>>;\n\ntype RowOf<C extends Columns> = { -readonly [K in keyof C]: ColumnTypes[C[K]] };\n\nfunction matchesColumn(\n value: SQLOutputValue | undefined,\n type: ColumnType,\n): boolean {\n switch (type) {\n case 'text':\n return typeof value === 'string';\n case 'text?':\n return value === null || typeof value === 'string';\n case 'number':\n return typeof value === 'number';\n case 'number?':\n return value === null || typeof value === 'number';\n }\n}\n\nfunction mismatchedColumns(row: SqlRow, columns: Columns): string[] {\n return Object.entries(columns)\n .filter(([name, type]) => !matchesColumn(row[name], type))\n .map(([name]) => name);\n}\n\nfunction hasColumns<C extends Columns>(\n row: SqlRow,\n columns: C,\n): row is SqlRow & RowOf<C> {\n return mismatchedColumns(row, columns).length === 0;\n}\n\nfunction readRow<C extends Columns>(\n row: SqlRow,\n columns: C,\n sql: string,\n): RowOf<C> {\n if (hasColumns(row, columns)) return row;\n throw new TypeError(\n `Unexpected values in columns ${mismatchedColumns(row, columns).join(', ')} of a row from: ${oneLine(sql)}`,\n );\n}\n\nfunction oneLine(sql: string): string {\n return sql.replace(/\\s+/g, ' ').trim();\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isRunSummary(value: unknown): value is RunSummary {\n return (\n isRecord(value) &&\n typeof value.totalCases === 'number' &&\n typeof value.passCount === 'number' &&\n typeof value.failCount === 'number' &&\n typeof value.totalLatencyMs === 'number' &&\n typeof value.totalTokensIn === 'number' &&\n typeof value.totalTokensOut === 'number' &&\n isRecord(value.meanScores) &&\n Object.values(value.meanScores).every((score) => typeof score === 'number')\n );\n}\n\nfunction parseJson<T>(\n text: string,\n guard: (value: unknown) => value is T,\n source: string,\n): T {\n const value: unknown = JSON.parse(text);\n if (guard(value)) return value;\n throw new TypeError(`Unexpected JSON in ${source}`);\n}\n\nconst suiteColumns = {\n id: 'text',\n name: 'text',\n created_at: 'number',\n} as const;\n\nconst runColumns = {\n id: 'text',\n suite_id: 'text',\n name: 'text',\n model: 'text',\n config: 'text?',\n started_at: 'number',\n finished_at: 'number?',\n status: 'text',\n summary: 'text?',\n} as const;\n\nconst caseColumns = {\n id: 'text',\n run_id: 'text',\n idx: 'number',\n input: 'text',\n output: 'text?',\n expected: 'text?',\n latency_ms: 'number?',\n tokens_in: 'number?',\n tokens_out: 'number?',\n error: 'text?',\n} as const;\n\nconst promptColumns = {\n id: 'text',\n name: 'text',\n version: 'number',\n content: 'text',\n created_at: 'number',\n} as const;\n\nfunction toSuite(row: RowOf<typeof suiteColumns>): SuiteRow {\n return { id: row.id, name: row.name, created_at: row.created_at };\n}\n\nfunction toRun(row: RowOf<typeof runColumns>): RunRow {\n if (!isRunStatus(row.status)) {\n throw new TypeError(`Unexpected status \"${row.status}\" of run ${row.id}`);\n }\n return {\n id: row.id,\n suite_id: row.suite_id,\n name: row.name,\n model: row.model,\n config: row.config\n ? parseJson(row.config, isRecord, `config of run ${row.id}`)\n : null,\n started_at: row.started_at,\n finished_at: row.finished_at,\n status: row.status,\n summary: row.summary\n ? parseJson(row.summary, isRunSummary, `summary of run ${row.id}`)\n : null,\n };\n}\n\nfunction toCase(row: RowOf<typeof caseColumns>): CaseRow {\n const input: unknown = JSON.parse(row.input);\n const expected: unknown = row.expected ? JSON.parse(row.expected) : null;\n return {\n id: row.id,\n run_id: row.run_id,\n idx: row.idx,\n input,\n output: row.output,\n expected,\n latency_ms: row.latency_ms,\n tokens_in: row.tokens_in,\n tokens_out: row.tokens_out,\n error: row.error,\n };\n}\n\nfunction toPrompt(row: RowOf<typeof promptColumns>): PromptRow {\n return {\n id: row.id,\n name: row.name,\n version: row.version,\n content: row.content,\n created_at: row.created_at,\n };\n}\n\nexport class RunStore {\n #db: DatabaseSync;\n #statements = new Map<string, ReturnType<DatabaseSync['prepare']>>();\n\n #stmt(sql: string): ReturnType<DatabaseSync['prepare']> {\n let stmt = this.#statements.get(sql);\n if (!stmt) {\n stmt = this.#db.prepare(sql);\n this.#statements.set(sql, stmt);\n }\n return stmt;\n }\n\n #get<const C extends Columns>(\n columns: C,\n sql: string,\n ...params: SQLInputValue[]\n ): RowOf<C> | undefined {\n const row = this.#stmt(sql).get(...params);\n return row === undefined ? undefined : readRow(row, columns, sql);\n }\n\n /** Reads an aggregate query, which returns exactly one row. */\n #one<const C extends Columns>(\n columns: C,\n sql: string,\n ...params: SQLInputValue[]\n ): RowOf<C> {\n const row = this.#get(columns, sql, ...params);\n if (row === undefined) {\n throw new Error(`Expected one row from: ${oneLine(sql)}`);\n }\n return row;\n }\n\n #all<const C extends Columns>(\n columns: C,\n sql: string,\n ...params: SQLInputValue[]\n ): RowOf<C>[] {\n return this.#stmt(sql)\n .all(...params)\n .map((row) => readRow(row, columns, sql));\n }\n\n constructor(pathOrDb?: string | DatabaseSync) {\n if (pathOrDb instanceof DatabaseSync) {\n this.#db = pathOrDb;\n } else {\n const dbPath = pathOrDb ?? '.evals/store.db';\n mkdirSync(dirname(dbPath), { recursive: true });\n this.#db = open(dbPath);\n }\n this.#db.exec(`\n PRAGMA synchronous = NORMAL;\n `);\n const runsTable = this.#get(\n { name: 'text' },\n \"SELECT name FROM sqlite_schema WHERE type = 'table' AND name = 'runs'\",\n );\n if (runsTable !== undefined) {\n // Runs from layouts before suite_id was required have no suite. With\n // foreign keys on, deleting them also deletes their cases and scores.\n this.#db.exec(\n 'DELETE FROM runs WHERE suite_id IS NULL OR NOT EXISTS (SELECT 1 FROM suites WHERE suites.id = runs.suite_id)',\n );\n }\n schema.apply(this.#db);\n }\n\n createSuite(name: string): SuiteRow {\n const id = crypto.randomUUID();\n const now = Date.now();\n this.#stmt(\n 'INSERT INTO suites (id, name, created_at) VALUES (?, ?, ?)',\n ).run(id, name, now);\n return { id, name, created_at: now };\n }\n\n getSuite(id: string): SuiteRow | undefined {\n const row = this.#get(\n suiteColumns,\n 'SELECT * FROM suites WHERE id = ?',\n id,\n );\n return row ? toSuite(row) : undefined;\n }\n\n renameSuite(id: string, name: string): void {\n this.#stmt('UPDATE suites SET name = ? WHERE id = ?').run(name, id);\n }\n\n renameRun(id: string, name: string): void {\n this.#stmt('UPDATE runs SET name = ? WHERE id = ?').run(name, id);\n }\n\n createRun(run: {\n suite_id: string;\n name: string;\n model: string;\n config?: Record<string, unknown>;\n }): string {\n const id = crypto.randomUUID();\n const now = Date.now();\n this.#stmt(\n 'INSERT INTO runs (id, suite_id, name, model, config, started_at) VALUES (?, ?, ?, ?, ?, ?)',\n ).run(\n id,\n run.suite_id,\n run.name,\n run.model,\n run.config ? JSON.stringify(run.config) : null,\n now,\n );\n return id;\n }\n\n finishRun(\n runId: string,\n status: 'completed' | 'failed',\n summary?: RunSummary,\n ): void {\n this.#stmt(\n 'UPDATE runs SET finished_at = ?, status = ?, summary = ? WHERE id = ?',\n ).run(Date.now(), status, summary ? JSON.stringify(summary) : null, runId);\n }\n\n saveCases(cases: CaseData[]): void {\n transaction(\n this.#db,\n () => {\n const stmt = this.#stmt(\n 'INSERT INTO cases (id, run_id, idx, input, output, expected, latency_ms, tokens_in, tokens_out, error) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)',\n );\n for (const c of cases) {\n stmt.run(\n c.id,\n c.run_id,\n c.idx,\n JSON.stringify(c.input),\n c.output,\n c.expected != null ? JSON.stringify(c.expected) : null,\n c.latency_ms,\n c.tokens_in,\n c.tokens_out,\n c.error ?? null,\n );\n }\n },\n { mode: 'deferred' },\n );\n }\n\n saveScores(scores: ScoreData[]): void {\n transaction(\n this.#db,\n () => {\n const stmt = this.#stmt(\n 'INSERT INTO scores (id, case_id, scorer_name, score, reason) VALUES (?, ?, ?, ?, ?)',\n );\n for (const s of scores) {\n stmt.run(s.id, s.case_id, s.scorer_name, s.score, s.reason ?? null);\n }\n },\n { mode: 'deferred' },\n );\n }\n\n getRun(runId: string): RunRow | undefined {\n const row = this.#get(runColumns, 'SELECT * FROM runs WHERE id = ?', runId);\n return row ? toRun(row) : undefined;\n }\n\n listRuns(suiteId?: string): RunRow[] {\n const rows = suiteId\n ? this.#all(\n runColumns,\n 'SELECT * FROM runs WHERE suite_id = ? ORDER BY started_at',\n suiteId,\n )\n : this.#all(runColumns, 'SELECT * FROM runs ORDER BY started_at');\n return rows.map(toRun);\n }\n\n getCases(runId: string): CaseRow[] {\n return this.#all(\n caseColumns,\n 'SELECT * FROM cases WHERE run_id = ? ORDER BY idx',\n runId,\n ).map(toCase);\n }\n\n getFailingCases(runId: string, threshold = 0.5): CaseWithScores[] {\n const rows = this.#all(\n {\n ...caseColumns,\n scorer_name: 'text',\n score: 'number',\n score_reason: 'text?',\n },\n `SELECT c.*, s.scorer_name, s.score, s.reason as score_reason\n FROM cases c\n JOIN scores s ON s.case_id = c.id\n WHERE c.run_id = ? AND s.score < ?\n ORDER BY c.idx`,\n runId,\n threshold,\n );\n\n const caseMap = new Map<string, CaseWithScores>();\n for (const row of rows) {\n let c = caseMap.get(row.id);\n if (!c) {\n c = { ...toCase(row), scores: [] };\n caseMap.set(row.id, c);\n }\n c.scores.push({\n scorer_name: row.scorer_name,\n score: row.score,\n reason: row.score_reason,\n });\n }\n return Array.from(caseMap.values());\n }\n\n getRunSummary(runId: string, threshold = 0.5): RunSummary {\n const totals = this.#one(\n {\n totalCases: 'number',\n totalLatencyMs: 'number',\n totalTokensIn: 'number',\n totalTokensOut: 'number',\n },\n `SELECT\n COUNT(DISTINCT c.id) as totalCases,\n COALESCE(SUM(c.latency_ms), 0) as totalLatencyMs,\n COALESCE(SUM(c.tokens_in), 0) as totalTokensIn,\n COALESCE(SUM(c.tokens_out), 0) as totalTokensOut\n FROM cases c WHERE c.run_id = ?`,\n runId,\n );\n\n const scorerMeans = this.#all(\n { scorer_name: 'text', meanScore: 'number' },\n `SELECT s.scorer_name, AVG(s.score) as meanScore\n FROM scores s\n JOIN cases c ON c.id = s.case_id\n WHERE c.run_id = ?\n GROUP BY s.scorer_name`,\n runId,\n );\n\n const meanScores: Record<string, number> = {};\n for (const row of scorerMeans) {\n meanScores[row.scorer_name] = row.meanScore;\n }\n\n const passFail = this.#all(\n { id: 'text', minScore: 'number' },\n `SELECT c.id,\n MIN(s.score) as minScore\n FROM cases c\n JOIN scores s ON s.case_id = c.id\n WHERE c.run_id = ?\n GROUP BY c.id`,\n runId,\n );\n\n let passCount = 0;\n let failCount = 0;\n for (const row of passFail) {\n if (row.minScore >= threshold) passCount++;\n else failCount++;\n }\n\n return {\n totalCases: totals.totalCases,\n passCount,\n failCount,\n meanScores,\n totalLatencyMs: totals.totalLatencyMs,\n totalTokensIn: totals.totalTokensIn,\n totalTokensOut: totals.totalTokensOut,\n };\n }\n\n findSuiteByName(name: string): SuiteRow | undefined {\n const row = this.#get(\n suiteColumns,\n 'SELECT * FROM suites WHERE name = ? ORDER BY created_at DESC LIMIT 1',\n name,\n );\n return row ? toSuite(row) : undefined;\n }\n\n getLatestCompletedRun(suiteId: string, model?: string): RunRow | undefined {\n const row = model\n ? this.#get(\n runColumns,\n 'SELECT * FROM runs WHERE suite_id = ? AND status = ? AND model = ? ORDER BY started_at DESC LIMIT 1',\n suiteId,\n 'completed',\n model,\n )\n : this.#get(\n runColumns,\n 'SELECT * FROM runs WHERE suite_id = ? AND status = ? ORDER BY started_at DESC LIMIT 1',\n suiteId,\n 'completed',\n );\n return row ? toRun(row) : undefined;\n }\n\n listSuites(): SuiteRow[] {\n return this.#all(\n suiteColumns,\n 'SELECT * FROM suites ORDER BY created_at DESC',\n ).map(toSuite);\n }\n\n createPrompt(name: string, content: string): PromptRow {\n const id = crypto.randomUUID();\n const now = Date.now();\n\n const { latestVersion } = this.#one(\n { latestVersion: 'number?' },\n 'SELECT MAX(version) as latestVersion FROM prompts WHERE name = ?',\n name,\n );\n const version = (latestVersion ?? 0) + 1;\n\n this.#stmt(\n 'INSERT INTO prompts (id, name, version, content, created_at) VALUES (?, ?, ?, ?, ?)',\n ).run(id, name, version, content, now);\n return { id, name, version, content, created_at: now };\n }\n\n listPrompts(): PromptRow[] {\n return this.#all(\n promptColumns,\n 'SELECT * FROM prompts ORDER BY name COLLATE NOCASE ASC, version DESC',\n ).map(toPrompt);\n }\n\n getPrompt(id: string): PromptRow | undefined {\n const row = this.#get(\n promptColumns,\n 'SELECT * FROM prompts WHERE id = ?',\n id,\n );\n return row ? toPrompt(row) : undefined;\n }\n\n deletePrompt(id: string): void {\n this.#stmt('DELETE FROM prompts WHERE id = ?').run(id);\n }\n\n resetRun(id: string): void {\n transaction(\n this.#db,\n () => {\n this.#stmt('DELETE FROM cases WHERE run_id = ?').run(id);\n this.#stmt(\n 'UPDATE runs SET status = ?, started_at = ?, finished_at = NULL, summary = NULL WHERE id = ?',\n ).run('running', Date.now(), id);\n },\n { mode: 'deferred' },\n );\n }\n\n deleteRun(id: string): void {\n this.#stmt('DELETE FROM runs WHERE id = ?').run(id);\n }\n\n deleteSuite(id: string): void {\n this.#stmt('DELETE FROM suites WHERE id = ?').run(id);\n }\n}\n", "export const statements = [\n `CREATE TABLE suites (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)\n)`,\n `CREATE TABLE runs (\n id TEXT PRIMARY KEY,\n suite_id TEXT NOT NULL,\n name TEXT NOT NULL,\n model TEXT NOT NULL,\n config TEXT,\n started_at INTEGER NOT NULL,\n finished_at INTEGER,\n status TEXT NOT NULL DEFAULT 'running' CHECK(status IN ('running', 'completed', 'failed')),\n summary TEXT,\n FOREIGN KEY (suite_id) REFERENCES suites(id) ON DELETE CASCADE\n)`,\n `CREATE INDEX idx_runs_suite_id ON runs(suite_id)`,\n `CREATE INDEX idx_runs_started_at ON runs(started_at)`,\n `CREATE TABLE cases (\n id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL,\n idx INTEGER NOT NULL,\n input TEXT NOT NULL,\n output TEXT,\n expected TEXT,\n latency_ms INTEGER,\n tokens_in INTEGER,\n tokens_out INTEGER,\n error TEXT,\n FOREIGN KEY (run_id) REFERENCES runs(id) ON DELETE CASCADE\n)`,\n `CREATE INDEX idx_cases_run_id ON cases(run_id)`,\n `CREATE TABLE scores (\n id TEXT PRIMARY KEY,\n case_id TEXT NOT NULL,\n scorer_name TEXT NOT NULL,\n score REAL NOT NULL,\n reason TEXT,\n FOREIGN KEY (case_id) REFERENCES cases(id) ON DELETE CASCADE\n)`,\n `CREATE INDEX idx_scores_case_id ON scores(case_id)`,\n `CREATE TABLE prompts (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n version INTEGER NOT NULL DEFAULT 1,\n content TEXT NOT NULL,\n created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000),\n UNIQUE(name, version)\n)`,\n `CREATE INDEX idx_prompts_created_at ON prompts(created_at)`,\n `CREATE INDEX idx_prompts_name_version ON prompts(name, version DESC)`,\n];\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deepagents/evals",
3
- "version": "7.3.0",
3
+ "version": "7.4.0",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -76,8 +76,9 @@
76
76
  "access": "public"
77
77
  },
78
78
  "dependencies": {
79
- "@zukhruf/sqlite-drift": "^0.6.0",
80
- "@zukhruf/sqlite-transaction": "^0.6.0",
79
+ "@zukhruf/sqlite-drift": "^0.6.15",
80
+ "@zukhruf/sqlite-open": "^0.7.0",
81
+ "@zukhruf/sqlite-transaction": "^0.6.15",
81
82
  "chalk": "^5.6.2",
82
83
  "openai": "^6.48.0",
83
84
  "p-memoize": "^8.0.0"