import type { AbstractHyperedge } from './abstract-hyperedge.js'; /** * Shape a registered hyperedge class must satisfy. Every leaf class * in src/models/ matches this shape (declared as static fields). */ export interface HyperedgeClass { readonly wireKey: string; readonly typeTag: string; readonly rdfType: string; readonly memberClass: new (...args: never[]) => unknown; readonly v1WireKeys?: ReadonlyArray; readonly kindLabel?: string; readonly name: string; } declare class HyperedgeRegistry { static _byWireKey: Map; static _byTypeTag: Map; static _byRdfType: Map; static register(cls: HyperedgeClass | undefined): boolean; /** * Test-only. Removes a class from all three indexes. Used by the OCP * spec to clean up mock types it adds during a test run. */ static unregister(cls: HyperedgeClass | undefined): boolean; static forWireKey(key: string): HyperedgeClass | null; static forTypeTag(tag: string): HyperedgeClass | null; static forRdfType(type: string): HyperedgeClass | null; static allClasses(): HyperedgeClass[]; static allWireKeys(): string[]; static allTypeTags(): string[]; /** * Snapshot of every registered wire-shape identifier (v2 wireKey plus * any v1 legacy keys). Used by the parser to reserve STRUCTURAL_KEYS * and to know which top-level YAML keys to walk for hyperedge data. */ static allWireAndLegacyKeys(): string[]; } /** * Helper: partition a unified hyperedge array by wire key. Used by * Concept.toJSON, ConceptSerializer, and diff-patch to emit per-type * wire keys without per-type branching in those files. Adding a new * hyperedge type "just works" because the group is keyed by the * class's static wireKey. */ export declare function groupHyperedgesByWireKey(hyperedges: ReadonlyArray | null | undefined): Record; export { HyperedgeRegistry }; //# sourceMappingURL=hyperedge-registry.d.ts.map