/** * 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