import type { GraphIR } from "./graph-ir.js"; /** * Detail tiers — the diagram "detail dial". Each level is a pure IR → IR * transform over the base graph IR (no re-discovery), so every emitter and the * painter get them for free. See issue #494 / epic #492. * * The dial moves two things: the graph's shape (what collapses) and each * node's attribute payload (how much of the resource reaches the node). The * payload is monotonic — a node's attrs at level n are a subset of its attrs * at level n+1 — so a consumer stepping through the levels always sees the * graph grow (#1489): * * - 0 STACKS — one node per lexicon; edges are cross-lexicon deps; no attrs * - 1 COMPOSITES — composite instances collapsed to a single node each; * topology view — attrs carry only overlay paint (`_*`) * and composite membership * - 2 DECLARABLES — every resource; the resource view of its attrs — scalar * fields and reference envelopes, not nested property trees * - 3 ATTRIBUTES — declarables carrying the full property tree, plus the * producer attribute on each reference edge * * Before #1489 the dial never touched attrs: every level carried the full * projected config, and T3's only delta over T2 (the producer attribute on * `$ref`-derived edges) is empty for a lexicon whose resources link by * name/label convention — the k8s lexicon end to end — so levels 2 and 3 came * out byte-identical and a zoom picker mapped onto them rendered the same * graph twice (behold#131). */ export type DetailLevel = 0 | 1 | 2 | 3; export declare const DETAIL: { readonly STACKS: 0; readonly COMPOSITES: 1; readonly DECLARABLES: 2; readonly ATTRIBUTES: 3; }; /** Apply a detail tier to the base (declarable-level) IR. */ export declare function applyDetail(ir: GraphIR, level: DetailLevel): GraphIR; /** * chant #1489 — the message to print when `--detail 3` changed nothing. * * T3 adds two things over T2: the full property tree on each node and the * producer attribute on `$ref`-derived edges. A graph whose nodes carry no * properties beyond the resource view AND whose edges reference nothing (they * link by name or label convention) gains neither, so levels 2 and 3 come out * byte-identical — which reads as a broken dial from any consumer stepping * through the levels (behold#131 was filed over exactly this). Accepting a * value that changes nothing without saying so is the bug; this names it. * * Returns the warning text, or undefined when detail 3 did add something. * `base` is the pre-detail IR the caller already holds (the same one it fed * `applyDetail`); the T2 view to compare against is derived here, so callers * don't run the projection twice for a message. Pure — no I/O. */ export declare function detailInertNotice(base: GraphIR, detailed: GraphIR): string | undefined; //# sourceMappingURL=graph-detail.d.ts.map