/**
 * Deterministic structure detection — the cheap path that runs before any LLM. Finds headings in
 * page text: markdown headers, and the numbered/keyword headings long structured documents use
 * (`PART 52`, `Subpart 9.1`, `Item 7.`, `52.236-5 Material and Workmanship.`, `3.2 Scope`).
 */
/** A heading found in (or declared for) the document, before nesting. */
export interface DetectedHeading {
    title: string;
    level: number;
    unit: number;
    /** The heading is the first text of its unit, so the previous section ends in the unit before. */
    atUnitStart: boolean;
}
/**
 * Detect headings in each unit's text. `markdownOnly` restricts detection to markdown headers (for
 * text you know is markdown, where a numbered line is more likely a list item).
 *
 * Besides running headers (below), it drops **table-of-contents listings**: five or more
 * consecutive keyword/numbered heading lines with no body text between them are a contents page
 * (a regulation part opens with one), not sections — only a leading top-level heading of the run
 * (`PART 2—…`) and its last line (the first real heading, which body text follows) are kept. Markdown headers are explicit and never dropped this way.
 */
export declare function detectHeadings(texts: readonly string[], markdownOnly?: boolean): DetectedHeading[];
/**
 * Lines that repeat across many units (running headers/footers, page furniture), digits ignored so
 * `Page 3 of 40` and `Page 4 of 40` count as one. Used to pick meaningful lines for group titles.
 */
export declare function runningLines(texts: readonly string[]): Set<string>;
//# sourceMappingURL=headings.d.ts.map