diff --git a/npm/packages/rvf/dist/backend.d.ts b/npm/packages/rvf/dist/backend.d.ts index 6c8a914d7..c984eb52f 100644 --- a/npm/packages/rvf/dist/backend.d.ts +++ b/npm/packages/rvf/dist/backend.d.ts @@ -46,6 +46,10 @@ export interface RvfBackend { export declare class NodeBackend implements RvfBackend { private native; private handle; + private idToLabel; + private labelToId; + private nextLabel; + private storePath; private loadNative; private ensureHandle; create(path: string, options: RvfOptions): Promise; @@ -68,6 +72,17 @@ export declare class NodeBackend implements RvfBackend { extractEbpf(): Promise; segments(): Promise; dimension(): Promise; + /** + * Get or allocate a numeric label for a string ID. + * If the ID was already seen, returns the existing label. + */ + private resolveLabel; + /** Path to the sidecar mappings file. */ + private mappingsPath; + /** Persist the string↔label mapping to a sidecar JSON file. */ + private saveMappings; + /** Load the string↔label mapping from the sidecar JSON file if it exists. */ + private loadMappings; } /** * Backend that delegates to the `@ruvector/rvf-wasm` WASM build. diff --git a/npm/packages/rvf/dist/backend.js b/npm/packages/rvf/dist/backend.js index c735ae15f..64ffa6c7c 100644 --- a/npm/packages/rvf/dist/backend.js +++ b/npm/packages/rvf/dist/backend.js @@ -52,6 +52,11 @@ class NodeBackend { this.native = null; // eslint-disable-next-line @typescript-eslint/no-explicit-any this.handle = null; + // String ID <-> Numeric Label mappings (N-API layer requires i64 labels) + this.idToLabel = new Map(); + this.labelToId = new Map(); + this.nextLabel = 1; // RVF uses 1-based labels + this.storePath = ''; } async loadNative() { if (this.native) @@ -76,6 +81,10 @@ class NodeBackend { await this.loadNative(); try { this.handle = await this.native.create(path, mapOptionsToNative(options)); + this.storePath = path; + this.idToLabel.clear(); + this.labelToId.clear(); + this.nextLabel = 1; } catch (err) { throw errors_1.RvfError.fromNative(err); @@ -85,6 +94,8 @@ class NodeBackend { await this.loadNative(); try { this.handle = await this.native.open(path); + this.storePath = path; + await this.loadMappings(); } catch (err) { throw errors_1.RvfError.fromNative(err); @@ -94,6 +105,8 @@ class NodeBackend { await this.loadNative(); try { this.handle = await this.native.openReadonly(path); + this.storePath = path; + await this.loadMappings(); } catch (err) { throw errors_1.RvfError.fromNative(err); @@ -115,8 +128,14 @@ class NodeBackend { const f32 = v instanceof Float32Array ? v : new Float32Array(v); flat.set(f32, i * dim); } - const ids = entries.map((e) => Number(e.id)); + // Map string IDs to numeric labels for the N-API layer. + // The native Rust HNSW expects i64 labels — non-numeric strings cause + // silent data loss (NaN → dropped). We maintain a bidirectional + // string↔label mapping and persist it as a sidecar JSON file. + const ids = entries.map((e) => this.resolveLabel(e.id)); const result = this.handle.ingestBatch(flat, ids); + // Persist mappings after every ingest so they survive crashes. + await this.saveMappings(); return { accepted: Number(result.accepted), rejected: Number(result.rejected), @@ -132,8 +151,9 @@ class NodeBackend { try { const nativeOpts = options ? mapQueryOptionsToNative(options) : undefined; const results = this.handle.query(vector, k, nativeOpts); + // Map numeric labels back to original string IDs. return results.map((r) => ({ - id: String(r.id), + id: this.labelToId.get(Number(r.id)) ?? String(r.id), distance: r.distance, })); } @@ -144,8 +164,23 @@ class NodeBackend { async delete(ids) { this.ensureHandle(); try { - const numIds = ids.map((id) => Number(id)); + // Resolve string IDs to numeric labels for the N-API layer. + const numIds = ids + .map((id) => this.idToLabel.get(id)) + .filter((label) => label !== undefined); + if (numIds.length === 0) { + return { deleted: 0, epoch: 0 }; + } const result = this.handle.delete(numIds); + // Remove deleted entries from the mapping. + for (const id of ids) { + const label = this.idToLabel.get(id); + if (label !== undefined) { + this.idToLabel.delete(id); + this.labelToId.delete(label); + } + } + await this.saveMappings(); return { deleted: Number(result.deleted), epoch: result.epoch }; } catch (err) { @@ -191,6 +226,7 @@ class NodeBackend { if (!this.handle) return; try { + await this.saveMappings(); this.handle.close(); } catch (err) { @@ -198,6 +234,10 @@ class NodeBackend { } finally { this.handle = null; + this.idToLabel.clear(); + this.labelToId.clear(); + this.nextLabel = 1; + this.storePath = ''; } } async fileId() { @@ -235,6 +275,12 @@ class NodeBackend { const child = new NodeBackend(); child.native = this.native; child.handle = childHandle; + child.storePath = childPath; + // Copy parent mappings to child (COW semantics) + child.idToLabel = new Map(this.idToLabel); + child.labelToId = new Map(this.labelToId); + child.nextLabel = this.nextLabel; + await child.saveMappings(); return child; } catch (err) { @@ -313,6 +359,60 @@ class NodeBackend { throw errors_1.RvfError.fromNative(err); } } + // ─── String ID ↔ Numeric Label mapping helpers ─── + /** + * Get or allocate a numeric label for a string ID. + * If the ID was already seen, returns the existing label. + */ + resolveLabel(id) { + let label = this.idToLabel.get(id); + if (label !== undefined) + return label; + label = this.nextLabel++; + this.idToLabel.set(id, label); + this.labelToId.set(label, id); + return label; + } + /** Path to the sidecar mappings file. */ + mappingsPath() { + return this.storePath ? this.storePath + '.idmap.json' : ''; + } + /** Persist the string↔label mapping to a sidecar JSON file. */ + async saveMappings() { + const mp = this.mappingsPath(); + if (!mp) + return; + try { + const fs = await Promise.resolve().then(() => __importStar(require('fs'))); + const data = JSON.stringify({ + idToLabel: Object.fromEntries(this.idToLabel), + labelToId: Object.fromEntries(Array.from(this.labelToId.entries()).map(([k, v]) => [String(k), v])), + nextLabel: this.nextLabel, + }); + fs.writeFileSync(mp, data, 'utf-8'); + } + catch { + // Non-fatal: mapping persistence is best-effort (e.g. read-only FS). + } + } + /** Load the string↔label mapping from the sidecar JSON file if it exists. */ + async loadMappings() { + const mp = this.mappingsPath(); + if (!mp) + return; + try { + const fs = await Promise.resolve().then(() => __importStar(require('fs'))); + if (!fs.existsSync(mp)) + return; + const raw = JSON.parse(fs.readFileSync(mp, 'utf-8')); + this.idToLabel = new Map(Object.entries(raw.idToLabel ?? {}).map(([k, v]) => [k, Number(v)])); + this.labelToId = new Map(Object.entries(raw.labelToId ?? {}).map(([k, v]) => [Number(k), v])); + this.nextLabel = raw.nextLabel ?? this.idToLabel.size + 1; + } + catch { + // Non-fatal: start with empty mappings. + } + } } exports.NodeBackend = NodeBackend; // --------------------------------------------------------------------------- diff --git a/npm/packages/rvf/dist/backend.js.map b/npm/packages/rvf/dist/backend.js.map index 87037a4c8..274194344 100644 --- a/npm/packages/rvf/dist/backend.js.map +++ b/npm/packages/rvf/dist/backend.js.map @@ -1 +1 @@ -{"version":3,"file":"backend.js","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"backend.js","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/npm/packages/rvf/package.json b/npm/packages/rvf/package.json index 4d304a43d..844c0c3cd 100644 --- a/npm/packages/rvf/package.json +++ b/npm/packages/rvf/package.json @@ -1,6 +1,6 @@ { "name": "@ruvector/rvf", - "version": "0.1.9", + "version": "0.2.0", "description": "RuVector Format — unified TypeScript SDK for vector intelligence", "main": "dist/index.js", "module": "dist/index.js", diff --git a/npm/packages/rvf/src/backend.ts b/npm/packages/rvf/src/backend.ts index 4a26f27a2..0a59409f6 100644 --- a/npm/packages/rvf/src/backend.ts +++ b/npm/packages/rvf/src/backend.ts @@ -79,6 +79,12 @@ export class NodeBackend implements RvfBackend { // eslint-disable-next-line @typescript-eslint/no-explicit-any private handle: any = null; + // String ID <-> Numeric Label mappings (N-API layer requires i64 labels) + private idToLabel: Map = new Map(); + private labelToId: Map = new Map(); + private nextLabel: number = 1; // RVF uses 1-based labels + private storePath: string = ''; + private async loadNative(): Promise { if (this.native) return; try { @@ -105,6 +111,10 @@ export class NodeBackend implements RvfBackend { await this.loadNative(); try { this.handle = await this.native.create(path, mapOptionsToNative(options)); + this.storePath = path; + this.idToLabel.clear(); + this.labelToId.clear(); + this.nextLabel = 1; } catch (err) { throw RvfError.fromNative(err); } @@ -114,6 +124,8 @@ export class NodeBackend implements RvfBackend { await this.loadNative(); try { this.handle = await this.native.open(path); + this.storePath = path; + await this.loadMappings(); } catch (err) { throw RvfError.fromNative(err); } @@ -123,6 +135,8 @@ export class NodeBackend implements RvfBackend { await this.loadNative(); try { this.handle = await this.native.openReadonly(path); + this.storePath = path; + await this.loadMappings(); } catch (err) { throw RvfError.fromNative(err); } @@ -143,8 +157,14 @@ export class NodeBackend implements RvfBackend { const f32 = v instanceof Float32Array ? v : new Float32Array(v); flat.set(f32, i * dim); } - const ids = entries.map((e) => Number(e.id)); + // Map string IDs to numeric labels for the N-API layer. + // The native Rust HNSW expects i64 labels — non-numeric strings cause + // silent data loss (NaN → dropped). We maintain a bidirectional + // string↔label mapping and persist it as a sidecar JSON file. + const ids = entries.map((e) => this.resolveLabel(e.id)); const result = this.handle.ingestBatch(flat, ids); + // Persist mappings after every ingest so they survive crashes. + await this.saveMappings(); return { accepted: Number(result.accepted), rejected: Number(result.rejected), @@ -164,8 +184,9 @@ export class NodeBackend implements RvfBackend { try { const nativeOpts = options ? mapQueryOptionsToNative(options) : undefined; const results = this.handle.query(vector, k, nativeOpts); + // Map numeric labels back to original string IDs. return (results as Array<{ id: number; distance: number }>).map((r) => ({ - id: String(r.id), + id: this.labelToId.get(Number(r.id)) ?? String(r.id), distance: r.distance, })); } catch (err) { @@ -176,8 +197,23 @@ export class NodeBackend implements RvfBackend { async delete(ids: string[]): Promise { this.ensureHandle(); try { - const numIds = ids.map((id) => Number(id)); + // Resolve string IDs to numeric labels for the N-API layer. + const numIds = ids + .map((id) => this.idToLabel.get(id)) + .filter((label): label is number => label !== undefined); + if (numIds.length === 0) { + return { deleted: 0, epoch: 0 }; + } const result = this.handle.delete(numIds); + // Remove deleted entries from the mapping. + for (const id of ids) { + const label = this.idToLabel.get(id); + if (label !== undefined) { + this.idToLabel.delete(id); + this.labelToId.delete(label); + } + } + await this.saveMappings(); return { deleted: Number(result.deleted), epoch: result.epoch }; } catch (err) { throw RvfError.fromNative(err); @@ -222,11 +258,16 @@ export class NodeBackend implements RvfBackend { async close(): Promise { if (!this.handle) return; try { + await this.saveMappings(); this.handle.close(); } catch (err) { throw RvfError.fromNative(err); } finally { this.handle = null; + this.idToLabel.clear(); + this.labelToId.clear(); + this.nextLabel = 1; + this.storePath = ''; } } @@ -265,6 +306,12 @@ export class NodeBackend implements RvfBackend { const child = new NodeBackend(); child.native = this.native; child.handle = childHandle; + child.storePath = childPath; + // Copy parent mappings to child (COW semantics) + child.idToLabel = new Map(this.idToLabel); + child.labelToId = new Map(this.labelToId); + child.nextLabel = this.nextLabel; + await child.saveMappings(); return child; } catch (err) { throw RvfError.fromNative(err); @@ -348,6 +395,65 @@ export class NodeBackend implements RvfBackend { throw RvfError.fromNative(err); } } + + // ─── String ID ↔ Numeric Label mapping helpers ─── + + /** + * Get or allocate a numeric label for a string ID. + * If the ID was already seen, returns the existing label. + */ + private resolveLabel(id: string): number { + let label = this.idToLabel.get(id); + if (label !== undefined) return label; + label = this.nextLabel++; + this.idToLabel.set(id, label); + this.labelToId.set(label, id); + return label; + } + + /** Path to the sidecar mappings file. */ + private mappingsPath(): string { + return this.storePath ? this.storePath + '.idmap.json' : ''; + } + + /** Persist the string↔label mapping to a sidecar JSON file. */ + private async saveMappings(): Promise { + const mp = this.mappingsPath(); + if (!mp) return; + try { + const fs = await import('fs'); + const data = JSON.stringify({ + idToLabel: Object.fromEntries(this.idToLabel), + labelToId: Object.fromEntries( + Array.from(this.labelToId.entries()).map(([k, v]) => [String(k), v]), + ), + nextLabel: this.nextLabel, + }); + fs.writeFileSync(mp, data, 'utf-8'); + } catch { + // Non-fatal: mapping persistence is best-effort (e.g. read-only FS). + } + } + + /** Load the string↔label mapping from the sidecar JSON file if it exists. */ + private async loadMappings(): Promise { + const mp = this.mappingsPath(); + if (!mp) return; + try { + const fs = await import('fs'); + if (!fs.existsSync(mp)) return; + const raw = JSON.parse(fs.readFileSync(mp, 'utf-8')); + this.idToLabel = new Map(Object.entries(raw.idToLabel ?? {}).map( + ([k, v]) => [k, Number(v)], + )); + this.labelToId = new Map( + Object.entries(raw.labelToId ?? {}).map(([k, v]) => [Number(k), v as string]), + ); + this.nextLabel = raw.nextLabel ?? this.idToLabel.size + 1; + } catch { + // Non-fatal: start with empty mappings. + } + } } // --------------------------------------------------------------------------- diff --git a/npm/packages/rvf/tests/test-id-mapping.js b/npm/packages/rvf/tests/test-id-mapping.js new file mode 100644 index 000000000..33a5a178d --- /dev/null +++ b/npm/packages/rvf/tests/test-id-mapping.js @@ -0,0 +1,245 @@ +'use strict'; +/** + * Tests for NodeBackend string ID ↔ numeric label mapping (issue #114 fix). + * + * These tests exercise the mapping logic directly without requiring the + * native @ruvector/rvf-node addon, by using a lightweight mock. + */ + +const assert = require('assert'); +const fs = require('fs'); +const path = require('path'); +const os = require('os'); + +// --------------------------------------------------------------------------- +// Mock the native module so tests work without the N-API addon +// --------------------------------------------------------------------------- +class MockNativeHandle { + constructor() { + this.vectors = new Map(); // label → Float32Array + } + ingestBatch(flat, ids) { + const dim = flat.length / ids.length; + let accepted = 0; + for (let i = 0; i < ids.length; i++) { + const label = ids[i]; + // Mimic native behavior: NaN labels are silently ignored + if (Number.isNaN(label) || label === undefined) continue; + this.vectors.set(label, flat.slice(i * dim, (i + 1) * dim)); + accepted++; + } + return { accepted, rejected: ids.length - accepted, epoch: 1 }; + } + query(vector, k) { + const results = []; + for (const [id, vec] of this.vectors) { + let dist = 0; + for (let i = 0; i < vector.length; i++) dist += (vector[i] - vec[i]) ** 2; + results.push({ id, distance: Math.sqrt(dist) }); + } + results.sort((a, b) => a.distance - b.distance); + return results.slice(0, k); + } + delete(numIds) { + let deleted = 0; + for (const id of numIds) { + if (this.vectors.delete(id)) deleted++; + } + return { deleted, epoch: 1 }; + } + status() { return { total_vectors: this.vectors.size, total_segments: 1, file_size: 0, current_epoch: 0, profile_id: 0, compaction_state: 'idle', dead_space_ratio: 0, read_only: false }; } + close() { this.vectors.clear(); } + dimension() { return 4; } +} + +// --------------------------------------------------------------------------- +// We test NodeBackend by patching its loadNative to use our mock. +// --------------------------------------------------------------------------- +const { NodeBackend } = require('../dist/backend'); + +async function createTestBackend(tmpDir) { + const storePath = path.join(tmpDir, 'test.rvf'); + const backend = new NodeBackend(); + // Patch internals: skip native loading, use mock handle + backend['native'] = { create: () => new MockNativeHandle(), open: () => new MockNativeHandle() }; + backend['handle'] = new MockNativeHandle(); + backend['storePath'] = storePath; + backend['idToLabel'] = new Map(); + backend['labelToId'] = new Map(); + backend['nextLabel'] = 1; + return { backend, storePath }; +} + +// --------------------------------------------------------------------------- +// Tests +// --------------------------------------------------------------------------- +let passed = 0, failed = 0; + +async function test(name, fn) { + const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'rvf-id-test-')); + try { + await fn(tmpDir); + console.log(` PASS ${name}`); + passed++; + } catch (err) { + console.log(` FAIL ${name}: ${err.message}`); + failed++; + } finally { + // Cleanup + try { fs.rmSync(tmpDir, { recursive: true, force: true }); } catch {} + } +} + +(async () => { + console.log('--- NodeBackend ID Mapping (Issue #114) ---'); + + await test('string IDs are mapped to numeric labels', async (tmp) => { + const { backend } = await createTestBackend(tmp); + const vec = new Float32Array([1, 2, 3, 4]); + await backend.ingestBatch([ + { id: 'chunk_0', vector: vec }, + { id: 'uuid-abc-123', vector: vec }, + { id: 'da003664_2b0f6ff3747e', vector: vec }, + ]); + const handle = backend['handle']; + // All 3 should have been accepted (no NaN labels) + assert.strictEqual(handle.vectors.size, 3, `Expected 3 vectors, got ${handle.vectors.size}`); + }); + + await test('numeric labels are sequential starting at 1', async (tmp) => { + const { backend } = await createTestBackend(tmp); + const vec = new Float32Array([1, 2, 3, 4]); + await backend.ingestBatch([ + { id: 'alpha', vector: vec }, + { id: 'beta', vector: vec }, + { id: 'gamma', vector: vec }, + ]); + assert.strictEqual(backend['idToLabel'].get('alpha'), 1); + assert.strictEqual(backend['idToLabel'].get('beta'), 2); + assert.strictEqual(backend['idToLabel'].get('gamma'), 3); + assert.strictEqual(backend['nextLabel'], 4); + }); + + await test('duplicate IDs reuse the same label', async (tmp) => { + const { backend } = await createTestBackend(tmp); + const vec = new Float32Array([1, 2, 3, 4]); + await backend.ingestBatch([{ id: 'dup', vector: vec }]); + await backend.ingestBatch([{ id: 'dup', vector: vec }]); + assert.strictEqual(backend['idToLabel'].get('dup'), 1); + assert.strictEqual(backend['nextLabel'], 2); // Only 1 unique label allocated + }); + + await test('query returns original string IDs, not numeric labels', async (tmp) => { + const { backend } = await createTestBackend(tmp); + await backend.ingestBatch([ + { id: 'doc_hello', vector: new Float32Array([1, 0, 0, 0]) }, + { id: 'doc_world', vector: new Float32Array([0, 1, 0, 0]) }, + ]); + const results = await backend.query(new Float32Array([1, 0, 0, 0]), 2); + const ids = results.map((r) => r.id); + assert.ok(ids.includes('doc_hello'), `Expected doc_hello in results, got ${ids}`); + assert.ok(ids.includes('doc_world'), `Expected doc_world in results, got ${ids}`); + }); + + await test('delete resolves string IDs to labels', async (tmp) => { + const { backend } = await createTestBackend(tmp); + await backend.ingestBatch([ + { id: 'to_keep', vector: new Float32Array([1, 0, 0, 0]) }, + { id: 'to_delete', vector: new Float32Array([0, 1, 0, 0]) }, + ]); + const result = await backend.delete(['to_delete']); + assert.strictEqual(result.deleted, 1); + assert.strictEqual(backend['handle'].vectors.size, 1); + // Mapping should be cleaned up + assert.strictEqual(backend['idToLabel'].has('to_delete'), false); + assert.strictEqual(backend['idToLabel'].has('to_keep'), true); + }); + + await test('delete of unknown ID returns 0', async (tmp) => { + const { backend } = await createTestBackend(tmp); + await backend.ingestBatch([{ id: 'exists', vector: new Float32Array([1, 0, 0, 0]) }]); + const result = await backend.delete(['nonexistent']); + assert.strictEqual(result.deleted, 0); + }); + + await test('mappings are persisted to sidecar JSON file', async (tmp) => { + const { backend, storePath } = await createTestBackend(tmp); + // Create a dummy file so the path directory exists + fs.writeFileSync(storePath, ''); + await backend.ingestBatch([ + { id: 'persist_a', vector: new Float32Array([1, 0, 0, 0]) }, + { id: 'persist_b', vector: new Float32Array([0, 1, 0, 0]) }, + ]); + const mapFile = storePath + '.idmap.json'; + assert.ok(fs.existsSync(mapFile), `Mapping file not created at ${mapFile}`); + const data = JSON.parse(fs.readFileSync(mapFile, 'utf-8')); + assert.strictEqual(data.idToLabel['persist_a'], 1); + assert.strictEqual(data.idToLabel['persist_b'], 2); + assert.strictEqual(data.labelToId['1'], 'persist_a'); + assert.strictEqual(data.labelToId['2'], 'persist_b'); + assert.strictEqual(data.nextLabel, 3); + }); + + await test('mappings are restored from sidecar JSON on open', async (tmp) => { + const storePath = path.join(tmp, 'restore.rvf'); + fs.writeFileSync(storePath, ''); + // Write a sidecar mapping file manually + const mapData = { + idToLabel: { 'restored_x': 10, 'restored_y': 20 }, + labelToId: { '10': 'restored_x', '20': 'restored_y' }, + nextLabel: 21, + }; + fs.writeFileSync(storePath + '.idmap.json', JSON.stringify(mapData)); + + const backend = new NodeBackend(); + backend['native'] = { open: () => new MockNativeHandle() }; + backend['handle'] = new MockNativeHandle(); + backend['storePath'] = storePath; + // Simulate loadMappings + await backend['loadMappings'](); + + assert.strictEqual(backend['idToLabel'].get('restored_x'), 10); + assert.strictEqual(backend['idToLabel'].get('restored_y'), 20); + assert.strictEqual(backend['labelToId'].get(10), 'restored_x'); + assert.strictEqual(backend['labelToId'].get(20), 'restored_y'); + assert.strictEqual(backend['nextLabel'], 21); + }); + + await test('purely numeric string IDs still work correctly', async (tmp) => { + const { backend } = await createTestBackend(tmp); + await backend.ingestBatch([ + { id: '42', vector: new Float32Array([1, 0, 0, 0]) }, + { id: '99', vector: new Float32Array([0, 1, 0, 0]) }, + ]); + // They get mapped labels, not passed through as raw numbers + assert.strictEqual(backend['idToLabel'].get('42'), 1); + assert.strictEqual(backend['idToLabel'].get('99'), 2); + const results = await backend.query(new Float32Array([1, 0, 0, 0]), 2); + const ids = results.map((r) => r.id); + assert.ok(ids.includes('42'), `Expected '42' in results`); + assert.ok(ids.includes('99'), `Expected '99' in results`); + }); + + await test('mixed numeric and string IDs coexist', async (tmp) => { + const { backend } = await createTestBackend(tmp); + await backend.ingestBatch([ + { id: '1', vector: new Float32Array([1, 0, 0, 0]) }, + { id: 'uuid-abc', vector: new Float32Array([0, 1, 0, 0]) }, + { id: '999', vector: new Float32Array([0, 0, 1, 0]) }, + { id: 'chunk_42', vector: new Float32Array([0, 0, 0, 1]) }, + ]); + assert.strictEqual(backend['handle'].vectors.size, 4); + const results = await backend.query(new Float32Array([1, 0, 0, 0]), 4); + const ids = new Set(results.map((r) => r.id)); + assert.ok(ids.has('1')); + assert.ok(ids.has('uuid-abc')); + assert.ok(ids.has('999')); + assert.ok(ids.has('chunk_42')); + }); + + // Print results + console.log(`\n${'='.repeat(60)}`); + console.log(`Results: ${passed} passed, ${failed} failed, ${passed + failed} total`); + console.log('='.repeat(60)); + process.exit(failed > 0 ? 1 : 0); +})();