/**
 * @internal — not part of the public agentfootprint API. Imported only
 * by RunStepRecorder. Subject to change without notice.
 *
 * RootInferrer — small state machine deciding whether a run's root is
 * a single leaf primitive (Agent / LLMCall) or a composition (Sequence
 * / Parallel / Conditional / Loop).
 *
 * Extracted from RunStepRecorder per Convention 1.
 *
 * Inputs: subflow entries (with their depth + parsed primitiveKind),
 * fork events (depth 0 → Parallel root), decision events (depth 0 →
 * Conditional root), loop events (depth 0 → Loop root).
 *
 * Output: query `kind()` for the inferred root. Returns `undefined`
 * until a signal arrives.
 *
 * Inference rules:
 *   - Decisive composition signals (fork / decide / loop AT DEPTH 0)
 *     lock the root and are never overridden.
 *   - Shallowest primitive boundary IS a composition kind → root is
 *     that composition.
 *   - Two+ leaf siblings at the shallowest depth → implicit Sequence
 *     root (Sequence-as-runner case where the Sequence itself doesn't
 *     fire its own subflow.entry).
 *   - Single leaf at the shallowest depth → root is "leaf".
 */
export type InferredRoot = 'leaf' | 'sequence' | 'parallel' | 'conditional' | 'loop' | undefined;
export declare class RootInferrer {
    private inferred;
    private shallowestDepth;
    private shallowestSiblings;
    /** Currently-inferred root kind, or undefined if no signal yet. */
    kind(): InferredRoot;
    /** True when the root is a single leaf primitive (or unknown,
     *  which should be treated as leaf for kind-filter purposes). */
    isLeafRoot(): boolean;
    /** Observe a subflow entry. */
    observeSubflowEntry(depth: number, primitiveKind: string | undefined): void;
    /** Observe a fork event. Locks root to Parallel if at depth 0 and
     *  no decisive root has been inferred yet. */
    observeFork(depth: number): void;
    /** Observe a decision event. Locks root to Conditional if at depth 0
     *  and no decisive root has been inferred yet. */
    observeDecision(depth: number): void;
    /** Observe a loop event. Locks root to Loop if at depth 0 and no
     *  decisive root has been inferred yet. */
    observeLoop(depth: number): void;
    clear(): void;
    private tryInfer;
}
