@voltro/plugin-search 0.54.0 → 0.56.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,12 +1,13 @@
1
- import { a as e, i as t, n, r } from "./rpc-DaYt-dP6.js";
2
- import { Cause as i, Chunk as a, Data as o, Duration as s, Effect as c, Exit as l, Option as u, Schedule as d, Stream as f } from "effect";
3
- import { and as p, count as m, eq as h, id as g, integer as _, streamTable as ee, table as v, text as y, timestamp as b } from "@voltro/database";
4
- import { definePlugin as te, pluginInstanceName as ne } from "@voltro/protocol";
1
+ import { a as e, i as t, o as n, r, t as i } from "./rpc-CpryHBcM.js";
2
+ import { Cause as a, Chunk as o, Data as s, Duration as c, Effect as l, Exit as u, Option as d, Schedule as f, Stream as p } from "effect";
3
+ import { and as m, count as h, eq as g, id as _, integer as v, streamTable as y, table as b, text as x, timestamp as S } from "@voltro/database";
4
+ import { definePlugin as ee, pluginInstanceName as te } from "@voltro/protocol";
5
+ import { replicaId as ne } from "@voltro/protocol/identity";
5
6
  //#region src/sanitize.ts
6
- var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
7
+ var C = /^[A-Za-z_][A-Za-z0-9_.]*$/, w = (e) => C.test(e), re = (e, t) => {
7
8
  let n = t ? new Set(t) : void 0;
8
9
  for (let [t, r] of e) {
9
- if (!S(r)) return {
10
+ if (!w(r)) return {
10
11
  field: r,
11
12
  where: t,
12
13
  reason: "not-an-identifier"
@@ -17,7 +18,7 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
17
18
  reason: "not-queryable"
18
19
  };
19
20
  }
20
- }, C = {
21
+ }, T = {
21
22
  typesense: [
22
23
  "per_page",
23
24
  "page",
@@ -71,7 +72,7 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
71
72
  "highlightPreTag",
72
73
  "highlightPostTag"
73
74
  ]
74
- }, ie = {
75
+ }, E = {
75
76
  typesense: [
76
77
  "filter_by",
77
78
  "q",
@@ -108,20 +109,20 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
108
109
  "aroundLatLng",
109
110
  "insideBoundingBox"
110
111
  ]
111
- }, w = (e, t, n) => {
112
+ }, D = (e, t, n) => {
112
113
  if (!t) return {
113
114
  params: {},
114
115
  appAllowed: {},
115
116
  dropped: []
116
117
  };
117
- let r = new Set(ie[e]), i = new Set(C[e]), a = new Set(n ?? []), o = {}, s = {}, c = [];
118
+ let r = new Set(E[e]), i = new Set(T[e]), a = new Set(n ?? []), o = {}, s = {}, c = [];
118
119
  for (let [e, n] of Object.entries(t)) r.has(e) ? c.push(e) : i.has(e) ? o[e] = n : a.has(e) ? s[e] = n : c.push(e);
119
120
  return {
120
121
  params: o,
121
122
  appAllowed: s,
122
123
  dropped: c
123
124
  };
124
- }, T = (e) => C[e], E = class extends o.TaggedError("SearchBackendError") {}, D = (e) => Array.isArray(e) ? e : [e], O = (e, t, n) => {
125
+ }, O = (e) => T[e], k = class extends s.TaggedError("SearchBackendError") {}, A = (e) => Array.isArray(e) ? e : [e], j = (e, t, n) => {
125
126
  if (Math.abs(e.length - t.length) > n) return !1;
126
127
  if (e === t) return !0;
127
128
  let r = t.length, i = Array.from({ length: r + 1 }, (e, t) => t);
@@ -137,7 +138,7 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
137
138
  i = o;
138
139
  }
139
140
  return (i[r] ?? Infinity) <= n;
140
- }, k = (e) => e.length <= 4 ? 1 : 2, A = () => {
141
+ }, M = (e) => e.length <= 4 ? 1 : 2, N = () => {
141
142
  let e = /* @__PURE__ */ new Map(), t = (t) => {
142
143
  let n = e.get(t);
143
144
  return n || (n = /* @__PURE__ */ new Map(), e.set(t, n)), n;
@@ -146,13 +147,13 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
146
147
  switch (t.op) {
147
148
  case "eq": return String(n) === String(t.value);
148
149
  case "neq": return String(n) !== String(t.value);
149
- case "in": return D(t.value).some((e) => String(n) === String(e));
150
- case "nin": return D(t.value).every((e) => String(n) !== String(e));
150
+ case "in": return A(t.value).some((e) => String(n) === String(e));
151
+ case "nin": return A(t.value).every((e) => String(n) !== String(e));
151
152
  case "gt":
152
153
  case "gte":
153
154
  case "lt":
154
155
  case "lte": {
155
- let [e, r] = [j(n), j(t.value)];
156
+ let [e, r] = [P(n), P(t.value)];
156
157
  return e === void 0 || r === void 0 ? !1 : t.op === "gt" ? e > r : t.op === "gte" ? e >= r : t.op === "lt" ? e < r : e <= r;
157
158
  }
158
159
  }
@@ -162,8 +163,8 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
162
163
  let e = r.toLowerCase();
163
164
  if (e.includes(t)) return !0;
164
165
  if (n !== void 0 && n !== 0) {
165
- let r = n === "auto" ? k(t) : n;
166
- for (let n of e.split(/\s+/)) if (O(n, t, r)) return !0;
166
+ let r = n === "auto" ? M(t) : n;
167
+ for (let n of e.split(/\s+/)) if (j(n, t, r)) return !0;
167
168
  }
168
169
  }
169
170
  return !1;
@@ -207,7 +208,7 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
207
208
  };
208
209
  }
209
210
  };
210
- }, j = (e) => {
211
+ }, P = (e) => {
211
212
  if (typeof e == "number") return e;
212
213
  if (typeof e == "boolean") return +!!e;
213
214
  if (typeof e == "string") {
@@ -216,19 +217,19 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
216
217
  let n = Date.parse(e);
217
218
  return Number.isNaN(n) ? void 0 : n;
218
219
  }
219
- }, M = async (e, t, n) => {
220
+ }, F = async (e, t, n) => {
220
221
  try {
221
222
  return await n();
222
223
  } catch {
223
- throw new E({
224
+ throw new k({
224
225
  engine: t,
225
226
  op: "query",
226
227
  message: `the '${t}' search backend requires the '${e}' optional dependency. Install it to enable it (e.g. \`npm i ${e}\`).`,
227
228
  transient: !1
228
229
  });
229
230
  }
230
- }, N = (e, t) => (n) => {
231
- let { params: r, appAllowed: i, dropped: a } = w(e, n, t.allowEngineParams);
231
+ }, I = (e, t) => (n) => {
232
+ let { params: r, appAllowed: i, dropped: a } = D(e, n, t.allowEngineParams);
232
233
  return a.length > 0 && t.onWarn?.("search dropped disallowed engineParams", {
233
234
  engine: e,
234
235
  keys: a
@@ -236,16 +237,16 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
236
237
  before: r,
237
238
  after: i
238
239
  };
239
- }, P = (e, t) => {
240
- if (!S(t)) throw new E({
240
+ }, L = (e, t) => {
241
+ if (!w(t)) throw new k({
241
242
  engine: e,
242
243
  op: "query",
243
244
  message: `filter field "${t}" is not a plain field path (^[A-Za-z_][A-Za-z0-9_.]*$)`,
244
245
  transient: !1
245
246
  });
246
247
  return t;
247
- }, ae = (e) => {
248
- let t = (e) => JSON.stringify(e), n = P("typesense", e.field);
248
+ }, ie = (e) => {
249
+ let t = (e) => JSON.stringify(e), n = L("typesense", e.field);
249
250
  switch (e.op) {
250
251
  case "eq": return `${n}:=${t(e.value)}`;
251
252
  case "neq": return `${n}:!=${t(e.value)}`;
@@ -253,21 +254,21 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
253
254
  case "gte": return `${n}:>=${t(e.value)}`;
254
255
  case "lt": return `${n}:<${t(e.value)}`;
255
256
  case "lte": return `${n}:<=${t(e.value)}`;
256
- case "in": return `${n}:[${D(e.value).map(t).join(",")}]`;
257
- case "nin": return `${n}:!=[${D(e.value).map(t).join(",")}]`;
257
+ case "in": return `${n}:[${A(e.value).map(t).join(",")}]`;
258
+ case "nin": return `${n}:!=[${A(e.value).map(t).join(",")}]`;
258
259
  }
259
- }, oe = (e, t = {}) => {
260
- let n = N("typesense", t), r, i = async () => (r ||= M("typesense", "typesense", () => import("typesense")).then((t) => {
260
+ }, ae = (e, t = {}) => {
261
+ let n = I("typesense", t), r, i = async () => (r ||= F("typesense", "typesense", () => import("typesense")).then((t) => {
261
262
  let n = t.Client;
262
263
  return new n({
263
264
  nodes: [{ url: e.url ?? e.host ?? "http://localhost:8108" }],
264
265
  apiKey: e.apiKey
265
266
  });
266
- }), r), a = (e) => e && e.length > 0 ? e.map(ae).join(" && ") : void 0, o = async (e, t) => {
267
+ }), r), a = (e) => e && e.length > 0 ? e.map(ie).join(" && ") : void 0, o = async (e, t) => {
267
268
  try {
268
269
  return await t();
269
270
  } catch (t) {
270
- throw t instanceof E ? t : new E({
271
+ throw t instanceof k ? t : new k({
271
272
  engine: "typesense",
272
273
  op: e,
273
274
  message: String(t?.message ?? t),
@@ -299,10 +300,10 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
299
300
  ...d !== void 0 && d !== "auto" ? { num_typos: Math.min(2, Math.max(0, d)) } : {},
300
301
  ...p.after
301
302
  };
302
- return se(await o.collections(e).documents().search(m));
303
+ return oe(await o.collections(e).documents().search(m));
303
304
  })
304
305
  };
305
- }, se = (e) => {
306
+ }, oe = (e) => {
306
307
  let t = (e.hits ?? []).map((e) => {
307
308
  let t = {};
308
309
  for (let n of e.highlights ?? []) {
@@ -319,8 +320,8 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
319
320
  hits: t,
320
321
  facets: n
321
322
  };
322
- }, ce = (e) => {
323
- let t = (e) => JSON.stringify(e), n = P("meilisearch", e.field);
323
+ }, se = (e) => {
324
+ let t = (e) => JSON.stringify(e), n = L("meilisearch", e.field);
324
325
  switch (e.op) {
325
326
  case "eq": return `${n} = ${t(e.value)}`;
326
327
  case "neq": return `${n} != ${t(e.value)}`;
@@ -328,18 +329,18 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
328
329
  case "gte": return `${n} >= ${t(e.value)}`;
329
330
  case "lt": return `${n} < ${t(e.value)}`;
330
331
  case "lte": return `${n} <= ${t(e.value)}`;
331
- case "in": return `${n} IN [${D(e.value).map(t).join(", ")}]`;
332
- case "nin": return `${n} NOT IN [${D(e.value).map(t).join(", ")}]`;
332
+ case "in": return `${n} IN [${A(e.value).map(t).join(", ")}]`;
333
+ case "nin": return `${n} NOT IN [${A(e.value).map(t).join(", ")}]`;
333
334
  }
334
- }, F = (e, t = {}) => {
335
- let n = N("meilisearch", t), r, i = async () => (r ||= M("meilisearch", "meilisearch", () => import("meilisearch")).then((t) => new t.MeiliSearch({
335
+ }, ce = (e, t = {}) => {
336
+ let n = I("meilisearch", t), r, i = async () => (r ||= F("meilisearch", "meilisearch", () => import("meilisearch")).then((t) => new t.MeiliSearch({
336
337
  host: e.host ?? e.url ?? "http://localhost:7700",
337
338
  apiKey: e.apiKey
338
- })), r), a = (e) => e && e.length > 0 ? e.map(ce) : void 0, o = async (e, t) => {
339
+ })), r), a = (e) => e && e.length > 0 ? e.map(se) : void 0, o = async (e, t) => {
339
340
  try {
340
341
  return await t();
341
342
  } catch (t) {
342
- throw t instanceof E ? t : new E({
343
+ throw t instanceof k ? t : new k({
343
344
  engine: "meilisearch",
344
345
  op: e,
345
346
  message: String(t?.message ?? t),
@@ -391,7 +392,7 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
391
392
  facets: e.facetDistribution ?? {}
392
393
  }), ue = (e) => String(e).replace(/^-/, "\\-"), de = (e, t) => {
393
394
  let n = typeof t == "boolean" ? +!!t : Number(t);
394
- if (!Number.isFinite(n)) throw new E({
395
+ if (!Number.isFinite(n)) throw new k({
395
396
  engine: "algolia",
396
397
  op: "query",
397
398
  message: `range filter on "${e}" needs a numeric value (got ${JSON.stringify(t)})`,
@@ -401,7 +402,7 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
401
402
  }, fe = (e) => {
402
403
  let t = [], n = [];
403
404
  for (let r of e ?? []) {
404
- let e = P("algolia", r.field), i = (e) => ue(e), a = (t) => de(e, t);
405
+ let e = L("algolia", r.field), i = (e) => ue(e), a = (t) => de(e, t);
405
406
  switch (r.op) {
406
407
  case "eq":
407
408
  t.push(`${e}:${i(r.value)}`);
@@ -410,10 +411,10 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
410
411
  t.push(`${e}:-${i(r.value)}`);
411
412
  break;
412
413
  case "in":
413
- t.push(D(r.value).map((t) => `${e}:${i(t)}`));
414
+ t.push(A(r.value).map((t) => `${e}:${i(t)}`));
414
415
  break;
415
416
  case "nin":
416
- for (let n of D(r.value)) t.push(`${e}:-${i(n)}`);
417
+ for (let n of A(r.value)) t.push(`${e}:-${i(n)}`);
417
418
  break;
418
419
  case "gt":
419
420
  n.push(`${e} > ${a(r.value)}`);
@@ -431,12 +432,12 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
431
432
  facetFilters: t,
432
433
  numericFilters: n
433
434
  };
434
- }, I = (e, t = {}) => {
435
- let n = N("algolia", t), r, i = async () => (r ||= M("algoliasearch", "algolia", () => import("algoliasearch")).then((t) => t.algoliasearch(e.appId ?? "", e.apiKey)), r), a = async (e, t) => {
435
+ }, pe = (e, t = {}) => {
436
+ let n = I("algolia", t), r, i = async () => (r ||= F("algoliasearch", "algolia", () => import("algoliasearch")).then((t) => t.algoliasearch(e.appId ?? "", e.apiKey)), r), a = async (e, t) => {
436
437
  try {
437
438
  return await t();
438
439
  } catch (t) {
439
- throw t instanceof E ? t : new E({
440
+ throw t instanceof k ? t : new k({
440
441
  engine: "algolia",
441
442
  op: e,
442
443
  message: String(t?.message ?? t),
@@ -479,13 +480,13 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
479
480
  ...u === 0 ? { typoTolerance: !1 } : {},
480
481
  ...m.after
481
482
  };
482
- return pe(await (await i()).searchSingleIndex({
483
+ return me(await (await i()).searchSingleIndex({
483
484
  indexName: e,
484
485
  searchParams: h
485
486
  }), l);
486
487
  })
487
488
  };
488
- }, pe = (e, t) => ({
489
+ }, me = (e, t) => ({
489
490
  hits: e.hits.map((e) => {
490
491
  let { _highlightResult: n, ...r } = e;
491
492
  if (t && n) {
@@ -499,25 +500,25 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
499
500
  return { doc: r };
500
501
  }),
501
502
  facets: e.facets ?? {}
502
- }), L = "_voltro_search_stats", R = () => ({
503
+ }), R = "_voltro_search_stats", he = () => ({
503
504
  synced: 0,
504
505
  removed: 0,
505
506
  dropped: 0,
506
507
  lastReindexAt: null,
507
508
  lastReindexCount: 0
508
- }), z = v(L, {
509
- id: g({ prefix: "sstat" }),
510
- indexName: y().maxLength(191),
511
- replicaId: y().maxLength(191),
512
- synced: _().default(0),
513
- removed: _().default(0),
514
- dropped: _().default(0),
515
- scope: y().maxLength(8).default("local"),
516
- lastReindexAt: b().nullable(),
517
- lastReindexCount: _().default(0),
518
- updatedAt: b()
519
- }).unique("bySearchStatsIndexReplica", ["indexName", "replicaId"]).index("bySearchStatsIndex", ["indexName"]), B = () => [z], V = () => {
520
- let e = /* @__PURE__ */ new Map(), t = (t) => e.get(t) ?? R();
509
+ }), ge = b(R, {
510
+ id: _({ prefix: "sstat" }),
511
+ indexName: x().maxLength(191),
512
+ replicaId: x().maxLength(191),
513
+ synced: v().default(0),
514
+ removed: v().default(0),
515
+ dropped: v().default(0),
516
+ scope: x().maxLength(8).default("local"),
517
+ lastReindexAt: S().nullable(),
518
+ lastReindexCount: v().default(0),
519
+ updatedAt: S()
520
+ }).unique("bySearchStatsIndexReplica", ["indexName", "replicaId"]).index("bySearchStatsIndex", ["indexName"]), z = () => [ge], B = () => {
521
+ let e = /* @__PURE__ */ new Map(), t = (t) => e.get(t) ?? he();
521
522
  return {
522
523
  bump: async (n, r) => {
523
524
  let i = t(n);
@@ -552,19 +553,19 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
552
553
  },
553
554
  get: async (e) => t(e)
554
555
  };
555
- }, H = (e) => ({
556
- table: L,
556
+ }, V = (e) => ({
557
+ table: R,
557
558
  predicate: e,
558
559
  order: [],
559
560
  take: void 0,
560
561
  skip: void 0,
561
562
  projection: void 0
562
- }), me = () => `sstat_${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`, he = () => process.env.VOLTRO_REPLICA_ID ?? process.env.HOSTNAME ?? process.env.POD_NAME ?? `pid_${process.pid}_${Math.random().toString(36).slice(2, 8)}`, U = 32, W = (e, t = he()) => {
563
- let n = async (n) => (await e.query(H(p(h("indexName", n), h("replicaId", t)))))[0] ?? null, r = async (e) => {
563
+ }), _e = () => `sstat_${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`, ve = () => ne(), H = 32, U = (e, t = ve()) => {
564
+ let n = async (n) => (await e.query(V(m(g("indexName", n), g("replicaId", t)))))[0] ?? null, r = async (e) => {
564
565
  try {
565
566
  return await e();
566
567
  } catch (e) {
567
- throw e instanceof E ? e : new E({
568
+ throw e instanceof k ? e : new k({
568
569
  engine: "stats",
569
570
  op: "upsert",
570
571
  message: String(e?.message ?? e),
@@ -572,7 +573,7 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
572
573
  });
573
574
  }
574
575
  }, i = (i, a, o, s) => r(async () => {
575
- for (let r = 0; r < U; r++) {
576
+ for (let r = 0; r < H; r++) {
576
577
  r > 0 && await new Promise((e) => setTimeout(e, r));
577
578
  let c = await n(i);
578
579
  if (c) {
@@ -587,9 +588,9 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
587
588
  ...o(i),
588
589
  ...a ? { scope: a } : {},
589
590
  updatedAt: /* @__PURE__ */ new Date()
590
- }, { where: p(h("id", String(c.id)), h("synced", t), h("removed", n), h("dropped", r)) }) === 1) return;
591
+ }, { where: m(g("id", String(c.id)), g("synced", t), g("removed", n), g("dropped", r)) }) === 1) return;
591
592
  } else {
592
- let n = me(), r = await e.insertIgnore(L, {
593
+ let n = _e(), r = await e.insertIgnore(R, {
593
594
  id: n,
594
595
  indexName: i,
595
596
  replicaId: t,
@@ -605,10 +606,10 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
605
606
  if (String(r.id) === n) return;
606
607
  }
607
608
  }
608
- throw new E({
609
+ throw new k({
609
610
  engine: "stats",
610
611
  op: "upsert",
611
- message: `search stats: contention on (${i}, ${t}) exceeded ${U} attempts`,
612
+ message: `search stats: contention on (${i}, ${t}) exceeded ${H} attempts`,
612
613
  transient: !0
613
614
  });
614
615
  });
@@ -633,7 +634,7 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
633
634
  lastReindexCount: t
634
635
  }),
635
636
  get: (t) => r(async () => {
636
- let n = await e.query(H(h("indexName", t))), r = n.some((e) => e.scope === "fleet"), i = (e) => {
637
+ let n = await e.query(V(g("indexName", t))), r = n.some((e) => e.scope === "fleet"), i = (e) => {
637
638
  let t = 0;
638
639
  for (let i of n) {
639
640
  let n = Number(i[e] ?? 0);
@@ -646,7 +647,7 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
646
647
  t && (a === null || t > a) && (a = t, o = Number(e.lastReindexCount ?? 0));
647
648
  }
648
649
  return {
649
- ...R(),
650
+ ...he(),
650
651
  synced: i("synced"),
651
652
  removed: i("removed"),
652
653
  dropped: i("dropped"),
@@ -655,7 +656,7 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
655
656
  };
656
657
  })
657
658
  };
658
- }, G = (e) => {
659
+ }, W = (e) => {
659
660
  let t = /* @__PURE__ */ new Map(), n = 0, r = !1, i = async () => {
660
661
  if (t.size === 0) return;
661
662
  let r = t;
@@ -687,12 +688,12 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
687
688
  },
688
689
  pending: () => n
689
690
  };
690
- }, K = (e) => (t, n, r) => e().add(t, n, r), q = (e) => e === void 0 || e === "memory" ? "memory" : typeof e.query == "function" ? e.engineKind === "memory" ? "memory" : "custom" : "vendor", ge = class extends Error {
691
+ }, G = (e) => (t, n, r) => e().add(t, n, r), K = (e) => e === void 0 || e === "memory" ? "memory" : typeof e.query == "function" ? e.engineKind === "memory" ? "memory" : "custom" : "vendor", q = class extends Error {
691
692
  _tag = "SearchBackendNotDurable";
692
693
  constructor(e) {
693
694
  super(e), this.name = "SearchBackendNotDurable";
694
695
  }
695
- }, _e = [
696
+ }, ye = [
696
697
  "plugin-search refuses to boot in production on the in-memory backend.",
697
698
  "",
698
699
  "The memory index lives in THIS process's heap. Two consequences, both silent:",
@@ -710,36 +711,36 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
710
711
  " searchPlugin({ singleProcessMemoryIndex: true, indexes })",
711
712
  "That is a claim about your topology, not a mute switch: if a second replica",
712
713
  "ever announces itself, the plugin logs that the claim was contradicted."
713
- ].join("\n"), ve = [
714
+ ].join("\n"), be = [
714
715
  "plugin-search is running the in-memory backend in production under",
715
716
  "`singleProcessMemoryIndex: true`. Holding you to the two conditions that makes true:",
716
717
  "exactly ONE process serves search, and it re-seeds every index at startup",
717
718
  "(`backfillIndex`) — the index is empty after each restart until it does."
718
- ].join(" "), ye = (e) => e.backendKind !== "memory" || !e.production ? { level: "quiet" } : e.singleProcessDeclared ? {
719
+ ].join(" "), J = (e) => e.backendKind !== "memory" || !e.production ? { level: "quiet" } : e.singleProcessDeclared ? {
719
720
  level: "note",
720
- message: ve
721
+ message: be
721
722
  } : {
722
723
  level: "refuse",
723
- message: _e
724
- }, be = (e, t) => t ? `search: replica "${e}" joined, but this app declared \`singleProcessMemoryIndex: true\`. That declaration is now false: each replica has its own in-memory index, so search results depend on which one serves the request. Configure a durable backend (typesense / meilisearch / algolia) or run one process.` : `search: replica "${e}" joined while search is served from an in-memory index. Each replica indexes only its OWN writes, so results depend on which replica answers. Configure a durable backend (typesense / meilisearch / algolia) before relying on these results.`, J = "_voltro_search_drift", xe = v(J, {
725
- id: g({ prefix: "sdrft" }),
726
- indexName: y().maxLength(191),
727
- sourceTable: y().maxLength(191),
728
- rowId: y().maxLength(191),
729
- docId: y().maxLength(191),
730
- op: y().maxLength(16),
731
- attempts: _().default(0),
732
- lastError: y().maxLength(1e3),
733
- firstFailedAt: b(),
734
- lastFailedAt: b()
735
- }).unique("bySearchDriftIndexRow", ["indexName", "rowId"]).index("bySearchDriftIndex", ["indexName"]), Se = (e, t) => ({
724
+ message: ye
725
+ }, xe = (e, t) => t ? `search: replica "${e}" joined, but this app declared \`singleProcessMemoryIndex: true\`. That declaration is now false: each replica has its own in-memory index, so search results depend on which one serves the request. Configure a durable backend (typesense / meilisearch / algolia) or run one process.` : `search: replica "${e}" joined while search is served from an in-memory index. Each replica indexes only its OWN writes, so results depend on which replica answers. Configure a durable backend (typesense / meilisearch / algolia) before relying on these results.`, Y = "_voltro_search_drift", Se = b(Y, {
726
+ id: _({ prefix: "sdrft" }),
727
+ indexName: x().maxLength(191),
728
+ sourceTable: x().maxLength(191),
729
+ rowId: x().maxLength(191),
730
+ docId: x().maxLength(191),
731
+ op: x().maxLength(16),
732
+ attempts: v().default(0),
733
+ lastError: x().maxLength(1e3),
734
+ firstFailedAt: S(),
735
+ lastFailedAt: S()
736
+ }).unique("bySearchDriftIndexRow", ["indexName", "rowId"]).index("bySearchDriftIndex", ["indexName"]), Ce = (e, t) => ({
736
737
  table: e,
737
- predicate: h("id", t),
738
+ predicate: g("id", t),
738
739
  order: [],
739
740
  take: 1,
740
741
  skip: void 0,
741
742
  projection: void 0
742
- }), Y = (e) => e ? new Date(e).toISOString() : (/* @__PURE__ */ new Date(0)).toISOString(), Ce = (e) => ({
743
+ }), X = (e) => e ? new Date(e).toISOString() : (/* @__PURE__ */ new Date(0)).toISOString(), we = (e) => ({
743
744
  indexName: String(e.indexName),
744
745
  sourceTable: String(e.sourceTable),
745
746
  rowId: String(e.rowId),
@@ -747,9 +748,9 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
747
748
  op: e.op === "remove" ? "remove" : "upsert",
748
749
  attempts: Number(e.attempts ?? 0),
749
750
  lastError: String(e.lastError ?? ""),
750
- firstFailedAt: Y(e.firstFailedAt),
751
- lastFailedAt: Y(e.lastFailedAt)
752
- }), we = () => {
751
+ firstFailedAt: X(e.firstFailedAt),
752
+ lastFailedAt: X(e.lastFailedAt)
753
+ }), Te = () => {
753
754
  let e = /* @__PURE__ */ new Map(), t = (e, t) => `${e}\u0000${t}`;
754
755
  return {
755
756
  record: async (n) => {
@@ -779,8 +780,8 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
779
780
  e.delete(t(n, r));
780
781
  }
781
782
  };
782
- }, Te = () => `sdrft_${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`, X = (e, t) => ({
783
- table: J,
783
+ }, Ee = () => `sdrft_${Math.random().toString(36).slice(2)}${Date.now().toString(36)}`, Z = (e, t) => ({
784
+ table: Y,
784
785
  predicate: e,
785
786
  order: [{
786
787
  column: "firstFailedAt",
@@ -789,9 +790,9 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
789
790
  take: t,
790
791
  skip: void 0,
791
792
  projection: void 0
792
- }), Ee = (e) => ({
793
+ }), De = (e) => ({
793
794
  record: async (t) => {
794
- let n = /* @__PURE__ */ new Date(), r = Te(), i = await e.insertIgnore(J, {
795
+ let n = /* @__PURE__ */ new Date(), r = Ee(), i = await e.insertIgnore(Y, {
795
796
  id: r,
796
797
  indexName: t.indexName,
797
798
  sourceTable: t.sourceTable,
@@ -803,27 +804,27 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
803
804
  firstFailedAt: n,
804
805
  lastFailedAt: n
805
806
  }, { conflictColumns: ["indexName", "rowId"] });
806
- String(i.id) !== r && await e.updateMany(J, {
807
+ String(i.id) !== r && await e.updateMany(Y, {
807
808
  attempts: Number(i.attempts ?? 0) + 1,
808
809
  op: t.op,
809
810
  docId: t.docId,
810
811
  lastError: t.error.slice(0, 1e3),
811
812
  lastFailedAt: n
812
- }, { where: h("id", String(i.id)) });
813
+ }, { where: g("id", String(i.id)) });
813
814
  },
814
- list: async (t) => (await e.query(X(void 0, t))).map(Ce),
815
+ list: async (t) => (await e.query(Z(void 0, t))).map(we),
815
816
  summary: async (t) => {
816
817
  let n = (await e.query({
817
- ...X(h("indexName", t), void 0),
818
+ ...Z(g("indexName", t), void 0),
818
819
  order: [],
819
- aggregations: [m("n")]
820
+ aggregations: [h("n")]
820
821
  }))[0], r = Number(n?.n ?? n?.count ?? 0);
821
822
  if (r === 0) return {
822
823
  pending: 0,
823
824
  lastFailedAt: null
824
825
  };
825
826
  let i = await e.query({
826
- ...X(h("indexName", t), 1),
827
+ ...Z(g("indexName", t), 1),
827
828
  order: [{
828
829
  column: "lastFailedAt",
829
830
  direction: "desc"
@@ -831,21 +832,21 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
831
832
  });
832
833
  return {
833
834
  pending: r,
834
- lastFailedAt: i[0] ? Y(i[0].lastFailedAt) : null
835
+ lastFailedAt: i[0] ? X(i[0].lastFailedAt) : null
835
836
  };
836
837
  },
837
838
  clear: async (t, n) => {
838
- await e.deleteMany(J, { where: p(h("indexName", t), h("rowId", n)) });
839
+ await e.deleteMany(Y, { where: m(g("indexName", t), g("rowId", n)) });
839
840
  }
840
- }), De = () => [xe], Oe = (e, t) => {
841
- if (e === void 0 || e === "memory") return A();
841
+ }), Oe = () => [Se], ke = (e, t) => {
842
+ if (e === void 0 || e === "memory") return N();
842
843
  if (typeof e.query == "function") return e;
843
844
  let n = e;
844
- return n.engine === "typesense" ? oe(n, t) : n.engine === "meilisearch" ? F(n, t) : n.engine === "algolia" ? I(n, t) : A();
845
- }, ke = async (e, t, n) => {
845
+ return n.engine === "typesense" ? ae(n, t) : n.engine === "meilisearch" ? ce(n, t) : n.engine === "algolia" ? pe(n, t) : N();
846
+ }, Ae = async (e, t, n) => {
846
847
  let r = n.map((e) => t.map(e));
847
848
  return r.length > 0 && await e.upsert(t.index, r), r.length;
848
- }, Z = async (e, t, n) => {
849
+ }, je = async (e, t, n) => {
849
850
  if (n.op === "delete") {
850
851
  let r = n.old?.id;
851
852
  typeof r == "string" && await e.remove(t.index, [r]);
@@ -861,7 +862,7 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
861
862
  reindexBatchSize: 1e3,
862
863
  statsFlushIntervalMs: 5e3,
863
864
  statsFlushMaxBuffered: 1e3
864
- }, Ae = (e) => ({
865
+ }, Me = (e) => ({
865
866
  retries: Math.max(0, e?.retries ?? Q.retries),
866
867
  retryBaseDelayMs: Math.max(1, e?.retryBaseDelayMs ?? Q.retryBaseDelayMs),
867
868
  retryMaxDelayMs: Math.max(1, e?.retryMaxDelayMs ?? Q.retryMaxDelayMs),
@@ -870,12 +871,12 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
870
871
  reindexBatchSize: Math.max(1, e?.reindexBatchSize ?? Q.reindexBatchSize),
871
872
  statsFlushIntervalMs: Math.max(0, e?.statsFlushIntervalMs ?? Q.statsFlushIntervalMs),
872
873
  statsFlushMaxBuffered: Math.max(1, e?.statsFlushMaxBuffered ?? Q.statsFlushMaxBuffered)
873
- }), je = (e) => e instanceof E ? e : new E({
874
+ }), Ne = (e) => e instanceof k ? e : new k({
874
875
  engine: "unknown",
875
876
  op: "upsert",
876
877
  message: String(e?.message ?? e),
877
878
  transient: !1
878
- }), Me = (e) => d.exponential(s.millis(e.retryBaseDelayMs), 2).pipe(d.either(d.spaced(s.millis(e.retryMaxDelayMs))), d.intersect(d.recurs(e.retries)), d.whileInput((e) => e.transient)), Ne = (e) => {
879
+ }), Pe = (e) => f.exponential(c.millis(e.retryBaseDelayMs), 2).pipe(f.either(f.spaced(c.millis(e.retryMaxDelayMs))), f.intersect(f.recurs(e.retries)), f.whileInput((e) => e.transient)), Fe = (e) => {
879
880
  if (!e || e === "memory" || typeof e.query == "function") return;
880
881
  let t = e;
881
882
  try {
@@ -883,80 +884,80 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
883
884
  } catch {
884
885
  return;
885
886
  }
886
- }, Pe = (e, t, n) => {
887
+ }, $ = (e, t, n) => {
887
888
  let r = n ?? [];
888
889
  return e ? t == null ? null : [...r, {
889
890
  field: e,
890
891
  op: "eq",
891
892
  value: t
892
893
  }] : r;
893
- }, Fe = (e) => [
894
+ }, Ie = (e) => [
894
895
  ...(e.filters ?? []).map((e) => ["filter", e.field]),
895
896
  ...(e.facets ?? []).map((e) => ["facet", e]),
896
897
  ...(e.highlight?.fields ?? []).map((e) => ["highlight", e])
897
- ], $ = "@voltro/plugin-search", Ie = (o) => {
898
- let s = ne({
899
- base: $,
900
- alias: o.alias,
901
- instance: o.name
902
- }), d = () => void 0, p = () => void 0, m = Ae(o.sync), h = Me(m), g = Oe(o.backend, {
903
- ...o.allowedEngineParams ? { allowEngineParams: o.allowedEngineParams } : {},
904
- onWarn: (e, t) => d(e, t)
898
+ ], Le = i, Re = (i) => {
899
+ let s = te({
900
+ base: Le,
901
+ alias: i.alias,
902
+ instance: i.name
903
+ }), c = () => void 0, f = () => void 0, m = Me(i.sync), h = Pe(m), g = ke(i.backend, {
904
+ ...i.allowedEngineParams ? { allowEngineParams: i.allowedEngineParams } : {},
905
+ onWarn: (e, t) => c(e, t)
905
906
  }), _ = /* @__PURE__ */ new Map();
906
- for (let e of Object.values(o.indexes)) _.set(e.index, e);
907
- let v = q(o.backend), y = o.singleProcessMemoryIndex === !0, b = !1, x, S = {
908
- ...n,
907
+ for (let e of Object.values(i.indexes)) _.set(e.index, e);
908
+ let v = K(i.backend), b = i.singleProcessMemoryIndex === !0, x = !1, S, ne = {
909
+ ...r,
909
910
  description: "Full-text search an index (facets/highlight/fuzzy/filters), auto-scoped to the caller tenant.",
910
- execute: (n, r) => {
911
- let { index: i, q: a, limit: o, offset: s, filters: l, facets: u, highlight: d, fuzziness: f, engineParams: p } = n, m = _.get(i);
912
- if (!m) return c.fail(new e({ index: i }));
913
- let h = re(Fe({
914
- ...l ? { filters: l } : {},
911
+ execute: (t, r) => {
912
+ let { index: i, q: a, limit: o, offset: s, filters: c, facets: u, highlight: d, fuzziness: f, engineParams: p } = t, m = _.get(i);
913
+ if (!m) return l.fail(new n({ index: i }));
914
+ let h = re(Ie({
915
+ ...c ? { filters: c } : {},
915
916
  ...u ? { facets: u } : {},
916
917
  ...d ? { highlight: d } : {}
917
918
  }), m.queryableFields);
918
- if (h) return c.fail(new t(h));
919
- let ee = r.request.subject.tenantId ?? null, v = Pe(m.tenantField, ee, l);
920
- if (v === null) return c.succeed({
919
+ if (h) return l.fail(new e(h));
920
+ let v = r.request.subject.tenantId ?? null, y = $(m.tenantField, v, c);
921
+ if (y === null) return l.succeed({
921
922
  hits: [],
922
923
  facets: {}
923
924
  });
924
- let y = {
925
+ let b = {
925
926
  q: a,
926
927
  ...o === void 0 ? {} : { limit: o },
927
928
  ...s === void 0 ? {} : { offset: s },
928
- ...v.length > 0 ? { filters: v } : {},
929
+ ...y.length > 0 ? { filters: y } : {},
929
930
  ...u && u.length > 0 ? { facets: u } : {},
930
931
  ...d ? { highlight: d } : {},
931
932
  ...f === void 0 ? {} : { fuzziness: f },
932
933
  ...p ? { engineParams: p } : {}
933
934
  };
934
- return c.promise(() => g.query(i, y));
935
+ return l.promise(() => g.query(i, b));
935
936
  }
936
- }, C = Ne(o.backend), ie = [
937
+ }, C = Fe(i.backend), w = [
937
938
  "store:changes:read",
938
939
  "store:write",
939
940
  "inspect:read",
940
941
  "inspect:write",
941
942
  ...C ? [`network:outbound:${C}`] : []
942
- ], w = V(), T = we(), E, D, O, k, A = (e, t, n) => k === void 0 ? c.tryPromise(() => w.bump(e, t, n)).pipe(c.catchAll((n) => c.sync(() => d("search stats bump failed", {
943
+ ], T = B(), E = Te(), D, O, k, A, j = (e, t, n) => A === void 0 ? l.tryPromise(() => T.bump(e, t, n)).pipe(l.catchAll((n) => l.sync(() => c("search stats bump failed", {
943
944
  index: e,
944
945
  kind: t,
945
946
  error: String(n)
946
- })))) : c.sync(() => k.bump(e, t, n)), j = async (e) => {
947
- let t = await T.list(e), n = 0, r = 0;
947
+ })))) : l.sync(() => A.bump(e, t, n)), M = async (e) => {
948
+ let t = await E.list(e), n = 0, r = 0;
948
949
  for (let e of t) {
949
950
  let t = _.get(e.indexName);
950
951
  if (!t) {
951
- await T.clear(e.indexName, e.rowId);
952
+ await E.clear(e.indexName, e.rowId);
952
953
  continue;
953
954
  }
954
955
  try {
955
- if (!D) throw Error("data store not bound");
956
- let r = (await D.query(Se(e.sourceTable, e.rowId)))[0];
957
- r ? await g.upsert(t.index, [t.map(r)]) : await g.remove(t.index, [e.docId]), await T.clear(e.indexName, e.rowId), n++;
956
+ if (!O) throw Error("data store not bound");
957
+ let r = (await O.query(Ce(e.sourceTable, e.rowId)))[0];
958
+ r ? await g.upsert(t.index, [t.map(r)]) : await g.remove(t.index, [e.docId]), await E.clear(e.indexName, e.rowId), n++;
958
959
  } catch (t) {
959
- r++, await T.record({
960
+ r++, await E.record({
960
961
  ...e,
961
962
  error: String(t?.message ?? t)
962
963
  }).catch(() => void 0);
@@ -967,30 +968,30 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
967
968
  repaired: n,
968
969
  failed: r
969
970
  };
970
- }, M = (e) => ({
971
+ }, N = (e) => ({
971
972
  kind: "json",
972
973
  data: e
973
- }), N = (e, t) => ({
974
+ }), P = (e, t) => ({
974
975
  kind: "json",
975
976
  status: e,
976
977
  data: { error: t }
977
978
  });
978
- return te({
979
+ return ee({
979
980
  name: s,
980
- baseName: $,
981
+ baseName: Le,
981
982
  description: "External search index sync (Typesense/Meilisearch/Algolia/memory) via the ChangeEvent tap + a tenant-scoped query route.",
982
- permissions: ie,
983
- routes: [S],
984
- rpcClientDescriptors: r,
983
+ permissions: w,
984
+ routes: [ne],
985
+ rpcClientDescriptors: t,
985
986
  inspectEndpoints: [
986
987
  {
987
988
  method: "GET",
988
989
  path: "/indexes",
989
990
  description: "Configured indexes + durable, cross-replica sync stats + current index drift.",
990
- handler: () => c.promise(async () => {
991
- await k?.flushNow();
992
- let e = await Promise.all(Object.entries(o.indexes).map(async ([e, t]) => {
993
- let n = await w.get(t.index), r = await T.summary(t.index);
991
+ handler: () => l.promise(async () => {
992
+ await A?.flushNow();
993
+ let e = await Promise.all(Object.entries(i.indexes).map(async ([e, t]) => {
994
+ let n = await T.get(t.index), r = await E.summary(t.index);
994
995
  return {
995
996
  table: e,
996
997
  index: t.index,
@@ -1001,15 +1002,15 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
1001
1002
  drifted: r.pending > 0
1002
1003
  };
1003
1004
  }));
1004
- return M({
1005
+ return N({
1005
1006
  indexes: e,
1006
- backend: typeof o.backend == "string" ? o.backend : o.backend ? "custom/vendor" : "memory",
1007
+ backend: typeof i.backend == "string" ? i.backend : i.backend ? "custom/vendor" : "memory",
1007
1008
  durable: v !== "memory",
1008
- singleProcessMemoryIndex: y,
1009
+ singleProcessMemoryIndex: b,
1009
1010
  pendingDrift: e.reduce((e, t) => e + t.pendingDrift, 0),
1010
1011
  sync: {
1011
1012
  ...m,
1012
- resyncArmed: E !== void 0
1013
+ resyncArmed: D !== void 0
1013
1014
  }
1014
1015
  });
1015
1016
  })
@@ -1018,31 +1019,31 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
1018
1019
  method: "GET",
1019
1020
  path: "/drift",
1020
1021
  description: "The changes that did NOT reach the engine, oldest first (the repair queue).",
1021
- handler: (e) => c.promise(async () => {
1022
- let t = Number(new URL(e.url, "http://localhost").searchParams.get("limit") ?? 100), n = await T.list(Number.isFinite(t) && t > 0 ? Math.min(t, 1e3) : 100);
1023
- return M({ entries: n });
1022
+ handler: (e) => l.promise(async () => {
1023
+ let t = Number(new URL(e.url, "http://localhost").searchParams.get("limit") ?? 100), n = await E.list(Number.isFinite(t) && t > 0 ? Math.min(t, 1e3) : 100);
1024
+ return N({ entries: n });
1024
1025
  })
1025
1026
  },
1026
1027
  {
1027
1028
  method: "POST",
1028
1029
  path: "/resync",
1029
1030
  description: "Repair drifted rows now — re-reads each from the DB and re-applies it.",
1030
- handler: (e) => c.promise(async () => {
1031
+ handler: (e) => l.promise(async () => {
1031
1032
  let t;
1032
1033
  try {
1033
1034
  t = JSON.parse(e.body || "{}");
1034
1035
  } catch {
1035
- return N(400, "invalid JSON body");
1036
+ return P(400, "invalid JSON body");
1036
1037
  }
1037
- if (!D) return N(503, "data store not bound yet");
1038
+ if (!O) return P(503, "data store not bound yet");
1038
1039
  try {
1039
- let e = await j(Math.min(Math.max(1, t.limit ?? m.resyncBatchSize), 1e3));
1040
- return M({
1040
+ let e = await M(Math.min(Math.max(1, t.limit ?? m.resyncBatchSize), 1e3));
1041
+ return N({
1041
1042
  ok: !0,
1042
1043
  ...e
1043
1044
  });
1044
1045
  } catch (e) {
1045
- return N(500, e.message);
1046
+ return P(500, e.message);
1046
1047
  }
1047
1048
  })
1048
1049
  },
@@ -1050,32 +1051,32 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
1050
1051
  method: "POST",
1051
1052
  path: "/reindex",
1052
1053
  description: "Re-seed an index from the table's current rows (streamed in bounded batches).",
1053
- handler: (e) => c.promise(async () => {
1054
+ handler: (e) => l.promise(async () => {
1054
1055
  let t;
1055
1056
  try {
1056
1057
  t = JSON.parse(e.body || "{}");
1057
1058
  } catch {
1058
- return N(400, "invalid JSON body");
1059
+ return P(400, "invalid JSON body");
1059
1060
  }
1060
- let n = t.table, r = n ? o.indexes[n] : void 0;
1061
- if (!n || !r) return N(404, `no index configured for table "${t.table ?? ""}"`);
1062
- if (!O) return N(503, "data store not bound yet");
1063
- let s = 0, d = await c.runPromiseExit(ee(O, {
1061
+ let n = t.table, r = n ? i.indexes[n] : void 0;
1062
+ if (!n || !r) return P(404, `no index configured for table "${t.table ?? ""}"`);
1063
+ if (!k) return P(503, "data store not bound yet");
1064
+ let s = 0, c = await l.runPromiseExit(y(k, {
1064
1065
  table: n,
1065
1066
  chunkSize: m.reindexBatchSize
1066
- }).pipe(f.chunks, f.runForEach((e) => c.tryPromise(async () => {
1067
- s += await ke(g, r, a.toReadonlyArray(e));
1067
+ }).pipe(p.chunks, p.runForEach((e) => l.tryPromise(async () => {
1068
+ s += await Ae(g, r, o.toReadonlyArray(e));
1068
1069
  }))));
1069
- if (l.isFailure(d)) {
1070
- let e = i.failureOption(d.cause), t = u.isSome(e) ? e.value : d.cause, n = t.cause ?? t.error ?? t;
1071
- return N(500, String(n?.message ?? n));
1070
+ if (u.isFailure(c)) {
1071
+ let e = a.failureOption(c.cause), t = d.isSome(e) ? e.value : c.cause, n = t.cause ?? t.error ?? t;
1072
+ return P(500, String(n?.message ?? n));
1072
1073
  }
1073
1074
  try {
1074
- await w.recordReindex(r.index, s, (/* @__PURE__ */ new Date()).toISOString());
1075
+ await T.recordReindex(r.index, s, (/* @__PURE__ */ new Date()).toISOString());
1075
1076
  } catch (e) {
1076
- return N(500, e.message);
1077
+ return P(500, e.message);
1077
1078
  }
1078
- return M({
1079
+ return N({
1079
1080
  ok: !0,
1080
1081
  table: n,
1081
1082
  index: r.index,
@@ -1084,91 +1085,91 @@ var x = /^[A-Za-z_][A-Za-z0-9_.]*$/, S = (e) => x.test(e), re = (e, t) => {
1084
1085
  })
1085
1086
  }
1086
1087
  ],
1087
- extendSchema: { tables: [...B(), ...De()] },
1088
+ extendSchema: { tables: [...z(), ...Oe()] },
1088
1089
  bindDataStore: (e, t) => {
1089
- D = e, O = e, w = W(e), T = Ee(e), v === "memory" && t?.membership !== void 0 && (x = t.membership.onChange((e) => {
1090
- e.kind === "left" || b || (t.instanceId === void 0 || e.instanceId !== t.instanceId) && (b = !0, d(be(e.instanceId, y), {
1090
+ O = e, k = e, T = U(e, ...t?.instanceId === void 0 ? [] : [t.instanceId]), E = De(e), v === "memory" && t?.membership !== void 0 && (S = t.membership.onChange((e) => {
1091
+ e.kind === "left" || x || (t.instanceId === void 0 || e.instanceId !== t.instanceId) && (x = !0, c(xe(e.instanceId, b), {
1091
1092
  instanceId: t.instanceId ?? null,
1092
1093
  peer: e.instanceId,
1093
- indexes: Object.keys(o.indexes)
1094
+ indexes: Object.keys(i.indexes)
1094
1095
  }));
1095
- })), !(m.resyncIntervalMs <= 0 || t?.scheduleCoordinated === void 0) && (E = t.scheduleCoordinated("search.resync", m.resyncIntervalMs, async () => {
1096
+ })), !(m.resyncIntervalMs <= 0 || t?.scheduleCoordinated === void 0) && (D = t.scheduleCoordinated("search.resync", m.resyncIntervalMs, async () => {
1096
1097
  try {
1097
- let e = await j(m.resyncBatchSize);
1098
- return (e.repaired > 0 || e.failed > 0) && p("search: drift repair pass", e), { idle: e.scanned === 0 };
1098
+ let e = await M(m.resyncBatchSize);
1099
+ return (e.repaired > 0 || e.failed > 0) && f("search: drift repair pass", e), { idle: e.scanned === 0 };
1099
1100
  } catch (e) {
1100
- return d("search: drift repair pass failed", { error: String(e?.message ?? e) }), { idle: !1 };
1101
+ return c("search: drift repair pass failed", { error: String(e?.message ?? e) }), { idle: !1 };
1101
1102
  }
1102
1103
  }));
1103
1104
  },
1104
1105
  onChangeEvent: (e) => {
1105
- let t = o.indexes[e.table];
1106
- if (!t) return c.void;
1107
- let n = e.changeScope, r = e.changeScope === "fleet" || e.origin !== "injected", i = e.op === "delete" ? e.old : e.new, a = typeof i?.id == "string" ? i.id : "", s = e.op === "delete" ? "remove" : "upsert", l = () => {
1108
- if (e.op === "delete" || !e.new) return a;
1106
+ let t = i.indexes[e.table];
1107
+ if (!t) return l.void;
1108
+ let n = e.changeScope, r = e.changeScope === "fleet" || e.origin !== "injected", a = e.op === "delete" ? e.old : e.new, o = typeof a?.id == "string" ? a.id : "", s = e.op === "delete" ? "remove" : "upsert", u = () => {
1109
+ if (e.op === "delete" || !e.new) return o;
1109
1110
  try {
1110
- return String(t.map(e.new).id ?? a);
1111
+ return String(t.map(e.new).id ?? o);
1111
1112
  } catch {
1112
- return a;
1113
+ return o;
1113
1114
  }
1114
1115
  };
1115
- return c.tryPromise({
1116
- try: () => Z(g, t, e),
1117
- catch: je
1118
- }).pipe(c.retry(h)).pipe(c.matchEffect({
1119
- onSuccess: () => r ? A(t.index, e.op === "delete" ? "removed" : "synced", n) : c.void,
1116
+ return l.tryPromise({
1117
+ try: () => je(g, t, e),
1118
+ catch: Ne
1119
+ }).pipe(l.retry(h)).pipe(l.matchEffect({
1120
+ onSuccess: () => r ? j(t.index, e.op === "delete" ? "removed" : "synced", n) : l.void,
1120
1121
  onFailure: (r) => {
1121
1122
  let i = {
1122
1123
  table: e.table,
1123
1124
  index: t.index,
1124
1125
  op: e.op,
1125
- rowId: a,
1126
+ rowId: o,
1126
1127
  transient: r.transient,
1127
1128
  error: r.message
1128
1129
  };
1129
- return a === "" ? c.sync(() => d("search: change not indexed and NOT recoverable (row has no id)", i)).pipe(c.zipRight(c.fail(r))) : c.tryPromise(() => T.record({
1130
+ return o === "" ? l.sync(() => c("search: change not indexed and NOT recoverable (row has no id)", i)).pipe(l.zipRight(l.fail(r))) : l.tryPromise(() => E.record({
1130
1131
  indexName: t.index,
1131
1132
  sourceTable: e.table,
1132
- rowId: a,
1133
- docId: l(),
1133
+ rowId: o,
1134
+ docId: u(),
1134
1135
  op: s,
1135
1136
  error: r.message
1136
- })).pipe(c.matchEffect({
1137
- onSuccess: () => A(t.index, "dropped", n).pipe(c.zipRight(c.sync(() => d("search: index drift recorded — will be repaired from the database", i)))),
1138
- onFailure: (e) => c.sync(() => d("search: change LOST — engine failed and the drift ledger could not record it", {
1137
+ })).pipe(l.matchEffect({
1138
+ onSuccess: () => j(t.index, "dropped", n).pipe(l.zipRight(l.sync(() => c("search: index drift recorded — will be repaired from the database", i)))),
1139
+ onFailure: (e) => l.sync(() => c("search: change LOST — engine failed and the drift ledger could not record it", {
1139
1140
  ...i,
1140
1141
  ledgerError: String(e)
1141
- })).pipe(c.zipRight(c.fail(r)))
1142
+ })).pipe(l.zipRight(l.fail(r)))
1142
1143
  }));
1143
1144
  }
1144
1145
  }));
1145
1146
  },
1146
- onActivate: (e) => c.suspend(() => {
1147
- d = (t, n) => e.logger.warn(t, n), p = (t, n) => e.logger.info(t, n);
1148
- let t = ye({
1147
+ onActivate: (e) => l.suspend(() => {
1148
+ c = (t, n) => e.logger.warn(t, n), f = (t, n) => e.logger.info(t, n);
1149
+ let t = J({
1149
1150
  backendKind: v,
1150
1151
  production: (e.env?.NODE_ENV ?? process.env.NODE_ENV) === "production",
1151
- singleProcessDeclared: y
1152
+ singleProcessDeclared: b
1152
1153
  });
1153
- return t.level === "refuse" ? c.fail(new ge(t.message)) : (t.level === "note" && e.logger.info(t.message, { indexes: Object.keys(o.indexes) }), m.statsFlushIntervalMs > 0 && k === void 0 && (k = G({
1154
- flush: K(() => w),
1154
+ return t.level === "refuse" ? l.fail(new q(t.message)) : (t.level === "note" && e.logger.info(t.message, { indexes: Object.keys(i.indexes) }), m.statsFlushIntervalMs > 0 && A === void 0 && (A = W({
1155
+ flush: G(() => T),
1155
1156
  intervalMs: m.statsFlushIntervalMs,
1156
1157
  maxBuffered: m.statsFlushMaxBuffered
1157
- })), c.sync(() => {
1158
+ })), l.sync(() => {
1158
1159
  e.logger.info("search active", {
1159
- indexes: Object.keys(o.indexes),
1160
- backend: typeof o.backend == "string" ? o.backend : "custom/vendor",
1160
+ indexes: Object.keys(i.indexes),
1161
+ backend: typeof i.backend == "string" ? i.backend : "custom/vendor",
1161
1162
  durable: v !== "memory",
1162
1163
  sync: m
1163
1164
  });
1164
1165
  }));
1165
1166
  }),
1166
- onDeactivate: () => c.promise(async () => {
1167
- E?.stop(), E = void 0, x?.(), x = void 0, b = !1;
1168
- let e = k;
1169
- k = void 0, await e?.shutdown();
1167
+ onDeactivate: () => l.promise(async () => {
1168
+ D?.stop(), D = void 0, S?.(), S = void 0, x = !1;
1169
+ let e = A;
1170
+ A = void 0, await e?.shutdown();
1170
1171
  })
1171
1172
  });
1172
1173
  };
1173
1174
  //#endregion
1174
- export { x as FIELD_NAME_PATTERN, J as SEARCH_DRIFT_TABLE, L as SEARCH_STATS_TABLE, Q as SYNC_DEFAULTS, E as SearchBackendError, ge as SearchBackendNotDurable, t as SearchFieldRejected, e as SearchIndexNotFound, I as algoliaBackend, T as allowedEngineParams, Z as applyChange, je as asBackendError, ye as auditMemoryBackend, q as backendKindOf, ke as backfillIndex, Ee as dataStoreDriftLedger, W as dataStoreStatsStore, Se as driftSourceQuery, De as driftTables, S as isSafeFieldName, G as makeSearchStatsBuffer, F as meilisearchBackend, A as memoryBackend, we as memoryDriftLedger, V as memoryStatsStore, be as peerObservedWarning, Ae as resolveSyncOptions, w as sanitizeEngineParams, Pe as scopeSearchFilters, xe as searchDriftTable, Ie as searchPlugin, z as searchStatsTable, B as searchTables, K as statsStoreFlush, Me as syncRetrySchedule, oe as typesenseBackend };
1175
+ export { C as FIELD_NAME_PATTERN, Y as SEARCH_DRIFT_TABLE, R as SEARCH_STATS_TABLE, Q as SYNC_DEFAULTS, k as SearchBackendError, q as SearchBackendNotDurable, e as SearchFieldRejected, n as SearchIndexNotFound, pe as algoliaBackend, O as allowedEngineParams, je as applyChange, Ne as asBackendError, J as auditMemoryBackend, K as backendKindOf, Ae as backfillIndex, De as dataStoreDriftLedger, U as dataStoreStatsStore, Ce as driftSourceQuery, Oe as driftTables, w as isSafeFieldName, W as makeSearchStatsBuffer, ce as meilisearchBackend, N as memoryBackend, Te as memoryDriftLedger, B as memoryStatsStore, xe as peerObservedWarning, Me as resolveSyncOptions, D as sanitizeEngineParams, $ as scopeSearchFilters, Se as searchDriftTable, Re as searchPlugin, ge as searchStatsTable, z as searchTables, G as statsStoreFlush, Pe as syncRetrySchedule, ae as typesenseBackend };