/**
 * Shared primitives for ThreadForm components.
 * Utility functions, avatar, status badge, icons, and constants.
 */
import type { ThreadMessage, AiContentResult, DocCheckData } from '../types.js';
export declare function cn(...classes: (string | false | undefined | null)[]): string;
export declare function format_time(iso: string): string;
export declare function format_date(iso: string): string;
export declare function format_relative(iso: string): string;
export declare const MSG_BG: Record<string, string>;
export declare const STATUS_CONFIG: Record<string, {
    label: string;
    color: string;
    bg: string;
}>;
export declare function RoleAvatar({ role, name, size }: {
    role: string;
    name?: string;
    size?: 'sm' | 'md';
}): import("react/jsx-runtime").JSX.Element;
export declare function StatusBadge({ status }: {
    status: string;
}): import("react/jsx-runtime").JSX.Element;
export declare function PdfIcon({ className }: {
    className?: string;
}): import("react/jsx-runtime").JSX.Element;
export declare function WarningIcon({ className }: {
    className?: string;
}): import("react/jsx-runtime").JSX.Element;
export declare function DocumentIcon({ className }: {
    className?: string;
}): import("react/jsx-runtime").JSX.Element;
export declare function LightbulbIcon({ className }: {
    className?: string;
}): import("react/jsx-runtime").JSX.Element;
/** Build lookup: content_id → AiContentResult from all ai_analysis messages */
export declare function build_ai_lookup(messages: ThreadMessage[]): Map<string, AiContentResult>;
/**
 * Find the latest doc check for a content_id (file-based). Walks the messages
 * in reverse so a later verdict (e.g. the aggregate sum_match resolver)
 * overrides an earlier per-file "passed" emitted by the upload pipeline.
 */
export declare function find_doc_check(messages: ThreadMessage[], content_id: string): DocCheckData | null;
/** Find text-based doc checks that reference a message_id */
export declare function find_text_doc_checks(messages: ThreadMessage[], message_id: string): ThreadMessage[];
/**
 * Group messages for timeline rendering.
 * Each user message (comment, content) is its own group/panel.
 * Consecutive send_back messages that share the same source_content_id are
 * merged into a single group so the file row renders once with N stacked
 * ACTION REQUIRED boxes (one per rule) — avoids N separate panels.
 */
export declare function group_messages(messages: ThreadMessage[], role: 'agent' | 'client'): ThreadMessage[][];
//# sourceMappingURL=shared.d.ts.map