import { type Component, Container, type Focusable } from "@earendil-works/pi-tui";
import type { SessionTreeNode } from "../../../core/session-manager.js";
/** Filter mode for tree display */
export type FilterMode = "default" | "no-tools" | "user-only" | "labeled-only" | "all";
declare class TreeList implements Component {
    private flatNodes;
    private filteredNodes;
    private selectedIndex;
    private currentLeafId;
    private maxVisibleLines;
    private filterMode;
    private searchQuery;
    private toolCallMap;
    private multipleRoots;
    private showLabelTimestamps;
    private activePathIds;
    private visibleParentMap;
    private visibleChildrenMap;
    private lastSelectedId;
    private foldedNodes;
    onSelect?: (entryId: string) => void;
    onCancel?: () => void;
    onLabelEdit?: (entryId: string, currentLabel: string | undefined) => void;
    constructor(tree: SessionTreeNode[], currentLeafId: string | null, maxVisibleLines: number, initialSelectedId?: string, initialFilterMode?: FilterMode);
    /**
     * Find the index of the nearest visible entry, walking up the parent chain if needed.
     * Returns the index in filteredNodes, or the last index as fallback.
     */
    private findNearestVisibleIndex;
    /** Build the set of entry IDs on the path from root to current leaf */
    private buildActivePath;
    private flattenTree;
    private applyFilter;
    /**
     * Recompute indentation/connectors for the filtered view
     *
     * Filtering can hide intermediate entries; descendants attach to the nearest visible ancestor.
     * Keep indentation semantics aligned with flattenTree() so single-child chains don't drift right.
     */
    private recalculateVisualStructure;
    /** Get searchable text content from a node */
    private getSearchableText;
    invalidate(): void;
    getSearchQuery(): string;
    getSelectedNode(): SessionTreeNode | undefined;
    updateNodeLabel(entryId: string, label: string | undefined, labelTimestamp?: string): void;
    private getStatusLabels;
    render(width: number): string[];
    private getEntryDisplayText;
    private formatLabelTimestamp;
    private extractContent;
    private hasTextContent;
    private formatToolCall;
    handleInput(keyData: string): void;
    /**
     * Whether a node can be folded. A node is foldable if it has visible children
     * and is either a root (no visible parent) or a segment start (visible parent
     * has multiple visible children).
     */
    private isFoldable;
    /**
     * Find the index of the next branch segment start in the given direction.
     * A segment start is the first child of a branch point.
     *
     * "up" walks the visible parent chain; "down" walks visible children
     * (always following the first child).
     */
    private findBranchSegmentStart;
}
/**
 * Component that renders a session tree selector for navigation
 */
export declare class TreeSelectorComponent extends Container implements Focusable {
    private treeList;
    private labelInput;
    private labelInputContainer;
    private treeContainer;
    private onLabelChangeCallback?;
    private _focused;
    get focused(): boolean;
    set focused(value: boolean);
    constructor(tree: SessionTreeNode[], currentLeafId: string | null, terminalHeight: number, onSelect: (entryId: string) => void, onCancel: () => void, onLabelChange?: (entryId: string, label: string | undefined) => void, initialSelectedId?: string, initialFilterMode?: FilterMode);
    private showLabelInput;
    private hideLabelInput;
    handleInput(keyData: string): void;
    getTreeList(): TreeList;
}
export {};
//# sourceMappingURL=tree-selector.d.ts.map