import type { Theme } from "../../../../modes/interactive/theme/theme.js";
import type { QuestionnaireResult, QuestionParams } from "../tool/types.js";
import type { WrappingSelectItem } from "../view/components/wrapping-select.js";
export interface QuestionnaireSessionConfig {
    tui: {
        terminal: {
            columns: number;
        };
        requestRender(): void;
    };
    theme: Theme;
    params: QuestionParams;
    itemsByTab: WrappingSelectItem[][];
    done: (result: QuestionnaireResult) => void;
}
export interface QuestionnaireSessionComponent {
    render(width: number): string[];
    invalidate(): void;
    handleInput(data: string): void;
}
/**
 * Slim runtime: owns the canonical state cell, the input-buffer cell, the
 * two-pass `notesVisible` dispatch loop, and the effect runner. State
 * transitions go through the pure `reduce` reducer; UI fan-out goes through
 * the `QuestionnairePropsAdapter` produced by `buildQuestionnaire`.
 */
export declare class QuestionnaireSession {
    private state;
    private readonly questions;
    private readonly isMulti;
    private readonly itemsByTab;
    private readonly notesInput;
    private readonly inlineInput;
    private readonly viewAdapter;
    private readonly tui;
    private readonly done;
    readonly component: QuestionnaireSessionComponent;
    constructor(config: QuestionnaireSessionConfig);
    dispatch(data: string): void;
    private commit;
    private mirrorNotesDraft;
    private runEffect;
    /**
     * Per-keystroke `ignore` fast path: delegates to the headless `inlineInput`
     * Input so bracketed-paste accumulator (`input.js:33-63`) and Kitty CSI-u
     * decode (`input.js:155-163`) take effect. Cursor is NOT force-reset here —
     * doing so would corrupt split-chunk pastes (a `\x05` byte mid-paste lands
     * verbatim in `pasteBuffer` and survives `handlePaste`'s narrow strip).
     * Cursor advances naturally via `insertCharacter` on typing/paste; cursor-
     * movement keys (Left/Right/Home/End/word-jumps) are now functional, with
     * the always-end visual cursor marker drawn independently by
     * `WrappingSelect.renderInlineInputRow`. `viewAdapter.apply` is called
     * directly without a reducer round-trip — preserves the D3 fast-path
     * latency profile from Phase 11.
     */
    private handleIgnoreInline;
    private runtime;
    private applyContext;
    private currentItem;
}
//# sourceMappingURL=questionnaire-session.d.ts.map