@dreamlake/dreamdb 0.1.0 → 0.1.2

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.
package/README.md ADDED
@@ -0,0 +1,62 @@
1
+ # @dreamlake/dreamdb
2
+
3
+ TypeScript driver for [DreamDB](https://dreamdb.dreamlake.ai) — a storage and retrieval protocol for multimodal signals anchored to a shared timeline.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install @dreamlake/dreamdb
9
+ ```
10
+
11
+ ## Quick start
12
+
13
+ ```typescript
14
+ import { Dataset, Schema, MemoryBackend } from '@dreamlake/dreamdb'
15
+
16
+ // Define a schema
17
+ const schema = new Schema()
18
+ schema.addEmbedding('embedding', 16)
19
+ schema.addImage('image', 'jpeg')
20
+ schema.addScalarCategorical('label')
21
+
22
+ // Create a dataset (in-memory for testing, or use S3Backend for production)
23
+ const backend = new MemoryBackend()
24
+ const ds = await Dataset.create('my-dataset', schema, backend)
25
+
26
+ // Append samples
27
+ await ds.appendMany([
28
+ { embedding: new Float32Array([...]), image: new Uint8Array([...]), label: 'cat' },
29
+ { embedding: new Float32Array([...]), image: new Uint8Array([...]), label: 'dog' },
30
+ ])
31
+
32
+ // Vector query — find the 5 nearest neighbors
33
+ const batches = await ds.iterVector({
34
+ field: 'embedding',
35
+ query: new Float32Array([...]),
36
+ topK: 5,
37
+ })
38
+ ```
39
+
40
+ ## Browser usage
41
+
42
+ ```typescript
43
+ import { S3Backend, Space } from '@dreamlake/dreamdb'
44
+
45
+ const backend = new S3Backend('https://your-bucket.s3.amazonaws.com')
46
+ const space = new Space(backend)
47
+
48
+ // Resolve a ref to its manifest
49
+ const manifest = await space.resolveRef('my-dataset')
50
+ console.log(manifest.tracks)
51
+ ```
52
+
53
+ ## Documentation
54
+
55
+ - [Installation](https://dreamdb.dreamlake.ai/installation)
56
+ - [TypeScript SDK Reference](https://dreamdb.dreamlake.ai/typescript-sdk)
57
+ - [Protocol Specification](https://dreamdb.dreamlake.ai/spec-overview)
58
+ - [Browser Demo](https://demo.dreamdb.dreamlake.ai)
59
+
60
+ ## License
61
+
62
+ MIT
package/dist/index.cjs CHANGED
@@ -27,6 +27,7 @@ __export(index_exports, {
27
27
  SCALAR_ENCODING_MAP: () => SCALAR_ENCODING_MAP,
28
28
  Schema: () => Schema,
29
29
  Space: () => Space,
30
+ ZERO_SPATIAL_KEY: () => ZERO_SPATIAL_KEY,
30
31
  base32ToBytes: () => base32ToBytes,
31
32
  bitsFromProjections: () => bitsFromProjections,
32
33
  bitsToBase2: () => bitsToBase2,
@@ -376,16 +377,33 @@ var S3Backend = class {
376
377
  return path;
377
378
  }
378
379
  async list(prefix) {
379
- const url = `${this.baseUrl}?list-type=2&prefix=${encodeURIComponent(prefix)}`;
380
- const r = await fetch(url);
381
- if (!r.ok) throw new Error(`LIST ${url}: HTTP ${r.status}`);
382
- const text = await r.text();
383
380
  const keys = [];
384
- const regex = /<Key>([^<]+)<\/Key>/g;
385
- let match;
386
- while ((match = regex.exec(text)) !== null) {
387
- keys.push(match[1]);
388
- }
381
+ let continuationToken;
382
+ do {
383
+ let url = `${this.baseUrl}?list-type=2&prefix=${encodeURIComponent(prefix)}`;
384
+ if (continuationToken) {
385
+ url += `&continuation-token=${encodeURIComponent(continuationToken)}`;
386
+ }
387
+ const r = await fetch(url);
388
+ if (!r.ok) throw new Error(`LIST ${url}: HTTP ${r.status}`);
389
+ const text = await r.text();
390
+ const regex = /<Key>([^<]+)<\/Key>/g;
391
+ let match;
392
+ while ((match = regex.exec(text)) !== null) {
393
+ keys.push(match[1]);
394
+ }
395
+ const truncatedMatch = text.match(/<IsTruncated>(\w+)<\/IsTruncated>/);
396
+ const isTruncated = truncatedMatch?.[1] === "true";
397
+ if (isTruncated) {
398
+ const tokenMatch = text.match(
399
+ /<NextContinuationToken>([^<]+)<\/NextContinuationToken>/
400
+ );
401
+ continuationToken = tokenMatch?.[1];
402
+ if (!continuationToken) break;
403
+ } else {
404
+ continuationToken = void 0;
405
+ }
406
+ } while (continuationToken);
389
407
  return keys;
390
408
  }
391
409
  async delete(path) {
@@ -1365,6 +1383,17 @@ var Space = class _Space {
1365
1383
  }
1366
1384
  };
1367
1385
 
1386
+ // src/types.ts
1387
+ var ZERO_SPATIAL_KEY = "0000000000000000";
1388
+ var SCALAR_ENCODING_MAP = {
1389
+ categorical: "cat",
1390
+ bool: "bool",
1391
+ int: "i64",
1392
+ float: "f64",
1393
+ string: "str",
1394
+ timestamp: "ts"
1395
+ };
1396
+
1368
1397
  // src/dataset.ts
1369
1398
  var Schema = class {
1370
1399
  fields = [];
@@ -1674,7 +1703,7 @@ var Dataset = class _Dataset {
1674
1703
  const fragHash = contentHash(data);
1675
1704
  const fragHashB32 = bytesToBase32(fragHash);
1676
1705
  await this.backend.put(
1677
- `${this._timelineHash}/${modality}/0000000000000000/${fragHashB32}`,
1706
+ `${this._timelineHash}/${modality}/${ZERO_SPATIAL_KEY}/${fragHashB32}`,
1678
1707
  data
1679
1708
  );
1680
1709
  newEntries.push([
@@ -1922,7 +1951,7 @@ var Dataset = class _Dataset {
1922
1951
  const fragHash = bytesToBase32(e[3]);
1923
1952
  try {
1924
1953
  const fragBytes = await this.backend.get(
1925
- `${this._timelineHash}/${bfMod}/0000000000000000/${fragHash}`
1954
+ `${this._timelineHash}/${bfMod}/${ZERO_SPATIAL_KEY}/${fragHash}`
1926
1955
  );
1927
1956
  fieldData.set(tStart, fragBytes);
1928
1957
  } catch {
@@ -2225,16 +2254,6 @@ function schemaFromCbor(obj) {
2225
2254
  }
2226
2255
  return schema;
2227
2256
  }
2228
-
2229
- // src/types.ts
2230
- var SCALAR_ENCODING_MAP = {
2231
- categorical: "cat",
2232
- bool: "bool",
2233
- int: "i64",
2234
- float: "f64",
2235
- string: "str",
2236
- timestamp: "ts"
2237
- };
2238
2257
  // Annotate the CommonJS export names for ESM import in node:
2239
2258
  0 && (module.exports = {
2240
2259
  Dataset,
@@ -2244,6 +2263,7 @@ var SCALAR_ENCODING_MAP = {
2244
2263
  SCALAR_ENCODING_MAP,
2245
2264
  Schema,
2246
2265
  Space,
2266
+ ZERO_SPATIAL_KEY,
2247
2267
  base32ToBytes,
2248
2268
  bitsFromProjections,
2249
2269
  bitsToBase2,
@@ -2268,4 +2288,3 @@ var SCALAR_ENCODING_MAP = {
2268
2288
  projectionsLshCosine,
2269
2289
  scalarModalityFragment
2270
2290
  });
2271
- //# sourceMappingURL=index.cjs.map
package/dist/index.d.cts CHANGED
@@ -4,6 +4,10 @@ type MultihashBytes = Uint8Array;
4
4
  type Base32Hash = string;
5
5
  /** Nanoseconds since UNIX epoch — the join key across all modalities. */
6
6
  type TimeAnchor = number;
7
+ /** The spatial key for non-spatial data (images, video, JSON, scalars).
8
+ * 8 zero bytes in hex — used as the path segment between modality and hash
9
+ * for any track that isn't spatially indexed by an embedding vector. */
10
+ declare const ZERO_SPATIAL_KEY = "0000000000000000";
7
11
  type FieldKind = "image" | "audio" | "video" | "embedding" | "scalar";
8
12
  type ScalarValueType = "categorical" | "bool" | "int" | "float" | "string" | "timestamp";
9
13
  interface ImageFieldDef {
@@ -495,4 +499,4 @@ declare class Dataset {
495
499
  private _resolveScalarLabels;
496
500
  }
497
501
 
498
- export { type AudioFieldDef, type Backend, type BackendGetOptions, type BackendPutOptions, type Base32Hash, type Batch, type BucketRecord, type CborValue, type ChaCha20Stream, Dataset, type DatasetInfo, type EmbeddingFieldDef, type FieldDef, type FieldKind, type HistoryEntry, type ImageFieldDef, MULTIHASH_BYTES, type Manifest, type ManifestTrack, MemoryBackend, type MultihashBytes, type ParsedSpaceUri, type QueryStats, type RegistryEntry, type ResolvedTrack, S3Backend, SCALAR_ENCODING_MAP, type Sample, type SampleValue, type ScalarFieldDef, type ScalarValueType, Schema, type SnapshotInfo, Space, type SpaceOptions, type SpatialDispatcher, type TimeAnchor, type VectorCompressorDecoder, type VectorQueryOptions, type VectorQueryResult, type VideoFieldDef, type WhereClause, base32ToBytes, bitsFromProjections, bitsToBase2, buildPqCosineDecoder, buildRabitqCosineDecoder, bytesToBase32, chacha20Stream, decodeBucketAnchorsOnly, decodeBucketRecords, decodeCbor, deriveHyperplanesLshCosine, deriveRotationMatrix, dotF32, dotL2Normalized, encodeCbor, modalityForField, multiProbeKeys, normalizeL2, normalizeL2F32, parseSpaceUri, peekBucketHeader, projectionsLshCosine, scalarModalityFragment };
502
+ export { type AudioFieldDef, type Backend, type BackendGetOptions, type BackendPutOptions, type Base32Hash, type Batch, type BucketRecord, type CborValue, type ChaCha20Stream, Dataset, type DatasetInfo, type EmbeddingFieldDef, type FieldDef, type FieldKind, type HistoryEntry, type ImageFieldDef, MULTIHASH_BYTES, type Manifest, type ManifestTrack, MemoryBackend, type MultihashBytes, type ParsedSpaceUri, type QueryStats, type RegistryEntry, type ResolvedTrack, S3Backend, SCALAR_ENCODING_MAP, type Sample, type SampleValue, type ScalarFieldDef, type ScalarValueType, Schema, type SnapshotInfo, Space, type SpaceOptions, type SpatialDispatcher, type TimeAnchor, type VectorCompressorDecoder, type VectorQueryOptions, type VectorQueryResult, type VideoFieldDef, type WhereClause, ZERO_SPATIAL_KEY, base32ToBytes, bitsFromProjections, bitsToBase2, buildPqCosineDecoder, buildRabitqCosineDecoder, bytesToBase32, chacha20Stream, decodeBucketAnchorsOnly, decodeBucketRecords, decodeCbor, deriveHyperplanesLshCosine, deriveRotationMatrix, dotF32, dotL2Normalized, encodeCbor, modalityForField, multiProbeKeys, normalizeL2, normalizeL2F32, parseSpaceUri, peekBucketHeader, projectionsLshCosine, scalarModalityFragment };
package/dist/index.d.ts CHANGED
@@ -4,6 +4,10 @@ type MultihashBytes = Uint8Array;
4
4
  type Base32Hash = string;
5
5
  /** Nanoseconds since UNIX epoch — the join key across all modalities. */
6
6
  type TimeAnchor = number;
7
+ /** The spatial key for non-spatial data (images, video, JSON, scalars).
8
+ * 8 zero bytes in hex — used as the path segment between modality and hash
9
+ * for any track that isn't spatially indexed by an embedding vector. */
10
+ declare const ZERO_SPATIAL_KEY = "0000000000000000";
7
11
  type FieldKind = "image" | "audio" | "video" | "embedding" | "scalar";
8
12
  type ScalarValueType = "categorical" | "bool" | "int" | "float" | "string" | "timestamp";
9
13
  interface ImageFieldDef {
@@ -495,4 +499,4 @@ declare class Dataset {
495
499
  private _resolveScalarLabels;
496
500
  }
497
501
 
498
- export { type AudioFieldDef, type Backend, type BackendGetOptions, type BackendPutOptions, type Base32Hash, type Batch, type BucketRecord, type CborValue, type ChaCha20Stream, Dataset, type DatasetInfo, type EmbeddingFieldDef, type FieldDef, type FieldKind, type HistoryEntry, type ImageFieldDef, MULTIHASH_BYTES, type Manifest, type ManifestTrack, MemoryBackend, type MultihashBytes, type ParsedSpaceUri, type QueryStats, type RegistryEntry, type ResolvedTrack, S3Backend, SCALAR_ENCODING_MAP, type Sample, type SampleValue, type ScalarFieldDef, type ScalarValueType, Schema, type SnapshotInfo, Space, type SpaceOptions, type SpatialDispatcher, type TimeAnchor, type VectorCompressorDecoder, type VectorQueryOptions, type VectorQueryResult, type VideoFieldDef, type WhereClause, base32ToBytes, bitsFromProjections, bitsToBase2, buildPqCosineDecoder, buildRabitqCosineDecoder, bytesToBase32, chacha20Stream, decodeBucketAnchorsOnly, decodeBucketRecords, decodeCbor, deriveHyperplanesLshCosine, deriveRotationMatrix, dotF32, dotL2Normalized, encodeCbor, modalityForField, multiProbeKeys, normalizeL2, normalizeL2F32, parseSpaceUri, peekBucketHeader, projectionsLshCosine, scalarModalityFragment };
502
+ export { type AudioFieldDef, type Backend, type BackendGetOptions, type BackendPutOptions, type Base32Hash, type Batch, type BucketRecord, type CborValue, type ChaCha20Stream, Dataset, type DatasetInfo, type EmbeddingFieldDef, type FieldDef, type FieldKind, type HistoryEntry, type ImageFieldDef, MULTIHASH_BYTES, type Manifest, type ManifestTrack, MemoryBackend, type MultihashBytes, type ParsedSpaceUri, type QueryStats, type RegistryEntry, type ResolvedTrack, S3Backend, SCALAR_ENCODING_MAP, type Sample, type SampleValue, type ScalarFieldDef, type ScalarValueType, Schema, type SnapshotInfo, Space, type SpaceOptions, type SpatialDispatcher, type TimeAnchor, type VectorCompressorDecoder, type VectorQueryOptions, type VectorQueryResult, type VideoFieldDef, type WhereClause, ZERO_SPATIAL_KEY, base32ToBytes, bitsFromProjections, bitsToBase2, buildPqCosineDecoder, buildRabitqCosineDecoder, bytesToBase32, chacha20Stream, decodeBucketAnchorsOnly, decodeBucketRecords, decodeCbor, deriveHyperplanesLshCosine, deriveRotationMatrix, dotF32, dotL2Normalized, encodeCbor, modalityForField, multiProbeKeys, normalizeL2, normalizeL2F32, parseSpaceUri, peekBucketHeader, projectionsLshCosine, scalarModalityFragment };
package/dist/index.js CHANGED
@@ -321,16 +321,33 @@ var S3Backend = class {
321
321
  return path;
322
322
  }
323
323
  async list(prefix) {
324
- const url = `${this.baseUrl}?list-type=2&prefix=${encodeURIComponent(prefix)}`;
325
- const r = await fetch(url);
326
- if (!r.ok) throw new Error(`LIST ${url}: HTTP ${r.status}`);
327
- const text = await r.text();
328
324
  const keys = [];
329
- const regex = /<Key>([^<]+)<\/Key>/g;
330
- let match;
331
- while ((match = regex.exec(text)) !== null) {
332
- keys.push(match[1]);
333
- }
325
+ let continuationToken;
326
+ do {
327
+ let url = `${this.baseUrl}?list-type=2&prefix=${encodeURIComponent(prefix)}`;
328
+ if (continuationToken) {
329
+ url += `&continuation-token=${encodeURIComponent(continuationToken)}`;
330
+ }
331
+ const r = await fetch(url);
332
+ if (!r.ok) throw new Error(`LIST ${url}: HTTP ${r.status}`);
333
+ const text = await r.text();
334
+ const regex = /<Key>([^<]+)<\/Key>/g;
335
+ let match;
336
+ while ((match = regex.exec(text)) !== null) {
337
+ keys.push(match[1]);
338
+ }
339
+ const truncatedMatch = text.match(/<IsTruncated>(\w+)<\/IsTruncated>/);
340
+ const isTruncated = truncatedMatch?.[1] === "true";
341
+ if (isTruncated) {
342
+ const tokenMatch = text.match(
343
+ /<NextContinuationToken>([^<]+)<\/NextContinuationToken>/
344
+ );
345
+ continuationToken = tokenMatch?.[1];
346
+ if (!continuationToken) break;
347
+ } else {
348
+ continuationToken = void 0;
349
+ }
350
+ } while (continuationToken);
334
351
  return keys;
335
352
  }
336
353
  async delete(path) {
@@ -1310,6 +1327,17 @@ var Space = class _Space {
1310
1327
  }
1311
1328
  };
1312
1329
 
1330
+ // src/types.ts
1331
+ var ZERO_SPATIAL_KEY = "0000000000000000";
1332
+ var SCALAR_ENCODING_MAP = {
1333
+ categorical: "cat",
1334
+ bool: "bool",
1335
+ int: "i64",
1336
+ float: "f64",
1337
+ string: "str",
1338
+ timestamp: "ts"
1339
+ };
1340
+
1313
1341
  // src/dataset.ts
1314
1342
  var Schema = class {
1315
1343
  fields = [];
@@ -1619,7 +1647,7 @@ var Dataset = class _Dataset {
1619
1647
  const fragHash = contentHash(data);
1620
1648
  const fragHashB32 = bytesToBase32(fragHash);
1621
1649
  await this.backend.put(
1622
- `${this._timelineHash}/${modality}/0000000000000000/${fragHashB32}`,
1650
+ `${this._timelineHash}/${modality}/${ZERO_SPATIAL_KEY}/${fragHashB32}`,
1623
1651
  data
1624
1652
  );
1625
1653
  newEntries.push([
@@ -1867,7 +1895,7 @@ var Dataset = class _Dataset {
1867
1895
  const fragHash = bytesToBase32(e[3]);
1868
1896
  try {
1869
1897
  const fragBytes = await this.backend.get(
1870
- `${this._timelineHash}/${bfMod}/0000000000000000/${fragHash}`
1898
+ `${this._timelineHash}/${bfMod}/${ZERO_SPATIAL_KEY}/${fragHash}`
1871
1899
  );
1872
1900
  fieldData.set(tStart, fragBytes);
1873
1901
  } catch {
@@ -2170,16 +2198,6 @@ function schemaFromCbor(obj) {
2170
2198
  }
2171
2199
  return schema;
2172
2200
  }
2173
-
2174
- // src/types.ts
2175
- var SCALAR_ENCODING_MAP = {
2176
- categorical: "cat",
2177
- bool: "bool",
2178
- int: "i64",
2179
- float: "f64",
2180
- string: "str",
2181
- timestamp: "ts"
2182
- };
2183
2201
  export {
2184
2202
  Dataset,
2185
2203
  MULTIHASH_BYTES,
@@ -2188,6 +2206,7 @@ export {
2188
2206
  SCALAR_ENCODING_MAP,
2189
2207
  Schema,
2190
2208
  Space,
2209
+ ZERO_SPATIAL_KEY,
2191
2210
  base32ToBytes,
2192
2211
  bitsFromProjections,
2193
2212
  bitsToBase2,
@@ -2212,4 +2231,3 @@ export {
2212
2231
  projectionsLshCosine,
2213
2232
  scalarModalityFragment
2214
2233
  };
2215
- //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dreamlake/dreamdb",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "TypeScript protocol SDK for DreamDB — multimodal versioned data lake",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/index.ts","../src/cbor.ts","../src/uri.ts","../src/backend.ts","../src/query.ts","../src/space.ts","../src/dataset.ts","../src/types.ts"],"sourcesContent":["/**\n * @dreamlake/dreamdb — TypeScript protocol SDK for DreamDB\n *\n * Multimodal versioned data lake for ML training.\n */\n\n// ---- CBOR ----\nexport { decodeCbor, encodeCbor } from \"./cbor.js\";\n\n// ---- URI + Base32 ----\nexport {\n bytesToBase32,\n base32ToBytes,\n parseSpaceUri,\n modalityForField,\n scalarModalityFragment,\n MULTIHASH_BYTES,\n} from \"./uri.js\";\nexport type { ParsedSpaceUri } from \"./uri.js\";\n\n// ---- Backend ----\nexport { S3Backend, MemoryBackend } from \"./backend.js\";\n\n// ---- Space (read-side protocol) ----\nexport { Space } from \"./space.js\";\nexport type { SpaceOptions } from \"./space.js\";\n\n// ---- Query primitives ----\nexport {\n normalizeL2F32,\n normalizeL2,\n dotF32,\n dotL2Normalized,\n chacha20Stream,\n deriveHyperplanesLshCosine,\n projectionsLshCosine,\n multiProbeKeys,\n bitsFromProjections,\n bitsToBase2,\n deriveRotationMatrix,\n buildPqCosineDecoder,\n buildRabitqCosineDecoder,\n decodeBucketRecords,\n decodeBucketAnchorsOnly,\n peekBucketHeader,\n} from \"./query.js\";\nexport type { ChaCha20Stream } from \"./query.js\";\n\n// ---- Dataset (high-level API) ----\nexport { Schema, Dataset } from \"./dataset.js\";\n\n// ---- Types ----\nexport type {\n MultihashBytes,\n Base32Hash,\n TimeAnchor,\n FieldKind,\n ScalarValueType,\n FieldDef,\n ImageFieldDef,\n AudioFieldDef,\n VideoFieldDef,\n EmbeddingFieldDef,\n ScalarFieldDef,\n ManifestTrack,\n Manifest,\n RegistryEntry,\n ResolvedTrack,\n VectorQueryOptions,\n VectorQueryResult,\n QueryStats,\n HistoryEntry,\n Batch,\n Backend,\n BackendGetOptions,\n BackendPutOptions,\n Sample,\n SampleValue,\n DatasetInfo,\n SnapshotInfo,\n WhereClause,\n SpatialDispatcher,\n VectorCompressorDecoder,\n BucketRecord,\n CborValue,\n} from \"./types.js\";\n\nexport { SCALAR_ENCODING_MAP } from \"./types.js\";\n","/**\n * CBOR decoder — handles the exact DreamDB/Vortex subset:\n * Major type 0: unsigned integers (u8/u16/u32/u64)\n * Major type 1: negative integers\n * Major type 2: byte strings\n * Major type 3: text strings\n * Major type 4: arrays\n * Major type 5: maps\n * Major type 7: simple values (false, true, null, undefined) + IEEE-754 floats\n *\n * Port of the hand-rolled decoder from demo/dreamdb.js.\n */\n\nimport type { CborValue } from \"./types.js\";\n\n/** Decode a single CBOR value from the front of `bytes`. */\nexport function decodeCbor(bytes: Uint8Array): CborValue {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const r = { off: 0 };\n return readValue(view, bytes, r);\n}\n\n/**\n * Encode a CBOR value. Supports the same subset the decoder handles:\n * unsigned ints, negative ints, byte strings, text strings, arrays,\n * maps, booleans, null, undefined, and f64 floats.\n */\nexport function encodeCbor(value: CborValue): Uint8Array {\n const parts: Uint8Array[] = [];\n encodeValue(value, parts);\n // Concatenate all parts\n let totalLen = 0;\n for (const p of parts) totalLen += p.length;\n const out = new Uint8Array(totalLen);\n let off = 0;\n for (const p of parts) {\n out.set(p, off);\n off += p.length;\n }\n return out;\n}\n\nfunction encodeValue(value: CborValue, parts: Uint8Array[]): void {\n if (value === null) {\n parts.push(new Uint8Array([0xf6])); // major 7, ai 22\n return;\n }\n if (value === undefined) {\n parts.push(new Uint8Array([0xf7])); // major 7, ai 23\n return;\n }\n if (value === true) {\n parts.push(new Uint8Array([0xf5])); // major 7, ai 21\n return;\n }\n if (value === false) {\n parts.push(new Uint8Array([0xf4])); // major 7, ai 20\n return;\n }\n if (typeof value === \"number\") {\n if (Number.isInteger(value) && value >= 0 && value <= Number.MAX_SAFE_INTEGER) {\n encodeUint(0, value, parts);\n } else if (Number.isInteger(value) && value < 0 && value >= -Number.MAX_SAFE_INTEGER) {\n encodeUint(1, -1 - value, parts);\n } else {\n // f64\n const buf = new Uint8Array(9);\n buf[0] = 0xfb; // major 7, ai 27\n const dv = new DataView(buf.buffer);\n dv.setFloat64(1, value);\n parts.push(buf);\n }\n return;\n }\n if (typeof value === \"bigint\") {\n if (value >= 0n) {\n encodeUint64(0, value, parts);\n } else {\n encodeUint64(1, -1n - value, parts);\n }\n return;\n }\n if (typeof value === \"string\") {\n const encoded = new TextEncoder().encode(value);\n encodeUint(3, encoded.length, parts);\n parts.push(encoded);\n return;\n }\n if (value instanceof Uint8Array) {\n encodeUint(2, value.length, parts);\n parts.push(new Uint8Array(value));\n return;\n }\n if (Array.isArray(value)) {\n encodeUint(4, value.length, parts);\n for (const item of value) {\n encodeValue(item, parts);\n }\n return;\n }\n if (typeof value === \"object\") {\n const keys = Object.keys(value);\n encodeUint(5, keys.length, parts);\n for (const k of keys) {\n encodeValue(k, parts);\n encodeValue((value as Record<string, CborValue>)[k], parts);\n }\n return;\n }\n}\n\nfunction encodeUint(majorType: number, n: number, parts: Uint8Array[]): void {\n const mt = majorType << 5;\n if (n < 24) {\n parts.push(new Uint8Array([mt | n]));\n } else if (n < 0x100) {\n parts.push(new Uint8Array([mt | 24, n]));\n } else if (n < 0x10000) {\n const buf = new Uint8Array(3);\n buf[0] = mt | 25;\n buf[1] = (n >> 8) & 0xff;\n buf[2] = n & 0xff;\n parts.push(buf);\n } else if (n < 0x100000000) {\n const buf = new Uint8Array(5);\n buf[0] = mt | 26;\n const dv = new DataView(buf.buffer);\n dv.setUint32(1, n);\n parts.push(buf);\n } else {\n encodeUint64(majorType, BigInt(n), parts);\n }\n}\n\nfunction encodeUint64(majorType: number, n: bigint, parts: Uint8Array[]): void {\n const mt = majorType << 5;\n const buf = new Uint8Array(9);\n buf[0] = mt | 27;\n const dv = new DataView(buf.buffer);\n dv.setBigUint64(1, n);\n parts.push(buf);\n}\n\n// ---- internal decoder ----\n\ninterface ReadPos {\n off: number;\n}\n\nfunction readValue(view: DataView, bytes: Uint8Array, r: ReadPos): CborValue {\n const ib = bytes[r.off++];\n const mt = ib >> 5;\n const ai = ib & 0x1f;\n const arg = readArg(view, bytes, r, ai);\n\n switch (mt) {\n case 0:\n // Unsigned integer\n return typeof arg === \"bigint\" ? (arg <= BigInt(Number.MAX_SAFE_INTEGER) ? Number(arg) : arg) : arg;\n case 1:\n // Negative integer\n if (typeof arg === \"bigint\") {\n const val = -1n - arg;\n return val >= BigInt(Number.MIN_SAFE_INTEGER) ? Number(val) : val;\n }\n return -1 - Number(arg);\n case 2: {\n // Byte string\n const len = Number(arg);\n const out = bytes.slice(r.off, r.off + len);\n r.off += len;\n return out;\n }\n case 3: {\n // Text string\n const len = Number(arg);\n const sl = bytes.subarray(r.off, r.off + len);\n r.off += len;\n return new TextDecoder().decode(sl);\n }\n case 4: {\n // Array\n const len = Number(arg);\n const arr: CborValue[] = [];\n for (let i = 0; i < len; i++) arr.push(readValue(view, bytes, r));\n return arr;\n }\n case 5: {\n // Map\n const len = Number(arg);\n const obj: Record<string, CborValue> = {};\n for (let i = 0; i < len; i++) {\n const k = readValue(view, bytes, r);\n const v = readValue(view, bytes, r);\n obj[String(k)] = v;\n }\n return obj;\n }\n case 7: {\n // Simple values + IEEE-754 floats\n if (ai === 20) return false;\n if (ai === 21) return true;\n if (ai === 22) return null;\n if (ai === 23) return undefined;\n if (ai === 26) return view.getFloat32(r.off - 4);\n if (ai === 27) return view.getFloat64(r.off - 8);\n if (ai === 25) {\n // Half-float (binary16)\n const raw = Number(arg);\n const sign = (raw >> 15) & 0x1;\n const exp = (raw >> 10) & 0x1f;\n const frac = raw & 0x3ff;\n let val: number;\n if (exp === 0) {\n val = frac === 0 ? 0 : Math.pow(2, -24) * frac;\n } else if (exp === 31) {\n val = frac === 0 ? Infinity : NaN;\n } else {\n val = Math.pow(2, exp - 25) * (1024 + frac);\n }\n return sign ? -val : val;\n }\n throw new Error(`CBOR simple ${ai} not supported`);\n }\n default:\n throw new Error(`CBOR major type ${mt} not supported`);\n }\n}\n\nfunction readArg(\n view: DataView,\n bytes: Uint8Array,\n r: ReadPos,\n ai: number,\n): number | bigint {\n if (ai < 24) return ai;\n if (ai === 24) return bytes[r.off++];\n if (ai === 25) {\n const v = view.getUint16(r.off);\n r.off += 2;\n return v;\n }\n if (ai === 26) {\n const v = view.getUint32(r.off);\n r.off += 4;\n return v;\n }\n if (ai === 27) {\n const v = view.getBigUint64(r.off);\n r.off += 8;\n return v;\n }\n throw new Error(`CBOR additional-info ${ai} not supported`);\n}\n","/**\n * DreamDB URI parsing and Base32 encoding/decoding.\n *\n * A \"DreamDB Space URI\" is the absolute HTTP URL of either a `refs/<name>`\n * or `manifests/<hash>` Object on the connector backend:\n *\n * http://localhost:9000/ucf101-mp4/refs/ucf101-mp4\n * http://localhost:9000/ucf101-mp4/manifests/dytslnbcty5b...\n */\n\nimport type { Base32Hash, MultihashBytes } from \"./types.js\";\n\nexport const MULTIHASH_BYTES = 33;\n\nconst BASE32_ALPHABET = \"abcdefghijklmnopqrstuvwxyz234567\";\n\n// Build reverse lookup for decoding\nconst BASE32_DECODE_MAP = new Map<string, number>();\nfor (let i = 0; i < BASE32_ALPHABET.length; i++) {\n BASE32_DECODE_MAP.set(BASE32_ALPHABET[i], i);\n}\n\n/** Encode raw bytes to lowercase base32 (RFC 4648, no padding). */\nexport function bytesToBase32(bytes: Uint8Array): Base32Hash {\n let bits = 0;\n let value = 0;\n let out = \"\";\n for (const b of bytes) {\n value = (value << 8) | b;\n bits += 8;\n while (bits >= 5) {\n bits -= 5;\n out += BASE32_ALPHABET[(value >> bits) & 0x1f];\n }\n }\n if (bits > 0) out += BASE32_ALPHABET[(value << (5 - bits)) & 0x1f];\n return out;\n}\n\n/** Decode a base32 string back to raw bytes. */\nexport function base32ToBytes(str: string): Uint8Array {\n const lower = str.toLowerCase();\n let bits = 0;\n let value = 0;\n const out: number[] = [];\n for (const ch of lower) {\n const v = BASE32_DECODE_MAP.get(ch);\n if (v === undefined) throw new Error(`Invalid base32 character: '${ch}'`);\n value = (value << 5) | v;\n bits += 5;\n while (bits >= 8) {\n bits -= 8;\n out.push((value >> bits) & 0xff);\n }\n }\n return new Uint8Array(out);\n}\n\n// ---- Space URI parsing ----\n\nexport interface ParsedSpaceUri {\n connectorBase: string;\n kind: \"ref\" | \"manifest\";\n id: string;\n}\n\n/**\n * Split a Space URI into { connectorBase, kind, id }.\n *\n * \"https://host/bucket/refs/foo\" → { connectorBase: \"https://host/bucket\", kind: \"ref\", id: \"foo\" }\n * \"https://host/bucket/manifests/dXYZ\" → { connectorBase: \"https://host/bucket\", kind: \"manifest\", id: \"dXYZ\" }\n */\nexport function parseSpaceUri(uri: string): ParsedSpaceUri {\n const u = new URL(uri);\n const parts = u.pathname.replace(/^\\/+/, \"\").split(\"/\");\n if (parts.length < 2) {\n throw new Error(\n `Space URI missing /refs/<name> or /manifests/<hash> suffix: ${uri}`,\n );\n }\n const id = parts.pop()!;\n const marker = parts.pop()!;\n\n let kind: \"ref\" | \"manifest\";\n if (marker === \"refs\") kind = \"ref\";\n else if (marker === \"manifests\") kind = \"manifest\";\n else\n throw new Error(\n `Space URI: expected /refs/ or /manifests/, got /${marker}/: ${uri}`,\n );\n\n const connectorBase = `${u.origin}/${parts.join(\"/\")}`.replace(/\\/$/, \"\");\n return { connectorBase, kind, id };\n}\n\n// ---- Modality helpers ----\n\n/** Map a scalar value_type to its modality encoding fragment. */\nexport function scalarModalityFragment(valueType: string): string {\n const map: Record<string, string> = {\n categorical: \"cat\",\n bool: \"bool\",\n int: \"i64\",\n float: \"f64\",\n string: \"str\",\n timestamp: \"ts\",\n };\n return map[valueType.toLowerCase()] || \"str\";\n}\n\n/**\n * Given a Schema field definition, compute the expected Track modality string.\n * Mirrors `scalar_modality_for` in dreamdb-dataset/src/dataset/util.rs.\n */\nexport function modalityForField(field: {\n kind: string;\n mime?: string;\n dim?: number;\n name?: string;\n value_type?: string;\n valueType?: string;\n}): string | null {\n if (field.kind === \"image\") return `image.${field.mime}`;\n if (field.kind === \"video\") return `video.${field.mime}`;\n if (field.kind === \"audio\") return `audio.${field.mime}`;\n if (field.kind === \"embedding\") return `embedding.f32.dim=${field.dim}.bucketed`;\n if (field.kind === \"scalar\") {\n const vt = field.value_type || field.valueType || \"str\";\n const enc = scalarModalityFragment(vt);\n return `scalar.${enc}.field=${field.name}`;\n }\n return null;\n}\n","/**\n * Backend implementations for DreamDB storage.\n *\n * - S3Backend: fetch-based HTTP backend for S3-compatible storage (MinIO, R2, etc.)\n * - MemoryBackend: in-process Map-based backend for tests and ephemeral use\n */\n\nimport type { Backend, BackendGetOptions, BackendPutOptions } from \"./types.js\";\n\n// ---- S3-compatible HTTP backend ----\n\n/**\n * S3Backend talks to an S3-compatible HTTP endpoint via `fetch`.\n * Works in both browser and Node 18+.\n *\n * The `baseUrl` is the connector base URL, e.g. \"http://localhost:9000/my-bucket\".\n * All paths are joined relative to this base.\n */\nexport class S3Backend implements Backend {\n readonly baseUrl: string;\n\n constructor(baseUrl: string) {\n // Strip trailing slash\n this.baseUrl = baseUrl.replace(/\\/+$/, \"\");\n }\n\n async get(path: string, opts?: BackendGetOptions): Promise<Uint8Array> {\n const url = `${this.baseUrl}/${path}`;\n const fetchOpts: RequestInit = {};\n if (opts?.noCache) {\n fetchOpts.cache = \"no-store\";\n }\n const r = await fetch(url, fetchOpts);\n if (!r.ok) throw new Error(`GET ${url}: HTTP ${r.status}`);\n return new Uint8Array(await r.arrayBuffer());\n }\n\n async put(\n path: string,\n data: Uint8Array,\n opts?: BackendPutOptions,\n ): Promise<string> {\n const url = `${this.baseUrl}/${path}`;\n const headers: Record<string, string> = {};\n if (opts?.contentType) {\n headers[\"Content-Type\"] = opts.contentType;\n } else {\n headers[\"Content-Type\"] = \"application/octet-stream\";\n }\n const r = await fetch(url, {\n method: \"PUT\",\n headers,\n body: data as unknown as BodyInit,\n });\n if (!r.ok) throw new Error(`PUT ${url}: HTTP ${r.status}`);\n return path;\n }\n\n async list(prefix: string): Promise<string[]> {\n // S3 ListObjectsV2 — simplified. For MinIO/S3, we do a GET with\n // ?list-type=2&prefix=... and parse the XML response.\n const url = `${this.baseUrl}?list-type=2&prefix=${encodeURIComponent(prefix)}`;\n const r = await fetch(url);\n if (!r.ok) throw new Error(`LIST ${url}: HTTP ${r.status}`);\n const text = await r.text();\n // Parse <Key> elements from the XML response\n const keys: string[] = [];\n const regex = /<Key>([^<]+)<\\/Key>/g;\n let match: RegExpExecArray | null;\n while ((match = regex.exec(text)) !== null) {\n keys.push(match[1]);\n }\n return keys;\n }\n\n async delete(path: string): Promise<void> {\n const url = `${this.baseUrl}/${path}`;\n const r = await fetch(url, { method: \"DELETE\" });\n if (!r.ok) throw new Error(`DELETE ${url}: HTTP ${r.status}`);\n }\n}\n\n// ---- In-memory backend ----\n\n/**\n * MemoryBackend stores all Objects in a Map<string, Uint8Array>.\n * Useful for tests and ephemeral datasets.\n */\nexport class MemoryBackend implements Backend {\n private store = new Map<string, Uint8Array>();\n\n async get(path: string, _opts?: BackendGetOptions): Promise<Uint8Array> {\n const data = this.store.get(path);\n if (!data) throw new Error(`MemoryBackend: key not found: ${path}`);\n return data;\n }\n\n async put(\n path: string,\n data: Uint8Array,\n _opts?: BackendPutOptions,\n ): Promise<string> {\n this.store.set(path, new Uint8Array(data));\n return path;\n }\n\n async list(prefix: string): Promise<string[]> {\n const keys: string[] = [];\n for (const k of this.store.keys()) {\n if (k.startsWith(prefix)) keys.push(k);\n }\n return keys.sort();\n }\n\n async delete(path: string): Promise<void> {\n this.store.delete(path);\n }\n\n /** Check whether a key exists. */\n has(path: string): boolean {\n return this.store.has(path);\n }\n\n /** Get the number of stored objects. */\n get size(): number {\n return this.store.size;\n }\n\n /** Clear all stored objects. */\n clear(): void {\n this.store.clear();\n }\n}\n","/**\n * Vector query, LSH dispatch, IVF dispatch, ChaCha20 hyperplane derivation,\n * PQ/RaBitQ decode + rerank.\n *\n * Port of the spatial-indexing and vector-scoring logic from demo/dreamdb.js.\n */\n\nimport type {\n BucketRecord,\n SpatialDispatcher,\n VectorCompressorDecoder,\n CborValue,\n} from \"./types.js\";\nimport { decodeCbor } from \"./cbor.js\";\n\n// ---- ChaCha20 keystream (RFC 8439) ----\n\nconst U32 = 0xffffffff;\n\nfunction rotl(a: number, b: number): number {\n return ((a << b) | (a >>> (32 - b))) >>> 0;\n}\n\nfunction add32(a: number, b: number): number {\n return (a + b) >>> 0;\n}\n\nfunction quarterRound(s: Uint32Array, ai: number, bi: number, ci: number, di: number): void {\n s[ai] = add32(s[ai], s[bi]); s[di] = rotl(s[di] ^ s[ai], 16);\n s[ci] = add32(s[ci], s[di]); s[bi] = rotl(s[bi] ^ s[ci], 12);\n s[ai] = add32(s[ai], s[bi]); s[di] = rotl(s[di] ^ s[ai], 8);\n s[ci] = add32(s[ci], s[di]); s[bi] = rotl(s[bi] ^ s[ci], 7);\n}\n\nfunction chacha20Block(keyU32: Uint32Array, nonceU32: Uint32Array, counter: number): Uint8Array {\n const s = new Uint32Array(16);\n s[0] = 0x61707865; s[1] = 0x3320646e; s[2] = 0x79622d32; s[3] = 0x6b206574;\n for (let i = 0; i < 8; i++) s[4 + i] = keyU32[i];\n s[12] = counter >>> 0;\n s[13] = nonceU32[0]; s[14] = nonceU32[1]; s[15] = nonceU32[2];\n const ws = new Uint32Array(s);\n for (let i = 0; i < 10; i++) {\n quarterRound(ws, 0, 4, 8, 12);\n quarterRound(ws, 1, 5, 9, 13);\n quarterRound(ws, 2, 6, 10, 14);\n quarterRound(ws, 3, 7, 11, 15);\n quarterRound(ws, 0, 5, 10, 15);\n quarterRound(ws, 1, 6, 11, 12);\n quarterRound(ws, 2, 7, 8, 13);\n quarterRound(ws, 3, 4, 9, 14);\n }\n const out = new Uint8Array(64);\n for (let i = 0; i < 16; i++) {\n const w = add32(ws[i], s[i]);\n out[i * 4 + 0] = w & 0xff;\n out[i * 4 + 1] = (w >>> 8) & 0xff;\n out[i * 4 + 2] = (w >>> 16) & 0xff;\n out[i * 4 + 3] = (w >>> 24) & 0xff;\n }\n return out;\n}\n\nexport interface ChaCha20Stream {\n fill(out: Uint8Array): void;\n}\n\n/** Streaming ChaCha20 keystream from a 32-byte seed. */\nexport function chacha20Stream(seedBytes32: Uint8Array): ChaCha20Stream {\n if (seedBytes32.length !== 32) throw new Error(\"ChaCha20 seed must be 32 bytes\");\n const keyU32 = new Uint32Array(8);\n for (let i = 0; i < 8; i++) {\n keyU32[i] = (seedBytes32[i * 4]) |\n (seedBytes32[i * 4 + 1] << 8) |\n (seedBytes32[i * 4 + 2] << 16) |\n (seedBytes32[i * 4 + 3] << 24);\n keyU32[i] = keyU32[i] >>> 0;\n }\n const nonceU32 = new Uint32Array(3);\n let counter = 0;\n let block: Uint8Array | null = null;\n let pos = 64;\n return {\n fill(out: Uint8Array) {\n let written = 0;\n while (written < out.length) {\n if (pos >= 64) {\n block = chacha20Block(keyU32, nonceU32, counter++);\n pos = 0;\n }\n const take = Math.min(out.length - written, 64 - pos);\n for (let i = 0; i < take; i++) out[written + i] = block![pos + i];\n written += take;\n pos += take;\n }\n },\n };\n}\n\n// ---- L2 normalization and dot product ----\n\n/** f32 left-fold L2-normalize (matches Rust's normalize_l2). */\nexport function normalizeL2F32(v: Float32Array | number[]): Float32Array | null {\n let sumSq = 0;\n for (let i = 0; i < v.length; i++) {\n const x = Math.fround(v[i]);\n sumSq = Math.fround(sumSq + Math.fround(x * x));\n }\n if (!isFinite(sumSq) || sumSq === 0) return null;\n const norm = Math.fround(Math.sqrt(sumSq));\n const out = new Float32Array(v.length);\n for (let i = 0; i < v.length; i++) out[i] = Math.fround(v[i] / norm);\n return out;\n}\n\n/** f64 L2-normalize (higher precision, for rerank path). */\nexport function normalizeL2(v: Float32Array | number[]): Float32Array {\n let sum = 0;\n for (let i = 0; i < v.length; i++) sum += v[i] * v[i];\n const n = Math.sqrt(sum);\n if (n === 0) {\n const out = new Float32Array(v.length);\n for (let i = 0; i < v.length; i++) out[i] = v[i];\n return out;\n }\n const out = new Float32Array(v.length);\n for (let i = 0; i < v.length; i++) out[i] = v[i] / n;\n return out;\n}\n\n/** f32 left-fold dot product (matches Rust's dot_product_left_fold). */\nexport function dotF32(a: Float32Array, b: Float32Array): number {\n let acc = 0;\n for (let i = 0; i < a.length; i++) {\n const prod = Math.fround(Math.fround(a[i]) * Math.fround(b[i]));\n acc = Math.fround(acc + prod);\n }\n return acc;\n}\n\n/** f64 dot product of L2-normalized vectors. */\nexport function dotL2Normalized(a: Float32Array, b: Float32Array): number {\n let sum = 0;\n for (let i = 0; i < a.length; i++) sum += a[i] * b[i];\n return sum;\n}\n\n// ---- LSH-cosine hyperplane derivation ----\n\n/**\n * Derive `bits` hyperplanes of `dim` f32 values each, from a 32-byte seed.\n * Mirrors `derive_hyperplanes` in dreamdb-protocol/src/lsh_cosine.rs.\n */\nexport function deriveHyperplanesLshCosine(\n seedBytes32: Uint8Array,\n dim: number,\n bits: number,\n): Float32Array {\n const stream = chacha20Stream(seedBytes32);\n const out = new Float32Array(dim * bits);\n const buf = new Uint8Array(dim * 4);\n for (let plane = 0; plane < bits; plane++) {\n let attempts = 0;\n while (attempts < 1024) {\n stream.fill(buf);\n const g = new Float32Array(dim);\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength);\n for (let i = 0; i < dim; i++) {\n const n = view.getInt32(i * 4, true);\n g[i] = Math.fround(n / 2147483648.0);\n }\n const h = normalizeL2F32(g);\n if (h) {\n for (let i = 0; i < dim; i++) out[plane * dim + i] = h[i];\n break;\n }\n attempts++;\n }\n if (attempts >= 1024) throw new Error(`hyperplane ${plane} ChaCha20 retry exhausted`);\n }\n return out;\n}\n\n// ---- LSH projection and multi-probe ----\n\nexport function projectionsLshCosine(\n qNormalized: Float32Array,\n hyperplanes: Float32Array,\n dim: number,\n bits: number,\n): Float32Array {\n const projections = new Float32Array(bits);\n for (let b = 0; b < bits; b++) {\n const plane = hyperplanes.subarray(b * dim, (b + 1) * dim);\n projections[b] = dotF32(qNormalized, plane);\n }\n return projections;\n}\n\nexport function bitsFromProjections(projections: Float32Array): boolean[] {\n const bits = new Array<boolean>(projections.length);\n for (let i = 0; i < projections.length; i++) bits[i] = projections[i] >= 0;\n return bits;\n}\n\nexport function bitsToBase2(bits: boolean[]): string {\n let s = \"\";\n for (const b of bits) s += b ? \"1\" : \"0\";\n return s;\n}\n\nfunction flippedKey(bits: boolean[], flipIdxs: number[]): string {\n const copy = bits.slice();\n for (const i of flipIdxs) copy[i] = !copy[i];\n return bitsToBase2(copy);\n}\n\n/**\n * Enumerate up to `probeCount` keys (including primary) ranked by\n * smallest total |projection| flip-cost.\n */\nexport function multiProbeKeys(\n projections: Float32Array,\n probeCount: number,\n maxHamming: number,\n): string[] {\n const n = projections.length;\n const absP = new Float32Array(n);\n for (let i = 0; i < n; i++) absP[i] = Math.abs(projections[i]);\n const primary = bitsFromProjections(projections);\n const primaryKey = bitsToBase2(primary);\n if (probeCount <= 1) return [primaryKey];\n\n const candidates: Array<{ score: number; flips: number[] }> = [];\n for (let i = 0; i < n; i++) candidates.push({ score: absP[i], flips: [i] });\n if (maxHamming >= 2) {\n for (let i = 0; i < n; i++)\n for (let j = i + 1; j < n; j++)\n candidates.push({ score: absP[i] + absP[j], flips: [i, j] });\n }\n if (maxHamming >= 3) {\n for (let i = 0; i < n; i++)\n for (let j = i + 1; j < n; j++)\n for (let k = j + 1; k < n; k++)\n candidates.push({ score: absP[i] + absP[j] + absP[k], flips: [i, j, k] });\n }\n if (maxHamming >= 4) {\n for (let i = 0; i < n; i++)\n for (let j = i + 1; j < n; j++)\n for (let k = j + 1; k < n; k++)\n for (let l = k + 1; l < n; l++)\n candidates.push({\n score: absP[i] + absP[j] + absP[k] + absP[l],\n flips: [i, j, k, l],\n });\n }\n candidates.sort((a, b) => a.score - b.score);\n const keys = [primaryKey];\n for (const c of candidates) {\n if (keys.length >= probeCount) break;\n keys.push(flippedKey(primary, c.flips));\n }\n return keys;\n}\n\n// ---- Rotation matrix derivation (for RaBitQ) ----\n\n/**\n * Derive the dim x dim orthogonal rotation matrix from a 32-byte seed.\n * Uses Modified Gram-Schmidt. Returns Float32Array of length dim*dim, row-major.\n */\nexport function deriveRotationMatrix(seedBytes32: Uint8Array, dim: number): Float32Array {\n const stream = chacha20Stream(seedBytes32);\n const m = new Float32Array(dim * dim);\n const buf = new Uint8Array(dim * dim * 4);\n stream.fill(buf);\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength);\n for (let i = 0; i < dim * dim; i++) {\n const n = view.getInt32(i * 4, true);\n m[i] = Math.fround(n / 2147483648.0);\n }\n // Modified Gram-Schmidt\n for (let j = 0; j < dim; j++) {\n for (let i = 0; i < j; i++) {\n let coeff = 0;\n for (let kk = 0; kk < dim; kk++) {\n coeff = Math.fround(coeff + Math.fround(m[j * dim + kk] * m[i * dim + kk]));\n }\n for (let kk = 0; kk < dim; kk++) {\n m[j * dim + kk] = Math.fround(m[j * dim + kk] - Math.fround(coeff * m[i * dim + kk]));\n }\n }\n let sq = 0;\n for (let kk = 0; kk < dim; kk++) {\n sq = Math.fround(sq + Math.fround(m[j * dim + kk] * m[j * dim + kk]));\n }\n if (sq > 0) {\n const inv = Math.fround(1 / Math.fround(Math.sqrt(sq)));\n for (let kk = 0; kk < dim; kk++) {\n m[j * dim + kk] = Math.fround(m[j * dim + kk] * inv);\n }\n } else {\n m[j * dim + j] = 1;\n }\n }\n return m;\n}\n\n// ---- PQ-cosine decoder ----\n\nexport function buildPqCosineDecoder(vcCborBytes: Uint8Array): VectorCompressorDecoder {\n const obj = decodeCbor(vcCborBytes) as Record<string, CborValue>;\n if (!obj || obj.algorithm !== \"dreamdb.pq-cosine\") {\n throw new Error(`expected dreamdb.pq-cosine, got ${obj && obj.algorithm}`);\n }\n const dim = Number(obj.dim);\n const params = obj.params as Record<string, CborValue>;\n if (!params || !(params.codebooks instanceof Uint8Array)) {\n throw new Error(\"pq-cosine params missing codebooks bytes\");\n }\n const m = Number(params.m);\n const k = Number(params.k);\n const codebookBytes = params.codebooks as Uint8Array;\n const dsub = dim / m;\n if (dsub !== Math.floor(dsub)) {\n throw new Error(`dim=${dim} not divisible by m=${m}`);\n }\n if (codebookBytes.length !== m * k * dsub * 4) {\n throw new Error(\n `codebook bytes ${codebookBytes.length} != m(${m}) * k(${k}) * dsub(${dsub}) * 4`,\n );\n }\n const codebooksAligned = new Uint8Array(codebookBytes.length);\n codebooksAligned.set(codebookBytes);\n const codebookF32 = new Float32Array(codebooksAligned.buffer);\n\n return {\n algorithm: \"dreamdb.pq-cosine\",\n dim,\n recordCodeBytes: m,\n decode(codes: Uint8Array): Float32Array {\n if (codes.length !== m) {\n throw new Error(`codes length ${codes.length} != m=${m}`);\n }\n const out = new Float32Array(dim);\n for (let s = 0; s < m; s++) {\n const codeByte = codes[s];\n const srcOff = s * k * dsub + codeByte * dsub;\n const dstOff = s * dsub;\n for (let d = 0; d < dsub; d++) {\n out[dstOff + d] = codebookF32[srcOff + d];\n }\n }\n return out;\n },\n };\n}\n\n// ---- RaBitQ-cosine decoder ----\n\nexport function buildRabitqCosineDecoder(vcCborBytes: Uint8Array): VectorCompressorDecoder {\n const obj = decodeCbor(vcCborBytes) as Record<string, CborValue>;\n if (!obj || obj.algorithm !== \"dreamdb.rabitq-cosine\") {\n throw new Error(`expected dreamdb.rabitq-cosine, got ${obj && obj.algorithm}`);\n }\n const dim = Number(obj.dim);\n const params = obj.params as Record<string, CborValue>;\n if (!params || !(params.rotation_seed instanceof Uint8Array)) {\n throw new Error(\"rabitq-cosine params missing rotation_seed bytes\");\n }\n if ((params.rotation_seed as Uint8Array).length !== 32) {\n throw new Error(`rotation_seed must be 32 bytes; got ${(params.rotation_seed as Uint8Array).length}`);\n }\n const bitsPerDim = Number(params.bits_per_dim || 1);\n if (bitsPerDim !== 1) {\n throw new Error(`rabitq-cosine bits_per_dim=${bitsPerDim} not supported (v0 ships 1 only)`);\n }\n const withCorrection = params.with_correction_factors === true;\n const payloadBytes = Math.ceil(dim / 8);\n const codeBytesExpected = withCorrection ? payloadBytes + 4 : payloadBytes;\n const rotation = deriveRotationMatrix(params.rotation_seed as Uint8Array, dim);\n const constScale = 1 / Math.sqrt(dim);\n\n function readPerRecordScale(codeBytes: Uint8Array): number {\n const off = codeBytes.byteOffset + payloadBytes;\n const dv = new DataView(codeBytes.buffer, off, 4);\n return dv.getFloat32(0, true);\n }\n\n return {\n algorithm: \"dreamdb.rabitq-cosine\",\n dim,\n recordCodeBytes: codeBytesExpected,\n rotateQuery(qNorm: Float32Array): Float32Array {\n const out = new Float32Array(dim);\n for (let i = 0; i < dim; i++) {\n let acc = 0;\n const base = i * dim;\n for (let k = 0; k < dim; k++) {\n acc = Math.fround(acc + Math.fround(rotation[base + k] * qNorm[k]));\n }\n out[i] = acc;\n }\n return out;\n },\n adcScore(rotatedQuery: Float32Array, codeBytes: Uint8Array): number {\n let sum = 0;\n for (let i = 0; i < dim; i++) {\n const bit = (codeBytes[i >>> 3] >>> (i & 7)) & 1;\n const signed = bit === 1 ? rotatedQuery[i] : -rotatedQuery[i];\n sum = Math.fround(sum + signed);\n }\n const scale = withCorrection ? readPerRecordScale(codeBytes) : constScale;\n return Math.fround(sum * scale);\n },\n decode(codeBytes: Uint8Array): Float32Array {\n if (codeBytes.length !== codeBytesExpected) {\n throw new Error(\n `rabitq codes len ${codeBytes.length} != expected ${codeBytesExpected}`,\n );\n }\n const scale = withCorrection ? readPerRecordScale(codeBytes) : constScale;\n const uhat = new Float32Array(dim);\n for (let i = 0; i < dim; i++) {\n const bit = (codeBytes[i >>> 3] >>> (i & 7)) & 1;\n uhat[i] = bit === 1 ? scale : -scale;\n }\n const out = new Float32Array(dim);\n for (let j = 0; j < dim; j++) {\n let acc = 0;\n for (let i = 0; i < dim; i++) {\n acc = Math.fround(acc + Math.fround(rotation[i * dim + j] * uhat[i]));\n }\n out[j] = acc;\n }\n return out;\n },\n };\n}\n\n// ---- Spatial bucket record decoding ----\n\n/**\n * Decode a SpatialBucket binary into BucketRecord[].\n * Supports v1 (160-byte header, raw f32) and v2 (200-byte header, compressed).\n */\nexport function decodeBucketRecords(\n bytes: Uint8Array,\n expectRecordSize: number,\n dim: number,\n): BucketRecord[] {\n if (bytes.length < 160) throw new Error(\"bucket too small for header\");\n if (bytes[0] !== 0x56 || bytes[1] !== 0x42 || bytes[2] !== 0x55 || bytes[3] !== 0x55) {\n throw new Error(\"bucket bad magic\");\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const recordSize = view.getUint32(8, false);\n const recordCount = view.getUint32(12, false);\n const headerSize = view.getUint32(16, false);\n if (headerSize !== 160 && headerSize !== 200) {\n throw new Error(`bucket header_size=${headerSize} unsupported (expect 160 or 200)`);\n }\n if (recordSize !== expectRecordSize) {\n throw new Error(`bucket record_size=${recordSize} != expected ${expectRecordSize}`);\n }\n const isCompressed = headerSize === 200;\n const out: BucketRecord[] = [];\n for (let i = 0; i < recordCount; i++) {\n const off = headerSize + i * recordSize;\n const hi = view.getUint32(off, false);\n const lo = view.getUint32(off + 4, false);\n const anchor = Number((BigInt(hi) << 32n) | BigInt(lo));\n const recordPayload = bytes.subarray(off + 8, off + recordSize);\n if (isCompressed) {\n out.push({ anchor, ordinal: i, codes: new Uint8Array(recordPayload) });\n } else {\n const vec = new Float32Array(dim);\n const vecView = new DataView(\n recordPayload.buffer,\n recordPayload.byteOffset,\n recordPayload.byteLength,\n );\n for (let j = 0; j < dim; j++) vec[j] = vecView.getFloat32(j * 4, true);\n out.push({ anchor, ordinal: i, vec });\n }\n }\n return out;\n}\n\n/** Decode only the time anchors from a SpatialBucket binary. */\nexport function decodeBucketAnchorsOnly(bytes: Uint8Array): number[] {\n if (bytes.length < 160) throw new Error(\"bucket too small for header\");\n if (bytes[0] !== 0x56 || bytes[1] !== 0x42 || bytes[2] !== 0x55 || bytes[3] !== 0x55) {\n throw new Error(\"bucket bad magic\");\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const recordSize = view.getUint32(8, false);\n const recordCount = view.getUint32(12, false);\n const headerSize = view.getUint32(16, false);\n if (headerSize !== 160 && headerSize !== 200) {\n throw new Error(`bucket header_size=${headerSize} unsupported (expect 160 or 200)`);\n }\n const out: number[] = [];\n for (let i = 0; i < recordCount; i++) {\n const off = headerSize + i * recordSize;\n const hi = view.getUint32(off, false);\n const lo = view.getUint32(off + 4, false);\n out.push(Number((BigInt(hi) << 32n) | BigInt(lo)));\n }\n return out;\n}\n\n/** Peek the bucket header without decoding records. */\nexport function peekBucketHeader(bytes: Uint8Array): {\n recordSize: number;\n recordCount: number;\n headerSize: number;\n isCompressed: boolean;\n vectorCompressorHash: Uint8Array | null;\n} {\n if (bytes.length < 160) throw new Error(\"bucket too small for header\");\n if (bytes[0] !== 0x56 || bytes[1] !== 0x42 || bytes[2] !== 0x55 || bytes[3] !== 0x55) {\n throw new Error(\"bucket bad magic\");\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const recordSize = view.getUint32(8, false);\n const recordCount = view.getUint32(12, false);\n const headerSize = view.getUint32(16, false);\n return {\n recordSize,\n recordCount,\n headerSize,\n isCompressed: headerSize === 200,\n vectorCompressorHash:\n headerSize === 200 && bytes.length >= 86 + 33\n ? bytes.subarray(86, 86 + 33)\n : null,\n };\n}\n","/**\n * Space class — resolve refs, decode manifests, iterate tracks.\n *\n * Port of the DreamDBSpace class from demo/dreamdb.js.\n * Uses the Backend interface for storage access.\n */\n\nimport type {\n Backend,\n Base32Hash,\n CborValue,\n HistoryEntry,\n Manifest,\n ResolvedTrack,\n SpatialDispatcher,\n VectorCompressorDecoder,\n VectorQueryOptions,\n VectorQueryResult,\n QueryStats,\n BucketRecord,\n} from \"./types.js\";\nimport { decodeCbor } from \"./cbor.js\";\nimport { bytesToBase32, MULTIHASH_BYTES, modalityForField } from \"./uri.js\";\nimport {\n normalizeL2F32,\n normalizeL2,\n dotF32,\n dotL2Normalized,\n deriveHyperplanesLshCosine,\n projectionsLshCosine,\n multiProbeKeys,\n decodeBucketRecords,\n buildPqCosineDecoder,\n buildRabitqCosineDecoder,\n} from \"./query.js\";\n\nexport interface SpaceOptions {\n connectorBase?: string;\n backend?: Backend;\n}\n\nexport class Space {\n readonly connectorBase: string;\n readonly manifestHash: Base32Hash;\n readonly manifest: Manifest;\n readonly refName: string | null;\n private backend: Backend | null;\n\n // Caches\n private _siCache = new Map<string, SpatialDispatcher | null>();\n private _vcCache = new Map<string, VectorCompressorDecoder | null>();\n private _lastQueryStats: QueryStats | null = null;\n\n constructor(opts: {\n connectorBase: string;\n manifestHash: Base32Hash;\n manifest: Manifest;\n refName: string | null;\n backend?: Backend;\n }) {\n this.connectorBase = opts.connectorBase;\n this.manifestHash = opts.manifestHash;\n this.manifest = opts.manifest;\n this.refName = opts.refName;\n this.backend = opts.backend || null;\n }\n\n /**\n * Open a Space from a space URI.\n * If a Backend is provided, it is used; otherwise fetch-based HTTP access.\n */\n static async fromUri(uri: string, backend?: Backend): Promise<Space> {\n // Inline URI parsing to avoid circular deps\n const u = new URL(uri);\n const parts = u.pathname.replace(/^\\/+/, \"\").split(\"/\");\n if (parts.length < 2) {\n throw new Error(`Space URI missing /refs/<name> or /manifests/<hash> suffix: ${uri}`);\n }\n const id = parts.pop()!;\n const marker = parts.pop()!;\n let kind: \"ref\" | \"manifest\";\n if (marker === \"refs\") kind = \"ref\";\n else if (marker === \"manifests\") kind = \"manifest\";\n else throw new Error(`Space URI: expected /refs/ or /manifests/, got /${marker}/: ${uri}`);\n const connectorBase = `${u.origin}/${parts.join(\"/\")}`.replace(/\\/$/, \"\");\n\n let manifestHash: Base32Hash;\n let refName: string | null = null;\n\n const fetchFn = async (path: string, noCache = false): Promise<Uint8Array> => {\n if (backend) return backend.get(path, { noCache });\n const url = `${connectorBase}/${path}`;\n const fetchOpts: RequestInit = noCache ? { cache: \"no-store\" } : {};\n const r = await fetch(url, fetchOpts);\n if (!r.ok) throw new Error(`GET ${url}: HTTP ${r.status}`);\n return new Uint8Array(await r.arrayBuffer());\n };\n\n if (kind === \"ref\") {\n refName = id;\n const refBytes = await fetchFn(`refs/${id}`, true);\n if (refBytes.length !== MULTIHASH_BYTES) {\n throw new Error(`ref body not ${MULTIHASH_BYTES} bytes: got ${refBytes.length}`);\n }\n manifestHash = bytesToBase32(refBytes);\n } else {\n manifestHash = id;\n }\n\n const manifestBytes = await fetchFn(`manifests/${manifestHash}`);\n const manifest = decodeCbor(manifestBytes) as unknown as Manifest;\n return new Space({ connectorBase, manifestHash, manifest, refName, backend });\n }\n\n /** Get the timeline ID (base32 hash of the first timeline entry). */\n timelineId(): Base32Hash {\n const t = this.manifest.timelines;\n if (!t || !Array.isArray(t) || t.length === 0) {\n throw new Error(\"Manifest has no timelines[]\");\n }\n return bytesToBase32(t[0] as Uint8Array);\n }\n\n /**\n * Map each Manifest Track to the Schema-declared field name.\n * Returns a parallel array to manifest.tracks.\n */\n private _fieldNamesForTracks(): Array<string | null> {\n const tracks = this.manifest.tracks;\n if (!Array.isArray(tracks)) return [];\n const out = new Array<string | null>(tracks.length).fill(null);\n const registry = this.manifest.registry as Record<string, CborValue> | undefined;\n const sch = registry?.[\"dreamdb.schema\"] as Record<string, CborValue> | undefined;\n const fields = sch && Array.isArray(sch.fields) ? (sch.fields as Array<Record<string, CborValue>>) : null;\n if (!fields) return out;\n\n const expectedModalityFor = (f: Record<string, CborValue>): string | null => {\n return modalityForField({\n kind: f.kind as string,\n mime: f.mime as string | undefined,\n dim: f.dim ? Number(f.dim) : undefined,\n name: f.name as string | undefined,\n value_type: f.value_type as string | undefined,\n });\n };\n\n // Per-modality queues\n const queues = new Map<string, number[]>();\n for (let i = 0; i < tracks.length; i++) {\n const m = (tracks[i] as { modality: string }).modality;\n if (!queues.has(m)) queues.set(m, []);\n queues.get(m)!.push(i);\n }\n for (const f of fields) {\n const want = expectedModalityFor(f);\n if (!want) continue;\n const q = queues.get(want);\n if (!q || q.length === 0) continue;\n const idx = q.shift()!;\n out[idx] = f.name as string;\n }\n return out;\n }\n\n /** List resolved tracks from this Manifest. */\n tracks(): ResolvedTrack[] {\n const out: ResolvedTrack[] = [];\n const ts = this.manifest.tracks;\n if (!Array.isArray(ts)) return out;\n const fieldNames = this._fieldNamesForTracks();\n for (let i = 0; i < ts.length; i++) {\n const t = ts[i] as {\n modality: string;\n kind: string;\n role: string;\n address: Uint8Array;\n timeline: Uint8Array;\n coverage: unknown;\n };\n const field = fieldNames[i] || null;\n out.push({\n modality: t.modality,\n field,\n key: field || t.modality,\n kind: t.kind,\n role: t.role,\n address: bytesToBase32(t.address),\n timeline: bytesToBase32(t.timeline),\n coverage: t.coverage,\n });\n }\n return out;\n }\n\n /** Find a Track by key (field name or modality). */\n trackFor(keyOrModality: string): ResolvedTrack | undefined {\n return this.tracks().find(\n (t) => t.key === keyOrModality || t.modality === keyOrModality,\n );\n }\n\n /** Walk the Manifest DAG and return history entries. */\n async history(maxDepth = 50): Promise<HistoryEntry[]> {\n const out: HistoryEntry[] = [];\n let curHash = this.manifestHash;\n let cur = this.manifest;\n\n while (curHash && out.length < maxDepth) {\n out.push({\n manifestHash: curHash,\n ts:\n typeof cur.ts === \"bigint\" ? Number(cur.ts) : Number(cur.ts || 0),\n writer: cur.writer || \"(unknown)\",\n tracks: Array.isArray(cur.tracks)\n ? cur.tracks.map((t: { modality: string; address: Uint8Array }) => ({\n modality: t.modality,\n address: bytesToBase32(t.address),\n }))\n : [],\n parents: Array.isArray(cur.parents) ? cur.parents.length : 0,\n });\n const parents = cur.parents || [];\n if (parents.length === 0) break;\n const parentHash = bytesToBase32(parents[0] as Uint8Array);\n try {\n const parentBytes = await this._fetchBytes(`manifests/${parentHash}`);\n cur = decodeCbor(parentBytes) as unknown as Manifest;\n curHash = parentHash;\n } catch (e: unknown) {\n out[out.length - 1].truncatedAt = (e as Error).message;\n break;\n }\n }\n return out;\n }\n\n /** Get the last query's statistics. */\n get lastQueryStats(): QueryStats | null {\n return this._lastQueryStats;\n }\n\n // ---- Vector query ----\n\n async queryVector(\n field: string,\n queryVec: number[] | Float32Array,\n opts: VectorQueryOptions | number = {},\n ): Promise<VectorQueryResult[]> {\n const topK = typeof opts === \"number\" ? opts : opts.topK || 10;\n const probeCountOverride =\n typeof opts === \"object\" && opts.probeCount ? opts.probeCount : null;\n const maxHamming = typeof opts === \"object\" && opts.maxHamming ? opts.maxHamming : 2;\n\n const track = this._embeddingTrackFor(field);\n if (!track) throw new Error(`no embedding Track found for field \"${field}\"`);\n const dimMatch = /\\.dim=(\\d+)\\./.exec(track.modality);\n if (!dimMatch) throw new Error(`embedding Track modality lacks dim=N: ${track.modality}`);\n const dim = parseInt(dimMatch[1], 10);\n if (queryVec.length !== dim) {\n throw new Error(`query vec dim ${queryVec.length} != Track dim ${dim}`);\n }\n\n const compressorDecoder = await this._fetchVectorCompressor(track.modality);\n const recordSize = compressorDecoder\n ? 8 + compressorDecoder.recordCodeBytes\n : 8 + dim * 4;\n\n // Fetch TrackObject\n const trackBytes = await this._fetchBytes(\n `${track.timeline}/${track.modality}/track/${track.address}`,\n );\n const trackObj = decodeCbor(trackBytes) as Record<string, CborValue>;\n const objIndex = trackObj.object_index as CborValue[];\n if (!Array.isArray(objIndex)) {\n throw new Error(\"queryVector: paged Track index not supported in TS yet\");\n }\n\n // Fetch + decode the SpatialIndex dispatcher\n const dispatcher = await this._fetchSpatialDispatcher(track.modality);\n let probeCount = probeCountOverride;\n if (probeCount == null) {\n if (dispatcher && dispatcher.algorithm === \"dreamdb.ivf-cosine\") {\n probeCount = Math.max(8, Math.ceil(dispatcher.k! / 16));\n } else {\n probeCount = 64;\n }\n }\n let probeKeySet: Set<string> | null = null;\n if (dispatcher) {\n const qNormForDispatch = normalizeL2F32(\n queryVec instanceof Float32Array ? queryVec : new Float32Array(queryVec),\n );\n if (!qNormForDispatch)\n throw new Error(\"queryVector: query vector has zero norm\");\n const probeKeys = dispatcher.probeKeys(\n qNormForDispatch,\n probeCount,\n maxHamming,\n );\n probeKeySet = new Set(probeKeys);\n }\n\n // Pick buckets to fetch\n let entriesToFetch = probeKeySet\n ? objIndex.filter(\n (e) => probeKeySet!.has((e as CborValue[])[0] as string),\n )\n : objIndex;\n const dispatchedCount = entriesToFetch.length;\n if (probeKeySet && entriesToFetch.length === 0) {\n entriesToFetch = objIndex;\n }\n this._lastQueryStats = {\n bucketsTotal: objIndex.length,\n bucketsProbed: dispatchedCount,\n fellBackToBruteForce: probeKeySet !== null && dispatchedCount === 0,\n };\n\n // Pass 1 — ADC cull\n const qNorm = normalizeL2(\n queryVec instanceof Float32Array ? queryVec : new Float32Array(queryVec),\n );\n let rotatedQuery: Float32Array | null = null;\n if (\n compressorDecoder &&\n compressorDecoder.algorithm === \"dreamdb.rabitq-cosine\" &&\n compressorDecoder.rotateQuery\n ) {\n rotatedQuery = compressorDecoder.rotateQuery(qNorm);\n }\n\n const candidates: Array<{\n anchor: number;\n score: number;\n vsHashB32: string | null;\n recordOrdinal: number;\n }> = [];\n\n for (const e of entriesToFetch) {\n const entry = e as CborValue[];\n const spatialKey = entry[0] as string;\n const bucketAddr = bytesToBase32(entry[4] as Uint8Array);\n let vsHashB32: string | null = null;\n if (entry.length >= 7 && entry[6] instanceof Uint8Array) {\n vsHashB32 = bytesToBase32(entry[6] as Uint8Array);\n }\n const body = await this._fetchBytes(\n `${track.timeline}/${track.modality}/${spatialKey}/${bucketAddr}`,\n );\n for (const rec of decodeBucketRecords(body, recordSize, dim)) {\n let score: number;\n if (rec.vec) {\n score = dotL2Normalized(qNorm, normalizeL2(rec.vec));\n } else if (rec.codes && rotatedQuery && compressorDecoder?.adcScore) {\n score = compressorDecoder.adcScore(rotatedQuery, rec.codes);\n } else if (rec.codes && compressorDecoder) {\n const candidate = compressorDecoder.decode(rec.codes);\n score = dotL2Normalized(qNorm, normalizeL2(candidate));\n } else {\n continue;\n }\n candidates.push({\n anchor: rec.anchor,\n score,\n vsHashB32,\n recordOrdinal: rec.ordinal,\n });\n }\n }\n\n // Pass 2 — rerank\n candidates.sort((a, b) => b.score - a.score);\n const T = Math.min(candidates.length, 5 * topK);\n const survivors = candidates.slice(0, T);\n const rerankableByHash = new Map<\n string,\n Array<(typeof candidates)[0]>\n >();\n let rerankSkippedNoHash = 0;\n for (const s of survivors) {\n if (s.vsHashB32) {\n if (!rerankableByHash.has(s.vsHashB32))\n rerankableByHash.set(s.vsHashB32, []);\n rerankableByHash.get(s.vsHashB32)!.push(s);\n } else {\n rerankSkippedNoHash++;\n }\n }\n const vsRecordSize = dim * 4;\n const VS_HEADER_SIZE = 128;\n for (const [vsHashB32, group] of rerankableByHash) {\n let vsBytes: Uint8Array;\n try {\n vsBytes = await this._fetchBytes(\n `${track.timeline}/${track.modality}/vectors/${vsHashB32}`,\n );\n } catch {\n rerankSkippedNoHash += group.length;\n continue;\n }\n const vsView = new DataView(\n vsBytes.buffer,\n vsBytes.byteOffset,\n vsBytes.byteLength,\n );\n for (const s of group) {\n const off = VS_HEADER_SIZE + s.recordOrdinal * vsRecordSize;\n if (off + vsRecordSize > vsBytes.length) {\n rerankSkippedNoHash++;\n continue;\n }\n const rawVec = new Float32Array(dim);\n for (let j = 0; j < dim; j++) {\n rawVec[j] = vsView.getFloat32(off + j * 4, true);\n }\n s.score = dotL2Normalized(qNorm, normalizeL2(rawVec));\n }\n }\n\n survivors.sort((a, b) => b.score - a.score);\n const finalTop = survivors.slice(0, topK).map((s) => ({\n anchor: s.anchor,\n score: s.score,\n }));\n\n this._lastQueryStats = {\n ...this._lastQueryStats!,\n candidatesScored: candidates.length,\n topT: T,\n rerankFetchCount: rerankableByHash.size,\n rerankSkippedNoHash,\n };\n return finalTop;\n }\n\n // ---- Internal helpers ----\n\n private _embeddingTrackFor(field: string): ResolvedTrack | null {\n const tracks = this.tracks().filter((t) =>\n t.modality.startsWith(\"embedding.\"),\n );\n if (tracks.length === 0) return null;\n if (tracks.length === 1) return tracks[0];\n return tracks.find((t) => t.key === field || t.modality.includes(field)) || tracks[0];\n }\n\n private async _fetchBytes(path: string): Promise<Uint8Array> {\n if (this.backend) {\n return this.backend.get(path);\n }\n const url = `${this.connectorBase}/${path}`;\n const r = await fetch(url);\n if (!r.ok) throw new Error(`GET ${url}: HTTP ${r.status}`);\n return new Uint8Array(await r.arrayBuffer());\n }\n\n private async _fetchSpatialDispatcher(\n modality: string,\n ): Promise<SpatialDispatcher | null> {\n if (this._siCache.has(modality)) return this._siCache.get(modality)!;\n const registry = this.manifest.registry;\n if (!registry || typeof registry !== \"object\") {\n this._siCache.set(modality, null);\n return null;\n }\n const regEntry = registry[modality] as Record<string, CborValue> | undefined;\n if (!regEntry || typeof regEntry !== \"object\") {\n this._siCache.set(modality, null);\n return null;\n }\n const hashesArr = (regEntry.spatial_index ||\n regEntry.spatial_index_hashes) as CborValue[];\n if (!Array.isArray(hashesArr) || hashesArr.length === 0) {\n this._siCache.set(modality, null);\n return null;\n }\n const siHashBytes = hashesArr[0] as Uint8Array;\n const siHashB32 = bytesToBase32(siHashBytes);\n let siBytes: Uint8Array;\n try {\n siBytes = await this._fetchBytes(`spatial-index/${siHashB32}`);\n } catch {\n this._siCache.set(modality, null);\n return null;\n }\n const siObj = decodeCbor(siBytes) as Record<string, CborValue>;\n const dim = Number(siObj.dim);\n const bits = Number(siObj.bits);\n let dispatcher: SpatialDispatcher | null = null;\n\n if (siObj.algorithm === \"dreamdb.lsh-cosine\") {\n const params = siObj.params as Record<string, CborValue>;\n let hyperplanes: Float32Array;\n if (params.explicit_hyperplanes) {\n const hpBytes = params.explicit_hyperplanes as Uint8Array;\n const view = new DataView(\n hpBytes.buffer,\n hpBytes.byteOffset,\n hpBytes.byteLength,\n );\n hyperplanes = new Float32Array(dim * bits);\n for (let i = 0; i < dim * bits; i++)\n hyperplanes[i] = view.getFloat32(i * 4, true);\n } else if (params.seed) {\n hyperplanes = deriveHyperplanesLshCosine(\n params.seed as Uint8Array,\n dim,\n bits,\n );\n } else {\n this._siCache.set(modality, null);\n return null;\n }\n dispatcher = {\n algorithm: \"dreamdb.lsh-cosine\",\n dim,\n bits,\n probeKeys(qNorm, probeCount, maxHamming) {\n const projections = projectionsLshCosine(\n qNorm,\n hyperplanes,\n dim,\n bits,\n );\n return multiProbeKeys(projections, probeCount, maxHamming);\n },\n };\n } else if (siObj.algorithm === \"dreamdb.ivf-cosine\") {\n const k = Number((siObj.params as Record<string, CborValue>).k);\n const centroidBytes = (siObj.params as Record<string, CborValue>)\n .centroids as Uint8Array;\n if (\n !(centroidBytes instanceof Uint8Array) ||\n centroidBytes.length !== k * dim * 4\n ) {\n this._siCache.set(modality, null);\n return null;\n }\n const aligned = new Uint8Array(centroidBytes.length);\n aligned.set(centroidBytes);\n const centroidsF32 = new Float32Array(aligned.buffer);\n dispatcher = {\n algorithm: \"dreamdb.ivf-cosine\",\n dim,\n bits,\n k,\n probeKeys(qNorm, probeCount, _maxHamming) {\n const nprobe = Math.min(probeCount, k);\n const scores: Array<[number, number]> = new Array(k);\n for (let i = 0; i < k; i++) {\n let acc = 0;\n const base = i * dim;\n for (let d = 0; d < dim; d++) {\n acc = Math.fround(\n acc + Math.fround(qNorm[d] * centroidsF32[base + d]),\n );\n }\n scores[i] = [acc, i];\n }\n scores.sort((a, b) => b[0] - a[0]);\n const out: string[] = [];\n for (let i = 0; i < nprobe; i++) {\n const id = scores[i][1];\n let key = \"\";\n for (let b = bits - 1; b >= 0; b--) {\n key += (id >> b) & 1 ? \"1\" : \"0\";\n }\n out.push(key);\n }\n return out;\n },\n };\n }\n\n this._siCache.set(modality, dispatcher);\n return dispatcher;\n }\n\n private async _fetchVectorCompressor(\n modality: string,\n ): Promise<VectorCompressorDecoder | null> {\n if (this._vcCache.has(modality)) return this._vcCache.get(modality)!;\n const registry = this.manifest.registry;\n if (!registry || typeof registry !== \"object\") {\n this._vcCache.set(modality, null);\n return null;\n }\n const regEntry = registry[modality] as Record<string, CborValue> | undefined;\n if (!regEntry || typeof regEntry !== \"object\") {\n this._vcCache.set(modality, null);\n return null;\n }\n const vcHashBytes = regEntry.vector_compressor as Uint8Array | undefined;\n if (!(vcHashBytes instanceof Uint8Array)) {\n this._vcCache.set(modality, null);\n return null;\n }\n const vcHashB32 = bytesToBase32(vcHashBytes);\n let vcBytes: Uint8Array;\n try {\n vcBytes = await this._fetchBytes(`vector-compressor/${vcHashB32}`);\n } catch {\n this._vcCache.set(modality, null);\n return null;\n }\n const peek = decodeCbor(vcBytes) as Record<string, CborValue>;\n let decoder: VectorCompressorDecoder;\n if (peek && peek.algorithm === \"dreamdb.pq-cosine\") {\n decoder = buildPqCosineDecoder(vcBytes);\n } else if (peek && peek.algorithm === \"dreamdb.rabitq-cosine\") {\n decoder = buildRabitqCosineDecoder(vcBytes);\n } else {\n this._vcCache.set(modality, null);\n return null;\n }\n decoder.algorithm = (peek.algorithm as string) || decoder.algorithm;\n if (peek.algorithm === \"dreamdb.pq-cosine\") {\n decoder.recordCodeBytes = Number(\n (peek.params as Record<string, CborValue>).m,\n );\n } else {\n const payload = Math.ceil(Number(peek.dim) / 8);\n const corrected =\n peek.params &&\n (peek.params as Record<string, CborValue>).with_correction_factors ===\n true;\n decoder.recordCodeBytes = corrected ? payload + 4 : payload;\n }\n this._vcCache.set(modality, decoder);\n return decoder;\n }\n}\n","/**\n * High-level Dataset API — mirrors the Python SDK's Dataset/Schema surface.\n *\n * Provides:\n * - Schema (add_image, add_embedding, add_scalar_categorical, etc.)\n * - Dataset.create / Dataset.open\n * - append_many, iter_vector, iter_stream\n * - snapshot, branch, merge, delete, tombstone_set\n * - history, list_refs, count\n */\n\nimport type {\n Backend,\n Base32Hash,\n Batch,\n CborValue,\n FieldDef,\n ImageFieldDef,\n AudioFieldDef,\n VideoFieldDef,\n EmbeddingFieldDef,\n ScalarFieldDef,\n Sample,\n SnapshotInfo,\n TimeAnchor,\n WhereClause,\n ScalarValueType,\n} from \"./types.js\";\nimport { decodeCbor, encodeCbor } from \"./cbor.js\";\nimport { bytesToBase32, base32ToBytes, modalityForField, MULTIHASH_BYTES } from \"./uri.js\";\nimport { MemoryBackend, S3Backend } from \"./backend.js\";\nimport { normalizeL2, dotL2Normalized } from \"./query.js\";\n\n// ---- Schema ----\n\n/**\n * Builder for a Dataset's schema. Chainable API:\n *\n * const schema = new Schema()\n * .addImage(\"image\", { mime: \"jpeg\" })\n * .addEmbedding(\"embedding\", { dim: 512 })\n * .addScalarCategorical(\"label\");\n */\nexport class Schema {\n readonly fields: FieldDef[] = [];\n\n addImage(\n name: string,\n opts: { mime?: string; required?: boolean; chunkSize?: number; packItems?: number } = {},\n ): this {\n this.fields.push({\n kind: \"image\",\n name,\n mime: opts.mime || \"jpeg\",\n required: opts.required !== false,\n chunkSize: opts.chunkSize,\n packItems: opts.packItems,\n } satisfies ImageFieldDef);\n return this;\n }\n\n addAudio(\n name: string,\n opts: { mime?: string; required?: boolean; chunkSize?: number; packItems?: number } = {},\n ): this {\n this.fields.push({\n kind: \"audio\",\n name,\n mime: opts.mime || \"wav\",\n required: opts.required !== false,\n chunkSize: opts.chunkSize,\n packItems: opts.packItems,\n } satisfies AudioFieldDef);\n return this;\n }\n\n addVideo(\n name: string,\n opts: { mime?: string; required?: boolean; chunkSize?: number; packItems?: number } = {},\n ): this {\n this.fields.push({\n kind: \"video\",\n name,\n mime: opts.mime || \"mp4\",\n required: opts.required !== false,\n chunkSize: opts.chunkSize,\n packItems: opts.packItems,\n } satisfies VideoFieldDef);\n return this;\n }\n\n addEmbedding(\n name: string,\n opts: {\n dim: number;\n algorithm?: string;\n required?: boolean;\n lshBits?: number;\n compressor?: Uint8Array;\n spatialIndex?: Uint8Array;\n rerank?: boolean;\n },\n ): this {\n this.fields.push({\n kind: \"embedding\",\n name,\n dim: opts.dim,\n algorithm: opts.algorithm || \"dreamdb.lsh-cosine\",\n required: opts.required !== false,\n lshBits: opts.lshBits,\n compressor: opts.compressor,\n spatialIndex: opts.spatialIndex,\n rerank: opts.rerank || false,\n } satisfies EmbeddingFieldDef);\n return this;\n }\n\n addScalarCategorical(name: string, opts: { required?: boolean } = {}): this {\n this.fields.push({\n kind: \"scalar\",\n name,\n valueType: \"categorical\",\n required: opts.required !== false,\n } satisfies ScalarFieldDef);\n return this;\n }\n\n addScalarBool(name: string, opts: { required?: boolean } = {}): this {\n this.fields.push({\n kind: \"scalar\",\n name,\n valueType: \"bool\",\n required: opts.required !== false,\n } satisfies ScalarFieldDef);\n return this;\n }\n\n addScalarInt(name: string, opts: { required?: boolean } = {}): this {\n this.fields.push({\n kind: \"scalar\",\n name,\n valueType: \"int\",\n required: opts.required !== false,\n } satisfies ScalarFieldDef);\n return this;\n }\n\n addScalarFloat(name: string, opts: { required?: boolean } = {}): this {\n this.fields.push({\n kind: \"scalar\",\n name,\n valueType: \"float\",\n required: opts.required !== false,\n } satisfies ScalarFieldDef);\n return this;\n }\n\n addScalarString(name: string, opts: { required?: boolean } = {}): this {\n this.fields.push({\n kind: \"scalar\",\n name,\n valueType: \"string\",\n required: opts.required !== false,\n } satisfies ScalarFieldDef);\n return this;\n }\n\n addScalarTimestamp(name: string, opts: { required?: boolean } = {}): this {\n this.fields.push({\n kind: \"scalar\",\n name,\n valueType: \"timestamp\",\n required: opts.required !== false,\n } satisfies ScalarFieldDef);\n return this;\n }\n\n /** Serialize the schema to CBOR-encodable object. */\n toCbor(): CborValue {\n const fields: CborValue[] = this.fields.map((f) => {\n const obj: Record<string, CborValue> = { kind: f.kind, name: f.name };\n if (f.kind === \"image\" || f.kind === \"audio\" || f.kind === \"video\") {\n obj.mime = f.mime;\n obj.required = f.required;\n } else if (f.kind === \"embedding\") {\n obj.dim = f.dim;\n obj.algorithm = f.algorithm;\n obj.required = f.required;\n obj.rerank = f.rerank;\n } else if (f.kind === \"scalar\") {\n obj.value_type = f.valueType;\n obj.required = f.required;\n }\n return obj;\n });\n return { fields };\n }\n}\n\n// ---- Dataset ----\n\n/**\n * Versioned multimodal Dataset.\n *\n * TypeScript SDK mirror of the Python vortex_dataset.Dataset surface.\n */\nexport class Dataset {\n private backend: Backend;\n private _refName: string;\n private _manifestHash: Base32Hash;\n private _timelineHash: Base32Hash;\n private _schema: Schema;\n\n private constructor(\n backend: Backend,\n refName: string,\n manifestHash: Base32Hash,\n timelineHash: Base32Hash,\n schema: Schema,\n ) {\n this.backend = backend;\n this._refName = refName;\n this._manifestHash = manifestHash;\n this._timelineHash = timelineHash;\n this._schema = schema;\n }\n\n // ---- Construction ----\n\n static async create(\n name: string,\n schema: Schema,\n backendUrl: string,\n ): Promise<Dataset> {\n const backend = resolveBackend(backendUrl);\n\n // Generate a timeline hash (deterministic from name for reproducibility)\n const timelineBytes = hashFromString(`timeline:${name}`);\n const timelineHash = bytesToBase32(timelineBytes);\n\n // Build initial manifest with empty tracks\n const tracks: CborValue[] = [];\n for (const field of schema.fields) {\n const modality = modalityForField({\n kind: field.kind,\n mime: field.kind === \"image\" || field.kind === \"audio\" || field.kind === \"video\"\n ? (field as ImageFieldDef | AudioFieldDef | VideoFieldDef).mime\n : undefined,\n dim: field.kind === \"embedding\" ? (field as EmbeddingFieldDef).dim : undefined,\n name: field.name,\n valueType: field.kind === \"scalar\" ? (field as ScalarFieldDef).valueType : undefined,\n });\n if (!modality) continue;\n\n // Create empty track object\n const emptyTrackObj: CborValue = { object_index: [] as CborValue[] };\n const trackObjBytes = encodeCbor(emptyTrackObj);\n const trackHash = contentHash(trackObjBytes);\n const trackHashB32 = bytesToBase32(trackHash);\n\n // Store track object\n await backend.put(\n `${timelineHash}/${modality}/track/${trackHashB32}`,\n trackObjBytes,\n );\n\n tracks.push({\n modality,\n kind: field.kind === \"embedding\" ? \"spatial_bucket\" : field.kind === \"scalar\" ? \"scalar_bucket\" : \"fragment\",\n role: \"data\",\n address: trackHash,\n timeline: timelineBytes,\n coverage: null,\n });\n }\n\n const manifest: CborValue = {\n timelines: [timelineBytes],\n tracks,\n ts: BigInt(Date.now()) * 1000000n,\n writer: \"dreamdb-ts/0.1.0\",\n registry: {\n \"dreamdb.schema\": schema.toCbor(),\n },\n };\n\n const manifestBytes = encodeCbor(manifest);\n const manifestHash = contentHash(manifestBytes);\n const manifestHashB32 = bytesToBase32(manifestHash);\n\n // Store manifest and ref\n await backend.put(`manifests/${manifestHashB32}`, manifestBytes);\n await backend.put(`refs/${name}`, manifestHash);\n\n return new Dataset(backend, name, manifestHashB32, timelineHash, schema);\n }\n\n static async open(\n name: string,\n schema?: Schema | null,\n backendUrl = \"\",\n ): Promise<Dataset> {\n const backend = resolveBackend(backendUrl);\n\n // Read ref → manifest hash\n const refBytes = await backend.get(`refs/${name}`);\n if (refBytes.length !== MULTIHASH_BYTES) {\n throw new Error(`ref body not ${MULTIHASH_BYTES} bytes: got ${refBytes.length}`);\n }\n const manifestHash = bytesToBase32(refBytes);\n\n // Read manifest\n const manifestBytes = await backend.get(`manifests/${manifestHash}`);\n const manifest = decodeCbor(manifestBytes) as Record<string, CborValue>;\n\n // Extract timeline\n const timelines = manifest.timelines as Uint8Array[];\n if (!timelines || !Array.isArray(timelines) || timelines.length === 0) {\n throw new Error(\"Manifest has no timelines[]\");\n }\n const timelineHash = bytesToBase32(timelines[0] as Uint8Array);\n\n // Recover schema from manifest registry if not provided\n let resolvedSchema: Schema;\n if (schema) {\n resolvedSchema = schema;\n } else {\n const registry = manifest.registry as Record<string, CborValue> | undefined;\n const schemaCbor = registry?.[\"dreamdb.schema\"] as Record<string, CborValue> | undefined;\n if (schemaCbor && Array.isArray(schemaCbor.fields)) {\n resolvedSchema = schemaFromCbor(schemaCbor);\n } else {\n resolvedSchema = new Schema();\n }\n }\n\n return new Dataset(backend, name, manifestHash, timelineHash, resolvedSchema);\n }\n\n // ---- Inspection ----\n\n refName(): string {\n return this._refName;\n }\n\n currentManifest(): Base32Hash {\n return this._manifestHash;\n }\n\n timeline(): Base32Hash {\n return this._timelineHash;\n }\n\n schema(): Schema {\n return this._schema;\n }\n\n async history(maxDepth = 50): Promise<Array<{\n manifest: Base32Hash;\n ts_ns: number;\n writer: string;\n parents_count: number;\n tracks_count: number;\n }>> {\n const out: Array<{\n manifest: Base32Hash;\n ts_ns: number;\n writer: string;\n parents_count: number;\n tracks_count: number;\n }> = [];\n let curHash = this._manifestHash;\n\n while (curHash && out.length < maxDepth) {\n let manifestBytes: Uint8Array;\n try {\n manifestBytes = await this.backend.get(`manifests/${curHash}`);\n } catch {\n break;\n }\n const m = decodeCbor(manifestBytes) as Record<string, CborValue>;\n out.push({\n manifest: curHash,\n ts_ns: typeof m.ts === \"bigint\" ? Number(m.ts) : Number(m.ts || 0),\n writer: (m.writer as string) || \"(unknown)\",\n parents_count: Array.isArray(m.parents) ? (m.parents as CborValue[]).length : 0,\n tracks_count: Array.isArray(m.tracks) ? (m.tracks as CborValue[]).length : 0,\n });\n const parents = m.parents as Uint8Array[] | undefined;\n if (!parents || parents.length === 0) break;\n curHash = bytesToBase32(parents[0]);\n }\n return out;\n }\n\n async listRefs(): Promise<string[]> {\n const keys = await this.backend.list(\"refs/\");\n return keys.map((k) => k.replace(/^refs\\//, \"\")).sort();\n }\n\n async count(): Promise<number> {\n // Walk all embedding tracks and count records\n let n = 0;\n for await (const batch of this._iterStreamImpl(4096)) {\n n += batch._time_anchors.length;\n }\n return n;\n }\n\n // ---- Write path ----\n\n async appendMany(samples: Sample[]): Promise<number> {\n if (samples.length === 0) return 0;\n\n // Read current manifest\n const manifestBytes = await this.backend.get(`manifests/${this._manifestHash}`);\n const manifest = decodeCbor(manifestBytes) as Record<string, CborValue>;\n const tracks = manifest.tracks as Array<Record<string, CborValue>>;\n\n // Generate time anchors.\n // Use microsecond precision to stay within Number.MAX_SAFE_INTEGER\n // (Date.now() * 1e6 would exceed 2^53; Date.now() * 1e3 stays safe).\n const hasExplicitAnchors = \"_anchor\" in samples[0];\n const baseUs = Date.now() * 1000;\n const anchors: TimeAnchor[] = samples.map((s, i) => {\n if (hasExplicitAnchors) {\n return s._anchor as number;\n }\n return baseUs + i;\n });\n\n // Process each field and update tracks\n const newTracks: Array<Record<string, CborValue>> = [];\n\n for (let ti = 0; ti < tracks.length; ti++) {\n const track = tracks[ti];\n const modality = track.modality as string;\n\n // Find matching schema field\n const field = this._schema.fields.find((f) => {\n const expectedMod = modalityForField({\n kind: f.kind,\n mime: f.kind === \"image\" || f.kind === \"audio\" || f.kind === \"video\"\n ? (f as ImageFieldDef | AudioFieldDef | VideoFieldDef).mime\n : undefined,\n dim: f.kind === \"embedding\" ? (f as EmbeddingFieldDef).dim : undefined,\n name: f.name,\n valueType: f.kind === \"scalar\" ? (f as ScalarFieldDef).valueType : undefined,\n });\n return expectedMod === modality;\n });\n\n if (!field) {\n newTracks.push(track);\n continue;\n }\n\n // Read existing track object\n const trackAddr = bytesToBase32(track.address as Uint8Array);\n const trackBytes = await this.backend.get(\n `${this._timelineHash}/${modality}/track/${trackAddr}`,\n );\n const trackObj = decodeCbor(trackBytes) as Record<string, CborValue>;\n const objIndex = (trackObj.object_index as CborValue[]) || [];\n\n if (field.kind === \"image\" || field.kind === \"audio\" || field.kind === \"video\") {\n // Blob fields: store each sample value as a Fragment\n const newEntries: CborValue[] = [...objIndex];\n for (let i = 0; i < samples.length; i++) {\n const value = samples[i][field.name];\n if (value === null || value === undefined) continue;\n const data =\n value instanceof Uint8Array ? value : new Uint8Array(value as ArrayLike<number>);\n const fragHash = contentHash(data);\n const fragHashB32 = bytesToBase32(fragHash);\n await this.backend.put(\n `${this._timelineHash}/${modality}/0000000000000000/${fragHashB32}`,\n data,\n );\n // FragmentEntry: [t_start, t_end, byte_size, hash]\n newEntries.push([\n BigInt(anchors[i]),\n BigInt(anchors[i]),\n data.length,\n fragHash,\n ]);\n }\n const newTrackObj: CborValue = { object_index: newEntries };\n const newTrackBytes = encodeCbor(newTrackObj);\n const newTrackHash = contentHash(newTrackBytes);\n const newTrackHashB32 = bytesToBase32(newTrackHash);\n await this.backend.put(\n `${this._timelineHash}/${modality}/track/${newTrackHashB32}`,\n newTrackBytes,\n );\n newTracks.push({ ...track, address: newTrackHash });\n } else if (field.kind === \"embedding\") {\n const embField = field as EmbeddingFieldDef;\n const dim = embField.dim;\n\n // Group samples by LSH bucket key (simple implementation)\n // For now, use a single bucket key \"0\" repeated by lshBits or 12 bits\n const lshBits = embField.lshBits || 12;\n const bucketGroups = new Map<string, Array<{ anchor: TimeAnchor; vec: number[] }>>();\n\n for (let i = 0; i < samples.length; i++) {\n const value = samples[i][field.name];\n if (value === null || value === undefined) continue;\n const vec = value instanceof Float32Array\n ? Array.from(value)\n : value as number[];\n // Simple LSH: hash to a bucket key by sign of first lshBits dimensions\n const normVec = normalizeL2(new Float32Array(vec));\n let key = \"\";\n for (let b = 0; b < lshBits; b++) {\n key += normVec[b % dim] >= 0 ? \"1\" : \"0\";\n }\n if (!bucketGroups.has(key)) bucketGroups.set(key, []);\n bucketGroups.get(key)!.push({ anchor: anchors[i], vec });\n }\n\n const newEntries: CborValue[] = [...objIndex];\n for (const [spatialKey, records] of bucketGroups) {\n // Build bucket binary: 160-byte header + records\n const recordSize = 8 + dim * 4;\n const headerSize = 160;\n const totalSize = headerSize + records.length * recordSize;\n const bucket = new Uint8Array(totalSize);\n const bucketView = new DataView(bucket.buffer);\n\n // Header: magic \"VBUU\"\n bucket[0] = 0x56; bucket[1] = 0x42; bucket[2] = 0x55; bucket[3] = 0x55;\n bucketView.setUint32(4, 1, false); // version\n bucketView.setUint32(8, recordSize, false);\n bucketView.setUint32(12, records.length, false);\n bucketView.setUint32(16, headerSize, false);\n\n // Records\n for (let ri = 0; ri < records.length; ri++) {\n const off = headerSize + ri * recordSize;\n const anchor = records[ri].anchor;\n // u64 BE time_anchor\n const anchorBig = BigInt(anchor);\n bucketView.setUint32(off, Number(anchorBig >> 32n), false);\n bucketView.setUint32(off + 4, Number(anchorBig & 0xffffffffn), false);\n // f32 LE vector\n for (let d = 0; d < dim; d++) {\n bucketView.setFloat32(off + 8 + d * 4, records[ri].vec[d], true);\n }\n }\n\n const bucketHash = contentHash(bucket);\n const bucketHashB32 = bytesToBase32(bucketHash);\n await this.backend.put(\n `${this._timelineHash}/${modality}/${spatialKey}/${bucketHashB32}`,\n bucket,\n );\n\n // SpatialBucketEntry: [spatial_key, t_start, t_end, byte_size, bucket_hash]\n const tAnchors = records.map((r) => r.anchor).sort((a, b) => a - b);\n newEntries.push([\n spatialKey,\n BigInt(tAnchors[0]),\n BigInt(tAnchors[tAnchors.length - 1]),\n totalSize,\n bucketHash,\n ]);\n }\n\n const newTrackObj: CborValue = { object_index: newEntries };\n const newTrackBytes = encodeCbor(newTrackObj);\n const newTrackHash = contentHash(newTrackBytes);\n const newTrackHashB32 = bytesToBase32(newTrackHash);\n await this.backend.put(\n `${this._timelineHash}/${modality}/track/${newTrackHashB32}`,\n newTrackBytes,\n );\n newTracks.push({ ...track, address: newTrackHash });\n } else if (field.kind === \"scalar\") {\n // Group by distinct value\n const valGroups = new Map<string, TimeAnchor[]>();\n for (let i = 0; i < samples.length; i++) {\n const value = samples[i][field.name];\n if (value === null || value === undefined) continue;\n const key = String(value);\n if (!valGroups.has(key)) valGroups.set(key, []);\n valGroups.get(key)!.push(anchors[i]);\n }\n\n const newEntries: CborValue[] = [...objIndex];\n for (const [valueStr, anchorList] of valGroups) {\n // Encode the anchor list as CBOR array of u64\n const anchorsCbor: CborValue = anchorList.map((a) => BigInt(a));\n const bucketBytes = encodeCbor(anchorsCbor);\n const bucketHash = contentHash(bucketBytes);\n const bucketHashB32 = bytesToBase32(bucketHash);\n await this.backend.put(\n `${this._timelineHash}/${modality}/bucket/${bucketHashB32}`,\n bucketBytes,\n );\n\n // Encode the value itself as CBOR\n const valueCbor = parseScalarString(valueStr, (field as ScalarFieldDef).valueType);\n const valueCborBytes = encodeCbor(valueCbor);\n\n // ScalarBucketEntry: [value_cbor_bytes, t_start, t_end, bucket_hash]\n const sortedAnchors = anchorList.sort((a, b) => a - b);\n newEntries.push([\n valueCborBytes,\n BigInt(sortedAnchors[0]),\n BigInt(sortedAnchors[sortedAnchors.length - 1]),\n bucketHash,\n ]);\n }\n\n const newTrackObj: CborValue = { object_index: newEntries };\n const newTrackBytes = encodeCbor(newTrackObj);\n const newTrackHash = contentHash(newTrackBytes);\n const newTrackHashB32 = bytesToBase32(newTrackHash);\n await this.backend.put(\n `${this._timelineHash}/${modality}/track/${newTrackHashB32}`,\n newTrackBytes,\n );\n newTracks.push({ ...track, address: newTrackHash });\n } else {\n newTracks.push(track);\n }\n }\n\n // Write new manifest with parent pointer\n const oldManifestHash = base32ToBytes(this._manifestHash);\n // Pad or trim to MULTIHASH_BYTES\n const parentBytes = new Uint8Array(MULTIHASH_BYTES);\n parentBytes.set(oldManifestHash.subarray(0, MULTIHASH_BYTES));\n\n const newManifest: CborValue = {\n timelines: manifest.timelines,\n tracks: newTracks,\n parents: [parentBytes],\n ts: BigInt(Date.now()) * 1000000n,\n writer: \"dreamdb-ts/0.1.0\",\n registry: manifest.registry || {},\n };\n\n const newManifestBytes = encodeCbor(newManifest);\n const newManifestHash = contentHash(newManifestBytes);\n const newManifestHashB32 = bytesToBase32(newManifestHash);\n\n await this.backend.put(`manifests/${newManifestHashB32}`, newManifestBytes);\n await this.backend.put(`refs/${this._refName}`, newManifestHash);\n\n this._manifestHash = newManifestHashB32;\n return samples.length;\n }\n\n // ---- Read path ----\n\n async iterVector(\n field: string,\n query: number[] | Float32Array,\n topK: number,\n batchSize = 64,\n opts: { whereEq?: WhereClause } = {},\n ): Promise<Batch[]> {\n // Read current manifest\n const manifestBytes = await this.backend.get(`manifests/${this._manifestHash}`);\n const manifest = decodeCbor(manifestBytes) as Record<string, CborValue>;\n const tracks = manifest.tracks as Array<Record<string, CborValue>>;\n\n // Find embedding track\n const embField = this._schema.fields.find(\n (f) => f.kind === \"embedding\" && f.name === field,\n ) as EmbeddingFieldDef | undefined;\n if (!embField) throw new Error(`no embedding field \"${field}\" in schema`);\n\n const modality = modalityForField({\n kind: embField.kind,\n dim: embField.dim,\n name: embField.name,\n })!;\n const dim = embField.dim;\n\n // Find the track\n const track = tracks.find((t) => t.modality === modality);\n if (!track) throw new Error(`no Track for modality ${modality}`);\n\n const trackAddr = bytesToBase32(track.address as Uint8Array);\n const trackBytes = await this.backend.get(\n `${this._timelineHash}/${modality}/track/${trackAddr}`,\n );\n const trackObj = decodeCbor(trackBytes) as Record<string, CborValue>;\n const objIndex = trackObj.object_index as CborValue[];\n if (!Array.isArray(objIndex) || objIndex.length === 0) return [];\n\n // Score all records\n const qNorm = normalizeL2(\n query instanceof Float32Array ? query : new Float32Array(query),\n );\n const recordSize = 8 + dim * 4;\n\n interface Candidate {\n anchor: TimeAnchor;\n score: number;\n vec: Float32Array;\n }\n const candidates: Candidate[] = [];\n\n for (const entry of objIndex) {\n const e = entry as CborValue[];\n const spatialKey = e[0] as string;\n const bucketAddr = bytesToBase32(e[4] as Uint8Array);\n const body = await this.backend.get(\n `${this._timelineHash}/${modality}/${spatialKey}/${bucketAddr}`,\n );\n\n // Decode bucket records\n const view = new DataView(body.buffer, body.byteOffset, body.byteLength);\n const headerSize = view.getUint32(16, false);\n const recordCount = view.getUint32(12, false);\n const actualRecordSize = view.getUint32(8, false);\n\n for (let i = 0; i < recordCount; i++) {\n const off = headerSize + i * actualRecordSize;\n const hi = view.getUint32(off, false);\n const lo = view.getUint32(off + 4, false);\n const anchor = Number((BigInt(hi) << 32n) | BigInt(lo));\n const vec = new Float32Array(dim);\n for (let d = 0; d < dim; d++) {\n vec[d] = view.getFloat32(off + 8 + d * 4, true);\n }\n const normVec = normalizeL2(vec);\n const score = dotL2Normalized(qNorm, normVec);\n candidates.push({ anchor, score, vec });\n }\n }\n\n // Sort by score descending, take topK\n candidates.sort((a, b) => b.score - a.score);\n let topCandidates = candidates.slice(0, topK);\n\n // Apply where_eq filter using scalar tracks\n if (opts.whereEq && Object.keys(opts.whereEq).length > 0) {\n const anchorLabels = await this._resolveScalarLabels(\n manifest,\n tracks,\n opts.whereEq,\n );\n topCandidates = topCandidates.filter((c) => {\n for (const [filterField, filterValue] of Object.entries(opts.whereEq!)) {\n const labelMap = anchorLabels.get(filterField);\n if (!labelMap) return false;\n const anchorVal = labelMap.get(c.anchor);\n if (anchorVal === undefined || String(anchorVal) !== String(filterValue))\n return false;\n }\n return true;\n });\n }\n\n // Resolve blob data for the top results\n const blobFields = this._schema.fields.filter(\n (f) => f.kind === \"image\" || f.kind === \"audio\" || f.kind === \"video\",\n );\n const scalarFields = this._schema.fields.filter((f) => f.kind === \"scalar\");\n\n // Build the set of all anchors we need\n const resultAnchors = new Set(topCandidates.map((c) => c.anchor));\n\n // Build blob lookups\n const blobData = new Map<string, Map<TimeAnchor, Uint8Array>>();\n for (const bf of blobFields) {\n const bfMod = modalityForField({\n kind: bf.kind,\n mime: (bf as ImageFieldDef).mime,\n name: bf.name,\n })!;\n const bfTrack = tracks.find((t) => t.modality === bfMod);\n if (!bfTrack) continue;\n const bfAddr = bytesToBase32(bfTrack.address as Uint8Array);\n const bfTrackBytes = await this.backend.get(\n `${this._timelineHash}/${bfMod}/track/${bfAddr}`,\n );\n const bfTrackObj = decodeCbor(bfTrackBytes) as Record<string, CborValue>;\n const bfObjIndex = bfTrackObj.object_index as CborValue[];\n if (!Array.isArray(bfObjIndex)) continue;\n\n const fieldData = new Map<TimeAnchor, Uint8Array>();\n for (const entry of bfObjIndex) {\n const e = entry as CborValue[];\n const tStart = Number(e[0] as bigint);\n if (!resultAnchors.has(tStart)) continue;\n const fragHash = bytesToBase32(e[3] as Uint8Array);\n try {\n const fragBytes = await this.backend.get(\n `${this._timelineHash}/${bfMod}/0000000000000000/${fragHash}`,\n );\n fieldData.set(tStart, fragBytes);\n } catch {\n // Fragment missing — skip\n }\n }\n blobData.set(bf.name, fieldData);\n }\n\n // Build scalar lookups\n const scalarData = new Map<string, Map<TimeAnchor, CborValue>>();\n for (const sf of scalarFields) {\n const sfMod = modalityForField({\n kind: sf.kind,\n name: sf.name,\n valueType: (sf as ScalarFieldDef).valueType,\n })!;\n const sfTrack = tracks.find((t) => t.modality === sfMod);\n if (!sfTrack) continue;\n const sfAddr = bytesToBase32(sfTrack.address as Uint8Array);\n const sfTrackBytes = await this.backend.get(\n `${this._timelineHash}/${sfMod}/track/${sfAddr}`,\n );\n const sfTrackObj = decodeCbor(sfTrackBytes) as Record<string, CborValue>;\n const sfObjIndex = sfTrackObj.object_index as CborValue[];\n if (!Array.isArray(sfObjIndex)) continue;\n\n const fieldData = new Map<TimeAnchor, CborValue>();\n for (const entry of sfObjIndex) {\n const e = entry as CborValue[];\n const valueCborBytes = e[0] as Uint8Array;\n const value = decodeCbor(valueCborBytes);\n const bucketHash = bytesToBase32(e[3] as Uint8Array);\n try {\n const bucketBytes = await this.backend.get(\n `${this._timelineHash}/${sfMod}/bucket/${bucketHash}`,\n );\n const anchorArray = decodeCbor(bucketBytes) as CborValue[];\n if (Array.isArray(anchorArray)) {\n for (const a of anchorArray) {\n const anchor = Number(a as bigint);\n if (resultAnchors.has(anchor)) {\n fieldData.set(anchor, value);\n }\n }\n }\n } catch {\n // Bucket missing — skip\n }\n }\n scalarData.set(sf.name, fieldData);\n }\n\n // Build batches\n const batches: Batch[] = [];\n for (let i = 0; i < topCandidates.length; i += batchSize) {\n const slice = topCandidates.slice(i, i + batchSize);\n const batch: Batch = {\n _time_anchors: slice.map((c) => c.anchor),\n [field]: slice.map((c) => Array.from(c.vec)),\n };\n for (const bf of blobFields) {\n const fieldMap = blobData.get(bf.name);\n batch[bf.name] = slice.map((c) =>\n fieldMap?.get(c.anchor) ?? null,\n ) as unknown[];\n }\n for (const sf of scalarFields) {\n const fieldMap = scalarData.get(sf.name);\n batch[sf.name] = slice.map((c) =>\n fieldMap?.get(c.anchor) ?? null,\n ) as unknown[];\n }\n batches.push(batch);\n }\n return batches;\n }\n\n // ---- Streaming iteration ----\n\n private async *_iterStreamImpl(\n batchSize: number,\n ): AsyncGenerator<Batch> {\n const manifestBytes = await this.backend.get(`manifests/${this._manifestHash}`);\n const manifest = decodeCbor(manifestBytes) as Record<string, CborValue>;\n const tracks = manifest.tracks as Array<Record<string, CborValue>>;\n\n // Find embedding track(s)\n const embField = this._schema.fields.find(\n (f) => f.kind === \"embedding\",\n ) as EmbeddingFieldDef | undefined;\n if (!embField) return;\n\n const modality = modalityForField({\n kind: embField.kind,\n dim: embField.dim,\n name: embField.name,\n })!;\n const dim = embField.dim;\n const track = tracks.find((t) => t.modality === modality);\n if (!track) return;\n\n const trackAddr = bytesToBase32(track.address as Uint8Array);\n const trackBytes = await this.backend.get(\n `${this._timelineHash}/${modality}/track/${trackAddr}`,\n );\n const trackObj = decodeCbor(trackBytes) as Record<string, CborValue>;\n const objIndex = trackObj.object_index as CborValue[];\n if (!Array.isArray(objIndex)) return;\n\n let buffer: TimeAnchor[] = [];\n for (const entry of objIndex) {\n const e = entry as CborValue[];\n const spatialKey = e[0] as string;\n const bucketAddr = bytesToBase32(e[4] as Uint8Array);\n const body = await this.backend.get(\n `${this._timelineHash}/${modality}/${spatialKey}/${bucketAddr}`,\n );\n const view = new DataView(body.buffer, body.byteOffset, body.byteLength);\n const headerSize = view.getUint32(16, false);\n const recordCount = view.getUint32(12, false);\n const recordSize = view.getUint32(8, false);\n\n for (let i = 0; i < recordCount; i++) {\n const off = headerSize + i * recordSize;\n const hi = view.getUint32(off, false);\n const lo = view.getUint32(off + 4, false);\n const anchor = Number((BigInt(hi) << 32n) | BigInt(lo));\n buffer.push(anchor);\n\n if (buffer.length >= batchSize) {\n yield { _time_anchors: buffer };\n buffer = [];\n }\n }\n }\n if (buffer.length > 0) {\n yield { _time_anchors: buffer };\n }\n }\n\n async iterStream(batchSize = 256): Promise<Batch[]> {\n const batches: Batch[] = [];\n for await (const batch of this._iterStreamImpl(batchSize)) {\n batches.push(batch);\n }\n return batches;\n }\n\n // ---- Versioning ----\n\n async snapshot(label: string): Promise<SnapshotInfo> {\n const manifestHash = base32ToBytes(this._manifestHash);\n const refBytes = new Uint8Array(MULTIHASH_BYTES);\n refBytes.set(manifestHash.subarray(0, MULTIHASH_BYTES));\n await this.backend.put(`refs/${label}`, refBytes);\n return {\n label,\n manifest: this._manifestHash,\n timeline: this._timelineHash,\n };\n }\n\n async branch(newName: string): Promise<Dataset> {\n const manifestHash = base32ToBytes(this._manifestHash);\n const refBytes = new Uint8Array(MULTIHASH_BYTES);\n refBytes.set(manifestHash.subarray(0, MULTIHASH_BYTES));\n await this.backend.put(`refs/${newName}`, refBytes);\n return new Dataset(\n this.backend,\n newName,\n this._manifestHash,\n this._timelineHash,\n this._schema,\n );\n }\n\n // ---- Scalar resolution helper ----\n\n private async _resolveScalarLabels(\n manifest: Record<string, CborValue>,\n tracks: Array<Record<string, CborValue>>,\n whereEq: WhereClause,\n ): Promise<Map<string, Map<TimeAnchor, CborValue>>> {\n const result = new Map<string, Map<TimeAnchor, CborValue>>();\n\n for (const [filterField, _filterValue] of Object.entries(whereEq)) {\n const sf = this._schema.fields.find(\n (f) => f.kind === \"scalar\" && f.name === filterField,\n ) as ScalarFieldDef | undefined;\n if (!sf) continue;\n\n const sfMod = modalityForField({\n kind: sf.kind,\n name: sf.name,\n valueType: sf.valueType,\n })!;\n const sfTrack = tracks.find((t) => t.modality === sfMod);\n if (!sfTrack) continue;\n\n const sfAddr = bytesToBase32(sfTrack.address as Uint8Array);\n const sfTrackBytes = await this.backend.get(\n `${this._timelineHash}/${sfMod}/track/${sfAddr}`,\n );\n const sfTrackObj = decodeCbor(sfTrackBytes) as Record<string, CborValue>;\n const sfObjIndex = sfTrackObj.object_index as CborValue[];\n if (!Array.isArray(sfObjIndex)) continue;\n\n const fieldData = new Map<TimeAnchor, CborValue>();\n for (const entry of sfObjIndex) {\n const e = entry as CborValue[];\n const valueCborBytes = e[0] as Uint8Array;\n const value = decodeCbor(valueCborBytes);\n const bucketHash = bytesToBase32(e[3] as Uint8Array);\n try {\n const bucketBytes = await this.backend.get(\n `${this._timelineHash}/${sfMod}/bucket/${bucketHash}`,\n );\n const anchorArray = decodeCbor(bucketBytes) as CborValue[];\n if (Array.isArray(anchorArray)) {\n for (const a of anchorArray) {\n fieldData.set(Number(a as bigint), value);\n }\n }\n } catch {\n // skip\n }\n }\n result.set(filterField, fieldData);\n }\n return result;\n }\n}\n\n// ---- Helpers ----\n\nfunction resolveBackend(url: string): Backend {\n if (url === \"memory://\" || url === \"\") {\n return new MemoryBackend();\n }\n if (url.startsWith(\"file://\")) {\n // File backend not implemented in browser-first SDK — fall back to memory\n throw new Error(\"file:// backend not supported in the TypeScript SDK (browser-first)\");\n }\n // Assume S3-compatible HTTP URL\n return new S3Backend(url);\n}\n\n/**\n * Deterministic content hash — simplified version for the TS SDK.\n * Uses a simple FNV-1a-like hash to produce 33-byte multihash.\n * In production, this should be blake3 or sha256.\n */\nfunction contentHash(data: Uint8Array): Uint8Array {\n // Multihash format: [hash_fn_code, hash_length, ...hash_bytes]\n // We use a simple hash for the in-memory path\n const hash = new Uint8Array(MULTIHASH_BYTES);\n hash[0] = 0x1e; // blake3 function code placeholder\n hash[1] = 31; // 31 bytes of hash data\n\n // FNV-1a 256-bit spread across 31 bytes\n const FNV_OFFSET = 0xcbf29ce484222325n;\n const FNV_PRIME = 0x100000001b3n;\n let h = FNV_OFFSET;\n for (let i = 0; i < data.length; i++) {\n h = h ^ BigInt(data[i]);\n h = (h * FNV_PRIME) & 0xffffffffffffffffn;\n }\n\n // Spread the 64-bit hash across 31 bytes with a mixing step\n const buf = new DataView(new ArrayBuffer(8));\n buf.setBigUint64(0, h);\n for (let i = 0; i < 31; i++) {\n // Mix the 8-byte hash into 31 bytes\n const byteIdx = i % 8;\n const seed = new Uint8Array(new ArrayBuffer(8));\n new DataView(seed.buffer).setBigUint64(0, h);\n hash[2 + i] = seed[byteIdx] ^ ((i * 0x9e + 0x37) & 0xff);\n // Re-mix\n h = (h * FNV_PRIME + BigInt(i)) & 0xffffffffffffffffn;\n }\n\n return hash;\n}\n\n/** Generate a deterministic hash from a string (for timeline IDs). */\nfunction hashFromString(s: string): Uint8Array {\n const encoded = new TextEncoder().encode(s);\n return contentHash(encoded);\n}\n\n/** Parse a scalar string value back to its typed form. */\nfunction parseScalarString(\n s: string,\n valueType: ScalarValueType,\n): CborValue {\n switch (valueType) {\n case \"bool\":\n return s === \"true\";\n case \"int\":\n return parseInt(s, 10);\n case \"float\":\n return parseFloat(s);\n default:\n return s; // categorical, string, timestamp\n }\n}\n\n/** Recover a Schema from its CBOR representation. */\nfunction schemaFromCbor(obj: Record<string, CborValue>): Schema {\n const schema = new Schema();\n const fields = obj.fields as Array<Record<string, CborValue>>;\n if (!Array.isArray(fields)) return schema;\n\n for (const f of fields) {\n const kind = f.kind as string;\n const name = f.name as string;\n if (kind === \"image\") {\n schema.addImage(name, {\n mime: (f.mime as string) || \"jpeg\",\n required: f.required !== false,\n });\n } else if (kind === \"audio\") {\n schema.addAudio(name, {\n mime: (f.mime as string) || \"wav\",\n required: f.required !== false,\n });\n } else if (kind === \"video\") {\n schema.addVideo(name, {\n mime: (f.mime as string) || \"mp4\",\n required: f.required !== false,\n });\n } else if (kind === \"embedding\") {\n schema.addEmbedding(name, {\n dim: Number(f.dim),\n algorithm: (f.algorithm as string) || \"dreamdb.lsh-cosine\",\n required: f.required !== false,\n rerank: f.rerank === true,\n });\n } else if (kind === \"scalar\") {\n const vt = (f.value_type as string) || \"categorical\";\n switch (vt) {\n case \"categorical\": schema.addScalarCategorical(name); break;\n case \"bool\": schema.addScalarBool(name); break;\n case \"int\": schema.addScalarInt(name); break;\n case \"float\": schema.addScalarFloat(name); break;\n case \"string\": schema.addScalarString(name); break;\n case \"timestamp\": schema.addScalarTimestamp(name); break;\n }\n }\n }\n return schema;\n}\n","// ---- Fundamental types ----\n\n/** 33-byte multihash, represented as Uint8Array on the wire. */\nexport type MultihashBytes = Uint8Array;\n\n/** Base32-encoded string form of a multihash. */\nexport type Base32Hash = string;\n\n/** Nanoseconds since UNIX epoch — the join key across all modalities. */\nexport type TimeAnchor = number;\n\n// ---- Schema types ----\n\nexport type FieldKind = \"image\" | \"audio\" | \"video\" | \"embedding\" | \"scalar\";\n\nexport type ScalarValueType =\n | \"categorical\"\n | \"bool\"\n | \"int\"\n | \"float\"\n | \"string\"\n | \"timestamp\";\n\nexport interface ImageFieldDef {\n kind: \"image\";\n name: string;\n mime: string;\n required: boolean;\n chunkSize?: number;\n packItems?: number;\n}\n\nexport interface AudioFieldDef {\n kind: \"audio\";\n name: string;\n mime: string;\n required: boolean;\n chunkSize?: number;\n packItems?: number;\n}\n\nexport interface VideoFieldDef {\n kind: \"video\";\n name: string;\n mime: string;\n required: boolean;\n chunkSize?: number;\n packItems?: number;\n}\n\nexport interface EmbeddingFieldDef {\n kind: \"embedding\";\n name: string;\n dim: number;\n algorithm: string;\n required: boolean;\n lshBits?: number;\n compressor?: MultihashBytes;\n spatialIndex?: MultihashBytes;\n rerank: boolean;\n}\n\nexport interface ScalarFieldDef {\n kind: \"scalar\";\n name: string;\n valueType: ScalarValueType;\n required: boolean;\n}\n\nexport type FieldDef =\n | ImageFieldDef\n | AudioFieldDef\n | VideoFieldDef\n | EmbeddingFieldDef\n | ScalarFieldDef;\n\n// ---- Manifest types ----\n\nexport interface ManifestTrack {\n modality: string;\n kind: string;\n role: string;\n address: MultihashBytes;\n timeline: MultihashBytes;\n coverage: unknown;\n}\n\nexport interface Manifest {\n timelines: MultihashBytes[];\n tracks: ManifestTrack[];\n parents?: MultihashBytes[];\n ts?: number | bigint;\n writer?: string;\n registry?: Record<string, RegistryEntry>;\n}\n\nexport interface RegistryEntry {\n spatial_index?: MultihashBytes[];\n spatial_index_hashes?: MultihashBytes[];\n vector_compressor?: MultihashBytes;\n [key: string]: unknown;\n}\n\n// ---- Track types (resolved) ----\n\nexport interface ResolvedTrack {\n modality: string;\n field: string | null;\n key: string;\n kind: string;\n role: string;\n address: Base32Hash;\n timeline: Base32Hash;\n coverage: unknown;\n}\n\n// ---- Query types ----\n\nexport interface VectorQueryOptions {\n topK?: number;\n probeCount?: number;\n maxHamming?: number;\n}\n\nexport interface VectorQueryResult {\n anchor: TimeAnchor;\n score: number;\n}\n\nexport interface QueryStats {\n bucketsTotal: number;\n bucketsProbed: number;\n fellBackToBruteForce: boolean;\n candidatesScored?: number;\n topT?: number;\n rerankFetchCount?: number;\n rerankSkippedNoHash?: number;\n}\n\n// ---- History types ----\n\nexport interface HistoryEntry {\n manifestHash: Base32Hash;\n ts: number;\n writer: string;\n tracks: Array<{ modality: string; address: Base32Hash }>;\n parents: number;\n truncatedAt?: string;\n}\n\n// ---- Batch types ----\n\nexport interface Batch {\n [fieldName: string]: unknown[];\n _time_anchors: TimeAnchor[];\n}\n\n// ---- Backend types ----\n\nexport interface BackendGetOptions {\n noCache?: boolean;\n}\n\nexport interface BackendPutOptions {\n contentType?: string;\n}\n\n/**\n * Abstract storage backend. All connector implementations must fulfill\n * this interface. GET is required; PUT is needed only for write paths.\n */\nexport interface Backend {\n /** Fetch bytes at `path` relative to the backend root. */\n get(path: string, opts?: BackendGetOptions): Promise<Uint8Array>;\n\n /** Store bytes at `path`. Returns the path written. */\n put(path: string, data: Uint8Array, opts?: BackendPutOptions): Promise<string>;\n\n /** List keys under `prefix`. */\n list(prefix: string): Promise<string[]>;\n\n /** Delete a key. */\n delete(path: string): Promise<void>;\n}\n\n// ---- Sample types (for write path) ----\n\nexport type SampleValue =\n | Uint8Array\n | number[]\n | Float32Array\n | string\n | number\n | boolean\n | null;\n\nexport type Sample = {\n [fieldName: string]: SampleValue;\n};\n\n// ---- Dataset types ----\n\nexport interface DatasetInfo {\n refName: string;\n manifest: Base32Hash;\n timeline: Base32Hash;\n}\n\nexport interface SnapshotInfo {\n label: string;\n manifest: Base32Hash;\n timeline: Base32Hash;\n}\n\n// ---- Where-clause filter ----\n\nexport type WhereClause = Record<string, string | number | boolean>;\n\n// ---- Spatial dispatcher ----\n\nexport interface SpatialDispatcher {\n algorithm: string;\n dim: number;\n bits: number;\n k?: number;\n probeKeys(qNorm: Float32Array, probeCount: number, maxHamming: number): string[];\n}\n\n// ---- Vector compressor decoder ----\n\nexport interface VectorCompressorDecoder {\n algorithm: string;\n dim: number;\n recordCodeBytes: number;\n decode(codes: Uint8Array): Float32Array;\n rotateQuery?(qNorm: Float32Array): Float32Array;\n adcScore?(rotatedQuery: Float32Array, codes: Uint8Array): number;\n}\n\n// ---- Bucket record ----\n\nexport interface BucketRecord {\n anchor: TimeAnchor;\n ordinal: number;\n vec?: Float32Array;\n codes?: Uint8Array;\n}\n\n// ---- CBOR decoded value ----\n\nexport type CborValue =\n | number\n | bigint\n | string\n | boolean\n | null\n | undefined\n | Uint8Array\n | CborValue[]\n | { [key: string]: CborValue };\n\n// ---- Scalar modality encoding table ----\n\nexport const SCALAR_ENCODING_MAP: Record<string, string> = {\n categorical: \"cat\",\n bool: \"bool\",\n int: \"i64\",\n float: \"f64\",\n string: \"str\",\n timestamp: \"ts\",\n};\n"],"mappings":"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","names":["out"]}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cbor.ts","../src/uri.ts","../src/backend.ts","../src/query.ts","../src/space.ts","../src/dataset.ts","../src/types.ts"],"sourcesContent":["/**\n * CBOR decoder — handles the exact DreamDB/Vortex subset:\n * Major type 0: unsigned integers (u8/u16/u32/u64)\n * Major type 1: negative integers\n * Major type 2: byte strings\n * Major type 3: text strings\n * Major type 4: arrays\n * Major type 5: maps\n * Major type 7: simple values (false, true, null, undefined) + IEEE-754 floats\n *\n * Port of the hand-rolled decoder from demo/dreamdb.js.\n */\n\nimport type { CborValue } from \"./types.js\";\n\n/** Decode a single CBOR value from the front of `bytes`. */\nexport function decodeCbor(bytes: Uint8Array): CborValue {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const r = { off: 0 };\n return readValue(view, bytes, r);\n}\n\n/**\n * Encode a CBOR value. Supports the same subset the decoder handles:\n * unsigned ints, negative ints, byte strings, text strings, arrays,\n * maps, booleans, null, undefined, and f64 floats.\n */\nexport function encodeCbor(value: CborValue): Uint8Array {\n const parts: Uint8Array[] = [];\n encodeValue(value, parts);\n // Concatenate all parts\n let totalLen = 0;\n for (const p of parts) totalLen += p.length;\n const out = new Uint8Array(totalLen);\n let off = 0;\n for (const p of parts) {\n out.set(p, off);\n off += p.length;\n }\n return out;\n}\n\nfunction encodeValue(value: CborValue, parts: Uint8Array[]): void {\n if (value === null) {\n parts.push(new Uint8Array([0xf6])); // major 7, ai 22\n return;\n }\n if (value === undefined) {\n parts.push(new Uint8Array([0xf7])); // major 7, ai 23\n return;\n }\n if (value === true) {\n parts.push(new Uint8Array([0xf5])); // major 7, ai 21\n return;\n }\n if (value === false) {\n parts.push(new Uint8Array([0xf4])); // major 7, ai 20\n return;\n }\n if (typeof value === \"number\") {\n if (Number.isInteger(value) && value >= 0 && value <= Number.MAX_SAFE_INTEGER) {\n encodeUint(0, value, parts);\n } else if (Number.isInteger(value) && value < 0 && value >= -Number.MAX_SAFE_INTEGER) {\n encodeUint(1, -1 - value, parts);\n } else {\n // f64\n const buf = new Uint8Array(9);\n buf[0] = 0xfb; // major 7, ai 27\n const dv = new DataView(buf.buffer);\n dv.setFloat64(1, value);\n parts.push(buf);\n }\n return;\n }\n if (typeof value === \"bigint\") {\n if (value >= 0n) {\n encodeUint64(0, value, parts);\n } else {\n encodeUint64(1, -1n - value, parts);\n }\n return;\n }\n if (typeof value === \"string\") {\n const encoded = new TextEncoder().encode(value);\n encodeUint(3, encoded.length, parts);\n parts.push(encoded);\n return;\n }\n if (value instanceof Uint8Array) {\n encodeUint(2, value.length, parts);\n parts.push(new Uint8Array(value));\n return;\n }\n if (Array.isArray(value)) {\n encodeUint(4, value.length, parts);\n for (const item of value) {\n encodeValue(item, parts);\n }\n return;\n }\n if (typeof value === \"object\") {\n const keys = Object.keys(value);\n encodeUint(5, keys.length, parts);\n for (const k of keys) {\n encodeValue(k, parts);\n encodeValue((value as Record<string, CborValue>)[k], parts);\n }\n return;\n }\n}\n\nfunction encodeUint(majorType: number, n: number, parts: Uint8Array[]): void {\n const mt = majorType << 5;\n if (n < 24) {\n parts.push(new Uint8Array([mt | n]));\n } else if (n < 0x100) {\n parts.push(new Uint8Array([mt | 24, n]));\n } else if (n < 0x10000) {\n const buf = new Uint8Array(3);\n buf[0] = mt | 25;\n buf[1] = (n >> 8) & 0xff;\n buf[2] = n & 0xff;\n parts.push(buf);\n } else if (n < 0x100000000) {\n const buf = new Uint8Array(5);\n buf[0] = mt | 26;\n const dv = new DataView(buf.buffer);\n dv.setUint32(1, n);\n parts.push(buf);\n } else {\n encodeUint64(majorType, BigInt(n), parts);\n }\n}\n\nfunction encodeUint64(majorType: number, n: bigint, parts: Uint8Array[]): void {\n const mt = majorType << 5;\n const buf = new Uint8Array(9);\n buf[0] = mt | 27;\n const dv = new DataView(buf.buffer);\n dv.setBigUint64(1, n);\n parts.push(buf);\n}\n\n// ---- internal decoder ----\n\ninterface ReadPos {\n off: number;\n}\n\nfunction readValue(view: DataView, bytes: Uint8Array, r: ReadPos): CborValue {\n const ib = bytes[r.off++];\n const mt = ib >> 5;\n const ai = ib & 0x1f;\n const arg = readArg(view, bytes, r, ai);\n\n switch (mt) {\n case 0:\n // Unsigned integer\n return typeof arg === \"bigint\" ? (arg <= BigInt(Number.MAX_SAFE_INTEGER) ? Number(arg) : arg) : arg;\n case 1:\n // Negative integer\n if (typeof arg === \"bigint\") {\n const val = -1n - arg;\n return val >= BigInt(Number.MIN_SAFE_INTEGER) ? Number(val) : val;\n }\n return -1 - Number(arg);\n case 2: {\n // Byte string\n const len = Number(arg);\n const out = bytes.slice(r.off, r.off + len);\n r.off += len;\n return out;\n }\n case 3: {\n // Text string\n const len = Number(arg);\n const sl = bytes.subarray(r.off, r.off + len);\n r.off += len;\n return new TextDecoder().decode(sl);\n }\n case 4: {\n // Array\n const len = Number(arg);\n const arr: CborValue[] = [];\n for (let i = 0; i < len; i++) arr.push(readValue(view, bytes, r));\n return arr;\n }\n case 5: {\n // Map\n const len = Number(arg);\n const obj: Record<string, CborValue> = {};\n for (let i = 0; i < len; i++) {\n const k = readValue(view, bytes, r);\n const v = readValue(view, bytes, r);\n obj[String(k)] = v;\n }\n return obj;\n }\n case 7: {\n // Simple values + IEEE-754 floats\n if (ai === 20) return false;\n if (ai === 21) return true;\n if (ai === 22) return null;\n if (ai === 23) return undefined;\n if (ai === 26) return view.getFloat32(r.off - 4);\n if (ai === 27) return view.getFloat64(r.off - 8);\n if (ai === 25) {\n // Half-float (binary16)\n const raw = Number(arg);\n const sign = (raw >> 15) & 0x1;\n const exp = (raw >> 10) & 0x1f;\n const frac = raw & 0x3ff;\n let val: number;\n if (exp === 0) {\n val = frac === 0 ? 0 : Math.pow(2, -24) * frac;\n } else if (exp === 31) {\n val = frac === 0 ? Infinity : NaN;\n } else {\n val = Math.pow(2, exp - 25) * (1024 + frac);\n }\n return sign ? -val : val;\n }\n throw new Error(`CBOR simple ${ai} not supported`);\n }\n default:\n throw new Error(`CBOR major type ${mt} not supported`);\n }\n}\n\nfunction readArg(\n view: DataView,\n bytes: Uint8Array,\n r: ReadPos,\n ai: number,\n): number | bigint {\n if (ai < 24) return ai;\n if (ai === 24) return bytes[r.off++];\n if (ai === 25) {\n const v = view.getUint16(r.off);\n r.off += 2;\n return v;\n }\n if (ai === 26) {\n const v = view.getUint32(r.off);\n r.off += 4;\n return v;\n }\n if (ai === 27) {\n const v = view.getBigUint64(r.off);\n r.off += 8;\n return v;\n }\n throw new Error(`CBOR additional-info ${ai} not supported`);\n}\n","/**\n * DreamDB URI parsing and Base32 encoding/decoding.\n *\n * A \"DreamDB Space URI\" is the absolute HTTP URL of either a `refs/<name>`\n * or `manifests/<hash>` Object on the connector backend:\n *\n * http://localhost:9000/ucf101-mp4/refs/ucf101-mp4\n * http://localhost:9000/ucf101-mp4/manifests/dytslnbcty5b...\n */\n\nimport type { Base32Hash, MultihashBytes } from \"./types.js\";\n\nexport const MULTIHASH_BYTES = 33;\n\nconst BASE32_ALPHABET = \"abcdefghijklmnopqrstuvwxyz234567\";\n\n// Build reverse lookup for decoding\nconst BASE32_DECODE_MAP = new Map<string, number>();\nfor (let i = 0; i < BASE32_ALPHABET.length; i++) {\n BASE32_DECODE_MAP.set(BASE32_ALPHABET[i], i);\n}\n\n/** Encode raw bytes to lowercase base32 (RFC 4648, no padding). */\nexport function bytesToBase32(bytes: Uint8Array): Base32Hash {\n let bits = 0;\n let value = 0;\n let out = \"\";\n for (const b of bytes) {\n value = (value << 8) | b;\n bits += 8;\n while (bits >= 5) {\n bits -= 5;\n out += BASE32_ALPHABET[(value >> bits) & 0x1f];\n }\n }\n if (bits > 0) out += BASE32_ALPHABET[(value << (5 - bits)) & 0x1f];\n return out;\n}\n\n/** Decode a base32 string back to raw bytes. */\nexport function base32ToBytes(str: string): Uint8Array {\n const lower = str.toLowerCase();\n let bits = 0;\n let value = 0;\n const out: number[] = [];\n for (const ch of lower) {\n const v = BASE32_DECODE_MAP.get(ch);\n if (v === undefined) throw new Error(`Invalid base32 character: '${ch}'`);\n value = (value << 5) | v;\n bits += 5;\n while (bits >= 8) {\n bits -= 8;\n out.push((value >> bits) & 0xff);\n }\n }\n return new Uint8Array(out);\n}\n\n// ---- Space URI parsing ----\n\nexport interface ParsedSpaceUri {\n connectorBase: string;\n kind: \"ref\" | \"manifest\";\n id: string;\n}\n\n/**\n * Split a Space URI into { connectorBase, kind, id }.\n *\n * \"https://host/bucket/refs/foo\" → { connectorBase: \"https://host/bucket\", kind: \"ref\", id: \"foo\" }\n * \"https://host/bucket/manifests/dXYZ\" → { connectorBase: \"https://host/bucket\", kind: \"manifest\", id: \"dXYZ\" }\n */\nexport function parseSpaceUri(uri: string): ParsedSpaceUri {\n const u = new URL(uri);\n const parts = u.pathname.replace(/^\\/+/, \"\").split(\"/\");\n if (parts.length < 2) {\n throw new Error(\n `Space URI missing /refs/<name> or /manifests/<hash> suffix: ${uri}`,\n );\n }\n const id = parts.pop()!;\n const marker = parts.pop()!;\n\n let kind: \"ref\" | \"manifest\";\n if (marker === \"refs\") kind = \"ref\";\n else if (marker === \"manifests\") kind = \"manifest\";\n else\n throw new Error(\n `Space URI: expected /refs/ or /manifests/, got /${marker}/: ${uri}`,\n );\n\n const connectorBase = `${u.origin}/${parts.join(\"/\")}`.replace(/\\/$/, \"\");\n return { connectorBase, kind, id };\n}\n\n// ---- Modality helpers ----\n\n/** Map a scalar value_type to its modality encoding fragment. */\nexport function scalarModalityFragment(valueType: string): string {\n const map: Record<string, string> = {\n categorical: \"cat\",\n bool: \"bool\",\n int: \"i64\",\n float: \"f64\",\n string: \"str\",\n timestamp: \"ts\",\n };\n return map[valueType.toLowerCase()] || \"str\";\n}\n\n/**\n * Given a Schema field definition, compute the expected Track modality string.\n * Mirrors `scalar_modality_for` in dreamdb-dataset/src/dataset/util.rs.\n */\nexport function modalityForField(field: {\n kind: string;\n mime?: string;\n dim?: number;\n name?: string;\n value_type?: string;\n valueType?: string;\n}): string | null {\n if (field.kind === \"image\") return `image.${field.mime}`;\n if (field.kind === \"video\") return `video.${field.mime}`;\n if (field.kind === \"audio\") return `audio.${field.mime}`;\n if (field.kind === \"embedding\") return `embedding.f32.dim=${field.dim}.bucketed`;\n if (field.kind === \"scalar\") {\n const vt = field.value_type || field.valueType || \"str\";\n const enc = scalarModalityFragment(vt);\n return `scalar.${enc}.field=${field.name}`;\n }\n return null;\n}\n","/**\n * Backend implementations for DreamDB storage.\n *\n * - S3Backend: fetch-based HTTP backend for S3-compatible storage (MinIO, R2, etc.)\n * - MemoryBackend: in-process Map-based backend for tests and ephemeral use\n */\n\nimport type { Backend, BackendGetOptions, BackendPutOptions } from \"./types.js\";\n\n// ---- S3-compatible HTTP backend ----\n\n/**\n * S3Backend talks to an S3-compatible HTTP endpoint via `fetch`.\n * Works in both browser and Node 18+.\n *\n * The `baseUrl` is the connector base URL, e.g. \"http://localhost:9000/my-bucket\".\n * All paths are joined relative to this base.\n */\nexport class S3Backend implements Backend {\n readonly baseUrl: string;\n\n constructor(baseUrl: string) {\n // Strip trailing slash\n this.baseUrl = baseUrl.replace(/\\/+$/, \"\");\n }\n\n async get(path: string, opts?: BackendGetOptions): Promise<Uint8Array> {\n const url = `${this.baseUrl}/${path}`;\n const fetchOpts: RequestInit = {};\n if (opts?.noCache) {\n fetchOpts.cache = \"no-store\";\n }\n const r = await fetch(url, fetchOpts);\n if (!r.ok) throw new Error(`GET ${url}: HTTP ${r.status}`);\n return new Uint8Array(await r.arrayBuffer());\n }\n\n async put(\n path: string,\n data: Uint8Array,\n opts?: BackendPutOptions,\n ): Promise<string> {\n const url = `${this.baseUrl}/${path}`;\n const headers: Record<string, string> = {};\n if (opts?.contentType) {\n headers[\"Content-Type\"] = opts.contentType;\n } else {\n headers[\"Content-Type\"] = \"application/octet-stream\";\n }\n const r = await fetch(url, {\n method: \"PUT\",\n headers,\n body: data as unknown as BodyInit,\n });\n if (!r.ok) throw new Error(`PUT ${url}: HTTP ${r.status}`);\n return path;\n }\n\n async list(prefix: string): Promise<string[]> {\n // S3 ListObjectsV2 — simplified. For MinIO/S3, we do a GET with\n // ?list-type=2&prefix=... and parse the XML response.\n const url = `${this.baseUrl}?list-type=2&prefix=${encodeURIComponent(prefix)}`;\n const r = await fetch(url);\n if (!r.ok) throw new Error(`LIST ${url}: HTTP ${r.status}`);\n const text = await r.text();\n // Parse <Key> elements from the XML response\n const keys: string[] = [];\n const regex = /<Key>([^<]+)<\\/Key>/g;\n let match: RegExpExecArray | null;\n while ((match = regex.exec(text)) !== null) {\n keys.push(match[1]);\n }\n return keys;\n }\n\n async delete(path: string): Promise<void> {\n const url = `${this.baseUrl}/${path}`;\n const r = await fetch(url, { method: \"DELETE\" });\n if (!r.ok) throw new Error(`DELETE ${url}: HTTP ${r.status}`);\n }\n}\n\n// ---- In-memory backend ----\n\n/**\n * MemoryBackend stores all Objects in a Map<string, Uint8Array>.\n * Useful for tests and ephemeral datasets.\n */\nexport class MemoryBackend implements Backend {\n private store = new Map<string, Uint8Array>();\n\n async get(path: string, _opts?: BackendGetOptions): Promise<Uint8Array> {\n const data = this.store.get(path);\n if (!data) throw new Error(`MemoryBackend: key not found: ${path}`);\n return data;\n }\n\n async put(\n path: string,\n data: Uint8Array,\n _opts?: BackendPutOptions,\n ): Promise<string> {\n this.store.set(path, new Uint8Array(data));\n return path;\n }\n\n async list(prefix: string): Promise<string[]> {\n const keys: string[] = [];\n for (const k of this.store.keys()) {\n if (k.startsWith(prefix)) keys.push(k);\n }\n return keys.sort();\n }\n\n async delete(path: string): Promise<void> {\n this.store.delete(path);\n }\n\n /** Check whether a key exists. */\n has(path: string): boolean {\n return this.store.has(path);\n }\n\n /** Get the number of stored objects. */\n get size(): number {\n return this.store.size;\n }\n\n /** Clear all stored objects. */\n clear(): void {\n this.store.clear();\n }\n}\n","/**\n * Vector query, LSH dispatch, IVF dispatch, ChaCha20 hyperplane derivation,\n * PQ/RaBitQ decode + rerank.\n *\n * Port of the spatial-indexing and vector-scoring logic from demo/dreamdb.js.\n */\n\nimport type {\n BucketRecord,\n SpatialDispatcher,\n VectorCompressorDecoder,\n CborValue,\n} from \"./types.js\";\nimport { decodeCbor } from \"./cbor.js\";\n\n// ---- ChaCha20 keystream (RFC 8439) ----\n\nconst U32 = 0xffffffff;\n\nfunction rotl(a: number, b: number): number {\n return ((a << b) | (a >>> (32 - b))) >>> 0;\n}\n\nfunction add32(a: number, b: number): number {\n return (a + b) >>> 0;\n}\n\nfunction quarterRound(s: Uint32Array, ai: number, bi: number, ci: number, di: number): void {\n s[ai] = add32(s[ai], s[bi]); s[di] = rotl(s[di] ^ s[ai], 16);\n s[ci] = add32(s[ci], s[di]); s[bi] = rotl(s[bi] ^ s[ci], 12);\n s[ai] = add32(s[ai], s[bi]); s[di] = rotl(s[di] ^ s[ai], 8);\n s[ci] = add32(s[ci], s[di]); s[bi] = rotl(s[bi] ^ s[ci], 7);\n}\n\nfunction chacha20Block(keyU32: Uint32Array, nonceU32: Uint32Array, counter: number): Uint8Array {\n const s = new Uint32Array(16);\n s[0] = 0x61707865; s[1] = 0x3320646e; s[2] = 0x79622d32; s[3] = 0x6b206574;\n for (let i = 0; i < 8; i++) s[4 + i] = keyU32[i];\n s[12] = counter >>> 0;\n s[13] = nonceU32[0]; s[14] = nonceU32[1]; s[15] = nonceU32[2];\n const ws = new Uint32Array(s);\n for (let i = 0; i < 10; i++) {\n quarterRound(ws, 0, 4, 8, 12);\n quarterRound(ws, 1, 5, 9, 13);\n quarterRound(ws, 2, 6, 10, 14);\n quarterRound(ws, 3, 7, 11, 15);\n quarterRound(ws, 0, 5, 10, 15);\n quarterRound(ws, 1, 6, 11, 12);\n quarterRound(ws, 2, 7, 8, 13);\n quarterRound(ws, 3, 4, 9, 14);\n }\n const out = new Uint8Array(64);\n for (let i = 0; i < 16; i++) {\n const w = add32(ws[i], s[i]);\n out[i * 4 + 0] = w & 0xff;\n out[i * 4 + 1] = (w >>> 8) & 0xff;\n out[i * 4 + 2] = (w >>> 16) & 0xff;\n out[i * 4 + 3] = (w >>> 24) & 0xff;\n }\n return out;\n}\n\nexport interface ChaCha20Stream {\n fill(out: Uint8Array): void;\n}\n\n/** Streaming ChaCha20 keystream from a 32-byte seed. */\nexport function chacha20Stream(seedBytes32: Uint8Array): ChaCha20Stream {\n if (seedBytes32.length !== 32) throw new Error(\"ChaCha20 seed must be 32 bytes\");\n const keyU32 = new Uint32Array(8);\n for (let i = 0; i < 8; i++) {\n keyU32[i] = (seedBytes32[i * 4]) |\n (seedBytes32[i * 4 + 1] << 8) |\n (seedBytes32[i * 4 + 2] << 16) |\n (seedBytes32[i * 4 + 3] << 24);\n keyU32[i] = keyU32[i] >>> 0;\n }\n const nonceU32 = new Uint32Array(3);\n let counter = 0;\n let block: Uint8Array | null = null;\n let pos = 64;\n return {\n fill(out: Uint8Array) {\n let written = 0;\n while (written < out.length) {\n if (pos >= 64) {\n block = chacha20Block(keyU32, nonceU32, counter++);\n pos = 0;\n }\n const take = Math.min(out.length - written, 64 - pos);\n for (let i = 0; i < take; i++) out[written + i] = block![pos + i];\n written += take;\n pos += take;\n }\n },\n };\n}\n\n// ---- L2 normalization and dot product ----\n\n/** f32 left-fold L2-normalize (matches Rust's normalize_l2). */\nexport function normalizeL2F32(v: Float32Array | number[]): Float32Array | null {\n let sumSq = 0;\n for (let i = 0; i < v.length; i++) {\n const x = Math.fround(v[i]);\n sumSq = Math.fround(sumSq + Math.fround(x * x));\n }\n if (!isFinite(sumSq) || sumSq === 0) return null;\n const norm = Math.fround(Math.sqrt(sumSq));\n const out = new Float32Array(v.length);\n for (let i = 0; i < v.length; i++) out[i] = Math.fround(v[i] / norm);\n return out;\n}\n\n/** f64 L2-normalize (higher precision, for rerank path). */\nexport function normalizeL2(v: Float32Array | number[]): Float32Array {\n let sum = 0;\n for (let i = 0; i < v.length; i++) sum += v[i] * v[i];\n const n = Math.sqrt(sum);\n if (n === 0) {\n const out = new Float32Array(v.length);\n for (let i = 0; i < v.length; i++) out[i] = v[i];\n return out;\n }\n const out = new Float32Array(v.length);\n for (let i = 0; i < v.length; i++) out[i] = v[i] / n;\n return out;\n}\n\n/** f32 left-fold dot product (matches Rust's dot_product_left_fold). */\nexport function dotF32(a: Float32Array, b: Float32Array): number {\n let acc = 0;\n for (let i = 0; i < a.length; i++) {\n const prod = Math.fround(Math.fround(a[i]) * Math.fround(b[i]));\n acc = Math.fround(acc + prod);\n }\n return acc;\n}\n\n/** f64 dot product of L2-normalized vectors. */\nexport function dotL2Normalized(a: Float32Array, b: Float32Array): number {\n let sum = 0;\n for (let i = 0; i < a.length; i++) sum += a[i] * b[i];\n return sum;\n}\n\n// ---- LSH-cosine hyperplane derivation ----\n\n/**\n * Derive `bits` hyperplanes of `dim` f32 values each, from a 32-byte seed.\n * Mirrors `derive_hyperplanes` in dreamdb-protocol/src/lsh_cosine.rs.\n */\nexport function deriveHyperplanesLshCosine(\n seedBytes32: Uint8Array,\n dim: number,\n bits: number,\n): Float32Array {\n const stream = chacha20Stream(seedBytes32);\n const out = new Float32Array(dim * bits);\n const buf = new Uint8Array(dim * 4);\n for (let plane = 0; plane < bits; plane++) {\n let attempts = 0;\n while (attempts < 1024) {\n stream.fill(buf);\n const g = new Float32Array(dim);\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength);\n for (let i = 0; i < dim; i++) {\n const n = view.getInt32(i * 4, true);\n g[i] = Math.fround(n / 2147483648.0);\n }\n const h = normalizeL2F32(g);\n if (h) {\n for (let i = 0; i < dim; i++) out[plane * dim + i] = h[i];\n break;\n }\n attempts++;\n }\n if (attempts >= 1024) throw new Error(`hyperplane ${plane} ChaCha20 retry exhausted`);\n }\n return out;\n}\n\n// ---- LSH projection and multi-probe ----\n\nexport function projectionsLshCosine(\n qNormalized: Float32Array,\n hyperplanes: Float32Array,\n dim: number,\n bits: number,\n): Float32Array {\n const projections = new Float32Array(bits);\n for (let b = 0; b < bits; b++) {\n const plane = hyperplanes.subarray(b * dim, (b + 1) * dim);\n projections[b] = dotF32(qNormalized, plane);\n }\n return projections;\n}\n\nexport function bitsFromProjections(projections: Float32Array): boolean[] {\n const bits = new Array<boolean>(projections.length);\n for (let i = 0; i < projections.length; i++) bits[i] = projections[i] >= 0;\n return bits;\n}\n\nexport function bitsToBase2(bits: boolean[]): string {\n let s = \"\";\n for (const b of bits) s += b ? \"1\" : \"0\";\n return s;\n}\n\nfunction flippedKey(bits: boolean[], flipIdxs: number[]): string {\n const copy = bits.slice();\n for (const i of flipIdxs) copy[i] = !copy[i];\n return bitsToBase2(copy);\n}\n\n/**\n * Enumerate up to `probeCount` keys (including primary) ranked by\n * smallest total |projection| flip-cost.\n */\nexport function multiProbeKeys(\n projections: Float32Array,\n probeCount: number,\n maxHamming: number,\n): string[] {\n const n = projections.length;\n const absP = new Float32Array(n);\n for (let i = 0; i < n; i++) absP[i] = Math.abs(projections[i]);\n const primary = bitsFromProjections(projections);\n const primaryKey = bitsToBase2(primary);\n if (probeCount <= 1) return [primaryKey];\n\n const candidates: Array<{ score: number; flips: number[] }> = [];\n for (let i = 0; i < n; i++) candidates.push({ score: absP[i], flips: [i] });\n if (maxHamming >= 2) {\n for (let i = 0; i < n; i++)\n for (let j = i + 1; j < n; j++)\n candidates.push({ score: absP[i] + absP[j], flips: [i, j] });\n }\n if (maxHamming >= 3) {\n for (let i = 0; i < n; i++)\n for (let j = i + 1; j < n; j++)\n for (let k = j + 1; k < n; k++)\n candidates.push({ score: absP[i] + absP[j] + absP[k], flips: [i, j, k] });\n }\n if (maxHamming >= 4) {\n for (let i = 0; i < n; i++)\n for (let j = i + 1; j < n; j++)\n for (let k = j + 1; k < n; k++)\n for (let l = k + 1; l < n; l++)\n candidates.push({\n score: absP[i] + absP[j] + absP[k] + absP[l],\n flips: [i, j, k, l],\n });\n }\n candidates.sort((a, b) => a.score - b.score);\n const keys = [primaryKey];\n for (const c of candidates) {\n if (keys.length >= probeCount) break;\n keys.push(flippedKey(primary, c.flips));\n }\n return keys;\n}\n\n// ---- Rotation matrix derivation (for RaBitQ) ----\n\n/**\n * Derive the dim x dim orthogonal rotation matrix from a 32-byte seed.\n * Uses Modified Gram-Schmidt. Returns Float32Array of length dim*dim, row-major.\n */\nexport function deriveRotationMatrix(seedBytes32: Uint8Array, dim: number): Float32Array {\n const stream = chacha20Stream(seedBytes32);\n const m = new Float32Array(dim * dim);\n const buf = new Uint8Array(dim * dim * 4);\n stream.fill(buf);\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength);\n for (let i = 0; i < dim * dim; i++) {\n const n = view.getInt32(i * 4, true);\n m[i] = Math.fround(n / 2147483648.0);\n }\n // Modified Gram-Schmidt\n for (let j = 0; j < dim; j++) {\n for (let i = 0; i < j; i++) {\n let coeff = 0;\n for (let kk = 0; kk < dim; kk++) {\n coeff = Math.fround(coeff + Math.fround(m[j * dim + kk] * m[i * dim + kk]));\n }\n for (let kk = 0; kk < dim; kk++) {\n m[j * dim + kk] = Math.fround(m[j * dim + kk] - Math.fround(coeff * m[i * dim + kk]));\n }\n }\n let sq = 0;\n for (let kk = 0; kk < dim; kk++) {\n sq = Math.fround(sq + Math.fround(m[j * dim + kk] * m[j * dim + kk]));\n }\n if (sq > 0) {\n const inv = Math.fround(1 / Math.fround(Math.sqrt(sq)));\n for (let kk = 0; kk < dim; kk++) {\n m[j * dim + kk] = Math.fround(m[j * dim + kk] * inv);\n }\n } else {\n m[j * dim + j] = 1;\n }\n }\n return m;\n}\n\n// ---- PQ-cosine decoder ----\n\nexport function buildPqCosineDecoder(vcCborBytes: Uint8Array): VectorCompressorDecoder {\n const obj = decodeCbor(vcCborBytes) as Record<string, CborValue>;\n if (!obj || obj.algorithm !== \"dreamdb.pq-cosine\") {\n throw new Error(`expected dreamdb.pq-cosine, got ${obj && obj.algorithm}`);\n }\n const dim = Number(obj.dim);\n const params = obj.params as Record<string, CborValue>;\n if (!params || !(params.codebooks instanceof Uint8Array)) {\n throw new Error(\"pq-cosine params missing codebooks bytes\");\n }\n const m = Number(params.m);\n const k = Number(params.k);\n const codebookBytes = params.codebooks as Uint8Array;\n const dsub = dim / m;\n if (dsub !== Math.floor(dsub)) {\n throw new Error(`dim=${dim} not divisible by m=${m}`);\n }\n if (codebookBytes.length !== m * k * dsub * 4) {\n throw new Error(\n `codebook bytes ${codebookBytes.length} != m(${m}) * k(${k}) * dsub(${dsub}) * 4`,\n );\n }\n const codebooksAligned = new Uint8Array(codebookBytes.length);\n codebooksAligned.set(codebookBytes);\n const codebookF32 = new Float32Array(codebooksAligned.buffer);\n\n return {\n algorithm: \"dreamdb.pq-cosine\",\n dim,\n recordCodeBytes: m,\n decode(codes: Uint8Array): Float32Array {\n if (codes.length !== m) {\n throw new Error(`codes length ${codes.length} != m=${m}`);\n }\n const out = new Float32Array(dim);\n for (let s = 0; s < m; s++) {\n const codeByte = codes[s];\n const srcOff = s * k * dsub + codeByte * dsub;\n const dstOff = s * dsub;\n for (let d = 0; d < dsub; d++) {\n out[dstOff + d] = codebookF32[srcOff + d];\n }\n }\n return out;\n },\n };\n}\n\n// ---- RaBitQ-cosine decoder ----\n\nexport function buildRabitqCosineDecoder(vcCborBytes: Uint8Array): VectorCompressorDecoder {\n const obj = decodeCbor(vcCborBytes) as Record<string, CborValue>;\n if (!obj || obj.algorithm !== \"dreamdb.rabitq-cosine\") {\n throw new Error(`expected dreamdb.rabitq-cosine, got ${obj && obj.algorithm}`);\n }\n const dim = Number(obj.dim);\n const params = obj.params as Record<string, CborValue>;\n if (!params || !(params.rotation_seed instanceof Uint8Array)) {\n throw new Error(\"rabitq-cosine params missing rotation_seed bytes\");\n }\n if ((params.rotation_seed as Uint8Array).length !== 32) {\n throw new Error(`rotation_seed must be 32 bytes; got ${(params.rotation_seed as Uint8Array).length}`);\n }\n const bitsPerDim = Number(params.bits_per_dim || 1);\n if (bitsPerDim !== 1) {\n throw new Error(`rabitq-cosine bits_per_dim=${bitsPerDim} not supported (v0 ships 1 only)`);\n }\n const withCorrection = params.with_correction_factors === true;\n const payloadBytes = Math.ceil(dim / 8);\n const codeBytesExpected = withCorrection ? payloadBytes + 4 : payloadBytes;\n const rotation = deriveRotationMatrix(params.rotation_seed as Uint8Array, dim);\n const constScale = 1 / Math.sqrt(dim);\n\n function readPerRecordScale(codeBytes: Uint8Array): number {\n const off = codeBytes.byteOffset + payloadBytes;\n const dv = new DataView(codeBytes.buffer, off, 4);\n return dv.getFloat32(0, true);\n }\n\n return {\n algorithm: \"dreamdb.rabitq-cosine\",\n dim,\n recordCodeBytes: codeBytesExpected,\n rotateQuery(qNorm: Float32Array): Float32Array {\n const out = new Float32Array(dim);\n for (let i = 0; i < dim; i++) {\n let acc = 0;\n const base = i * dim;\n for (let k = 0; k < dim; k++) {\n acc = Math.fround(acc + Math.fround(rotation[base + k] * qNorm[k]));\n }\n out[i] = acc;\n }\n return out;\n },\n adcScore(rotatedQuery: Float32Array, codeBytes: Uint8Array): number {\n let sum = 0;\n for (let i = 0; i < dim; i++) {\n const bit = (codeBytes[i >>> 3] >>> (i & 7)) & 1;\n const signed = bit === 1 ? rotatedQuery[i] : -rotatedQuery[i];\n sum = Math.fround(sum + signed);\n }\n const scale = withCorrection ? readPerRecordScale(codeBytes) : constScale;\n return Math.fround(sum * scale);\n },\n decode(codeBytes: Uint8Array): Float32Array {\n if (codeBytes.length !== codeBytesExpected) {\n throw new Error(\n `rabitq codes len ${codeBytes.length} != expected ${codeBytesExpected}`,\n );\n }\n const scale = withCorrection ? readPerRecordScale(codeBytes) : constScale;\n const uhat = new Float32Array(dim);\n for (let i = 0; i < dim; i++) {\n const bit = (codeBytes[i >>> 3] >>> (i & 7)) & 1;\n uhat[i] = bit === 1 ? scale : -scale;\n }\n const out = new Float32Array(dim);\n for (let j = 0; j < dim; j++) {\n let acc = 0;\n for (let i = 0; i < dim; i++) {\n acc = Math.fround(acc + Math.fround(rotation[i * dim + j] * uhat[i]));\n }\n out[j] = acc;\n }\n return out;\n },\n };\n}\n\n// ---- Spatial bucket record decoding ----\n\n/**\n * Decode a SpatialBucket binary into BucketRecord[].\n * Supports v1 (160-byte header, raw f32) and v2 (200-byte header, compressed).\n */\nexport function decodeBucketRecords(\n bytes: Uint8Array,\n expectRecordSize: number,\n dim: number,\n): BucketRecord[] {\n if (bytes.length < 160) throw new Error(\"bucket too small for header\");\n if (bytes[0] !== 0x56 || bytes[1] !== 0x42 || bytes[2] !== 0x55 || bytes[3] !== 0x55) {\n throw new Error(\"bucket bad magic\");\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const recordSize = view.getUint32(8, false);\n const recordCount = view.getUint32(12, false);\n const headerSize = view.getUint32(16, false);\n if (headerSize !== 160 && headerSize !== 200) {\n throw new Error(`bucket header_size=${headerSize} unsupported (expect 160 or 200)`);\n }\n if (recordSize !== expectRecordSize) {\n throw new Error(`bucket record_size=${recordSize} != expected ${expectRecordSize}`);\n }\n const isCompressed = headerSize === 200;\n const out: BucketRecord[] = [];\n for (let i = 0; i < recordCount; i++) {\n const off = headerSize + i * recordSize;\n const hi = view.getUint32(off, false);\n const lo = view.getUint32(off + 4, false);\n const anchor = Number((BigInt(hi) << 32n) | BigInt(lo));\n const recordPayload = bytes.subarray(off + 8, off + recordSize);\n if (isCompressed) {\n out.push({ anchor, ordinal: i, codes: new Uint8Array(recordPayload) });\n } else {\n const vec = new Float32Array(dim);\n const vecView = new DataView(\n recordPayload.buffer,\n recordPayload.byteOffset,\n recordPayload.byteLength,\n );\n for (let j = 0; j < dim; j++) vec[j] = vecView.getFloat32(j * 4, true);\n out.push({ anchor, ordinal: i, vec });\n }\n }\n return out;\n}\n\n/** Decode only the time anchors from a SpatialBucket binary. */\nexport function decodeBucketAnchorsOnly(bytes: Uint8Array): number[] {\n if (bytes.length < 160) throw new Error(\"bucket too small for header\");\n if (bytes[0] !== 0x56 || bytes[1] !== 0x42 || bytes[2] !== 0x55 || bytes[3] !== 0x55) {\n throw new Error(\"bucket bad magic\");\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const recordSize = view.getUint32(8, false);\n const recordCount = view.getUint32(12, false);\n const headerSize = view.getUint32(16, false);\n if (headerSize !== 160 && headerSize !== 200) {\n throw new Error(`bucket header_size=${headerSize} unsupported (expect 160 or 200)`);\n }\n const out: number[] = [];\n for (let i = 0; i < recordCount; i++) {\n const off = headerSize + i * recordSize;\n const hi = view.getUint32(off, false);\n const lo = view.getUint32(off + 4, false);\n out.push(Number((BigInt(hi) << 32n) | BigInt(lo)));\n }\n return out;\n}\n\n/** Peek the bucket header without decoding records. */\nexport function peekBucketHeader(bytes: Uint8Array): {\n recordSize: number;\n recordCount: number;\n headerSize: number;\n isCompressed: boolean;\n vectorCompressorHash: Uint8Array | null;\n} {\n if (bytes.length < 160) throw new Error(\"bucket too small for header\");\n if (bytes[0] !== 0x56 || bytes[1] !== 0x42 || bytes[2] !== 0x55 || bytes[3] !== 0x55) {\n throw new Error(\"bucket bad magic\");\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const recordSize = view.getUint32(8, false);\n const recordCount = view.getUint32(12, false);\n const headerSize = view.getUint32(16, false);\n return {\n recordSize,\n recordCount,\n headerSize,\n isCompressed: headerSize === 200,\n vectorCompressorHash:\n headerSize === 200 && bytes.length >= 86 + 33\n ? bytes.subarray(86, 86 + 33)\n : null,\n };\n}\n","/**\n * Space class — resolve refs, decode manifests, iterate tracks.\n *\n * Port of the DreamDBSpace class from demo/dreamdb.js.\n * Uses the Backend interface for storage access.\n */\n\nimport type {\n Backend,\n Base32Hash,\n CborValue,\n HistoryEntry,\n Manifest,\n ResolvedTrack,\n SpatialDispatcher,\n VectorCompressorDecoder,\n VectorQueryOptions,\n VectorQueryResult,\n QueryStats,\n BucketRecord,\n} from \"./types.js\";\nimport { decodeCbor } from \"./cbor.js\";\nimport { bytesToBase32, MULTIHASH_BYTES, modalityForField } from \"./uri.js\";\nimport {\n normalizeL2F32,\n normalizeL2,\n dotF32,\n dotL2Normalized,\n deriveHyperplanesLshCosine,\n projectionsLshCosine,\n multiProbeKeys,\n decodeBucketRecords,\n buildPqCosineDecoder,\n buildRabitqCosineDecoder,\n} from \"./query.js\";\n\nexport interface SpaceOptions {\n connectorBase?: string;\n backend?: Backend;\n}\n\nexport class Space {\n readonly connectorBase: string;\n readonly manifestHash: Base32Hash;\n readonly manifest: Manifest;\n readonly refName: string | null;\n private backend: Backend | null;\n\n // Caches\n private _siCache = new Map<string, SpatialDispatcher | null>();\n private _vcCache = new Map<string, VectorCompressorDecoder | null>();\n private _lastQueryStats: QueryStats | null = null;\n\n constructor(opts: {\n connectorBase: string;\n manifestHash: Base32Hash;\n manifest: Manifest;\n refName: string | null;\n backend?: Backend;\n }) {\n this.connectorBase = opts.connectorBase;\n this.manifestHash = opts.manifestHash;\n this.manifest = opts.manifest;\n this.refName = opts.refName;\n this.backend = opts.backend || null;\n }\n\n /**\n * Open a Space from a space URI.\n * If a Backend is provided, it is used; otherwise fetch-based HTTP access.\n */\n static async fromUri(uri: string, backend?: Backend): Promise<Space> {\n // Inline URI parsing to avoid circular deps\n const u = new URL(uri);\n const parts = u.pathname.replace(/^\\/+/, \"\").split(\"/\");\n if (parts.length < 2) {\n throw new Error(`Space URI missing /refs/<name> or /manifests/<hash> suffix: ${uri}`);\n }\n const id = parts.pop()!;\n const marker = parts.pop()!;\n let kind: \"ref\" | \"manifest\";\n if (marker === \"refs\") kind = \"ref\";\n else if (marker === \"manifests\") kind = \"manifest\";\n else throw new Error(`Space URI: expected /refs/ or /manifests/, got /${marker}/: ${uri}`);\n const connectorBase = `${u.origin}/${parts.join(\"/\")}`.replace(/\\/$/, \"\");\n\n let manifestHash: Base32Hash;\n let refName: string | null = null;\n\n const fetchFn = async (path: string, noCache = false): Promise<Uint8Array> => {\n if (backend) return backend.get(path, { noCache });\n const url = `${connectorBase}/${path}`;\n const fetchOpts: RequestInit = noCache ? { cache: \"no-store\" } : {};\n const r = await fetch(url, fetchOpts);\n if (!r.ok) throw new Error(`GET ${url}: HTTP ${r.status}`);\n return new Uint8Array(await r.arrayBuffer());\n };\n\n if (kind === \"ref\") {\n refName = id;\n const refBytes = await fetchFn(`refs/${id}`, true);\n if (refBytes.length !== MULTIHASH_BYTES) {\n throw new Error(`ref body not ${MULTIHASH_BYTES} bytes: got ${refBytes.length}`);\n }\n manifestHash = bytesToBase32(refBytes);\n } else {\n manifestHash = id;\n }\n\n const manifestBytes = await fetchFn(`manifests/${manifestHash}`);\n const manifest = decodeCbor(manifestBytes) as unknown as Manifest;\n return new Space({ connectorBase, manifestHash, manifest, refName, backend });\n }\n\n /** Get the timeline ID (base32 hash of the first timeline entry). */\n timelineId(): Base32Hash {\n const t = this.manifest.timelines;\n if (!t || !Array.isArray(t) || t.length === 0) {\n throw new Error(\"Manifest has no timelines[]\");\n }\n return bytesToBase32(t[0] as Uint8Array);\n }\n\n /**\n * Map each Manifest Track to the Schema-declared field name.\n * Returns a parallel array to manifest.tracks.\n */\n private _fieldNamesForTracks(): Array<string | null> {\n const tracks = this.manifest.tracks;\n if (!Array.isArray(tracks)) return [];\n const out = new Array<string | null>(tracks.length).fill(null);\n const registry = this.manifest.registry as Record<string, CborValue> | undefined;\n const sch = registry?.[\"dreamdb.schema\"] as Record<string, CborValue> | undefined;\n const fields = sch && Array.isArray(sch.fields) ? (sch.fields as Array<Record<string, CborValue>>) : null;\n if (!fields) return out;\n\n const expectedModalityFor = (f: Record<string, CborValue>): string | null => {\n return modalityForField({\n kind: f.kind as string,\n mime: f.mime as string | undefined,\n dim: f.dim ? Number(f.dim) : undefined,\n name: f.name as string | undefined,\n value_type: f.value_type as string | undefined,\n });\n };\n\n // Per-modality queues\n const queues = new Map<string, number[]>();\n for (let i = 0; i < tracks.length; i++) {\n const m = (tracks[i] as { modality: string }).modality;\n if (!queues.has(m)) queues.set(m, []);\n queues.get(m)!.push(i);\n }\n for (const f of fields) {\n const want = expectedModalityFor(f);\n if (!want) continue;\n const q = queues.get(want);\n if (!q || q.length === 0) continue;\n const idx = q.shift()!;\n out[idx] = f.name as string;\n }\n return out;\n }\n\n /** List resolved tracks from this Manifest. */\n tracks(): ResolvedTrack[] {\n const out: ResolvedTrack[] = [];\n const ts = this.manifest.tracks;\n if (!Array.isArray(ts)) return out;\n const fieldNames = this._fieldNamesForTracks();\n for (let i = 0; i < ts.length; i++) {\n const t = ts[i] as {\n modality: string;\n kind: string;\n role: string;\n address: Uint8Array;\n timeline: Uint8Array;\n coverage: unknown;\n };\n const field = fieldNames[i] || null;\n out.push({\n modality: t.modality,\n field,\n key: field || t.modality,\n kind: t.kind,\n role: t.role,\n address: bytesToBase32(t.address),\n timeline: bytesToBase32(t.timeline),\n coverage: t.coverage,\n });\n }\n return out;\n }\n\n /** Find a Track by key (field name or modality). */\n trackFor(keyOrModality: string): ResolvedTrack | undefined {\n return this.tracks().find(\n (t) => t.key === keyOrModality || t.modality === keyOrModality,\n );\n }\n\n /** Walk the Manifest DAG and return history entries. */\n async history(maxDepth = 50): Promise<HistoryEntry[]> {\n const out: HistoryEntry[] = [];\n let curHash = this.manifestHash;\n let cur = this.manifest;\n\n while (curHash && out.length < maxDepth) {\n out.push({\n manifestHash: curHash,\n ts:\n typeof cur.ts === \"bigint\" ? Number(cur.ts) : Number(cur.ts || 0),\n writer: cur.writer || \"(unknown)\",\n tracks: Array.isArray(cur.tracks)\n ? cur.tracks.map((t: { modality: string; address: Uint8Array }) => ({\n modality: t.modality,\n address: bytesToBase32(t.address),\n }))\n : [],\n parents: Array.isArray(cur.parents) ? cur.parents.length : 0,\n });\n const parents = cur.parents || [];\n if (parents.length === 0) break;\n const parentHash = bytesToBase32(parents[0] as Uint8Array);\n try {\n const parentBytes = await this._fetchBytes(`manifests/${parentHash}`);\n cur = decodeCbor(parentBytes) as unknown as Manifest;\n curHash = parentHash;\n } catch (e: unknown) {\n out[out.length - 1].truncatedAt = (e as Error).message;\n break;\n }\n }\n return out;\n }\n\n /** Get the last query's statistics. */\n get lastQueryStats(): QueryStats | null {\n return this._lastQueryStats;\n }\n\n // ---- Vector query ----\n\n async queryVector(\n field: string,\n queryVec: number[] | Float32Array,\n opts: VectorQueryOptions | number = {},\n ): Promise<VectorQueryResult[]> {\n const topK = typeof opts === \"number\" ? opts : opts.topK || 10;\n const probeCountOverride =\n typeof opts === \"object\" && opts.probeCount ? opts.probeCount : null;\n const maxHamming = typeof opts === \"object\" && opts.maxHamming ? opts.maxHamming : 2;\n\n const track = this._embeddingTrackFor(field);\n if (!track) throw new Error(`no embedding Track found for field \"${field}\"`);\n const dimMatch = /\\.dim=(\\d+)\\./.exec(track.modality);\n if (!dimMatch) throw new Error(`embedding Track modality lacks dim=N: ${track.modality}`);\n const dim = parseInt(dimMatch[1], 10);\n if (queryVec.length !== dim) {\n throw new Error(`query vec dim ${queryVec.length} != Track dim ${dim}`);\n }\n\n const compressorDecoder = await this._fetchVectorCompressor(track.modality);\n const recordSize = compressorDecoder\n ? 8 + compressorDecoder.recordCodeBytes\n : 8 + dim * 4;\n\n // Fetch TrackObject\n const trackBytes = await this._fetchBytes(\n `${track.timeline}/${track.modality}/track/${track.address}`,\n );\n const trackObj = decodeCbor(trackBytes) as Record<string, CborValue>;\n const objIndex = trackObj.object_index as CborValue[];\n if (!Array.isArray(objIndex)) {\n throw new Error(\"queryVector: paged Track index not supported in TS yet\");\n }\n\n // Fetch + decode the SpatialIndex dispatcher\n const dispatcher = await this._fetchSpatialDispatcher(track.modality);\n let probeCount = probeCountOverride;\n if (probeCount == null) {\n if (dispatcher && dispatcher.algorithm === \"dreamdb.ivf-cosine\") {\n probeCount = Math.max(8, Math.ceil(dispatcher.k! / 16));\n } else {\n probeCount = 64;\n }\n }\n let probeKeySet: Set<string> | null = null;\n if (dispatcher) {\n const qNormForDispatch = normalizeL2F32(\n queryVec instanceof Float32Array ? queryVec : new Float32Array(queryVec),\n );\n if (!qNormForDispatch)\n throw new Error(\"queryVector: query vector has zero norm\");\n const probeKeys = dispatcher.probeKeys(\n qNormForDispatch,\n probeCount,\n maxHamming,\n );\n probeKeySet = new Set(probeKeys);\n }\n\n // Pick buckets to fetch\n let entriesToFetch = probeKeySet\n ? objIndex.filter(\n (e) => probeKeySet!.has((e as CborValue[])[0] as string),\n )\n : objIndex;\n const dispatchedCount = entriesToFetch.length;\n if (probeKeySet && entriesToFetch.length === 0) {\n entriesToFetch = objIndex;\n }\n this._lastQueryStats = {\n bucketsTotal: objIndex.length,\n bucketsProbed: dispatchedCount,\n fellBackToBruteForce: probeKeySet !== null && dispatchedCount === 0,\n };\n\n // Pass 1 — ADC cull\n const qNorm = normalizeL2(\n queryVec instanceof Float32Array ? queryVec : new Float32Array(queryVec),\n );\n let rotatedQuery: Float32Array | null = null;\n if (\n compressorDecoder &&\n compressorDecoder.algorithm === \"dreamdb.rabitq-cosine\" &&\n compressorDecoder.rotateQuery\n ) {\n rotatedQuery = compressorDecoder.rotateQuery(qNorm);\n }\n\n const candidates: Array<{\n anchor: number;\n score: number;\n vsHashB32: string | null;\n recordOrdinal: number;\n }> = [];\n\n for (const e of entriesToFetch) {\n const entry = e as CborValue[];\n const spatialKey = entry[0] as string;\n const bucketAddr = bytesToBase32(entry[4] as Uint8Array);\n let vsHashB32: string | null = null;\n if (entry.length >= 7 && entry[6] instanceof Uint8Array) {\n vsHashB32 = bytesToBase32(entry[6] as Uint8Array);\n }\n const body = await this._fetchBytes(\n `${track.timeline}/${track.modality}/${spatialKey}/${bucketAddr}`,\n );\n for (const rec of decodeBucketRecords(body, recordSize, dim)) {\n let score: number;\n if (rec.vec) {\n score = dotL2Normalized(qNorm, normalizeL2(rec.vec));\n } else if (rec.codes && rotatedQuery && compressorDecoder?.adcScore) {\n score = compressorDecoder.adcScore(rotatedQuery, rec.codes);\n } else if (rec.codes && compressorDecoder) {\n const candidate = compressorDecoder.decode(rec.codes);\n score = dotL2Normalized(qNorm, normalizeL2(candidate));\n } else {\n continue;\n }\n candidates.push({\n anchor: rec.anchor,\n score,\n vsHashB32,\n recordOrdinal: rec.ordinal,\n });\n }\n }\n\n // Pass 2 — rerank\n candidates.sort((a, b) => b.score - a.score);\n const T = Math.min(candidates.length, 5 * topK);\n const survivors = candidates.slice(0, T);\n const rerankableByHash = new Map<\n string,\n Array<(typeof candidates)[0]>\n >();\n let rerankSkippedNoHash = 0;\n for (const s of survivors) {\n if (s.vsHashB32) {\n if (!rerankableByHash.has(s.vsHashB32))\n rerankableByHash.set(s.vsHashB32, []);\n rerankableByHash.get(s.vsHashB32)!.push(s);\n } else {\n rerankSkippedNoHash++;\n }\n }\n const vsRecordSize = dim * 4;\n const VS_HEADER_SIZE = 128;\n for (const [vsHashB32, group] of rerankableByHash) {\n let vsBytes: Uint8Array;\n try {\n vsBytes = await this._fetchBytes(\n `${track.timeline}/${track.modality}/vectors/${vsHashB32}`,\n );\n } catch {\n rerankSkippedNoHash += group.length;\n continue;\n }\n const vsView = new DataView(\n vsBytes.buffer,\n vsBytes.byteOffset,\n vsBytes.byteLength,\n );\n for (const s of group) {\n const off = VS_HEADER_SIZE + s.recordOrdinal * vsRecordSize;\n if (off + vsRecordSize > vsBytes.length) {\n rerankSkippedNoHash++;\n continue;\n }\n const rawVec = new Float32Array(dim);\n for (let j = 0; j < dim; j++) {\n rawVec[j] = vsView.getFloat32(off + j * 4, true);\n }\n s.score = dotL2Normalized(qNorm, normalizeL2(rawVec));\n }\n }\n\n survivors.sort((a, b) => b.score - a.score);\n const finalTop = survivors.slice(0, topK).map((s) => ({\n anchor: s.anchor,\n score: s.score,\n }));\n\n this._lastQueryStats = {\n ...this._lastQueryStats!,\n candidatesScored: candidates.length,\n topT: T,\n rerankFetchCount: rerankableByHash.size,\n rerankSkippedNoHash,\n };\n return finalTop;\n }\n\n // ---- Internal helpers ----\n\n private _embeddingTrackFor(field: string): ResolvedTrack | null {\n const tracks = this.tracks().filter((t) =>\n t.modality.startsWith(\"embedding.\"),\n );\n if (tracks.length === 0) return null;\n if (tracks.length === 1) return tracks[0];\n return tracks.find((t) => t.key === field || t.modality.includes(field)) || tracks[0];\n }\n\n private async _fetchBytes(path: string): Promise<Uint8Array> {\n if (this.backend) {\n return this.backend.get(path);\n }\n const url = `${this.connectorBase}/${path}`;\n const r = await fetch(url);\n if (!r.ok) throw new Error(`GET ${url}: HTTP ${r.status}`);\n return new Uint8Array(await r.arrayBuffer());\n }\n\n private async _fetchSpatialDispatcher(\n modality: string,\n ): Promise<SpatialDispatcher | null> {\n if (this._siCache.has(modality)) return this._siCache.get(modality)!;\n const registry = this.manifest.registry;\n if (!registry || typeof registry !== \"object\") {\n this._siCache.set(modality, null);\n return null;\n }\n const regEntry = registry[modality] as Record<string, CborValue> | undefined;\n if (!regEntry || typeof regEntry !== \"object\") {\n this._siCache.set(modality, null);\n return null;\n }\n const hashesArr = (regEntry.spatial_index ||\n regEntry.spatial_index_hashes) as CborValue[];\n if (!Array.isArray(hashesArr) || hashesArr.length === 0) {\n this._siCache.set(modality, null);\n return null;\n }\n const siHashBytes = hashesArr[0] as Uint8Array;\n const siHashB32 = bytesToBase32(siHashBytes);\n let siBytes: Uint8Array;\n try {\n siBytes = await this._fetchBytes(`spatial-index/${siHashB32}`);\n } catch {\n this._siCache.set(modality, null);\n return null;\n }\n const siObj = decodeCbor(siBytes) as Record<string, CborValue>;\n const dim = Number(siObj.dim);\n const bits = Number(siObj.bits);\n let dispatcher: SpatialDispatcher | null = null;\n\n if (siObj.algorithm === \"dreamdb.lsh-cosine\") {\n const params = siObj.params as Record<string, CborValue>;\n let hyperplanes: Float32Array;\n if (params.explicit_hyperplanes) {\n const hpBytes = params.explicit_hyperplanes as Uint8Array;\n const view = new DataView(\n hpBytes.buffer,\n hpBytes.byteOffset,\n hpBytes.byteLength,\n );\n hyperplanes = new Float32Array(dim * bits);\n for (let i = 0; i < dim * bits; i++)\n hyperplanes[i] = view.getFloat32(i * 4, true);\n } else if (params.seed) {\n hyperplanes = deriveHyperplanesLshCosine(\n params.seed as Uint8Array,\n dim,\n bits,\n );\n } else {\n this._siCache.set(modality, null);\n return null;\n }\n dispatcher = {\n algorithm: \"dreamdb.lsh-cosine\",\n dim,\n bits,\n probeKeys(qNorm, probeCount, maxHamming) {\n const projections = projectionsLshCosine(\n qNorm,\n hyperplanes,\n dim,\n bits,\n );\n return multiProbeKeys(projections, probeCount, maxHamming);\n },\n };\n } else if (siObj.algorithm === \"dreamdb.ivf-cosine\") {\n const k = Number((siObj.params as Record<string, CborValue>).k);\n const centroidBytes = (siObj.params as Record<string, CborValue>)\n .centroids as Uint8Array;\n if (\n !(centroidBytes instanceof Uint8Array) ||\n centroidBytes.length !== k * dim * 4\n ) {\n this._siCache.set(modality, null);\n return null;\n }\n const aligned = new Uint8Array(centroidBytes.length);\n aligned.set(centroidBytes);\n const centroidsF32 = new Float32Array(aligned.buffer);\n dispatcher = {\n algorithm: \"dreamdb.ivf-cosine\",\n dim,\n bits,\n k,\n probeKeys(qNorm, probeCount, _maxHamming) {\n const nprobe = Math.min(probeCount, k);\n const scores: Array<[number, number]> = new Array(k);\n for (let i = 0; i < k; i++) {\n let acc = 0;\n const base = i * dim;\n for (let d = 0; d < dim; d++) {\n acc = Math.fround(\n acc + Math.fround(qNorm[d] * centroidsF32[base + d]),\n );\n }\n scores[i] = [acc, i];\n }\n scores.sort((a, b) => b[0] - a[0]);\n const out: string[] = [];\n for (let i = 0; i < nprobe; i++) {\n const id = scores[i][1];\n let key = \"\";\n for (let b = bits - 1; b >= 0; b--) {\n key += (id >> b) & 1 ? \"1\" : \"0\";\n }\n out.push(key);\n }\n return out;\n },\n };\n }\n\n this._siCache.set(modality, dispatcher);\n return dispatcher;\n }\n\n private async _fetchVectorCompressor(\n modality: string,\n ): Promise<VectorCompressorDecoder | null> {\n if (this._vcCache.has(modality)) return this._vcCache.get(modality)!;\n const registry = this.manifest.registry;\n if (!registry || typeof registry !== \"object\") {\n this._vcCache.set(modality, null);\n return null;\n }\n const regEntry = registry[modality] as Record<string, CborValue> | undefined;\n if (!regEntry || typeof regEntry !== \"object\") {\n this._vcCache.set(modality, null);\n return null;\n }\n const vcHashBytes = regEntry.vector_compressor as Uint8Array | undefined;\n if (!(vcHashBytes instanceof Uint8Array)) {\n this._vcCache.set(modality, null);\n return null;\n }\n const vcHashB32 = bytesToBase32(vcHashBytes);\n let vcBytes: Uint8Array;\n try {\n vcBytes = await this._fetchBytes(`vector-compressor/${vcHashB32}`);\n } catch {\n this._vcCache.set(modality, null);\n return null;\n }\n const peek = decodeCbor(vcBytes) as Record<string, CborValue>;\n let decoder: VectorCompressorDecoder;\n if (peek && peek.algorithm === \"dreamdb.pq-cosine\") {\n decoder = buildPqCosineDecoder(vcBytes);\n } else if (peek && peek.algorithm === \"dreamdb.rabitq-cosine\") {\n decoder = buildRabitqCosineDecoder(vcBytes);\n } else {\n this._vcCache.set(modality, null);\n return null;\n }\n decoder.algorithm = (peek.algorithm as string) || decoder.algorithm;\n if (peek.algorithm === \"dreamdb.pq-cosine\") {\n decoder.recordCodeBytes = Number(\n (peek.params as Record<string, CborValue>).m,\n );\n } else {\n const payload = Math.ceil(Number(peek.dim) / 8);\n const corrected =\n peek.params &&\n (peek.params as Record<string, CborValue>).with_correction_factors ===\n true;\n decoder.recordCodeBytes = corrected ? payload + 4 : payload;\n }\n this._vcCache.set(modality, decoder);\n return decoder;\n }\n}\n","/**\n * High-level Dataset API — mirrors the Python SDK's Dataset/Schema surface.\n *\n * Provides:\n * - Schema (add_image, add_embedding, add_scalar_categorical, etc.)\n * - Dataset.create / Dataset.open\n * - append_many, iter_vector, iter_stream\n * - snapshot, branch, merge, delete, tombstone_set\n * - history, list_refs, count\n */\n\nimport type {\n Backend,\n Base32Hash,\n Batch,\n CborValue,\n FieldDef,\n ImageFieldDef,\n AudioFieldDef,\n VideoFieldDef,\n EmbeddingFieldDef,\n ScalarFieldDef,\n Sample,\n SnapshotInfo,\n TimeAnchor,\n WhereClause,\n ScalarValueType,\n} from \"./types.js\";\nimport { decodeCbor, encodeCbor } from \"./cbor.js\";\nimport { bytesToBase32, base32ToBytes, modalityForField, MULTIHASH_BYTES } from \"./uri.js\";\nimport { MemoryBackend, S3Backend } from \"./backend.js\";\nimport { normalizeL2, dotL2Normalized } from \"./query.js\";\n\n// ---- Schema ----\n\n/**\n * Builder for a Dataset's schema. Chainable API:\n *\n * const schema = new Schema()\n * .addImage(\"image\", { mime: \"jpeg\" })\n * .addEmbedding(\"embedding\", { dim: 512 })\n * .addScalarCategorical(\"label\");\n */\nexport class Schema {\n readonly fields: FieldDef[] = [];\n\n addImage(\n name: string,\n opts: { mime?: string; required?: boolean; chunkSize?: number; packItems?: number } = {},\n ): this {\n this.fields.push({\n kind: \"image\",\n name,\n mime: opts.mime || \"jpeg\",\n required: opts.required !== false,\n chunkSize: opts.chunkSize,\n packItems: opts.packItems,\n } satisfies ImageFieldDef);\n return this;\n }\n\n addAudio(\n name: string,\n opts: { mime?: string; required?: boolean; chunkSize?: number; packItems?: number } = {},\n ): this {\n this.fields.push({\n kind: \"audio\",\n name,\n mime: opts.mime || \"wav\",\n required: opts.required !== false,\n chunkSize: opts.chunkSize,\n packItems: opts.packItems,\n } satisfies AudioFieldDef);\n return this;\n }\n\n addVideo(\n name: string,\n opts: { mime?: string; required?: boolean; chunkSize?: number; packItems?: number } = {},\n ): this {\n this.fields.push({\n kind: \"video\",\n name,\n mime: opts.mime || \"mp4\",\n required: opts.required !== false,\n chunkSize: opts.chunkSize,\n packItems: opts.packItems,\n } satisfies VideoFieldDef);\n return this;\n }\n\n addEmbedding(\n name: string,\n opts: {\n dim: number;\n algorithm?: string;\n required?: boolean;\n lshBits?: number;\n compressor?: Uint8Array;\n spatialIndex?: Uint8Array;\n rerank?: boolean;\n },\n ): this {\n this.fields.push({\n kind: \"embedding\",\n name,\n dim: opts.dim,\n algorithm: opts.algorithm || \"dreamdb.lsh-cosine\",\n required: opts.required !== false,\n lshBits: opts.lshBits,\n compressor: opts.compressor,\n spatialIndex: opts.spatialIndex,\n rerank: opts.rerank || false,\n } satisfies EmbeddingFieldDef);\n return this;\n }\n\n addScalarCategorical(name: string, opts: { required?: boolean } = {}): this {\n this.fields.push({\n kind: \"scalar\",\n name,\n valueType: \"categorical\",\n required: opts.required !== false,\n } satisfies ScalarFieldDef);\n return this;\n }\n\n addScalarBool(name: string, opts: { required?: boolean } = {}): this {\n this.fields.push({\n kind: \"scalar\",\n name,\n valueType: \"bool\",\n required: opts.required !== false,\n } satisfies ScalarFieldDef);\n return this;\n }\n\n addScalarInt(name: string, opts: { required?: boolean } = {}): this {\n this.fields.push({\n kind: \"scalar\",\n name,\n valueType: \"int\",\n required: opts.required !== false,\n } satisfies ScalarFieldDef);\n return this;\n }\n\n addScalarFloat(name: string, opts: { required?: boolean } = {}): this {\n this.fields.push({\n kind: \"scalar\",\n name,\n valueType: \"float\",\n required: opts.required !== false,\n } satisfies ScalarFieldDef);\n return this;\n }\n\n addScalarString(name: string, opts: { required?: boolean } = {}): this {\n this.fields.push({\n kind: \"scalar\",\n name,\n valueType: \"string\",\n required: opts.required !== false,\n } satisfies ScalarFieldDef);\n return this;\n }\n\n addScalarTimestamp(name: string, opts: { required?: boolean } = {}): this {\n this.fields.push({\n kind: \"scalar\",\n name,\n valueType: \"timestamp\",\n required: opts.required !== false,\n } satisfies ScalarFieldDef);\n return this;\n }\n\n /** Serialize the schema to CBOR-encodable object. */\n toCbor(): CborValue {\n const fields: CborValue[] = this.fields.map((f) => {\n const obj: Record<string, CborValue> = { kind: f.kind, name: f.name };\n if (f.kind === \"image\" || f.kind === \"audio\" || f.kind === \"video\") {\n obj.mime = f.mime;\n obj.required = f.required;\n } else if (f.kind === \"embedding\") {\n obj.dim = f.dim;\n obj.algorithm = f.algorithm;\n obj.required = f.required;\n obj.rerank = f.rerank;\n } else if (f.kind === \"scalar\") {\n obj.value_type = f.valueType;\n obj.required = f.required;\n }\n return obj;\n });\n return { fields };\n }\n}\n\n// ---- Dataset ----\n\n/**\n * Versioned multimodal Dataset.\n *\n * TypeScript SDK mirror of the Python vortex_dataset.Dataset surface.\n */\nexport class Dataset {\n private backend: Backend;\n private _refName: string;\n private _manifestHash: Base32Hash;\n private _timelineHash: Base32Hash;\n private _schema: Schema;\n\n private constructor(\n backend: Backend,\n refName: string,\n manifestHash: Base32Hash,\n timelineHash: Base32Hash,\n schema: Schema,\n ) {\n this.backend = backend;\n this._refName = refName;\n this._manifestHash = manifestHash;\n this._timelineHash = timelineHash;\n this._schema = schema;\n }\n\n // ---- Construction ----\n\n static async create(\n name: string,\n schema: Schema,\n backendUrl: string,\n ): Promise<Dataset> {\n const backend = resolveBackend(backendUrl);\n\n // Generate a timeline hash (deterministic from name for reproducibility)\n const timelineBytes = hashFromString(`timeline:${name}`);\n const timelineHash = bytesToBase32(timelineBytes);\n\n // Build initial manifest with empty tracks\n const tracks: CborValue[] = [];\n for (const field of schema.fields) {\n const modality = modalityForField({\n kind: field.kind,\n mime: field.kind === \"image\" || field.kind === \"audio\" || field.kind === \"video\"\n ? (field as ImageFieldDef | AudioFieldDef | VideoFieldDef).mime\n : undefined,\n dim: field.kind === \"embedding\" ? (field as EmbeddingFieldDef).dim : undefined,\n name: field.name,\n valueType: field.kind === \"scalar\" ? (field as ScalarFieldDef).valueType : undefined,\n });\n if (!modality) continue;\n\n // Create empty track object\n const emptyTrackObj: CborValue = { object_index: [] as CborValue[] };\n const trackObjBytes = encodeCbor(emptyTrackObj);\n const trackHash = contentHash(trackObjBytes);\n const trackHashB32 = bytesToBase32(trackHash);\n\n // Store track object\n await backend.put(\n `${timelineHash}/${modality}/track/${trackHashB32}`,\n trackObjBytes,\n );\n\n tracks.push({\n modality,\n kind: field.kind === \"embedding\" ? \"spatial_bucket\" : field.kind === \"scalar\" ? \"scalar_bucket\" : \"fragment\",\n role: \"data\",\n address: trackHash,\n timeline: timelineBytes,\n coverage: null,\n });\n }\n\n const manifest: CborValue = {\n timelines: [timelineBytes],\n tracks,\n ts: BigInt(Date.now()) * 1000000n,\n writer: \"dreamdb-ts/0.1.0\",\n registry: {\n \"dreamdb.schema\": schema.toCbor(),\n },\n };\n\n const manifestBytes = encodeCbor(manifest);\n const manifestHash = contentHash(manifestBytes);\n const manifestHashB32 = bytesToBase32(manifestHash);\n\n // Store manifest and ref\n await backend.put(`manifests/${manifestHashB32}`, manifestBytes);\n await backend.put(`refs/${name}`, manifestHash);\n\n return new Dataset(backend, name, manifestHashB32, timelineHash, schema);\n }\n\n static async open(\n name: string,\n schema?: Schema | null,\n backendUrl = \"\",\n ): Promise<Dataset> {\n const backend = resolveBackend(backendUrl);\n\n // Read ref → manifest hash\n const refBytes = await backend.get(`refs/${name}`);\n if (refBytes.length !== MULTIHASH_BYTES) {\n throw new Error(`ref body not ${MULTIHASH_BYTES} bytes: got ${refBytes.length}`);\n }\n const manifestHash = bytesToBase32(refBytes);\n\n // Read manifest\n const manifestBytes = await backend.get(`manifests/${manifestHash}`);\n const manifest = decodeCbor(manifestBytes) as Record<string, CborValue>;\n\n // Extract timeline\n const timelines = manifest.timelines as Uint8Array[];\n if (!timelines || !Array.isArray(timelines) || timelines.length === 0) {\n throw new Error(\"Manifest has no timelines[]\");\n }\n const timelineHash = bytesToBase32(timelines[0] as Uint8Array);\n\n // Recover schema from manifest registry if not provided\n let resolvedSchema: Schema;\n if (schema) {\n resolvedSchema = schema;\n } else {\n const registry = manifest.registry as Record<string, CborValue> | undefined;\n const schemaCbor = registry?.[\"dreamdb.schema\"] as Record<string, CborValue> | undefined;\n if (schemaCbor && Array.isArray(schemaCbor.fields)) {\n resolvedSchema = schemaFromCbor(schemaCbor);\n } else {\n resolvedSchema = new Schema();\n }\n }\n\n return new Dataset(backend, name, manifestHash, timelineHash, resolvedSchema);\n }\n\n // ---- Inspection ----\n\n refName(): string {\n return this._refName;\n }\n\n currentManifest(): Base32Hash {\n return this._manifestHash;\n }\n\n timeline(): Base32Hash {\n return this._timelineHash;\n }\n\n schema(): Schema {\n return this._schema;\n }\n\n async history(maxDepth = 50): Promise<Array<{\n manifest: Base32Hash;\n ts_ns: number;\n writer: string;\n parents_count: number;\n tracks_count: number;\n }>> {\n const out: Array<{\n manifest: Base32Hash;\n ts_ns: number;\n writer: string;\n parents_count: number;\n tracks_count: number;\n }> = [];\n let curHash = this._manifestHash;\n\n while (curHash && out.length < maxDepth) {\n let manifestBytes: Uint8Array;\n try {\n manifestBytes = await this.backend.get(`manifests/${curHash}`);\n } catch {\n break;\n }\n const m = decodeCbor(manifestBytes) as Record<string, CborValue>;\n out.push({\n manifest: curHash,\n ts_ns: typeof m.ts === \"bigint\" ? Number(m.ts) : Number(m.ts || 0),\n writer: (m.writer as string) || \"(unknown)\",\n parents_count: Array.isArray(m.parents) ? (m.parents as CborValue[]).length : 0,\n tracks_count: Array.isArray(m.tracks) ? (m.tracks as CborValue[]).length : 0,\n });\n const parents = m.parents as Uint8Array[] | undefined;\n if (!parents || parents.length === 0) break;\n curHash = bytesToBase32(parents[0]);\n }\n return out;\n }\n\n async listRefs(): Promise<string[]> {\n const keys = await this.backend.list(\"refs/\");\n return keys.map((k) => k.replace(/^refs\\//, \"\")).sort();\n }\n\n async count(): Promise<number> {\n // Walk all embedding tracks and count records\n let n = 0;\n for await (const batch of this._iterStreamImpl(4096)) {\n n += batch._time_anchors.length;\n }\n return n;\n }\n\n // ---- Write path ----\n\n async appendMany(samples: Sample[]): Promise<number> {\n if (samples.length === 0) return 0;\n\n // Read current manifest\n const manifestBytes = await this.backend.get(`manifests/${this._manifestHash}`);\n const manifest = decodeCbor(manifestBytes) as Record<string, CborValue>;\n const tracks = manifest.tracks as Array<Record<string, CborValue>>;\n\n // Generate time anchors.\n // Use microsecond precision to stay within Number.MAX_SAFE_INTEGER\n // (Date.now() * 1e6 would exceed 2^53; Date.now() * 1e3 stays safe).\n const hasExplicitAnchors = \"_anchor\" in samples[0];\n const baseUs = Date.now() * 1000;\n const anchors: TimeAnchor[] = samples.map((s, i) => {\n if (hasExplicitAnchors) {\n return s._anchor as number;\n }\n return baseUs + i;\n });\n\n // Process each field and update tracks\n const newTracks: Array<Record<string, CborValue>> = [];\n\n for (let ti = 0; ti < tracks.length; ti++) {\n const track = tracks[ti];\n const modality = track.modality as string;\n\n // Find matching schema field\n const field = this._schema.fields.find((f) => {\n const expectedMod = modalityForField({\n kind: f.kind,\n mime: f.kind === \"image\" || f.kind === \"audio\" || f.kind === \"video\"\n ? (f as ImageFieldDef | AudioFieldDef | VideoFieldDef).mime\n : undefined,\n dim: f.kind === \"embedding\" ? (f as EmbeddingFieldDef).dim : undefined,\n name: f.name,\n valueType: f.kind === \"scalar\" ? (f as ScalarFieldDef).valueType : undefined,\n });\n return expectedMod === modality;\n });\n\n if (!field) {\n newTracks.push(track);\n continue;\n }\n\n // Read existing track object\n const trackAddr = bytesToBase32(track.address as Uint8Array);\n const trackBytes = await this.backend.get(\n `${this._timelineHash}/${modality}/track/${trackAddr}`,\n );\n const trackObj = decodeCbor(trackBytes) as Record<string, CborValue>;\n const objIndex = (trackObj.object_index as CborValue[]) || [];\n\n if (field.kind === \"image\" || field.kind === \"audio\" || field.kind === \"video\") {\n // Blob fields: store each sample value as a Fragment\n const newEntries: CborValue[] = [...objIndex];\n for (let i = 0; i < samples.length; i++) {\n const value = samples[i][field.name];\n if (value === null || value === undefined) continue;\n const data =\n value instanceof Uint8Array ? value : new Uint8Array(value as ArrayLike<number>);\n const fragHash = contentHash(data);\n const fragHashB32 = bytesToBase32(fragHash);\n await this.backend.put(\n `${this._timelineHash}/${modality}/0000000000000000/${fragHashB32}`,\n data,\n );\n // FragmentEntry: [t_start, t_end, byte_size, hash]\n newEntries.push([\n BigInt(anchors[i]),\n BigInt(anchors[i]),\n data.length,\n fragHash,\n ]);\n }\n const newTrackObj: CborValue = { object_index: newEntries };\n const newTrackBytes = encodeCbor(newTrackObj);\n const newTrackHash = contentHash(newTrackBytes);\n const newTrackHashB32 = bytesToBase32(newTrackHash);\n await this.backend.put(\n `${this._timelineHash}/${modality}/track/${newTrackHashB32}`,\n newTrackBytes,\n );\n newTracks.push({ ...track, address: newTrackHash });\n } else if (field.kind === \"embedding\") {\n const embField = field as EmbeddingFieldDef;\n const dim = embField.dim;\n\n // Group samples by LSH bucket key (simple implementation)\n // For now, use a single bucket key \"0\" repeated by lshBits or 12 bits\n const lshBits = embField.lshBits || 12;\n const bucketGroups = new Map<string, Array<{ anchor: TimeAnchor; vec: number[] }>>();\n\n for (let i = 0; i < samples.length; i++) {\n const value = samples[i][field.name];\n if (value === null || value === undefined) continue;\n const vec = value instanceof Float32Array\n ? Array.from(value)\n : value as number[];\n // Simple LSH: hash to a bucket key by sign of first lshBits dimensions\n const normVec = normalizeL2(new Float32Array(vec));\n let key = \"\";\n for (let b = 0; b < lshBits; b++) {\n key += normVec[b % dim] >= 0 ? \"1\" : \"0\";\n }\n if (!bucketGroups.has(key)) bucketGroups.set(key, []);\n bucketGroups.get(key)!.push({ anchor: anchors[i], vec });\n }\n\n const newEntries: CborValue[] = [...objIndex];\n for (const [spatialKey, records] of bucketGroups) {\n // Build bucket binary: 160-byte header + records\n const recordSize = 8 + dim * 4;\n const headerSize = 160;\n const totalSize = headerSize + records.length * recordSize;\n const bucket = new Uint8Array(totalSize);\n const bucketView = new DataView(bucket.buffer);\n\n // Header: magic \"VBUU\"\n bucket[0] = 0x56; bucket[1] = 0x42; bucket[2] = 0x55; bucket[3] = 0x55;\n bucketView.setUint32(4, 1, false); // version\n bucketView.setUint32(8, recordSize, false);\n bucketView.setUint32(12, records.length, false);\n bucketView.setUint32(16, headerSize, false);\n\n // Records\n for (let ri = 0; ri < records.length; ri++) {\n const off = headerSize + ri * recordSize;\n const anchor = records[ri].anchor;\n // u64 BE time_anchor\n const anchorBig = BigInt(anchor);\n bucketView.setUint32(off, Number(anchorBig >> 32n), false);\n bucketView.setUint32(off + 4, Number(anchorBig & 0xffffffffn), false);\n // f32 LE vector\n for (let d = 0; d < dim; d++) {\n bucketView.setFloat32(off + 8 + d * 4, records[ri].vec[d], true);\n }\n }\n\n const bucketHash = contentHash(bucket);\n const bucketHashB32 = bytesToBase32(bucketHash);\n await this.backend.put(\n `${this._timelineHash}/${modality}/${spatialKey}/${bucketHashB32}`,\n bucket,\n );\n\n // SpatialBucketEntry: [spatial_key, t_start, t_end, byte_size, bucket_hash]\n const tAnchors = records.map((r) => r.anchor).sort((a, b) => a - b);\n newEntries.push([\n spatialKey,\n BigInt(tAnchors[0]),\n BigInt(tAnchors[tAnchors.length - 1]),\n totalSize,\n bucketHash,\n ]);\n }\n\n const newTrackObj: CborValue = { object_index: newEntries };\n const newTrackBytes = encodeCbor(newTrackObj);\n const newTrackHash = contentHash(newTrackBytes);\n const newTrackHashB32 = bytesToBase32(newTrackHash);\n await this.backend.put(\n `${this._timelineHash}/${modality}/track/${newTrackHashB32}`,\n newTrackBytes,\n );\n newTracks.push({ ...track, address: newTrackHash });\n } else if (field.kind === \"scalar\") {\n // Group by distinct value\n const valGroups = new Map<string, TimeAnchor[]>();\n for (let i = 0; i < samples.length; i++) {\n const value = samples[i][field.name];\n if (value === null || value === undefined) continue;\n const key = String(value);\n if (!valGroups.has(key)) valGroups.set(key, []);\n valGroups.get(key)!.push(anchors[i]);\n }\n\n const newEntries: CborValue[] = [...objIndex];\n for (const [valueStr, anchorList] of valGroups) {\n // Encode the anchor list as CBOR array of u64\n const anchorsCbor: CborValue = anchorList.map((a) => BigInt(a));\n const bucketBytes = encodeCbor(anchorsCbor);\n const bucketHash = contentHash(bucketBytes);\n const bucketHashB32 = bytesToBase32(bucketHash);\n await this.backend.put(\n `${this._timelineHash}/${modality}/bucket/${bucketHashB32}`,\n bucketBytes,\n );\n\n // Encode the value itself as CBOR\n const valueCbor = parseScalarString(valueStr, (field as ScalarFieldDef).valueType);\n const valueCborBytes = encodeCbor(valueCbor);\n\n // ScalarBucketEntry: [value_cbor_bytes, t_start, t_end, bucket_hash]\n const sortedAnchors = anchorList.sort((a, b) => a - b);\n newEntries.push([\n valueCborBytes,\n BigInt(sortedAnchors[0]),\n BigInt(sortedAnchors[sortedAnchors.length - 1]),\n bucketHash,\n ]);\n }\n\n const newTrackObj: CborValue = { object_index: newEntries };\n const newTrackBytes = encodeCbor(newTrackObj);\n const newTrackHash = contentHash(newTrackBytes);\n const newTrackHashB32 = bytesToBase32(newTrackHash);\n await this.backend.put(\n `${this._timelineHash}/${modality}/track/${newTrackHashB32}`,\n newTrackBytes,\n );\n newTracks.push({ ...track, address: newTrackHash });\n } else {\n newTracks.push(track);\n }\n }\n\n // Write new manifest with parent pointer\n const oldManifestHash = base32ToBytes(this._manifestHash);\n // Pad or trim to MULTIHASH_BYTES\n const parentBytes = new Uint8Array(MULTIHASH_BYTES);\n parentBytes.set(oldManifestHash.subarray(0, MULTIHASH_BYTES));\n\n const newManifest: CborValue = {\n timelines: manifest.timelines,\n tracks: newTracks,\n parents: [parentBytes],\n ts: BigInt(Date.now()) * 1000000n,\n writer: \"dreamdb-ts/0.1.0\",\n registry: manifest.registry || {},\n };\n\n const newManifestBytes = encodeCbor(newManifest);\n const newManifestHash = contentHash(newManifestBytes);\n const newManifestHashB32 = bytesToBase32(newManifestHash);\n\n await this.backend.put(`manifests/${newManifestHashB32}`, newManifestBytes);\n await this.backend.put(`refs/${this._refName}`, newManifestHash);\n\n this._manifestHash = newManifestHashB32;\n return samples.length;\n }\n\n // ---- Read path ----\n\n async iterVector(\n field: string,\n query: number[] | Float32Array,\n topK: number,\n batchSize = 64,\n opts: { whereEq?: WhereClause } = {},\n ): Promise<Batch[]> {\n // Read current manifest\n const manifestBytes = await this.backend.get(`manifests/${this._manifestHash}`);\n const manifest = decodeCbor(manifestBytes) as Record<string, CborValue>;\n const tracks = manifest.tracks as Array<Record<string, CborValue>>;\n\n // Find embedding track\n const embField = this._schema.fields.find(\n (f) => f.kind === \"embedding\" && f.name === field,\n ) as EmbeddingFieldDef | undefined;\n if (!embField) throw new Error(`no embedding field \"${field}\" in schema`);\n\n const modality = modalityForField({\n kind: embField.kind,\n dim: embField.dim,\n name: embField.name,\n })!;\n const dim = embField.dim;\n\n // Find the track\n const track = tracks.find((t) => t.modality === modality);\n if (!track) throw new Error(`no Track for modality ${modality}`);\n\n const trackAddr = bytesToBase32(track.address as Uint8Array);\n const trackBytes = await this.backend.get(\n `${this._timelineHash}/${modality}/track/${trackAddr}`,\n );\n const trackObj = decodeCbor(trackBytes) as Record<string, CborValue>;\n const objIndex = trackObj.object_index as CborValue[];\n if (!Array.isArray(objIndex) || objIndex.length === 0) return [];\n\n // Score all records\n const qNorm = normalizeL2(\n query instanceof Float32Array ? query : new Float32Array(query),\n );\n const recordSize = 8 + dim * 4;\n\n interface Candidate {\n anchor: TimeAnchor;\n score: number;\n vec: Float32Array;\n }\n const candidates: Candidate[] = [];\n\n for (const entry of objIndex) {\n const e = entry as CborValue[];\n const spatialKey = e[0] as string;\n const bucketAddr = bytesToBase32(e[4] as Uint8Array);\n const body = await this.backend.get(\n `${this._timelineHash}/${modality}/${spatialKey}/${bucketAddr}`,\n );\n\n // Decode bucket records\n const view = new DataView(body.buffer, body.byteOffset, body.byteLength);\n const headerSize = view.getUint32(16, false);\n const recordCount = view.getUint32(12, false);\n const actualRecordSize = view.getUint32(8, false);\n\n for (let i = 0; i < recordCount; i++) {\n const off = headerSize + i * actualRecordSize;\n const hi = view.getUint32(off, false);\n const lo = view.getUint32(off + 4, false);\n const anchor = Number((BigInt(hi) << 32n) | BigInt(lo));\n const vec = new Float32Array(dim);\n for (let d = 0; d < dim; d++) {\n vec[d] = view.getFloat32(off + 8 + d * 4, true);\n }\n const normVec = normalizeL2(vec);\n const score = dotL2Normalized(qNorm, normVec);\n candidates.push({ anchor, score, vec });\n }\n }\n\n // Sort by score descending, take topK\n candidates.sort((a, b) => b.score - a.score);\n let topCandidates = candidates.slice(0, topK);\n\n // Apply where_eq filter using scalar tracks\n if (opts.whereEq && Object.keys(opts.whereEq).length > 0) {\n const anchorLabels = await this._resolveScalarLabels(\n manifest,\n tracks,\n opts.whereEq,\n );\n topCandidates = topCandidates.filter((c) => {\n for (const [filterField, filterValue] of Object.entries(opts.whereEq!)) {\n const labelMap = anchorLabels.get(filterField);\n if (!labelMap) return false;\n const anchorVal = labelMap.get(c.anchor);\n if (anchorVal === undefined || String(anchorVal) !== String(filterValue))\n return false;\n }\n return true;\n });\n }\n\n // Resolve blob data for the top results\n const blobFields = this._schema.fields.filter(\n (f) => f.kind === \"image\" || f.kind === \"audio\" || f.kind === \"video\",\n );\n const scalarFields = this._schema.fields.filter((f) => f.kind === \"scalar\");\n\n // Build the set of all anchors we need\n const resultAnchors = new Set(topCandidates.map((c) => c.anchor));\n\n // Build blob lookups\n const blobData = new Map<string, Map<TimeAnchor, Uint8Array>>();\n for (const bf of blobFields) {\n const bfMod = modalityForField({\n kind: bf.kind,\n mime: (bf as ImageFieldDef).mime,\n name: bf.name,\n })!;\n const bfTrack = tracks.find((t) => t.modality === bfMod);\n if (!bfTrack) continue;\n const bfAddr = bytesToBase32(bfTrack.address as Uint8Array);\n const bfTrackBytes = await this.backend.get(\n `${this._timelineHash}/${bfMod}/track/${bfAddr}`,\n );\n const bfTrackObj = decodeCbor(bfTrackBytes) as Record<string, CborValue>;\n const bfObjIndex = bfTrackObj.object_index as CborValue[];\n if (!Array.isArray(bfObjIndex)) continue;\n\n const fieldData = new Map<TimeAnchor, Uint8Array>();\n for (const entry of bfObjIndex) {\n const e = entry as CborValue[];\n const tStart = Number(e[0] as bigint);\n if (!resultAnchors.has(tStart)) continue;\n const fragHash = bytesToBase32(e[3] as Uint8Array);\n try {\n const fragBytes = await this.backend.get(\n `${this._timelineHash}/${bfMod}/0000000000000000/${fragHash}`,\n );\n fieldData.set(tStart, fragBytes);\n } catch {\n // Fragment missing — skip\n }\n }\n blobData.set(bf.name, fieldData);\n }\n\n // Build scalar lookups\n const scalarData = new Map<string, Map<TimeAnchor, CborValue>>();\n for (const sf of scalarFields) {\n const sfMod = modalityForField({\n kind: sf.kind,\n name: sf.name,\n valueType: (sf as ScalarFieldDef).valueType,\n })!;\n const sfTrack = tracks.find((t) => t.modality === sfMod);\n if (!sfTrack) continue;\n const sfAddr = bytesToBase32(sfTrack.address as Uint8Array);\n const sfTrackBytes = await this.backend.get(\n `${this._timelineHash}/${sfMod}/track/${sfAddr}`,\n );\n const sfTrackObj = decodeCbor(sfTrackBytes) as Record<string, CborValue>;\n const sfObjIndex = sfTrackObj.object_index as CborValue[];\n if (!Array.isArray(sfObjIndex)) continue;\n\n const fieldData = new Map<TimeAnchor, CborValue>();\n for (const entry of sfObjIndex) {\n const e = entry as CborValue[];\n const valueCborBytes = e[0] as Uint8Array;\n const value = decodeCbor(valueCborBytes);\n const bucketHash = bytesToBase32(e[3] as Uint8Array);\n try {\n const bucketBytes = await this.backend.get(\n `${this._timelineHash}/${sfMod}/bucket/${bucketHash}`,\n );\n const anchorArray = decodeCbor(bucketBytes) as CborValue[];\n if (Array.isArray(anchorArray)) {\n for (const a of anchorArray) {\n const anchor = Number(a as bigint);\n if (resultAnchors.has(anchor)) {\n fieldData.set(anchor, value);\n }\n }\n }\n } catch {\n // Bucket missing — skip\n }\n }\n scalarData.set(sf.name, fieldData);\n }\n\n // Build batches\n const batches: Batch[] = [];\n for (let i = 0; i < topCandidates.length; i += batchSize) {\n const slice = topCandidates.slice(i, i + batchSize);\n const batch: Batch = {\n _time_anchors: slice.map((c) => c.anchor),\n [field]: slice.map((c) => Array.from(c.vec)),\n };\n for (const bf of blobFields) {\n const fieldMap = blobData.get(bf.name);\n batch[bf.name] = slice.map((c) =>\n fieldMap?.get(c.anchor) ?? null,\n ) as unknown[];\n }\n for (const sf of scalarFields) {\n const fieldMap = scalarData.get(sf.name);\n batch[sf.name] = slice.map((c) =>\n fieldMap?.get(c.anchor) ?? null,\n ) as unknown[];\n }\n batches.push(batch);\n }\n return batches;\n }\n\n // ---- Streaming iteration ----\n\n private async *_iterStreamImpl(\n batchSize: number,\n ): AsyncGenerator<Batch> {\n const manifestBytes = await this.backend.get(`manifests/${this._manifestHash}`);\n const manifest = decodeCbor(manifestBytes) as Record<string, CborValue>;\n const tracks = manifest.tracks as Array<Record<string, CborValue>>;\n\n // Find embedding track(s)\n const embField = this._schema.fields.find(\n (f) => f.kind === \"embedding\",\n ) as EmbeddingFieldDef | undefined;\n if (!embField) return;\n\n const modality = modalityForField({\n kind: embField.kind,\n dim: embField.dim,\n name: embField.name,\n })!;\n const dim = embField.dim;\n const track = tracks.find((t) => t.modality === modality);\n if (!track) return;\n\n const trackAddr = bytesToBase32(track.address as Uint8Array);\n const trackBytes = await this.backend.get(\n `${this._timelineHash}/${modality}/track/${trackAddr}`,\n );\n const trackObj = decodeCbor(trackBytes) as Record<string, CborValue>;\n const objIndex = trackObj.object_index as CborValue[];\n if (!Array.isArray(objIndex)) return;\n\n let buffer: TimeAnchor[] = [];\n for (const entry of objIndex) {\n const e = entry as CborValue[];\n const spatialKey = e[0] as string;\n const bucketAddr = bytesToBase32(e[4] as Uint8Array);\n const body = await this.backend.get(\n `${this._timelineHash}/${modality}/${spatialKey}/${bucketAddr}`,\n );\n const view = new DataView(body.buffer, body.byteOffset, body.byteLength);\n const headerSize = view.getUint32(16, false);\n const recordCount = view.getUint32(12, false);\n const recordSize = view.getUint32(8, false);\n\n for (let i = 0; i < recordCount; i++) {\n const off = headerSize + i * recordSize;\n const hi = view.getUint32(off, false);\n const lo = view.getUint32(off + 4, false);\n const anchor = Number((BigInt(hi) << 32n) | BigInt(lo));\n buffer.push(anchor);\n\n if (buffer.length >= batchSize) {\n yield { _time_anchors: buffer };\n buffer = [];\n }\n }\n }\n if (buffer.length > 0) {\n yield { _time_anchors: buffer };\n }\n }\n\n async iterStream(batchSize = 256): Promise<Batch[]> {\n const batches: Batch[] = [];\n for await (const batch of this._iterStreamImpl(batchSize)) {\n batches.push(batch);\n }\n return batches;\n }\n\n // ---- Versioning ----\n\n async snapshot(label: string): Promise<SnapshotInfo> {\n const manifestHash = base32ToBytes(this._manifestHash);\n const refBytes = new Uint8Array(MULTIHASH_BYTES);\n refBytes.set(manifestHash.subarray(0, MULTIHASH_BYTES));\n await this.backend.put(`refs/${label}`, refBytes);\n return {\n label,\n manifest: this._manifestHash,\n timeline: this._timelineHash,\n };\n }\n\n async branch(newName: string): Promise<Dataset> {\n const manifestHash = base32ToBytes(this._manifestHash);\n const refBytes = new Uint8Array(MULTIHASH_BYTES);\n refBytes.set(manifestHash.subarray(0, MULTIHASH_BYTES));\n await this.backend.put(`refs/${newName}`, refBytes);\n return new Dataset(\n this.backend,\n newName,\n this._manifestHash,\n this._timelineHash,\n this._schema,\n );\n }\n\n // ---- Scalar resolution helper ----\n\n private async _resolveScalarLabels(\n manifest: Record<string, CborValue>,\n tracks: Array<Record<string, CborValue>>,\n whereEq: WhereClause,\n ): Promise<Map<string, Map<TimeAnchor, CborValue>>> {\n const result = new Map<string, Map<TimeAnchor, CborValue>>();\n\n for (const [filterField, _filterValue] of Object.entries(whereEq)) {\n const sf = this._schema.fields.find(\n (f) => f.kind === \"scalar\" && f.name === filterField,\n ) as ScalarFieldDef | undefined;\n if (!sf) continue;\n\n const sfMod = modalityForField({\n kind: sf.kind,\n name: sf.name,\n valueType: sf.valueType,\n })!;\n const sfTrack = tracks.find((t) => t.modality === sfMod);\n if (!sfTrack) continue;\n\n const sfAddr = bytesToBase32(sfTrack.address as Uint8Array);\n const sfTrackBytes = await this.backend.get(\n `${this._timelineHash}/${sfMod}/track/${sfAddr}`,\n );\n const sfTrackObj = decodeCbor(sfTrackBytes) as Record<string, CborValue>;\n const sfObjIndex = sfTrackObj.object_index as CborValue[];\n if (!Array.isArray(sfObjIndex)) continue;\n\n const fieldData = new Map<TimeAnchor, CborValue>();\n for (const entry of sfObjIndex) {\n const e = entry as CborValue[];\n const valueCborBytes = e[0] as Uint8Array;\n const value = decodeCbor(valueCborBytes);\n const bucketHash = bytesToBase32(e[3] as Uint8Array);\n try {\n const bucketBytes = await this.backend.get(\n `${this._timelineHash}/${sfMod}/bucket/${bucketHash}`,\n );\n const anchorArray = decodeCbor(bucketBytes) as CborValue[];\n if (Array.isArray(anchorArray)) {\n for (const a of anchorArray) {\n fieldData.set(Number(a as bigint), value);\n }\n }\n } catch {\n // skip\n }\n }\n result.set(filterField, fieldData);\n }\n return result;\n }\n}\n\n// ---- Helpers ----\n\nfunction resolveBackend(url: string): Backend {\n if (url === \"memory://\" || url === \"\") {\n return new MemoryBackend();\n }\n if (url.startsWith(\"file://\")) {\n // File backend not implemented in browser-first SDK — fall back to memory\n throw new Error(\"file:// backend not supported in the TypeScript SDK (browser-first)\");\n }\n // Assume S3-compatible HTTP URL\n return new S3Backend(url);\n}\n\n/**\n * Deterministic content hash — simplified version for the TS SDK.\n * Uses a simple FNV-1a-like hash to produce 33-byte multihash.\n * In production, this should be blake3 or sha256.\n */\nfunction contentHash(data: Uint8Array): Uint8Array {\n // Multihash format: [hash_fn_code, hash_length, ...hash_bytes]\n // We use a simple hash for the in-memory path\n const hash = new Uint8Array(MULTIHASH_BYTES);\n hash[0] = 0x1e; // blake3 function code placeholder\n hash[1] = 31; // 31 bytes of hash data\n\n // FNV-1a 256-bit spread across 31 bytes\n const FNV_OFFSET = 0xcbf29ce484222325n;\n const FNV_PRIME = 0x100000001b3n;\n let h = FNV_OFFSET;\n for (let i = 0; i < data.length; i++) {\n h = h ^ BigInt(data[i]);\n h = (h * FNV_PRIME) & 0xffffffffffffffffn;\n }\n\n // Spread the 64-bit hash across 31 bytes with a mixing step\n const buf = new DataView(new ArrayBuffer(8));\n buf.setBigUint64(0, h);\n for (let i = 0; i < 31; i++) {\n // Mix the 8-byte hash into 31 bytes\n const byteIdx = i % 8;\n const seed = new Uint8Array(new ArrayBuffer(8));\n new DataView(seed.buffer).setBigUint64(0, h);\n hash[2 + i] = seed[byteIdx] ^ ((i * 0x9e + 0x37) & 0xff);\n // Re-mix\n h = (h * FNV_PRIME + BigInt(i)) & 0xffffffffffffffffn;\n }\n\n return hash;\n}\n\n/** Generate a deterministic hash from a string (for timeline IDs). */\nfunction hashFromString(s: string): Uint8Array {\n const encoded = new TextEncoder().encode(s);\n return contentHash(encoded);\n}\n\n/** Parse a scalar string value back to its typed form. */\nfunction parseScalarString(\n s: string,\n valueType: ScalarValueType,\n): CborValue {\n switch (valueType) {\n case \"bool\":\n return s === \"true\";\n case \"int\":\n return parseInt(s, 10);\n case \"float\":\n return parseFloat(s);\n default:\n return s; // categorical, string, timestamp\n }\n}\n\n/** Recover a Schema from its CBOR representation. */\nfunction schemaFromCbor(obj: Record<string, CborValue>): Schema {\n const schema = new Schema();\n const fields = obj.fields as Array<Record<string, CborValue>>;\n if (!Array.isArray(fields)) return schema;\n\n for (const f of fields) {\n const kind = f.kind as string;\n const name = f.name as string;\n if (kind === \"image\") {\n schema.addImage(name, {\n mime: (f.mime as string) || \"jpeg\",\n required: f.required !== false,\n });\n } else if (kind === \"audio\") {\n schema.addAudio(name, {\n mime: (f.mime as string) || \"wav\",\n required: f.required !== false,\n });\n } else if (kind === \"video\") {\n schema.addVideo(name, {\n mime: (f.mime as string) || \"mp4\",\n required: f.required !== false,\n });\n } else if (kind === \"embedding\") {\n schema.addEmbedding(name, {\n dim: Number(f.dim),\n algorithm: (f.algorithm as string) || \"dreamdb.lsh-cosine\",\n required: f.required !== false,\n rerank: f.rerank === true,\n });\n } else if (kind === \"scalar\") {\n const vt = (f.value_type as string) || \"categorical\";\n switch (vt) {\n case \"categorical\": schema.addScalarCategorical(name); break;\n case \"bool\": schema.addScalarBool(name); break;\n case \"int\": schema.addScalarInt(name); break;\n case \"float\": schema.addScalarFloat(name); break;\n case \"string\": schema.addScalarString(name); break;\n case \"timestamp\": schema.addScalarTimestamp(name); break;\n }\n }\n }\n return schema;\n}\n","// ---- Fundamental types ----\n\n/** 33-byte multihash, represented as Uint8Array on the wire. */\nexport type MultihashBytes = Uint8Array;\n\n/** Base32-encoded string form of a multihash. */\nexport type Base32Hash = string;\n\n/** Nanoseconds since UNIX epoch — the join key across all modalities. */\nexport type TimeAnchor = number;\n\n// ---- Schema types ----\n\nexport type FieldKind = \"image\" | \"audio\" | \"video\" | \"embedding\" | \"scalar\";\n\nexport type ScalarValueType =\n | \"categorical\"\n | \"bool\"\n | \"int\"\n | \"float\"\n | \"string\"\n | \"timestamp\";\n\nexport interface ImageFieldDef {\n kind: \"image\";\n name: string;\n mime: string;\n required: boolean;\n chunkSize?: number;\n packItems?: number;\n}\n\nexport interface AudioFieldDef {\n kind: \"audio\";\n name: string;\n mime: string;\n required: boolean;\n chunkSize?: number;\n packItems?: number;\n}\n\nexport interface VideoFieldDef {\n kind: \"video\";\n name: string;\n mime: string;\n required: boolean;\n chunkSize?: number;\n packItems?: number;\n}\n\nexport interface EmbeddingFieldDef {\n kind: \"embedding\";\n name: string;\n dim: number;\n algorithm: string;\n required: boolean;\n lshBits?: number;\n compressor?: MultihashBytes;\n spatialIndex?: MultihashBytes;\n rerank: boolean;\n}\n\nexport interface ScalarFieldDef {\n kind: \"scalar\";\n name: string;\n valueType: ScalarValueType;\n required: boolean;\n}\n\nexport type FieldDef =\n | ImageFieldDef\n | AudioFieldDef\n | VideoFieldDef\n | EmbeddingFieldDef\n | ScalarFieldDef;\n\n// ---- Manifest types ----\n\nexport interface ManifestTrack {\n modality: string;\n kind: string;\n role: string;\n address: MultihashBytes;\n timeline: MultihashBytes;\n coverage: unknown;\n}\n\nexport interface Manifest {\n timelines: MultihashBytes[];\n tracks: ManifestTrack[];\n parents?: MultihashBytes[];\n ts?: number | bigint;\n writer?: string;\n registry?: Record<string, RegistryEntry>;\n}\n\nexport interface RegistryEntry {\n spatial_index?: MultihashBytes[];\n spatial_index_hashes?: MultihashBytes[];\n vector_compressor?: MultihashBytes;\n [key: string]: unknown;\n}\n\n// ---- Track types (resolved) ----\n\nexport interface ResolvedTrack {\n modality: string;\n field: string | null;\n key: string;\n kind: string;\n role: string;\n address: Base32Hash;\n timeline: Base32Hash;\n coverage: unknown;\n}\n\n// ---- Query types ----\n\nexport interface VectorQueryOptions {\n topK?: number;\n probeCount?: number;\n maxHamming?: number;\n}\n\nexport interface VectorQueryResult {\n anchor: TimeAnchor;\n score: number;\n}\n\nexport interface QueryStats {\n bucketsTotal: number;\n bucketsProbed: number;\n fellBackToBruteForce: boolean;\n candidatesScored?: number;\n topT?: number;\n rerankFetchCount?: number;\n rerankSkippedNoHash?: number;\n}\n\n// ---- History types ----\n\nexport interface HistoryEntry {\n manifestHash: Base32Hash;\n ts: number;\n writer: string;\n tracks: Array<{ modality: string; address: Base32Hash }>;\n parents: number;\n truncatedAt?: string;\n}\n\n// ---- Batch types ----\n\nexport interface Batch {\n [fieldName: string]: unknown[];\n _time_anchors: TimeAnchor[];\n}\n\n// ---- Backend types ----\n\nexport interface BackendGetOptions {\n noCache?: boolean;\n}\n\nexport interface BackendPutOptions {\n contentType?: string;\n}\n\n/**\n * Abstract storage backend. All connector implementations must fulfill\n * this interface. GET is required; PUT is needed only for write paths.\n */\nexport interface Backend {\n /** Fetch bytes at `path` relative to the backend root. */\n get(path: string, opts?: BackendGetOptions): Promise<Uint8Array>;\n\n /** Store bytes at `path`. Returns the path written. */\n put(path: string, data: Uint8Array, opts?: BackendPutOptions): Promise<string>;\n\n /** List keys under `prefix`. */\n list(prefix: string): Promise<string[]>;\n\n /** Delete a key. */\n delete(path: string): Promise<void>;\n}\n\n// ---- Sample types (for write path) ----\n\nexport type SampleValue =\n | Uint8Array\n | number[]\n | Float32Array\n | string\n | number\n | boolean\n | null;\n\nexport type Sample = {\n [fieldName: string]: SampleValue;\n};\n\n// ---- Dataset types ----\n\nexport interface DatasetInfo {\n refName: string;\n manifest: Base32Hash;\n timeline: Base32Hash;\n}\n\nexport interface SnapshotInfo {\n label: string;\n manifest: Base32Hash;\n timeline: Base32Hash;\n}\n\n// ---- Where-clause filter ----\n\nexport type WhereClause = Record<string, string | number | boolean>;\n\n// ---- Spatial dispatcher ----\n\nexport interface SpatialDispatcher {\n algorithm: string;\n dim: number;\n bits: number;\n k?: number;\n probeKeys(qNorm: Float32Array, probeCount: number, maxHamming: number): string[];\n}\n\n// ---- Vector compressor decoder ----\n\nexport interface VectorCompressorDecoder {\n algorithm: string;\n dim: number;\n recordCodeBytes: number;\n decode(codes: Uint8Array): Float32Array;\n rotateQuery?(qNorm: Float32Array): Float32Array;\n adcScore?(rotatedQuery: Float32Array, codes: Uint8Array): number;\n}\n\n// ---- Bucket record ----\n\nexport interface BucketRecord {\n anchor: TimeAnchor;\n ordinal: number;\n vec?: Float32Array;\n codes?: Uint8Array;\n}\n\n// ---- CBOR decoded value ----\n\nexport type CborValue =\n | number\n | bigint\n | string\n | boolean\n | null\n | undefined\n | Uint8Array\n | CborValue[]\n | { [key: string]: CborValue };\n\n// ---- Scalar modality encoding table ----\n\nexport const SCALAR_ENCODING_MAP: Record<string, string> = {\n categorical: \"cat\",\n bool: \"bool\",\n int: \"i64\",\n float: \"f64\",\n string: \"str\",\n timestamp: \"ts\",\n};\n"],"mappings":"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","names":["out"]}