import type { ReportRoot, PerTaskRow, ScenarioName, } from "@duck/types"; import { SCENARIO_NAMES, SCENARIO_LABELS, SCENARIO_DESCS } from "@duck/types"; export { SCENARIO_NAMES, SCENARIO_LABELS, SCENARIO_DESCS }; export interface RowViewModel extends PerTaskRow { model: string; } export function extractPerTask(report: ReportRoot): RowViewModel[] { return Object.entries(report.models).flatMap(([model, rep]) => rep.perTask.map((row) => ({ ...row, model })), ); } export function modelShort(name: string): string { const [base, ver] = String(name).split(":"); return ver ? `${base}:${ver}` : base; } export type PctTone = "safe" | "warn" | "bad"; export function pctTone(p: number): PctTone { return p >= 70 ? "safe" : p >= 40 ? "warn" : "bad"; } export function getReviewTotals(report: ReportRoot): { reviewed: number; pending: number } { let reviewed = 0; let pending = 0; for (const rep of Object.values(report.models)) { for (const s of SCENARIO_NAMES) { const g = rep.scenarios[s]; if (g) { reviewed += g.reviewed || 0; pending += g.pending || 0; } } } return { reviewed, pending }; } export function scenarioOrder(): ScenarioName[] { return [...SCENARIO_NAMES]; }