@delali/narsil 0.2.4-next.49 → 0.2.4-next.51

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +1 -1
  2. package/dist/{options-Dtk99qUs.d.ts → capabilities-BWm4IITU.d.ts} +56 -48
  3. package/dist/chunk-AV4IJKD2.mjs +35 -0
  4. package/dist/{chunk-M6JGMKA5.mjs → chunk-BEIK3EOZ.mjs} +503 -2273
  5. package/dist/chunk-CMVG2UEF.mjs +2038 -0
  6. package/dist/chunk-CV5H7XL7.mjs +876 -0
  7. package/dist/{chunk-KGRYQVZ5.mjs → chunk-MHE7YWAU.mjs} +2 -1
  8. package/dist/{chunk-56PJBIJ6.mjs → chunk-ND34I3SV.mjs} +427 -1455
  9. package/dist/chunk-PIWKZPP7.mjs +64 -0
  10. package/dist/{chunk-HGJC5L65.mjs → chunk-PMBHH44R.mjs} +121 -2
  11. package/dist/chunk-RP23PWMV.mjs +11 -0
  12. package/dist/{chunk-RDGXYRF4.mjs → chunk-WYJXSLER.mjs} +8 -19
  13. package/dist/{chunk-JXHUHFJ5.mjs → chunk-X6YZO4MQ.mjs} +2 -11
  14. package/dist/{chunk-OWCFK42Q.mjs → chunk-XE6XR2OE.mjs} +3 -10
  15. package/dist/chunk-ZHUQKZBE.mjs +1292 -0
  16. package/dist/{client-DX7xPcNA.d.ts → client-B_X6_AbT.d.ts} +34 -10
  17. package/dist/client.d.ts +8 -8
  18. package/dist/client.mjs +26 -10
  19. package/dist/{config-B41W23Us.d.ts → config-Czh2YNDi.d.ts} +2 -2
  20. package/dist/{config-Co-zAXqO.d.ts → config-OON7IJ_B.d.ts} +26 -5
  21. package/dist/direct-executor-OREXU72C.mjs +12 -0
  22. package/dist/distribution/coordinator/etcd.d.ts +2 -2
  23. package/dist/distribution/coordinator/in-memory.d.ts +2 -2
  24. package/dist/distribution.d.ts +8 -8
  25. package/dist/distribution.mjs +28 -11
  26. package/dist/{engine-CABZg25p.d.ts → engine-9PtFY50q.d.ts} +114 -62
  27. package/dist/index.browser.mjs +3255 -2516
  28. package/dist/index.d.ts +7 -7
  29. package/dist/index.mjs +11 -6
  30. package/dist/{search-FjWhZN3f.d.ts → memory-Bzd5xcEW.d.ts} +88 -79
  31. package/dist/persistence/durability/checkpoint-worker.d.ts +1 -1
  32. package/dist/persistence/durability/checkpoint-worker.mjs +11 -6
  33. package/dist/react.d.ts +6 -6
  34. package/dist/{schema-B7juWg8Q.d.ts → schema-BqRx9t4E.d.ts} +22 -3
  35. package/dist/server.d.ts +48 -43
  36. package/dist/server.mjs +326 -819
  37. package/dist/{tasks-Bn4R1NPN.d.ts → tasks-DT7L1p6w.d.ts} +20 -1
  38. package/dist/thread-PZLEO6JL.mjs +310 -0
  39. package/dist/{types-DsSSjY4d.d.ts → types-DXPxaXPO.d.ts} +1 -1
  40. package/dist/vector/hnsw-build-worker.mjs +2 -1
  41. package/dist/vector/search-worker.mjs +3 -121
  42. package/dist/workers/entry.mjs +47 -3
  43. package/package.json +5 -1
  44. package/dist/direct-executor-HRTDWMVB.mjs +0 -9
@@ -0,0 +1,64 @@
1
+ import { NarsilError, ErrorCodes } from './chunk-P4ELXVJQ.mjs';
2
+
3
+ // src/narsil/internals.ts
4
+ var engineCores = /* @__PURE__ */ new WeakMap();
5
+ function bindEngineCore(engine, core) {
6
+ engineCores.set(engine, core);
7
+ }
8
+ function engineCoreOf(engine) {
9
+ return engineCores.get(engine);
10
+ }
11
+
12
+ // src/distribution/constants.ts
13
+ var WIRE_BATCH_BUDGET = {
14
+ maxCount: 1e3,
15
+ maxBytes: 8388608,
16
+ overheadBytes: 256
17
+ };
18
+ var MAX_PARTITION_COUNT = 65536;
19
+ var MAX_REPLICATION_FACTOR = 255;
20
+
21
+ // src/engine/resolve-vector-text.ts
22
+ async function resolveVectorText(params, embeddingAdapter, signal, embeddingAdapterName) {
23
+ if (!params.vector) return params;
24
+ if (params.vector.text === void 0 && params.vector.value === void 0) return params;
25
+ if (params.vector.value !== void 0 && params.vector.text === void 0) return params;
26
+ if (params.vector.text !== void 0 && params.vector.value !== void 0) {
27
+ throw new NarsilError(ErrorCodes.EMBEDDING_CONFIG_INVALID, "Vector query cannot have both 'text' and 'value'");
28
+ }
29
+ if (!embeddingAdapter) {
30
+ throw new NarsilError(
31
+ ErrorCodes.EMBEDDING_CONFIG_INVALID,
32
+ embeddingAdapterName ? `Vector query with 'text' needs embedding adapter "${embeddingAdapterName}", which is not registered on this engine. Register it with registerEmbeddingAdapter or supply a raw vector.` : "Vector query with 'text' requires an embedding adapter on the index or instance",
33
+ embeddingAdapterName ? { adapter: embeddingAdapterName } : void 0
34
+ );
35
+ }
36
+ if (typeof params.vector.text !== "string") {
37
+ throw new NarsilError(
38
+ ErrorCodes.DOC_VALIDATION_FAILED,
39
+ `Vector query 'text' must be a string, got ${typeof params.vector.text}`
40
+ );
41
+ }
42
+ if (params.vector.text.length === 0) {
43
+ throw new NarsilError(ErrorCodes.DOC_VALIDATION_FAILED, "Vector query 'text' must not be empty");
44
+ }
45
+ const raw = await embeddingAdapter.embed(params.vector.text, "query", signal);
46
+ if (!(raw instanceof Float32Array)) {
47
+ throw new NarsilError(
48
+ ErrorCodes.EMBEDDING_FAILED,
49
+ `Adapter returned ${typeof raw} for query embedding, expected Float32Array`
50
+ );
51
+ }
52
+ if (raw.length !== embeddingAdapter.dimensions) {
53
+ throw new NarsilError(
54
+ ErrorCodes.EMBEDDING_DIMENSION_MISMATCH,
55
+ `Adapter returned ${raw.length}-dimensional vector for query, expected ${embeddingAdapter.dimensions}`,
56
+ { expected: embeddingAdapter.dimensions, actual: raw.length }
57
+ );
58
+ }
59
+ const resolved = { ...params.vector, value: Array.from(raw) };
60
+ delete resolved.text;
61
+ return { ...params, vector: resolved };
62
+ }
63
+
64
+ export { MAX_PARTITION_COUNT, MAX_REPLICATION_FACTOR, WIRE_BATCH_BUDGET, bindEngineCore, engineCoreOf, resolveVectorText };
@@ -1,4 +1,4 @@
1
- import { createArenaSimd, WASM_PAGE_BYTES, VECTOR_STORE_INITIAL_CAPACITY, QUANTIZATION_PADDING_FACTOR } from './chunk-JXHUHFJ5.mjs';
1
+ import { createSharedArenaSimd, importAdjacency, createHNSWWorkspace, createArenaSimd, WASM_PAGE_BYTES, VECTOR_STORE_INITIAL_CAPACITY, arenaFloat32Distance, ABSENT_DOCUMENT_RANK, QUANTIZATION_PADDING_FACTOR } from './chunk-X6YZO4MQ.mjs';
2
2
 
3
3
  // src/vector/scalar-quantization-math.ts
4
4
  function deriveSq8Constants(alpha, offset, dimensions) {
@@ -68,6 +68,125 @@ function arenaQuantizedDistance(simd, queryByteOffset, codeByteOffset, dimension
68
68
  return 1 - realDot / (queryMagnitude * documentMagnitude);
69
69
  }
70
70
 
71
+ // src/vector/shared-generation/worker-view.ts
72
+ function createVectorReader(snapshot, simd, scratchSlot) {
73
+ const { layout, magnitudes, rankByOrdinal } = snapshot;
74
+ const { dimension, slots } = layout;
75
+ const vectors = new Float32Array(snapshot.memory.buffer, layout.vectorsOffset, slots * dimension);
76
+ const scratchByteOffset = scratchSlot * layout.float32ScratchStride;
77
+ const scratch = simd ? new Float32Array(snapshot.memory.buffer, scratchByteOffset, dimension) : null;
78
+ const holdsDocument = (ordinal) => ordinal >= 0 && ordinal < slots && rankByOrdinal[ordinal] !== ABSENT_DOCUMENT_RANK;
79
+ return {
80
+ entryForOrdinal(ordinal) {
81
+ if (!holdsDocument(ordinal)) return void 0;
82
+ const base = ordinal * dimension;
83
+ return { vector: vectors.subarray(base, base + dimension), magnitude: magnitudes[ordinal] };
84
+ },
85
+ prepareQueryArena(query) {
86
+ if (!simd || !scratch || query.length !== dimension) return null;
87
+ scratch.set(query, 0);
88
+ return { magnitude: simd.magnitude(scratchByteOffset, dimension) };
89
+ },
90
+ distanceFromArena(prepared, ordinal, metric) {
91
+ if (!simd || !holdsDocument(ordinal)) return Number.POSITIVE_INFINITY;
92
+ const byteOffset = layout.vectorsOffset + ordinal * dimension * 4;
93
+ return arenaFloat32Distance(
94
+ simd,
95
+ scratchByteOffset,
96
+ byteOffset,
97
+ dimension,
98
+ metric,
99
+ prepared.magnitude,
100
+ magnitudes[ordinal]
101
+ );
102
+ }
103
+ };
104
+ }
105
+ function createQuantizerReader(snapshot, simd, scratchSlot) {
106
+ if (snapshot.quantization !== "sq8" || snapshot.calibration === null) return void 0;
107
+ const { layout, codeSums, codeMagnitudes, codePresent } = snapshot;
108
+ const { dimension, slots } = layout;
109
+ const constants = deriveSq8Constants(snapshot.calibration.alpha, snapshot.calibration.offset, dimension);
110
+ const codes = new Uint8Array(snapshot.memory.buffer, layout.codesOffset, slots * dimension);
111
+ const scratchByteOffset = layout.codeScratchOffset + scratchSlot * layout.codeScratchStride;
112
+ const scratch = simd ? new Uint8Array(snapshot.memory.buffer, scratchByteOffset, dimension) : null;
113
+ let liveCodes = 0;
114
+ for (let ordinal = 0; ordinal < codePresent.length; ordinal++) {
115
+ if (codePresent[ordinal] === 1) liveCodes++;
116
+ }
117
+ const holdsCodes = (ordinal) => ordinal >= 0 && ordinal < slots && codePresent[ordinal] === 1;
118
+ return {
119
+ get size() {
120
+ return liveCodes;
121
+ },
122
+ isCalibrated: () => true,
123
+ prepareQuery(query) {
124
+ const quantized = new Uint8Array(dimension);
125
+ const { sum, sumSq } = quantizeVectorInto(quantized, query, dimension, constants);
126
+ return { quantized, sum, sumSq, magnitude: quantizedMagnitude(constants, sumSq, sum) };
127
+ },
128
+ distanceFromPreparedByOrdinal(prepared, ordinal, metric) {
129
+ if (!holdsCodes(ordinal)) return Number.POSITIVE_INFINITY;
130
+ return scalarQuantizedDistance(
131
+ codes,
132
+ codeSums,
133
+ codeMagnitudes,
134
+ dimension,
135
+ constants,
136
+ prepared.quantized,
137
+ prepared.sum,
138
+ prepared.magnitude,
139
+ ordinal,
140
+ metric
141
+ );
142
+ },
143
+ prepareQueryArena(query) {
144
+ if (!simd || !scratch) return null;
145
+ const { sum, sumSq } = quantizeVectorInto(scratch, query, dimension, constants);
146
+ return { sum, sumSq, magnitude: quantizedMagnitude(constants, sumSq, sum) };
147
+ },
148
+ distanceFromArena(prepared, ordinal, metric) {
149
+ if (!simd || !holdsCodes(ordinal)) return Number.POSITIVE_INFINITY;
150
+ return arenaQuantizedDistance(
151
+ simd,
152
+ scratchByteOffset,
153
+ layout.codesOffset + ordinal * dimension,
154
+ dimension,
155
+ constants,
156
+ prepared.sum,
157
+ prepared.magnitude,
158
+ codeSums[ordinal],
159
+ codeMagnitudes[ordinal],
160
+ metric
161
+ );
162
+ }
163
+ };
164
+ }
165
+ function openSharedWorkerCopy(snapshot, scratchSlot) {
166
+ if (scratchSlot < 0 || scratchSlot >= snapshot.layout.workerSlots) {
167
+ throw new Error(`Scratch slot ${scratchSlot} is outside the ${snapshot.layout.workerSlots} reserved slots`);
168
+ }
169
+ const simd = createSharedArenaSimd(snapshot.memory);
170
+ const adjacency = importAdjacency(snapshot.graph.adjacency);
171
+ const capacity = Math.max(snapshot.graph.capacity, adjacency.capacity);
172
+ const searchState = {
173
+ dimension: snapshot.dimension,
174
+ store: createVectorReader(snapshot, simd, scratchSlot),
175
+ quantizer: createQuantizerReader(snapshot, simd, scratchSlot),
176
+ adjacency,
177
+ tombstones: snapshot.graph.tombstones,
178
+ tombstoneCount: snapshot.graph.tombstoneCount,
179
+ nodeCount: snapshot.graph.nodeCount,
180
+ capacity,
181
+ visited: new Uint32Array(capacity),
182
+ visitStamp: 0,
183
+ entryPointOrd: snapshot.graph.entryPointOrd,
184
+ topLayer: snapshot.graph.topLayer,
185
+ workspace: createHNSWWorkspace()
186
+ };
187
+ return { searchState, rankByOrdinal: snapshot.rankByOrdinal };
188
+ }
189
+
71
190
  // src/vector/scalar-quantization-calibration.ts
72
191
  function computeCalibrationBounds(vectors, dimensions) {
73
192
  let globalMin = Number.POSITIVE_INFINITY;
@@ -370,4 +489,4 @@ function createScalarQuantizer(dimensions, ordinalSource) {
370
489
  };
371
490
  }
372
491
 
373
- export { arenaQuantizedDistance, createScalarQuantizer, deriveSq8Constants, quantizeVectorInto, quantizedMagnitude, scalarQuantizedDistance };
492
+ export { createScalarQuantizer, openSharedWorkerCopy };
@@ -0,0 +1,11 @@
1
+ // src/vector/hnsw/constants.ts
2
+ var MAX_LAYER_CAP = 32;
3
+ var MAX_M = 512;
4
+ var INITIAL_UPPER_SLOTS = 64;
5
+ var INITIAL_LIST_CAPACITY = 64;
6
+ var COMPACTION_TOMBSTONE_RATIO = 0.1;
7
+ var COMPACTION_ABSOLUTE_THRESHOLD = 1e3;
8
+ var SQ8_OVERSELECTION_FACTOR = 2;
9
+ var SQ8_RERANK_FLOOR = 10;
10
+
11
+ export { COMPACTION_ABSOLUTE_THRESHOLD, COMPACTION_TOMBSTONE_RATIO, INITIAL_LIST_CAPACITY, INITIAL_UPPER_SLOTS, MAX_LAYER_CAP, MAX_M, SQ8_OVERSELECTION_FACTOR, SQ8_RERANK_FLOOR };
@@ -1,20 +1,3 @@
1
- // src/core/id-generator.ts
2
- function generateId() {
3
- const bytes = new Uint8Array(16);
4
- crypto.getRandomValues(bytes);
5
- const now = Date.now();
6
- bytes[0] = Math.floor(now / 2 ** 40);
7
- bytes[1] = Math.floor(now / 2 ** 32) % 256;
8
- bytes[2] = Math.floor(now / 2 ** 24) % 256;
9
- bytes[3] = Math.floor(now / 2 ** 16) % 256;
10
- bytes[4] = Math.floor(now / 2 ** 8) % 256;
11
- bytes[5] = now % 256;
12
- bytes[6] = bytes[6] & 15 | 112;
13
- bytes[8] = bytes[8] & 63 | 128;
14
- const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join("");
15
- return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
16
- }
17
-
18
1
  // src/workers/protocol.ts
19
2
  var KNOWN_ACTION_TYPES = [
20
3
  "insert",
@@ -26,6 +9,10 @@ var KNOWN_ACTION_TYPES = [
26
9
  "has",
27
10
  "count",
28
11
  "createIndex",
12
+ "loadVectorCopy",
13
+ "dropVectorCopy",
14
+ "serveRequests",
15
+ "stopServing",
29
16
  "dropIndex",
30
17
  "getStats",
31
18
  "clear",
@@ -41,8 +28,10 @@ var KNOWN_ACTION_TYPES = [
41
28
  "bootstrap",
42
29
  "shutdown"
43
30
  ];
31
+ var nextRequestSequence = 0;
44
32
  function createRequestId() {
45
- return generateId();
33
+ nextRequestSequence += 1;
34
+ return String(nextRequestSequence);
46
35
  }
47
36
  function isValidWorkerAction(msg) {
48
37
  if (msg === null || msg === void 0 || typeof msg !== "object") {
@@ -68,4 +57,4 @@ function isValidWorkerResponse(msg) {
68
57
  return true;
69
58
  }
70
59
 
71
- export { createRequestId, generateId, isValidWorkerAction, isValidWorkerResponse };
60
+ export { createRequestId, isValidWorkerAction, isValidWorkerResponse };
@@ -1,3 +1,4 @@
1
+ import { INITIAL_LIST_CAPACITY, COMPACTION_TOMBSTONE_RATIO, COMPACTION_ABSOLUTE_THRESHOLD, MAX_LAYER_CAP, SQ8_OVERSELECTION_FACTOR, SQ8_RERANK_FLOOR, INITIAL_UPPER_SLOTS } from './chunk-RP23PWMV.mjs';
1
2
  import { compareCodePoints } from './chunk-2GWVQWGA.mjs';
2
3
 
3
4
  // src/vector/constants.ts
@@ -546,16 +547,6 @@ function createVectorStore() {
546
547
  };
547
548
  }
548
549
 
549
- // src/vector/hnsw/constants.ts
550
- var MAX_LAYER_CAP = 32;
551
- var MAX_M = 512;
552
- var INITIAL_UPPER_SLOTS = 64;
553
- var INITIAL_LIST_CAPACITY = 64;
554
- var COMPACTION_TOMBSTONE_RATIO = 0.1;
555
- var COMPACTION_ABSOLUTE_THRESHOLD = 1e3;
556
- var SQ8_OVERSELECTION_FACTOR = 2;
557
- var SQ8_RERANK_FLOOR = 10;
558
-
559
550
  // src/vector/hnsw/adjacency.ts
560
551
  var ABSENT = -1;
561
552
  function createAdjacency(m, mMax0) {
@@ -1578,4 +1569,4 @@ function createHNSWIndex(dimension, store, config, quantizer) {
1578
1569
  };
1579
1570
  }
1580
1571
 
1581
- export { ABSENT_DOCUMENT_RANK, HNSW_BUILD_TIMEOUT_MS, MAX_M, MAX_WASM_PAGES, MAX_WORKER_COPIES, MAX_WORKER_DIMENSION, MAX_WORKER_VECTORS, QUANTIZATION_PADDING_FACTOR, VECTOR_SEARCH_LOAD_TIMEOUT_MS, VECTOR_SEARCH_TIMEOUT_MS, VECTOR_STORE_INITIAL_CAPACITY, WASM_PAGE_BYTES, addToOrdinalFilter, arenaFloat32Distance, cosineSimilarityWithMagnitudes, createArenaSimd, createHNSWIndex, createHNSWWorkspace, createOrdinalFilter, createSharedArenaSimd, createVectorStore, dotProduct, euclideanDistance, importAdjacency, isSimdAvailable, magnitude, ordinalFilterHas, ordinalFilterValues, removeFromOrdinalFilter, searchOrdinals, toScore };
1572
+ export { ABSENT_DOCUMENT_RANK, HNSW_BUILD_TIMEOUT_MS, MAX_WASM_PAGES, MAX_WORKER_COPIES, MAX_WORKER_DIMENSION, MAX_WORKER_VECTORS, QUANTIZATION_PADDING_FACTOR, VECTOR_SEARCH_LOAD_TIMEOUT_MS, VECTOR_SEARCH_TIMEOUT_MS, VECTOR_STORE_INITIAL_CAPACITY, WASM_PAGE_BYTES, addToOrdinalFilter, arenaFloat32Distance, cosineSimilarityWithMagnitudes, createArenaSimd, createHNSWIndex, createHNSWWorkspace, createOrdinalFilter, createSharedArenaSimd, createVectorStore, dotProduct, entryForOrd, euclideanDistance, importAdjacency, isSimdAvailable, magnitude, ordinalFilterHas, ordinalFilterValues, removeFromOrdinalFilter, searchOrdinals, toDistance, toScore };
@@ -1,14 +1,5 @@
1
1
  import { DEFAULT_PAGE_SIZE } from './chunk-CBLS46IE.mjs';
2
2
 
3
- // src/distribution/constants.ts
4
- var WIRE_BATCH_BUDGET = {
5
- maxCount: 1e3,
6
- maxBytes: 8388608,
7
- overheadBytes: 256
8
- };
9
- var MAX_PARTITION_COUNT = 65536;
10
- var MAX_REPLICATION_FACTOR = 255;
11
-
12
3
  // src/engine/constants.ts
13
4
  var MIN_DOCUMENTS_FOR_SEGMENTS = 64;
14
5
  var BATCH_CHUNK_SIZE = 1e3;
@@ -19,6 +10,8 @@ var MAX_INDEX_NAME_LENGTH = 255;
19
10
  var MAX_DOC_ID_LENGTH = 512;
20
11
  var MIN_SWEEP_INTERVAL_MS = 100;
21
12
  var MAX_SWEEP_INTERVAL_MS = 6e4;
13
+ var HEAP_PRESSURE_WARNING_FRACTION = 0.9;
14
+ var HEAP_PRESSURE_REARM_FRACTION = 0.8;
22
15
  var STATISTICS_BROADCAST_INTERVAL_MS = 5e3;
23
16
  var FOREIGN_STATS_TTL_MS = 6e4;
24
17
  var DEFAULT_SUGGEST_LIMIT = 10;
@@ -27,4 +20,4 @@ var SUGGEST_OVERSAMPLE_FACTOR = 1.5;
27
20
  var SUGGEST_OVERSAMPLE_PADDING = 10;
28
21
  var MAX_SUGGEST_SCATTER_LIMIT = Math.ceil(MAX_SUGGEST_LIMIT * SUGGEST_OVERSAMPLE_FACTOR) + SUGGEST_OVERSAMPLE_PADDING;
29
22
 
30
- export { BATCH_CHUNK_SIZE, DEFAULT_LIMIT, DEFAULT_OFFSET, DEFAULT_SUGGEST_LIMIT, FOREIGN_STATS_TTL_MS, INDEX_NAME_PATTERN, MAX_DOC_ID_LENGTH, MAX_INDEX_NAME_LENGTH, MAX_PARTITION_COUNT, MAX_REPLICATION_FACTOR, MAX_SUGGEST_LIMIT, MAX_SUGGEST_SCATTER_LIMIT, MAX_SWEEP_INTERVAL_MS, MIN_DOCUMENTS_FOR_SEGMENTS, MIN_SWEEP_INTERVAL_MS, STATISTICS_BROADCAST_INTERVAL_MS, SUGGEST_OVERSAMPLE_FACTOR, SUGGEST_OVERSAMPLE_PADDING, WIRE_BATCH_BUDGET };
23
+ export { BATCH_CHUNK_SIZE, DEFAULT_LIMIT, DEFAULT_OFFSET, DEFAULT_SUGGEST_LIMIT, FOREIGN_STATS_TTL_MS, HEAP_PRESSURE_REARM_FRACTION, HEAP_PRESSURE_WARNING_FRACTION, INDEX_NAME_PATTERN, MAX_DOC_ID_LENGTH, MAX_INDEX_NAME_LENGTH, MAX_SUGGEST_LIMIT, MAX_SUGGEST_SCATTER_LIMIT, MAX_SWEEP_INTERVAL_MS, MIN_DOCUMENTS_FOR_SEGMENTS, MIN_SWEEP_INTERVAL_MS, STATISTICS_BROADCAST_INTERVAL_MS, SUGGEST_OVERSAMPLE_FACTOR, SUGGEST_OVERSAMPLE_PADDING };