/**
 * Deterministic force-directed layout for the graph-render tool.
 *
 * Uses d3-force with a seeded LCG so the same input graph always produces
 * the same node positions. Layout fidelity to the live /graph page (which
 * runs vis-network's Barnes-Hut port in the browser) is NOT a goal —
 * d3-force's many-body repulsion plus link spring forces give a coherent
 * force-directed layout, which is what the operator needs to read the
 * subgraph. Pixel-equivalence with /graph is filed as a follow-up task.
 *
 * Convergence: a fixed iteration count rather than a kinetic-energy
 * threshold. The kinetic-energy approach is sensitive to graph topology
 * (sparse graphs converge in 50 iterations, dense ones never stabilise
 * cleanly), so 300 iterations is the simple, deterministic choice. The
 * caller logs whether iteration completed successfully.
 */
export interface LayoutNodeIn {
    id: string;
    labels: string[];
}
export interface LayoutEdgeIn {
    from: string;
    to: string;
    type: string;
}
export interface LayoutNodeOut extends LayoutNodeIn {
    x: number;
    y: number;
}
export interface LayoutResult {
    nodes: LayoutNodeOut[];
    edges: LayoutEdgeIn[];
    iterations: number;
}
export declare function layoutGraph(nodes: LayoutNodeIn[], edges: LayoutEdgeIn[], opts: {
    width: number;
    height: number;
    seed?: number;
}): LayoutResult;
//# sourceMappingURL=layout.d.ts.map