/**
 * Node role classification — pure logic, no DB.
 *
 * Roles: entry, core, utility, adapter, leaf, dead-*, test-only
 *
 * Dead sub-categories refine the coarse "dead" bucket:
 *   dead-leaf       — parameters, properties, constants (leaf nodes by definition)
 *   dead-entry      — framework dispatch: CLI commands, MCP tools, event handlers
 *   dead-ffi        — cross-language FFI boundaries (e.g. Rust napi-rs bindings)
 *   dead-unresolved — genuinely unreferenced callables (the real dead code)
 */
import type { Role } from '../../types.js';
export declare const FRAMEWORK_ENTRY_PREFIXES: readonly string[];
export interface ClassifiableNode {
    kind?: string;
    file?: string;
}
export declare function median(sorted: number[]): number;
export interface RoleClassificationNode {
    id: string;
    name: string;
    kind?: string;
    file?: string;
    fanIn: number;
    fanOut: number;
    isExported: boolean;
    testOnlyFanIn?: number;
    productionFanIn?: number;
    /** True when the same file contains at least one non-constant callable connected to the graph (fanIn > 0 or fanOut > 0). */
    hasActiveFileSiblings?: boolean;
}
/**
 * Classify nodes into architectural roles based on fan-in/fan-out metrics.
 */
export declare function classifyRoles(nodes: RoleClassificationNode[], medianOverrides?: {
    fanIn: number;
    fanOut: number;
}): Map<string, Role>;
//# sourceMappingURL=roles.d.ts.map