import type { StartupPhaseItem } from "./types"; import { useOpenGeniText, type OpenGeniText } from "../messages/runtime"; const LABELS = (t: OpenGeniText): Record => ({ queue: t("timeline.startupTimings.workerQueue"), sandbox: t("timeline.startupTimings.sandbox"), rig: t("timeline.startupTimings.sandboxEnvironment"), repository: t("timeline.startupTimings.repository"), files: t("timeline.startupTimings.files"), tools: t("timeline.startupTimings.tools"), model_preparation: t("timeline.startupTimings.runtimeModelRequest"), provider_first_byte: t("timeline.startupTimings.firstModelResponse"), }); export function StartupTimings({ phases }: { phases: StartupPhaseItem[] }) { const t = useOpenGeniText(); if (!phases.length) return (

{t("timeline.startupTimings.noStartupTimingsRecordedYet")}

); const byTurn = new Map(); for (const phase of phases) { const group = byTurn.get(phase.turnId) ?? []; group.push(phase); byTurn.set(phase.turnId, group); } const turns = [...byTurn.entries()] .map(([turnId, turnPhases]) => ({ turnId, phases: turnPhases, startedAt: turnPhases.reduce( (earliest, phase) => (phase.startedAt < earliest ? phase.startedAt : earliest), turnPhases[0]!.startedAt, ), })) .sort((a, b) => b.startedAt.localeCompare(a.startedAt)); return (

{t("timeline.startupTimings.eachTurnHasItsOwn")}

{turns.map((turn, index) => ( ))}
); } function StartupTurn({ turnId, phases, startedAt, latest, }: { turnId: string | null; phases: StartupPhaseItem[]; startedAt: string; latest: boolean; }) { const t = useOpenGeniText(); const failed = phases.some((phase) => phase.status === "failed"); const status = failed ? t("timeline.startupTimings.failed") : phases.some((phase) => phase.status === "running") ? t("timeline.startupTimings.inProgress") : phases.some((phase) => phase.status === "cancelled") ? t("timeline.startupTimings.interrupted") : t("timeline.startupTimings.ready"); return (
{turnId === null ? t("timeline.startupTimings.unassignedEvents") : latest ? t("timeline.startupTimings.latestTurn") : t("timeline.startupTimings.earlierTurn")} {new Date(startedAt).toLocaleTimeString(t.locale, { hour: "2-digit", minute: "2-digit", second: "2-digit", })} {status} {turnId ?? t("timeline.startupTimings.noTurnIdRecorded")}

{t("timeline.startupTimings.started")}{" "}

{phases.map((phase) => ( ))}
{t("timeline.startupTimings.startupPhasesFor")}{" "} {turnId ?? t("timeline.startupTimings.unassignedEvents2")}
{t("timeline.startupTimings.phase")} {t("timeline.startupTimings.status")} {t("timeline.startupTimings.duration")}
{LABELS(t)[phase.phase]} {phase.status === "running" ? t("timeline.startupTimings.inProgress") : phase.status} {phase.durationMs === null ? "—" : phase.durationMs < 1000 ? t("timeline.startupTimings.roundMs", { round: Math.round(phase.durationMs), }) : `${(phase.durationMs / 1000).toFixed(1)} s`}
); }