@delali/narsil 0.3.1-next.73 → 0.3.1-next.75

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 (54) hide show
  1. package/dist/{capabilities-CYeAWYxQ.d.ts → capabilities-BHNksicw.d.ts} +16 -2
  2. package/dist/{chunk-PU43WDY4.mjs → chunk-2E35UM3G.mjs} +1 -13
  3. package/dist/{chunk-AK3BLGCI.mjs → chunk-356UOTK2.mjs} +15 -48
  4. package/dist/chunk-7ODNRREZ.mjs +2050 -0
  5. package/dist/chunk-AIUOAN7Y.mjs +658 -0
  6. package/dist/{chunk-WVDFG45M.mjs → chunk-AMGDG4ZJ.mjs} +3 -2
  7. package/dist/{chunk-AFKH4ZK3.mjs → chunk-BT62MUM5.mjs} +1 -1
  8. package/dist/{chunk-LPBWCHBE.mjs → chunk-BT6BI4GV.mjs} +42 -4
  9. package/dist/{chunk-LJYTW7GT.mjs → chunk-IBR6634K.mjs} +1 -1
  10. package/dist/chunk-KEHK2O6P.mjs +13 -0
  11. package/dist/{chunk-CVFAFZSN.mjs → chunk-LOARLB4F.mjs} +46 -34
  12. package/dist/{chunk-3YKWSO54.mjs → chunk-NAMGDK45.mjs} +228 -649
  13. package/dist/{chunk-2WLD2NFW.mjs → chunk-PXDY5VRT.mjs} +3 -3
  14. package/dist/chunk-UOJIV2NG.mjs +593 -0
  15. package/dist/chunk-V3B24XR7.mjs +54 -0
  16. package/dist/{chunk-ZULSEZCE.mjs → chunk-WL2GDSCV.mjs} +100 -19
  17. package/dist/{chunk-THMSFOJO.mjs → chunk-YOVS4EV5.mjs} +582 -598
  18. package/dist/{client-D698E5ge.d.ts → client-D4sXFS9f.d.ts} +3 -3
  19. package/dist/client.d.ts +8 -8
  20. package/dist/{config-Bv8etwUZ.d.ts → config-B-GRonqw.d.ts} +2 -2
  21. package/dist/{config-QXU3HMpq.d.ts → config-C1kbq1X2.d.ts} +2 -2
  22. package/dist/direct-executor-AVNWB73C.mjs +16 -0
  23. package/dist/distribution/coordinator/etcd.d.ts +2 -2
  24. package/dist/distribution/coordinator/etcd.mjs +1 -1
  25. package/dist/distribution/coordinator/in-memory.d.ts +2 -2
  26. package/dist/distribution/coordinator/in-memory.mjs +1 -1
  27. package/dist/distribution.d.ts +8 -8
  28. package/dist/distribution.mjs +23 -13
  29. package/dist/{engine-D_OzKZ-6.d.ts → engine-DcGSd5vh.d.ts} +2 -2
  30. package/dist/index.browser.mjs +1272 -834
  31. package/dist/index.d.ts +27 -8
  32. package/dist/index.mjs +14 -11
  33. package/dist/invalidation/filesystem.mjs +1 -1
  34. package/dist/{memory-B4jMmygw.d.ts → memory-M9kPmYP8.d.ts} +1257 -1178
  35. package/dist/partial-words-DTIHO8G4.d.ts +19 -0
  36. package/dist/partial-words.d.ts +22 -0
  37. package/dist/partial-words.mjs +11 -0
  38. package/dist/pattern.mjs +2 -2
  39. package/dist/persistence/durability/checkpoint-worker.d.ts +33 -13
  40. package/dist/persistence/durability/checkpoint-worker.mjs +14 -11
  41. package/dist/react.d.ts +7 -7
  42. package/dist/{schema-BBOCdhND.d.ts → schema-DgyDijhf.d.ts} +6 -2
  43. package/dist/server.d.ts +10 -10
  44. package/dist/server.mjs +36 -11
  45. package/dist/{tasks-DpgCpW1x.d.ts → tasks-A8se0J98.d.ts} +1 -1
  46. package/dist/{thread-3LNVA43V.mjs → thread-BSIKT6ED.mjs} +16 -9
  47. package/dist/{types-BiUmaiWT.d.ts → types-ChrVy4lH.d.ts} +1 -1
  48. package/dist/vector/search-worker.d.ts +1 -1
  49. package/dist/vector/search-worker.mjs +4 -3
  50. package/dist/workers/entry.mjs +3 -3
  51. package/package.json +16 -7
  52. package/dist/chunk-XW25X6AU.mjs +0 -614
  53. package/dist/chunk-ZKRV5M2P.mjs +0 -75
  54. package/dist/direct-executor-5SRDFZAS.mjs +0 -13
@@ -1,5 +1,5 @@
1
- import { MAX_SORT_FIELDS } from './chunk-AK3BLGCI.mjs';
2
- import { nativeSearchCoreIsEnabled, loadNativeCore } from './chunk-PU43WDY4.mjs';
1
+ import { MAX_FILTER_DEPTH, MAX_SORT_FIELDS } from './chunk-V3B24XR7.mjs';
2
+ import { nativeSearchCoreIsEnabled, loadNativeCore } from './chunk-2E35UM3G.mjs';
3
3
  import { NarsilError, ServerErrorCodes, ErrorCodes } from './chunk-I64LXKO3.mjs';
4
4
  import { mkdtemp, open, rm } from 'fs/promises';
5
5
  import { tmpdir } from 'os';
@@ -423,6 +423,43 @@ function serializeBatchResult(result) {
423
423
  };
424
424
  }
425
425
 
426
+ // src/server/regex-policy.ts
427
+ function isRecord(value) {
428
+ return value !== null && typeof value === "object" && !Array.isArray(value);
429
+ }
430
+ function regexFieldIn(expression, depth) {
431
+ if (!isRecord(expression) || depth > MAX_FILTER_DEPTH) return null;
432
+ if (isRecord(expression.fields)) {
433
+ for (const [fieldPath, filter] of Object.entries(expression.fields)) {
434
+ if (isRecord(filter) && Object.hasOwn(filter, "regex")) return fieldPath;
435
+ }
436
+ }
437
+ for (const nested of [expression.and, expression.or]) {
438
+ if (!Array.isArray(nested)) continue;
439
+ for (const child of nested) {
440
+ const found = regexFieldIn(child, depth + 1);
441
+ if (found !== null) return found;
442
+ }
443
+ }
444
+ return regexFieldIn(expression.not, depth + 1);
445
+ }
446
+ function refusedRegex(filters, allowRegex) {
447
+ if (allowRegex) return null;
448
+ const fieldPath = regexFieldIn(filters, 0);
449
+ if (fieldPath === null) return null;
450
+ return new NarsilError(
451
+ ErrorCodes.SEARCH_INVALID_FILTER,
452
+ `This server refuses every "regex" test, because its operator set the allowRegex server option to false. Test field "${fieldPath}" with "contains" or "wildcard"`,
453
+ { fieldPath, operator: "regex", option: "allowRegex" }
454
+ );
455
+ }
456
+ function refuseRegex(ctx, filters, allowRegex) {
457
+ const refused = refusedRegex(filters, allowRegex);
458
+ if (refused === null) return false;
459
+ respondError(ctx, refused);
460
+ return true;
461
+ }
462
+
426
463
  // src/server/validation.ts
427
464
  function isPlainObject(value) {
428
465
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -616,7 +653,7 @@ function parseTaskListQuery(params, maxPageSize) {
616
653
 
617
654
  // src/server/handlers/document-reads.ts
618
655
  function createDocumentReadHandlers(deps) {
619
- const { engine, limits } = deps;
656
+ const { engine, limits, allowRegex } = deps;
620
657
  async function get(ctx) {
621
658
  try {
622
659
  const document = await engine.get(ctx.params[0], ctx.params[1]);
@@ -668,6 +705,7 @@ function createDocumentReadHandlers(deps) {
668
705
  rejectInvalid(ctx, failure);
669
706
  return;
670
707
  }
708
+ if (refuseRegex(ctx, params.filters, allowRegex)) return;
671
709
  try {
672
710
  respondJson(ctx, await engine.listDocuments(ctx.params[0], params));
673
711
  } catch (err) {
@@ -1155,4 +1193,4 @@ function childAppOf(app) {
1155
1193
  return candidate;
1156
1194
  }
1157
1195
 
1158
- export { ASYNC_IMPORT_CAPABILITY, DEFAULT_IMPORT_BATCH_SIZE, DEFAULT_MAX_BODY_BYTES, DEFAULT_MAX_CONCURRENT_REQUESTS, DEFAULT_MAX_CONCURRENT_TASKS, DEFAULT_MAX_FETCH_DOCUMENTS, DEFAULT_MAX_IMPORT_BYTES, DEFAULT_MAX_IMPORT_ERRORS, DEFAULT_MAX_LINE_BYTES, DEFAULT_MAX_RESTORE_BYTES, DEFAULT_MAX_RESULT_WINDOW, DEFAULT_MAX_RETAINED_TASKS, DEFAULT_MAX_TASK_PAGE_SIZE, DEFAULT_TASK_PAGE_SIZE, DOCUMENT_EXPORT_CAPABILITY, DOCUMENT_EXPORT_CONTENT_TYPE, IMPORT_FLUSHES_IN_FLIGHT, INDEX_LIFECYCLE_CAPABILITY, INDEX_TOUCH_INTERVALS_PER_IDLE_TIMEOUT, MAIN_THREAD_GATE_SLOT, MAX_INDEX_TOUCH_INTERVAL_MS, MIN_COUNTED_SERVER_LIMIT, MIN_UNBOUNDED_SERVER_LIMIT, REBUILD_ANALYSIS_CAPABILITY, RELAY_STREAM_CHUNKS_IN_FLIGHT, RUNNING_TASK_TTL_MS, SERVER_CAPABILITIES, SNAPSHOT_ARCHIVE_CONTENT_TYPE, TASK_CANCEL_CAPABILITY, TASK_FILTER_CAPABILITY, TASK_PROGRESS_WRITE_INTERVAL_MS, TERMINAL_TASK_TTL_MS, acceptorOf, authorizerFor, badRequest, childAppOf, clearGateSlot, corsHeaderReader, createDocumentReadHandlers, createRouteRunner, createSharedGateBuffer, createSharedRequestGate, createVersionHandler, gateSlotOfWorker, httpStatusForNarsilError, loadUWebSockets, parseJson, parseJsonOptional, parseTaskListQuery, registerServerRoutes, rejectInvalid, resolveCors, respondError, respondJson, sendError, sendRelayed, sendStream, serializeBatchResult, serializeNarsilError, serverRoutes, statusLine, toHttpError, validateBatch, validateCreateIndex, validateDocumentBody, validateQuery, validateRebalance, validateSuggest, versionReport };
1196
+ export { ASYNC_IMPORT_CAPABILITY, DEFAULT_IMPORT_BATCH_SIZE, DEFAULT_MAX_BODY_BYTES, DEFAULT_MAX_CONCURRENT_REQUESTS, DEFAULT_MAX_CONCURRENT_TASKS, DEFAULT_MAX_FETCH_DOCUMENTS, DEFAULT_MAX_IMPORT_BYTES, DEFAULT_MAX_IMPORT_ERRORS, DEFAULT_MAX_LINE_BYTES, DEFAULT_MAX_RESTORE_BYTES, DEFAULT_MAX_RESULT_WINDOW, DEFAULT_MAX_RETAINED_TASKS, DEFAULT_MAX_TASK_PAGE_SIZE, DEFAULT_TASK_PAGE_SIZE, DOCUMENT_EXPORT_CAPABILITY, DOCUMENT_EXPORT_CONTENT_TYPE, IMPORT_FLUSHES_IN_FLIGHT, INDEX_LIFECYCLE_CAPABILITY, INDEX_TOUCH_INTERVALS_PER_IDLE_TIMEOUT, MAIN_THREAD_GATE_SLOT, MAX_INDEX_TOUCH_INTERVAL_MS, MIN_COUNTED_SERVER_LIMIT, MIN_UNBOUNDED_SERVER_LIMIT, REBUILD_ANALYSIS_CAPABILITY, RELAY_STREAM_CHUNKS_IN_FLIGHT, RUNNING_TASK_TTL_MS, SERVER_CAPABILITIES, SNAPSHOT_ARCHIVE_CONTENT_TYPE, TASK_CANCEL_CAPABILITY, TASK_FILTER_CAPABILITY, TASK_PROGRESS_WRITE_INTERVAL_MS, TERMINAL_TASK_TTL_MS, acceptorOf, authorizerFor, badRequest, childAppOf, clearGateSlot, corsHeaderReader, createDocumentReadHandlers, createRouteRunner, createSharedGateBuffer, createSharedRequestGate, createVersionHandler, gateSlotOfWorker, httpStatusForNarsilError, loadUWebSockets, parseJson, parseJsonOptional, parseTaskListQuery, refuseRegex, registerServerRoutes, rejectInvalid, resolveCors, respondError, respondJson, sendError, sendRelayed, sendStream, serializeBatchResult, serializeNarsilError, serverRoutes, statusLine, toHttpError, validateBatch, validateCreateIndex, validateDocumentBody, validateQuery, validateRebalance, validateSuggest, versionReport };
@@ -290,4 +290,4 @@ function compareSortValues(aValues, bValues, directions) {
290
290
  return 0;
291
291
  }
292
292
 
293
- export { SORT_MODES, SORT_VALUE_MAX_CODE_POINTS, appendFoldedCodePoint, codePointCount, compareCodePoints, compareComparableKeys, compareComparableValues, compareSortValues, defaultSortMode, exceedsCodePoints, foldedCodePointCount, holdsUnpairedSurrogate, isSortMode, readSortField, sortModeOf, toComparableSortValue, toReducedSortValue, truncateSortString };
293
+ export { SORT_MODES, SORT_VALUE_MAX_CODE_POINTS, appendFoldedCodePoint, codePointCount, compareCodePoints, compareComparableKeys, compareComparableValues, compareSortValues, defaultSortMode, exceedsCodePoints, foldedCodePointCount, holdsUnpairedSurrogate, isSortMode, readSortField, singleFoldTable, sortModeOf, toComparableSortValue, toReducedSortValue, truncateSortString };
@@ -0,0 +1,13 @@
1
+ // src/vector/hnsw/constants.ts
2
+ var MAX_LAYER_CAP = 32;
3
+ var MAX_M = 512;
4
+ var MIN_M = 2;
5
+ var EARLIER_RELEASE_MIN_M = 1;
6
+ var INITIAL_UPPER_SLOTS = 64;
7
+ var INITIAL_LIST_CAPACITY = 64;
8
+ var PLACEMENT_ROOM_REQUESTS = 8;
9
+ var COMPACTION_TOMBSTONE_RATIO = 0.1;
10
+ var COMPACTION_ABSOLUTE_THRESHOLD = 1e3;
11
+ var DEFAULT_EF_SEARCH = 50;
12
+
13
+ export { COMPACTION_ABSOLUTE_THRESHOLD, COMPACTION_TOMBSTONE_RATIO, DEFAULT_EF_SEARCH, EARLIER_RELEASE_MIN_M, INITIAL_LIST_CAPACITY, INITIAL_UPPER_SLOTS, MAX_LAYER_CAP, MAX_M, MIN_M, PLACEMENT_ROOM_REQUESTS };
@@ -1,14 +1,17 @@
1
+ import { validateWorkerConfig, validateIndexName, validatePatternValueLimit, requireSurfaceFormsForPartialFields, validateBM25Params, validatePartitionConfig, executeQuery, queryBindingOf, executePreflight, executeSuggest, executeListDocuments, validateDocId } from './chunk-WL2GDSCV.mjs';
1
2
  import { ReplicationMessageTypes } from './chunk-GCM3JFVA.mjs';
2
- import { WIRE_BATCH_BUDGET, resolveVectorText, bindEngineCore, restoredConfigFields, restoredEmbedding, collectRequiredFieldFailures, embedChunkDocuments, providedDocId, requireDocumentObject, admitInsert, asBatchInsertError, requireMatchingDocId, embedDocumentFields, assertDocumentCarriesMappedVectors, admitBufferedUpsert, createPendingAdmissions, recordPendingAdmission } from './chunk-AFKH4ZK3.mjs';
3
- import { NATIVE_CRC32_MIN_BYTES, generateId, decodeEveryStoredDocument, createSharedFrozenSegment, splitWorkerBudget, resolveWorkerCount, createDirectExecutor, createPartitionRouter, requirePatternSearchFor, MAX_FILE_BYTES, resolveWorkerEntry, missingWorkerEntry, readHeapStatistics, nodeThreadId, CHECKSUM_YIELD_CHUNK_BYTES, createPartitionManager, buildSegmentPayload, resolvePartitionInsertOptions, createFrozenSegment, resolveRequestThreadCount, vectorsPerFile, vectorsToBytes, VECTOR_FILE_PAYLOAD_VERSION, deadBitsWhere, NO_LIVE_VECTOR_AT_POSITION, createPartitionIndex, selectionKeeps, decodeMapWithoutFields, isCompositePartition, segmentArraysOf, mergeSegmentContents, survivorDocumentsOf, partitionStateOf, VECTOR_FILE_MAX_VECTORS, deadBytesFor, resolveIndexAnalysis, mergeFrozenSegments, workerResourceLimits, decodeVectorIndexParts, bytesToVectors, freezeSegmentShared, DEFAULT_BACKPRESSURE_LIMIT, DEFAULT_REQUEST_TIMEOUT_MS, SHUTDOWN_TIMEOUT_MS, decodeVectorFilePayload, decodeVectorGraphPartPayload, assembleGraphParts, countDead, encodeSegmentState, CONSECUTIVE_TIMEOUTS_BEFORE_DEATH, VALID_HNSW_METRICS, spawnNodeWorker, decodeVectorGraphPayload, graphPartsOfEarlierPayload, decodeStoredDocument, isDead } from './chunk-THMSFOJO.mjs';
3
+ import { WIRE_BATCH_BUDGET, resolveVectorText, bindEngineCore, restoredConfigFields, restoredEmbedding, collectRequiredFieldFailures, embedChunkDocuments, providedDocId, requireDocumentObject, admitInsert, asBatchInsertError, requireMatchingDocId, embedDocumentFields, assertDocumentCarriesMappedVectors, admitBufferedUpsert, createPendingAdmissions, recordPendingAdmission } from './chunk-BT62MUM5.mjs';
4
+ import { NATIVE_CRC32_MIN_BYTES, generateId, decodeEveryStoredDocument, createSharedFrozenSegment, shareSegmentArrays, splitWorkerBudget, resolveWorkerCount, createDirectExecutor, createPartitionRouter, requirePartialWordSearchFor, MAX_FILE_BYTES, resolveWorkerEntry, missingWorkerEntry, readHeapStatistics, nodeThreadId, CHECKSUM_YIELD_CHUNK_BYTES, createPartitionManager, buildSegmentPayload, resolvePartitionInsertOptions, createFrozenSegment, resolveRequestThreadCount, vectorsPerFile, vectorsToBytes, VECTOR_FILE_PAYLOAD_VERSION, deadBitsWhere, NO_LIVE_VECTOR_AT_POSITION, createPartitionIndex, selectionKeeps, decodeMapWithoutFields, isCompositePartition, segmentArraysOf, mergeSegmentContents, survivorDocumentsOf, partitionStateOf, VECTOR_FILE_MAX_VECTORS, deadBytesFor, resolveIndexAnalysis, mergeFrozenSegments, workerResourceLimits, decodeVectorIndexParts, bytesToVectors, freezeSegmentShared, DEFAULT_BACKPRESSURE_LIMIT, DEFAULT_REQUEST_TIMEOUT_MS, SHUTDOWN_TIMEOUT_MS, decodeVectorFilePayload, decodeVectorGraphPartPayload, assembleGraphParts, countDead, encodeSegmentState, CONSECUTIVE_TIMEOUTS_BEFORE_DEATH, VALID_HNSW_METRICS, spawnNodeWorker, decodeVectorGraphPayload, graphPartsOfEarlierPayload, decodeStoredDocument, isDead } from './chunk-YOVS4EV5.mjs';
5
+ import { requirePatternSearchFor, collectQueryTermStats, mergePartitionStats, oversampledFacetConfig, fnv1a, availablePatternSearch, kWayMerge, mergeFacets, PATTERN_HOST, setNestedValue } from './chunk-NAMGDK45.mjs';
4
6
  import { detectRuntime, getLanguage } from './chunk-4MQ5F4IL.mjs';
5
- import { validateWorkerConfig, validateIndexName, validatePatternValueLimit, validateBM25Params, validatePartitionConfig, executeQuery, queryBindingOf, executePreflight, executeSuggest, executeListDocuments, validateDocId } from './chunk-ZULSEZCE.mjs';
6
- import { getNestedValue, collectQueryTermStats, mergePartitionStats, oversampledFacetConfig, fnv1a, kWayMerge, mergeFacets, parseVectorDimension, setNestedValue } from './chunk-3YKWSO54.mjs';
7
- import { extractVectorFieldsFromSchema, messagePackUpperBoundBytes, MAX_INDEX_CONFIGURATION_BYTES, validateSchema, requireCreatableSchema, validateVectorPromotion, validateVectorStorage, raiseEarlierReleaseGraphSetting, flattenSchema, isSingleStringFieldType, requireValidFieldTypes, encodeDocument, STATISTICS_BROADCAST_INTERVAL_MS, MAX_SWEEP_INTERVAL_MS, MIN_SWEEP_INTERVAL_MS, HEAP_PRESSURE_WARNING_FRACTION, MAX_EXPORT_LINE_BYTES, IMPORT_BATCH_DOCUMENTS, VECTOR_PATTERN, schemaFieldsOf, FOREIGN_STATS_TTL_MS, MAX_IMPORT_REFUSALS_REPORTED, BATCH_CHUNK_SIZE, MIN_DOCUMENTS_FOR_SEGMENTS, MAX_DOCUMENT_NESTING_DEPTH, isQuantizationMode, isStorageMode, HEAP_PRESSURE_REARM_FRACTION, EXPORT_CHUNK_BYTES, validateRequiredFields, requireDocumentWithinSizeLimit, validateDocument, validateDocumentStrict } from './chunk-AK3BLGCI.mjs';
8
- import { releaseLocksHeldBy } from './chunk-WVDFG45M.mjs';
9
- import { requireSearchBackendSettings, MIN_M } from './chunk-PU43WDY4.mjs';
10
- import { DEFAULT_PATTERN_WORK_CAP, MATCHER_STATE_BUDGET_BYTES, MATCHER_SIMULATION_BYTES_PER_POSITION, MATCHER_STATE_OVERHEAD_BYTES, PATTERN_TEST_OPERATORS, MATCHER_CODE_POINT_BYTES } from './chunk-ZKRV5M2P.mjs';
11
- import { compareCodePoints, foldedCodePointCount, codePointCount } from './chunk-LJYTW7GT.mjs';
7
+ import { MAX_INDEX_CONFIGURATION_BYTES, STATISTICS_BROADCAST_INTERVAL_MS, MAX_SWEEP_INTERVAL_MS, MIN_SWEEP_INTERVAL_MS, HEAP_PRESSURE_WARNING_FRACTION, MAX_EXPORT_LINE_BYTES, IMPORT_BATCH_DOCUMENTS, FOREIGN_STATS_TTL_MS, MAX_IMPORT_REFUSALS_REPORTED, BATCH_CHUNK_SIZE, MIN_DOCUMENTS_FOR_SEGMENTS, HEAP_PRESSURE_REARM_FRACTION, EXPORT_CHUNK_BYTES } from './chunk-V3B24XR7.mjs';
8
+ import { releaseLocksHeldBy } from './chunk-AMGDG4ZJ.mjs';
9
+ import { requireSearchBackendSettings } from './chunk-2E35UM3G.mjs';
10
+ import { DEFAULT_PATTERN_WORK_CAP, MATCHER_STATE_BUDGET_BYTES, PATTERN_TEST_OPERATORS, PATTERN_EXPRESSION_OPERATORS, MATCHER_CODE_POINT_BYTES, MATCHER_SIMULATION_BYTES_PER_POSITION, MATCHER_STATE_OVERHEAD_BYTES } from './chunk-7ODNRREZ.mjs';
11
+ import { getNestedValue, parseVectorDimension } from './chunk-UOJIV2NG.mjs';
12
+ import { extractVectorFieldsFromSchema, messagePackUpperBoundBytes, validateSchema, requireCreatableSchema, validateVectorPromotion, validateVectorStorage, raiseEarlierReleaseGraphSetting, flattenSchema, isSingleStringFieldType, requireValidFieldTypes, encodeDocument, VECTOR_PATTERN, schemaFieldsOf, MAX_DOCUMENT_NESTING_DEPTH, isQuantizationMode, isStorageMode, validateRequiredFields, requireDocumentWithinSizeLimit, validateDocument, validateDocumentStrict } from './chunk-356UOTK2.mjs';
13
+ import { MIN_M } from './chunk-KEHK2O6P.mjs';
14
+ import { compareCodePoints, foldedCodePointCount, codePointCount } from './chunk-IBR6634K.mjs';
12
15
  import { createRequestId, isValidWorkerResponse, threadSlotOfWorker } from './chunk-POWOTUKJ.mjs';
13
16
  import { ErrorCodes, NarsilError } from './chunk-I64LXKO3.mjs';
14
17
  import { encode, decode } from '@msgpack/msgpack';
@@ -3502,7 +3505,7 @@ function selectionOfMask(segment, keep) {
3502
3505
  }
3503
3506
  function frozenLiveTail(live, shared) {
3504
3507
  if (live.count() === 0) return null;
3505
- const payload = live.encodeSegment();
3508
+ const payload = { ...live.encodeSegment(), partialSpellings: null };
3506
3509
  const documents = survivorDocumentsOf(partitionStateOf(live), payload);
3507
3510
  if (shared) {
3508
3511
  const snapshot = freezeSegmentShared(payload, documents);
@@ -5018,6 +5021,7 @@ function emptyPayload() {
5018
5021
  totalFieldLengths: {},
5019
5022
  docFrequencies: {},
5020
5023
  surfaceForms: null,
5024
+ partialSpellings: null,
5021
5025
  numeric: [],
5022
5026
  boolean: [],
5023
5027
  enums: [],
@@ -5123,7 +5127,7 @@ function chooseWindow(segments, wantedLength) {
5123
5127
  return null;
5124
5128
  }
5125
5129
  function frozenOf(contents) {
5126
- return createSharedFrozenSegment({ ...contents.arrays, segmentId: generateId() });
5130
+ return createSharedFrozenSegment(shareSegmentArrays(contents.arrays, null));
5127
5131
  }
5128
5132
  function applyTimeOrder(frozen, contents) {
5129
5133
  for (let newer = 1; newer < frozen.length; newer++) {
@@ -5391,7 +5395,7 @@ async function loadPartitionSegments(store, partition, manager, options) {
5391
5395
  const contents = await readSegmentFile(store, ref);
5392
5396
  requireAgreedSchema(options.schema, contents.schema, ref.key);
5393
5397
  if (options.decodesEveryDocument) decodeEveryStoredDocument(contents.arrays.documentTable);
5394
- const segment = createSharedFrozenSegment({ ...contents.arrays, segmentId: generateId() });
5398
+ const segment = createSharedFrozenSegment(shareSegmentArrays(contents.arrays, manager.partialWordAnalysis));
5395
5399
  removeWhatTheSegmentReplaces(manager, segment, contents);
5396
5400
  if (contents.arrays.documentCount > 0) manager.attachFrozenSegment(partition.partitionId, segment);
5397
5401
  await yieldToEventLoop4();
@@ -7881,6 +7885,7 @@ async function createIndexFromMetadata(deps, metadata, loadData) {
7881
7885
  try {
7882
7886
  indexConfig.schema = validateSchema(indexConfig.schema);
7883
7887
  validatePatternValueLimit(indexConfig.patternValueLimit);
7888
+ requireSurfaceFormsForPartialFields(indexConfig.schema, indexConfig.surfaceForms);
7884
7889
  } catch (err) {
7885
7890
  throw recoveryFailure(metadata, err);
7886
7891
  }
@@ -8594,7 +8599,7 @@ function checkHeapAfterRecovery(core) {
8594
8599
  }
8595
8600
 
8596
8601
  // src/core/partition/frozen/share.ts
8597
- function shareFrozenSegment(segment) {
8602
+ function shareFrozenSegment(segment, analysis) {
8598
8603
  if (segment.sharedSnapshot !== null) {
8599
8604
  return { snapshot: segment.sharedSnapshot, tombstonedDocIds: segment.tombstonedDocIds() };
8600
8605
  }
@@ -8608,7 +8613,7 @@ function shareFrozenSegment(segment) {
8608
8613
  }
8609
8614
  return stored.fields;
8610
8615
  });
8611
- const snapshot = freezeSegmentShared(payload, documents, segment.segmentId);
8616
+ const snapshot = freezeSegmentShared(payload, documents, segment.segmentId, analysis);
8612
8617
  return snapshot === null ? null : { snapshot, tombstonedDocIds: [] };
8613
8618
  }
8614
8619
 
@@ -8619,7 +8624,7 @@ function captureComposite(manager, partitionId) {
8619
8624
  const segmentIds = partition.frozenSegmentSizes().map((size) => size.segmentId);
8620
8625
  const frozen = [];
8621
8626
  for (const segment of partition.frozenSegmentsById(segmentIds)) {
8622
- const shared = shareFrozenSegment(segment);
8627
+ const shared = shareFrozenSegment(segment, manager.partialWordAnalysis);
8623
8628
  if (shared === null) return null;
8624
8629
  frozen.push(shared);
8625
8630
  }
@@ -9004,7 +9009,7 @@ function liveTailCount(manager, partitionId) {
9004
9009
  }
9005
9010
  function freezeIntoSharedSegment(manager, partitionId) {
9006
9011
  return manager.freezeLiveTail(partitionId, (payload, documents) => {
9007
- const snapshot = freezeSegmentShared(payload, documents);
9012
+ const snapshot = freezeSegmentShared(payload, documents, void 0, manager.partialWordAnalysis);
9008
9013
  return snapshot === null ? null : createSharedFrozenSegment(snapshot);
9009
9014
  });
9010
9015
  }
@@ -9127,7 +9132,7 @@ async function compactPartitionSegments2(state, indexName, manager, partitionId,
9127
9132
  const mainCanMerge = composite !== null && mainHoldsAll(composite, segmentIds);
9128
9133
  let snapshot = await compactOnWorker(state, indexName, partitionId, segmentIds);
9129
9134
  if (snapshot === null && mainCanMerge && composite !== null) {
9130
- snapshot = mergeFrozenSegments(composite.frozenSegmentsById(segmentIds));
9135
+ snapshot = mergeFrozenSegments(composite.frozenSegmentsById(segmentIds), manager.partialWordAnalysis);
9131
9136
  }
9132
9137
  if (snapshot === null) {
9133
9138
  if (!mainCanMerge) forgetLedgerSegments(state, indexName, partitionId, segmentIds);
@@ -10223,57 +10228,61 @@ var POSITIONS_PER_WORD = 32;
10223
10228
  function positionWords(positions) {
10224
10229
  return Math.max(1, Math.ceil(positions / POSITIONS_PER_WORD));
10225
10230
  }
10226
- function automatonBytes(positions) {
10227
- return 2 * positionWords(positions) * Uint32Array.BYTES_PER_ELEMENT + positions * MATCHER_CODE_POINT_BYTES;
10228
- }
10229
10231
  function smallestMatcherBytes(positions) {
10230
- return automatonBytes(positions) + positions * MATCHER_SIMULATION_BYTES_PER_POSITION + MATCHER_STATE_OVERHEAD_BYTES + positions * Uint32Array.BYTES_PER_ELEMENT;
10232
+ return 2 * positionWords(positions) * Uint32Array.BYTES_PER_ELEMENT + positions * MATCHER_CODE_POINT_BYTES + positions * MATCHER_SIMULATION_BYTES_PER_POSITION + MATCHER_STATE_OVERHEAD_BYTES + positions * Uint32Array.BYTES_PER_ELEMENT;
10231
10233
  }
10232
- function widestPatternSplit(positions) {
10233
- return Math.max(1, Math.floor(MATCHER_STATE_BUDGET_BYTES / smallestMatcherBytes(positions)));
10234
+ function widestPatternSplit(footprintBytes) {
10235
+ return Math.max(1, Math.floor(MATCHER_STATE_BUDGET_BYTES / Math.max(1, footprintBytes)));
10234
10236
  }
10235
10237
 
10236
10238
  // src/core/pattern-index/query-positions.ts
10237
10239
  function isRecord4(value) {
10238
10240
  return value !== null && typeof value === "object" && !Array.isArray(value);
10239
10241
  }
10240
- function textPositions(text, caseFold) {
10241
- if (typeof text !== "string") return 0;
10242
- return caseFold ? foldedCodePointCount(text) : codePointCount(text);
10242
+ function literalFootprint(text, caseFold) {
10243
+ if (typeof text !== "string") return null;
10244
+ return smallestMatcherBytes(caseFold ? foldedCodePointCount(text) : codePointCount(text));
10243
10245
  }
10244
10246
  function larger(left, right) {
10245
10247
  if (left === null) return right;
10246
10248
  if (right === null) return left;
10247
10249
  return Math.max(left, right);
10248
10250
  }
10249
- function largestTestOf(filter) {
10251
+ function largestTestOf(filter, module) {
10250
10252
  const caseFold = filter.caseFold === true;
10251
10253
  let largest = null;
10252
10254
  for (const operator of PATTERN_TEST_OPERATORS) {
10253
10255
  const operand = filter[operator];
10254
10256
  if (operand === void 0) continue;
10255
10257
  const texts = Array.isArray(operand) ? operand : [operand];
10256
- for (const text of texts) largest = larger(largest, textPositions(text, caseFold));
10258
+ for (const text of texts) largest = larger(largest, literalFootprint(text, caseFold));
10259
+ }
10260
+ for (const operator of PATTERN_EXPRESSION_OPERATORS) {
10261
+ const pattern = filter[operator];
10262
+ if (typeof pattern !== "string") continue;
10263
+ largest = larger(largest, module.expressionFootprint(operator, pattern, caseFold, PATTERN_HOST));
10257
10264
  }
10258
10265
  return largest;
10259
10266
  }
10260
- function largestIn(expression, patternFields) {
10267
+ function largestIn(expression, patternFields, module) {
10261
10268
  let largest = null;
10262
10269
  if (isRecord4(expression.fields)) {
10263
10270
  for (const [fieldPath, filter] of Object.entries(expression.fields)) {
10264
- if (patternFields.has(fieldPath) && isRecord4(filter)) largest = larger(largest, largestTestOf(filter));
10271
+ if (patternFields.has(fieldPath) && isRecord4(filter)) largest = larger(largest, largestTestOf(filter, module));
10265
10272
  }
10266
10273
  }
10267
10274
  const nested = [...expression.and ?? [], ...expression.or ?? []];
10268
10275
  if (expression.not !== void 0) nested.push(expression.not);
10269
- for (const child of nested) largest = larger(largest, largestIn(child, patternFields));
10276
+ for (const child of nested) largest = larger(largest, largestIn(child, patternFields, module));
10270
10277
  return largest;
10271
10278
  }
10272
- function largestPatternTest(expression, schema) {
10279
+ function largestPatternFootprint(expression, schema) {
10273
10280
  if (expression === void 0) return null;
10281
+ const module = availablePatternSearch();
10282
+ if (module === null) return null;
10274
10283
  const patternFields = /* @__PURE__ */ new Set();
10275
10284
  for (const { path, pattern } of schemaFieldsOf(schema)) if (pattern) patternFields.add(path);
10276
- return patternFields.size === 0 ? null : largestIn(expression, patternFields);
10285
+ return patternFields.size === 0 ? null : largestIn(expression, patternFields, module);
10277
10286
  }
10278
10287
 
10279
10288
  // src/engine/orchestration/search.ts
@@ -10340,7 +10349,7 @@ function isWorkCapError(err) {
10340
10349
  function patternSplitWidth(state, indexName, params) {
10341
10350
  const schema = state.indexRegistry.get(indexName)?.config.schema;
10342
10351
  if (schema === void 0) return Number.POSITIVE_INFINITY;
10343
- const largest = largestPatternTest(params.filters, schema);
10352
+ const largest = largestPatternFootprint(params.filters, schema);
10344
10353
  if (largest === null) return Number.POSITIVE_INFINITY;
10345
10354
  if (typeof SharedArrayBuffer !== "function") return 1;
10346
10355
  return widestPatternSplit(largest);
@@ -11117,7 +11126,9 @@ async function createEngineIndex(core, config, name, requestedConfig, creation =
11117
11126
  if (appliesCreationLimits) requireCreatableSchema(schema);
11118
11127
  const indexConfig = schema === requestedConfig.schema ? requestedConfig : { ...requestedConfig, schema };
11119
11128
  requirePatternSearchFor(schema);
11129
+ requirePartialWordSearchFor(schema);
11120
11130
  validatePatternValueLimit(indexConfig.patternValueLimit);
11131
+ requireSurfaceFormsForPartialFields(schema, indexConfig.surfaceForms);
11121
11132
  validateVectorPromotion(indexConfig.vectorPromotion);
11122
11133
  validateVectorStorage(indexConfig.vectorPromotion, core.filesystemDurability);
11123
11134
  validateBM25Params(indexConfig.bm25);
@@ -13918,6 +13929,7 @@ function prepareRestoredIndex(configuration, deps, reject) {
13918
13929
  const language = getLanguage(languageName);
13919
13930
  const schema = validateSchema(configuration.schema);
13920
13931
  validatePatternValueLimit(configFields.patternValueLimit);
13932
+ requireSurfaceFormsForPartialFields(schema, configFields.surfaceForms);
13921
13933
  validateVectorPromotion(configFields.vectorPromotion);
13922
13934
  validateVectorStorage(configFields.vectorPromotion, deps.filesystemDurability);
13923
13935
  if (configFields.required !== void 0 && configFields.required.length > 0) {