@nodes-dev/core 0.0.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.
Files changed (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +33 -0
  3. package/dist/corpus.d.ts +61 -0
  4. package/dist/corpus.d.ts.map +1 -0
  5. package/dist/corpus.js +383 -0
  6. package/dist/corpus.js.map +1 -0
  7. package/dist/errors.d.ts +20 -0
  8. package/dist/errors.d.ts.map +1 -0
  9. package/dist/errors.js +23 -0
  10. package/dist/errors.js.map +1 -0
  11. package/dist/frontmatter.d.ts +5 -0
  12. package/dist/frontmatter.d.ts.map +1 -0
  13. package/dist/frontmatter.js +103 -0
  14. package/dist/frontmatter.js.map +1 -0
  15. package/dist/ids.d.ts +11 -0
  16. package/dist/ids.d.ts.map +1 -0
  17. package/dist/ids.js +36 -0
  18. package/dist/ids.js.map +1 -0
  19. package/dist/index.d.ts +16 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +15 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/node.d.ts +106 -0
  24. package/dist/node.d.ts.map +1 -0
  25. package/dist/node.js +66 -0
  26. package/dist/node.js.map +1 -0
  27. package/dist/ranking.d.ts +7 -0
  28. package/dist/ranking.d.ts.map +1 -0
  29. package/dist/ranking.js +9 -0
  30. package/dist/ranking.js.map +1 -0
  31. package/dist/registry.d.ts +36 -0
  32. package/dist/registry.d.ts.map +1 -0
  33. package/dist/registry.js +123 -0
  34. package/dist/registry.js.map +1 -0
  35. package/dist/relations.d.ts +30 -0
  36. package/dist/relations.d.ts.map +1 -0
  37. package/dist/relations.js +44 -0
  38. package/dist/relations.js.map +1 -0
  39. package/dist/search.d.ts +46 -0
  40. package/dist/search.d.ts.map +1 -0
  41. package/dist/search.js +280 -0
  42. package/dist/search.js.map +1 -0
  43. package/dist/shapes.d.ts +86 -0
  44. package/dist/shapes.d.ts.map +1 -0
  45. package/dist/shapes.js +138 -0
  46. package/dist/shapes.js.map +1 -0
  47. package/dist/similarity.d.ts +68 -0
  48. package/dist/similarity.d.ts.map +1 -0
  49. package/dist/similarity.js +305 -0
  50. package/dist/similarity.js.map +1 -0
  51. package/dist/snapshot.d.ts +56 -0
  52. package/dist/snapshot.d.ts.map +1 -0
  53. package/dist/snapshot.js +252 -0
  54. package/dist/snapshot.js.map +1 -0
  55. package/dist/store.d.ts +15 -0
  56. package/dist/store.d.ts.map +1 -0
  57. package/dist/store.js +44 -0
  58. package/dist/store.js.map +1 -0
  59. package/dist/structural-index.d.ts +72 -0
  60. package/dist/structural-index.d.ts.map +1 -0
  61. package/dist/structural-index.js +434 -0
  62. package/dist/structural-index.js.map +1 -0
  63. package/package.json +50 -0
@@ -0,0 +1,252 @@
1
+ import { createHash } from "node:crypto";
2
+ import { existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, renameSync, statSync, writeFileSync, } from "node:fs";
3
+ import { dirname, join, relative } from "node:path";
4
+ import { NodeId } from "./ids.js";
5
+ import { SearchIndex } from "./search.js";
6
+ import { VectorIndex } from "./similarity.js";
7
+ import { Index } from "./structural-index.js";
8
+ export const SNAPSHOT_SCHEMA_VERSION = 1;
9
+ export const SNAPSHOT_LANG = "ts";
10
+ const SHA256_RE = /^[0-9a-f]{64}$/;
11
+ const SNAPSHOT_KEYS = ["version", "lang", "manifest", "structural", "search", "vectors"];
12
+ const MANIFEST_ROW_KEYS = ["path", "sha256", "uid"];
13
+ export function snapshotPath(root) {
14
+ return join(root, ".nodes-index", "snapshot.ts.json");
15
+ }
16
+ export function hashBytes(data) {
17
+ return createHash("sha256").update(data).digest("hex");
18
+ }
19
+ /** Root-relative POSIX path (forward slashes on every platform), the cross-language form. */
20
+ function relPosix(root, full) {
21
+ return relative(root, full).split(/[\\/]/).join("/");
22
+ }
23
+ function listCorpusMarkdownPaths(root) {
24
+ const files = [];
25
+ const walk = (dir) => {
26
+ if (!existsSync(dir))
27
+ return;
28
+ let entries;
29
+ try {
30
+ entries = readdirSync(dir, { withFileTypes: true });
31
+ }
32
+ catch {
33
+ return;
34
+ }
35
+ for (const entry of entries) {
36
+ const full = join(dir, entry.name);
37
+ if (entry.isSymbolicLink())
38
+ continue;
39
+ if (entry.isDirectory()) {
40
+ if (relPosix(root, full) === ".nodes-index")
41
+ continue;
42
+ walk(full);
43
+ }
44
+ else if (entry.isFile() && entry.name.endsWith(".md")) {
45
+ files.push({ path: relPosix(root, full), fullPath: full });
46
+ }
47
+ }
48
+ };
49
+ walk(root);
50
+ files.sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0));
51
+ return files;
52
+ }
53
+ /** Byte-level walk: read each .md file's bytes once and hash them. Skips the private
54
+ * `.nodes-index` tree, symlinks, and non-files. Sorted by root-relative POSIX path so the
55
+ * order matches Python's `sorted(root.rglob("*.md"))`. */
56
+ export function iterCorpusFiles(root) {
57
+ return listCorpusMarkdownPaths(root).map(({ path, fullPath }) => {
58
+ const data = readFileSync(fullPath);
59
+ return { path, data, sha256: hashBytes(data) };
60
+ });
61
+ }
62
+ /** Stat-level walk over the same corpus file set as `iterCorpusFiles`. Does not read file bodies. */
63
+ export function listCorpusFileStats(root) {
64
+ return listCorpusMarkdownPaths(root).map(({ path, fullPath }) => {
65
+ const stat = statSync(fullPath);
66
+ return { path, mtimeMs: stat.mtimeMs, size: stat.size };
67
+ });
68
+ }
69
+ /** Cheap external-change fingerprint for resident consumers. Not a content-identity hash. */
70
+ export function readCorpusFingerprint(root) {
71
+ return { files: listCorpusFileStats(root) };
72
+ }
73
+ export function sameCorpusFingerprint(a, b) {
74
+ if (a.files.length !== b.files.length)
75
+ return false;
76
+ for (let i = 0; i < a.files.length; i++) {
77
+ const left = a.files[i];
78
+ const right = b.files[i];
79
+ if (left.path !== right.path || left.mtimeMs !== right.mtimeMs || left.size !== right.size)
80
+ return false;
81
+ }
82
+ return true;
83
+ }
84
+ /** Write JSON atomically (tmp + rename). Rejects any non-finite number — JS `JSON.stringify`
85
+ * silently emits `null` for NaN/Infinity, so a replacer enforces the rejection (parity with
86
+ * Python's `json.dumps(..., allow_nan=False)`). Throws before any write, so no partial file. */
87
+ export function writeJsonAtomic(path, obj) {
88
+ const payload = JSON.stringify(obj, (_key, value) => {
89
+ if (typeof value === "number" && !Number.isFinite(value)) {
90
+ throw new RangeError("cannot serialize non-finite number to JSON");
91
+ }
92
+ return value;
93
+ });
94
+ mkdirSync(dirname(path), { recursive: true });
95
+ const tmp = `${path}.tmp`;
96
+ writeFileSync(tmp, payload, "utf-8");
97
+ renameSync(tmp, path);
98
+ }
99
+ /** Read + parse JSON. Returns `null` only for a genuinely-absent path. A directory, a broken
100
+ * symlink, or invalid JSON throws (JS `JSON.parse` already rejects the `NaN`/`Infinity`
101
+ * constants, so Python's explicit `parse_constant` guard is free here). */
102
+ export function readJson(path) {
103
+ let raw;
104
+ try {
105
+ raw = readFileSync(path, "utf-8");
106
+ }
107
+ catch (e) {
108
+ const err = e;
109
+ if (err.code === "ENOENT") {
110
+ try {
111
+ lstatSync(path); // a broken symlink reads ENOENT but lstats fine
112
+ }
113
+ catch {
114
+ return null; // genuinely absent
115
+ }
116
+ throw err; // path exists as a (broken) symlink
117
+ }
118
+ throw err; // EISDIR and anything else
119
+ }
120
+ return JSON.parse(raw);
121
+ }
122
+ export function pathForNodeId(nodeId) {
123
+ const nid = NodeId.parse(nodeId);
124
+ return `${nid.kind}/${nid.slug.replace(/:/g, "__")}.md`;
125
+ }
126
+ export function writeSnapshot(root, manifest, index, searchIndex, vectorIndex) {
127
+ const doc = {
128
+ version: SNAPSHOT_SCHEMA_VERSION,
129
+ lang: SNAPSHOT_LANG,
130
+ manifest: manifest.map((m) => ({ path: m.path, sha256: m.sha256, uid: m.uid })),
131
+ structural: index.toDict(),
132
+ search: searchIndex.toDict(),
133
+ vectors: vectorIndex !== undefined ? vectorIndex.toDict() : null,
134
+ };
135
+ writeJsonAtomic(snapshotPath(root), doc);
136
+ }
137
+ function validateManifestPath(path) {
138
+ const parts = path.split("/");
139
+ if (!path ||
140
+ path.startsWith("/") ||
141
+ path.includes("\\") ||
142
+ path.endsWith("/") ||
143
+ !path.endsWith(".md") ||
144
+ parts[0] === ".nodes-index" ||
145
+ parts.some((part) => part === "" || part === "." || part === "..")) {
146
+ throw new Error("snapshot manifest row path must be a root-relative POSIX .md path");
147
+ }
148
+ }
149
+ function parseManifest(raw) {
150
+ if (!Array.isArray(raw))
151
+ throw new Error("snapshot manifest is not an array");
152
+ const entries = [];
153
+ for (const e of raw) {
154
+ if (typeof e !== "object" || e === null)
155
+ throw new Error("snapshot manifest row is not an object");
156
+ const row = e;
157
+ for (const key of MANIFEST_ROW_KEYS) {
158
+ if (!(key in row))
159
+ throw new Error(`snapshot manifest row missing ${key}`);
160
+ }
161
+ const { path, sha256, uid } = row;
162
+ if (typeof path !== "string")
163
+ throw new Error("snapshot manifest row path must be a string");
164
+ validateManifestPath(path);
165
+ if (typeof sha256 !== "string")
166
+ throw new Error("snapshot manifest row sha256 must be a string");
167
+ if (!SHA256_RE.test(sha256))
168
+ throw new Error("snapshot manifest row sha256 must be 64 lowercase hex chars");
169
+ if (typeof uid !== "string")
170
+ throw new Error("snapshot manifest row uid must be a string");
171
+ entries.push({ path, sha256, uid });
172
+ }
173
+ if (new Set(entries.map((m) => m.uid)).size !== entries.length)
174
+ throw new Error("snapshot manifest: duplicate uid");
175
+ if (new Set(entries.map((m) => m.path)).size !== entries.length)
176
+ throw new Error("snapshot manifest: duplicate path");
177
+ return entries;
178
+ }
179
+ function setsEqual(a, b) {
180
+ return a.size === b.size && [...a].every((x) => b.has(x));
181
+ }
182
+ function mapsEqual(a, b) {
183
+ if (a.size !== b.size)
184
+ return false;
185
+ for (const [k, v] of a)
186
+ if (b.get(k) !== v)
187
+ return false;
188
+ return true;
189
+ }
190
+ /** Reads and validates ONLY the cache file. Returns null for any cache problem (missing file,
191
+ * invalid JSON, version/lang mismatch, integrity failure, embedder-configured vector mismatch).
192
+ * Never parses corpus files, so it can never raise a corpus error — any throw here is a cache
193
+ * problem and resolves to a silent full rebuild upstream. */
194
+ export function loadSnapshot(root, embedderNamespace) {
195
+ try {
196
+ const doc = readJson(snapshotPath(root));
197
+ if (doc === null)
198
+ return null;
199
+ if (typeof doc !== "object")
200
+ return null;
201
+ const d = doc;
202
+ for (const key of SNAPSHOT_KEYS) {
203
+ if (!(key in d))
204
+ throw new Error(`snapshot document missing ${key}`);
205
+ }
206
+ if (d.version !== SNAPSHOT_SCHEMA_VERSION || d.lang !== SNAPSHOT_LANG)
207
+ return null;
208
+ const manifest = parseManifest(d.manifest);
209
+ const manifestUids = new Set(manifest.map((m) => m.uid));
210
+ const index = Index.fromDict(d.structural);
211
+ if (!setsEqual(new Set(index.byUid.keys()), manifestUids))
212
+ return null;
213
+ const expectedIds = new Map();
214
+ for (const [uid, entry] of index.byUid)
215
+ expectedIds.set(uid, entry.id);
216
+ for (const m of manifest) {
217
+ if (m.path !== pathForNodeId(expectedIds.get(m.uid))) {
218
+ throw new Error("snapshot manifest path does not match structural id");
219
+ }
220
+ }
221
+ const searchIndex = SearchIndex.fromDict(d.search);
222
+ if (!setsEqual(new Set(searchIndex.lengths.keys()), manifestUids))
223
+ return null;
224
+ if (!mapsEqual(searchIndex.idByUid, expectedIds))
225
+ return null;
226
+ let vectorIndex = null;
227
+ if (embedderNamespace !== null) {
228
+ const vec = d.vectors;
229
+ if (typeof vec !== "object" || vec === null)
230
+ return null;
231
+ if (vec.namespace !== embedderNamespace)
232
+ return null;
233
+ vectorIndex = VectorIndex.fromDict(vec);
234
+ if (!setsEqual(new Set(vectorIndex.vectors.keys()), manifestUids))
235
+ return null;
236
+ if (!mapsEqual(vectorIndex.idByUid, expectedIds))
237
+ return null;
238
+ }
239
+ return { manifest, index, searchIndex, vectorIndex };
240
+ }
241
+ catch (e) {
242
+ // loadSnapshot only ever reads the cache file, so any thrown Error is a cache problem
243
+ // (absent/locked file, malformed JSON, failed integrity check) -> rebuild. This is the
244
+ // closest faithful mirror of Python's `except (OSError, ValueError)`: every cache-unusable
245
+ // signal here surfaces as an Error subclass, while JS's error taxonomy gives no class-based
246
+ // way to separate them further. A non-Error throw is not a cache signal — rethrow it.
247
+ if (!(e instanceof Error))
248
+ throw e;
249
+ return null;
250
+ }
251
+ }
252
+ //# sourceMappingURL=snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../src/snapshot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { Node } from "./node.js";
2
+ /**
3
+ * Pure file mechanics over a corpus directory. No cross-corpus logic.
4
+ * Collision detection, ref resolution, and rename live in `Corpus`/`Index`.
5
+ */
6
+ export declare class Store {
7
+ readonly root: string;
8
+ constructor(root: string);
9
+ pathFor(nodeId: string): string;
10
+ writeFile(node: Node): string;
11
+ readFile(nodeId: string): Node;
12
+ deleteFile(nodeId: string): void;
13
+ allNodes(): Node[];
14
+ }
15
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGtC;;;GAGG;AACH,qBAAa,KAAK;IAChB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM;IAIxB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAK/B,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM;IAO7B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAQ9B,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAQhC,QAAQ,IAAI,IAAI,EAAE;CAGnB"}
package/dist/store.js ADDED
@@ -0,0 +1,44 @@
1
+ import { existsSync, mkdirSync, readFileSync, rmSync, statSync, writeFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { RefError } from "./errors.js";
4
+ import { nodeFromMarkdown, nodeToMarkdown } from "./frontmatter.js";
5
+ import { NodeId } from "./ids.js";
6
+ import { iterCorpusFiles } from "./snapshot.js";
7
+ /**
8
+ * Pure file mechanics over a corpus directory. No cross-corpus logic.
9
+ * Collision detection, ref resolution, and rename live in `Corpus`/`Index`.
10
+ */
11
+ export class Store {
12
+ root;
13
+ constructor(root) {
14
+ this.root = root;
15
+ }
16
+ pathFor(nodeId) {
17
+ const nid = NodeId.parse(nodeId);
18
+ return join(this.root, nid.kind, `${nid.slug.replace(/:/g, "__")}.md`);
19
+ }
20
+ writeFile(node) {
21
+ const path = this.pathFor(node.id);
22
+ mkdirSync(dirname(path), { recursive: true });
23
+ writeFileSync(path, nodeToMarkdown(node), "utf-8");
24
+ return path;
25
+ }
26
+ readFile(nodeId) {
27
+ const path = this.pathFor(nodeId);
28
+ if (!(existsSync(path) && statSync(path).isFile())) {
29
+ throw new RefError(`no node at ${JSON.stringify(nodeId)}`);
30
+ }
31
+ return nodeFromMarkdown(readFileSync(path, "utf-8"));
32
+ }
33
+ deleteFile(nodeId) {
34
+ const path = this.pathFor(nodeId);
35
+ if (!(existsSync(path) && statSync(path).isFile())) {
36
+ throw new RefError(`no node at ${JSON.stringify(nodeId)}`);
37
+ }
38
+ rmSync(path);
39
+ }
40
+ allNodes() {
41
+ return iterCorpusFiles(this.root).map((f) => nodeFromMarkdown(f.data.toString("utf-8")));
42
+ }
43
+ }
44
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/F,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD;;;GAGG;AACH,MAAM,OAAO,KAAK;IACP,IAAI,CAAS;IAEtB,YAAY,IAAY;QACtB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,OAAO,CAAC,MAAc;QACpB,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACzE,CAAC;IAED,SAAS,CAAC,IAAU;QAClB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,aAAa,CAAC,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,QAAQ,CAAC,MAAc;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAClC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;YACnD,MAAM,IAAI,QAAQ,CAAC,cAAc,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,OAAO,gBAAgB,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,UAAU,CAAC,MAAc;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAClC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;YACnD,MAAM,IAAI,QAAQ,CAAC,cAAc,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IAED,QAAQ;QACN,OAAO,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3F,CAAC;CACF"}
@@ -0,0 +1,72 @@
1
+ import type { Node } from "./node.js";
2
+ import { type Relation } from "./relations.js";
3
+ export type Role = "relation_source" | "relation_target" | "membership_member" | "edges_source" | "edges_target" | "order_member" | "keys_value";
4
+ export interface OutRef {
5
+ ref: string;
6
+ role: Role;
7
+ relation?: Relation;
8
+ }
9
+ export interface InRef {
10
+ sourceUid: string;
11
+ outRef: OutRef;
12
+ }
13
+ export interface IndexEntry {
14
+ uid: string;
15
+ id: string;
16
+ kind: string;
17
+ deprecatedIds: ReadonlySet<string>;
18
+ outRefs: OutRef[];
19
+ }
20
+ export interface ResolvedEdge {
21
+ relation: Relation;
22
+ sourceUid: string | null;
23
+ targetUid: string | null;
24
+ }
25
+ /** In-memory structural index. Pure data; no file I/O. */
26
+ export declare class Index {
27
+ byUid: Map<string, IndexEntry>;
28
+ idToUid: Map<string, string>;
29
+ deprecatedToUid: Map<string, string>;
30
+ inRefs: Map<string, InRef[]>;
31
+ static build(nodes: Iterable<Node>): Index;
32
+ resolveUid(ref: string): string | null;
33
+ assertAddable(node: Node): void;
34
+ upsert(node: Node): void;
35
+ toDict(): {
36
+ entries: Array<{
37
+ uid: string;
38
+ id: string;
39
+ kind: string;
40
+ deprecatedIds: string[];
41
+ relations: Array<Record<string, unknown>>;
42
+ structuralRefs: Array<{
43
+ ref: string;
44
+ role: Role;
45
+ }>;
46
+ }>;
47
+ };
48
+ static fromDict(d: unknown): Index;
49
+ remove(uid: string): void;
50
+ private drop;
51
+ private refsForUid;
52
+ private resolveEdge;
53
+ private relationsByRole;
54
+ outboundEdges(uid: string): ResolvedEdge[];
55
+ inboundEdges(uid: string): ResolvedEdge[];
56
+ danglingEdges(): ResolvedEdge[];
57
+ /** Uids of this node's resolvable direct members. Dangling member refs are skipped
58
+ * (check reports them); duplicate entries and live+deprecated refs dedupe by uid. */
59
+ membersOf(uid: string): Set<string>;
60
+ /** Uids of the nodes whose membership facet lists any of this node's identity claims
61
+ * (live id or deprecated ids — the same attribution rule as relationsByRole). */
62
+ containersOf(uid: string): Set<string>;
63
+ /** Transitive membership closure (BFS). The visited set is seeded with the start uid,
64
+ * which is excluded from the result even when a membership cycle reaches it. */
65
+ membershipClosure(uid: string, direction: "members" | "containers"): Set<string>;
66
+ /** Every unresolved membership ref, deduped by (container uid, ref). */
67
+ danglingMembers(): Array<{
68
+ sourceUid: string;
69
+ ref: string;
70
+ }>;
71
+ }
72
+ //# sourceMappingURL=structural-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structural-index.d.ts","sourceRoot":"","sources":["../src/structural-index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,KAAK,QAAQ,EAAkB,MAAM,gBAAgB,CAAC;AAG/D,MAAM,MAAM,IAAI,GACZ,iBAAiB,GACjB,iBAAiB,GACjB,mBAAmB,GACnB,cAAc,GACd,cAAc,GACd,cAAc,GACd,YAAY,CAAC;AAWjB,MAAM,WAAW,MAAM;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED,MAAM,WAAW,KAAK;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACnC,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AA0GD,0DAA0D;AAC1D,qBAAa,KAAK;IAChB,KAAK,0BAAiC;IACtC,OAAO,sBAA6B;IACpC,eAAe,sBAA6B;IAC5C,MAAM,uBAA8B;IAEpC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK;IAY1C,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAOtC,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAiB/B,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAmBxB,MAAM,IAAI;QACR,OAAO,EAAE,KAAK,CAAC;YACb,GAAG,EAAE,MAAM,CAAC;YACZ,EAAE,EAAE,MAAM,CAAC;YACX,IAAI,EAAE,MAAM,CAAC;YACb,aAAa,EAAE,MAAM,EAAE,CAAC;YACxB,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;YAC1C,cAAc,EAAE,KAAK,CAAC;gBAAE,GAAG,EAAE,MAAM,CAAC;gBAAC,IAAI,EAAE,IAAI,CAAA;aAAE,CAAC,CAAC;SACpD,CAAC,CAAC;KACJ;IA+BD,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,GAAG,KAAK;IAqElC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIzB,OAAO,CAAC,IAAI;IAkBZ,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,eAAe;IAevB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,EAAE;IAI1C,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,EAAE;IAIzC,aAAa,IAAI,YAAY,EAAE;IAkB/B;yFACqF;IACrF,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IAYnC;qFACiF;IACjF,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IAWtC;oFACgF;IAChF,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC;IAiBhF,wEAAwE;IACxE,eAAe,IAAI,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CAe7D"}