/**
 * 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<GraphRenderResult>;
//# sourceMappingURL=graph-render.d.ts.map