import { TraceSpan, TraceStep, VisualGrounding } from "@/lib/api"; const STATUS_META: Record = { success: { icon: "✓", cls: "text-ok", bar: "bg-brand" }, warning: { icon: "!", cls: "text-warn", bar: "bg-warn" }, failed: { icon: "✕", cls: "text-bad", bar: "bg-bad" }, skipped: { icon: "–", cls: "text-fg3", bar: "bg-edge2" }, running: { icon: "…", cls: "text-brand", bar: "bg-brand" }, pending: { icon: "○", cls: "text-fg3", bar: "bg-edge2" }, }; const RISK_CLS: Record = { none: "text-ok", low: "text-ok", medium: "text-warn", high: "text-bad", }; function _vgSteps(vg: VisualGrounding): Array<{ label: string; status: string; detail: string }> { const nH = vg.highlights.length; const nC = vg.claim_grounding.length; const hasImg = vg.highlights.some((h) => h.page_image_url); const imgCount = vg.highlights.filter((h) => h.page_image_url).length; return [ { label: "Visual metadata lookup", status: nH > 0 ? "success" : "warning", detail: `${nH} citation${nH !== 1 ? "s" : ""} resolved`, }, { label: "Grounding resolver", status: vg.visual_grounding_available ? "success" : "warning", detail: `stage: ${vg.grounding_stage}`, }, { label: "Page image cache", status: hasImg ? "success" : "skipped", detail: hasImg ? `${imgCount} page${imgCount !== 1 ? "s" : ""} ready` : "no images cached", }, { label: "Claim alignment", status: nC > 0 ? "success" : "skipped", detail: `${nC} claim${nC !== 1 ? "s" : ""} analysed`, }, ]; } export interface TraceMeta { route?: string; status?: string; confidence?: number; coverage?: number; elapsedMs?: number; phoenixUrl?: string | null; } function Stat({ label, value, cls }: { label: string; value: string; cls?: string }) { return (
{label}
{value}
); } function PhoenixCard({ url }: { url?: string | null }) { if (url) { return (

Open in Phoenix

Full OpenTelemetry trace & spans

live ↗
); } return (

Phoenix tracing

not connected

Set AURALYNQ_TELEMETRY__PHOENIX_ENDPOINT and start the Phoenix container to view full distributed traces.

); } export function TracePanel({ trace, steps, meta, visualGrounding, }: { trace: TraceSpan[]; steps?: TraceStep[]; meta?: TraceMeta; visualGrounding?: VisualGrounding | null; }) { // Prefer structured steps; fall back to raw spans so old payloads still render. const rows: TraceStep[] = steps && steps.length ? steps : (trace || []).map((s, i) => ({ id: i, name: s.name, label: s.name, status: "success" as const, duration_ms: s.duration_ms, provider: (s.attributes?.provider as string) || null, evidence_count: null, warnings: [], attributes: s.attributes || {}, })); if (!rows.length) return (
📊

Run a query to see the trace.

Every step — intent, retrieval, graph expansion, reranking, sufficiency, generation — with status, latency and provider.

); const max = Math.max(...rows.map((s) => s.duration_ms), 1); const total = rows.reduce((a, s) => a + s.duration_ms, 0); const bucket = (...keys: string[]) => rows .filter((s) => keys.some((k) => s.name.toLowerCase().includes(k))) .reduce((a, s) => a + s.duration_ms, 0); const retrieval = bucket("retriev", "pathrag", "fus", "rerank"); const generation = bucket("synthes"); const abstained = meta?.status === "insufficient_evidence"; const conf = meta?.confidence ?? 0; const cov = meta?.coverage ?? 0; const risk = abstained ? "none" : conf >= 0.6 && cov >= 0.6 ? "low" : conf >= 0.4 ? "medium" : "high"; return (
{/* summary dashboard */}
route · {meta?.route || "—"} {abstained ? "abstained" : "answered"}
{/* step timeline / waterfall */}
    {rows.map((s) => { const sm = STATUS_META[s.status] || STATUS_META.success; return (
  1. {sm.icon} {s.label} {s.duration_ms.toFixed(1)}ms
    {(s.provider || s.evidence_count != null || (s.warnings && s.warnings.length > 0)) && (
    {s.provider && provider · {s.provider}} {s.evidence_count != null && ( evidence · {s.evidence_count} )} {s.warnings?.map((w, j) => ( {String(w).slice(0, 40)} ))}
    )}
  2. ); })}
{/* Visual grounding pipeline steps */} {visualGrounding && (

Visual Grounding Pipeline

{visualGrounding.grounding_stage}
    {_vgSteps(visualGrounding).map((step, i) => { const sm = STATUS_META[step.status] || STATUS_META.success; return (
  1. {sm.icon} {step.label} {step.detail}
  2. ); })}
{visualGrounding.warnings.length > 0 && (

{visualGrounding.warnings[0]}

)}
)}
); }