@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,68 @@
1
+ import type { Node } from "./node.js";
2
+ export type Vector = number[];
3
+ /** The seam: turns text into vectors. The kernel ships no concrete embedder. */
4
+ export interface Embedder {
5
+ readonly cacheNamespace: string;
6
+ embed(texts: string[]): Vector[];
7
+ }
8
+ /** The frozen per-node embedding input: title and body joined by one blank line. */
9
+ export declare function embedText(node: Node): string;
10
+ /** Content-address key for the vector cache. */
11
+ export declare function textHash(text: string): string;
12
+ /** A cacheNamespace must be a safe single path segment. */
13
+ export declare function validateNamespace(namespace: string): void;
14
+ /** A cache key must be exactly 64 lowercase hex chars (a SHA-256 hexdigest). */
15
+ export declare function validateTextHash(hash: string): void;
16
+ export interface SimilarHit {
17
+ id: string;
18
+ uid: string;
19
+ score: number;
20
+ }
21
+ export interface VectorSnapshot {
22
+ namespace: string | null;
23
+ dim: number | null;
24
+ vectors: Record<string, number[]>;
25
+ idByUid: Record<string, string>;
26
+ hashByUid: Record<string, string>;
27
+ }
28
+ /** Content-addressed on-disk cache of RAW embedder output, namespaced per embedder.
29
+ * Disposable: deleting the directory just forces re-embedding. All ranking math lives in
30
+ * VectorIndex; this is purely a model-output cache. */
31
+ export declare class VectorCache {
32
+ readonly root: string;
33
+ constructor(root: string);
34
+ private pathFor;
35
+ get(namespace: string, hash: string): Vector | null;
36
+ put(namespace: string, hash: string, vector: Vector): void;
37
+ }
38
+ interface PreparedVector {
39
+ readonly textHash: string;
40
+ readonly namespace: string;
41
+ readonly vector: Vector | null;
42
+ }
43
+ /** In-memory uid -> L2-normalized vector store with exact cosine ranking. Bound to exactly
44
+ * one embedder namespace and one dimension (cosine across vectors from different models or
45
+ * dimensions is meaningless). */
46
+ export declare class VectorIndex {
47
+ vectors: Map<string, Vector>;
48
+ idByUid: Map<string, string>;
49
+ hashByUid: Map<string, string>;
50
+ dim: number | null;
51
+ namespace: string | null;
52
+ toDict(): VectorSnapshot;
53
+ static fromDict(d: unknown): VectorIndex;
54
+ static build(nodes: Iterable<Node>, embedder: Embedder, cache: VectorCache): VectorIndex;
55
+ /** Resolve + validate the vector WITHOUT mutating index state (cache writes ok). */
56
+ prepare(node: Node, embedder: Embedder, cache: VectorCache): PreparedVector;
57
+ /** Apply a prepared vector. Infallible: never throws on valid prepared input. */
58
+ commit(node: Node, prepared: PreparedVector): void;
59
+ upsert(node: Node, embedder: Embedder, cache: VectorCache): void;
60
+ remove(uid: string): void;
61
+ queryVector(vec: Vector, k?: number): SimilarHit[];
62
+ similar(uid: string, k?: number): SimilarHit[];
63
+ similarText(text: string, embedder: Embedder, k?: number): SimilarHit[];
64
+ private prepareQuery;
65
+ private rank;
66
+ }
67
+ export {};
68
+ //# sourceMappingURL=similarity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"similarity.d.ts","sourceRoot":"","sources":["../src/similarity.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGtC,MAAM,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;AAE9B,gFAAgF;AAChF,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;CAClC;AAED,oFAAoF;AACpF,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAE5C;AAED,gDAAgD;AAChD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7C;AAID,2DAA2D;AAC3D,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAIzD;AAID,gFAAgF;AAChF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAInD;AA2BD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAQD;;uDAEuD;AACvD,qBAAa,WAAW;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,EAAE,MAAM;IAIxB,OAAO,CAAC,OAAO;IAMf,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAoBnD,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;CAS3D;AAED,UAAU,cAAc;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED;;iCAEiC;AACjC,qBAAa,WAAW;IACtB,OAAO,sBAA6B;IACpC,OAAO,sBAA6B;IACpC,SAAS,sBAA6B;IACtC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEhC,MAAM,IAAI,cAAc;IAUxB,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,GAAG,WAAW;IAsExC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,GAAG,WAAW;IAaxF,oFAAoF;IACpF,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,GAAG,cAAc;IA6B3E,iFAAiF;IACjF,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI;IAYlD,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI;IAIhE,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAMzB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,UAAU,EAAE;IAKlD,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,UAAU,EAAE;IAO9C,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,UAAU,EAAE;IAcvE,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,IAAI;CAgBb"}
@@ -0,0 +1,305 @@
1
+ import { createHash } from "node:crypto";
2
+ import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
3
+ import { dirname, join } from "node:path";
4
+ import { CollisionError } from "./errors.js";
5
+ import { scoreKey } from "./ranking.js";
6
+ /** The frozen per-node embedding input: title and body joined by one blank line. */
7
+ export function embedText(node) {
8
+ return `${node.title}\n\n${node.body}`;
9
+ }
10
+ /** Content-address key for the vector cache. */
11
+ export function textHash(text) {
12
+ return createHash("sha256").update(text, "utf-8").digest("hex");
13
+ }
14
+ const NAMESPACE_RE = /^[A-Za-z0-9._-]+$/;
15
+ /** A cacheNamespace must be a safe single path segment. */
16
+ export function validateNamespace(namespace) {
17
+ if (namespace === "." || namespace === ".." || !NAMESPACE_RE.test(namespace)) {
18
+ throw new TypeError(`invalid cacheNamespace ${JSON.stringify(namespace)}`);
19
+ }
20
+ }
21
+ const TEXT_HASH_RE = /^[0-9a-f]{64}$/;
22
+ /** A cache key must be exactly 64 lowercase hex chars (a SHA-256 hexdigest). */
23
+ export function validateTextHash(hash) {
24
+ if (!TEXT_HASH_RE.test(hash)) {
25
+ throw new TypeError(`invalid textHash ${JSON.stringify(hash)}`);
26
+ }
27
+ }
28
+ /** Reject empty / non-numeric / non-finite vectors. Booleans are non-`number` typed,
29
+ * so `typeof x !== "number"` already rejects them. */
30
+ function validateFinite(vec) {
31
+ if (vec.length < 1) {
32
+ throw new RangeError("vector must have length >= 1");
33
+ }
34
+ for (const x of vec) {
35
+ if (typeof x !== "number" || !Number.isFinite(x)) {
36
+ throw new TypeError(`vector contains non-finite or non-numeric value ${String(x)}`);
37
+ }
38
+ }
39
+ }
40
+ /** Return the L2-normalized vector; reject zero-norm and invalid numeric input. */
41
+ function normalize(vec) {
42
+ validateFinite(vec);
43
+ let sumSq = 0;
44
+ for (const x of vec)
45
+ sumSq += x * x;
46
+ const norm = Math.sqrt(sumSq);
47
+ if (norm === 0) {
48
+ throw new RangeError("cannot normalize a zero-norm vector");
49
+ }
50
+ return vec.map((x) => x / norm);
51
+ }
52
+ function validateK(k) {
53
+ if (k !== undefined && (!Number.isInteger(k) || k <= 0)) {
54
+ throw new RangeError(`k must be a positive integer or undefined, got ${JSON.stringify(k)}`);
55
+ }
56
+ }
57
+ /** Content-addressed on-disk cache of RAW embedder output, namespaced per embedder.
58
+ * Disposable: deleting the directory just forces re-embedding. All ranking math lives in
59
+ * VectorIndex; this is purely a model-output cache. */
60
+ export class VectorCache {
61
+ root;
62
+ constructor(root) {
63
+ this.root = root;
64
+ }
65
+ pathFor(namespace, hash) {
66
+ validateNamespace(namespace);
67
+ validateTextHash(hash);
68
+ return join(this.root, ".nodes-index", "vectors", namespace, `${hash}.json`);
69
+ }
70
+ get(namespace, hash) {
71
+ const path = this.pathFor(namespace, hash);
72
+ if (!existsSync(path))
73
+ return null;
74
+ let data;
75
+ try {
76
+ data = JSON.parse(readFileSync(path, "utf-8"));
77
+ }
78
+ catch (e) {
79
+ throw new TypeError(`corrupt cache file ${path}: ${e.message}`);
80
+ }
81
+ if (typeof data !== "object" || data === null || !("dim" in data) || !("vector" in data)) {
82
+ throw new TypeError(`corrupt cache file ${path}: missing dim/vector`);
83
+ }
84
+ const { dim, vector } = data;
85
+ if (!Array.isArray(vector) || vector.length !== dim) {
86
+ throw new TypeError(`corrupt cache file ${path}: dim/vector length mismatch`);
87
+ }
88
+ validateFinite(vector);
89
+ return [...vector];
90
+ }
91
+ put(namespace, hash, vector) {
92
+ validateFinite(vector);
93
+ const path = this.pathFor(namespace, hash);
94
+ mkdirSync(dirname(path), { recursive: true });
95
+ const payload = JSON.stringify({ dim: vector.length, vector });
96
+ const tmp = `${path}.tmp`;
97
+ writeFileSync(tmp, payload, "utf-8");
98
+ renameSync(tmp, path);
99
+ }
100
+ }
101
+ /** In-memory uid -> L2-normalized vector store with exact cosine ranking. Bound to exactly
102
+ * one embedder namespace and one dimension (cosine across vectors from different models or
103
+ * dimensions is meaningless). */
104
+ export class VectorIndex {
105
+ vectors = new Map();
106
+ idByUid = new Map();
107
+ hashByUid = new Map();
108
+ dim = null;
109
+ namespace = null;
110
+ toDict() {
111
+ return {
112
+ namespace: this.namespace,
113
+ dim: this.vectors.size > 0 ? this.dim : null,
114
+ vectors: Object.fromEntries([...this.vectors].map(([uid, vec]) => [uid, [...vec]])),
115
+ idByUid: Object.fromEntries(this.idByUid),
116
+ hashByUid: Object.fromEntries(this.hashByUid),
117
+ };
118
+ }
119
+ static fromDict(d) {
120
+ if (typeof d !== "object" || d === null)
121
+ throw new Error("vector snapshot: document must be an object");
122
+ const raw = d;
123
+ for (const key of ["namespace", "dim", "vectors", "idByUid", "hashByUid"]) {
124
+ if (!(key in raw))
125
+ throw new Error(`vector snapshot: missing ${key}`);
126
+ }
127
+ const { namespace, dim } = raw;
128
+ if (typeof raw.vectors !== "object" || raw.vectors === null)
129
+ throw new Error("vector snapshot: vectors must be an object");
130
+ if (typeof raw.idByUid !== "object" || raw.idByUid === null)
131
+ throw new Error("vector snapshot: idByUid must be an object");
132
+ if (typeof raw.hashByUid !== "object" || raw.hashByUid === null)
133
+ throw new Error("vector snapshot: hashByUid must be an object");
134
+ const vectorsRaw = raw.vectors;
135
+ const idByUid = new Map();
136
+ for (const [uid, id] of Object.entries(raw.idByUid)) {
137
+ if (typeof id !== "string")
138
+ throw new Error("vector snapshot: idByUid must map string uids to string ids");
139
+ idByUid.set(uid, id);
140
+ }
141
+ const hashByUid = new Map();
142
+ for (const [uid, h] of Object.entries(raw.hashByUid)) {
143
+ if (typeof h !== "string")
144
+ throw new Error("vector snapshot: hashByUid values must be strings");
145
+ validateTextHash(h);
146
+ hashByUid.set(uid, h);
147
+ }
148
+ const vectorUids = Object.keys(vectorsRaw);
149
+ const sameSet = vectorUids.length === idByUid.size &&
150
+ vectorUids.length === hashByUid.size &&
151
+ vectorUids.every((uid) => idByUid.has(uid) && hashByUid.has(uid));
152
+ if (!sameSet)
153
+ throw new Error("vector snapshot: vectors/idByUid/hashByUid uid sets differ");
154
+ const hasVectors = vectorUids.length > 0;
155
+ if (hasVectors) {
156
+ if (typeof namespace !== "string")
157
+ throw new Error("vector snapshot: namespace must be a string when vectors are present");
158
+ validateNamespace(namespace);
159
+ if (typeof dim !== "number" || !Number.isInteger(dim) || dim <= 0) {
160
+ throw new Error("vector snapshot: dim must be a positive integer when vectors are present");
161
+ }
162
+ }
163
+ else if (dim !== null) {
164
+ throw new Error("vector snapshot: dim must be null when there are no vectors");
165
+ }
166
+ else if (namespace !== null) {
167
+ if (typeof namespace !== "string")
168
+ throw new Error("vector snapshot: namespace must be a string when non-null");
169
+ validateNamespace(namespace);
170
+ }
171
+ const vectors = new Map();
172
+ for (const [uid, rawVec] of Object.entries(vectorsRaw)) {
173
+ if (!Array.isArray(rawVec))
174
+ throw new Error("vector snapshot: vector must be an array");
175
+ for (const x of rawVec) {
176
+ if (typeof x !== "number" || !Number.isFinite(x))
177
+ throw new Error("vector snapshot: vector contains a non-finite value");
178
+ }
179
+ const vec = rawVec;
180
+ if (vec.length !== dim)
181
+ throw new Error("vector snapshot: vector length != dim");
182
+ const norm = Math.sqrt(vec.reduce((s, x) => s + x * x, 0));
183
+ if (Math.abs(norm - 1) > 1e-9)
184
+ throw new Error("vector snapshot: stored vector must be L2-normalized");
185
+ vectors.set(uid, [...vec]);
186
+ }
187
+ const idx = new VectorIndex();
188
+ idx.namespace = namespace ?? null;
189
+ idx.vectors = vectors;
190
+ idx.idByUid = idByUid;
191
+ idx.hashByUid = hashByUid;
192
+ idx.dim = dim ?? null;
193
+ return idx;
194
+ }
195
+ static build(nodes, embedder, cache) {
196
+ const idx = new VectorIndex();
197
+ validateNamespace(embedder.cacheNamespace);
198
+ idx.namespace = embedder.cacheNamespace; // bind even for an empty corpus
199
+ for (const node of nodes) {
200
+ if (idx.hashByUid.has(node.uid)) {
201
+ throw new CollisionError(`duplicate uid ${JSON.stringify(node.uid)} in corpus`);
202
+ }
203
+ idx.upsert(node, embedder, cache);
204
+ }
205
+ return idx;
206
+ }
207
+ /** Resolve + validate the vector WITHOUT mutating index state (cache writes ok). */
208
+ prepare(node, embedder, cache) {
209
+ const namespace = embedder.cacheNamespace;
210
+ validateNamespace(namespace);
211
+ if (this.namespace !== null && namespace !== this.namespace) {
212
+ throw new RangeError(`embedder namespace ${JSON.stringify(namespace)} != index namespace ${JSON.stringify(this.namespace)}`);
213
+ }
214
+ const text = embedText(node);
215
+ const h = textHash(text);
216
+ if (this.hashByUid.get(node.uid) === h) {
217
+ return { textHash: h, namespace, vector: null };
218
+ }
219
+ let raw = cache.get(namespace, h);
220
+ if (raw === null) {
221
+ const embedded = embedder.embed([text]);
222
+ if (embedded.length !== 1) {
223
+ throw new RangeError(`embedder returned ${embedded.length} vectors for 1 input`);
224
+ }
225
+ raw = embedded[0];
226
+ validateFinite(raw);
227
+ cache.put(namespace, h, raw);
228
+ }
229
+ if (this.dim !== null && raw.length !== this.dim) {
230
+ throw new RangeError(`vector dim ${raw.length} != index dim ${this.dim}`);
231
+ }
232
+ return { textHash: h, namespace, vector: normalize(raw) };
233
+ }
234
+ /** Apply a prepared vector. Infallible: never throws on valid prepared input. */
235
+ commit(node, prepared) {
236
+ if (this.namespace === null)
237
+ this.namespace = prepared.namespace;
238
+ if (prepared.vector === null) {
239
+ this.idByUid.set(node.uid, node.id); // rename / id-only refresh
240
+ return;
241
+ }
242
+ if (this.dim === null)
243
+ this.dim = prepared.vector.length;
244
+ this.vectors.set(node.uid, prepared.vector);
245
+ this.idByUid.set(node.uid, node.id);
246
+ this.hashByUid.set(node.uid, prepared.textHash);
247
+ }
248
+ upsert(node, embedder, cache) {
249
+ this.commit(node, this.prepare(node, embedder, cache));
250
+ }
251
+ remove(uid) {
252
+ this.vectors.delete(uid);
253
+ this.idByUid.delete(uid);
254
+ this.hashByUid.delete(uid);
255
+ }
256
+ queryVector(vec, k) {
257
+ validateK(k);
258
+ return this.rank(this.prepareQuery(vec), k, null);
259
+ }
260
+ similar(uid, k) {
261
+ validateK(k);
262
+ const vec = this.vectors.get(uid);
263
+ if (vec === undefined)
264
+ throw new Error(`uid ${JSON.stringify(uid)} not in vector index`);
265
+ return this.rank(vec, k, uid);
266
+ }
267
+ similarText(text, embedder, k) {
268
+ validateK(k);
269
+ if (this.namespace !== null && embedder.cacheNamespace !== this.namespace) {
270
+ throw new RangeError(`embedder namespace ${JSON.stringify(embedder.cacheNamespace)} != index namespace ${JSON.stringify(this.namespace)}`);
271
+ }
272
+ const embedded = embedder.embed([text]);
273
+ if (embedded.length !== 1) {
274
+ throw new RangeError(`embedder returned ${embedded.length} vectors for 1 input`);
275
+ }
276
+ return this.queryVector(embedded[0], k);
277
+ }
278
+ prepareQuery(vec) {
279
+ validateFinite(vec);
280
+ if (this.dim !== null && vec.length !== this.dim) {
281
+ throw new RangeError(`query dim ${vec.length} != index dim ${this.dim}`);
282
+ }
283
+ return normalize(vec);
284
+ }
285
+ rank(queryVec, k, excludeUid) {
286
+ const hits = [];
287
+ for (const [uid, vec] of this.vectors) {
288
+ if (uid === excludeUid)
289
+ continue;
290
+ let dot = 0;
291
+ for (let i = 0; i < queryVec.length; i++)
292
+ dot += queryVec[i] * vec[i];
293
+ hits.push({ id: this.idByUid.get(uid), uid, score: dot });
294
+ }
295
+ hits.sort((a, b) => {
296
+ const ka = scoreKey(a.score);
297
+ const kb = scoreKey(b.score);
298
+ if (ka !== kb)
299
+ return kb - ka; // scoreKey descending
300
+ return a.id < b.id ? -1 : a.id > b.id ? 1 : 0; // id ascending
301
+ });
302
+ return k === undefined ? hits : hits.slice(0, k);
303
+ }
304
+ }
305
+ //# sourceMappingURL=similarity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"similarity.js","sourceRoot":"","sources":["../src/similarity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import { SearchIndex } from "./search.js";
2
+ import { VectorIndex } from "./similarity.js";
3
+ import { Index } from "./structural-index.js";
4
+ export declare const SNAPSHOT_SCHEMA_VERSION = 1;
5
+ export declare const SNAPSHOT_LANG = "ts";
6
+ export declare function snapshotPath(root: string): string;
7
+ export declare function hashBytes(data: Buffer | Uint8Array): string;
8
+ export interface CorpusFile {
9
+ readonly path: string;
10
+ readonly data: Buffer;
11
+ readonly sha256: string;
12
+ }
13
+ export interface CorpusFileStat {
14
+ readonly path: string;
15
+ readonly mtimeMs: number;
16
+ readonly size: number;
17
+ }
18
+ export interface CorpusFingerprint {
19
+ readonly files: readonly CorpusFileStat[];
20
+ }
21
+ /** Byte-level walk: read each .md file's bytes once and hash them. Skips the private
22
+ * `.nodes-index` tree, symlinks, and non-files. Sorted by root-relative POSIX path so the
23
+ * order matches Python's `sorted(root.rglob("*.md"))`. */
24
+ export declare function iterCorpusFiles(root: string): CorpusFile[];
25
+ /** Stat-level walk over the same corpus file set as `iterCorpusFiles`. Does not read file bodies. */
26
+ export declare function listCorpusFileStats(root: string): CorpusFileStat[];
27
+ /** Cheap external-change fingerprint for resident consumers. Not a content-identity hash. */
28
+ export declare function readCorpusFingerprint(root: string): CorpusFingerprint;
29
+ export declare function sameCorpusFingerprint(a: CorpusFingerprint, b: CorpusFingerprint): boolean;
30
+ export interface ManifestEntry {
31
+ readonly path: string;
32
+ readonly sha256: string;
33
+ readonly uid: string;
34
+ }
35
+ /** Write JSON atomically (tmp + rename). Rejects any non-finite number — JS `JSON.stringify`
36
+ * silently emits `null` for NaN/Infinity, so a replacer enforces the rejection (parity with
37
+ * Python's `json.dumps(..., allow_nan=False)`). Throws before any write, so no partial file. */
38
+ export declare function writeJsonAtomic(path: string, obj: unknown): void;
39
+ /** Read + parse JSON. Returns `null` only for a genuinely-absent path. A directory, a broken
40
+ * symlink, or invalid JSON throws (JS `JSON.parse` already rejects the `NaN`/`Infinity`
41
+ * constants, so Python's explicit `parse_constant` guard is free here). */
42
+ export declare function readJson(path: string): unknown;
43
+ export interface Snapshot {
44
+ manifest: ManifestEntry[];
45
+ index: Index;
46
+ searchIndex: SearchIndex;
47
+ vectorIndex: VectorIndex | null;
48
+ }
49
+ export declare function pathForNodeId(nodeId: string): string;
50
+ export declare function writeSnapshot(root: string, manifest: ManifestEntry[], index: Index, searchIndex: SearchIndex, vectorIndex: VectorIndex | undefined): void;
51
+ /** Reads and validates ONLY the cache file. Returns null for any cache problem (missing file,
52
+ * invalid JSON, version/lang mismatch, integrity failure, embedder-configured vector mismatch).
53
+ * Never parses corpus files, so it can never raise a corpus error — any throw here is a cache
54
+ * problem and resolves to a silent full rebuild upstream. */
55
+ export declare function loadSnapshot(root: string, embedderNamespace: string | null): Snapshot | null;
56
+ //# sourceMappingURL=snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.d.ts","sourceRoot":"","sources":["../src/snapshot.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAE9C,eAAO,MAAM,uBAAuB,IAAI,CAAC;AACzC,eAAO,MAAM,aAAa,OAAO,CAAC;AAMlC,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,CAE3D;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,CAAC;CAC3C;AAsCD;;0DAE0D;AAC1D,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAK1D;AAED,qGAAqG;AACrG,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,EAAE,CAKlE;AAED,6FAA6F;AAC7F,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAErE;AAED,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAQzF;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED;;gGAEgG;AAChG,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,IAAI,CAWhE;AAED;;2EAE2E;AAC3E,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAiB9C;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,KAAK,EAAE,KAAK,CAAC;IACb,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;CACjC;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGpD;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,aAAa,EAAE,EACzB,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,WAAW,GAAG,SAAS,GACnC,IAAI,CAUN;AAiDD;;;6DAG6D;AAC7D,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,IAAI,GAAG,QAAQ,GAAG,IAAI,CAgD5F"}