"use client"; import type { Observation, EventItem } from "../lib/types"; const AGENT_ROLES: Record = { S0: "COORDINATOR", S1: "OBSERVER", S2: "EXECUTOR", S3: "FLAGGED", S4: "VALIDATOR", }; type Props = { observation: Observation | null; trustDeltas: Record; activeSpec: string | null; events: EventItem[]; running: boolean; totalReward: number; }; function trustClass(t: number) { if (t >= 0.65) return "high"; if (t >= 0.35) return "mid"; return "low"; } function trustColor(t: number) { if (t >= 0.65) return "var(--green)"; if (t >= 0.35) return "var(--amber)"; return "var(--red)"; } export default function AgentTrustMonitor({ observation, trustDeltas, activeSpec, events, running, totalReward, }: Props) { const agents = observation?.available_specialists || observation?.available_workers || ["S0", "S1", "S2", "S3", "S4"]; const trust = observation?.trust_snapshot ?? {}; const lastReward = observation?.last_reward ?? 0; // detect adversarial from events const poisonedAgents = new Set( events.filter(e => e.outcome === "poisoned" || e.outcome === "blocked") .map(e => e.specialist).filter(Boolean) ); // mean trust const vals = agents.map(id => trust[id] ?? 0.5); const meanTrust = vals.length ? vals.reduce((a, b) => a + b, 0) / vals.length : 0.5; const advRatio = agents.length ? Math.round((poisonedAgents.size / agents.length) * 100) : 0; return (
AGENT TRUST REGISTRY
{agents.map(id => { const t = trust[id] ?? 0.5; const delta = trustDeltas[id] ?? 0; const isActive = activeSpec === id; const isAdv = poisonedAgents.has(id); const role = AGENT_ROLES[id] ?? "AGENT"; return (
{id} // {isAdv ? "⚠ FLAGGED" : role} {t.toFixed(2)}
{isAdv ? "STATE: ADVERSARIAL // ISOLATED" : isActive ? "STATE: ACTIVE // DELEGATING" : `STATE: READY // Δ ${delta >= 0 ? "+" : ""}${delta.toFixed(3)}` }
); })}
MEAN TRUST {meanTrust.toFixed(3)}
ADV RATIO {advRatio}%
STEP REWARD = 0 ? "g" : "r"}`}> {lastReward >= 0 ? "+" : ""}{lastReward.toFixed(3)}
TOTAL REWARD = 0 ? "g" : "r"}`}> {totalReward >= 0 ? "+" : ""}{totalReward.toFixed(2)}
); }