import type { ReactNode } from "indusagi/react-host";
import type { InkThemeAdapter } from "../theme-adapter.js";
interface StreamingMarkdownProps {
    /** The accumulated answer text so far (grows monotonically per delta). */
    children: string;
    /** The theme adapter colours resolve against. */
    theme: InkThemeAdapter;
    /** When false, fenced code is rendered plain (no syntax highlighting). */
    highlightCode?: boolean;
    /** Render every text run dim. */
    dim?: boolean;
}
/**
 * Streaming-aware markdown renderer with a monotonic stable-prefix boundary.
 *
 * On every delta the accumulated answer grows. Re-lexing the whole answer each
 * time would re-parse (and reflow/flicker) content that is already settled. To
 * avoid that, we split the answer at the last completed block boundary:
 *
 *   - **stable prefix** — every block above the boundary. Memoised on its own
 *     content, so once a block settles its `<Markdown>` is parsed once and never
 *     re-renders as later deltas arrive.
 *   - **unstable suffix** — the still-growing last block. Re-lexed every delta
 *     (cheap: it is one block, and `Markdown`'s own LRU cache + fast-path absorb
 *     the cost).
 *
 * The boundary only ever moves forward (it is recomputed from `content`, which
 * grows monotonically, and `lastStableBoundary` is monotonic in its input), so
 * completed blocks never re-flicker. When the turn ends and the finalized
 * assistant message takes over rendering, the same `<Markdown>` pipeline draws
 * identical output, so the hand-off is seamless.
 */
export declare function StreamingMarkdown({ children, theme, highlightCode, dim, }: StreamingMarkdownProps): ReactNode;
export {};
