import { Store } from './store.js';
import { ReferenceType } from '../types.js';
import './store-interface.js';
import './graph.js';

type TraceDirection = 'down' | 'up' | 'both';
interface TraceOptions {
    startSymbol?: string;
    startFile?: string;
    direction: TraceDirection;
    maxDepth: number;
    edgeTypes?: ReferenceType[];
    includeStructural: boolean;
    repo?: string;
}
interface TraceNode {
    file: string;
    symbol: string | null;
    depth: number;
    incomingEdgeType: ReferenceType | 'start';
}
interface TracePath {
    nodes: TraceNode[];
    cycles: CyclicEdge[];
}
interface CyclicEdge {
    fromFile: string;
    fromSymbol: string | null;
    toFile: string;
    toSymbol: string | null;
    edgeType: ReferenceType;
    cycleLength: number;
}
interface TraceResult {
    start: {
        file: string;
        symbol: string | null;
    };
    direction: TraceDirection;
    paths: TracePath[];
    sources: TraceNode[];
    sinks: TraceNode[];
    cycles: CyclicEdge[];
    nodeCount: number;
    edgeCount: number;
    maxDepthReached: boolean;
}
declare class FlowTracer {
    private store;
    constructor(store: Store);
    trace(options: TraceOptions): TraceResult;
    resolveStart(input: string, repo?: string): {
        file: string;
        symbol: string | null;
    } | null;
    findSources(repo?: string): TraceNode[];
    findSinks(repo?: string): TraceNode[];
    findCriticalPath(from: string, to: string, repo?: string): TracePath | null;
    private getEdgesForNode;
    private getScopedSymbolName;
}

export { type CyclicEdge, FlowTracer, type TraceDirection, type TraceNode, type TraceOptions, type TracePath, type TraceResult };
