@delali/narsil 0.2.4-next.48 → 0.2.4-next.50

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 (60) hide show
  1. package/README.md +2 -2
  2. package/dist/adapters/indexeddb.mjs +15 -10
  3. package/dist/{options-BC68VPoE.d.ts → capabilities-JrVQOwi4.d.ts} +55 -47
  4. package/dist/{chunk-BFIH7OV5.mjs → chunk-2GWVQWGA.mjs} +3 -1
  5. package/dist/chunk-AV4IJKD2.mjs +35 -0
  6. package/dist/{chunk-EV45L35L.mjs → chunk-BEIK3EOZ.mjs} +845 -2407
  7. package/dist/chunk-CBLS46IE.mjs +10 -0
  8. package/dist/chunk-CMVG2UEF.mjs +2038 -0
  9. package/dist/chunk-CV5H7XL7.mjs +876 -0
  10. package/dist/{chunk-JQUL2T6I.mjs → chunk-GCM3JFVA.mjs} +1 -2
  11. package/dist/{chunk-XWICBGYT.mjs → chunk-MHE7YWAU.mjs} +3 -5
  12. package/dist/{chunk-UZTT2BKQ.mjs → chunk-ND34I3SV.mjs} +1202 -1881
  13. package/dist/{chunk-PM52SMBT.mjs → chunk-OOSIDHA3.mjs} +2 -1
  14. package/dist/chunk-ORBLD3EL.mjs +6 -0
  15. package/dist/chunk-PIWKZPP7.mjs +64 -0
  16. package/dist/{chunk-4COAUBLJ.mjs → chunk-PMBHH44R.mjs} +124 -8
  17. package/dist/chunk-RP23PWMV.mjs +11 -0
  18. package/dist/chunk-UNEEFTEU.mjs +7 -0
  19. package/dist/{chunk-WTONLDU3.mjs → chunk-WYJXSLER.mjs} +9 -19
  20. package/dist/{chunk-DFZDV5FV.mjs → chunk-X6YZO4MQ.mjs} +19 -15
  21. package/dist/chunk-XE6XR2OE.mjs +23 -0
  22. package/dist/chunk-YEO6G2NG.mjs +6 -0
  23. package/dist/chunk-ZHUQKZBE.mjs +1292 -0
  24. package/dist/{client-C5BkUqB8.d.ts → client-CBOVHdjp.d.ts} +31 -7
  25. package/dist/client.d.ts +7 -7
  26. package/dist/client.mjs +250 -232
  27. package/dist/{config-B-ZI-ft5.d.ts → config-Czh2YNDi.d.ts} +2 -2
  28. package/dist/{config-BZRExglL.d.ts → config-OON7IJ_B.d.ts} +50 -13
  29. package/dist/direct-executor-OREXU72C.mjs +12 -0
  30. package/dist/distribution/coordinator/etcd.d.ts +2 -2
  31. package/dist/distribution/coordinator/etcd.mjs +2 -3
  32. package/dist/distribution/coordinator/in-memory.d.ts +2 -2
  33. package/dist/distribution/coordinator/in-memory.mjs +2 -2
  34. package/dist/distribution/transport/grpc.mjs +7 -9
  35. package/dist/distribution/transport/in-memory.mjs +2 -1
  36. package/dist/distribution/transport/tcp.mjs +3 -2
  37. package/dist/distribution.d.ts +8 -8
  38. package/dist/distribution.mjs +142 -101
  39. package/dist/embeddings/openai.mjs +5 -3
  40. package/dist/{engine-Cjr1uBLa.d.ts → engine-9PtFY50q.d.ts} +125 -69
  41. package/dist/index.browser.mjs +4689 -3330
  42. package/dist/index.d.ts +7 -7
  43. package/dist/index.mjs +14 -8
  44. package/dist/invalidation/broadcast-channel.mjs +2 -1
  45. package/dist/invalidation/filesystem.mjs +3 -4
  46. package/dist/{search-DDHjfXhJ.d.ts → memory-Bzd5xcEW.d.ts} +89 -63
  47. package/dist/persistence/durability/checkpoint-worker.d.ts +1 -1
  48. package/dist/persistence/durability/checkpoint-worker.mjs +14 -8
  49. package/dist/react.d.ts +4 -4
  50. package/dist/react.mjs +7 -5
  51. package/dist/{schema-B7juWg8Q.d.ts → schema-BqRx9t4E.d.ts} +22 -3
  52. package/dist/server.d.ts +47 -42
  53. package/dist/server.mjs +338 -821
  54. package/dist/thread-PZLEO6JL.mjs +310 -0
  55. package/dist/{types-DsSSjY4d.d.ts → types-DXPxaXPO.d.ts} +1 -1
  56. package/dist/vector/hnsw-build-worker.mjs +3 -4
  57. package/dist/vector/search-worker.mjs +4 -123
  58. package/dist/workers/entry.mjs +47 -3
  59. package/package.json +5 -1
  60. package/dist/direct-executor-EOTFGXTO.mjs +0 -8
@@ -1,23 +1,51 @@
1
- import { createEngineCore, createNarsilFromCore, runEngineQueryStats, runEngineListDocuments, runEngineSuggest, runEnginePreflight, runEngineQuery, createEngineIndex, applyIndexEntry, applyDeleteEntry, DEFAULT_SUGGEST_LIMIT, MAX_SUGGEST_LIMIT, now, listBindingOf, validateEntryBatchPayload, createAckMessage, validateEntryPayload, validateForwardBatchPayload, createForwardBatchResultMessage, queryBindingOf, foldGroupReducer, clampLimit, createForwardBatchMessage, validateForwardBatchResultPayload, createForwardMessage, validateReplicationEntry, MAX_SUGGEST_SCATTER_LIMIT, chunkByBudget, WIRE_BATCH_BUDGET, computeEntryChecksum, dedupePinnedEntries, SUGGEST_OVERSAMPLE_FACTOR, SUGGEST_OVERSAMPLE_PADDING, createEntryMessage, createEntryBatchMessage, createInsyncConfirmMessage, validateAckPayload, createInsyncRemoveMessage, validateInsyncConfirmPayload, createInsyncAddMessage } from './chunk-UZTT2BKQ.mjs';
2
- import { ReplicationMessageTypes, TransportErrorCodes, ClusterMessageTypes, QueryMessageTypes, TransportError, MAX_MESSAGE_SIZE_BYTES } from './chunk-JQUL2T6I.mjs';
3
- import { validateIndexName, indexConfigKey, putIndexMetadata, getIndexMetadata, MAX_PARTITION_COUNT, MAX_INDEX_NAME_LENGTH } from './chunk-XWICBGYT.mjs';
4
- import { deserializePayloadV2, createPartitionIndex, resolveProjection, clampRowCount, sortSignatureOf, requireMatchingCursor, decodePageCursor, normalizeSort, encodePageCursor, applyProjection, readSortValues, getLanguage, DEFAULT_PAGE_SIZE, requireWithinResultWindow, fnv1a, FILTER_EXPRESSION_KEYS, MAX_CURSOR_LENGTH, mergePartitionStats, RESULT_WINDOW, FIELD_FILTER_OPERATORS, MAX_NESTING_DEPTH } from './chunk-EV45L35L.mjs';
1
+ import { MAX_MESSAGE_SIZE_BYTES } from './chunk-UNEEFTEU.mjs';
2
+ import { validateIndexName, indexConfigKey, putIndexMetadata, getIndexMetadata } from './chunk-MHE7YWAU.mjs';
3
+ import { createEngineCore, checkHeapAfterRecovery, createNarsilFromCore, runEngineQueryStats, runEngineListDocuments, runEngineSuggest, runEnginePreflight, runEngineQuery, createEngineIndex, applyIndexEntry, applyDeleteEntry, validateEntryBatchPayload, createAckMessage, validateEntryPayload, validateForwardBatchPayload, createForwardBatchResultMessage, createForwardBatchMessage, validateForwardBatchResultPayload, createForwardMessage, validateReplicationEntry, computeEntryChecksum, createEntryMessage, createEntryBatchMessage, createInsyncConfirmMessage, validateAckPayload, createInsyncRemoveMessage, validateInsyncConfirmPayload, createInsyncAddMessage } from './chunk-ND34I3SV.mjs';
4
+ import { now, listBindingOf, queryBindingOf, foldGroupReducer, clampLimit, dedupePinnedEntries } from './chunk-ZHUQKZBE.mjs';
5
+ import { ReplicationMessageTypes, TransportErrorCodes, ClusterMessageTypes, QueryMessageTypes, TransportError } from './chunk-GCM3JFVA.mjs';
6
+ import { MAX_PARTITION_COUNT, MAX_REPLICATION_FACTOR, WIRE_BATCH_BUDGET } from './chunk-PIWKZPP7.mjs';
7
+ import { DEFAULT_SUGGEST_LIMIT, MAX_SUGGEST_LIMIT, MAX_SUGGEST_SCATTER_LIMIT, MAX_INDEX_NAME_LENGTH, MAX_DOC_ID_LENGTH, SUGGEST_OVERSAMPLE_FACTOR, SUGGEST_OVERSAMPLE_PADDING, INDEX_NAME_PATTERN } from './chunk-XE6XR2OE.mjs';
8
+ import { generateId, deserializePayloadV2, createPartitionIndex, getLanguage, FILTER_EXPRESSION_KEYS, FIELD_FILTER_OPERATORS } from './chunk-BEIK3EOZ.mjs';
9
+ import { resolveProjection, clampRowCount, sortSignatureOf, requireMatchingCursor, decodePageCursor, normalizeSort, encodePageCursor, applyProjection, readSortValues, requireWithinResultWindow, fnv1a, mergePartitionStats, MAX_NESTING_DEPTH } from './chunk-CMVG2UEF.mjs';
10
+ import './chunk-AV4IJKD2.mjs';
11
+ import { DEFAULT_PAGE_SIZE, MAX_SORT_FIELDS, MAX_CURSOR_LENGTH, RESULT_WINDOW } from './chunk-CBLS46IE.mjs';
5
12
  import './chunk-TGP5M5R7.mjs';
6
- import './chunk-4COAUBLJ.mjs';
7
- import './chunk-DFZDV5FV.mjs';
13
+ import './chunk-PMBHH44R.mjs';
14
+ import './chunk-X6YZO4MQ.mjs';
15
+ import './chunk-RP23PWMV.mjs';
8
16
  import { crc32 } from './chunk-KMMJMDUA.mjs';
9
17
  import './chunk-U2BKYEC7.mjs';
10
- import { compareCodePoints, toComparableSortValue, compareComparableKeys, compareSortValues } from './chunk-BFIH7OV5.mjs';
11
- import { generateId } from './chunk-WTONLDU3.mjs';
18
+ import { compareCodePoints, toComparableSortValue, compareComparableKeys, compareSortValues } from './chunk-2GWVQWGA.mjs';
19
+ import './chunk-WYJXSLER.mjs';
12
20
  import { ErrorCodes, NarsilError, describeError } from './chunk-P4ELXVJQ.mjs';
13
21
  import { encode, decode } from '@msgpack/msgpack';
14
22
 
15
- // src/distribution/cluster/controller/types.ts
16
- var CONTROLLER_LEASE_KEY = "_narsil/controller";
23
+ // src/distribution/cluster/constants.ts
24
+ var LEADERSHIP_IMBALANCE_THRESHOLD = 2;
25
+ var DEFAULT_ESTIMATED_PARTITION_BYTES = 50 * 1024 * 1024;
26
+ var REBALANCE_THRESHOLD = 0.1;
27
+ var BOOTSTRAP_CAS_ATTEMPTS = 5;
28
+ var ALLOCATION_CAS_ATTEMPTS = 5;
29
+ var ALLOCATION_RETRY_DELAY_MS = 1e3;
30
+ var TEARDOWN_CAS_ATTEMPTS = 5;
31
+ var TEARDOWN_RETRY_DELAY_MS = 500;
32
+ var TEARDOWN_RETRY_ROUNDS = 3;
33
+ var RECOVERY_CAS_ATTEMPTS = 5;
34
+ var PARTITION_STORES_TIMEOUT_MS = 5e3;
17
35
  var DEFAULT_CONTROLLER_CONFIG = {
18
36
  leaseTtlMs: 15e3,
19
37
  standbyRetryMs: 5e3
20
38
  };
39
+ var DEFAULT_NODE_LIFECYCLE_CONFIG = {
40
+ bootstrapRetryBaseMs: 1e3,
41
+ bootstrapRetryMaxMs: 5e3,
42
+ bootstrapMaxRetries: 10,
43
+ allocationDebounceMs: 250,
44
+ nodeHeartbeatIntervalMs: 1e4
45
+ };
46
+
47
+ // src/distribution/cluster/controller/types.ts
48
+ var CONTROLLER_LEASE_KEY = "_narsil/controller";
21
49
 
22
50
  // src/distribution/cluster/controller/election.ts
23
51
  function createElectionState() {
@@ -95,10 +123,6 @@ var balanceDecider = {
95
123
  }
96
124
  };
97
125
 
98
- // src/distribution/cluster/allocator/types.ts
99
- var REBALANCE_THRESHOLD = 0.1;
100
- var DEFAULT_ESTIMATED_PARTITION_BYTES = 50 * 1024 * 1024;
101
-
102
126
  // src/distribution/cluster/allocator/deciders/capacity.ts
103
127
  function createCapacityDecider(estimatedPartitionBytes) {
104
128
  const bytesPerPartition = DEFAULT_ESTIMATED_PARTITION_BYTES;
@@ -417,7 +441,6 @@ function holdsLastCopy(assignment, nodeId) {
417
441
  }
418
442
 
419
443
  // src/distribution/cluster/allocator/leadership.ts
420
- var LEADERSHIP_IMBALANCE_THRESHOLD = 2;
421
444
  function loadOf(nodeId, counts, shares) {
422
445
  const share = shares.get(nodeId);
423
446
  return (counts.get(nodeId) ?? 0) / (share === void 0 || share <= 0 ? 1 : share);
@@ -822,8 +845,6 @@ function createPartitionStoresResultMessage(result, sourceNodeId, requestId) {
822
845
  }
823
846
 
824
847
  // src/distribution/cluster/controller/event-loop/unassigned-recovery.ts
825
- var RECOVERY_CAS_ATTEMPTS = 5;
826
- var PARTITION_STORES_TIMEOUT_MS = 5e3;
827
848
  function liveHoldersOfUnassignedPartitions(table, liveNodeIds) {
828
849
  const holders = /* @__PURE__ */ new Set();
829
850
  for (const assignment of table.assignments.values()) {
@@ -1026,11 +1047,6 @@ async function recoverUnassignedPartitions(coordinator, transport, indexName, co
1026
1047
  function holdsDataNode(nodes) {
1027
1048
  return nodes.some((node) => node.roles.includes("data"));
1028
1049
  }
1029
- var ALLOCATION_CAS_ATTEMPTS = 5;
1030
- var ALLOCATION_RETRY_DELAY_MS = 1e3;
1031
- var TEARDOWN_CAS_ATTEMPTS = 5;
1032
- var TEARDOWN_RETRY_ROUNDS = 3;
1033
- var TEARDOWN_RETRY_DELAY_MS = 500;
1034
1050
  async function runAllocatorForIndex(coordinator, indexName, nodes, isActive, attempt = 0) {
1035
1051
  if (!isActive()) {
1036
1052
  return;
@@ -1226,7 +1242,15 @@ async function handleSchemaEvent(event, coordinator, state, isActive, onError) {
1226
1242
  await tearDownAllocation(event.indexName, coordinator, state, isActive, 0, onError);
1227
1243
  }
1228
1244
  }
1245
+
1246
+ // src/distribution/replication/constants.ts
1247
+ var REPLICATION_ENTRY_FIXED_OVERHEAD_BYTES = 40;
1248
+ var DEFAULT_LOG_RETENTION_BYTES = 268435456;
1229
1249
  var INSYNC_CAS_ATTEMPTS = 5;
1250
+ var SNAPSHOT_CHUNK_SIZE = 65536;
1251
+ var MAX_SNAPSHOT_SIZE_BYTES = 2 * 1024 * 1024 * 1024;
1252
+
1253
+ // src/distribution/replication/insync.ts
1230
1254
  var REFUSE = { outcome: "refuse" };
1231
1255
  var ACCEPT = { outcome: "accept" };
1232
1256
  async function updateInsyncSet(request, coordinator, decide) {
@@ -1416,7 +1440,6 @@ async function handleBootstrapCompleteMessage(message, respond, coordinator, con
1416
1440
  payload: encode(resultPayload)
1417
1441
  });
1418
1442
  }
1419
- var BOOTSTRAP_CAS_ATTEMPTS = 5;
1420
1443
  async function processBootstrapComplete(payload, coordinator) {
1421
1444
  for (let attempt = 0; attempt < BOOTSTRAP_CAS_ATTEMPTS; attempt++) {
1422
1445
  const table = await coordinator.getAllocation(payload.indexName);
@@ -2378,15 +2401,6 @@ async function leaveCluster(config) {
2378
2401
  await config.coordinator.deregisterNode(config.registration.nodeId);
2379
2402
  }
2380
2403
 
2381
- // src/distribution/cluster/node-lifecycle/types.ts
2382
- var DEFAULT_NODE_LIFECYCLE_CONFIG = {
2383
- bootstrapRetryBaseMs: 1e3,
2384
- bootstrapRetryMaxMs: 5e3,
2385
- bootstrapMaxRetries: 10,
2386
- allocationDebounceMs: 250,
2387
- nodeHeartbeatIntervalMs: 1e4
2388
- };
2389
-
2390
2404
  // src/distribution/cluster/node-lifecycle/index.ts
2391
2405
  function createDataNodeLifecycle(config) {
2392
2406
  let status = "stopped";
@@ -2555,12 +2569,6 @@ async function nodeHasOtherPartitions(indexName, removedPartitionId, deps) {
2555
2569
  return false;
2556
2570
  }
2557
2571
 
2558
- // src/distribution/replication/snapshot-constants.ts
2559
- var SNAPSHOT_CHUNK_SIZE = 65536;
2560
- var MAX_SNAPSHOT_SIZE_BYTES = 2 * 1024 * 1024 * 1024;
2561
- var SNAPSHOT_HEADER_SENTINEL_SEQNO = Number.MAX_SAFE_INTEGER;
2562
- var SNAPSHOT_HEADER_SENTINEL_PARTITION_ID = 4294967295;
2563
-
2564
2572
  // src/distribution/replication/snapshot-stream-apply.ts
2565
2573
  function fail(state, code, message, details = {}) {
2566
2574
  if (state.failure !== null) {
@@ -2877,9 +2885,34 @@ function toStreamFailure(err, defaultCode, defaultMessage) {
2877
2885
  };
2878
2886
  }
2879
2887
 
2880
- // src/distribution/cluster-node/bootstrap-fetch.ts
2888
+ // src/distribution/cluster-node/constants.ts
2889
+ var DEFAULT_PARTITION_COUNT = 5;
2890
+ var DEFAULT_REPLICATION_FACTOR = 1;
2891
+ var DEFAULT_CAPACITY = {
2892
+ memoryBytes: 8e9,
2893
+ cpuCores: 4,
2894
+ diskBytes: null
2895
+ };
2896
+ var DEFAULT_CREATE_INDEX_WAIT_MS = 3e4;
2881
2897
  var CAPACITY_EXHAUSTED_BACKOFF_BASE_MS = 100;
2882
2898
  var CAPACITY_EXHAUSTED_BACKOFF_MAX_MS = 500;
2899
+ var JITTERED_BACKOFF_POLL_INTERVAL_MS = 20;
2900
+ var DEFAULT_BOOTSTRAP_SYNC_DEADLINE_MS = 6e5;
2901
+ var SYNCED_POSITION_REPORT_TIMEOUT_MS = 5e3;
2902
+ var ADMISSION_TIMEOUT_MS = 1e4;
2903
+ var CATCH_UP_TICK_MS = 1e3;
2904
+ var MAX_CATCH_UP_IN_FLIGHT_BYTES = 67108864;
2905
+ var CLEAR_PAGE_SIZE = 1e3;
2906
+ var DEFAULT_MAX_CONCURRENT_SNAPSHOTS = 2;
2907
+ var DEFAULT_MAX_PER_SOURCE_SNAPSHOTS = 1;
2908
+ var DEFAULT_MAX_STREAMS_PER_INDEX = 4;
2909
+ var SNAPSHOT_CHUNK_YIELD_INTERVAL_MS = 8;
2910
+ var MAX_SNAPSHOT_SYNC_REQUEST_BYTES = 4096;
2911
+ var MAX_SOURCE_ID_LENGTH = 256;
2912
+ var MAX_WAIT_FOR_ACTIVE_REPLICAS = 255;
2913
+ var MIN_CONTROLLER_LEASE_TTL_MS = 1e3;
2914
+
2915
+ // src/distribution/cluster-node/bootstrap-fetch.ts
2883
2916
  var RETRY_ANY_TARGET_CODES = /* @__PURE__ */ new Set([
2884
2917
  ErrorCodes.SNAPSHOT_SYNC_TRANSPORT_FAILED,
2885
2918
  ErrorCodes.SNAPSHOT_SYNC_TIMEOUT,
@@ -2990,7 +3023,6 @@ async function fetchSnapshotFromAnyTarget(indexName, primaryNodeId, targets, dea
2990
3023
  }
2991
3024
  return lastFailure;
2992
3025
  }
2993
- var JITTERED_BACKOFF_POLL_INTERVAL_MS = 20;
2994
3026
  async function jitteredBackoff(baseMs, maxMs, deadline, abortCheck) {
2995
3027
  const plannedMs = Math.floor(baseMs + Math.random() * (maxMs - baseMs));
2996
3028
  const remainingMs = deadline - Date.now();
@@ -3345,7 +3377,6 @@ async function dropExistingIndex(engine, indexName, primaryNodeId) {
3345
3377
  }
3346
3378
 
3347
3379
  // src/distribution/cluster-node/bootstrap-sync/state.ts
3348
- var DEFAULT_BOOTSTRAP_SYNC_DEADLINE_MS = 6e5;
3349
3380
  function createBootstrapSyncState() {
3350
3381
  return {
3351
3382
  inFlight: /* @__PURE__ */ new Map(),
@@ -3767,7 +3798,6 @@ function readLocalLogState(indexName, partitionId, deps) {
3767
3798
  const newestEntry = log.getEntry(lastSeqNo);
3768
3799
  return { lastSeqNo, lastPrimaryTerm: newestEntry?.primaryTerm ?? lastPrimaryTerm };
3769
3800
  }
3770
- var SYNCED_POSITION_REPORT_TIMEOUT_MS = 5e3;
3771
3801
  async function reportSyncedPosition(indexName, partitionId, target, knownSeqNo, deadline, deps) {
3772
3802
  const logState = readLocalLogState(indexName, partitionId, deps);
3773
3803
  if (logState.lastSeqNo <= knownSeqNo) {
@@ -4392,8 +4422,6 @@ function getInSyncReplicaTargets(assignment, localNodeId, pendingAdmissions = []
4392
4422
  }
4393
4423
 
4394
4424
  // src/distribution/cluster-node/catch-up/state.ts
4395
- var CATCH_UP_TICK_MS = 1e3;
4396
- var CATCH_UP_IN_FLIGHT_BYTE_CEILING = 67108864;
4397
4425
  function partitionKey2(indexName, partitionId) {
4398
4426
  return `${indexName}:${partitionId}`;
4399
4427
  }
@@ -4459,7 +4487,6 @@ function clearPendingAdmission(state, indexName, partitionId, replicaNodeId) {
4459
4487
  }
4460
4488
 
4461
4489
  // src/distribution/cluster-node/catch-up/admission.ts
4462
- var ADMISSION_TIMEOUT_MS = 1e4;
4463
4490
  async function sendToController(payload, controllerNodeId, deps) {
4464
4491
  const targets = await resolveNodeTargets(controllerNodeId, deps);
4465
4492
  for (const target of targets) {
@@ -4534,6 +4561,30 @@ async function proposeAdmission(state, deps, indexName, partitionId, assignment,
4534
4561
  clearPendingAdmission(state, indexName, partitionId, replicaNodeId);
4535
4562
  }
4536
4563
  }
4564
+
4565
+ // src/distribution/chunking.ts
4566
+ function chunkByBudget(items, budget) {
4567
+ const chunks = [];
4568
+ let current = [];
4569
+ let currentBytes = 0;
4570
+ for (const item of items) {
4571
+ const itemBytes = budget.payloadBytesOf(item) + budget.overheadBytes;
4572
+ const previous = current[current.length - 1];
4573
+ const breaksRun = previous !== void 0 && budget.breaksRun?.(item, previous) === true;
4574
+ const overflows = current.length >= budget.maxCount || current.length > 0 && currentBytes + itemBytes > budget.maxBytes;
4575
+ if (breaksRun || overflows) {
4576
+ chunks.push(current);
4577
+ current = [];
4578
+ currentBytes = 0;
4579
+ }
4580
+ current.push(item);
4581
+ currentBytes += itemBytes;
4582
+ }
4583
+ if (current.length > 0) {
4584
+ chunks.push(current);
4585
+ }
4586
+ return chunks;
4587
+ }
4537
4588
  async function replicateToReplicas(entry, inSyncReplicas, transport, sourceNodeId, resolveNodeTargets3) {
4538
4589
  const message = createEntryMessage(entry, sourceNodeId);
4539
4590
  return sendAndCollectAcks(message, entry, inSyncReplicas, transport, resolveNodeTargets3);
@@ -4604,9 +4655,8 @@ function isMatchingAck(response, entry) {
4604
4655
  }
4605
4656
 
4606
4657
  // src/distribution/cluster-node/catch-up/pump.ts
4607
- var ENTRY_FIXED_OVERHEAD_BYTES = 40;
4608
4658
  function entryBytes(entry) {
4609
- return ENTRY_FIXED_OVERHEAD_BYTES + entry.indexName.length + entry.documentId.length + (entry.document?.byteLength ?? 0);
4659
+ return REPLICATION_ENTRY_FIXED_OVERHEAD_BYTES + entry.indexName.length + entry.documentId.length + (entry.document?.byteLength ?? 0);
4610
4660
  }
4611
4661
  function batchBytes(entries) {
4612
4662
  let total = 0;
@@ -4632,7 +4682,7 @@ function nextWireBatch(state, pending) {
4632
4682
  if (batch.length === 0) {
4633
4683
  return [];
4634
4684
  }
4635
- const available = CATCH_UP_IN_FLIGHT_BYTE_CEILING - state.inFlightBytes;
4685
+ const available = MAX_CATCH_UP_IN_FLIGHT_BYTES - state.inFlightBytes;
4636
4686
  return batchBytes(batch) > available ? [] : batch;
4637
4687
  }
4638
4688
  async function pumpReplica(state, deps, indexName, partitionId, assignment, replicaNodeId, cursor) {
@@ -4844,13 +4894,9 @@ async function writeHeldPartitions(core, indexName, next, indexesBehindOnDisk) {
4844
4894
  indexesBehindOnDisk.delete(indexName);
4845
4895
  }
4846
4896
 
4847
- // src/distribution/replication/types.ts
4848
- var DEFAULT_LOG_RETENTION_BYTES = 268435456;
4849
-
4850
4897
  // src/distribution/replication/log.ts
4851
- var ENTRY_FIXED_OVERHEAD_BYTES2 = 40;
4852
4898
  function estimateEntrySize(entry) {
4853
- return ENTRY_FIXED_OVERHEAD_BYTES2 + entry.indexName.length + entry.documentId.length + (entry.document?.byteLength ?? 0);
4899
+ return REPLICATION_ENTRY_FIXED_OVERHEAD_BYTES + entry.indexName.length + entry.documentId.length + (entry.document?.byteLength ?? 0);
4854
4900
  }
4855
4901
  var computeChecksum = computeEntryChecksum;
4856
4902
  function createReplicationLog(partitionId, config) {
@@ -4901,7 +4947,7 @@ function createReplicationLog(partitionId, config) {
4901
4947
  }
4902
4948
  }
4903
4949
  function assertEntryFitsRetention(entry) {
4904
- const entrySize = ENTRY_FIXED_OVERHEAD_BYTES2 + entry.indexName.length + entry.documentId.length + (entry.document?.byteLength ?? 0);
4950
+ const entrySize = REPLICATION_ENTRY_FIXED_OVERHEAD_BYTES + entry.indexName.length + entry.documentId.length + (entry.document?.byteLength ?? 0);
4905
4951
  if (entrySize > retentionBytes) {
4906
4952
  throw new NarsilError(
4907
4953
  ErrorCodes.REPLICATION_LOG_FULL,
@@ -5142,11 +5188,13 @@ async function createClusterLocalEngine(config, hooks) {
5142
5188
  const core = createEngineCore(config, hooks);
5143
5189
  if (core.durability !== null) {
5144
5190
  await core.durability.manager.recover(config?.lifecycle !== void 0);
5191
+ checkHeapAfterRecovery(core);
5145
5192
  }
5146
5193
  if (core.invalidation !== null) {
5147
5194
  await core.invalidation.start();
5148
5195
  }
5149
5196
  if (config?.lifecycle === void 0) await core.analysisRebuild.reviewStaleIndexes();
5197
+ core.orchestrator.shareMainThread();
5150
5198
  const engine = createNarsilFromCore(core, config);
5151
5199
  const heldPartitions = createHeldPartitionRecord(core);
5152
5200
  return Object.assign(engine, {
@@ -5507,9 +5555,6 @@ async function authorizeSnapshotRequest(coordinator, indexName, sourceId) {
5507
5555
  }
5508
5556
 
5509
5557
  // src/distribution/cluster-node/snapshot-cache.ts
5510
- var DEFAULT_MAX_CONCURRENT_SNAPSHOTS = 2;
5511
- var DEFAULT_MAX_PER_SOURCE_SNAPSHOTS = 1;
5512
- var DEFAULT_MAX_STREAMS_PER_INDEX = 4;
5513
5558
  function createSnapshotCacheState(maxConcurrent = DEFAULT_MAX_CONCURRENT_SNAPSHOTS, maxPerSource = DEFAULT_MAX_PER_SOURCE_SNAPSHOTS, maxStreamsPerIndex = DEFAULT_MAX_STREAMS_PER_INDEX) {
5514
5559
  if (!Number.isInteger(maxConcurrent) || maxConcurrent <= 0) {
5515
5560
  throw new NarsilError(ErrorCodes.CONFIG_INVALID, "maxConcurrent must be a positive integer", {
@@ -5635,7 +5680,6 @@ async function acquireSnapshotBuild(state, indexName, builder) {
5635
5680
  return entry.promise;
5636
5681
  }
5637
5682
  var SNAPSHOT_SYNC_ERROR_TYPE = `${ReplicationMessageTypes.SNAPSHOT_SYNC_REQUEST}.error`;
5638
- var CHUNK_YIELD_INTERVAL_MS = 8;
5639
5683
  function createSingleResponseSink(respond) {
5640
5684
  const sink = ((response) => {
5641
5685
  if (sink.closed) {
@@ -5677,7 +5721,7 @@ async function streamSnapshotToReplica(sink, nodeId, requestId, indexName, build
5677
5721
  assertMessageWithinLimit(chunkBytes, "SNAPSHOT_CHUNK");
5678
5722
  await respondMessage(sink, ReplicationMessageTypes.SNAPSHOT_CHUNK, nodeId, requestId, chunkBytes);
5679
5723
  offset = end;
5680
- if (offset < totalBytes && now2() - lastYieldAt >= CHUNK_YIELD_INTERVAL_MS) {
5724
+ if (offset < totalBytes && now2() - lastYieldAt >= SNAPSHOT_CHUNK_YIELD_INTERVAL_MS) {
5681
5725
  await yieldToEventLoop();
5682
5726
  lastYieldAt = now2();
5683
5727
  }
@@ -5733,6 +5777,10 @@ async function respondError(sink, sourceId, requestId, code, message) {
5733
5777
  sink.closed = true;
5734
5778
  }
5735
5779
 
5780
+ // src/distribution/replication/snapshot-constants.ts
5781
+ var SNAPSHOT_HEADER_SENTINEL_SEQNO = Number.MAX_SAFE_INTEGER;
5782
+ var SNAPSHOT_HEADER_SENTINEL_PARTITION_ID = 4294967295;
5783
+
5736
5784
  // src/distribution/cluster-node/snapshot-sync-handler/metadata.ts
5737
5785
  async function defaultSnapshotHeaderMetadataProvider(coordinator, indexName) {
5738
5786
  try {
@@ -5853,8 +5901,6 @@ function buildSnapshotForRequest(deps, indexName, options) {
5853
5901
  }
5854
5902
  return buildSnapshot(deps, indexName);
5855
5903
  }
5856
- var INDEX_NAME_PATTERN = /^[a-zA-Z0-9][a-zA-Z0-9._-]*$/;
5857
- var MAX_SOURCE_ID_LENGTH = 256;
5858
5904
  function containsControlCharacter(value) {
5859
5905
  for (let i = 0; i < value.length; i++) {
5860
5906
  const code = value.charCodeAt(i);
@@ -5870,7 +5916,6 @@ function containsControlCharacter(value) {
5870
5916
  }
5871
5917
  return false;
5872
5918
  }
5873
- var MAX_SNAPSHOT_SYNC_REQUEST_BYTES = 4096;
5874
5919
  var REQUEST_DECODE_OPTIONS = {
5875
5920
  maxMapLength: 16,
5876
5921
  maxArrayLength: 16,
@@ -6021,17 +6066,15 @@ async function handlePartitionStores(message, respond, deps) {
6021
6066
  await respond(createPartitionStoresResultMessage(result, deps.nodeId, message.requestId));
6022
6067
  }
6023
6068
 
6024
- // src/distribution/query/validators/common.ts
6069
+ // src/distribution/query/constants.ts
6025
6070
  var MAX_PARTITION_IDS = MAX_PARTITION_COUNT;
6026
6071
  var MAX_TERM_LENGTH = 1024;
6027
6072
  var MAX_TERMS_COUNT = 65536;
6028
6073
  var MAX_FIELD_NAME_LENGTH = 255;
6029
6074
  var MAX_FIELDS_LIST = 256;
6030
6075
  var MAX_BOOST_FIELDS = 256;
6031
- var MAX_SORT_FIELDS = 8;
6032
6076
  var MAX_FACETS = 64;
6033
6077
  var MAX_FETCH_DOCUMENT_IDS = 1e4;
6034
- var MAX_DOC_ID_LENGTH = 512;
6035
6078
  var MAX_FILTER_DEPTH = 30;
6036
6079
  var MAX_FILTER_FIELDS = 256;
6037
6080
  var MAX_FILTER_ARRAY_SIZE = 65536;
@@ -6046,6 +6089,25 @@ var MAX_PINNED_ENTRIES = 1e3;
6046
6089
  var MAX_PINNED_POSITION = RESULT_WINDOW;
6047
6090
  var MAX_EF_SEARCH = 1e4;
6048
6091
  var MAX_GROUP_FIELDS = 64;
6092
+ var MAX_HIGHLIGHT_TAG_LENGTH = 256;
6093
+ var MAX_HIGHLIGHT_SNIPPET_LENGTH = 65536;
6094
+ var MAX_LIST_CURSOR_LENGTH = 4096;
6095
+ var MAX_SUGGEST_WIRE_LIMIT = 1e3;
6096
+ var MAX_COUNT_VALUE = Number.MAX_SAFE_INTEGER;
6097
+ var MAX_LANGUAGE_NAME_LENGTH = 64;
6098
+ var MAX_SORT_VALUE_STRING_LENGTH = 65536;
6099
+ var MAX_RESULTS_PER_PARTITION = 1e4;
6100
+ var MAX_SORT_VALUES = 8;
6101
+ var MAX_FACET_FIELDS = 64;
6102
+ var MAX_FACET_BUCKETS = 1e4;
6103
+ var MAX_FACET_VALUE_LENGTH = 1024;
6104
+ var MAX_GROUPS_PER_RESPONSE = 65536;
6105
+ var MAX_FACET_SIZE = 1e3;
6106
+ var DEFAULT_MAX_FACET_BUCKETS = 100;
6107
+ var MAX_VECTOR_DIMENSION = 8192;
6108
+ var MAX_VECTOR_TEXT_LENGTH = 16384;
6109
+
6110
+ // src/distribution/query/validators/common.ts
6049
6111
  var NULL_BYTE = String.fromCharCode(0);
6050
6112
  function throwInvalid(code, message, details) {
6051
6113
  throw new NarsilError(code, message, details);
@@ -6158,8 +6220,6 @@ var SEARCH_INVALID_MODE = ErrorCodes.SEARCH_INVALID_MODE;
6158
6220
  var CONFIG_INVALID = ErrorCodes.CONFIG_INVALID;
6159
6221
 
6160
6222
  // src/distribution/query/validators/fetch.ts
6161
- var MAX_HIGHLIGHT_TAG_LENGTH = 256;
6162
- var MAX_HIGHLIGHT_SNIPPET_LENGTH = 65536;
6163
6223
  function validateIndexNameField(value, fieldLabel) {
6164
6224
  if (typeof value !== "string") {
6165
6225
  throwInvalid(CONFIG_INVALID, `Invalid FetchPayload: "${fieldLabel}" must be a string`);
@@ -6664,9 +6724,7 @@ function validateEfSearchParam(value) {
6664
6724
  }
6665
6725
 
6666
6726
  // src/distribution/query/validators/search.ts
6667
- var MAX_FACET_SHARD_SIZE = oversampledShardSize(1e3);
6668
- var MAX_VECTOR_DIMENSION = 8192;
6669
- var MAX_VECTOR_TEXT_LENGTH = 16384;
6727
+ var MAX_FACET_SHARD_SIZE = oversampledShardSize(MAX_FACET_SIZE);
6670
6728
  var ALLOWED_SCORING = ["local", "dfs", "broadcast"];
6671
6729
  var ALLOWED_SORT_DIRECTIONS = ["asc", "desc"];
6672
6730
  function validateIndexNameField2(value, fieldLabel) {
@@ -6930,11 +6988,6 @@ function validateSearchPayload(decoded) {
6930
6988
  }
6931
6989
 
6932
6990
  // src/distribution/query/validators/reads.ts
6933
- var MAX_LIST_CURSOR_LENGTH = 4096;
6934
- var MAX_SUGGEST_WIRE_LIMIT = 1e3;
6935
- var MAX_COUNT_VALUE = Number.MAX_SAFE_INTEGER;
6936
- var MAX_LANGUAGE_NAME_LENGTH = 64;
6937
- var MAX_SORT_VALUE_STRING_LENGTH = 65536;
6938
6991
  function validateIndexNameField3(decoded, payloadLabel) {
6939
6992
  validateStringField(decoded.indexName, `${payloadLabel}.indexName`, 255, CONFIG_INVALID);
6940
6993
  }
@@ -7129,12 +7182,6 @@ function validatePreflightResultPayload(decoded) {
7129
7182
  }
7130
7183
 
7131
7184
  // src/distribution/query/validators/search-result.ts
7132
- var MAX_RESULTS_PER_PARTITION = 1e4;
7133
- var MAX_SORT_VALUES = 8;
7134
- var MAX_FACET_FIELDS = 64;
7135
- var MAX_FACET_BUCKETS = 1e4;
7136
- var MAX_FACET_VALUE_LENGTH = 1024;
7137
- var MAX_GROUPS_PER_RESPONSE = 65536;
7138
7185
  function validateScoredEntry(value, fieldLabel) {
7139
7186
  if (!isRecord2(value)) {
7140
7187
  throwInvalid(CONFIG_INVALID, `Invalid SearchResultPayload: "${fieldLabel}" must be an object`);
@@ -7987,7 +8034,6 @@ async function sendSyncEntriesResponse(message, respond, deps, entries) {
7987
8034
  }
7988
8035
 
7989
8036
  // src/distribution/cluster-node/allocation-wait.ts
7990
- var DEFAULT_CREATE_INDEX_WAIT_MS = 3e4;
7991
8037
  function everyPartitionActive(table, partitionCount) {
7992
8038
  if (table === null || table.assignments.size < partitionCount) {
7993
8039
  return false;
@@ -8035,15 +8081,6 @@ async function waitForServingAllocation(coordinator, indexName, partitionCount,
8035
8081
  }
8036
8082
  }
8037
8083
 
8038
- // src/distribution/cluster-node/types/defaults.ts
8039
- var DEFAULT_PARTITION_COUNT = 5;
8040
- var DEFAULT_REPLICATION_FACTOR = 1;
8041
- var DEFAULT_CAPACITY = {
8042
- memoryBytes: 8e9,
8043
- cpuCores: 4,
8044
- diskBytes: null
8045
- };
8046
-
8047
8084
  // src/distribution/cluster-node/transport-failure.ts
8048
8085
  var FAILURE_CODE_BY_TRANSPORT_CODE = {
8049
8086
  [TransportErrorCodes.CONNECT_FAILED]: ErrorCodes.QUERY_NO_ACTIVE_REPLICA,
@@ -9037,7 +9074,6 @@ async function routeUpdateBatch(indexName, updates, deps) {
9037
9074
  }
9038
9075
 
9039
9076
  // src/distribution/cluster-node/write-routing/index.ts
9040
- var MAX_REPLICATION_FACTOR = 255;
9041
9077
  function validateCreateIndexOptions(partitionCount, replicationFactor) {
9042
9078
  if (!Number.isInteger(partitionCount) || partitionCount < 1 || partitionCount > MAX_PARTITION_COUNT) {
9043
9079
  throw new NarsilError(
@@ -9838,7 +9874,6 @@ function popScoredHeap(heap, nodeFirst) {
9838
9874
  }
9839
9875
  return top;
9840
9876
  }
9841
- var DEFAULT_MAX_FACET_BUCKETS = 100;
9842
9877
  function mergeDistributedFacets(allFacets, allBounds, maxBuckets = DEFAULT_MAX_FACET_BUCKETS) {
9843
9878
  const merged = /* @__PURE__ */ new Map();
9844
9879
  const bounds = /* @__PURE__ */ new Map();
@@ -10124,7 +10159,6 @@ var DEFAULT_QUERY_CONFIG = {
10124
10159
  };
10125
10160
 
10126
10161
  // src/distribution/query/routing.ts
10127
- var MAX_FACET_SIZE = 1e3;
10128
10162
  function wireSortSignature(sort) {
10129
10163
  if (sort === null || sort.length === 0) return null;
10130
10164
  return JSON.stringify(sort.map((field) => [field.field, field.direction]));
@@ -10777,7 +10811,6 @@ async function queryCluster(deps, indexName, params) {
10777
10811
  }
10778
10812
 
10779
10813
  // src/distribution/cluster-node/clear.ts
10780
- var CLEAR_PAGE_SIZE = 1e3;
10781
10814
  async function clearCluster(readDeps, writeDeps, indexName) {
10782
10815
  const allocation = await routableAllocation(readDeps.config.coordinator, indexName);
10783
10816
  if (allocation === null) {
@@ -11093,8 +11126,6 @@ function createSingleResponseRespond(respond) {
11093
11126
  }
11094
11127
 
11095
11128
  // src/distribution/cluster-node/validate-config.ts
11096
- var MAX_WAIT_FOR_ACTIVE_REPLICAS = 255;
11097
- var MIN_CONTROLLER_LEASE_TTL_MS = 1e3;
11098
11129
  function validateClusterNodeConfig(config) {
11099
11130
  if (config.address.length === 0) {
11100
11131
  throw new NarsilError(ErrorCodes.CONFIG_INVALID, "ClusterNodeConfig.address must not be empty");
@@ -11457,6 +11488,9 @@ function unsupported(operation) {
11457
11488
  { operation }
11458
11489
  );
11459
11490
  }
11491
+ function rejectWait(options) {
11492
+ if (options?.wait === true) unsupported("wait");
11493
+ }
11460
11494
  function clusterNodeEngine(node, options) {
11461
11495
  return {
11462
11496
  open(indexName) {
@@ -11469,21 +11503,27 @@ function clusterNodeEngine(node, options) {
11469
11503
  return node.createIndex(name, config, options?.createIndex);
11470
11504
  },
11471
11505
  async insert(indexName, document, docId, insertOptions) {
11506
+ rejectWait(insertOptions);
11472
11507
  return node.insert(indexName, document, docId, insertOptions);
11473
11508
  },
11474
11509
  async insertBatch(indexName, documents, insertOptions) {
11510
+ rejectWait(insertOptions);
11475
11511
  return node.insertBatch(indexName, documents, insertOptions);
11476
11512
  },
11477
- async remove(indexName, docId) {
11513
+ async remove(indexName, docId, options2) {
11514
+ rejectWait(options2);
11478
11515
  return node.remove(indexName, docId);
11479
11516
  },
11480
- async removeBatch(indexName, docIds) {
11517
+ async removeBatch(indexName, docIds, options2) {
11518
+ rejectWait(options2);
11481
11519
  return node.removeBatch(indexName, docIds);
11482
11520
  },
11483
- async update(indexName, docId, document) {
11521
+ async update(indexName, docId, document, options2) {
11522
+ rejectWait(options2);
11484
11523
  return node.update(indexName, docId, document);
11485
11524
  },
11486
- async updateBatch(indexName, updates) {
11525
+ async updateBatch(indexName, updates, options2) {
11526
+ rejectWait(options2);
11487
11527
  return node.updateBatch(indexName, updates);
11488
11528
  },
11489
11529
  async dropIndex(name) {
@@ -11531,6 +11571,7 @@ function clusterNodeEngine(node, options) {
11531
11571
  async shutdown() {
11532
11572
  return node.shutdown();
11533
11573
  },
11574
+ waitForWrites: () => unsupported("waitForWrites"),
11534
11575
  registerEmbeddingAdapter: () => unsupported("registerEmbeddingAdapter"),
11535
11576
  listIndexes: () => unsupported("listIndexes"),
11536
11577
  getStats: () => unsupported("getStats"),
@@ -1,12 +1,14 @@
1
1
  import { NarsilError, ErrorCodes } from '../chunk-P4ELXVJQ.mjs';
2
2
 
3
- // src/embeddings/openai.ts
3
+ // src/embeddings/constants.ts
4
4
  var RETRYABLE_STATUS_CODES = /* @__PURE__ */ new Set([429, 500, 502, 503]);
5
5
  var MAX_BACKOFF_MS = 3e4;
6
6
  var BASE_BACKOFF_MS = 1e3;
7
7
  var MAX_JITTER_MS = 1e3;
8
- var DEFAULT_TIMEOUT_MS = 3e4;
8
+ var DEFAULT_REQUEST_TIMEOUT_MS = 3e4;
9
9
  var MAX_INPUTS_PER_REQUEST = 2048;
10
+
11
+ // src/embeddings/openai.ts
10
12
  function isRetryableStatus(status) {
11
13
  return RETRYABLE_STATUS_CODES.has(status);
12
14
  }
@@ -194,7 +196,7 @@ function createOpenAIEmbedding(config) {
194
196
  const url = `${config.baseUrl.replace(/\/+$/, "")}/embeddings`;
195
197
  const model = config.model;
196
198
  const dimensionCount = config.dimensions;
197
- const timeoutMs = config.timeout ?? DEFAULT_TIMEOUT_MS;
199
+ const timeoutMs = config.timeout ?? DEFAULT_REQUEST_TIMEOUT_MS;
198
200
  const maxRetries = config.maxRetries ?? 3;
199
201
  return {
200
202
  get dimensions() {