/**
 * Block-level normalizer for OwlCoda markdown rendering.
 *
 * Recognizes block boundaries (code fences, headings, tables, blank lines,
 * malformed mid-line headings, prefix+|cells| jams) and produces a stream
 * of normalized logical lines as typed tokens. Owns NO ANSI rendering —
 * that responsibility stays with renderMarkdown's downstream renderTokens.
 *
 * Both rendering paths consume the normalizer:
 *   - `renderMarkdown(text)` feeds all lines at once via `feedAll()`.
 *   - `StreamingMarkdownRenderer` feeds one line at a time via `feedLine()`,
 *     and on end-of-stream calls `finalize()` to drain any held line.
 *
 * The normalizer holds AT MOST 1 pending line (the line awaiting next-line
 * lookahead for `|cells|` + separator detection). Streaming latency cap is
 * therefore one logical line.
 */
export type NormalizedLine = {
    kind: 'text';
    text: string;
} | {
    kind: 'heading';
    level: 1 | 2 | 3 | 4 | 5 | 6;
    text: string;
} | {
    kind: 'table-header';
    cells: string[];
} | {
    kind: 'table-separator';
    alignSpec: string[];
} | {
    kind: 'table-row';
    cells: string[];
} | {
    kind: 'code-fence-open';
    lang: string;
} | {
    kind: 'code-fence-close';
} | {
    kind: 'code-line';
    text: string;
} | {
    kind: 'blank';
};
export declare class MarkdownBlockNormalizer {
    private pending;
    private inCodeFence;
    private codeFenceLang;
    private inTable;
    feedLine(line: string): NormalizedLine[];
    feedAll(text: string): NormalizedLine[];
    finalize(): NormalizedLine[];
    /** Whether the normalizer is currently inside a fenced code block.
     *  Streaming callers consult this before applying their own structural
     *  heuristics on the in-flight buffer (those heuristics must not split
     *  raw code content). */
    isInCodeFence(): boolean;
    reset(): void;
    private resolveHeldAsTableHeader;
}
