import { type HTMLAttributes, type ReactNode } from 'react';
/** A corpus stat shown in the header (e.g. `{ value: 5, label: 'care plans' }`). */
export interface EntitySummaryStat {
value: string | number;
label: string;
}
/** One narrative section — a heading over a list of bullet items. */
export interface EntitySummarySection {
id: string;
heading: string;
/**
* Leading glyph for the section. On default sections it's the scannability
* anchor shown in a `--primary`-tinted medallion beside the heading (e.g. a
* calendar for "Scheduled", a wallet for "Financial"); omit it to render no
* medallion. On `attention` sections it overrides the warning Alert's icon
* (which defaults to an alert triangle).
*/
icon?: ReactNode;
/**
* `attention` renders the section as the kit's warning `Alert` — the
* standard risk-flag treatment (border, warning surface, alert glyph,
* `--warning-foreground` text) — for clinically important callouts.
*/
tone?: 'default' | 'attention';
/** Bullet items — `ReactNode` so consumers compose inline entity links. */
items: ReactNode[];
}
/**
* Curated agent handle for EntitySummary. Exposes structural state only —
* never the entity name or the section items (both PHI). See
* `entity-summary.agent.ts`.
*/
export interface EntitySummaryHandle {
/** Structural snapshot — generated-at + section ids/headings/tone/count. No PHI. */
getState: () => {
generatedAtIso?: string;
sections: Array<{
id: string;
heading: string;
tone: 'default' | 'attention';
itemCount: number;
}>;
};
/** Whether the regenerate affordance is available. */
canRegenerate: () => boolean;
/** Request the host to regenerate the brief (mirrors onRegenerate). */
regenerate: () => void;
/** Whether the close affordance is available. */
canClose: () => boolean;
/** Dismiss the panel (mirrors onClose). */
close: () => void;
}
export interface EntitySummaryProps extends Omit, 'title' | 'children'> {
/**
* Stable instance id. Surfaced on the root as `data-component-id` so an
* agent / MCP UI bridge can address this specific summary panel.
*/
id?: string;
/** Panel title. Defaults to the localised "AI summary". */
title?: string;
/** Entity name shown beside its avatar in the header (links when `entityHref` is set). */
entityName?: string;
/** Entity href for the name link. */
entityHref?: string;
/** Avatar image URL for the entity. Falls back to initials derived from `entityName`. */
entityAvatarSrc?: string;
/** ISO-8601 instant the brief was generated. */
generatedAtIso?: string;
/** Corpus the brief was built from, shown as a compact KPI card. */
stats?: EntitySummaryStat[];
/** The narrative sections, in order. */
sections: EntitySummarySection[];
/** Regenerate the brief. Omit to hide the affordance. */
onRegenerate?: () => void;
/** Regenerate-button label. */
regenerateLabel?: string;
/**
* Dismiss the panel. Renders a close button in the panel header for
* STANDALONE use (outside the rail). When docked in `ControlRoomRail`, omit
* this — the rail injects its own close via `PanelHeaderActionsProvider`
* (passing it while docked would render a duplicate close control).
*/
onClose?: () => void;
/** Footer disclaimer. Defaults to the BETA clinical-judgement note. */
disclaimer?: ReactNode;
/** BCP-47 locale for the generated-at timestamp. */
locale?: string;
/** Accessible name for the panel region (defaults to `title`). */
'aria-label'?: string;
}
export declare const EntitySummary: import("react").ForwardRefExoticComponent>;
//# sourceMappingURL=entity-summary.d.ts.map