/** Compact, accessible HUX-01 activity timeline. The feature is default-off. */ import { Activity, AlertTriangle, Check, GitBranch, ListChecks, LoaderCircle, } from "lucide-react"; import { useMemo, useState } from "react"; import { activityTimelineEnabled, mergeActivityEvents, normalizeCancellationReceipt, surfacePolicy, } from "./model.ts"; import type { ActivityItem, CancellationReceipt, HuxSurface, RawActivityEvent, RawCancellationReceipt, } from "./types.ts"; interface ActivityTimelineProps { conversationId: string; events: readonly RawActivityEvent[]; flags?: Iterable; surface: HuxSurface; status?: "connecting" | "live" | "reconnecting" | "complete"; cancellationReceipts?: readonly RawCancellationReceipt[]; onRetry?: () => void; } const PHASE_LABELS: Readonly> = { intent: "Intent", action: "Action", evidence: "Evidence", delegation: "Delegation", decision: "Decision", completion: "Complete", failure: "Failed", }; function PhaseIcon({ item }: { item: ActivityItem }) { if (item.phase === "failure") return ; if (item.phase === "completion") return ; if (item.phase === "delegation") return ; if (item.phase === "decision") return ; return ; } function TimelineRow({ item, expanded, }: { item: ActivityItem; expanded: boolean; }) { return (
  • {PHASE_LABELS[item.phase]}

    {item.summary}

    {expanded && item.evidence.length > 0 && (
      {item.evidence.map((evidence, index) => (
    • {evidence.label}
    • ))}
    )}
  • ); } function CancellationCard({ receipt }: { receipt: CancellationReceipt }) { const complete = receipt.outcome !== "failed_to_cancel"; return ( ); } /** Render nothing unless both HUX-11 and HUX-01 have been explicitly enabled. */ export function ActivityTimeline({ conversationId, events, flags, surface, status = "live", cancellationReceipts = [], onRetry, }: ActivityTimelineProps) { const [showAll, setShowAll] = useState(false); const enabled = activityTimelineEnabled(flags); const policy = surfacePolicy(surface); const result = useMemo( () => mergeActivityEvents([], events, conversationId, surface), [conversationId, events, surface], ); const receipts = useMemo( () => cancellationReceipts .map((receipt) => normalizeCancellationReceipt(receipt, surface)) .filter((receipt): receipt is CancellationReceipt => receipt !== null) .slice(-3), [cancellationReceipts, surface], ); if (!enabled) return null; const hidden = Math.max(0, result.items.length - policy.initialItems); const visible = showAll ? result.items : result.items.slice(-policy.initialItems); const reconnecting = status === "connecting" || status === "reconnecting"; return (

    What Hermes is doing

    {reconnecting ? "Reconnecting to durable activity…" : `${result.items.length} recorded update${result.items.length === 1 ? "" : "s"}`}

    {reconnecting && ( )}
    {(result.conflicts > 0 || result.invalid > 0) && (
    Some unsafe or conflicting activity was ignored. Visible history was not rewritten.
    )}
      {visible.map((item) => ( ))}
    {result.items.length === 0 && (

    No activity has been recorded yet.

    )} {hidden > 0 && !showAll && ( )} {showAll && hidden > 0 && ( )} {reconnecting && onRetry && ( )} {receipts.map((receipt) => ( ))}
    ); }