import type { ReactNode } from 'react'; import type { CoreAC, CoreIssue, OperationalBlockStatus, Payload, VisualizerExtension } from './model'; export type { VisualizerExtension } from './model'; export interface EffectiveExtension { statusOrder: string[]; acUnitLabel?: string; isOperationallyBlocked?(issue: CoreIssue): boolean; operationalBlockLabel?(issue: CoreIssue): string | undefined; blockedViewLabel?: string; operationalBlocking: Record; statusClass?(status: string): string; assignee?(issue: CoreIssue): string | undefined; pr?(issue: CoreIssue): { url: string; } | undefined; acText?(ac: CoreAC): ReactNode; acProof?(ac: CoreAC): ReactNode; acEvidence?(ac: CoreAC, projectUrl: (path: string) => string): ReactNode; issuePanels?(issue: CoreIssue, projectUrl: (path: string) => string): ReactNode; } /** Called by the generated bundle entry (server.ts, VIZ-4) once per discovered * `client/presets/.tsx` module — filename is the canonical preset name. VIZ-13 calls * this again for the repo-local extension, registered under the running preset's own name so * it layers over (not replaces) a first-party entry: repeat registration merges PER MEMBER * (registration order = precedence, later wins where present), so a repo extension defining * only `issuePanels` on a speckit repo keeps speckit's shipped `acText`/`acEvidence` — the * spec's pinned data < first-party < repo precedence is per member, not per object. */ export declare function registerExtension(name: string, ext: VisualizerExtension): void; /** Replace the complete compiled extension for one preset. The standalone loader uses this * for hot reload because its module already contains the shipped + repo layers; merging would * leave deleted repo members stuck in the registry after an edit. */ export declare function replaceExtension(name: string, ext: VisualizerExtension): void; export declare const UPGRADE_NOTICE = "vocabulary not declared \u2014 run ztrack preset upgrade"; /** Build the one effective extension a render pass uses, from the wire payload. Returns the * merged extension plus a one-line `notice` (VIZ-4 dev/04): null while the vocabulary is * present and valid; the shipped `visualizerError` text when the block was invalid; the * upgrade notice when the preset declares none at all. `payload` may be null before the first * successful fetch — in that transient state there is nothing to report yet. */ export declare function buildEffectiveExtension(payload: Payload | null): { ext: EffectiveExtension; notice: string | null; };