/** * graph-render — produce an inline PNG of an account-scoped Neo4j * subgraph rooted at a given nodeId, walking up to `hopDepth` hops. * * Surface contract: * - The root node must exist and belong to the caller's account. * A missing or foreign-account root returns a structured refusal, * never throws. * - The expansion is bounded by both `hopDepth` (max 3 to keep the * image legible) and a hard 200-node cap. Subgraphs that exceed * the cap render the first 200 nodes and carry a `truncated` * envelope so the agent can tell the operator. * - `:Trashed` nodes are excluded everywhere — matches memory-search. * - One observability line per invocation, prefixed `[graph-render]`. * * The Cypher hopDepth is INLINED into the query string after a strict * validate (`Number.isInteger && 0 <= n <= 3`) because Neo4j does not * parameterise variable-length path bounds. Anything outside that range * fails fast at the param-validation layer, well before string assembly. */ export interface GraphRenderParams { accountId: string; nodeId: string; hopDepth: number; } export interface GraphRenderRefusal { ok: false; reason: "scope" | "empty" | "cap-exceeded" | "draw-error" | "invalid-input"; message: string; } export interface GraphRenderSuccess { ok: true; path: string; width: number; height: number; nodeCount: number; edgeCount: number; truncated?: { rendered: number; total: number; }; } export type GraphRenderResult = GraphRenderSuccess | GraphRenderRefusal; export declare function graphRender(params: GraphRenderParams): Promise; //# sourceMappingURL=graph-render.d.ts.map