// Terminal-style option labels — no emojis, use ASCII prefix chars const OPTION_PREFIX = { slash_prices: '>>', differentiate: '>>', acquire_startup: '>>', accept_deal: '>>', negotiate_terms: '>>', reject_deal: '>>', match_offers: '>>', partial_match: '>>', let_them_leave: '>>', full_compliance: '>>', partial_compliance: '>>', exit_EU_market: '>>', public_apology: '>>', legal_action: '>>', rebrand: '>>', accept_acquisition: '>>', counter_offer: '>>', reject_and_raise: '>>', accept_terms: '>>', negotiate: '>>', bootstrap: '>>', pivot_product: '>>', license_technology: '>>', keep_internal: '>>', full_transparency: '>>', damage_control: '>>', internal_investigation: '>>', ipo: '>>', acquisition: '>>', stay_private: '>>', } export default function AgentDecision({ obs, loading, lastInfo }) { if (!obs) return null const winningDecision = obs.state?.winning_decision ?? null const aiDecision = lastInfo?.winning_decision ?? winningDecision const options = obs.options ?? [] const history = obs.state?.history ?? [] const lastEntry = history[history.length - 1] if (loading && !winningDecision) { return (
Agent Decision
sarah_chen --deliberate
) } return (
Agent Decision
{options.map((opt) => { const isAiPick = opt === aiDecision const isWinner = opt === winningDecision const isMatch = aiDecision === winningDecision let cls = 'decision-option' if (isAiPick) cls += ' ai-pick' if (isWinner && winningDecision) cls += ` board-winner ${isMatch ? 'board-match' : 'board-mismatch'}` return (
{opt.replace(/_/g, '_')}
) })}
{winningDecision && aiDecision && aiDecision !== winningDecision && (
[WARN] AI outvoted → board chose: {winningDecision.replace(/_/g, '_')}
)} {lastEntry && (
Coalition Pitch Log
{lastEntry.pitch_used ? `targeting [${Object.entries(lastEntry.pitch_scores ?? {}) .filter(([, v]) => v > 0) .map(([r]) => r) .join(', ')}] — keyword-optimised pitch sent.` : 'no pitch sent this round.'}
)}
) }