@delali/narsil 0.3.1-next.74 → 0.3.1-next.76

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 (45) hide show
  1. package/dist/{capabilities-CAMzmkAg.d.ts → capabilities-1lEYL3WK.d.ts} +16 -2
  2. package/dist/{chunk-Z3DQPOJQ.mjs → chunk-356UOTK2.mjs} +1 -1
  3. package/dist/chunk-4344I4MR.mjs +2217 -0
  4. package/dist/{chunk-PO53FV4Q.mjs → chunk-AMGDG4ZJ.mjs} +1 -1
  5. package/dist/{chunk-LX4JERXI.mjs → chunk-BT62MUM5.mjs} +1 -1
  6. package/dist/{chunk-NOZUQM7J.mjs → chunk-BT6BI4GV.mjs} +41 -3
  7. package/dist/{chunk-VKX2BPXD.mjs → chunk-D4EF7J3I.mjs} +127 -20
  8. package/dist/{chunk-BVBIQQKG.mjs → chunk-DFFQOA7S.mjs} +26 -67
  9. package/dist/{chunk-CTOSGRM7.mjs → chunk-G7IP3UDZ.mjs} +6 -5
  10. package/dist/chunk-GES7U2PM.mjs +68 -0
  11. package/dist/{chunk-CUZOX6CN.mjs → chunk-HH6ALOUZ.mjs} +31 -27
  12. package/dist/{chunk-LJYTW7GT.mjs → chunk-IBR6634K.mjs} +1 -1
  13. package/dist/{chunk-I23G3IZC.mjs → chunk-NO3ABFLE.mjs} +2 -63
  14. package/dist/{chunk-T5ZWEWVD.mjs → chunk-PJU6EF22.mjs} +3 -2
  15. package/dist/{chunk-TVFLHM7M.mjs → chunk-PXDY5VRT.mjs} +3 -3
  16. package/dist/{chunk-3DDUNI6N.mjs → chunk-V3B24XR7.mjs} +7 -1
  17. package/dist/{client-C-I70ArH.d.ts → client-ZXcbSViH.d.ts} +2 -2
  18. package/dist/client.d.ts +6 -6
  19. package/dist/{config-C6Iw5rCX.d.ts → config-DHL2KsfD.d.ts} +1 -1
  20. package/dist/{config-DJPH3IQB.d.ts → config-DTe5EbWW.d.ts} +4 -2
  21. package/dist/direct-executor-Q7PNCGZB.mjs +17 -0
  22. package/dist/distribution/coordinator/etcd.mjs +1 -1
  23. package/dist/distribution/coordinator/in-memory.mjs +1 -1
  24. package/dist/distribution.d.ts +5 -5
  25. package/dist/distribution.mjs +22 -15
  26. package/dist/{engine-B8eRPO7m.d.ts → engine-BjPBzWkA.d.ts} +1 -1
  27. package/dist/index.browser.mjs +158 -38
  28. package/dist/index.d.ts +5 -5
  29. package/dist/index.mjs +13 -13
  30. package/dist/invalidation/filesystem.mjs +1 -1
  31. package/dist/{memory-DJEwWoCi.d.ts → memory-DW3OJ0im.d.ts} +105 -24
  32. package/dist/partial-words.mjs +5 -4
  33. package/dist/pattern.mjs +3 -2
  34. package/dist/persistence/durability/checkpoint-worker.mjs +13 -13
  35. package/dist/react.d.ts +6 -6
  36. package/dist/server.d.ts +8 -8
  37. package/dist/server.mjs +34 -11
  38. package/dist/{tasks-BVmAKYBh.d.ts → tasks-BTbwBqar.d.ts} +1 -1
  39. package/dist/{thread-W6DPKEF6.mjs → thread-YOTNJEVY.mjs} +15 -10
  40. package/dist/vector/search-worker.mjs +2 -2
  41. package/dist/workers/entry.mjs +3 -3
  42. package/package.json +8 -7
  43. package/dist/chunk-XW25X6AU.mjs +0 -614
  44. package/dist/chunk-ZKRV5M2P.mjs +0 -75
  45. package/dist/direct-executor-KFAGILJC.mjs +0 -17
@@ -1,23 +1,23 @@
1
- import { CHECKPOINT_WORKER_HEARTBEAT_MS, createDurableDirectory, writeCheckpointSegments, directoryCheckpointStore } from '../../chunk-CUZOX6CN.mjs';
2
- import '../../chunk-CTOSGRM7.mjs';
1
+ import { CHECKPOINT_WORKER_HEARTBEAT_MS, createDurableDirectory, writeCheckpointSegments, directoryCheckpointStore } from '../../chunk-HH6ALOUZ.mjs';
2
+ import '../../chunk-G7IP3UDZ.mjs';
3
3
  import '../../chunk-GCM3JFVA.mjs';
4
- import '../../chunk-LX4JERXI.mjs';
5
- import '../../chunk-BVBIQQKG.mjs';
6
- import '../../chunk-VKX2BPXD.mjs';
4
+ import '../../chunk-BT62MUM5.mjs';
5
+ import '../../chunk-DFFQOA7S.mjs';
6
+ import '../../chunk-D4EF7J3I.mjs';
7
7
  import '../../chunk-4MQ5F4IL.mjs';
8
- import '../../chunk-3DDUNI6N.mjs';
8
+ import '../../chunk-V3B24XR7.mjs';
9
9
  import '../../chunk-TGP5M5R7.mjs';
10
- import '../../chunk-PO53FV4Q.mjs';
10
+ import '../../chunk-AMGDG4ZJ.mjs';
11
11
  import '../../chunk-ZJ4CSAB2.mjs';
12
12
  import '../../chunk-2E35UM3G.mjs';
13
- import '../../chunk-XW25X6AU.mjs';
14
- import '../../chunk-ZKRV5M2P.mjs';
15
- import '../../chunk-T5ZWEWVD.mjs';
16
- import '../../chunk-I23G3IZC.mjs';
17
- import '../../chunk-Z3DQPOJQ.mjs';
13
+ import '../../chunk-4344I4MR.mjs';
14
+ import '../../chunk-PJU6EF22.mjs';
15
+ import '../../chunk-NO3ABFLE.mjs';
16
+ import '../../chunk-356UOTK2.mjs';
18
17
  import '../../chunk-KEHK2O6P.mjs';
18
+ import '../../chunk-GES7U2PM.mjs';
19
19
  import '../../chunk-U2BKYEC7.mjs';
20
- import '../../chunk-LJYTW7GT.mjs';
20
+ import '../../chunk-IBR6634K.mjs';
21
21
  import '../../chunk-POWOTUKJ.mjs';
22
22
  import '../../chunk-I64LXKO3.mjs';
23
23
 
package/dist/react.d.ts CHANGED
@@ -1,10 +1,10 @@
1
- import { N as NarsilError, L as ListParams, h as ListResult, I as IndexInfo, g as IndexStats, Q as QueryParams, j as PreflightResult, e as QueryResult, k as SuggestParams, l as SuggestResult } from './memory-DJEwWoCi.js';
2
- export { C as ClientErrorCode, a as ClientErrorCodes, E as ErrorCode, b as ErrorCodes, c as NarsilErrorCode, S as ServerErrorCode, d as ServerErrorCodes, i as isNarsilError } from './memory-DJEwWoCi.js';
3
- import { e as TaskRecord, d as TaskProgress, b as ImportResult, c as TaskListQuery, T as TaskListPage } from './tasks-BVmAKYBh.js';
4
- export { I as ImportError, f as TaskStatus, g as TaskType } from './tasks-BVmAKYBh.js';
1
+ import { N as NarsilError, L as ListParams, h as ListResult, I as IndexInfo, g as IndexStats, Q as QueryParams, j as PreflightResult, e as QueryResult, k as SuggestParams, l as SuggestResult } from './memory-DW3OJ0im.js';
2
+ export { C as ClientErrorCode, a as ClientErrorCodes, E as ErrorCode, b as ErrorCodes, c as NarsilErrorCode, S as ServerErrorCode, d as ServerErrorCodes, i as isNarsilError } from './memory-DW3OJ0im.js';
3
+ import { e as TaskRecord, d as TaskProgress, b as ImportResult, c as TaskListQuery, T as TaskListPage } from './tasks-BTbwBqar.js';
4
+ export { I as ImportError, f as TaskStatus, g as TaskType } from './tasks-BTbwBqar.js';
5
5
  import { ReactNode, ReactElement } from 'react';
6
- import { N as Narsil } from './engine-B8eRPO7m.js';
7
- import { N as NarsilClient, I as ImportSource } from './client-C-I70ArH.js';
6
+ import { N as Narsil } from './engine-BjPBzWkA.js';
7
+ import { N as NarsilClient, I as ImportSource } from './client-ZXcbSViH.js';
8
8
  import { A as AnyDocument } from './schema-DgyDijhf.js';
9
9
  import './adapters-79OIa4xm.js';
10
10
 
package/dist/server.d.ts CHANGED
@@ -1,13 +1,13 @@
1
- export { C as ClientErrorCode, a as ClientErrorCodes, E as ErrorCode, b as ErrorCodes, N as NarsilError, c as NarsilErrorCode, S as ServerErrorCode, d as ServerErrorCodes, i as isNarsilError } from './memory-DJEwWoCi.js';
2
- import { b as ServerOptions, N as NarsilServer } from './capabilities-CAMzmkAg.js';
3
- export { A as ASYNC_IMPORT_CAPABILITY, C as CorsOptions, D as DOCUMENT_EXPORT_CAPABILITY, E as ErrorEnvelope, I as INDEX_LIFECYCLE_CAPABILITY, O as OnRequestHook, R as REBUILD_ANALYSIS_CAPABILITY, c as RequestContext, d as RequestDenial, S as SERVER_CAPABILITIES, e as ServerLimits, T as TASK_CANCEL_CAPABILITY, a as TASK_FILTER_CAPABILITY } from './capabilities-CAMzmkAg.js';
4
- import { N as Narsil } from './engine-B8eRPO7m.js';
5
- import { d as TaskProgress, b as ImportResult, h as TaskStore, e as TaskRecord } from './tasks-BVmAKYBh.js';
6
- export { C as CapabilitiesResponse, a as CreateIndexEmbedding, i as CreateIndexRequest, H as HttpIndexConfig, I as ImportError, M as MemoryStatsResponse, T as TaskListPage, c as TaskListQuery, f as TaskStatus, g as TaskType } from './tasks-BVmAKYBh.js';
1
+ export { C as ClientErrorCode, a as ClientErrorCodes, E as ErrorCode, b as ErrorCodes, N as NarsilError, c as NarsilErrorCode, S as ServerErrorCode, d as ServerErrorCodes, i as isNarsilError } from './memory-DW3OJ0im.js';
2
+ import { b as ServerOptions, N as NarsilServer } from './capabilities-1lEYL3WK.js';
3
+ export { A as ASYNC_IMPORT_CAPABILITY, C as CorsOptions, D as DOCUMENT_EXPORT_CAPABILITY, E as ErrorEnvelope, I as INDEX_LIFECYCLE_CAPABILITY, O as OnRequestHook, R as REBUILD_ANALYSIS_CAPABILITY, c as RequestContext, d as RequestDenial, S as SERVER_CAPABILITIES, e as ServerLimits, T as TASK_CANCEL_CAPABILITY, a as TASK_FILTER_CAPABILITY } from './capabilities-1lEYL3WK.js';
4
+ import { N as Narsil } from './engine-BjPBzWkA.js';
5
+ import { d as TaskProgress, b as ImportResult, h as TaskStore, e as TaskRecord } from './tasks-BTbwBqar.js';
6
+ export { C as CapabilitiesResponse, a as CreateIndexEmbedding, i as CreateIndexRequest, H as HttpIndexConfig, I as ImportError, M as MemoryStatsResponse, T as TaskListPage, c as TaskListQuery, f as TaskStatus, g as TaskType } from './tasks-BTbwBqar.js';
7
7
  import './schema-DgyDijhf.js';
8
8
  import './adapters-79OIa4xm.js';
9
- import './config-C6Iw5rCX.js';
10
- import './config-DJPH3IQB.js';
9
+ import './config-DHL2KsfD.js';
10
+ import './config-DTe5EbWW.js';
11
11
  import './types-ChrVy4lH.js';
12
12
  import './types-Cb9kiY5P.js';
13
13
 
package/dist/server.mjs CHANGED
@@ -1,15 +1,15 @@
1
- import { DEFAULT_MAX_RETAINED_TASKS, loadUWebSockets, resolveCors, authorizerFor, createSharedGateBuffer, gateSlotOfWorker, createRouteRunner, corsHeaderReader, createSharedRequestGate, MAIN_THREAD_GATE_SLOT, registerServerRoutes, DEFAULT_MAX_CONCURRENT_TASKS, DEFAULT_MAX_TASK_PAGE_SIZE, DEFAULT_MAX_IMPORT_ERRORS, DEFAULT_MAX_FETCH_DOCUMENTS, DEFAULT_MAX_RESULT_WINDOW, DEFAULT_MAX_CONCURRENT_REQUESTS, DEFAULT_IMPORT_BATCH_SIZE, DEFAULT_MAX_LINE_BYTES, DEFAULT_MAX_RESTORE_BYTES, DEFAULT_MAX_IMPORT_BYTES, DEFAULT_MAX_BODY_BYTES, RUNNING_TASK_TTL_MS, DEFAULT_TASK_PAGE_SIZE, TERMINAL_TASK_TTL_MS, TASK_PROGRESS_WRITE_INTERVAL_MS, serializeNarsilError, createVersionHandler, acceptorOf, createDocumentReadHandlers, sendError, respondError, respondJson, MAX_INDEX_TOUCH_INTERVAL_MS, INDEX_TOUCH_INTERVALS_PER_IDLE_TIMEOUT, clearGateSlot, parseJson, validateCreateIndex, rejectInvalid, validateBatch, serializeBatchResult, validateDocumentBody, validateSuggest, validateQuery, parseTaskListQuery, parseJsonOptional, validateRebalance, sendStream, SNAPSHOT_ARCHIVE_CONTENT_TYPE, DOCUMENT_EXPORT_CONTENT_TYPE, IMPORT_FLUSHES_IN_FLIGHT, badRequest, SERVER_CAPABILITIES, toHttpError, RELAY_STREAM_CHUNKS_IN_FLIGHT, MIN_UNBOUNDED_SERVER_LIMIT, MIN_COUNTED_SERVER_LIMIT } from './chunk-NOZUQM7J.mjs';
2
- export { ASYNC_IMPORT_CAPABILITY, DOCUMENT_EXPORT_CAPABILITY, INDEX_LIFECYCLE_CAPABILITY, REBUILD_ANALYSIS_CAPABILITY, SERVER_CAPABILITIES, TASK_CANCEL_CAPABILITY, TASK_FILTER_CAPABILITY, httpStatusForNarsilError } from './chunk-NOZUQM7J.mjs';
3
- import { validateIndexName } from './chunk-TVFLHM7M.mjs';
4
- import { engineCoreOf, providedDocId, resolveVectorText } from './chunk-LX4JERXI.mjs';
1
+ import { DEFAULT_MAX_RETAINED_TASKS, loadUWebSockets, resolveCors, authorizerFor, createSharedGateBuffer, gateSlotOfWorker, createRouteRunner, corsHeaderReader, createSharedRequestGate, MAIN_THREAD_GATE_SLOT, registerServerRoutes, DEFAULT_MAX_CONCURRENT_TASKS, DEFAULT_MAX_TASK_PAGE_SIZE, DEFAULT_MAX_IMPORT_ERRORS, DEFAULT_MAX_FETCH_DOCUMENTS, DEFAULT_MAX_RESULT_WINDOW, DEFAULT_MAX_CONCURRENT_REQUESTS, DEFAULT_IMPORT_BATCH_SIZE, DEFAULT_MAX_LINE_BYTES, DEFAULT_MAX_RESTORE_BYTES, DEFAULT_MAX_IMPORT_BYTES, DEFAULT_MAX_BODY_BYTES, RUNNING_TASK_TTL_MS, DEFAULT_TASK_PAGE_SIZE, TERMINAL_TASK_TTL_MS, TASK_PROGRESS_WRITE_INTERVAL_MS, serializeNarsilError, createVersionHandler, acceptorOf, createDocumentReadHandlers, sendError, respondError, respondJson, MAX_INDEX_TOUCH_INTERVAL_MS, INDEX_TOUCH_INTERVALS_PER_IDLE_TIMEOUT, clearGateSlot, parseJson, validateCreateIndex, rejectInvalid, validateBatch, serializeBatchResult, validateDocumentBody, validateSuggest, validateQuery, refuseRegex, parseTaskListQuery, parseJsonOptional, validateRebalance, sendStream, SNAPSHOT_ARCHIVE_CONTENT_TYPE, DOCUMENT_EXPORT_CONTENT_TYPE, IMPORT_FLUSHES_IN_FLIGHT, badRequest, SERVER_CAPABILITIES, toHttpError, RELAY_STREAM_CHUNKS_IN_FLIGHT, MIN_UNBOUNDED_SERVER_LIMIT, MIN_COUNTED_SERVER_LIMIT } from './chunk-BT6BI4GV.mjs';
2
+ export { ASYNC_IMPORT_CAPABILITY, DOCUMENT_EXPORT_CAPABILITY, INDEX_LIFECYCLE_CAPABILITY, REBUILD_ANALYSIS_CAPABILITY, SERVER_CAPABILITIES, TASK_CANCEL_CAPABILITY, TASK_FILTER_CAPABILITY, httpStatusForNarsilError } from './chunk-BT6BI4GV.mjs';
3
+ import { validateIndexName } from './chunk-PXDY5VRT.mjs';
4
+ import { engineCoreOf, providedDocId, resolveVectorText } from './chunk-BT62MUM5.mjs';
5
5
  import { detectRuntime } from './chunk-4MQ5F4IL.mjs';
6
- import './chunk-3DDUNI6N.mjs';
6
+ import './chunk-V3B24XR7.mjs';
7
7
  import './chunk-TGP5M5R7.mjs';
8
8
  import './chunk-2E35UM3G.mjs';
9
- import './chunk-Z3DQPOJQ.mjs';
9
+ import './chunk-356UOTK2.mjs';
10
10
  import './chunk-KEHK2O6P.mjs';
11
11
  import './chunk-U2BKYEC7.mjs';
12
- import './chunk-LJYTW7GT.mjs';
12
+ import './chunk-IBR6634K.mjs';
13
13
  import { startIdleHeapCleanup } from './chunk-Y3L5MDRV.mjs';
14
14
  import { NarsilError, ErrorCodes, ServerErrorCodes, isNarsilError } from './chunk-I64LXKO3.mjs';
15
15
  export { ClientErrorCodes, ErrorCodes, NarsilError, ServerErrorCodes, isNarsilError } from './chunk-I64LXKO3.mjs';
@@ -771,7 +771,7 @@ function createIndexHandlers(deps) {
771
771
 
772
772
  // src/server/handlers/search.ts
773
773
  function createSearchHandlers(deps) {
774
- const { engine, limits } = deps;
774
+ const { engine, limits, allowRegex } = deps;
775
775
  async function search(ctx) {
776
776
  const params = parseJson(ctx);
777
777
  if (!params) return;
@@ -780,6 +780,7 @@ function createSearchHandlers(deps) {
780
780
  rejectInvalid(ctx, failure);
781
781
  return;
782
782
  }
783
+ if (refuseRegex(ctx, params.filters, allowRegex)) return;
783
784
  try {
784
785
  respondJson(ctx, await engine.query(ctx.params[0], params));
785
786
  } catch (err) {
@@ -794,6 +795,7 @@ function createSearchHandlers(deps) {
794
795
  rejectInvalid(ctx, failure);
795
796
  return;
796
797
  }
798
+ if (refuseRegex(ctx, params.filters, allowRegex)) return;
797
799
  try {
798
800
  respondJson(ctx, await engine.preflight(ctx.params[0], params));
799
801
  } catch (err) {
@@ -861,6 +863,14 @@ function assertServerLimits(limits) {
861
863
  for (const field of LIMITS_UNBOUNDED_AT_ZERO) assertLimit(field, limits[field], MIN_UNBOUNDED_SERVER_LIMIT);
862
864
  for (const field of COUNTED_LIMITS) assertLimit(field, limits[field], MIN_COUNTED_SERVER_LIMIT);
863
865
  }
866
+ function assertAllowRegex(allowRegex) {
867
+ if (allowRegex === void 0 || typeof allowRegex === "boolean") return;
868
+ throw new NarsilError(
869
+ ErrorCodes.CONFIG_INVALID,
870
+ `allowRegex must be true or false; however, this configuration sets it to ${String(allowRegex)}`,
871
+ { field: "allowRegex", value: String(allowRegex) }
872
+ );
873
+ }
864
874
 
865
875
  // src/server/request-threads/captured-response.ts
866
876
  var DEFAULT_STATUS = 200;
@@ -1159,7 +1169,8 @@ async function startRequestThreads(options) {
1159
1169
  build: options.build,
1160
1170
  authorizes: authorize !== void 0,
1161
1171
  searchHooks,
1162
- patternWorkCap: options.core.patternWorkCap
1172
+ patternWorkCap: options.core.patternWorkCap,
1173
+ allowRegex: options.allowRegex
1163
1174
  }
1164
1175
  },
1165
1176
  [channel.port1]
@@ -1530,6 +1541,7 @@ var NarsilHttpServer = class {
1530
1541
  constructor(engine, options = {}) {
1531
1542
  assertServerEngine(engine);
1532
1543
  assertServerLimits(options.limits);
1544
+ assertAllowRegex(options.allowRegex);
1533
1545
  this.host = options.host ?? "127.0.0.1";
1534
1546
  this.port = options.port ?? 9876;
1535
1547
  this.options = options;
@@ -1545,6 +1557,7 @@ var NarsilHttpServer = class {
1545
1557
  engine,
1546
1558
  tasks: new TaskRegistry(taskStore, instanceId, limits.maxConcurrentTasks),
1547
1559
  limits,
1560
+ allowRegex: options.allowRegex ?? true,
1548
1561
  isReady: () => this.ready,
1549
1562
  build: resolveBuild(options.build),
1550
1563
  cluster: options.cluster,
@@ -1602,7 +1615,7 @@ var NarsilHttpServer = class {
1602
1615
  const core = engineCoreOf(this.engine);
1603
1616
  const threadCount = core === void 0 ? 0 : core.orchestrator.requestThreadCount();
1604
1617
  const gate = createSharedGateBuffer(gateSlotOfWorker(threadCount));
1605
- const { limits, build } = this.deps;
1618
+ const { limits, build, allowRegex } = this.deps;
1606
1619
  const handlers = mainThreadHandlers(this.deps);
1607
1620
  const run = createRouteRunner({
1608
1621
  authorize,
@@ -1612,7 +1625,17 @@ var NarsilHttpServer = class {
1612
1625
  registerServerRoutes(app, run, handlers, limits, cors);
1613
1626
  if (core === void 0 || threadCount === 0 || !detectRuntime().supportsWorkerThreads) return;
1614
1627
  try {
1615
- this.threads = await startRequestThreads({ core, app, handlers, authorize, gate, limits, build, cors });
1628
+ this.threads = await startRequestThreads({
1629
+ core,
1630
+ app,
1631
+ handlers,
1632
+ authorize,
1633
+ gate,
1634
+ limits,
1635
+ allowRegex,
1636
+ build,
1637
+ cors
1638
+ });
1616
1639
  } catch (err) {
1617
1640
  console.warn("The server could not start request threads, so the main thread answers every request:", err);
1618
1641
  }
@@ -1,4 +1,4 @@
1
- import { M as MemoryStats } from './memory-DJEwWoCi.js';
1
+ import { M as MemoryStats } from './memory-DW3OJ0im.js';
2
2
 
3
3
  /** Declarative index configuration accepted over HTTP. Function-valued engine
4
4
  * options (custom tokenizer, stopWords-as-function, group reducer, embedding
@@ -1,14 +1,15 @@
1
- import { loadUWebSockets, childAppOf, createRouteRunner, corsHeaderReader, createSharedRequestGate, registerServerRoutes, sendRelayed, createDocumentReadHandlers, respondJson, SERVER_CAPABILITIES, versionReport, statusLine, sendError, serverRoutes, parseJson, validateSuggest, rejectInvalid, respondError, validateQuery } from './chunk-NOZUQM7J.mjs';
2
- import { executeListDocuments, executeSuggest, executePreflight, queryBindingOf, executeQuery } from './chunk-CTOSGRM7.mjs';
3
- import { resolveProjection, projectionKeepsField, setNestedValue } from './chunk-VKX2BPXD.mjs';
4
- import './chunk-3DDUNI6N.mjs';
1
+ import { loadUWebSockets, childAppOf, createRouteRunner, corsHeaderReader, createSharedRequestGate, registerServerRoutes, sendRelayed, createDocumentReadHandlers, respondJson, SERVER_CAPABILITIES, versionReport, statusLine, sendError, serverRoutes, parseJson, validateSuggest, rejectInvalid, respondError, validateQuery, refuseRegex } from './chunk-BT6BI4GV.mjs';
2
+ import { executeListDocuments, executeSuggest, executePreflight, queryBindingOf, executeQuery } from './chunk-G7IP3UDZ.mjs';
3
+ import { resolveProjection, projectionKeepsField, setNestedValue } from './chunk-D4EF7J3I.mjs';
4
+ import './chunk-V3B24XR7.mjs';
5
5
  import './chunk-ZJ4CSAB2.mjs';
6
6
  import './chunk-2E35UM3G.mjs';
7
- import './chunk-ZKRV5M2P.mjs';
8
- import './chunk-I23G3IZC.mjs';
9
- import { extractVectorFieldsFromSchema } from './chunk-Z3DQPOJQ.mjs';
7
+ import './chunk-4344I4MR.mjs';
8
+ import './chunk-NO3ABFLE.mjs';
9
+ import { extractVectorFieldsFromSchema } from './chunk-356UOTK2.mjs';
10
10
  import './chunk-KEHK2O6P.mjs';
11
- import './chunk-LJYTW7GT.mjs';
11
+ import './chunk-GES7U2PM.mjs';
12
+ import './chunk-IBR6634K.mjs';
12
13
  import { ServerErrorCodes, NarsilError, ErrorCodes } from './chunk-I64LXKO3.mjs';
13
14
 
14
15
  // src/server/request-threads/held-vectors.ts
@@ -359,7 +360,7 @@ function onWholeDocuments(local, handler, fallback) {
359
360
  return (ctx) => local.holdsDocumentsOf(ctx.params[0]) ? handler(ctx) : fallback(ctx);
360
361
  }
361
362
  function searchHandler(options) {
362
- const { fallback, maxResultWindow, staysOnThread, answer } = options;
363
+ const { fallback, maxResultWindow, allowRegex, staysOnThread, answer } = options;
363
364
  return async (ctx) => {
364
365
  const params = parseJson(ctx);
365
366
  if (!params) return;
@@ -368,6 +369,7 @@ function searchHandler(options) {
368
369
  rejectInvalid(ctx, failure);
369
370
  return;
370
371
  }
372
+ if (refuseRegex(ctx, params.filters, allowRegex)) return;
371
373
  if (!staysOnThread(ctx.params[0], params)) {
372
374
  await fallback(ctx);
373
375
  return;
@@ -411,7 +413,8 @@ function relayedHandlers(relay, limits) {
411
413
  return forwarded;
412
414
  }
413
415
  function threadHandlers(local, relay, settings) {
414
- const reads = createDocumentReadHandlers({ engine: local, limits: settings.limits });
416
+ const { allowRegex } = settings;
417
+ const reads = createDocumentReadHandlers({ engine: local, limits: settings.limits, allowRegex });
415
418
  const forwarded = relayedHandlers(relay, settings.limits);
416
419
  const { maxResultWindow } = settings.limits;
417
420
  return {
@@ -422,12 +425,14 @@ function threadHandlers(local, relay, settings) {
422
425
  search: searchHandler({
423
426
  fallback: forwarded.search,
424
427
  maxResultWindow,
428
+ allowRegex,
425
429
  staysOnThread: (name, params) => local.canAnswer(name, params),
426
430
  answer: (name, params) => local.query(name, params)
427
431
  }),
428
432
  preflight: searchHandler({
429
433
  fallback: forwarded.preflight,
430
434
  maxResultWindow,
435
+ allowRegex,
431
436
  staysOnThread: (name, params) => local.canCount(name, params),
432
437
  answer: (name, params) => local.preflight(name, params)
433
438
  }),
@@ -1,8 +1,8 @@
1
- import { openSharedVectorField, MAX_WORKER_COPIES, createVectorStore, osqBitsOf, createHNSWIndex, createOsqQuantizer, osqRecordBytes } from '../chunk-PO53FV4Q.mjs';
1
+ import { openSharedVectorField, MAX_WORKER_COPIES, createVectorStore, osqBitsOf, createHNSWIndex, createOsqQuantizer, osqRecordBytes } from '../chunk-AMGDG4ZJ.mjs';
2
2
  import '../chunk-ZJ4CSAB2.mjs';
3
3
  import '../chunk-2E35UM3G.mjs';
4
4
  import '../chunk-KEHK2O6P.mjs';
5
- import '../chunk-LJYTW7GT.mjs';
5
+ import '../chunk-IBR6634K.mjs';
6
6
  import '../chunk-I64LXKO3.mjs';
7
7
 
8
8
  // src/vector/worker-copy.ts
@@ -18,7 +18,7 @@ async function importBootstrapModule(moduleUrl) {
18
18
  await import(moduleUrl);
19
19
  }
20
20
  async function stopServingRequests() {
21
- const { closeRequestThread } = await import('../thread-W6DPKEF6.mjs');
21
+ const { closeRequestThread } = await import('../thread-YOTNJEVY.mjs');
22
22
  closeRequestThread();
23
23
  }
24
24
  function holdsCopies(executor) {
@@ -49,7 +49,7 @@ function createActionHandler(executor) {
49
49
  if (!holdsCopies(executor)) {
50
50
  throw new NarsilError(ErrorCodes.CONFIG_INVALID, "This executor holds no copies to answer requests from");
51
51
  }
52
- const starting = import('../thread-W6DPKEF6.mjs').then(
52
+ const starting = import('../thread-YOTNJEVY.mjs').then(
53
53
  ({ serveRequests }) => serveRequests(executor, action.settings)
54
54
  );
55
55
  serving.start = starting.then(
@@ -102,7 +102,7 @@ async function setup() {
102
102
  } catch {
103
103
  parentPort = null;
104
104
  }
105
- const { createDirectExecutor } = await import('../direct-executor-KFAGILJC.mjs');
105
+ const { createDirectExecutor } = await import('../direct-executor-Q7PNCGZB.mjs');
106
106
  const handleAction = createActionHandler(createDirectExecutor({ threadSlot }));
107
107
  if (parentPort) {
108
108
  const port = parentPort;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@delali/narsil",
3
- "version": "0.3.1-next.74",
3
+ "version": "0.3.1-next.76",
4
4
  "type": "module",
5
5
  "description": "Distributed search engine with full-text, vector, hybrid, and geosearch. One engine, embedded or on a server, with a cross-language .nrsl format.",
6
6
  "author": "Delali (https://sondelali.com)",
@@ -208,6 +208,7 @@
208
208
  "etcd3": "1.1.2",
209
209
  "fflate": "0.8.3",
210
210
  "jsdom": "28.1.0",
211
+ "re2-wasm": "1.0.2",
211
212
  "react": "19.2.4",
212
213
  "react-dom": "19.2.4",
213
214
  "selfsigned": "5.5.0",
@@ -239,11 +240,11 @@
239
240
  }
240
241
  },
241
242
  "optionalDependencies": {
242
- "@delali/narsil-native-darwin-arm64": "0.3.1-next.74",
243
- "@delali/narsil-native-darwin-x64": "0.3.1-next.74",
244
- "@delali/narsil-native-linux-arm64": "0.3.1-next.74",
245
- "@delali/narsil-native-linux-x64": "0.3.1-next.74",
246
- "@delali/narsil-native-win32-arm64": "0.3.1-next.74",
247
- "@delali/narsil-native-win32-x64": "0.3.1-next.74"
243
+ "@delali/narsil-native-darwin-arm64": "0.3.1-next.76",
244
+ "@delali/narsil-native-darwin-x64": "0.3.1-next.76",
245
+ "@delali/narsil-native-linux-arm64": "0.3.1-next.76",
246
+ "@delali/narsil-native-linux-x64": "0.3.1-next.76",
247
+ "@delali/narsil-native-win32-arm64": "0.3.1-next.76",
248
+ "@delali/narsil-native-win32-x64": "0.3.1-next.76"
248
249
  }
249
250
  }