/**
 * Shared palette + display-string primitives for any surface that renders
 * the Neo4j graph. Both the live `/graph` page in platform/ui and the
 * graph-viewer MCP plugin's PNG renderer import from here so a node looks
 * the same wherever it appears: same colour family per label, same short
 * canvas label per node.
 *
 * UI-only constants (filter-popover sets, zoom-tier wrap helpers,
 * agent-action label sets) stay in platform/ui/app/lib/graph-labels.ts and
 * platform/ui/app/graph/display-helpers.ts — they re-export the symbols
 * defined here. The two parity tests (this lib's __tests__ and the UI's
 * unchanged colour-stability tests) keep the surfaces in lockstep.
 *
 * Sources of truth:
 *   - Label list: .docs/neo4j.md "Schema (Phase 0)" + "Standards Compliance"
 *   - Brand colour for LocalBusiness: brand.json defaultColors.primary
 *     (resolved at runtime; this module supplies the schema-default fallback)
 */
/**
 * Label → display colour mapping. Closed list of node labels written by
 * the Maxy MCP write paths. A new label without an entry here renders in
 * FALLBACK_LABEL_COLOUR and is omitted from the legend.
 */
export declare const GRAPH_LABEL_COLOURS: Record<string, string>;
export declare const FALLBACK_LABEL_COLOUR = "#94A3B8";
export declare const ALL_GRAPH_LABELS: readonly string[];
/**
 * Select the sublabel whose colour should drive the node hue. Walks the
 * label array from index 1 (skipping the base label at index 0) and
 * returns the first sublabel that has a registered colour; falls back to
 * labels[0]. Pure — drift-counting lives in resolveNodeColour.
 */
export declare function pickDisplayLabel(labels: readonly string[]): string | null;
export declare function colourForLabel(label: string): string;
export interface ResolvedNodeColour {
    displayLabel: string | null;
    colour: string;
    driftCandidates: number;
}
/**
 * Single-source colour resolver. driftCandidates counts registered
 * sublabels in labels[1..]; a node with two registered sublabels has
 * driftCandidates = 2 and its rendered hue is order-dependent.
 */
export declare function resolveNodeColour(labels: readonly string[]): ResolvedNodeColour;
/**
 * Structural type used by display-string helpers. Mirrors the shape of
 * GraphNode without coupling to it.
 */
export interface GraphNodeLike {
    id: string;
    labels: string[];
    properties: Record<string, unknown>;
}
/**
 * YYYY-MM-DD HH:mm from an ISO 8601 prefix. Reads the prefix directly so
 * timezone-stored UTC timestamps render identically across operator
 * timezones; parsing to Date + reformatting would flip the day.
 */
export declare function formatRunTimestamp(iso: string): string | null;
/** HH:mm:ss from an ISO 8601 prefix. Same tz-stable contract. */
export declare function formatMessageTimestamp(iso: string): string | null;
/**
 * 24-char canvas label for a node. Label precedence per label family
 * (ToolCall.toolName, WorkflowRun startedAt formatted, WorkflowStep.label,
 * Person givenName+familyName compose, Agent displayName/slug, Message
 * role+timestamp), then a generic fallthrough across curated keys
 * (name, title, summary, givenName, subject, text) — :ConversationArchive
 * rows (Task 397) carry a stable `title` written by the writer so they pick
 * up the generic-fallback `title` key naturally. Finally a
 * Conversation-specific `Conv <id8>` fallback so unpopulated conversations
 * don't render as the literal label.
 */
export declare function pickShortLabel(node: GraphNodeLike): string;
/**
 * Untruncated sibling of pickShortLabel. Used by side-panel headings and
 * tooltips where the 24-char canvas-overlap cap does not apply.
 */
export declare function pickDisplayName(node: GraphNodeLike): string;
//# sourceMappingURL=index.d.ts.map