import type { Template } from "@/lib/contract/schema"; import { activityRecap, describeLink, evaluate, formatDateTime, formatDay, statusAt, summarize } from "@/lib/engine"; import { contractHref } from "@/lib/routes"; import { ApprovalCard, Receipt, RiskSummary, TraceEvent, cx } from "@/design-system"; export interface ActivityRecapProps { template: Template; /** Fixed snapshot instant, parsed by the engine. Never the browser clock. */ now: number; className?: string; } /** A read-only composition of the existing activity patterns, using the supplied note. */ export function ActivityRecap({ template, now, className }: ActivityRecapProps) { const run = evaluate(template.contract, template.fixture); const recap = activityRecap(run, now); const editorHref = contractHref(template.id); return (

{template.runs} / {template.fixture.title}

A little household catch-up.

As of {formatDateTime(now)}

{recap.empty ?

{recap.emptyMessage}

: (

Latest activity

{recap.groups.map(({ day, events }) => (

{formatDay(day)}

{events.map((event) => )}
))}
{recap.openAsk ? : null} {recap.unattendedReceipt ? (

Latest itemised receipt ยท Done on its own

) : null}
)}
); }