@modernrelay/orbit-core 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors.ts","../src/edgeIdentity.ts","../src/validate.ts","../src/groups.ts","../src/reconciler.ts","../src/projection.ts","../src/ingestion.ts","../src/selection.ts","../src/adjacency.ts","../src/linkPick.ts","../src/edgePicking.ts","../src/labels.ts","../src/scope.ts","../src/services.ts","../src/pathService.ts","../src/search.ts","../src/filter.ts","../src/scale.ts","../src/hygiene.ts","../src/metrics.ts","../src/capabilityPolicy.ts","../src/imageAtlas.ts","../src/mask.ts","../src/svgExport.ts","../src/viewState.ts","../src/crossfilter.ts","../src/history.ts","../src/instance.ts","../src/overview.ts"],"names":["v","r","g","b","record","positions","links","tol2","bestIdx","bestD2","throwAborted","out","clamp01","span","t","num","canonicalJson","j","EMPTY_INDEX","nodes","edges","nodeIndex","delta","session","domain","eng","opts","denial","prevented","cur","nowMs"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Typed error taxonomy (spec §6.5, v0.2 subset of call sites).\n *\n * Structural fatality rule: a *transient* context loss never mints a\n * GraphError — it is a status transition ('lost') plus a 'context-lost'\n * warning diagnostic, and the 'error' event does not fire. A GraphError with\n * code 'context-lost' is constructed ONLY on terminal recovery failure, where\n * it is always fatal. This keeps fatality structural rather than conditional.\n */\n\n/** Placeholder until resource admission control lands (plan S4-T06). */\nexport interface ResourceAdmissionReport {\n reason: string;\n estimatedBytes?: number;\n limitBytes?: number;\n}\n\n/** Instance-level faults, delivered via the 'error' event's `detail`. */\nexport type GraphError =\n | { code: 'engine-unsupported'; detail: string }\n | { code: 'resource-limit'; detail: ResourceAdmissionReport; fatal: boolean }\n /** Minted only on terminal context-recovery failure — always fatal. */\n | { code: 'context-lost' }\n | {\n code: 'service-failed';\n service: 'search' | 'expansion' | 'metrics' | 'path' | 'crossfilter';\n cause: unknown;\n };\n\n/**\n * Operation-scoped failures (spec §6.5): rejected promises / thrown calls.\n * All ten codes are typed now even where their subsystems are post-v0.2 —\n * the union is the public contract, the wiring arrives with each subsystem.\n */\nexport type GraphOperationError =\n | { code: 'export-too-large'; elementCount: number; limit: number }\n | { code: 'export-materialization-too-large'; rowCount: number; limit: number }\n | { code: 'queue-overflow'; queuedBytes: number; limit: number }\n | { code: 'invalid-view-state'; detail: string }\n | { code: 'invalid-ingest-sequence'; expected: number; received: number; conflict: boolean }\n | { code: 'ingest-session-closed' }\n | { code: 'stale-revision'; expected: number; actual: number }\n | { code: 'overlay-id-conflict'; overlayId: string }\n | { code: 'resource-limit'; detail: ResourceAdmissionReport }\n | { code: 'aborted'; cause?: unknown };\n\n/** Lifecycle phase an instance-level error occurred in. */\nexport type ErrorPhase = 'mount' | 'running' | 'recovery';\n\n/** Spec §6.5 fatality matrix as a pure decision function. */\nexport function isFatalGraphError(error: GraphError, phase: ErrorPhase): boolean {\n switch (error.code) {\n case 'engine-unsupported':\n return true;\n case 'context-lost':\n // Only ever constructed for terminal recovery failure.\n return true;\n case 'resource-limit':\n return error.fatal;\n case 'service-failed':\n return false;\n default: {\n const exhaustive: never = error;\n void exhaustive;\n void phase;\n return true;\n }\n }\n}\n\n/**\n * Spec §6.5 rule for a resource-limit producer deciding `fatal`: rejection is\n * fatal before the first accepted scene or during terminal recovery; a later\n * inadmissible declarative update keeps the previous scene (non-fatal).\n */\nexport function resourceLimitFatal(phase: ErrorPhase, hasAcceptedScene: boolean): boolean {\n return phase === 'recovery' || !hasAcceptedScene;\n}\n\n/** Error class carried by rejected/thrown operations; `.detail` is typed. */\nexport class OrbitOperationError extends Error {\n override readonly name = 'OrbitOperationError';\n readonly detail: GraphOperationError;\n\n constructor(detail: GraphOperationError, message?: string) {\n super(message ?? `orbit operation failed: ${detail.code}`);\n this.detail = detail;\n }\n}\n\n/** Human-readable Error for a GraphError (used as the 'error' event payload). */\nexport function graphErrorToError(graphError: GraphError, cause?: Error): Error {\n if (cause) return cause;\n switch (graphError.code) {\n case 'engine-unsupported':\n return new Error(`orbit engine unsupported: ${graphError.detail}`);\n case 'resource-limit':\n return new Error(`orbit resource limit: ${graphError.detail.reason}`);\n case 'context-lost':\n return new Error('orbit: WebGL context lost and could not be recovered');\n case 'service-failed':\n return new Error(`orbit service failed: ${graphError.service}`);\n }\n}\n","/**\n * Collision-safe identity helpers for synthesized edges.\n *\n * Simple ids retain the documented `source→target#k` shape. The three\n * framing characters are backslash-escaped inside endpoint components, making\n * the concatenation injective for arbitrary JavaScript strings (including\n * strings that themselves contain backslashes, arrows, hashes, or NULs).\n */\n\nimport type { EdgeId, NodeId } from './types';\n\nexport type EdgePairCounters = Map<NodeId, Map<NodeId, number>>;\n\nfunction escapeEdgeIdComponent(value: string): string {\n let out = '';\n for (const char of value) {\n if (char === '\\\\' || char === '→' || char === '#') out += '\\\\';\n out += char;\n }\n return out;\n}\n\n/** Build one deterministic synthesized id from an ordered endpoint pair. */\nexport function synthesizeEdgeId(source: NodeId, target: NodeId, k: number): EdgeId {\n return `${escapeEdgeIdComponent(source)}→${escapeEdgeIdComponent(target)}#${k}`;\n}\n\n/** Take and advance the next parallel-edge ordinal for an exact endpoint tuple. */\nexport function nextSynthesizedEdgeId(\n counters: EdgePairCounters,\n source: NodeId,\n target: NodeId,\n): EdgeId {\n let byTarget = counters.get(source);\n if (byTarget === undefined) {\n byTarget = new Map<NodeId, number>();\n counters.set(source, byTarget);\n }\n const k = byTarget.get(target) ?? 0;\n byTarget.set(target, k + 1);\n return synthesizeEdgeId(source, target, k);\n}\n","/**\n * §5.1 snapshot validation — deterministic malformed-input resolution.\n *\n * Pure function: same input → structurally identical output; never throws on\n * malformed input. Diagnostics are batched — at most one GraphDiagnostic per\n * code per pass, with a total count and at most DIAGNOSTIC_SAMPLE_CAP samples\n * (O(categories) work/allocation, never O(bad rows)).\n */\n\nimport {\n DIAGNOSTIC_SAMPLE_CAP,\n type AcceptedEdge,\n type AcceptedGraph,\n type DiagnosticCode,\n type DiagnosticSeverity,\n type EdgeId,\n type GraphDiagnostic,\n type GraphEdge,\n type GraphNode,\n type GraphSnapshot,\n type NodeId,\n} from './types';\nimport { nextSynthesizedEdgeId } from './edgeIdentity';\nimport type { EdgePairCounters } from './edgeIdentity';\n\n/** Per-code accumulator: one counter + capped samples, no per-row objects. */\ninterface Tally {\n count: number;\n samples: string[];\n}\n\nfunction newTally(): Tally {\n return { count: 0, samples: [] };\n}\n\nfunction record(tally: Tally, sampleId: string): void {\n tally.count++;\n if (tally.samples.length < DIAGNOSTIC_SAMPLE_CAP) tally.samples.push(sampleId);\n}\n\nfunction pushDiagnostic(\n out: GraphDiagnostic[],\n code: DiagnosticCode,\n severity: DiagnosticSeverity,\n tally: Tally,\n message: string,\n): void {\n if (tally.count === 0) return;\n out.push({ code, severity, count: tally.count, sampleIds: tally.samples, message });\n}\n\nexport function validateSnapshot<N = Record<string, unknown>, E = Record<string, unknown>>(\n snapshot: GraphSnapshot<N, E>,\n): AcceptedGraph<N, E> {\n // Defensive: malformed callers may hand us non-arrays; never throw.\n const rawNodes: readonly unknown[] = Array.isArray(snapshot.nodes) ? snapshot.nodes : [];\n const rawEdges: readonly unknown[] = Array.isArray(snapshot.edges) ? snapshot.edges : [];\n\n const invalidNode = newTally();\n const duplicateNode = newTally();\n const invalidEdge = newTally();\n const danglingEdge = newTally();\n const duplicateEdge = newTally();\n const selfLoop = newTally();\n\n // --- Nodes: first occurrence wins; accepted order = first-occurrence order.\n const nodes: GraphNode<N>[] = [];\n const nodeIndex = new Map<NodeId, number>();\n for (let i = 0; i < rawNodes.length; i++) {\n const row = rawNodes[i];\n const id =\n typeof row === 'object' && row !== null ? (row as { id?: unknown }).id : undefined;\n if (typeof id !== 'string') {\n // No usable id to sample — sample the row position instead.\n record(invalidNode, `[${i}]`);\n continue;\n }\n if (nodeIndex.has(id)) {\n record(duplicateNode, id);\n continue;\n }\n nodeIndex.set(id, nodes.length);\n nodes.push(row as GraphNode<N>);\n }\n\n // --- Edges.\n const edges: AcceptedEdge<E>[] = [];\n const edgeIds = new Set<EdgeId>();\n // Parallel-edge counter per ordered (source, target) pair. Nested maps keep\n // the keying collision-proof for arbitrary node id contents.\n const pairCounters: EdgePairCounters = new Map();\n\n for (let i = 0; i < rawEdges.length; i++) {\n const row = rawEdges[i];\n if (typeof row !== 'object' || row === null) {\n record(invalidEdge, `[${i}]`);\n continue;\n }\n const edge = row as { id?: unknown; source?: unknown; target?: unknown };\n const source = edge.source;\n const target = edge.target;\n if (typeof source !== 'string' || typeof target !== 'string') {\n record(invalidEdge, typeof edge.id === 'string' ? edge.id : `[${i}]`);\n continue;\n }\n if (!nodeIndex.has(source)) {\n record(danglingEdge, source);\n continue;\n }\n if (!nodeIndex.has(target)) {\n record(danglingEdge, target);\n continue;\n }\n\n const hasExplicitId = typeof edge.id === 'string';\n let id: EdgeId;\n if (hasExplicitId) {\n id = edge.id as EdgeId;\n } else {\n // Deterministic synthesis: k counts this ordered pair's synthesized\n // edges in first-occurrence order (a later duplicate drop does not\n // reclaim its k).\n id = nextSynthesizedEdgeId(pairCounters, source, target);\n }\n\n // First-wins over the FINAL id set — covers explicit/explicit,\n // synthesized/explicit, and synthesized/synthesized collisions alike.\n if (edgeIds.has(id)) {\n record(duplicateEdge, id);\n continue;\n }\n edgeIds.add(id);\n\n if (source === target) record(selfLoop, source);\n\n edges.push(\n hasExplicitId\n ? (row as AcceptedEdge<E>)\n : // `id` after the spread so it wins even if the input row carried an\n // explicit `id: undefined` key.\n { ...(row as GraphEdge<E>), id },\n );\n }\n\n const diagnostics: GraphDiagnostic[] = [];\n pushDiagnostic(\n diagnostics,\n 'invalid-node',\n 'error',\n invalidNode,\n `${invalidNode.count} node row(s) dropped: missing or non-string id`,\n );\n pushDiagnostic(\n diagnostics,\n 'duplicate-node-id',\n 'warning',\n duplicateNode,\n `${duplicateNode.count} duplicate node id(s) dropped (first occurrence wins)`,\n );\n pushDiagnostic(\n diagnostics,\n 'invalid-edge',\n 'error',\n invalidEdge,\n `${invalidEdge.count} edge row(s) dropped: missing or non-string source/target`,\n );\n pushDiagnostic(\n diagnostics,\n 'dangling-edge-endpoint',\n 'warning',\n danglingEdge,\n `${danglingEdge.count} edge(s) dropped: endpoint not in accepted node set`,\n );\n pushDiagnostic(\n diagnostics,\n 'duplicate-edge-id',\n 'warning',\n duplicateEdge,\n `${duplicateEdge.count} duplicate edge id(s) dropped (first occurrence wins)`,\n );\n pushDiagnostic(\n diagnostics,\n 'self-loop-retained',\n 'info',\n selfLoop,\n `${selfLoop.count} self-loop edge(s) retained`,\n );\n\n return {\n datasetKey: snapshot.datasetKey,\n sourceRevision: snapshot.sourceRevision,\n nodes,\n edges,\n nodeIndex,\n diagnostics,\n };\n}\n","/**\n * §16.3 stage-3 containment rewrite (S12-T01) — pure derivation, no engine,\n * no DOM.\n *\n * ## The representative forest\n *\n * ONE structure drives both group collapse and node fold. Every entity — a\n * physical node id, or a synthetic group scene key — has AT MOST ONE\n * representative parent, and:\n *\n * > An entity is drawn iff no ancestor is collapsed. Each edge endpoint\n * > reroutes to its OUTERMOST COLLAPSED ancestor; edges whose endpoints\n * > rewrite to the same key are dropped; the rest merge per directed pair\n * > into one meta-edge carrying the underlying count. A SYNTHETIC\n * > representative materializes only while collapsed; a REAL one is always\n * > drawn.\n *\n * `collapsed` is a property of the REPRESENTATIVE, not of the node — which\n * is exactly why a folded anchor stays visible while its children hide, and\n * why nesting needs no special case (a fold inside a collapsed group hides\n * with it, and its members' edges route to the group).\n *\n * Contract summary (spec §16.3/§7.6 stage 3, invariants E5):\n * - Groups are HIERARCHICAL but singly-parented: a member id may name another\n * group (nesting), but no entity has two parents. `validateGroupSpecs`\n * rejects a violating array with ONE batched §5.1 'config-error' diagnostic\n * BEFORE any scene rewrite — a rejected array changes nothing.\n * - `rewriteGroups` runs over the HARD-SCOPED model (§7.6 stage 2 output):\n * collapsed representatives replace their in-scope descendants with one row\n * (a synthetic super-node, or the fold anchor's existing physical row);\n * descendant edges re-route into meta-edge rows carrying the underlying-edge\n * count (the badge datum). The post-rewrite graph feeds the EXISTING §7.2\n * structural diff, so collapse/expand is a diff, never a reload.\n * - Group ids occupy a distinct PUBLIC namespace (§7.4): synthetic rows carry\n * INTERNAL scene keys (NUL-prefixed — outside the documented caller id\n * contract) that never escape public payloads. A group id equal to a node\n * id coexists without collision. A FOLD anchor is a real node, so its\n * entity key IS its node id and it needs no synthetic slot at all.\n * - Synthetic rows are never cast to N/E: they carry only `id`, and consumers\n * identify them by slot position — synthetics are always a CONTIGUOUS\n * SUFFIX of the node/edge lists (physical prefix ordering is preserved), so\n * `slot >= physicalCount` is the discrimination rule.\n */\n\nimport type {\n AcceptedEdge,\n AcceptedGraph,\n GraphDiagnostic,\n GraphNode,\n GroupBySpec,\n GroupSpec,\n MetaEdge,\n NodeId,\n ResolvedGroup,\n SceneFold,\n SceneGroups,\n SceneLinkRef,\n ScenePointRef,\n RenderScene,\n} from './types';\nimport { DIAGNOSTIC_SAMPLE_CAP } from './types';\n\n// ---------------------------------------------------------------------------\n// Internal scene-key codec. The NUL prefix keeps synthetic keys out of the\n// caller id namespace by construction (caller ids containing U+0000 are\n// outside the documented contract); the JSON body keeps keys deterministic\n// and collision-free among themselves for any group id / endpoint pair.\n// ---------------------------------------------------------------------------\n\nconst SCENE_KEY_PREFIX = '\\u0000';\n\n/** Internal scene key of a collapsed group's super-node row. NEVER public. */\nexport function groupSceneKey(groupId: string): string {\n return SCENE_KEY_PREFIX + JSON.stringify(['group', groupId]);\n}\n\n/** Internal scene key of a meta-edge row (directed rewritten endpoint pair). */\nexport function metaEdgeSceneKey(sourceKey: string, targetKey: string): string {\n return SCENE_KEY_PREFIX + JSON.stringify(['meta-edge', sourceKey, targetKey]);\n}\n\n/** §16.3 PUBLIC meta-edge id: the collision-safe ordered endpoint tuple\n * `JSON.stringify(['meta-edge', source.kind, source.id, target.kind,\n * target.id])` — shared with the parallel-edge grouping toggle (R-16.3-24). */\nexport function metaEdgePublicId(\n sourceKind: 'node' | 'group',\n sourceId: string,\n targetKind: 'node' | 'group',\n targetId: string,\n): string {\n return JSON.stringify(['meta-edge', sourceKind, sourceId, targetKind, targetId]);\n}\n\n// ---------------------------------------------------------------------------\n// The representative forest — see the module header for the drawn/reroute\n// rule it encodes.\n// ---------------------------------------------------------------------------\n\n/**\n * Entity key: a physical node id, or a synthetic group scene key. A fold\n * anchor IS its node id — that is the whole point of a real representative.\n */\nexport type EntityKey = string;\n\n/** One node fold: `anchorId` stands for `memberIds` while folded. A fold\n * record exists only while folded — unfolding deletes it. */\nexport interface FoldRecord {\n anchorId: NodeId;\n memberIds: readonly NodeId[];\n}\n\nexport interface RepForest {\n /** entity → its representative parent (at most one, by construction). */\n readonly parent: ReadonlyMap<EntityKey, EntityKey>;\n /** Representatives whose CHILDREN are hidden — never themselves. */\n readonly collapsed: ReadonlySet<EntityKey>;\n /** Synthetic representatives: scene key → the group it stands for. */\n readonly groupOf: ReadonlyMap<EntityKey, ResolvedGroup>;\n /** Fold anchors in declaration order (deterministic scene output). */\n readonly anchors: readonly NodeId[];\n /** Groups in array order (deterministic super-node suffix order). */\n readonly groups: readonly ResolvedGroup[];\n}\n\nconst EMPTY_FOLDS: readonly FoldRecord[] = Object.freeze([]);\n\n/** An empty forest — nothing collapsed, so `rewriteGroups` passes through. */\nexport const EMPTY_REP_FOREST: RepForest = Object.freeze({\n parent: new Map<EntityKey, EntityKey>(),\n collapsed: new Set<EntityKey>(),\n groupOf: new Map<EntityKey, ResolvedGroup>(),\n anchors: Object.freeze([]) as readonly NodeId[],\n groups: Object.freeze([]) as readonly ResolvedGroup[],\n});\n\n/**\n * Builds the forest from the resolved groups and the live folds.\n *\n * CLAIM ORDER (documented decision): **folds claim their members first**,\n * then groups claim what is left. A fold is a specific user gesture on one\n * node; a `groupBy` partition covers every node in the model. Claiming folds\n * first means toggling `groupBy` on never silently dissolves an existing fold\n * — the anchor keeps its children and, when the group collapses, the whole\n * folded subtree hides inside the group's bubble (the ancestor walk handles\n * it). A node already claimed keeps its first parent; the second claim is\n * skipped, which is what makes \"at most one parent\" true by construction\n * rather than by validation.\n */\nexport function buildRepForest(\n groups: readonly ResolvedGroup[],\n folds: readonly FoldRecord[] = EMPTY_FOLDS,\n): RepForest {\n const parent = new Map<EntityKey, EntityKey>();\n const collapsed = new Set<EntityKey>();\n const groupOf = new Map<EntityKey, ResolvedGroup>();\n const keyByGroupId = new Map<string, EntityKey>();\n\n for (const group of groups) {\n const key = groupSceneKey(group.id);\n groupOf.set(key, group);\n keyByGroupId.set(group.id, key);\n if (group.collapsed) collapsed.add(key);\n }\n\n const anchors: NodeId[] = [];\n for (const fold of folds) {\n // A fold record exists only while folded, so the anchor is collapsed by\n // definition. Recorded even with zero present members: an anchor whose\n // members all left the model still owns the fold until it is unfolded.\n if (collapsed.has(fold.anchorId)) continue; // duplicate anchor: first wins\n collapsed.add(fold.anchorId);\n anchors.push(fold.anchorId);\n for (const member of fold.memberIds) {\n if (member === fold.anchorId) continue;\n if (parent.has(member)) continue;\n parent.set(member, fold.anchorId);\n }\n }\n\n for (const group of groups) {\n const key = keyByGroupId.get(group.id)!;\n for (const member of group.memberIds) {\n // A member naming another GROUP nests it; otherwise it names a node.\n const childKey = keyByGroupId.get(member) ?? member;\n if (childKey === key) continue; // self-membership (rejected at the boundary)\n if (parent.has(childKey)) continue; // already claimed — first parent wins\n parent.set(childKey, key);\n }\n }\n\n return { parent, collapsed, groupOf, anchors, groups };\n}\n\n/** Resolves an entity to the row that stands for it (see the module header). */\nexport type RepResolver = (key: EntityKey) => EntityKey;\n\n/**\n * Memoized resolver over one forest: returns the OUTERMOST collapsed ancestor\n * of `key`, or `key` itself when no ancestor is collapsed. `key` being\n * collapsed does not hide `key` — a representative hides its children, not\n * itself — so a folded anchor resolves to itself and stays drawn.\n *\n * Carries a defensive cycle break: `validateGroupSpecs` rejects cycles at the\n * boundary, but a malformed forest must never spin the rewrite.\n */\nexport function createRepResolver(forest: RepForest): RepResolver {\n const memo = new Map<EntityKey, EntityKey>();\n return function resolve(key: EntityKey): EntityKey {\n const hit = memo.get(key);\n if (hit !== undefined) return hit;\n let out = key;\n let cur = key;\n const seen = new Set<EntityKey>([key]);\n for (;;) {\n const next = forest.parent.get(cur);\n if (next === undefined || seen.has(next)) break;\n seen.add(next);\n cur = next;\n if (forest.collapsed.has(cur)) out = cur;\n }\n memo.set(key, out);\n return out;\n };\n}\n\n// ---------------------------------------------------------------------------\n// §16.3 aggregate style channels (stage 6). Synthetics are styled here, never\n// through caller accessors (R-6.1-14): super-node size grows with member\n// count, meta-edge width with underlying count; colors come from\n// GroupSpec.color or theme tokens at the projection site.\n//\n// A FOLD ANCHOR is a physical row and therefore keeps its caller-driven\n// styling: Orbit never resizes it by hidden count. Hosts that want that read\n// `SceneGroups.folds` (or `getFold`) from their own accessors.\n// ---------------------------------------------------------------------------\n\n/** Physical default size when no nodeSize accessor is configured but the\n * scene needs a full buffer for the synthetic suffix. */\nexport const PHYSICAL_DEFAULT_POINT_SIZE = 4;\n/** Physical default width when no linkWidth accessor is configured. */\nexport const PHYSICAL_DEFAULT_LINK_WIDTH = 1;\nexport const SUPER_NODE_MAX_SIZE = 36;\nexport const META_EDGE_MAX_WIDTH = 8;\n\n/** Aggregate super-node size: sublinear in member count, bounded. */\nexport function superNodeSizeFor(memberCount: number): number {\n const n = Number.isFinite(memberCount) && memberCount > 0 ? memberCount : 1;\n return Math.min(PHYSICAL_DEFAULT_POINT_SIZE + 2 * Math.sqrt(n), SUPER_NODE_MAX_SIZE);\n}\n\n/** Aggregate meta-edge width: sublinear in underlying-edge count, bounded. */\nexport function metaEdgeWidthFor(count: number): number {\n const n = Number.isFinite(count) && count > 0 ? count : 1;\n return Math.min(PHYSICAL_DEFAULT_LINK_WIDTH + Math.log2(n + 1), META_EDGE_MAX_WIDTH);\n}\n\n// ---------------------------------------------------------------------------\n// Validation (§16.3 acyclic/singly-parented) — ONE batched §5.1 diagnostic per pass.\n// ---------------------------------------------------------------------------\n\nexport interface GroupValidationResult {\n /** Null when the array is valid; otherwise ONE batched 'config-error'. */\n diagnostic: GraphDiagnostic | null;\n}\n\n/**\n * Validates a manual `groups` array against the FULL accepted model (members\n * may live outside the current hard scope). Violations, all collected into\n * one diagnostic (§5.1 delivery contract — never one event per bad row):\n * - duplicate group id in the array;\n * - self-membership (a group naming its own id — rejected even when a node\n * with that id exists: the ambiguity itself is the error);\n * - duplicate membership (the same node twice in one group);\n * - overlapping membership (the same node in two groups);\n * - CYCLIC nesting (groups that contain each other, directly or through a\n * chain — the containment forest must stay acyclic);\n * - unknown members (ids absent from the accepted model AND not naming\n * another group; with no accepted model every non-group member is unknown).\n *\n * NESTING IS LEGAL: a member id naming another group id nests that group.\n * Containment is a forest, not a partition — but it stays SINGLY PARENTED,\n * so overlap remains an error.\n */\nexport function validateGroupSpecs(\n specs: readonly GroupSpec[],\n nodeIndex: ReadonlyMap<NodeId, number> | null,\n): GroupValidationResult {\n const problems: string[] = [];\n const samples: string[] = [];\n let count = 0;\n const note = (kind: string, sample: string): void => {\n count++;\n problems.push(kind);\n if (samples.length < DIAGNOSTIC_SAMPLE_CAP) samples.push(sample);\n };\n\n const groupIds = new Set<string>();\n for (const spec of specs) {\n if (groupIds.has(spec.id)) note('duplicate group id', spec.id);\n groupIds.add(spec.id);\n }\n\n /** member id → owning group id (overlap detection across groups). */\n const owner = new Map<string, string>();\n /** child GROUP id → parent group id, for the cycle walk below. */\n const groupParent = new Map<string, string>();\n for (const spec of specs) {\n const seen = new Set<string>();\n for (const member of spec.memberIds) {\n if (member === spec.id) {\n note('self-membership', `${spec.id} ∋ ${member}`);\n continue;\n }\n if (seen.has(member)) {\n note('duplicate membership', `${spec.id} ∋ ${member}`);\n continue;\n }\n seen.add(member);\n const prevOwner = owner.get(member);\n if (prevOwner !== undefined && prevOwner !== spec.id) {\n note('overlapping groups', `${member} ∈ ${prevOwner} ∧ ${spec.id}`);\n continue;\n }\n owner.set(member, spec.id);\n // Distinct namespaces: a member id equal to ANOTHER group's id nests\n // that group (and is therefore not looked up as a node at all).\n if (groupIds.has(member)) {\n groupParent.set(member, spec.id);\n continue;\n }\n if (nodeIndex === null || !nodeIndex.has(member)) {\n note('unknown member', `${spec.id} ∋ ${member}`);\n }\n }\n }\n\n // Containment must be acyclic. Walk each group upward; a repeat visit\n // inside one walk is a cycle. `settled` memoizes ids already proven\n // acyclic so the whole pass stays linear in the nesting edges.\n if (groupParent.size > 0) {\n const settled = new Set<string>();\n for (const start of groupParent.keys()) {\n if (settled.has(start)) continue;\n const path = new Set<string>();\n let cur: string | undefined = start;\n while (cur !== undefined && !settled.has(cur)) {\n if (path.has(cur)) {\n note('cyclic nesting', `${start} ↻ ${cur}`);\n break;\n }\n path.add(cur);\n cur = groupParent.get(cur);\n }\n for (const id of path) settled.add(id);\n }\n }\n\n if (count === 0) return { diagnostic: null };\n const kinds = [...new Set(problems)].join(', ');\n return {\n diagnostic: {\n code: 'config-error',\n severity: 'error',\n count,\n sampleIds: samples,\n message: `groups rejected before scene rewrite (§16.3 acyclic/singly-parented): ${kinds} — the previous group configuration stays active`,\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Resolution — the store surface (§16.3): manual specs → ResolvedGroup[].\n// ---------------------------------------------------------------------------\n\n/**\n * Resolves a VALIDATED manual groups array against the accepted model.\n * Tolerant by design: members that later departed the model drop out of the\n * resolved membership (model drift is data, not a config error — mirrors\n * selection pruning). Spec order and member order are preserved.\n */\nexport function resolveManualGroups(\n specs: readonly GroupSpec[],\n nodeIndex: ReadonlyMap<NodeId, number>,\n): ResolvedGroup[] {\n return specs.map((spec) => {\n const memberIds = spec.memberIds.filter((id) => nodeIndex.has(id));\n return {\n id: spec.id,\n memberIds,\n collapsed: spec.collapsed === true,\n derived: false,\n ...(spec.label !== undefined ? { label: spec.label } : {}),\n ...(spec.color !== undefined ? { color: spec.color } : {}),\n };\n });\n}\n\n/** Canonical structural equality for the groups HOST LANE (GroupSpec is a\n * plain descriptor like Scale — equal literals never re-rewrite, §6.1). */\nexport function sameGroupSpecArrays(\n a: readonly GroupSpec[] | null,\n b: readonly GroupSpec[] | null,\n): boolean {\n if (a === b) return true;\n if (a === null || b === null || a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n const x = a[i]!;\n const y = b[i]!;\n if (\n x.id !== y.id ||\n x.label !== y.label ||\n x.collapsed !== y.collapsed ||\n x.color !== y.color ||\n x.memberIds.length !== y.memberIds.length\n ) {\n return false;\n }\n for (let k = 0; k < x.memberIds.length; k++) {\n if (x.memberIds[k] !== y.memberIds[k]) return false;\n }\n }\n return true;\n}\n\nexport function sameResolvedGroups(\n a: readonly ResolvedGroup[],\n b: readonly ResolvedGroup[],\n): boolean {\n if (a === b) return true;\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n const x = a[i]!;\n const y = b[i]!;\n if (\n x.id !== y.id ||\n x.label !== y.label ||\n x.collapsed !== y.collapsed ||\n x.derived !== y.derived ||\n x.color !== y.color ||\n x.memberIds.length !== y.memberIds.length\n ) {\n return false;\n }\n for (let k = 0; k < x.memberIds.length; k++) {\n if (x.memberIds[k] !== y.memberIds[k]) return false;\n }\n }\n return true;\n}\n\n// ---------------------------------------------------------------------------\n// §16.3 groupBy derivation (S12-T04) — pure, over the ACCEPTED model.\n// Membership under groupBy is derived and READ-ONLY; the instance owns only\n// the per-KEY collapsed residue (R-16.3-16).\n// ---------------------------------------------------------------------------\n\n/**\n * R-16.3-14 collision-safe derived-group id codec: `JSON.stringify(['group',\n * key])`. Injective over keys (JSON string encoding), never equal to the raw\n * key itself (every output starts with `[\"group\",`), and round-trippable via\n * JSON.parse. Labels stay separate — the derived group's `label` is the raw\n * key. Group ids remain a distinct public namespace (§7.4), so a NODE id that\n * happens to equal a derived id still coexists without collision.\n */\nexport function groupByDerivedId(key: string): string {\n return JSON.stringify(['group', key]);\n}\n\n/** Canonical identity for the groupBy HOST LANE: `by` compares by function\n * reference (a new inline lambda re-derives), semanticZoom structurally. */\nexport function sameGroupBySpec<N>(\n a: GroupBySpec<N> | null,\n b: GroupBySpec<N> | null,\n): boolean {\n if (a === b) return true;\n if (a === null || b === null) return false;\n if (a.by !== b.by) return false;\n const sa = a.semanticZoom;\n const sb = b.semanticZoom;\n if (sa === undefined || sb === undefined) return sa === sb;\n return sa.collapseBelow === sb.collapseBelow && sa.expandAbove === sb.expandAbove;\n}\n\n/**\n * D4 boundary validation for a groupBy spec: `by` must be a function and\n * `semanticZoom.expandAbove` must be STRICTLY greater than `collapseBelow`\n * (the §16.3 hysteresis contract T05 builds on). Returns ONE batched\n * 'config-error' diagnostic (the rejected spec never lands — the previous\n * groupBy configuration stays active) or null when valid.\n */\nexport function validateGroupBySpec<N>(spec: GroupBySpec<N>): GraphDiagnostic | null {\n const problems: string[] = [];\n if (typeof spec.by !== 'function') problems.push('`by` must be a function');\n const sz = spec.semanticZoom;\n if (sz !== undefined) {\n const collapseOk = typeof sz.collapseBelow === 'number' && Number.isFinite(sz.collapseBelow);\n const expandOk = typeof sz.expandAbove === 'number' && Number.isFinite(sz.expandAbove);\n if (!collapseOk) problems.push('semanticZoom.collapseBelow must be a finite number');\n if (!expandOk) problems.push('semanticZoom.expandAbove must be a finite number');\n if (collapseOk && expandOk && !(sz.expandAbove > sz.collapseBelow)) {\n problems.push(\n 'semanticZoom.expandAbove must be strictly greater than collapseBelow (hysteresis, R-16.3-22)',\n );\n }\n }\n if (problems.length === 0) return null;\n return {\n code: 'config-error',\n severity: 'error',\n count: problems.length,\n sampleIds: [],\n message: `groupBy rejected (§16.3/D4): ${problems.join('; ')} — the previous groupBy configuration stays active`,\n };\n}\n\nexport interface GroupByDerivation {\n /** One derived group per distinct key, first-encounter order over the\n * model's node list. `collapsed` comes from the caller's residue lookup. */\n groups: readonly ResolvedGroup[];\n /** Derived PUBLIC id → derived key (the setGroupCollapsed reverse map —\n * the residue is keyed by KEY, never by id, R-16.3-16). */\n keyById: ReadonlyMap<string, string>;\n /** ONE aggregated 'accessor-error' warning when `by` threw (the affected\n * nodes derive as ungrouped — never silent loss, I3), else null. */\n diagnostic: GraphDiagnostic | null;\n}\n\n/**\n * §16.3 groupBy derivation: one GroupSpec-shaped ResolvedGroup per distinct\n * string key returned by `by` (first-encounter order, matching §11\n * categorical-domain conventions); `null` — and any non-string value — means\n * ungrouped. Derived ids use {@link groupByDerivedId}; `label` is the raw\n * key; `derived: true` marks membership read-only. `collapsed` defaults to\n * whatever `isCollapsedKey` reports — with an empty residue everything is\n * expanded, so adding groupBy alone changes no rendering (R-16.3-13).\n */\nexport function deriveGroupsByKey<N>(\n nodes: readonly GraphNode<N>[],\n by: (node: GraphNode<N>) => string | null,\n isCollapsedKey: (key: string) => boolean,\n): GroupByDerivation {\n const order: string[] = [];\n const members = new Map<string, NodeId[]>();\n let errorCount = 0;\n const errorSamples: string[] = [];\n for (const node of nodes) {\n let raw: string | null;\n try {\n raw = by(node);\n } catch {\n errorCount++;\n if (errorSamples.length < DIAGNOSTIC_SAMPLE_CAP) errorSamples.push(node.id);\n continue;\n }\n if (typeof raw !== 'string') continue; // null / non-string ⇒ ungrouped\n let bucket = members.get(raw);\n if (bucket === undefined) {\n bucket = [];\n members.set(raw, bucket);\n order.push(raw);\n }\n bucket.push(node.id);\n }\n const groups: ResolvedGroup[] = [];\n const keyById = new Map<string, string>();\n for (const key of order) {\n const id = groupByDerivedId(key);\n keyById.set(id, key);\n groups.push({\n id,\n label: key,\n memberIds: members.get(key)!,\n collapsed: isCollapsedKey(key),\n derived: true,\n });\n }\n return {\n groups,\n keyById,\n diagnostic:\n errorCount === 0\n ? null\n : {\n code: 'accessor-error',\n severity: 'warning',\n count: errorCount,\n sampleIds: errorSamples,\n message: 'groupBy.by threw; the affected nodes derived as ungrouped (§16.3/§8)',\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Stage-3 rewrite.\n// ---------------------------------------------------------------------------\n\nexport interface SuperNodeRecord {\n /** Internal scene key of the super-node row (never public). */\n sceneKey: string;\n group: ResolvedGroup;\n /** TRANSITIVE descendants present in the REWRITTEN model's input\n * (hard-scoped set) — the stage-5 mask and aggregate size read this, not\n * the full declared membership. Transitive and direct coincide unless\n * something is nested underneath. */\n presentMemberIds: readonly NodeId[];\n}\n\nexport interface MetaEdgeRecord {\n /** Internal scene key of the meta-edge row (never public). */\n sceneKey: string;\n /** Public record (§7.4 payload surface): endpoints are PUBLIC ids — a\n * group id or a node id — and `count` is the badge datum. */\n metaEdge: MetaEdge;\n /** Indices of the rerouted edges in the PRE-rewrite model's edge list —\n * the stage-5 \"any underlying edge passes\" rule evaluates these. */\n underlying: readonly number[];\n}\n\nexport interface GroupRewrite<N = Record<string, unknown>, E = Record<string, unknown>> {\n /** The post-rewrite scene model — what feeds the §7.2 structural diff. */\n graph: AcceptedGraph<N, E>;\n /** Physical rows (same objects as the input model's, members removed). */\n physicalNodes: readonly GraphNode<N>[];\n physicalEdges: readonly AcceptedEdge<E>[];\n /** Scene slots >= these counts are synthetic (contiguous-suffix rule). */\n physicalNodeCount: number;\n physicalEdgeCount: number;\n /** Aligned to point slots physicalNodeCount..count-1, in groups order. */\n superNodes: readonly SuperNodeRecord[];\n /** Aligned to link slots physicalEdgeCount..linkCount-1, first-encounter\n * order over the input edge scan. */\n metaEdges: readonly MetaEdgeRecord[];\n /** Drawn fold anchors and the descendant count each currently hides. These\n * are PHYSICAL rows — they occupy no synthetic slot. */\n folds: readonly SceneFold[];\n /** hidden node id → the entity key of the row standing for it (a super-node\n * scene key, or a fold anchor's node id). */\n hiddenOwner: ReadonlyMap<NodeId, EntityKey>;\n}\n\n/**\n * Rewrites the collapsed representatives of `forest` over the hard-scoped\n * model (§7.6 stage 3). Returns null when nothing collapsed intersects the\n * model — an uncollapsed group exists only in store.groups and never\n * rewrites the scene.\n *\n * Deterministic: physical rows keep model order; super-nodes append in\n * groups-array order; meta-edges append in first-encounter order. Edges whose\n * endpoints land on the SAME representative drop — that covers both a\n * same-group internal edge and an anchor's edge to its own folded member,\n * which would otherwise emit a self-loop. Dropped edges are internal state,\n * cached by construction: they re-derive from the unchanged accepted model on\n * expand. Synthetic rows carry no positions; the reconciler's departed cache\n * restores a re-collapsed super-node (stable scene key) and returning members\n * exactly like any other leave-and-return (§7.3).\n */\nexport function rewriteGroups<N, E>(\n model: AcceptedGraph<N, E>,\n forest: RepForest,\n): GroupRewrite<N, E> | null {\n if (forest.collapsed.size === 0) return null;\n const resolve = createRepResolver(forest);\n\n // --- partition the model's nodes by the row that stands for each. ---\n const physicalNodes: GraphNode<N>[] = [];\n const hiddenOwner = new Map<NodeId, EntityKey>();\n /** representative → its TRANSITIVE hidden descendants present in the model. */\n const descendants = new Map<EntityKey, NodeId[]>();\n for (const node of model.nodes) {\n const rep = resolve(node.id);\n if (rep === node.id) {\n physicalNodes.push(node);\n continue;\n }\n hiddenOwner.set(node.id, rep);\n let bucket = descendants.get(rep);\n if (bucket === undefined) {\n bucket = [];\n descendants.set(rep, bucket);\n }\n bucket.push(node.id);\n }\n // Nothing collapsed actually reaches this model — pass through.\n if (hiddenOwner.size === 0) return null;\n\n // --- synthetic suffix: only the OUTERMOST collapsed group materializes (a\n // collapsed group nested inside another is itself hidden). Fold anchors are\n // real rows already in the physical prefix, so they never append here. ---\n const supers: SuperNodeRecord[] = [];\n for (const group of forest.groups) {\n if (!group.collapsed) continue;\n const key = groupSceneKey(group.id);\n if (resolve(key) !== key) continue;\n const present = descendants.get(key);\n if (present === undefined || present.length === 0) continue;\n supers.push({ sceneKey: key, group, presentMemberIds: present });\n }\n const folds: SceneFold[] = [];\n for (const anchorId of forest.anchors) {\n if (resolve(anchorId) !== anchorId) continue; // the anchor is itself hidden\n const present = descendants.get(anchorId);\n if (present === undefined || present.length === 0) continue;\n folds.push({ anchorId, hiddenCount: present.length });\n }\n\n const nodes: GraphNode<N>[] = physicalNodes.slice();\n for (const rec of supers) nodes.push({ id: rec.sceneKey });\n const nodeIndex = new Map<NodeId, number>();\n for (let i = 0; i < nodes.length; i++) nodeIndex.set(nodes[i]!.id, i);\n\n // --- edges: kept physical prefix + meta-edge suffix. A meta-edge\n // aggregates every underlying edge sharing the same DIRECTED rewritten\n // endpoint pair. ---\n const physicalEdges: AcceptedEdge<E>[] = [];\n interface Bucket {\n sourceKey: string;\n targetKey: string;\n metaEdge: { id: string; source: string; target: string; count: number };\n underlying: number[];\n }\n const buckets = new Map<string, Bucket>();\n const order: Bucket[] = [];\n /** Entity key → the PUBLIC endpoint it names (§7.4): a group id for a\n * synthetic representative, the node id itself for a physical one. */\n const publicEndpoint = (key: EntityKey): { kind: 'node' | 'group'; id: string } => {\n const group = forest.groupOf.get(key);\n return group === undefined ? { kind: 'node', id: key } : { kind: 'group', id: group.id };\n };\n for (let k = 0; k < model.edges.length; k++) {\n const edge = model.edges[k]!;\n const sourceKey = resolve(edge.source);\n const targetKey = resolve(edge.target);\n if (sourceKey === edge.source && targetKey === edge.target) {\n physicalEdges.push(edge);\n continue;\n }\n // Both endpoints stand behind ONE row — a same-group internal edge, or a\n // fold anchor's edge to its own member, which would become a self-loop.\n if (sourceKey === targetKey) continue;\n const pairKey = `${sourceKey}\\u0000${targetKey}`;\n let bucket = buckets.get(pairKey);\n if (bucket === undefined) {\n const src = publicEndpoint(sourceKey);\n const tgt = publicEndpoint(targetKey);\n bucket = {\n sourceKey,\n targetKey,\n metaEdge: {\n id: metaEdgePublicId(src.kind, src.id, tgt.kind, tgt.id),\n source: src.id,\n target: tgt.id,\n count: 0,\n },\n underlying: [],\n };\n buckets.set(pairKey, bucket);\n order.push(bucket);\n }\n bucket.metaEdge.count++;\n bucket.underlying.push(k);\n }\n\n const edges: AcceptedEdge<E>[] = physicalEdges.slice();\n const metaRecords: MetaEdgeRecord[] = [];\n for (const bucket of order) {\n const sceneKey = metaEdgeSceneKey(bucket.sourceKey, bucket.targetKey);\n edges.push({ id: sceneKey, source: bucket.sourceKey, target: bucket.targetKey });\n metaRecords.push({ sceneKey, metaEdge: bucket.metaEdge, underlying: bucket.underlying });\n }\n\n return {\n graph: {\n datasetKey: model.datasetKey,\n sourceRevision: model.sourceRevision,\n nodes,\n edges,\n nodeIndex,\n diagnostics: model.diagnostics,\n },\n physicalNodes,\n physicalEdges,\n physicalNodeCount: physicalNodes.length,\n physicalEdgeCount: physicalEdges.length,\n superNodes: supers,\n metaEdges: metaRecords,\n folds,\n hiddenOwner,\n };\n}\n\n// ---------------------------------------------------------------------------\n// §16.3 parallel-edge grouping (S12-T09, R-16.3-24) — a stage-3-ADJACENT\n// rewrite pass over the POST-group-rewrite edge list.\n//\n// ORDERING CONTRACT (documented decision): the group rewrite runs FIRST and\n// this pass collapses over its output. Group meta-edges already aggregate\n// every underlying edge per DIRECTED rewritten endpoint pair by construction\n// (one bucket per pair in `rewriteGroups`), so group-derived meta-edges are\n// bundled without further work and this pass only needs the kept PHYSICAL\n// edges — a physical pair (node, node) can never collide with a group meta\n// pair (which always has at least one group endpoint). Pairs are DIRECTED,\n// matching the T01 bucketing: an A→B and a B→A edge remain two rows.\n// ---------------------------------------------------------------------------\n\n/**\n * Collapses same-DIRECTED-endpoint-pair physical edges into ONE meta-edge\n * per pair, composing with an existing group rewrite (or synthesizing a\n * groups-empty rewrite when none is active). Returns `base` unchanged when\n * no pair has multiplicity > 1 — the toggle is then a scene no-op.\n *\n * Meta-edge identity reuses the T01 codecs: public id\n * `metaEdgePublicId('node', source, 'node', target)` (the R-16.3-24 tuple),\n * internal scene key `metaEdgeSceneKey(source, target)`. `count` (the badge\n * datum) is the collapsed multiplicity and drives the T01 aggregate width\n * channel; `underlying` indexes the PRE-rewrite model's edge list so the\n * stage-5 \"any underlying edge passes\" mask rule applies unchanged.\n */\nexport function collapseParallelEdges<N, E>(\n model: AcceptedGraph<N, E>,\n base: GroupRewrite<N, E> | null,\n): GroupRewrite<N, E> | null {\n const physical = base !== null ? base.physicalEdges : model.edges;\n const multiplicity = new Map<string, number>();\n for (const edge of physical) {\n const key = `${edge.source}\\u0000${edge.target}`;\n multiplicity.set(key, (multiplicity.get(key) ?? 0) + 1);\n }\n let anyParallel = false;\n for (const n of multiplicity.values()) {\n if (n > 1) {\n anyParallel = true;\n break;\n }\n }\n if (!anyParallel) return base;\n\n /** Pre-rewrite edge index by id — `underlying` must address model.edges. */\n const modelEdgeIndex = new Map<string, number>();\n for (let k = 0; k < model.edges.length; k++) modelEdgeIndex.set(model.edges[k]!.id, k);\n\n interface Bucket {\n source: string;\n target: string;\n metaEdge: { id: string; source: string; target: string; count: number };\n underlying: number[];\n }\n const kept: AcceptedEdge<E>[] = [];\n const buckets = new Map<string, Bucket>();\n const order: Bucket[] = [];\n for (const edge of physical) {\n const key = `${edge.source}\\u0000${edge.target}`;\n if (multiplicity.get(key)! < 2) {\n kept.push(edge);\n continue;\n }\n let bucket = buckets.get(key);\n if (bucket === undefined) {\n bucket = {\n source: edge.source,\n target: edge.target,\n metaEdge: {\n id: metaEdgePublicId('node', edge.source, 'node', edge.target),\n source: edge.source,\n target: edge.target,\n count: 0,\n },\n underlying: [],\n };\n buckets.set(key, bucket);\n order.push(bucket);\n }\n bucket.metaEdge.count++;\n bucket.underlying.push(modelEdgeIndex.get(edge.id)!);\n }\n\n // Suffix layout: [group meta rows][parallel meta rows] — records align to\n // link slots physicalEdgeCount..linkCount-1 (contiguous-suffix rule).\n const groupMetaRecords = base !== null ? base.metaEdges : [];\n const groupMetaRows: AcceptedEdge<E>[] = [];\n if (base !== null) {\n for (let j = base.physicalEdgeCount; j < base.graph.edges.length; j++) {\n groupMetaRows.push(base.graph.edges[j]!);\n }\n }\n const parallelRecords: MetaEdgeRecord[] = [];\n const parallelRows: AcceptedEdge<E>[] = [];\n for (const bucket of order) {\n const sceneKey = metaEdgeSceneKey(bucket.source, bucket.target);\n parallelRows.push({ id: sceneKey, source: bucket.source, target: bucket.target });\n parallelRecords.push({ sceneKey, metaEdge: bucket.metaEdge, underlying: bucket.underlying });\n }\n\n const nodes = base !== null ? base.graph.nodes : model.nodes;\n const nodeIndex = base !== null ? base.graph.nodeIndex : model.nodeIndex;\n return {\n graph: {\n datasetKey: model.datasetKey,\n sourceRevision: model.sourceRevision,\n nodes,\n edges: [...kept, ...groupMetaRows, ...parallelRows],\n nodeIndex,\n diagnostics: model.diagnostics,\n },\n physicalNodes: base !== null ? base.physicalNodes : model.nodes,\n physicalEdges: kept,\n physicalNodeCount: base !== null ? base.physicalNodeCount : model.nodes.length,\n physicalEdgeCount: kept.length,\n superNodes: base !== null ? base.superNodes : [],\n metaEdges: [...groupMetaRecords, ...parallelRecords],\n folds: base !== null ? base.folds : [],\n hiddenOwner: base !== null ? base.hiddenOwner : new Map<NodeId, EntityKey>(),\n };\n}\n\n// ---------------------------------------------------------------------------\n// RenderScene discriminated refs (§7.4 seam). The scene stores the compact\n// suffix descriptor; these helpers materialize per-slot refs on demand so\n// consumers never touch internal scene keys.\n// ---------------------------------------------------------------------------\n\n/** The RenderScene.groups descriptor for a rewrite. */\nexport function sceneGroupsOf(rewrite: GroupRewrite<unknown, unknown>): SceneGroups {\n return {\n physicalPointCount: rewrite.physicalNodeCount,\n physicalLinkCount: rewrite.physicalEdgeCount,\n superNodes: rewrite.superNodes.map((rec) => rec.group),\n metaEdges: rewrite.metaEdges.map((rec) => rec.metaEdge),\n folds: rewrite.folds,\n };\n}\n\n/** Discriminated point ref: physical node id or the ResolvedGroup — never an\n * internal scene key. Null when out of range. */\nexport function scenePointRefAt(scene: RenderScene, index: number): ScenePointRef | null {\n if (index < 0 || index >= scene.count) return null;\n const groups = scene.groups;\n if (groups !== undefined && index >= groups.physicalPointCount) {\n const group = groups.superNodes[index - groups.physicalPointCount];\n return group === undefined ? null : { kind: 'group', group };\n }\n const id = scene.idByIndex[index];\n return id === undefined ? null : { kind: 'node', id };\n}\n\n/** Discriminated link ref: physical edge id or the MetaEdge record. */\nexport function sceneLinkRefAt(scene: RenderScene, linkIndex: number): SceneLinkRef | null {\n if (linkIndex < 0 || linkIndex >= scene.linkCount) return null;\n const groups = scene.groups;\n if (groups !== undefined && linkIndex >= groups.physicalLinkCount) {\n const metaEdge = groups.metaEdges[linkIndex - groups.physicalLinkCount];\n return metaEdge === undefined ? null : { kind: 'meta-edge', metaEdge };\n }\n const id = scene.edgeIdByIndex[linkIndex];\n return id === undefined ? null : { kind: 'edge', id };\n}\n","/**\n * §7 reconciler — id↔index model, structural diff, position cache.\n *\n * v0.1 implements the 'rebuild' index policy only (§7.3): every reconcile\n * rebuilds the flat buffers from scratch in accepted-base order, preserving\n * positions by id via the live/departed caches. Pure data-structure work: no\n * DOM, no engine import.\n */\n\nimport type { AcceptedGraph, EdgeId, NodeId, RenderScene } from './types';\n\nexport interface ReconcileResult {\n scene: RenderScene;\n /**\n * True when the node id sequence OR the edge endpoint/id sequence differs\n * from the previous reconcile. The first reconcile is always structural.\n */\n structuralChange: boolean;\n /**\n * True when the resolved position buffer differs from the previous live\n * position mirror. NaN pairs compare equal so attr-only updates on\n * unseeded nodes do not spuriously dirty the engine structure.\n */\n positionChange: boolean;\n /** Nodes whose position was restored from the live or departed cache. */\n reusedPositions: number;\n}\n\n/** §7.1: departed-position LRU cap (entries). A single reconcile's removals\n * are always retained in full, even when that transiently exceeds the cap. */\nconst DEPARTED_CAP = 262_144;\n\nconst EMPTY_INDEX: ReadonlyMap<NodeId, number> = new Map();\n\nexport class Reconciler {\n private datasetKey: string | null = null;\n private hasScene = false;\n\n // Previous scene, kept for the structural diff (§7.2).\n private prevIdByIndex: readonly NodeId[] = [];\n private prevIndexById: ReadonlyMap<NodeId, number> = EMPTY_INDEX;\n private prevEdgeIdByIndex: readonly EdgeId[] = [];\n private prevLinks: Uint32Array = new Uint32Array(0);\n\n /**\n * Declared node.x/y as of the previous reconcile, for nodes that declared\n * them. Lets Priority 1 distinguish a CHANGED declaration (caller intent —\n * wins over any cache) from an unchanged one (defers to live drift). Fresh\n * per pass, so departed ids drop and a re-add treats its declaration as new.\n */\n private prevDeclared: ReadonlyMap<NodeId, readonly [number, number]> = new Map();\n\n /**\n * CPU position mirror for the CURRENT scene, indexed by slot (§7.1 posBuf).\n * Owned copy — never aliases a published scene's positions array, so\n * noteEnginePositions never mutates an already-published RenderScene.\n */\n private livePositions: Float32Array = new Float32Array(0);\n\n /**\n * Ids removed from the scene → last known finite position (§7.1/§7.3\n * leave-and-return guarantee). Map insertion order doubles as LRU order;\n * invariant: never overlaps the current scene's id set.\n */\n private readonly departed = new Map<NodeId, [number, number]>();\n\n reconcile<N, E>(accepted: AcceptedGraph<N, E>): ReconcileResult {\n // §5: a datasetKey change clears all per-dataset id-keyed state.\n if (this.datasetKey !== null && this.datasetKey !== accepted.datasetKey) {\n this.resetDatasetState();\n }\n this.datasetKey = accepted.datasetKey;\n\n const nodes = accepted.nodes;\n const edges = accepted.edges;\n const count = nodes.length;\n const linkCount = edges.length;\n // Under 'rebuild', the scene order IS accepted-base order, so the accepted\n // nodeIndex is exactly the scene's indexById — no rebuild needed.\n const indexById = accepted.nodeIndex;\n\n // --- 1. Removals: bank last known finite positions into departed (O(Δ)).\n const prevIds = this.prevIdByIndex;\n const prevLive = this.livePositions;\n const departed = this.departed;\n const prevDeclared = this.prevDeclared;\n const nextDeclared = new Map<NodeId, readonly [number, number]>();\n let insertedThisPass = 0;\n for (let i = 0; i < prevIds.length; i++) {\n const id = prevIds[i]!;\n if (indexById.has(id)) continue;\n const x = prevLive[2 * i]!;\n const y = prevLive[2 * i + 1]!;\n // NaN pair = position was never known; nothing to preserve.\n if (x === x && y === y) {\n // A removed id was in the prev scene, so it cannot already be in\n // departed (invariant above) — plain set keeps LRU order correct.\n departed.set(id, [x, y]);\n insertedThisPass++;\n }\n }\n\n // --- 2. Build id order + positions in one pass (hot loop: no closures,\n // no per-node allocations beyond the output arrays).\n const idByIndex: NodeId[] = new Array(count);\n const positions = new Float32Array(2 * count);\n const prevIndexById = this.prevIndexById;\n let reusedPositions = 0;\n\n for (let i = 0; i < count; i++) {\n const node = nodes[i]!;\n const id = node.id;\n idByIndex[i] = id;\n\n let x = NaN;\n let y = NaN;\n let fromCache = false;\n\n const prevSlot = prevIndexById.get(id);\n if (prevSlot !== undefined) {\n // Kept id → live cache (posBuf mirror).\n const lx = prevLive[2 * prevSlot]!;\n const ly = prevLive[2 * prevSlot + 1]!;\n if (lx === lx && ly === ly) {\n x = lx;\n y = ly;\n fromCache = true;\n }\n } else {\n // (Re-)added id → consume any departed entry unconditionally, even if\n // fixed coordinates win below, so departed never overlaps the scene.\n const dep = departed.get(id);\n if (dep !== undefined) {\n departed.delete(id);\n x = dep[0];\n y = dep[1];\n fromCache = true;\n }\n }\n\n // Priority 1: finite snapshot coordinates assert caller intent when the\n // node has no cached placement OR the declaration CHANGED since the\n // last accepted snapshot (§10). An UNCHANGED declaration defers to the\n // live cache: under force those coordinates are seeds, and re-asserting\n // them on every attrs-only revision would snap drifted layouts back and\n // trigger a spurious position re-upload + reheat (PR #8 follow-up).\n const fx = node.x;\n const fy = node.y;\n if (fx !== undefined && fy !== undefined && Number.isFinite(fx) && Number.isFinite(fy)) {\n const prev = prevDeclared.get(id);\n const declaredChanged = prev === undefined || prev[0] !== fx || prev[1] !== fy;\n if (!fromCache || declaredChanged) {\n x = fx;\n y = fy;\n fromCache = false;\n }\n nextDeclared.set(id, declaredChanged ? [fx, fy] : prev!);\n }\n\n positions[2 * i] = x;\n positions[2 * i + 1] = y;\n if (fromCache) reusedPositions++;\n }\n this.prevDeclared = nextDeclared;\n\n // --- 3. Links: endpoint indices in accepted edge order.\n const links = new Uint32Array(2 * linkCount);\n const edgeIdByIndex: EdgeId[] = new Array(linkCount);\n for (let k = 0; k < linkCount; k++) {\n const edge = edges[k]!;\n edgeIdByIndex[k] = edge.id;\n // AcceptedGraph guarantees dangling endpoints were dropped (§5.1), so a\n // miss here is programmer error upstream — assert via non-null.\n links[2 * k] = indexById.get(edge.source)!;\n links[2 * k + 1] = indexById.get(edge.target)!;\n }\n\n // --- 4. Structural + resolved-position diffs against the previous scene.\n const structuralChange =\n !this.hasScene ||\n !sameStringSequence(this.prevIdByIndex, idByIndex) ||\n !sameStringSequence(this.prevEdgeIdByIndex, edgeIdByIndex) ||\n !sameUint32(this.prevLinks, links);\n const positionChange = !this.hasScene || !sameFloat32WithNaN(this.livePositions, positions);\n\n // --- 5. Evict departed LRU overflow, but never this reconcile's removals\n // (they are the newest entries; evict only older ones, from the front).\n let evictBudget = departed.size - DEPARTED_CAP;\n const evictable = departed.size - insertedThisPass;\n if (evictBudget > evictable) evictBudget = evictable;\n if (evictBudget > 0) {\n for (const oldId of departed.keys()) {\n departed.delete(oldId);\n if (--evictBudget === 0) break;\n }\n }\n\n const scene: RenderScene = {\n count,\n linkCount,\n idByIndex,\n indexById,\n edgeIdByIndex,\n positions,\n links,\n };\n\n this.prevIdByIndex = idByIndex;\n this.prevIndexById = indexById;\n this.prevEdgeIdByIndex = edgeIdByIndex;\n this.prevLinks = links;\n this.livePositions = new Float32Array(positions);\n this.hasScene = true;\n\n return { scene, structuralChange, positionChange, reusedPositions };\n }\n\n /**\n * Copy engine-read positions into the live cache for the CURRENT scene's\n * slots (§7.1 per-event readback — simulation end, pre-structural-swap).\n * Extra trailing floats are ignored; a short buffer updates a prefix.\n */\n noteEnginePositions(positions: Float32Array): void {\n const live = this.livePositions;\n const n = Math.min(live.length, positions.length);\n if (n === 0) return;\n live.set(positions.subarray(0, n));\n }\n\n private resetDatasetState(): void {\n this.prevIdByIndex = [];\n this.prevIndexById = EMPTY_INDEX;\n this.prevEdgeIdByIndex = [];\n this.prevLinks = new Uint32Array(0);\n this.livePositions = new Float32Array(0);\n this.departed.clear();\n this.prevDeclared = new Map();\n this.hasScene = false;\n }\n}\n\nfunction sameStringSequence(a: readonly string[], b: readonly string[]): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n}\n\nfunction sameUint32(a: Uint32Array, b: Uint32Array): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n}\n\nfunction sameFloat32WithNaN(a: Float32Array, b: Float32Array): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n const av = a[i]!;\n const bv = b[i]!;\n if (av !== bv && !(Number.isNaN(av) && Number.isNaN(bv))) return false;\n }\n return true;\n}\n","/**\n * §8 projection (v0.1 subset): styling accessors → engine-ready typed buffers.\n *\n * Pure and DOM-free. Color parsing covers the CSS subset orbit documents\n * (hex, rgb()/rgba(), hsl()/hsla(), small named map); anything else is a\n * caller error surfaced as a batched 'accessor-error' diagnostic, never a\n * throw and never a NaN in a GPU buffer (§8 numeric hygiene).\n */\n\nimport { DIAGNOSTIC_SAMPLE_CAP } from './types';\nimport type { Accessor, GraphDiagnostic } from './types';\n\nexport type RGBA = [number, number, number, number];\n\nconst DEFAULT_COLOR_FALLBACK: RGBA = [0.66, 0.66, 0.66, 1];\nconst DEFAULT_SIZE_FALLBACK = 4;\nconst COLOR_CACHE_CAP = 4096;\n\n// ---------------------------------------------------------------------------\n// parseColor\n// ---------------------------------------------------------------------------\n\n/** Values are shared tuples (also handed out by parseColor) — never mutate. */\nconst NAMED_COLORS: Record<string, RGBA> = {\n black: [0, 0, 0, 1],\n white: [1, 1, 1, 1],\n red: [1, 0, 0, 1],\n green: [0, 128 / 255, 0, 1],\n blue: [0, 0, 1, 1],\n gray: [128 / 255, 128 / 255, 128 / 255, 1],\n grey: [128 / 255, 128 / 255, 128 / 255, 1],\n orange: [1, 165 / 255, 0, 1],\n yellow: [1, 1, 0, 1],\n purple: [128 / 255, 0, 128 / 255, 1],\n cyan: [0, 1, 1, 1],\n magenta: [1, 0, 1, 1],\n lime: [0, 1, 0, 1],\n steelblue: [70 / 255, 130 / 255, 180 / 255, 1],\n tomato: [1, 99 / 255, 71 / 255, 1],\n teal: [0, 128 / 255, 128 / 255, 1],\n gold: [1, 215 / 255, 0, 1],\n transparent: [0, 0, 0, 0],\n};\n\n/** Successful parses only, keyed by the normalized (trim+lowercase) input. */\nconst colorCache = new Map<string, RGBA>();\n\nfunction clamp01(v: number): number {\n return v < 0 ? 0 : v > 1 ? 1 : v;\n}\n\n/** Strict finite-number parse; rejects '' (Number('') === 0) and junk. */\nfunction num(token: string): number | null {\n if (token === '') return null;\n const v = Number(token);\n return Number.isFinite(v) ? v : null;\n}\n\nfunction parseHex(s: string): RGBA | null {\n const hex = s.slice(1);\n if (!/^[0-9a-f]{3,8}$/.test(hex)) return null;\n switch (hex.length) {\n case 3:\n case 4: {\n // #rgb → #rrggbb: each digit expands to d*17.\n const r = (parseInt(hex[0]!, 16) * 17) / 255;\n const g = (parseInt(hex[1]!, 16) * 17) / 255;\n const b = (parseInt(hex[2]!, 16) * 17) / 255;\n const a = hex.length === 4 ? (parseInt(hex[3]!, 16) * 17) / 255 : 1;\n return [r, g, b, a];\n }\n case 6:\n case 8: {\n const r = parseInt(hex.slice(0, 2), 16) / 255;\n const g = parseInt(hex.slice(2, 4), 16) / 255;\n const b = parseInt(hex.slice(4, 6), 16) / 255;\n const a = hex.length === 8 ? parseInt(hex.slice(6, 8), 16) / 255 : 1;\n return [r, g, b, a];\n }\n default:\n return null; // 5 or 7 digits\n }\n}\n\n/**\n * Splits the inside of rgb()/hsl() parens into 3 channel tokens plus an\n * optional alpha token, accepting both the legacy comma syntax\n * (`r, g, b[, a]`) and the modern space syntax (`r g b[ / a]`).\n */\nfunction splitArgs(inner: string): { channels: [string, string, string]; alpha: string | null } | null {\n const s = inner.trim();\n if (s === '') return null;\n if (s.includes(',')) {\n const parts = s.split(',').map((p) => p.trim());\n if (parts.some((p) => p === '')) return null;\n if (parts.length === 3) return { channels: parts as [string, string, string], alpha: null };\n if (parts.length === 4) return { channels: [parts[0]!, parts[1]!, parts[2]!], alpha: parts[3]! };\n return null;\n }\n const slash = s.split('/');\n if (slash.length > 2) return null;\n const channels = slash[0]!.trim().split(/\\s+/);\n if (channels.length !== 3) return null;\n let alpha: string | null = null;\n if (slash.length === 2) {\n alpha = slash[1]!.trim();\n if (alpha === '') return null;\n }\n return { channels: channels as [string, string, string], alpha };\n}\n\n/** 0–255 number or percentage → [0,1], clamped like CSS. */\nfunction parseRgbChannel(token: string): number | null {\n if (token.endsWith('%')) {\n const v = num(token.slice(0, -1));\n return v === null ? null : clamp01(v / 100);\n }\n const v = num(token);\n return v === null ? null : clamp01(v / 255);\n}\n\n/** Alpha: 0–1 number or percentage → [0,1], clamped. */\nfunction parseAlpha(token: string): number | null {\n if (token.endsWith('%')) {\n const v = num(token.slice(0, -1));\n return v === null ? null : clamp01(v / 100);\n }\n const v = num(token);\n return v === null ? null : clamp01(v);\n}\n\n/** Hue in degrees (optional `deg` suffix); any finite value, wrapped later. */\nfunction parseHue(token: string): number | null {\n return num(token.endsWith('deg') ? token.slice(0, -3) : token);\n}\n\n/** Saturation/lightness: percentage (or bare 0–100 number) → [0,1]. */\nfunction parseSatLight(token: string): number | null {\n const v = num(token.endsWith('%') ? token.slice(0, -1) : token);\n return v === null ? null : clamp01(v / 100);\n}\n\nfunction hslToRgb(h: number, s: number, l: number): [number, number, number] {\n const hue = ((h % 360) + 360) % 360;\n const c = (1 - Math.abs(2 * l - 1)) * s;\n const hp = hue / 60;\n const x = c * (1 - Math.abs((hp % 2) - 1));\n let r = 0;\n let g = 0;\n let b = 0;\n if (hp < 1) [r, g] = [c, x];\n else if (hp < 2) [r, g] = [x, c];\n else if (hp < 3) [g, b] = [c, x];\n else if (hp < 4) [g, b] = [x, c];\n else if (hp < 5) [r, b] = [x, c];\n else [r, b] = [c, x];\n const m = l - c / 2;\n return [r + m, g + m, b + m];\n}\n\nconst FUNCTIONAL_RE = /^(rgb|rgba|hsl|hsla)\\((.*)\\)$/;\n\n/** `key` is already trimmed and lowercased. */\nfunction parseColorUncached(key: string): RGBA | null {\n if (key.startsWith('#')) return parseHex(key);\n const named = NAMED_COLORS[key];\n if (named !== undefined) return named;\n const m = FUNCTIONAL_RE.exec(key);\n if (m === null) return null;\n const args = splitArgs(m[2]!);\n if (args === null) return null;\n const alpha = args.alpha === null ? 1 : parseAlpha(args.alpha);\n if (alpha === null) return null;\n const [c0, c1, c2] = args.channels;\n if (m[1] === 'rgb' || m[1] === 'rgba') {\n const r = parseRgbChannel(c0);\n const g = parseRgbChannel(c1);\n const b = parseRgbChannel(c2);\n if (r === null || g === null || b === null) return null;\n return [r, g, b, alpha];\n }\n const h = parseHue(c0);\n const s = parseSatLight(c1);\n const l = parseSatLight(c2);\n if (h === null || s === null || l === null) return null;\n const [r, g, b] = hslToRgb(h, s, l);\n return [r, g, b, alpha];\n}\n\n/**\n * Pure, DOM-free CSS color parse → RGBA floats in [0,1], or null when the\n * string is not a recognized color. Successful parses are memoized (cache\n * capped at 4096 entries; cleared wholesale on overflow). The returned tuple\n * is shared across calls — treat it as immutable.\n */\nexport function parseColor(css: string): RGBA | null {\n if (typeof css !== 'string') return null; // runtime hygiene for untyped accessor output\n const key = css.trim().toLowerCase();\n if (key === '') return null;\n const hit = colorCache.get(key);\n if (hit !== undefined) return hit;\n const parsed = parseColorUncached(key);\n if (parsed !== null) {\n if (colorCache.size >= COLOR_CACHE_CAP) colorCache.clear();\n colorCache.set(key, parsed);\n }\n return parsed;\n}\n\n// ---------------------------------------------------------------------------\n// Projection helpers\n// ---------------------------------------------------------------------------\n\n/** Sample id: the item's string `id` when present, else its index. */\nfunction sampleIdOf(item: unknown, index: number): string {\n if (item !== null && typeof item === 'object') {\n const id = (item as { id?: unknown }).id;\n if (typeof id === 'string') return id;\n }\n return String(index);\n}\n\nfunction accessorDiagnostic(count: number, total: number, channel: string, sampleIds: string[]): GraphDiagnostic {\n return {\n code: 'accessor-error',\n severity: 'warning',\n count,\n sampleIds,\n message: `${channel} accessor failed or produced an invalid value for ${count} of ${total} item(s); fallback applied.`,\n };\n}\n\n/** First min(cap, total) sample ids — used when a constant affects every item. */\nfunction leadingSampleIds<T>(items: readonly T[]): string[] {\n const n = Math.min(items.length, DIAGNOSTIC_SAMPLE_CAP);\n const out: string[] = [];\n for (let i = 0; i < n; i++) out.push(sampleIdOf(items[i], i));\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// projectColors\n// ---------------------------------------------------------------------------\n\nexport function projectColors<T>(\n items: readonly T[],\n accessor: Accessor<T, string>,\n fallback: [number, number, number, number] = DEFAULT_COLOR_FALLBACK,\n): { buffer: Float32Array; diagnostics: GraphDiagnostic[] } {\n const n = items.length;\n const buffer = new Float32Array(n * 4);\n // A non-finite fallback would defeat the NaN-never-in-buffer guarantee.\n const fb: RGBA = fallback.every(Number.isFinite) ? (fallback as RGBA) : DEFAULT_COLOR_FALLBACK;\n const diagnostics: GraphDiagnostic[] = [];\n\n if (typeof accessor !== 'function') {\n // Constant path: parse once, fill.\n const parsed = parseColor(accessor);\n const c = parsed ?? fb;\n const [r, g, b, a] = c;\n for (let o = 0; o < buffer.length; o += 4) {\n buffer[o] = r;\n buffer[o + 1] = g;\n buffer[o + 2] = b;\n buffer[o + 3] = a;\n }\n if (parsed === null && n > 0) {\n diagnostics.push(accessorDiagnostic(n, n, 'color', leadingSampleIds(items)));\n }\n return { buffer, diagnostics };\n }\n\n const fn = accessor as (item: T) => string;\n const fb0 = fb[0];\n const fb1 = fb[1];\n const fb2 = fb[2];\n const fb3 = fb[3];\n let errorCount = 0;\n const samples: string[] = [];\n for (let i = 0; i < n; i++) {\n const item = items[i] as T;\n let rgba: RGBA | null;\n try {\n rgba = parseColor(fn(item));\n } catch {\n rgba = null;\n }\n const o = i * 4;\n if (rgba === null) {\n errorCount++;\n if (samples.length < DIAGNOSTIC_SAMPLE_CAP) samples.push(sampleIdOf(item, i));\n buffer[o] = fb0;\n buffer[o + 1] = fb1;\n buffer[o + 2] = fb2;\n buffer[o + 3] = fb3;\n } else {\n buffer[o] = rgba[0];\n buffer[o + 1] = rgba[1];\n buffer[o + 2] = rgba[2];\n buffer[o + 3] = rgba[3];\n }\n }\n if (errorCount > 0) diagnostics.push(accessorDiagnostic(errorCount, n, 'color', samples));\n return { buffer, diagnostics };\n}\n\n// ---------------------------------------------------------------------------\n// projectSizes\n// ---------------------------------------------------------------------------\n\nexport function projectSizes<T>(\n items: readonly T[],\n accessor: Accessor<T, number>,\n fallbackSize: number = DEFAULT_SIZE_FALLBACK,\n): { buffer: Float32Array; diagnostics: GraphDiagnostic[] } {\n const n = items.length;\n const buffer = new Float32Array(n);\n // Sanitize the fallback itself so NaN can never enter the buffer through it.\n const fb = Number.isFinite(fallbackSize) && fallbackSize >= 0 ? fallbackSize : DEFAULT_SIZE_FALLBACK;\n const diagnostics: GraphDiagnostic[] = [];\n\n if (typeof accessor !== 'function') {\n const valid = typeof accessor === 'number' && Number.isFinite(accessor) && accessor >= 0;\n buffer.fill(valid ? accessor : fb);\n if (!valid && n > 0) {\n diagnostics.push(accessorDiagnostic(n, n, 'size', leadingSampleIds(items)));\n }\n return { buffer, diagnostics };\n }\n\n const fn = accessor as (item: T) => number;\n let errorCount = 0;\n const samples: string[] = [];\n for (let i = 0; i < n; i++) {\n const item = items[i] as T;\n let v: number;\n try {\n v = fn(item);\n } catch {\n v = NaN;\n }\n // typeof guard: untyped runtime data can smuggle strings past the types.\n if (typeof v === 'number' && Number.isFinite(v) && v >= 0) {\n buffer[i] = v;\n } else {\n errorCount++;\n if (samples.length < DIAGNOSTIC_SAMPLE_CAP) samples.push(sampleIdOf(item, i));\n buffer[i] = fb;\n }\n }\n if (errorCount > 0) diagnostics.push(accessorDiagnostic(errorCount, n, 'size', samples));\n return { buffer, diagnostics };\n}\n","/**\n * §7.5 revisioned ingestion — pure session/overlay bookkeeping plus the\n * instance-local acceptance queue (S8-T01..T07).\n *\n * Everything here is data-structure work: no store, no engine, no DOM. The\n * GraphInstance wires these helpers into its publication path (instance.ts).\n *\n * Ordering model: every admission takes a monotonically increasing ticket from\n * the instance's AcceptanceQueue. Overlay rows are stamped with their\n * admission ticket, and the merge folds base + overlays strictly in ticket\n * order — arrival at the queue IS the global admission order (§7.5).\n */\n\nimport { DIAGNOSTIC_SAMPLE_CAP } from './types';\nimport { nextSynthesizedEdgeId } from './edgeIdentity';\nimport type { EdgePairCounters } from './edgeIdentity';\nimport type {\n AcceptedEdge,\n AcceptedGraph,\n GraphDiagnostic,\n GraphEdge,\n GraphNode,\n IngestBatch,\n NodeId,\n} from './types';\n\n// ---------------------------------------------------------------------------\n// Protocol defaults (§7.5).\n// ---------------------------------------------------------------------------\n\n/** Byte backpressure budget default: 8 MiB of admitted-but-unflushed payload. */\nexport const INGEST_MAX_PENDING_BYTES_DEFAULT = 8_388_608;\n/** Progressive-overlay coalesced flush latency cap default (ms). */\nexport const INGEST_MAX_FLUSH_LATENCY_MS_DEFAULT = 50;\n/** A single batch larger than `factor × maxPendingBytes` rejects outright. */\nexport const INGEST_OVERFLOW_FACTOR = 4;\n\n// ---------------------------------------------------------------------------\n// Acceptance queue (T01). One per instance: EVERY state publication —\n// applyHostUpdate, session admissions/flushes/commits/aborts, overlay\n// removals, and (wave 2) service admissions — routes through it. Arrival at\n// the queue defines the global admission order (§7.5). v0.5 executes jobs\n// synchronously in arrival order (no workers yet); the object exists as the\n// serialization seam wave 2 builds on.\n// ---------------------------------------------------------------------------\n\nexport class AcceptanceQueue {\n private ticket = 0;\n /** Depth guard: admissions made from inside a job run nested — arrival\n * order still equals call order under synchronous execution. */\n private depth = 0;\n\n /** Total admissions so far (the global admission-order clock). */\n get admissions(): number {\n return this.ticket;\n }\n\n /** True while a job admitted by this queue is executing. */\n get active(): boolean {\n return this.depth > 0;\n }\n\n /** Take the next admission-order ticket without running a job (row stamps). */\n nextTicket(): number {\n return ++this.ticket;\n }\n\n /**\n * Admit a job at the tail of the global order and execute it synchronously.\n * Exceptions propagate to the admitter (v0.5 synchronous execution).\n */\n admit<T>(job: () => T): T {\n this.ticket++;\n this.depth++;\n try {\n return job();\n } finally {\n this.depth--;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Byte accounting (§7.5 backpressure).\n// ---------------------------------------------------------------------------\n\n/** Fallback per-row estimate when a payload cannot be JSON-serialized. */\nconst ROW_BYTE_FALLBACK = 64;\n\n/** `batch.bytes` when declared, else a rough JSON estimate of the payload. */\nexport function estimateBatchBytes(batch: IngestBatch<unknown, unknown>): number {\n const declared = batch.bytes;\n if (typeof declared === 'number' && Number.isFinite(declared) && declared >= 0) {\n return declared;\n }\n let total = 0;\n if (batch.nodes !== undefined) {\n try {\n total += JSON.stringify(batch.nodes).length;\n } catch {\n total += batch.nodes.length * ROW_BYTE_FALLBACK;\n }\n }\n if (batch.edges !== undefined) {\n try {\n total += JSON.stringify(batch.edges).length;\n } catch {\n total += batch.edges.length * ROW_BYTE_FALLBACK;\n }\n }\n return total;\n}\n\n// ---------------------------------------------------------------------------\n// Row tallies — §5.1-style batched accounting for commit-time diagnostics.\n// ---------------------------------------------------------------------------\n\nexport interface RowTally {\n count: number;\n samples: string[];\n}\n\nexport function newRowTally(): RowTally {\n return { count: 0, samples: [] };\n}\n\nfunction recordRow(tally: RowTally, sampleId: string): void {\n tally.count++;\n if (tally.samples.length < DIAGNOSTIC_SAMPLE_CAP) tally.samples.push(sampleId);\n}\n\n/** Per-session staging tallies; surfaced as diagnostics ONLY at commit (§7.5). */\nexport interface StagingTallies {\n invalidNodes: RowTally;\n duplicateNodes: RowTally;\n invalidEdges: RowTally;\n duplicateEdges: RowTally;\n}\n\nexport function newStagingTallies(): StagingTallies {\n return {\n invalidNodes: newRowTally(),\n duplicateNodes: newRowTally(),\n invalidEdges: newRowTally(),\n duplicateEdges: newRowTally(),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Session contribution — the per-session tag index (§7.5 rollback metadata).\n// Retains the FULL admitted row set (shadowed rows included) so abort and\n// removeOverlay can remove exactly this session's rows, never a whole-scene\n// checkpoint.\n// ---------------------------------------------------------------------------\n\nexport interface StampedNode<N> {\n /** Global admission-order ticket (queue arrival). */\n readonly order: number;\n readonly node: GraphNode<N>;\n}\n\nexport interface StampedEdge<E> {\n readonly order: number;\n readonly edge: AcceptedEdge<E>;\n}\n\nexport interface SessionContribution<N = Record<string, unknown>, E = Record<string, unknown>> {\n readonly overlayId: string;\n /** Session-deduped admitted node rows in admission order. */\n readonly nodes: StampedNode<N>[];\n /** Session-deduped admitted edge records (ids resolved) in admission order. */\n readonly edges: StampedEdge<E>[];\n readonly nodeIds: Set<NodeId>;\n readonly edgeIds: Set<string>;\n /** Exact ordered endpoint tuple → next synthesized-parallel-edge k (§5). */\n readonly pairCounters: EdgePairCounters;\n /** Public prefix lengths: rows before these counts have been published\n * (progressive flush / commit); appends only grow the arrays, so a prefix\n * is sufficient. Atomic sessions stay at 0 until commit (§7.5). */\n publicNodeCount: number;\n publicEdgeCount: number;\n}\n\nexport function newContribution<N, E>(overlayId: string): SessionContribution<N, E> {\n return {\n overlayId,\n nodes: [],\n edges: [],\n nodeIds: new Set(),\n edgeIds: new Set(),\n pairCounters: new Map(),\n publicNodeCount: 0,\n publicEdgeCount: 0,\n };\n}\n\nexport interface StageResult {\n admittedNodes: number;\n admittedEdges: number;\n}\n\n/**\n * Validate and stage one batch's rows into a session contribution.\n *\n * §5.1-equivalent row validation WITHOUT endpoint checks — edges may arrive\n * before nodes (§7.5): they occupy their eventual edge records here; endpoint\n * resolution happens at merge. Within a session, duplicate ids are\n * first-wins-dropped (tallied for commit diagnostics); cross-session\n * collisions are the merge's shadowing concern, not staging's.\n */\nexport function stageBatch<N, E>(\n contribution: SessionContribution<N, E>,\n batch: IngestBatch<N, E>,\n tallies: StagingTallies,\n nextOrder: () => number,\n): StageResult {\n let admittedNodes = 0;\n let admittedEdges = 0;\n\n const rawNodes: readonly unknown[] =\n batch.nodes !== undefined && Array.isArray(batch.nodes) ? batch.nodes : [];\n for (let i = 0; i < rawNodes.length; i++) {\n const row = rawNodes[i];\n const id = typeof row === 'object' && row !== null ? (row as { id?: unknown }).id : undefined;\n if (typeof id !== 'string') {\n recordRow(tallies.invalidNodes, `[${batch.sequence}:${i}]`);\n continue;\n }\n if (contribution.nodeIds.has(id)) {\n recordRow(tallies.duplicateNodes, id);\n continue;\n }\n contribution.nodeIds.add(id);\n contribution.nodes.push({ order: nextOrder(), node: row as GraphNode<N> });\n admittedNodes++;\n }\n\n const rawEdges: readonly unknown[] =\n batch.edges !== undefined && Array.isArray(batch.edges) ? batch.edges : [];\n for (let i = 0; i < rawEdges.length; i++) {\n const row = rawEdges[i];\n if (typeof row !== 'object' || row === null) {\n recordRow(tallies.invalidEdges, `[${batch.sequence}:${i}]`);\n continue;\n }\n const edge = row as { id?: unknown; source?: unknown; target?: unknown };\n if (typeof edge.source !== 'string' || typeof edge.target !== 'string') {\n recordRow(tallies.invalidEdges, typeof edge.id === 'string' ? edge.id : `[${batch.sequence}:${i}]`);\n continue;\n }\n const hasExplicitId = typeof edge.id === 'string';\n let id: string;\n if (hasExplicitId) {\n id = edge.id as string;\n } else {\n // §5 synthesis scheme with SESSION-scoped pair counters: deterministic\n // and stable per session. A synthesized id colliding with the base's\n // (or another overlay's) same-pair id is dropped at merge as a\n // duplicate — callers wanting cross-source parallel edges must use\n // their single explicit edge-id scheme (§9.2).\n id = nextSynthesizedEdgeId(\n contribution.pairCounters,\n edge.source,\n edge.target,\n );\n }\n if (contribution.edgeIds.has(id)) {\n recordRow(tallies.duplicateEdges, id);\n continue;\n }\n contribution.edgeIds.add(id);\n const record: AcceptedEdge<E> = hasExplicitId\n ? (row as AcceptedEdge<E>)\n : { ...(row as GraphEdge<E>), id };\n contribution.edges.push({ order: nextOrder(), edge: record });\n admittedEdges++;\n }\n\n return { admittedNodes, admittedEdges };\n}\n\n// ---------------------------------------------------------------------------\n// Merge — overlays layered over the accepted base in global admission order\n// (T06), with edge-before-node endpoint resolution (T05).\n// ---------------------------------------------------------------------------\n\n/** The accepted base (declarative snapshot or committed replace session). */\nexport interface MergeBase<N = Record<string, unknown>, E = Record<string, unknown>> {\n datasetKey: string;\n sourceRevision: number | string;\n nodes: readonly GraphNode<N>[];\n /** id → position in `nodes`. */\n nodeIndex: ReadonlyMap<NodeId, number>;\n /** Endpoint-resolved base edges. */\n edges: readonly AcceptedEdge<E>[];\n /** Replace-session bases retain edge records whose endpoints were missing\n * at commit; a later overlay node can still resolve them (§7.5). */\n pendingEdges: readonly StampedEdge<E>[];\n diagnostics: readonly GraphDiagnostic[];\n}\n\n/** Sentinel owner key for base pending edges in `pendingBySource`. */\nexport const BASE_PENDING_KEY = '';\n\nexport interface MergeResult<N = Record<string, unknown>, E = Record<string, unknown>> {\n accepted: AcceptedGraph<N, E>;\n /** Overlay node rows shadowed by an earlier admission (base included). */\n shadowedCount: number;\n shadowedSamples: readonly string[];\n /** Later same-id edge records dropped (first admission wins). */\n duplicateEdgeCount: number;\n duplicateEdgeSamples: readonly string[];\n /** overlayId (or BASE_PENDING_KEY) → edges still awaiting an endpoint. The\n * pending-endpoint index: these occupy edge records but never enter the\n * engine link buffer (§7.5). */\n pendingBySource: ReadonlyMap<string, number>;\n pendingEdgeCount: number;\n}\n\nexport function baseFromAccepted<N, E>(accepted: AcceptedGraph<N, E>): MergeBase<N, E> {\n return {\n datasetKey: accepted.datasetKey,\n sourceRevision: accepted.sourceRevision,\n nodes: accepted.nodes,\n nodeIndex: accepted.nodeIndex,\n edges: accepted.edges,\n pendingEdges: [],\n diagnostics: accepted.diagnostics,\n };\n}\n\n/**\n * Build a MergeBase from a replace session's staged contribution. Edges whose\n * endpoints exist in the session's own node set resolve immediately; the rest\n * stay pending (they may resolve through later overlays).\n */\nexport function baseFromContribution<N, E>(\n datasetKey: string,\n sourceRevision: number | string,\n contribution: SessionContribution<N, E>,\n diagnostics: readonly GraphDiagnostic[],\n): MergeBase<N, E> {\n const nodes: GraphNode<N>[] = new Array(contribution.nodes.length);\n const nodeIndex = new Map<NodeId, number>();\n for (let i = 0; i < contribution.nodes.length; i++) {\n const node = contribution.nodes[i]!.node;\n nodes[i] = node;\n nodeIndex.set(node.id, i);\n }\n const edges: AcceptedEdge<E>[] = [];\n const pendingEdges: StampedEdge<E>[] = [];\n for (const se of contribution.edges) {\n if (nodeIndex.has(se.edge.source) && nodeIndex.has(se.edge.target)) {\n edges.push(se.edge);\n } else {\n pendingEdges.push(se);\n }\n }\n return { datasetKey, sourceRevision, nodes, nodeIndex, edges, pendingEdges, diagnostics };\n}\n\ninterface OwnedStampedEdge<E> {\n readonly order: number;\n readonly edge: AcceptedEdge<E>;\n readonly owner: string;\n}\n\n/**\n * Merge the accepted base with every overlay contribution's PUBLIC rows.\n *\n * - Node collisions: earliest admission (ticket order; base first) wins.\n * Later rows stay retained-but-shadowed in their contribution and are\n * tallied for the single count-aggregated 'overlay-node-shadowed' info\n * diagnostic (§7.5).\n * - Edge ids: first admission wins; later same-id records are dropped\n * (tallied). An edge whose endpoints are not all present in the merged\n * node set is pending — it occupies its record and the pending-endpoint\n * accounting but is excluded from `accepted.edges` (and therefore from the\n * engine link buffer). Endpoints arriving later resolve it on the next\n * merge (same or different batch/overlay).\n *\n * Deterministic: output depends only on the base and the stamped rows.\n */\nexport function mergeModel<N, E>(\n base: MergeBase<N, E>,\n overlays: readonly SessionContribution<N, E>[],\n): MergeResult<N, E> {\n // --- nodes: base first (earliest admission), then overlay rows by ticket.\n const nodes: GraphNode<N>[] = [...base.nodes];\n const nodeIndex = new Map<NodeId, number>(base.nodeIndex);\n const stampedNodes: StampedNode<N>[] = [];\n for (const c of overlays) {\n for (let i = 0; i < c.publicNodeCount; i++) stampedNodes.push(c.nodes[i]!);\n }\n stampedNodes.sort((a, b) => a.order - b.order);\n const shadowed = newRowTally();\n for (const sn of stampedNodes) {\n const id = sn.node.id;\n if (nodeIndex.has(id)) {\n recordRow(shadowed, id);\n continue;\n }\n nodeIndex.set(id, nodes.length);\n nodes.push(sn.node);\n }\n\n // --- edges: base resolved edges first, then base pending + overlay edges\n // in ticket order, deduped by id and endpoint-resolved against the merged\n // node set.\n const edges: AcceptedEdge<E>[] = [...base.edges];\n const edgeIds = new Set<string>();\n for (const e of base.edges) edgeIds.add(e.id);\n\n const stampedEdges: OwnedStampedEdge<E>[] = [];\n for (const se of base.pendingEdges) {\n stampedEdges.push({ order: se.order, edge: se.edge, owner: BASE_PENDING_KEY });\n }\n for (const c of overlays) {\n for (let i = 0; i < c.publicEdgeCount; i++) {\n const se = c.edges[i]!;\n stampedEdges.push({ order: se.order, edge: se.edge, owner: c.overlayId });\n }\n }\n stampedEdges.sort((a, b) => a.order - b.order);\n\n const duplicates = newRowTally();\n const pendingBySource = new Map<string, number>();\n let pendingEdgeCount = 0;\n for (const se of stampedEdges) {\n const edge = se.edge;\n if (edgeIds.has(edge.id)) {\n recordRow(duplicates, edge.id);\n continue;\n }\n edgeIds.add(edge.id);\n if (nodeIndex.has(edge.source) && nodeIndex.has(edge.target)) {\n edges.push(edge);\n } else {\n pendingBySource.set(se.owner, (pendingBySource.get(se.owner) ?? 0) + 1);\n pendingEdgeCount++;\n }\n }\n\n const accepted: AcceptedGraph<N, E> = {\n datasetKey: base.datasetKey,\n sourceRevision: base.sourceRevision,\n nodes,\n edges,\n nodeIndex,\n diagnostics: base.diagnostics,\n };\n return {\n accepted,\n shadowedCount: shadowed.count,\n shadowedSamples: shadowed.samples,\n duplicateEdgeCount: duplicates.count,\n duplicateEdgeSamples: duplicates.samples,\n pendingBySource,\n pendingEdgeCount,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Diagnostics builders.\n// ---------------------------------------------------------------------------\n\n/** Recomputed per merge: ONE count-aggregated shadow info + edge-dedupe note. */\nexport function mergeDiagnostics(merge: MergeResult<unknown, unknown>): GraphDiagnostic[] {\n const out: GraphDiagnostic[] = [];\n if (merge.shadowedCount > 0) {\n out.push({\n code: 'overlay-node-shadowed',\n severity: 'info',\n count: merge.shadowedCount,\n sampleIds: merge.shadowedSamples,\n message: `${merge.shadowedCount} overlay node row(s) shadowed by a same-id row admitted earlier (§7.5); rows retained`,\n });\n }\n if (merge.duplicateEdgeCount > 0) {\n out.push({\n code: 'duplicate-edge-id',\n severity: 'warning',\n count: merge.duplicateEdgeCount,\n sampleIds: merge.duplicateEdgeSamples,\n message: `${merge.duplicateEdgeCount} overlay edge record(s) dropped: id already admitted (first admission wins)`,\n });\n }\n return out;\n}\n\n/**\n * Commit-time diagnostics for one session: staging tallies plus the dangling\n * (still-pending-endpoint) count — emitted ONLY at session commit (§7.5).\n */\nexport function sessionCommitDiagnostics(\n tallies: StagingTallies,\n danglingCount: number,\n danglingSamples: readonly string[] = [],\n): GraphDiagnostic[] {\n const out: GraphDiagnostic[] = [];\n const push = (\n code: GraphDiagnostic['code'],\n severity: GraphDiagnostic['severity'],\n tally: RowTally,\n message: string,\n ): void => {\n if (tally.count === 0) return;\n out.push({ code, severity, count: tally.count, sampleIds: tally.samples, message });\n };\n push(\n 'invalid-node',\n 'error',\n tallies.invalidNodes,\n `${tallies.invalidNodes.count} ingested node row(s) dropped: missing or non-string id`,\n );\n push(\n 'duplicate-node-id',\n 'warning',\n tallies.duplicateNodes,\n `${tallies.duplicateNodes.count} duplicate node id(s) dropped within the session (first occurrence wins)`,\n );\n push(\n 'invalid-edge',\n 'error',\n tallies.invalidEdges,\n `${tallies.invalidEdges.count} ingested edge row(s) dropped: missing or non-string source/target`,\n );\n push(\n 'duplicate-edge-id',\n 'warning',\n tallies.duplicateEdges,\n `${tallies.duplicateEdges.count} duplicate edge id(s) dropped within the session (first occurrence wins)`,\n );\n if (danglingCount > 0) {\n out.push({\n code: 'dangling-edge-endpoint',\n severity: 'warning',\n count: danglingCount,\n sampleIds: danglingSamples.slice(0, DIAGNOSTIC_SAMPLE_CAP),\n message: `${danglingCount} ingested edge(s) still awaiting an endpoint at commit (pending-endpoint index; §7.5)`,\n });\n }\n return out;\n}\n","/**\n * §16.2 selection set algebra — pure helpers over id arrays.\n *\n * Selection namespaces are id-ordered \"sets\": first-occurrence deduped, and —\n * once validated against an accepted base — stored in accepted-base order.\n * Everything here is allocation-only pure data work: no store, no engine.\n */\n\n/** Keep the first occurrence of every id, preserving encounter order. */\nexport function dedupeFirstOccurrence<T>(ids: readonly T[]): T[] {\n const seen = new Set<T>();\n const out: T[] = [];\n for (const id of ids) {\n if (seen.has(id)) continue;\n seen.add(id);\n out.push(id);\n }\n return out;\n}\n\n/**\n * Validate ids against an accepted base index (node or edge): unknown ids are\n * dropped, duplicates collapse to their first occurrence, and the result is\n * ordered by accepted-base position (§16.2 canonical storage order).\n */\nexport function orderByAcceptedBase(\n ids: readonly string[],\n baseIndex: ReadonlyMap<string, number>,\n): string[] {\n const seen = new Set<string>();\n const known: string[] = [];\n for (const id of ids) {\n if (seen.has(id) || !baseIndex.has(id)) continue;\n seen.add(id);\n known.push(id);\n }\n known.sort((a, b) => baseIndex.get(a)! - baseIndex.get(b)!);\n return known;\n}\n\n/** a ∪ b, first-occurrence order (a's order wins, then b's new ids). */\nexport function unionIds<T>(a: readonly T[], b: readonly T[]): T[] {\n return dedupeFirstOccurrence([...a, ...b]);\n}\n\n/** a \\ b, keeping a's (deduped) order. */\nexport function differenceIds<T>(a: readonly T[], b: readonly T[]): T[] {\n const drop = new Set(b);\n return dedupeFirstOccurrence(a).filter((id) => !drop.has(id));\n}\n\n/** a ∩ b, keeping a's (deduped) order. */\nexport function intersectionIds<T>(a: readonly T[], b: readonly T[]): T[] {\n const keep = new Set(b);\n return dedupeFirstOccurrence(a).filter((id) => keep.has(id));\n}\n\n/** Toggle membership of `id` in `ids` (meta-click semantics, §16.2). */\nexport function toggleId<T>(ids: readonly T[], id: T): T[] {\n return ids.includes(id) ? ids.filter((x) => x !== id) : [...dedupeFirstOccurrence(ids), id];\n}\n","/**\n * §7.1/§13 CSR adjacency over columnar link buffers.\n *\n * Pure, engine-free helpers shared by local expansion (§9.2), incident-edge\n * dirtying (§9.1), and the engine-facing `neighborIndices` interaction helper\n * (§13). Build is O(L) via two counting passes over the flat\n * `[src0, tgt0, src1, tgt1, …]` link buffer — no comparison sort and no\n * per-link allocation (the only allocations are the CSR arrays plus one\n * point-sized cursor array).\n *\n * The adjacency is UNDIRECTED: every link contributes one neighbor entry per\n * endpoint slot, so parallel links repeat, and a self-loop (a, a) lists `a`\n * twice under point a — once per endpoint slot.\n */\n\nexport interface Adjacency {\n /**\n * Length `pointCount + 1`; the neighbors of point `i` live at\n * `neighbors[offsets[i] … offsets[i + 1])`.\n */\n readonly offsets: Uint32Array;\n /** Length `links.length` (two entries per link — one per direction). */\n readonly neighbors: Uint32Array;\n}\n\n/**\n * Builds a CSR adjacency from a flat `[src, tgt]` pair buffer.\n *\n * @param links flat `[src0, tgt0, src1, tgt1, …]` point-index pairs\n * @param pointCount number of points; every endpoint must be `< pointCount`\n */\nexport function buildAdjacency(links: Uint32Array, pointCount: number): Adjacency {\n if (!Number.isInteger(pointCount) || pointCount < 0) {\n throw new RangeError(`buildAdjacency: pointCount must be a non-negative integer, got ${pointCount}`);\n }\n if ((links.length & 1) !== 0) {\n throw new RangeError(`buildAdjacency: links length must be even ([src, tgt] pairs), got ${links.length}`);\n }\n\n const n = links.length;\n const offsets = new Uint32Array(pointCount + 1);\n\n // Pass 1: per-point degree counts (each endpoint slot counts once).\n for (let i = 0; i < n; i++) {\n const p = links[i]!;\n if (p >= pointCount) {\n throw new RangeError(`buildAdjacency: link endpoint ${p} out of range (pointCount ${pointCount})`);\n }\n offsets[p + 1] = offsets[p + 1]! + 1;\n }\n\n // Exclusive prefix sum → CSR offsets.\n for (let i = 1; i <= pointCount; i++) {\n offsets[i] = offsets[i]! + offsets[i - 1]!;\n }\n\n // Pass 2: counting-sort fill via a moving write cursor per point.\n const neighbors = new Uint32Array(n);\n const cursor = offsets.slice(0, pointCount);\n for (let i = 0; i < n; i += 2) {\n const a = links[i]!;\n const b = links[i + 1]!;\n const ca = cursor[a]!;\n neighbors[ca] = b;\n cursor[a] = ca + 1;\n const cb = cursor[b]!;\n neighbors[cb] = a;\n cursor[b] = cb + 1;\n }\n\n return { offsets, neighbors };\n}\n\n/**\n * Zero-copy neighbor list of one point: a `subarray` VIEW into\n * `adj.neighbors` — do not mutate, and do not hold across a rebuild.\n */\nexport function neighborsOf(adj: Adjacency, index: number): Uint32Array {\n const pointCount = adj.offsets.length - 1;\n if (!Number.isInteger(index) || index < 0 || index >= pointCount) {\n throw new RangeError(`neighborsOf: index ${index} out of range (pointCount ${pointCount})`);\n }\n return adj.neighbors.subarray(adj.offsets[index]!, adj.offsets[index + 1]!);\n}\n","/**\n * §13/§15 CPU link-pick fallback: a uniform grid over ALL links in SPACE\n * coordinates (cell ≈ median link length), used when the engine lacks native\n * `linkAt` (`capabilities.linkPicking === false`). Backs\n * `onEdgeClick`/`onEdgeHover` via the §7.4 index→edge mapping.\n *\n * Coordinate contract: everything here is SPACE coordinates. Callers invert\n * the affine `Viewport` (space = (screen − center)/zoom + [x, y]) and pass a\n * space-unit tolerance (`tolerancePx / zoom`).\n *\n * Invalidation contract (normative — wave 2 enforces arming):\n * - The grid indexes a POSITION SNAPSHOT (the §7.1 `posBuf` CPU mirror as of\n * the build call). It NEVER observes live simulation positions: while the\n * simulation is hot (alpha above threshold) or an animated `setLayout()`\n * transition runs, picking is DISARMED by the caller; on settle one\n * per-event `getPositions` refreshes the mirror and the grid is rebuilt.\n * - Rebuild ONLY on structural change (link buffer changed) or position\n * sync. The grid is invariant under camera moves and visibility-mask\n * changes: the §9.1 mask is applied per candidate at QUERY time via the\n * optional `visible` callback (pure pass-through until S9 wires the real\n * mask through it).\n *\n * Build uses two counting-sort passes into CSR grid arrays (`cellOffsets`,\n * `cellLinkIds`). Each segment is inserted with a supercover grid traversal,\n * so a link contributes O(cols + rows) cells in the worst case instead of\n * every cell in its O(cols * rows) axis-aligned bounding box. There is no\n * comparison sort or per-link allocation beyond the CSR arrays (plus\n * O(cells) cursor and O(links) query stamps). Links with a non-finite endpoint\n * (NaN-tombstoned points, §13) are excluded and can never be returned. A hard\n * CSR-entry cap deterministically degrades pathological builds to exact O(L)\n * query scans with no cell-link payload.\n */\n\n/** §9.1 visibility mask applied per candidate at query time. */\nexport type LinkVisibilityMask = (linkIndex: number) => boolean;\n\n/**\n * Read-only view of the built grid (diagnostics/tests). The typed arrays are\n * the LIVE internal buffers — never mutate them.\n */\nexport interface LinkPickGridSnapshot {\n /** `scan` means the CSR cap tripped and queries use an exact full scan. */\n readonly mode: 'grid' | 'scan';\n readonly cellSize: number;\n readonly cols: number;\n readonly rows: number;\n readonly minX: number;\n readonly minY: number;\n /** CSR: length `cols * rows + 1`; `[0, 0]` in `scan` mode. */\n readonly cellOffsets: Uint32Array;\n /** CSR segment-supercover pairs; empty in `scan` mode. */\n readonly cellLinkIds: Uint32Array;\n}\n\ninterface GridState extends LinkPickGridSnapshot {\n readonly positions: Float32Array;\n readonly links: Uint32Array;\n readonly linkCount: number;\n}\n\n/** Median-length sampling cap (§13: sample up to 1024 links). */\nconst MEDIAN_SAMPLE_CAP = 1024;\n/** Absolute floor for the cell size (degenerate/coincident layouts). */\nconst MIN_CELL_SIZE = 1e-6;\n/** Hard cap per grid dimension (memory guard for tiny-median layouts). */\nconst MAX_GRID_DIM = 4096;\n/**\n * Hard cap for the CSR cell-link payload (8 MiB of Uint32 ids). Above this,\n * build degrades to an exact scan with no cell-link payload instead of\n * risking a large typed-array allocation on diagonal-heavy graphs.\n */\nconst MAX_CELL_LINK_ENTRIES = 2_097_152;\n/** Links between build-budget checks (keeps `now()` calls off the hot path). */\nconst LINK_BUDGET_INTERVAL = 4096;\n/** Cells between prefix-sum budget checks. */\nconst CELL_BUDGET_INTERVAL = 65536;\n\n/**\n * Exact point→segment squared distance (shared with the query path so the\n * grid and any external oracle agree bit-for-bit).\n */\nexport function pointSegmentDistanceSquared(\n px: number,\n py: number,\n ax: number,\n ay: number,\n bx: number,\n by: number,\n): number {\n const dx = bx - ax;\n const dy = by - ay;\n const len2 = dx * dx + dy * dy;\n let t = 0;\n if (len2 > 0) {\n t = ((px - ax) * dx + (py - ay) * dy) / len2;\n if (t < 0) t = 0;\n else if (t > 1) t = 1;\n }\n const qx = ax + t * dx - px;\n const qy = ay + t * dy - py;\n return qx * qx + qy * qy;\n}\n\n/**\n * Deterministic Hoare quickselect for the (upper) median of\n * `values[0 … count)`. Avoids any comparison sort (partial partitioning\n * only); mutates the scratch buffer in place. O(count) average, and `count`\n * is capped at MEDIAN_SAMPLE_CAP anyway.\n */\nfunction medianOfLengths(values: Float64Array, count: number): number {\n if (count === 0) return 0;\n const k = count >> 1;\n let lo = 0;\n let hi = count - 1;\n while (lo < hi) {\n const pivot = values[(lo + hi) >> 1]!;\n let i = lo;\n let j = hi;\n while (i <= j) {\n while (values[i]! < pivot) i++;\n while (values[j]! > pivot) j--;\n if (i <= j) {\n const t = values[i]!;\n values[i] = values[j]!;\n values[j] = t;\n i++;\n j--;\n }\n }\n if (k <= j) hi = j;\n else if (k >= i) lo = i;\n else break;\n }\n return values[k]!;\n}\n\n/** Record one link in one cell during either the count or fill pass. */\nfunction recordLinkCell(\n cell: number,\n linkIndex: number,\n countsOrCursor: Uint32Array,\n cellLinkIds: Uint32Array | null,\n): void {\n if (cellLinkIds === null) {\n // Counts live one slot to the right so the in-place prefix sum below\n // directly produces CSR offsets.\n const slot = cell + 1;\n countsOrCursor[slot] = countsOrCursor[slot]! + 1;\n return;\n }\n const at = countsOrCursor[cell]!;\n cellLinkIds[at] = linkIndex;\n countsOrCursor[cell] = at + 1;\n}\n\nfunction gridCell(value: number, min: number, invCellSize: number, limit: number): number {\n const cell = Math.floor((value - min) * invCellSize);\n return cell < 0 ? 0 : cell >= limit ? limit - 1 : cell;\n}\n\n/**\n * Insert one segment with an allocation-free 2D supercover traversal.\n * Corner crossings conservatively include both side-adjacent cells as well\n * as the diagonal cell. This matters at tolerance zero because `floor()`\n * assigns the exact corner to one of those side cells for mixed-sign lines.\n *\n * A monotone segment changes column at most `cols - 1` times and row at most\n * `rows - 1` times. Even with the two extra corner cells, insertion is bounded\n * by `1 + (cols - 1) + (rows - 1) + min(cols - 1, rows - 1)` cells — grid\n * perimeter, never bounding-box area.\n */\nfunction indexLinkCells(\n positions: Float32Array,\n links: Uint32Array,\n linkIndex: number,\n minX: number,\n minY: number,\n cellSize: number,\n invCellSize: number,\n cols: number,\n rows: number,\n countsOrCursor: Uint32Array,\n cellLinkIds: Uint32Array | null,\n): number {\n const a = links[linkIndex * 2]!;\n const b = links[linkIndex * 2 + 1]!;\n const ax = positions[a * 2]!;\n const ay = positions[a * 2 + 1]!;\n const bx = positions[b * 2]!;\n const by = positions[b * 2 + 1]!;\n if (!Number.isFinite(ax) || !Number.isFinite(ay) || !Number.isFinite(bx) || !Number.isFinite(by)) {\n return 0;\n }\n\n let col = gridCell(ax, minX, invCellSize, cols);\n let row = gridCell(ay, minY, invCellSize, rows);\n const endCol = gridCell(bx, minX, invCellSize, cols);\n const endRow = gridCell(by, minY, invCellSize, rows);\n recordLinkCell(row * cols + col, linkIndex, countsOrCursor, cellLinkIds);\n let entries = 1;\n\n const dx = bx - ax;\n const dy = by - ay;\n const stepX = dx > 0 ? 1 : dx < 0 ? -1 : 0;\n const stepY = dy > 0 ? 1 : dy < 0 ? -1 : 0;\n let tMaxX = Number.POSITIVE_INFINITY;\n let tMaxY = Number.POSITIVE_INFINITY;\n let tDeltaX = Number.POSITIVE_INFINITY;\n let tDeltaY = Number.POSITIVE_INFINITY;\n if (stepX !== 0) {\n const boundaryX = minX + (stepX > 0 ? col + 1 : col) * cellSize;\n tMaxX = (boundaryX - ax) / dx;\n tDeltaX = cellSize / Math.abs(dx);\n }\n if (stepY !== 0) {\n const boundaryY = minY + (stepY > 0 ? row + 1 : row) * cellSize;\n tMaxY = (boundaryY - ay) / dy;\n tDeltaY = cellSize / Math.abs(dy);\n }\n\n while (col !== endCol || row !== endRow) {\n // Once one endpoint cell coordinate is reached, only the other axis can\n // have an in-segment boundary left to cross.\n if (col === endCol) {\n row += stepY;\n tMaxY += tDeltaY;\n recordLinkCell(row * cols + col, linkIndex, countsOrCursor, cellLinkIds);\n entries++;\n continue;\n }\n if (row === endRow) {\n col += stepX;\n tMaxX += tDeltaX;\n recordLinkCell(row * cols + col, linkIndex, countsOrCursor, cellLinkIds);\n entries++;\n continue;\n }\n\n // Accumulated DDA arithmetic can put a mathematical corner crossing a few\n // ulps apart. Treat a tiny near-tie as a corner; the resulting superset is\n // conservative and still obeys the perimeter bound.\n const tieTolerance = 1e-12 * Math.max(1, Math.abs(tMaxX), Math.abs(tMaxY));\n if (tMaxX < tMaxY - tieTolerance) {\n col += stepX;\n tMaxX += tDeltaX;\n recordLinkCell(row * cols + col, linkIndex, countsOrCursor, cellLinkIds);\n entries++;\n } else if (tMaxY < tMaxX - tieTolerance) {\n row += stepY;\n tMaxY += tDeltaY;\n recordLinkCell(row * cols + col, linkIndex, countsOrCursor, cellLinkIds);\n entries++;\n } else {\n const nextCol = col + stepX;\n const nextRow = row + stepY;\n recordLinkCell(row * cols + nextCol, linkIndex, countsOrCursor, cellLinkIds);\n recordLinkCell(nextRow * cols + col, linkIndex, countsOrCursor, cellLinkIds);\n col = nextCol;\n row = nextRow;\n tMaxX += tDeltaX;\n tMaxY += tDeltaY;\n recordLinkCell(row * cols + col, linkIndex, countsOrCursor, cellLinkIds);\n entries += 3;\n }\n }\n return entries;\n}\n\nexport class LinkPickIndex {\n private grid: GridState | null = null;\n /** Per-link visited stamps: dedupe across cells within one query. */\n private stamps = new Uint32Array(0);\n private queryStamp = 0;\n\n get isBuilt(): boolean {\n return this.grid !== null;\n }\n\n /** Read-only grid/scan index view for diagnostics/tests; null before build. */\n gridSnapshot(): LinkPickGridSnapshot | null {\n return this.grid;\n }\n\n /**\n * Drops the grid: `nearestLink` reports null until the next build. Wave 2\n * calls this on structural change / sim-hot disarm.\n */\n invalidate(): void {\n this.grid = null;\n this.stamps = new Uint32Array(0);\n this.queryStamp = 0;\n }\n\n /**\n * One-shot output-sensitive build over a position snapshot: O(L + I), where\n * I is the emitted segment-cell pairs up to `MAX_CELL_LINK_ENTRIES`; above\n * that cap it commits exact-scan mode. Drains the chunked generator with an\n * infinite budget so both entry points share one code path (chunked and\n * one-shot builds are bit-identical).\n */\n build(positions: Float32Array, links: Uint32Array): void {\n const it = this.buildChunked(positions, links, Number.POSITIVE_INFINITY, () => 0);\n let r = it.next();\n while (!r.done) r = it.next();\n }\n\n /**\n * Incremental build: yields whenever `now() − sliceStart ≥ budgetMs` so a\n * scheduler can spread the work across idle frames (§17 long-task budget).\n * Pure generator — no rAF/timers here; the caller owns scheduling.\n *\n * The previous grid stays armed and queryable until the new one commits on\n * generator completion; abandoning the iterator leaves the old grid\n * intact. At most one build should be in flight per index — the wave-2\n * scheduler serializes rebuilds.\n */\n *buildChunked(\n positions: Float32Array,\n links: Uint32Array,\n budgetMs: number,\n now: () => number,\n ): IterableIterator<void> {\n if ((links.length & 1) !== 0) {\n throw new RangeError(`LinkPickIndex: links length must be even ([src, tgt] pairs), got ${links.length}`);\n }\n const linkCount = links.length >>> 1;\n let sliceStart = now();\n\n // -- Pass 0a: bounding box over finite link endpoints (O(L)). --\n let minX = Number.POSITIVE_INFINITY;\n let minY = Number.POSITIVE_INFINITY;\n let maxX = Number.NEGATIVE_INFINITY;\n let maxY = Number.NEGATIVE_INFINITY;\n for (let l = 0; l < linkCount; l++) {\n const a = links[l * 2]!;\n const b = links[l * 2 + 1]!;\n const ax = positions[a * 2]!;\n const ay = positions[a * 2 + 1]!;\n const bx = positions[b * 2]!;\n const by = positions[b * 2 + 1]!;\n if (Number.isFinite(ax) && Number.isFinite(ay) && Number.isFinite(bx) && Number.isFinite(by)) {\n if (ax < minX) minX = ax;\n if (ax > maxX) maxX = ax;\n if (bx < minX) minX = bx;\n if (bx > maxX) maxX = bx;\n if (ay < minY) minY = ay;\n if (ay > maxY) maxY = ay;\n if (by < minY) minY = by;\n if (by > maxY) maxY = by;\n }\n if ((l + 1) % LINK_BUDGET_INTERVAL === 0 && now() - sliceStart >= budgetMs) {\n yield;\n sliceStart = now();\n }\n }\n if (minX > maxX) {\n // No finite link at all — degenerate 1×1 grid, nothing inserted.\n minX = minY = maxX = maxY = 0;\n }\n\n // -- Pass 0b: median link length from a deterministic stride sample. --\n const sampleTarget = linkCount < MEDIAN_SAMPLE_CAP ? linkCount : MEDIAN_SAMPLE_CAP;\n const lengths = new Float64Array(sampleTarget);\n let sampleCount = 0;\n if (sampleTarget > 0) {\n const stride = linkCount / sampleTarget;\n for (let k = 0; k < sampleTarget; k++) {\n const l = Math.floor(k * stride);\n const a = links[l * 2]!;\n const b = links[l * 2 + 1]!;\n const ax = positions[a * 2]!;\n const ay = positions[a * 2 + 1]!;\n const bx = positions[b * 2]!;\n const by = positions[b * 2 + 1]!;\n if (!Number.isFinite(ax) || !Number.isFinite(ay) || !Number.isFinite(bx) || !Number.isFinite(by)) {\n continue;\n }\n const dx = bx - ax;\n const dy = by - ay;\n lengths[sampleCount++] = Math.sqrt(dx * dx + dy * dy);\n }\n }\n const median = medianOfLengths(lengths, sampleCount);\n\n // -- Grid geometry: cell ≈ median link length, clamped to a sane minimum\n // and to a per-dimension cap so degenerate medians can't explode the\n // cell arrays. --\n const width = maxX - minX;\n const height = maxY - minY;\n const targetDim = Math.min(MAX_GRID_DIM, Math.max(1, Math.ceil(Math.sqrt(linkCount * 4))));\n let cellSize = median;\n if (width / targetDim > cellSize) cellSize = width / targetDim;\n if (height / targetDim > cellSize) cellSize = height / targetDim;\n if (!(cellSize >= MIN_CELL_SIZE)) cellSize = MIN_CELL_SIZE;\n const invCellSize = 1 / cellSize;\n const cols = Math.max(1, Math.ceil(width * invCellSize));\n const rows = Math.max(1, Math.ceil(height * invCellSize));\n const cellCount = cols * rows;\n\n // -- Pass 1: count (cell, link) pairs along each segment supercover. --\n const cellOffsets = new Uint32Array(cellCount + 1);\n let totalEntries = 0;\n for (let l = 0; l < linkCount; l++) {\n totalEntries += indexLinkCells(\n positions,\n links,\n l,\n minX,\n minY,\n cellSize,\n invCellSize,\n cols,\n rows,\n cellOffsets,\n null,\n );\n if (totalEntries > MAX_CELL_LINK_ENTRIES) {\n // Deterministic bounded-memory degradation. Keep the geometry only as\n // a valid 1×1 diagnostic snapshot; nearestLink scans `links` exactly.\n const scanCellSize = Math.max(width, height, MIN_CELL_SIZE);\n this.grid = {\n mode: 'scan',\n positions,\n links,\n linkCount,\n minX,\n minY,\n cellSize: scanCellSize,\n cols: 1,\n rows: 1,\n cellOffsets: new Uint32Array(2),\n cellLinkIds: new Uint32Array(0),\n };\n this.stamps = new Uint32Array(0);\n this.queryStamp = 0;\n return;\n }\n if ((l + 1) % LINK_BUDGET_INTERVAL === 0 && now() - sliceStart >= budgetMs) {\n yield;\n sliceStart = now();\n }\n }\n\n // -- Exclusive prefix sum → CSR cell offsets. --\n for (let i = 1; i <= cellCount; i++) {\n cellOffsets[i] = cellOffsets[i]! + cellOffsets[i - 1]!;\n if (i % CELL_BUDGET_INTERVAL === 0 && now() - sliceStart >= budgetMs) {\n yield;\n sliceStart = now();\n }\n }\n\n // -- Pass 2: counting-sort fill (ascending link order per cell). --\n const cellLinkIds = new Uint32Array(cellOffsets[cellCount]!);\n const cursor = cellOffsets.slice(0, cellCount);\n for (let l = 0; l < linkCount; l++) {\n indexLinkCells(\n positions,\n links,\n l,\n minX,\n minY,\n cellSize,\n invCellSize,\n cols,\n rows,\n cursor,\n cellLinkIds,\n );\n if ((l + 1) % LINK_BUDGET_INTERVAL === 0 && now() - sliceStart >= budgetMs) {\n yield;\n sliceStart = now();\n }\n }\n\n // -- Commit atomically: the old grid answered queries until this point. --\n this.grid = {\n mode: 'grid',\n positions,\n links,\n linkCount,\n minX,\n minY,\n cellSize,\n cols,\n rows,\n cellOffsets,\n cellLinkIds,\n };\n this.stamps = new Uint32Array(linkCount);\n this.queryStamp = 0;\n }\n\n /**\n * Nearest link within `tolerance` (space units) of the space point\n * `(x, y)`, or null. Scans the candidate cells covering the tolerance\n * disc's bounding box (typically the 3×3 neighborhood; more when the\n * tolerance exceeds the cell size), applies the optional §9.1 visibility\n * mask per candidate, then runs the exact point→segment distance test.\n * Nearest wins; exact-distance ties break toward the LOWER link index.\n * Returns null while unbuilt/invalidated (picking disarmed).\n */\n nearestLink(x: number, y: number, tolerance: number, visible?: LinkVisibilityMask): number | null {\n const g = this.grid;\n if (g === null) return null;\n if (!Number.isFinite(x) || !Number.isFinite(y) || !(tolerance >= 0)) return null;\n\n if (g.mode === 'scan') {\n const { positions, links, linkCount } = g;\n const tol2 = tolerance * tolerance;\n let bestIdx = -1;\n let bestD2 = Number.POSITIVE_INFINITY;\n for (let l = 0; l < linkCount; l++) {\n if (visible !== undefined && !visible(l)) continue;\n const a = links[l * 2]!;\n const b = links[l * 2 + 1]!;\n const ax = positions[a * 2]!;\n const ay = positions[a * 2 + 1]!;\n const bx = positions[b * 2]!;\n const by = positions[b * 2 + 1]!;\n if (!Number.isFinite(ax) || !Number.isFinite(ay) || !Number.isFinite(bx) || !Number.isFinite(by)) {\n continue;\n }\n const d2 = pointSegmentDistanceSquared(x, y, ax, ay, bx, by);\n if (d2 > tol2) continue;\n if (d2 < bestD2 || (d2 === bestD2 && l < bestIdx)) {\n bestD2 = d2;\n bestIdx = l;\n }\n }\n return bestIdx >= 0 ? bestIdx : null;\n }\n if (g.cellLinkIds.length === 0) return null;\n\n const invCellSize = 1 / g.cellSize;\n const clampCol = (v: number): number => (v < 0 ? 0 : v > g.cols - 1 ? g.cols - 1 : v);\n const clampRow = (v: number): number => (v < 0 ? 0 : v > g.rows - 1 ? g.rows - 1 : v);\n const c0 = clampCol(Math.floor((x - tolerance - g.minX) * invCellSize));\n const c1 = clampCol(Math.floor((x + tolerance - g.minX) * invCellSize));\n const r0 = clampRow(Math.floor((y - tolerance - g.minY) * invCellSize));\n const r1 = clampRow(Math.floor((y + tolerance - g.minY) * invCellSize));\n\n let stamp = this.queryStamp + 1;\n if (stamp > 0xffffffff) {\n this.stamps.fill(0);\n stamp = 1;\n }\n this.queryStamp = stamp;\n\n const { positions, links, cellOffsets, cellLinkIds } = g;\n const stamps = this.stamps;\n const tol2 = tolerance * tolerance;\n let bestIdx = -1;\n let bestD2 = Number.POSITIVE_INFINITY;\n for (let r = r0; r <= r1; r++) {\n const rowBase = r * g.cols;\n for (let c = c0; c <= c1; c++) {\n const cell = rowBase + c;\n const end = cellOffsets[cell + 1]!;\n for (let i = cellOffsets[cell]!; i < end; i++) {\n const l = cellLinkIds[i]!;\n if (stamps[l] === stamp) continue; // already tested via another cell\n stamps[l] = stamp;\n if (visible !== undefined && !visible(l)) continue;\n const a = links[l * 2]!;\n const b = links[l * 2 + 1]!;\n const d2 = pointSegmentDistanceSquared(\n x,\n y,\n positions[a * 2]!,\n positions[a * 2 + 1]!,\n positions[b * 2]!,\n positions[b * 2 + 1]!,\n );\n if (d2 > tol2) continue;\n if (d2 < bestD2 || (d2 === bestD2 && l < bestIdx)) {\n bestD2 = d2;\n bestIdx = l;\n }\n }\n }\n }\n return bestIdx >= 0 ? bestIdx : null;\n }\n}\n","/**\n * §13/§15 edge-picking facade (S6-T07).\n *\n * The core commits to ONE route per mount session, read from\n * `engine.capabilities.linkPicking` at engine-ready time — never method\n * sniffing, and never re-evaluated (a capability record mutated after ready\n * changes nothing):\n *\n * - 'native': the adapter delivers `onLinkClick`/`onLinkHover` host events\n * itself; the facade is inert (arm/disarm/queries no-op and\n * `pickLinkAt` returns null) and the instance maps link indices\n * to typed edges straight off the host events.\n * - 'fallback': the instance samples the pointer on the shared §15 throttle\n * cadence and resolves hits through a `LinkPickIndex` uniform\n * grid that is armed ONLY while the simulation is settled.\n *\n * Arming protocol (fallback route; §13):\n * - `arm(positions, links)` runs on simulation settle (fed by one per-event\n * `getPositions` readback) and on structural commits that do NOT restart\n * the simulation (fixed layout). The grid builds CHUNKED via\n * `LinkPickIndex.buildChunked` under a per-slice time budget so large link\n * sets never block (§17); small builds complete synchronously in the first\n * slice. While an initial build is in flight queries return null; a\n * position-sync REBUILD keeps answering from the previous grid until the\n * new one commits.\n * - `disarm()` runs on any commit that restarts the simulation: targets are\n * moving and the position mirror is stale, so queries return null until\n * the next settle re-arms.\n * - Rebuilds happen ONLY on structural change or position sync — the grid is\n * invariant under camera moves and mask changes (the §9.1 visibility mask\n * is applied per candidate at query time; pass-through stub until S9).\n *\n * Tolerance (§13): a query converts screen px to space units via\n * `screenToSpace` of two points `EDGE_PICK_TOLERANCE_PX` apart, then uses\n * `max(4px, half the median link width)` scaled by that factor.\n */\n\nimport { LinkPickIndex } from './linkPick';\nimport type { LinkVisibilityMask } from './linkPick';\n\nexport type EdgePickRoute = 'native' | 'fallback';\n\n/** Screen-space pick tolerance floor, and the probe distance used to measure\n * the screen→space scale (§13). */\nexport const EDGE_PICK_TOLERANCE_PX = 4;\n\n/** Median-width sampling cap (mirrors the §13 median-length cap). */\nconst WIDTH_SAMPLE_CAP = 1024;\n\n/** Per-slice chunked-build budget (§17 long-task budget share). */\nconst DEFAULT_BUILD_BUDGET_MS = 6;\n\n/**\n * Median link width in px from a projected linkWidth buffer (deterministic\n * stride sample, cap 1024). Returns 0 for null/empty/non-finite input — the\n * 4px floor then wins in the tolerance formula.\n */\nexport function medianLinkWidthPx(widths: Float32Array | null): number {\n if (widths === null || widths.length === 0) return 0;\n const n = widths.length < WIDTH_SAMPLE_CAP ? widths.length : WIDTH_SAMPLE_CAP;\n const stride = widths.length / n;\n const sample: number[] = [];\n for (let k = 0; k < n; k++) {\n const w = widths[Math.floor(k * stride)]!;\n if (Number.isFinite(w)) sample.push(w);\n }\n if (sample.length === 0) return 0;\n sample.sort((a, b) => a - b);\n return sample[sample.length >> 1]!;\n}\n\nexport interface EdgePickingFacadeOptions {\n /** Fixed for the facade's lifetime; read from capabilities at ready. */\n route: EdgePickRoute;\n /** Affine screen→space conversion; null = conversion unavailable. */\n screenToSpace: (p: readonly [number, number]) => readonly [number, number] | null;\n /** Median link width in px for the tolerance floor; default () => 0. */\n medianLinkWidthPx?: () => number;\n /** §9.1 visibility mask pass-through stub (mutable via the setter). */\n linkVisible?: LinkVisibilityMask;\n /** Chunked-build slice budget in ms. */\n buildBudgetMs?: number;\n /** Scheduler for build continuation slices (test seam). */\n schedule?: (continueBuild: () => void) => void;\n /** Clock for the build budget (test seam). */\n now?: () => number;\n}\n\nconst defaultSchedule = (continueBuild: () => void): void => {\n setTimeout(continueBuild, 0);\n};\n\nconst defaultNow: () => number =\n typeof performance !== 'undefined' ? () => performance.now() : () => Date.now();\n\nexport class EdgePickingFacade {\n /** The route this mount session committed to at ready. */\n readonly route: EdgePickRoute;\n\n private readonly screenToSpace: (\n p: readonly [number, number],\n ) => readonly [number, number] | null;\n private readonly medianWidthPx: () => number;\n private readonly budgetMs: number;\n private readonly schedule: (continueBuild: () => void) => void;\n private readonly now: () => number;\n private readonly index = new LinkPickIndex();\n private mask: LinkVisibilityMask | null;\n /** Bumped by disarm/arm/destroy; abandons any in-flight chunked build. */\n private generation = 0;\n\n constructor(opts: EdgePickingFacadeOptions) {\n this.route = opts.route;\n this.screenToSpace = opts.screenToSpace;\n this.medianWidthPx = opts.medianLinkWidthPx ?? (() => 0);\n this.mask = opts.linkVisible ?? null;\n this.budgetMs = opts.buildBudgetMs ?? DEFAULT_BUILD_BUDGET_MS;\n this.schedule = opts.schedule ?? defaultSchedule;\n this.now = opts.now ?? defaultNow;\n }\n\n /** True when the fallback grid is built and answering queries. */\n get armed(): boolean {\n return this.route === 'fallback' && this.index.isBuilt;\n }\n\n /**\n * (Re-)arm from a settled position snapshot. `positions`/`links` must be\n * stable snapshots — the grid references them until the next rebuild.\n * No-op on the native route.\n */\n arm(positions: Float32Array, links: Uint32Array): void {\n if (this.route !== 'fallback') return;\n const gen = ++this.generation;\n const it = this.index.buildChunked(positions, links, this.budgetMs, this.now);\n const step = (): void => {\n if (gen !== this.generation) return; // superseded or disarmed\n if (!it.next().done) this.schedule(step);\n };\n step();\n }\n\n /** Simulation went hot: drop the grid; queries null until the next settle. */\n disarm(): void {\n if (this.route !== 'fallback') return;\n this.generation++;\n this.index.invalidate();\n }\n\n /** §9.1 mask pass-through stub: applied per candidate at query time. */\n setLinkVisibilityMask(mask: LinkVisibilityMask | null): void {\n this.mask = mask;\n }\n\n /**\n * Nearest link index within tolerance of a SCREEN point, or null when: on\n * the native route, disarmed (sim hot / not yet settled), no conversion,\n * or nothing in range.\n */\n pickLinkAt(screen: readonly [number, number]): number | null {\n if (!this.armed) return null;\n const p = this.screenToSpace(screen);\n if (p === null) return null;\n // §13 tolerance conversion: measure the screen→space scale from two\n // points EDGE_PICK_TOLERANCE_PX apart.\n const probe = this.screenToSpace([screen[0] + EDGE_PICK_TOLERANCE_PX, screen[1]]);\n if (probe === null) return null;\n const pxToSpace =\n Math.hypot(probe[0] - p[0], probe[1] - p[1]) / EDGE_PICK_TOLERANCE_PX;\n const tolPx = Math.max(EDGE_PICK_TOLERANCE_PX, this.medianWidthPx() / 2);\n return this.index.nearestLink(p[0], p[1], tolPx * pxToSpace, this.mask ?? undefined);\n }\n\n /** Abandon any in-flight build and drop the grid (session teardown). */\n destroy(): void {\n this.generation++;\n this.index.invalidate();\n }\n}\n","/**\n * §14 DOM label lane — pure candidate selection (S7-T01/T16).\n *\n * `selectLabelCandidates` is a pure, deterministic ranking function: no engine,\n * no DOM, no store. The instance-side overlay scheduler calls it on THROTTLED\n * re-rank triggers only (viewport idle, model change, config change, settle) —\n * NEVER per frame. Positions are the reconciler's CPU cache (space coords);\n * per-frame work elsewhere is a pure O(k) projection of the winners.\n *\n * Selection rules (§14):\n * - Zoom-LOD: below `minZoom` the lane is empty EXCEPT `showFor` ids, which\n * bypass the zoom gate but stay viewport-culled.\n * - `showFor` claims capacity FIRST in accepted-base order. When the\n * in-viewport `showFor` set alone exceeds capacity k, accepted-base order\n * wins deterministically and `overloadCount` reports the omissions (one\n * `label-overload` diagnostic upstream — no winner churn).\n * - Remaining capacity fills with viewport-visible nodes ranked by\n * `getWeight` (else degree), ties broken by accepted-base order.\n * - Visibility comes from the engine's `pointsInRect` when available, else a\n * CPU cull of cached positions through the viewport transform. Nodes with\n * unknown (NaN) cached positions are unplaceable on the CPU path.\n */\n\nimport type { GraphNode, LabelConfig, LabelPlacement, RenderScene } from './types';\n\n/** A capacity winner before per-frame projection assigns screen coordinates. */\nexport type LabelCandidate = Omit<LabelPlacement, 'x' | 'y'>;\n\n/** §14 default ranked-candidate cap. */\nexport const LABEL_MAX_VISIBLE_DEFAULT = 64;\n/** §14 policy maximum for `maxVisible`. */\nexport const LABEL_MAX_VISIBLE_CAP = 1024;\n\nexport interface LabelCandidateViewport {\n zoom: number;\n /** Visible screen rect `[x0, y0, x1, y1]` (CSS px). Omit = size unknown → no viewport cull. */\n screenRect?: readonly [number, number, number, number];\n /** space → screen projection for the CPU cull path (null = not projectable). */\n spaceToScreen?: (p: readonly [number, number]) => readonly [number, number] | null;\n}\n\nexport interface SelectLabelCandidatesArgs<N = Record<string, unknown>> {\n scene: RenderScene;\n /**\n * Accepted nodes in accepted-base order. Under the 'rebuild' index policy\n * (§7.3) scene index i IS accepted-base position i, so `nodes[i]` is the\n * node behind `scene.idByIndex[i]`.\n */\n nodes: readonly GraphNode<N>[];\n /** Space positions from the CPU cache (2*count floats; NaN pair = unknown). */\n positions: Float32Array;\n viewport: LabelCandidateViewport;\n config: LabelConfig<N>;\n /** Degree of scene index i — the default ranking weight. */\n degreeOf?: (index: number) => number;\n /**\n * Engine-accelerated visibility: point indices inside a screen rect. A null\n * return (engine not ready) falls back to the CPU cull.\n */\n pointsInRect?: (rect: readonly [number, number, number, number]) => number[] | null;\n}\n\nexport interface LabelCandidateResult {\n /** Capacity-ordered winners: forced (accepted-base order) then ranked fills. */\n placements: readonly LabelCandidate[];\n /** In-viewport `showFor` ids omitted because they alone exceed capacity. */\n overloadCount: number;\n}\n\nconst EMPTY_RESULT: LabelCandidateResult = { placements: [], overloadCount: 0 };\n\nexport function selectLabelCandidates<N = Record<string, unknown>>(\n args: SelectLabelCandidatesArgs<N>,\n): LabelCandidateResult {\n const { scene, nodes, positions, viewport, config } = args;\n if (config.enabled === false || scene.count === 0) return EMPTY_RESULT;\n\n const k = Math.max(0, Math.min(Math.floor(config.maxVisible ?? LABEL_MAX_VISIBLE_DEFAULT), LABEL_MAX_VISIBLE_CAP));\n if (k === 0) return EMPTY_RESULT;\n\n const minZoom = config.minZoom ?? 1;\n const aboveLod = viewport.zoom >= minZoom;\n const showFor = config.showFor;\n const hasForced = showFor !== undefined && showFor.length > 0;\n if (!aboveLod && !hasForced) return EMPTY_RESULT;\n\n // --- visibility: engine rect query when possible, else CPU cull ---\n const rect = viewport.screenRect;\n let visibleSet: ReadonlySet<number> | null = null;\n if (rect !== undefined && args.pointsInRect !== undefined) {\n const hit = args.pointsInRect(rect);\n if (hit !== null) visibleSet = new Set(hit);\n }\n const project = viewport.spaceToScreen;\n const isVisible = (i: number): boolean => {\n if (visibleSet !== null) return visibleSet.has(i);\n const x = positions[2 * i];\n const y = positions[2 * i + 1];\n if (x === undefined || y === undefined || Number.isNaN(x) || Number.isNaN(y)) return false;\n if (rect !== undefined && project !== undefined) {\n const s = project([x, y]);\n if (s === null) return false;\n return s[0] >= rect[0] && s[0] <= rect[2] && s[1] >= rect[1] && s[1] <= rect[3];\n }\n return true; // no cull information → every known position is \"visible\"\n };\n\n // --- accessors (isolated: a throwing accessor ranks 0 / falls back to id) ---\n const getText = config.getText;\n const textOf = (i: number): string => {\n const node = nodes[i];\n if (node === undefined) return scene.idByIndex[i]!;\n if (getText !== undefined) {\n try {\n return getText(node);\n } catch {\n return node.id;\n }\n }\n const label = (node.attrs as Record<string, unknown> | undefined)?.['label'];\n return label === undefined || label === null ? node.id : String(label);\n };\n const getWeight = config.getWeight;\n const degreeOf = args.degreeOf;\n const weightOf = (i: number): number => {\n if (getWeight !== undefined) {\n const node = nodes[i];\n if (node !== undefined) {\n try {\n const w = getWeight(node);\n if (Number.isFinite(w)) return w;\n } catch {\n /* rank as 0 */\n }\n }\n return 0;\n }\n return degreeOf !== undefined ? degreeOf(i) : 0;\n };\n\n const out: LabelCandidate[] = [];\n const chosen = new Set<number>();\n let overloadCount = 0;\n\n // --- 1. showFor claims capacity first, accepted-base order (§14) ---\n if (hasForced) {\n const forcedIdx: number[] = [];\n const seen = new Set<number>();\n for (const id of showFor) {\n const i = scene.indexById.get(id);\n if (i === undefined || seen.has(i)) continue;\n seen.add(i);\n if (isVisible(i)) forcedIdx.push(i);\n }\n forcedIdx.sort((a, b) => a - b); // accepted-base order wins deterministically\n overloadCount = Math.max(0, forcedIdx.length - k);\n const take = Math.min(forcedIdx.length, k);\n for (let j = 0; j < take; j++) {\n const i = forcedIdx[j]!;\n chosen.add(i);\n out.push({ id: scene.idByIndex[i]!, text: textOf(i), forced: true });\n }\n }\n\n // --- 2. remaining capacity: ranked fill (zoom-LOD gated) ---\n if (aboveLod && out.length < k) {\n const ranked: { i: number; w: number }[] = [];\n for (let i = 0; i < scene.count; i++) {\n if (chosen.has(i) || !isVisible(i)) continue;\n ranked.push({ i, w: weightOf(i) });\n }\n ranked.sort((a, b) => b.w - a.w || a.i - b.i); // weight desc, accepted-base tie-break\n const need = k - out.length;\n for (let j = 0; j < need && j < ranked.length; j++) {\n const i = ranked[j]!.i;\n out.push({ id: scene.idByIndex[i]!, text: textOf(i), forced: false });\n }\n }\n\n return { placements: out, overloadCount };\n}\n","/**\n * §9.2 hard subgraph scope — pure resolution over the accepted base.\n *\n * `resolveScope` turns a `SubgraphSpec` into the exact node/edge subset the\n * reconciler should be fed: seeds validated against the accepted base\n * (unknown ids dropped, duplicates collapsed), optional `hops` expansion via\n * BFS over the §7.1 CSR adjacency of the ACCEPTED BASE (not the scene — the\n * default expansion service walks this same index, §9.2), and edges cascaded\n * through `cascadeEdges`, the single §9 edge-survival primitive (an edge\n * survives iff BOTH endpoints survive) that S9's soft masks reuse.\n *\n * Everything here is synchronous and engine-free. The async\n * `ExpansionService` seam (./services) exists for `expandNode`; `hops`\n * resolution inside a host update takes this local path directly.\n */\n\nimport { buildAdjacency, neighborsOf } from './adjacency';\nimport type { Adjacency } from './adjacency';\nimport type { AcceptedEdge, AcceptedGraph, GraphNode, NodeId, SubgraphSpec } from './types';\n\n/**\n * THE edge-cascade primitive (§9): an edge survives iff BOTH of its\n * endpoints survive. O(E); the only allocation is the output array, which\n * holds references to the input edge objects (never copies).\n *\n * Exported for reuse by §9.1 soft masks (S9) and any other subset producer.\n */\nexport function cascadeEdges<E>(\n edges: readonly AcceptedEdge<E>[],\n survives: (id: NodeId) => boolean,\n): AcceptedEdge<E>[] {\n const out: AcceptedEdge<E>[] = [];\n for (const edge of edges) {\n if (survives(edge.source) && survives(edge.target)) out.push(edge);\n }\n return out;\n}\n\n/**\n * Builds the §7.1 CSR adjacency of an accepted base: endpoints are positions\n * in `accepted.nodes` (accepted-base order). Every accepted edge has resolved\n * endpoints by contract (§5.1 drops dangling edges), so this cannot throw on\n * a well-formed `AcceptedGraph`.\n */\nexport function buildAcceptedAdjacency(accepted: AcceptedGraph<unknown, unknown>): Adjacency {\n const { edges, nodeIndex } = accepted;\n const links = new Uint32Array(edges.length * 2);\n for (let i = 0; i < edges.length; i++) {\n const edge = edges[i]!;\n const source = nodeIndex.get(edge.source);\n const target = nodeIndex.get(edge.target);\n if (source === undefined || target === undefined) {\n throw new RangeError(\n `buildAcceptedAdjacency: edge '${edge.id}' references an unknown endpoint (accepted graphs must not contain dangling edges)`,\n );\n }\n links[i * 2] = source;\n links[i * 2 + 1] = target;\n }\n return buildAdjacency(links, accepted.nodes.length);\n}\n\n/** Output of `resolveScope`: the exact subset to feed the reconciler (§9.2). */\nexport interface ResolvedScope<N = Record<string, unknown>, E = Record<string, unknown>> {\n /** Surviving node ids (seeds + hop expansion), membership-query form. */\n nodeIds: ReadonlySet<NodeId>;\n /** Surviving nodes in accepted-base order (same objects, never copies). */\n nodes: readonly GraphNode<N>[];\n /** Edges whose BOTH endpoints survive, in accepted-base order. */\n edges: readonly AcceptedEdge<E>[];\n}\n\n/**\n * Depth-limited BFS over the accepted-base adjacency: marks every node\n * reachable from `seedIndices` within `hops` undirected steps (seeds are\n * depth 0 and always marked). Mutates and returns `visited` (length =\n * pointCount, 1 = in scope). O(V + E) worst case, no per-node allocation\n * beyond the two frontier arrays.\n */\nfunction markWithinHops(\n adjacency: Adjacency,\n seedIndices: readonly number[],\n hops: number,\n visited: Uint8Array,\n): Uint8Array {\n let frontier: number[] = [];\n for (const index of seedIndices) {\n if (visited[index] === 0) {\n visited[index] = 1;\n frontier.push(index);\n }\n }\n for (let depth = 0; depth < hops && frontier.length > 0; depth++) {\n const next: number[] = [];\n for (const index of frontier) {\n const neighbors = neighborsOf(adjacency, index);\n for (let k = 0; k < neighbors.length; k++) {\n const neighbor = neighbors[k]!;\n if (visited[neighbor] === 0) {\n visited[neighbor] = 1;\n next.push(neighbor);\n }\n }\n }\n frontier = next;\n }\n return visited;\n}\n\n/**\n * Resolves a hard-scope spec against the accepted base (§9.2).\n *\n * - `spec.seedIds` are validated against `accepted.nodeIndex`: ids unknown to\n * the accepted base are dropped, duplicates collapse to one seed.\n * - `spec.hops` (default 0; negative/non-finite values clamp to 0, fractions\n * floor) expands the survivor set by BFS over the accepted-base adjacency.\n * This is the synchronous local path — the §9.2 default `ExpansionService`\n * walks the same index for `expandNode`.\n * - `adjacency` may be a caller-cached `buildAcceptedAdjacency(accepted)`\n * result; pass `null` to have one built on demand (only when `hops > 0`\n * and there are surviving seeds — hop-0 resolution never builds it).\n * - Output preserves accepted-base order for both nodes and edges; edges are\n * cascaded through {@link cascadeEdges}.\n */\nexport function resolveScope<N, E>(\n accepted: AcceptedGraph<N, E>,\n spec: SubgraphSpec,\n adjacency: Adjacency | null,\n): ResolvedScope<N, E> {\n const { nodeIndex } = accepted;\n\n // Seed validation: drop unknown, dedupe (Set keys), keep index for BFS.\n const nodeIds = new Set<NodeId>();\n const seedIndices: number[] = [];\n for (const id of spec.seedIds) {\n const index = nodeIndex.get(id);\n if (index !== undefined && !nodeIds.has(id)) {\n nodeIds.add(id);\n seedIndices.push(index);\n }\n }\n\n const rawHops = spec.hops ?? 0;\n const hops = Number.isFinite(rawHops) ? Math.max(0, Math.floor(rawHops)) : 0;\n\n if (hops > 0 && seedIndices.length > 0) {\n const adj = adjacency ?? buildAcceptedAdjacency(accepted);\n const visited = markWithinHops(\n adj,\n seedIndices,\n hops,\n new Uint8Array(accepted.nodes.length),\n );\n for (let index = 0; index < visited.length; index++) {\n if (visited[index] === 1) nodeIds.add(accepted.nodes[index]!.id);\n }\n }\n\n // Accepted-base order: filter the base arrays, never re-sort.\n const nodes: GraphNode<N>[] = [];\n for (const node of accepted.nodes) {\n if (nodeIds.has(node.id)) nodes.push(node);\n }\n const edges = cascadeEdges(accepted.edges, (id) => nodeIds.has(id));\n\n return { nodeIds, nodes, edges };\n}\n","/**\n * §9.2 revision-aware services — pure sequencing/admission/caching helpers\n * plus the built-in local expansion service.\n *\n * The correctness gate is `admitServiceResult`: a result is admitted only if\n * every revision dimension the service DECLARED is unchanged since the call\n * was issued; undeclared dimensions never invalidate (so e.g. the local\n * expansion service, declaring only 'source', survives unrelated model/scope\n * advances from other overlay publications). Abort is an optimization —\n * admission is the gate.\n *\n * Cache keys include service identity, canonical-JSON request parameters,\n * `datasetKey`, and EXACTLY the declared revision dimensions' current values.\n *\n * Nothing here touches the engine, the store, or the DOM; the instance wires\n * these primitives to its acceptance queue.\n */\n\nimport { OrbitOperationError } from './errors';\nimport { resolveScope } from './scope';\nimport type { Adjacency } from './adjacency';\nimport type {\n AcceptedGraph,\n ExpansionResponse,\n ExpansionService,\n NodeId,\n RequestContext,\n RevisionDimension,\n} from './types';\n\n// ---------------------------------------------------------------------------\n// Request contexts\n// ---------------------------------------------------------------------------\n\n/** Current value of each §9.2 revision dimension (a Revisions subset). */\nexport interface RevisionSnapshot {\n source: number | string | null;\n model: number;\n scope: number;\n}\n\n/** Canonical dimension order — makes cache keys independent of declaration order. */\nconst DIMENSION_ORDER: readonly RevisionDimension[] = ['source', 'model', 'scope'];\n\nlet requestSeq = 0;\n\n/** Monotonic instance-process-unique request id (deterministic prefix for tests). */\nexport function nextRequestId(prefix = 'req'): string {\n requestSeq += 1;\n return `${prefix}-${requestSeq}`;\n}\n\nexport interface CreateRequestContextArgs {\n datasetKey: string;\n /** Revision values current at issue time (snapshotted into the context). */\n revisions: RevisionSnapshot;\n /** Explicit id (e.g. for coalescing bookkeeping); generated when omitted. */\n requestId?: string;\n /** Chain an upstream signal (e.g. instance teardown) into this request. */\n parentSignal?: AbortSignal;\n}\n\n/** A `RequestContext` plus its owning abort handle. */\nexport interface RequestContextHandle {\n readonly context: RequestContext;\n readonly controller: AbortController;\n abort(reason?: unknown): void;\n}\n\n/**\n * Builds the `RequestContext` a service call receives (§9.2): dataset,\n * the three revision dimensions at issue time, a request id, and a\n * cancellation signal owned by the returned controller.\n */\nexport function createRequestContext(args: CreateRequestContextArgs): RequestContextHandle {\n const controller = new AbortController();\n const { parentSignal } = args;\n if (parentSignal !== undefined) {\n if (parentSignal.aborted) controller.abort(parentSignal.reason);\n else parentSignal.addEventListener('abort', () => controller.abort(parentSignal.reason), { once: true });\n }\n const context: RequestContext = {\n datasetKey: args.datasetKey,\n sourceRevision: args.revisions.source,\n modelRevision: args.revisions.model,\n scopeRevision: args.revisions.scope,\n requestId: args.requestId ?? nextRequestId(),\n signal: controller.signal,\n };\n return {\n context,\n controller,\n abort: (reason?: unknown) => controller.abort(reason),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Admission gate\n// ---------------------------------------------------------------------------\n\nexport interface AdmitServiceResultArgs {\n /** The service's `revisionDependencies` (§9.2). */\n declared: readonly RevisionDimension[];\n /** Revision values when the request was issued. */\n at: RevisionSnapshot;\n /** Revision values at admission time. */\n now: RevisionSnapshot;\n}\n\n/**\n * §9.2 stale-result rule: admit a service result iff EVERY declared revision\n * dimension is unchanged between issue and admission. Undeclared dimensions\n * never invalidate. Declaring nothing means the result is admissible under\n * any drift; declaring all three restores strict point-in-model semantics.\n */\nexport function admitServiceResult(args: AdmitServiceResultArgs): boolean {\n for (const dimension of args.declared) {\n if (args.at[dimension] !== args.now[dimension]) return false;\n }\n return true;\n}\n\n// ---------------------------------------------------------------------------\n// Cache keys\n// ---------------------------------------------------------------------------\n\n/**\n * Canonical JSON: object keys sorted recursively, `undefined`-valued keys\n * omitted (as in JSON.stringify), non-finite numbers serialized as null.\n * Array order is significant (it is data).\n */\nfunction canonicalJson(value: unknown): string {\n if (value === undefined) return 'null';\n if (value === null || typeof value === 'boolean' || typeof value === 'string') {\n return JSON.stringify(value);\n }\n if (typeof value === 'number') {\n return Number.isFinite(value) ? JSON.stringify(value) : 'null';\n }\n if (Array.isArray(value)) {\n let out = '[';\n for (let i = 0; i < value.length; i++) {\n if (i > 0) out += ',';\n out += canonicalJson(value[i]);\n }\n return out + ']';\n }\n if (typeof value === 'object') {\n const record = value as Record<string, unknown>;\n const keys = Object.keys(record).sort();\n let out = '{';\n let first = true;\n for (const key of keys) {\n const entry = record[key];\n if (entry === undefined) continue;\n if (!first) out += ',';\n first = false;\n out += `${JSON.stringify(key)}:${canonicalJson(entry)}`;\n }\n return out + '}';\n }\n throw new TypeError(`serviceCacheKey: unsupported params value of type ${typeof value}`);\n}\n\nexport interface ServiceCacheKeyArgs {\n serviceId: string;\n /** Request parameters (JSON-shaped); key order is canonicalized away. */\n params: unknown;\n datasetKey: string;\n /** The service's declared revision dependencies (§9.2). */\n declared: readonly RevisionDimension[];\n /** Current revision values; only declared dimensions enter the key. */\n revisions: RevisionSnapshot;\n}\n\n/**\n * §9.2 cache-key rule: service identity + canonical-JSON params +\n * `datasetKey` + EXACTLY the declared revision dimensions' current values.\n * Declaration-list order and params key order do not affect the key;\n * undeclared revision drift never changes it.\n */\nexport function serviceCacheKey(args: ServiceCacheKeyArgs): string {\n const declared = new Set(args.declared);\n const revisionPart: Partial<Record<RevisionDimension, number | string | null>> = {};\n for (const dimension of DIMENSION_ORDER) {\n if (declared.has(dimension)) revisionPart[dimension] = args.revisions[dimension];\n }\n return canonicalJson([args.serviceId, args.datasetKey, args.params ?? null, revisionPart]);\n}\n\n// ---------------------------------------------------------------------------\n// Built-in local expansion service (§9.2 — \"the default service is local\")\n// ---------------------------------------------------------------------------\n\n/** Accepted-base view the local service walks (thunked for lazy wiring). */\nexport interface LocalExpansionBase<N = Record<string, unknown>, E = Record<string, unknown>> {\n accepted: AcceptedGraph<N, E>;\n /** The §7.1 CSR adjacency of `accepted` (see buildAcceptedAdjacency). */\n adjacency: Adjacency;\n}\n\nfunction abortReasonOf(signal: AbortSignal): unknown {\n return (signal as { reason?: unknown }).reason;\n}\n\nfunction throwAborted(signal: AbortSignal): never {\n const reason = abortReasonOf(signal);\n throw new OrbitOperationError(\n reason === undefined ? { code: 'aborted' } : { code: 'aborted', cause: reason },\n );\n}\n\n/**\n * The built-in §9.2 expansion service: walks the core's accepted-base\n * adjacency — INCLUDING currently out-of-scope nodes (it reads the base, not\n * the scene) — with zero config and zero network. Declares\n * `revisionDependencies: ['source']`, so unrelated model/scope advances\n * (e.g. other overlay publications) never invalidate its results.\n *\n * `getBase` is a thunk so the instance can wire the service before data\n * arrives; it is re-read on every call. The returned promise is async but\n * effectively synchronous (resolves without I/O). `ctx.signal` is honored:\n * an aborted call rejects with `OrbitOperationError { code: 'aborted' }`\n * instead of returning a result (abort is still only an optimization — the\n * admission gate is authoritative).\n *\n * The response is the CLOSED N-hop neighborhood (seeds included, plus every\n * edge between returned nodes); per §9.2 the overlay merger dedupes rows\n * that already exist, so returning already-known seeds is correct.\n */\nexport function createLocalExpansionService<N = Record<string, unknown>, E = Record<string, unknown>>(\n getBase: () => LocalExpansionBase<N, E>,\n): ExpansionService<N, E> {\n return {\n revisionDependencies: ['source'],\n async neighbors(\n seedIds: readonly NodeId[],\n hops: number,\n ctx: RequestContext,\n ): Promise<ExpansionResponse<N, E>> {\n if (ctx.signal.aborted) throwAborted(ctx.signal);\n const { accepted, adjacency } = getBase();\n const resolved = resolveScope(accepted, { seedIds, hops }, adjacency);\n if (ctx.signal.aborted) throwAborted(ctx.signal);\n return { nodes: resolved.nodes, edges: resolved.edges };\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Expansion coalescing bookkeeping (§9.2)\n// ---------------------------------------------------------------------------\n\nexport type RegisterExpansionResult =\n | { kind: 'new' }\n /** A same-id expansion is already in flight; its result serves both. */\n | { kind: 'coalesced'; onto: string };\n\n/**\n * Pure in-flight-expansion ledger (§9.2): within one valid scope revision a\n * second `expandNode(id)` while one is in flight coalesces into the pending\n * call; expansions of DISTINCT ids run (and complete) concurrently and\n * independently. `retractExpansion(id)` uses `abort(id)` to drop that id's\n * pending expansion. Holds no timers, promises, or engine state — the\n * instance owns the actual requests.\n */\nexport class PendingExpansions {\n private readonly inFlight = new Map<NodeId, string>();\n\n /**\n * Registers an expansion of `id` under `requestId`. Returns\n * `{ kind: 'coalesced', onto }` when a same-id expansion is already in\n * flight (the caller must NOT issue a new request; `onto` is the request\n * id whose result serves both), else records the id and returns\n * `{ kind: 'new' }`.\n */\n register(id: NodeId, requestId: string): RegisterExpansionResult {\n const existing = this.inFlight.get(id);\n if (existing !== undefined) return { kind: 'coalesced', onto: existing };\n this.inFlight.set(id, requestId);\n return { kind: 'new' };\n }\n\n /**\n * Marks `id`'s expansion complete. When `requestId` is given, clears only\n * if it still owns the slot (a stale completion after abort + re-expand\n * must not clear the newer request). Returns whether the slot was cleared.\n */\n resolve(id: NodeId, requestId?: string): boolean {\n if (requestId !== undefined && this.inFlight.get(id) !== requestId) return false;\n return this.inFlight.delete(id);\n }\n\n /**\n * Drops `id`'s pending expansion (retractExpansion path). Returns the aborted\n * request id so the caller can cancel its controller, or null when nothing\n * was in flight.\n */\n abort(id: NodeId): string | null {\n const requestId = this.inFlight.get(id);\n if (requestId === undefined) return null;\n this.inFlight.delete(id);\n return requestId;\n }\n\n /** Request id currently serving `id`, if any. */\n requestIdFor(id: NodeId): string | undefined {\n return this.inFlight.get(id);\n }\n\n has(id: NodeId): boolean {\n return this.inFlight.has(id);\n }\n\n get size(): number {\n return this.inFlight.size;\n }\n\n /** Snapshot of pending ids (store's `pendingExpansions` shape). */\n ids(): ReadonlySet<NodeId> {\n return new Set(this.inFlight.keys());\n }\n}\n","/**\n * §16.2 path resolution (S12-T08) — the built-in LOCAL PathService plus the\n * pure emphasis-plan helper the instance wires into `findPath`.\n *\n * The default service runs an unweighted BFS over the LOADED VISIBLE edge\n * list — it never fetches, never touches scope/filters, and never reads the\n * engine. `null` is a RESULT (unreachable), not an error; an endpoint id not\n * in the loaded base is unreachable by definition and also resolves `null`.\n * Direction ('outgoing' default | 'incoming' | 'either') decides which way\n * an edge may be walked. Ties break deterministically: neighbors are visited\n * in base edge order, so among equal-length paths the first in edge order\n * wins. `ctx.signal` is honored between scan chunks (an awaited microtask\n * every {@link PATH_SCAN_CHUNK} scanned edges, as in search.ts) — abort is\n * an optimization; the instance's revision admission gate is authoritative\n * (§9.2). Declares `revisionDependencies: ['source', 'model', 'scope']`: a\n * path is a point-in-scene answer, so ANY revision drift discards it.\n *\n * Nothing is cached across calls: visibility is §9.1 mask-derived and moves\n * WITHOUT advancing any revision dimension, so a revision-keyed adjacency\n * cache would serve stale reachability. One O(V + E) build per call is the\n * §16.2 \"O(n) per action\" budget.\n *\n * EMPHASIS CONTRACT ({@link computePathEmphasis}, wired by the integrator):\n * one findPath application is ONE atomic action — path-node point indices to\n * the engine highlight channel, plus a single link-channel commit carrying\n * path-edge emphasis and the non-path dim complement through the §9.1\n * mutedAlpha mask. While active, the path OWNS engine emphasis state:\n * `clearPath()` or ANY selection mutation restores selection highlight.\n * Path highlight is session-local — cleared by undo/redo, never recorded as\n * a history step, never serialized into GraphViewState (§16.2).\n */\n\nimport { nextSynthesizedEdgeId } from './edgeIdentity';\nimport type { EdgePairCounters } from './edgeIdentity';\nimport { OrbitOperationError } from './errors';\nimport type {\n EdgeId,\n GraphEdge,\n GraphNode,\n NodeId,\n PathOptions,\n PathResult,\n PathService,\n RequestContext,\n} from './types';\n\n// ---------------------------------------------------------------------------\n// Local service contract\n// ---------------------------------------------------------------------------\n\n/** Loaded-base view the local service traverses (thunked for lazy wiring —\n * re-read on every call, so the service can be constructed before data\n * arrives and always sees the live §9.1 visibility). */\nexport interface LocalPathBase<N = Record<string, unknown>, E = Record<string, unknown>> {\n /** Loaded nodes in accepted-base order (the BFS tie-break order). */\n nodes: readonly GraphNode<N>[];\n /** Loaded edges in accepted-base order; ids synthesized per §5 when absent. */\n edges: readonly GraphEdge<E>[];\n /** §9.1 visibility by EDGE ID; absent = every loaded edge is traversable.\n * BFS walks only edges for which this returns true. */\n isEdgeVisible?: (id: EdgeId) => boolean;\n}\n\n/** Edges scanned between cooperative yields (awaited microtask + signal\n * check) — same cadence as SEARCH_SCAN_CHUNK (§16.5 pattern). */\nexport const PATH_SCAN_CHUNK = 4096;\n\nfunction throwAborted(signal: AbortSignal, sourceId: NodeId, targetId: NodeId): never {\n const reason = (signal as { reason?: unknown }).reason;\n throw new OrbitOperationError(\n reason === undefined ? { code: 'aborted' } : { code: 'aborted', cause: reason },\n `local find('${sourceId}' → '${targetId}') aborted mid-scan (§16.2)`,\n );\n}\n\n// ---------------------------------------------------------------------------\n// The built-in local service (§16.2 — \"the default resolver is local BFS\")\n// ---------------------------------------------------------------------------\n\n/**\n * Creates the §16.2 default local path service over the loaded base.\n * Unweighted BFS; shortest path by hop count; `null` when unreachable\n * (including an endpoint id absent from the base). Edge ids missing from the\n * base are synthesized in base order with the §5 codec, so results match the\n * accepted model's ids whichever base form the wiring passes.\n */\nexport function createLocalPathService<N = Record<string, unknown>, E = Record<string, unknown>>(\n getBase: () => LocalPathBase<N, E>,\n): PathService {\n return {\n revisionDependencies: ['source', 'model', 'scope'],\n async find(\n sourceId: NodeId,\n targetId: NodeId,\n options: PathOptions,\n ctx: RequestContext,\n ): Promise<PathResult | null> {\n if (ctx.signal.aborted) throwAborted(ctx.signal, sourceId, targetId);\n const direction = options.direction ?? 'outgoing';\n const { nodes, edges, isEdgeVisible } = getBase();\n\n // Ordinal index over the loaded nodes (first-wins, matching §5.1 dedup).\n const ordinalOf = new Map<NodeId, number>();\n for (let i = 0; i < nodes.length; i++) {\n const id = nodes[i]!.id;\n if (!ordinalOf.has(id)) ordinalOf.set(id, i);\n }\n const src = ordinalOf.get(sourceId);\n const dst = ordinalOf.get(targetId);\n if (src === undefined || dst === undefined) return null; // unloaded = unreachable\n if (src === dst) return { nodeIds: [nodes[src]!.id], edgeIds: [] };\n\n // Directed adjacency over VISIBLE edges: adj[u] holds [v, edgeOrdinal]\n // pairs flat, filled in base edge order (the determinism tie-break).\n // Synthesized-id counters advance for EVERY id-less edge — visible or\n // not — so ordinals match the accepted model's §5 synthesis.\n const adjacency: number[][] = new Array<number[]>(nodes.length);\n const edgeIds: EdgeId[] = new Array<EdgeId>(edges.length);\n const counters: EdgePairCounters = new Map();\n let scanned = 0;\n for (let e = 0; e < edges.length; e++) {\n if (++scanned % PATH_SCAN_CHUNK === 0) {\n // Cooperative yield between scan chunks; the signal is the\n // cancellation seam (§9.2 — abort optimizes, admission gates).\n await Promise.resolve();\n if (ctx.signal.aborted) throwAborted(ctx.signal, sourceId, targetId);\n }\n const edge = edges[e]!;\n const id = edge.id ?? nextSynthesizedEdgeId(counters, edge.source, edge.target);\n edgeIds[e] = id;\n if (isEdgeVisible !== undefined && !isEdgeVisible(id)) continue;\n const s = ordinalOf.get(edge.source);\n const t = ordinalOf.get(edge.target);\n if (s === undefined || t === undefined) continue; // dangling endpoint\n if (direction !== 'incoming') (adjacency[s] ??= []).push(t, e);\n if (direction !== 'outgoing') (adjacency[t] ??= []).push(s, e);\n }\n\n // BFS with predecessor arrays; queue is an array with a head cursor.\n const prevNode = new Int32Array(nodes.length).fill(-1);\n const prevEdge = new Int32Array(nodes.length).fill(-1);\n const visited = new Uint8Array(nodes.length);\n visited[src] = 1;\n const queue: number[] = [src];\n let found = false;\n outer: for (let head = 0; head < queue.length; head++) {\n const u = queue[head]!;\n const list = adjacency[u];\n if (list === undefined) continue;\n for (let j = 0; j < list.length; j += 2) {\n if (++scanned % PATH_SCAN_CHUNK === 0) {\n await Promise.resolve();\n if (ctx.signal.aborted) throwAborted(ctx.signal, sourceId, targetId);\n }\n const v = list[j]!;\n if (visited[v] !== 0) continue;\n visited[v] = 1;\n prevNode[v] = u;\n prevEdge[v] = list[j + 1]!;\n if (v === dst) {\n found = true;\n break outer;\n }\n queue.push(v);\n }\n }\n if (!found) return null;\n\n // Reconstruct dst → src, then reverse into path order.\n const nodeIds: NodeId[] = [];\n const pathEdgeIds: EdgeId[] = [];\n for (let at = dst; at !== src; at = prevNode[at]!) {\n nodeIds.push(nodes[at]!.id);\n pathEdgeIds.push(edgeIds[prevEdge[at]!]!);\n }\n nodeIds.push(nodes[src]!.id);\n nodeIds.reverse();\n pathEdgeIds.reverse();\n return { nodeIds, edgeIds: pathEdgeIds };\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Emphasis plan (pure — the instance turns it into ONE atomic action)\n// ---------------------------------------------------------------------------\n\n/** Scene view the emphasis planner reads — structurally a RenderScene subset\n * plus the optional §9.1 hide-lane probe, so instance wiring passes the live\n * scene straight through. */\nexport interface PathEmphasisScene {\n /** node id → engine point index (RenderScene.indexById). */\n indexById: ReadonlyMap<NodeId, number>;\n /** engine link index → edge id (RenderScene.edgeIdByIndex). */\n edgeIdByIndex: readonly EdgeId[];\n /** §9.1 hide lane (SoftMask.isEdgeVisible); absent = all links visible.\n * Hidden links are excluded from the dim complement (they already render\n * at alpha 0 — dimming them would be redundant work in the mask). */\n isEdgeVisible?: (linkIndex: number) => boolean;\n}\n\n/** One findPath application, as engine-facing index sets. */\nexport interface PathEmphasisPlan {\n /** Path-node POINT indices in path order (engine highlight channel). */\n nodeIndices: readonly number[];\n /** Path-edge LINK indices in path order (the emphasis half of the single\n * atomic link-channel commit). */\n pathEdgeIndices: readonly number[];\n /** Dim complement: every OTHER visible link, ascending (the §9.1\n * mutedAlpha mask half). Disjoint from `pathEdgeIndices` by construction. */\n dimEdgeIndices: readonly number[];\n}\n\n/**\n * Projects a resolved path onto the current scene as index sets — O(path +\n * linkCount), no engine or store access. Ids absent from the scene are\n * skipped: under the wiring's revision admission a resolved path and the\n * scene share a revision, so a miss is unreachable there; the helper stays\n * total for direct callers.\n */\nexport function computePathEmphasis(path: PathResult, scene: PathEmphasisScene): PathEmphasisPlan {\n const nodeIndices: number[] = [];\n for (const id of path.nodeIds) {\n const index = scene.indexById.get(id);\n if (index !== undefined) nodeIndices.push(index);\n }\n const pathEdgeIdSet = new Set<EdgeId>(path.edgeIds);\n const pathEdgeIndexById = new Map<EdgeId, number>();\n const dimEdgeIndices: number[] = [];\n const { edgeIdByIndex, isEdgeVisible } = scene;\n for (let link = 0; link < edgeIdByIndex.length; link++) {\n const id = edgeIdByIndex[link]!;\n if (pathEdgeIdSet.has(id)) {\n // First slot wins for a duplicated id (scene ids are unique per §5.1).\n if (!pathEdgeIndexById.has(id)) pathEdgeIndexById.set(id, link);\n continue;\n }\n if (isEdgeVisible !== undefined && !isEdgeVisible(link)) continue;\n dimEdgeIndices.push(link);\n }\n // Path order, not scene order, for the emphasis lane (badge/walk order).\n const pathEdgeIndices: number[] = [];\n for (const id of path.edgeIds) {\n const index = pathEdgeIndexById.get(id);\n if (index !== undefined) pathEdgeIndices.push(index);\n }\n return { nodeIndices, pathEdgeIndices, dimEdgeIndices };\n}\n","/**\n * §16.5 search — the SearchService contract plus the built-in LOCAL indexed\n * service (S11-T06).\n *\n * The default service is client-side and field-scoped: it indexes the node id\n * ALWAYS plus `attrs[field]` (String()-coerced) for each field the host\n * declared via `searchIndex` — it never guesses privileged attr names, so a\n * missing declaration leaves the service id-only. Matching is a\n * case-insensitive SUBSTRING scan over ONE precomputed lowercase haystack per\n * node (id + indexed field values joined with unit separators) — NOT a\n * per-keystroke re-tokenization: the index builds once per model revision\n * (lazily, on the first search that sees the new revision) and every query\n * against that revision reuses it.\n *\n * Scoring: exact-id match {@link SEARCH_SCORE_EXACT_ID}, id-prefix\n * {@link SEARCH_SCORE_ID_PREFIX}, field/id substring\n * {@link SEARCH_SCORE_SUBSTRING} (+{@link SEARCH_SCORE_TOKEN_START_BONUS}\n * when the match starts a token). Results sort score-desc then accepted-base\n * order; `label` is the first matching indexed field's ORIGINAL value (the id\n * when only the id matched).\n *\n * `ctx.signal` is honored between scan chunks (an awaited microtask every\n * {@link SEARCH_SCAN_CHUNK} nodes) — abort is an optimization; the instance's\n * admission gate is the correctness gate (§9.2). Nothing here touches the\n * engine, the store, or the DOM.\n */\n\nimport { OrbitOperationError } from './errors';\nimport type { GraphNode, RequestContext, RevisionAwareService, SearchResult } from './types';\n\n// ---------------------------------------------------------------------------\n// Contract (§16.5)\n// ---------------------------------------------------------------------------\n\n/** §16.5 search resolver: custom services plug in server-side search\n * (Omnigraph B.7); the instance owns RequestContext creation, revision-keyed\n * caching, supersede cancellation, and stale-result rejection at admission. */\nexport interface SearchService<N = Record<string, unknown>> extends RevisionAwareService {\n search(\n q: string,\n options: { limit: number },\n ctx: RequestContext,\n ): Promise<readonly SearchResult<N>[]>;\n}\n\n/** Accepted-base view the local service indexes (thunked for lazy wiring —\n * the instance re-reads it on every call, so the service can be constructed\n * before any data arrives). */\nexport interface LocalSearchBase<N = Record<string, unknown>> {\n /** Accepted-model nodes in accepted-base order (the tie-break order). */\n nodes: readonly GraphNode<N>[];\n /** §16.5 declared attr fields; undefined = id-only search (the service\n * never guesses attr names). */\n searchIndex: readonly string[] | undefined;\n}\n\n/** The built-in service plus its test seam: how many times the index was\n * (re)built — pins \"one build per model revision, not one per keystroke\". */\nexport interface LocalSearchService<N = Record<string, unknown>> extends SearchService<N> {\n readonly buildCount: number;\n}\n\n// ---------------------------------------------------------------------------\n// Scoring contract (§16.5)\n// ---------------------------------------------------------------------------\n\nexport const SEARCH_SCORE_EXACT_ID = 3;\nexport const SEARCH_SCORE_ID_PREFIX = 2;\nexport const SEARCH_SCORE_SUBSTRING = 1;\n/** A declared field EQUALS the query (case-insensitive): the strongest\n * field lane — an exact name match must outrank every id-substring flood. */\nconst SEARCH_SCORE_EXACT_FIELD = 2.5;\n/** A declared field STARTS WITH the query. */\nconst SEARCH_SCORE_FIELD_PREFIX = 1.5;\nexport const SEARCH_SCORE_TOKEN_START_BONUS = 0.25;\n\n/** Nodes scanned between cooperative yields (awaited microtask + signal check). */\nexport const SEARCH_SCAN_CHUNK = 4096;\n\n/** Unit separator joining haystack lanes — prevents cross-value substring\n * matches (a query never legitimately contains U+001F). */\nconst UNIT_SEPARATOR = '\u001f';\n\n// ---------------------------------------------------------------------------\n// Index model\n// ---------------------------------------------------------------------------\n\n/** One indexed node: the precomputed lowercase haystack plus the per-field\n * lanes needed for scoring and label selection. */\ninterface IndexEntry {\n id: string;\n idLower: string;\n /** idLower + indexed field lowers, unit-separator joined. */\n haystack: string;\n /** ORIGINAL String()-coerced values of present indexed fields, in declared\n * field order (label source). */\n fieldValues: readonly string[];\n /** Lowercase mirror of `fieldValues` (match/scoring lane). */\n fieldLowers: readonly string[];\n}\n\nfunction buildEntries<N>(\n nodes: readonly GraphNode<N>[],\n fields: readonly string[],\n): IndexEntry[] {\n const entries: IndexEntry[] = new Array<IndexEntry>(nodes.length);\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i]!;\n const idLower = node.id.toLowerCase();\n let fieldValues: string[];\n let fieldLowers: string[];\n let haystack: string;\n if (fields.length === 0) {\n fieldValues = [];\n fieldLowers = [];\n haystack = idLower;\n } else {\n fieldValues = [];\n fieldLowers = [];\n const attrs = node.attrs as Record<string, unknown> | undefined;\n for (const field of fields) {\n const raw = attrs?.[field];\n if (raw === undefined || raw === null) continue;\n const value = String(raw);\n fieldValues.push(value);\n fieldLowers.push(value.toLowerCase());\n }\n haystack =\n fieldLowers.length === 0 ? idLower : idLower + UNIT_SEPARATOR + fieldLowers.join(UNIT_SEPARATOR);\n }\n entries[i] = { id: node.id, idLower, haystack, fieldValues, fieldLowers };\n }\n return entries;\n}\n\n/** Match position starts a token when it is at index 0 or follows a\n * non-letter/digit character (word boundary). */\nfunction isTokenStart(value: string, index: number): boolean {\n if (index <= 0) return true;\n const before = value.charAt(index - 1);\n return !/[\\p{L}\\p{N}]/u.test(before);\n}\n\ninterface ScoredMatch {\n score: number;\n label: string;\n}\n\n/** Score one entry against the lowercased needle, or null when it does not\n * match. The haystack test is the single cheap gate; scoring then looks at\n * the individual lanes. */\nfunction scoreEntry(entry: IndexEntry, needle: string): ScoredMatch | null {\n if (!entry.haystack.includes(needle)) return null;\n // First matching indexed field (declared order) supplies the label and the\n // field-substring score lane.\n let fieldLabel: string | null = null;\n let fieldScore = 0;\n for (let i = 0; i < entry.fieldLowers.length; i++) {\n const lower = entry.fieldLowers[i]!;\n const at = lower.indexOf(needle);\n if (at < 0) continue;\n fieldLabel = entry.fieldValues[i]!;\n // Tiered field lane (declared-field order picks the label; the BEST\n // tier across fields would cost another pass — first match wins, which\n // is deterministic and cheap):\n if (lower === needle) {\n fieldScore = SEARCH_SCORE_EXACT_FIELD;\n } else if (lower.startsWith(needle)) {\n fieldScore = SEARCH_SCORE_FIELD_PREFIX;\n } else {\n fieldScore =\n SEARCH_SCORE_SUBSTRING +\n (isTokenStart(lower, at) ? SEARCH_SCORE_TOKEN_START_BONUS : 0);\n }\n break;\n }\n let score: number;\n if (entry.idLower === needle) {\n score = SEARCH_SCORE_EXACT_ID;\n } else if (entry.idLower.startsWith(needle)) {\n score = SEARCH_SCORE_ID_PREFIX;\n } else if (fieldLabel !== null) {\n score = fieldScore;\n } else {\n const at = entry.idLower.indexOf(needle);\n // The haystack matched but no individual lane did: the needle spanned a\n // unit separator (it contained U+001F) — not a real match.\n if (at < 0) return null;\n score =\n SEARCH_SCORE_SUBSTRING +\n (isTokenStart(entry.idLower, at) ? SEARCH_SCORE_TOKEN_START_BONUS : 0);\n }\n return { score, label: fieldLabel ?? entry.id };\n}\n\nfunction throwAborted(signal: AbortSignal, query: string): never {\n const reason = (signal as { reason?: unknown }).reason;\n throw new OrbitOperationError(\n reason === undefined ? { code: 'aborted' } : { code: 'aborted', cause: reason },\n `local search('${query}') aborted mid-scan (§16.5)`,\n );\n}\n\n// ---------------------------------------------------------------------------\n// The built-in local service (§16.5 — \"the default service is client-side\")\n// ---------------------------------------------------------------------------\n\n/**\n * Creates the §16.5 default indexed search service over the accepted model.\n * Declares `revisionDependencies: ['source', 'model']` — the index keys on\n * `ctx.modelRevision` (plus the declared field list), so it builds at most\n * once per model revision and a stale-model result is discarded by the\n * instance's admission gate. `getBase` is a thunk re-read on every call so\n * the instance can wire the service before data arrives.\n */\nexport function createLocalSearchService<N = Record<string, unknown>>(\n getBase: () => LocalSearchBase<N>,\n): LocalSearchService<N> {\n let entries: IndexEntry[] = [];\n let indexedModelRevision: number | null = null;\n let indexedFieldsKey: string | null = null;\n let buildCount = 0;\n\n /** Lazily (re)build the index: once per {model revision, declared fields}\n * coordinate — never per query. */\n function ensureIndex(modelRevision: number): IndexEntry[] {\n const base = getBase();\n const fields = base.searchIndex ?? [];\n const fieldsKey = fields.join(UNIT_SEPARATOR);\n if (indexedModelRevision === modelRevision && indexedFieldsKey === fieldsKey) {\n return entries;\n }\n entries = buildEntries(base.nodes, fields);\n indexedModelRevision = modelRevision;\n indexedFieldsKey = fieldsKey;\n buildCount++;\n return entries;\n }\n\n return {\n revisionDependencies: ['source', 'model'],\n get buildCount(): number {\n return buildCount;\n },\n async search(\n q: string,\n options: { limit: number },\n ctx: RequestContext,\n ): Promise<readonly SearchResult<N>[]> {\n if (ctx.signal.aborted) throwAborted(ctx.signal, q);\n const limit = Number.isFinite(options.limit) ? Math.floor(options.limit) : 0;\n const needle = q.toLowerCase();\n const index = ensureIndex(ctx.modelRevision);\n if (needle.length === 0 || limit <= 0) return [];\n const matches: { id: string; score: number; label: string; order: number }[] = [];\n for (let i = 0; i < index.length; i++) {\n if (i > 0 && i % SEARCH_SCAN_CHUNK === 0) {\n // Cooperative yield between scan chunks; the signal is the\n // cancellation seam (§16.5 — abort optimizes, admission gates).\n await Promise.resolve();\n if (ctx.signal.aborted) throwAborted(ctx.signal, q);\n }\n const entry = index[i]!;\n const hit = scoreEntry(entry, needle);\n if (hit !== null) matches.push({ id: entry.id, score: hit.score, label: hit.label, order: i });\n }\n // Score desc, then accepted-base order (deterministic tie-break).\n matches.sort((a, b) => b.score - a.score || a.order - b.order);\n const bounded = matches.length > limit ? matches.slice(0, limit) : matches;\n return bounded.map(({ id, score, label }) => ({ id, score, label }));\n },\n };\n}\n","/**\n * §9.1 soft filtering (S9-T01) — pure, engine-free expr evaluation,\n * validation, compilation, and canonical keying. The instance feeds compiled\n * filters into the SoftMask kernel (./mask); nothing here touches the store.\n *\n * Semantics (orbit-spec.md §9.1):\n * - `field` addresses `attrs[field]`; the literal field 'id' addresses the\n * entity id (it wins even when `attrs.id` exists).\n * - The serializable expr path NEVER throws: junk shapes and §8-hygiene\n * failures (non-numeric / non-finite values under 'range') simply fail the\n * item. `validateFilterExpr` is the reporting channel — the instance turns\n * its findings into validation errors at applyHostUpdate.\n * - eq/neq/in compare numbers with Object.is semantics EXCEPT that NaN is\n * never equal to anything (so ±0 are distinct and NaN ≠ NaN); everything\n * else compares with plain ===. No coercion, ever ('5' never equals 5).\n * - Function predicates are black boxes: throws are caught and aggregated\n * into ONE {count, samples} result the caller converts to a single\n * 'filter-error' diagnostic (§5.1 batching — O(categories), never O(bad\n * rows)). A throwing predicate FAILS OPEN: the item stays visible, so a\n * buggy predicate can never blank the graph.\n * - Structural specs compare by canonical key (`canonicalFilterKey`) so\n * identity churn with equal structure never re-evaluates; function\n * predicates key by reference identity via a WeakMap-issued token.\n */\n\nimport { DIAGNOSTIC_SAMPLE_CAP } from './types';\nimport type { AcceptedEdge, FilterExpr, FilterSpec, GraphNode } from './types';\n\n// ---------------------------------------------------------------------------\n// Field resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Resolves a filter `field` against an entity: 'id' addresses the entity id;\n * any other field addresses `attrs[field]` (undefined when attrs are absent).\n */\nexport function resolveFilterField(\n item: GraphNode<unknown> | AcceptedEdge<unknown>,\n field: string,\n): unknown {\n if (field === 'id') return item.id;\n const attrs = item.attrs as Record<string, unknown> | null | undefined;\n return attrs?.[field];\n}\n\n// ---------------------------------------------------------------------------\n// Evaluation (never throws)\n// ---------------------------------------------------------------------------\n\n/**\n * §9.1 equality: numbers use Object.is semantics EXCEPT NaN never equals\n * anything (±0 distinct, NaN ≠ NaN); non-numbers use plain ===.\n */\nfunction filterValuesEqual(a: unknown, b: unknown): boolean {\n if (typeof a === 'number' && typeof b === 'number') {\n return Object.is(a, b) && !Number.isNaN(a);\n }\n return a === b;\n}\n\n/**\n * Evaluates one expr for one item via a field resolver. NEVER throws:\n * malformed shapes and §8-hygiene failures fail the item (return false);\n * a malformed operand under 'not' also fails (junk never passes by double\n * negation). `range` requires a finite number value; missing bounds are\n * unbounded; includeMin/includeMax default true. `is-null` matches null OR\n * undefined (absent attr).\n */\nexport function evaluateFilterExpr(\n expr: FilterExpr,\n resolve: (field: string) => unknown,\n): boolean {\n if (typeof expr !== 'object' || expr === null) return false;\n switch (expr.op) {\n case 'eq':\n case 'neq': {\n const equal = filterValuesEqual(resolve(expr.field), expr.value);\n return expr.op === 'eq' ? equal : !equal;\n }\n case 'in': {\n const { values } = expr;\n if (!Array.isArray(values)) return false;\n const v = resolve(expr.field);\n for (let i = 0; i < values.length; i++) {\n if (filterValuesEqual(v, values[i])) return true;\n }\n return false;\n }\n case 'range': {\n const v = resolve(expr.field);\n if (typeof v !== 'number' || !Number.isFinite(v)) return false;\n const { min, max } = expr;\n if (typeof min === 'number' && ((expr.includeMin ?? true) ? v < min : v <= min)) {\n return false;\n }\n if (typeof max === 'number' && ((expr.includeMax ?? true) ? v > max : v >= max)) {\n return false;\n }\n return true;\n }\n case 'is-null': {\n const v = resolve(expr.field);\n return v === null || v === undefined;\n }\n case 'not': {\n const inner: unknown = expr.expr;\n if (typeof inner !== 'object' || inner === null) return false;\n return !evaluateFilterExpr(inner as FilterExpr, resolve);\n }\n case 'and': {\n const terms = expr.exprs;\n if (!Array.isArray(terms)) return false;\n for (let i = 0; i < terms.length; i++) {\n if (!evaluateFilterExpr(terms[i] as FilterExpr, resolve)) return false;\n }\n return true; // vacuous truth: empty 'and' passes\n }\n case 'or': {\n const terms = expr.exprs;\n if (!Array.isArray(terms)) return false;\n for (let i = 0; i < terms.length; i++) {\n if (evaluateFilterExpr(terms[i] as FilterExpr, resolve)) return true;\n }\n return false; // empty 'or' fails\n }\n default:\n return false; // unknown op — validateFilterExpr is the reporting channel\n }\n}\n\n// ---------------------------------------------------------------------------\n// Validation (the instance surfaces these at applyHostUpdate)\n// ---------------------------------------------------------------------------\n\nfunction isFilterValue(v: unknown): boolean {\n return v === null || typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean';\n}\n\nfunction checkField(e: Record<string, unknown>, path: string, out: string[]): void {\n if (typeof e['field'] !== 'string' || e['field'].length === 0) {\n out.push(`${path}: 'field' must be a non-empty string`);\n }\n}\n\nfunction validateInto(value: unknown, path: string, out: string[]): void {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n out.push(`${path}: expected a FilterExpr object`);\n return;\n }\n const e = value as Record<string, unknown>;\n const op = e['op'];\n if (typeof op !== 'string') {\n out.push(`${path}: missing string 'op'`);\n return;\n }\n switch (op) {\n case 'eq':\n case 'neq':\n checkField(e, path, out);\n if (!isFilterValue(e['value'])) {\n out.push(`${path}: 'value' must be string | number | boolean | null`);\n }\n break;\n case 'in': {\n checkField(e, path, out);\n const values = e['values'];\n if (!Array.isArray(values)) {\n out.push(`${path}: 'values' must be an array`);\n } else {\n for (let i = 0; i < values.length; i++) {\n if (!isFilterValue(values[i])) {\n out.push(`${path}.values[${i}]: must be string | number | boolean | null`);\n }\n }\n }\n break;\n }\n case 'range': {\n checkField(e, path, out);\n for (const key of ['min', 'max'] as const) {\n const bound = e[key];\n if (bound !== undefined && (typeof bound !== 'number' || Number.isNaN(bound))) {\n out.push(`${path}.${key}: must be a number (not NaN)`);\n }\n }\n for (const key of ['includeMin', 'includeMax'] as const) {\n const flag = e[key];\n if (flag !== undefined && typeof flag !== 'boolean') {\n out.push(`${path}.${key}: must be a boolean`);\n }\n }\n break;\n }\n case 'is-null':\n checkField(e, path, out);\n break;\n case 'not':\n validateInto(e['expr'], `${path}.expr`, out);\n break;\n case 'and':\n case 'or': {\n const terms = e['exprs'];\n if (!Array.isArray(terms)) {\n out.push(`${path}: 'exprs' must be an array`);\n } else {\n for (let i = 0; i < terms.length; i++) {\n validateInto(terms[i], `${path}.exprs[${i}]`, out);\n }\n }\n break;\n }\n default:\n out.push(`${path}: unknown filter op '${op}'`);\n }\n}\n\n/**\n * Structural checker for serializable exprs: unknown ops and malformed\n * shapes are reported as `$`-rooted path strings ([] = valid). The instance\n * converts findings into validation errors at applyHostUpdate (§9.1) —\n * evaluation itself never throws on the same junk, it just fails the item.\n */\nexport function validateFilterExpr(expr: FilterExpr): string[] {\n const out: string[] = [];\n validateInto(expr, '$', out);\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// Compilation\n// ---------------------------------------------------------------------------\n\n/** ONE aggregated throw tally per compiled filter → one 'filter-error'\n * diagnostic (count + capped samples), never O(bad rows) diagnostics. */\nexport interface FilterErrorAggregate {\n count: number;\n /** At most DIAGNOSTIC_SAMPLE_CAP offending entity ids. */\n samples: string[];\n}\n\nexport interface CompiledFilter<T> {\n /** True = item passes (stays fully visible); false = item fails the mask. */\n test(item: T): boolean;\n /** Live tally of predicate throws (function specs only; the expr path\n * never throws). The caller converts a nonzero count to a 'filter-error'\n * diagnostic after the evaluation pass. */\n readonly errors: FilterErrorAggregate;\n}\n\nfunction compileSelector<T extends GraphNode<unknown> | AcceptedEdge<unknown>>(\n selector: FilterExpr | ((item: T) => boolean) | undefined,\n): CompiledFilter<T> {\n const errors: FilterErrorAggregate = { count: 0, samples: [] };\n if (selector === undefined) {\n return { errors, test: () => true };\n }\n if (typeof selector === 'function') {\n return {\n errors,\n test(item: T): boolean {\n try {\n return Boolean(selector(item));\n } catch {\n errors.count += 1;\n if (errors.samples.length < DIAGNOSTIC_SAMPLE_CAP) errors.samples.push(item.id);\n return true; // fail open: a throwing predicate never hides data\n }\n },\n };\n }\n // Expr path: one reused resolver closure — zero per-item allocation.\n let current: T | null = null;\n const resolve = (field: string): unknown =>\n current === null ? undefined : resolveFilterField(current, field);\n return {\n errors,\n test(item: T): boolean {\n current = item;\n const pass = evaluateFilterExpr(selector, resolve);\n current = null;\n return pass;\n },\n };\n}\n\n/** Compiles the node lane of a FilterSpec (absent selector = pass-all). */\nexport function compileNodeFilter<N = Record<string, unknown>, E = Record<string, unknown>>(\n spec: FilterSpec<N, E>,\n): CompiledFilter<GraphNode<N>> {\n return compileSelector<GraphNode<N>>(spec.nodes);\n}\n\n/** Compiles the edge lane of a FilterSpec (absent selector = pass-all). */\nexport function compileEdgeFilter<N = Record<string, unknown>, E = Record<string, unknown>>(\n spec: FilterSpec<N, E>,\n): CompiledFilter<AcceptedEdge<E>> {\n return compileSelector<AcceptedEdge<E>>(spec.edges);\n}\n\n// ---------------------------------------------------------------------------\n// Canonical keying (§9.1 re-evaluation skip)\n// ---------------------------------------------------------------------------\n\n/** Function predicates key by reference identity: a WeakMap-issued counter\n * token (unique, deliberately non-canonical) — equal source text is NOT\n * equal identity, and re-using the same reference IS. */\nconst functionTokens = new WeakMap<object, number>();\nlet nextFunctionToken = 0;\n\nfunction functionToken(fn: object): string {\n let token = functionTokens.get(fn);\n if (token === undefined) {\n token = nextFunctionToken;\n nextFunctionToken += 1;\n functionTokens.set(fn, token);\n }\n return `fn#${token}`;\n}\n\nfunction canonicalize(value: unknown): string {\n if (value === null) return 'null';\n switch (typeof value) {\n case 'function':\n return functionToken(value as object);\n case 'string':\n return JSON.stringify(value);\n case 'number':\n return Object.is(value, -0) ? '-0' : String(value); // 'NaN'/'Infinity' are bare tokens\n case 'boolean':\n return value ? 'true' : 'false';\n case 'undefined':\n return 'undefined';\n case 'bigint':\n return `${value}n`;\n case 'symbol':\n return String(value);\n default:\n break;\n }\n if (Array.isArray(value)) {\n let out = '[';\n for (let i = 0; i < value.length; i++) {\n if (i > 0) out += ',';\n out += canonicalize(value[i]);\n }\n return `${out}]`;\n }\n const obj = value as Record<string, unknown>;\n const keys = Object.keys(obj).sort();\n let out = '{';\n let first = true;\n for (const key of keys) {\n const v = obj[key];\n if (v === undefined) continue; // absent and undefined-valued keys are equal\n if (!first) out += ',';\n first = false;\n out += `${JSON.stringify(key)}:${canonicalize(v)}`;\n }\n return `${out}}`;\n}\n\n/**\n * Canonical structural key for a FilterSpec or FilterExpr: object keys are\n * sorted, arrays preserve order, undefined-valued keys are omitted, and\n * function predicates map to a unique reference-identity token. Two inputs\n * with equal keys are §9.1-equivalent — the instance skips re-evaluation\n * when the key of an incoming filter matches the active one (identity churn\n * with equal structure never re-evaluates; swapping a function reference\n * always does).\n */\nexport function canonicalFilterKey(specOrExpr: unknown): string {\n return canonicalize(specOrExpr);\n}\n","/**\n * §11 scales & domains (S10-T01/T07) — canonical scale keying, default\n * palettes, sRGB color interpolation, domain-state machinery, and stable\n * categorical assignment. Pure and engine-free; the instance/projection\n * layers consume these primitives when a styling channel carries a `Scale`.\n *\n * Semantics (orbit-spec.md §8/§11):\n * - Scales are plain descriptors compared by CANONICAL STRUCTURAL VALUE —\n * equal inline literals produce equal keys and never reproject. A function\n * `by` keys by reference identity (WeakMap token), never by source text.\n * - Domains default to the whole dataset revision and stay FROZEN across\n * masking/brushing/isolation ('dataset' scope): the same metric value never\n * changes visual meaning because a user brushed. 'hard-scope'/'visible' are\n * explicit opt-ins that recompute when the caller's scope generation bumps;\n * streaming 'expand' permits monotonic domain growth on recompute.\n * - Explicit numeric domains always win verbatim (never computed, cached, or\n * unioned).\n * - Categorical values declared in `domain` take their declared position;\n * out-of-domain values take a stable fnv-1a hash slot — NEVER first-seen\n * order, so arrival order can never recolor a category.\n * - §8 numeric hygiene: null/non-finite metric values resolve to `null`\n * (caller falls back to the default style) and are excluded from domains.\n */\n\nimport { canonicalFilterKey } from './filter';\nimport { parseColor } from './projection';\nimport type { RGBA } from './projection';\nimport type { DomainPolicy, Scale } from './types';\n\n// ---------------------------------------------------------------------------\n// Scale-kind aliases (narrowing helpers for consumers)\n// ---------------------------------------------------------------------------\n\nexport type SequentialScale<T, N = Record<string, unknown>> = Extract<\n Scale<T, N>,\n { kind: 'sequential' }\n>;\nexport type CategoricalScale<T, N = Record<string, unknown>> = Extract<\n Scale<T, N>,\n { kind: 'categorical' }\n>;\nexport type DivergingScale<T, N = Record<string, unknown>> = Extract<\n Scale<T, N>,\n { kind: 'diverging' }\n>;\n\n// ---------------------------------------------------------------------------\n// Canonical keying (§8 reprojection skip, §11)\n// ---------------------------------------------------------------------------\n\n/**\n * Canonical structural key for a Scale descriptor: object keys sorted, array\n * order preserved, undefined-valued keys omitted, and a function `by` mapped\n * to a unique reference-identity token (same WeakMap approach — and canonical\n * grammar — as `canonicalFilterKey`). Two scales with equal keys are\n * §11-equivalent: equal inline literals MUST and DO produce equal keys, so\n * identity churn never reprojects; swapping a function reference always does.\n */\nexport function canonicalScaleKey<T, N>(scale: Scale<T, N>): string {\n return canonicalFilterKey(scale);\n}\n\n// ---------------------------------------------------------------------------\n// Default palettes (dataviz-convention: brand-neutral, light/dark aware)\n// ---------------------------------------------------------------------------\n\n/** 12 brand-neutral categorical hues distinguishable on light AND dark. */\nexport const CATEGORICAL_PALETTE: readonly string[] = [\n '#4e79a7',\n '#f28e2b',\n '#59a14f',\n '#e15759',\n '#b07aa1',\n '#76b7b2',\n '#edc948',\n '#ff9da7',\n '#9c755f',\n '#bab0ac',\n '#86bcb6',\n '#d37295',\n];\n\n/** Default sequential ramp endpoints (low → high). */\nexport const SEQUENTIAL_RANGE_DEFAULT: readonly [string, string] = ['#3b82f6', '#f59e0b'];\n\n/** Default diverging stops (low → mid → high). */\nexport const DIVERGING_RANGE_DEFAULT: readonly [string, string, string] = [\n '#3b82f6',\n '#e5e7eb',\n '#ef4444',\n];\n\n// ---------------------------------------------------------------------------\n// Color interpolation (sRGB via projection.ts parseColor)\n// ---------------------------------------------------------------------------\n\n/** Matches projection.ts DEFAULT_COLOR_FALLBACK — unparseable stops degrade\n * to the same neutral gray the projection lane falls back to. */\nconst COLOR_STOP_FALLBACK: RGBA = [0.66, 0.66, 0.66, 1];\n\nfunction clamp01(v: number): number {\n return v < 0 ? 0 : v > 1 ? 1 : v;\n}\n\nfunction formatRgba(r: number, g: number, b: number, a: number): string {\n const rr = Math.round(clamp01(r) * 255);\n const gg = Math.round(clamp01(g) * 255);\n const bb = Math.round(clamp01(b) * 255);\n // 3 decimals keeps alpha exact for the usual fractions and float-noise-free.\n const aa = Math.round(clamp01(a) * 1000) / 1000;\n return `rgba(${rr}, ${gg}, ${bb}, ${aa})`;\n}\n\n/**\n * Interpolates between two CSS color strings in sRGB (component-wise,\n * including alpha) and returns an `rgba(r, g, b, a)` string. `t` is clamped\n * to [0,1] (non-finite t → 0). Unparseable endpoints fall back to the\n * projection lane's neutral gray — never a throw, never NaN output.\n */\nexport function interpolateColor(a: string, b: string, t: number): string {\n const ca = parseColor(a) ?? COLOR_STOP_FALLBACK;\n const cb = parseColor(b) ?? COLOR_STOP_FALLBACK;\n const k = Number.isFinite(t) ? clamp01(t) : 0;\n return formatRgba(\n ca[0] + (cb[0] - ca[0]) * k,\n ca[1] + (cb[1] - ca[1]) * k,\n ca[2] + (cb[2] - ca[2]) * k,\n ca[3] + (cb[3] - ca[3]) * k,\n );\n}\n\n/** [lo,hi] position of `value`, clamped; degenerate/junk spans map to 0.5\n * (the d3 convention — a single-valued domain renders the ramp midpoint). */\nfunction normalizePosition(value: number, lo: number, hi: number): number {\n const span = hi - lo;\n if (!Number.isFinite(span) || span === 0) return 0.5;\n return clamp01((value - lo) / span);\n}\n\n/**\n * Sequential color: maps `value` across `domain` onto the two-stop ramp.\n * Returns null (caller renders the default style, §8 hygiene) when the value\n * is null/non-finite or the domain is null.\n */\nexport function sequentialColor<N = Record<string, unknown>>(\n scale: SequentialScale<string, N>,\n value: number | null,\n domain: readonly [number, number] | null,\n): string | null {\n if (typeof value !== 'number' || !Number.isFinite(value) || domain === null) return null;\n const t = normalizePosition(value, domain[0], domain[1]);\n return interpolateColor(scale.range[0], scale.range[1], t);\n}\n\n/**\n * Diverging color: `mid` maps to the middle stop exactly; each half\n * interpolates independently ([domain[0]..mid] over range[0..1],\n * [mid..domain[1]] over range[1..2]). A degenerate half collapses to the\n * middle stop. Null/non-finite value or null domain → null.\n */\nexport function divergingColor<N = Record<string, unknown>>(\n scale: DivergingScale<string, N>,\n value: number | null,\n domain: readonly [number, number] | null,\n): string | null {\n if (typeof value !== 'number' || !Number.isFinite(value) || domain === null) return null;\n const { mid } = scale;\n if (value <= mid) {\n const span = mid - domain[0];\n const t = !Number.isFinite(span) || span <= 0 ? 1 : clamp01((value - domain[0]) / span);\n return interpolateColor(scale.range[0], scale.range[1], t);\n }\n const span = domain[1] - mid;\n const t = !Number.isFinite(span) || span <= 0 ? 0 : clamp01((value - mid) / span);\n return interpolateColor(scale.range[1], scale.range[2], t);\n}\n\n/**\n * Sequential size: linear map of `value` across `domain` onto [lo,hi],\n * clamped at the range endpoints. Degenerate domains yield the range\n * midpoint; null/non-finite values and null domains yield null (default\n * style — NaN is never handed to a size buffer, §8).\n */\nexport function sequentialSize(\n range: readonly [number, number],\n value: number | null,\n domain: readonly [number, number] | null,\n): number | null {\n if (typeof value !== 'number' || !Number.isFinite(value) || domain === null) return null;\n const t = normalizePosition(value, domain[0], domain[1]);\n const size = range[0] + (range[1] - range[0]) * t;\n return Number.isFinite(size) ? size : null;\n}\n\n// ---------------------------------------------------------------------------\n// Domain computation & the DomainStore (§11 freeze / expand / scope)\n// ---------------------------------------------------------------------------\n\n/**\n * [min,max] over the finite numbers in `values` (§8 hygiene: null and\n * non-finite entries are excluded), or null when nothing qualifies. A single\n * qualifying value yields a degenerate [v,v] domain.\n */\nexport function computeNumericDomain(values: Iterable<number | null>): [number, number] | null {\n let min = Infinity;\n let max = -Infinity;\n let seen = false;\n for (const v of values) {\n if (typeof v !== 'number' || !Number.isFinite(v)) continue;\n seen = true;\n if (v < min) min = v;\n if (v > max) max = v;\n }\n return seen ? [min, max] : null;\n}\n\nexport interface ResolveDomainArgs {\n /** Cache key — `canonicalScaleKey(scale)` (the metric name is part of the\n * descriptor, so the key already discriminates by metric). Opaque here. */\n key: string;\n /** Explicit caller domain — returned VERBATIM; never computed, cached, or\n * expand-unioned (§11: explicit always wins). */\n explicit?: readonly [number, number] | undefined;\n /** Defaults: scope 'dataset', streaming 'freeze-per-revision'. */\n policy?: DomainPolicy | undefined;\n /** The dataset revision the caller is resolving against. */\n datasetRevision: number | string;\n /** Caller-owned generation counter for 'hard-scope'/'visible' scopes\n * (bump = recompute). IGNORED under 'dataset' scope — masking/brushing\n * must never change what a color means. */\n scopeGeneration?: number | undefined;\n /** Source lineage this resolve belongs to (F11-02: datasetKey + source\n * revision). `streaming: 'expand'` unions only WITHIN one lineage — a\n * source replacement starts fresh instead of unioning dead extrema.\n * Callers that omit it keep the legacy always-union behavior. */\n lineage?: string | undefined;\n /** Domain producer (typically wraps computeNumericDomain over the metric\n * column). Called at most once per freeze coordinate. */\n compute: () => readonly [number, number] | null;\n}\n\ninterface DomainEntry {\n datasetRevision: number | string;\n scopeGeneration: number;\n lineage: string | undefined;\n domain: readonly [number, number] | null;\n}\n\nfunction unionDomains(\n a: readonly [number, number] | null,\n b: readonly [number, number] | null,\n): readonly [number, number] | null {\n if (a === null) return b;\n if (b === null) return a;\n return [Math.min(a[0], b[0]), Math.max(a[1], b[1])];\n}\n\n/**\n * Per-instance domain freezer keyed by canonical scale key (§11).\n *\n * FREEZE-PER-REVISION: under scope 'dataset' the domain is computed ONCE per\n * {key, datasetRevision} — repeat resolves return the frozen value without\n * calling `compute`, no matter how the underlying data was masked or brushed\n * in between. 'hard-scope'/'visible' additionally recompute when the caller's\n * scopeGeneration bumps. Streaming 'expand' turns every recompute into a\n * monotonic union with the previous domain (the domain only ever grows);\n * 'freeze-per-revision' replaces it. Explicit domains bypass the store.\n */\nexport class DomainStore {\n private readonly entries = new Map<string, DomainEntry>();\n\n resolveDomain(args: ResolveDomainArgs): readonly [number, number] | null {\n if (args.explicit !== undefined) return args.explicit;\n const scope = args.policy?.scope ?? 'dataset';\n const streaming = args.policy?.streaming ?? 'freeze-per-revision';\n const generation = args.scopeGeneration ?? 0;\n const entry = this.entries.get(args.key);\n if (\n entry !== undefined &&\n entry.datasetRevision === args.datasetRevision &&\n (scope === 'dataset' || entry.scopeGeneration === generation)\n ) {\n return entry.domain; // frozen — compute is NOT called\n }\n const computed = args.compute();\n // F11-02: expand-union is lineage-guarded — a replaced source (new\n // lineage) starts a fresh monotonic run instead of unioning against\n // the dead dataset's extrema.\n const domain =\n streaming === 'expand' && entry !== undefined && entry.lineage === args.lineage\n ? unionDomains(entry.domain, computed)\n : computed;\n this.entries.set(args.key, {\n datasetRevision: args.datasetRevision,\n scopeGeneration: generation,\n lineage: args.lineage,\n domain,\n });\n return domain;\n }\n\n /**\n * Dataset replace: `revision` is the revision now current — every entry\n * frozen for any OTHER revision is dropped (including expand-union lineage,\n * so a replaced dataset never unions against dead data). Entries already\n * at `revision` survive.\n */\n invalidateDataset(revision: number | string): void {\n for (const [key, entry] of this.entries) {\n if (entry.datasetRevision !== revision) this.entries.delete(key);\n }\n }\n\n /** Full reset (dataset identity change / instance teardown). */\n clear(): void {\n this.entries.clear();\n }\n}\n\n// ---------------------------------------------------------------------------\n// Categorical assignment (§11 stable colors & legend rows)\n// ---------------------------------------------------------------------------\n\n/** 32-bit FNV-1a over UTF-16 code units — the stable out-of-domain slot hash.\n * PINNED: changing this function recolors every undeclared category. */\nfunction fnv1a(value: string): number {\n let h = 0x811c9dc5;\n for (let i = 0; i < value.length; i++) {\n h ^= value.charCodeAt(i);\n h = Math.imul(h, 0x01000193);\n }\n return h >>> 0;\n}\n\n/**\n * Palette slot for a categorical value: values declared in `domain` take\n * their declared position (mod palette length — fixed order → stable colors);\n * out-of-domain values take fnv-1a(value) mod palette length — stable across\n * sessions and arrival orders, NEVER first-seen order. Returns -1 for an\n * empty palette.\n */\nexport function categoricalIndex(\n domain: readonly string[] | undefined,\n palette: readonly unknown[],\n value: string,\n): number {\n if (palette.length === 0) return -1;\n if (domain !== undefined) {\n const pos = domain.indexOf(value);\n if (pos >= 0) return pos % palette.length;\n }\n return fnv1a(value) % palette.length;\n}\n\n/**\n * Stable legend row order: declared `domain` values FIRST in declared order\n * (including currently-empty categories), then extra seen values sorted\n * lexicographically. Duplicates (within `seen` or already declared) collapse.\n */\nexport function categoricalRows(\n domain: readonly string[] | undefined,\n seen: Iterable<string>,\n): string[] {\n const rows: string[] = [];\n const declared = new Set<string>();\n if (domain !== undefined) {\n for (const v of domain) {\n if (declared.has(v)) continue;\n declared.add(v);\n rows.push(v);\n }\n }\n const extras: string[] = [];\n const extraSet = new Set<string>();\n for (const v of seen) {\n if (declared.has(v) || extraSet.has(v)) continue;\n extraSet.add(v);\n extras.push(v);\n }\n extras.sort();\n for (const v of extras) rows.push(v);\n return rows;\n}\n","/**\n * §8 shared numeric hygiene (R-19-10) — THE single coercion layer for every\n * numeric consumer in orbit-core.\n *\n * Wherever a caller-supplied value feeds a numeric sink — size/width\n * projection buffers (§8), scale domains (§11), metric columns (§12),\n * crossfilter bins (§16.6), table lanes — the value is REQUIRED to route\n * through `coerceNumeric` / `coerceNumericInto`. Non-numeric and non-finite\n * inputs (including the string sentinels `\"NaN\"` / `\"Infinity\"` /\n * `\"-Infinity\"` that JSON transports smuggle through, §5) coerce to `null`:\n * the row falls back to the default style and is excluded from domain\n * computation. NaN NEVER escapes this module — not as a return value and not\n * into a GPU buffer.\n *\n * Coercion rules:\n * - numbers pass iff `Number.isFinite` (NaN / ±Infinity → null);\n * - strings are trimmed; empty → null; the case-insensitive sentinels\n * 'NaN' / 'Infinity' / '-Infinity' / '+Infinity' → null; anything else\n * parses via `Number(...)` and passes iff finite (so '1e3' → 1000 but\n * '12px' → null — `Number`, not `parseFloat`, so no partial prefixes);\n * - booleans, objects, arrays, functions, symbols, bigints, null, and\n * undefined → null (no `valueOf`/`toString` coercion side channels).\n *\n * FOLLOW-UP (do not fix here): `crossfilter.ts` predates this module and\n * carries its own inline finite checks; migrating it to route through\n * `coerceNumeric` is a tracked S10 follow-up so the sentinel-string rules\n * stay defined in exactly one place.\n */\n\nexport function coerceNumeric(value: unknown): number | null {\n if (typeof value === 'number') {\n return Number.isFinite(value) ? value : null;\n }\n if (typeof value === 'string') {\n const trimmed = value.trim();\n if (trimmed === '') return null;\n const lower = trimmed.toLowerCase();\n if (lower === 'nan' || lower === 'infinity' || lower === '-infinity' || lower === '+infinity') {\n return null;\n }\n const parsed = Number(trimmed);\n return Number.isFinite(parsed) ? parsed : null;\n }\n return null;\n}\n\n/**\n * Buffer-writer variant for hot projection loops: coerces `value` and writes\n * it at `target[index]`, falling back to `fallback` when coercion yields\n * null. Returns true iff the caller's value was admitted (false = fallback\n * was written).\n *\n * The fallback itself is hygiene-checked (a non-finite fallback writes 0) so\n * NaN cannot reach the buffer through EITHER argument. Allocation-free.\n */\nexport function coerceNumericInto(\n target: Float32Array,\n index: number,\n value: unknown,\n fallback: number,\n): boolean {\n const coerced = coerceNumeric(value);\n if (coerced === null) {\n target[index] = Number.isFinite(fallback) ? fallback : 0;\n return false;\n }\n target[index] = coerced;\n return true;\n}\n","/**\n * §12 metrics (v0.8 subset): lazy degree-family primitives over the\n * maintained topology plus revision-gated admission of async metric columns.\n *\n * - The degree family (degree / inDegree / outDegree) is computed LAZILY on\n * first request per model revision, in ONE combined O(n + L) pass, and\n * cached as Float64Arrays until the model revision changes.\n * - SELF-LOOP SEMANTICS: a self-loop (a, a) contributes exactly 1 to each of\n * degree, inDegree, and outDegree of `a`. The CSR adjacency lists a\n * self-loop twice under its point (once per endpoint slot, see\n * adjacency.ts), so degree = CSR row length MINUS the point's self-loop\n * count; in/out come from a directed pass over the flat link pairs.\n * - Async columns join once against the accepted model (§12): 'index' align\n * is positional over accepted-base order; 'ids' align joins by id with\n * unknown ids counted+sampled, duplicate ids counted (last occurrence\n * wins), and absent rows null. Every value routes through `coerceNumeric`\n * (§8 hygiene, R-19-10). A column computed for a stale model revision is\n * DISCARDED with a diagnostic — admission is the correctness gate, abort\n * is only an optimization (§9.2).\n * - Storage encodes null as NaN inside Float64Arrays; `getMetricValue`\n * converts back at the boundary so NaN never escapes to callers.\n * - Admitted columns SHADOW the built-in degree family under the same name\n * (a precomputed/server 'degree' column wins; §12 precomputed path).\n */\n\nimport { DIAGNOSTIC_SAMPLE_CAP } from './types';\nimport type { GraphDiagnostic, GraphNode, MetricColumn, MetricName, NodeId } from './types';\nimport type { Adjacency } from './adjacency';\nimport { coerceNumeric } from './hygiene';\n\n/** Topology snapshot the degree family is computed from (§12). */\nexport interface MetricModelInput<N = Record<string, unknown>> {\n /** Accepted nodes in accepted-base order (index i ↔ point i). */\n nodes: readonly GraphNode<N>[];\n /** CSR adjacency over `links` (self-loops listed twice; adjacency.ts). */\n adjacency: Adjacency;\n /** Flat `[src0, tgt0, src1, tgt1, …]` directed point-index pairs. */\n links: Uint32Array;\n datasetRevision: number | string;\n modelRevision: number;\n}\n\nexport interface AdmitColumnsOptions {\n /** Accepted id → accepted-base index (the core map — no public copy). */\n nodeIndex: ReadonlyMap<NodeId, number>;\n /** Accepted node count ('index' align must match exactly). */\n count: number;\n /** The model revision current when the update carrying the columns was\n * ISSUED (the admission gate compares each column's own\n * `forModelRevision` stamp against this — I1). */\n modelRevision: number;\n}\n\nexport interface AdmitColumnsResult {\n /** Metric names admitted by this call, in input order. */\n admitted: readonly string[];\n diagnostics: readonly GraphDiagnostic[];\n}\n\ninterface DegreeCache {\n degree: Float64Array;\n inDegree: Float64Array;\n outDegree: Float64Array;\n}\n\nfunction isDegreeFamily(name: MetricName): name is 'degree' | 'inDegree' | 'outDegree' {\n return name === 'degree' || name === 'inDegree' || name === 'outDegree';\n}\n\nfunction columnDiagnostic(\n severity: GraphDiagnostic['severity'],\n count: number,\n sampleIds: readonly string[],\n message: string,\n): GraphDiagnostic {\n return { code: 'metric-column-error', severity, count, sampleIds, message };\n}\n\nexport class MetricStore<N = Record<string, unknown>> {\n private model: MetricModelInput<N> | null = null;\n private degreeCache: DegreeCache | null = null;\n /** Admitted async columns by metric name; NaN encodes null. */\n private readonly columns = new Map<string, Float64Array>();\n private degreePasses = 0;\n\n /** Number of combined degree-family compute passes (test observability). */\n get degreeComputePasses(): number {\n return this.degreePasses;\n }\n\n /**\n * Installs the topology the degree family derives from. A changed\n * {datasetRevision, modelRevision} coordinate invalidates the lazy degree\n * cache AND drops every admitted column (their accepted-base alignment is\n * meaningless against a different model); re-setting the identical\n * coordinate keeps both.\n */\n setModel(model: MetricModelInput<N>): void {\n const prev = this.model;\n const changed =\n prev === null ||\n prev.modelRevision !== model.modelRevision ||\n prev.datasetRevision !== model.datasetRevision;\n this.model = model;\n if (changed) {\n this.degreeCache = null;\n this.columns.clear();\n }\n }\n\n /**\n * Joins async metric columns against the accepted model (§12).\n * Revision-gated PER COLUMN (I1): a column whose issue-time\n * `forModelRevision` stamp differs from `opts.modelRevision` is discarded\n * (info diagnostic — a normal async race outcome, §9.2). A missing or\n * mismatched stamp is never defaulted to the current revision — that\n * would make the gate self-satisfying.\n * Structural rejections ('index' length mismatch, missing/mismatched ids)\n * emit ONE warning diagnostic per column; a joined column emits at most\n * one unknown-ids and one duplicate-ids diagnostic, each carrying a total\n * count and at most DIAGNOSTIC_SAMPLE_CAP sample ids.\n */\n admitColumns(\n columns: readonly MetricColumn[],\n opts: AdmitColumnsOptions,\n ): AdmitColumnsResult {\n const admitted: string[] = [];\n const diagnostics: GraphDiagnostic[] = [];\n\n for (const column of columns) {\n if (column.forModelRevision !== opts.modelRevision) {\n diagnostics.push(\n columnDiagnostic(\n 'info',\n 1,\n [column.metric],\n `metric column '${column.metric}' discarded: computed for model revision ${String(column.forModelRevision)} but the update was issued at revision ${String(opts.modelRevision)} (§12/I1 revision-gated admission)`,\n ),\n );\n continue;\n }\n\n if (column.align === 'index') {\n if (column.values.length !== opts.count) {\n diagnostics.push(\n columnDiagnostic(\n 'warning',\n 1,\n [column.metric],\n `metric column '${column.metric}' rejected: 'index' align requires values.length === accepted node count (${column.values.length} !== ${opts.count})`,\n ),\n );\n continue;\n }\n const out = new Float64Array(opts.count);\n for (let i = 0; i < opts.count; i++) {\n const v = coerceNumeric(column.values[i]);\n out[i] = v === null ? NaN : v;\n }\n this.columns.set(column.metric, out);\n admitted.push(column.metric);\n continue;\n }\n\n // 'ids' align — join by the ids array.\n const ids = column.ids;\n if (ids === undefined) {\n diagnostics.push(\n columnDiagnostic(\n 'warning',\n 1,\n [column.metric],\n `metric column '${column.metric}' rejected: 'ids' align requires an ids array`,\n ),\n );\n continue;\n }\n if (ids.length !== column.values.length) {\n diagnostics.push(\n columnDiagnostic(\n 'warning',\n 1,\n [column.metric],\n `metric column '${column.metric}' rejected: ids length ${ids.length} !== values length ${column.values.length}`,\n ),\n );\n continue;\n }\n\n const out = new Float64Array(opts.count).fill(NaN);\n let unknown = 0;\n const unknownSamples: string[] = [];\n let duplicate = 0;\n const duplicateSamples: string[] = [];\n const seen = new Set<number>();\n\n for (let i = 0; i < ids.length; i++) {\n const id = ids[i]!;\n const index = opts.nodeIndex.get(id);\n if (index === undefined) {\n unknown++;\n if (unknownSamples.length < DIAGNOSTIC_SAMPLE_CAP) unknownSamples.push(id);\n continue;\n }\n if (seen.has(index)) {\n duplicate++;\n if (duplicateSamples.length < DIAGNOSTIC_SAMPLE_CAP) duplicateSamples.push(id);\n // Last occurrence wins — fall through and overwrite.\n } else {\n seen.add(index);\n }\n const v = coerceNumeric(column.values[i]);\n out[index] = v === null ? NaN : v;\n }\n\n if (unknown > 0) {\n diagnostics.push(\n columnDiagnostic(\n 'warning',\n unknown,\n unknownSamples,\n `metric column '${column.metric}': ${unknown} row(s) skipped — id not in the accepted model`,\n ),\n );\n }\n if (duplicate > 0) {\n diagnostics.push(\n columnDiagnostic(\n 'warning',\n duplicate,\n duplicateSamples,\n `metric column '${column.metric}': ${duplicate} duplicate id row(s) — last occurrence wins`,\n ),\n );\n }\n\n this.columns.set(column.metric, out);\n admitted.push(column.metric);\n }\n\n return { admitted, diagnostics };\n }\n\n /**\n * Allocation-free hot path: one map lookup + one typed-array read.\n * NaN-encoded nulls convert back to `null` at this boundary; unknown\n * metrics and out-of-range indices are `null`, never NaN.\n */\n getMetricValue(metric: MetricName, index: number): number | null {\n const values = this.resolve(metric);\n if (values === null) return null;\n const v = values[index];\n return v === undefined || Number.isNaN(v) ? null : v;\n }\n\n /**\n * Raw column in accepted-base order, or null when unavailable. NaN encodes\n * null (§12) — consumers exclude NaN slots from domains. Do NOT mutate:\n * this is the live cache, not a copy.\n */\n metricValues(metric: MetricName): Float64Array | null {\n return this.resolve(metric);\n }\n\n /** True when the metric would resolve; never triggers a compute pass. */\n hasMetric(name: MetricName): boolean {\n if (this.columns.has(name)) return true;\n return isDegreeFamily(name) && this.model !== null;\n }\n\n private resolve(metric: MetricName): Float64Array | null {\n const custom = this.columns.get(metric);\n if (custom !== undefined) return custom;\n if (!isDegreeFamily(metric)) return null;\n const cache = this.ensureDegrees();\n return cache === null ? null : cache[metric];\n }\n\n /** One combined O(n + L) pass computes all three family members. */\n private ensureDegrees(): DegreeCache | null {\n if (this.degreeCache !== null) return this.degreeCache;\n const model = this.model;\n if (model === null) return null;\n this.degreePasses++;\n\n const offsets = model.adjacency.offsets;\n const n = offsets.length - 1;\n const degree = new Float64Array(n);\n const inDegree = new Float64Array(n);\n const outDegree = new Float64Array(n);\n\n // degree = CSR row length…\n for (let i = 0; i < n; i++) {\n degree[i] = offsets[i + 1]! - offsets[i]!;\n }\n // …minus one per self-loop (CSR lists (a, a) twice; §12 counts it once).\n // The same directed pass yields in/out: self-loop → 1 to each.\n const links = model.links;\n for (let i = 0; i < links.length; i += 2) {\n const s = links[i]!;\n const t = links[i + 1]!;\n outDegree[s] = outDegree[s]! + 1;\n inDegree[t] = inDegree[t]! + 1;\n if (s === t) degree[s] = degree[s]! - 1;\n }\n\n this.degreeCache = { degree, inDegree, outDegree };\n return this.degreeCache;\n }\n}\n","/**\n * DEF2 capability-policy module (spec §13; plan S1-T08/S4-T05).\n *\n * §13 (normative): for capabilities where the core owns a fallback path, the\n * core selects native-vs-fallback ONCE at mount from the engine's declared\n * `capabilities` record — never by sniffing method presence — and unsupported\n * *requested* props degrade loudly (a §5.1 diagnostic), never as silent no-ops.\n *\n * This module is the single place those decisions are made:\n * - {@link resolveEnginePolicy} turns the capability record + the host's\n * requested features into one frozen {@link EnginePolicy} at mount.\n * - {@link assertCapabilityMethodParity} is the mount-time dev-mode record\n * vs. method-surface assertion, restricted to honestly checkable pairs.\n * - {@link normalizeCommitForCapabilities} strips commit payload an engine\n * declared it cannot honor, so incapable adapters never see it.\n */\n\nimport type {\n EngineBufferChannel,\n EngineCapabilities,\n EngineCommit,\n EngineConfigUpdate,\n GraphEngine,\n} from './engine/index';\n\n/** One loud degradation: a feature the host requested that the mounted engine\n * does not declare. Feeds the §5.1 dev diagnostic at mount. */\nexport interface EnginePolicyDegradation {\n readonly feature: string;\n readonly reason: string;\n}\n\n/** Host-requested capability-gated features, gathered from mount-time props\n * (`edgeArrows` prop → edgeArrows; image-bearing nodeStyle/atlas → images). */\nexport interface RequestedEngineFeatures {\n edgeArrows?: boolean;\n images?: boolean;\n /** §16.3 stage-4: a `clusters` spec is active this session. */\n clusters?: boolean;\n}\n\n/**\n * The §16.3 cluster-force degradation text. Exported so the mount-time policy\n * and a LATER cluster activation (a spec applied after ready, which the frozen\n * mount policy cannot see) emit the byte-identical message — the instance\n * emits it at most ONCE per session either way.\n */\nexport const CLUSTER_FORCE_DEGRADATION_REASON =\n 'clusters requested but the engine capability record does not declare clusterForce; the cluster force is inert while membership, cluster labels, and centroids still work (§16.3/R-13-39)';\n\n/**\n * The frozen mount-time native-vs-fallback record (§13). Evaluated exactly\n * once per mount from `EngineCapabilities` and never revisited — capability\n * records are static declarations fixed at engine construction, so the policy\n * must not drift even if a caller mutates the input record afterwards.\n */\nexport interface EnginePolicy {\n /** §16.12 arrowheads: engine-drawn, or the prop is inert (+ dev warning). */\n readonly edgeArrows: 'native' | 'inert';\n /** §8 image sprites: atlas-backed, or the placeholder glyph with refs\n * retained for a future compatible engine. */\n readonly images: 'native' | 'placeholder';\n /** §13 link hover/click: engine events, or the core's CPU grid fallback. */\n readonly linkPicking: 'native' | 'cpu-fallback';\n /** §16.3 stage-4 cluster force: engine-applied, or inert (membership,\n * labels, and centroids are core-owned and unaffected). */\n readonly clusterForce: 'native' | 'inert';\n /** Channels eligible for ranged (partial) uploads; empty = full replaces. */\n readonly rangedChannels: ReadonlySet<EngineBufferChannel>;\n /** Exactly one entry per REQUESTED-but-unsupported feature; requested and\n * supported — or simply never requested — contributes nothing. */\n readonly degradations: readonly EnginePolicyDegradation[];\n}\n\nfunction degradation(feature: string, reason: string): EnginePolicyDegradation {\n return Object.freeze({ feature, reason });\n}\n\n/**\n * Resolve the mount-time engine policy from the declared capability record.\n *\n * Decisions come from `capabilities` ONLY — method sniffing is forbidden by\n * §13. The result is deep-frozen and holds a defensive copy of\n * `rangeUpdates`, so mutating the input record afterwards changes nothing.\n * A degradation entry exists only for features the host actually requested\n * that the engine does not declare; unrequested gaps stay silent.\n */\nexport function resolveEnginePolicy(\n capabilities: EngineCapabilities,\n requested: RequestedEngineFeatures,\n): EnginePolicy {\n const edgeArrowsNative = capabilities.edgeArrows === true;\n const imagesNative = capabilities.pointImages === true;\n const clusterForceNative = capabilities.clusterForce === true;\n\n const degradations: EnginePolicyDegradation[] = [];\n if (requested.edgeArrows === true && !edgeArrowsNative) {\n degradations.push(\n degradation(\n 'edgeArrows',\n 'edgeArrows requested but the engine capability record does not declare edgeArrows; the prop is inert (§16.12)',\n ),\n );\n }\n if (requested.images === true && !imagesNative) {\n degradations.push(\n degradation(\n 'images',\n 'node images requested but the engine capability record does not declare pointImages; placeholder glyphs render and image refs are retained (§8/§13)',\n ),\n );\n }\n\n if (requested.clusters === true && !clusterForceNative) {\n degradations.push(degradation('clusters', CLUSTER_FORCE_DEGRADATION_REASON));\n }\n\n const policy: EnginePolicy = {\n edgeArrows: edgeArrowsNative ? 'native' : 'inert',\n images: imagesNative ? 'native' : 'placeholder',\n linkPicking: capabilities.linkPicking ? 'native' : 'cpu-fallback',\n clusterForce: clusterForceNative ? 'native' : 'inert',\n // Defensive snapshot: the policy must not alias the caller's array.\n rangedChannels: new Set(capabilities.rangeUpdates),\n degradations: Object.freeze(degradations),\n };\n return Object.freeze(policy);\n}\n\n/**\n * Mount-time dev-mode assertion: does the declared capability record agree\n * with the engine's method surface? Returns a list of human-readable\n * mismatches (empty = consistent).\n *\n * Why so few checks? §13's illustrative parity assertion\n * (`capabilities.linkPicking === (typeof engine.linkAt === 'function')`)\n * presumes the spec's full method surface; the v0.1 adapter contract\n * deliberately narrows it, leaving most capabilities with NO honestly\n * checkable method pair. Those defer to the §19 conformance suite, which\n * validates declared records against observed behavior:\n *\n * - `linkPicking`: native picking arrives through mount-time host events\n * (`onLinkClick`/`onLinkHover`), not a probeable `linkAt` method — there\n * is nothing on the engine object to compare the record against.\n * - `edgeArrows` / `pointImages` / `rangeUpdates`: honored inside\n * `commit()` payload handling (`config.linkArrows`, `resources`, ranged\n * uploads) with no distinguishing method; only behavior can validate them.\n * - `simulation`: `start()`/`pause()` are mandatory on every engine (static\n * engines no-op them), so method presence carries no signal either way.\n * - `pointsInPolygon`-family (`pointsInRect`, `captureScreenshot`,\n * `neighborIndices`, `screenToSpace`/`spaceToScreen`, `setPinnedIndices`,\n * `zoomToIndex`): optional-by-contract with no declaring capability bit —\n * absence is legitimate, so no check is fabricated for them.\n *\n * The one honest pair on this surface: `trackedPositions` declares position\n * readback works, so `getPositions` must actually be present.\n */\nexport function assertCapabilityMethodParity(engine: GraphEngine): string[] {\n const mismatches: string[] = [];\n // Runtime-defensive views: JS consumers can hand us structurally partial\n // adapters even though the TS type says these members exist.\n const capabilities = (engine as { capabilities?: unknown }).capabilities;\n if (capabilities === null || typeof capabilities !== 'object') {\n mismatches.push('engine.capabilities is missing or not an object (§13 static declaration)');\n return mismatches;\n }\n const caps = capabilities as Partial<EngineCapabilities>;\n const getPositions = (engine as { getPositions?: unknown }).getPositions;\n if (caps.trackedPositions === true && typeof getPositions !== 'function') {\n mismatches.push(\n 'capabilities.trackedPositions is declared but engine.getPositions is absent (§13 tracked readback)',\n );\n }\n return mismatches;\n}\n\n/**\n * Strip commit payload the engine's capability record says it cannot honor:\n * - `resources` (image atlas + per-point image index) unless `pointImages`;\n * - `config.linkArrows` unless `edgeArrows`;\n * - `config.cluster` unless `clusterForce` (§16.3 stage 4 — the core keeps\n * membership, labels, and centroids; only the FORCE is engine-side).\n * A `config` left empty by the strip is dropped entirely.\n *\n * IDENTITY-PRESERVING: when nothing needs stripping the SAME commit object\n * reference is returned, so downstream dirty/equality checks stay cheap. The\n * input commit is never mutated. `dropped` names each stripped payload path.\n */\nexport function normalizeCommitForCapabilities(\n commit: EngineCommit,\n capabilities: EngineCapabilities,\n): { commit: EngineCommit; dropped: readonly string[] } {\n const config = commit.config;\n const dropResources = capabilities.pointImages !== true && commit.resources !== undefined;\n const dropLinkArrows =\n capabilities.edgeArrows !== true && config !== undefined && config.linkArrows !== undefined;\n const dropCluster =\n capabilities.clusterForce !== true && config !== undefined && config.cluster !== undefined;\n\n if (!dropResources && !dropLinkArrows && !dropCluster) return { commit, dropped: [] };\n\n const dropped: string[] = [];\n const next: EngineCommit = { ...commit };\n if (dropResources) {\n delete next.resources;\n dropped.push('resources');\n }\n if ((dropLinkArrows || dropCluster) && config !== undefined) {\n const rest: EngineConfigUpdate = { ...config };\n if (dropLinkArrows) {\n delete rest.linkArrows;\n dropped.push('config.linkArrows');\n }\n if (dropCluster) {\n delete rest.cluster;\n dropped.push('config.cluster');\n }\n if (Object.keys(rest).length > 0) {\n next.config = rest;\n } else {\n delete next.config;\n }\n }\n return { commit: next, dropped };\n}\n","/**\n * §8 image-atlas pipeline (S10-T09) — pure core side.\n *\n * Turns per-point image refs (stable strings from the synchronous `nodeImage`\n * accessor) into engine-ready atlas resources: resolved ImageBitmaps with\n * slot assignments plus an index-aligned per-point slot buffer. The engine\n * only ever sees the output shape (`EngineCommit.resources`); everything\n * async — resolve, fetch, decode, retry, abort — stays here.\n *\n * Invariants (spec §8):\n * - Loads are deduplicated by ref: one in-flight resolve per unique ref.\n * - Slots are allocated per unique ref from a free-list capped at\n * `maxEntries`; over-cap refs stay placeholder and are diagnosed once per\n * generation.\n * - Results are admission-checked against the current request state before\n * atlas admission; the abort signal is an optimization, admission is the\n * gate (a resolver that ignores its signal cannot poison a newer\n * generation).\n * - Transient resolver/fetch failures retry up to `maxRetries`; decode\n * failures are final.\n * - Failures are cadence-batched: ONE `image-resolve-failed` diagnostic per\n * flush with a count and sampled refs, each ref counted once per\n * generation. Failures never poison the engine commit.\n * - A resolver-returned string is a final URL/data URI fetched + decoded\n * exactly once — never recursively passed back to the resolver.\n */\n\nimport { DIAGNOSTIC_SAMPLE_CAP } from './types';\nimport type { GraphDiagnostic } from './types';\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\n/**\n * Owns authenticated fetch / caching / redirect handling for one ref\n * (spec §8, Appendix B.6). Returning a Blob hands the bytes straight to\n * decode; returning a string names a FINAL URL or data URI that the pipeline\n * fetches + decodes once (it is never re-resolved).\n */\nexport type ImageResolver = (ref: string, signal: AbortSignal) => Promise<Blob | string>;\n\n/** Minimal structural slice of `fetch` the pipeline needs (Node-test injectable). */\nexport type FetchLike = (\n url: string,\n init: { signal: AbortSignal },\n) => Promise<{ ok: boolean; status: number; blob(): Promise<Blob> }>;\n\n/** Blob → ImageBitmap. Injectable so Node tests never touch createImageBitmap. */\nexport type ImageDecode = (blob: Blob) => Promise<ImageBitmap>;\n\n/** D5: `close()` may throw on already-detached bitmaps in exotic runtimes —\n * ownership hygiene must never take down the pipeline. */\nfunction closeBitmapQuietly(bitmap: ImageBitmap): void {\n try {\n bitmap.close();\n } catch {\n // Already closed/detached — the goal (released native memory) is met.\n }\n}\n\n/** One coalesced flush of atlas work — mirrors `EngineCommit.resources` (§13). */\nexport interface ImageAtlasBatch {\n /** Newly resolved bitmaps with their slot assignments. */\n upserts: readonly { slot: number; bitmap: ImageBitmap }[];\n /** Slots freed by eviction that the engine previously received. */\n removeSlots: readonly number[];\n /** Per-point atlas slot indices, aligned to the last requestRefs call\n * (-1 = placeholder shape). */\n pointImageIndex: Float32Array;\n /** At most one batched `image-resolve-failed` diagnostic per flush. */\n diagnostics: readonly GraphDiagnostic[];\n}\n\nexport interface ImageAtlasPipelineOptions {\n /** Ref → bytes. Default: plain `fetch(ref)` → blob for public URLs. */\n resolver?: ImageResolver;\n /** Concurrent resolve bound. Default 4. */\n maxConcurrent?: number;\n /** Transient-failure retries per ref lifecycle (decode failures are final).\n * Default 2 (three attempts total). */\n maxRetries?: number;\n /** Atlas slot capacity; refs beyond it stay placeholder. Default 512. */\n maxEntries?: number;\n /** Blob → ImageBitmap. Default `createImageBitmap`. */\n decode?: ImageDecode;\n /** Fetch used by the default resolver AND for resolver-returned strings. */\n fetchImpl?: FetchLike;\n /** Batch scheduler: called with a flush thunk when work is pending; each\n * scheduled thunk must run at most once. Default: queueMicrotask. */\n schedule?: (flush: () => void) => void;\n}\n\nexport const ATLAS_MAX_CONCURRENT_DEFAULT = 4;\nexport const ATLAS_MAX_RETRIES_DEFAULT = 2;\nexport const ATLAS_MAX_ENTRIES_DEFAULT = 512;\n\n// ---------------------------------------------------------------------------\n// Internal entry state\n// ---------------------------------------------------------------------------\n\ntype EntryStatus = 'pending' | 'resolving' | 'resolved' | 'failed';\n\ninterface AtlasEntry {\n readonly ref: string;\n readonly slot: number;\n status: EntryStatus;\n bitmap: ImageBitmap | null;\n /** Attempts started (1 = initial attempt). */\n attempts: number;\n controller: AbortController | null;\n}\n\n// ---------------------------------------------------------------------------\n// Pipeline\n// ---------------------------------------------------------------------------\n\nexport class ImageAtlasPipeline {\n private readonly resolver: ImageResolver;\n private readonly maxConcurrent: number;\n private readonly maxRetries: number;\n private readonly maxEntries: number;\n private readonly decode: ImageDecode;\n private readonly fetchImpl: FetchLike;\n private readonly schedule: (flush: () => void) => void;\n\n /** ref → live entry. Identity of the mapped entry is the admission gate. */\n private readonly entries = new Map<string, AtlasEntry>();\n private readonly freeSlots: number[] = [];\n private nextSlot = 0;\n\n private readonly queue: AtlasEntry[] = [];\n private active = 0;\n\n /** Slots the engine has received via a flushed upsert. */\n private readonly deliveredSlots = new Set<number>();\n private readonly pendingUpserts = new Map<number, ImageBitmap>();\n private readonly pendingRemoveSlots = new Set<number>();\n /** Failed refs awaiting the next flush's single batched diagnostic. */\n private pendingFailureRefs: string[] = [];\n /** ref → generation it was last counted in (once-per-generation gate). */\n private readonly countedFailures = new Map<string, number>();\n\n private lastRefs: readonly (string | null)[] = [];\n private generation: number | null = null;\n private flushScheduled = false;\n private disposed = false;\n /** D5/F11-06: evicted-entry bitmaps awaiting close — closed AFTER the\n * flush that carries their removeSlots, so the instance's recovery-replay\n * map (pruned synchronously in the batch callback) can never re-send a\n * closed bitmap. */\n private pendingCloseBitmaps: ImageBitmap[] = [];\n\n private readonly batchCallbacks = new Set<(batch: ImageAtlasBatch) => void>();\n\n constructor(options: ImageAtlasPipelineOptions = {}) {\n this.maxConcurrent = options.maxConcurrent ?? ATLAS_MAX_CONCURRENT_DEFAULT;\n this.maxRetries = options.maxRetries ?? ATLAS_MAX_RETRIES_DEFAULT;\n this.maxEntries = options.maxEntries ?? ATLAS_MAX_ENTRIES_DEFAULT;\n // globalThis lookup, not the bare global: core stays module-scope\n // network-free (§18 purity lint); browser hosts get fetch at call time\n // and non-browser hosts inject fetchImpl/resolver (§8).\n this.fetchImpl =\n options.fetchImpl ?? ((url, init) => (globalThis as { fetch: typeof fetch }).fetch(url, init));\n this.resolver = options.resolver ?? (async (ref, signal) => this.fetchBlob(ref, signal));\n this.decode = options.decode ?? ((blob) => createImageBitmap(blob));\n this.schedule = options.schedule ?? ((flush) => queueMicrotask(flush));\n }\n\n /** Subscribe to coalesced flushes. Returns an unsubscribe thunk. */\n onBatch(cb: (batch: ImageAtlasBatch) => void): () => void {\n this.batchCallbacks.add(cb);\n return () => {\n this.batchCallbacks.delete(cb);\n };\n }\n\n /**\n * Declare the full index-aligned per-point ref list for `generation`.\n * Refs that drop out are evicted (slot freed → removeSlots); new unique\n * refs are resolved once each; calls with a stale (lower) generation are\n * discarded.\n */\n requestRefs(refs: readonly (string | null)[], generation: number): void {\n if (this.disposed) return;\n if (this.generation !== null && generation < this.generation) return;\n this.generation = generation;\n this.lastRefs = refs;\n\n const wanted = new Set<string>();\n for (const ref of refs) if (ref !== null) wanted.add(ref);\n\n // Evict entries whose refs dropped out of this request.\n for (const [ref, entry] of this.entries) {\n if (!wanted.has(ref)) this.evict(ref, entry);\n }\n\n // Admit new unique refs (first-appearance order) while capacity remains.\n for (const ref of wanted) {\n if (this.entries.has(ref)) continue;\n const slot = this.allocSlot();\n if (slot === -1) {\n // Over cap: stays placeholder; diagnosed once per generation.\n this.recordFailure(ref);\n continue;\n }\n const entry: AtlasEntry = {\n ref,\n slot,\n status: 'pending',\n bitmap: null,\n attempts: 0,\n controller: null,\n };\n this.entries.set(ref, entry);\n this.queue.push(entry);\n }\n\n this.pump();\n // Always flush: the point→slot mapping may have changed even with zero\n // resolve traffic (e.g. reordered points over already-resolved refs).\n this.scheduleFlush();\n }\n\n /** Abort all in-flight work and drop all state. Terminal. */\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n for (const entry of this.entries.values()) {\n entry.controller?.abort();\n // D5: dataset reset / destroy closes every owned bitmap (the instance\n // clears its replay map in the same synchronous teardown).\n if (entry.bitmap !== null) {\n closeBitmapQuietly(entry.bitmap);\n entry.bitmap = null;\n }\n }\n for (const bmp of this.pendingCloseBitmaps) closeBitmapQuietly(bmp);\n this.pendingCloseBitmaps = [];\n this.entries.clear();\n this.queue.length = 0;\n this.pendingUpserts.clear();\n this.pendingRemoveSlots.clear();\n this.pendingFailureRefs = [];\n this.countedFailures.clear();\n this.deliveredSlots.clear();\n this.batchCallbacks.clear();\n }\n\n // -------------------------------------------------------------------------\n // Slots\n // -------------------------------------------------------------------------\n\n private allocSlot(): number {\n const reused = this.freeSlots.pop();\n if (reused !== undefined) return reused;\n if (this.nextSlot < this.maxEntries) return this.nextSlot++;\n return -1;\n }\n\n private evict(ref: string, entry: AtlasEntry): void {\n entry.controller?.abort();\n this.entries.delete(ref);\n this.freeSlots.push(entry.slot);\n // An undelivered pending upsert is simply cancelled; a delivered slot\n // must be removed engine-side.\n this.pendingUpserts.delete(entry.slot);\n if (this.deliveredSlots.has(entry.slot)) {\n this.deliveredSlots.delete(entry.slot);\n this.pendingRemoveSlots.add(entry.slot);\n }\n // D5: core owns decoded bitmaps — an evicted entry's bitmap closes at\n // the next flush (exactly once; the null-out is the double-close guard).\n if (entry.bitmap !== null) {\n this.pendingCloseBitmaps.push(entry.bitmap);\n entry.bitmap = null;\n this.scheduleFlush();\n }\n }\n\n // -------------------------------------------------------------------------\n // Resolve machinery\n // -------------------------------------------------------------------------\n\n /** Admission gate: entry must still be the live entry for its ref. */\n private isCurrent(entry: AtlasEntry): boolean {\n return !this.disposed && this.entries.get(entry.ref) === entry;\n }\n\n private pump(): void {\n while (this.active < this.maxConcurrent) {\n const entry = this.queue.shift();\n if (entry === undefined) return;\n // Evicted (or superseded) while queued.\n if (!this.isCurrent(entry) || entry.status !== 'pending') continue;\n this.active++;\n entry.status = 'resolving';\n void this.runAttempt(entry).then(() => {\n this.active--;\n this.pump();\n });\n }\n }\n\n /** One attempt: resolve → (fetch if string) → decode. Never throws. */\n private async runAttempt(entry: AtlasEntry): Promise<void> {\n const controller = new AbortController();\n entry.controller = controller;\n entry.attempts++;\n\n let blob: Blob;\n try {\n const result = await this.resolver(entry.ref, controller.signal);\n // A string result is a FINAL URL/data URI: fetched + decoded once,\n // never recursively resolved.\n blob = typeof result === 'string' ? await this.fetchBlob(result, controller.signal) : result;\n } catch {\n if (!this.isCurrent(entry)) return; // evicted/disposed — silent discard\n entry.controller = null;\n if (entry.attempts <= this.maxRetries) {\n // Transient: retry through the same queue; dedupe holds because the\n // entry identity is unchanged.\n entry.status = 'pending';\n this.queue.push(entry);\n // pump() runs from the settle continuation.\n } else {\n this.finalFailure(entry);\n }\n return;\n }\n\n if (!this.isCurrent(entry)) return; // admission gate before decode\n\n let bitmap: ImageBitmap;\n try {\n bitmap = await this.decode(blob);\n } catch {\n if (!this.isCurrent(entry)) return;\n entry.controller = null;\n // Decode/MIME/size failures are final — the bytes will not improve.\n this.finalFailure(entry);\n return;\n }\n\n if (!this.isCurrent(entry)) {\n // D5: the entry was evicted while decoding — nobody will ever see\n // this bitmap; close it immediately (it was never delivered).\n closeBitmapQuietly(bitmap);\n return;\n }\n entry.status = 'resolved';\n entry.bitmap = bitmap;\n entry.controller = null;\n this.pendingUpserts.set(entry.slot, bitmap);\n // An upsert overwrites the slot content; never emit the same slot in\n // both lists of one batch.\n this.pendingRemoveSlots.delete(entry.slot);\n this.scheduleFlush();\n }\n\n private async fetchBlob(url: string, signal: AbortSignal): Promise<Blob> {\n const res = await this.fetchImpl(url, { signal });\n if (!res.ok) throw new Error(`image fetch failed (HTTP ${res.status}) for ${url}`);\n return res.blob();\n }\n\n private finalFailure(entry: AtlasEntry): void {\n entry.status = 'failed';\n this.recordFailure(entry.ref);\n }\n\n /** Queue a ref for the next flush's single diagnostic, once per generation. */\n private recordFailure(ref: string): void {\n const gen = this.generation ?? 0;\n if (this.countedFailures.get(ref) === gen) return;\n this.countedFailures.set(ref, gen);\n this.pendingFailureRefs.push(ref);\n this.scheduleFlush();\n }\n\n // -------------------------------------------------------------------------\n // Flush\n // -------------------------------------------------------------------------\n\n private scheduleFlush(): void {\n if (this.flushScheduled || this.disposed) return;\n this.flushScheduled = true;\n this.schedule(() => this.flush());\n }\n\n private flush(): void {\n this.flushScheduled = false;\n if (this.disposed) return;\n\n const upserts: { slot: number; bitmap: ImageBitmap }[] = [];\n for (const [slot, bitmap] of this.pendingUpserts) {\n upserts.push({ slot, bitmap });\n this.deliveredSlots.add(slot);\n }\n this.pendingUpserts.clear();\n\n const removeSlots = [...this.pendingRemoveSlots];\n this.pendingRemoveSlots.clear();\n\n const failures = this.pendingFailureRefs;\n this.pendingFailureRefs = [];\n const diagnostics: GraphDiagnostic[] =\n failures.length > 0\n ? [\n {\n code: 'image-resolve-failed',\n severity: 'warning',\n count: failures.length,\n sampleIds: failures.slice(0, DIAGNOSTIC_SAMPLE_CAP),\n message:\n `${failures.length} image ref(s) failed to resolve/decode or exceeded ` +\n `atlas capacity (${this.maxEntries}); placeholder retained.`,\n },\n ]\n : [];\n\n const pointImageIndex = this.buildPointIndex();\n const batch: ImageAtlasBatch = { upserts, removeSlots, pointImageIndex, diagnostics };\n for (const cb of this.batchCallbacks) cb(batch);\n // D5: the batch above delivered the removeSlots; the instance pruned its\n // replay references synchronously in the callback — the evicted bitmaps\n // are now unreachable and close exactly once.\n if (this.pendingCloseBitmaps.length > 0) {\n for (const bmp of this.pendingCloseBitmaps) closeBitmapQuietly(bmp);\n this.pendingCloseBitmaps = [];\n }\n }\n\n /** -1 (placeholder) until the ref's bitmap is delivered or in this batch. */\n private buildPointIndex(): Float32Array {\n const refs = this.lastRefs;\n const index = new Float32Array(refs.length).fill(-1);\n for (let i = 0; i < refs.length; i++) {\n const ref = refs[i];\n if (ref === null || ref === undefined) continue;\n const entry = this.entries.get(ref);\n if (entry !== undefined && entry.bitmap !== null) index[i] = entry.slot;\n }\n return index;\n }\n\n /**\n * I2 (roster-atomic resource mappings, F11-03): the SYNCHRONOUS point→slot\n * mapping for the last requested roster — a slot appears only when its ref\n * is resolved AND the engine has already received the bitmap (delivered);\n * pending, failed, evicted, and reused-but-undelivered refs are the −1\n * placeholder. The instance pairs every STRUCTURAL commit with this index\n * in the same commit, so the engine never renders a new roster against the\n * previous roster's (wrong-length, stale-slot) mapping; the scheduled\n * async flush then only ever PROMOTES placeholders to resolved slots.\n */\n currentPointIndex(): Float32Array | null {\n if (this.disposed || this.lastRefs.length === 0) return null;\n const refs = this.lastRefs;\n const index = new Float32Array(refs.length).fill(-1);\n for (let i = 0; i < refs.length; i++) {\n const ref = refs[i];\n if (ref === null || ref === undefined) continue;\n const entry = this.entries.get(ref);\n if (\n entry !== undefined &&\n entry.bitmap !== null &&\n this.deliveredSlots.has(entry.slot)\n ) {\n index[i] = entry.slot;\n }\n }\n return index;\n }\n}\n","/**\n * §9.1 soft-mask kernel (S9-T02/T03) — failure COUNTERS, never Sets and\n * never per-source bit positions (so there is no 32-dimension cap).\n *\n * The mask owns four Uint16 counter lanes: hideFailures and dimFailures for\n * nodes AND edges. Every acquired {@link MaskSource} contributes +1 to a\n * lane counter for each slot it currently fails and -1 when that slot\n * re-enters. A slot is visible iff hideFailures === 0 and dimmed iff visible\n * AND dimFailures > 0 (spec §9.1 mask mechanics).\n *\n * Delta discipline: each source keeps its previous failing membership as\n * per-source Uint8 flag columns plus a dense slot list, so replacing a\n * membership touches counters ONLY for slots whose membership actually\n * changed (O(1) detection per presented slot). Counter transitions across\n * zero append the slot to reusable dirty lists; {@link SoftMask.drainDirty}\n * compares against the state at the previous drain, so a fail-then-restore\n * inside one drain period nets to no emission.\n *\n * {@link SoftMask.applyNodeCascadeToEdges} implements §9's SINGLE edge-\n * survival rule over the mask lane: an edge hide-fails iff EITHER endpoint\n * hide-fails (equivalently: survives iff BOTH endpoints survive —\n * scope.ts `cascadeEdges` is the hard-scope variant of the same rule). It is\n * fed through one dedicated internal cascade source from the node hide lane:\n * O(E) recompute per call, but only edges whose state changed produce\n * counter deltas.\n *\n * Overflow guard: increments clamp at 0xFFFF and latch a one-time\n * {@link SoftMask.overflowed} flag the caller reports (an implementation may\n * widen to Uint32 without changing semantics, §9.1). Debug builds assert\n * balanced increments/decrements whenever a clear()/release() leaves zero\n * held memberships.\n */\n\n/** Debug builds (vitest/vite dev) assert counter balance on clear/release. */\nconst DEBUG: boolean = Boolean((import.meta as { env?: { DEV?: unknown } }).env?.DEV);\n\n/** Default muted alpha for dimmed entities (§9.1 'dim' mode). */\nexport const DIM_ALPHA_DEFAULT = 0.15;\n\nconst COUNTER_MAX = 0xffff;\n\n/**\n * A handle contributing failure memberships to the mask. Setting a lane\n * REPLACES that lane's previous membership for this source (the kernel\n * applies only the delta). `null` = empty membership for that lane; an\n * omitted `dimIdx` leaves the dim lane untouched.\n */\nexport interface MaskSource {\n readonly name: string;\n setNodeFailures(hideIdx: Iterable<number> | null, dimIdx?: Iterable<number> | null): void;\n setEdgeFailures(hideIdx: Iterable<number> | null, dimIdx?: Iterable<number> | null): void;\n /** Empties all four lane memberships (the source stays usable). */\n clear(): void;\n /** clear() + permanently retires the handle (further set/clear throws;\n * release() itself is idempotent). */\n release(): void;\n}\n\n/**\n * One drain payload. The four index arrays are REUSED across drains — copy\n * before the next drainDirty() call if you need to keep them.\n */\nexport interface MaskDrain {\n /** Node slots whose hide-visibility (hideFailures 0 ↔ nonzero) flipped\n * since the previous drain. */\n nodes: readonly number[];\n /** Edge slots whose hide-visibility flipped since the previous drain. */\n edges: readonly number[];\n /** Node slots whose dim state (dimFailures 0 ↔ nonzero) flipped — the\n * alpha lane. Consumers recompute alpha over `nodes ∪ nodesAlpha` (a hide\n * flip also changes the effective alpha; a slot may appear in both). */\n nodesAlpha: readonly number[];\n /** Edge slots whose dim state flipped. */\n edgesAlpha: readonly number[];\n nodeVisibleCount: number;\n edgeVisibleCount: number;\n}\n\n/** One counter lane: counters + zero-crossing dirty tracking. */\nclass Lane {\n counters: Uint16Array;\n /** 0 = not dirty; 1 = dirty & counter was ZERO at the previous drain;\n * 2 = dirty & counter was NONZERO at the previous drain. */\n pending: Uint8Array;\n readonly candidates: number[] = [];\n /** Reused output buffer returned by drain. */\n readonly out: number[] = [];\n /** Slots with counter === 0 (visible count for hide lanes). */\n zeroCount: number;\n\n constructor(\n readonly label: string,\n capacity: number,\n ) {\n this.counters = new Uint16Array(capacity);\n this.pending = new Uint8Array(capacity);\n this.zeroCount = capacity;\n }\n\n grow(capacity: number): void {\n const old = this.counters.length;\n if (capacity <= old) return;\n const counters = new Uint16Array(capacity);\n counters.set(this.counters);\n this.counters = counters;\n const pending = new Uint8Array(capacity);\n pending.set(this.pending);\n this.pending = pending;\n this.zeroCount += capacity - old; // new slots start at zero failures\n }\n}\n\n/** Per-source, per-lane membership: bit0 = current member; bit1 = transient\n * incoming mark during a replace pass. */\ninterface LaneMembership {\n flags: Uint8Array;\n list: number[];\n}\n\nfunction newMembership(capacity: number): LaneMembership {\n return { flags: new Uint8Array(capacity), list: [] };\n}\n\nfunction growMembership(mem: LaneMembership, capacity: number): void {\n if (capacity <= mem.flags.length) return;\n const flags = new Uint8Array(capacity);\n flags.set(mem.flags);\n mem.flags = flags;\n}\n\ninterface SourceState {\n readonly name: string;\n alive: boolean;\n nodeHide: LaneMembership;\n nodeDim: LaneMembership;\n edgeHide: LaneMembership;\n edgeDim: LaneMembership;\n}\n\nfunction checkCapacity(value: number, label: string): void {\n if (!Number.isInteger(value) || value < 0) {\n throw new RangeError(`SoftMask: ${label} must be a non-negative integer, got ${value}`);\n }\n}\n\nexport class SoftMask {\n private nodeCap: number;\n private edgeCap: number;\n private readonly nodeHideLane: Lane;\n private readonly nodeDimLane: Lane;\n private readonly edgeHideLane: Lane;\n private readonly edgeDimLane: Lane;\n private readonly sources = new Set<SourceState>();\n /** Dedicated internal source implementing the §9 node→edge cascade. */\n private cascadeSource: MaskSource | null = null;\n private overflowedFlag = false;\n /** Total memberships currently held across all sources and lanes. */\n private totalHeld = 0;\n\n constructor(nodeCapacity: number, edgeCapacity: number) {\n checkCapacity(nodeCapacity, 'nodeCapacity');\n checkCapacity(edgeCapacity, 'edgeCapacity');\n this.nodeCap = nodeCapacity;\n this.edgeCap = edgeCapacity;\n this.nodeHideLane = new Lane('node hideFailures', nodeCapacity);\n this.nodeDimLane = new Lane('node dimFailures', nodeCapacity);\n this.edgeHideLane = new Lane('edge hideFailures', edgeCapacity);\n this.edgeDimLane = new Lane('edge dimFailures', edgeCapacity);\n }\n\n get nodeCapacity(): number {\n return this.nodeCap;\n }\n\n get edgeCapacity(): number {\n return this.edgeCap;\n }\n\n /** One-time latch: some counter hit 0xFFFF and an increment was dropped.\n * Counts may drift afterwards; the caller reports it (§9.1 overflow guard). */\n get overflowed(): boolean {\n return this.overflowedFlag;\n }\n\n // Live counter columns (read-only views by convention — do not mutate;\n // references are replaced on grow()).\n get nodeHideFailures(): Uint16Array {\n return this.nodeHideLane.counters;\n }\n\n get nodeDimFailures(): Uint16Array {\n return this.nodeDimLane.counters;\n }\n\n get edgeHideFailures(): Uint16Array {\n return this.edgeHideLane.counters;\n }\n\n get edgeDimFailures(): Uint16Array {\n return this.edgeDimLane.counters;\n }\n\n /**\n * Grows capacities for structure changes (existing slot state is\n * preserved; new slots start fully visible). Capacities never shrink —\n * a smaller value is a no-op for that dimension.\n */\n grow(nodeCapacity: number, edgeCapacity: number): void {\n checkCapacity(nodeCapacity, 'nodeCapacity');\n checkCapacity(edgeCapacity, 'edgeCapacity');\n if (nodeCapacity > this.nodeCap) {\n this.nodeHideLane.grow(nodeCapacity);\n this.nodeDimLane.grow(nodeCapacity);\n for (const source of this.sources) {\n growMembership(source.nodeHide, nodeCapacity);\n growMembership(source.nodeDim, nodeCapacity);\n }\n this.nodeCap = nodeCapacity;\n }\n if (edgeCapacity > this.edgeCap) {\n this.edgeHideLane.grow(edgeCapacity);\n this.edgeDimLane.grow(edgeCapacity);\n for (const source of this.sources) {\n growMembership(source.edgeHide, edgeCapacity);\n growMembership(source.edgeDim, edgeCapacity);\n }\n this.edgeCap = edgeCapacity;\n }\n }\n\n /** Registers a new failure source. No cap on source count (§9.1). */\n acquire(name: string): MaskSource {\n const state: SourceState = {\n name,\n alive: true,\n nodeHide: newMembership(this.nodeCap),\n nodeDim: newMembership(this.nodeCap),\n edgeHide: newMembership(this.edgeCap),\n edgeDim: newMembership(this.edgeCap),\n };\n this.sources.add(state);\n const ensureAlive = (): void => {\n if (!state.alive) {\n throw new Error(`SoftMask: source '${name}' used after release()`);\n }\n };\n return {\n name,\n setNodeFailures: (hideIdx, dimIdx) => {\n ensureAlive();\n this.applyMembership(this.nodeHideLane, state.nodeHide, hideIdx);\n if (dimIdx !== undefined) {\n this.applyMembership(this.nodeDimLane, state.nodeDim, dimIdx);\n }\n },\n setEdgeFailures: (hideIdx, dimIdx) => {\n ensureAlive();\n this.applyMembership(this.edgeHideLane, state.edgeHide, hideIdx);\n if (dimIdx !== undefined) {\n this.applyMembership(this.edgeDimLane, state.edgeDim, dimIdx);\n }\n },\n clear: () => {\n ensureAlive();\n this.clearSource(state);\n this.assertBalancedIfIdle();\n },\n release: () => {\n if (!state.alive) return;\n this.clearSource(state);\n state.alive = false;\n this.sources.delete(state);\n this.assertBalancedIfIdle();\n },\n };\n }\n\n /**\n * §9 edge cascade over the mask lane: recomputes, from the CURRENT node\n * hide lane, the set of edges with at least one hidden endpoint, and feeds\n * it to the dedicated internal cascade source (edge hide lane only).\n * `links` is the flat `[src0, tgt0, src1, tgt1, …]` node-slot pair buffer\n * (§7.1 CSR input shape); edge slot i has endpoints at links[2i]/[2i+1].\n * O(E) scan per call — typically once per drain — but only edges whose\n * cascade state changed produce counter deltas (and thus dirty entries).\n * Edges beyond `links.length / 2` are treated as having no hidden\n * endpoint (their previous cascade contribution, if any, is removed).\n */\n applyNodeCascadeToEdges(links: Uint32Array): void {\n if ((links.length & 1) !== 0) {\n throw new RangeError(\n `SoftMask: links length must be even ([src, tgt] pairs), got ${links.length}`,\n );\n }\n const edgeCount = links.length >>> 1;\n if (edgeCount > this.edgeCap) {\n throw new RangeError(\n `SoftMask: links describe ${edgeCount} edges but edgeCapacity is ${this.edgeCap}`,\n );\n }\n const hide = this.nodeHideLane.counters;\n const nodeCap = this.nodeCap;\n const failing: number[] = [];\n for (let i = 0; i < edgeCount; i++) {\n const source = links[i * 2]!;\n const target = links[i * 2 + 1]!;\n if (source >= nodeCap || target >= nodeCap) {\n throw new RangeError(\n `SoftMask: link endpoint out of range at edge ${i} (nodeCapacity ${nodeCap})`,\n );\n }\n if (hide[source]! !== 0 || hide[target]! !== 0) failing.push(i);\n }\n this.cascadeSource ??= this.acquire('§9.1 node→edge cascade');\n this.cascadeSource.setEdgeFailures(failing);\n }\n\n /**\n * Drains the zero-crossing dirty lists accumulated since the previous\n * drain. Only NET flips are emitted (state compared against the previous\n * drain). The returned index arrays are reused by the next drain.\n */\n drainDirty(): MaskDrain {\n return {\n nodes: this.drainLane(this.nodeHideLane),\n edges: this.drainLane(this.edgeHideLane),\n nodesAlpha: this.drainLane(this.nodeDimLane),\n edgesAlpha: this.drainLane(this.edgeDimLane),\n nodeVisibleCount: this.nodeHideLane.zeroCount,\n edgeVisibleCount: this.edgeHideLane.zeroCount,\n };\n }\n\n visibleNodeCount(): number {\n return this.nodeHideLane.zeroCount;\n }\n\n visibleEdgeCount(): number {\n return this.edgeHideLane.zeroCount;\n }\n\n /** Visible iff hideFailures === 0 (out-of-range slots read not-visible). */\n isNodeVisible(index: number): boolean {\n return this.nodeHideLane.counters[index] === 0;\n }\n\n isEdgeVisible(index: number): boolean {\n return this.edgeHideLane.counters[index] === 0;\n }\n\n /** Dimmed iff visible AND dimFailures > 0 (§9.1). */\n isNodeDimmed(index: number): boolean {\n return this.isNodeVisible(index) && (this.nodeDimLane.counters[index] ?? 0) > 0;\n }\n\n isEdgeDimmed(index: number): boolean {\n return this.isEdgeVisible(index) && (this.edgeDimLane.counters[index] ?? 0) > 0;\n }\n\n /** 1 (fully visible) | dimAlpha (dimmed) | 0 (hidden). */\n nodeAlpha(index: number, dimAlpha: number = DIM_ALPHA_DEFAULT): number {\n if (!this.isNodeVisible(index)) return 0;\n return (this.nodeDimLane.counters[index] ?? 0) > 0 ? dimAlpha : 1;\n }\n\n edgeAlpha(index: number, dimAlpha: number = DIM_ALPHA_DEFAULT): number {\n if (!this.isEdgeVisible(index)) return 0;\n return (this.edgeDimLane.counters[index] ?? 0) > 0 ? dimAlpha : 1;\n }\n\n // -------------------------------------------------------------------------\n // Internals\n // -------------------------------------------------------------------------\n\n /**\n * Replaces one source-lane membership with `incoming` (null = empty),\n * applying counter deltas ONLY for slots whose membership changed.\n * Incoming slots are validated up front so a RangeError never leaves the\n * membership partially applied; duplicates within `incoming` count once.\n */\n private applyMembership(\n lane: Lane,\n mem: LaneMembership,\n incoming: Iterable<number> | null,\n ): void {\n const capacity = lane.counters.length;\n const buffered: number[] = [];\n if (incoming !== null) {\n for (const slot of incoming) {\n if (!Number.isInteger(slot) || slot < 0 || slot >= capacity) {\n throw new RangeError(\n `SoftMask: ${lane.label} slot ${slot} out of range [0, ${capacity})`,\n );\n }\n buffered.push(slot);\n }\n }\n const flags = mem.flags;\n const next: number[] = [];\n for (let i = 0; i < buffered.length; i++) {\n const slot = buffered[i]!;\n const f = flags[slot]!;\n if ((f & 2) !== 0) continue; // duplicate within incoming\n flags[slot] = f | 2;\n next.push(slot);\n if ((f & 1) === 0) this.increment(lane, slot); // newly failing\n }\n const prev = mem.list;\n for (let i = 0; i < prev.length; i++) {\n const slot = prev[i]!;\n if ((flags[slot]! & 2) === 0) {\n flags[slot] = 0; // left the membership\n this.decrement(lane, slot);\n }\n }\n for (let i = 0; i < next.length; i++) flags[next[i]!] = 1;\n mem.list = next;\n }\n\n private increment(lane: Lane, slot: number): void {\n this.totalHeld += 1;\n const before = lane.counters[slot]!;\n if (before === COUNTER_MAX) {\n this.overflowedFlag = true; // clamp: drop the increment, latch the flag\n return;\n }\n lane.counters[slot] = before + 1;\n if (before === 0) {\n lane.zeroCount -= 1;\n this.markDirty(lane, slot, true);\n }\n }\n\n private decrement(lane: Lane, slot: number): void {\n this.totalHeld -= 1;\n const before = lane.counters[slot]!;\n if (before === 0) return; // post-overflow drift; clamp at zero\n lane.counters[slot] = before - 1;\n if (before === 1) {\n lane.zeroCount += 1;\n this.markDirty(lane, slot, false);\n }\n }\n\n /** Records the first zero-crossing of a slot per drain period, remembering\n * whether the counter was zero at the previous drain. */\n private markDirty(lane: Lane, slot: number, wasZero: boolean): void {\n if (lane.pending[slot] === 0) {\n lane.pending[slot] = wasZero ? 1 : 2;\n lane.candidates.push(slot);\n }\n }\n\n private drainLane(lane: Lane): number[] {\n const out = lane.out;\n out.length = 0;\n const { candidates, pending, counters } = lane;\n for (let i = 0; i < candidates.length; i++) {\n const slot = candidates[i]!;\n const zeroAtLastDrain = pending[slot] === 1;\n const zeroNow = counters[slot] === 0;\n if (zeroAtLastDrain !== zeroNow) out.push(slot); // net flip only\n pending[slot] = 0;\n }\n candidates.length = 0;\n return out;\n }\n\n private clearSource(state: SourceState): void {\n this.applyMembership(this.nodeHideLane, state.nodeHide, null);\n this.applyMembership(this.nodeDimLane, state.nodeDim, null);\n this.applyMembership(this.edgeHideLane, state.edgeHide, null);\n this.applyMembership(this.edgeDimLane, state.edgeDim, null);\n }\n\n /** Debug balanced-increment assert: whenever no source holds any\n * membership, every counter must read zero (skipped once overflowed —\n * clamped increments legitimately drift the books). */\n private assertBalancedIfIdle(): void {\n if (!DEBUG || this.overflowedFlag || this.totalHeld !== 0) return;\n for (const lane of [this.nodeHideLane, this.nodeDimLane, this.edgeHideLane, this.edgeDimLane]) {\n const counters = lane.counters;\n for (let i = 0; i < counters.length; i++) {\n if (counters[i] !== 0) {\n throw new Error(\n `SoftMask: unbalanced ${lane.label} counter ${counters[i]} at slot ${i} with zero held memberships`,\n );\n }\n }\n }\n }\n}\n","/**\n * §16.14 SVG export (S15 export lane) — the M7 pure module.\n *\n * ENGINE-INDEPENDENT BY CONSTRUCTION, not by discipline: positions and\n * projected styles come IN as a plain descriptor, vector markup goes OUT as a\n * string. No engine, no instance, no DOM — the post-v1 server snapshot path\n * (spec §13, R-13-53) reuses this verbatim under plain Node, and the test\n * suite runs it exactly that way. Keeping it engine-free is an M7\n * requirement, which is why it is a standalone module rather than instance\n * code that might one day be extracted.\n *\n * Output discipline (§16.14):\n * - One element per node/edge/label, assembled OFF-DOM by chunked\n * array-join — O(elements), never a live DOM node per element.\n * - Every label and attribute string is XML-escaped (§14's untrusted-content\n * rule in its XML form): a hostile label renders as literal text in every\n * downstream vector tool, never as markup.\n * - Bounded: above `maxElements` (default 50 000 — the practical ceiling for\n * downstream vector editors) rendering THROWS before assembling anything;\n * the instance wraps that into the typed `export-too-large` rejection, and\n * the raster-hybrid form (a PNG base layer plus a small vector overlay) is\n * the sanctioned way past it.\n */\n\n// ---------------------------------------------------------------------------\n// Scene descriptor — plain data, everything pre-projected by the caller.\n// ---------------------------------------------------------------------------\n\nexport interface SvgSceneNode {\n x: number;\n y: number;\n /** Radius in output px (the caller halves its size-buffer diameter). */\n r: number;\n /** Any CSS color string (the caller projects RGBA buffers to rgba()). */\n color: string;\n}\n\nexport interface SvgSceneEdge {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n color: string;\n width: number;\n}\n\nexport interface SvgSceneLabel {\n x: number;\n y: number;\n /** UNTRUSTED text — escaped here, never pre-escaped by callers (double\n * escaping is a rendering bug, missing escaping is an injection). */\n text: string;\n color: string;\n /** Font size in px. Default 11. */\n size?: number;\n}\n\nexport interface SvgScene {\n width: number;\n height: number;\n background: string;\n nodes: readonly SvgSceneNode[];\n edges: readonly SvgSceneEdge[];\n labels?: readonly SvgSceneLabel[];\n /**\n * Raster-hybrid base layer: a data URI (typically the engine screenshot).\n * When present, `nodes` and `edges` are expected to be EMPTY — the raster\n * carries them — and only labels/overlay chrome emit as vectors.\n */\n rasterBase?: { href: string };\n}\n\nexport interface RenderSvgOptions {\n /** Element budget across nodes+edges+labels. Default 50 000. */\n maxElements?: number;\n}\n\nexport const SVG_MAX_ELEMENTS_DEFAULT = 50_000;\n\n/** Thrown (not returned) on budget overflow — a pure module has no\n * diagnostics lane; the instance converts this into `export-too-large`. */\nexport class SvgBudgetError extends Error {\n constructor(\n readonly elementCount: number,\n readonly limit: number,\n ) {\n super(\n `SVG export of ${elementCount} elements exceeds the ${limit}-element budget — ` +\n `filter/isolate first, or use the raster-hybrid fallback (§16.14)`,\n );\n this.name = 'SvgBudgetError';\n }\n}\n\n// ---------------------------------------------------------------------------\n// Escaping. Attribute AND text contexts use the same conservative set — the\n// five XML-significant characters — so one helper serves both. Raw control\n// characters (legal in JS strings, ILLEGAL in XML 1.0) drop rather than\n// poisoning the whole document.\n// ---------------------------------------------------------------------------\n\nconst XML_ESCAPES: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&apos;',\n};\n\nexport function escapeXml(text: string): string {\n let out = '';\n for (const ch of text) {\n const escaped = XML_ESCAPES[ch];\n if (escaped !== undefined) {\n out += escaped;\n continue;\n }\n const code = ch.codePointAt(0)!;\n // XML 1.0 Char production: control chars other than tab/LF/CR are\n // unrepresentable even as entities; lone surrogates never reach here\n // because for..of iterates by code point (an unpaired surrogate becomes\n // U+FFFD at the string level, which is legal).\n if (code < 0x20 && code !== 0x09 && code !== 0x0a && code !== 0x0d) continue;\n out += ch;\n }\n return out;\n}\n\n/** Numbers are caller-computed; NaN/Infinity would corrupt attributes, so\n * they render as 0 — a visibly wrong-but-parseable document beats an\n * unparseable one (the §5.1 diagnostics lane is the place to complain). */\nfunction num(v: number): string {\n return Number.isFinite(v) ? String(Math.round(v * 100) / 100) : '0';\n}\n\n// ---------------------------------------------------------------------------\n// Rendering.\n// ---------------------------------------------------------------------------\n\n/**\n * Render a scene to an SVG document string. Pure: same input, same output,\n * byte for byte. Throws {@link SvgBudgetError} when the element budget is\n * exceeded — BEFORE assembling any markup.\n */\nexport function renderSvg(scene: SvgScene, opts?: RenderSvgOptions): string {\n const limit = opts?.maxElements ?? SVG_MAX_ELEMENTS_DEFAULT;\n const labelCount = scene.labels?.length ?? 0;\n const elementCount = scene.nodes.length + scene.edges.length + labelCount;\n if (elementCount > limit) throw new SvgBudgetError(elementCount, limit);\n\n // Chunked assembly: fixed-size flushes keep peak memory at\n // O(chunk + output) rather than O(2 × output) from repeated concat.\n const CHUNK = 4096;\n const chunks: string[] = [];\n let buffer: string[] = [];\n const push = (s: string): void => {\n buffer.push(s);\n if (buffer.length >= CHUNK) {\n chunks.push(buffer.join(''));\n buffer = [];\n }\n };\n\n push(\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${num(scene.width)}\" ` +\n `height=\"${num(scene.height)}\" viewBox=\"0 0 ${num(scene.width)} ${num(scene.height)}\">`,\n );\n push(`<rect width=\"100%\" height=\"100%\" fill=\"${escapeXml(scene.background)}\"/>`);\n\n if (scene.rasterBase !== undefined) {\n // Data URIs are caller-produced (canvas.toDataURL) but escaped anyway —\n // defense in depth costs one pass.\n push(\n `<image href=\"${escapeXml(scene.rasterBase.href)}\" x=\"0\" y=\"0\" ` +\n `width=\"${num(scene.width)}\" height=\"${num(scene.height)}\"/>`,\n );\n }\n\n // Edges under nodes, nodes under labels — the canvas z-order.\n for (const e of scene.edges) {\n push(\n `<line x1=\"${num(e.x1)}\" y1=\"${num(e.y1)}\" x2=\"${num(e.x2)}\" y2=\"${num(e.y2)}\" ` +\n `stroke=\"${escapeXml(e.color)}\" stroke-width=\"${num(e.width)}\"/>`,\n );\n }\n for (const n of scene.nodes) {\n push(`<circle cx=\"${num(n.x)}\" cy=\"${num(n.y)}\" r=\"${num(n.r)}\" fill=\"${escapeXml(n.color)}\"/>`);\n }\n if (scene.labels !== undefined) {\n for (const l of scene.labels) {\n push(\n `<text x=\"${num(l.x)}\" y=\"${num(l.y)}\" fill=\"${escapeXml(l.color)}\" ` +\n `font-family=\"system-ui, sans-serif\" font-size=\"${num(l.size ?? 11)}\">` +\n `${escapeXml(l.text)}</text>`,\n );\n }\n }\n push('</svg>');\n\n if (buffer.length > 0) chunks.push(buffer.join(''));\n return chunks.join('');\n}\n","/**\n * §16.14 view state (S15 view-state lane) — pure module: the serialized\n * schema, the canonical-JSON encoder, the structural validator, and the\n * version gate. No engine, no DOM, no store access; the instance wires\n * `getViewState`/`setViewState` on top.\n *\n * ## Compatibility contract\n *\n * Deep-links outlive library versions, so everything in this file is a\n * COMMITMENT, not an internal:\n * - The v1 wire shape below never changes incompatibly; breaking shape\n * changes bump `v` and ship an in-code migration from every prior version\n * in the same release (the registry seam is here from day one).\n * - Additive fields never bump `v` — an equal-`v` payload with unknown\n * fields applies cleanly with the unknowns ignored.\n * - A payload with `v` HIGHER than this library knows, or failing structural\n * validation (hand-edited URL, truncated paste), is rejected whole: a\n * half-restored view misrepresents what the sender saw (§16.14).\n *\n * ## v1 shape notes\n *\n * - `folds` extends the spec's v1 schema (amendment logged with this slice):\n * §16.3 node folds are exploration state over stable public ids — a\n * deep-link that silently dropped them would misrepresent the sender's\n * view, the exact failure this feature exists to prevent. Session-local\n * expansion records, by contrast, are NEVER serialized (R-16.3-08).\n * - Brushes are TAGGED on the wire (`kind`) even though the runtime\n * BrushState is untagged: the tag comes from `DimensionSpec.kind` at\n * serialize time and lets restore validate shape-vs-dimension without\n * consulting the live spec first. Categorical stores EXCLUSIONS, so\n * categories that appear after the view was saved stay visible.\n * - `layout` is the normalized OBJECT form (`{ kind }`) even though the\n * runtime today carries only the bare kind string — the object is what\n * makes a future static seed or a layouts package additive.\n */\n\nimport type {\n GroupSpec,\n JsonValue,\n NodeId,\n SelectionState,\n SubgraphSpec,\n ViewportState,\n} from './types';\n\nexport type { JsonValue } from './types';\n\n// ---------------------------------------------------------------------------\n// Wire types (v1).\n// ---------------------------------------------------------------------------\n\n/** Tagged wire form of a crossfilter brush (§16.6 → §16.14). */\nexport type ViewBrushState =\n | { kind: 'numeric' | 'temporal'; range: readonly [number, number] }\n | { kind: 'categorical'; excluded: readonly string[] };\n\n/** Normalized layout descriptor — object form reserves room for a static\n * seed / structured layouts without a `v` bump. */\nexport interface ViewLayoutSpec {\n kind: 'force' | 'fixed';\n}\n\n/** §11 Scale subset that is data by construction (no functions). */\nexport type SerializableScale =\n | {\n kind: 'sequential' | 'diverging';\n metric: string;\n range: readonly string[] | readonly number[];\n domain?: readonly number[];\n mid?: number;\n }\n | {\n kind: 'categorical';\n /** Field-descriptor form only — a function `by` is omitted upstream. */\n by: string;\n palette?: readonly string[] | readonly number[];\n domain?: readonly string[];\n };\n\nexport interface ViewStyling {\n nodeColor?: SerializableScale;\n nodeSize?: SerializableScale;\n showLinks?: boolean;\n edgeArrows?: boolean;\n /** Named themes only; a custom GraphTheme object is omitted upstream. */\n theme?: 'light' | 'dark';\n}\n\nexport interface GraphViewState {\n v: 1;\n camera: ViewportState | null;\n selection: SelectionState;\n hiddenNodeIds: readonly NodeId[];\n /** §9.2 isolation; null = full scope. */\n subgraph: SubgraphSpec | null;\n /** Manual groups verbatim, or — under `groupBy` — `{key, collapsed}` pairs\n * only (membership recomputes from current data on restore, R-16.3-16). */\n groups: readonly GroupSpec[] | ReadonlyArray<{ key: string; collapsed: boolean }>;\n pinnedNodeIds: readonly NodeId[];\n /** §16.3 node folds: anchor → declared members (v1 extension, see header). */\n folds?: ReadonlyArray<readonly [NodeId, readonly NodeId[]]>;\n layout: ViewLayoutSpec;\n /** Declaration order; a key absent here has no brush. */\n crossfilter: ReadonlyArray<{ key: string; state: ViewBrushState }>;\n /** Opt-in frozen layout (quantized, visible set); tuple form keeps opaque\n * ids safe. Restores as a fixed-equivalent regardless of engine\n * nondeterminism. */\n positions?: ReadonlyArray<readonly [string, number, number]>;\n styling?: ViewStyling;\n /** Host-owned durable source coordinate — stored verbatim, NEVER\n * interpreted; compared canonically on restore (§16.14). */\n dataRef?: JsonValue;\n}\n\nexport const VIEW_STATE_VERSION = 1 as const;\n\n// ---------------------------------------------------------------------------\n// Canonical JSON — recursive sorted keys, JSON value semantics. Used for\n// dataRef comparison; exported for hosts building their own equality.\n// ---------------------------------------------------------------------------\n\n/**\n * Canonical encoding of a JSON value: object keys recursively sorted, arrays\n * order-preserving, JSON semantics for scalars (so `undefined` members are\n * dropped exactly as JSON.stringify drops them). Two values compare equal iff\n * their canonical strings are identical.\n */\nexport function canonicalJson(value: JsonValue | undefined): string | undefined {\n if (value === undefined) return undefined;\n return encode(value, new Set());\n}\n\n/**\n * Defensive against the PUBLIC-API shape of the input: `setViewState` takes\n * `unknown`, so a host can hand this a cyclic object, a BigInt, a function —\n * things a real deep-link (which arrives through JSON.parse) never carries.\n * Cycles throw a plain RangeError the caller turns into a rejection; every\n * other non-JSON leaf encodes exactly as JSON.stringify treats it (functions/\n * undefined drop as members, become null in arrays; non-finite numbers are\n * null), so canonical comparison always matches wire reality.\n */\nfunction encode(value: JsonValue, seen: Set<object>): string {\n if (value === null || typeof value === 'boolean') return JSON.stringify(value);\n if (typeof value === 'number') {\n return Number.isFinite(value) ? JSON.stringify(value) : 'null';\n }\n if (typeof value === 'string') return JSON.stringify(value);\n if (typeof value !== 'object') return 'null'; // function/bigint/symbol leaf in an array\n if (seen.has(value)) {\n throw new RangeError('canonicalJson: cyclic value — not a JSON value');\n }\n seen.add(value);\n try {\n if (Array.isArray(value)) {\n return `[${value.map((v) => (v === undefined ? 'null' : encode(v, seen))).join(',')}]`;\n }\n const keys = Object.keys(value).sort();\n const members: string[] = [];\n for (const key of keys) {\n const v = value[key];\n if (v === undefined || typeof v === 'function') continue; // JSON.stringify drops these\n members.push(`${JSON.stringify(key)}:${encode(v, seen)}`);\n }\n return `{${members.join(',')}}`;\n } finally {\n seen.delete(value);\n }\n}\n\n/** Canonical equality for dataRef values (§16.14): key order never matters.\n * A non-JSON value (cycles included) is never equal to anything — the §5\n * \"compared, never interpreted\" rule extended to malformed input. */\nexport function sameDataRef(a: JsonValue | undefined, b: JsonValue | undefined): boolean {\n try {\n return canonicalJson(a) === canonicalJson(b);\n } catch {\n return false;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Structural validation. Never throws; returns every problem found. This is\n// the deep-link attack surface: payloads arrive from URLs and hand-edited\n// JSON, so every field is checked before ANY of it is applied (§16.14 atomic\n// rule). Unknown fields at the current version are legal and ignored.\n// ---------------------------------------------------------------------------\n\nexport type ViewStateVerdict =\n | { ok: true; state: GraphViewState }\n | { ok: false; code: 'invalid-view-state' | 'unsupported-version'; problems: readonly string[] };\n\nconst isStr = (v: unknown): v is string => typeof v === 'string';\nconst isNum = (v: unknown): v is number => typeof v === 'number' && Number.isFinite(v);\nconst isBool = (v: unknown): v is boolean => typeof v === 'boolean';\nconst isObj = (v: unknown): v is Record<string, unknown> =>\n typeof v === 'object' && v !== null && !Array.isArray(v);\nconst isStrArray = (v: unknown): v is string[] => Array.isArray(v) && v.every(isStr);\n\nfunction validateBrush(v: unknown, at: string, problems: string[]): void {\n if (!isObj(v)) {\n problems.push(`${at}: not an object`);\n return;\n }\n if (v['kind'] === 'numeric' || v['kind'] === 'temporal') {\n const r = v['range'];\n if (!Array.isArray(r) || r.length !== 2 || !isNum(r[0]) || !isNum(r[1])) {\n problems.push(`${at}: range must be [min, max] finite numbers`);\n }\n return;\n }\n if (v['kind'] === 'categorical') {\n if (!isStrArray(v['excluded'])) problems.push(`${at}: excluded must be string[]`);\n return;\n }\n problems.push(`${at}: unknown brush kind`);\n}\n\nfunction validateScale(v: unknown, at: string, problems: string[]): void {\n if (!isObj(v)) {\n problems.push(`${at}: not an object`);\n return;\n }\n if (v['kind'] === 'sequential' || v['kind'] === 'diverging') {\n if (!isStr(v['metric'])) problems.push(`${at}: metric must be a string`);\n if (!Array.isArray(v['range'])) problems.push(`${at}: range must be an array`);\n return;\n }\n if (v['kind'] === 'categorical') {\n if (!isStr(v['by'])) problems.push(`${at}: categorical 'by' must be a field string`);\n return;\n }\n problems.push(`${at}: unknown scale kind`);\n}\n\n/**\n * Full structural validation + version gate. Order per §16.14: version first\n * (higher-than-known and non-numeric reject as `unsupported-version` /\n * `invalid-view-state` BEFORE field checks), then per-field structure. Lower\n * versions run the migration registry, then re-validate at the current shape.\n */\nexport function validateViewState(raw: unknown): ViewStateVerdict {\n if (!isObj(raw)) {\n return { ok: false, code: 'invalid-view-state', problems: ['payload is not an object'] };\n }\n const v = raw['v'];\n if (!isNum(v) || !Number.isInteger(v) || v < 1) {\n return { ok: false, code: 'invalid-view-state', problems: ['v must be a positive integer'] };\n }\n if (v > VIEW_STATE_VERSION) {\n return {\n ok: false,\n code: 'unsupported-version',\n problems: [`v ${v} is newer than this library understands (${VIEW_STATE_VERSION})`],\n };\n }\n let candidate: Record<string, unknown> = raw;\n if (v < VIEW_STATE_VERSION) {\n const migrated = migrate(candidate, v);\n if (!isObj(migrated)) {\n return { ok: false, code: 'invalid-view-state', problems: [`migration from v${v} failed`] };\n }\n candidate = migrated;\n }\n\n const problems: string[] = [];\n\n // camera and subgraph are REQUIRED members whose value may be null —\n // omission is a truncated payload, not an empty value. Accepting omission\n // here would push `undefined` into apply paths the gate promised were\n // fully validated (the exact half-validated failure §16.14 forbids).\n const camera = candidate['camera'];\n if (camera === undefined) {\n problems.push('camera: required (null for \"no viewport\", never omitted)');\n } else if (camera !== null) {\n if (!isObj(camera) || !isNum(camera['x']) || !isNum(camera['y']) || !isNum(camera['zoom'])) {\n problems.push('camera: must be null or {x, y, zoom} finite numbers');\n }\n }\n\n const selection = candidate['selection'];\n if (\n !isObj(selection) ||\n !isStrArray(selection['nodeIds']) ||\n !isStrArray(selection['edgeIds']) ||\n !isStrArray(selection['groupIds'])\n ) {\n problems.push('selection: must be {nodeIds, edgeIds, groupIds} string arrays');\n }\n\n if (!isStrArray(candidate['hiddenNodeIds'])) problems.push('hiddenNodeIds: must be string[]');\n if (!isStrArray(candidate['pinnedNodeIds'])) problems.push('pinnedNodeIds: must be string[]');\n\n const subgraph = candidate['subgraph'];\n if (subgraph === undefined) {\n problems.push('subgraph: required (null for \"full scope\", never omitted)');\n } else if (subgraph !== null) {\n if (!isObj(subgraph) || !isStrArray(subgraph['seedIds'])) {\n problems.push('subgraph: must be null or {seedIds: string[], hops?, reflow?}');\n } else {\n if (subgraph['hops'] !== undefined && !isNum(subgraph['hops'])) {\n problems.push('subgraph.hops: must be a finite number');\n }\n if (subgraph['reflow'] !== undefined && !isBool(subgraph['reflow'])) {\n problems.push('subgraph.reflow: must be a boolean');\n }\n }\n }\n\n const groups = candidate['groups'];\n if (!Array.isArray(groups)) {\n problems.push('groups: must be an array');\n } else {\n for (let i = 0; i < groups.length; i++) {\n const g: unknown = groups[i];\n if (!isObj(g)) {\n problems.push(`groups[${i}]: not an object`);\n continue;\n }\n const manual = isStr(g['id']) && isStrArray(g['memberIds']);\n const derived = isStr(g['key']) && isBool(g['collapsed']);\n if (!manual && !derived) {\n problems.push(`groups[${i}]: neither a GroupSpec nor a {key, collapsed} pair`);\n }\n }\n }\n\n const folds = candidate['folds'];\n if (folds !== undefined) {\n if (!Array.isArray(folds)) {\n problems.push('folds: must be an array of [anchorId, memberIds] tuples');\n } else {\n for (let i = 0; i < folds.length; i++) {\n const f: unknown = folds[i];\n if (!Array.isArray(f) || f.length !== 2 || !isStr(f[0]) || !isStrArray(f[1])) {\n problems.push(`folds[${i}]: must be [anchorId, memberIds[]]`);\n }\n }\n }\n }\n\n const layout = candidate['layout'];\n if (!isObj(layout) || (layout['kind'] !== 'force' && layout['kind'] !== 'fixed')) {\n problems.push(\"layout: must be { kind: 'force' | 'fixed' }\");\n }\n\n const crossfilter = candidate['crossfilter'];\n if (!Array.isArray(crossfilter)) {\n problems.push('crossfilter: must be an array');\n } else {\n for (let i = 0; i < crossfilter.length; i++) {\n const c: unknown = crossfilter[i];\n if (!isObj(c) || !isStr(c['key'])) {\n problems.push(`crossfilter[${i}]: must be {key, state}`);\n continue;\n }\n validateBrush(c['state'], `crossfilter[${i}].state`, problems);\n }\n }\n\n const positions = candidate['positions'];\n if (positions !== undefined) {\n if (!Array.isArray(positions)) {\n problems.push('positions: must be an array of [id, x, y] tuples');\n } else {\n for (let i = 0; i < positions.length; i++) {\n const p: unknown = positions[i];\n if (!Array.isArray(p) || p.length !== 3 || !isStr(p[0]) || !isNum(p[1]) || !isNum(p[2])) {\n problems.push(`positions[${i}]: must be [id, x, y] with finite coordinates`);\n break; // one sample is enough — payloads can be O(n)\n }\n }\n }\n }\n\n const styling = candidate['styling'];\n if (styling !== undefined) {\n if (!isObj(styling)) {\n problems.push('styling: must be an object');\n } else {\n if (styling['nodeColor'] !== undefined) {\n validateScale(styling['nodeColor'], 'styling.nodeColor', problems);\n }\n if (styling['nodeSize'] !== undefined) {\n validateScale(styling['nodeSize'], 'styling.nodeSize', problems);\n }\n for (const flag of ['showLinks', 'edgeArrows'] as const) {\n if (styling[flag] !== undefined && !isBool(styling[flag])) {\n problems.push(`styling.${flag}: must be a boolean`);\n }\n }\n const theme = styling['theme'];\n if (theme !== undefined && theme !== 'light' && theme !== 'dark') {\n problems.push(\"styling.theme: must be 'light' or 'dark'\");\n }\n }\n }\n\n // dataRef is stored verbatim and never interpreted — but it must BE a JSON\n // value: setViewState takes `unknown`, so cycles/BigInt/functions can\n // arrive from a host even though a parsed deep-link never carries them.\n const ref = candidate['dataRef'];\n if (ref !== undefined) {\n try {\n canonicalJson(ref as JsonValue);\n } catch {\n problems.push('dataRef: not a JSON value (cyclic or non-serializable)');\n }\n }\n\n if (problems.length > 0) return { ok: false, code: 'invalid-view-state', problems };\n return { ok: true, state: candidate as unknown as GraphViewState };\n}\n\n// ---------------------------------------------------------------------------\n// Migration registry. Empty at v1 by definition; every release that bumps\n// VIEW_STATE_VERSION MUST register the migration from each prior version in\n// the same change (§16.14 rule 3). Kept here so the seam exists from day one\n// and the version gate above already exercises it.\n// ---------------------------------------------------------------------------\n\ntype Migration = (state: Record<string, unknown>) => Record<string, unknown>;\n\n/** version N → the migration that lifts an N-shaped payload to N+1. */\nconst MIGRATIONS = new Map<number, Migration>();\n\nfunction migrate(state: Record<string, unknown>, from: number): Record<string, unknown> | null {\n let cur = state;\n for (let v = from; v < VIEW_STATE_VERSION; v++) {\n const step = MIGRATIONS.get(v);\n if (step === undefined) return null; // no path — reject upstream\n cur = { ...step(cur), v: v + 1 };\n }\n return cur;\n}\n\n// ---------------------------------------------------------------------------\n// setViewState result surface (§16.14 typed outcomes — never throws for\n// payload problems; the promise resolves with the verdict).\n// ---------------------------------------------------------------------------\n\nexport type SetViewStateResult =\n | { status: 'applied' }\n /** dataRef differed: `viewStateMismatch` fired INSTEAD of applying.\n * Re-call with `ignoreMismatch: true` to opt in. */\n | { status: 'mismatch' }\n | {\n status: 'rejected';\n code:\n | 'invalid-view-state'\n | 'unsupported-version'\n /** The state touches a §6.4 controlled slice or carries styling the\n * host must reflect, and no aggregate restore callback exists. */\n | 'missing-restore-callback'\n /** Another restore/history transaction is awaiting acknowledgement. */\n | 'restore-pending'\n /** The host never reflected the intent within the window. */\n | 'restore-timeout'\n /** The host reflected DIFFERENT values than the intent asked for. */\n | 'restore-diverged';\n problems: readonly string[];\n };\n","/**\n * §16.6 crossfilter — typed-column engine (v0.7 node-dimension subset).\n *\n * `TypedColumnCrossfilter` is the columnar backend the instance wraps into the\n * public `CrossfilterSession`. Design (crossfilter.js lineage):\n *\n * - **Parse once.** `build()` extracts every dimension exactly once into typed\n * columns (numeric/temporal → `Float64Array` epoch-ms/values, categorical →\n * dictionary codes). §8 hygiene: non-finite numerics, unparseable temporals,\n * and non-string/non-finite categorical values are excluded from the\n * dimension (tracked per dimension in `excludedRows`; the slot is marked\n * invalid). Temporal parsing: numbers are epoch ms verbatim; strings go\n * through `Date.parse` (ES2022 parses `'YYYY-MM-DD'` as UTC midnight);\n * `Date` instances use `getTime()`.\n * - **O(Δ) brushes.** Each range dimension keeps a one-time argsorted\n * permutation. A brush move performs two binary searches and walks ONLY the\n * symmetric difference between the old and new in-range windows; categorical\n * brushes walk only the per-code slot lists whose excluded flag changed. The\n * brush path never re-sorts. A per-slot, per-dimension pass flag plus a\n * global per-slot failure counter make a row selection-visible iff it fails\n * zero dimensions. Hygiene-excluded rows fail any non-null brush on that\n * dimension (they cannot be in range / in a category) and pass a null brush.\n * - **Deltas out.** `setBrush` returns the slots whose overall visibility\n * flipped (`hidden`/`shown`) for the instance's mask source.\n * - **Lazy dual layer.** `summarize()` returns immutable summaries whose\n * `filtered` layer counts rows passing every OTHER dimension's brush plus an\n * external node-mask predicate (`setExternalMask`). v0.7 recomputes a dirty\n * dimension's filtered layer lazily per `summarize()` call — O(rows) per\n * dirty summarize, documented and acceptable at this tier (§17 fixtures own\n * the perf claims; the O(Δ) guarantee covers the brush/visibility path).\n * - **Revisions & notify.** `selectionRevision` starts at 0 and advances\n * exactly once per observable `setBrush` (a brush state change is observable\n * via `getBrush` even when no row flips). v0.7 is synchronous, so\n * latest-call-wins degenerates to \"every call applies immediately in call\n * order\". Subscribers fire once per observable change after state is\n * consistent; synchronous re-entrancy (a subscriber mutating the engine) is\n * coalesced into one trailing notification pass. Model updates\n * (`appendRows`/`replaceAll`) keep the current `selectionRevision` (§16.6)\n * but do notify. External-mask changes notify (summaries changed) without\n * advancing the selection revision.\n * - **Incremental append.** `appendRows` extends columns/codes in place and\n * merges the pre-sorted old permutation with the sorted new block\n * (permutation merge — never a full re-argsort); bins extend incrementally\n * unless the domain grew (then a re-bin, still sort-free). Brushes persist\n * by key and are re-applied to the NEW slots only; the returned delta covers\n * only new slots (`shown` = new passing, `hidden` = new failing).\n * `replaceAll` rebuilds columns but preserves brushes by dimension key,\n * re-applying them as one combined delta against an all-visible baseline of\n * the new roster (`shown` is always empty). `replaceAll` clears the external\n * mask (slot indices changed meaning); `appendRows` keeps it and treats new\n * slots as passing until the instance re-supplies it.\n */\n\nimport type {\n BrushState,\n CategoryBin,\n DimensionKind,\n DimensionSpec,\n DimensionSummary,\n GraphNode,\n HistogramBin,\n} from './types';\n\n/** Default histogram bin count for numeric/temporal dimensions (§16.6). */\nexport const DEFAULT_BIN_COUNT = 24;\n\n/** Slots whose overall selection-visibility flipped in one operation. */\nexport interface BrushDelta {\n /** Slots that flipped visible → hidden. */\n hidden: number[];\n /** Slots that flipped hidden → visible. */\n shown: number[];\n}\n\n/** Test instrumentation counters (see crossfilter.test.ts O(Δ) evidence). */\nexport interface CrossfilterStats {\n /** Slots touched by brush delta walks (the O(Δ) loop). */\n slotsWalked: number;\n /** Full-column argsorts (build/replaceAll only — never append or brush). */\n fullSorts: number;\n /** Permutation merges performed by appendRows. */\n permutationMerges: number;\n}\n\ninterface DimBase<N> {\n readonly spec: DimensionSpec<N>;\n readonly key: string;\n /** 1 = slot passes this dimension's brush. */\n pass: Uint8Array;\n /** §8 hygiene-excluded slots (unparseable / non-finite). */\n invalidSlots: number[];\n /** Normalized, frozen brush (null = no brush). */\n brush: BrushState;\n /** Lazy filtered-layer cache validity. */\n filteredDirty: boolean;\n}\n\ninterface RangeDim<N> extends DimBase<N> {\n readonly kind: 'numeric' | 'temporal';\n /** Per-slot value; NaN marks hygiene-excluded slots. */\n values: Float64Array;\n /** Valid slots argsorted ascending by value (ties by slot index). */\n sorted: Uint32Array;\n hasDomain: boolean;\n domainMin: number;\n domainMax: number;\n /** Requested bin count (spec.bins ?? DEFAULT_BIN_COUNT). */\n readonly binCount: number;\n /** 0 when empty, 1 when the domain is a single point, else binCount. */\n effectiveBins: number;\n /** Per-slot bin index; -1 for invalid slots. */\n slotBin: Int32Array;\n binTotals: number[];\n /** Current in-range window [lo, hi) into `sorted` (meaningful when brushed). */\n lo: number;\n hi: number;\n filteredBins: number[];\n}\n\ninterface CatDim<N> extends DimBase<N> {\n readonly kind: 'categorical';\n /** Per-slot dictionary code; -1 for invalid slots. */\n codes: Int32Array;\n codeOf: Map<string, number>;\n /** Code → key, first-occurrence order. */\n codeKeys: string[];\n /** Code → slots carrying it (built once; the categorical delta path). */\n codeSlots: number[][];\n /** Currently excluded category keys (empty set when brush is null). */\n excludedSet: Set<string>;\n filteredCats: number[];\n}\n\ntype DimState<N> = RangeDim<N> | CatDim<N>;\n\ninterface NormalizedBrush {\n brush: BrushState;\n /** Deduped excluded keys (categorical; empty otherwise). */\n set: Set<string>;\n}\n\n// ---------------------------------------------------------------------------\n// Extraction (§8 hygiene) — applied exactly once per slot per dimension.\n// ---------------------------------------------------------------------------\n\nfunction numericValue(raw: unknown): number | null {\n return typeof raw === 'number' && Number.isFinite(raw) ? raw : null;\n}\n\nfunction temporalValue(raw: unknown): number | null {\n if (typeof raw === 'number') return Number.isFinite(raw) ? raw : null;\n if (typeof raw === 'string') {\n const t = Date.parse(raw); // 'YYYY-MM-DD' → UTC midnight per ES2022\n return Number.isFinite(t) ? t : null;\n }\n if (raw instanceof Date) {\n const t = raw.getTime();\n return Number.isFinite(t) ? t : null;\n }\n return null;\n}\n\nfunction categoricalKey(raw: unknown): string | null {\n if (typeof raw === 'string') return raw;\n if (typeof raw === 'number' && Number.isFinite(raw)) return String(raw);\n return null;\n}\n\nfunction rangeValue(kind: 'numeric' | 'temporal', raw: unknown): number | null {\n return kind === 'numeric' ? numericValue(raw) : temporalValue(raw);\n}\n\n/** First index i in sorted with values[sorted[i]] >= target. */\nfunction lowerBound(values: Float64Array, sorted: Uint32Array, target: number): number {\n let lo = 0;\n let hi = sorted.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (values[sorted[mid]!]! < target) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n}\n\n/** First index i in sorted with values[sorted[i]] > target. */\nfunction upperBound(values: Float64Array, sorted: Uint32Array, target: number): number {\n let lo = 0;\n let hi = sorted.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (values[sorted[mid]!]! <= target) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n}\n\n// ---------------------------------------------------------------------------\n// Engine\n// ---------------------------------------------------------------------------\n\nexport class TypedColumnCrossfilter<N = Record<string, unknown>> {\n /** Test instrumentation; see CrossfilterStats. Reset with resetStats(). */\n readonly stats: CrossfilterStats = { slotsWalked: 0, fullSorts: 0, permutationMerges: 0 };\n\n private dims: DimState<N>[] = [];\n private byKey = new Map<string, DimState<N>>();\n private specs: readonly DimensionSpec<N>[] = [];\n private n = 0;\n /** Per-slot count of dimensions the slot currently fails. */\n private failCount = new Uint16Array(0);\n private externalMask: Uint8Array | null = null;\n private revision = 0;\n private readonly subscribers = new Set<() => void>();\n private built = false;\n private disposed = false;\n private notifying = false;\n private renotify = false;\n\n /** Monotonic from 0; advances exactly once per observable setBrush change. */\n get selectionRevision(): number {\n return this.revision;\n }\n\n resetStats(): void {\n this.stats.slotsWalked = 0;\n this.stats.fullSorts = 0;\n this.stats.permutationMerges = 0;\n }\n\n /**\n * (Re)initialize columns from scratch. Clears all brushes and the external\n * mask (use replaceAll to rebuild while preserving brushes by key). Does not\n * notify and does not touch selectionRevision.\n */\n build(nodes: readonly GraphNode<N>[], specs: readonly DimensionSpec<N>[]): void {\n this.ensureLive();\n this.buildDims(nodes, specs);\n this.built = true;\n }\n\n rowCount(): number {\n this.ensureLive();\n return this.n;\n }\n\n getBrush(key: string): BrushState {\n this.ensureLive();\n return this.dim(key).brush;\n }\n\n isSlotVisible(slot: number): boolean {\n this.ensureLive();\n if (!Number.isInteger(slot) || slot < 0 || slot >= this.n) return false;\n return this.failCount[slot] === 0;\n }\n\n /** Fresh array of selection-visible slots, ascending. */\n visibleSlots(): number[] {\n this.ensureLive();\n const out: number[] = [];\n for (let s = 0; s < this.n; s++) if (this.failCount[s] === 0) out.push(s);\n return out;\n }\n\n /**\n * Apply a brush (latest-call-wins: v0.7 is synchronous, so each call applies\n * immediately in call order). Returns the slots whose overall\n * selection-visibility flipped. A no-op (deep-equal brush) returns empty\n * deltas without advancing selectionRevision or notifying.\n */\n setBrush(key: string, brush: BrushState): BrushDelta {\n this.ensureLive();\n const dim = this.dim(key);\n const normalized = normalizeBrush(dim.kind, brush);\n if (brushEquals(dim, normalized)) return { hidden: [], shown: [] };\n\n const delta: BrushDelta = { hidden: [], shown: [] };\n if (dim.kind === 'categorical') {\n this.applyCatTransition(dim, normalized, delta);\n } else {\n this.applyRangeTransition(dim, normalized.brush as { min: number; max: number } | null, delta);\n }\n dim.brush = normalized.brush;\n // Own filtered layer ignores the own-dim brush; only OTHER layers go dirty.\n for (const other of this.dims) if (other !== dim) other.filteredDirty = true;\n this.revision++;\n this.notify();\n return delta;\n }\n\n /**\n * External node-mask predicate for the joint \"filtered\" second layer (the\n * instance wires the §9.1 filter-prop node mask in). Affects summaries only,\n * never selection visibility. Length must equal rowCount(). Notifies on\n * observable change; does NOT advance selectionRevision.\n */\n setExternalMask(passSlots: Uint8Array | null): void {\n this.ensureLive();\n if (passSlots === null) {\n if (this.externalMask === null) return;\n this.externalMask = null;\n } else {\n if (passSlots.length !== this.n) {\n throw new RangeError(\n `setExternalMask: mask length ${passSlots.length} !== rowCount ${this.n}`,\n );\n }\n // An all-pass mask is indistinguishable from null → not observable.\n const unchanged =\n this.externalMask === null ? allOnes(passSlots) : sameMask(this.externalMask, passSlots);\n if (unchanged) return;\n this.externalMask = Uint8Array.from(passSlots);\n }\n for (const d of this.dims) d.filteredDirty = true;\n this.notify();\n }\n\n /**\n * Immutable summary. The filtered layer is recomputed lazily when dirty —\n * O(rows) per dirty summarize (v0.7 tier; see module doc). Returned objects\n * are frozen and never mutated by later operations.\n */\n summarize(key: string): DimensionSummary {\n this.ensureLive();\n const dim = this.dim(key);\n if (dim.filteredDirty) {\n this.recomputeFiltered(dim);\n dim.filteredDirty = false;\n }\n const bins: HistogramBin[] = [];\n const categories: CategoryBin[] = [];\n let domain: { min: number; max: number } | undefined;\n if (dim.kind === 'categorical') {\n for (let c = 0; c < dim.codeKeys.length; c++) {\n const catKey = dim.codeKeys[c]!;\n categories.push(\n Object.freeze({\n key: catKey,\n total: dim.codeSlots[c]!.length,\n filtered: dim.filteredCats[c] ?? 0,\n excluded: dim.excludedSet.has(catKey),\n }),\n );\n }\n } else if (dim.hasDomain) {\n domain = Object.freeze({ min: dim.domainMin, max: dim.domainMax });\n const bcount = dim.effectiveBins;\n const span = dim.domainMax - dim.domainMin;\n for (let i = 0; i < bcount; i++) {\n bins.push(\n Object.freeze({\n x0: i === 0 ? dim.domainMin : dim.domainMin + (span * i) / bcount,\n x1: i === bcount - 1 ? dim.domainMax : dim.domainMin + (span * (i + 1)) / bcount,\n total: dim.binTotals[i]!,\n filtered: dim.filteredBins[i] ?? 0,\n }),\n );\n }\n }\n const base = {\n key: dim.key,\n kind: dim.kind as DimensionKind,\n bins: Object.freeze(bins) as readonly HistogramBin[],\n categories: Object.freeze(categories) as readonly CategoryBin[],\n excludedRows: dim.invalidSlots.length,\n };\n return Object.freeze(domain !== undefined ? { ...base, domain } : base);\n }\n\n /**\n * Incrementally extend columns with new rows (S9-T09 subset): no full\n * rebuild, no full re-argsort — the pre-sorted old permutation merges with\n * the sorted new block. Brushes stay by key and are applied to the NEW slots\n * only; the returned delta covers only new slots. Keeps selectionRevision;\n * notifies when rows were appended.\n */\n appendRows(newNodes: readonly GraphNode<N>[]): BrushDelta {\n this.ensureLive();\n this.ensureBuilt();\n const delta: BrushDelta = { hidden: [], shown: [] };\n const m = newNodes.length;\n if (m === 0) return delta;\n const oldN = this.n;\n const newN = oldN + m;\n\n const fc = new Uint16Array(newN);\n fc.set(this.failCount);\n this.failCount = fc;\n if (this.externalMask !== null) {\n const em = new Uint8Array(newN).fill(1);\n em.set(this.externalMask);\n this.externalMask = em;\n }\n this.n = newN;\n\n for (const dim of this.dims) {\n const pass = new Uint8Array(newN).fill(1);\n pass.set(dim.pass);\n dim.pass = pass;\n if (dim.kind === 'categorical') this.appendCat(dim, newNodes, oldN);\n else this.appendRange(dim, newNodes, oldN);\n dim.filteredDirty = true;\n }\n\n for (let s = oldN; s < newN; s++) {\n (this.failCount[s] === 0 ? delta.shown : delta.hidden).push(s);\n }\n this.notify();\n return delta;\n }\n\n /**\n * Full rebuild from a new roster, PRESERVING brushes by dimension key and\n * re-applying them as one combined delta against an all-visible baseline of\n * the new roster (shown is always empty). Clears the external mask. Keeps\n * selectionRevision; notifies once.\n */\n replaceAll(nodes: readonly GraphNode<N>[]): BrushDelta {\n this.ensureLive();\n this.ensureBuilt();\n const saved = this.dims.map((d) => ({ key: d.key, brush: d.brush }));\n this.buildDims(nodes, this.specs);\n const delta: BrushDelta = { hidden: [], shown: [] };\n for (const { key, brush } of saved) {\n if (brush === null) continue;\n const dim = this.byKey.get(key)!;\n const normalized = normalizeBrush(dim.kind, brush);\n if (dim.kind === 'categorical') this.applyCatTransition(dim, normalized, delta);\n else this.applyRangeTransition(dim, normalized.brush as { min: number; max: number }, delta);\n dim.brush = normalized.brush;\n }\n for (const d of this.dims) d.filteredDirty = true;\n this.notify();\n return delta;\n }\n\n /** Fires once per observable selection/summary change, state consistent. */\n subscribe(cb: () => void): () => void {\n this.ensureLive();\n this.subscribers.add(cb);\n return () => {\n this.subscribers.delete(cb);\n };\n }\n\n /** Idempotent; every other method throws afterwards. */\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n this.subscribers.clear();\n this.dims = [];\n this.byKey.clear();\n }\n\n // -------------------------------------------------------------------------\n // Internals\n // -------------------------------------------------------------------------\n\n private ensureLive(): void {\n if (this.disposed) throw new Error('TypedColumnCrossfilter: disposed');\n }\n\n private ensureBuilt(): void {\n if (!this.built) throw new Error('TypedColumnCrossfilter: build() has not been called');\n }\n\n private dim(key: string): DimState<N> {\n this.ensureBuilt();\n const dim = this.byKey.get(key);\n if (dim === undefined) throw new Error(`TypedColumnCrossfilter: unknown dimension \"${key}\"`);\n return dim;\n }\n\n private buildDims(nodes: readonly GraphNode<N>[], specs: readonly DimensionSpec<N>[]): void {\n const seen = new Set<string>();\n const dims: DimState<N>[] = [];\n for (const spec of specs) {\n if (seen.has(spec.key)) {\n throw new TypeError(`TypedColumnCrossfilter: duplicate dimension key \"${spec.key}\"`);\n }\n seen.add(spec.key);\n dims.push(\n spec.kind === 'categorical' ? this.buildCatDim(spec, nodes) : this.buildRangeDim(spec, nodes),\n );\n }\n this.specs = specs;\n this.dims = dims;\n this.byKey = new Map(dims.map((d) => [d.key, d]));\n this.n = nodes.length;\n this.failCount = new Uint16Array(nodes.length);\n this.externalMask = null;\n }\n\n private buildRangeDim(spec: DimensionSpec<N>, nodes: readonly GraphNode<N>[]): RangeDim<N> {\n const kind = spec.kind as 'numeric' | 'temporal';\n const n = nodes.length;\n const values = new Float64Array(n);\n const invalidSlots: number[] = [];\n const valid: number[] = [];\n for (let s = 0; s < n; s++) {\n const v = rangeValue(kind, spec.get(nodes[s]!));\n if (v === null) {\n values[s] = NaN;\n invalidSlots.push(s);\n } else {\n values[s] = v;\n valid.push(s);\n }\n }\n // One-time index sort on the typed column (§16.6: build MAY sort; the\n // brush path never re-sorts).\n valid.sort((a, b) => values[a]! - values[b]! || a - b);\n this.stats.fullSorts++;\n const dim: RangeDim<N> = {\n spec,\n key: spec.key,\n kind,\n values,\n sorted: Uint32Array.from(valid),\n hasDomain: false,\n domainMin: NaN,\n domainMax: NaN,\n binCount: sanitizeBinCount(spec.bins),\n effectiveBins: 0,\n slotBin: new Int32Array(0),\n binTotals: [],\n lo: 0,\n hi: valid.length,\n pass: new Uint8Array(n).fill(1),\n invalidSlots,\n brush: null,\n filteredDirty: true,\n filteredBins: [],\n };\n this.rebinRange(dim);\n return dim;\n }\n\n private buildCatDim(spec: DimensionSpec<N>, nodes: readonly GraphNode<N>[]): CatDim<N> {\n const n = nodes.length;\n const codes = new Int32Array(n).fill(-1);\n const codeOf = new Map<string, number>();\n const codeKeys: string[] = [];\n const codeSlots: number[][] = [];\n const invalidSlots: number[] = [];\n for (let s = 0; s < n; s++) {\n const key = categoricalKey(spec.get(nodes[s]!));\n if (key === null) {\n invalidSlots.push(s);\n continue;\n }\n let c = codeOf.get(key);\n if (c === undefined) {\n c = codeKeys.length;\n codeOf.set(key, c);\n codeKeys.push(key);\n codeSlots.push([]);\n }\n codes[s] = c;\n codeSlots[c]!.push(s);\n }\n return {\n spec,\n key: spec.key,\n kind: 'categorical',\n codes,\n codeOf,\n codeKeys,\n codeSlots,\n excludedSet: new Set(),\n pass: new Uint8Array(n).fill(1),\n invalidSlots,\n brush: null,\n filteredDirty: true,\n filteredCats: [],\n };\n }\n\n /** Recompute domain, bin edges, per-slot bin index, and totals. Sort-free. */\n private rebinRange(dim: RangeDim<N>): void {\n const len = dim.sorted.length;\n const slotBin = new Int32Array(dim.values.length).fill(-1);\n if (len === 0) {\n dim.hasDomain = false;\n dim.domainMin = NaN;\n dim.domainMax = NaN;\n dim.effectiveBins = 0;\n dim.slotBin = slotBin;\n dim.binTotals = [];\n return;\n }\n const min = dim.values[dim.sorted[0]!]!;\n const max = dim.values[dim.sorted[len - 1]!]!;\n dim.hasDomain = true;\n dim.domainMin = min;\n dim.domainMax = max;\n const bcount = min === max ? 1 : dim.binCount;\n dim.effectiveBins = bcount;\n const totals = new Array<number>(bcount).fill(0);\n const span = max - min;\n for (let i = 0; i < len; i++) {\n const s = dim.sorted[i]!;\n const b = bcount === 1 ? 0 : Math.min(Math.floor(((dim.values[s]! - min) / span) * bcount), bcount - 1);\n slotBin[s] = b;\n totals[b] = totals[b]! + 1;\n }\n dim.slotBin = slotBin;\n dim.binTotals = totals;\n }\n\n private binIndex(dim: RangeDim<N>, v: number): number {\n if (dim.effectiveBins <= 1) return 0;\n const span = dim.domainMax - dim.domainMin;\n return Math.min(Math.floor(((v - dim.domainMin) / span) * dim.effectiveBins), dim.effectiveBins - 1);\n }\n\n // --- delta machinery -------------------------------------------------------\n\n private flip(dim: DimState<N>, slot: number, nowPass: boolean, delta: BrushDelta): void {\n this.stats.slotsWalked++;\n if (nowPass) {\n if (dim.pass[slot] === 1) return;\n dim.pass[slot] = 1;\n const next = this.failCount[slot]! - 1;\n this.failCount[slot] = next;\n if (next === 0) delta.shown.push(slot);\n } else {\n if (dim.pass[slot] === 0) return;\n dim.pass[slot] = 0;\n const prev = this.failCount[slot]!;\n this.failCount[slot] = prev + 1;\n if (prev === 0) delta.hidden.push(slot);\n }\n }\n\n private walkSorted(dim: RangeDim<N>, from: number, to: number, nowPass: boolean, delta: BrushDelta): void {\n for (let i = from; i < to; i++) this.flip(dim, dim.sorted[i]!, nowPass, delta);\n }\n\n private walkList(dim: DimState<N>, slots: readonly number[], nowPass: boolean, delta: BrushDelta): void {\n for (const s of slots) this.flip(dim, s, nowPass, delta);\n }\n\n private applyRangeTransition(\n dim: RangeDim<N>,\n next: { min: number; max: number } | null,\n delta: BrushDelta,\n ): void {\n const len = dim.sorted.length;\n const prevNull = dim.brush === null;\n if (next === null) {\n // brush → null: the complement of the old window (and hygiene-excluded\n // slots) passes again. O(n − window) — clearing, not the scrub path.\n this.walkSorted(dim, 0, dim.lo, true, delta);\n this.walkSorted(dim, dim.hi, len, true, delta);\n this.walkList(dim, dim.invalidSlots, true, delta);\n dim.lo = 0;\n dim.hi = len;\n return;\n }\n const lo1 = lowerBound(dim.values, dim.sorted, next.min);\n let hi1 = upperBound(dim.values, dim.sorted, next.max);\n if (hi1 < lo1) hi1 = lo1; // inverted brush (min > max) = empty selection\n if (prevNull) {\n this.walkSorted(dim, 0, lo1, false, delta);\n this.walkSorted(dim, hi1, len, false, delta);\n this.walkList(dim, dim.invalidSlots, false, delta);\n } else {\n const lo0 = dim.lo;\n const hi0 = dim.hi;\n // Symmetric difference of [lo0,hi0) and [lo1,hi1): O(Δ), the scrub path.\n this.walkSorted(dim, lo0, Math.min(hi0, lo1), false, delta); // leave (low side)\n this.walkSorted(dim, Math.max(lo0, hi1), hi0, false, delta); // leave (high side)\n this.walkSorted(dim, lo1, Math.min(hi1, lo0), true, delta); // enter (low side)\n this.walkSorted(dim, Math.max(lo1, hi0), hi1, true, delta); // enter (high side)\n }\n dim.lo = lo1;\n dim.hi = hi1;\n }\n\n private applyCatTransition(dim: CatDim<N>, normalized: NormalizedBrush, delta: BrushDelta): void {\n const prevNull = dim.brush === null;\n const nextNull = normalized.brush === null;\n const prevSet = dim.excludedSet;\n const nextSet = normalized.set;\n for (const key of nextSet) {\n if (prevSet.has(key)) continue;\n const c = dim.codeOf.get(key);\n if (c !== undefined) this.walkList(dim, dim.codeSlots[c]!, false, delta);\n }\n for (const key of prevSet) {\n if (nextSet.has(key)) continue;\n const c = dim.codeOf.get(key);\n if (c !== undefined) this.walkList(dim, dim.codeSlots[c]!, true, delta);\n }\n // Hygiene-excluded slots pass a null brush and fail any non-null brush.\n if (prevNull !== nextNull) this.walkList(dim, dim.invalidSlots, nextNull, delta);\n dim.excludedSet = nextSet;\n }\n\n // --- append ----------------------------------------------------------------\n\n private appendRange(dim: RangeDim<N>, newNodes: readonly GraphNode<N>[], oldN: number): void {\n const m = newNodes.length;\n const newN = oldN + m;\n const values = new Float64Array(newN);\n values.set(dim.values);\n const newValid: number[] = [];\n for (let j = 0; j < m; j++) {\n const s = oldN + j;\n const v = rangeValue(dim.kind, dim.spec.get(newNodes[j]!));\n if (v === null) {\n values[s] = NaN;\n dim.invalidSlots.push(s);\n } else {\n values[s] = v;\n newValid.push(s);\n }\n }\n dim.values = values;\n // Sort ONLY the new block, then permutation-merge with the old order.\n newValid.sort((a, b) => values[a]! - values[b]! || a - b);\n const old = dim.sorted;\n const merged = new Uint32Array(old.length + newValid.length);\n let i = 0;\n let j = 0;\n let k = 0;\n while (i < old.length && j < newValid.length) {\n const a = old[i]!;\n const b = newValid[j]!;\n if (values[a]! <= values[b]!) {\n merged[k++] = a;\n i++;\n } else {\n merged[k++] = b;\n j++;\n }\n }\n while (i < old.length) merged[k++] = old[i++]!;\n while (j < newValid.length) merged[k++] = newValid[j++]!;\n dim.sorted = merged;\n this.stats.permutationMerges++;\n\n // Extend bins; a grown domain forces a re-bin (still sort-free).\n const len = merged.length;\n if (len === 0) {\n this.rebinRange(dim);\n } else {\n const nmin = values[merged[0]!]!;\n const nmax = values[merged[len - 1]!]!;\n if (!dim.hasDomain || nmin !== dim.domainMin || nmax !== dim.domainMax) {\n this.rebinRange(dim);\n } else {\n const slotBin = new Int32Array(newN).fill(-1);\n slotBin.set(dim.slotBin);\n dim.slotBin = slotBin;\n for (const s of newValid) {\n const b = this.binIndex(dim, values[s]!);\n slotBin[s] = b;\n dim.binTotals[b] = dim.binTotals[b]! + 1;\n }\n }\n }\n\n // Re-apply the preserved brush to NEW slots only.\n const brush = dim.brush;\n if (brush !== null && 'min' in brush) {\n for (let j2 = 0; j2 < m; j2++) {\n const s = oldN + j2;\n const v = values[s]!;\n const passes = v >= brush.min && v <= brush.max; // NaN → false (hygiene fails brush)\n if (!passes) {\n dim.pass[s] = 0;\n this.failCount[s] = this.failCount[s]! + 1;\n }\n }\n // The merged permutation shifted window indices; refresh them.\n dim.lo = lowerBound(values, merged, brush.min);\n dim.hi = Math.max(upperBound(values, merged, brush.max), dim.lo);\n } else {\n dim.lo = 0;\n dim.hi = merged.length;\n }\n }\n\n private appendCat(dim: CatDim<N>, newNodes: readonly GraphNode<N>[], oldN: number): void {\n const m = newNodes.length;\n const newN = oldN + m;\n const codes = new Int32Array(newN).fill(-1);\n codes.set(dim.codes);\n dim.codes = codes;\n for (let j = 0; j < m; j++) {\n const s = oldN + j;\n const key = categoricalKey(dim.spec.get(newNodes[j]!));\n if (key === null) {\n dim.invalidSlots.push(s);\n continue;\n }\n let c = dim.codeOf.get(key);\n if (c === undefined) {\n c = dim.codeKeys.length;\n dim.codeOf.set(key, c);\n dim.codeKeys.push(key);\n dim.codeSlots.push([]);\n }\n codes[s] = c;\n dim.codeSlots[c]!.push(s);\n }\n if (dim.brush !== null) {\n for (let j2 = 0; j2 < m; j2++) {\n const s = oldN + j2;\n const c = codes[s]!;\n const passes = c >= 0 && !dim.excludedSet.has(dim.codeKeys[c]!);\n if (!passes) {\n dim.pass[s] = 0;\n this.failCount[s] = this.failCount[s]! + 1;\n }\n }\n }\n }\n\n // --- lazy filtered layer -----------------------------------------------------\n\n private recomputeFiltered(dim: DimState<N>): void {\n const ext = this.externalMask;\n const fc = this.failCount;\n if (dim.kind === 'categorical') {\n const counts = new Array<number>(dim.codeKeys.length).fill(0);\n for (let s = 0; s < this.n; s++) {\n const c = dim.codes[s]!;\n if (c < 0) continue;\n // Passes every OTHER dimension: total failures minus own-dim failure.\n if (fc[s]! - (dim.pass[s]! ^ 1) !== 0) continue;\n if (ext !== null && ext[s] === 0) continue;\n counts[c] = counts[c]! + 1;\n }\n dim.filteredCats = counts;\n } else {\n const counts = new Array<number>(dim.effectiveBins).fill(0);\n for (let s = 0; s < this.n; s++) {\n const b = dim.slotBin[s]!;\n if (b < 0) continue;\n if (fc[s]! - (dim.pass[s]! ^ 1) !== 0) continue;\n if (ext !== null && ext[s] === 0) continue;\n counts[b] = counts[b]! + 1;\n }\n dim.filteredBins = counts;\n }\n }\n\n // --- notification -------------------------------------------------------------\n\n /** One callback pass per observable change; synchronous re-entrancy coalesces. */\n private notify(): void {\n if (this.notifying) {\n this.renotify = true;\n return;\n }\n this.notifying = true;\n try {\n do {\n this.renotify = false;\n for (const cb of [...this.subscribers]) cb();\n } while (this.renotify && !this.disposed);\n } finally {\n this.notifying = false;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Brush normalization / equality\n// ---------------------------------------------------------------------------\n\nfunction sanitizeBinCount(bins: number | undefined): number {\n if (bins === undefined) return DEFAULT_BIN_COUNT;\n if (!Number.isInteger(bins) || bins < 1) {\n throw new TypeError(`TypedColumnCrossfilter: bins must be a positive integer (got ${bins})`);\n }\n return bins;\n}\n\nfunction normalizeBrush(kind: DimensionKind, brush: BrushState): NormalizedBrush {\n if (brush === null) return { brush: null, set: new Set() };\n if ('excluded' in brush) {\n if (kind !== 'categorical') {\n throw new TypeError(`TypedColumnCrossfilter: categorical brush on ${kind} dimension`);\n }\n const set = new Set<string>();\n for (const key of brush.excluded) {\n if (typeof key !== 'string') {\n throw new TypeError('TypedColumnCrossfilter: excluded keys must be strings');\n }\n set.add(key);\n }\n return { brush: Object.freeze({ excluded: Object.freeze([...set]) as readonly string[] }), set };\n }\n if (kind === 'categorical') {\n throw new TypeError('TypedColumnCrossfilter: range brush on categorical dimension');\n }\n if (!Number.isFinite(brush.min) || !Number.isFinite(brush.max)) {\n throw new TypeError('TypedColumnCrossfilter: brush min/max must be finite numbers');\n }\n return { brush: Object.freeze({ min: brush.min, max: brush.max }), set: new Set() };\n}\n\nfunction brushEquals<N>(dim: DimState<N>, next: NormalizedBrush): boolean {\n const prev = dim.brush;\n if (prev === null || next.brush === null) return prev === next.brush;\n if ('min' in prev) {\n return 'min' in next.brush && prev.min === next.brush.min && prev.max === next.brush.max;\n }\n // categorical: order-insensitive set equality\n if (dim.kind !== 'categorical') return false;\n const prevSet = dim.excludedSet;\n if (prevSet.size !== next.set.size) return false;\n for (const key of next.set) if (!prevSet.has(key)) return false;\n return true;\n}\n\nfunction sameMask(a: Uint8Array, b: Uint8Array): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if ((a[i]! === 0) !== (b[i]! === 0)) return false;\n }\n return true;\n}\n\nfunction allOnes(mask: Uint8Array): boolean {\n for (let i = 0; i < mask.length; i++) if (mask[i] === 0) return false;\n return true;\n}\n","/**\n * §16.14 history command-stack kernel (S9-T20; pulled forward from M7).\n *\n * v0.7 implements the KERNEL only: value-diff commands, transactions,\n * coalescing, and a bounded stack. The kernel never touches stores — it is a\n * pure application seam: `undo()`/`redo()` return the command list to apply\n * (already inverted, in application order) and move the cursor; the instance\n * (wired in S15) applies commands to its slices and publishes.\n * Ownership-mode acknowledgement walks and view-state integration are S15.\n *\n * Commands are `{ slice, before, after }` value diffs — never closures — so\n * they are serializable and invert by swapping. The kernel freezes and stores\n * exactly what it is given (no structuredClone): callers pass plain values /\n * arrays and must not mutate them afterward. A DEV-only serializability walk\n * (no functions, no Map/Set — callers convert) runs behind the `debug` flag.\n */\n\n/** One history-worthy mutation: a serializable value diff over a named slice. */\nexport interface HistoryCommand {\n readonly slice: string;\n readonly before: unknown;\n readonly after: unknown;\n}\n\n/** Depth snapshot published to subscribers (mirrors GraphStoreState.history). */\nexport interface HistoryDepths {\n readonly undoDepth: number;\n readonly redoDepth: number;\n}\n\nexport interface HistoryKernelOptions {\n /** Stack bound; oldest entry evicted past it (§16.14; default 50). */\n limit?: number;\n /** `false` = the `history: false` prop: everything is a no-op, depths stay 0. */\n enabled?: boolean;\n /** DEV-only: walk recorded payloads and throw on non-serializable values. */\n debug?: boolean;\n}\n\nexport const HISTORY_LIMIT_DEFAULT = 50;\n\n/** One undoable step: 1..n commands applied/inverted atomically in order. */\ninterface HistoryEntry {\n label: string | undefined;\n commands: HistoryCommand[];\n}\n\ninterface CoalesceTag {\n key: string;\n windowMs: number;\n time: number;\n}\n\n/**\n * DEV serializability walk: rejects functions, Map/Set (callers convert),\n * symbols, bigints, and cycles. Plain objects/arrays and JSON scalars pass.\n */\nfunction assertSerializable(value: unknown, slice: string): void {\n const seen = new Set<object>();\n const walk = (v: unknown, path: string): void => {\n switch (typeof v) {\n case 'function':\n throw new TypeError(\n `history command for slice \"${slice}\" carries a function at ${path} — commands are value diffs, not closures (§16.14)`,\n );\n case 'symbol':\n case 'bigint':\n throw new TypeError(\n `history command for slice \"${slice}\" carries a ${typeof v} at ${path} — not serializable`,\n );\n case 'object':\n break;\n default:\n return; // string | number | boolean | undefined\n }\n if (v === null) return;\n if (v instanceof Map || v instanceof Set) {\n throw new TypeError(\n `history command for slice \"${slice}\" carries a ${v instanceof Map ? 'Map' : 'Set'} at ${path} — convert to arrays/objects before recording (§16.14)`,\n );\n }\n if (seen.has(v)) {\n throw new TypeError(`history command for slice \"${slice}\" carries a cycle at ${path} — not serializable`);\n }\n seen.add(v);\n if (Array.isArray(v)) {\n for (let i = 0; i < v.length; i++) walk(v[i], `${path}[${i}]`);\n } else {\n for (const [k, child] of Object.entries(v)) walk(child, `${path}.${k}`);\n }\n seen.delete(v);\n };\n walk(value, '$');\n}\n\n/**\n * Bounded undo/redo command stack. Store-agnostic: see module doc for the\n * application seam. All methods are synchronous; there is no async state.\n */\nexport class HistoryKernel {\n private readonly limit: number;\n private readonly enabled: boolean;\n private readonly debug: boolean;\n\n private readonly undoStack: HistoryEntry[] = [];\n private readonly redoStack: HistoryEntry[] = [];\n\n /** Nested begin() joins the outer transaction (depth-counted). */\n private txDepth = 0;\n private txCommands: HistoryCommand[] = [];\n private txLabel: string | undefined;\n private txCoalesce: CoalesceTag | null = null;\n\n /**\n * Coalescing chain anchor: the tag of the most recently PUSHED entry, valid\n * only while that entry is still the top of the undo stack with nothing in\n * between — any undo/redo/clear or non-coalesced push breaks the chain.\n */\n private lastCoalesce: CoalesceTag | null = null;\n\n private readonly listeners = new Set<(depths: HistoryDepths) => void>();\n private lastDepths: HistoryDepths = Object.freeze({ undoDepth: 0, redoDepth: 0 });\n\n constructor(options: HistoryKernelOptions = {}) {\n const { limit = HISTORY_LIMIT_DEFAULT, enabled = true, debug = false } = options;\n if (!Number.isInteger(limit) || limit < 1) {\n throw new RangeError(`history limit must be a positive integer (got ${String(limit)})`);\n }\n this.limit = limit;\n this.enabled = enabled;\n this.debug = debug;\n }\n\n /** Open a transaction; nested calls join the outer one (depth-counted). */\n begin(label?: string): void {\n if (!this.enabled) return;\n if (this.txDepth === 0) {\n this.txCommands = [];\n this.txLabel = label;\n this.txCoalesce = null;\n }\n this.txDepth++;\n }\n\n /**\n * Open a coalescing transaction: consecutive transactions with the same\n * `key` within `windowMs` MERGE into the prior stack entry (original before\n * kept, after replaced per slice) — camera drags, timeline play sessions.\n * Nested inside an open transaction it joins the outer one unchanged.\n * `now` is injectable for tests; each merge refreshes the window anchor.\n */\n beginCoalesced(key: string, windowMs: number, now: () => number = Date.now): void {\n if (!this.enabled) return;\n if (this.txDepth === 0) {\n this.txCommands = [];\n this.txLabel = undefined;\n this.txCoalesce = { key, windowMs, time: now() };\n }\n this.txDepth++;\n }\n\n /**\n * Record one value-diff command. Inside a transaction it appends to the\n * pending entry; outside it wraps itself in an implicit single-command\n * transaction. The kernel freezes and stores what it is given.\n */\n record(slice: string, before: unknown, after: unknown): void {\n if (!this.enabled) return;\n if (this.debug) {\n assertSerializable(before, slice);\n assertSerializable(after, slice);\n }\n const command: HistoryCommand = Object.freeze({ slice, before, after });\n if (this.txDepth > 0) {\n this.txCommands.push(command);\n return;\n }\n this.pushEntry({ label: undefined, commands: [command] }, null);\n }\n\n /** Close a transaction; the outermost end() pushes one stack entry. */\n end(): void {\n if (!this.enabled) return;\n if (this.txDepth === 0) throw new Error('HistoryKernel.end() without a matching begin()');\n this.txDepth--;\n if (this.txDepth > 0) return;\n const commands = this.txCommands;\n const label = this.txLabel;\n const coalesce = this.txCoalesce;\n this.txCommands = [];\n this.txLabel = undefined;\n this.txCoalesce = null;\n if (commands.length === 0) return; // empty transaction: no entry\n this.pushEntry({ label, commands }, coalesce);\n }\n\n /**\n * Move the cursor back one entry and return its commands, already inverted\n * (before/after swapped) and in application order (reverse of recorded).\n * Returns null at the bottom of the stack. Does not touch any store.\n */\n undo(): readonly HistoryCommand[] | null {\n if (!this.enabled) return null;\n if (this.txDepth > 0) throw new Error('HistoryKernel.undo() during an open transaction');\n const entry = this.undoStack.pop();\n if (!entry) return null;\n this.redoStack.push(entry);\n this.lastCoalesce = null; // chain broken; a redone entry never re-coalesces\n const inverted: HistoryCommand[] = [];\n for (let i = entry.commands.length - 1; i >= 0; i--) {\n const c = entry.commands[i]!;\n inverted.push(Object.freeze({ slice: c.slice, before: c.after, after: c.before }));\n }\n this.notify();\n return Object.freeze(inverted);\n }\n\n /**\n * Move the cursor forward one entry and return its commands in original\n * application order. Returns null when there is nothing to redo.\n */\n redo(): readonly HistoryCommand[] | null {\n if (!this.enabled) return null;\n if (this.txDepth > 0) throw new Error('HistoryKernel.redo() during an open transaction');\n const entry = this.redoStack.pop();\n if (!entry) return null;\n this.undoStack.push(entry);\n this.lastCoalesce = null;\n this.notify();\n return Object.freeze([...entry.commands]);\n }\n\n peekUndoDepth(): number {\n return this.undoStack.length;\n }\n\n peekRedoDepth(): number {\n return this.redoStack.length;\n }\n\n /** Empty both stacks and any pending transaction (datasetKey swaps). */\n clear(): void {\n this.undoStack.length = 0;\n this.redoStack.length = 0;\n this.txDepth = 0;\n this.txCommands = [];\n this.txLabel = undefined;\n this.txCoalesce = null;\n this.lastCoalesce = null;\n this.notify();\n }\n\n /** Subscribe to depth CHANGES (not every call). Returns an unsubscriber. */\n subscribe(cb: (depths: HistoryDepths) => void): () => void {\n this.listeners.add(cb);\n return () => {\n this.listeners.delete(cb);\n };\n }\n\n /**\n * Push one entry: any new entry clears the redo branch; a coalesce-tagged\n * entry within the window of a still-anchored same-key predecessor merges\n * into it instead (original before kept, after replaced per slice); pushing\n * past the limit evicts the oldest entry.\n */\n private pushEntry(entry: HistoryEntry, tag: CoalesceTag | null): void {\n this.redoStack.length = 0;\n const anchor = this.lastCoalesce;\n if (tag && anchor && anchor.key === tag.key && tag.time - anchor.time <= tag.windowMs) {\n // lastCoalesce is non-null only when the entry that set it is still the\n // top of the undo stack (undo/redo/clear/non-coalesced push all null it).\n const top = this.undoStack[this.undoStack.length - 1]!;\n for (const cmd of entry.commands) {\n // Replace the LAST command for the slice: its `after` is the entry's\n // net result on replay, while the FIRST command's `before` remains\n // the entry's original before — the §16.14 merge contract.\n let i = -1;\n for (let j = top.commands.length - 1; j >= 0; j--) {\n if (top.commands[j]!.slice === cmd.slice) {\n i = j;\n break;\n }\n }\n if (i === -1) {\n top.commands.push(cmd);\n } else {\n const prior = top.commands[i]!;\n top.commands[i] = Object.freeze({ slice: prior.slice, before: prior.before, after: cmd.after });\n }\n }\n this.lastCoalesce = tag; // refresh the window anchor for the next merge\n this.notify();\n return;\n }\n this.undoStack.push(entry);\n if (this.undoStack.length > this.limit) this.undoStack.shift();\n this.lastCoalesce = tag;\n this.notify();\n }\n\n private notify(): void {\n const undoDepth = this.undoStack.length;\n const redoDepth = this.redoStack.length;\n if (undoDepth === this.lastDepths.undoDepth && redoDepth === this.lastDepths.redoDepth) return;\n this.lastDepths = Object.freeze({ undoDepth, redoDepth });\n for (const cb of this.listeners) cb(this.lastDepths);\n }\n}\n","/**\n * §6 GraphInstance — the public headless core instance (v0.3 subset).\n *\n * One `applyHostUpdate` call is the atomic host boundary: it validates,\n * reconciles, re-projects only dirty channels, and publishes EXACTLY ONE store\n * `set()` and AT MOST ONE engine commit, so a simultaneous data + style +\n * controlled-state change can never tear across frames (§6).\n *\n * Vanilla zustand only — no React, no DOM access at module scope (§18).\n */\n\nimport { createStore } from 'zustand/vanilla';\nimport type { StoreApi } from 'zustand/vanilla';\n\nimport type {\n Accessor,\n AcceptedEdge,\n AcceptedGraph,\n AccessibilityConfig,\n AppendReceipt,\n BeginIngestOptions,\n BrushState,\n ClusterSpec,\n CrossfilterSession,\n DimensionSpec,\n DomainPolicy,\n EdgeId,\n ExpansionBatch,\n ExpansionResponse,\n ExpansionService,\n FilterMode,\n FilterSpec,\n GraphDiagnostic,\n GraphEdge,\n GraphEventMap,\n GraphEventName,\n GraphHostUpdate,\n GraphListenerControl,\n GraphNode,\n GraphStoreState,\n GraphTheme,\n GroupBySpec,\n GroupSpec,\n IngestBatch,\n IngestCommitReceipt,\n IngestSession,\n IngestSessionState,\n LabelConfig,\n LabelPlacement,\n LayoutKind,\n MetricName,\n NodeId,\n PathService,\n PathOptions,\n PathResult,\n RenderScene,\n RequestContext,\n ResolvedCluster,\n ResolvedGroup,\n Revisions,\n Scale,\n SearchActivation,\n SearchResult,\n SelectionState,\n SimulationConfig,\n SubgraphSpec,\n ThemeInput,\n TimelinePlayback,\n ViewportState,\n} from './types';\nimport { DIAGNOSTIC_SAMPLE_CAP } from './types';\nimport {\n AcceptanceQueue,\n INGEST_MAX_FLUSH_LATENCY_MS_DEFAULT,\n INGEST_MAX_PENDING_BYTES_DEFAULT,\n INGEST_OVERFLOW_FACTOR,\n baseFromAccepted,\n baseFromContribution,\n estimateBatchBytes,\n mergeDiagnostics,\n mergeModel,\n newContribution,\n newStagingTallies,\n sessionCommitDiagnostics,\n stageBatch,\n} from './ingestion';\nimport type {\n MergeBase,\n MergeResult,\n SessionContribution,\n StagingTallies,\n StampedEdge,\n} from './ingestion';\nimport type {\n EngineCommit,\n EngineConfigUpdate,\n EngineFactory,\n EngineHostEvents,\n GraphEngine,\n} from './engine/index';\nimport type { ErrorPhase, GraphError, GraphOperationError } from './errors';\nimport { OrbitOperationError, graphErrorToError, isFatalGraphError } from './errors';\nimport { validateSnapshot } from './validate';\nimport { Reconciler } from './reconciler';\nimport type { ReconcileResult } from './reconciler';\nimport { parseColor, projectColors, projectSizes } from './projection';\nimport type { RGBA } from './projection';\nimport { dedupeFirstOccurrence, orderByAcceptedBase, toggleId, unionIds } from './selection';\nimport { buildAdjacency, neighborsOf } from './adjacency';\nimport type { Adjacency } from './adjacency';\nimport { EdgePickingFacade, medianLinkWidthPx } from './edgePicking';\nimport type { EdgePickRoute } from './edgePicking';\nimport {\n LABEL_MAX_VISIBLE_CAP,\n LABEL_MAX_VISIBLE_DEFAULT,\n selectLabelCandidates,\n} from './labels';\nimport type { LabelCandidate, LabelCandidateViewport, SelectLabelCandidatesArgs } from './labels';\nimport { buildAcceptedAdjacency, cascadeEdges, resolveScope } from './scope';\nimport {\n PendingExpansions,\n admitServiceResult,\n createLocalExpansionService,\n createRequestContext,\n serviceCacheKey,\n} from './services';\nimport type { RequestContextHandle, RevisionSnapshot } from './services';\nimport { computePathEmphasis, createLocalPathService } from './pathService';\nimport { createLocalSearchService } from './search';\nimport type { SearchService } from './search';\nimport { nextSynthesizedEdgeId } from './edgeIdentity';\nimport type { EdgePairCounters } from './edgeIdentity';\nimport {\n canonicalFilterKey,\n compileEdgeFilter,\n compileNodeFilter,\n resolveFilterField,\n validateFilterExpr,\n} from './filter';\nimport type { CompiledFilter } from './filter';\nimport {\n CATEGORICAL_PALETTE,\n canonicalScaleKey,\n categoricalIndex,\n categoricalRows,\n computeNumericDomain,\n divergingColor,\n DomainStore,\n sequentialColor,\n sequentialSize,\n} from './scale';\nimport { coerceNumeric } from './hygiene';\nimport { MetricStore } from './metrics';\nimport {\n CLUSTER_FORCE_DEGRADATION_REASON,\n normalizeCommitForCapabilities,\n resolveEnginePolicy,\n} from './capabilityPolicy';\nimport type { EnginePolicy } from './capabilityPolicy';\nimport { clusterCentroids, deriveClusters, resolveClusterCenters } from './clusters';\nimport type { ClusterDerivation } from './clusters';\nimport { ImageAtlasPipeline } from './imageAtlas';\nimport type { ImageAtlasBatch, ImageResolver } from './imageAtlas';\nimport { SoftMask } from './mask';\nimport type { MaskSource } from './mask';\nimport {\n buildRepForest,\n collapseParallelEdges,\n deriveGroupsByKey,\n metaEdgeWidthFor,\n PHYSICAL_DEFAULT_LINK_WIDTH,\n PHYSICAL_DEFAULT_POINT_SIZE,\n resolveManualGroups,\n rewriteGroups,\n sameGroupBySpec,\n sameGroupSpecArrays,\n sameResolvedGroups,\n sceneGroupsOf,\n sceneLinkRefAt,\n scenePointRefAt,\n superNodeSizeFor,\n validateGroupBySpec,\n validateGroupSpecs,\n} from './groups';\nimport type { FoldRecord, GroupRewrite } from './groups';\nimport { renderSvg, SVG_MAX_ELEMENTS_DEFAULT } from './svgExport';\nimport { sameDataRef, validateViewState } from './viewState';\nimport type {\n GraphViewState,\n SerializableScale,\n SetViewStateResult,\n ViewBrushState,\n ViewStyling,\n} from './viewState';\nimport type { JsonValue } from './types';\nimport { TypedColumnCrossfilter } from './crossfilter';\nimport { HistoryKernel } from './history';\nimport type { HistoryCommand, HistoryDepths } from './history';\n\n// ---------------------------------------------------------------------------\n// §8 theme resolution (S10-T04). The `theme` prop accepts a full GraphTheme,\n// a Partial over a named base, or the v0.1 `{background}` shorthand (which is\n// just a one-key partial over the default dark base).\n// ---------------------------------------------------------------------------\n\n/** §8 dark base theme (the default when no base is named). */\nexport const GRAPH_THEME_DARK: GraphTheme = Object.freeze({\n background: '#0b0e14',\n nodeDefault: '#94a3b8',\n edgeDefault: 'rgba(255,255,255,0.15)',\n labelFg: '#e6e9f0',\n accent: '#3b82f6',\n mutedAlpha: 0.15,\n});\n\n/** §8 light base theme. */\nexport const GRAPH_THEME_LIGHT: GraphTheme = Object.freeze({\n background: '#ffffff',\n nodeDefault: '#475569',\n edgeDefault: 'rgba(15,23,42,0.18)',\n labelFg: '#0f172a',\n accent: '#2563eb',\n mutedAlpha: 0.2,\n});\n\n/**\n * Resolve a ThemeInput to a full GraphTheme (§8): pick the named base\n * (default dark), then merge every defined token over it. A full GraphTheme\n * input resolves to exactly its own tokens; `undefined` resolves to the dark\n * base; the v0.1 `{background}` compat shorthand merges as a partial.\n */\nexport function resolveTheme(input?: ThemeInput): GraphTheme {\n const base =\n input !== undefined && (input as { base?: 'light' | 'dark' }).base === 'light'\n ? GRAPH_THEME_LIGHT\n : GRAPH_THEME_DARK;\n if (input === undefined) return base;\n const out: GraphTheme = { ...base };\n if (input.background !== undefined) out.background = input.background;\n if (input.nodeDefault !== undefined) out.nodeDefault = input.nodeDefault;\n if (input.edgeDefault !== undefined) out.edgeDefault = input.edgeDefault;\n if (input.labelFg !== undefined) out.labelFg = input.labelFg;\n if (input.accent !== undefined) out.accent = input.accent;\n if (input.mutedAlpha !== undefined) out.mutedAlpha = input.mutedAlpha;\n return out;\n}\n\nfunction sameTheme(a: GraphTheme, b: GraphTheme): boolean {\n return (\n a.background === b.background &&\n a.nodeDefault === b.nodeDefault &&\n a.edgeDefault === b.edgeDefault &&\n a.labelFg === b.labelFg &&\n a.accent === b.accent &&\n a.mutedAlpha === b.mutedAlpha\n );\n}\n\n// ---------------------------------------------------------------------------\n// §11 scale-info surface (S10). v0.8 tier: categorical rows carry TOTAL\n// counts over the accepted model — not mask-aware, not scope-aware (a\n// mask-aware \"filtered\" second count is a later-tier follow-up).\n// ---------------------------------------------------------------------------\n\n/** One categorical legend row (§11): declared-domain rows first (including\n * currently-empty categories), then extra seen values sorted. */\nexport interface ScaleInfoRow {\n value: string;\n /** TOTAL occurrences over the accepted model (v0.8 tier: not mask-aware). */\n count: number;\n /** Palette slot from `categoricalIndex` (-1 = empty palette). */\n colorIndex: number;\n}\n\n/** `getScaleInfo` payload: the active Scale descriptor plus its resolved\n * numeric domain (sequential/diverging) or legend rows (categorical). */\nexport interface ScaleChannelInfo<N = Record<string, unknown>> {\n scale: Scale<string, N> | Scale<number, N>;\n /** Resolved numeric domain; omitted while unresolvable (no data/metric). */\n domain?: readonly [number, number];\n /** Categorical rows; omitted for sequential/diverging scales. */\n rows?: readonly ScaleInfoRow[];\n}\n\n/** §9.2 revision-aware service seam (expansion since v0.5, search since S11). */\nexport interface GraphServices<N = Record<string, unknown>, E = Record<string, unknown>> {\n /**\n * Ego-expansion resolver for `expandNode` / `SubgraphSpec.hops`. Default:\n * the built-in LOCAL service — it walks the core's §7.1 adjacency over the\n * accepted model, INCLUDING currently out-of-scope nodes (zero config,\n * zero network; the core still never fetches).\n */\n expansion?: ExpansionService<N, E>;\n /**\n * §16.2 path resolver for `findPath`. Default: the built-in LOCAL\n * unweighted BFS over the loaded VISIBLE edge list, respecting\n * PathOptions.direction. Revision-aware: a result arriving after a\n * dataset replacement is discarded at admission (S12-T08).\n */\n path?: PathService;\n /**\n * §16.5 search resolver for `instance.search`. Default: the built-in LOCAL\n * indexed service over the accepted model plus the host's declared\n * `searchIndex` fields (id-only when never declared — it never guesses\n * attr names; zero config, zero network). Custom services plug in\n * server-side search (Omnigraph B.7) with the same instance-side\n * correctness: RequestContext, revision-keyed caching, supersede\n * cancellation, stale rejection at admission.\n */\n search?: SearchService<N>;\n}\n\nexport interface CreateGraphInstanceOptions<\n N = Record<string, unknown>,\n E = Record<string, unknown>,\n> {\n /** Called once per mount; a re-attach constructs a fresh engine (§6). */\n engine: EngineFactory;\n /** Fit the camera once when the first data-bearing commit reaches a fresh engine. Default true. */\n fitViewOnFirstData?: boolean;\n /** §9.2 revision-aware services (expansion + §16.5 search). */\n services?: GraphServices<N, E>;\n /**\n * §16.5 node attr fields the DEFAULT search service indexes (ids always;\n * absent = id-only — the service never guesses attr names). CONSTRUCTION-\n * ONLY per the spec's host construction options (D7): read once here;\n * changing it requires a keyed remount / replacement instance. A runtime\n * `applyHostUpdate` attempt is ignored with a one-shot warning.\n */\n searchIndex?: readonly string[];\n /**\n * §16.14 undo/redo (S9-T20). Default true. `false` makes the history\n * surface inert (record/undo/redo no-ops, depths stay 0); an object sets\n * the stack bound (default {@link HISTORY_LIMIT_DEFAULT} entries).\n */\n history?: boolean | { limit?: number };\n /**\n * §8 image-atlas resolver seam (S10): owns authenticated fetch/caching for\n * one `nodeImage` ref. Default: plain `fetch(ref)` for public URLs.\n * Injectable for tests and authenticated hosts.\n */\n imageResolver?: ImageResolver;\n}\n\n/**\n * `expandNode` outcome (§9.2/§16.3):\n * - `{ added }` — the admitted result merged; `added` counts the nodes it\n * made newly visible in the current scope.\n * - `{ noop: true }` — every returned neighbor was already visible in the\n * current scope (T17); no session was opened, nothing changed.\n * - `{ coalesced: true }` — reserved. v0.5 same-id coalescing hands the\n * SECOND caller the IDENTICAL in-flight promise, so both callers observe\n * the primary call's `{added}`/`{noop}` result instead of this marker.\n */\nexport type ExpandNodeResult = { added: number } | { coalesced: true } | { noop: true };\n\n/**\n * §9.2 expansion bookkeeping: one committed expansion overlay. Data-merging\n * batches carry the request id (overlayId + batch ids) and provenance into\n * ingestion so abort, rollback, and removeOverlay remove the exact\n * contribution they own.\n */\nexport interface ExpansionOverlayRecord {\n overlayId: string;\n requestId: string;\n /** Node ids this expansion revealed into the visible scope. */\n revealedIds: readonly NodeId[];\n /** Service-supplied provenance (single-response or stream header). */\n provenance?: unknown;\n}\n\n/**\n * §16.3 T03 expansion record (R-16.3-04): one per SESSION-path expandNode —\n * the {expandedId, addedNodeIds} entry retractExpansion pops. `addedNodeIds` are\n * the ids the expansion ASSERTS into the effective set: newly revealed ids\n * plus returned ids whose presence is itself expansion-made (listed by\n * another live record), so a node added by two expansions is owned by both\n * records and survives collapsing either. SESSION-LOCAL by contract\n * (R-16.3-08): module-local state only — never a store slice, never\n * serialized into view state (GraphViewState lands in S15; records must stay\n * out of it). They DO interleave with the §16.14 undo stack as 'expansion'\n * steps (serializable value diffs of the effective-set state).\n */\ninterface ExpansionRecord {\n expandedId: NodeId;\n addedNodeIds: readonly NodeId[];\n /** Owning overlay — removed wholesale when a collapse leaves no survivor\n * (the v0.5 explicit-removal contract, §7.5). */\n overlayId: string | null;\n}\n\n/** Serializable §16.14 'expansion'-slice payload (see ExpansionRecord). */\ninterface ExpansionStatePlain {\n records: { expandedId: NodeId; addedNodeIds: NodeId[]; overlayId: string | null }[];\n removed: NodeId[];\n extras: NodeId[];\n}\n\n/**\n * §14 overlay label lane subscriptions. Two channels with distinct cadences:\n * - `subscribeCandidates` fires ONLY when the candidate SET (ids/text/forced)\n * changes — the throttled re-rank. React re-renders label content here.\n * - `subscribePositions` fires on scheduler ticks (host `onFrame`) with fresh\n * x/y for the SAME set — imperative transform writes, NO React re-render.\n * Both replay the current state synchronously on subscribe. The emitted array\n * and its placement objects are REUSED across position ticks — copy if you\n * need a snapshot.\n */\nexport interface LabelSubscriptions {\n subscribeCandidates(cb: (list: readonly LabelPlacement[]) => void): () => void;\n subscribePositions(cb: (list: readonly LabelPlacement[]) => void): () => void;\n}\n\nexport interface GraphInstance<N = Record<string, unknown>, E = Record<string, unknown>> {\n /** Vanilla zustand store — the single observable state surface (§6.3). */\n readonly store: StoreApi<GraphStoreState>;\n\n /** §14 DOM label lane (overlay scheduler output). */\n readonly labels: LabelSubscriptions;\n\n /** Atomic host transaction: one store publication, at most one engine commit (§6). */\n applyHostUpdate(update: GraphHostUpdate<N, E>): void;\n\n /**\n * §7.5 revisioned ingestion: begin a bounded, cancellable session against an\n * explicit `datasetKey` and `baseModelRevision` (compare-and-set; mismatch\n * throws 'stale-revision'). Overlay sessions must name the CURRENT\n * datasetKey; replace sessions may establish a new one and are always\n * atomic.\n *\n * T16 rule: while a declarative data source is actively driving (a snapshot\n * was applied through `applyHostUpdate` and has not been superseded by a\n * committed replace session), `purpose:'replace'` is rejected at begin with\n * a TypeError — two writers may not race for the base. Overlay ingestion\n * stays allowed alongside a declarative base.\n *\n * Every session admission/publication is serialized through the\n * instance-local acceptance queue; arrival there is the global admission\n * order (§7.5).\n */\n beginIngest(opts: BeginIngestOptions): IngestSession<N, E>;\n\n /**\n * §7.5: atomically remove exactly one committed overlay — re-runs collision\n * and endpoint resolution, promotes formerly shadowed rows from surviving\n * overlays, advances model/render revisions, and releases the overlayId for\n * deliberate reuse. Unknown ids are an idempotent `{ removed: false }`.\n */\n removeOverlay(overlayId: string): { removed: boolean };\n\n /** Committed overlay ids for the current dataset (§7.5). */\n getOverlayIds(): readonly string[];\n\n attach(container: HTMLElement): Promise<void>;\n detach(): void;\n destroy(): void;\n\n /**\n * §15 typed events: listeners run SYNCHRONOUSLY in registration order; the\n * control's preventDefault() cancels ONLY the built-in follow-up (click\n * selection, drag pin), never other listeners.\n */\n on<K extends GraphEventName>(\n name: K,\n cb: (payload: GraphEventMap<N, E>[K], control: GraphListenerControl) => void,\n ): () => void;\n\n // --- camera ---\n fitView(): void;\n zoomIn(): void;\n zoomOut(): void;\n setViewport(v: Partial<ViewportState>): void;\n\n /**\n * §16 focus neighborhood (T10): keep the v0.1 camera behavior\n * (setFocusedIndex + zoomToIndex) and RETURN the 1-hop neighbor ids\n * (engine adjacency when available, else the core CSR adjacency).\n *\n * Documented compromise: the engine exposes ONE highlight channel until S10\n * styling lands, so the neighbor ring is pushed through setSelectedIndices\n * ONLY when that cannot lie about real selection state — selection empty\n * and uncontrolled. The ring is a visual, never a store write; the next\n * selection push overwrites it. Opt out via `highlightNeighbors: false`.\n * `hops` is reserved at 1 until multi-hop lands.\n */\n focusNode(id: NodeId, opts?: { highlightNeighbors?: boolean; hops?: 1 }): readonly NodeId[];\n /**\n * §14/§15 typed context-menu channel, opened from a DOM presenter. Label\n * divs are `pointerEvents: 'auto'` by design (click-to-focus), so a\n * right-click on one never reaches the engine canvas — without this seam\n * the nodes prominent enough to carry labels are exactly the ones whose\n * right-click falls through to the browser's native menu. Emits the SAME\n * 'contextMenu' event the canvas gesture produces; `screen` is\n * container-relative CSS px (the §15 payload contract). Unknown ids are a\n * silent no-op (a stale label racing a model swap is data, not an error).\n */\n requestNodeContextMenu(id: NodeId, screen: readonly [number, number]): void;\n\n // --- selection (ownership per §6.4; set algebra per §16.2) ---\n setSelection(ids: readonly NodeId[] | SelectionState): void;\n selectNodes(ids: readonly NodeId[]): void;\n selectEdges(ids: readonly EdgeId[]): void;\n /** §16.2 group namespace (S12-T02): validate against the CURRENT resolved\n * groups (unknown ids dropped, duplicates collapse) and store in\n * groups-array order — the group analog of accepted-base ordering. Never\n * touches the node/edge namespaces; the group namespace is always\n * instance-owned (§6.4 controlled selection covers nodes only). */\n selectGroups(ids: readonly string[]): void;\n /** Expand to the 1-hop neighborhood of `id` (or of the current selection). */\n selectNeighbors(id?: NodeId): void;\n selectAll(): void;\n invertSelection(): void;\n clearSelection(): void;\n\n /**\n * §16.2 lasso (S6-T05): resolve the SCREEN-coordinate polygon to node ids\n * via `engine.pointsInPolygon`, drop hidden ids, then replace (default) or\n * union (`additive`) the node selection through the same §6.4 ownership\n * path as every other mutator (controlled → intent only). Returns the\n * resolved lasso ids (accepted-base order) regardless of ownership; empty\n * when the engine is not ready or lacks `pointsInPolygon`.\n */\n selectWithinPolygon(\n screenPolygon: readonly [number, number][],\n opts?: { additive?: boolean },\n ): readonly NodeId[];\n\n // --- edge picking (S6-T07). The route is fixed once per mount at ready\n // from `capabilities.linkPicking`: native adapters emit edge events from\n // host events; on the fallback route the binding calls the samplers below\n // on the shared §15 pointer throttle cadence. ---\n /** Pure fallback-route query: the accepted edge within pick tolerance of a\n * SCREEN point. Null on the native route, while picking is disarmed (sim\n * hot), or when nothing is in range. */\n pickEdgeAt(screen: readonly [number, number]): AcceptedEdge<E> | null;\n /** Fallback-route hover sample: writes `hover.edgeId` and emits 'edgeHover'\n * on transitions (identical payloads to the native route). No-op (null) on\n * the native route. */\n sampleEdgeHover(screen: readonly [number, number]): AcceptedEdge<E> | null;\n /** Fallback-route click resolution: emits 'edgeClick' when a link is within\n * tolerance. No-op (null) on the native route. */\n sampleEdgeClick(screen: readonly [number, number]): AcceptedEdge<E> | null;\n\n // --- hide/pin slices (§16.3) ---\n hideNodes(ids: readonly NodeId[]): void;\n showNodes(ids: readonly NodeId[]): void;\n showAll(): void;\n pinNode(id: NodeId, xy?: readonly [number, number]): void;\n unpinNode(id: NodeId): void;\n clearPins(): void;\n /** §16.3 PERSISTENT pins (S12-T09): pin ids AT THEIR CURRENT POSITION via\n * engine.setPinnedIndices — no position payload in v0.10. Independent of\n * transient drag pinning (`pins`): the engine receives the UNION of both\n * slices, so releasing a drag pin leaves a persistent pin held. §6.4\n * ownership mirrors groups: once the host supplies `pinnedNodeIds` (null\n * included) the ops fire the 'pinnedChange' intent instead of writing.\n * Unknown ids drop; departed ids prune through the ownership path on\n * model changes (R-16.3-25). */\n pinNodes(ids: readonly NodeId[]): void;\n /** Release persistent pins (see {@link pinNodes}); unpinned ids no-op. */\n unpinNodes(ids: readonly NodeId[]): void;\n\n // --- §16.3 group operations (S12-T02/T04) — the §6.4 groups slice\n // mutators. Uncontrolled (no `groups` prop ever received): they write the\n // instance-owned groups state through the SAME validate → resolve →\n // rewrite lane as the prop (one publish, at most one commit) and fire\n // 'groupsChange' with the resolved array. Controlled (the prop was\n // provided at least once): they compute the next array and fire the\n // 'groupsChange' INTENT instead of writing — the host reflects it back.\n // Under `groupBy`, membership is derived and READ-ONLY: groupNodes/\n // ungroup are documented config errors (dev-mode warning diagnostic,\n // no-op); setGroupCollapsed is the ONE allowed op and toggles the\n // per-derived-KEY collapsed residue (R-16.3-15/16). ---\n /** Add one group definition (same §16.3 acyclic/singly-parented validation as the\n * `groups` prop — a violating spec is ONE 'config-error' and a no-op). */\n groupNodes(spec: GroupSpec): void;\n /** Remove one group definition; its id prunes from SelectionState.groupIds\n * through the ownership path. Unknown ids no-op (dev-mode warning). */\n ungroup(groupId: string): void;\n /** Collapse/expand one group as a §7.2 structural diff. Works on manual\n * groups AND groupBy-derived groups (the residue toggle). Same-value\n * calls are exact no-ops (zero publishes, zero commits). */\n setGroupCollapsed(groupId: string, collapsed: boolean): void;\n\n // --- §16.3 node folds — the THIRD entry point into the same stage-3\n // containment rewrite. Where a collapsed group hides its members behind a\n // SYNTHETIC super-node, a fold makes an EXISTING node stand for its own\n // neighbourhood: the anchor keeps its row and its position, its members\n // hide, and their outside edges reroute to it as counted meta-edges.\n // Instance-owned and uncontrolled (no `folds` prop) — the pins precedent. ---\n /**\n * Folds `id`'s neighbourhood into `id`. Members default to the anchor's\n * neighbours in the CURRENT render model that no representative has\n * claimed yet — first fold wins, so folding two adjacent hubs never fights\n * over a shared neighbour and never needs a leaf-only restriction. Pass\n * `memberIds` to fold an explicit set instead (unknown ids and ids already\n * claimed elsewhere drop; an id that is an ANCESTOR of the anchor is\n * rejected, since that would close a containment cycle).\n *\n * One publish and at most one structural commit (E1). A no-member fold is\n * an exact no-op. Records a §16.14 'folds' history step.\n */\n foldNode(id: NodeId, opts?: { memberIds?: readonly NodeId[] }): void;\n /** Unfolds `id`, returning its members to the scene as a §7.2 structural\n * diff. Unknown or unfolded ids are exact no-ops. */\n unfoldNode(id: NodeId): void;\n /** The members `id` currently stands for, or null when it is not folded.\n * Membership is the DECLARED set — members that have since left the model\n * are reported but simply do not draw. */\n getFold(id: NodeId): { memberIds: readonly NodeId[] } | null;\n\n // --- §16.3 stage-4 clusters (S12-T06/T07) ---\n /** Current stage-4 clusters over the physical scene: ordered keys, member\n * ids, the force center labels anchor to while hot, and the settled\n * centroid (null until a §7.1 readback or a fixed-layout commit). Empty\n * when no `clusters` spec is active. Clusters synthesize nothing — the\n * scene is byte-identical with and without a spec (R-16.3-17/19). */\n getClusters(): readonly ResolvedCluster[];\n /** R-16.3-18: resolve a cluster (by key) to its MEMBER node ids and write\n * them into SelectionState.nodeIds through the standard §6.4 ownership\n * path — clusters have no id namespace of their own in selection.\n * `additive` unions with the current node selection. Unknown keys no-op. */\n selectCluster(key: string, opts?: { additive?: boolean }): void;\n\n // --- §9.2 hard scope + expansion ---\n /**\n * §9.2 isolate: hard-scope the graph to the CURRENT node selection —\n * `subgraph: { seedIds: selection.nodeIds }` through the SAME path as the\n * host-update prop. No-op when nothing is selected. Ownership note (v0.5):\n * `subgraph` is UNCONTROLLED-ONLY — always instance-owned; the prop and\n * this method write the same state, last writer wins.\n */\n isolateSelection(): void;\n /** §9.2: clear the hard scope (`subgraph: null`) — the full accepted model\n * returns with cached positions (§9.4-style identity for kept ids). */\n resetIsolation(): void;\n /**\n * §9.2/§16.3 ego-expansion of `id` (default 1 hop) through the configured\n * ExpansionService. The result is gated by admission (declared revision\n * dependencies + dataset lineage + seed existence — abort is only an\n * optimization) and merges through ONE awaited atomic overlay\n * IngestSession carrying the request id; a discard/rejection leaves the\n * graph untouched ('service-aborted' info / 'service-error' error\n * diagnostic; the promise rejects, the 'error' event never fires). Within\n * one valid scope revision a second same-id call while one is in flight\n * returns the IDENTICAL promise (one service call serves both); distinct\n * ids run concurrently. Under an active hard scope, revealed neighbors\n * join the resolved scope (accretion) in the same commit.\n */\n expandNode(id: NodeId, opts?: { hops?: number }): Promise<ExpandNodeResult>;\n /**\n * Undoes `id`'s own expansions — the navigation Back button, NOT a\n * containment operation. Aborts `id`'s pending expansion AND explicitly\n * removes the overlays its past expansions committed (plus their scope\n * accretion). Committed overlay DATA otherwise persists per §7.5 until\n * removeOverlay / a replacing snapshot; this IS that explicit removal for\n * expansion overlays.\n *\n * On a node that was never expanded from, this does nothing — there is no\n * record to pop. To hide a node's neighbourhood behind it on a freshly\n * loaded graph, that is {@link foldNode}: one word for containment, a\n * different word for navigation history.\n */\n retractExpansion(id: NodeId): void;\n /** §9.2 expansion bookkeeping for `id`: committed overlay records with\n * request id, provenance, and the ids each expansion revealed. */\n getExpansionOverlays(id: NodeId): readonly ExpansionOverlayRecord[];\n\n // --- §16.5 search (S11-T06/T07) ---\n /**\n * Run the configured SearchService (default: the built-in local indexed\n * service). The instance creates the `RequestContext`, caches results by\n * `serviceCacheKey` over EXACTLY the service's declared revision\n * dimensions ({@link SEARCH_CACHE_LIMIT}-entry LRU; a second call with an\n * equal key while one is in flight coalesces onto the same service call),\n * cancels superseded work (a NEWER query aborts the older in-flight call —\n * the older promise rejects `OrbitOperationError {code:'aborted'}`), and\n * rejects stale results at admission (declared revision drift or dataset\n * lineage change → the same typed 'aborted' rejection with a distinct\n * staleness message; the store is untouched). A successful search\n * publishes `store.search = {query, results}` — `node` populated for\n * in-model ids — in ONE store publication. Search NEVER changes\n * scope/filter semantics and never fetches graph data (§16.5).\n */\n search(query: string, opts?: { limit?: number }): Promise<readonly SearchResult<N>[]>;\n /** Clear `store.search` to null (e.g. the <GraphSearch> input emptied). */\n clearSearch(): void;\n /** §16.2 path query + atomic emphasis (S12-T08): resolves via the path\n * service (local BFS default); null = unreachable (a RESULT). Emphasis is\n * session-local — released by clearPath, any selection mutation, undo/\n * redo, or a scene rebuild; never a history step; never serialized. */\n findPath(sourceId: NodeId, targetId: NodeId, options?: PathOptions): Promise<PathResult | null>;\n clearPath(): void;\n getActivePath(): PathResult | null;\n /**\n * §16.5 result contract (T07): a result id in the current rendered scene\n * AND §9.1 mask-visible is focused (`focusNode`) → `{status:'focused'}`.\n * Otherwise classification ONLY — 'not-loaded' (absent from the accepted\n * model), 'out-of-scope' (in the model but outside the hard scope),\n * 'filtered' (in the scene but mask-hidden). Never mutates scope or\n * filters — the host reacts explicitly (§16.5).\n */\n activateSearchResult(result: SearchResult<N>): SearchActivation;\n\n // --- simulation controls (§16.1 toolbar) ---\n pauseSimulation(): void;\n resumeSimulation(): void;\n isSimulationRunning(): boolean;\n\n /** §16.1 screenshot: delegates to the engine; null when unsupported/not ready. */\n captureScreenshot(): Promise<Blob | null>;\n\n /**\n * §15.1 binding-detected reduced-motion media preference. The EFFECTIVE\n * value is `accessibility.reducedMotion ?? v` — when reduced, camera\n * durations (fitView/setViewport/focusNode) coerce to 0.\n */\n setReducedMotion(v: boolean | undefined): void;\n\n // --- §16.6 crossfilter (S9) ---\n /**\n * The crossfilter session facade, or null until the `crossfilter` prop has\n * configured dimensions over an accepted base. Delegates to the\n * typed-column engine; `setBrush` routes visibility deltas into the §9.1\n * soft mask (buffers-only commit, zero relayout) and resolves after the\n * publish. Brush slot deltas are BASE indices; under a hard scope\n * out-of-scope rows have no scene slot and simply do not mask anything.\n */\n getCrossfilterSession(): CrossfilterSession | null;\n\n // --- §16.6 timeline playback (S9-T10) ---\n /**\n * Play a brush window across a numeric/temporal dimension's domain through\n * the crossfilter mask fast path (zero relayout). One playing dimension at\n * a time — a second play supersedes; a USER `setBrush` on the playing key\n * pauses playback. The whole play session coalesces into ONE history entry.\n */\n playTimeline(key: string, playback?: Partial<TimelinePlayback>): void;\n pauseTimeline(): void;\n\n // --- §16.14 history (S9-T20 wiring) ---\n /** Undo the most recent uncontrolled mutation entry (selection / hidden /\n * pins / scope / brushes). Returns false when there is nothing to undo. */\n undo(): boolean;\n /** Re-apply the most recently undone entry. False when nothing to redo. */\n redo(): boolean;\n\n // --- §16.14 view state (S15 view-state lane) ---\n /**\n * Serialize the exploration state (§16.14): camera, selection, hidden ids,\n * isolation, groups (manual specs verbatim; under `groupBy` only collapsed\n * `{key, collapsed}` pairs — membership recomputes on restore), pins,\n * folds, layout, crossfilter brushes in declaration order, the Scale-valued\n * styling subset, and the host's `dataRef` verbatim. The predicate `filter`\n * and §16.3 expansion records are never serialized. The sync form carries\n * no positions: reproduction is best-effort via the layout descriptor.\n */\n getViewState(opts?: { includePositions?: false }): GraphViewState;\n /**\n * Async form: additionally embeds quantized coordinates for the VISIBLE\n * (post-mask) set, read once from the engine (per-event readback, ADR-001).\n * Restores as a frozen fixed-equivalent — pixel-faithful regardless of\n * engine nondeterminism. Past `maxPositions` (default 100 000) the call\n * rejects `export-materialization-too-large`; persist the layout through\n * the export lane and reference it from `dataRef` instead of inlining.\n */\n getViewState(opts: {\n includePositions: true;\n maxPositions?: number;\n }): Promise<GraphViewState>;\n /**\n * Atomically restore a serialized view (§16.14). NEVER partially applies:\n * structural validation and the version gate run first (reject whole with\n * one 'invalid-view-state' diagnostic); then the dataRef canonical\n * comparison — a mismatch fires the 'viewStateMismatch' event INSTEAD of\n * applying, and restoration proceeds only on an `ignoreMismatch` re-call.\n * The apply is ONE history transaction through the same command appliers\n * undo/redo uses, so a restore is itself undoable. Embedded positions\n * apply as a frozen fixed-equivalent (one replay-style commit, then the\n * simulation pauses — a later explicit layout change or reheat unfreezes).\n * A state touching a §6.4 controlled slice (or styling, once a restore\n * callback exists) resolves 'missing-restore-callback' until the aggregate\n * protocol is registered.\n */\n setViewState(\n raw: unknown,\n opts?: {\n ignoreMismatch?: boolean;\n isDataRefEqual?: (stored: JsonValue | undefined, current: JsonValue | undefined) => boolean;\n },\n ): Promise<SetViewStateResult>;\n\n // --- §16.14 exports (S15 export lane) ---\n /**\n * Picture exports. 'png' delegates to {@link captureScreenshot} (typed\n * rejection when the engine lacks the capability). 'svg' renders the\n * VISIBLE (post-mask) set through the engine-free exporter: one per-event\n * position readback, colors/sizes from the same projectors the commits\n * use, labels from the current candidate set, in space coordinates with a\n * padded viewBox. Above `maxSvgElements` (default 50 000) it rejects\n * `export-too-large` — pass `fallback: 'raster-hybrid'` to instead receive\n * a PNG base layer with a vector label overlay.\n */\n exportImage(format: 'png'): Promise<Blob>;\n exportImage(\n format: 'svg',\n opts?: { maxSvgElements?: number; fallback?: 'raster-hybrid' },\n ): Promise<string>;\n /**\n * Bounded object export of the pinned model: 'visible' (default) is the\n * mask-visible roster with both-endpoint-visible edges; 'accepted' the\n * full model. Rejects `export-materialization-too-large` past `limit`\n * (default 100 000 rows) BEFORE allocating — the stream is the remedy.\n */\n exportData(\n scope?: 'visible' | 'accepted',\n opts?: { limit?: number },\n ): Promise<{ nodes: readonly GraphNode<N>[]; edges: readonly AcceptedEdge<E>[] }>;\n /** Memory-bounded JSONL: one `{\"kind\":\"node\"|\"edge\",\"value\":…}` line per\n * entity over ONE pinned revision — a mid-stream commit never mixes\n * epochs. Closing the generator releases the pin. */\n exportDataStream(scope?: 'visible' | 'accepted'): AsyncGenerator<string, void, undefined>;\n /** Bounded id → [x, y] map from one position readback (§7.1 per-event). */\n exportLayout(opts?: { limit?: number }): Promise<ReadonlyMap<NodeId, readonly [number, number]>>;\n /** Memory-bounded `{\"id\",\"x\",\"y\"}` JSONL over one pinned readback. */\n exportLayoutStream(): AsyncGenerator<string, void, undefined>;\n\n // --- §11/§12 styling reads (S10) ---\n /**\n * §11 legend surface: the active Scale on a styling channel plus its\n * resolved domain (sequential/diverging — resolved through the SAME frozen\n * DomainStore coordinate the projection uses) or categorical legend rows\n * (declared-domain order first including empty categories, then extra seen\n * values sorted; counts are v0.8-tier TOTALS over the accepted model, not\n * mask-aware). Null when the channel is not scale-valued.\n */\n getScaleInfo(channel: 'nodeColor' | 'nodeSize'): ScaleChannelInfo<N> | null;\n /**\n * §12 metric read for one node id via the core id→index map (never a\n * public million-entry Map). Null for unknown ids/metrics and §8-null\n * values; lazily computes the degree family on first use.\n */\n getMetricValue(metric: MetricName, id: NodeId): number | null;\n\n // --- reads ---\n getRevisions(): Revisions;\n getDiagnostics(): readonly GraphDiagnostic[];\n getNode(id: NodeId): GraphNode<N> | undefined;\n /** Accepted edge by id — the symmetric partner of {@link getNode}, and the\n * way a hover/selection consumer resolves `store.hover.edgeId` or\n * `selection.edgeIds` to real records. Undefined for unknown ids. */\n getEdge(id: EdgeId): AcceptedEdge<E> | undefined;\n /** Scene ids that are §9.1 mask-visible (scope ∧ mask), scene order. */\n getVisibleNodeIds(): readonly NodeId[];\n /** Scene roster: scope applied, mask NOT applied — the §15.1 navigator's\n * entry list, which must still LIST masked/hidden nodes and expose their\n * state in text rather than dropping them. */\n getSceneNodeIds(): readonly NodeId[];\n /** §15.1 accessibility config stash (navigator/live-region consumers). */\n getAccessibility(): AccessibilityConfig<N> | undefined;\n}\n\nconst ZOOM_STEP = 1.5;\nconst EMPTY_IDS: readonly NodeId[] = [];\nconst EMPTY_SELECTION: SelectionState = { nodeIds: [], edgeIds: [], groupIds: [] };\nconst EMPTY_PINS: ReadonlyMap<NodeId, readonly [number, number]> = new Map();\nconst EMPTY_PINNED: ReadonlySet<NodeId> = new Set();\nconst EMPTY_HIDDEN: ReadonlySet<NodeId> = new Set();\nconst EMPTY_INDEX: ReadonlyMap<string, number> = new Map();\nconst EMPTY_GROUPS: readonly ResolvedGroup[] = Object.freeze([]);\nconst EMPTY_CLUSTERS: readonly ResolvedCluster[] = Object.freeze([]);\nconst EMPTY_GROUP_SPECS: readonly GroupSpec[] = Object.freeze([]);\nconst EMPTY_FOLD_RECORDS: readonly FoldRecord[] = Object.freeze([]);\nconst EMPTY_FOLD_COUNTS: ReadonlyMap<NodeId, number> = new Map();\nconst EMPTY_OVERLAY_IDS: readonly string[] = [];\nconst EMPTY_EXPANSIONS: ReadonlySet<NodeId> = new Set();\nconst EMPTY_EXPANSION_RECORDS: readonly ExpansionOverlayRecord[] = [];\n/** §13.1: a post-recovery replay reheats gently, not with a full relayout. */\nconst RECOVERY_RESTART_ALPHA = 0.1;\n/** §16.14: consecutive same-dimension brush moves within this window merge\n * into one history entry (scrub/drag coalescing). */\nexport const BRUSH_HISTORY_COALESCE_MS = 500;\n/** §16.6 timeline defaults (S9-T10). */\nexport const TIMELINE_TICK_MS_DEFAULT = 100;\nexport const TIMELINE_STEP_DEFAULT = 0.01;\n/** §16.5 search defaults (S11-T06). */\nexport const SEARCH_LIMIT_DEFAULT = 20;\nexport const SEARCH_CACHE_LIMIT = 32;\n/** A play session coalesces into ONE entry: effectively-infinite window,\n * closed at pause by rotating the session-scoped coalesce key. */\nconst TIMELINE_COALESCE_WINDOW_MS = Number.MAX_SAFE_INTEGER;\n/** Debug builds (vitest/vite dev) run the history serializability walk. */\nconst DEV: boolean = Boolean((import.meta as { env?: { DEV?: unknown } }).env?.DEV);\n/**\n * Injectable clock seam for history coalescing windows — `Date.now` so vitest\n * fake timers (which fake `Date` by default) drive it deterministically.\n */\nconst nowMs = (): number => Date.now();\n/**\n * Mirrors projection.ts's DEFAULT_COLOR_FALLBACK: the base RGBA used to\n * synthesize a color channel when the host never configured an accessor but\n * the §9.1 mask needs an alpha lane to reach the engine.\n */\nconst DEFAULT_RGBA: readonly [number, number, number, number] = [0.66, 0.66, 0.66, 1];\n/** §14 trailing throttle for viewport-driven candidate re-ranks (ms). */\nconst LABEL_RERANK_THROTTLE_MS = 100;\n/** §14 sim-hot degradation: minimum spacing between cache readbacks (ms). */\nconst SIM_HOT_REFRESH_MS = 500;\n\n/** Per-attach engine session; `alive` gates stale mount continuations and\n * stale engine events after detach/destroy. */\ninterface MountSession {\n engine: GraphEngine;\n /** The host container — read for the label lane's viewport cull rect. */\n container: HTMLElement;\n alive: boolean;\n /** fitViewOnFirstData fires once per fresh engine. */\n fitDone: boolean;\n /** §13 edge-picking facade; route fixed ONCE at ready (null pre-ready). */\n edgePicking: EdgePickingFacade | null;\n /** DEF2 §13 capability policy — resolved ONCE per session at ready from\n * the declared capability record (never method sniffing). */\n policy: EnginePolicy | null;\n}\n\ninterface DirtyChannels {\n nodeColor: boolean;\n nodeSize: boolean;\n linkColor: boolean;\n linkWidth: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// §7.5 ingestion session records (instance-internal).\n// ---------------------------------------------------------------------------\n\n/** One admitted append: the idempotency record replays resolve against. */\ninterface IngestEntry {\n batchId: string;\n bytes: number;\n /** Mutated once at settlement (publishedModelRevision / pendingBytes). */\n receipt: AppendReceipt;\n promise: Promise<AppendReceipt>;\n resolve: (r: AppendReceipt) => void;\n reject: (e: unknown) => void;\n settled: boolean;\n}\n\ninterface IngestSessionRecord<N, E> {\n readonly purpose: 'replace' | 'overlay';\n readonly datasetKey: string;\n readonly sourceRevision: number | string | null;\n readonly atomic: boolean;\n /** null for replace sessions. */\n readonly overlayId: string | null;\n readonly maxFlushLatencyMs: number;\n readonly maxPendingBytes: number;\n state: IngestSessionState;\n /** overlayId reserved at the first append/commit reaching the queue (§7.5). */\n reserved: boolean;\n nextSequence: number;\n entries: Map<number, IngestEntry>;\n /** The session tag index: rollback removes exactly these rows (§7.5). */\n contribution: SessionContribution<N, E>;\n tallies: StagingTallies;\n /** Progressive entries whose receipts await the next flush publication. */\n unflushed: IngestEntry[];\n pendingBytes: number;\n flushTimer: ReturnType<typeof setTimeout> | null;\n /** True once any provisional row became public (progressive flush). */\n published: boolean;\n}\n\nfunction sameIds(a: readonly string[], b: readonly string[]): boolean {\n if (a === b) return true;\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n}\n\nfunction sameSelection(a: SelectionState, b: SelectionState): boolean {\n return (\n sameIds(a.nodeIds, b.nodeIds) && sameIds(a.edgeIds, b.edgeIds) && sameIds(a.groupIds, b.groupIds)\n );\n}\n\nfunction sameIdSet(a: ReadonlySet<string>, b: ReadonlySet<string>): boolean {\n if (a === b) return true;\n if (a.size !== b.size) return false;\n for (const id of a) {\n if (!b.has(id)) return false;\n }\n return true;\n}\n\n/** Drop ids missing from `base`; returns the ORIGINAL array when nothing drops. */\nfunction pruneIds(ids: readonly string[], base: ReadonlyMap<string, number>): readonly string[] {\n let anyDropped = false;\n for (const id of ids) {\n if (!base.has(id)) {\n anyDropped = true;\n break;\n }\n }\n return anyDropped ? ids.filter((id) => base.has(id)) : ids;\n}\n\nexport function createGraphInstance<N = Record<string, unknown>, E = Record<string, unknown>>(\n opts: CreateGraphInstanceOptions<N, E>,\n): GraphInstance<N, E> {\n const engineFactory = opts.engine;\n const fitViewOnFirstData = opts.fitViewOnFirstData ?? true;\n\n const store = createStore<GraphStoreState>(() => ({\n status: 'idle',\n revisions: { source: null, model: 0, scope: 0, render: 0, appliedRender: null },\n nodeCount: 0,\n edgeCount: 0,\n selection: EMPTY_SELECTION,\n hover: { nodeId: null, edgeId: null },\n pins: EMPTY_PINS,\n pinnedNodeIds: EMPTY_PINNED,\n hiddenNodeIds: EMPTY_HIDDEN,\n scope: null,\n visible: { nodes: 0, edges: 0 },\n timeline: { playingKey: null },\n history: { undoDepth: 0, redoDepth: 0 },\n pendingExpansions: EMPTY_EXPANSIONS,\n folds: EMPTY_FOLD_COUNTS,\n overlayIds: EMPTY_OVERLAY_IDS,\n groups: EMPTY_GROUPS,\n search: null,\n viewport: null,\n simulationRunning: false,\n theme: resolveTheme(undefined),\n diagnostics: [],\n }));\n\n // --- model state (survives detach; cleared only on datasetKey change) ---\n let reconciler = new Reconciler();\n /** The EFFECTIVE accepted graph: base merged with published overlays (§7.5). */\n let accepted: AcceptedGraph<N, E> | null = null;\n let scene: RenderScene | null = null;\n\n // --- §7.5 ingestion state ---\n /** T01: the instance-local acceptance queue — EVERY state publication\n * (applyHostUpdate, session admissions/flushes/commits/aborts, overlay\n * removals, wave-2 service admissions) routes through it. Arrival order is\n * the global admission order; v0.5 executes synchronously. */\n const acceptanceQueue = new AcceptanceQueue();\n /** The accepted BASE (declarative snapshot or committed replace session),\n * without overlays. `accepted` above is the merged view. */\n let baseAccepted: AcceptedGraph<N, E> | null = null;\n /** Replace-session base edges still awaiting endpoints (§7.5 T05). */\n let basePendingEdges: readonly StampedEdge<E>[] = [];\n /** Who established the base — the T16 replace-vs-declarative gate. */\n let baseSource: 'declarative' | 'session' | null = null;\n const openSessions = new Set<IngestSessionRecord<N, E>>();\n /** Contributions with public rows, in first-publication order (merge sorts\n * rows by admission ticket, so list order is bookkeeping only). */\n let publishedContributions: SessionContribution<N, E>[] = [];\n let committedOverlayIds: readonly string[] = EMPTY_OVERLAY_IDS;\n /** overlayId → owning session (open since first append, or committed). */\n const reservedOverlayIds = new Map<string, IngestSessionRecord<N, E>>();\n let overlayIdSeq = 0;\n /** Accepted edge id → position in accepted.edges (accepted-base order). */\n let edgeIndexById: ReadonlyMap<EdgeId, number> = EMPTY_INDEX;\n /** §13 CSR adjacency, built lazily per accepted model (focus neighborhood\n * fallback when the engine lacks neighborIndices); invalidated on model\n * change. */\n let adjacency: Adjacency | null = null;\n /** Last projected linkWidth buffer — feeds the §13 pick-tolerance median. */\n let lastLinkWidths: Float32Array | null = null;\n\n // --- §9.2 hard scope + expansion state ---\n /** The active hard scope. UNCONTROLLED-ONLY in v0.5: the `subgraph` prop\n * and isolateSelection()/resetIsolation() write this SAME instance-owned\n * state (there is no controlled subgraph mode). */\n let scopeSpec: SubgraphSpec | null = null;\n /** §9.2 scope accretion: ids expansions revealed into the resolved scope.\n * Folded into computeScopedAccepted() on top of the user's SubgraphSpec;\n * reset by an explicit subgraph statement or a replacing snapshot/session. */\n const scopeExtraIds = new Set<NodeId>();\n /** The scoped subset fed to the reconciler; null = full scope (§9.2). */\n let scopedAccepted: AcceptedGraph<N, E> | null = null;\n /** §7.1 CSR adjacency of the EFFECTIVE accepted model — the cache point for\n * scope resolution and the built-in local expansion service. Lazy;\n * invalidated on every accepted-model change (never by scope changes). */\n let acceptedAdjacency: Adjacency | null = null;\n /** §9.2 in-flight-expansion ledger (coalescing + collapse abort). */\n const expansionLedger = new PendingExpansions();\n /** id → the in-flight promise same-id callers coalesce onto (§9.2). */\n const expansionPromises = new Map<NodeId, Promise<ExpandNodeResult>>();\n /** requestId → abort handle for the in-flight service call. */\n const expansionHandles = new Map<string, RequestContextHandle>();\n /** requestId → external rejector (collapse/destroy settle the caller\n * promise immediately; the late service completion is then discarded). */\n const expansionRejectors = new Map<string, (e: unknown) => void>();\n /** Root id → overlays its expansions committed (§16.3 collapse scope). */\n const expansionOverlays = new Map<NodeId, ExpansionOverlayRecord[]>();\n /** §16.3 T03 record stack (see ExpansionRecord): session-local, module-\n * local only — never a store slice, never serialized. Ordered oldest →\n * newest; retractExpansion(id) pops the NEWEST record whose expandedId is id. */\n let expansionRecords: ExpansionRecord[] = [];\n /** §16.3 T03 effective-set exclusions: accepted-model ids a collapse\n * removed from the DISPLAYED set while their data persists (§7.5).\n * Folded into computeScopedAccepted (with or without a hard scope); reset\n * by an explicit subgraph statement and a dataset swap; pruned when the\n * referenced nodes depart the accepted snapshot (R-16.3-06/09). */\n const effectiveRemovedIds = new Set<NodeId>();\n /** T12 pinned accretion: previously-placed ids held still while an\n * expansion settles; released to just user pins on the next simulationEnd. */\n let accretionPinIds: ReadonlySet<NodeId> | null = null;\n /** §9.2 expansion resolver (caller-supplied or the built-in local walk). */\n const expansionService: ExpansionService<N, E> =\n opts.services?.expansion ??\n createLocalExpansionService<N, E>(() => {\n if (accepted === null) {\n throw new OrbitOperationError(\n { code: 'aborted', cause: 'no accepted base' },\n 'expansion requires an accepted base dataset (§9.2)',\n );\n }\n return { accepted, adjacency: acceptedAdjacencyOf() };\n });\n\n // --- §16.5 search state (S11-T06) ---\n /** Host-declared attr fields the DEFAULT search service indexes (ids\n * always); undefined = id-only. CONSTRUCTION-ONLY (D7): read once from\n * the options — a runtime change requires a keyed remount. */\n const searchIndexFields: readonly string[] | undefined = opts.searchIndex;\n /** §16.14 dataRef: host-owned durable source coordinate, stored VERBATIM\n * and never interpreted; serialized into view states and canonically\n * compared on restore. Update lane is stash-only (no publish, no commit —\n * it affects serialization, not rendering). */\n let dataRef: JsonValue | undefined;\n /**\n * §16.14 aggregate restore protocol (Wave 3): at most ONE staged\n * transaction. Internal commands are HELD (not applied) until every\n * awaited controlled lane arrives from the host with matching values;\n * timeout / divergence / supersession discard the stage with a typed\n * result and the previous scene stays live throughout.\n */\n interface PendingRestore {\n transactionId: string;\n source: 'setViewState' | 'undo' | 'redo';\n commands: readonly HistoryCommand[];\n awaiting: {\n selection?: readonly NodeId[];\n pinnedNodeIds?: readonly NodeId[];\n groups?: readonly GroupSpec[];\n };\n /** Side lanes to run on commit (groups residue, styling, positions,\n * camera for setViewState; cursor publication for history walks). */\n finish: () => void;\n /** History-walk staging: put the cursor back on failure. */\n rollbackCursor?: () => void;\n /** Record the commands as a kernel transaction on commit (setViewState\n * path — history walks were already recorded). */\n recordOnCommit: boolean;\n resolve: (r: SetViewStateResult) => void;\n timer: ReturnType<typeof setTimeout>;\n }\n let pendingRestore: PendingRestore | null = null;\n let restoreTxSeq = 0;\n const RESTORE_ACK_TIMEOUT_MS = 5000;\n\n /** One-shot per channel: styling values dropped from view-state capture\n * (accessor function / GraphTheme object / function-`by` scale) warn once\n * per instance in dev (§16.14). A getter must not publish (D10 inverse),\n * so this is a console warning, not a diagnostic. */\n const viewStateDropWarned = new Set<string>();\n\n /** One-shot D7 guard: the first runtime searchIndex attempt warns. */\n let searchIndexChangeWarned = false;\n\n // --- §16.2 path emphasis state (S12-T08) — SESSION-LOCAL: cleared by any\n // selection mutation, undo/redo, and every scene rebuild; never a history\n // step; never serialized into view state. ---\n /** Link indices dimmed while a path owns the link lane (composed inside\n * composeEdgeAlphaBuffer so every drain preserves the emphasis). */\n let pathDimEdges: ReadonlySet<number> | null = null;\n let activePath: PathResult | null = null;\n /** Supersede token: only the LATEST findPath call may apply emphasis. */\n let pathSeq = 0;\n /** §16.2 path resolver (caller-supplied or the built-in local BFS over the\n * loaded VISIBLE edge list — scoped-out edges are not traversable). */\n const pathServiceImpl: PathService =\n opts.services?.path ??\n createLocalPathService<N, E>(() => ({\n nodes: accepted === null ? [] : accepted.nodes,\n edges: accepted === null ? [] : accepted.edges,\n isEdgeVisible: (id) => {\n if (scene === null) return true; // pre-mount: the loaded set is the base\n const k = sceneLinkIndexOf(id);\n if (k === undefined) return false; // out of scope → not traversable\n return softMask === null || softMask.isEdgeVisible(k);\n },\n }));\n /** Lazy edge-id → SCENE link index (invalidated with the scene; the path\n * base and emphasis both need link-lane indices, not accepted order). */\n let sceneLinkIndexCache: { scene: RenderScene; map: ReadonlyMap<EdgeId, number> } | null = null;\n function sceneLinkIndexOf(id: EdgeId): number | undefined {\n if (scene === null) return undefined;\n if (sceneLinkIndexCache === null || sceneLinkIndexCache.scene !== scene) {\n const map = new Map<EdgeId, number>();\n for (let k = 0; k < scene.edgeIdByIndex.length; k++) map.set(scene.edgeIdByIndex[k]!, k);\n sceneLinkIndexCache = { scene, map };\n }\n return sceneLinkIndexCache.map.get(id);\n }\n /** §16.5 search resolver (caller-supplied or the built-in local index). */\n const searchService: SearchService<N> =\n opts.services?.search ??\n createLocalSearchService<N>(() => ({\n nodes: accepted === null ? [] : accepted.nodes,\n searchIndex: searchIndexFields,\n }));\n /** serviceCacheKey → shared search promise (settled results stay cached;\n * failures evict). Insertion-ordered Map as the LRU. */\n const searchCache = new Map<string, Promise<readonly SearchResult<N>[]>>();\n /** The single in-flight search service call — a newer query aborts it. */\n let searchFlight: {\n key: string;\n handle: RequestContextHandle;\n reject: (e: unknown) => void;\n } | null = null;\n /** Monotonic search() call token: only the LATEST call publishes, so a\n * slow superseded result or a replayed cache hit never clobbers a newer\n * store.search publication. */\n let searchSeq = 0;\n\n // --- §9.1 soft-mask state (S9). ONE SoftMask instance sized to the current\n // scene; sources: 'filter' (the filter prop), 'hidden' (hiddenNodeIds),\n // 'brushes' (crossfilter selection), plus the kernel's internal node→edge\n // cascade. Memberships are REBUILT from their definitions after every\n // structural change (slot indices shift). ---\n let softMask: SoftMask | null = null;\n let maskFilterSource: MaskSource | null = null;\n let maskHiddenSource: MaskSource | null = null;\n let maskBrushSource: MaskSource | null = null;\n /** Active filter prop state. The spec is host CONFIG (like nodeColor): it\n * survives datasetKey changes and re-evaluates against the new scene. */\n let activeFilterSpec: FilterSpec<N, E> | null = null;\n let activeFilterKey: string | null = null;\n let activeFilterMode: FilterMode = 'hide';\n let compiledNodeSelector: CompiledFilter<GraphNode<N>> | null = null;\n let compiledEdgeSelector: CompiledFilter<AcceptedEdge<E>> | null = null;\n /** Scene slots hidden by the filter prop's NODE lane (hide mode only) —\n * feeds the crossfilter external mask without re-running predicates. */\n let filterHiddenNodeSlots: ReadonlySet<number> = new Set();\n /** ONE aggregated 'filter-error' diagnostic per evaluation pass (§9.1). */\n let filterDiags: readonly GraphDiagnostic[] = [];\n /** Unmasked base RGBA buffers cached from projection — masked COPIES go to\n * the engine so a later mask-only drain can rebuild alphas without\n * re-projecting (§9.1 fast path). */\n let basePointColors: Float32Array | null = null;\n let baseLinkColors: Float32Array | null = null;\n /** §8/I5: true when the corresponding base buffer was SYNTHESIZED from the\n * active theme's default token (no accessor configured) rather than\n * projected — a changed theme token must rebuild synthesized bases, never\n * projected ones (mask composition preserves base styling, invariants.md\n * I5). */\n let basePointColorsSynthesized = false;\n let baseLinkColorsSynthesized = false;\n\n // --- §16.3 stage-3 groups state (S12-T01). `groupsSpec` is host CONFIG\n // (like the filter prop): it survives dataset swaps and re-RESOLVES against\n // each accepted model (departed members drop tolerantly — validation\n // guards only the boundary where a NEW array is applied, D4). ---\n /**\n * §16.3 node folds: anchor node id → the members it stands for while\n * folded. Presence IS the folded state — `unfoldNode` deletes the entry.\n *\n * SESSION-LOCAL and instance-owned, like pins and expansion records: there\n * is no `folds` prop, so the §6.4 controlled/uncontrolled duality never\n * arises. Folds live entirely in stage 3 (they feed the representative\n * forest) and deliberately NOT in `effectiveRemovedIds`, whose path\n * cascades edges away — a fold must REROUTE a member's outside edges to\n * its anchor, not delete them.\n */\n const folds = new Map<NodeId, readonly NodeId[]>();\n /** Set by fold ops so the next inner update re-runs the stage-3 rewrite. */\n let pendingFoldsRefresh = false;\n /** Last ACCEPTED manual groups array (violating arrays never land here). */\n let groupsSpec: readonly GroupSpec[] | null = null;\n /** Resolution published as store.groups (membership ∩ accepted model). */\n let resolvedGroups: readonly ResolvedGroup[] = EMPTY_GROUPS;\n /** Current stage-3 output; null = pass-through scene (no collapsed group\n * intersects the render model). Recomputed on EVERY reconcile. */\n let groupRewrite: GroupRewrite<N, E> | null = null;\n /** Stage-5 meta-entity mask source: a super-node passes iff ANY member\n * passes; a meta-edge iff ANY underlying edge passes (§7.6 stage 5). */\n let maskGroupSource: MaskSource | null = null;\n /** At most ONE 'config-error' diagnostic from the last rejected pass. */\n let groupsDiags: readonly GraphDiagnostic[] = [];\n\n // --- §16.3 T02/T04 groups ownership + groupBy lanes. ---\n /** §6.4 ownership: flips to controlled on the FIRST host update carrying\n * `groups` (null included — a clear is still a host statement),\n * permanently. Controlled ops fire the 'groupsChange' intent instead of\n * writing; internal op writes never flip this. */\n let groupsControlled = false;\n /** True while an instance op routes its candidate array through\n * applyHostUpdateInner — distinguishes op writes from host writes. */\n let groupsInternalWrite = false;\n /** §16.3 T04 groupBy lane: host CONFIG like groupsSpec (survives dataset\n * swaps, re-derives per accepted model). `semanticZoom` is validated at\n * the boundary (D4) and STASHED here — T05 band tracking reads it from\n * the §13 viewport-event seam; nothing else consumes it yet. */\n let groupBySpec: GroupBySpec<N> | null = null;\n /** R-16.3-16 store residue: collapsed derived groups keyed by DERIVED KEY\n * (never by id) — survives re-derivation while the key stays alive, drops\n * keys that vanish, and clears on datasetKey change (§5 per-dataset). */\n const groupByCollapsedKeys = new Set<string>();\n /** Derived public id → derived key for the CURRENT derivation (the\n * setGroupCollapsed reverse lookup). */\n let groupByKeyById: ReadonlyMap<string, string> = new Map();\n /** §16.3 semantic-zoom BAND (S12-T05, R-16.3-22): the last threshold the\n * zoom crossed. `null` = no threshold crossed yet, so a zoom that starts\n * BETWEEN the thresholds flips nothing (hysteresis holds from the very\n * first event). Reset when the spec or dataset changes. */\n let semanticZoomBand: 'collapsed' | 'expanded' | null = null;\n /** Set by ops that changed instance-side group inputs (collapsed residue)\n * outside the host-update diff; the next inner update re-resolves. */\n let pendingGroupsRefresh = false;\n /** Forces the next inner update to recompose store.diagnostics after a\n * lane changed outside its own diffing (e.g. a cleared op verdict). */\n let pendingDiagnosticsRefresh = false;\n /** Boundary-rejected groupBy pass (D4), replaced per rejected pass. */\n let groupByDiags: readonly GraphDiagnostic[] = [];\n /** ONE R-16.3-15 conflict diagnostic while groups AND groupBy are both\n * configured — the ERROR wins: neither lane applies until one is removed. */\n let groupsConflictDiags: readonly GraphDiagnostic[] = [];\n /** Latest rejected group op verdict (read-only membership under groupBy,\n * unknown ids, violating specs); cleared by the next applied groups write. */\n let groupsOpDiags: readonly GraphDiagnostic[] = [];\n /** Aggregated accessor-error from the last groupBy derivation pass. */\n let groupsDeriveDiags: readonly GraphDiagnostic[] = [];\n\n // --- §16.3 T09 persistent pins (§6.4 latch mirror of groups) + the\n // parallel-edge grouping toggle (R-16.3-24/25). ---\n /** Flips to controlled on the FIRST host update carrying `pinnedNodeIds`\n * (null included), permanently; op writes never flip it. */\n let pinnedControlled = false;\n /** True while pinNodes/unpinNodes route their candidate through\n * applyHostUpdateInner — distinguishes op writes from host writes (and\n * gates §16.14 recording to uncontrolled OP writes only). */\n let pinsInternalWrite = false;\n /** R-16.3-24 parallel-edge grouping toggle (host lane, stage-3-adjacent\n * rewrite — see composeStage3Rewrite / groups.ts ordering contract). */\n let parallelEdgeGrouping = false;\n /** One-shot latch for the documented INOPERATIVE-toggle diagnostic: when\n * the accepted edge list has zero same-pair multiplicity (edge ids\n * synthesized from (type,source,target)-style dedupe already collapse\n * parallels at ingestion), the toggle warns once and changes nothing. */\n let parallelInoperativeWarned = false;\n\n // --- §16.3 T06/T07 stage-4 clusters. Clusters PRESERVE the scene: this\n // lane never touches `groupRewrite`, the reconciler, or any structural\n // commit — only `config.cluster` (capability-gated) and the §14 overlay\n // anchors (R-16.3-17/19/21). ---\n /** Host CONFIG lane (survives dataset swaps, re-derives per scene). */\n let clusterSpec: ClusterSpec<N> | null = null;\n /** Stage-4 membership over the CURRENT physical scene; null = no spec. */\n let clusterDerivation: ClusterDerivation | null = null;\n /** 2*clusterCount force centers: explicit spec entries over deterministic\n * generation from ordered keys + layout seed (R-16.3-20). */\n let clusterForceCenters: Float32Array | null = null;\n /** 2*clusterCount label anchors — force centers while the sim is HOT, the\n * settled centroids after a §7.1 readback (or at commit under a fixed\n * layout). Overlay ticks READ this; they never scan members (R-16.3-21). */\n let clusterAnchors: Float32Array | null = null;\n /** Whether `clusterAnchors` currently holds settled centroids. */\n let clusterCentroidsSettled = false;\n /** A cluster payload is owed to the engine (membership, centers, or a\n * clear). Consumed by the NEXT commit through `commitToEngine`, so an\n * index-addressed `pointClusters` mapping can never lag the roster it\n * describes (the I2 discipline, shared with `pointImageIndex`). */\n let clusterConfigPending = false;\n /** DEF2: the cluster-force degradation is emitted at most ONCE per mount\n * session, whether the spec was live at mount (policy degradation) or\n * activated later (the frozen mount policy cannot see that). */\n let clusterDegradationEmitted = false;\n /** Aggregated accessor-error from the last stage-4 derivation pass. */\n let clusterDiags: readonly GraphDiagnostic[] = [];\n\n // --- §16.6 crossfilter state (S9-T05..T09 subset). The typed-column engine\n // is built over the ACCEPTED model's nodes (base + published overlays,\n // NEVER the scoped subset): base slot s ↔ accepted.nodes[s], so brushes\n // survive scope changes and out-of-scope rows simply have no scene slot. ---\n let crossfilterSpecs: readonly DimensionSpec<N>[] | null = null;\n let crossfilterEngine: TypedColumnCrossfilter<N> | null = null;\n /** Base row s ↔ accepted.nodes[s].id at (re)build/append time. */\n let crossfilterRowIds: string[] = [];\n /** The EXACT row objects the engine's columns were extracted from. D1/I1:\n * a later publication is a proven pure append iff every prior row is the\n * SAME object (immutable-row contract) — id equality proves nothing about\n * attrs (F10-01). */\n let crossfilterRowsRef: readonly GraphNode<N>[] = [];\n /** BASE slots currently failing at least one brush (selection-hidden). */\n const crossfilterHiddenBase = new Set<number>();\n /** Stable session facade delegating to the CURRENT engine. */\n let crossfilterSessionFacade: CrossfilterSession | null = null;\n\n // --- §16.14 history kernel (S9-T20). Records UNCONTROLLED mutations only;\n // depth changes fold into the NEXT store publication (never a second\n // set()). Cleared on datasetKey change. ---\n const historyOption = opts.history ?? true;\n const historyKernel = new HistoryKernel({\n enabled: historyOption !== false,\n debug: DEV,\n ...(typeof historyOption === 'object' && historyOption.limit !== undefined\n ? { limit: historyOption.limit }\n : {}),\n });\n let pendingHistoryDepths: HistoryDepths | null = null;\n historyKernel.subscribe((depths) => {\n pendingHistoryDepths = depths;\n });\n\n // --- §16.6 timeline playback state (S9-T10) ---\n let timelineTimer: ReturnType<typeof setTimeout> | null = null;\n let timelinePlayingKey: string | null = null;\n /** Rotates per play session: scopes the history coalesce key so one play\n * session = ONE entry, closed at pause. */\n let timelineSessionSeq = 0;\n\n // --- styling & config state (current desired values) ---\n let nodeColor: Accessor<GraphNode<N>, string> | Scale<string, N> | undefined;\n let nodeSize: Accessor<GraphNode<N>, number> | Scale<number, N> | undefined;\n let linkColor: Accessor<AcceptedEdge<E>, string> | undefined;\n let linkWidth: Accessor<AcceptedEdge<E>, number> | undefined;\n let layout: LayoutKind = 'force';\n let simulation: SimulationConfig | undefined;\n /** §8 resolved theme tokens — always defined (dark base by default). */\n let theme: GraphTheme = resolveTheme(undefined);\n /** §16.12 desired arrowheads (capability-gated; inert when unsupported). */\n let edgeArrows = false;\n /** §16.13 link visibility toggle (config-only; default true). */\n let showLinks = true;\n /** §8 image ref accessor (S10). Refs are retained even under a\n * 'placeholder' capability policy (§13). */\n let nodeImage: ((node: GraphNode<N>) => string | null) | undefined;\n let labelsConfig: LabelConfig<N> | undefined;\n\n // --- §11/§12 scales & metrics state (S10) ---\n /** §12 metric store over the FULL accepted model (dataset topology): the\n * degree family is computed from accepted-base adjacency, NEVER the scoped\n * scene, so isolating/masking can never change a node's degree (§11 frozen\n * visual meaning). */\n const metricStore = new MetricStore<N>();\n /** §11 per-instance domain freezer keyed by canonical scale key. */\n const domainStore = new DomainStore();\n /** Mirrors the public model revision (bumped exactly where revisions.model\n * advances) — the MetricStore/DomainStore freeze coordinate, available\n * DURING projection before the store publish lands. */\n let acceptedModelSeq = 0;\n /** ensureMetricModel sync coordinate (datasetKey + source + model seq). */\n let metricModelKey: string | null = null;\n /** §12 metric-name → admission generation: bumps when a column (re)joins\n * so frozen domains recompute exactly when the metric's values changed\n * without a model-revision change (the missing-column-arrives case). */\n const metricColumnGen = new Map<string, number>();\n /** §11 domain scope generations: 'hard-scope' recomputes when the hard\n * scope changes; 'visible' additionally recomputes on mask changes. */\n let hardScopeGen = 0;\n let visibleGen = 0;\n /** §12 metric-column admission diagnostics (replaced per admission pass). */\n let metricDiags: readonly GraphDiagnostic[] = [];\n\n // --- §8 accessor-churn detector state (S10, dev inline-lambda warning) ---\n interface ChurnState {\n fp: string | null;\n streak: number;\n emitted: boolean;\n }\n const churnStates: Record<'nodeColor' | 'nodeSize' | 'linkColor' | 'linkWidth', ChurnState> = {\n nodeColor: { fp: null, streak: 0, emitted: false },\n nodeSize: { fp: null, streak: 0, emitted: false },\n linkColor: { fp: null, streak: 0, emitted: false },\n linkWidth: { fp: null, streak: 0, emitted: false },\n };\n /** Accumulated 'accessor-churn' diagnostics (one per streak). */\n let churnDiags: readonly GraphDiagnostic[] = [];\n\n // --- §8 image-atlas state (S10-T09 wiring) ---\n let imagePipeline: ImageAtlasPipeline | null = null;\n let imageGeneration = 0;\n /** Slot → bitmap the engine has received — the §13.1 recovery replay\n * re-sends this full atlas state. */\n const atlasDeliveredBitmaps = new Map<number, ImageBitmap>();\n /** Last per-point atlas index (aligned to the last requestRefs roster). */\n let lastPointImageIndex: Float32Array | null = null;\n /** Cadence-batched 'image-resolve-failed' diagnostics (accumulated). */\n let imageDiags: readonly GraphDiagnostic[] = [];\n /** DEF2 degradation diagnostics — replaced per mount session at ready. */\n let policyDiags: readonly GraphDiagnostic[] = [];\n let accessibilityConfig: AccessibilityConfig<N> | undefined;\n /** Binding-detected media preference; accessibility.reducedMotion overrides. */\n let bindingReducedMotion: boolean | undefined;\n\n // --- §14 overlay label lane state (M0: NEVER per-frame GPU readback — the\n // lane projects the reconciler's CPU cache; sim-hot refreshes are capped) ---\n type LabelListener = (list: readonly LabelPlacement[]) => void;\n const candidateSubs = new Set<LabelListener>();\n const positionSubs = new Set<LabelListener>();\n /** Current winners. The array AND its objects are reused: position ticks\n * mutate x/y in place (imperative transforms; no re-render churn). */\n let currentPlacements: LabelPlacement[] = [];\n /** Latest per-event readback aligned to the current scene (null → the\n * reconciled scene.positions, which already merged the live cache). */\n let labelPositionCache: Float32Array | null = null;\n /** Frame-clock anchor of the last sim-hot cache readback (§14 cadence). */\n let lastHotRefreshMs: number | null = null;\n let rerankTimer: ReturnType<typeof setTimeout> | null = null;\n let lastOverloadCount = 0;\n const projectScratch: [number, number] = [0, 0];\n\n // --- diagnostics, composed per source so a re-projection replaces only its\n // own channel's entries ---\n let dataDiags: readonly GraphDiagnostic[] = [];\n let nodeColorDiags: readonly GraphDiagnostic[] = [];\n let nodeSizeDiags: readonly GraphDiagnostic[] = [];\n let linkColorDiags: readonly GraphDiagnostic[] = [];\n let linkWidthDiags: readonly GraphDiagnostic[] = [];\n let engineDiags: readonly GraphDiagnostic[] = [];\n /** §14: at most ONE 'label-overload' entry, replaced per overload transition. */\n let labelDiags: readonly GraphDiagnostic[] = [];\n /** §7.5 merge-state diagnostics (shadowing/edge dedupe), recomputed per merge. */\n let ingestMergeDiags: readonly GraphDiagnostic[] = [];\n /** §7.5 commit-time diagnostics (staging tallies + dangling), keyed by\n * overlayId so removeOverlay drops exactly its entries. */\n let ingestCommitDiags: ReadonlyArray<{ overlayId: string; diag: GraphDiagnostic }> = [];\n\n // --- selection ownership (§6.4): flips to controlled on the first host\n // update that carries `selection`, permanently. Controlled mode covers the\n // NODE namespace only — edge/group namespaces stay instance-internal. ---\n let selectionControlled = false;\n\n // --- lifecycle ---\n let destroyed = false;\n let session: MountSession | null = null;\n let mountPromise: Promise<void> | null = null;\n\n // --- typed events (§15 dispatcher) ---\n type AnyListener = (payload: unknown, control: GraphListenerControl) => void;\n const listeners = new Map<GraphEventName, Set<AnyListener>>();\n\n function on<K extends GraphEventName>(\n name: K,\n cb: (payload: GraphEventMap<N, E>[K], control: GraphListenerControl) => void,\n ): () => void {\n if (destroyed) return () => {};\n let set = listeners.get(name);\n if (set === undefined) {\n set = new Set();\n listeners.set(name, set);\n }\n const fn = cb as AnyListener;\n set.add(fn);\n return () => {\n listeners.get(name)?.delete(fn);\n };\n }\n\n /**\n * §15 dispatcher: the listener chain runs SYNCHRONOUSLY in registration\n * order. A throwing listener is isolated — one 'listener-error' diagnostic,\n * the chain continues. Returns whether any listener called preventDefault(),\n * which cancels ONLY the caller's built-in follow-up, never other listeners.\n */\n function emit<K extends GraphEventName>(name: K, payload: GraphEventMap<N, E>[K]): boolean {\n const set = listeners.get(name);\n if (set === undefined || set.size === 0) return false;\n let prevented = false;\n const control: GraphListenerControl = {\n preventDefault() {\n prevented = true;\n },\n };\n let faults = 0;\n // Snapshot so a listener unsubscribing mid-emit cannot skip a peer.\n for (const cb of Array.from(set)) {\n try {\n cb(payload, control);\n } catch (err) {\n faults++;\n engineDiags = [\n ...engineDiags,\n {\n code: 'listener-error',\n severity: 'error',\n count: 1,\n sampleIds: [],\n message: `'${name}' listener threw: ${err instanceof Error ? err.message : String(err)}`,\n },\n ];\n }\n }\n if (faults > 0) publish({ diagnostics: composeDiagnostics() });\n return prevented;\n }\n\n /** The ONLY store write path: composes the next state immutably (§6.3).\n * §16.14: a pending history-depth change (the kernel notifies synchronously\n * during the mutation that caused it) folds into this same publication so\n * a recorded mutation never costs a second store set(). */\n function publish(patch: Partial<GraphStoreState>): void {\n if (pendingHistoryDepths !== null && patch.history === undefined) {\n patch.history = pendingHistoryDepths;\n }\n pendingHistoryDepths = null;\n store.setState((prev) => ({ ...prev, ...patch }));\n }\n\n /** §6.5 instance-level fault routing: one diagnostic append, and — only when\n * the fatality matrix says so — one 'error' status publish + 'error' emit. */\n function emitInstanceError(detail: GraphError, phase: ErrorPhase, cause?: Error): void {\n engineDiags = [\n ...engineDiags,\n {\n code: detail.code === 'context-lost' ? 'context-lost' : 'engine-error',\n severity: 'error',\n count: 1,\n sampleIds: [],\n message: graphErrorToError(detail, cause).message,\n },\n ];\n if (isFatalGraphError(detail, phase)) {\n publish({ status: 'error', diagnostics: composeDiagnostics() });\n emit('error', { error: graphErrorToError(detail, cause), detail });\n } else {\n publish({ diagnostics: composeDiagnostics() });\n }\n }\n\n /** §6.5: calls on a destroyed instance throw an operation error, not a bare Error. */\n function throwDestroyedOperation(fn: string): never {\n throw new OrbitOperationError(\n { code: 'aborted', cause: 'destroyed' },\n `${fn}() called on a destroyed GraphInstance`,\n );\n }\n\n /** §6.5 operation-scoped failure: ONE 'operation-rejected' warning diagnostic\n * plus a typed rejection; never touches status and never emits 'error'.\n * Ingest session calls (§7.5) route their rejections through here. */\n function rejectOperation<T>(detail: GraphOperationError, message?: string): Promise<T> {\n const err = new OrbitOperationError(detail, message);\n engineDiags = [\n ...engineDiags,\n {\n code: 'operation-rejected',\n severity: 'warning',\n count: 1,\n sampleIds: [],\n message: err.message,\n },\n ];\n publish({ diagnostics: composeDiagnostics() });\n return Promise.reject(err);\n }\n\n function engineIfReady(): GraphEngine | null {\n return session !== null && store.getState().status === 'ready' ? session.engine : null;\n }\n\n // -------------------------------------------------------------------------\n // §9.2 hard scope — the render model seam. The reconciler, styling\n // projections, label lane, and selectAll population read the SCOPED view;\n // id-keyed state (selection/pins/hidden), getNode(), and the ingestion\n // merge stay on the full accepted model, which is what lets out-of-scope\n // ids survive scope changes (§16.3 survival semantics).\n // -------------------------------------------------------------------------\n\n /** The model the scene renders: the scoped subset when a hard scope is\n * active, else the full accepted model. Stage-2 output (§7.6) — the\n * PRE-rewrite physical model; stage-5 meta rules and id-keyed state read\n * this, while slot-aligned consumers read {@link sceneModel}. */\n function renderModel(): AcceptedGraph<N, E> | null {\n return scopedAccepted ?? accepted;\n }\n\n /** The model the SCENE is aligned to: the stage-3 post-rewrite set when a\n * collapsed group intersects the render model, else the render model.\n * Scene slot i ↔ sceneModel().nodes[i] under the §7.3 rebuild policy. */\n function sceneModel(): AcceptedGraph<N, E> | null {\n return groupRewrite !== null ? groupRewrite.graph : renderModel();\n }\n\n /** First synthetic point slot (== scene count when no rewrite). */\n function physicalPointCount(): number {\n return groupRewrite !== null ? groupRewrite.physicalNodeCount : (scene?.count ?? 0);\n }\n\n /**\n * Re-resolve store.groups from the retained lanes against the CURRENT\n * accepted model. Precedence (§16.3):\n * - groups + groupBy both configured → the R-16.3-15 config ERROR wins:\n * NEITHER applies (empty resolution) until the host removes one;\n * - groupBy alone → derive one group per distinct key (T04), pruning the\n * per-key collapsed residue to keys the derivation still produces;\n * - manual groups alone → tolerant re-resolution (departed members drop\n * without a config error — model drift is data).\n * Returns whether the published resolution changed.\n */\n /**\n * §16.3 semantic zoom (S12-T05, R-16.3-22/23): hysteresis band tracking\n * driven by §13 viewport events.\n *\n * Crossing BELOW `collapseBelow` collapses every derived group; crossing\n * ABOVE `expandAbove` expands only the groups intersecting the viewport\n * (off-screen groups stay collapsed — cheap re-entry as the camera moves).\n * A zoom strictly between the thresholds RETAINS the current band, so any\n * oscillation inside the corridor flips nothing. A flip is expressed as\n * collapsed-residue edits plus one inner update: a pure §7 structural diff\n * over already-derived membership, with NO new engine entry points (the\n * in-view test reuses `spaceToScreen`, R-16.3-23).\n */\n function trackSemanticZoomBand(zoom: number): void {\n const sz = groupBySpec?.semanticZoom;\n if (sz === undefined || groupsSpec !== null) return; // no spec / conflict\n if (!Number.isFinite(zoom)) return;\n const next: 'collapsed' | 'expanded' | null =\n zoom < sz.collapseBelow ? 'collapsed' : zoom > sz.expandAbove ? 'expanded' : null;\n if (next === null || next === semanticZoomBand) return; // corridor / no flip\n semanticZoomBand = next;\n\n const derived = store.getState().groups;\n if (derived.length === 0) return;\n let changed = false;\n if (next === 'collapsed') {\n for (const group of derived) {\n const key = groupByKeyById.get(group.id);\n if (key !== undefined && !groupByCollapsedKeys.has(key)) {\n groupByCollapsedKeys.add(key);\n changed = true;\n }\n }\n } else {\n for (const group of derived) {\n const key = groupByKeyById.get(group.id);\n if (key === undefined || !groupByCollapsedKeys.has(key)) continue;\n if (!groupInView(group)) continue; // off-screen → stays collapsed\n groupByCollapsedKeys.delete(key);\n changed = true;\n }\n }\n if (!changed) return;\n pendingGroupsRefresh = true;\n applyHostUpdateInner({});\n }\n\n /**\n * The §16.3 \"in-view only\" expansion test: does the group intersect the\n * viewport AS DRAWN? A collapsed group occupies exactly one scene slot —\n * its SUPER-NODE (its members have no slots at all while collapsed) — so\n * that is the slot tested; an expanded group tests its member slots.\n *\n * Uses the CPU position cache plus the engine's existing `spaceToScreen`\n * (no new engine surface, R-16.3-23). When the projection is unavailable\n * (headless, unsized container, pre-mount) every group counts as in view,\n * so semantic zoom degrades to plain band expansion.\n */\n function groupInView(group: ResolvedGroup): boolean {\n const eng = engineIfReady();\n const rect = containerScreenRect();\n if (eng?.spaceToScreen === undefined || rect === null || scene === null) return true;\n const positions = labelPositionCache ?? scene.positions;\n const slots: number[] = [];\n const sceneGroups = scene.groups;\n if (sceneGroups !== undefined) {\n // superNodes is aligned to the point suffix (physicalPointCount…count).\n const at = sceneGroups.superNodes.findIndex((g) => g.id === group.id);\n if (at >= 0) slots.push(sceneGroups.physicalPointCount + at);\n }\n if (slots.length === 0) {\n for (const id of group.memberIds) {\n const idx = scene.indexById.get(id);\n if (idx !== undefined) slots.push(idx);\n }\n }\n // FAIL OPEN: a group whose drawn slot has no KNOWN position yet (a\n // freshly seeded super-node carries NaN until the engine places it)\n // cannot be proven off-screen, and staying collapsed would strand it\n // there across every later flip. Unknown ⇒ in view.\n let decidable = false;\n for (const idx of slots) {\n if (2 * idx + 1 >= positions.length) continue;\n const x = positions[2 * idx]!;\n const y = positions[2 * idx + 1]!;\n if (Number.isNaN(x) || Number.isNaN(y)) continue;\n const screen = eng.spaceToScreen([x, y]);\n if (screen === null || screen === undefined) continue;\n decidable = true;\n if (\n screen[0] >= rect[0] &&\n screen[0] <= rect[2] &&\n screen[1] >= rect[1] &&\n screen[1] <= rect[3]\n ) {\n return true;\n }\n }\n return !decidable;\n }\n\n function refreshGroupsResolution(): boolean {\n let next: readonly ResolvedGroup[];\n // Derivation diagnostics only exist while a derivation lane is live.\n if (groupBySpec === null || groupsSpec !== null) {\n if (groupsDeriveDiags.length > 0) groupsDeriveDiags = [];\n }\n if (groupsSpec !== null && groupBySpec !== null) {\n next = EMPTY_GROUPS;\n } else if (groupBySpec !== null) {\n if (accepted === null) {\n // No model yet: nothing derives, and the residue is NOT pruned —\n // only a derivation that omits a key drops that key.\n groupByKeyById = new Map();\n if (groupsDeriveDiags.length > 0) groupsDeriveDiags = [];\n next = EMPTY_GROUPS;\n } else {\n const derivation = deriveGroupsByKey(accepted.nodes, groupBySpec.by, (key) =>\n groupByCollapsedKeys.has(key),\n );\n groupByKeyById = derivation.keyById;\n if (groupByCollapsedKeys.size > 0) {\n // R-16.3-16 residue: keys that vanished from the model drop;\n // surviving keys keep their collapsed state across re-derivation.\n const alive = new Set(derivation.keyById.values());\n for (const key of groupByCollapsedKeys) {\n if (!alive.has(key)) groupByCollapsedKeys.delete(key);\n }\n }\n groupsDeriveDiags = derivation.diagnostic === null ? [] : [derivation.diagnostic];\n next = derivation.groups;\n }\n } else if (groupsSpec !== null && accepted !== null) {\n next = resolveManualGroups(groupsSpec, accepted.nodeIndex);\n } else {\n next = EMPTY_GROUPS;\n }\n if (sameResolvedGroups(resolvedGroups, next)) return false;\n resolvedGroups = next;\n return true;\n }\n\n /** Whether the NEXT rewrite would synthesize anything — collapse gating so\n * uncollapsed-only group changes never touch the scene (§16.3). */\n function anyCollapsedIntersecting(): boolean {\n const model = renderModel();\n if (model === null) return false;\n for (const group of resolvedGroups) {\n if (!group.collapsed) continue;\n for (const id of group.memberIds) {\n if (model.nodeIndex.has(id)) return true;\n }\n }\n return false;\n }\n\n /**\n * THE reconcile entry point (§7.6 stage ordering): stage-3 rewrite over the\n * stage-2 model, then the EXISTING §7.2 structural diff over the\n * post-rewrite set — collapse/expand is a diff, never a reload. Sets\n * `scene` (with the synthetic-suffix descriptor attached when rewritten).\n */\n /** §7.6 stage-3 (+ stage-3-adjacent) composition: the T01 group rewrite\n * FIRST, then the R-16.3-24 parallel-edge pass over its POST-rewrite\n * physical edge list when the toggle is on — group meta-edges already\n * bundle per directed pair by construction (ordering contract documented\n * at collapseParallelEdges in groups.ts). */\n function composeStage3Rewrite(model: AcceptedGraph<N, E>): GroupRewrite<N, E> | null {\n const base = rewriteGroups(model, buildRepForest(resolvedGroups, foldRecords()));\n return parallelEdgeGrouping ? collapseParallelEdges(model, base) : base;\n }\n\n /** The live folds as forest input (anchor order = insertion order). */\n function foldRecords(): readonly FoldRecord[] {\n if (folds.size === 0) return EMPTY_FOLD_RECORDS;\n const out: FoldRecord[] = [];\n for (const [anchorId, memberIds] of folds) out.push({ anchorId, memberIds });\n return out;\n }\n\n /** R-16.3-24 inoperative-case detection: does the ACCEPTED edge list carry\n * ANY same-DIRECTED-endpoint-pair multiplicity? (Collision-safe pairing —\n * ids may contain any character.) */\n function acceptedHasParallelEdges(): boolean {\n if (accepted === null) return false;\n const seen = new Set<string>();\n for (const e of accepted.edges) {\n const key = JSON.stringify([e.source, e.target]);\n if (seen.has(key)) return true;\n seen.add(key);\n }\n return false;\n }\n\n function reconcileScene(model: AcceptedGraph<N, E>): ReconcileResult {\n // §16.2: a scene rebuild invalidates path link indices — drop the state\n // silently; the rebuild's own commit recomposes the link lane.\n dropPathState();\n groupRewrite = composeStage3Rewrite(model);\n const result = reconciler.reconcile(groupRewrite !== null ? groupRewrite.graph : model);\n scene =\n groupRewrite === null\n ? result.scene\n : { ...result.scene, groups: sceneGroupsOf(groupRewrite) };\n // §7.6 stage 4 follows stage 3 on EVERY scene rebuild (this is the single\n // reconcile entry point): the physical prefix it partitions just moved,\n // and `pointClusters` is index-addressed, so membership re-derives here —\n // and ONLY here plus an explicit spec change. Stage-5 soft-mask changes\n // never reach this function, which is exactly why they never re-derive.\n // The physical rows are passed explicitly: `model` is authoritative here\n // even when the caller has not yet published it as `accepted`.\n if (clusterSpec !== null) {\n deriveClusterState(groupRewrite !== null ? groupRewrite.physicalNodes : model.nodes);\n }\n return result;\n }\n\n // -------------------------------------------------------------------------\n // §16.3 stage-4 clusters (S12-T06/T07). Stage 4 runs AFTER the stage-3\n // rewrite and consumes its PHYSICAL prefix, so a collapsed group's members\n // simply have no scene slot to cluster. It preserves the scene exactly:\n // node/edge counts, the synthetic suffix, and every structural buffer are\n // untouched (R-16.3-17/19) — the only outputs are `config.cluster`\n // (capability-gated) and the §14 cluster-label anchors.\n //\n // DIRTY DISCIPLINE (R-16.3-21 sibling): derivation runs ONLY on stage-4\n // dirty flags — a `by` accessor identity change or an upstream TOPOLOGY\n // change (data / scope / stage-3 rewrite). A stage-5 soft-mask change\n // (filter, brush, legend toggle, hidden ids) never re-derives; `clusterProbe`\n // pins that.\n // -------------------------------------------------------------------------\n\n /** The physical rows stage 4 partitions: the stage-3 physical prefix when a\n * rewrite is live, else the scene model's nodes. */\n function physicalSceneNodes(): readonly GraphNode<N>[] {\n if (groupRewrite !== null) return groupRewrite.physicalNodes;\n return sceneModel()?.nodes ?? [];\n }\n\n /** Recompute stage-4 membership + force centers from the CURRENT scene and\n * mark the engine payload owed. Anchors reset to the force centers: a fresh\n * derivation has no settled centroid until the next §7.1 readback (or an\n * immediate fixed-layout computation at commit). */\n function deriveClusterState(physical: readonly GraphNode<N>[] = physicalSceneNodes()): void {\n clusterConfigPending = true;\n if (clusterSpec === null) {\n clusterDerivation = null;\n clusterForceCenters = null;\n clusterAnchors = null;\n clusterCentroidsSettled = false;\n if (clusterDiags.length > 0) clusterDiags = [];\n return;\n }\n const derivation = deriveClusters(physical, clusterSpec.by, scene?.count ?? physical.length);\n clusterDerivation = derivation;\n clusterForceCenters = resolveClusterCenters(derivation.keys, clusterSpec.centers);\n clusterAnchors = new Float32Array(clusterForceCenters);\n clusterCentroidsSettled = false;\n clusterDiags = derivation.diagnostic === null ? [] : [derivation.diagnostic];\n }\n\n /**\n * §7.1/R-16.3-21 anchor refresh: recompute centroids from a slot-aligned\n * position buffer. The ONLY member-scanning path, and it runs exclusively\n * on the settle event (over the single permitted per-event readback) or at\n * commit under a FIXED layout — never per frame.\n */\n function refreshClusterCentroids(positions: Float32Array | null): void {\n const derivation = clusterDerivation;\n const centers = clusterForceCenters;\n if (derivation === null || centers === null || positions === null) return;\n if (derivation.keys.length === 0) return;\n clusterAnchors = clusterCentroids(\n derivation.slotOrdinals,\n positions,\n derivation.keys.length,\n centers,\n );\n clusterCentroidsSettled = true;\n }\n\n /** The §13 engine payload for the current derivation; null CLEARS the\n * engine's cluster force (D2 explicit reset). */\n function clusterConfigPayload(): NonNullable<EngineConfigUpdate['cluster']> | null {\n const derivation = clusterDerivation;\n if (clusterSpec === null || derivation === null) return null;\n const payload: NonNullable<EngineConfigUpdate['cluster']> = {\n pointClusters: derivation.slotOrdinals,\n };\n if (clusterForceCenters !== null && derivation.keys.length > 0) {\n payload.centers = clusterForceCenters;\n }\n if (clusterSpec.strength !== undefined) payload.strength = clusterSpec.strength;\n return payload;\n }\n\n /**\n * DEF2 §13 loud degradation: an engine that does not declare `clusterForce`\n * gets exactly ONE 'engine:capability-degraded' diagnostic per session, with\n * the same text the mount-time policy would have produced. Membership,\n * labels, and centroids keep working and the layout proceeds (R-13-39) —\n * `normalizeCommitForCapabilities` strips `config.cluster` at the sink.\n */\n function noteClusterDegradation(): boolean {\n if (clusterDegradationEmitted || clusterSpec === null) return false;\n const eng = engineIfReady();\n if (eng === null || eng.capabilities.clusterForce === true) return false;\n clusterDegradationEmitted = true;\n policyDiags = [\n ...policyDiags,\n {\n code: 'engine:capability-degraded',\n severity: 'warning',\n count: 1,\n sampleIds: [],\n message: `clusters degraded: ${CLUSTER_FORCE_DEGRADATION_REASON}`,\n },\n ];\n return true;\n }\n\n /** §16.3 public cluster surface (R-16.3-18 selection, T14 demo lane). */\n function getClusters(): readonly ResolvedCluster[] {\n const derivation = clusterDerivation;\n const centers = clusterForceCenters;\n if (derivation === null || centers === null) return EMPTY_CLUSTERS;\n const anchors = clusterAnchors;\n return derivation.keys.map((key, i) => ({\n key,\n memberIds: derivation.membersByKey.get(key) ?? [],\n forceCenter: [centers[2 * i]!, centers[2 * i + 1]!] as const,\n centroid:\n clusterCentroidsSettled && anchors !== null\n ? ([anchors[2 * i]!, anchors[2 * i + 1]!] as const)\n : null,\n }));\n }\n\n /** Lazy §7.1 CSR adjacency of the EFFECTIVE accepted model (§9.2 — walked\n * by scope resolution AND the default local expansion service, including\n * currently out-of-scope nodes). Callers guarantee an accepted model. */\n function acceptedAdjacencyOf(): Adjacency {\n if (acceptedAdjacency === null) acceptedAdjacency = buildAcceptedAdjacency(accepted!);\n return acceptedAdjacency;\n }\n\n function sameSubgraphSpec(a: SubgraphSpec | null, b: SubgraphSpec | null): boolean {\n if (a === b) return true;\n if (a === null || b === null) return false;\n return a.hops === b.hops && a.reflow === b.reflow && sameIds(a.seedIds, b.seedIds);\n }\n\n /**\n * §16.3 stage-2 isolate-as-unit (S12-T02): a seed id naming a COLLAPSED\n * resolved group — and NOT an accepted node id (on a cross-namespace id\n * collision the NODE wins; group selections expand explicitly through\n * isolateSelection) — resolves to that group's memberIds BEFORE scope\n * resolution, so isolating a collapsed group hard-scopes to the members,\n * the rewrite renders the super-node as a unit, and meta-edges never\n * dangle outside scope. The STORED SubgraphSpec keeps the group id; each\n * re-resolution expands against the then-current groups.\n */\n function expandScopeSeedGroups(spec: SubgraphSpec): SubgraphSpec {\n if (resolvedGroups.length === 0 || accepted === null) return spec;\n let collapsedById: Map<string, ResolvedGroup> | null = null;\n const groupFor = (id: string): ResolvedGroup | undefined => {\n if (collapsedById === null) {\n collapsedById = new Map();\n for (const group of resolvedGroups) {\n if (group.collapsed) collapsedById.set(group.id, group);\n }\n }\n return collapsedById.get(id);\n };\n let any = false;\n for (const id of spec.seedIds) {\n if (!accepted.nodeIndex.has(id) && groupFor(id) !== undefined) {\n any = true;\n break;\n }\n }\n if (!any) return spec;\n const seedIds: NodeId[] = [];\n for (const id of spec.seedIds) {\n const group = accepted.nodeIndex.has(id) ? undefined : groupFor(id);\n if (group === undefined) seedIds.push(id);\n else seedIds.push(...group.memberIds);\n }\n return { ...spec, seedIds };\n }\n\n /**\n * Resolve the current hard scope against the current accepted model:\n * stage-2 group-seed expansion, then `resolveScope` over the SubgraphSpec\n * (seeds validated, `hops` BFS over the cached accepted adjacency) plus\n * the expansion-revealed extras, edges cascaded through the shared §9\n * primitive. Null = full scope.\n */\n function computeScopedAccepted(): AcceptedGraph<N, E> | null {\n if (accepted === null) return null;\n if (scopeSpec === null) {\n // §16.3 T03: no hard scope, but a collapse trimmed the effective set —\n // render the accepted model MINUS the exclusions. The data persists\n // (§7.5); only the displayed set shrinks.\n let anyRemoved = false;\n for (const id of effectiveRemovedIds) {\n if (accepted.nodeIndex.has(id)) {\n anyRemoved = true;\n break;\n }\n }\n if (!anyRemoved) return null;\n const base = accepted;\n const nodes = base.nodes.filter((n) => !effectiveRemovedIds.has(n.id));\n const edges = cascadeEdges(\n base.edges,\n (id) => base.nodeIndex.has(id) && !effectiveRemovedIds.has(id),\n );\n const nodeIndex = new Map<NodeId, number>();\n for (let i = 0; i < nodes.length; i++) nodeIndex.set(nodes[i]!.id, i);\n return {\n datasetKey: base.datasetKey,\n sourceRevision: base.sourceRevision,\n nodes,\n edges,\n nodeIndex,\n diagnostics: base.diagnostics,\n };\n }\n const spec = expandScopeSeedGroups(scopeSpec);\n const hops = spec.hops ?? 0;\n const resolved = resolveScope<N, E>(\n accepted,\n spec,\n Number.isFinite(hops) && hops > 0 ? acceptedAdjacencyOf() : null,\n );\n let ids: ReadonlySet<NodeId> = resolved.nodeIds;\n let nodes = resolved.nodes;\n let edges = resolved.edges;\n let anyExtra = false;\n for (const id of scopeExtraIds) {\n if (accepted.nodeIndex.has(id) && !ids.has(id)) {\n anyExtra = true;\n break;\n }\n }\n if (anyExtra) {\n const union = new Set(ids);\n for (const id of scopeExtraIds) {\n if (accepted.nodeIndex.has(id)) union.add(id);\n }\n nodes = accepted.nodes.filter((n) => union.has(n.id));\n edges = cascadeEdges(accepted.edges, (id) => union.has(id));\n ids = union;\n }\n // §16.3 T03: collapse exclusions subtract from the resolved effective\n // set (accretion removal covers most scoped cases; this also covers a\n // removed id the SubgraphSpec resolution itself would re-include).\n let anyExcluded = false;\n for (const id of effectiveRemovedIds) {\n if (ids.has(id)) {\n anyExcluded = true;\n break;\n }\n }\n if (anyExcluded) {\n const kept = new Set<NodeId>();\n for (const id of ids) {\n if (!effectiveRemovedIds.has(id)) kept.add(id);\n }\n nodes = nodes.filter((n) => kept.has(n.id));\n edges = cascadeEdges(accepted.edges, (id) => kept.has(id));\n ids = kept;\n }\n const nodeIndex = new Map<NodeId, number>();\n for (let i = 0; i < nodes.length; i++) nodeIndex.set(nodes[i]!.id, i);\n return {\n datasetKey: accepted.datasetKey,\n sourceRevision: accepted.sourceRevision,\n nodes,\n edges,\n nodeIndex,\n diagnostics: accepted.diagnostics,\n };\n }\n\n /** Current §9.2 revision-dimension values (service issue/admission gate). */\n function revisionSnapshot(): RevisionSnapshot {\n const r = store.getState().revisions;\n return { source: r.source, model: r.model, scope: r.scope };\n }\n\n /** §9.2 service diagnostics: 'service-aborted' (info) for discards,\n * 'service-error' (error) for failures. Never a status change, never the\n * 'error' event — the caller's promise carries the rejection. */\n function pushServiceDiagnostic(\n code: 'service-aborted' | 'service-error',\n severity: 'info' | 'error',\n message: string,\n ): void {\n engineDiags = [...engineDiags, { code, severity, count: 1, sampleIds: [], message }];\n publish({ diagnostics: composeDiagnostics() });\n }\n\n function getNode(id: NodeId): GraphNode<N> | undefined {\n if (accepted === null) return undefined;\n const idx = accepted.nodeIndex.get(id);\n return idx === undefined ? undefined : accepted.nodes[idx];\n }\n\n function getEdge(id: EdgeId): AcceptedEdge<E> | undefined {\n if (accepted === null) return undefined;\n const idx = edgeIndexById.get(id);\n return idx === undefined ? undefined : accepted.edges[idx];\n }\n\n function nodeAtIndex(index: number): GraphNode<N> | undefined {\n if (scene === null) return undefined;\n const id = scene.idByIndex[index];\n return id === undefined ? undefined : getNode(id);\n }\n\n function edgeAtLinkIndex(linkIndex: number): AcceptedEdge<E> | undefined {\n if (scene === null || accepted === null) return undefined;\n const id = scene.edgeIdByIndex[linkIndex];\n if (id === undefined) return undefined;\n const k = edgeIndexById.get(id);\n return k === undefined ? undefined : accepted.edges[k];\n }\n\n /**\n * Shared §7.4 edge-hover core for both routes: write `hover.edgeId` and\n * emit 'edgeHover'. Native host events pass `transitionsOnly=false` (the\n * engine owns transition detection); the throttled fallback sampler passes\n * true so repeated same-edge samples do not re-emit.\n */\n function applyEdgeHover(edge: AcceptedEdge<E> | null, transitionsOnly: boolean): void {\n const edgeId = edge === null ? null : edge.id;\n const hover = store.getState().hover;\n const changed = hover.edgeId !== edgeId;\n if (changed) publish({ hover: { nodeId: hover.nodeId, edgeId } });\n if (changed || !transitionsOnly) emit('edgeHover', { edge });\n }\n\n // -------------------------------------------------------------------------\n // §13 edge-picking facade surface (S6-T07). The route was fixed at ready;\n // these are live only on the fallback route and only while armed (settled).\n // -------------------------------------------------------------------------\n\n function fallbackFacade(): EdgePickingFacade | null {\n if (engineIfReady() === null || session === null) return null;\n const facade = session.edgePicking;\n return facade !== null && facade.route === 'fallback' ? facade : null;\n }\n\n function pickEdgeAt(screen: readonly [number, number]): AcceptedEdge<E> | null {\n const facade = fallbackFacade();\n if (facade === null) return null;\n const linkIndex = facade.pickLinkAt(screen);\n return linkIndex === null ? null : (edgeAtLinkIndex(linkIndex) ?? null);\n }\n\n /** Call on the shared §15 pointer throttle cadence (the binding owns the\n * timer). Emits the SAME typed 'edgeHover' payloads as the native route. */\n function sampleEdgeHover(screen: readonly [number, number]): AcceptedEdge<E> | null {\n const facade = fallbackFacade();\n if (facade === null) return null;\n const linkIndex = facade.pickLinkAt(screen);\n const edge = linkIndex === null ? null : (edgeAtLinkIndex(linkIndex) ?? null);\n applyEdgeHover(edge, true);\n return edge;\n }\n\n function sampleEdgeClick(screen: readonly [number, number]): AcceptedEdge<E> | null {\n const facade = fallbackFacade();\n if (facade === null) return null;\n const linkIndex = facade.pickLinkAt(screen);\n if (linkIndex === null) return null;\n // §7.4 route parity (S12-T02): a meta-edge hit fires the SAME typed\n // event as the native route; the AcceptedEdge return stays null —\n // synthetics never cast to E (R-16.3-12).\n const ref = scene === null ? null : sceneLinkRefAt(scene, linkIndex);\n if (ref !== null && ref.kind === 'meta-edge') {\n emit('metaEdgeClick', { metaEdge: ref.metaEdge });\n return null;\n }\n const edge = edgeAtLinkIndex(linkIndex) ?? null;\n if (edge !== null) emit('edgeClick', { edge }); // no built-in follow-up\n return edge;\n }\n\n function composeDiagnostics(): readonly GraphDiagnostic[] {\n return [\n ...dataDiags,\n ...ingestMergeDiags,\n ...ingestCommitDiags.map((e) => e.diag),\n ...nodeColorDiags,\n ...nodeSizeDiags,\n ...linkColorDiags,\n ...linkWidthDiags,\n ...metricDiags,\n ...churnDiags,\n ...imageDiags,\n ...policyDiags,\n ...filterDiags,\n ...groupsDiags,\n ...groupByDiags,\n ...groupsConflictDiags,\n ...groupsOpDiags,\n ...groupsDeriveDiags,\n ...clusterDiags,\n ...engineDiags,\n ...labelDiags,\n ];\n }\n\n // -------------------------------------------------------------------------\n // §9.1 soft mask (S9-T01/T03/T04). One SoftMask over the CURRENT scene;\n // slot indices are scene indices (scene slot i ↔ renderModel().nodes[i]\n // under the §7.3 rebuild policy). Mask changes are the FAST PATH: one\n // buffers-only commit (alpha channels only), NO structure, NO restart —\n // zero relayout is the §9.1 contract. Mask-affecting publishes advance\n // scope+render revisions, never model.\n // -------------------------------------------------------------------------\n\n function maskNodeVisibleAt(index: number): boolean {\n return softMask === null || softMask.isNodeVisible(index);\n }\n\n function maskEdgeVisibleAt(linkIndex: number): boolean {\n return softMask === null || softMask.isEdgeVisible(linkIndex);\n }\n\n /** Lazily create the mask + named sources sized to the scene; grow on\n * structure change (capacity never shrinks — out-of-scene slots always\n * read zero failures after a membership rebuild). */\n function ensureMask(): SoftMask | null {\n if (scene === null) return null;\n if (softMask === null) {\n softMask = new SoftMask(scene.count, scene.linkCount);\n maskFilterSource = softMask.acquire('filter');\n maskHiddenSource = softMask.acquire('hidden');\n maskBrushSource = softMask.acquire('brushes');\n maskGroupSource = softMask.acquire('groups');\n } else {\n softMask.grow(scene.count, scene.linkCount);\n }\n return softMask;\n }\n\n /** datasetKey swap: per-dataset mask state does not carry over (the filter\n * SPEC survives — it is host config — and re-evaluates on the new scene). */\n function resetMaskState(): void {\n softMask = null;\n maskFilterSource = null;\n maskHiddenSource = null;\n maskBrushSource = null;\n maskGroupSource = null;\n filterHiddenNodeSlots = new Set();\n basePointColors = null;\n baseLinkColors = null;\n basePointColorsSynthesized = false;\n baseLinkColorsSynthesized = false;\n }\n\n /**\n * Re-evaluate the compiled filter prop over the CURRENT render model and\n * replace the 'filter' source memberships (hide or dim lanes per\n * spec.mode). Predicate throws FAIL OPEN and aggregate into at most ONE\n * 'filter-error' warning diagnostic per pass (§9.1/§5.1).\n */\n function evaluateFilterMembership(): void {\n if (softMask === null || maskFilterSource === null) return;\n const model = sceneModel();\n if (activeFilterSpec === null || model === null) {\n maskFilterSource.clear();\n filterHiddenNodeSlots = new Set();\n filterDiags = [];\n return;\n }\n const cn = compiledNodeSelector;\n const ce = compiledEdgeSelector;\n // One aggregate per PASS: reset the live tallies before re-evaluating.\n if (cn !== null) {\n cn.errors.count = 0;\n cn.errors.samples.length = 0;\n }\n if (ce !== null) {\n ce.errors.count = 0;\n ce.errors.samples.length = 0;\n }\n // §7.6 stage 5: caller predicates run over PHYSICAL rows only — the\n // synthetic suffix is judged by the 'groups' source's meta-entity rule,\n // never cast to N/E (R-6.1-14).\n const physNodes = groupRewrite !== null ? groupRewrite.physicalNodeCount : model.nodes.length;\n const physEdges = groupRewrite !== null ? groupRewrite.physicalEdgeCount : model.edges.length;\n const nodeFail: number[] = [];\n if (cn !== null) {\n const nodes = model.nodes;\n for (let i = 0; i < physNodes; i++) {\n if (!cn.test(nodes[i]!)) nodeFail.push(i);\n }\n }\n const edgeFail: number[] = [];\n if (ce !== null) {\n const edges = model.edges;\n for (let k = 0; k < physEdges; k++) {\n if (!ce.test(edges[k]!)) edgeFail.push(k);\n }\n }\n if (activeFilterMode === 'hide') {\n maskFilterSource.setNodeFailures(nodeFail, null);\n maskFilterSource.setEdgeFailures(edgeFail, null);\n filterHiddenNodeSlots = new Set(nodeFail);\n } else {\n maskFilterSource.setNodeFailures(null, nodeFail);\n maskFilterSource.setEdgeFailures(null, edgeFail);\n filterHiddenNodeSlots = new Set(); // dim never excludes (§16.6 layer)\n }\n const errorCount = (cn?.errors.count ?? 0) + (ce?.errors.count ?? 0);\n if (errorCount > 0) {\n const samples: string[] = [];\n for (const s of cn?.errors.samples ?? []) {\n if (samples.length < DIAGNOSTIC_SAMPLE_CAP) samples.push(s);\n }\n for (const s of ce?.errors.samples ?? []) {\n if (samples.length < DIAGNOSTIC_SAMPLE_CAP) samples.push(s);\n }\n filterDiags = [\n {\n code: 'filter-error',\n severity: 'warning',\n count: errorCount,\n sampleIds: samples,\n message: `filter predicate threw for ${errorCount} item(s); failing open — throwing predicates never hide data (§9.1)`,\n },\n ];\n } else {\n filterDiags = [];\n }\n }\n\n /** Replace the 'hidden' source membership from a hiddenNodeIds set. */\n function refreshHiddenMembership(hidden: ReadonlySet<NodeId>): void {\n if (softMask === null || maskHiddenSource === null || scene === null) return;\n const slots: number[] = [];\n for (const id of hidden) {\n const idx = scene.indexById.get(id);\n if (idx !== undefined) slots.push(idx);\n }\n maskHiddenSource.setNodeFailures(slots, null);\n }\n\n /** Replace the 'brushes' source membership from the crossfilter's hidden\n * BASE slots, mapped to scene slots (out-of-scope rows have no scene slot\n * under a hard scope and are skipped — §9.2). */\n function refreshBrushMembership(): void {\n if (softMask === null || maskBrushSource === null || scene === null) return;\n const slots: number[] = [];\n for (const s of crossfilterHiddenBase) {\n const id = crossfilterRowIds[s];\n if (id === undefined) continue;\n const idx = scene.indexById.get(id);\n if (idx !== undefined) slots.push(idx);\n }\n maskBrushSource.setNodeFailures(slots, null);\n }\n\n /** §9 node→edge cascade over the mask lane, after any node-lane change. */\n function cascadeNodeMask(): void {\n if (softMask !== null && scene !== null) softMask.applyNodeCascadeToEdges(scene.links);\n }\n\n /**\n * §7.6 stage-5 meta-entity rule over the synthetic suffix: a super-node\n * passes iff ANY present member passes the composed node mask (filter ∧\n * hiddenNodeIds ∧ brushes, evaluated jointly per member over the PHYSICAL\n * model); a meta-edge passes iff ANY underlying edge passes (edge filter ∧\n * both physical endpoints pass) — collapsed groups stay discoverable under\n * filters. Caller predicates only ever see physical rows (R-6.1-14).\n * Call after any other source membership changes, before the cascade.\n */\n function refreshGroupMaskMembership(hidden: ReadonlySet<NodeId>): void {\n if (softMask === null || maskGroupSource === null) return;\n if (groupRewrite === null) {\n maskGroupSource.clear();\n return;\n }\n const rewrite = groupRewrite;\n const model = renderModel()!; // a rewrite implies a stage-2 model\n const cn = compiledNodeSelector;\n const ce = compiledEdgeSelector;\n const hideMode = activeFilterMode === 'hide';\n const baseIndex = accepted !== null ? accepted.nodeIndex : null;\n const brushHidden = (id: NodeId): boolean => {\n if (crossfilterHiddenBase.size === 0 || baseIndex === null) return false;\n const s = baseIndex.get(id);\n return s !== undefined && crossfilterHiddenBase.has(s);\n };\n const nodeOf = (id: NodeId): GraphNode<N> | null => {\n const i = model.nodeIndex.get(id);\n return i === undefined ? null : model.nodes[i]!;\n };\n // Member predicate runs happen OUTSIDE evaluateFilterMembership's tally\n // pass: fail-open still applies; only the aggregate error COUNT omits\n // collapsed members (§9.1 delivery stays one diagnostic per pass).\n const nodeHideFails = (id: NodeId): boolean => {\n if (hidden.has(id) || brushHidden(id)) return true;\n if (cn === null || !hideMode) return false;\n const node = nodeOf(id);\n return node !== null && !cn.test(node);\n };\n const nodeDimFails = (id: NodeId): boolean => {\n if (cn === null || hideMode) return false;\n const node = nodeOf(id);\n return node !== null && !cn.test(node);\n };\n\n const nodeHide: number[] = [];\n const nodeDim: number[] = [];\n for (let j = 0; j < rewrite.superNodes.length; j++) {\n const rec = rewrite.superNodes[j]!;\n let anyPass = false;\n let anyUndimmed = false;\n for (const id of rec.presentMemberIds) {\n if (nodeHideFails(id)) continue;\n anyPass = true;\n if (!nodeDimFails(id)) {\n anyUndimmed = true;\n break;\n }\n }\n const slot = rewrite.physicalNodeCount + j;\n if (!anyPass) nodeHide.push(slot);\n else if (!anyUndimmed) nodeDim.push(slot);\n }\n maskGroupSource.setNodeFailures(nodeHide, nodeDim);\n\n const edgeHide: number[] = [];\n const edgeDim: number[] = [];\n const edges = model.edges;\n for (let j = 0; j < rewrite.metaEdges.length; j++) {\n const rec = rewrite.metaEdges[j]!;\n let anyPass = false;\n let anyUndimmed = false;\n for (const k of rec.underlying) {\n const edge = edges[k]!;\n if (nodeHideFails(edge.source) || nodeHideFails(edge.target)) continue;\n if (hideMode && ce !== null && !ce.test(edge)) continue;\n anyPass = true;\n if (!(ce !== null && !hideMode && !ce.test(edge))) {\n anyUndimmed = true;\n break;\n }\n }\n const slot = rewrite.physicalEdgeCount + j;\n if (!anyPass) edgeHide.push(slot);\n else if (!anyUndimmed) edgeDim.push(slot);\n }\n maskGroupSource.setEdgeFailures(edgeHide, edgeDim);\n }\n\n /**\n * Structural change: slot indices shifted, so REBUILD every source\n * membership from its definition against the new scene, then consume the\n * drain (callers re-project full buffers with the mask composed).\n * Returns whether the filter-error diagnostic changed.\n */\n function rebuildMaskMemberships(hidden: ReadonlySet<NodeId>): boolean {\n if (scene === null) return false;\n if (\n softMask === null &&\n activeFilterSpec === null &&\n hidden.size === 0 &&\n crossfilterHiddenBase.size === 0\n ) {\n return false; // nothing masks and nothing ever did (synthetics visible)\n }\n ensureMask();\n const before = filterDiags;\n evaluateFilterMembership();\n refreshHiddenMembership(hidden);\n refreshBrushMembership();\n refreshGroupMaskMembership(hidden);\n cascadeNodeMask();\n softMask!.drainDirty(); // consume: full buffers re-project with composition\n return filterDiags !== before;\n }\n\n /** In-scene visible counts (§9.1): capacity slots beyond the scene always\n * read zero failures post-rebuild, so subtracting the excess is exact. */\n /**\n * §9.1 visible counts over RENDERED SCENE entities — the synthetic suffix\n * INCLUDED. A collapsed group draws one super-node, and that is one thing\n * the viewer sees, so it counts here (the store contract is literally\n * \"scene entities with zero hide-failures\").\n *\n * This deliberately differs from `getVisibleNodeIds()`, which returns the\n * PUBLIC physical ids only (§7.4: internal scene keys never escape). The\n * two answer different questions — \"how much is on screen\" vs \"which of\n * your nodes are on screen\" — so a host pairing a count with that list\n * must use `getVisibleNodeIds().length`, not `visible.nodes`.\n */\n function computeVisibleCounts(): { nodes: number; edges: number } {\n if (scene === null) return { nodes: 0, edges: 0 };\n if (softMask === null) return { nodes: scene.count, edges: scene.linkCount };\n return {\n nodes: softMask.visibleNodeCount() - (softMask.nodeCapacity - scene.count),\n edges: softMask.visibleEdgeCount() - (softMask.edgeCapacity - scene.linkCount),\n };\n }\n\n function sameVisible(a: { nodes: number; edges: number }, b: { nodes: number; edges: number }): boolean {\n return a.nodes === b.nodes && a.edges === b.edges;\n }\n\n function themeColorFill(count: number, rgba: readonly [number, number, number, number]): Float32Array {\n const out = new Float32Array(4 * count);\n for (let i = 0; i < count; i++) {\n out[4 * i] = rgba[0];\n out[4 * i + 1] = rgba[1];\n out[4 * i + 2] = rgba[2];\n out[4 * i + 3] = rgba[3];\n }\n return out;\n }\n\n /** The unmasked base node-color RGBA buffer: the last projection, or a fill\n * synthesized from the ACTIVE theme's `nodeDefault` when no accessor is\n * configured (so mask alphas still reach the engine without repainting the\n * scene a foreign color — I5). Callers guarantee a scene. */\n function basePointColorBuffer(): Float32Array {\n const n = scene!.count;\n if (basePointColors === null || basePointColors.length !== 4 * n) {\n const fill = themeColorFill(n, parseColor(theme.nodeDefault) ?? DEFAULT_RGBA);\n // §16.3 stage 6: the synthetic suffix renders through the aggregate\n // channel even in the no-accessor lane (group color / theme accent).\n if (groupRewrite !== null) applySuperNodeColors(fill, groupRewrite);\n basePointColors = fill;\n basePointColorsSynthesized = true;\n }\n return basePointColors;\n }\n\n /** Link twin of {@link basePointColorBuffer}: synthesized from the theme's\n * `edgeDefault` — including its alpha, so masking a themed edge lane keeps\n * the theme's translucency instead of snapping to opaque (I5). */\n function baseLinkColorBuffer(): Float32Array {\n const n = scene!.linkCount;\n if (baseLinkColors === null || baseLinkColors.length !== 4 * n) {\n baseLinkColors = themeColorFill(n, parseColor(theme.edgeDefault) ?? DEFAULT_RGBA);\n baseLinkColorsSynthesized = true;\n }\n return baseLinkColors;\n }\n\n /**\n * THE §9.1 alpha-composition helper — used at EVERY point node colors are\n * (re)built (initial projection, host-update re-projection, recovery and\n * re-attach replays, and the mask fast path). Returns the base unchanged\n * when no mask exists; otherwise a masked COPY with alpha multiplied by\n * nodeAlpha(i) (hide→0, dim→theme.mutedAlpha, §8 S10) — the cached base\n * stays unmasked for later drains.\n */\n function composeNodeAlphaBuffer(base: Float32Array): Float32Array {\n if (softMask === null || scene === null) return base;\n const out = new Float32Array(base);\n const n = scene.count;\n const dimAlpha = theme.mutedAlpha;\n for (let i = 0; i < n; i++) {\n const a = softMask.nodeAlpha(i, dimAlpha);\n if (a !== 1) out[4 * i + 3] = base[4 * i + 3]! * a;\n }\n return out;\n }\n\n function composeEdgeAlphaBuffer(base: Float32Array): Float32Array {\n if ((softMask === null && pathDimEdges === null) || scene === null) return base;\n const out = new Float32Array(base);\n const n = scene.linkCount;\n const dimAlpha = theme.mutedAlpha;\n for (let k = 0; k < n; k++) {\n const a = softMask === null ? 1 : softMask.edgeAlpha(k, dimAlpha);\n if (a !== 1) out[4 * k + 3] = base[4 * k + 3]! * a;\n }\n // §16.2 path emphasis (S12-T08): while a path is active it OWNS the link\n // lane — every non-path visible link dims through the same mutedAlpha\n // rule, composed INSIDE the standard composer so any drain (mask fast\n // path, re-projection, replay) preserves the emphasis until clearPath.\n if (pathDimEdges !== null) {\n for (const k of pathDimEdges) {\n if (k < n) out[4 * k + 3] = out[4 * k + 3]! * dimAlpha;\n }\n }\n return out;\n }\n\n /**\n * §9.1 mask FAST PATH (hide/show mutators, brushes, undo/redo of either):\n * source memberships (and the cascade) were already updated — drain the\n * mask and issue AT MOST ONE buffers-only commit rebuilding ONLY the\n * affected alpha channels, plus EXACTLY ONE store publication. Advances\n * scope+render (never model) when any slot flipped.\n */\n function publishMaskFastPath(extraPatch: Partial<GraphStoreState>, diagsChanged: boolean): void {\n const prev = store.getState();\n const patch: Partial<GraphStoreState> = { ...extraPatch };\n let labelRerank: RerankResult = { setChanged: false, diagsChanged: false };\n if (softMask !== null && scene !== null) {\n const drain = softMask.drainDirty();\n const nodesAffected = drain.nodes.length > 0 || drain.nodesAlpha.length > 0;\n const edgesAffected = drain.edges.length > 0 || drain.edgesAlpha.length > 0;\n if (nodesAffected || edgesAffected) {\n // §11: the visible set changed — 'visible'-scoped domains recompute.\n visibleGen += 1;\n const revisions: Revisions = { ...prev.revisions };\n revisions.scope += 1;\n revisions.render += 1; // desired render advances even while detached\n const eng = engineIfReady();\n if (eng !== null) {\n // §11 'visible' domain opt-in: those scale channels re-project in\n // the SAME commit (an explicit comparison-changing opt-out of the\n // §9.1 alpha-only fast path).\n const visDirty: DirtyChannels = {\n nodeColor: scaleUsesVisibleDomain(nodeColor),\n nodeSize: scaleUsesVisibleDomain(nodeSize),\n linkColor: false,\n linkWidth: false,\n };\n const buffers: NonNullable<EngineCommit['buffers']> =\n visDirty.nodeColor || visDirty.nodeSize\n ? { ...(projectChannelBuffers(visDirty) ?? {}) }\n : {};\n if (visDirty.nodeColor || visDirty.nodeSize) diagsChanged = true;\n if (nodesAffected && buffers.pointColor === undefined) {\n buffers.pointColor = composeNodeAlphaBuffer(basePointColorBuffer());\n }\n if (edgesAffected && buffers.linkColor === undefined) {\n buffers.linkColor = composeEdgeAlphaBuffer(baseLinkColorBuffer());\n }\n // NO structure, NO restart.\n commitToEngine(eng, { revision: revisions.render, buffers });\n revisions.appliedRender = eng.appliedRevision();\n }\n patch.revisions = revisions;\n const vis = computeVisibleCounts();\n if (!sameVisible(vis, prev.visible)) patch.visible = vis;\n labelRerank = recomputeCandidates(); // mask-hidden nodes leave the label lane\n }\n }\n if (diagsChanged || labelRerank.diagsChanged) patch.diagnostics = composeDiagnostics();\n if (Object.keys(patch).length > 0 || pendingHistoryDepths !== null) publish(patch);\n if (labelRerank.setChanged) notifyLabelSubs(candidateSubs);\n }\n\n // -------------------------------------------------------------------------\n // §16.6 crossfilter wiring (S9-T05..T09 subset).\n // -------------------------------------------------------------------------\n\n function sameDimensionSpecs(\n next: readonly DimensionSpec<N>[],\n prev: readonly DimensionSpec<N>[] | null,\n ): boolean {\n if (prev === null || next.length !== prev.length) return false;\n for (let i = 0; i < next.length; i++) {\n if (!Object.is(next[i], prev[i])) return false;\n }\n return true;\n }\n\n function disposeCrossfilter(): void {\n crossfilterEngine?.dispose();\n crossfilterEngine = null;\n crossfilterRowIds = [];\n crossfilterRowsRef = [];\n crossfilterHiddenBase.clear();\n }\n\n /** Facade-level session listeners: they must SURVIVE engine rebuilds (a\n * dataset change swaps the engine object; a subscription bound to the old\n * engine would silently die and the UI would never see the new data). */\n const crossfilterFacadeListeners = new Set<() => void>();\n function notifyCrossfilterFacade(): void {\n for (const cb of crossfilterFacadeListeners) cb();\n }\n\n /** (Re)build the engine over the accepted model's nodes (spec change /\n * first data). build() clears brushes and the external mask.\n *\n * D3 (validate before teardown, F10-04): the CANDIDATE engine builds\n * FIRST — a throwing build (duplicate dimension keys, invalid bins, a\n * throwing `get`) leaves the previous engine, brushes, mask, and facade\n * fully functional, reports one 'operation-rejected' diagnostic, and\n * returns false. Only a successful candidate disposes the predecessor. */\n function buildCrossfilterEngine(): boolean {\n if (crossfilterSpecs === null || accepted === null) {\n disposeCrossfilter();\n return false;\n }\n const candidate = new TypedColumnCrossfilter<N>();\n try {\n candidate.build(accepted.nodes, crossfilterSpecs);\n } catch (err) {\n candidate.dispose();\n engineDiags = [\n ...engineDiags,\n {\n code: 'operation-rejected',\n severity: 'warning',\n count: 1,\n sampleIds: [],\n message: `crossfilter dimension specs rejected: ${err instanceof Error ? err.message : String(err)} (the previous crossfilter state is unchanged)`,\n },\n ];\n return false;\n }\n disposeCrossfilter();\n crossfilterEngine = candidate;\n crossfilterRowIds = accepted.nodes.map((n) => n.id);\n crossfilterRowsRef = accepted.nodes;\n // Forward same-engine notifications to the stable facade listeners, and\n // fire once for the rebuild itself (the data under every summary changed).\n crossfilterEngine.subscribe(notifyCrossfilterFacade);\n notifyCrossfilterFacade();\n return true;\n }\n\n /**\n * Model-change sync (S9-T09 rules, F10-01 conformant): datasetKey change →\n * rebuild (brushes cleared); a PROVEN pure append → `appendRows` with ONLY\n * the new nodes (no rebuild, brushes persist); anything unproven →\n * `replaceAll` re-extraction (brushes preserved by dimension key).\n *\n * D1/I1: the append proof is row-object identity over the previously\n * extracted prefix — under the immutable-row contract an identical\n * reference IS the same row, whereas an id-stable prefix says nothing\n * about attrs (an attribute-only update must re-extract columns, or\n * histograms/brushes keep filtering the OLD values while styling shows\n * the new ones). Same length + all references identical is a proven\n * no-change and skips work entirely.\n * Returns whether brush selection state may have shifted.\n */\n function syncCrossfilterModel(datasetChanged: boolean): boolean {\n if (crossfilterEngine === null || crossfilterSpecs === null || accepted === null) return false;\n if (datasetChanged) {\n const had = crossfilterHiddenBase.size > 0;\n if (!buildCrossfilterEngine()) {\n // D3 data-path failure (e.g. a throwing `get` over the NEW rows):\n // the old engine holds the DEAD dataset's rows — dispose rather\n // than keep stale summaries; the diagnostic already landed.\n disposeCrossfilter();\n crossfilterSpecs = null;\n }\n return had;\n }\n const nodes = accepted.nodes;\n const prevRows = crossfilterRowsRef;\n const oldN = prevRows.length;\n let provenAppend = nodes.length >= oldN;\n if (provenAppend) {\n for (let i = 0; i < oldN; i++) {\n if (nodes[i] !== prevRows[i]) {\n provenAppend = false;\n break;\n }\n }\n }\n // D3: extraction over NEW rows runs user `get` accessors — a throw must\n // never tear the atomic update. On failure the engine's columns may be\n // half-extracted: dispose, drop the specs, keep the diagnostic.\n try {\n if (provenAppend) {\n if (nodes.length === oldN) return false; // proven unchanged (same rows)\n const delta = crossfilterEngine.appendRows(nodes.slice(oldN));\n for (let i = oldN; i < nodes.length; i++) crossfilterRowIds.push(nodes[i]!.id);\n crossfilterRowsRef = nodes;\n for (const s of delta.hidden) crossfilterHiddenBase.add(s);\n return true;\n }\n const delta = crossfilterEngine.replaceAll(nodes);\n crossfilterRowIds = nodes.map((n) => n.id);\n crossfilterRowsRef = nodes;\n crossfilterHiddenBase.clear();\n for (const s of delta.hidden) crossfilterHiddenBase.add(s);\n return true;\n } catch (err) {\n const had = crossfilterHiddenBase.size > 0;\n disposeCrossfilter();\n crossfilterSpecs = null;\n engineDiags = [\n ...engineDiags,\n {\n code: 'operation-rejected',\n severity: 'warning',\n count: 1,\n sampleIds: [],\n message: `crossfilter re-extraction failed on the new model: ${err instanceof Error ? err.message : String(err)} (crossfilter disabled until specs are re-applied)`,\n },\n ];\n return had;\n }\n }\n\n /**\n * §16.6 dual-layer external mask: BASE-index Uint8 pass array composed\n * from the filter prop's node mask (hide mode) + hiddenNodeIds, kept fresh\n * on every change of either. Affects summaries only, never selection.\n */\n function refreshCrossfilterExternalMask(hidden: ReadonlySet<NodeId>): void {\n if (crossfilterEngine === null) return;\n const n = crossfilterEngine.rowCount();\n const pass = new Uint8Array(n).fill(1);\n let any = false;\n for (let s = 0; s < n; s++) {\n const id = crossfilterRowIds[s];\n if (id === undefined) continue;\n if (hidden.has(id)) {\n pass[s] = 0;\n any = true;\n continue;\n }\n if (filterHiddenNodeSlots.size > 0 && scene !== null) {\n const idx = scene.indexById.get(id);\n if (idx !== undefined && filterHiddenNodeSlots.has(idx)) {\n pass[s] = 0;\n any = true;\n }\n }\n }\n crossfilterEngine.setExternalMask(any ? pass : null);\n }\n\n /**\n * Apply one brush through the engine and route the visibility delta into\n * the 'brushes' mask source. `coalesce` names the history entry window\n * (null = non-recording application, e.g. undo/redo). One publish.\n */\n function applyBrushInternal(\n key: string,\n brush: BrushState,\n coalesce: { key: string; windowMs: number } | null,\n extraPatch: Partial<GraphStoreState>,\n ): void {\n const eng = crossfilterEngine;\n if (eng === null) return;\n const before = eng.getBrush(key);\n const delta = eng.setBrush(key, brush);\n const after = eng.getBrush(key);\n if (before !== after && coalesce !== null) {\n historyKernel.beginCoalesced(coalesce.key, coalesce.windowMs, nowMs);\n historyKernel.record(`brush:${key}`, before, after);\n historyKernel.end();\n }\n const membershipChanged = delta.hidden.length > 0 || delta.shown.length > 0;\n for (const s of delta.hidden) crossfilterHiddenBase.add(s);\n for (const s of delta.shown) crossfilterHiddenBase.delete(s);\n if (membershipChanged && scene !== null) {\n ensureMask();\n refreshBrushMembership();\n refreshGroupMaskMembership(store.getState().hiddenNodeIds);\n cascadeNodeMask();\n }\n publishMaskFastPath(extraPatch, false);\n }\n\n /** USER brush path (the session facade): a brush on the playing timeline\n * key pauses playback, folded into the same publication. */\n function userSetBrush(key: string, brush: BrushState): void {\n const extraPatch: Partial<GraphStoreState> = {};\n if (timelinePlayingKey === key) {\n stopTimelineTimer();\n timelinePlayingKey = null;\n extraPatch.timeline = { playingKey: null };\n }\n applyBrushInternal(\n key,\n brush,\n { key: `brush:${key}`, windowMs: BRUSH_HISTORY_COALESCE_MS },\n extraPatch,\n );\n }\n\n function requireCrossfilterEngine(): TypedColumnCrossfilter<N> {\n if (crossfilterEngine === null) {\n throw new Error('crossfilter session is not available (set the crossfilter prop first, §16.6)');\n }\n return crossfilterEngine;\n }\n\n function getCrossfilterSession(): CrossfilterSession | null {\n if (destroyed || crossfilterEngine === null) return null;\n crossfilterSessionFacade ??= {\n get selectionRevision(): number {\n return crossfilterEngine?.selectionRevision ?? 0;\n },\n setBrush: (key: string, brush: BrushState): Promise<void> => {\n try {\n if (destroyed) throw new Error('setBrush() on a destroyed GraphInstance');\n requireCrossfilterEngine();\n acceptanceQueue.admit(() => {\n userSetBrush(key, brush);\n });\n return Promise.resolve(); // resolves after the (synchronous) publish\n } catch (err) {\n return Promise.reject(err instanceof Error ? err : new Error(String(err)));\n }\n },\n getBrush: (key: string) => requireCrossfilterEngine().getBrush(key),\n summarize: (key: string) => requireCrossfilterEngine().summarize(key),\n subscribe: (cb: () => void) => {\n requireCrossfilterEngine(); // throw early, matching the other members\n crossfilterFacadeListeners.add(cb);\n return () => {\n crossfilterFacadeListeners.delete(cb);\n };\n },\n };\n return crossfilterSessionFacade;\n }\n\n // -------------------------------------------------------------------------\n // §16.6 timeline playback (S9-T10). A setTimeout CHAIN (fake-timer\n // friendly); every brush goes through the crossfilter mask fast path.\n // -------------------------------------------------------------------------\n\n function stopTimelineTimer(): void {\n if (timelineTimer !== null) {\n clearTimeout(timelineTimer);\n timelineTimer = null;\n }\n }\n\n /** Stop playback WITHOUT publishing; returns the timeline patch to fold\n * into the caller's publication (null when nothing was playing). */\n function resetTimelineForPatch(): Partial<GraphStoreState> | null {\n stopTimelineTimer();\n if (timelinePlayingKey === null) return null;\n timelinePlayingKey = null;\n return { timeline: { playingKey: null } };\n }\n\n function playTimeline(key: string, playback?: Partial<TimelinePlayback>): void {\n if (destroyed) return;\n const eng = crossfilterEngine;\n if (eng === null) {\n throw new TypeError(\n 'playTimeline: the crossfilter prop must configure dimensions first (§16.6)',\n );\n }\n const summary = eng.summarize(key); // throws on an unknown dimension\n if (summary.kind === 'categorical' || summary.domain === undefined) {\n throw new TypeError(\n `playTimeline: dimension \"${key}\" must be numeric/temporal with a non-empty domain (§16.6)`,\n );\n }\n const { min, max } = summary.domain;\n const span = max - min;\n const mode = playback?.mode ?? 'sliding';\n const windowSize = playback?.window ?? span / 10;\n const tickMs = playback?.tickMs ?? TIMELINE_TICK_MS_DEFAULT;\n const step = playback?.step ?? TIMELINE_STEP_DEFAULT;\n const loop = playback?.loop ?? false;\n // D4/F10-06: reject invalid options at the boundary — BEFORE the current\n // timer is superseded or any state mutates. tickMs ≤ 0 would busy-loop\n // setTimeout; step ≤ 0 never terminates; a non-finite/negative window\n // yields a permanently-empty or throwing brush.\n if (!Number.isFinite(tickMs) || tickMs <= 0) {\n throw new TypeError(`playTimeline: tickMs must be a finite number > 0 (got ${String(tickMs)})`);\n }\n if (!Number.isFinite(step) || step <= 0) {\n throw new TypeError(`playTimeline: step must be a finite number > 0 (got ${String(step)})`);\n }\n if (!Number.isFinite(windowSize) || windowSize < 0) {\n throw new TypeError(\n `playTimeline: window must be a finite number >= 0 (got ${String(windowSize)})`,\n );\n }\n if (mode !== 'sliding' && mode !== 'cumulative') {\n throw new TypeError(`playTimeline: unsupported mode \"${String(mode)}\" (§16.6)`);\n }\n stopTimelineTimer(); // one playing dimension: a new play supersedes\n timelineSessionSeq += 1;\n const session = timelineSessionSeq;\n const coalesceKey = `timeline:${key}#${session}`;\n let progress = 0;\n timelinePlayingKey = key;\n\n const applyWindow = (extraPatch: Partial<GraphStoreState>): void => {\n const pos = min + span * progress;\n const brush: BrushState =\n mode === 'cumulative' ? { min, max: pos } : { min: pos, max: pos + windowSize };\n acceptanceQueue.admit(() => {\n applyBrushInternal(\n key,\n brush,\n { key: coalesceKey, windowMs: TIMELINE_COALESCE_WINDOW_MS },\n extraPatch,\n );\n });\n };\n\n const scheduleTick = (): void => {\n timelineTimer = setTimeout(() => {\n timelineTimer = null;\n if (destroyed || timelinePlayingKey !== key || timelineSessionSeq !== session) return;\n progress += step;\n if (progress > 1 + 1e-12) {\n if (loop) {\n progress = 0; // wrap\n } else {\n timelinePlayingKey = null; // stop at the end\n publish({ timeline: { playingKey: null } });\n return;\n }\n }\n try {\n applyWindow({});\n } catch {\n // Dimension vanished mid-play (spec rebuild): stop, never leak.\n timelinePlayingKey = null;\n publish({ timeline: { playingKey: null } });\n return;\n }\n scheduleTick();\n }, tickMs);\n };\n\n applyWindow({ timeline: { playingKey: key } });\n scheduleTick();\n }\n\n function pauseTimeline(): void {\n if (destroyed) return;\n stopTimelineTimer();\n if (timelinePlayingKey !== null) {\n timelinePlayingKey = null;\n publish({ timeline: { playingKey: null } });\n }\n }\n\n // -------------------------------------------------------------------------\n // §16.14 history application (S9-T20). undo()/redo() apply the kernel's\n // returned value-diff commands to the slices via NON-RECORDING setters —\n // one publish, at most one engine commit, engine pushes refreshed.\n // -------------------------------------------------------------------------\n\n function selectionPlain(s: SelectionState): SelectionState {\n return { nodeIds: [...s.nodeIds], edgeIds: [...s.edgeIds], groupIds: [...s.groupIds] };\n }\n\n function pinsPlain(\n pins: ReadonlyMap<NodeId, readonly [number, number]>,\n ): ReadonlyArray<readonly [NodeId, readonly [number, number]]> {\n return [...pins.entries()].map(([id, xy]) => [id, [xy[0], xy[1]] as const] as const);\n }\n\n function subgraphPlain(s: SubgraphSpec | null): SubgraphSpec | null {\n if (s === null) return null;\n return {\n seedIds: [...s.seedIds],\n ...(s.hops !== undefined ? { hops: s.hops } : {}),\n ...(s.reflow !== undefined ? { reflow: s.reflow } : {}),\n };\n }\n\n function applyHistoryCommands(commands: readonly HistoryCommand[]): void {\n const prev = store.getState();\n let selectionNext: SelectionState | null = null;\n let hiddenNext: Set<NodeId> | null = null;\n let pinsNext: Map<NodeId, readonly [number, number]> | null = null;\n let pinnedNodesNext: Set<NodeId> | null = null;\n let scopeTouched = false;\n /** §16.3 T03: an 'expansion' command restored the effective-set state —\n * shares the scope command's structural republication path below. */\n let effectiveTouched = false;\n /** §16.3: a 'folds' command changed stage-3 containment — needs the same\n * structural republication, but through the rewrite rather than the\n * scoped-model recompute (folds never change WHICH nodes are accepted). */\n let foldsTouched = false;\n let brushTouched = false;\n for (const cmd of commands) {\n if (cmd.slice === 'selection') {\n // Controlled selection is host-owned; such commands were never\n // recorded post-flip, and pre-flip leftovers are skipped (§6.4).\n if (!selectionControlled) selectionNext = selectionPlain(cmd.after as SelectionState);\n } else if (cmd.slice === 'hidden') {\n hiddenNext = new Set(cmd.after as readonly NodeId[]);\n } else if (cmd.slice === 'pins') {\n pinsNext = new Map(\n (cmd.after as ReadonlyArray<readonly [NodeId, readonly [number, number]]>).map(\n ([id, xy]) => [id, [xy[0], xy[1]] as const] as const,\n ),\n );\n } else if (cmd.slice === 'pinnedNodes') {\n // §16.3 T09: persistent pins — recorded by uncontrolled op writes\n // only; post-latch leftovers are skipped (the selection precedent).\n if (!pinnedControlled) pinnedNodesNext = new Set(cmd.after as readonly NodeId[]);\n } else if (cmd.slice === 'expansion') {\n // §16.3 T03: restore the FULL effective-set state (record stack +\n // collapse exclusions + scope accretion) — a walk restores the\n // identical effective set; overlay DATA persists either way (§7.5).\n const s = cmd.after as ExpansionStatePlain;\n expansionRecords = s.records.map((r) => ({\n expandedId: r.expandedId,\n addedNodeIds: [...r.addedNodeIds],\n overlayId: r.overlayId,\n }));\n effectiveRemovedIds.clear();\n for (const nid of s.removed) effectiveRemovedIds.add(nid);\n scopeExtraIds.clear();\n for (const nid of s.extras) scopeExtraIds.add(nid);\n effectiveTouched = true;\n } else if (cmd.slice === 'folds') {\n // §16.3 folds: restore the whole anchor→members map. Membership is\n // declared state over stable ids, so a restore is a pure structural\n // diff — no data moves either way.\n folds.clear();\n for (const [anchorId, memberIds] of cmd.after as [NodeId, NodeId[]][]) {\n folds.set(anchorId, [...memberIds]);\n }\n foldsTouched = true;\n } else if (cmd.slice === 'scope') {\n scopeSpec = subgraphPlain(cmd.after as SubgraphSpec | null);\n // An explicit scope statement resets accretion (§9.2) AND the T03\n // effective set (records + exclusions, R-16.3-09).\n scopeExtraIds.clear();\n expansionRecords = [];\n effectiveRemovedIds.clear();\n scopeTouched = true;\n } else if (cmd.slice.startsWith('brush:') && crossfilterEngine !== null) {\n const key = cmd.slice.slice('brush:'.length);\n try {\n const delta = crossfilterEngine.setBrush(key, cmd.after as BrushState);\n for (const s of delta.hidden) crossfilterHiddenBase.add(s);\n for (const s of delta.shown) crossfilterHiddenBase.delete(s);\n brushTouched = true;\n } catch {\n // Dimension no longer exists (spec rebuild since): skip inertly.\n }\n }\n }\n\n // Structural: a scope OR expansion command replays through the SAME\n // path as the subgraph prop (reconcile the scoped/trimmed subset,\n // cached positions, reflow).\n // A fold restore reaches the scene through the stage-3 rewrite inside\n // reconcileScene; recomputing the scoped model alongside is a no-op for\n // folds but keeps ONE republication path for every structural slice.\n const structuralTouched = scopeTouched || effectiveTouched || foldsTouched;\n let structuralChange = false;\n let positionChange = false;\n if (structuralTouched && accepted !== null) {\n const engBank = engineIfReady();\n if (engBank !== null && scene !== null) {\n const pos = engBank.getPositions();\n if (pos !== null) bankEnginePositions(pos);\n }\n scopedAccepted = computeScopedAccepted();\n const result = reconcileScene(scopedAccepted ?? accepted);\n labelPositionCache = null;\n adjacency = null;\n structuralChange = result.structuralChange;\n positionChange = result.positionChange;\n }\n\n const effHidden = hiddenNext ?? prev.hiddenNodeIds;\n let filterDiagsChanged = false;\n if (structuralTouched) {\n filterDiagsChanged = rebuildMaskMemberships(effHidden);\n } else if (hiddenNext !== null || brushTouched) {\n if (\n scene !== null &&\n (softMask !== null || effHidden.size > 0 || crossfilterHiddenBase.size > 0)\n ) {\n ensureMask();\n if (hiddenNext !== null) refreshHiddenMembership(effHidden);\n if (brushTouched) refreshBrushMembership();\n refreshGroupMaskMembership(effHidden);\n cascadeNodeMask();\n }\n }\n if (crossfilterEngine !== null && (hiddenNext !== null || structuralTouched)) {\n // structuralTouched: scene slots shifted, so the filter-slot mapping\n // in the external mask must re-derive against the new scene.\n refreshCrossfilterExternalMask(effHidden);\n }\n\n const patch: Partial<GraphStoreState> = {};\n if (selectionNext !== null) patch.selection = selectionNext;\n if (hiddenNext !== null) patch.hiddenNodeIds = hiddenNext;\n if (pinsNext !== null) patch.pins = pinsNext;\n if (pinnedNodesNext !== null) patch.pinnedNodeIds = pinnedNodesNext;\n if (scopeTouched) patch.scope = scopeSpec;\n\n const eng = engineIfReady();\n let revisions = prev.revisions;\n let simRestarted = false;\n if (structuralTouched && scene !== null) {\n const buffers = projectChannelBuffers({\n nodeColor: true,\n nodeSize: true,\n linkColor: true,\n linkWidth: true,\n });\n const structure: EngineCommit['structure'] | undefined =\n structuralChange || positionChange\n ? { pointCount: scene.count, positions: scene.positions, links: scene.links }\n : undefined;\n const commitNeeded = structure !== undefined || buffers !== undefined;\n revisions = { ...prev.revisions };\n revisions.scope += 1;\n if (commitNeeded) revisions.render += 1;\n if (commitNeeded && eng !== null) {\n const commit: EngineCommit = { revision: revisions.render };\n if (structure !== undefined) {\n commit.structure = structure;\n // I2: a scoped roster ships with ITS index, never the previous\n // roster's (F11-03).\n const syncIndex = structuralPointImageIndex();\n if (syncIndex !== null) commit.resources = { pointImageIndex: syncIndex };\n }\n if (buffers !== undefined) commit.buffers = buffers;\n if (structure !== undefined && layout === 'force') {\n const reflow = scopeSpec === null || scopeSpec.reflow !== false;\n if (reflow) {\n commit.restart = { alpha: 1 };\n simRestarted = true;\n }\n }\n eng.commit(commit);\n revisions.appliedRender = eng.appliedRevision();\n const facade = session !== null ? session.edgePicking : null;\n if (facade !== null) {\n if (commit.restart !== undefined && commit.restart !== false) facade.disarm();\n else if (structure !== undefined) facade.arm(scene.positions, scene.links);\n }\n }\n } else if (softMask !== null && scene !== null) {\n const drain = softMask.drainDirty();\n const nodesAffected = drain.nodes.length > 0 || drain.nodesAlpha.length > 0;\n const edgesAffected = drain.edges.length > 0 || drain.edgesAlpha.length > 0;\n if (nodesAffected || edgesAffected) {\n revisions = { ...prev.revisions };\n revisions.scope += 1;\n revisions.render += 1;\n if (eng !== null) {\n const buffers: NonNullable<EngineCommit['buffers']> = {};\n if (nodesAffected) buffers.pointColor = composeNodeAlphaBuffer(basePointColorBuffer());\n if (edgesAffected) buffers.linkColor = composeEdgeAlphaBuffer(baseLinkColorBuffer());\n eng.commit({ revision: revisions.render, buffers });\n revisions.appliedRender = eng.appliedRevision();\n }\n }\n }\n if (revisions !== prev.revisions) patch.revisions = revisions;\n const vis = computeVisibleCounts();\n if (!sameVisible(vis, prev.visible)) patch.visible = vis;\n if (simRestarted && !prev.simulationRunning) patch.simulationRunning = true;\n const labelRerank =\n structuralTouched || hiddenNext !== null || brushTouched\n ? recomputeCandidates()\n : { setChanged: false, diagsChanged: false };\n if (labelRerank.diagsChanged || filterDiagsChanged) patch.diagnostics = composeDiagnostics();\n publish(patch); // folds the kernel's depth notification\n\n // Engine pushes refreshed: ALL selected indices are re-pushed even when\n // the mask hides some — engine greyout handles hidden ones and masked\n // selected ids stay in SelectionState (§16.2 R-16.2-05..08).\n if (eng !== null) {\n const selForPush = selectionNext ?? prev.selection;\n if (selectionNext !== null || (structuralChange && selForPush.nodeIds.length > 0)) {\n pushSelectionToEngine(eng, selForPush.nodeIds);\n }\n const pinsForPush = pinsNext ?? prev.pins;\n const persistentSize = store.getState().pinnedNodeIds.size;\n if (\n pinsNext !== null ||\n pinnedNodesNext !== null ||\n (structuralChange && (pinsForPush.size > 0 || persistentSize > 0))\n ) {\n pushPinsToEngine(eng, pinsForPush);\n }\n }\n if (labelRerank.setChanged) notifyLabelSubs(candidateSubs);\n }\n\n /**\n * §16.14 history walk with the aggregate protocol: a step touching a\n * host-owned lane emits ONE viewStateRestore intent and the cursor holds\n * (store depths unchanged, nothing applied) until the host's reflection\n * acknowledges; timeout/divergence puts the cursor back. Steps with no\n * controlled participation — or with no restore listener registered (the\n * pre-S15 behavior, where controlled leftovers skip inertly) — apply\n * synchronously as before. A walk during a pending restore returns false.\n */\n function walkHistory(direction: 'undo' | 'redo'): boolean {\n if (destroyed) return false;\n return acceptanceQueue.admit(() => {\n if (pendingRestore !== null) return false; // concurrent walk rejects as pending\n const commands = direction === 'undo' ? historyKernel.undo() : historyKernel.redo();\n if (commands === null) return false;\n\n const controlledAfters: PendingRestore['awaiting'] = {};\n for (const cmd of commands) {\n if (cmd.slice === 'selection' && selectionControlled) {\n controlledAfters.selection = (cmd.after as SelectionState).nodeIds;\n } else if (cmd.slice === 'pinnedNodes' && pinnedControlled) {\n controlledAfters.pinnedNodeIds = cmd.after as readonly NodeId[];\n }\n }\n const needsHost = Object.keys(controlledAfters).length > 0 && hasRestoreListener();\n\n if (!needsHost) {\n clearPathInternal(); // §16.2: path highlight never survives a walk\n applyHistoryCommands(commands);\n return true;\n }\n\n // Stage: hold every command (the applier skips controlled slices\n // internally, so applying all on commit is safe — the host's\n // reflection is what writes those lanes).\n const transactionId = `restore-${++restoreTxSeq}`;\n const next: GraphViewState = {\n ...captureViewState(),\n ...(controlledAfters.selection !== undefined\n ? {\n selection: {\n nodeIds: [...controlledAfters.selection],\n edgeIds: [],\n groupIds: [],\n },\n }\n : {}),\n ...(controlledAfters.pinnedNodeIds !== undefined\n ? { pinnedNodeIds: [...controlledAfters.pinnedNodeIds] }\n : {}),\n };\n pendingRestore = {\n transactionId,\n source: direction,\n commands,\n awaiting: controlledAfters,\n finish: () => {},\n recordOnCommit: false, // the kernel entry already exists\n rollbackCursor: () => {\n // Cursor-only restore: nothing was applied, so the inverse walk is\n // a pure cursor move whose returned commands are discarded.\n if (direction === 'undo') historyKernel.redo();\n else historyKernel.undo();\n },\n resolve: () => {}, // history walks report via the boolean + store depths\n timer: setTimeout(() => failPendingRestore('restore-timeout'), RESTORE_ACK_TIMEOUT_MS),\n };\n emit('viewStateRestore', { transactionId, source: direction, next });\n return true;\n });\n }\n\n function undo(): boolean {\n return walkHistory('undo');\n }\n\n function redo(): boolean {\n return walkHistory('redo');\n }\n\n // -------------------------------------------------------------------------\n // §14 overlay label lane + scheduler (S7-T02/T12). Re-ranks are THROTTLED\n // (viewport idle, model change, config change, settle) — never per frame.\n // Frame ticks do a pure O(k) CPU-cache → spaceToScreen projection.\n // -------------------------------------------------------------------------\n\n function effectiveReducedMotion(): boolean {\n return accessibilityConfig?.reducedMotion ?? bindingReducedMotion ?? false;\n }\n\n function labelsEnabled(): boolean {\n return labelsConfig !== undefined && labelsConfig.enabled !== false;\n }\n\n /** Container-relative cull rect; null when the size is unknown (headless). */\n function containerScreenRect(): readonly [number, number, number, number] | null {\n if (session === null) return null;\n const el = session.container as Partial<Pick<HTMLElement, 'clientWidth' | 'clientHeight'>>;\n const w = el.clientWidth;\n const h = el.clientHeight;\n if (typeof w !== 'number' || typeof h !== 'number' || w <= 0 || h <= 0) return null;\n return [0, 0, w, h];\n }\n\n function sameCandidates(a: readonly LabelPlacement[], b: readonly LabelCandidate[]): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n const p = a[i]!;\n const c = b[i]!;\n if (p.id !== c.id || p.text !== c.text || p.forced !== c.forced || p.kind !== c.kind) {\n return false;\n }\n }\n return true;\n }\n\n /** O(k) per tick: project the CURRENT set's cached space positions through\n * engine.spaceToScreen, mutating the reused placements in place. Zero\n * allocations beyond the engine's return tuple.\n *\n * R-16.3-21: a CLUSTER placement reads its precomputed anchor by ordinal —\n * ONE O(1) lookup, never a member scan. The anchor is the force center\n * while the sim is hot and the settled centroid afterwards, so the anchor\n * array (not this tick) owns the \"which coordinate\" decision. */\n function projectPlacements(eng: GraphEngine): void {\n if (scene === null || eng.spaceToScreen === undefined) return;\n const positions = labelPositionCache ?? scene.positions;\n const anchors = clusterAnchors;\n const ordinals = clusterDerivation?.ordinalByKey;\n for (const p of currentPlacements) {\n let x: number;\n let y: number;\n if (p.kind === 'cluster') {\n if (anchors === null || ordinals === undefined) continue;\n const ordinal = ordinals.get(p.id);\n if (ordinal === undefined || 2 * ordinal + 1 >= anchors.length) continue;\n x = anchors[2 * ordinal]!;\n y = anchors[2 * ordinal + 1]!;\n } else {\n const idx = scene.indexById.get(p.id);\n if (idx === undefined || 2 * idx + 1 >= positions.length) continue;\n x = positions[2 * idx]!;\n y = positions[2 * idx + 1]!;\n }\n if (Number.isNaN(x) || Number.isNaN(y)) continue;\n projectScratch[0] = x;\n projectScratch[1] = y;\n const s = eng.spaceToScreen(projectScratch);\n if (s !== null) {\n p.x = s[0];\n p.y = s[1];\n }\n }\n }\n\n /**\n * §16.3 cluster-label candidates (T07). One candidate per derived cluster,\n * capacity-capped like node labels (member count desc, ordinal tie-break)\n * and viewport-culled through the anchor — NOT through any member scan\n * (R-16.3-21). Empty when no spec is active or the zoom is above the\n * `label.maxZoom` band.\n */\n function clusterLabelCandidates(\n cfg: LabelConfig<N>,\n zoom: number,\n k: number,\n ): readonly LabelCandidate[] {\n const derivation = clusterDerivation;\n const anchors = clusterAnchors;\n if (derivation === null || anchors === null || derivation.keys.length === 0) return [];\n if (cfg.maxZoom !== undefined && zoom > cfg.maxZoom) return [];\n\n const eng = engineIfReady();\n const rect = containerScreenRect();\n const toScreen = eng?.spaceToScreen;\n const inView = (ordinal: number): boolean => {\n if (eng === null || toScreen === undefined || rect === null) return true;\n const x = anchors[2 * ordinal]!;\n const y = anchors[2 * ordinal + 1]!;\n if (Number.isNaN(x) || Number.isNaN(y)) return true; // unplaced ⇒ fail open\n projectScratch[0] = x;\n projectScratch[1] = y;\n const s = toScreen.call(eng, projectScratch);\n if (s === null || s === undefined) return true;\n return s[0] >= rect[0] && s[0] <= rect[2] && s[1] >= rect[1] && s[1] <= rect[3];\n };\n\n const ranked: { ordinal: number; size: number }[] = [];\n for (let i = 0; i < derivation.keys.length; i++) {\n if (!inView(i)) continue;\n ranked.push({ ordinal: i, size: derivation.membersByKey.get(derivation.keys[i]!)!.length });\n }\n ranked.sort((a, b) => b.size - a.size || a.ordinal - b.ordinal);\n const take = Math.min(ranked.length, k);\n const out: LabelCandidate[] = [];\n for (let j = 0; j < take; j++) {\n const key = derivation.keys[ranked[j]!.ordinal]!;\n out.push({ id: key, text: key, forced: false, kind: 'cluster' });\n }\n return out;\n }\n\n /** Subscriber faults are isolated so an overlay callback can never break the\n * frame loop or the applyHostUpdate transaction. */\n function notifyLabelSubs(subs: ReadonlySet<LabelListener>): void {\n if (subs.size === 0) return;\n for (const cb of Array.from(subs)) {\n try {\n cb(currentPlacements);\n } catch {\n /* isolated */\n }\n }\n }\n\n interface RerankResult {\n setChanged: boolean;\n diagsChanged: boolean;\n }\n\n /**\n * Recompute the candidate set (throttled callers only). Updates\n * `currentPlacements` (new objects on set change, projected once so replay\n * and candidate emissions carry coordinates) and the single 'label-overload'\n * diagnostic — one update per overload-count transition, no per-tick spam.\n * The CALLER publishes diagnostics and notifies candidate subscribers, so\n * applyHostUpdate can fold both into its one store publication.\n */\n function recomputeCandidates(): RerankResult {\n const eng = engineIfReady();\n const cfg = labelsConfig;\n let next: readonly LabelCandidate[] = [];\n let overload = 0;\n // §9.2/§16.3: the label lane ranks over the SCENE model — scene index i\n // is position i of the (scoped, stage-3-rewritten) model fed to the\n // reconciler. `nodes` is the PHYSICAL prefix only: synthetic slots read\n // `nodes[i] === undefined`, so caller getText/getWeight are never invoked\n // with super-nodes (R-6.1-14); their placeholder candidates (id text)\n // are dropped below so internal scene keys never escape (§7.4).\n const labelModel = sceneModel();\n if (eng !== null && scene !== null && labelModel !== null && cfg !== undefined && cfg.enabled !== false) {\n const sceneRef = scene;\n const vp = store.getState().viewport ?? eng.getViewport() ?? { x: 0, y: 0, zoom: 1 };\n const k = Math.max(\n 0,\n Math.min(Math.floor(cfg.maxVisible ?? LABEL_MAX_VISIBLE_DEFAULT), LABEL_MAX_VISIBLE_CAP),\n );\n // §16.3 T07 LOD hand-off: at/below `maxZoom` the CLUSTER band owns the\n // lane and node labels are suppressed; above it node-label LOD\n // (`minZoom`) takes over and cluster labels stop. With no `maxZoom` the\n // two bands coexist, each on its own gate.\n const clusterCandidates = clusterLabelCandidates(cfg, vp.zoom, k);\n const nodeLabelsSuppressed = cfg.maxZoom !== undefined && vp.zoom <= cfg.maxZoom;\n const viewport: LabelCandidateViewport = { zoom: vp.zoom };\n const rect = containerScreenRect();\n if (rect !== null) viewport.screenRect = rect;\n const toScreen = eng.spaceToScreen;\n if (toScreen !== undefined) viewport.spaceToScreen = (p) => toScreen.call(eng, p);\n const selArgs: SelectLabelCandidatesArgs<N> = {\n scene: sceneRef,\n nodes: groupRewrite !== null ? groupRewrite.physicalNodes : labelModel.nodes,\n positions: labelPositionCache ?? sceneRef.positions,\n viewport,\n config: cfg,\n degreeOf: (i) => {\n if (adjacency === null) adjacency = buildAdjacency(sceneRef.links, sceneRef.count);\n return adjacency.offsets[i + 1]! - adjacency.offsets[i]!;\n },\n };\n const inRect = eng.pointsInRect;\n if (inRect !== undefined) selArgs.pointsInRect = (r) => inRect.call(eng, r);\n let nodeCandidates: readonly LabelCandidate[] = [];\n if (!nodeLabelsSuppressed) {\n const result = selectLabelCandidates(selArgs);\n nodeCandidates = result.placements;\n overload = result.overloadCount;\n // §9.1: mask-hidden nodes are excluded from the label lane (post-filter\n // the placements — ranking stays pure; forced ids honor the mask too).\n // §16.3: synthetic suffix slots are excluded entirely in this slice —\n // super-node labels arrive with the group event wiring (S12-T02).\n const physBound = physicalPointCount();\n if (softMask !== null || groupRewrite !== null) {\n nodeCandidates = nodeCandidates.filter((c) => {\n const i = sceneRef.indexById.get(c.id);\n if (i === undefined) return true;\n if (i >= physBound) return false;\n return softMask === null || softMask.isNodeVisible(i);\n });\n }\n }\n // Cluster labels lead: they are the coarser layer, and the array order\n // is the overlay's paint order.\n next = clusterCandidates.length === 0 ? nodeCandidates : [...clusterCandidates, ...nodeCandidates];\n }\n\n const setChanged = !sameCandidates(currentPlacements, next);\n if (setChanged) {\n currentPlacements = next.map((c) => ({\n id: c.id,\n text: c.text,\n x: 0,\n y: 0,\n forced: c.forced,\n ...(c.kind !== undefined ? { kind: c.kind } : {}),\n }));\n const engNow = engineIfReady();\n if (engNow !== null) projectPlacements(engNow);\n }\n\n let diagsChanged = false;\n if (overload !== lastOverloadCount) {\n lastOverloadCount = overload;\n labelDiags =\n overload === 0\n ? []\n : [\n {\n code: 'label-overload',\n severity: 'warning',\n count: overload,\n sampleIds: [],\n message: `showLabelsFor exceeds tracked-label capacity; ${overload} forced label(s) omitted (§14)`,\n },\n ];\n diagsChanged = true;\n }\n return { setChanged, diagsChanged };\n }\n\n /** Standalone re-rank (viewport idle, settle, ready): publish + notify here. */\n function rerankAndNotify(): void {\n if (destroyed) return;\n const r = recomputeCandidates();\n if (r.diagsChanged) publish({ diagnostics: composeDiagnostics() });\n if (r.setChanged) notifyLabelSubs(candidateSubs);\n }\n\n /** §14 viewport-driven re-rank: >=100ms trailing throttle (fires at camera\n * idle when events stop); bursts coalesce into ONE recompute. */\n function scheduleViewportRerank(): void {\n if (destroyed || rerankTimer !== null || !labelsEnabled()) return;\n rerankTimer = setTimeout(() => {\n rerankTimer = null;\n rerankAndNotify();\n }, LABEL_RERANK_THROTTLE_MS);\n }\n\n function cancelRerankTimer(): void {\n if (rerankTimer !== null) {\n clearTimeout(rerankTimer);\n rerankTimer = null;\n }\n }\n\n function subscribeLabelChannel(subs: Set<LabelListener>, cb: LabelListener): () => void {\n if (destroyed) return () => {};\n subs.add(cb);\n try {\n cb(currentPlacements); // replay current state on subscribe\n } catch {\n /* isolated */\n }\n return () => {\n subs.delete(cb);\n };\n }\n\n /** Project the requested channels against the current RENDER model (the\n * scoped subset when a hard scope is active — buffers must align with the\n * scene, §9.2). Channels without a configured accessor are skipped. */\n // -------------------------------------------------------------------------\n // §11/§12 scale channels (S10). Scales are plain descriptors detected by\n // their 'kind' discriminant and compared by canonical structural key —\n // equal inline literals never reproject. Metric values come from the\n // MetricStore over the FULL accepted model; domains resolve through the\n // DomainStore's freeze coordinates. EVERY caller-supplied numeric input\n // (explicit domains, ranges, mid, palettes) routes through coerceNumeric.\n // -------------------------------------------------------------------------\n\n type AnyScale = Scale<string, N> | Scale<number, N>;\n\n function isScaleValue(v: unknown): v is AnyScale {\n if (typeof v !== 'object' || v === null) return false;\n const kind = (v as { kind?: unknown }).kind;\n return kind === 'sequential' || kind === 'categorical' || kind === 'diverging';\n }\n\n /** §8 per-channel dirty comparison: reference identity first, canonical\n * structural equality for Scale descriptors (equal literals never\n * reproject — a function `by` keys by reference via the WeakMap token). */\n function sameChannelValue(next: unknown, prevValue: unknown): boolean {\n if (Object.is(next, prevValue)) return true;\n if (isScaleValue(next) && isScaleValue(prevValue)) {\n return (\n canonicalScaleKey(next as Scale<unknown, N>) ===\n canonicalScaleKey(prevValue as Scale<unknown, N>)\n );\n }\n return false;\n }\n\n /** Does this channel carry a sequential/diverging scale over one of the\n * just-admitted metric names? (§12 targeted re-dirty.) */\n function scaleReferencesMetric(channel: unknown, names: ReadonlySet<string>): boolean {\n if (!isScaleValue(channel) || channel.kind === 'categorical') return false;\n return names.has(channel.metric);\n }\n\n /** Does this channel's domain policy opt into 'visible' recompute (§11)? */\n function scaleUsesVisibleDomain(channel: unknown): boolean {\n if (!isScaleValue(channel) || channel.kind !== 'sequential') return false;\n const d = channel.domain;\n return d !== undefined && !Array.isArray(d) && (d as DomainPolicy).scope === 'visible';\n }\n\n /**\n * Sync the MetricStore to the current accepted model (lazy — the flat link\n * buffer and CSR adjacency are built on FIRST metric use per model\n * revision, §12). Returns false when there is no accepted model.\n */\n function ensureMetricModel(): boolean {\n if (accepted === null) return false;\n const key = `${accepted.datasetKey}\u0000${String(accepted.sourceRevision)}\u0000${String(acceptedModelSeq)}`;\n if (metricModelKey === key) return true;\n const { edges, nodeIndex, nodes } = accepted;\n const links = new Uint32Array(edges.length * 2);\n for (let i = 0; i < edges.length; i++) {\n const e = edges[i]!;\n links[2 * i] = nodeIndex.get(e.source)!;\n links[2 * i + 1] = nodeIndex.get(e.target)!;\n }\n metricStore.setModel({\n nodes,\n adjacency: buildAdjacency(links, nodes.length),\n links,\n datasetRevision: `${accepted.datasetKey}\u0000${String(accepted.sourceRevision)}`,\n modelRevision: acceptedModelSeq,\n });\n metricModelKey = key;\n return true;\n }\n\n /** Metric value for one RENDER-model node via the accepted id→index map. */\n function metricValueForNode(node: GraphNode<N>, metric: MetricName): number | null {\n if (accepted === null) return null;\n const idx = accepted.nodeIndex.get(node.id);\n if (idx === undefined) return null;\n return metricStore.getMetricValue(metric, idx);\n }\n\n /** §11 domain freeze coordinate: accepted source+model revision, extended\n * with the metric's column-admission generation so a later-arriving column\n * recomputes exactly the domains that reference it. */\n /**\n * §11/F11-02: the DEFAULT freeze coordinate is dataset-scoped — source\n * revision + the metric's column generation, NEVER the progressive\n * publication sequence, so inferred domains stay frozen across overlay\n * flushes (\"frozen across progressive batches\", spec §11). 'expand' opts\n * back into per-publication resolution: each flush recomputes and unions\n * WITHIN the current source lineage (the DomainStore lineage guard keeps\n * a replacement from unioning against dead extrema).\n */\n function domainDatasetRevision(\n metric: MetricName,\n streaming: 'freeze-per-revision' | 'expand',\n ): string {\n const src = String(accepted?.sourceRevision);\n const gen = String(metricColumnGen.get(metric) ?? 0);\n return streaming === 'expand' ? `${src}#${String(acceptedModelSeq)}#${gen}` : `${src}#${gen}`;\n }\n\n /** Domain producer per §11 scope: 'dataset' spans the full accepted metric\n * column; 'hard-scope' the scoped render model; 'visible' additionally\n * restricts to §9.1 mask-visible slots. §8 hygiene throughout. */\n function computeMetricDomain(\n metric: MetricName,\n scope: 'dataset' | 'hard-scope' | 'visible',\n ): readonly [number, number] | null {\n if (!ensureMetricModel()) return null;\n if (scope === 'dataset') {\n const column = metricStore.metricValues(metric);\n return column === null ? null : computeNumericDomain(column);\n }\n const model = sceneModel();\n if (model === null) return null;\n let min = Infinity;\n let max = -Infinity;\n let seen = false;\n // Synthetic suffix slots are excluded: metrics are physical-node values\n // and super-nodes never join a domain (§11/§16.3).\n const bound = groupRewrite !== null ? groupRewrite.physicalNodeCount : model.nodes.length;\n for (let i = 0; i < bound; i++) {\n if (scope === 'visible' && softMask !== null && !softMask.isNodeVisible(i)) continue;\n const v = metricValueForNode(model.nodes[i]!, metric);\n if (v === null) continue;\n seen = true;\n if (v < min) min = v;\n if (v > max) max = v;\n }\n return seen ? [min, max] : null;\n }\n\n /** Resolve a sequential/diverging scale's domain through the DomainStore\n * (explicit numeric domains win verbatim; policies freeze per §11). */\n function resolveScaleDomain(\n scale: Extract<AnyScale, { kind: 'sequential' | 'diverging' }>,\n ): readonly [number, number] | null {\n if (accepted === null) return null;\n let explicit: readonly [number, number] | undefined;\n let policy: DomainPolicy | undefined;\n if (scale.kind === 'sequential' && scale.domain !== undefined) {\n if (Array.isArray(scale.domain)) {\n const lo = coerceNumeric(scale.domain[0]);\n const hi = coerceNumeric(scale.domain[1]);\n if (lo !== null && hi !== null) explicit = [lo, hi];\n } else {\n policy = scale.domain as DomainPolicy;\n }\n }\n const scope = policy?.scope ?? 'dataset';\n const streaming = policy?.streaming ?? 'freeze-per-revision';\n const scopeGeneration =\n scope === 'hard-scope' ? hardScopeGen : scope === 'visible' ? visibleGen : 0;\n return domainStore.resolveDomain({\n key: canonicalScaleKey(scale as Scale<unknown, N>),\n explicit,\n policy,\n datasetRevision: domainDatasetRevision(scale.metric, streaming),\n lineage: `${accepted.datasetKey}#${String(accepted.sourceRevision)}`,\n scopeGeneration,\n compute: () => computeMetricDomain(scale.metric, scope),\n });\n }\n\n function clampUnit(v: number): number {\n return v < 0 ? 0 : v > 1 ? 1 : v;\n }\n\n /** Categorical `by` → string|null getter: 'id'/attrs-field per the\n * FilterExpr convention (string as-is, finite numbers and booleans\n * stringified, everything else null); functions guarded (throw → null). */\n function categoricalByGetter(\n by: string | ((node: GraphNode<N>) => string | null),\n ): (node: GraphNode<N>) => string | null {\n if (typeof by === 'function') {\n return (node) => {\n let v: unknown;\n try {\n v = by(node);\n } catch {\n return null;\n }\n return typeof v === 'string' ? v : null;\n };\n }\n return (node) => {\n const v = resolveFilterField(node, by);\n if (typeof v === 'string') return v;\n if (typeof v === 'number' && Number.isFinite(v)) return String(v);\n if (typeof v === 'boolean') return String(v);\n return null;\n };\n }\n\n /** Scale<string> → per-node CSS color accessor. Null metric values and\n * out-of-palette categories fall back to theme.nodeDefault (§8/§11). */\n function scaleColorAccessor(scale: Scale<string, N>): (node: GraphNode<N>) => string {\n const fallbackCss = theme.nodeDefault;\n if (scale.kind === 'categorical') {\n const palette = scale.palette ?? CATEGORICAL_PALETTE;\n const domain = scale.domain;\n const by = categoricalByGetter(scale.by);\n return (node) => {\n const value = by(node);\n if (value === null) return fallbackCss;\n const idx = categoricalIndex(domain, palette, value);\n const css = idx === -1 ? undefined : palette[idx];\n return typeof css === 'string' ? css : fallbackCss;\n };\n }\n ensureMetricModel();\n const metric = scale.metric;\n const domain = resolveScaleDomain(scale);\n if (scale.kind === 'sequential') {\n return (node) =>\n sequentialColor(scale, metricValueForNode(node, metric), domain) ?? fallbackCss;\n }\n const mid = coerceNumeric(scale.mid);\n return (node) => {\n if (mid === null) return fallbackCss;\n return divergingColor(scale, metricValueForNode(node, metric), domain) ?? fallbackCss;\n };\n }\n\n /** Scale<number> → per-node size accessor. Null metrics and junk\n * ranges/palettes fall back to the default size 4 (§8 hygiene — NaN can\n * never reach the size buffer). */\n function scaleSizeAccessor(scale: Scale<number, N>): (node: GraphNode<N>) => number {\n const FALLBACK_SIZE = 4;\n if (scale.kind === 'categorical') {\n const palette = scale.palette;\n const domain = scale.domain;\n const by = categoricalByGetter(scale.by);\n return (node) => {\n if (palette === undefined || palette.length === 0) return FALLBACK_SIZE;\n const value = by(node);\n if (value === null) return FALLBACK_SIZE;\n const idx = categoricalIndex(domain, palette, value);\n const size = idx === -1 ? null : coerceNumeric(palette[idx]);\n return size === null ? FALLBACK_SIZE : size;\n };\n }\n ensureMetricModel();\n const metric = scale.metric;\n const domain = resolveScaleDomain(scale);\n if (scale.kind === 'sequential') {\n const lo = coerceNumeric(scale.range[0]);\n const hi = coerceNumeric(scale.range[1]);\n return (node) => {\n if (lo === null || hi === null) return FALLBACK_SIZE;\n return sequentialSize([lo, hi], metricValueForNode(node, metric), domain) ?? FALLBACK_SIZE;\n };\n }\n // Diverging size: each half interpolates independently (mirrors\n // divergingColor's piecewise semantics over a numeric range).\n const mid = coerceNumeric(scale.mid);\n const r0 = coerceNumeric(scale.range[0]);\n const r1 = coerceNumeric(scale.range[1]);\n const r2 = coerceNumeric(scale.range[2]);\n return (node) => {\n if (mid === null || r0 === null || r1 === null || r2 === null || domain === null) {\n return FALLBACK_SIZE;\n }\n const v = metricValueForNode(node, metric);\n if (v === null) return FALLBACK_SIZE;\n let size: number;\n if (v <= mid) {\n const span = mid - domain[0];\n const t = !Number.isFinite(span) || span <= 0 ? 1 : clampUnit((v - domain[0]) / span);\n size = r0 + (r1 - r0) * t;\n } else {\n const span = domain[1] - mid;\n const t = !Number.isFinite(span) || span <= 0 ? 0 : clampUnit((v - mid) / span);\n size = r1 + (r2 - r1) * t;\n }\n return Number.isFinite(size) ? size : FALLBACK_SIZE;\n };\n }\n\n /** theme.nodeDefault as the projection RGBA fallback for scale channels. */\n function themeNodeDefaultRgba(): RGBA {\n return parseColor(theme.nodeDefault) ?? [0.66, 0.66, 0.66, 1];\n }\n\n /**\n * §8 dev inline-lambda detector: after EVERY projection of a\n * function-valued channel, fingerprint the first 8 sampled outputs (O(8),\n * unconditional). ≥3 consecutive projections with an identical fingerprint\n * emit ONE 'accessor-churn' diagnostic per streak; a changed fingerprint\n * (or a non-function channel value) resets the streak.\n */\n function noteChannelProjection(\n channel: 'nodeColor' | 'nodeSize' | 'linkColor' | 'linkWidth',\n value: unknown,\n items: readonly unknown[],\n ): void {\n const state = churnStates[channel];\n if (typeof value !== 'function') {\n state.fp = null;\n state.streak = 0;\n state.emitted = false;\n return;\n }\n const fn = value as (item: unknown) => unknown;\n const n = Math.min(8, items.length);\n let fp = '';\n for (let i = 0; i < n; i++) {\n let sample: string;\n try {\n sample = String(fn(items[i]));\n } catch {\n sample = '\u0001err';\n }\n fp += sample + '\u0000';\n }\n if (state.fp === fp) {\n state.streak += 1;\n } else {\n state.fp = fp;\n state.streak = 1;\n state.emitted = false;\n }\n if (state.streak >= 3 && !state.emitted) {\n state.emitted = true;\n churnDiags = [\n ...churnDiags,\n {\n code: 'accessor-churn',\n severity: 'warning',\n count: state.streak,\n sampleIds: [],\n message:\n `${channel} reprojected on ${state.streak} consecutive commits with identical ` +\n 'sampled outputs — likely an inline lambda prop; hoist or memoize it (§8)',\n },\n ];\n }\n }\n\n /**\n * §16.3 stage-6 aggregate channels (R-6.1-14): synthetic suffix slots are\n * styled here — group color (or theme accent), member-count size, and\n * underlying-count meta-edge width — so caller accessors are NEVER invoked\n * with super-nodes or meta-edges. All helpers write the contiguous suffix.\n */\n function applySuperNodeColors(full: Float32Array, rw: GroupRewrite<N, E>): Float32Array {\n const accent = parseColor(theme.accent) ?? DEFAULT_RGBA;\n for (let j = 0; j < rw.superNodes.length; j++) {\n const group = rw.superNodes[j]!.group;\n const rgba = (group.color !== undefined ? parseColor(group.color) : null) ?? accent;\n const o = 4 * (rw.physicalNodeCount + j);\n full[o] = rgba[0];\n full[o + 1] = rgba[1];\n full[o + 2] = rgba[2];\n full[o + 3] = rgba[3];\n }\n return full;\n }\n\n function applyMetaEdgeColors(full: Float32Array, rw: GroupRewrite<N, E>): Float32Array {\n const rgba = parseColor(theme.edgeDefault) ?? DEFAULT_RGBA;\n for (let j = 0; j < rw.metaEdges.length; j++) {\n const o = 4 * (rw.physicalEdgeCount + j);\n full[o] = rgba[0];\n full[o + 1] = rgba[1];\n full[o + 2] = rgba[2];\n full[o + 3] = rgba[3];\n }\n return full;\n }\n\n /** Copy a physical-prefix buffer into a full scene-sized one. */\n function expandToScene(physical: Float32Array, perSlot: number, slots: number): Float32Array {\n const full = new Float32Array(perSlot * slots);\n full.set(physical);\n return full;\n }\n\n function projectChannelBuffers(dirty: DirtyChannels): EngineCommit['buffers'] | undefined {\n const model = sceneModel();\n if (model === null) return undefined;\n const rw = groupRewrite;\n // Caller accessors and the churn detector see PHYSICAL rows only.\n const physNodes = rw !== null ? rw.physicalNodes : model.nodes;\n const physEdges = rw !== null ? rw.physicalEdges : model.edges;\n const out: NonNullable<EngineCommit['buffers']> = {};\n let any = false;\n if (dirty.nodeColor) {\n if (nodeColor !== undefined) {\n const r = isScaleValue(nodeColor)\n ? projectColors(\n physNodes,\n scaleColorAccessor(nodeColor as Scale<string, N>),\n themeNodeDefaultRgba(),\n )\n : projectColors(physNodes, nodeColor);\n nodeColorDiags = r.diagnostics;\n noteChannelProjection('nodeColor', nodeColor, physNodes);\n const full =\n rw === null ? r.buffer : applySuperNodeColors(expandToScene(r.buffer, 4, model.nodes.length), rw);\n // §9.1: cache the UNMASKED base; the engine gets a masked copy so a\n // later mask-only drain rebuilds alphas without re-projecting.\n basePointColors = full;\n basePointColorsSynthesized = false;\n out.pointColor = composeNodeAlphaBuffer(full);\n any = true;\n } else if (rw !== null && scene !== null) {\n // No accessor but a rewrite: the aggregate channel must still paint\n // super-nodes distinctly — theme fill prefix + aggregate suffix\n // (basePointColorBuffer is rewrite-aware).\n basePointColors = null;\n out.pointColor = composeNodeAlphaBuffer(basePointColorBuffer());\n any = true;\n } else if (softMask !== null && scene !== null) {\n // No accessor configured but a mask exists: synthesize the default\n // fill so mask alphas reach the engine (initial projection, recovery\n // and re-attach replays all compose here).\n out.pointColor = composeNodeAlphaBuffer(basePointColorBuffer());\n any = true;\n }\n }\n if (dirty.nodeSize && (nodeSize !== undefined || rw !== null)) {\n let physical: Float32Array;\n if (nodeSize !== undefined) {\n const r = isScaleValue(nodeSize)\n ? projectSizes(physNodes, scaleSizeAccessor(nodeSize as Scale<number, N>))\n : projectSizes(physNodes, nodeSize);\n nodeSizeDiags = r.diagnostics;\n noteChannelProjection('nodeSize', nodeSize, physNodes);\n physical = r.buffer;\n } else {\n physical = new Float32Array(physNodes.length).fill(PHYSICAL_DEFAULT_POINT_SIZE);\n }\n if (rw === null) {\n out.pointSize = physical;\n } else {\n const full = expandToScene(physical, 1, model.nodes.length);\n for (let j = 0; j < rw.superNodes.length; j++) {\n full[rw.physicalNodeCount + j] = superNodeSizeFor(\n rw.superNodes[j]!.presentMemberIds.length,\n );\n }\n out.pointSize = full;\n }\n any = true;\n }\n if (dirty.linkColor) {\n if (linkColor !== undefined) {\n const r = projectColors(physEdges, linkColor);\n linkColorDiags = r.diagnostics;\n noteChannelProjection('linkColor', linkColor, physEdges);\n const full =\n rw === null ? r.buffer : applyMetaEdgeColors(expandToScene(r.buffer, 4, model.edges.length), rw);\n baseLinkColors = full;\n baseLinkColorsSynthesized = false;\n out.linkColor = composeEdgeAlphaBuffer(full);\n any = true;\n } else if (softMask !== null && scene !== null) {\n // Aggregate meta-edge color IS the theme edge default, so the\n // synthesized full-length fill covers the suffix too.\n out.linkColor = composeEdgeAlphaBuffer(baseLinkColorBuffer());\n any = true;\n }\n }\n if (dirty.linkWidth && (linkWidth !== undefined || rw !== null)) {\n let physical: Float32Array;\n if (linkWidth !== undefined) {\n const r = projectSizes(physEdges, linkWidth);\n linkWidthDiags = r.diagnostics;\n noteChannelProjection('linkWidth', linkWidth, physEdges);\n physical = r.buffer;\n } else {\n physical = new Float32Array(physEdges.length).fill(PHYSICAL_DEFAULT_LINK_WIDTH);\n }\n let full = physical;\n if (rw !== null) {\n full = expandToScene(physical, 1, model.edges.length);\n for (let j = 0; j < rw.metaEdges.length; j++) {\n // The count badge datum also drives the aggregate width channel.\n full[rw.physicalEdgeCount + j] = metaEdgeWidthFor(rw.metaEdges[j]!.metaEdge.count);\n }\n }\n out.linkWidth = full;\n lastLinkWidths = full;\n any = true;\n }\n return any ? out : undefined;\n }\n\n /** The FULL desired engine config for replays (§13): theme tokens are\n * always defined (dark base default), so a replay always carries them. */\n function fullConfig(): EngineConfigUpdate {\n const c: EngineConfigUpdate = {\n backgroundColor: theme.background,\n defaultPointColor: theme.nodeDefault,\n defaultLinkColor: theme.edgeDefault,\n linkArrows: edgeArrows,\n renderLinks: showLinks,\n };\n if (simulation !== undefined) c.simulation = simulation;\n // §16.3 stage-4: a replay re-sends the live cluster force (the restored\n // GL machine has none). Omitted when no spec is active so the inert case\n // adds no key to the replay config.\n if (clusterSpec !== null) {\n const cluster = clusterConfigPayload();\n if (cluster !== null) c.cluster = cluster;\n }\n return c;\n }\n\n /** DEF2: EVERY engine commit routes through the capability normalizer —\n * payload the declared record cannot honor is stripped before the adapter\n * ever sees it (identity-preserving when nothing strips).\n *\n * §16.3 stage 4 rides the same funnel (I2 discipline): an owed cluster\n * payload joins the NEXT commit, so the index-addressed `pointClusters`\n * mapping is always applied in the same commit as the roster it describes.\n * A caller that already placed `config.cluster` (the host-update lane, a\n * `fullConfig()` replay) wins and just clears the debt. */\n function commitToEngine(eng: GraphEngine, commit: EngineCommit): void {\n let outgoing = commit;\n if (clusterConfigPending) {\n if (commit.config?.cluster === undefined) {\n outgoing = {\n ...commit,\n config: { ...(commit.config ?? {}), cluster: clusterConfigPayload() },\n };\n }\n clusterConfigPending = false;\n }\n eng.commit(normalizeCommitForCapabilities(outgoing, eng.capabilities).commit);\n }\n\n // -------------------------------------------------------------------------\n // §8 image-atlas wiring (S10-T09). Refs feed the pipeline only under a\n // 'native' capability policy; batches land as their own resources-only\n // commits through the acceptance queue; the full delivered atlas state is\n // replayed on recovery; a datasetKey change disposes and rebuilds.\n // -------------------------------------------------------------------------\n\n function handleAtlasBatch(batch: ImageAtlasBatch): void {\n acceptanceQueue.admit(() => {\n if (destroyed) return;\n for (const u of batch.upserts) atlasDeliveredBitmaps.set(u.slot, u.bitmap);\n for (const slot of batch.removeSlots) atlasDeliveredBitmaps.delete(slot);\n lastPointImageIndex = batch.pointImageIndex;\n const diagsChanged = batch.diagnostics.length > 0;\n if (diagsChanged) imageDiags = [...imageDiags, ...batch.diagnostics];\n const eng = engineIfReady();\n const patch: Partial<GraphStoreState> = {};\n if (eng !== null) {\n // Resources-only commit: zero buffer channels, zero structure —\n // the render revision still advances (§13 atomic visibility).\n const revisions: Revisions = { ...store.getState().revisions };\n revisions.render += 1;\n commitToEngine(eng, {\n revision: revisions.render,\n resources: {\n imageAtlas: { upserts: batch.upserts, removeSlots: batch.removeSlots },\n pointImageIndex: batch.pointImageIndex,\n },\n });\n revisions.appliedRender = eng.appliedRevision();\n patch.revisions = revisions;\n }\n if (diagsChanged) patch.diagnostics = composeDiagnostics();\n if (Object.keys(patch).length > 0) publish(patch);\n });\n }\n\n function ensureImagePipeline(): ImageAtlasPipeline {\n if (imagePipeline === null) {\n imagePipeline = new ImageAtlasPipeline(\n opts.imageResolver !== undefined ? { resolver: opts.imageResolver } : {},\n );\n imagePipeline.onBatch(handleAtlasBatch);\n }\n return imagePipeline;\n }\n\n /** Feed the index-aligned per-point ref roster to the pipeline (called on\n * accepted-model/scope changes, nodeImage changes, and at ready). No-op\n * unless the session policy resolved images as 'native' — under\n * 'placeholder' the accessor is retained but never resolved (§13). */\n function pushImageRefs(): void {\n if (session === null || session.policy === null || session.policy.images !== 'native') return;\n // Index-aligned to the SCENE roster (stage-3 post-rewrite when active).\n const model = sceneModel();\n if (model === null) return;\n if (nodeImage === undefined) {\n // D2/F11-04: a CLEARED accessor drains the atlas — an all-null roster\n // evicts every slot and commits the all-placeholder index atomically;\n // the generation bump makes any still-pending decode stale on arrival.\n if (imagePipeline !== null) {\n imagePipeline.requestRefs(\n new Array<string | null>(model.nodes.length).fill(null),\n ++imageGeneration,\n );\n }\n return;\n }\n const fn = nodeImage;\n const refs: (string | null)[] = new Array<string | null>(model.nodes.length);\n // §16.3: synthetic suffix slots always ride as null refs (placeholder\n // shape) — the accessor never sees super-nodes (R-6.1-14).\n const bound = groupRewrite !== null ? groupRewrite.physicalNodeCount : model.nodes.length;\n for (let i = 0; i < model.nodes.length; i++) {\n if (i >= bound) {\n refs[i] = null;\n continue;\n }\n let ref: unknown;\n try {\n ref = fn(model.nodes[i]!);\n } catch {\n ref = null;\n }\n refs[i] = typeof ref === 'string' && ref !== '' ? ref : null;\n }\n ensureImagePipeline().requestRefs(refs, ++imageGeneration);\n }\n\n /**\n * I2/F11-03: refs re-fed for the NEW roster plus the synchronous\n * point→slot index to ride the SAME structural commit — resolved+\n * delivered slots where known, placeholders otherwise. Returns null when\n * images are not native this session (no pipeline). The scheduled async\n * flush afterwards only ever promotes placeholders.\n */\n function structuralPointImageIndex(): Float32Array | null {\n if (session === null || session.policy === null || session.policy.images !== 'native') {\n return null;\n }\n pushImageRefs();\n return imagePipeline?.currentPointIndex() ?? null;\n }\n\n /** §5 dataset swap: per-dataset atlas state does not carry over. */\n function resetImagePipelineState(): void {\n imagePipeline?.dispose();\n imagePipeline = null;\n atlasDeliveredBitmaps.clear();\n lastPointImageIndex = null;\n imageDiags = [];\n }\n\n /** §13.1 recovery/replay payload: the FULL delivered atlas state. Null\n * when images are not native this session or nothing was ever delivered. */\n function replayAtlasResources(): NonNullable<EngineCommit['resources']> | null {\n if (session === null || session.policy === null || session.policy.images !== 'native') {\n return null;\n }\n if (atlasDeliveredBitmaps.size === 0 && lastPointImageIndex === null) return null;\n const upserts = [...atlasDeliveredBitmaps].map(([slot, bitmap]) => ({ slot, bitmap }));\n return {\n imageAtlas: { upserts },\n ...(lastPointImageIndex !== null ? { pointImageIndex: lastPointImageIndex } : {}),\n };\n }\n\n /**\n * §7.1 per-event readback bank with the §16.3 pin overlay: the pin slice is\n * authoritative for pinned coordinates, so an engine that does not mirror\n * pins into its position buffer can never clobber a pinned position in the\n * cache. Mutates `pos` in place before noting (callers pass a fresh\n * per-event readback they own).\n */\n function bankEnginePositions(pos: Float32Array): void {\n const pins = store.getState().pins;\n if (pins.size > 0 && scene !== null) {\n for (const [id, xy] of pins) {\n const idx = scene.indexById.get(id);\n if (idx !== undefined && 2 * idx + 1 < pos.length) {\n pos[2 * idx] = xy[0];\n pos[2 * idx + 1] = xy[1];\n }\n }\n }\n reconciler.noteEnginePositions(pos);\n // §14: the freshest per-event readback also feeds the label lane's\n // projection cache (pin overlay already applied above).\n labelPositionCache = pos;\n }\n\n /** Mirror the selection highlight into the engine. Reads the PUBLISHED\n * group namespace from the store (every caller pushes after its publish):\n * selected GROUP ids highlight their super-node slots in the synthetic\n * suffix; expanded/unrewritten groups have no slot and add nothing. */\n function pushSelectionToEngine(eng: GraphEngine, ids: readonly NodeId[]): void {\n const groupIds = store.getState().selection.groupIds;\n if (scene === null || (ids.length === 0 && groupIds.length === 0)) {\n eng.setSelectedIndices(null);\n return;\n }\n const indices: number[] = [];\n for (const id of ids) {\n const idx = scene.indexById.get(id);\n if (idx !== undefined) indices.push(idx);\n }\n const sceneGroups = scene.groups;\n if (sceneGroups !== undefined && groupIds.length > 0) {\n for (let k = 0; k < sceneGroups.superNodes.length; k++) {\n if (groupIds.includes(sceneGroups.superNodes[k]!.id)) {\n indices.push(sceneGroups.physicalPointCount + k);\n }\n }\n }\n eng.setSelectedIndices(indices.length > 0 ? indices : null);\n }\n\n /** Mirror the pin state into the engine (optional capability; §16.3) as\n * the UNION of three independent lifecycles (R-16.3-25): transient drag\n * pins (the `pins` map — coordinates live in that slice), PERSISTENT pins\n * (`store.pinnedNodeIds` — no coordinates in v0.10: the engine holds each\n * at its CURRENT position), and T12 pinned accretion (previously-placed\n * ids held while an expansion settles; the next simulationEnd releases\n * the union back to the two user slices). Releasing a drag pin on a\n * persistently-pinned node therefore leaves it pinned. Callers invoke\n * this AFTER their store publication — the persistent slice is read from\n * the current store state. */\n function pushPinsToEngine(\n eng: GraphEngine,\n pins: ReadonlyMap<NodeId, readonly [number, number]>,\n ): void {\n if (eng.setPinnedIndices === undefined) return;\n const persistent = store.getState().pinnedNodeIds;\n if (scene === null || (pins.size === 0 && persistent.size === 0 && accretionPinIds === null)) {\n eng.setPinnedIndices(null);\n return;\n }\n const indexSet = new Set<number>();\n for (const id of pins.keys()) {\n const idx = scene.indexById.get(id);\n if (idx !== undefined) indexSet.add(idx);\n }\n for (const id of persistent) {\n const idx = scene.indexById.get(id);\n if (idx !== undefined) indexSet.add(idx);\n }\n if (accretionPinIds !== null) {\n for (const id of accretionPinIds) {\n const idx = scene.indexById.get(id);\n if (idx !== undefined) indexSet.add(idx);\n }\n }\n eng.setPinnedIndices(indexSet.size > 0 ? [...indexSet] : null);\n }\n\n /**\n * §16 highlight remap: after a full replay (fresh attach, context recovery)\n * re-push selection, pins, and hover focus with freshly mapped indices from\n * the CURRENT store state.\n */\n function reapplyInteractionState(eng: GraphEngine): void {\n const { selection, pins, pinnedNodeIds, hover } = store.getState();\n if (selection.nodeIds.length > 0 || selection.groupIds.length > 0) {\n pushSelectionToEngine(eng, selection.nodeIds);\n }\n // R-16.3-25: recovery/re-attach replays PERSISTENT pins with the drag\n // slice — freshly mapped indices, same union sink.\n if (pins.size > 0 || pinnedNodeIds.size > 0) pushPinsToEngine(eng, pins);\n if (hover.nodeId !== null && scene !== null) {\n const idx = scene.indexById.get(hover.nodeId);\n if (idx !== undefined) eng.setFocusedIndex(idx);\n }\n }\n\n function maybeFitView(eng: GraphEngine): void {\n if (!fitViewOnFirstData || session === null || session.fitDone) return;\n if (accepted === null) return; // \"first data\": only fit once data exists\n session.fitDone = true;\n if (effectiveReducedMotion()) eng.fitView({ durationMs: 0 });\n else eng.fitView();\n }\n\n // -------------------------------------------------------------------------\n // Selection model (§6.4 ownership, §16.2 set algebra)\n // -------------------------------------------------------------------------\n\n function nodeIndexBase(): ReadonlyMap<NodeId, number> {\n return accepted === null ? EMPTY_INDEX : accepted.nodeIndex;\n }\n\n /**\n * selectAll/invert population (S9-T19): the VISIBLE set — the render scene\n * (scoped when a hard scope is active, §9.2) restricted to §9.1\n * mask-visible slots (which already fold in hiddenNodeIds, the filter\n * prop, and crossfilter brushes), in accepted-base order. The explicit\n * hiddenNodeIds check also covers the mask-less startup path.\n */\n function selectablePopulation(): NodeId[] {\n const model = sceneModel();\n if (model === null) return [];\n const hidden = store.getState().hiddenNodeIds;\n const out: NodeId[] = [];\n // Physical slots only: synthetic super-nodes are not node-selectable in\n // this slice (group selection is the §16.2 groupIds namespace, S12-T02).\n const bound = groupRewrite !== null ? groupRewrite.physicalNodeCount : model.nodes.length;\n for (let i = 0; i < bound; i++) {\n const node = model.nodes[i]!;\n if (hidden.has(node.id)) continue;\n if (softMask !== null && !softMask.isNodeVisible(i)) continue;\n out.push(node.id);\n }\n return out;\n }\n\n /**\n * Internal selection mutation (clicks, set algebra, setSelection).\n * Controlled mode (§6.4) covers the NODE namespace only: node changes\n * surface as 'selectionChange' intent without a store write, while edge and\n * group namespaces stay instance-internal and are written directly.\n * Uncontrolled store writes mirror node indices to the engine.\n */\n function applySelectionIntent(next: SelectionState): void {\n // §16.2: ANY selection mutation releases path emphasis — the selection\n // push below then owns the highlight channel again.\n if (activePath !== null) {\n dropPathState();\n const engForPath = engineIfReady();\n if (engForPath !== null && scene !== null) {\n engForPath.commit({\n revision: store.getState().revisions.render,\n buffers: { linkColor: composeEdgeAlphaBuffer(baseLinkColorBuffer()) },\n });\n }\n }\n const prev = store.getState().selection;\n if (selectionControlled) {\n // §16.14: controlled selection is host-owned — commands SKIP recording.\n const groupsChanged = !sameIds(prev.groupIds, next.groupIds);\n if (!sameIds(prev.edgeIds, next.edgeIds) || groupsChanged) {\n publish({\n selection: { nodeIds: prev.nodeIds, edgeIds: next.edgeIds, groupIds: next.groupIds },\n });\n if (groupsChanged) {\n // §16.3: the group namespace stays instance-owned even under\n // controlled node selection — mirror its highlight immediately.\n const eng = engineIfReady();\n if (eng !== null) pushSelectionToEngine(eng, prev.nodeIds);\n }\n }\n emit('selectionChange', next);\n return;\n }\n if (sameSelection(prev, next)) return;\n // §16.14: one implicit single-command transaction per mutator call.\n historyKernel.record('selection', selectionPlain(prev), selectionPlain(next));\n publish({ selection: next });\n const eng = engineIfReady();\n if (\n eng !== null &&\n (!sameIds(prev.nodeIds, next.nodeIds) || !sameIds(prev.groupIds, next.groupIds))\n ) {\n // §9.1 selection survival: ALL selected indices are pushed even when\n // the mask hides some — engine greyout handles hidden ones and masked\n // selected ids stay in SelectionState (§16.2 R-16.2-05..08).\n pushSelectionToEngine(eng, next.nodeIds);\n }\n emit('selectionChange', next);\n }\n\n function setSelection(input: readonly NodeId[] | SelectionState): void {\n if (destroyed) return;\n if (Array.isArray(input)) {\n selectNodes(input as readonly NodeId[]);\n return;\n }\n const full = input as SelectionState;\n applySelectionIntent({\n nodeIds: orderByAcceptedBase(full.nodeIds, nodeIndexBase()),\n edgeIds: orderByAcceptedBase(full.edgeIds, edgeIndexById),\n // Group namespace: the raw full-state form stays TOLERANT (deduped,\n // not validated — pinned pre-S12 behavior); ids that stop naming a\n // resolved group prune through the ownership path whenever the groups\n // RESOLUTION changes (§16.2/§16.3). selectGroups() is the validating\n // mutator.\n groupIds: dedupeFirstOccurrence(full.groupIds),\n });\n }\n\n /** §16.2 canonical group-namespace form: dedupe + validate against the\n * CURRENT resolved groups, stored in groups-array order (the group analog\n * of accepted-base ordering for nodes/edges). */\n function orderGroupIds(ids: readonly string[]): string[] {\n const wanted = new Set(ids);\n const out: string[] = [];\n for (const group of resolvedGroups) {\n if (wanted.has(group.id)) out.push(group.id);\n }\n return out;\n }\n\n function selectGroups(ids: readonly string[]): void {\n if (destroyed) return;\n const cur = store.getState().selection;\n applySelectionIntent({ ...cur, groupIds: orderGroupIds(ids) });\n }\n\n function selectNodes(ids: readonly NodeId[]): void {\n if (destroyed) return;\n const cur = store.getState().selection;\n applySelectionIntent({ ...cur, nodeIds: orderByAcceptedBase(ids, nodeIndexBase()) });\n }\n\n /** §16.3 R-16.3-18: a cluster resolves to its MEMBER node ids — clusters\n * never enter the group namespace (they synthesize no entity to select). */\n function selectCluster(key: string, opts?: { additive?: boolean }): void {\n if (destroyed) return;\n const members = clusterDerivation?.membersByKey.get(key);\n if (members === undefined) return;\n const cur = store.getState().selection;\n const next = opts?.additive === true ? unionIds(cur.nodeIds, members) : members;\n applySelectionIntent({ ...cur, nodeIds: orderByAcceptedBase(next, nodeIndexBase()) });\n }\n\n function selectEdges(ids: readonly EdgeId[]): void {\n if (destroyed) return;\n const cur = store.getState().selection;\n applySelectionIntent({ ...cur, edgeIds: orderByAcceptedBase(ids, edgeIndexById) });\n }\n\n /**\n * §16.2 selectNeighbors: expand to the 1-hop neighborhood (seed ∪ direct\n * neighbors). Seeds are the argument id when given, else the current node\n * selection. Uses engine adjacency when the adapter provides it, otherwise\n * a links scan over the current scene.\n */\n function selectNeighbors(id?: NodeId): void {\n if (destroyed || accepted === null || scene === null) return;\n const cur = store.getState().selection;\n const seedIds = id !== undefined ? [id] : cur.nodeIds;\n const result = new Set<NodeId>();\n const seedIndices = new Set<number>();\n for (const sid of seedIds) {\n const idx = scene.indexById.get(sid);\n if (idx === undefined) continue;\n seedIndices.add(idx);\n result.add(sid);\n }\n const eng = engineIfReady();\n const engineAdjacency = eng !== null && eng.neighborIndices !== undefined ? eng : null;\n if (engineAdjacency !== null) {\n for (const idx of seedIndices) {\n for (const n of engineAdjacency.neighborIndices!(idx)) {\n const nid = scene.idByIndex[n];\n if (nid !== undefined) result.add(nid);\n }\n }\n } else {\n const links = scene.links;\n for (let k = 0; k < links.length; k += 2) {\n const s = links[k]!;\n const t = links[k + 1]!;\n if (seedIndices.has(s)) result.add(scene.idByIndex[t]!);\n if (seedIndices.has(t)) result.add(scene.idByIndex[s]!);\n }\n }\n applySelectionIntent({\n ...cur,\n nodeIds: orderByAcceptedBase([...result], accepted.nodeIndex),\n });\n }\n\n function selectAll(): void {\n if (destroyed) return;\n const cur = store.getState().selection;\n applySelectionIntent({ ...cur, nodeIds: selectablePopulation() });\n }\n\n function invertSelection(): void {\n if (destroyed) return;\n const cur = store.getState().selection;\n const selected = new Set(cur.nodeIds);\n applySelectionIntent({\n ...cur,\n nodeIds: selectablePopulation().filter((id) => !selected.has(id)),\n });\n }\n\n function clearSelection(): void {\n if (destroyed) return;\n applySelectionIntent(EMPTY_SELECTION);\n }\n\n /**\n * §16.2 lasso (S6-T05): engine polygon query → indices → ids, hidden ids\n * dropped, then replace/union through applySelectionIntent — the SAME §6.4\n * ownership path as every other mutator (controlled → intent only).\n */\n function selectWithinPolygon(\n screenPolygon: readonly [number, number][],\n opts?: { additive?: boolean },\n ): readonly NodeId[] {\n if (destroyed || accepted === null || scene === null) return EMPTY_IDS;\n const eng = engineIfReady();\n if (eng === null || eng.pointsInPolygon === undefined) return EMPTY_IDS;\n const indices = eng.pointsInPolygon(screenPolygon);\n const hidden = store.getState().hiddenNodeIds;\n const ids: NodeId[] = [];\n for (const idx of indices) {\n if (!maskNodeVisibleAt(idx)) continue; // §9.1: mask-hidden never lassoed\n const id = scene.idByIndex[idx];\n if (id !== undefined && !hidden.has(id)) ids.push(id);\n }\n const resolved = orderByAcceptedBase(ids, accepted.nodeIndex);\n const cur = store.getState().selection;\n applySelectionIntent({\n ...cur,\n nodeIds:\n opts?.additive === true\n ? orderByAcceptedBase(unionIds(cur.nodeIds, resolved), accepted.nodeIndex)\n : resolved,\n });\n return resolved;\n }\n\n // -------------------------------------------------------------------------\n // Hide / pin slices (§16.3). S9: hidden nodes are VISUALLY masked through\n // the §9.1 'hidden' mask source (alpha 0, buffers-only commit, zero\n // relayout) and excluded from the selectAll/invert population.\n // -------------------------------------------------------------------------\n\n /** Shared hidden-slice write: history record + mask refresh + ONE publish\n * (ONE buffers-only commit through the §9.1 fast path). */\n function applyHiddenSlice(prevHidden: ReadonlySet<NodeId>, next: Set<NodeId>): void {\n historyKernel.record('hidden', [...prevHidden], [...next]);\n if (scene !== null && (next.size > 0 || softMask !== null)) {\n ensureMask();\n refreshHiddenMembership(next);\n refreshGroupMaskMembership(next);\n cascadeNodeMask();\n }\n refreshCrossfilterExternalMask(next); // §16.6 dual layer stays fresh\n publishMaskFastPath({ hiddenNodeIds: next }, false);\n }\n\n function hideNodes(ids: readonly NodeId[]): void {\n if (destroyed || accepted === null) return;\n const prev = store.getState().hiddenNodeIds;\n let next: Set<NodeId> | null = null;\n for (const id of ids) {\n if (!accepted.nodeIndex.has(id) || (next ?? prev).has(id)) continue;\n if (next === null) next = new Set(prev);\n next.add(id);\n }\n if (next !== null) applyHiddenSlice(prev, next);\n }\n\n function showNodes(ids: readonly NodeId[]): void {\n if (destroyed) return;\n const prev = store.getState().hiddenNodeIds;\n let next: Set<NodeId> | null = null;\n for (const id of ids) {\n if (!(next ?? prev).has(id)) continue;\n if (next === null) next = new Set(prev);\n next.delete(id);\n }\n if (next !== null) applyHiddenSlice(prev, next);\n }\n\n function showAll(): void {\n if (destroyed) return;\n const prev = store.getState().hiddenNodeIds;\n if (prev.size > 0) applyHiddenSlice(prev, new Set());\n }\n\n /** Last known position of a node: live engine readback when ready, else the\n * reconciled scene cache; undefined when no finite position is known. */\n function currentPositionOf(id: NodeId): readonly [number, number] | undefined {\n if (scene === null) return undefined;\n const idx = scene.indexById.get(id);\n if (idx === undefined) return undefined;\n const eng = engineIfReady();\n if (eng !== null) {\n const pos = eng.getPositions();\n if (pos !== null) {\n const x = pos[2 * idx];\n const y = pos[2 * idx + 1];\n if (x !== undefined && y !== undefined && Number.isFinite(x) && Number.isFinite(y)) {\n return [x, y];\n }\n }\n }\n const sx = scene.positions[2 * idx]!;\n const sy = scene.positions[2 * idx + 1]!;\n return Number.isFinite(sx) && Number.isFinite(sy) ? [sx, sy] : undefined;\n }\n\n /** Shared pin write path (pinNode and the built-in drag-pin follow-up). */\n function writePin(id: NodeId, xy: readonly [number, number]): void {\n const prev = store.getState().pins;\n const existing = prev.get(id);\n if (existing !== undefined && existing[0] === xy[0] && existing[1] === xy[1]) return;\n const next = new Map(prev);\n next.set(id, [xy[0], xy[1]] as const);\n historyKernel.record('pins', pinsPlain(prev), pinsPlain(next)); // §16.14\n publish({ pins: next });\n const eng = engineIfReady();\n if (eng !== null) {\n pushPinsToEngine(eng, next);\n // §7.1/§16.3 single-point cache write: bank a per-event readback with\n // the pin overlay applied (the just-written pin included) so the pinned\n // position survives structural swaps before the next settle.\n const pos = eng.getPositions();\n if (pos !== null) bankEnginePositions(pos);\n }\n }\n\n function pinNode(id: NodeId, xy?: readonly [number, number]): void {\n if (destroyed || accepted === null || !accepted.nodeIndex.has(id)) return;\n const p = xy ?? currentPositionOf(id);\n if (p === undefined) return; // no known position to pin at\n writePin(id, p);\n }\n\n function unpinNode(id: NodeId): void {\n if (destroyed) return;\n const prev = store.getState().pins;\n if (!prev.has(id)) return;\n const next = new Map(prev);\n next.delete(id);\n historyKernel.record('pins', pinsPlain(prev), pinsPlain(next)); // §16.14\n publish({ pins: next });\n const eng = engineIfReady();\n if (eng !== null) pushPinsToEngine(eng, next);\n }\n\n function clearPins(): void {\n if (destroyed) return;\n const prev = store.getState().pins;\n if (prev.size === 0) return;\n historyKernel.record('pins', pinsPlain(prev), []); // §16.14\n publish({ pins: new Map() });\n const eng = engineIfReady();\n if (eng !== null) pushPinsToEngine(eng, EMPTY_PINS);\n }\n\n // -------------------------------------------------------------------------\n // §16.3 persistent pins (S12-T09) — the §6.4 pinnedNodeIds slice mutators,\n // the latch mirror of groups. Persistent pins hold nodes AT THEIR CURRENT\n // POSITION via engine.setPinnedIndices — v0.10 carries NO position payload\n // (positions keep riding the engine/readback caches; only the drag-pin\n // `pins` slice is coordinate-authoritative). Lifecycles are independent:\n // the engine receives the UNION, so releasing a drag pin on a\n // persistently-pinned node leaves it pinned (R-16.3-25). Uncontrolled op\n // writes route through applyHostUpdateInner (the SAME validate → prune →\n // publish lane as the prop: one publish, zero engine commits) and record\n // §16.14 'pinnedNodes' steps; controlled ops fire the 'pinnedChange'\n // intent instead of writing (the host reflects the array back).\n // -------------------------------------------------------------------------\n\n /** Apply (uncontrolled) or intend (controlled) a persistent-pin candidate. */\n function commitPinnedCandidate(candidate: readonly NodeId[]): void {\n if (pinnedControlled) {\n emit('pinnedChange', { pinnedNodeIds: candidate });\n return;\n }\n pinsInternalWrite = true;\n try {\n applyHostUpdateInner({ pinnedNodeIds: candidate });\n } finally {\n pinsInternalWrite = false;\n }\n emit('pinnedChange', { pinnedNodeIds: [...store.getState().pinnedNodeIds] });\n }\n\n function pinNodes(ids: readonly NodeId[]): void {\n if (destroyed) return;\n acceptanceQueue.admit(() => {\n if (accepted === null) return;\n const cur = store.getState().pinnedNodeIds;\n const next = new Set(cur);\n for (const id of ids) {\n if (accepted.nodeIndex.has(id)) next.add(id); // unknown ids drop\n }\n if (next.size === cur.size) return; // exact no-op (all known ∈ cur)\n commitPinnedCandidate([...next]);\n });\n }\n\n function unpinNodes(ids: readonly NodeId[]): void {\n if (destroyed) return;\n acceptanceQueue.admit(() => {\n const cur = store.getState().pinnedNodeIds;\n const next = new Set(cur);\n for (const id of ids) next.delete(id);\n if (next.size === cur.size) return; // exact no-op (nothing was pinned)\n commitPinnedCandidate([...next]);\n });\n }\n\n // -------------------------------------------------------------------------\n // §16.3 group operations (S12-T02/T04) — the §6.4 groups slice mutators.\n // Every op runs inside the acceptance queue (same admission order as host\n // updates). Uncontrolled writes route the candidate array through\n // applyHostUpdateInner — the SAME validate → resolve → rewrite lane as the\n // `groups` prop, so an op is one publish and at most one diff-scale\n // commit. Group ops are host-config statements, not §16.14 history\n // dimensions — they never record undo entries (like the prop lane).\n // -------------------------------------------------------------------------\n\n /** ONE 'config-error' verdict for a rejected group op (its own single\n * publish); replaced per rejection, cleared by the next applied write. */\n function rejectGroupOp(severity: 'warning' | 'error', message: string, sampleId?: string): void {\n groupsOpDiags = [\n {\n code: 'config-error',\n severity,\n count: 1,\n sampleIds: sampleId !== undefined ? [sampleId] : [],\n message,\n },\n ];\n publish({ diagnostics: composeDiagnostics() });\n }\n\n /** Op write path: routes the candidate through applyHostUpdateInner\n * WITHOUT flipping §6.4 ownership (internal writes are not host writes). */\n function writeGroupsInternal(candidate: readonly GroupSpec[] | null): void {\n groupsInternalWrite = true;\n try {\n applyHostUpdateInner({ groups: candidate });\n } finally {\n groupsInternalWrite = false;\n }\n }\n\n /** §6.4: apply (uncontrolled) or intend (controlled) a validated manual\n * candidate. Controlled mode never writes — the resolved candidate rides\n * the 'groupsChange' intent and the host reflects it back via the prop. */\n function commitManualGroups(candidate: readonly GroupSpec[] | null): void {\n if (groupsControlled) {\n const resolved =\n candidate === null || accepted === null\n ? EMPTY_GROUPS\n : resolveManualGroups(candidate, accepted.nodeIndex);\n emit('groupsChange', { groups: resolved });\n return;\n }\n writeGroupsInternal(candidate);\n emit('groupsChange', { groups: resolvedGroups });\n }\n\n function groupNodes(spec: GroupSpec): void {\n if (destroyed) return;\n acceptanceQueue.admit(() => {\n if (groupBySpec !== null) {\n // R-16.3-15: membership under groupBy is derived and READ-ONLY.\n if (DEV) {\n rejectGroupOp(\n 'warning',\n 'groupNodes ignored: membership is derived and read-only under groupBy (§16.3) — change the groupBy accessor or remove it',\n spec.id,\n );\n }\n return;\n }\n const candidate = [...(groupsSpec ?? EMPTY_GROUP_SPECS), spec];\n // Same acyclic/singly-parented boundary as the prop lane (D4): a violating spec\n // (duplicate id included) is ONE 'config-error' and changes nothing.\n const verdict = validateGroupSpecs(candidate, accepted?.nodeIndex ?? null);\n if (verdict.diagnostic !== null) {\n groupsOpDiags = [verdict.diagnostic];\n publish({ diagnostics: composeDiagnostics() });\n return;\n }\n commitManualGroups(candidate);\n });\n }\n\n function ungroup(groupId: string): void {\n if (destroyed) return;\n acceptanceQueue.admit(() => {\n if (groupBySpec !== null) {\n if (DEV) {\n rejectGroupOp(\n 'warning',\n 'ungroup ignored: membership is derived and read-only under groupBy (§16.3) — change the groupBy accessor or remove it',\n groupId,\n );\n }\n return;\n }\n const specs = groupsSpec ?? EMPTY_GROUP_SPECS;\n const candidate = specs.filter((s) => s.id !== groupId);\n if (candidate.length === specs.length) {\n if (DEV) {\n rejectGroupOp('warning', `ungroup ignored: no group '${groupId}' is defined`, groupId);\n }\n return;\n }\n commitManualGroups(candidate.length === 0 ? null : candidate);\n });\n }\n\n function setGroupCollapsed(groupId: string, collapsed: boolean): void {\n if (destroyed) return;\n acceptanceQueue.admit(() => {\n if (groupBySpec !== null) {\n if (groupsSpec !== null) {\n // R-16.3-15 conflict active — NEITHER lane applies, so no group\n // is addressable until the host removes one.\n if (DEV) {\n rejectGroupOp(\n 'warning',\n 'setGroupCollapsed ignored: groups and groupBy are both configured (§16.3 config error) — remove one',\n groupId,\n );\n }\n return;\n }\n // R-16.3-16: THE allowed op under groupBy — toggle the per-KEY\n // collapsed residue; membership stays derived and read-only.\n // Always instance-owned (groupBy has uncontrolled semantics); the\n // inner update below emits the 'groupsChange' notification.\n const key = groupByKeyById.get(groupId);\n if (key === undefined) {\n if (DEV) {\n rejectGroupOp(\n 'warning',\n `setGroupCollapsed ignored: no derived group '${groupId}' in the current derivation (§16.3)`,\n groupId,\n );\n }\n return;\n }\n if (groupByCollapsedKeys.has(key) === collapsed) return; // exact no-op\n if (collapsed) groupByCollapsedKeys.add(key);\n else groupByCollapsedKeys.delete(key);\n if (groupsOpDiags.length > 0) {\n // A stale rejected-op verdict clears with this applied write.\n groupsOpDiags = [];\n pendingDiagnosticsRefresh = true;\n }\n pendingGroupsRefresh = true;\n applyHostUpdateInner({});\n return;\n }\n const specs = groupsSpec ?? EMPTY_GROUP_SPECS;\n const idx = specs.findIndex((s) => s.id === groupId);\n if (idx < 0) {\n if (DEV) {\n rejectGroupOp(\n 'warning',\n `setGroupCollapsed ignored: no group '${groupId}' is defined`,\n groupId,\n );\n }\n return;\n }\n if ((specs[idx]!.collapsed === true) === collapsed) return; // exact no-op\n const candidate = specs.map((s, i) => (i === idx ? { ...s, collapsed } : s));\n commitManualGroups(candidate);\n });\n }\n\n // -------------------------------------------------------------------------\n // §16.3 node folds (see the interface docs). A fold is a stage-3\n // containment change, so it rides the SAME lane as a group collapse: set\n // the dirty flag, run one inner update, let the rewrite + §7.2 diff do the\n // rest. Unlike group ops, folds ARE a §16.14 history dimension — they are\n // exploration state the user builds up, like expansion records.\n // -------------------------------------------------------------------------\n\n /** Serializable §16.14 'folds'-slice payload: the anchor→members map as\n * ordered pairs (Map iteration order is insertion order, so a restore\n * reproduces the anchor ordering the scene suffix depends on). */\n function foldsStatePlain(): [NodeId, NodeId[]][] {\n return [...folds].map(([anchorId, memberIds]) => [anchorId, [...memberIds]]);\n }\n\n /**\n * The published `store.folds` image (anchor → member count) when it differs\n * from `prevFolds`, else null. Folds must reach the store because they\n * change no id and no label text, so nothing else would tell a subscriber\n * that a badge is stale (§14 label lane re-renders on candidate-SET changes\n * only).\n */\n function foldCountsIfChanged(\n prevFolds: ReadonlyMap<NodeId, number>,\n ): ReadonlyMap<NodeId, number> | null {\n if (folds.size === 0) return prevFolds.size === 0 ? null : EMPTY_FOLD_COUNTS;\n if (prevFolds.size === folds.size) {\n let same = true;\n for (const [anchorId, memberIds] of folds) {\n if (prevFolds.get(anchorId) !== memberIds.length) {\n same = false;\n break;\n }\n }\n if (same) return null;\n }\n const next = new Map<NodeId, number>();\n for (const [anchorId, memberIds] of folds) next.set(anchorId, memberIds.length);\n return next;\n }\n\n /** Every entity standing above `id` in the current forest — the cycle\n * guard for an explicit `memberIds` fold. */\n function foldAncestorsOf(id: NodeId): Set<NodeId> {\n const out = new Set<NodeId>();\n for (const [anchorId, memberIds] of folds) {\n for (const member of memberIds) {\n if (member === id) out.add(anchorId);\n }\n }\n // Walk transitively: an anchor may itself be someone's member.\n let frontier = [...out];\n while (frontier.length > 0) {\n const next: NodeId[] = [];\n for (const [anchorId, memberIds] of folds) {\n if (out.has(anchorId)) continue;\n for (const member of memberIds) {\n if (frontier.includes(member)) {\n out.add(anchorId);\n next.push(anchorId);\n break;\n }\n }\n }\n frontier = next;\n }\n return out;\n }\n\n /** Distinct neighbours of `id` in `model`, in first-encounter edge order\n * (deterministic default fold membership). One O(E) scan — a fold is a\n * user gesture, not a hot path, and this reads the SCOPED render model\n * rather than the accepted-model adjacency cache. */\n function modelNeighborsOf(model: AcceptedGraph<N, E>, id: NodeId): NodeId[] {\n const out: NodeId[] = [];\n const seen = new Set<NodeId>();\n for (const edge of model.edges) {\n const other = edge.source === id ? edge.target : edge.target === id ? edge.source : null;\n if (other === null || other === id || seen.has(other)) continue;\n seen.add(other);\n out.push(other);\n }\n return out;\n }\n\n /** Ids already claimed by some representative (fold member or group\n * member) — the \"first claim wins\" test `foldNode` applies. */\n function claimedByFold(): Set<NodeId> {\n const out = new Set<NodeId>();\n for (const memberIds of folds.values()) {\n for (const member of memberIds) out.add(member);\n }\n return out;\n }\n\n /**\n * Shared tail: publish a fold mutation as ONE structural update, holding\n * placed survivors still while the layout re-settles (the T12 accretion pin\n * lane — removing rows changes the force balance, which would otherwise let\n * the remainder lurch).\n *\n * Gated on `force` exactly like the expansion path: under a FIXED layout\n * nothing settles, so pinning the whole roster is a pointless engine call\n * that also perturbs the positions a fold/unfold round trip should restore\n * byte-for-byte.\n */\n function commitFoldChange(beforeState: [NodeId, NodeId[]][]): void {\n historyKernel.record('folds', beforeState, foldsStatePlain());\n if (layout === 'force' && scene !== null) accretionPinIds = new Set(scene.idByIndex);\n pendingFoldsRefresh = true;\n applyHostUpdateInner({});\n }\n\n function foldNode(id: NodeId, opts?: { memberIds?: readonly NodeId[] }): void {\n if (destroyed) return;\n acceptanceQueue.admit(() => {\n if (accepted === null || folds.has(id)) return;\n const model = renderModel();\n if (model === null || !model.nodeIndex.has(id)) return;\n const claimed = claimedByFold();\n if (claimed.has(id)) return; // the anchor is itself hidden — nothing to fold\n const members: NodeId[] = [];\n const seen = new Set<NodeId>();\n if (opts?.memberIds !== undefined) {\n const ancestors = foldAncestorsOf(id);\n for (const member of opts.memberIds) {\n if (member === id || seen.has(member) || claimed.has(member)) continue;\n if (!model.nodeIndex.has(member)) continue;\n if (ancestors.has(member)) continue; // would close a cycle\n seen.add(member);\n members.push(member);\n }\n } else {\n for (const nid of modelNeighborsOf(model, id)) {\n if (nid === id || seen.has(nid) || claimed.has(nid)) continue;\n seen.add(nid);\n members.push(nid);\n }\n }\n if (members.length === 0) return; // exact no-op\n const beforeState = foldsStatePlain();\n folds.set(id, members);\n commitFoldChange(beforeState);\n });\n }\n\n function unfoldNode(id: NodeId): void {\n if (destroyed) return;\n acceptanceQueue.admit(() => {\n if (!folds.has(id)) return; // exact no-op\n const beforeState = foldsStatePlain();\n folds.delete(id);\n commitFoldChange(beforeState);\n });\n }\n\n function getFold(id: NodeId): { memberIds: readonly NodeId[] } | null {\n const memberIds = folds.get(id);\n return memberIds === undefined ? null : { memberIds: [...memberIds] };\n }\n\n // -------------------------------------------------------------------------\n // §7.5 revisioned ingestion (S8-T02..T07, T16). All session work is\n // serialized through `acceptanceQueue`; only queue jobs publish state.\n // -------------------------------------------------------------------------\n\n /** MergeBase for the current accepted base (callers guarantee a base). */\n function currentMergeBase(): MergeBase<N, E> {\n const b = baseFromAccepted(baseAccepted!);\n return basePendingEdges.length > 0 ? { ...b, pendingEdges: basePendingEdges } : b;\n }\n\n function generateOverlayId(): string {\n for (;;) {\n const id = `overlay-${++overlayIdSeq}`;\n if (reservedOverlayIds.has(id)) continue;\n let taken = false;\n for (const s of openSessions) {\n if (s.overlayId === id) {\n taken = true;\n break;\n }\n }\n if (!taken) return id;\n }\n }\n\n function cancelFlushTimer(rec: IngestSessionRecord<N, E>): void {\n if (rec.flushTimer !== null) {\n clearTimeout(rec.flushTimer);\n rec.flushTimer = null;\n }\n }\n\n /**\n * Settle every unflushed entry after a publication (or a non-publishing\n * commit path). `revision` null = the rows never became public (idempotent\n * replace replay), so no publishedModelRevision is stamped. `drainAll`\n * zeroes the byte account (commit paths); flushes drain only their batches.\n */\n function settleUnflushed(\n rec: IngestSessionRecord<N, E>,\n revision: number | null,\n drainAll: boolean,\n ): void {\n if (drainAll) {\n rec.pendingBytes = 0;\n } else {\n for (const e of rec.unflushed) rec.pendingBytes -= e.bytes;\n if (rec.pendingBytes < 0) rec.pendingBytes = 0;\n }\n for (const e of rec.unflushed) {\n if (e.settled) continue;\n e.receipt.pendingBytes = rec.pendingBytes;\n if (revision !== null) e.receipt.publishedModelRevision = revision;\n e.settled = true;\n e.resolve(e.receipt);\n }\n rec.unflushed = [];\n }\n\n /**\n * Terminal abort core (T04 rollback). Removes exactly this session's\n * provisional rows via its tag index (the contribution) — never a\n * whole-scene checkpoint — recomputes the accepted base with every other\n * overlay intact, and (when provisional state had become public and\n * `publishRollback`) publishes ONE commit that advances modelRevision.\n * Pending append promises reject with 'aborted'.\n */\n function abortSessionInternal(\n rec: IngestSessionRecord<N, E>,\n cause: unknown,\n publishRollback: boolean,\n ): void {\n if (rec.state !== 'open') return;\n rec.state = 'aborted';\n openSessions.delete(rec);\n cancelFlushTimer(rec);\n const err = new OrbitOperationError(\n { code: 'aborted', cause },\n `orbit ingest session aborted: ${typeof cause === 'string' ? cause : 'aborted'}`,\n );\n for (const e of rec.unflushed) {\n if (!e.settled) {\n e.settled = true;\n e.reject(err);\n }\n }\n rec.unflushed = [];\n if (rec.overlayId !== null && rec.reserved) reservedOverlayIds.delete(rec.overlayId);\n if (rec.published) {\n publishedContributions = publishedContributions.filter((c) => c !== rec.contribution);\n if (publishRollback) {\n const merge = mergeModel(currentMergeBase(), publishedContributions);\n publishIngestModel({ merged: merge.accepted, merge, owner: rec });\n }\n }\n }\n\n /** §7.5: for `purpose:'replace'`, any model change not owned by that\n * session — overlay publications included — aborts it. */\n function invalidateReplaceSessions(owner: IngestSessionRecord<N, E> | null): void {\n for (const s of [...openSessions]) {\n if (s === owner || s.purpose !== 'replace') continue;\n abortSessionInternal(s, 'stale-base: the model changed outside the session (§7.5)', false);\n }\n }\n\n /** A replacing snapshot/session aborts ALL open sessions (§7.5). */\n function abortAllSessions(except: IngestSessionRecord<N, E> | null, cause: string): void {\n for (const s of [...openSessions]) {\n if (s === except) continue;\n abortSessionInternal(s, cause, false);\n }\n }\n\n /** Clear every overlay + ingestion bookkeeping (replacing snapshot/session).\n * Returns whether the store's overlayIds slice must be reset. */\n function clearOverlayState(): boolean {\n const hadCommitted = committedOverlayIds.length > 0;\n publishedContributions = [];\n committedOverlayIds = EMPTY_OVERLAY_IDS;\n reservedOverlayIds.clear();\n ingestMergeDiags = [];\n ingestCommitDiags = [];\n // §9.2: expansion overlays died with the rest — drop their bookkeeping\n // and the scope accretion they revealed (the SubgraphSpec itself is\n // per-dataset state and survives a same-dataset replace).\n expansionOverlays.clear();\n scopeExtraIds.clear();\n return hadCommitted;\n }\n\n /**\n * §16.3 T03 reconcile invalidation (R-16.3-06): drop expansion records\n * referencing nodes removed from the accepted snapshot — a record whose\n * expandedId or ANY addedNodeIds departed is invalidated (its collapse\n * exceptions can no longer be evaluated against the model that produced\n * it). Exclusions for departed ids prune as hygiene. Runs on every\n * accepted-model publication (declarative data branch + ingestion path).\n */\n function invalidateExpansionRecords(): void {\n if (accepted === null) {\n expansionRecords = [];\n effectiveRemovedIds.clear();\n return;\n }\n const index = accepted.nodeIndex;\n if (expansionRecords.length > 0) {\n expansionRecords = expansionRecords.filter(\n (r) => index.has(r.expandedId) && r.addedNodeIds.every((nid) => index.has(nid)),\n );\n }\n if (effectiveRemovedIds.size > 0) {\n for (const id of effectiveRemovedIds) {\n if (!index.has(id)) effectiveRemovedIds.delete(id);\n }\n }\n pruneFolds(index);\n }\n\n /**\n * §16.3 fold hygiene on an accepted-model publication: an anchor that left\n * the model drops its fold outright (nothing is standing there to stand\n * for anything), and a surviving anchor drops departed members. A fold\n * left with no members is deleted rather than kept as an empty husk, so\n * `getFold` never reports a fold that draws nothing.\n */\n function pruneFolds(index: ReadonlyMap<NodeId, number>): void {\n if (folds.size === 0) return;\n for (const [anchorId, memberIds] of folds) {\n if (!index.has(anchorId)) {\n folds.delete(anchorId);\n continue;\n }\n const kept = memberIds.filter((id) => index.has(id));\n if (kept.length === memberIds.length) continue;\n if (kept.length === 0) folds.delete(anchorId);\n else folds.set(anchorId, kept);\n }\n }\n\n /** Serializable snapshot of the T03 effective-set state (the §16.14\n * 'expansion' slice payload): record stack + collapse exclusions + §9.2\n * scope accretion. `extraRemoved` folds ids into the exclusion image\n * WITHOUT mutating state — the expansion step's BEFORE-image excludes its\n * own revealed ids, because overlay DATA persists across an undo (§7.5)\n * and restoring the pre-expansion effective set means hiding them. */\n function expansionStatePlain(extraRemoved: readonly NodeId[] = EMPTY_IDS): ExpansionStatePlain {\n const removed = new Set(effectiveRemovedIds);\n for (const id of extraRemoved) removed.add(id);\n return {\n records: expansionRecords.map((r) => ({\n expandedId: r.expandedId,\n addedNodeIds: [...r.addedNodeIds],\n overlayId: r.overlayId,\n })),\n removed: [...removed],\n extras: [...scopeExtraIds],\n };\n }\n\n /** §5: a datasetKey swap invalidates every in-flight expansion — the old\n * dataset's requests are aborted destroy-style (their caller promises\n * reject 'aborted'; the admission gate would discard any late result\n * anyway) and the ledger empties so the swap publication can reset the\n * `pendingExpansions` slice. */\n function abortExpansionsForDatasetSwap(): void {\n if (expansionHandles.size === 0 && expansionLedger.size === 0) return;\n const err = new OrbitOperationError(\n { code: 'aborted', cause: 'dataset-changed' },\n 'expansion aborted: the datasetKey changed (§5/§9.2)',\n );\n for (const [requestId, handle] of expansionHandles) {\n handle.abort(err);\n expansionRejectors.get(requestId)?.(err);\n }\n expansionHandles.clear();\n expansionRejectors.clear();\n expansionPromises.clear();\n for (const id of expansionLedger.ids()) expansionLedger.abort(id);\n }\n\n interface IngestPublication {\n merged: AcceptedGraph<N, E>;\n merge: MergeResult<N, E>;\n /** The session owning this change (skipped by replace invalidation). */\n owner: IngestSessionRecord<N, E> | null;\n /** Replace commit establishing a NEW datasetKey: per-dataset state clears. */\n datasetChanged?: boolean;\n /** Replace commit: revisions.source moves to the merged sourceRevision. */\n sourceChanged?: boolean;\n /** New committed-overlay id list, when it changed. */\n overlayIds?: readonly string[];\n }\n\n /**\n * The single ingestion publication path (flushes, atomic commits, rollback,\n * overlay removal): mirrors applyHostUpdate's data branch — banks live\n * positions, reconciles the merged model, advances model/scope (+render\n * when a commit is needed), prunes interaction slices, issues at most one\n * engine commit, and publishes exactly one store set().\n */\n function publishIngestModel(p: IngestPublication): void {\n const prev = store.getState();\n const datasetChanged = p.datasetChanged === true;\n if (datasetChanged) {\n // §5: new dataset — position caches, engine diagnostics, hard scope,\n // expansion bookkeeping, mask state, history, timeline playback,\n // domain freezes, metric columns, and atlas state do not carry over.\n reconciler = new Reconciler();\n engineDiags = [];\n scopeSpec = null;\n scopeExtraIds.clear();\n expansionOverlays.clear();\n abortExpansionsForDatasetSwap();\n abortSearchFlight('dataset-changed', 'search aborted: the datasetKey changed (§5/§16.5)');\n resetMaskState();\n historyKernel.clear();\n stopTimelineTimer();\n timelinePlayingKey = null;\n domainStore.clear();\n metricColumnGen.clear();\n metricDiags = [];\n churnDiags = [];\n resetImagePipelineState();\n // §16.3/§5: the groupBy collapsed residue is per-dataset state.\n groupByCollapsedKeys.clear();\n semanticZoomBand = null; // T05: re-establish on the next crossing\n // §16.3 T03: records + collapse exclusions are per-dataset state.\n expansionRecords = [];\n effectiveRemovedIds.clear();\n } else {\n // §7.1: bank live engine positions so they survive the structural swap.\n const engBank = engineIfReady();\n if (engBank !== null && scene !== null) {\n const pos = engBank.getPositions();\n if (pos !== null) bankEnginePositions(pos);\n }\n }\n accepted = p.merged;\n // §16.3 T03 (R-16.3-06): this publication invalidates records\n // referencing nodes the merged snapshot no longer contains (replace\n // commits, overlay removals, rollbacks).\n invalidateExpansionRecords();\n edgeIndexById = new Map(p.merged.edges.map((e, k) => [e.id, k] as const));\n adjacency = null;\n acceptedAdjacency = null;\n // §12: mirrors the revisions.model advance below — the MetricStore and\n // DomainStore freeze coordinate moves with the accepted model.\n acceptedModelSeq += 1;\n // §9.2: a model change re-resolves the hard scope; ONLY the scoped subset\n // feeds the reconciler (positions from the §7.1/§7.3 caches).\n scopedAccepted = computeScopedAccepted();\n // §16.3: the accepted model changed — store.groups re-resolves (departed\n // members drop) and stage 3 re-runs over the fresh scope in the SAME\n // publication.\n const groupsResolutionChanged = refreshGroupsResolution();\n const result = reconcileScene(scopedAccepted ?? p.merged);\n const ingestScene = scene!;\n labelPositionCache = null;\n const structuralChange = result.structuralChange;\n const positionChange = result.positionChange;\n dataDiags = p.merged.diagnostics;\n ingestMergeDiags = mergeDiagnostics(p.merge);\n\n // Interaction slices: a dataset change clears; a model change prunes\n // departed ids (overlay removal / rollback may remove nodes). Computed\n // BEFORE projection so mask memberships rebuild against the kept set.\n let nextSelection = prev.selection;\n let nextHidden = prev.hiddenNodeIds;\n let nextPins = prev.pins;\n let nextPinned = prev.pinnedNodeIds;\n if (datasetChanged) {\n nextSelection = EMPTY_SELECTION;\n nextHidden = EMPTY_HIDDEN;\n nextPins = EMPTY_PINS;\n nextPinned = EMPTY_PINNED;\n } else {\n const prunedNodes = pruneIds(nextSelection.nodeIds, p.merged.nodeIndex);\n const prunedEdges = pruneIds(nextSelection.edgeIds, edgeIndexById);\n if (prunedNodes !== nextSelection.nodeIds || prunedEdges !== nextSelection.edgeIds) {\n nextSelection = {\n nodeIds: prunedNodes,\n edgeIds: prunedEdges,\n groupIds: nextSelection.groupIds,\n };\n }\n let anyHiddenDropped = false;\n for (const id of nextHidden) {\n if (!p.merged.nodeIndex.has(id)) {\n anyHiddenDropped = true;\n break;\n }\n }\n if (anyHiddenDropped) {\n const kept = new Set<NodeId>();\n for (const id of nextHidden) if (p.merged.nodeIndex.has(id)) kept.add(id);\n nextHidden = kept;\n }\n let anyPinDropped = false;\n for (const id of nextPins.keys()) {\n if (!p.merged.nodeIndex.has(id)) {\n anyPinDropped = true;\n break;\n }\n }\n if (anyPinDropped) {\n const kept = new Map<NodeId, readonly [number, number]>();\n for (const [id, xy] of nextPins) if (p.merged.nodeIndex.has(id)) kept.set(id, xy);\n nextPins = kept;\n }\n // R-16.3-25: persistent pins prune departed ids through ownership.\n let anyPinnedDropped = false;\n for (const id of nextPinned) {\n if (!p.merged.nodeIndex.has(id)) {\n anyPinnedDropped = true;\n break;\n }\n }\n if (anyPinnedDropped) {\n const kept = new Set<NodeId>();\n for (const id of nextPinned) if (p.merged.nodeIndex.has(id)) kept.add(id);\n nextPinned = kept;\n }\n // §16.2/§16.3: a changed groups resolution prunes selected group ids\n // that no longer name a resolved group (same rule as applyHostUpdate).\n if (groupsResolutionChanged && nextSelection.groupIds.length > 0) {\n const keep = new Set<string>();\n for (const group of resolvedGroups) keep.add(group.id);\n const prunedGroupIds = nextSelection.groupIds.filter((id) => keep.has(id));\n if (prunedGroupIds.length !== nextSelection.groupIds.length) {\n nextSelection = { ...nextSelection, groupIds: prunedGroupIds };\n }\n }\n }\n const selectionChanged = !sameSelection(nextSelection, prev.selection);\n const selectedNodesChanged = !sameIds(nextSelection.nodeIds, prev.selection.nodeIds);\n const hiddenChanged = nextHidden !== prev.hiddenNodeIds;\n const pinsChanged = nextPins !== prev.pins;\n const pinnedChanged = nextPinned !== prev.pinnedNodeIds;\n const hoverCleared =\n datasetChanged && (prev.hover.nodeId !== null || prev.hover.edgeId !== null);\n\n // §16.6: keep the crossfilter engine in sync with the accepted model —\n // an id-stable prefix extension (overlay flush ADD rows) APPENDS without\n // a rebuild; anything else replaces (brushes preserved by key); a\n // dataset change rebuilds (brushes cleared).\n if (crossfilterEngine !== null) {\n syncCrossfilterModel(datasetChanged);\n } else if (crossfilterSpecs !== null) {\n // The crossfilter prop landed BEFORE any data (e.g. a fresh instance\n // that will be fed by a replace IngestSession — the demo's stream\n // mode): build over the first accepted model now. D3: a failed build\n // drops the unusable specs (diagnostic already recorded).\n if (!buildCrossfilterEngine()) crossfilterSpecs = null;\n }\n // §9.1: slot indices shifted — rebuild every mask membership from its\n // definition BEFORE projection so the buffers below compose the mask.\n rebuildMaskMemberships(nextHidden);\n refreshCrossfilterExternalMask(nextHidden);\n\n const buffers = projectChannelBuffers({\n nodeColor: true,\n nodeSize: true,\n linkColor: true,\n linkWidth: true,\n });\n let structure: EngineCommit['structure'] | undefined;\n if (structuralChange || positionChange) {\n structure = {\n pointCount: ingestScene.count,\n positions: ingestScene.positions,\n links: ingestScene.links,\n };\n }\n const commitNeeded = structure !== undefined || buffers !== undefined;\n\n const revisions: Revisions = { ...prev.revisions };\n revisions.model += 1;\n revisions.scope += 1;\n if (p.sourceChanged === true) revisions.source = p.merged.sourceRevision;\n if (commitNeeded) revisions.render += 1;\n\n const eng = engineIfReady();\n let simRestarted = false;\n let imageRefsPushed = false;\n if (commitNeeded && eng !== null) {\n const commit: EngineCommit = { revision: revisions.render };\n if (structure !== undefined) {\n commit.structure = structure;\n // I2/F11-03: the structural commit carries the roster's OWN\n // point→slot index (placeholders where undelivered).\n const syncIndex = structuralPointImageIndex();\n if (syncIndex !== null) commit.resources = { pointImageIndex: syncIndex };\n imageRefsPushed = true;\n }\n if (buffers !== undefined) commit.buffers = buffers;\n if (structure !== undefined && layout === 'force') {\n commit.restart = { alpha: 1 };\n simRestarted = true;\n }\n commitToEngine(eng, commit);\n revisions.appliedRender = eng.appliedRevision();\n const facade = session !== null ? session.edgePicking : null;\n if (facade !== null) {\n if (commit.restart !== undefined && commit.restart !== false) facade.disarm();\n else if (structure !== undefined) facade.arm(ingestScene.positions, ingestScene.links);\n }\n }\n\n // §8: the accepted-model roster changed — re-feed the atlas ref lane\n // (already done inside the structural commit above when one was sent).\n if (!imageRefsPushed) pushImageRefs();\n\n const labelRerank = recomputeCandidates();\n\n const patch: Partial<GraphStoreState> = {\n revisions,\n // Counts are ACCEPTED-MODEL counts; the scene may be scoped (§9.2).\n nodeCount: p.merged.nodes.length,\n edgeCount: p.merged.edges.length,\n diagnostics: composeDiagnostics(),\n };\n const nextVisible = computeVisibleCounts();\n if (!sameVisible(nextVisible, prev.visible)) patch.visible = nextVisible;\n if (datasetChanged && prev.timeline.playingKey !== null) {\n patch.timeline = { playingKey: null };\n }\n if (p.overlayIds !== undefined) patch.overlayIds = p.overlayIds;\n if (datasetChanged && prev.scope !== null) patch.scope = null;\n if (datasetChanged && prev.pendingExpansions.size > 0) {\n patch.pendingExpansions = EMPTY_EXPANSIONS;\n }\n // §16.5: the search slice is per-dataset — a swap clears it.\n if (datasetChanged && prev.search !== null) patch.search = null;\n if (simRestarted && !prev.simulationRunning) patch.simulationRunning = true;\n if (selectionChanged) patch.selection = nextSelection;\n if (hiddenChanged) patch.hiddenNodeIds = nextHidden;\n if (pinsChanged) patch.pins = nextPins;\n if (pinnedChanged) patch.pinnedNodeIds = nextPinned;\n if (hoverCleared) patch.hover = { nodeId: null, edgeId: null };\n if (groupsResolutionChanged) patch.groups = resolvedGroups;\n // §16.3: pruning may have shrunk or dropped folds on this publication.\n const nextFoldCounts = foldCountsIfChanged(prev.folds);\n if (nextFoldCounts !== null) patch.folds = nextFoldCounts;\n publish(patch);\n\n // §16 highlight remap + camera, mirroring applyHostUpdate step 9.\n if (eng !== null) {\n if (selectedNodesChanged || (structuralChange && nextSelection.nodeIds.length > 0)) {\n pushSelectionToEngine(eng, nextSelection.nodeIds);\n }\n if (\n pinsChanged ||\n pinnedChanged ||\n (structuralChange && (nextPins.size > 0 || nextPinned.size > 0))\n ) {\n pushPinsToEngine(eng, nextPins); // union sink reads the published slice\n }\n if (structuralChange && !hoverCleared && prev.hover.nodeId !== null) {\n const idx = ingestScene.indexById.get(prev.hover.nodeId);\n if (idx !== undefined) eng.setFocusedIndex(idx);\n }\n if (commitNeeded) maybeFitView(eng);\n }\n if (labelRerank.setChanged) notifyLabelSubs(candidateSubs);\n\n // §16.3 R-16.3-16: a model change re-derived the groupBy array — notify.\n if (groupsResolutionChanged && groupBySpec !== null && groupsSpec === null) {\n emit('groupsChange', { groups: resolvedGroups });\n }\n\n // §7.5: this model change aborts open replace sessions it does not own.\n invalidateReplaceSessions(p.owner);\n }\n\n /** Reserve the session's overlayId at its first append/commit reaching the\n * queue; a conflict terminally rejects the LATER session (§7.5). Returns\n * the rejection, or null when reserved. */\n function tryReserveOverlayId(rec: IngestSessionRecord<N, E>): Promise<never> | null {\n const id = rec.overlayId!;\n const holder = reservedOverlayIds.get(id);\n if (holder !== undefined && holder !== rec) {\n rec.state = 'aborted';\n openSessions.delete(rec);\n cancelFlushTimer(rec);\n return rejectOperation(\n { code: 'overlay-id-conflict', overlayId: id },\n `overlayId '${id}' is already reserved by an open or committed overlay for this dataset (§7.5)`,\n );\n }\n reservedOverlayIds.set(id, rec);\n rec.reserved = true;\n return null;\n }\n\n function scheduleFlush(rec: IngestSessionRecord<N, E>): void {\n if (rec.flushTimer !== null || destroyed) return;\n rec.flushTimer = setTimeout(() => {\n rec.flushTimer = null;\n if (destroyed) return;\n acceptanceQueue.admit(() => flushSession(rec));\n }, rec.maxFlushLatencyMs);\n }\n\n /** Coalesced progressive flush (queue job): at most one per engine-commit\n * turn and no later than maxFlushLatencyMs after the first staged append. */\n function flushSession(rec: IngestSessionRecord<N, E>): void {\n if (rec.state !== 'open') return;\n const c = rec.contribution;\n const hadNewRows = c.nodes.length > c.publicNodeCount || c.edges.length > c.publicEdgeCount;\n if (!hadNewRows && rec.unflushed.length === 0) return;\n c.publicNodeCount = c.nodes.length;\n c.publicEdgeCount = c.edges.length;\n if (!rec.published && (c.publicNodeCount > 0 || c.publicEdgeCount > 0)) {\n publishedContributions.push(c);\n rec.published = true;\n }\n if (hadNewRows) {\n const merge = mergeModel(currentMergeBase(), publishedContributions);\n publishIngestModel({ merged: merge.accepted, merge, owner: rec });\n }\n settleUnflushed(rec, store.getState().revisions.model, false);\n }\n\n function appendImpl(rec: IngestSessionRecord<N, E>, batch: IngestBatch<N, E>): Promise<AppendReceipt> {\n if (rec.state !== 'open') {\n return rejectOperation(\n { code: 'ingest-session-closed' },\n `append() on a ${rec.state} ingest session`,\n );\n }\n if (rec.purpose === 'overlay' && !rec.reserved) {\n const conflict = tryReserveOverlayId(rec);\n if (conflict !== null) return conflict;\n }\n // §7.5 sequencing: consecutive, strictly monotonic from zero. An admitted\n // {sequence, batchId} replay returns its ORIGINAL receipt (no\n // reprocessing); the same sequence under a different batchId is a\n // conflict; anything else unseen is a gap/out-of-order rejection. A\n // rejected append consumes neither sequence nor batchId.\n const existing = rec.entries.get(batch.sequence);\n if (existing !== undefined) {\n if (existing.batchId === batch.batchId) return existing.promise;\n return rejectOperation(\n {\n code: 'invalid-ingest-sequence',\n expected: rec.nextSequence,\n received: batch.sequence,\n conflict: true,\n },\n `append(): sequence ${batch.sequence} was already admitted with batchId '${existing.batchId}'`,\n );\n }\n if (batch.sequence !== rec.nextSequence) {\n return rejectOperation(\n {\n code: 'invalid-ingest-sequence',\n expected: rec.nextSequence,\n received: batch.sequence,\n conflict: false,\n },\n `append(): expected sequence ${rec.nextSequence}, received ${batch.sequence}`,\n );\n }\n const bytes = estimateBatchBytes(batch);\n const queuedBytes = rec.pendingBytes + bytes;\n if (rec.atomic && queuedBytes > rec.maxPendingBytes) {\n // Atomic staging cannot drain before commit, so parking this receipt\n // would deadlock the sequential `await append(); ...; await commit()`\n // producer. Reject THIS append only — per §7.5 a rejected append\n // consumes neither its sequence nor batchId and the session stays\n // open, so the caller may commit the staged prefix, retry with a\n // smaller batch, or abort deliberately (PR #8 follow-up: the terminal\n // session abort here contradicted the §7.5 rejected-append rule).\n return rejectOperation(\n { code: 'queue-overflow', queuedBytes, limit: rec.maxPendingBytes },\n `append(): atomic session would queue ${queuedBytes} bytes, exceeding its non-drainable budget of ${rec.maxPendingBytes}; ` +\n `the append was rejected and the session remains open (§7.5)`,\n );\n }\n const overflowLimit = rec.maxPendingBytes * INGEST_OVERFLOW_FACTOR;\n if (bytes > overflowLimit) {\n return rejectOperation(\n { code: 'queue-overflow', queuedBytes: bytes, limit: overflowLimit },\n `append(): batch of ${bytes} bytes exceeds the absolute cap of ${overflowLimit} (§7.5)`,\n );\n }\n\n // Admission: stage rows into the session tag index, stamped with global\n // admission-order tickets (§7.5 rollback metadata grows incrementally).\n const counts = stageBatch(rec.contribution, batch, rec.tallies, () =>\n acceptanceQueue.nextTicket(),\n );\n rec.nextSequence = batch.sequence + 1;\n rec.pendingBytes += bytes;\n const receipt: AppendReceipt = {\n sequence: batch.sequence,\n batchId: batch.batchId,\n admittedNodes: counts.admittedNodes,\n admittedEdges: counts.admittedEdges,\n pendingBytes: rec.pendingBytes,\n };\n let resolveFn!: (r: AppendReceipt) => void;\n let rejectFn!: (e: unknown) => void;\n const promise = new Promise<AppendReceipt>((res, rej) => {\n resolveFn = res;\n rejectFn = rej;\n });\n const entry: IngestEntry = {\n batchId: batch.batchId,\n bytes,\n receipt,\n promise,\n resolve: resolveFn,\n reject: rejectFn,\n settled: false,\n };\n rec.entries.set(batch.sequence, entry);\n\n if (rec.atomic) {\n // The cumulative hard-cap check above guarantees admission stays within\n // budget, so atomic receipts resolve immediately. NOTHING publishes\n // until commit (§7.5).\n entry.settled = true;\n entry.resolve(receipt);\n } else {\n // Progressive: the receipt resolves after the coalesced flush\n // containing this batch becomes public (publishedModelRevision set).\n rec.unflushed.push(entry);\n scheduleFlush(rec);\n }\n return promise;\n }\n\n function commitReplace(rec: IngestSessionRecord<N, E>): IngestCommitReceipt {\n const sourceRevision = rec.sourceRevision!;\n const c = rec.contribution;\n\n // Idempotent replay (§7.5): a replace commit naming the ALREADY-ACTIVE\n // {datasetKey, sourceRevision} publishes nothing, advances no revision,\n // and does NOT clear overlays — the same protection that keeps ordinary\n // React re-renders from erasing expansion/service results.\n if (\n baseAccepted !== null &&\n baseAccepted.datasetKey === rec.datasetKey &&\n baseAccepted.sourceRevision === sourceRevision\n ) {\n const replayBase = baseFromContribution(rec.datasetKey, sourceRevision, c, []);\n settleUnflushed(rec, null, true);\n return {\n modelRevision: store.getState().revisions.model,\n sourceRevision,\n admittedNodes: c.nodes.length,\n admittedEdges: c.edges.length,\n danglingEdges: replayBase.pendingEdges.length,\n };\n }\n\n const datasetChanged = baseAccepted !== null && baseAccepted.datasetKey !== rec.datasetKey;\n // A replacing session aborts every other open session and clears every\n // overlay (§7.5) — folded into this commit's single publication.\n abortAllSessions(rec, 'replaced: a replace session committed (§7.5)');\n const overlaysCleared = clearOverlayState();\n\n const newBase = baseFromContribution(rec.datasetKey, sourceRevision, c, []);\n const commitDiags = sessionCommitDiagnostics(rec.tallies, newBase.pendingEdges.length);\n baseAccepted = {\n datasetKey: rec.datasetKey,\n sourceRevision,\n nodes: newBase.nodes,\n edges: newBase.edges,\n nodeIndex: newBase.nodeIndex,\n diagnostics: commitDiags,\n };\n basePendingEdges = newBase.pendingEdges;\n baseSource = 'session';\n\n const merge = mergeModel(currentMergeBase(), publishedContributions);\n const pub: IngestPublication = {\n merged: merge.accepted,\n merge,\n owner: rec,\n sourceChanged: true,\n };\n if (datasetChanged) pub.datasetChanged = true;\n if (overlaysCleared) pub.overlayIds = EMPTY_OVERLAY_IDS;\n publishIngestModel(pub);\n\n const modelRevision = store.getState().revisions.model;\n settleUnflushed(rec, modelRevision, true);\n return {\n modelRevision,\n sourceRevision,\n admittedNodes: c.nodes.length,\n admittedEdges: c.edges.length,\n danglingEdges: newBase.pendingEdges.length,\n };\n }\n\n function commitOverlay(rec: IngestSessionRecord<N, E>): IngestCommitReceipt {\n const overlayId = rec.overlayId!;\n const c = rec.contribution;\n const hadNewRows = c.nodes.length > c.publicNodeCount || c.edges.length > c.publicEdgeCount;\n c.publicNodeCount = c.nodes.length;\n c.publicEdgeCount = c.edges.length;\n if (!rec.published && (c.publicNodeCount > 0 || c.publicEdgeCount > 0)) {\n publishedContributions.push(c);\n rec.published = true;\n }\n const merge = mergeModel(currentMergeBase(), publishedContributions);\n // Dangling diagnostics are emitted ONLY at session commit (§7.5); the\n // records stay in the pending-endpoint index and may resolve later.\n const dangling = merge.pendingBySource.get(overlayId) ?? 0;\n const commitDiags = sessionCommitDiagnostics(rec.tallies, dangling);\n if (commitDiags.length > 0) {\n ingestCommitDiags = [\n ...ingestCommitDiags,\n ...commitDiags.map((diag) => ({ overlayId, diag })),\n ];\n }\n committedOverlayIds = [...committedOverlayIds, overlayId];\n\n if (hadNewRows) {\n publishIngestModel({\n merged: merge.accepted,\n merge,\n owner: rec,\n overlayIds: committedOverlayIds,\n });\n } else {\n // Everything already public (fully-flushed progressive session):\n // registration-only publication, no model advance.\n publish({ overlayIds: committedOverlayIds, diagnostics: composeDiagnostics() });\n }\n const modelRevision = store.getState().revisions.model;\n settleUnflushed(rec, modelRevision, true);\n return {\n overlayId,\n modelRevision,\n admittedNodes: c.nodes.length,\n admittedEdges: c.edges.length,\n danglingEdges: dangling,\n };\n }\n\n function commitImpl(rec: IngestSessionRecord<N, E>): Promise<IngestCommitReceipt> {\n if (rec.state !== 'open') {\n return rejectOperation(\n { code: 'ingest-session-closed' },\n `commit() on a ${rec.state} ingest session`,\n );\n }\n if (rec.purpose === 'overlay' && !rec.reserved) {\n const conflict = tryReserveOverlayId(rec);\n if (conflict !== null) return conflict;\n }\n rec.state = 'committing';\n cancelFlushTimer(rec);\n let receipt: IngestCommitReceipt;\n try {\n receipt = rec.purpose === 'replace' ? commitReplace(rec) : commitOverlay(rec);\n } catch (err) {\n // §7.5: a commit failure after provisional publication terminally\n // aborts and rolls back this session; the previous scene stays healthy.\n rec.state = 'open'; // let the abort path run its terminal transition\n abortSessionInternal(rec, err, true);\n return rejectOperation(\n {\n code: 'resource-limit',\n detail: { reason: err instanceof Error ? err.message : String(err) },\n },\n `commit() failed; session rolled back (§7.5)`,\n );\n }\n rec.state = 'committed';\n openSessions.delete(rec);\n return Promise.resolve(receipt);\n }\n\n function abortImpl(rec: IngestSessionRecord<N, E>, reason: unknown): Promise<void> {\n if (rec.state !== 'open') {\n return rejectOperation(\n { code: 'ingest-session-closed' },\n `abort() on a ${rec.state} ingest session`,\n );\n }\n abortSessionInternal(rec, reason ?? 'aborted by caller', true);\n return Promise.resolve();\n }\n\n function beginIngestImpl(opts: BeginIngestOptions): IngestSession<N, E> {\n const purpose = opts.purpose;\n if (purpose !== 'replace' && purpose !== 'overlay') {\n throw new TypeError(`beginIngest: unknown purpose '${String(purpose)}'`);\n }\n if (purpose === 'replace') {\n if (opts.sourceRevision === undefined) {\n throw new TypeError(\"beginIngest: purpose:'replace' requires sourceRevision (§7.5)\");\n }\n if (opts.atomic === false) {\n throw new TypeError(\n \"beginIngest: replace sessions are always atomic — progressive replace frames would expose rows before their sourceRevision existed (§7.5)\",\n );\n }\n // T16: while a declarative data source is actively driving (a snapshot\n // was applied and not superseded by a replace session), a replace\n // session would race the host's own source of truth — reject at begin.\n // Overlay ingestion stays allowed alongside a declarative base.\n if (baseSource === 'declarative') {\n throw new TypeError(\n \"beginIngest: purpose:'replace' is unavailable while a declarative data source is active; keep applying snapshots via applyHostUpdate, or use an overlay session (§7.5/T16)\",\n );\n }\n }\n // CAS precondition (§7.5): zero on an empty instance.\n const currentModel = store.getState().revisions.model;\n if (opts.baseModelRevision !== currentModel) {\n throw new OrbitOperationError(\n { code: 'stale-revision', expected: currentModel, actual: opts.baseModelRevision },\n `beginIngest: baseModelRevision ${opts.baseModelRevision} is stale (current model revision is ${currentModel})`,\n );\n }\n if (purpose === 'overlay') {\n // Lineage: an overlay session is bound to the CURRENT dataset (§7.5).\n if (baseAccepted === null || baseAccepted.datasetKey !== opts.datasetKey) {\n throw new OrbitOperationError(\n { code: 'stale-revision', expected: currentModel, actual: opts.baseModelRevision },\n baseAccepted === null\n ? 'beginIngest: overlay sessions require an accepted base dataset (§7.5 lineage)'\n : `beginIngest: overlay sessions must name the current datasetKey '${baseAccepted.datasetKey}', got '${opts.datasetKey}' (§7.5 lineage)`,\n );\n }\n }\n\n const overlayId =\n purpose === 'overlay' ? (opts.overlayId ?? generateOverlayId()) : null;\n const rec: IngestSessionRecord<N, E> = {\n purpose,\n datasetKey: opts.datasetKey,\n sourceRevision: opts.sourceRevision ?? null,\n // replace is always atomic; overlays default atomic:true (§7.5).\n atomic: purpose === 'replace' ? true : (opts.atomic ?? true),\n overlayId,\n maxFlushLatencyMs: opts.maxFlushLatencyMs ?? INGEST_MAX_FLUSH_LATENCY_MS_DEFAULT,\n maxPendingBytes: opts.maxPendingBytes ?? INGEST_MAX_PENDING_BYTES_DEFAULT,\n state: 'open',\n reserved: false,\n nextSequence: 0,\n entries: new Map(),\n contribution: newContribution<N, E>(overlayId ?? ''),\n tallies: newStagingTallies(),\n unflushed: [],\n pendingBytes: 0,\n flushTimer: null,\n published: false,\n };\n openSessions.add(rec);\n\n return {\n get state(): IngestSessionState {\n return rec.state;\n },\n get overlayId(): string | undefined {\n return rec.overlayId ?? undefined;\n },\n append: (batch: IngestBatch<N, E>) => acceptanceQueue.admit(() => appendImpl(rec, batch)),\n commit: () => acceptanceQueue.admit(() => commitImpl(rec)),\n abort: (reason?: unknown) => acceptanceQueue.admit(() => abortImpl(rec, reason)),\n };\n }\n\n function beginIngest(opts: BeginIngestOptions): IngestSession<N, E> {\n if (destroyed) throwDestroyedOperation('beginIngest');\n return acceptanceQueue.admit(() => beginIngestImpl(opts));\n }\n\n function removeOverlay(overlayId: string): { removed: boolean } {\n if (destroyed) throwDestroyedOperation('removeOverlay');\n return acceptanceQueue.admit(() => {\n const idx = committedOverlayIds.indexOf(overlayId);\n if (idx === -1) return { removed: false }; // idempotent (§7.5)\n committedOverlayIds = committedOverlayIds.filter((id) => id !== overlayId);\n reservedOverlayIds.delete(overlayId); // released for deliberate reuse\n publishedContributions = publishedContributions.filter((c) => c.overlayId !== overlayId);\n ingestCommitDiags = ingestCommitDiags.filter((e) => e.overlayId !== overlayId);\n // §9.2: removing an expansion's overlay drops its bookkeeping record\n // and the scope accretion it revealed, in this SAME publication.\n for (const [rootId, records] of expansionOverlays) {\n if (!records.some((r) => r.overlayId === overlayId)) continue;\n const kept: ExpansionOverlayRecord[] = [];\n for (const r of records) {\n if (r.overlayId !== overlayId) {\n kept.push(r);\n continue;\n }\n for (const rid of r.revealedIds) scopeExtraIds.delete(rid);\n }\n if (kept.length === 0) expansionOverlays.delete(rootId);\n else expansionOverlays.set(rootId, kept);\n }\n // Re-run collision + endpoint resolution: formerly shadowed rows from\n // surviving overlays are promoted; resolved edges may re-pend (§7.5).\n const merge = mergeModel(currentMergeBase(), publishedContributions);\n publishIngestModel({\n merged: merge.accepted,\n merge,\n owner: null,\n overlayIds: committedOverlayIds,\n });\n return { removed: true };\n });\n }\n\n // -------------------------------------------------------------------------\n // §9.2 expansion (S8-T08/T10/T11/T12/T17). Every async result re-enters\n // through the acceptance queue for its admission decision and merges via a\n // normal atomic overlay IngestSession, so a custom service cannot bypass\n // byte admission, edge-before-node rules, or all-or-nothing admission.\n // NOTE: v0.5 does NOT cache service results — serviceCacheKey (./services)\n // is the ready seam; only in-flight same-id coalescing dedupes calls.\n // -------------------------------------------------------------------------\n\n function ownsExpansion(id: NodeId, requestId: string): boolean {\n return expansionLedger.requestIdFor(id) === requestId;\n }\n\n /**\n * §9.2 admission gate (the correctness gate — abort is an optimization):\n * dataset lineage must match, every DECLARED revision dimension must be\n * unchanged since issue (undeclared drift never invalidates — the local\n * service declares ['source'], so unrelated overlay publications do not\n * discard it), and every seed must still exist. Returns the denial reason\n * or null when admissible.\n */\n function expansionAdmissible(id: NodeId, ctx: RequestContext, at: RevisionSnapshot): string | null {\n if (destroyed) return 'instance destroyed';\n if (accepted === null || accepted.datasetKey !== ctx.datasetKey) {\n return 'dataset lineage changed';\n }\n if (\n !admitServiceResult({\n declared: expansionService.revisionDependencies,\n at,\n now: revisionSnapshot(),\n })\n ) {\n return 'declared revision dependencies drifted';\n }\n if (!accepted.nodeIndex.has(id)) return 'seed no longer exists';\n return null;\n }\n\n /** Response node ids NOT visible in the current render scope, deduped. */\n function revealedIdsOf(rows: readonly GraphNode<N>[]): NodeId[] {\n const view = renderModel();\n const out: NodeId[] = [];\n const seen = new Set<NodeId>();\n for (const row of rows) {\n const rid = (row as { id?: unknown }).id;\n if (typeof rid !== 'string' || seen.has(rid)) continue;\n seen.add(rid);\n if (view === null || !view.nodeIndex.has(rid)) out.push(rid);\n }\n return out;\n }\n\n /** T17 helper: is any response edge NOT already accepted? Explicit ids are\n * checked directly. Id-less rows use the same response-local pair counters\n * as ingestion, so a second parallel edge maps to `#1` instead of being\n * mistaken for the already-accepted `#0` merely because its pair exists. */\n function anyUnknownEdge(rows: readonly GraphEdge<E>[]): boolean {\n if (rows.length === 0) return false;\n if (accepted === null) return true;\n const pairCounters: EdgePairCounters = new Map();\n for (const e of rows) {\n if (typeof e.id === 'string') {\n if (!edgeIndexById.has(e.id)) return true;\n continue;\n }\n const id = nextSynthesizedEdgeId(pairCounters, e.source, e.target);\n if (!edgeIndexById.has(id)) return true;\n }\n return false;\n }\n\n /** Discard a service result before admission: ONE 'service-aborted' info\n * diagnostic, the graph untouched, and a typed rejection. */\n function discardExpansion(id: NodeId, why: string): never {\n pushServiceDiagnostic(\n 'service-aborted',\n 'info',\n `expansion result for '${id}' discarded before admission: ${why} (§9.2)`,\n );\n throw new OrbitOperationError(\n { code: 'aborted', cause: why },\n `expandNode('${id}') result discarded: ${why} (§9.2)`,\n );\n }\n\n /**\n * Merge an admitted expansion result through ONE awaited `atomic:true`\n * overlay IngestSession (single-response and streaming take the SAME\n * path — a stream is consumed one batch at a time through this session).\n * The overlayId/batchIds carry the request id so rollback and\n * removeOverlay remove exactly this contribution. A mid-stream failure\n * aborts the session — atomic sessions never published, so ALL batches\n * roll back and the graph is untouched.\n */\n async function mergeExpansionSession(\n id: NodeId,\n ctx: RequestContext,\n at: RevisionSnapshot,\n batches: Iterable<ExpansionBatch<N, E>> | AsyncIterable<ExpansionBatch<N, E>>,\n provenance: unknown,\n ): Promise<ExpandNodeResult> {\n const requestId = ctx.requestId;\n const overlayId = `expand:${id}:${requestId}`;\n const ingest = beginIngest({\n purpose: 'overlay',\n datasetKey: ctx.datasetKey,\n baseModelRevision: store.getState().revisions.model,\n atomic: true,\n overlayId,\n });\n const allNodes: GraphNode<N>[] = [];\n let sequence = 0;\n try {\n for await (const b of batches) {\n if (!ownsExpansion(id, requestId)) {\n throw new OrbitOperationError({ code: 'aborted', cause: 'collapsed' });\n }\n const batch: IngestBatch<N, E> = { sequence, batchId: `${requestId}#${sequence}` };\n if (b.nodes !== undefined) {\n batch.nodes = b.nodes;\n allNodes.push(...b.nodes);\n }\n if (b.edges !== undefined) batch.edges = b.edges;\n sequence++;\n await ingest.append(batch);\n }\n } catch (err) {\n // Mid-stream failure: roll back ALL batches (§9.2); graph untouched.\n if (ingest.state === 'open') await ingest.abort(err).catch(() => {});\n if (\n err instanceof OrbitOperationError &&\n (err.detail.code === 'aborted' || err.detail.code === 'ingest-session-closed')\n ) {\n // Collapse/invalidation, not a service fault — the caller promise\n // was already rejected (collapse) or rejects with this discard.\n throw err;\n }\n pushServiceDiagnostic(\n 'service-error',\n 'error',\n `expansion stream for '${id}' failed mid-stream; all batches rolled back: ${err instanceof Error ? err.message : String(err)}`,\n );\n throw err;\n }\n\n // Final §9.2 admission decision, serialized at the acceptance queue.\n const denial = acceptanceQueue.admit(() => {\n if (!ownsExpansion(id, requestId)) return 'collapsed';\n return expansionAdmissible(id, ctx, at);\n });\n if (denial !== null) {\n await ingest.abort(denial).catch(() => {});\n if (denial === 'collapsed') {\n throw new OrbitOperationError({ code: 'aborted', cause: denial });\n }\n discardExpansion(id, denial);\n }\n\n const revealed = revealedIdsOf(allNodes);\n // §16.3 T03: snapshot the effective-set state BEFORE this expansion\n // mutates it — the §16.14 'expansion' step's before-image. It EXCLUDES\n // the revealed ids: overlay DATA persists across an undo (§7.5), so\n // restoring the pre-expansion effective set means hiding them.\n const beforeState = expansionStatePlain(revealed);\n // Record membership (R-16.3-04/05): ids this expansion ASSERTS into the\n // effective set — the newly revealed ids plus returned ids whose\n // presence is itself expansion-made (listed by another LIVE record), so\n // a node added by two expansions is owned by BOTH records and survives\n // collapsing either one.\n const revealedSet = new Set(revealed);\n const liveAdded = new Set<NodeId>();\n for (const r of expansionRecords) {\n for (const nid of r.addedNodeIds) liveAdded.add(nid);\n }\n const recordAdded: NodeId[] = [];\n {\n const seenIds = new Set<NodeId>();\n for (const row of allNodes) {\n const rid = (row as { id?: unknown }).id;\n if (typeof rid !== 'string' || seenIds.has(rid)) continue;\n seenIds.add(rid);\n if (revealedSet.has(rid) || liveAdded.has(rid)) recordAdded.push(rid);\n }\n }\n // §9.2 scope accretion: under an active hard scope the revealed\n // neighbors join the resolved scope in the SAME commit publication (the\n // user's SubgraphSpec itself is never rewritten). A revealed id a past\n // collapse EXCLUDED re-enters the effective set here (T03).\n const addedExtras: NodeId[] = [];\n const removedRestores: NodeId[] = [];\n for (const rid of revealed) {\n if (effectiveRemovedIds.delete(rid)) removedRestores.push(rid);\n }\n if (scopeSpec !== null) {\n for (const rid of revealed) {\n if (!scopeExtraIds.has(rid)) {\n scopeExtraIds.add(rid);\n addedExtras.push(rid);\n }\n }\n }\n // T12 pinned accretion: pin all PREVIOUSLY-placed nodes while the new\n // arrivals settle under 'force'; released on the next simulationEnd.\n if (layout === 'force' && scene !== null && revealed.length > 0) {\n accretionPinIds = new Set(scene.idByIndex);\n }\n try {\n await ingest.commit();\n } catch (err) {\n for (const rid of addedExtras) scopeExtraIds.delete(rid);\n for (const rid of removedRestores) effectiveRemovedIds.add(rid);\n accretionPinIds = null;\n pushServiceDiagnostic(\n 'service-error',\n 'error',\n `expansion merge for '${id}' failed and rolled back: ${err instanceof Error ? err.message : String(err)}`,\n );\n throw err;\n }\n const eng = engineIfReady();\n if (eng !== null && accretionPinIds !== null) {\n pushPinsToEngine(eng, store.getState().pins); // union with the placed set\n }\n\n const record: ExpansionOverlayRecord = { overlayId, requestId, revealedIds: revealed };\n if (provenance !== undefined) record.provenance = provenance;\n const records = expansionOverlays.get(id);\n if (records === undefined) expansionOverlays.set(id, [record]);\n else records.push(record);\n\n // §16.3 T03: push the expansion record and interleave it with the\n // §16.14 undo stack as ONE 'expansion' step (session-local either way —\n // the record stack never reaches the store or view state). The depth\n // notification folds into this expansion's trailing publication.\n expansionRecords.push({ expandedId: id, addedNodeIds: recordAdded, overlayId });\n historyKernel.record('expansion', beforeState, expansionStatePlain());\n\n const view = renderModel();\n let added = 0;\n if (view !== null) {\n for (const rid of revealed) if (view.nodeIndex.has(rid)) added++;\n }\n return { added };\n }\n\n async function runExpansion(\n id: NodeId,\n hops: number,\n handle: RequestContextHandle,\n at: RevisionSnapshot,\n ): Promise<ExpandNodeResult> {\n const ctx = handle.context;\n const requestId = ctx.requestId;\n let response: ExpansionResponse<N, E>;\n try {\n response = await expansionService.neighbors([id], hops, ctx);\n } catch (err) {\n if (!ownsExpansion(id, requestId) || ctx.signal.aborted) {\n // Collapsed/destroyed while in flight — the caller promise was\n // already rejected; discard the late failure silently.\n throw err;\n }\n // §9.2 service failure: 'service-error' diagnostic; the promise\n // rejects with the cause; the 'error' event never fires.\n pushServiceDiagnostic(\n 'service-error',\n 'error',\n `expansion service failed for '${id}': ${err instanceof Error ? err.message : String(err)}`,\n );\n throw err;\n }\n if (!ownsExpansion(id, requestId) || ctx.signal.aborted) {\n // Collapsed while in flight: even a service that ignored the signal is\n // stopped HERE — nothing merges (abort optimizes, admission gates).\n throw new OrbitOperationError({ code: 'aborted', cause: 'collapsed' });\n }\n\n if ('batches' in response) {\n // Streaming: cheap pre-gate, then one batch at a time through ONE\n // atomic session (final admission re-checks before commit).\n const denial = acceptanceQueue.admit(() => expansionAdmissible(id, ctx, at));\n if (denial !== null) discardExpansion(id, denial);\n return mergeExpansionSession(id, ctx, at, response.batches, response.provenance);\n }\n\n const denial = acceptanceQueue.admit(() => expansionAdmissible(id, ctx, at));\n if (denial !== null) discardExpansion(id, denial);\n // T17: when every returned neighbor is already visible in the current\n // scope (and every edge already accepted), resolve {noop:true} WITHOUT\n // opening a session — no revision advances, no overlay bookkeeping.\n const nodes = response.nodes ?? [];\n const edges = response.edges ?? [];\n const revealed = revealedIdsOf(nodes);\n if (revealed.length === 0 && !anyUnknownEdge(edges)) return { noop: true };\n const rows: ExpansionBatch<N, E> = {};\n if (response.nodes !== undefined) rows.nodes = response.nodes;\n if (response.edges !== undefined) rows.edges = response.edges;\n return mergeExpansionSession(id, ctx, at, [rows], response.provenance);\n }\n\n function expandNode(id: NodeId, expandOpts?: { hops?: number }): Promise<ExpandNodeResult> {\n if (destroyed) {\n return Promise.reject(\n new OrbitOperationError(\n { code: 'aborted', cause: 'destroyed' },\n 'expandNode() called on a destroyed GraphInstance',\n ),\n );\n }\n // §9.2 same-id coalescing: a second expandNode(id) while one is in\n // flight returns the IDENTICAL promise — its result serves both callers\n // and the service is called ONCE.\n const inFlight = expansionPromises.get(id);\n if (inFlight !== undefined) return inFlight;\n if (accepted === null) return Promise.resolve({ noop: true });\n\n const rawHops = expandOpts?.hops ?? 1;\n const hops = Number.isFinite(rawHops) ? Math.max(1, Math.floor(rawHops)) : 1;\n const at = revisionSnapshot();\n // §9.2 RequestContext: dataset + the three revision dimensions at issue\n // time, a request id, and an AbortController-owned signal.\n const handle = createRequestContext({ datasetKey: accepted.datasetKey, revisions: at });\n const requestId = handle.context.requestId;\n expansionLedger.register(id, requestId);\n expansionHandles.set(requestId, handle);\n\n let settled = false;\n let resolveFn!: (r: ExpandNodeResult) => void;\n let rejectFn!: (e: unknown) => void;\n const promise = new Promise<ExpandNodeResult>((res, rej) => {\n resolveFn = res;\n rejectFn = rej;\n });\n // collapse/destroy settle the caller promise immediately; the late\n // service completion is then discarded by the ownership check.\n expansionRejectors.set(requestId, (e) => {\n if (!settled) {\n settled = true;\n rejectFn(e);\n }\n });\n expansionPromises.set(id, promise);\n publish({ pendingExpansions: expansionLedger.ids() }); // §14 loading affordance\n\n /** Ledger/handle cleanup plus the trailing §14 publication. MUST run\n * BEFORE the caller promise settles: `await expandNode(...)` has to\n * resume on a store that already reflects the expansion — its own\n * `pendingExpansions` clear and the folded §16.14 depth notification\n * ride this publish, and a caller that awaited and then read either\n * would otherwise observe a one-microtask-stale store. A collapse +\n * re-expand may have replaced these entries, so only the still-owning\n * request cleans up (no residue either way, idempotent under the\n * abort path that already cleaned up). */\n const finishExpansion = (): void => {\n if (expansionPromises.get(id) === promise) expansionPromises.delete(id);\n expansionHandles.delete(requestId);\n expansionRejectors.delete(requestId);\n if (expansionLedger.resolve(id, requestId) && !destroyed) {\n publish({ pendingExpansions: expansionLedger.ids() });\n }\n };\n\n void runExpansion(id, hops, handle, at).then(\n (r) => {\n finishExpansion();\n if (!settled) {\n settled = true;\n resolveFn(r);\n }\n },\n (e: unknown) => {\n finishExpansion();\n if (!settled) {\n settled = true;\n rejectFn(e);\n }\n },\n );\n return promise;\n }\n\n function retractExpansion(id: NodeId): void {\n if (destroyed) return;\n // 1. Abort the pending expansion (§9.2): reject the caller promise now,\n // cancel the RequestContext signal, drop the ledger slot. Abort is an\n // optimization — a service that ignores the signal is still discarded\n // at admission by the ownership check, so a late-resolving result\n // admits ZERO nodes (R-16.3-07).\n const requestId = expansionLedger.abort(id);\n if (requestId !== null) {\n expansionPromises.delete(id);\n const err = new OrbitOperationError(\n { code: 'aborted', cause: 'collapsed' },\n `expandNode('${id}') aborted by retractExpansion() (§9.2/§16.3)`,\n );\n expansionHandles.get(requestId)?.abort(err);\n expansionRejectors.get(requestId)?.(err);\n pushServiceDiagnostic(\n 'service-aborted',\n 'info',\n `pending expansion of '${id}' aborted by retractExpansion() (§9.2)`,\n );\n publish({ pendingExpansions: expansionLedger.ids() });\n }\n // 2. §16.3 T03: pop the most recent expansion record for `id` and remove\n // its addedNodeIds from the effective set, EXCEPT survivors — a queue\n // job like every other mutator (same global admission order).\n acceptanceQueue.admit(() => {\n collapseTopRecord(id);\n });\n }\n\n /**\n * §16.3 T03 collapse core (R-16.3-04/05/07): pops the most recent record\n * whose expandedId is `id` and removes its addedNodeIds from the effective\n * set, EXCEPT\n * (a) ids re-added by another LIVE expansion record, and\n * (b) ids still REACHABLE from the remaining effective set WITHOUT\n * traversing `id` — BFS over the accepted adjacency restricted to\n * the effective set, `id` excluded as a traversal vertex.\n * Removal is normally a VISIBILITY trim (overlay data persists, §7.5)\n * recorded as a §16.14 'expansion' step. EXCEPTION: when NOTHING survives,\n * the record's overlay is removed wholesale — the v0.5 explicit-removal\n * contract. That path is a §7.5 model operation and deliberately NOT a\n * history step (model changes are never undoable here, like removeOverlay\n * itself). Fires 'subgraphChange' with the next effective set whenever the\n * displayed set changed (the reporting seam a future controlled subgraph\n * mode will own as its §6.4 intent).\n */\n function collapseTopRecord(id: NodeId): void {\n let idx = -1;\n for (let i = expansionRecords.length - 1; i >= 0; i--) {\n if (expansionRecords[i]!.expandedId === id) {\n idx = i;\n break;\n }\n }\n if (idx === -1) return;\n const record = expansionRecords[idx]!;\n if (accepted === null) {\n expansionRecords.splice(idx, 1);\n return;\n }\n const view = renderModel() ?? accepted;\n // The record's added ids still displayed — departed/already-hidden ids\n // have nothing left to remove.\n const present = record.addedNodeIds.filter((nid) => view.nodeIndex.has(nid));\n // Exception (a): re-added by another live expansion record.\n const otherAdded = new Set<NodeId>();\n for (let i = 0; i < expansionRecords.length; i++) {\n if (i === idx) continue;\n for (const nid of expansionRecords[i]!.addedNodeIds) otherAdded.add(nid);\n }\n const candidates = new Set<NodeId>();\n for (const nid of present) {\n if (!otherAdded.has(nid)) candidates.add(nid);\n }\n // Exception (b): reachability over effective-set adjacency without `id`.\n const reached = reachableWithoutNode(view, candidates, id);\n const removal: NodeId[] = [];\n for (const nid of candidates) {\n if (!reached.has(nid)) removal.push(nid);\n }\n const anySurvivor = present.length > removal.length;\n const beforeState = expansionStatePlain();\n expansionRecords.splice(idx, 1);\n if (\n !anySurvivor &&\n record.overlayId !== null &&\n committedOverlayIds.includes(record.overlayId)\n ) {\n // No survivor at all: the overlay's contribution has no remaining\n // reason to stay loaded — explicit §7.5 removal (data leaves; the\n // publication's record invalidation prunes any stragglers).\n for (const nid of removal) scopeExtraIds.delete(nid);\n removeOverlay(record.overlayId);\n } else if (removal.length > 0) {\n // Visibility trim: data persists (§7.5); the effective set shrinks.\n for (const nid of removal) {\n scopeExtraIds.delete(nid);\n effectiveRemovedIds.add(nid);\n }\n historyKernel.record('expansion', beforeState, expansionStatePlain());\n publishEffectiveSetChange();\n } else {\n // Everything survived: the pop alone is the state change — still a\n // step (collapsing the OTHER expansion later must not resurrect this\n // one). Depths fold into one (otherwise empty) publication.\n historyKernel.record('expansion', beforeState, expansionStatePlain());\n publish({});\n }\n if (removal.length > 0) {\n const next = renderModel() ?? accepted;\n emit('subgraphChange', {\n subgraph: { seedIds: next === null ? [] : next.nodes.map((n) => n.id) },\n });\n }\n }\n\n /**\n * §16.3 T03 exception (b) primitive: BFS over the ACCEPTED adjacency\n * restricted to the effective set `view`, never visiting `blockedId`.\n * Sources are every effective node OUTSIDE `candidates` (and not\n * blockedId); candidates are traversable once reached, so a chain hanging\n * off a reachable candidate survives with it. Returns the reached subset\n * of `candidates`.\n */\n function reachableWithoutNode(\n view: AcceptedGraph<N, E>,\n candidates: ReadonlySet<NodeId>,\n blockedId: NodeId,\n ): ReadonlySet<NodeId> {\n const reachedCandidates = new Set<NodeId>();\n if (candidates.size === 0 || accepted === null) return reachedCandidates;\n const adj = acceptedAdjacencyOf();\n const visited = new Set<number>();\n const queue: number[] = [];\n for (const node of view.nodes) {\n const nid = node.id;\n if (nid === blockedId || candidates.has(nid)) continue;\n const ai = accepted.nodeIndex.get(nid);\n if (ai !== undefined && !visited.has(ai)) {\n visited.add(ai);\n queue.push(ai);\n }\n }\n while (queue.length > 0) {\n const cur = queue.pop()!;\n for (const nb of neighborsOf(adj, cur)) {\n if (visited.has(nb)) continue;\n const nbId = accepted.nodes[nb]!.id;\n if (nbId === blockedId || !view.nodeIndex.has(nbId)) continue;\n visited.add(nb);\n queue.push(nb);\n if (candidates.has(nbId)) reachedCandidates.add(nbId);\n }\n }\n return reachedCandidates;\n }\n\n /**\n * Republish after a T03 effective-set change (collapse trim / history\n * 'expansion' replay via applyHistoryCommands' shared path): re-resolve\n * the scoped model, reconcile (structural diff — survivors keep cached\n * positions), rebuild masks, re-project, ONE commit + ONE publication.\n * Advances scope+render, NEVER model (the §7.2 scope-driven rule the\n * group rewrite also follows).\n */\n function publishEffectiveSetChange(): void {\n if (accepted === null) {\n publish({});\n return;\n }\n const prev = store.getState();\n const eng = engineIfReady();\n if (eng !== null && scene !== null) {\n const pos = eng.getPositions();\n if (pos !== null) bankEnginePositions(pos); // §7.1 survivors keep positions\n }\n scopedAccepted = computeScopedAccepted();\n const result = reconcileScene(scopedAccepted ?? accepted);\n labelPositionCache = null;\n adjacency = null;\n hardScopeGen += 1;\n visibleGen += 1;\n const filterDiagsChanged = rebuildMaskMemberships(prev.hiddenNodeIds);\n refreshCrossfilterExternalMask(prev.hiddenNodeIds);\n const buffers = projectChannelBuffers({\n nodeColor: true,\n nodeSize: true,\n linkColor: true,\n linkWidth: true,\n });\n const structure: EngineCommit['structure'] | undefined =\n (result.structuralChange || result.positionChange) && scene !== null\n ? { pointCount: scene.count, positions: scene.positions, links: scene.links }\n : undefined;\n const commitNeeded = structure !== undefined || buffers !== undefined;\n const revisions: Revisions = { ...prev.revisions };\n revisions.scope += 1;\n if (commitNeeded) revisions.render += 1;\n let simRestarted = false;\n if (commitNeeded && eng !== null) {\n const commit: EngineCommit = { revision: revisions.render };\n if (structure !== undefined) {\n commit.structure = structure;\n // I2: the trimmed roster ships with ITS point→slot index.\n const syncIndex = structuralPointImageIndex();\n if (syncIndex !== null) commit.resources = { pointImageIndex: syncIndex };\n }\n if (buffers !== undefined) commit.buffers = buffers;\n if (structure !== undefined && layout === 'force') {\n // §9.2 reflow semantics: default restart; scopeSpec.reflow: false\n // keeps simulation state (a scope-less trim always reflows).\n if (scopeSpec === null || scopeSpec.reflow !== false) {\n commit.restart = { alpha: 1 };\n simRestarted = true;\n }\n }\n commitToEngine(eng, commit);\n revisions.appliedRender = eng.appliedRevision();\n const facade = session !== null ? session.edgePicking : null;\n if (facade !== null) {\n if (commit.restart !== undefined && commit.restart !== false) facade.disarm();\n else if (structure !== undefined && scene !== null) facade.arm(scene.positions, scene.links);\n }\n }\n const labelRerank = recomputeCandidates();\n const patch: Partial<GraphStoreState> = { revisions };\n const vis = computeVisibleCounts();\n if (!sameVisible(vis, prev.visible)) patch.visible = vis;\n if (simRestarted && !prev.simulationRunning) patch.simulationRunning = true;\n if (filterDiagsChanged || labelRerank.diagsChanged) patch.diagnostics = composeDiagnostics();\n publish(patch);\n // §16 highlight remap after the structural swap.\n if (eng !== null && result.structuralChange) {\n const sel = store.getState().selection;\n if (sel.nodeIds.length > 0 || sel.groupIds.length > 0) {\n pushSelectionToEngine(eng, sel.nodeIds);\n }\n const pins = store.getState().pins;\n if (pins.size > 0 || store.getState().pinnedNodeIds.size > 0) {\n pushPinsToEngine(eng, pins);\n }\n }\n if (labelRerank.setChanged) notifyLabelSubs(candidateSubs);\n }\n\n // -------------------------------------------------------------------------\n // §16.5 search (S11-T06/T07). The instance owns the §9.2 correctness\n // machinery around the pluggable SearchService: RequestContext creation,\n // revision-keyed LRU caching (in-flight coalescing per equal key),\n // supersede cancellation, and stale-result rejection at admission.\n // -------------------------------------------------------------------------\n\n /** The non-generic store/activation surfaces erase the caller's attr type\n * (GraphStoreState.search and SearchActivation carry the DEFAULT-generic\n * SearchResult; the id/score/label/node shape is identical). */\n function eraseSearchResults(rs: readonly SearchResult<N>[]): readonly SearchResult[] {\n return rs as unknown as readonly SearchResult[];\n }\n\n /** §9.2 admission gate for a completed search (abort is an optimization):\n * dataset lineage must match and every DECLARED revision dimension must be\n * unchanged since issue. Returns the denial reason or null. */\n function searchAdmissible(ctx: RequestContext, at: RevisionSnapshot): string | null {\n if (destroyed) return 'instance destroyed';\n if (accepted === null || accepted.datasetKey !== ctx.datasetKey) {\n return 'dataset lineage changed';\n }\n if (\n !admitServiceResult({\n declared: searchService.revisionDependencies,\n at,\n now: revisionSnapshot(),\n })\n ) {\n return 'stale at admission: declared revision dependencies drifted';\n }\n return null;\n }\n\n /** §5/§16.5 dataset swap / destroy: the in-flight search call rejects\n * 'aborted' and the revision-keyed cache empties (its keys are lineage-\n * scoped, so this is hygiene, not correctness — admission is the gate). */\n function abortSearchFlight(cause: string, message: string): void {\n searchCache.clear();\n if (searchFlight === null) return;\n const flight = searchFlight;\n searchFlight = null;\n const err = new OrbitOperationError({ code: 'aborted', cause }, message);\n flight.handle.abort(err);\n flight.reject(err);\n }\n\n /** One search service call: raw results, then the §9.2 admission decision\n * serialized at the acceptance queue, then `node` population against the\n * (still-current) accepted model. Never publishes — the LATEST search()\n * caller owns the single store publication. */\n async function runSearch(\n query: string,\n limit: number,\n handle: RequestContextHandle,\n at: RevisionSnapshot,\n ): Promise<readonly SearchResult<N>[]> {\n const ctx = handle.context;\n let raw: readonly SearchResult<N>[];\n try {\n raw = await searchService.search(query, { limit }, ctx);\n } catch (err) {\n if (!ctx.signal.aborted && !destroyed) {\n // §9.2 service failure: 'service-error' diagnostic; the promise\n // rejects with the cause; the 'error' event never fires.\n pushServiceDiagnostic(\n 'service-error',\n 'error',\n `search service failed for '${query}': ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n throw err;\n }\n if (ctx.signal.aborted) {\n // Superseded/destroyed while in flight: even a service that ignored\n // the signal is stopped HERE (abort optimizes, admission gates). The\n // caller promise was already rejected by the supersede path.\n throw new OrbitOperationError(\n { code: 'aborted', cause: 'superseded' },\n `search('${query}') was superseded before admission (§16.5)`,\n );\n }\n // §9.2 stale-result rule, serialized at the acceptance queue: a result\n // whose declared revisions drifted is DISCARDED — the promise rejects\n // with a typed 'aborted' error carrying a distinct staleness message.\n const denial = acceptanceQueue.admit(() => searchAdmissible(ctx, at));\n if (denial !== null) {\n throw new OrbitOperationError(\n { code: 'aborted', cause: denial },\n `search('${query}') result discarded: ${denial} (§9.2/§16.5)`,\n );\n }\n if (accepted === null) return raw; // unreachable past admission; type guard\n // §16.5 store contract: `node` populated for ids in the accepted model.\n const populated: SearchResult<N>[] = [];\n for (const r of raw) {\n const idx = accepted.nodeIndex.get(r.id);\n const node = idx === undefined ? undefined : accepted.nodes[idx];\n populated.push(node === undefined ? r : { ...r, node });\n }\n return populated;\n }\n\n function search(\n query: string,\n searchOpts?: { limit?: number },\n ): Promise<readonly SearchResult<N>[]> {\n if (destroyed) {\n return Promise.reject(\n new OrbitOperationError(\n { code: 'aborted', cause: 'destroyed' },\n 'search() called on a destroyed GraphInstance',\n ),\n );\n }\n const token = ++searchSeq;\n const rawLimit = searchOpts?.limit ?? SEARCH_LIMIT_DEFAULT;\n const limit = Number.isFinite(rawLimit)\n ? Math.max(0, Math.floor(rawLimit))\n : SEARCH_LIMIT_DEFAULT;\n if (accepted === null) {\n // No accepted base: nothing to search against — an honest empty\n // completion (still the latest publication for navigator consumers).\n publish({ search: { query, results: [] } });\n return Promise.resolve([]);\n }\n const at = revisionSnapshot();\n // §9.2 cache-key rule: service identity + canonical params + datasetKey\n // + EXACTLY the declared revision dimensions' current values.\n const key = serviceCacheKey({\n serviceId: 'search',\n // `fields` is defensive insurance (F12-03): searchIndex is\n // construction-only (D7) so it cannot legitimately change, but keying\n // it here guarantees a cached result can never outlive the field\n // configuration it was computed under.\n params: { fields: (searchIndexFields ?? []).join('\u001f'), limit, q: query },\n datasetKey: accepted.datasetKey,\n declared: searchService.revisionDependencies,\n revisions: at,\n });\n // §16.5 supersede: a NEWER query cancels the older in-flight call — its\n // callers reject 'aborted' and its (unsettled) cache entry evicts. An\n // equal key instead coalesces onto the in-flight promise below.\n if (searchFlight !== null && searchFlight.key !== key) {\n const flight = searchFlight;\n searchFlight = null;\n const err = new OrbitOperationError(\n { code: 'aborted', cause: 'superseded' },\n `search('${query}') superseded the older in-flight query (§16.5)`,\n );\n flight.handle.abort(err);\n flight.reject(err);\n }\n let shared = searchCache.get(key);\n if (shared !== undefined) {\n // LRU refresh: re-insert as most recent.\n searchCache.delete(key);\n searchCache.set(key, shared);\n } else {\n const handle = createRequestContext({ datasetKey: accepted.datasetKey, revisions: at });\n let settled = false;\n let resolveFn!: (r: readonly SearchResult<N>[]) => void;\n let rejectFn!: (e: unknown) => void;\n const promise = new Promise<readonly SearchResult<N>[]>((res, rej) => {\n resolveFn = res;\n rejectFn = rej;\n });\n const flight = {\n key,\n handle,\n reject: (e: unknown) => {\n if (settled) return;\n settled = true;\n // Failures are never served from the cache.\n if (searchCache.get(key) === promise) searchCache.delete(key);\n rejectFn(e);\n },\n };\n searchFlight = flight;\n searchCache.set(key, promise);\n while (searchCache.size > SEARCH_CACHE_LIMIT) {\n const oldest = searchCache.keys().next();\n if (oldest.done === true) break;\n searchCache.delete(oldest.value);\n }\n void runSearch(query, limit, handle, at)\n .then(\n (r) => {\n if (!settled) {\n settled = true;\n resolveFn(r);\n }\n },\n (e: unknown) => {\n flight.reject(e);\n },\n )\n .finally(() => {\n if (searchFlight === flight) searchFlight = null;\n });\n shared = promise;\n }\n const issuedDatasetKey = accepted.datasetKey;\n return shared.then((results) => {\n // ONE publish, owned by the LATEST search() call: a superseded caller\n // or a replayed cache hit never clobbers a newer publication, and a\n // dataset swap between admission and this microtask never resurrects\n // the old dataset's results.\n if (\n !destroyed &&\n token === searchSeq &&\n accepted !== null &&\n accepted.datasetKey === issuedDatasetKey\n ) {\n publish({ search: { query, results: eraseSearchResults(results) } });\n }\n return results;\n });\n }\n\n function clearSearch(): void {\n if (destroyed) return;\n // I6/F12-01: clearing SUPERSEDES active work — advance the publication\n // token so a flight that settles later can never republish the cleared\n // query (the token is the gate; the abort below is the optimization).\n // The flight's reject path also evicts its unsettled cache entry, so a\n // repeat of the same query after clear re-runs the service.\n searchSeq += 1;\n if (searchFlight !== null) {\n const flight = searchFlight;\n searchFlight = null;\n const err = new OrbitOperationError(\n { code: 'aborted', cause: 'cleared' },\n 'search cleared while in flight (§16.5)',\n );\n flight.handle.abort(err);\n flight.reject(err);\n }\n if (store.getState().search !== null) publish({ search: null });\n }\n\n // -------------------------------------------------------------------------\n // §16.2 findPath / clearPath (S12-T08). One findPath application is ONE\n // atomic action: path-node indices to the engine selection-highlight\n // channel plus a single buffers-only link commit whose dim complement is\n // composed INSIDE composeEdgeAlphaBuffer (the path owns the link lane\n // until clearPath or any selection mutation). Session-local by contract.\n // -------------------------------------------------------------------------\n\n function pathAdmissible(ctx: RequestContext, at: RevisionSnapshot): string | null {\n if (destroyed) return 'instance destroyed';\n if (accepted === null || accepted.datasetKey !== ctx.datasetKey) {\n return 'dataset lineage changed';\n }\n if (\n !admitServiceResult({\n declared: pathServiceImpl.revisionDependencies,\n at,\n now: revisionSnapshot(),\n })\n ) {\n return 'stale at admission: declared revision dependencies drifted';\n }\n return null;\n }\n\n /** Drop path state WITHOUT touching the engine (scene rebuild path — the\n * rebuild's own commit recomposes the link lane from scratch). */\n function dropPathState(): void {\n activePath = null;\n pathDimEdges = null;\n }\n\n /** Full clear: restore the selection highlight and recompose the link\n * lane in one buffers-only commit. No-op when no path is active. */\n function clearPathInternal(): void {\n if (activePath === null) return;\n dropPathState();\n const eng = engineIfReady();\n if (eng !== null && scene !== null) {\n const prev = store.getState();\n const revisions: Revisions = { ...prev.revisions };\n revisions.render += 1;\n commitToEngine(eng, {\n revision: revisions.render,\n buffers: { linkColor: composeEdgeAlphaBuffer(baseLinkColorBuffer()) },\n });\n revisions.appliedRender = eng.appliedRevision();\n pushSelectionToEngine(eng, prev.selection.nodeIds);\n publish({ revisions });\n }\n }\n\n function clearPath(): void {\n if (destroyed) return;\n pathSeq += 1; // supersede any in-flight findPath\n clearPathInternal();\n }\n\n function getActivePath(): PathResult | null {\n return activePath;\n }\n\n async function findPath(\n sourceId: NodeId,\n targetId: NodeId,\n options?: PathOptions,\n ): Promise<PathResult | null> {\n if (destroyed) {\n throw new OrbitOperationError(\n { code: 'aborted', cause: 'destroyed' },\n 'findPath() called on a destroyed GraphInstance',\n );\n }\n const token = ++pathSeq;\n if (accepted === null) return null;\n const at = revisionSnapshot();\n const issuedDatasetKey = accepted.datasetKey;\n const handle = createRequestContext({ datasetKey: issuedDatasetKey, revisions: at });\n const result = await pathServiceImpl.find(sourceId, targetId, options ?? {}, handle.context);\n // §9.2: admission is the gate — a result arriving after a dataset\n // replacement or revision drift is DISCARDED (typed rejection).\n const denial = acceptanceQueue.admit(() => pathAdmissible(handle.context, at));\n if (denial !== null) {\n throw new OrbitOperationError(\n { code: 'aborted', cause: 'stale' },\n `findPath('${sourceId}' → '${targetId}') discarded: ${denial} (§9.2)`,\n );\n }\n // Superseded by a newer findPath/clearPath: the RESULT still returns to\n // the caller, but emphasis belongs to the latest action only.\n if (token !== pathSeq || result === null) return result;\n if (scene !== null) {\n const plan = computePathEmphasis(result, {\n indexById: scene.indexById,\n edgeIdByIndex: scene.edgeIdByIndex,\n ...(softMask !== null\n ? { isEdgeVisible: (k: number) => softMask!.isEdgeVisible(k) }\n : {}),\n });\n activePath = result;\n pathDimEdges = new Set(plan.dimEdgeIndices);\n const eng = engineIfReady();\n if (eng !== null) {\n const prev = store.getState();\n const revisions: Revisions = { ...prev.revisions };\n revisions.render += 1;\n // ONE atomic link-channel commit (emphasis + dim complement) …\n commitToEngine(eng, {\n revision: revisions.render,\n buffers: { linkColor: composeEdgeAlphaBuffer(baseLinkColorBuffer()) },\n });\n revisions.appliedRender = eng.appliedRevision();\n // … plus the path-node highlight (path owns the channel until clear).\n eng.setSelectedIndices(plan.nodeIndices.length > 0 ? [...plan.nodeIndices] : null);\n publish({ revisions });\n }\n }\n return result;\n }\n\n /** §16.5 result contract (T07). Classification only — NEVER mutates scope\n * or filters (the host reacts explicitly). */\n function activateSearchResult(result: SearchResult<N>): SearchActivation {\n const id = result.id;\n const plain = result as unknown as SearchResult;\n if (scene !== null) {\n const idx = scene.indexById.get(id);\n if (idx !== undefined) {\n if (softMask === null || softMask.isNodeVisible(idx)) {\n // In the rendered scene and §9.1 mask-visible: select-and-fly.\n focusNode(id);\n return { status: 'focused', id };\n }\n return { status: 'unavailable', reason: 'filtered', result: plain };\n }\n }\n if (accepted !== null && accepted.nodeIndex.has(id)) {\n return { status: 'unavailable', reason: 'out-of-scope', result: plain };\n }\n return { status: 'unavailable', reason: 'not-loaded', result: plain };\n }\n\n /** §9.2 isolate: hard-scope to the current selection through the SAME\n * path as the `subgraph` prop (uncontrolled-only — instance-owned).\n * §16.3 isolate-as-unit (S12-T02): selected GROUP ids resolve to their\n * memberIds BEFORE scope resolution (§16.2), so isolating a selection\n * containing a collapsed group hard-scopes to the members and the stage-3\n * rewrite renders the super-node as a unit. */\n function isolateSelection(): void {\n if (destroyed) return;\n const sel = store.getState().selection;\n const seedIds: NodeId[] = [...sel.nodeIds];\n for (const groupId of sel.groupIds) {\n const group = resolvedGroups.find((g) => g.id === groupId);\n if (group !== undefined) seedIds.push(...group.memberIds);\n }\n const seeds = dedupeFirstOccurrence(seedIds);\n if (seeds.length === 0) return; // an empty scope would render nothing\n applyHostUpdate({ subgraph: { seedIds: seeds } });\n }\n\n function resetIsolation(): void {\n if (destroyed) return;\n applyHostUpdate({ subgraph: null });\n }\n\n // -------------------------------------------------------------------------\n // applyHostUpdate — the atomic boundary (§6)\n // -------------------------------------------------------------------------\n\n function applyHostUpdate(update: GraphHostUpdate<N, E>): void {\n if (destroyed) throwDestroyedOperation('applyHostUpdate');\n // T01: every state publication routes through the acceptance queue.\n acceptanceQueue.admit(() => {\n applyHostUpdateInner(update);\n // §16.14: a HOST update is the reflection channel for a staged\n // aggregate restore — matching values acknowledge, different values\n // diverge, unrelated updates pass through.\n checkRestoreAcknowledgement(update);\n });\n }\n\n function applyHostUpdateInner(update: GraphHostUpdate<N, E>): void {\n // I1: the model revision current when this update was ISSUED — the only\n // coordinate the host could have stamped async work with (an atomic\n // data+metrics update advances acceptedModelSeq before metrics admit,\n // but its columns were built at THIS revision).\n const issuedModelSeq = acceptedModelSeq;\n // D7: set when this update carried a (rejected) construction-only option\n // — forces the warning diagnostic into this update's single publish.\n let searchIndexRejected = false;\n // D3/F10-04: set when a crossfilter spec replacement was rejected —\n // same publish-forcing role.\n let crossfilterRejected = false;\n // §16.3: a lane changed outside this update's own diffing (e.g. a group\n // op cleared its verdict) — force one diagnostics recompose.\n const diagnosticsForced = pendingDiagnosticsRefresh;\n pendingDiagnosticsRefresh = false;\n // --- 0. §9.1 filter validation: reject BEFORE any work so a malformed\n // filter can never leave a partially-applied atomic host update. ---\n if (update.filter !== undefined && update.filter !== null) {\n const findings: string[] = [];\n const spec = update.filter;\n if (spec.nodes !== undefined && typeof spec.nodes !== 'function') {\n for (const f of validateFilterExpr(spec.nodes)) findings.push(`nodes.${f}`);\n }\n if (spec.edges !== undefined && typeof spec.edges !== 'function') {\n for (const f of validateFilterExpr(spec.edges)) findings.push(`edges.${f}`);\n }\n if (spec.mode !== undefined && spec.mode !== 'hide' && spec.mode !== 'dim') {\n findings.push(`mode: unknown filter mode '${String(spec.mode)}'`);\n }\n if (findings.length > 0) {\n throw new TypeError(`applyHostUpdate: invalid filter (§9.1): ${findings.join('; ')}`);\n }\n }\n\n const prev = store.getState();\n const previousLayout = layout;\n const nextLayout = update.layout ?? previousLayout;\n const layoutChanged = nextLayout !== previousLayout;\n const freezesForceLayout = previousLayout === 'force' && nextLayout === 'fixed';\n const activatesForceLayout = previousLayout === 'fixed' && nextLayout === 'force';\n const eng = engineIfReady();\n let pausedForFixedLayout = false;\n\n /** A force → fixed transition must stop integration before its one\n * authoritative readback. Structural-update callers share this helper so\n * the transition never performs a redundant second O(n) readback. */\n const bankReadyEnginePositions = (): void => {\n if (eng === null || scene === null) return;\n if (freezesForceLayout && !pausedForFixedLayout) {\n eng.pause();\n pausedForFixedLayout = true;\n }\n const pos = eng.getPositions();\n if (pos !== null) bankEnginePositions(pos);\n };\n\n // --- 1. data: validate → reconcile (skipped entirely on idempotent replay §5).\n // The replay check runs against the BASE source coordinate, so replaying\n // the same base snapshot never clears overlays or aborts sessions (§7.5 —\n // the React re-render protection). ---\n let dataChanged = false;\n let structuralChange = false;\n let positionChange = false;\n let datasetKeyChanged = false;\n let overlayIdsCleared = false;\n const data = update.data;\n if (data !== undefined) {\n const isReplay =\n baseAccepted !== null &&\n baseAccepted.datasetKey === data.datasetKey &&\n baseAccepted.sourceRevision === data.sourceRevision;\n if (!isReplay) {\n // Validation is pure and may reject a hostile/malformed object (for\n // example, a throwing property getter). Complete it before aborting\n // sessions, clearing overlays, pausing layout, or banking positions so\n // a rejected atomic host update has no observable side effects.\n const nextAccepted = validateSnapshot<N, E>(data);\n // §7.5: a replacing declarative snapshot aborts ALL open sessions and\n // clears every overlay before the new base is accepted.\n abortAllSessions(null, 'replaced: a declarative snapshot was applied (§7.5)');\n overlayIdsCleared = clearOverlayState();\n datasetKeyChanged = baseAccepted !== null && baseAccepted.datasetKey !== data.datasetKey;\n if (datasetKeyChanged) {\n // §5: new dataset — position caches, engine diagnostics, mask\n // state, history, timeline playback, domain freezes, metric\n // columns, and atlas state do not carry over.\n reconciler = new Reconciler();\n engineDiags = [];\n abortExpansionsForDatasetSwap();\n abortSearchFlight('dataset-changed', 'search aborted: the datasetKey changed (§5/§16.5)');\n resetMaskState();\n historyKernel.clear();\n stopTimelineTimer();\n timelinePlayingKey = null;\n domainStore.clear();\n metricColumnGen.clear();\n metricDiags = [];\n churnDiags = [];\n resetImagePipelineState();\n // §16.3/§5: the groupBy collapsed residue is per-dataset state\n // (the SPEC lanes survive — host config, like filter/groups).\n groupByCollapsedKeys.clear();\n semanticZoomBand = null; // T05: re-establish on the next crossing\n // §16.3 T03: expansion records and collapse exclusions are\n // per-dataset session state.\n expansionRecords = [];\n effectiveRemovedIds.clear();\n } else {\n // §7.1: bank live engine positions so they survive the structural swap.\n bankReadyEnginePositions();\n }\n accepted = nextAccepted;\n // §16.3 T03 (R-16.3-06): the publication pass invalidates records\n // referencing nodes the new accepted snapshot no longer contains.\n invalidateExpansionRecords();\n // §12: mirrors the revisions.model advance in step 6 — the metric/\n // domain freeze coordinate moves with the accepted model.\n acceptedModelSeq += 1;\n baseAccepted = nextAccepted;\n basePendingEdges = [];\n baseSource = 'declarative';\n edgeIndexById = new Map(nextAccepted.edges.map((e, k) => [e.id, k] as const));\n adjacency = null; // model changed — the CSR caches are stale (§13)\n acceptedAdjacency = null;\n dataDiags = nextAccepted.diagnostics;\n dataChanged = true;\n }\n }\n\n // --- 1b. §9.2 hard scope. Ownership (v0.5): `subgraph` is\n // UNCONTROLLED-ONLY — this prop and isolateSelection()/resetIsolation()\n // write the SAME instance-owned state; last writer wins and omitting the\n // prop leaves the last written scope in place. ---\n let scopeChanged = false;\n if (datasetKeyChanged && scopeSpec !== null) {\n // §5: the hard scope is per-dataset id-keyed state — a new dataset clears it.\n scopeSpec = null;\n scopeChanged = true;\n }\n if (update.subgraph !== undefined && !sameSubgraphSpec(update.subgraph, scopeSpec)) {\n // §16.14: scope statements (subgraph prop / isolate / reset) record.\n historyKernel.record('scope', subgraphPlain(scopeSpec), subgraphPlain(update.subgraph));\n scopeSpec = update.subgraph;\n // An explicit scope statement resets expansion accretion (§9.2) AND\n // the §16.3 T03 effective set: every expansion record and collapse\n // exclusion clears (R-16.3-09).\n scopeExtraIds.clear();\n expansionRecords = [];\n effectiveRemovedIds.clear();\n scopeChanged = true;\n }\n if (scopeChanged) {\n // §11: 'hard-scope' (and the stricter 'visible') domain scopes\n // recompute when the hard scope changes.\n hardScopeGen += 1;\n visibleGen += 1;\n }\n\n // --- 1b'. §16.3 groups lanes. Manual `groups`: validate → resolve\n // BEFORE any scene rewrite (D4) — a violating array yields ONE\n // 'config-error' diagnostic and changes NOTHING else (the previous\n // groups and scene stay live, zero engine commits); `null` clears (D2);\n // a HOST update carrying the key at all flips the slice to CONTROLLED\n // (§6.4 — ops fire intents afterwards). Derived `groupBy` (T04):\n // boundary-validated (D4), reference-diffed; `null` clears. Both lanes\n // together is the R-16.3-15 config error — the ERROR wins and NEITHER\n // applies until the host removes one. ---\n let groupsDiagsChanged = false;\n let groupsSpecChanged = false;\n if (update.groups !== undefined && !groupsInternalWrite) groupsControlled = true;\n if (update.groups !== undefined) {\n if (update.groups === null) {\n if (groupsSpec !== null) {\n groupsSpec = null;\n groupsSpecChanged = true;\n }\n if (groupsDiags.length > 0) {\n groupsDiags = [];\n groupsDiagsChanged = true;\n }\n } else if (!sameGroupSpecArrays(update.groups, groupsSpec)) {\n const verdict = validateGroupSpecs(update.groups, accepted?.nodeIndex ?? null);\n if (verdict.diagnostic !== null) {\n groupsDiags = [verdict.diagnostic];\n groupsDiagsChanged = true;\n } else {\n groupsSpec = update.groups;\n groupsSpecChanged = true;\n if (groupsDiags.length > 0) {\n groupsDiags = [];\n groupsDiagsChanged = true;\n }\n }\n }\n }\n let groupByChanged = false;\n if (update.groupBy !== undefined) {\n if (update.groupBy === null) {\n if (groupBySpec !== null) {\n groupBySpec = null;\n groupByChanged = true;\n semanticZoomBand = null; // T05: thresholds are gone\n }\n if (groupByDiags.length > 0) {\n groupByDiags = [];\n groupsDiagsChanged = true;\n }\n } else if (!sameGroupBySpec(update.groupBy, groupBySpec)) {\n // D4 boundary: a rejected spec (semanticZoom hysteresis violation,\n // non-function `by`) never lands — the previous groupBy stays live.\n const diag = validateGroupBySpec(update.groupBy);\n if (diag !== null) {\n groupByDiags = [diag];\n groupsDiagsChanged = true;\n } else {\n groupBySpec = update.groupBy;\n groupByChanged = true;\n // T05: a NEW threshold pair re-establishes its band from scratch.\n semanticZoomBand = null;\n if (groupByDiags.length > 0) {\n groupByDiags = [];\n groupsDiagsChanged = true;\n }\n }\n }\n }\n if (groupsSpecChanged || groupByChanged) {\n const conflict = groupsSpec !== null && groupBySpec !== null;\n if (conflict && groupsConflictDiags.length === 0) {\n groupsConflictDiags = [\n {\n code: 'config-error',\n severity: 'error',\n count: 1,\n sampleIds: [],\n message:\n 'groups and groupBy are mutually exclusive (§16.3 R-16.3-15): NEITHER applies until the host removes one',\n },\n ];\n groupsDiagsChanged = true;\n } else if (!conflict && groupsConflictDiags.length > 0) {\n groupsConflictDiags = [];\n groupsDiagsChanged = true;\n }\n // A stale op verdict clears once any groups lane write applies.\n if (groupsOpDiags.length > 0) {\n groupsOpDiags = [];\n groupsDiagsChanged = true;\n }\n }\n // A data change re-resolves the RETAINED lanes (departed members drop\n // tolerantly — model drift is data, not a config error); ops signal\n // residue changes through pendingGroupsRefresh.\n let groupsResolutionChanged = false;\n const groupsResidueDirty = pendingGroupsRefresh;\n pendingGroupsRefresh = false;\n const deriveDiagsBefore = groupsDeriveDiags;\n if (groupsSpecChanged || groupByChanged || dataChanged || groupsResidueDirty) {\n groupsResolutionChanged = refreshGroupsResolution();\n if (groupsDeriveDiags !== deriveDiagsBefore) groupsDiagsChanged = true;\n }\n // Scene work is due only when a GROUP rewrite is (or was) materialized:\n // uncollapsed groups live in store.groups alone and never touch the\n // scene (§16.3) — zero commits when nothing is collapsed. (The\n // superNodes check keeps this gate group-specific when the composed\n // rewrite exists only for the parallel-edge pass.)\n // A FOLD is the same stage-3 containment change wearing a real\n // representative instead of a synthetic one, so it dirties this same\n // lane — the flag means \"the stage-3 rewrite may have moved\", not\n // \"a group moved\".\n const foldsSceneDirty = pendingFoldsRefresh;\n pendingFoldsRefresh = false;\n const groupsSceneDirty =\n foldsSceneDirty ||\n (groupsResolutionChanged &&\n ((groupRewrite !== null && groupRewrite.superNodes.length > 0) ||\n anyCollapsedIntersecting()));\n if (groupsSceneDirty) visibleGen += 1;\n\n // --- 1b''. §16.3 R-16.3-24 parallel-edge grouping toggle (S12-T09), a\n // stage-3-adjacent lane. INOPERATIVE case: turning it ON while the\n // accepted edge list has zero same-pair multiplicity (edge ids\n // synthesized from (type,source,target)-style dedupe already collapsed\n // parallels at the source) emits ONE documented 'operation-rejected'\n // warning — once per instance — and changes NOTHING (no reconcile, no\n // revisions, no commit). With no accepted model yet the toggle is\n // stashed silently (detection needs an edge list); the next data\n // publication composes it through the normal reconcile. ---\n let parallelSceneDirty = false;\n let parallelRejected = false;\n if (\n update.parallelEdgeGrouping !== undefined &&\n update.parallelEdgeGrouping !== parallelEdgeGrouping\n ) {\n if (update.parallelEdgeGrouping && accepted !== null && !acceptedHasParallelEdges()) {\n if (!parallelInoperativeWarned) {\n parallelInoperativeWarned = true;\n engineDiags = [\n ...engineDiags,\n {\n code: 'operation-rejected',\n severity: 'warning',\n count: 1,\n sampleIds: [],\n message:\n 'parallelEdgeGrouping is inoperative: the accepted edge list has no same-endpoint-pair parallels (ids synthesized from (type,source,target)-style dedupe already collapse them) — the toggle changed nothing (§16.3 R-16.3-24)',\n },\n ];\n parallelRejected = true;\n }\n } else {\n parallelEdgeGrouping = update.parallelEdgeGrouping;\n parallelSceneDirty = accepted !== null && !dataChanged;\n if (parallelSceneDirty) visibleGen += 1;\n }\n }\n\n // --- 1c. reconcile: rebuild the render scene when the accepted model,\n // its hard scope, OR the stage-3 group rewrite changed. ONLY the scoped\n // subset feeds stage 3 and then the reconciler (§9.2/§7.6); positions\n // come from the §7.1/§7.3 caches, so clearing (subgraph: null) restores\n // the full base with cached positions, a version switch keeps\n // overlapping ids where they were (§9.4), and expanding a group returns\n // its members to their cached placements. ---\n if ((dataChanged || scopeChanged || groupsSceneDirty || parallelSceneDirty) && accepted !== null) {\n if (!dataChanged) {\n // Scope/groups-only swap: bank live engine positions so survivors\n // (and departing ids — collapsed members included — via the\n // departed cache) keep them (§7.1).\n bankReadyEnginePositions();\n }\n if (dataChanged || scopeChanged) scopedAccepted = computeScopedAccepted();\n const result = reconcileScene(scopedAccepted ?? accepted);\n // §14: the reconciled scene already merged the banked live cache; the\n // old readback buffer is misaligned with the new slot order.\n labelPositionCache = null;\n adjacency = null;\n structuralChange = result.structuralChange;\n positionChange = result.positionChange;\n }\n\n // A transition-only force → fixed update has no model diff to drive the\n // reconciler. Freeze first, bank the engine's current positions, and\n // rebuild the scene from that cache so the structure commit below carries\n // the exact frame at which integration stopped. Dataset/scope changes\n // already took the same readback path above (a dataset swap deliberately\n // does not carry positions across identities).\n if (freezesForceLayout) {\n if (eng !== null && !pausedForFixedLayout) {\n eng.pause();\n pausedForFixedLayout = true;\n }\n if (!dataChanged && !scopeChanged && !groupsSceneDirty && !parallelSceneDirty && accepted !== null) {\n bankReadyEnginePositions();\n const result = reconcileScene(scopedAccepted ?? accepted);\n labelPositionCache = null;\n adjacency = null;\n structuralChange = structuralChange || result.structuralChange;\n positionChange = positionChange || result.positionChange;\n }\n }\n\n // --- 1c'. §16.3 stage-4 clusters (S12-T06). Runs AFTER the stage-3\n // rewrite + reconcile so it partitions the CURRENT physical scene, and\n // BEFORE the config assembly below so its payload rides this update's one\n // commit. Stage-4 dirty flags ONLY: a `by` accessor identity change (or\n // spec add/clear) and upstream TOPOLOGY changes. Stage-5 soft-mask\n // changes (filter/brush/legend/hidden) are evaluated further down and\n // deliberately never reach this block (R-16.3-19 dirty discipline). ---\n // Membership already re-derived inside any reconcile above; this block\n // owns the SPEC lane only. `by` identity drives membership; strength and\n // centers are pure downstream mappings that re-emit the engine payload\n // without re-deriving (they cannot change who belongs to what).\n const clusterDiagsBefore = clusterDiags;\n let clusterConfigDirty = false;\n if (update.clusters !== undefined) {\n if (update.clusters === null) {\n if (clusterSpec !== null) {\n clusterSpec = null; // D2 explicit clear: the engine force clears too\n deriveClusterState();\n clusterConfigDirty = true;\n }\n } else if (clusterSpec === null || clusterSpec.by !== update.clusters.by) {\n clusterSpec = update.clusters;\n deriveClusterState();\n clusterConfigDirty = true;\n } else if (\n clusterSpec.strength !== update.clusters.strength ||\n clusterSpec.centers !== update.clusters.centers\n ) {\n clusterSpec = update.clusters;\n if (clusterDerivation !== null) {\n clusterForceCenters = resolveClusterCenters(clusterDerivation.keys, clusterSpec.centers);\n if (!clusterCentroidsSettled) clusterAnchors = new Float32Array(clusterForceCenters);\n }\n clusterConfigPending = true;\n clusterConfigDirty = true;\n }\n }\n if (clusterConfigPending) {\n clusterConfigDirty = true;\n // R-16.3-21: under a FIXED layout every position is known at commit, so\n // centroids compute immediately — there is no settle event to wait for.\n if (nextLayout === 'fixed' && scene !== null) {\n refreshClusterCentroids(labelPositionCache ?? scene.positions);\n }\n if (noteClusterDegradation()) groupsDiagsChanged = true;\n }\n if (clusterDiags !== clusterDiagsBefore) groupsDiagsChanged = true;\n\n // --- 1d. §12 metric-column admission (joined against the model this\n // SAME atomic update established — before dirty logic so a just-admitted\n // column can dirty exactly the scale channels referencing it). ---\n let metricsAdmitted: ReadonlySet<string> | null = null;\n let metricsProcessed = false;\n if (update.metrics !== undefined && update.metrics.length > 0) {\n metricsProcessed = true;\n if (accepted === null || !ensureMetricModel()) {\n metricDiags = [\n {\n code: 'metric-column-error',\n severity: 'warning',\n count: update.metrics.length,\n sampleIds: update.metrics.slice(0, DIAGNOSTIC_SAMPLE_CAP).map((c) => c.metric),\n message: 'metric columns discarded: no accepted model to join against (§12)',\n },\n ];\n } else {\n const res = metricStore.admitColumns(update.metrics, {\n nodeIndex: accepted.nodeIndex,\n count: accepted.nodes.length,\n // I1: columns must be stamped with the revision current at ISSUE\n // time — never the post-update revision (that made the gate\n // self-satisfying, F11-01).\n modelRevision: issuedModelSeq,\n });\n metricDiags = res.diagnostics;\n if (res.admitted.length > 0) {\n const set = new Set(res.admitted);\n metricsAdmitted = set;\n // §11: a (re)joined column changes the metric's values without a\n // model-revision change — bump its generation so frozen domains\n // referencing it recompute on the next resolve.\n for (const name of set) metricColumnGen.set(name, (metricColumnGen.get(name) ?? 0) + 1);\n }\n }\n }\n\n // --- 2. styling channels: dirty on accessor identity change (Scale\n // descriptors compare by canonical structural key — equal literals never\n // reproject, §8/§11); a data OR scope change dirties all (buffer\n // sizes/content may shift) ---\n let dirtyNodeColor = dataChanged || scopeChanged || groupsSceneDirty || parallelSceneDirty;\n let dirtyNodeSize = dataChanged || scopeChanged || groupsSceneDirty || parallelSceneDirty;\n let dirtyLinkColor = dataChanged || scopeChanged || groupsSceneDirty || parallelSceneDirty;\n let dirtyLinkWidth = dataChanged || scopeChanged || groupsSceneDirty || parallelSceneDirty;\n if (update.nodeColor !== undefined && !sameChannelValue(update.nodeColor, nodeColor)) {\n nodeColor = update.nodeColor;\n dirtyNodeColor = true;\n }\n if (update.nodeSize !== undefined && !sameChannelValue(update.nodeSize, nodeSize)) {\n nodeSize = update.nodeSize;\n dirtyNodeSize = true;\n }\n if (update.linkColor !== undefined && !Object.is(update.linkColor, linkColor)) {\n linkColor = update.linkColor;\n dirtyLinkColor = true;\n }\n if (update.linkWidth !== undefined && !Object.is(update.linkWidth, linkWidth)) {\n linkWidth = update.linkWidth;\n dirtyLinkWidth = true;\n }\n // §12: later-arriving admitted columns dirty ONLY the scale channels\n // referencing those metric names.\n if (metricsAdmitted !== null) {\n if (!dirtyNodeColor && scaleReferencesMetric(nodeColor, metricsAdmitted)) {\n dirtyNodeColor = true;\n }\n if (!dirtyNodeSize && scaleReferencesMetric(nodeSize, metricsAdmitted)) {\n dirtyNodeSize = true;\n }\n }\n // §8: a nodeImage identity change re-feeds the atlas ref lane (below).\n // D2/F11-04: `null` is the explicit CLEAR transition — the accessor\n // drops and the ref push below drains the atlas to placeholders.\n let nodeImageChanged = false;\n if (update.nodeImage !== undefined && !Object.is(update.nodeImage ?? undefined, nodeImage)) {\n nodeImage = update.nodeImage ?? undefined;\n nodeImageChanged = true;\n }\n\n // --- 3. config (§8 theme tokens, §16.12 arrows, §16.13 link toggle —\n // all config-only: never a buffer rebuild by themselves) ---\n let configPatch: EngineConfigUpdate | undefined;\n let themeChanged = false;\n let mutedAlphaChanged = false;\n let nodeBaseInvalidated = false;\n let linkBaseInvalidated = false;\n {\n const c: EngineConfigUpdate = {};\n let any = false;\n if (update.simulation !== undefined && !Object.is(update.simulation, simulation)) {\n simulation = update.simulation;\n c.simulation = update.simulation;\n any = true;\n }\n if (update.theme !== undefined) {\n const nextTheme = resolveTheme(update.theme);\n if (!sameTheme(nextTheme, theme)) {\n if (nextTheme.background !== theme.background) {\n c.backgroundColor = nextTheme.background;\n any = true;\n }\n if (nextTheme.nodeDefault !== theme.nodeDefault) {\n c.defaultPointColor = nextTheme.nodeDefault;\n any = true;\n // Scale channels render null-metric fallbacks in nodeDefault —\n // a changed token re-projects them (§8/§11).\n if (isScaleValue(nodeColor)) dirtyNodeColor = true;\n // I5: a SYNTHESIZED base fill was built from the old token —\n // drop it so the next compose rebuilds from the new theme.\n if (basePointColorsSynthesized) {\n basePointColors = null;\n nodeBaseInvalidated = true;\n }\n }\n if (nextTheme.edgeDefault !== theme.edgeDefault) {\n c.defaultLinkColor = nextTheme.edgeDefault;\n any = true;\n if (baseLinkColorsSynthesized) {\n baseLinkColors = null;\n linkBaseInvalidated = true;\n }\n }\n mutedAlphaChanged = nextTheme.mutedAlpha !== theme.mutedAlpha;\n // §16.3 aggregate channels read theme tokens (accent for super-\n // nodes, edgeDefault for meta-edges) — a token change repaints the\n // synthetic suffix through full channel re-projection.\n if (\n groupRewrite !== null &&\n (nextTheme.accent !== theme.accent || nextTheme.nodeDefault !== theme.nodeDefault)\n ) {\n dirtyNodeColor = true;\n }\n if (groupRewrite !== null && nextTheme.edgeDefault !== theme.edgeDefault) {\n dirtyLinkColor = true;\n }\n theme = nextTheme;\n themeChanged = true;\n }\n }\n if (update.edgeArrows !== undefined && update.edgeArrows !== edgeArrows) {\n edgeArrows = update.edgeArrows;\n c.linkArrows = edgeArrows;\n any = true;\n }\n // §16.14 dataRef: stash-only (serialization metadata, not rendering).\n if (update.dataRef !== undefined) dataRef = update.dataRef;\n if (update.showLinks !== undefined && update.showLinks !== showLinks) {\n showLinks = update.showLinks;\n c.renderLinks = showLinks;\n any = true;\n }\n // §16.3 stage-4: the cluster force is CONFIG-only — never a buffer\n // rebuild, never a structural diff. `null` clears it (D2); an engine\n // without `clusterForce` never sees the key (the DEF2 normalizer\n // strips it at the sink) while membership and labels keep working.\n if (clusterConfigDirty) {\n c.cluster = clusterConfigPayload();\n any = true;\n }\n if (layoutChanged) layout = nextLayout;\n if (any) configPatch = c;\n }\n\n // --- 3b. overlay lanes (§14/§15.1): label config dirties the candidate\n // set; accessibility is stashed for getters/navigator consumers ---\n let labelsDirty = false;\n if (update.labels !== undefined && !Object.is(update.labels, labelsConfig)) {\n labelsConfig = update.labels;\n labelsDirty = true;\n }\n if (update.accessibility !== undefined && !Object.is(update.accessibility, accessibilityConfig)) {\n accessibilityConfig = update.accessibility;\n }\n // D7: searchIndex is CONSTRUCTION-ONLY (spec host construction options —\n // read once; changing it requires a keyed remount). A runtime attempt is\n // ignored, never silently stashed as if it took effect: one warning per\n // instance. (Untyped callers only — the lane no longer exists on\n // GraphHostUpdate.)\n if ((update as { searchIndex?: unknown }).searchIndex !== undefined) {\n if (!searchIndexChangeWarned) {\n searchIndexChangeWarned = true;\n engineDiags = [\n ...engineDiags,\n {\n code: 'operation-rejected',\n severity: 'warning',\n count: 1,\n sampleIds: [],\n message:\n \"searchIndex is construction-only (§16.5/D7): pass it to createGraphInstance options (or key-remount <Graph>) — this update's searchIndex was ignored\",\n },\n ];\n searchIndexRejected = true;\n }\n }\n\n // --- 4. interaction slices (§6.4/§16.2/§16.3): a dataset change clears\n // selection, hiddenNodeIds, and pins; an accepted-model change prunes\n // departed ids in the SAME publish (survival: kept ids stay selected); a\n // host-provided selection flips the NODE namespace to controlled and wins ---\n let nextSelection = prev.selection;\n let nextHidden = prev.hiddenNodeIds;\n let nextPins = prev.pins;\n let nextPinned = prev.pinnedNodeIds;\n if (datasetKeyChanged) {\n nextSelection = EMPTY_SELECTION;\n nextHidden = EMPTY_HIDDEN;\n nextPins = EMPTY_PINS;\n nextPinned = EMPTY_PINNED;\n } else if (dataChanged && accepted !== null) {\n const prunedNodes = pruneIds(nextSelection.nodeIds, accepted.nodeIndex);\n const prunedEdges = pruneIds(nextSelection.edgeIds, edgeIndexById);\n if (prunedNodes !== nextSelection.nodeIds || prunedEdges !== nextSelection.edgeIds) {\n nextSelection = {\n nodeIds: prunedNodes,\n edgeIds: prunedEdges,\n groupIds: nextSelection.groupIds,\n };\n }\n let anyHiddenDropped = false;\n for (const id of nextHidden) {\n if (!accepted.nodeIndex.has(id)) {\n anyHiddenDropped = true;\n break;\n }\n }\n if (anyHiddenDropped) {\n const kept = new Set<NodeId>();\n for (const id of nextHidden) if (accepted.nodeIndex.has(id)) kept.add(id);\n nextHidden = kept;\n }\n let anyPinDropped = false;\n for (const id of nextPins.keys()) {\n if (!accepted.nodeIndex.has(id)) {\n anyPinDropped = true;\n break;\n }\n }\n if (anyPinDropped) {\n const kept = new Map<NodeId, readonly [number, number]>();\n for (const [id, xy] of nextPins) if (accepted.nodeIndex.has(id)) kept.set(id, xy);\n nextPins = kept;\n }\n // R-16.3-25: persistent pins prune departed ids through the SAME\n // ownership path (the store mirrors effective state in BOTH modes —\n // the selection precedent).\n let anyPinnedDropped = false;\n for (const id of nextPinned) {\n if (!accepted.nodeIndex.has(id)) {\n anyPinnedDropped = true;\n break;\n }\n }\n if (anyPinnedDropped) {\n const kept = new Set<NodeId>();\n for (const id of nextPinned) if (accepted.nodeIndex.has(id)) kept.add(id);\n nextPinned = kept;\n }\n }\n // §16.2/§16.3 (S12-T02): a changed groups RESOLUTION prunes selected\n // group ids that no longer name a resolved group — the SAME ownership\n // path in controlled and uncontrolled selection modes (the group\n // namespace is never host-controlled). Ids never resolved (tolerant raw\n // writes) also drop here, at the first resolution change.\n if (groupsResolutionChanged && nextSelection.groupIds.length > 0) {\n const keep = new Set<string>();\n for (const group of resolvedGroups) keep.add(group.id);\n const prunedGroupIds = nextSelection.groupIds.filter((id) => keep.has(id));\n if (prunedGroupIds.length !== nextSelection.groupIds.length) {\n nextSelection = { ...nextSelection, groupIds: prunedGroupIds };\n }\n }\n if (update.selection !== undefined) {\n selectionControlled = true;\n if (!sameIds(nextSelection.nodeIds, update.selection)) {\n nextSelection = { ...nextSelection, nodeIds: update.selection };\n }\n }\n // §16.3 T09 persistent pins (§6.4 latch, the groups mirror): a HOST\n // update carrying the lane (null included) flips it controlled — op\n // writes ride pinsInternalWrite and never flip. Ids validate against\n // the accepted model (unknown ids drop — there is no slot to pin);\n // `null` clears (D2). Only uncontrolled OP writes record §16.14 history\n // (host-owned state is not undoable — the selection precedent).\n if (update.pinnedNodeIds !== undefined) {\n if (!pinsInternalWrite) pinnedControlled = true;\n const wanted = update.pinnedNodeIds ?? EMPTY_IDS;\n const next = new Set<NodeId>();\n if (accepted !== null) {\n for (const id of wanted) {\n if (accepted.nodeIndex.has(id)) next.add(id);\n }\n }\n if (!sameIdSet(next, nextPinned)) {\n if (pinsInternalWrite) {\n historyKernel.record('pinnedNodes', [...nextPinned], [...next]); // §16.14\n }\n nextPinned = next;\n }\n }\n const selectionChanged = !sameSelection(nextSelection, prev.selection);\n const selectedNodesChanged = !sameIds(nextSelection.nodeIds, prev.selection.nodeIds);\n const hiddenChanged = nextHidden !== prev.hiddenNodeIds;\n const pinsChanged = nextPins !== prev.pins;\n const pinnedChanged = nextPinned !== prev.pinnedNodeIds;\n const hoverCleared =\n datasetKeyChanged && (prev.hover.nodeId !== null || prev.hover.edgeId !== null);\n\n // --- 4b. §9.1 filter prop + §16.6 crossfilter prop + mask maintenance.\n // Runs BEFORE projection so re-projected buffers compose the mask. ---\n let filterChanged = false;\n if (update.filter !== undefined) {\n if (update.filter === null) {\n if (activeFilterSpec !== null) {\n activeFilterSpec = null;\n activeFilterKey = null;\n activeFilterMode = 'hide';\n compiledNodeSelector = null;\n compiledEdgeSelector = null;\n filterChanged = true;\n }\n } else {\n const key = canonicalFilterKey(update.filter);\n if (key !== activeFilterKey) {\n activeFilterSpec = update.filter;\n activeFilterKey = key;\n activeFilterMode = update.filter.mode ?? 'hide';\n compiledNodeSelector = compileNodeFilter<N, E>(update.filter);\n compiledEdgeSelector = compileEdgeFilter<N, E>(update.filter);\n filterChanged = true;\n }\n // else: canonical-equal spec — ZERO re-evaluation, zero commits (§9.1).\n }\n }\n\n let crossfilterResync = false;\n let crossfilterRebuilt = false;\n const specsChanged =\n update.crossfilter !== undefined && !sameDimensionSpecs(update.crossfilter, crossfilterSpecs);\n const prevCrossfilterSpecs = crossfilterSpecs;\n if (specsChanged) crossfilterSpecs = update.crossfilter!;\n if (crossfilterSpecs !== null) {\n if (accepted === null) {\n if (specsChanged && crossfilterEngine !== null) {\n disposeCrossfilter();\n crossfilterResync = true;\n }\n } else if (crossfilterEngine === null || specsChanged) {\n // Dimension-spec identity/shape change (or first data): full rebuild;\n // build() clears brushes and the external mask. D3: a failed\n // candidate build restores the previous specs — the live engine,\n // brushes, and facade were never touched (F10-04).\n const hadBrushHidden = crossfilterHiddenBase.size > 0;\n if (buildCrossfilterEngine()) {\n crossfilterResync = hadBrushHidden;\n crossfilterRebuilt = true;\n } else if (specsChanged) {\n crossfilterSpecs = prevCrossfilterSpecs;\n crossfilterRejected = true;\n } else {\n // First build over fresh data failed (e.g. a throwing `get`):\n // the specs are unusable — drop them rather than re-fail forever.\n crossfilterSpecs = null;\n crossfilterRejected = true;\n }\n } else if (dataChanged) {\n crossfilterResync = syncCrossfilterModel(datasetKeyChanged);\n }\n }\n\n const sceneRebuilt =\n (dataChanged || scopeChanged || groupsSceneDirty || parallelSceneDirty) && scene !== null;\n let maskMutated = false;\n let filterDiagsChanged = false;\n if (sceneRebuilt) {\n // Structural change: memberships rebuild from definitions (slot\n // indices shifted); the full re-projection below composes the mask.\n filterDiagsChanged = rebuildMaskMemberships(nextHidden);\n } else if ((filterChanged || crossfilterResync) && scene !== null) {\n if (activeFilterSpec !== null || softMask !== null) {\n const beforeDiags = filterDiags;\n ensureMask();\n if (filterChanged) evaluateFilterMembership();\n if (crossfilterResync) refreshBrushMembership();\n refreshGroupMaskMembership(nextHidden);\n cascadeNodeMask();\n maskMutated = true;\n filterDiagsChanged = filterDiags !== beforeDiags;\n }\n }\n if (\n crossfilterEngine !== null &&\n (sceneRebuilt || filterChanged || hiddenChanged || crossfilterResync || crossfilterRebuilt)\n ) {\n refreshCrossfilterExternalMask(nextHidden);\n }\n\n // §9.1 fast path inside the atomic update: a filter/brush-membership\n // change WITHOUT a structural change drains into alpha-only buffers.\n let maskBuffers: EngineCommit['buffers'] | undefined;\n let maskAffected = false;\n if (maskMutated && softMask !== null && scene !== null) {\n const drain = softMask.drainDirty();\n const nodesAffected = drain.nodes.length > 0 || drain.nodesAlpha.length > 0;\n const edgesAffected = drain.edges.length > 0 || drain.edgesAlpha.length > 0;\n maskAffected = nodesAffected || edgesAffected;\n if (maskAffected) {\n maskBuffers = {};\n if (nodesAffected) maskBuffers.pointColor = composeNodeAlphaBuffer(basePointColorBuffer());\n if (edgesAffected) maskBuffers.linkColor = composeEdgeAlphaBuffer(baseLinkColorBuffer());\n }\n }\n if (maskAffected) {\n // §11: the visible set changed — 'visible'-scoped domains recompute\n // and their scale channels re-project in this same atomic update.\n visibleGen += 1;\n if (!dirtyNodeColor && scaleUsesVisibleDomain(nodeColor)) dirtyNodeColor = true;\n if (!dirtyNodeSize && scaleUsesVisibleDomain(nodeSize)) dirtyNodeSize = true;\n }\n // §8 S10: a mutedAlpha token change recomposes the dim alphas from the\n // cached bases (no re-projection, no scope-revision advance — only the\n // alpha REPRESENTATION changed, never visibility). I5 extends this to\n // theme default-token changes while masked: an invalidated SYNTHESIZED\n // base recomposes from the new theme so masked no-accessor scenes track\n // the active theme instead of a stale fill.\n if ((mutedAlphaChanged || nodeBaseInvalidated || linkBaseInvalidated) && softMask !== null && scene !== null) {\n maskBuffers = maskBuffers ?? {};\n if ((mutedAlphaChanged || nodeBaseInvalidated) && maskBuffers.pointColor === undefined) {\n maskBuffers.pointColor = composeNodeAlphaBuffer(basePointColorBuffer());\n }\n if ((mutedAlphaChanged || linkBaseInvalidated) && maskBuffers.linkColor === undefined) {\n maskBuffers.linkColor = composeEdgeAlphaBuffer(baseLinkColorBuffer());\n }\n }\n\n // --- 5. assemble at most one engine commit ---\n let buffers = projectChannelBuffers({\n nodeColor: dirtyNodeColor,\n nodeSize: dirtyNodeSize,\n linkColor: dirtyLinkColor,\n linkWidth: dirtyLinkWidth,\n });\n if (maskBuffers !== undefined) {\n // Freshly projected channels already composed the mask — they win.\n buffers = buffers === undefined ? maskBuffers : { ...maskBuffers, ...buffers };\n }\n let structure: EngineCommit['structure'] | undefined;\n if ((structuralChange || positionChange || freezesForceLayout) && scene !== null) {\n structure = { pointCount: scene.count, positions: scene.positions, links: scene.links };\n }\n const commitNeeded =\n structure !== undefined ||\n buffers !== undefined ||\n configPatch !== undefined ||\n (activatesForceLayout && scene !== null);\n\n // --- 6. revisions: model+scope on accepted model change; render on every\n // desired-render publication (even while detached — replay catches up).\n // §9.2 scope/model split (first genuine divergence, v0.5): a SCOPE-ONLY\n // subgraph change advances scopeRevision AND render but NOT\n // modelRevision — the accepted model is untouched, only the rendered\n // subset changed. ---\n let revisions = prev.revisions;\n if (dataChanged || scopeChanged || groupsSceneDirty || parallelSceneDirty || commitNeeded) {\n revisions = { ...prev.revisions };\n if (dataChanged && accepted !== null) {\n revisions.model += 1;\n revisions.source = accepted.sourceRevision;\n }\n // §9.1: mask-affecting publishes advance scope+render, NEVER model.\n // §7.2: a group collapse/expand — and the R-16.3-24 parallel-edge\n // toggle — is a SCOPE-driven publication: it advances scopeRevision,\n // never modelRevision.\n if (\n (dataChanged && accepted !== null) ||\n scopeChanged ||\n maskAffected ||\n groupsSceneDirty ||\n parallelSceneDirty\n ) {\n revisions.scope += 1;\n }\n if (commitNeeded) revisions.render += 1;\n }\n\n // --- 7. at most one engine commit ---\n let simRestarted = false;\n let imageRefsPushed = false;\n if (commitNeeded && eng !== null) {\n const commit: EngineCommit = { revision: revisions.render };\n if (structure !== undefined) {\n commit.structure = structure;\n // I2/F11-03: pair the new roster with ITS point→slot index in the\n // SAME commit — resolved+delivered slots, placeholders otherwise;\n // the async flush afterwards only promotes placeholders.\n const syncIndex = structuralPointImageIndex();\n if (syncIndex !== null) commit.resources = { pointImageIndex: syncIndex };\n imageRefsPushed = true;\n }\n if (buffers !== undefined) commit.buffers = buffers;\n if (configPatch !== undefined) commit.config = configPatch;\n if (activatesForceLayout && scene !== null) {\n // A kind transition explicitly activates the live layout. When the\n // model is unchanged this is a restart-only commit: the engine keeps\n // its banked positions and no structural buffers are reset.\n commit.restart = { alpha: 1 };\n simRestarted = true;\n } else if (structure !== undefined && layout === 'force') {\n // §9.2 reflow: a scope-only commit restarts by default so the layout\n // reorganizes around what remains; `reflow: false` keeps simulation\n // state. Clearing (subgraph: null) always reflows the restored base.\n const scopeOnly = scopeChanged && !dataChanged;\n const reflow = !scopeOnly || scopeSpec === null || scopeSpec.reflow !== false;\n if (reflow) {\n commit.restart = { alpha: 1 };\n simRestarted = true;\n }\n }\n commitToEngine(eng, commit);\n revisions.appliedRender = eng.appliedRevision();\n // §13 fallback picking: a restart makes targets move — DISARM until the\n // next settle; a structural commit WITHOUT a restart (fixed layout) is a\n // position sync — rebuild over the new scene snapshot.\n const facade = session !== null ? session.edgePicking : null;\n if (facade !== null) {\n if (commit.restart !== undefined && commit.restart !== false) {\n facade.disarm();\n } else if (structure !== undefined && scene !== null) {\n facade.arm(scene.positions, scene.links);\n }\n }\n }\n\n // --- 7b. §14 candidate re-rank on accepted-model / label-config change\n // (throttled trigger class (b)/(c) — the store patch below folds in the\n // overload diagnostic so this stays ONE publication) ---\n let labelRerank: { setChanged: boolean; diagsChanged: boolean } = {\n setChanged: false,\n diagsChanged: false,\n };\n if (\n dataChanged ||\n scopeChanged ||\n groupsSceneDirty ||\n parallelSceneDirty ||\n labelsDirty ||\n maskAffected ||\n clusterConfigDirty\n ) {\n labelRerank = recomputeCandidates();\n }\n\n // --- 8. exactly one store publication ---\n const patch: Partial<GraphStoreState> = {};\n let changed = false;\n if (revisions !== prev.revisions) {\n patch.revisions = revisions;\n changed = true;\n }\n if (dataChanged && accepted !== null) {\n patch.nodeCount = accepted.nodes.length;\n patch.edgeCount = accepted.edges.length;\n changed = true;\n }\n {\n const nextVisible = computeVisibleCounts();\n if (!sameVisible(nextVisible, prev.visible)) {\n patch.visible = nextVisible;\n changed = true;\n }\n }\n if (datasetKeyChanged && prev.timeline.playingKey !== null) {\n patch.timeline = { playingKey: null };\n changed = true;\n }\n if (\n dataChanged ||\n datasetKeyChanged ||\n buffers !== undefined ||\n labelRerank.diagsChanged ||\n filterDiagsChanged ||\n metricsProcessed ||\n searchIndexRejected ||\n crossfilterRejected ||\n parallelRejected ||\n groupsDiagsChanged ||\n diagnosticsForced\n ) {\n patch.diagnostics = composeDiagnostics();\n changed = true;\n }\n // §16.3: store.groups mirrors the current resolution (E1: this rides the\n // update's single publication).\n if (groupsResolutionChanged) {\n patch.groups = resolvedGroups;\n changed = true;\n }\n // §16.3 folds ride the same single publication (E1).\n const nextFoldCounts = foldCountsIfChanged(prev.folds);\n if (nextFoldCounts !== null) {\n patch.folds = nextFoldCounts;\n changed = true;\n }\n if (themeChanged) {\n patch.theme = theme;\n changed = true;\n }\n if (overlayIdsCleared) {\n patch.overlayIds = EMPTY_OVERLAY_IDS;\n changed = true;\n }\n if (datasetKeyChanged && prev.pendingExpansions.size > 0) {\n patch.pendingExpansions = EMPTY_EXPANSIONS;\n changed = true;\n }\n // §16.5: the search slice is per-dataset — a swap clears it.\n if (datasetKeyChanged && prev.search !== null) {\n patch.search = null;\n changed = true;\n }\n if (scopeChanged) {\n patch.scope = scopeSpec;\n changed = true;\n }\n if (freezesForceLayout && prev.simulationRunning) {\n patch.simulationRunning = false;\n changed = true;\n } else if (simRestarted && !prev.simulationRunning) {\n patch.simulationRunning = true;\n changed = true;\n }\n if (selectionChanged) {\n patch.selection = nextSelection;\n changed = true;\n }\n if (hiddenChanged) {\n patch.hiddenNodeIds = nextHidden;\n changed = true;\n }\n if (pinsChanged) {\n patch.pins = nextPins;\n changed = true;\n }\n if (pinnedChanged) {\n patch.pinnedNodeIds = nextPinned;\n changed = true;\n }\n if (hoverCleared) {\n patch.hover = { nodeId: null, edgeId: null };\n changed = true;\n }\n if (changed) publish(patch);\n\n // --- 9. non-commit engine pushes: §16 highlight remap — selection, pins,\n // and hover focus are re-pushed with freshly mapped indices after any\n // structural change; changed slices are mirrored regardless ---\n if (eng !== null) {\n const selectedGroupsChanged = !sameIds(nextSelection.groupIds, prev.selection.groupIds);\n if (\n selectedNodesChanged ||\n selectedGroupsChanged ||\n (structuralChange &&\n (nextSelection.nodeIds.length > 0 || nextSelection.groupIds.length > 0))\n ) {\n pushSelectionToEngine(eng, nextSelection.nodeIds);\n }\n if (\n pinsChanged ||\n pinnedChanged ||\n (structuralChange && (nextPins.size > 0 || nextPinned.size > 0))\n ) {\n // Persistent pins re-push after every structural commit — indices\n // shift (R-16.3-25); the union sink reads the just-published slice.\n pushPinsToEngine(eng, nextPins);\n }\n if (structuralChange && !hoverCleared && prev.hover.nodeId !== null && scene !== null) {\n const idx = scene.indexById.get(prev.hover.nodeId);\n if (idx !== undefined) eng.setFocusedIndex(idx);\n }\n if (commitNeeded) maybeFitView(eng);\n }\n\n // --- 9b. §8 image refs: the roster or the accessor changed — re-feed\n // the atlas lane (batches land later as resources-only commits). ---\n if ((dataChanged || scopeChanged || nodeImageChanged) && !imageRefsPushed) pushImageRefs();\n\n // --- 10. §14 candidate fan-out (after the store is consistent) ---\n if (labelRerank.setChanged) notifyLabelSubs(candidateSubs);\n\n // --- 11. §16.3 R-16.3-16: groupBy is always instance-derived\n // (uncontrolled semantics) — a changed derivation NOTIFIES the host\n // after the store is consistent. Manual-lane changes notify from the\n // ops themselves; host `groups` prop writes never re-notify (§6.4). ---\n if (groupsResolutionChanged && groupBySpec !== null && groupsSpec === null) {\n emit('groupsChange', { groups: resolvedGroups });\n }\n }\n\n // -------------------------------------------------------------------------\n // Engine lifecycle\n // -------------------------------------------------------------------------\n\n function createHostEvents(s: MountSession): EngineHostEvents {\n const active = (): boolean => session === s && s.alive && !destroyed;\n return {\n onPointClick(index, modifiers) {\n if (!active()) return;\n // §9.1: a mask-hidden node is not there — background semantics.\n // Synthetic slots consult the SAME mask (stage-5 group source).\n if (index !== null && !maskNodeVisibleAt(index)) index = null;\n if (index === null) {\n // §16.2 built-in follow-up (runs AFTER the listener chain): a\n // background click clears ALL namespaces; preventDefault cancels it.\n const prevented = emit('backgroundClick', {});\n if (!prevented) applySelectionIntent(EMPTY_SELECTION);\n return;\n }\n const meta = modifiers !== undefined && (modifiers.metaKey || modifiers.shiftKey);\n // §7.4/§16.3 (R-16.3-12): discriminated slot mapping — a super-node\n // hit fires the typed GROUP event with the ResolvedGroup payload\n // (internal scene keys never escape); physical hits keep firing the\n // caller-typed node callback below.\n const ref = scene === null ? null : scenePointRefAt(scene, index);\n if (ref !== null && ref.kind === 'group') {\n const prevented = emit('groupClick', { group: ref.group, metaKey: meta });\n if (prevented) return;\n // §16.2 built-in follow-up: select the GROUP id into the groupIds\n // namespace (plain replaces, meta/shift toggles) — never nodeIds.\n const cur = store.getState().selection;\n applySelectionIntent({\n ...cur,\n groupIds: meta ? orderGroupIds(toggleId(cur.groupIds, ref.group.id)) : [ref.group.id],\n });\n return;\n }\n const node = nodeAtIndex(index);\n if (node === undefined) return;\n const prevented = emit('nodeClick', { node, metaKey: meta });\n if (prevented) return;\n // §16.2 built-in follow-up: plain click replaces the node selection;\n // meta/shift click toggles the id (accepted-base order preserved).\n const cur = store.getState().selection;\n applySelectionIntent({\n ...cur,\n nodeIds: meta\n ? orderByAcceptedBase(toggleId(cur.nodeIds, node.id), nodeIndexBase())\n : [node.id],\n });\n },\n onPointHover(index) {\n if (!active()) return;\n // §9.1: hovering a mask-hidden index reads as background (null).\n if (index !== null && !maskNodeVisibleAt(index)) index = null;\n const node = index === null ? null : (nodeAtIndex(index) ?? null);\n const nodeId = node === null ? null : node.id;\n const hover = store.getState().hover;\n if (hover.nodeId !== nodeId) publish({ hover: { nodeId, edgeId: hover.edgeId } });\n s.engine.setFocusedIndex(node === null ? null : index);\n emit('nodeHover', { node });\n },\n // §13 native-route edge events (§7.4 mapping). Host onLink* events are\n // honored regardless of the committed route — an adapter that surfaces\n // them despite declaring linkPicking:false is a harmless pass-through —\n // but only the 'native' route RELIES on them; the fallback route feeds\n // the same typed events through the pointer samplers.\n onLinkClick(linkIndex) {\n if (!active()) return;\n // S9-T18: native-route link events are filtered through the SAME\n // §9.1 mask the fallback facade consults — both routes agree.\n if (!maskEdgeVisibleAt(linkIndex)) return;\n // §7.4/§16.3: a meta-edge hit fires the typed MetaEdge event —\n // synthetics never cast to E (R-16.3-12).\n const ref = scene === null ? null : sceneLinkRefAt(scene, linkIndex);\n if (ref !== null && ref.kind === 'meta-edge') {\n emit('metaEdgeClick', { metaEdge: ref.metaEdge }); // no follow-up\n return;\n }\n const edge = edgeAtLinkIndex(linkIndex);\n if (edge === undefined) return;\n emit('edgeClick', { edge }); // no built-in follow-up in this slice\n },\n onLinkHover(linkIndex) {\n if (!active()) return;\n if (linkIndex !== null && !maskEdgeVisibleAt(linkIndex)) linkIndex = null; // S9-T18\n const edge = linkIndex === null ? null : (edgeAtLinkIndex(linkIndex) ?? null);\n applyEdgeHover(edge, false); // engine owns transition detection\n },\n onDragStart(index) {\n if (!active()) return;\n const node = nodeAtIndex(index);\n if (node === undefined) return;\n emit('nodeDragStart', { node }); // no built-in follow-up\n },\n onDragEnd(index, x, y) {\n if (!active()) return;\n const node = nodeAtIndex(index);\n if (node === undefined) return;\n // §16.3 built-in follow-up (runs AFTER the listener chain): pin the\n // node at its release position; preventDefault cancels the pin. Pins\n // are always instance-owned, even under controlled selection.\n const prevented = emit('nodeDragEnd', { node, x, y });\n if (!prevented) writePin(node.id, [x, y]);\n },\n // §14/§15: right-click / long-press → typed 'contextMenu' event. The\n // core adds NO built-in follow-up — components own the menu.\n onContextMenu(index, screen) {\n if (!active()) return;\n const screenPt = [screen[0], screen[1]] as const;\n if (index === null) {\n emit('contextMenu', { target: { kind: 'background' }, screen: screenPt });\n return;\n }\n const node = nodeAtIndex(index);\n if (node === undefined) return; // stale index — drop the gesture\n emit('contextMenu', { target: { kind: 'node', node }, screen: screenPt });\n },\n /**\n * §13/§17 overlay scheduler tick (adapter activity clock). Per tick:\n * (1) sim-hot degradation — while the simulation runs, ONE getPositions\n * readback refreshes the CPU cache at a capped >=500ms cadence (M0:\n * tracked readback stalls ~18ms, so the lane NEVER reads back per\n * frame); (2) O(k) projection of the CURRENT candidate set through\n * spaceToScreen for the positions channel. No re-rank ever happens here.\n */\n onFrame(timeMs) {\n if (!active()) return;\n if (store.getState().simulationRunning && labelsEnabled()) {\n if (\n lastHotRefreshMs === null ||\n timeMs - lastHotRefreshMs >= SIM_HOT_REFRESH_MS ||\n timeMs < lastHotRefreshMs // clock went backwards (fresh adapter)\n ) {\n lastHotRefreshMs = timeMs;\n const pos = s.engine.getPositions();\n if (pos !== null) bankEnginePositions(pos);\n }\n }\n if (positionSubs.size > 0 && currentPlacements.length > 0) {\n projectPlacements(s.engine);\n notifyLabelSubs(positionSubs);\n }\n },\n onViewportChange(v) {\n if (!active()) return;\n publish({ viewport: v });\n emit('viewportChange', v);\n // §16.3 semantic zoom (S12-T05): hysteresis band tracking over the\n // stashed groupBySpec.semanticZoom thresholds.\n trackSemanticZoomBand(v.zoom);\n scheduleViewportRerank(); // §14 trigger (a): trailing 100ms throttle\n },\n onSimulationEnd() {\n if (!active()) return;\n // T12: release pinned accretion — the expansion's arrivals settled,\n // so the engine pin set returns to just the user pin slice.\n if (accretionPinIds !== null) {\n accretionPinIds = null;\n pushPinsToEngine(s.engine, store.getState().pins);\n }\n // §7.1 per-event readback: settled positions feed the position cache\n // AND re-arm fallback edge picking over the same snapshot (§13).\n const pos = s.engine.getPositions();\n if (pos !== null) {\n bankEnginePositions(pos);\n if (s.edgePicking !== null && scene !== null) {\n s.edgePicking.arm(pos, scene.links);\n }\n // §16.3 T07: settle is where cluster centroids refresh — the ONLY\n // member scan in the overlay lane, over the SAME permitted §7.1\n // readback (R-16.3-21). Cluster labels re-anchor from forceCenter\n // to centroid on the re-rank/projection below.\n refreshClusterCentroids(pos);\n }\n // §14 trigger (d): settle re-rank — folded with the simulationRunning\n // transition into one publish.\n const r = recomputeCandidates();\n const patch: Partial<GraphStoreState> = {};\n if (store.getState().simulationRunning) patch.simulationRunning = false;\n if (r.diagsChanged) patch.diagnostics = composeDiagnostics();\n if (patch.simulationRunning !== undefined || patch.diagnostics !== undefined) {\n publish(patch);\n }\n if (r.setChanged) notifyLabelSubs(candidateSubs);\n else if (clusterDerivation !== null && currentPlacements.length > 0) {\n // The cluster SET is unchanged but its anchors moved from force\n // centers to settled centroids — re-anchor through the position\n // channel (no re-render for a set that did not change).\n projectPlacements(s.engine);\n notifyLabelSubs(positionSubs);\n }\n emit('simulationEnd', {});\n },\n onError(error) {\n if (!active()) return;\n const status = store.getState().status;\n if (status === 'mounting') {\n emitInstanceError({ code: 'engine-unsupported', detail: error.message }, 'mount', error);\n return;\n }\n if (status === 'lost' || status === 'recovering') {\n emitInstanceError({ code: 'context-lost' }, 'recovery', error);\n return;\n }\n // v0.1 behavior: running-phase engine faults carry no GraphError detail.\n engineDiags = [\n ...engineDiags,\n {\n code: 'engine-error',\n severity: 'error',\n count: 1,\n sampleIds: [],\n message: error.message,\n },\n ];\n publish({ status: 'error', diagnostics: composeDiagnostics() });\n emit('error', { error });\n },\n onContextEvent(ev) {\n if (!active()) return;\n const status = store.getState().status;\n if (ev.type === 'lost') {\n // §13.1: transient loss is a status transition + warning diagnostic,\n // never an 'error' event. Only meaningful from 'ready'.\n if (status !== 'ready') return;\n engineDiags = [\n ...engineDiags,\n {\n code: 'context-lost',\n severity: 'warning',\n count: 1,\n sampleIds: [],\n message: 'WebGL context lost; engine frozen, awaiting restore',\n },\n ];\n publish({ status: 'lost', diagnostics: composeDiagnostics() });\n return;\n }\n if (ev.type === 'restored') {\n if (status !== 'lost') return;\n publish({ status: 'recovering' });\n try {\n // Coalesced full replay: updates applied while lost advanced the\n // desired revisions CPU-side; ONE commit now realizes the latest.\n const restarted =\n buildAndCommitFullReplay(s, layout === 'force' ? RECOVERY_RESTART_ALPHA : null) &&\n accepted !== null &&\n layout === 'force';\n const { viewport } = store.getState();\n if (viewport !== null) s.engine.setViewport(viewport);\n // §16 highlight remap: recovery re-applies selection, pins, and\n // hover focus from the store with freshly mapped indices.\n reapplyInteractionState(s.engine);\n publish({\n status: 'ready',\n revisions: { ...store.getState().revisions, appliedRender: s.engine.appliedRevision() },\n ...(restarted ? { simulationRunning: true } : {}),\n });\n } catch (err) {\n emitInstanceError({ code: 'context-lost' }, 'recovery', err as Error);\n }\n return;\n }\n // ev.type === 'failed': terminal only while a recovery is possible.\n if (status === 'lost' || status === 'recovering') {\n emitInstanceError({ code: 'context-lost' }, 'recovery', ev.error);\n }\n },\n onDiagnostic(d) {\n if (!active()) return;\n engineDiags = [\n ...engineDiags,\n { code: d.code, severity: d.severity, count: 1, sampleIds: [], message: d.message },\n ];\n publish({ diagnostics: composeDiagnostics() });\n },\n };\n }\n\n /**\n * Replay the LATEST desired state as ONE commit: re-reconcile so cached\n * positions (banked at detach / simulation end) land in the structure.\n * `restartAlpha` null = keep simulation state (fixed layout / no reheat).\n * Returns whether a commit was issued.\n */\n function buildAndCommitFullReplay(s: MountSession, restartAlpha: number | null): boolean {\n const eng = s.engine;\n const renderRevision = store.getState().revisions.render;\n const replayModel = renderModel(); // §9.2: the scoped subset replays, not the full model\n if (replayModel !== null) {\n // §7.6: the replay re-runs stage 3 too (deterministic — same model +\n // resolved groups reproduce the same rewritten scene).\n reconcileScene(replayModel);\n const replayScene = scene!;\n const commit: EngineCommit = {\n revision: renderRevision,\n structure: {\n pointCount: replayScene.count,\n positions: replayScene.positions,\n links: replayScene.links,\n },\n };\n const buffers = projectChannelBuffers({\n nodeColor: true,\n nodeSize: true,\n linkColor: true,\n linkWidth: true,\n });\n if (buffers !== undefined) commit.buffers = buffers;\n commit.config = fullConfig();\n // §8/§13.1: a replay re-sends the FULL delivered atlas state — the\n // restored GL machine is empty and slot references must resolve.\n const resources = replayAtlasResources();\n if (resources !== null) commit.resources = resources;\n // I2/F11-03: the index must align to the roster REPLAYED ABOVE, not\n // the roster that was live when the atlas last flushed (the model may\n // have changed while lost/pre-ready) — recompute it synchronously.\n const syncIndex = structuralPointImageIndex();\n if (syncIndex !== null) {\n commit.resources = { ...(commit.resources ?? {}), pointImageIndex: syncIndex };\n }\n if (restartAlpha !== null) commit.restart = { alpha: restartAlpha };\n commitToEngine(eng, commit);\n // §13: a reheating replay disarms fallback picking until the next\n // settle; a no-restart replay (fixed layout) is a position sync.\n if (s.edgePicking !== null) {\n if (restartAlpha !== null) s.edgePicking.disarm();\n else s.edgePicking.arm(replayScene.positions, replayScene.links);\n }\n return true;\n }\n // No model yet: the theme/config tokens still flow (§8 — the background\n // is painted before data arrives).\n commitToEngine(eng, { revision: renderRevision, config: fullConfig() });\n return true;\n }\n\n function handleEngineReady(s: MountSession): void {\n const eng = s.engine;\n\n // DEF2 §13: resolve the capability policy ONCE per session from the\n // DECLARED record (never method sniffing). Each REQUESTED-but-\n // unsupported feature degrades loudly: one dev diagnostic per feature.\n s.policy = resolveEnginePolicy(eng.capabilities, {\n edgeArrows,\n images: nodeImage !== undefined,\n clusters: clusterSpec !== null,\n });\n policyDiags = s.policy.degradations.map((d) => ({\n code: `engine:capability-degraded` as const,\n severity: 'warning' as const,\n count: 1,\n sampleIds: [],\n message: `${d.feature} degraded: ${d.reason}`,\n }));\n // The mount policy is frozen (§13), so a cluster spec that lands LATER\n // re-emits through noteClusterDegradation — exactly one per session\n // either way.\n clusterDegradationEmitted = s.policy.clusterForce === 'inert' && clusterSpec !== null;\n\n // §13 edge-picking route: fixed ONCE per mount from the capability record\n // — never method sniffing, never re-evaluated after ready.\n const route: EdgePickRoute = eng.capabilities.linkPicking ? 'native' : 'fallback';\n s.edgePicking = new EdgePickingFacade({\n route,\n screenToSpace: (p) => eng.screenToSpace?.(p) ?? null,\n medianLinkWidthPx: () => medianLinkWidthPx(lastLinkWidths),\n // S9-T18: the facade's per-candidate visibility mask reads the LIVE\n // §9.1 mask — no re-arm needed on mask changes (§13 grid invariance).\n linkVisible: (linkIndex) => maskEdgeVisibleAt(linkIndex),\n });\n\n const restartAlpha = layout === 'force' ? 1 : null;\n const committed = buildAndCommitFullReplay(s, restartAlpha);\n const restarted = committed && accepted !== null && restartAlpha !== null;\n\n publish({\n status: 'ready',\n revisions: { ...store.getState().revisions, appliedRender: eng.appliedRevision() },\n diagnostics: composeDiagnostics(),\n ...(restarted ? { simulationRunning: true } : {}),\n });\n\n // §16 highlight remap: a fresh engine gets the surviving interaction\n // state (selection, pins, hover focus) re-pushed with fresh indices.\n reapplyInteractionState(eng);\n if (committed) maybeFitView(eng);\n // §8: (re)feed the atlas ref lane now that the session policy is known.\n pushImageRefs();\n // §14: initial candidate rank for a fresh engine (banked positions from a\n // previous session make labels placeable immediately).\n rerankAndNotify();\n emit('ready', {});\n }\n\n function attach(container: HTMLElement): Promise<void> {\n if (destroyed) throwDestroyedOperation('attach');\n // StrictMode tolerance: attach while mounting/ready is a no-op returning\n // the in-flight promise.\n if (mountPromise !== null) return mountPromise;\n\n const s: MountSession = {\n engine: engineFactory(),\n container,\n alive: true,\n fitDone: false,\n edgePicking: null,\n policy: null,\n };\n session = s;\n const ownsMount = (): boolean => s.alive && !destroyed && session === s;\n lastHotRefreshMs = null; // fresh adapter, fresh activity clock (§14)\n publish({ status: 'mounting' });\n mountPromise = s.engine\n .mount(container, createHostEvents(s))\n .then(() => {\n if (!ownsMount()) return;\n handleEngineReady(s);\n })\n .catch((err: unknown) => {\n // detach()/destroy() retire the session immediately, but an adapter's\n // asynchronous mount may reject later. Match the stale-success path:\n // the obsolete attach resolves inertly and cannot poison a newer\n // session (or surface as an unhandled rejection in its old host).\n if (!ownsMount()) return;\n // Dedupe: the adapter may have routed the same fault via onError first.\n if (store.getState().status !== 'error') {\n const message = err instanceof Error ? err.message : String(err);\n emitInstanceError(\n { code: 'engine-unsupported', detail: message },\n 'mount',\n err instanceof Error ? err : undefined,\n );\n }\n throw err; // the current attach still rejects with the original error\n });\n return mountPromise;\n }\n\n function detach(): void {\n if (destroyed || session === null) return;\n const s = session;\n // Bank live positions so a future attach replays them (§7.1).\n if (store.getState().status === 'ready' && scene !== null) {\n const pos = s.engine.getPositions();\n if (pos !== null) bankEnginePositions(pos);\n }\n s.alive = false;\n session = null;\n mountPromise = null;\n cancelRerankTimer();\n const timelinePatch = resetTimelineForPatch(); // §16.6: no leaked timers\n s.edgePicking?.destroy();\n s.edgePicking = null;\n s.engine.destroy();\n publish({\n status: 'idle',\n revisions: { ...store.getState().revisions, appliedRender: null },\n simulationRunning: false,\n ...(timelinePatch ?? {}),\n });\n // §14: no engine → no overlay; empties the candidate set for subscribers.\n rerankAndNotify();\n }\n\n function destroy(): void {\n if (destroyed) return;\n destroyed = true;\n stopTimelineTimer(); // §16.6: no leaked timers\n timelinePlayingKey = null;\n // §8: abort in-flight image resolves; no further batches can publish.\n imagePipeline?.dispose();\n imagePipeline = null;\n crossfilterEngine?.dispose();\n crossfilterEngine = null;\n crossfilterSessionFacade = null;\n // §9.2: in-flight expansions are aborted and their promises reject.\n if (expansionHandles.size > 0) {\n const err = new OrbitOperationError(\n { code: 'aborted', cause: 'destroyed' },\n 'GraphInstance destroyed with an expansion in flight',\n );\n for (const [reqId, handle] of expansionHandles) {\n handle.abort(err);\n expansionRejectors.get(reqId)?.(err);\n }\n expansionHandles.clear();\n expansionRejectors.clear();\n expansionPromises.clear();\n }\n accretionPinIds = null;\n // §16.5: the in-flight search (if any) rejects; the cache empties.\n abortSearchFlight('destroyed', 'GraphInstance destroyed with a search in flight');\n // §7.5: open ingest sessions are aborted (pending work rejects with\n // 'aborted'); no rollback publication — the instance is going away.\n abortAllSessions(null, 'destroyed');\n if (session !== null) {\n session.alive = false;\n session.edgePicking?.destroy();\n session.edgePicking = null;\n session.engine.destroy();\n session = null;\n }\n mountPromise = null;\n cancelRerankTimer();\n candidateSubs.clear();\n positionSubs.clear();\n listeners.clear();\n publish({ status: 'destroyed' });\n }\n\n // -------------------------------------------------------------------------\n // Camera methods\n // -------------------------------------------------------------------------\n\n /**\n * §13 1-hop neighbor ids of `id`: engine adjacency when the adapter\n * provides `neighborIndices`, else the core CSR adjacency built lazily per\n * accepted model (cached; invalidated on model change). Self excluded;\n * accepted-base order, so both sources produce identical results.\n */\n function neighborIdsOf(id: NodeId): NodeId[] {\n if (accepted === null || scene === null) return [];\n const idx = scene.indexById.get(id);\n if (idx === undefined) return [];\n const eng = engineIfReady();\n let neighborIdx: Iterable<number>;\n if (eng !== null && eng.neighborIndices !== undefined) {\n neighborIdx = eng.neighborIndices(idx);\n } else {\n if (adjacency === null) adjacency = buildAdjacency(scene.links, scene.count);\n neighborIdx = neighborsOf(adjacency, idx);\n }\n const out = new Set<NodeId>();\n for (const n of neighborIdx) {\n if (n === idx) continue; // self-loops are not neighbors\n const nid = scene.idByIndex[n];\n if (nid !== undefined) out.add(nid);\n }\n return orderByAcceptedBase([...out], accepted.nodeIndex);\n }\n\n /**\n * §16 focus neighborhood (T10): v0.1 camera behavior (setFocusedIndex +\n * zoomToIndex) plus the 1-hop neighbor ids as the return value.\n *\n * Documented compromise: the engine has ONE highlight channel until S10\n * styling, so the [id, ...neighbors] ring is pushed through\n * setSelectedIndices ONLY when the selection visual stays truthful —\n * selection empty and uncontrolled. Never a store write; the next real\n * selection push overwrites the ring. `hops` is reserved at 1.\n */\n\n // -------------------------------------------------------------------------\n // §16.14 view state — serialization (S15). setViewState lands in the next\n // wave; the shapes and capture rules here are the wire commitment.\n // -------------------------------------------------------------------------\n\n /** One-shot dev warning for a styling value dropped from capture. */\n function warnViewStateDrop(channel: string, why: string): void {\n if (!DEV || viewStateDropWarned.has(channel)) return;\n viewStateDropWarned.add(channel);\n console.warn(`orbit: getViewState omitted ${channel} — ${why} (§16.14)`);\n }\n\n /** §16.14 styling capture: Scales that are data by construction. */\n function serializableScaleOf(\n channel: 'nodeColor' | 'nodeSize',\n value: unknown,\n ): SerializableScale | undefined {\n if (value === undefined) return undefined;\n if (typeof value === 'function') {\n warnViewStateDrop(channel, 'accessor functions do not serialize');\n return undefined;\n }\n if (!isScaleValue(value)) return undefined; // constants are app defaults, not captured\n if (value.kind === 'sequential') {\n return {\n kind: 'sequential',\n metric: value.metric,\n range: value.range as readonly string[] | readonly number[],\n // The numeric-array domain form is data; a DomainPolicy is app\n // behavior config and stays with the app.\n ...(Array.isArray(value.domain) ? { domain: value.domain as readonly number[] } : {}),\n };\n }\n if (value.kind === 'diverging') {\n return {\n kind: 'diverging',\n metric: value.metric,\n range: value.range as readonly string[] | readonly number[],\n mid: value.mid,\n };\n }\n // categorical: only the field-descriptor `by` form is data.\n if (typeof value.by !== 'string') {\n warnViewStateDrop(channel, \"a function-`by` categorical scale does not serialize\");\n return undefined;\n }\n return {\n kind: 'categorical',\n by: value.by,\n ...(value.palette !== undefined\n ? { palette: value.palette as readonly string[] | readonly number[] }\n : {}),\n ...(value.domain !== undefined ? { domain: value.domain } : {}),\n };\n }\n\n /** Named-theme capture: only 'light'/'dark' serialize (custom GraphTheme\n * objects are app config, dropped with one dev warning). */\n function serializableThemeOf(): 'light' | 'dark' | undefined {\n const json = JSON.stringify(theme);\n if (json === JSON.stringify(GRAPH_THEME_DARK)) return 'dark';\n if (json === JSON.stringify(GRAPH_THEME_LIGHT)) return 'light';\n warnViewStateDrop('theme', 'custom GraphTheme objects do not serialize; use a named base');\n return undefined;\n }\n\n /** The synchronous serialization core shared by both overloads. */\n function captureViewState(): GraphViewState {\n const st = store.getState();\n\n // Groups: manual specs verbatim; under groupBy only the COLLAPSED keys —\n // a key absent from the pairs restores expanded, which is the default.\n let groups: GraphViewState['groups'];\n if (groupBySpec !== null) {\n groups = [...groupByCollapsedKeys].map((key) => ({ key, collapsed: true }));\n } else {\n groups = groupsSpec ?? [];\n }\n\n // Crossfilter: declaration order; a dimension without a live brush is\n // simply absent. The wire form is TAGGED from the DimensionSpec kind.\n const crossfilter: Array<{ key: string; state: ViewBrushState }> = [];\n if (crossfilterSpecs !== null && crossfilterEngine !== null) {\n for (const spec of crossfilterSpecs) {\n const brush = crossfilterEngine.getBrush(spec.key);\n if (brush === null) continue;\n if ('excluded' in brush) {\n crossfilter.push({\n key: spec.key,\n state: { kind: 'categorical', excluded: [...brush.excluded] },\n });\n } else {\n crossfilter.push({\n key: spec.key,\n state: {\n kind: spec.kind === 'temporal' ? 'temporal' : 'numeric',\n range: [brush.min, brush.max] as const,\n },\n });\n }\n }\n }\n\n const styling: ViewStyling = {};\n const nodeColorScale = serializableScaleOf('nodeColor', nodeColor);\n if (nodeColorScale !== undefined) styling.nodeColor = nodeColorScale;\n const nodeSizeScale = serializableScaleOf('nodeSize', nodeSize);\n if (nodeSizeScale !== undefined) styling.nodeSize = nodeSizeScale;\n styling.showLinks = showLinks;\n styling.edgeArrows = edgeArrows;\n const namedTheme = serializableThemeOf();\n if (namedTheme !== undefined) styling.theme = namedTheme;\n\n return {\n v: 1,\n camera: st.viewport === null ? null : { ...st.viewport },\n selection: {\n nodeIds: [...st.selection.nodeIds],\n edgeIds: [...st.selection.edgeIds],\n groupIds: [...st.selection.groupIds],\n },\n hiddenNodeIds: [...st.hiddenNodeIds],\n subgraph: scopeSpec === null ? null : subgraphPlain(scopeSpec),\n groups,\n pinnedNodeIds: [...st.pinnedNodeIds],\n ...(folds.size > 0\n ? { folds: [...folds].map(([anchorId, memberIds]) => [anchorId, [...memberIds]] as const) }\n : {}),\n layout: { kind: layout },\n crossfilter,\n styling,\n ...(dataRef !== undefined ? { dataRef } : {}),\n };\n }\n\n function getViewState(opts?: { includePositions?: false }): GraphViewState;\n function getViewState(opts: {\n includePositions: true;\n maxPositions?: number;\n }): Promise<GraphViewState>;\n function getViewState(opts?: {\n includePositions?: boolean;\n maxPositions?: number;\n }): GraphViewState | Promise<GraphViewState> {\n if (opts?.includePositions !== true) return captureViewState();\n return (async () => {\n const base = captureViewState();\n const eng = engineIfReady();\n if (eng === null || scene === null) return base; // nothing placed yet\n const bound = physicalPointCount();\n const visible: NodeId[] = [];\n for (let i = 0; i < bound; i++) {\n if (softMask === null || softMask.isNodeVisible(i)) visible.push(scene.idByIndex[i]!);\n }\n const limit = opts.maxPositions ?? 100_000;\n if (visible.length > limit) {\n throw new OrbitOperationError(\n { code: 'export-materialization-too-large', rowCount: visible.length, limit },\n `includePositions over ${limit} nodes — persist the layout through the export lane and reference it from dataRef (§16.14)`,\n );\n }\n // ONE per-event readback (ADR-001) — an explicit host call is an event.\n const pos = eng.getPositions();\n if (pos === null) return base;\n const positions: Array<readonly [string, number, number]> = [];\n for (const id of visible) {\n const idx = scene.indexById.get(id);\n if (idx === undefined) continue;\n const x = pos[2 * idx];\n const y = pos[2 * idx + 1];\n if (x === undefined || y === undefined || Number.isNaN(x) || Number.isNaN(y)) continue;\n // Quantized: 2 decimals is sub-pixel at every zoom the demo reaches\n // and keeps a 100K payload ~40% smaller than raw float noise.\n positions.push([id, Math.round(x * 100) / 100, Math.round(y * 100) / 100]);\n }\n return { ...base, positions };\n })();\n }\n\n\n /** Whether an aggregate restore consumer exists (§16.14: the one signal\n * the core has that a host owns the reflection side). */\n function hasRestoreListener(): boolean {\n return (listeners.get('viewStateRestore')?.size ?? 0) > 0;\n }\n\n function failPendingRestore(code: 'restore-timeout' | 'restore-diverged'): void {\n const pending = pendingRestore;\n if (pending === null) return;\n pendingRestore = null;\n clearTimeout(pending.timer);\n pending.rollbackCursor?.();\n pending.resolve({\n status: 'rejected',\n code,\n problems: [\n code === 'restore-timeout'\n ? `the host did not reflect the restore intent within ${RESTORE_ACK_TIMEOUT_MS}ms`\n : 'the host reflected different values than the intent asked for',\n ],\n });\n }\n\n function commitPendingRestore(): void {\n const pending = pendingRestore;\n if (pending === null) return;\n pendingRestore = null;\n clearTimeout(pending.timer);\n if (pending.commands.length > 0) {\n if (pending.recordOnCommit) {\n historyKernel.begin('setViewState');\n for (const cmd of pending.commands) {\n historyKernel.record(cmd.slice, cmd.before, cmd.after);\n }\n historyKernel.end();\n }\n clearPathInternal();\n applyHistoryCommands(pending.commands);\n }\n pending.finish();\n pending.resolve({ status: 'applied' });\n }\n\n /**\n * Acknowledgement hook: called after a HOST update processed. Each awaited\n * controlled lane the update carried either matches (met) or diverges\n * (whole stage discarded). The transaction commits when nothing remains\n * awaited. Updates that do not touch awaited lanes are unrelated traffic\n * and pass through untouched.\n */\n function checkRestoreAcknowledgement(update: GraphHostUpdate<N, E>): void {\n const pending = pendingRestore;\n if (pending === null) return;\n const met = (lane: 'selection' | 'pinnedNodeIds' | 'groups'): void => {\n delete pending.awaiting[lane];\n };\n if (pending.awaiting.selection !== undefined && update.selection !== undefined) {\n if (sameIds(update.selection, pending.awaiting.selection)) met('selection');\n else return failPendingRestore('restore-diverged');\n }\n if (pending.awaiting.pinnedNodeIds !== undefined && update.pinnedNodeIds !== undefined) {\n const target = pending.awaiting.pinnedNodeIds;\n const got = update.pinnedNodeIds ?? [];\n if (sameIds(got, target)) met('pinnedNodeIds');\n else return failPendingRestore('restore-diverged');\n }\n if (pending.awaiting.groups !== undefined && update.groups !== undefined) {\n if (sameGroupSpecArrays(update.groups, pending.awaiting.groups)) met('groups');\n else return failPendingRestore('restore-diverged');\n }\n if (Object.keys(pending.awaiting).length === 0) commitPendingRestore();\n }\n\n /**\n * §16.14 setViewState — the atomic restore (Wave 2: uncontrolled path).\n * See the interface doc for the gate order. Styling: with no aggregate\n * restore callback registered, showLinks/edgeArrows/theme/scales apply\n * through the instance's own internal config lanes — the §16.14 \"only\n * internally owned fields\" clause resolved as callback-registration, which\n * is the one signal the core has for host ownership of styling props.\n */\n function setViewState(\n raw: unknown,\n opts?: {\n ignoreMismatch?: boolean;\n isDataRefEqual?: (stored: JsonValue | undefined, current: JsonValue | undefined) => boolean;\n },\n ): Promise<SetViewStateResult> {\n if (destroyed) {\n return Promise.resolve({\n status: 'rejected',\n code: 'invalid-view-state',\n problems: ['instance destroyed'],\n });\n }\n if (pendingRestore !== null) {\n return Promise.resolve({\n status: 'rejected',\n code: 'restore-pending',\n problems: ['another restore/history transaction is awaiting acknowledgement'],\n });\n }\n // 1. Structural validation + version gate — BEFORE anything else.\n const verdict = validateViewState(raw);\n if (!verdict.ok) {\n acceptanceQueue.admit(() => {\n engineDiags = [\n ...engineDiags,\n {\n code: 'invalid-view-state',\n severity: 'error',\n count: verdict.problems.length,\n sampleIds: [],\n message: `setViewState rejected (${verdict.code}): ${verdict.problems.slice(0, 3).join('; ')} — nothing was applied (§16.14)`,\n },\n ];\n pendingDiagnosticsRefresh = true;\n applyHostUpdateInner({});\n });\n return Promise.resolve({\n status: 'rejected',\n code: verdict.code,\n problems: verdict.problems,\n });\n }\n const state = verdict.state;\n\n // 2. dataRef gate — only a state that PASSED validation is consulted.\n if (state.dataRef !== undefined && opts?.ignoreMismatch !== true) {\n const equal = (opts?.isDataRefEqual ?? sameDataRef)(state.dataRef, dataRef);\n if (!equal) {\n emit('viewStateMismatch', { stored: state.dataRef, current: dataRef });\n return Promise.resolve({ status: 'mismatch' });\n }\n }\n\n return new Promise<SetViewStateResult>((resolve) => {\n acceptanceQueue.admit(() => {\n // 3. Ownership triage: which lanes must the HOST reflect?\n const st = store.getState();\n const wantsSelection =\n JSON.stringify(selectionPlain(state.selection)) !==\n JSON.stringify(selectionPlain(st.selection));\n const wantsPinned =\n JSON.stringify([...state.pinnedNodeIds].sort()) !==\n JSON.stringify([...st.pinnedNodeIds].sort());\n const manualGroups = state.groups.filter(\n (g): g is GroupSpec => 'id' in g && typeof (g as GroupSpec).id === 'string',\n );\n const wantsManualGroups =\n groupBySpec === null &&\n JSON.stringify(manualGroups) !== JSON.stringify(groupsSpec ?? []);\n\n const awaiting: PendingRestore['awaiting'] = {};\n if (wantsSelection && selectionControlled) awaiting.selection = state.selection.nodeIds;\n if (wantsPinned && pinnedControlled) awaiting.pinnedNodeIds = state.pinnedNodeIds;\n if (wantsManualGroups && groupsControlled) awaiting.groups = manualGroups;\n const needsHost = Object.keys(awaiting).length > 0;\n if (needsHost && !hasRestoreListener()) {\n resolve({\n status: 'rejected',\n code: 'missing-restore-callback',\n problems: Object.keys(awaiting).map((lane) => `${lane} is controlled`),\n });\n return;\n }\n\n // 4. Internal command list — value diffs through the SAME slices the\n // undo applier consumes. Controlled lanes are NOT commands: the host\n // writes them through its own reflection.\n interface Cmd {\n slice: string;\n before: unknown;\n after: unknown;\n }\n const commands: Cmd[] = [];\n if (wantsSelection && !selectionControlled) {\n commands.push({\n slice: 'selection',\n before: selectionPlain(st.selection),\n after: selectionPlain(state.selection),\n });\n }\n const hiddenNow = [...st.hiddenNodeIds].sort();\n const hiddenNext = [...state.hiddenNodeIds].sort();\n if (JSON.stringify(hiddenNow) !== JSON.stringify(hiddenNext)) {\n commands.push({ slice: 'hidden', before: hiddenNow, after: hiddenNext });\n }\n if (wantsPinned && !pinnedControlled) {\n commands.push({\n slice: 'pinnedNodes',\n before: [...st.pinnedNodeIds],\n after: [...state.pinnedNodeIds],\n });\n }\n const foldsNow = foldsStatePlain();\n const foldsNext = (state.folds ?? []).map(\n ([anchorId, memberIds]) => [anchorId, [...memberIds]] as [NodeId, NodeId[]],\n );\n if (JSON.stringify(foldsNow) !== JSON.stringify(foldsNext)) {\n commands.push({ slice: 'folds', before: foldsNow, after: foldsNext });\n }\n const scopeNow = scopeSpec === null ? null : subgraphPlain(scopeSpec);\n const scopeNext = state.subgraph === null ? null : subgraphPlain(state.subgraph);\n if (JSON.stringify(scopeNow) !== JSON.stringify(scopeNext)) {\n commands.push({ slice: 'scope', before: scopeNow, after: scopeNext });\n }\n if (crossfilterEngine !== null && crossfilterSpecs !== null) {\n const targetByKey = new Map(state.crossfilter.map((c) => [c.key, c.state]));\n for (const spec of crossfilterSpecs) {\n const now = crossfilterEngine.getBrush(spec.key);\n const wire = targetByKey.get(spec.key);\n const next: BrushState =\n wire === undefined\n ? null\n : wire.kind === 'categorical'\n ? { excluded: [...wire.excluded] }\n : { min: wire.range[0], max: wire.range[1] };\n if (JSON.stringify(now) !== JSON.stringify(next)) {\n commands.push({ slice: `brush:${spec.key}`, before: now, after: next });\n }\n }\n }\n\n // 5. The side lanes shared by both paths — everything that is CONFIG\n // or camera rather than a history command. Styling: when the host is\n // reflecting (needsHost), styling joins the intent and the host owns\n // it; otherwise the instance's internal config lanes apply it (the\n // §16.14 \"only internally owned fields\" clause — see function doc).\n const finishTail = (): void => {\n if (groupBySpec !== null) {\n const pairKeys = new Set(\n state.groups\n .filter((g): g is { key: string; collapsed: boolean } => 'key' in g)\n .filter((g) => g.collapsed)\n .map((g) => g.key),\n );\n const same =\n pairKeys.size === groupByCollapsedKeys.size &&\n [...pairKeys].every((k) => groupByCollapsedKeys.has(k));\n if (!same) {\n groupByCollapsedKeys.clear();\n for (const k of pairKeys) groupByCollapsedKeys.add(k);\n pendingGroupsRefresh = true;\n applyHostUpdateInner({});\n }\n } else if (wantsManualGroups && !groupsControlled) {\n commitManualGroups(manualGroups.length > 0 ? manualGroups : null);\n }\n\n if (state.styling !== undefined && !needsHost) {\n const patch: GraphHostUpdate<N, E> = {};\n if (state.styling.showLinks !== undefined) patch.showLinks = state.styling.showLinks;\n if (state.styling.edgeArrows !== undefined) {\n patch.edgeArrows = state.styling.edgeArrows;\n }\n if (state.styling.theme !== undefined) patch.theme = { base: state.styling.theme };\n if (state.styling.nodeColor !== undefined) {\n patch.nodeColor = state.styling.nodeColor as unknown as Scale<string, N>;\n }\n if (state.styling.nodeSize !== undefined) {\n patch.nodeSize = state.styling.nodeSize as unknown as Scale<number, N>;\n }\n if (Object.keys(patch).length > 0) applyHostUpdateInner(patch);\n }\n\n if (state.positions !== undefined && scene !== null) {\n const eng = engineIfReady();\n if (eng !== null) {\n const next = new Float32Array(scene.positions);\n let touched = 0;\n for (const [id, x, y] of state.positions) {\n const idx = scene.indexById.get(id);\n if (idx === undefined) continue; // stale id — ignored per spec\n next[2 * idx] = x;\n next[2 * idx + 1] = y;\n touched++;\n }\n if (touched > 0) {\n reconciler.noteEnginePositions(next);\n scene = { ...scene, positions: next };\n const prevState = store.getState();\n const nextRevisions: Revisions = {\n ...prevState.revisions,\n render: prevState.revisions.render + 1,\n };\n eng.commit({\n revision: nextRevisions.render,\n structure: {\n pointCount: scene.count,\n positions: next,\n links: scene.links,\n },\n });\n eng.pause();\n const patch: Partial<GraphStoreState> = { revisions: nextRevisions };\n if (prevState.simulationRunning) patch.simulationRunning = false;\n publish(patch);\n }\n }\n }\n\n if (state.camera !== null) {\n const eng = engineIfReady();\n if (eng !== null) {\n if (effectiveReducedMotion()) eng.setViewport(state.camera, { durationMs: 0 });\n else eng.setViewport(state.camera);\n }\n }\n };\n\n // 6a. Host reflection needed: STAGE — nothing applies until the\n // matching values arrive; the previous scene stays live throughout.\n if (needsHost) {\n const transactionId = `restore-${++restoreTxSeq}`;\n pendingRestore = {\n transactionId,\n source: 'setViewState',\n commands: commands as readonly HistoryCommand[],\n awaiting,\n finish: finishTail,\n recordOnCommit: true,\n resolve,\n timer: setTimeout(() => failPendingRestore('restore-timeout'), RESTORE_ACK_TIMEOUT_MS),\n };\n emit('viewStateRestore', { transactionId, source: 'setViewState', next: state });\n return;\n }\n\n // 6b. All-internal: record + apply as one transaction, immediately.\n if (commands.length > 0) {\n historyKernel.begin('setViewState');\n for (const cmd of commands) historyKernel.record(cmd.slice, cmd.before, cmd.after);\n historyKernel.end();\n clearPathInternal();\n applyHistoryCommands(commands as readonly HistoryCommand[]);\n }\n finishTail();\n resolve({ status: 'applied' });\n });\n });\n }\n\n\n // -------------------------------------------------------------------------\n // §16.14 exports (S15 export lane). Every operation pins ONE epoch — the\n // {accepted, scene, mask} references captured at call start — so a\n // concurrent commit or simulation tick never mixes revisions or coordinate\n // epochs mid-export. Streams release the pin when the generator closes.\n // -------------------------------------------------------------------------\n\n /** Visible physical slot indices under the CALLER-pinned scene/mask. */\n function visibleSlotsOf(pinScene: RenderScene, pinMask: SoftMask | null): number[] {\n const bound =\n pinScene.groups !== undefined ? pinScene.groups.physicalPointCount : pinScene.count;\n const out: number[] = [];\n for (let i = 0; i < bound; i++) {\n if (pinMask === null || pinMask.isNodeVisible(i)) out.push(i);\n }\n return out;\n }\n\n /** Pure base64 (no btoa/Buffer — environment-free per E2). */\n function base64Of(bytes: Uint8Array): string {\n const ABC = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n let out = '';\n for (let i = 0; i < bytes.length; i += 3) {\n const a = bytes[i]!;\n const b = bytes[i + 1];\n const c = bytes[i + 2];\n out += ABC[a >> 2]! + ABC[((a & 3) << 4) | ((b ?? 0) >> 4)]!;\n out += b === undefined ? '=' : ABC[((b & 15) << 2) | ((c ?? 0) >> 6)]!;\n out += c === undefined ? '=' : ABC[c & 63]!;\n }\n return out;\n }\n\n /** rgba() string from a 4-float slot of a projected color buffer. */\n function cssOfSlot(buf: Float32Array, slot: number): string {\n const o = 4 * slot;\n const r = Math.round((buf[o] ?? 0) * 255);\n const g = Math.round((buf[o + 1] ?? 0) * 255);\n const b = Math.round((buf[o + 2] ?? 0) * 255);\n const a = Math.round((buf[o + 3] ?? 1) * 1000) / 1000;\n return `rgba(${r}, ${g}, ${b}, ${a})`;\n }\n\n async function exportImage(format: 'png'): Promise<Blob>;\n async function exportImage(\n format: 'svg',\n opts?: { maxSvgElements?: number; fallback?: 'raster-hybrid' },\n ): Promise<string>;\n async function exportImage(\n format: 'png' | 'svg',\n opts?: { maxSvgElements?: number; fallback?: 'raster-hybrid' },\n ): Promise<Blob | string> {\n if (format === 'png') {\n const eng = engineIfReady();\n if (eng === null || eng.captureScreenshot === undefined) {\n throw new OrbitOperationError(\n { code: 'aborted', cause: 'no screenshot capability' },\n 'exportImage(\"png\") requires an engine with screenshot capture (§16.14)',\n );\n }\n const blob = await eng.captureScreenshot();\n if (blob === null) {\n throw new OrbitOperationError(\n { code: 'aborted', cause: 'capture returned null' },\n 'the engine could not capture the canvas (context lost or unmounted)',\n );\n }\n return blob;\n }\n\n // --- SVG: pin the epoch, read positions ONCE (per-event, §7.1). ---\n const pinScene = scene;\n const pinMask = softMask;\n const eng = engineIfReady();\n if (pinScene === null || eng === null) {\n throw new OrbitOperationError(\n { code: 'invalid-view-state', detail: 'no scene' },\n 'exportImage(\"svg\") requires a mounted scene',\n );\n }\n const pos = eng.getPositions() ?? pinScene.positions;\n const slots = visibleSlotsOf(pinScene, pinMask);\n const slotSet = new Set(slots);\n\n // Visible edges: both PHYSICAL endpoints visible.\n const linkBound =\n pinScene.groups !== undefined ? pinScene.groups.physicalLinkCount : pinScene.linkCount;\n const visibleLinks: number[] = [];\n for (let j = 0; j < linkBound; j++) {\n const a = pinScene.links[2 * j]!;\n const b = pinScene.links[2 * j + 1]!;\n if (slotSet.has(a) && slotSet.has(b) && (pinMask === null || pinMask.isEdgeVisible(j))) {\n visibleLinks.push(j);\n }\n }\n\n // Labels: the CURRENT candidate set, re-anchored to node space coords so\n // the vector output is camera-independent.\n const labelPlacements = currentPlacements.filter(\n (c) => c.kind !== 'cluster' && pinScene.indexById.has(c.id),\n );\n\n const elementCount = slots.length + visibleLinks.length + labelPlacements.length;\n const limit = opts?.maxSvgElements ?? SVG_MAX_ELEMENTS_DEFAULT;\n if (elementCount > limit && opts?.fallback !== 'raster-hybrid') {\n throw new OrbitOperationError(\n { code: 'export-too-large', elementCount, limit },\n `SVG export of ${elementCount} elements exceeds ${limit} — filter/isolate first, or pass { fallback: 'raster-hybrid' } (§16.14)`,\n );\n }\n\n // Space-coordinate bounding box, padded 5%.\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (const i of slots) {\n const x = pos[2 * i]!;\n const y = pos[2 * i + 1]!;\n if (Number.isNaN(x) || Number.isNaN(y)) continue;\n if (x < minX) minX = x;\n if (y < minY) minY = y;\n if (x > maxX) maxX = x;\n if (y > maxY) maxY = y;\n }\n if (!Number.isFinite(minX)) {\n minX = 0;\n minY = 0;\n maxX = 1;\n maxY = 1;\n }\n const pad = Math.max((maxX - minX), (maxY - minY)) * 0.05 + 10;\n const ox = minX - pad;\n const oy = minY - pad;\n const width = maxX - minX + 2 * pad;\n const height = maxY - minY + 2 * pad;\n\n if (elementCount > limit) {\n // raster-hybrid: PNG base (the camera view) + label overlay in SCREEN\n // coordinates from the live candidate placements.\n const shot =\n eng.captureScreenshot !== undefined ? await eng.captureScreenshot().catch(() => null) : null;\n if (shot === null) {\n throw new OrbitOperationError(\n { code: 'export-too-large', elementCount, limit },\n 'raster-hybrid fallback unavailable: the engine could not capture the canvas',\n );\n }\n // Environment-free data-URI encode: blob.arrayBuffer() is universal\n // (browser AND Node ≥18), unlike FileReader — core stays E2-pure.\n const bytes = new Uint8Array(await shot.arrayBuffer());\n const href = `data:${shot.type || 'image/png'};base64,${base64Of(bytes)}`;\n // Raster-hybrid renders the CAMERA view; dims come from the mount\n // container when known, else a sane default (the raster scales).\n const el = session?.container ?? null;\n return renderSvg({\n width: el !== null && el.clientWidth > 0 ? el.clientWidth : 1280,\n height: el !== null && el.clientHeight > 0 ? el.clientHeight : 800,\n background: theme.background,\n nodes: [],\n edges: [],\n labels: labelPlacements.map((c) => ({\n x: c.x,\n y: c.y,\n text: c.text,\n color: theme.labelFg,\n })),\n rasterBase: { href },\n });\n }\n\n // Pure vector: colors from the SAME base caches the commits mask, sizes\n // via a one-off projection through the commit projector.\n const colorBuf = basePointColorBuffer();\n const linkColorBuf = baseLinkColorBuffer();\n const model = sceneModel();\n const physNodes =\n groupRewrite !== null ? groupRewrite.physicalNodes : (model?.nodes ?? []);\n let sizeOfSlot: (slot: number) => number = () => PHYSICAL_DEFAULT_POINT_SIZE;\n if (nodeSize !== undefined && model !== null) {\n const r = isScaleValue(nodeSize)\n ? projectSizes(physNodes, scaleSizeAccessor(nodeSize as Scale<number, N>))\n : projectSizes(physNodes, nodeSize);\n const buf = r.buffer;\n sizeOfSlot = (slot) => buf[slot] ?? PHYSICAL_DEFAULT_POINT_SIZE;\n }\n\n return renderSvg(\n {\n width,\n height,\n background: theme.background,\n nodes: slots.map((i) => ({\n x: pos[2 * i]! - ox,\n y: pos[2 * i + 1]! - oy,\n r: Math.max(sizeOfSlot(i) / 2, 0.5),\n color: cssOfSlot(colorBuf, i),\n })),\n edges: visibleLinks.map((j) => {\n const a = pinScene.links[2 * j]!;\n const b = pinScene.links[2 * j + 1]!;\n return {\n x1: pos[2 * a]! - ox,\n y1: pos[2 * a + 1]! - oy,\n x2: pos[2 * b]! - ox,\n y2: pos[2 * b + 1]! - oy,\n color: cssOfSlot(linkColorBuf, j),\n width: PHYSICAL_DEFAULT_LINK_WIDTH,\n };\n }),\n labels: labelPlacements.map((c) => {\n const i = pinScene.indexById.get(c.id)!;\n return {\n x: pos[2 * i]! - ox + 6,\n y: pos[2 * i + 1]! - oy - 6,\n text: c.text,\n color: theme.labelFg,\n };\n }),\n },\n { maxElements: limit },\n );\n }\n\n /**\n * The export pin, captured EAGERLY at call time — async generator bodies\n * are lazy (nothing runs until the first next()), so the pin must be taken\n * in a plain wrapper or a commit landing between obtaining a stream and\n * first consuming it would silently swap epochs (the exact mixing §16.14\n * forbids). Plain references to immutable snapshots: releasing the pin is\n * the generator closing.\n */\n interface ExportPin {\n accepted: AcceptedGraph<N, E>;\n scene: RenderScene | null;\n mask: SoftMask | null;\n }\n\n function captureExportPin(): ExportPin | null {\n if (accepted === null) return null;\n return { accepted, scene, mask: softMask };\n }\n\n /** Visible-node id set under a pin; null = everything visible (no scene). */\n function pinnedVisibleIds(pin: ExportPin): ReadonlySet<NodeId> | null {\n if (pin.scene === null) return null;\n const slots = visibleSlotsOf(pin.scene, pin.mask);\n const ids = new Set<NodeId>();\n for (const i of slots) ids.add(pin.scene.idByIndex[i]!);\n return ids;\n }\n\n /** Row COUNT for a pinned scope without materializing anything — the\n * §16.14 \"rejects before allocating\" promise depends on this being\n * counting, not building. */\n function pinnedRowCount(pin: ExportPin, scope: 'visible' | 'accepted'): number {\n if (scope === 'accepted') return pin.accepted.nodes.length + pin.accepted.edges.length;\n const visible = pinnedVisibleIds(pin);\n if (visible === null) return pin.accepted.nodes.length + pin.accepted.edges.length;\n let count = visible.size;\n for (const e of pin.accepted.edges) {\n if (visible.has(e.source) && visible.has(e.target)) count++;\n }\n return count;\n }\n\n async function exportData(\n scope: 'visible' | 'accepted' = 'visible',\n opts?: { limit?: number },\n ): Promise<{ nodes: readonly GraphNode<N>[]; edges: readonly AcceptedEdge<E>[] }> {\n const pin = captureExportPin();\n if (pin === null) return { nodes: [], edges: [] };\n const rowCount = pinnedRowCount(pin, scope);\n const limit = opts?.limit ?? 100_000;\n if (rowCount > limit) {\n // Counted, never built: rejection precedes any O(n) materialization.\n throw new OrbitOperationError(\n { code: 'export-materialization-too-large', rowCount, limit },\n `exportData would materialize ${rowCount} rows (limit ${limit}) — use exportDataStream (§16.14)`,\n );\n }\n if (scope === 'accepted') return { nodes: pin.accepted.nodes, edges: pin.accepted.edges };\n const visible = pinnedVisibleIds(pin);\n if (visible === null) return { nodes: pin.accepted.nodes, edges: pin.accepted.edges };\n return {\n nodes: pin.accepted.nodes.filter((n) => visible.has(n.id)),\n edges: pin.accepted.edges.filter(\n (e) => visible.has(e.source) && visible.has(e.target),\n ),\n };\n }\n\n function exportDataStream(\n scope: 'visible' | 'accepted' = 'visible',\n ): AsyncGenerator<string, void, undefined> {\n const pin = captureExportPin(); // EAGER — see ExportPin\n return (async function* dataRows(): AsyncGenerator<string, void, undefined> {\n if (pin === null) return;\n const visible = scope === 'visible' ? pinnedVisibleIds(pin) : null;\n // Lazy row-at-a-time iteration over the pinned refs: peak memory is\n // one line, never an intermediate roster array.\n for (const n of pin.accepted.nodes) {\n if (visible !== null && !visible.has(n.id)) continue;\n yield JSON.stringify({ kind: 'node', value: n }) + '\\n';\n }\n for (const e of pin.accepted.edges) {\n if (visible !== null && (!visible.has(e.source) || !visible.has(e.target))) continue;\n yield JSON.stringify({ kind: 'edge', value: e }) + '\\n';\n }\n })();\n }\n\n /** Layout pin: the scene refs plus ONE position readback taken eagerly —\n * the Float32Array IS the coordinate epoch. */\n function captureLayoutPin(): { scene: RenderScene; pos: Float32Array } | null {\n const pinScene = scene;\n if (pinScene === null) return null;\n const eng = engineIfReady();\n const pos = (eng !== null ? eng.getPositions() : null) ?? pinScene.positions;\n return { scene: pinScene, pos };\n }\n\n async function exportLayout(opts?: {\n limit?: number;\n }): Promise<ReadonlyMap<NodeId, readonly [number, number]>> {\n const pin = captureLayoutPin();\n if (pin === null) return new Map();\n const bound =\n pin.scene.groups !== undefined ? pin.scene.groups.physicalPointCount : pin.scene.count;\n const limit = opts?.limit ?? 100_000;\n if (bound > limit) {\n throw new OrbitOperationError(\n { code: 'export-materialization-too-large', rowCount: bound, limit },\n `exportLayout would materialize ${bound} rows (limit ${limit}) — use exportLayoutStream (§16.14)`,\n );\n }\n const out = new Map<NodeId, readonly [number, number]>();\n for (let i = 0; i < bound; i++) {\n const x = pin.pos[2 * i]!;\n const y = pin.pos[2 * i + 1]!;\n if (Number.isNaN(x) || Number.isNaN(y)) continue;\n out.set(pin.scene.idByIndex[i]!, [x, y]);\n }\n return out;\n }\n\n function exportLayoutStream(): AsyncGenerator<string, void, undefined> {\n const pin = captureLayoutPin(); // EAGER readback — the epoch is fixed here\n return (async function* layoutRows(): AsyncGenerator<string, void, undefined> {\n if (pin === null) return;\n const bound =\n pin.scene.groups !== undefined ? pin.scene.groups.physicalPointCount : pin.scene.count;\n for (let i = 0; i < bound; i++) {\n const x = pin.pos[2 * i]!;\n const y = pin.pos[2 * i + 1]!;\n if (Number.isNaN(x) || Number.isNaN(y)) continue;\n yield JSON.stringify({ id: pin.scene.idByIndex[i]!, x, y }) + '\\n';\n }\n })();\n }\n\n /** §14/§15 DOM-presenter context menu (see the interface doc): validate\n * the id, then feed the SAME typed channel the canvas gesture feeds. */\n function requestNodeContextMenu(id: NodeId, screen: readonly [number, number]): void {\n if (destroyed) return;\n const node = getNode(id);\n if (node === undefined) return; // stale presenter — drop the gesture\n emit('contextMenu', {\n target: { kind: 'node', node },\n screen: [screen[0], screen[1]] as const,\n });\n }\n\n function focusNode(\n id: NodeId,\n opts?: { highlightNeighbors?: boolean; hops?: 1 },\n ): readonly NodeId[] {\n const eng = engineIfReady();\n if (eng === null || scene === null) return EMPTY_IDS;\n const idx = scene.indexById.get(id);\n if (idx === undefined) return EMPTY_IDS;\n eng.setFocusedIndex(idx);\n // §15.1: reduced motion coerces the focus camera move to be instant.\n if (effectiveReducedMotion()) eng.zoomToIndex?.(idx, 0);\n else eng.zoomToIndex?.(idx);\n const neighbors = neighborIdsOf(id);\n const highlight = opts?.highlightNeighbors ?? true;\n if (\n highlight &&\n neighbors.length > 0 &&\n !selectionControlled &&\n store.getState().selection.nodeIds.length === 0\n ) {\n const ring = [idx];\n for (const nid of neighbors) {\n const ni = scene.indexById.get(nid);\n if (ni !== undefined) ring.push(ni);\n }\n eng.setSelectedIndices(ring);\n }\n return neighbors;\n }\n\n /** §15.1: camera durations coerce to 0 under effective reduced motion. */\n function cameraZoom(factor: number): void {\n const eng = engineIfReady();\n if (eng === null) return;\n if (effectiveReducedMotion()) eng.zoom(factor, 0);\n else eng.zoom(factor);\n }\n\n // -------------------------------------------------------------------------\n // §11/§12 styling reads (S10)\n // -------------------------------------------------------------------------\n\n /** §11 legend surface. v0.8 tier: categorical counts are TOTALS over the\n * accepted model (not mask/scope-aware — the \"filtered\" second layer is a\n * later-tier follow-up). Domains resolve through the SAME frozen\n * DomainStore coordinates the projection uses (idempotent). */\n function getScaleInfo(channel: 'nodeColor' | 'nodeSize'): ScaleChannelInfo<N> | null {\n const raw: unknown = channel === 'nodeColor' ? nodeColor : nodeSize;\n if (!isScaleValue(raw)) return null;\n const scale = raw;\n if (scale.kind === 'categorical') {\n const palette =\n scale.palette ?? (channel === 'nodeColor' ? CATEGORICAL_PALETTE : ([] as const));\n const by = categoricalByGetter(scale.by as Parameters<typeof categoricalByGetter>[0]);\n const counts = new Map<string, number>();\n if (accepted !== null) {\n for (const node of accepted.nodes) {\n const v = by(node);\n if (v === null) continue;\n counts.set(v, (counts.get(v) ?? 0) + 1);\n }\n }\n const rows: ScaleInfoRow[] = categoricalRows(scale.domain, counts.keys()).map((value) => ({\n value,\n count: counts.get(value) ?? 0,\n colorIndex: categoricalIndex(scale.domain, palette, value),\n }));\n return { scale, rows };\n }\n if (accepted === null) return { scale };\n const domain = resolveScaleDomain(scale);\n return domain === null ? { scale } : { scale, domain };\n }\n\n /** §12: one metric value via the core id→index map (no public Map copy).\n * Degree-family values compute lazily on first use per model revision. */\n function getMetricValue(metric: MetricName, id: NodeId): number | null {\n if (accepted === null) return null;\n const idx = accepted.nodeIndex.get(id);\n if (idx === undefined) return null;\n if (!ensureMetricModel()) return null;\n return metricStore.getMetricValue(metric, idx);\n }\n\n return {\n store,\n labels: {\n subscribeCandidates: (cb) => subscribeLabelChannel(candidateSubs, cb),\n subscribePositions: (cb) => subscribeLabelChannel(positionSubs, cb),\n },\n applyHostUpdate,\n beginIngest,\n removeOverlay,\n getOverlayIds: () => store.getState().overlayIds,\n attach,\n detach,\n destroy,\n on,\n fitView: () => {\n const eng = engineIfReady();\n if (eng === null) return;\n if (effectiveReducedMotion()) eng.fitView({ durationMs: 0 });\n else eng.fitView();\n },\n zoomIn: () => {\n cameraZoom(ZOOM_STEP);\n },\n zoomOut: () => {\n cameraZoom(1 / ZOOM_STEP);\n },\n setViewport: (v: Partial<ViewportState>) => {\n const eng = engineIfReady();\n if (eng === null) return;\n if (effectiveReducedMotion()) eng.setViewport(v, { durationMs: 0 });\n else eng.setViewport(v);\n },\n focusNode,\n requestNodeContextMenu,\n getViewState,\n setViewState,\n exportImage,\n exportData,\n exportDataStream,\n exportLayout,\n exportLayoutStream,\n setSelection,\n selectNodes,\n selectEdges,\n selectGroups,\n selectNeighbors,\n selectAll,\n invertSelection,\n clearSelection,\n selectWithinPolygon,\n pickEdgeAt,\n sampleEdgeHover,\n sampleEdgeClick,\n hideNodes,\n showNodes,\n showAll,\n pinNode,\n unpinNode,\n clearPins,\n pinNodes,\n unpinNodes,\n groupNodes,\n ungroup,\n setGroupCollapsed,\n foldNode,\n unfoldNode,\n getFold,\n getClusters,\n selectCluster,\n isolateSelection,\n resetIsolation,\n expandNode,\n retractExpansion,\n getExpansionOverlays: (id: NodeId) => {\n const records = expansionOverlays.get(id);\n return records === undefined ? EMPTY_EXPANSION_RECORDS : [...records];\n },\n search,\n clearSearch,\n activateSearchResult,\n findPath,\n clearPath,\n getActivePath,\n pauseSimulation: () => {\n if (destroyed) return;\n const eng = engineIfReady();\n if (eng === null) return;\n eng.pause();\n if (store.getState().simulationRunning) publish({ simulationRunning: false });\n },\n resumeSimulation: () => {\n if (destroyed) return;\n const eng = engineIfReady();\n if (eng === null) return;\n eng.start();\n if (!store.getState().simulationRunning) publish({ simulationRunning: true });\n },\n isSimulationRunning: () => store.getState().simulationRunning,\n captureScreenshot: () => {\n const eng = engineIfReady();\n if (eng === null || eng.captureScreenshot === undefined) return Promise.resolve(null);\n return eng.captureScreenshot().catch(() => null);\n },\n setReducedMotion: (v: boolean | undefined) => {\n bindingReducedMotion = v;\n },\n getCrossfilterSession,\n playTimeline,\n pauseTimeline,\n undo,\n redo,\n getScaleInfo,\n getMetricValue,\n getRevisions: () => store.getState().revisions,\n getDiagnostics: () => store.getState().diagnostics,\n getNode,\n getEdge,\n getVisibleNodeIds: () => {\n if (scene === null) return EMPTY_IDS;\n // §16.3/§7.4: PHYSICAL slots only — internal scene keys of the\n // synthetic suffix never escape public payloads.\n const bound = physicalPointCount();\n if (softMask === null && bound === scene.count) return scene.idByIndex;\n // §9.1: scene ids restricted to mask-visible slots (scope ∧ mask).\n const out: NodeId[] = [];\n for (let i = 0; i < bound; i++) {\n if (softMask === null || softMask.isNodeVisible(i)) out.push(scene.idByIndex[i]!);\n }\n return out;\n },\n getSceneNodeIds: () => {\n if (scene === null) return EMPTY_IDS;\n // §16.3: the navigator roster stays physical; group entries arrive\n // with the S12-T02 event/namespace wiring.\n const bound = physicalPointCount();\n return bound === scene.count ? scene.idByIndex : scene.idByIndex.slice(0, bound);\n },\n getAccessibility: () => accessibilityConfig,\n };\n}\n","/**\n * §16.8 minimap / overview — CPU fallback lane (S11-T09/T10).\n *\n * v0.9 trim: no engine exposes `capabilities.overviewPass` yet (cosmos has no\n * second draw pass — M0 matrix), so this controller IS the minimap thumbnail\n * path: an O(n) CPU rasterization of the §7.1 position mirror into a small\n * RGBA dot field. It is a pure controller — no DOM, no canvas — the React\n * component blits the returned `Uint8ClampedArray` into an `ImageData`/canvas\n * and draws the viewport rectangle on top (O(1) from `getViewport()`, fully\n * decoupled from thumbnail refresh cadence).\n *\n * Refresh cadence (spec §16.8): ≤ 2 Hz while the simulation is hot (positions\n * change continuously on the GPU, so the epoch is ignored), ≤ 1 Hz after a\n * change while idle, and ZERO work while idle with an unchanged positions\n * epoch — `shouldRefresh` is the single throttle gate and latches its clock /\n * epoch only when it answers true (a `true` must be followed by one\n * `rasterize()`).\n *\n * Orientation: minimap pixel y grows DOWNWARD while world (space) y grows\n * upward — the same flip cosmos applies in its space→screen scale (dist\n * `scalePointY.domain([S, 0])`), so the thumbnail visually matches the main\n * canvas. `worldToMinimap`/`minimapToWorld` are exact inverses over the last\n * rasterized bounds.\n */\n\n/** Position mirror handed to the controller: interleaved x,y space coords. */\nexport interface OverviewScene {\n /** Interleaved `[x0, y0, x1, y1, …]`; may be longer than `count` pairs. */\n positions: Float32Array;\n /** Number of points (pairs) to read from `positions`. */\n count: number;\n}\n\nexport interface OverviewControllerOptions {\n /** Latest scene snapshot, or null when nothing is loaded yet. */\n getScene: () => OverviewScene | null;\n /**\n * Soft-filter visibility mask. Hidden points still rasterize (and still\n * contribute to bounds — the thumbnail must not re-frame when a filter\n * toggles) but at a dimmed alpha.\n */\n getVisible?: (index: number) => boolean;\n /** Square thumbnail edge in pixels. Default {@link OVERVIEW_SIZE_DEFAULT}. */\n size?: number;\n}\n\n/** World-space extent of the last rasterization (finite positions only). */\nexport interface OverviewBounds {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n}\n\nexport interface OverviewRaster {\n /** RGBA, `size * size * 4` bytes — blit via `new ImageData(bitmap, size)`. */\n bitmap: Uint8ClampedArray;\n bounds: OverviewBounds;\n}\n\n/** Spec §16.8: the CPU fallback rasterizes into a 256² target. */\nexport const OVERVIEW_SIZE_DEFAULT = 256;\n/** Hot-simulation refresh floor: ≤ 2 Hz. */\nexport const OVERVIEW_HOT_INTERVAL_MS = 500;\n/** Idle-after-change refresh floor: ≤ 1 Hz. */\nexport const OVERVIEW_IDLE_INTERVAL_MS = 1000;\n\n/** Fraction of the thumbnail edge kept clear on every side. */\nconst PADDING_FRACTION = 0.05;\n/** Alpha added per visible point (accumulates — overlaps read denser). */\nconst VISIBLE_ALPHA = 160;\n/** Alpha added per soft-filtered (hidden) point. */\nconst HIDDEN_ALPHA = 48;\n\nexport class OverviewController {\n private readonly getScene: () => OverviewScene | null;\n private readonly getVisible: ((index: number) => boolean) | undefined;\n readonly size: number;\n\n /** Transform of the LAST rasterization; null until rasterize() succeeds. */\n private frame: {\n bounds: OverviewBounds;\n scale: number;\n offsetX: number;\n offsetY: number;\n } | null = null;\n\n // --- throttle state (latched by shouldRefresh when it answers true) ---\n private lastRefreshMs: number | null = null;\n private lastEpoch: number | null = null;\n\n constructor(options: OverviewControllerOptions) {\n this.getScene = options.getScene;\n this.getVisible = options.getVisible;\n this.size = options.size ?? OVERVIEW_SIZE_DEFAULT;\n }\n\n /**\n * The single throttle gate (see module header). Latches `nowMs`/`epoch`\n * when it returns true, so each `true` accounts for exactly one refresh:\n *\n * - hot (`simulationRunning`): time-gated only (≤ 2 Hz) — the epoch is\n * ignored because positions change continuously without epoch advances;\n * - idle: refresh only when the epoch ADVANCED since the last refresh,\n * time-gated at ≤ 1 Hz;\n * - idle + unchanged epoch: always false — zero work, forever.\n */\n shouldRefresh(nowMs: number, simulationRunning: boolean, epoch: number): boolean {\n const last = this.lastRefreshMs;\n if (simulationRunning) {\n if (last !== null && nowMs - last < OVERVIEW_HOT_INTERVAL_MS) return false;\n } else {\n if (this.lastEpoch !== null && epoch === this.lastEpoch) return false;\n if (last !== null && nowMs - last < OVERVIEW_IDLE_INTERVAL_MS) return false;\n }\n this.lastRefreshMs = nowMs;\n this.lastEpoch = epoch;\n return true;\n }\n\n /**\n * Rasterizes the current scene into a fresh `size²` RGBA dot field: 1 px\n * white dots whose alpha ACCUMULATES on overlap (heatmap-ish density),\n * dimmed for mask-hidden points; NaN pairs (§7.3 tombstones) are skipped.\n * World bounds map into the thumbnail with a 5 % edge padding at a UNIFORM\n * scale (aspect preserved, centered on the short axis) and a downward pixel\n * y (see module header). Returns null when there is no scene or no point.\n */\n rasterize(): OverviewRaster | null {\n const scene = this.getScene();\n if (!scene || scene.count <= 0) return null;\n const { positions, count } = scene;\n const pairs = Math.min(count, Math.floor(positions.length / 2));\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (let i = 0; i < pairs; i++) {\n const x = positions[2 * i]!;\n const y = positions[2 * i + 1]!;\n if (!Number.isFinite(x) || !Number.isFinite(y)) continue;\n if (x < minX) minX = x;\n if (x > maxX) maxX = x;\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n }\n if (!Number.isFinite(minX) || !Number.isFinite(minY)) return null; // all NaN\n\n const size = this.size;\n const pad = size * PADDING_FRACTION;\n const inner = size - 2 * pad;\n const spanX = maxX - minX;\n const spanY = maxY - minY;\n const span = Math.max(spanX, spanY);\n const scale = span > 0 ? inner / span : 1; // degenerate scene: centered dot\n // Uniform scale, centered on the short axis (and on both for span 0).\n const offsetX = pad + (inner - spanX * scale) / 2;\n const offsetY = pad + (inner - spanY * scale) / 2;\n\n const bounds: OverviewBounds = { minX, minY, maxX, maxY };\n this.frame = { bounds, scale, offsetX, offsetY };\n\n const bitmap = new Uint8ClampedArray(size * size * 4);\n const max = size - 1;\n for (let i = 0; i < pairs; i++) {\n const x = positions[2 * i]!;\n const y = positions[2 * i + 1]!;\n if (!Number.isFinite(x) || !Number.isFinite(y)) continue;\n // Inline worldToMinimap (same frame), clamped to the pixel grid.\n let px = Math.round(offsetX + (x - minX) * scale);\n let py = Math.round(offsetY + (maxY - y) * scale);\n if (px < 0) px = 0;\n else if (px > max) px = max;\n if (py < 0) py = 0;\n else if (py > max) py = max;\n const at = (py * size + px) * 4;\n bitmap[at] = 255;\n bitmap[at + 1] = 255;\n bitmap[at + 2] = 255;\n const visible = this.getVisible ? this.getVisible(i) : true;\n // Uint8ClampedArray saturates the accumulation at 255 for us.\n bitmap[at + 3] = bitmap[at + 3]! + (visible ? VISIBLE_ALPHA : HIDDEN_ALPHA);\n }\n return { bitmap, bounds };\n }\n\n /**\n * World (space) → minimap pixel coords over the LAST rasterized frame\n * (fractional; callers round for pixel work). Null before any rasterize.\n */\n worldToMinimap(x: number, y: number): [number, number] | null {\n const frame = this.frame;\n if (!frame) return null;\n const { bounds, scale, offsetX, offsetY } = frame;\n return [offsetX + (x - bounds.minX) * scale, offsetY + (bounds.maxY - y) * scale];\n }\n\n /** Exact inverse of {@link worldToMinimap}. Null before any rasterize. */\n minimapToWorld(px: number, py: number): [number, number] | null {\n const frame = this.frame;\n if (!frame) return null;\n const { bounds, scale, offsetX, offsetY } = frame;\n return [bounds.minX + (px - offsetX) / scale, bounds.maxY - (py - offsetY) / scale];\n }\n}\n"]}