Files
rubber-duck-mcp/apps/web/src/lib/reports.ts
T

49 lines
1.2 KiB
TypeScript

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];
}