Zayne Rea Sprague
Initial deploy: aggregate trace visualizer
8b41737
import type { DatasetInfo, QuestionData } from "../types";
interface InfoBarProps {
activeDatasets: DatasetInfo[];
questionIdx: number;
sampleIdx: number;
getQuestionData: (dsId: string) => QuestionData | undefined;
}
export default function InfoBar({ activeDatasets, questionIdx, sampleIdx, getQuestionData }: InfoBarProps) {
let questionText = "";
let nSamples = 0;
const firstData = activeDatasets.length > 0 ? getQuestionData(activeDatasets[0].id) : undefined;
if (firstData) {
questionText = firstData.question;
nSamples = firstData.n_samples;
}
if (!questionText) {
return (
<div className="px-4 py-3 border-b border-gray-700 bg-gray-900/80">
<p className="text-sm text-gray-500 italic">Load repos and select a question to begin</p>
</div>
);
}
return (
<div className="px-4 py-3 border-b border-gray-700 bg-gray-900/80">
{/* Question text */}
<div className="text-sm text-gray-200 font-medium mb-2 leading-relaxed max-h-24 overflow-y-auto">
Q{questionIdx}: {questionText}
</div>
{/* Sample bar */}
{nSamples > 1 && (
<div className="flex items-center gap-1 flex-wrap">
<span className="text-[10px] text-gray-500 mr-1">Samples:</span>
{Array.from({ length: nSamples }, (_, i) => {
const results = activeDatasets.map((ds) => {
const d = getQuestionData(ds.id);
return d?.eval_correct[i];
});
const allCorrect = results.every((r) => r === true);
const someCorrect = results.some((r) => r === true);
const noneCorrect = results.every((r) => r === false);
let bgColor = "bg-gray-700";
if (allCorrect) bgColor = "bg-green-700";
else if (someCorrect) bgColor = "bg-yellow-700";
else if (noneCorrect) bgColor = "bg-red-900";
const isSelected = i === sampleIdx;
return (
<span
key={i}
className={`inline-block w-4 h-4 rounded-sm text-[9px] text-center leading-4 font-mono ${bgColor} ${
isSelected ? "ring-2 ring-blue-400 ring-offset-1 ring-offset-gray-900" : ""
}`}
title={`Sample ${i + 1}: ${results.map((r, j) => `${activeDatasets[j]?.name}=${r ? "correct" : "wrong"}`).join(", ")}`}
>
{i + 1}
</span>
);
})}
<span className="text-[10px] text-gray-600 ml-2">
<span className="inline-block w-2.5 h-2.5 rounded-sm bg-green-700 mr-0.5 align-middle" /> all
<span className="inline-block w-2.5 h-2.5 rounded-sm bg-yellow-700 mr-0.5 ml-1.5 align-middle" /> some
<span className="inline-block w-2.5 h-2.5 rounded-sm bg-red-900 mr-0.5 ml-1.5 align-middle" /> none
</span>
</div>
)}
{/* Per-repo correctness for current sample */}
<div className="flex items-center gap-3 mt-1.5 flex-wrap">
{activeDatasets.map((ds) => {
const d = getQuestionData(ds.id);
const correct = d?.eval_correct[sampleIdx];
return (
<span key={ds.id} className="text-[11px]">
<span className="text-gray-500">{ds.name}: </span>
<span className={correct ? "text-green-400" : "text-red-400"}>
{correct === undefined ? "?" : correct ? "Correct" : "Wrong"}
</span>
</span>
);
})}
</div>
</div>
);
}