import { type Model, type InsertModel, type BenchmarkResult, type InsertBenchmarkResult, type LeaderboardScore, type InsertLeaderboardScore, type TaskDefinition, type InsertTaskDefinition, type Evaluator, type InsertEvaluator, } from "@shared/schema"; import { readJsonl, writeJsonl, nextId } from "./jsonl"; const COLLECTIONS = { models: "models", benchmarkResults: "benchmark_results", leaderboardScores: "leaderboard_scores", taskDefinitions: "task_definitions", evaluators: "evaluators", } as const; export interface IStorage { getModels(): Promise; getModelById(id: number): Promise; getModelByName(name: string): Promise; createModel(model: InsertModel): Promise; deleteModel(id: number): Promise; getBenchmarkResults(modelId: number): Promise; createBenchmarkResult(result: InsertBenchmarkResult): Promise; getBenchmarkResultsByModel(modelId: number): Promise; getLeaderboardScores(tab?: string): Promise; createLeaderboardScore(score: InsertLeaderboardScore): Promise; getTaskDefinitions(): Promise; getTaskDefinitionByName(name: string): Promise; createTaskDefinition(task: InsertTaskDefinition): Promise; getEvaluators(): Promise; getEvaluatorById(id: number): Promise; createEvaluator(data: InsertEvaluator): Promise; updateEvaluator(id: number, data: Partial): Promise; deleteEvaluator(id: number): Promise; } export class JsonlStorage implements IStorage { async getModels(): Promise { return readJsonl(COLLECTIONS.models); } async getModelById(id: number): Promise { return (await this.getModels()).find((model) => model.id === id); } async getModelByName(name: string): Promise { return (await this.getModels()).find((model) => model.name === name); } async createModel(model: InsertModel): Promise { const models = await this.getModels(); if (models.some((existing) => existing.name === model.name)) { throw new Error(`Model already exists: ${model.name}`); } const created: Model = { ...model, id: nextId(models) }; writeJsonl(COLLECTIONS.models, [...models, created]); return created; } async deleteModel(id: number): Promise { const models = await this.getModels(); writeJsonl( COLLECTIONS.models, models.filter((model) => model.id !== id), ); const results = readJsonl(COLLECTIONS.benchmarkResults); writeJsonl( COLLECTIONS.benchmarkResults, results.filter((result) => result.modelId !== id), ); const scores = readJsonl(COLLECTIONS.leaderboardScores); writeJsonl( COLLECTIONS.leaderboardScores, scores.filter((score) => score.modelId !== id), ); } async getBenchmarkResults(modelId: number): Promise { return readJsonl(COLLECTIONS.benchmarkResults) .filter((result) => result.modelId === modelId) .sort((a, b) => a.taskName.localeCompare(b.taskName)); } async createBenchmarkResult(result: InsertBenchmarkResult): Promise { const results = readJsonl(COLLECTIONS.benchmarkResults); const created: BenchmarkResult = { ...result, id: nextId(results) }; writeJsonl(COLLECTIONS.benchmarkResults, [...results, created]); return created; } async getBenchmarkResultsByModel(modelId: number): Promise { return this.getBenchmarkResults(modelId); } async getLeaderboardScores(tab?: string): Promise { const scores = readJsonl(COLLECTIONS.leaderboardScores); return tab ? scores.filter((score) => score.tab === tab) : scores; } async createLeaderboardScore(score: InsertLeaderboardScore): Promise { const scores = readJsonl(COLLECTIONS.leaderboardScores); const created: LeaderboardScore = { ...score, id: nextId(scores) }; writeJsonl(COLLECTIONS.leaderboardScores, [...scores, created]); return created; } async getTaskDefinitions(): Promise { return readJsonl(COLLECTIONS.taskDefinitions).sort((a, b) => a.id - b.id); } async getTaskDefinitionByName(name: string): Promise { return (await this.getTaskDefinitions()).find((task) => task.name === name); } async createTaskDefinition(task: InsertTaskDefinition): Promise { const tasks = readJsonl(COLLECTIONS.taskDefinitions); const created: TaskDefinition = { ...task, id: nextId(tasks) }; writeJsonl(COLLECTIONS.taskDefinitions, [...tasks, created]); return created; } async getEvaluators(): Promise { return readJsonl(COLLECTIONS.evaluators); } async getEvaluatorById(id: number): Promise { return (await this.getEvaluators()).find((evaluator) => evaluator.id === id); } async createEvaluator(data: InsertEvaluator): Promise { const evaluators = readJsonl(COLLECTIONS.evaluators); const created: Evaluator = { ...data, id: nextId(evaluators) }; writeJsonl(COLLECTIONS.evaluators, [...evaluators, created]); return created; } async updateEvaluator(id: number, data: Partial): Promise { const evaluators = readJsonl(COLLECTIONS.evaluators); const index = evaluators.findIndex((evaluator) => evaluator.id === id); if (index < 0) return undefined; const updated: Evaluator = { ...evaluators[index], ...data }; evaluators[index] = updated; writeJsonl(COLLECTIONS.evaluators, evaluators); return updated; } async deleteEvaluator(id: number): Promise { const evaluators = readJsonl(COLLECTIONS.evaluators); writeJsonl( COLLECTIONS.evaluators, evaluators.filter((evaluator) => evaluator.id !== id), ); } } export const storage = new JsonlStorage();