@anuma/sdk 3.11.2 → 3.11.4

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.
@@ -12352,7 +12352,7 @@ var require_Query = __commonJS({
12352
12352
  var _subscribeToCount = _interopRequireDefault(require_subscribeToCount());
12353
12353
  var _subscribeToQuery = _interopRequireDefault(require_subscribeToQuery());
12354
12354
  var _subscribeToQueryWithColumns = _interopRequireDefault(require_subscribeToQueryWithColumns());
12355
- var Q11 = _interopRequireWildcard(require_QueryDescription());
12355
+ var Q10 = _interopRequireWildcard(require_QueryDescription());
12356
12356
  var _helpers = require_helpers2();
12357
12357
  var _class;
12358
12358
  var _descriptor;
@@ -12384,8 +12384,8 @@ var require_Query = __commonJS({
12384
12384
  (0, _initializerDefineProperty2.default)(this, "_cachedCountSubscribable", _descriptor2, this);
12385
12385
  (0, _initializerDefineProperty2.default)(this, "_cachedCountThrottledSubscribable", _descriptor3, this);
12386
12386
  this.collection = collection;
12387
- this._rawDescription = Q11.buildQueryDescription(clauses);
12388
- this.description = Q11.queryWithoutDeleted(this._rawDescription);
12387
+ this._rawDescription = Q10.buildQueryDescription(clauses);
12388
+ this.description = Q10.queryWithoutDeleted(this._rawDescription);
12389
12389
  }
12390
12390
  var _proto = Query2.prototype;
12391
12391
  _proto.extend = function(...args) {
@@ -12404,12 +12404,12 @@ var require_Query = __commonJS({
12404
12404
  sql
12405
12405
  } = this._rawDescription;
12406
12406
  (0, _invariant.default)(!sql, "Cannot extend an unsafe SQL query");
12407
- return new Query2(collection, [Q11.experimentalJoinTables(joinTables)].concat((0, _toConsumableArray2.default)(nestedJoinTables.map(function({
12407
+ return new Query2(collection, [Q10.experimentalJoinTables(joinTables)].concat((0, _toConsumableArray2.default)(nestedJoinTables.map(function({
12408
12408
  from,
12409
12409
  to
12410
12410
  }) {
12411
- return Q11.experimentalNestedJoin(from, to);
12412
- })), (0, _toConsumableArray2.default)(where), (0, _toConsumableArray2.default)(sortBy), (0, _toConsumableArray2.default)(take ? [Q11.take(take)] : []), (0, _toConsumableArray2.default)(skip ? [Q11.skip(skip)] : []), (0, _toConsumableArray2.default)(lokiTransform ? [Q11.unsafeLokiTransform(lokiTransform)] : []), (0, _toConsumableArray2.default)(clauses)));
12411
+ return Q10.experimentalNestedJoin(from, to);
12412
+ })), (0, _toConsumableArray2.default)(where), (0, _toConsumableArray2.default)(sortBy), (0, _toConsumableArray2.default)(take ? [Q10.take(take)] : []), (0, _toConsumableArray2.default)(skip ? [Q10.skip(skip)] : []), (0, _toConsumableArray2.default)(lokiTransform ? [Q10.unsafeLokiTransform(lokiTransform)] : []), (0, _toConsumableArray2.default)(clauses)));
12413
12413
  };
12414
12414
  _proto.pipe = function(transform) {
12415
12415
  return transform(this);
@@ -13851,7 +13851,7 @@ var require_helpers5 = __commonJS({
13851
13851
  exports2.createTimestampsFor = void 0;
13852
13852
  exports2.fetchDescendants = fetchDescendants;
13853
13853
  var _fp = require_fp();
13854
- var Q11 = _interopRequireWildcard(require_QueryDescription());
13854
+ var Q10 = _interopRequireWildcard(require_QueryDescription());
13855
13855
  function _getRequireWildcardCache(e) {
13856
13856
  if ("function" != typeof WeakMap) return null;
13857
13857
  var r = /* @__PURE__ */ new WeakMap(), t = /* @__PURE__ */ new WeakMap();
@@ -13889,7 +13889,7 @@ var require_helpers5 = __commonJS({
13889
13889
  });
13890
13890
  var childrenQueries = hasManyAssociations.map(function([key, value]) {
13891
13891
  var childCollection = model.collections.get(key);
13892
- return childCollection.query(Q11.where(value.foreignKey, model.id));
13892
+ return childCollection.query(Q10.where(value.foreignKey, model.id));
13893
13893
  });
13894
13894
  return childrenQueries;
13895
13895
  }
@@ -14270,8 +14270,8 @@ var require_watermelondb = __commonJS({
14270
14270
  var _interopRequireDefault = require_interopRequireDefault();
14271
14271
  exports2.__esModule = true;
14272
14272
  exports2.tableSchema = exports2.tableName = exports2.localStorageKey = exports2.columnName = exports2.associations = exports2.appSchema = exports2.Relation = exports2.Query = exports2.Q = exports2.Model = exports2.Database = exports2.Collection = void 0;
14273
- var Q11 = _interopRequireWildcard(require_QueryDescription());
14274
- exports2.Q = Q11;
14273
+ var Q10 = _interopRequireWildcard(require_QueryDescription());
14274
+ exports2.Q = Q10;
14275
14275
  var _Collection = _interopRequireDefault(require_Collection());
14276
14276
  exports2.Collection = _Collection.default;
14277
14277
  var _Database = _interopRequireDefault(require_Database());
@@ -14475,7 +14475,7 @@ var require_children = __commonJS({
14475
14475
  var _makeDecorator = _interopRequireDefault(require_makeDecorator());
14476
14476
  var _logError = _interopRequireDefault(require_logError());
14477
14477
  var _invariant = _interopRequireDefault(require_invariant());
14478
- var Q11 = _interopRequireWildcard(require_QueryDescription());
14478
+ var Q10 = _interopRequireWildcard(require_QueryDescription());
14479
14479
  function _getRequireWildcardCache(e) {
14480
14480
  if ("function" != typeof WeakMap) return null;
14481
14481
  var r = /* @__PURE__ */ new WeakMap(), t = /* @__PURE__ */ new WeakMap();
@@ -14509,7 +14509,7 @@ var require_children = __commonJS({
14509
14509
  var childCollection = model.collections.get(childTable);
14510
14510
  var association = model.constructor.associations[childTable];
14511
14511
  (0, _invariant.default)(association && "has_many" === association.type, "@children decorator used for a table that's not has_many");
14512
- var query = childCollection.query(Q11.where(association.foreignKey, model.id));
14512
+ var query = childCollection.query(Q10.where(association.foreignKey, model.id));
14513
14513
  that._childrenQueryCache[childTable] = query;
14514
14514
  return query;
14515
14515
  },
@@ -19399,6 +19399,17 @@ var init_mmr = __esm({
19399
19399
  }
19400
19400
  });
19401
19401
 
19402
+ // src/lib/memory/recallConstants.ts
19403
+ var RECALL_TOOL_NAME, RECALL_MAX_LIMIT, EMBEDDINGS_DEGRADED_EMPTY;
19404
+ var init_recallConstants = __esm({
19405
+ "src/lib/memory/recallConstants.ts"() {
19406
+ "use strict";
19407
+ RECALL_TOOL_NAME = "recall_memory";
19408
+ RECALL_MAX_LIMIT = 50;
19409
+ EMBEDDINGS_DEGRADED_EMPTY = "Semantic memory search is temporarily unavailable, so only keyword matching ran and it found no matches. Do not conclude the user has no such memory \u2014 say the memory lookup was degraded, or retry with different keywords.";
19410
+ }
19411
+ });
19412
+
19402
19413
  // src/lib/memory/recency.ts
19403
19414
  function recencyMultiplier(updatedAt, opts = {}) {
19404
19415
  const noDate = opts.noDateMultiplier ?? DEFAULT_NO_DATE_MULTIPLIER;
@@ -20717,6 +20728,9 @@ async function recall(query, ctx, options = {}) {
20717
20728
  let vaultSize;
20718
20729
  let didRerank = false;
20719
20730
  let hadV2Head = false;
20731
+ let embeddingsUnavailable = false;
20732
+ let chunkEmbedFailed = false;
20733
+ let factLaneRankedOnCosine = false;
20720
20734
  const emitDiagnostics = (candidateCount) => {
20721
20735
  const cb = options.onDiagnostics;
20722
20736
  if (!cb) return;
@@ -20725,6 +20739,7 @@ async function recall(query, ctx, options = {}) {
20725
20739
  degraded.push("rerank-unavailable");
20726
20740
  }
20727
20741
  if (flags.decompose && !decomposeAvailable) degraded.push("decompose-unavailable");
20742
+ if (embeddingsUnavailable) degraded.push("embeddings-unavailable");
20728
20743
  const diagnostics = {
20729
20744
  usedBudget,
20730
20745
  reranked: didRerank,
@@ -20755,7 +20770,26 @@ async function recall(query, ctx, options = {}) {
20755
20770
  const graphRefiner = flags.traverse && options.graphRefine && options.decomposeOptions ? createLlmNeighborRefiner(options.decomposeOptions) : void 0;
20756
20771
  const prepStart = nowMs();
20757
20772
  const [queryEmbedding, entityRanking, temporalRanking] = await Promise.all([
20758
- needsChunkEmbedding ? generateEmbedding(query, ctx.embeddingOptions) : Promise.resolve(void 0),
20773
+ // The chunk lane is cosine-only — `searchChunksOp` needs a real vector, and
20774
+ // there is no lexical fallback for it — so an embeddings outage must SKIP the
20775
+ // lane, not reject this shared Promise.all and take the primary fact lane
20776
+ // (which BM25 can still serve) down with it. Mirrors safeLane's posture.
20777
+ needsChunkEmbedding ? generateEmbedding(query, ctx.embeddingOptions).then((vec) => {
20778
+ if (vec.length === 0) {
20779
+ getLogger().warn(
20780
+ "[memory/recall] chunk-lane query embedding came back empty; skipping the chunk lane"
20781
+ );
20782
+ chunkEmbedFailed = true;
20783
+ return void 0;
20784
+ }
20785
+ return vec;
20786
+ }).catch((err) => {
20787
+ getLogger().warn(
20788
+ `[memory/recall] chunk-lane query embedding failed; skipping the chunk lane: ${err instanceof Error ? err.message : String(err)}`
20789
+ );
20790
+ chunkEmbedFailed = true;
20791
+ return void 0;
20792
+ }) : Promise.resolve(void 0),
20759
20793
  // The graph + temporal lanes are AUXILIARY (RRF side-signals). A transient
20760
20794
  // WatermelonDB throw in either must NOT reject this Promise.all and take
20761
20795
  // PRIMARY cosine/BM25 recall down with it — degrade the failing lane to an
@@ -20780,7 +20814,9 @@ async function recall(query, ctx, options = {}) {
20780
20814
  results,
20781
20815
  vaultSize: size,
20782
20816
  reranked,
20783
- hadV2Head: v2Head
20817
+ hadV2Head: v2Head,
20818
+ embeddingsUnavailable: factEmbeddingsUnavailable,
20819
+ rankedOnCosine: factRankedOnCosine
20784
20820
  } = await searchVaultMemoriesWithSize(
20785
20821
  query,
20786
20822
  ctx.vaultCtx,
@@ -20837,8 +20873,11 @@ async function recall(query, ctx, options = {}) {
20837
20873
  vaultSize = size;
20838
20874
  didRerank = reranked;
20839
20875
  hadV2Head = v2Head;
20876
+ if (factEmbeddingsUnavailable) embeddingsUnavailable = true;
20877
+ factLaneRankedOnCosine = factRankedOnCosine;
20840
20878
  factLaneMs = nowMs() - factStart;
20841
20879
  }
20880
+ if (chunkEmbedFailed && !factLaneRankedOnCosine) embeddingsUnavailable = true;
20842
20881
  if (types.includes("chunk") && ctx.storageCtx && queryEmbedding) {
20843
20882
  const chunkStart = nowMs();
20844
20883
  const chunkMinScore = options.minScore ?? DEFAULT_CHUNK_MIN_SCORE;
@@ -21601,6 +21640,24 @@ async function eagerEmbedContent(content, embeddingOptions, cache, vaultCtx, mem
21601
21640
  );
21602
21641
  }
21603
21642
  }
21643
+ async function embedQueryOrDegrade(query, embeddingOptions, onDegraded) {
21644
+ try {
21645
+ const embedding = await generateEmbedding(query, embeddingOptions);
21646
+ if (embedding.length === 0) {
21647
+ getLogger().warn(
21648
+ "memoryVault: query embedding came back empty \u2014 falling back to BM25-only ranking for this search"
21649
+ );
21650
+ onDegraded?.();
21651
+ }
21652
+ return embedding;
21653
+ } catch (err) {
21654
+ getLogger().warn(
21655
+ "memoryVault: query embedding failed \u2014 falling back to BM25-only ranking for this search: " + (err instanceof Error ? err.message : String(err))
21656
+ );
21657
+ onDegraded?.();
21658
+ return [];
21659
+ }
21660
+ }
21604
21661
  function admitVaultProjections(queryEmbedding, vectored, k) {
21605
21662
  return vectored.map((it) => ({ it, score: cosineSimilarity(queryEmbedding, it.embedding) })).sort((a, b) => b.score - a.score || b.it.updatedAt.getTime() - a.it.updatedAt.getTime()).slice(0, k).map((s) => s.it.uniqueId);
21606
21663
  }
@@ -21612,23 +21669,36 @@ async function buildProjectedCorpus(query, vaultCtx, embeddingOptions, cache, qu
21612
21669
  const hydrateOpts = queryOpts.includeArchived ? { includeArchived: true } : void 0;
21613
21670
  const vaultSize = keys.length;
21614
21671
  if (keys.length === 0) {
21615
- return { memories: [], embeddedItems: [], queryEmbedding: [], vaultSize: 0 };
21672
+ return {
21673
+ memories: [],
21674
+ embeddedItems: [],
21675
+ queryEmbedding: [],
21676
+ vaultSize: 0,
21677
+ laneEmbedFailed: false
21678
+ };
21616
21679
  }
21617
- const queryEmbedding = await generateEmbedding(query, embeddingOptions);
21680
+ const queryEmbedding = await embedQueryOrDegrade(
21681
+ query,
21682
+ embeddingOptions,
21683
+ opts.onEmbeddingDegraded
21684
+ );
21685
+ const embeddingsDegraded = queryEmbedding.length === 0;
21618
21686
  const currentModel = embeddingOptions.model ?? DEFAULT_API_EMBEDDING_MODEL;
21619
21687
  const vectored = [];
21620
21688
  const missIds = [];
21621
21689
  const noVectorIds = [];
21622
21690
  const keyById = new Map(keys.map((k2) => [k2.uniqueId, k2]));
21623
- for (const k2 of keys) {
21624
- const cached = cache.get(k2.uniqueId);
21625
- if (cached && cached.length === queryEmbedding.length) {
21626
- vectored.push({ uniqueId: k2.uniqueId, embedding: cached, updatedAt: k2.updatedAt });
21627
- continue;
21691
+ if (!embeddingsDegraded) {
21692
+ for (const k2 of keys) {
21693
+ const cached = cache.get(k2.uniqueId);
21694
+ if (cached && cached.length === queryEmbedding.length) {
21695
+ vectored.push({ uniqueId: k2.uniqueId, embedding: cached, updatedAt: k2.updatedAt });
21696
+ continue;
21697
+ }
21698
+ const modelCompatible = (k2.embeddingModel ?? currentModel) === currentModel;
21699
+ if (modelCompatible) missIds.push(k2.uniqueId);
21700
+ else noVectorIds.push(k2.uniqueId);
21628
21701
  }
21629
- const modelCompatible = (k2.embeddingModel ?? currentModel) === currentModel;
21630
- if (modelCompatible) missIds.push(k2.uniqueId);
21631
- else noVectorIds.push(k2.uniqueId);
21632
21702
  }
21633
21703
  if (missIds.length > 0) {
21634
21704
  const rows = await getVaultEmbeddingsByIdsOp(vaultCtx, missIds, hydrateOpts);
@@ -21649,6 +21719,7 @@ async function buildProjectedCorpus(query, vaultCtx, embeddingOptions, cache, qu
21649
21719
  }
21650
21720
  for (const id of missIds) if (!gotVector.has(id)) noVectorIds.push(id);
21651
21721
  }
21722
+ let laneEmbedFailed = false;
21652
21723
  if (noVectorIds.length > 0) {
21653
21724
  const laneIds = noVectorIds.slice(0, opts.unembeddedCap);
21654
21725
  if (noVectorIds.length > laneIds.length) {
@@ -21660,26 +21731,44 @@ async function buildProjectedCorpus(query, vaultCtx, embeddingOptions, cache, qu
21660
21731
  (m) => !isEncrypted(m.content)
21661
21732
  );
21662
21733
  if (laneRows.length > 0) {
21663
- const laneVecs = await generateEmbeddings(
21664
- laneRows.map((m) => m.content),
21665
- embeddingOptions
21666
- );
21667
- laneRows.forEach((m, i) => {
21668
- const vec = Float32Array.from(laneVecs[i]);
21669
- cache.set(m.uniqueId, vec);
21670
- vectored.push({ uniqueId: m.uniqueId, embedding: vec, updatedAt: m.updatedAt });
21671
- updateVaultMemoryEmbeddingOp(
21672
- vaultCtx,
21673
- m.uniqueId,
21674
- JSON.stringify(laneVecs[i]),
21675
- currentModel
21676
- ).catch(() => {
21734
+ let laneVecs;
21735
+ try {
21736
+ laneVecs = await generateEmbeddings(
21737
+ laneRows.map((m) => m.content),
21738
+ embeddingOptions
21739
+ );
21740
+ } catch (err) {
21741
+ laneEmbedFailed = true;
21742
+ getLogger().warn(
21743
+ `memoryVault: un-embedded lane embedding failed for ${laneRows.length} rows \u2014 they rank on BM25 alone for this search: ` + (err instanceof Error ? err.message : String(err))
21744
+ );
21745
+ }
21746
+ if (laneVecs) {
21747
+ const vecs = laneVecs;
21748
+ laneRows.forEach((m, i) => {
21749
+ const vec = Float32Array.from(vecs[i]);
21750
+ cache.set(m.uniqueId, vec);
21751
+ vectored.push({ uniqueId: m.uniqueId, embedding: vec, updatedAt: m.updatedAt });
21752
+ updateVaultMemoryEmbeddingOp(
21753
+ vaultCtx,
21754
+ m.uniqueId,
21755
+ JSON.stringify(vecs[i]),
21756
+ currentModel
21757
+ ).catch(() => {
21758
+ });
21677
21759
  });
21678
- });
21760
+ }
21679
21761
  }
21680
21762
  }
21681
21763
  const k = Math.max(opts.limit * opts.admitFactor, opts.admitFloor);
21682
21764
  const admittedIds = admitVaultProjections(queryEmbedding, vectored, k);
21765
+ if ((embeddingsDegraded || laneEmbedFailed) && admittedIds.length < k) {
21766
+ const already = new Set(admittedIds);
21767
+ for (const key of [...keys].sort((a, b) => b.updatedAt.getTime() - a.updatedAt.getTime())) {
21768
+ if (admittedIds.length >= k) break;
21769
+ if (!already.has(key.uniqueId)) admittedIds.push(key.uniqueId);
21770
+ }
21771
+ }
21683
21772
  const admissionSet = new Set(admittedIds);
21684
21773
  if (opts.forceIncludeIds) {
21685
21774
  for (const id of opts.forceIncludeIds) {
@@ -21707,11 +21796,18 @@ async function buildProjectedCorpus(query, vaultCtx, embeddingOptions, cache, qu
21707
21796
  eventTimeKind: normalizeEventTimeKind(m.eventTimeKind),
21708
21797
  factType: m.factType
21709
21798
  }));
21710
- return { memories, embeddedItems, queryEmbedding, vaultSize };
21799
+ return { memories, embeddedItems, queryEmbedding, vaultSize, laneEmbedFailed };
21711
21800
  }
21712
21801
  async function prepareVaultCandidates(query, vaultCtx, embeddingOptions, cache, searchOptions) {
21713
21802
  if (!query || typeof query !== "string") {
21714
- return { memories: [], embeddedItems: [], queryEmbedding: [], vaultSize: 0 };
21803
+ return {
21804
+ memories: [],
21805
+ embeddedItems: [],
21806
+ queryEmbedding: [],
21807
+ vaultSize: 0,
21808
+ embeddingsUnavailable: false,
21809
+ embeddingFailure: false
21810
+ };
21715
21811
  }
21716
21812
  const limit = searchOptions?.limit ?? 5;
21717
21813
  const scopes = searchOptions?.scopes;
@@ -21728,6 +21824,12 @@ async function prepareVaultCandidates(query, vaultCtx, embeddingOptions, cache,
21728
21824
  let embeddedItems;
21729
21825
  let queryEmbedding;
21730
21826
  let vaultSize;
21827
+ let embeddingsUnavailable = false;
21828
+ let embeddingFailure = false;
21829
+ const onEmbeddingDegraded = () => {
21830
+ embeddingsUnavailable = true;
21831
+ embeddingFailure = true;
21832
+ };
21731
21833
  if (searchOptions?.decryptLast) {
21732
21834
  const forceIncludeIds = [
21733
21835
  ...searchOptions.entityRanking ?? [],
@@ -21738,14 +21840,30 @@ async function prepareVaultCandidates(query, vaultCtx, embeddingOptions, cache,
21738
21840
  admitFactor: ADMIT_FACTOR,
21739
21841
  admitFloor: ADMIT_FLOOR,
21740
21842
  unembeddedCap: UNEMBEDDED_CAP,
21741
- ...forceIncludeIds.length > 0 && { forceIncludeIds }
21843
+ ...forceIncludeIds.length > 0 && { forceIncludeIds },
21844
+ onEmbeddingDegraded
21742
21845
  });
21743
21846
  if (corpus.vaultSize === 0) {
21744
- return { memories: [], embeddedItems: [], queryEmbedding: [], vaultSize: 0 };
21847
+ return {
21848
+ memories: [],
21849
+ embeddedItems: [],
21850
+ queryEmbedding: [],
21851
+ vaultSize: 0,
21852
+ embeddingsUnavailable: false,
21853
+ embeddingFailure: false
21854
+ };
21745
21855
  }
21746
21856
  ({ memories, embeddedItems, queryEmbedding, vaultSize } = corpus);
21857
+ if (corpus.laneEmbedFailed) embeddingFailure = true;
21747
21858
  if (memories.length === 0) {
21748
- return { memories: [], embeddedItems: [], queryEmbedding: [], vaultSize };
21859
+ return {
21860
+ memories: [],
21861
+ embeddedItems: [],
21862
+ queryEmbedding: [],
21863
+ vaultSize,
21864
+ embeddingsUnavailable,
21865
+ embeddingFailure
21866
+ };
21749
21867
  }
21750
21868
  } else {
21751
21869
  const loaded = await getAllVaultMemoriesOp(
@@ -21760,14 +21878,21 @@ async function prepareVaultCandidates(query, vaultCtx, embeddingOptions, cache,
21760
21878
  );
21761
21879
  }
21762
21880
  if (memories.length === 0) {
21763
- return { memories: [], embeddedItems: [], queryEmbedding: [], vaultSize: loaded.length };
21881
+ return {
21882
+ memories: [],
21883
+ embeddedItems: [],
21884
+ queryEmbedding: [],
21885
+ vaultSize: loaded.length,
21886
+ embeddingsUnavailable: false,
21887
+ embeddingFailure: false
21888
+ };
21764
21889
  }
21765
- queryEmbedding = await generateEmbedding(query, embeddingOptions);
21890
+ queryEmbedding = await embedQueryOrDegrade(query, embeddingOptions, onEmbeddingDegraded);
21766
21891
  const currentModel = embeddingOptions.model ?? DEFAULT_API_EMBEDDING_MODEL;
21767
21892
  const uncachedTexts = [];
21768
21893
  const uncachedIndices = [];
21769
21894
  let staleReembedCount = 0;
21770
- for (let i = 0; i < memories.length; i++) {
21895
+ for (let i = 0; queryEmbedding.length > 0 && i < memories.length; i++) {
21771
21896
  const content = memories[i].content;
21772
21897
  const memoryId = memories[i].uniqueId;
21773
21898
  const cached = cache.get(memoryId);
@@ -21795,20 +21920,30 @@ async function prepareVaultCandidates(query, vaultCtx, embeddingOptions, cache,
21795
21920
  );
21796
21921
  }
21797
21922
  if (uncachedTexts.length > 0) {
21798
- const newEmbeddings = await generateEmbeddings(uncachedTexts, embeddingOptions);
21799
- for (let j = 0; j < uncachedTexts.length; j++) {
21800
- cache.set(memories[uncachedIndices[j]].uniqueId, Float32Array.from(newEmbeddings[j]));
21801
- updateVaultMemoryEmbeddingOp(
21802
- vaultCtx,
21803
- memories[uncachedIndices[j]].uniqueId,
21804
- JSON.stringify(newEmbeddings[j]),
21805
- currentModel
21806
- ).catch(
21807
- // Silently swallow – SDK must not use console.*; embedding will be retried on next search
21808
- () => {
21809
- }
21923
+ let newEmbeddings;
21924
+ try {
21925
+ newEmbeddings = await generateEmbeddings(uncachedTexts, embeddingOptions);
21926
+ } catch (err) {
21927
+ embeddingFailure = true;
21928
+ getLogger().warn(
21929
+ `memoryVault: (re)embedding ${uncachedTexts.length} vault rows failed \u2014 they rank on BM25 alone for this search: ` + (err instanceof Error ? err.message : String(err))
21810
21930
  );
21811
21931
  }
21932
+ if (newEmbeddings) {
21933
+ for (let j = 0; j < uncachedTexts.length; j++) {
21934
+ cache.set(memories[uncachedIndices[j]].uniqueId, Float32Array.from(newEmbeddings[j]));
21935
+ updateVaultMemoryEmbeddingOp(
21936
+ vaultCtx,
21937
+ memories[uncachedIndices[j]].uniqueId,
21938
+ JSON.stringify(newEmbeddings[j]),
21939
+ currentModel
21940
+ ).catch(
21941
+ // Silently swallow – SDK must not use console.*; embedding will be retried on next search
21942
+ () => {
21943
+ }
21944
+ );
21945
+ }
21946
+ }
21812
21947
  }
21813
21948
  embeddedItems = memories.map((m) => ({
21814
21949
  id: m.uniqueId,
@@ -21825,12 +21960,22 @@ async function prepareVaultCandidates(query, vaultCtx, embeddingOptions, cache,
21825
21960
  factType: m.factType
21826
21961
  }));
21827
21962
  }
21828
- return { memories, embeddedItems, queryEmbedding, vaultSize };
21963
+ if (!embeddingsUnavailable && !embeddedItems.some((it) => it.embedding.length > 0)) {
21964
+ embeddingsUnavailable = true;
21965
+ }
21966
+ return {
21967
+ memories,
21968
+ embeddedItems,
21969
+ queryEmbedding,
21970
+ vaultSize,
21971
+ embeddingsUnavailable,
21972
+ embeddingFailure
21973
+ };
21829
21974
  }
21830
21975
  async function rankPreparedVaultCandidates(query, prepared, embeddingOptions, searchOptions) {
21831
21976
  const limit = searchOptions?.limit ?? 5;
21832
21977
  const minSimilarity = searchOptions?.minSimilarity ?? 0.1;
21833
- const { memories, embeddedItems, queryEmbedding, vaultSize } = prepared;
21978
+ const { memories, embeddedItems, queryEmbedding, vaultSize, embeddingsUnavailable } = prepared;
21834
21979
  if (queryEmbedding.length > 0) {
21835
21980
  const mismatched = embeddedItems.filter(
21836
21981
  (it) => it.embedding.length > 0 && it.embedding.length !== queryEmbedding.length
@@ -21867,7 +22012,8 @@ async function rankPreparedVaultCandidates(query, prepared, embeddingOptions, se
21867
22012
  results: results2,
21868
22013
  vaultSize: out.vaultSize,
21869
22014
  reranked: out.reranked ?? false,
21870
- hadV2Head: out.hadV2Head ?? false
22015
+ hadV2Head: out.hadV2Head ?? false,
22016
+ embeddingsUnavailable
21871
22017
  };
21872
22018
  };
21873
22019
  const rerankStats = { applied: false };
@@ -21890,36 +22036,46 @@ async function rankPreparedVaultCandidates(query, prepared, embeddingOptions, se
21890
22036
  ...searchOptions?.rrfK !== void 0 && { rrfK: searchOptions.rrfK },
21891
22037
  ...searchOptions?.factTypeWeights && { factTypeWeights: searchOptions.factTypeWeights }
21892
22038
  };
21893
- if (useFusion && searchOptions?.decompose === "llm" && searchOptions.decomposeOptions) {
22039
+ if (useFusion && !embeddingsUnavailable && searchOptions?.decompose === "llm" && searchOptions.decomposeOptions) {
21894
22040
  const decomp = await decomposeQuery(query, searchOptions.decomposeOptions);
21895
22041
  if (decomp.mode === "composite") {
21896
- const subEmbeddings = await generateEmbeddings(decomp.subQueries, embeddingOptions);
21897
- const subQueries = decomp.subQueries.map((sq, i) => ({
21898
- query: sq,
21899
- embedding: subEmbeddings[i]
21900
- }));
21901
- const v2HeadStats = { hadResults: false };
21902
- const composite = await rankComposite(query, queryEmbedding, subQueries, embeddedItems, {
21903
- limit,
21904
- minSimilarity,
21905
- rerank: !!searchOptions.rerank,
21906
- ...searchOptions.rerankTopN !== void 0 && {
21907
- rerankTopN: searchOptions.rerankTopN
21908
- },
21909
- ...searchOptions.ceWeight !== void 0 && { ceWeight: searchOptions.ceWeight },
21910
- ...searchOptions.mmr !== void 0 && { mmr: searchOptions.mmr },
21911
- ...tuning,
21912
- ...searchOptions.entityRanking && { entityRanking: searchOptions.entityRanking },
21913
- ...searchOptions.temporalRanking && { temporalRanking: searchOptions.temporalRanking },
21914
- rerankStats,
21915
- v2HeadStats
21916
- });
21917
- return stampTimestamps({
21918
- results: composite,
21919
- vaultSize,
21920
- reranked: rerankStats.applied,
21921
- hadV2Head: v2HeadStats.hadResults
21922
- });
22042
+ let subEmbeddings;
22043
+ try {
22044
+ subEmbeddings = await generateEmbeddings(decomp.subQueries, embeddingOptions);
22045
+ } catch (err) {
22046
+ getLogger().warn(
22047
+ "memoryVault: sub-query embedding failed \u2014 falling back to single-query ranking: " + (err instanceof Error ? err.message : String(err))
22048
+ );
22049
+ subEmbeddings = [];
22050
+ }
22051
+ if (subEmbeddings.length > 0) {
22052
+ const subQueries = decomp.subQueries.map((sq, i) => ({
22053
+ query: sq,
22054
+ embedding: subEmbeddings[i]
22055
+ }));
22056
+ const v2HeadStats = { hadResults: false };
22057
+ const composite = await rankComposite(query, queryEmbedding, subQueries, embeddedItems, {
22058
+ limit,
22059
+ minSimilarity,
22060
+ rerank: !!searchOptions.rerank,
22061
+ ...searchOptions.rerankTopN !== void 0 && {
22062
+ rerankTopN: searchOptions.rerankTopN
22063
+ },
22064
+ ...searchOptions.ceWeight !== void 0 && { ceWeight: searchOptions.ceWeight },
22065
+ ...searchOptions.mmr !== void 0 && { mmr: searchOptions.mmr },
22066
+ ...tuning,
22067
+ ...searchOptions.entityRanking && { entityRanking: searchOptions.entityRanking },
22068
+ ...searchOptions.temporalRanking && { temporalRanking: searchOptions.temporalRanking },
22069
+ rerankStats,
22070
+ v2HeadStats
22071
+ });
22072
+ return stampTimestamps({
22073
+ results: composite,
22074
+ vaultSize,
22075
+ reranked: rerankStats.applied,
22076
+ hadV2Head: v2HeadStats.hadResults
22077
+ });
22078
+ }
21923
22079
  }
21924
22080
  }
21925
22081
  if (useFusion && searchOptions?.rerank) {
@@ -21970,7 +22126,14 @@ async function rankPreparedVaultCandidates(query, prepared, embeddingOptions, se
21970
22126
  }
21971
22127
  async function searchVaultMemoriesWithSize(query, vaultCtx, embeddingOptions, cache, searchOptions) {
21972
22128
  if (!query || typeof query !== "string") {
21973
- return { results: [], vaultSize: 0, reranked: false, hadV2Head: false };
22129
+ return {
22130
+ results: [],
22131
+ vaultSize: 0,
22132
+ reranked: false,
22133
+ hadV2Head: false,
22134
+ embeddingsUnavailable: false,
22135
+ rankedOnCosine: false
22136
+ };
21974
22137
  }
21975
22138
  const prepared = await prepareVaultCandidates(
21976
22139
  query,
@@ -21980,12 +22143,32 @@ async function searchVaultMemoriesWithSize(query, vaultCtx, embeddingOptions, ca
21980
22143
  searchOptions
21981
22144
  );
21982
22145
  if (prepared.vaultSize === 0) {
21983
- return { results: [], vaultSize: 0, reranked: false, hadV2Head: false };
22146
+ return {
22147
+ results: [],
22148
+ vaultSize: 0,
22149
+ reranked: false,
22150
+ hadV2Head: false,
22151
+ embeddingsUnavailable: prepared.embeddingsUnavailable,
22152
+ rankedOnCosine: false
22153
+ };
21984
22154
  }
21985
22155
  if (prepared.memories.length === 0) {
21986
- return { results: [], vaultSize: prepared.vaultSize, reranked: false, hadV2Head: false };
22156
+ return {
22157
+ results: [],
22158
+ vaultSize: prepared.vaultSize,
22159
+ reranked: false,
22160
+ hadV2Head: false,
22161
+ embeddingsUnavailable: prepared.embeddingsUnavailable,
22162
+ rankedOnCosine: false
22163
+ };
21987
22164
  }
21988
- return rankPreparedVaultCandidates(query, prepared, embeddingOptions, searchOptions);
22165
+ const ranked = await rankPreparedVaultCandidates(
22166
+ query,
22167
+ prepared,
22168
+ embeddingOptions,
22169
+ searchOptions
22170
+ );
22171
+ return { ...ranked, rankedOnCosine: !ranked.embeddingsUnavailable };
21989
22172
  }
21990
22173
  async function searchVaultMemories(query, vaultCtx, embeddingOptions, cache, searchOptions) {
21991
22174
  const { results } = await searchVaultMemoriesWithSize(
@@ -22059,26 +22242,36 @@ function createMemoryVaultSearchTool(vaultCtx, embeddingOptions, cache, searchOp
22059
22242
  const budget = searchOptions?.decompose === "llm" && searchOptions.decomposeOptions ? "high" : searchOptions?.rerank ? "mid" : "low";
22060
22243
  const folderId = searchOptions?.folderId ?? argFolderId;
22061
22244
  if (searchOptions?.useFusion === false) {
22062
- const legacy = await searchVaultMemories(query, vaultCtx, embeddingOptions, cache, {
22063
- limit: requestLimit,
22064
- minSimilarity,
22065
- useFusion: false,
22066
- ...tuningForward,
22067
- ...folderId !== void 0 && { folderId },
22068
- ...searchOptions?.scopes && { scopes: searchOptions.scopes }
22069
- });
22245
+ const { results: legacy, embeddingsUnavailable } = await searchVaultMemoriesWithSize(
22246
+ query,
22247
+ vaultCtx,
22248
+ embeddingOptions,
22249
+ cache,
22250
+ {
22251
+ limit: requestLimit,
22252
+ minSimilarity,
22253
+ useFusion: false,
22254
+ ...tuningForward,
22255
+ ...folderId !== void 0 && { folderId },
22256
+ ...searchOptions?.scopes && { scopes: searchOptions.scopes }
22257
+ }
22258
+ );
22070
22259
  if (legacy.length === 0) {
22071
- return "No relevant memories found in the vault.";
22260
+ return embeddingsUnavailable ? EMBEDDINGS_DEGRADED_EMPTY_NO_LEXICAL : "No relevant memories found in the vault.";
22072
22261
  }
22073
22262
  return formatVaultHits(
22074
22263
  legacy.map((r) => ({ id: r.uniqueId, content: r.content, score: r.similarity }))
22075
22264
  );
22076
22265
  }
22077
22266
  const { recall: recall2 } = await Promise.resolve().then(() => (init_recall(), recall_exports));
22267
+ let recallDegraded = [];
22078
22268
  const result = await recall2(
22079
22269
  query,
22080
22270
  { vaultCtx, embeddingOptions, vaultCache: cache },
22081
22271
  {
22272
+ onDiagnostics: (d) => {
22273
+ recallDegraded = d.degraded;
22274
+ },
22082
22275
  types: ["fact"],
22083
22276
  limit: requestLimit,
22084
22277
  minScore: minSimilarity,
@@ -22099,7 +22292,7 @@ function createMemoryVaultSearchTool(vaultCtx, embeddingOptions, cache, searchOp
22099
22292
  return "The memory vault is empty. No memories have been saved yet.";
22100
22293
  }
22101
22294
  if (result.memories.length === 0) {
22102
- return "No relevant memories found in the vault.";
22295
+ return recallDegraded.includes("embeddings-unavailable") ? EMBEDDINGS_DEGRADED_EMPTY : "No relevant memories found in the vault.";
22103
22296
  }
22104
22297
  const formatted = formatVaultHits(
22105
22298
  result.memories.map((m) => ({
@@ -22118,7 +22311,7 @@ ${formatted}`;
22118
22311
  }
22119
22312
  };
22120
22313
  }
22121
- var SUPERSESSION_SIMILARITY_THRESHOLD, SUPERSESSION_MIN_AGE_GAP_MS, SUPERSESSION_BOOST_FACTOR, SUPERSESSION_MAX_WINDOW;
22314
+ var SUPERSESSION_SIMILARITY_THRESHOLD, SUPERSESSION_MIN_AGE_GAP_MS, SUPERSESSION_BOOST_FACTOR, SUPERSESSION_MAX_WINDOW, EMBEDDINGS_DEGRADED_EMPTY_NO_LEXICAL;
22122
22315
  var init_searchTool = __esm({
22123
22316
  "src/lib/memoryVault/searchTool.ts"() {
22124
22317
  "use strict";
@@ -22126,6 +22319,7 @@ var init_searchTool = __esm({
22126
22319
  init_operations3();
22127
22320
  init_logger();
22128
22321
  init_mmr();
22322
+ init_recallConstants();
22129
22323
  init_recency();
22130
22324
  init_reranker();
22131
22325
  init_rrf();
@@ -22139,6 +22333,7 @@ var init_searchTool = __esm({
22139
22333
  SUPERSESSION_MIN_AGE_GAP_MS = 30 * 24 * 60 * 60 * 1e3;
22140
22334
  SUPERSESSION_BOOST_FACTOR = 0.8;
22141
22335
  SUPERSESSION_MAX_WINDOW = 50;
22336
+ EMBEDDINGS_DEGRADED_EMPTY_NO_LEXICAL = "Memory search is temporarily unavailable \u2014 the semantic lookup failed and this search mode has no keyword fallback, so no memory search ran at all. Do not conclude the user has no such memory; say the memory lookup was unavailable.";
22142
22337
  }
22143
22338
  });
22144
22339
 
@@ -23016,7 +23211,6 @@ __export(index_exports, {
23016
23211
  TextProcessor: () => TextProcessor,
23017
23212
  UserPreference: () => UserPreference,
23018
23213
  VAULT_SIZE_HOP_CAP: () => VAULT_SIZE_HOP_CAP,
23019
- VaultFolder: () => VaultFolder,
23020
23214
  VaultMemory: () => VaultMemory,
23021
23215
  WalletPoller: () => WalletPoller,
23022
23216
  WordProcessor: () => WordProcessor,
@@ -23072,7 +23266,6 @@ __export(index_exports, {
23072
23266
  createStockPricePreProcessor: () => createStockPricePreProcessor,
23073
23267
  createSummaryContext: () => createSummaryContext,
23074
23268
  createVaultEmbeddingCache: () => createVaultEmbeddingCache,
23075
- createVaultFolderOp: () => createVaultFolderOp,
23076
23269
  createVaultMemoriesBatchOp: () => createVaultMemoriesBatchOp,
23077
23270
  createVaultMemoryOp: () => createVaultMemoryOp,
23078
23271
  createWeatherPreProcessor: () => createWeatherPreProcessor,
@@ -23093,7 +23286,6 @@ __export(index_exports, {
23093
23286
  deleteModelPreferenceOp: () => deleteModelPreferenceOp,
23094
23287
  deleteProjectOp: () => deleteProjectOp,
23095
23288
  deleteUserPreferenceOp: () => deleteUserPreferenceOp,
23096
- deleteVaultFolderOp: () => deleteVaultFolderOp,
23097
23289
  deleteVaultMemoryOp: () => deleteVaultMemoryOp,
23098
23290
  eagerEmbedContent: () => eagerEmbedContent,
23099
23291
  embedAllMessages: () => embedAllMessages,
@@ -23102,7 +23294,6 @@ __export(index_exports, {
23102
23294
  encryptDataBatch: () => encryptDataBatch,
23103
23295
  encryptDataBytes: () => encryptDataBytes,
23104
23296
  encryptDataWithKey: () => encryptDataWithKey,
23105
- ensureDefaultFoldersOp: () => ensureDefaultFoldersOp,
23106
23297
  estimateMessagesTokens: () => estimateMessagesTokens,
23107
23298
  estimateTokens: () => estimateTokens,
23108
23299
  exportPublicKey: () => exportPublicKey,
@@ -23118,7 +23309,6 @@ __export(index_exports, {
23118
23309
  generateProjectId: () => generateProjectId,
23119
23310
  getAIGeneratedMediaOp: () => getAIGeneratedMediaOp,
23120
23311
  getAllFilesOp: () => getAllFilesOp,
23121
- getAllVaultFoldersOp: () => getAllVaultFoldersOp,
23122
23312
  getAllVaultMemoriesOp: () => getAllVaultMemoriesOp,
23123
23313
  getAllVaultMemoryContentsOp: () => getAllVaultMemoryContentsOp,
23124
23314
  getAudioOp: () => getAudioOp,
@@ -23161,7 +23351,6 @@ __export(index_exports, {
23161
23351
  getUnfiledVaultMemoriesOp: () => getUnfiledVaultMemoriesOp,
23162
23352
  getUserPreferenceOp: () => getUserPreferenceOp,
23163
23353
  getUserUploadedMediaOp: () => getUserUploadedMediaOp,
23164
- getVaultFolderMemoryCountOp: () => getVaultFolderMemoryCountOp,
23165
23354
  getVaultMemoryOp: () => getVaultMemoryOp,
23166
23355
  getVideosOp: () => getVideosOp,
23167
23356
  hardDeleteDecayedOp: () => hardDeleteDecayedOp,
@@ -23177,7 +23366,6 @@ __export(index_exports, {
23177
23366
  maybeSummarizeHistory: () => maybeSummarizeHistory,
23178
23367
  mediaToStored: () => mediaToStored,
23179
23368
  migrateFromModelPreferencesOp: () => migrateFromModelPreferencesOp,
23180
- moveMemoriesToFolderOp: () => moveMemoriesToFolderOp,
23181
23369
  onKeyAvailable: () => onKeyAvailable,
23182
23370
  preEmbedVaultMemories: () => preEmbedVaultMemories,
23183
23371
  preprocessFiles: () => preprocessFiles,
@@ -23238,8 +23426,6 @@ __export(index_exports, {
23238
23426
  updateProfileOp: () => updateProfileOp,
23239
23427
  updateProjectNameOp: () => updateProjectNameOp,
23240
23428
  updateProjectOp: () => updateProjectOp,
23241
- updateVaultFolderContextOp: () => updateVaultFolderContextOp,
23242
- updateVaultFolderOp: () => updateVaultFolderOp,
23243
23429
  updateVaultMemoryEmbeddingOp: () => updateVaultMemoryEmbeddingOp,
23244
23430
  updateVaultMemoryOp: () => updateVaultMemoryOp,
23245
23431
  upsertConversationSummaryOp: () => upsertConversationSummaryOp,
@@ -25920,182 +26106,8 @@ async function cleanupConversationSummary(database, conversationId) {
25920
26106
  // src/lib/db/memoryVault/index.ts
25921
26107
  init_operations3();
25922
26108
 
25923
- // src/lib/db/vaultFolders/operations.ts
25924
- var import_watermelondb18 = __toESM(require_watermelondb());
25925
- function folderToStored(folder) {
25926
- return {
25927
- uniqueId: folder.id,
25928
- name: folder.name,
25929
- scope: folder.scope,
25930
- createdAt: folder.createdAt,
25931
- updatedAt: folder.updatedAt,
25932
- isDeleted: folder.isDeleted,
25933
- isSystem: folder.isSystem ?? false,
25934
- context: folder.context ?? null
25935
- };
25936
- }
25937
- async function createVaultFolderOp(ctx, opts) {
25938
- const created = await ctx.database.write(async () => {
25939
- return ctx.vaultFolderCollection.create((record) => {
25940
- record._setRaw("name", opts.name);
25941
- record._setRaw("scope", opts.scope ?? "private");
25942
- record._setRaw("is_system", opts.isSystem ?? false);
25943
- record._setRaw("is_deleted", false);
25944
- });
25945
- });
25946
- return folderToStored(created);
25947
- }
25948
- async function getAllVaultFoldersOp(ctx) {
25949
- const results = await ctx.vaultFolderCollection.query(import_watermelondb18.Q.where("is_deleted", false), import_watermelondb18.Q.sortBy("created_at", import_watermelondb18.Q.desc)).fetch();
25950
- return results.map(folderToStored);
25951
- }
25952
- async function updateVaultFolderOp(ctx, id, opts) {
25953
- try {
25954
- const record = await ctx.vaultFolderCollection.find(id);
25955
- if (record.isDeleted) return null;
25956
- const scopeChanged = opts.scope !== void 0 && opts.scope !== record.scope;
25957
- const updated = await ctx.database.write(async () => {
25958
- const memories = scopeChanged ? await ctx.vaultMemoryCollection.query(import_watermelondb18.Q.where("folder_id", id), import_watermelondb18.Q.where("is_deleted", false)).fetch() : [];
25959
- const updates = [];
25960
- updates.push(
25961
- record.prepareUpdate((r) => {
25962
- if (opts.name !== void 0) r._setRaw("name", opts.name);
25963
- if (opts.scope !== void 0) r._setRaw("scope", opts.scope);
25964
- })
25965
- );
25966
- for (const memory of memories) {
25967
- updates.push(
25968
- memory.prepareUpdate((r) => {
25969
- r._setRaw("scope", opts.scope);
25970
- })
25971
- );
25972
- }
25973
- await ctx.database.batch(...updates);
25974
- return ctx.vaultFolderCollection.find(id);
25975
- });
25976
- return folderToStored(updated);
25977
- } catch {
25978
- return null;
25979
- }
25980
- }
25981
- async function deleteVaultFolderOp(ctx, id) {
25982
- try {
25983
- const record = await ctx.vaultFolderCollection.find(id);
25984
- if (record.isDeleted) return false;
25985
- await ctx.database.write(async () => {
25986
- const memories = await ctx.vaultMemoryCollection.query(import_watermelondb18.Q.where("folder_id", id), import_watermelondb18.Q.where("is_deleted", false)).fetch();
25987
- const preparedMemories = memories.map(
25988
- (memory) => memory.prepareUpdate((r) => {
25989
- r._setRaw("folder_id", null);
25990
- r._setRaw("scope", "private");
25991
- })
25992
- );
25993
- const preparedFolder = record.prepareUpdate((r) => {
25994
- r._setRaw("is_deleted", true);
25995
- });
25996
- await ctx.database.batch(...preparedMemories, preparedFolder);
25997
- });
25998
- return true;
25999
- } catch {
26000
- return false;
26001
- }
26002
- }
26003
- async function moveMemoriesToFolderOp(ctx, memoryIds, folderId) {
26004
- if (memoryIds.length === 0) return true;
26005
- try {
26006
- let targetScope = "private";
26007
- if (folderId) {
26008
- const folder = await ctx.vaultFolderCollection.find(folderId);
26009
- if (folder.isDeleted) return false;
26010
- targetScope = folder.scope;
26011
- }
26012
- let movedCount = 0;
26013
- await ctx.database.write(async () => {
26014
- const memories = [];
26015
- for (const id of memoryIds) {
26016
- try {
26017
- const m = await ctx.vaultMemoryCollection.find(id);
26018
- if (!m.isDeleted) memories.push(m);
26019
- } catch {
26020
- }
26021
- }
26022
- if (memories.length === 0) return;
26023
- const prepared = memories.map(
26024
- (memory) => memory.prepareUpdate((r) => {
26025
- r._setRaw("folder_id", folderId);
26026
- r._setRaw("scope", targetScope);
26027
- })
26028
- );
26029
- await ctx.database.batch(...prepared);
26030
- movedCount = memories.length;
26031
- });
26032
- return movedCount > 0;
26033
- } catch {
26034
- return false;
26035
- }
26036
- }
26037
- async function updateVaultFolderContextOp(ctx, id, context) {
26038
- try {
26039
- const record = await ctx.vaultFolderCollection.find(id);
26040
- if (record.isDeleted) return null;
26041
- const updated = await ctx.database.write(async () => {
26042
- await ctx.database.batch(
26043
- record.prepareUpdate((r) => {
26044
- r._setRaw("context", context);
26045
- })
26046
- );
26047
- return ctx.vaultFolderCollection.find(id);
26048
- });
26049
- return folderToStored(updated);
26050
- } catch {
26051
- return null;
26052
- }
26053
- }
26054
- async function getVaultFolderMemoryCountOp(ctx, folderId) {
26055
- return await ctx.vaultMemoryCollection.query(import_watermelondb18.Q.where("folder_id", folderId), import_watermelondb18.Q.where("is_deleted", false)).fetchCount();
26056
- }
26057
-
26058
- // src/lib/db/vaultFolders/defaults.ts
26059
- var DEFAULT_FOLDER_NAMES = ["Personal", "Work", "Interests"];
26060
- var ensureDefaultFoldersLocks = /* @__PURE__ */ new WeakMap();
26061
- async function ensureDefaultFoldersOp(ctx) {
26062
- const existing = ensureDefaultFoldersLocks.get(ctx.database);
26063
- if (existing) return existing;
26064
- const promise = _ensureDefaultFoldersImpl(ctx);
26065
- ensureDefaultFoldersLocks.set(ctx.database, promise);
26066
- try {
26067
- return await promise;
26068
- } finally {
26069
- ensureDefaultFoldersLocks.delete(ctx.database);
26070
- }
26071
- }
26072
- async function _ensureDefaultFoldersImpl(ctx) {
26073
- const existing = await getAllVaultFoldersOp(ctx);
26074
- const folderMap = /* @__PURE__ */ new Map();
26075
- const existingByName = new Map(existing.map((f) => [f.name, f]));
26076
- for (const name of DEFAULT_FOLDER_NAMES) {
26077
- const found = existingByName.get(name);
26078
- if (found) {
26079
- folderMap.set(found.name, found.uniqueId);
26080
- } else {
26081
- const created = await createVaultFolderOp(ctx, {
26082
- name,
26083
- scope: "private",
26084
- isSystem: true
26085
- });
26086
- folderMap.set(created.name, created.uniqueId);
26087
- }
26088
- }
26089
- for (const folder of existing) {
26090
- if (!folderMap.has(folder.name)) {
26091
- folderMap.set(folder.name, folder.uniqueId);
26092
- }
26093
- }
26094
- return folderMap;
26095
- }
26096
-
26097
26109
  // src/lib/db/project/operations.ts
26098
- var import_watermelondb19 = __toESM(require_watermelondb());
26110
+ var import_watermelondb18 = __toESM(require_watermelondb());
26099
26111
  init_operations();
26100
26112
 
26101
26113
  // src/lib/db/project/types.ts
@@ -26127,15 +26139,15 @@ async function createProjectOp(ctx, opts, defaultName = "New Project") {
26127
26139
  return projectToStored(created);
26128
26140
  }
26129
26141
  async function getProjectOp(ctx, id) {
26130
- const results = await ctx.projectsCollection.query(import_watermelondb19.Q.where("project_id", id), import_watermelondb19.Q.where("is_deleted", false)).fetch();
26142
+ const results = await ctx.projectsCollection.query(import_watermelondb18.Q.where("project_id", id), import_watermelondb18.Q.where("is_deleted", false)).fetch();
26131
26143
  return results.length > 0 ? projectToStored(results[0]) : null;
26132
26144
  }
26133
26145
  async function getProjectsOp(ctx) {
26134
- const results = await ctx.projectsCollection.query(import_watermelondb19.Q.where("is_deleted", false), import_watermelondb19.Q.sortBy("created_at", import_watermelondb19.Q.desc)).fetch();
26146
+ const results = await ctx.projectsCollection.query(import_watermelondb18.Q.where("is_deleted", false), import_watermelondb18.Q.sortBy("created_at", import_watermelondb18.Q.desc)).fetch();
26135
26147
  return results.map(projectToStored);
26136
26148
  }
26137
26149
  async function updateProjectNameOp(ctx, id, name) {
26138
- const results = await ctx.projectsCollection.query(import_watermelondb19.Q.where("project_id", id), import_watermelondb19.Q.where("is_deleted", false)).fetch();
26150
+ const results = await ctx.projectsCollection.query(import_watermelondb18.Q.where("project_id", id), import_watermelondb18.Q.where("is_deleted", false)).fetch();
26139
26151
  if (results.length > 0) {
26140
26152
  await ctx.database.write(async () => {
26141
26153
  await results[0].update((proj) => {
@@ -26147,7 +26159,7 @@ async function updateProjectNameOp(ctx, id, name) {
26147
26159
  return false;
26148
26160
  }
26149
26161
  async function updateProjectOp(ctx, id, opts) {
26150
- const results = await ctx.projectsCollection.query(import_watermelondb19.Q.where("project_id", id), import_watermelondb19.Q.where("is_deleted", false)).fetch();
26162
+ const results = await ctx.projectsCollection.query(import_watermelondb18.Q.where("project_id", id), import_watermelondb18.Q.where("is_deleted", false)).fetch();
26151
26163
  if (results.length > 0) {
26152
26164
  await ctx.database.write(async () => {
26153
26165
  await results[0].update((proj) => {
@@ -26159,7 +26171,7 @@ async function updateProjectOp(ctx, id, opts) {
26159
26171
  return false;
26160
26172
  }
26161
26173
  async function deleteProjectOp(ctx, id) {
26162
- const results = await ctx.projectsCollection.query(import_watermelondb19.Q.where("project_id", id), import_watermelondb19.Q.where("is_deleted", false)).fetch();
26174
+ const results = await ctx.projectsCollection.query(import_watermelondb18.Q.where("project_id", id), import_watermelondb18.Q.where("is_deleted", false)).fetch();
26163
26175
  if (results.length > 0) {
26164
26176
  await ctx.database.write(async () => {
26165
26177
  await results[0].update((proj) => {
@@ -26172,14 +26184,14 @@ async function deleteProjectOp(ctx, id) {
26172
26184
  }
26173
26185
  async function getProjectConversationsOp(ctx, projectId) {
26174
26186
  const results = await ctx.conversationsCollection.query(
26175
- import_watermelondb19.Q.where("project_id", projectId),
26176
- import_watermelondb19.Q.where("is_deleted", false),
26177
- import_watermelondb19.Q.sortBy("created_at", import_watermelondb19.Q.desc)
26187
+ import_watermelondb18.Q.where("project_id", projectId),
26188
+ import_watermelondb18.Q.where("is_deleted", false),
26189
+ import_watermelondb18.Q.sortBy("created_at", import_watermelondb18.Q.desc)
26178
26190
  ).fetch();
26179
26191
  return results.map(conversationToStoredRaw);
26180
26192
  }
26181
26193
  async function getProjectConversationCountOp(ctx, projectId) {
26182
- return await ctx.conversationsCollection.query(import_watermelondb19.Q.where("project_id", projectId), import_watermelondb19.Q.where("is_deleted", false)).fetchCount();
26194
+ return await ctx.conversationsCollection.query(import_watermelondb18.Q.where("project_id", projectId), import_watermelondb18.Q.where("is_deleted", false)).fetchCount();
26183
26195
  }
26184
26196
 
26185
26197
  // src/lib/db/media/types.ts
@@ -26206,7 +26218,7 @@ function isSupportedMediaType(mimeType) {
26206
26218
  }
26207
26219
 
26208
26220
  // src/lib/db/media/operations.ts
26209
- var import_watermelondb20 = __toESM(require_watermelondb());
26221
+ var import_watermelondb19 = __toESM(require_watermelondb());
26210
26222
  init_logger();
26211
26223
 
26212
26224
  // src/lib/storage/mcpImages.ts
@@ -26440,7 +26452,7 @@ async function createMediaBatchOp(ctx, optionsArray) {
26440
26452
  })
26441
26453
  );
26442
26454
  });
26443
- const results = await mediaCollection.query(import_watermelondb20.Q.where("media_id", import_watermelondb20.Q.oneOf(mediaIds))).fetch();
26455
+ const results = await mediaCollection.query(import_watermelondb19.Q.where("media_id", import_watermelondb19.Q.oneOf(mediaIds))).fetch();
26444
26456
  return Promise.all(
26445
26457
  results.map(
26446
26458
  (m) => mediaToStored(m, ctx.walletAddress, ctx.signMessage, ctx.embeddedWalletSigner)
@@ -26449,21 +26461,21 @@ async function createMediaBatchOp(ctx, optionsArray) {
26449
26461
  }
26450
26462
  async function getMediaByIdOp(ctx, mediaId) {
26451
26463
  const mediaCollection = ctx.database.get("media");
26452
- const results = await mediaCollection.query(import_watermelondb20.Q.where("media_id", mediaId), import_watermelondb20.Q.where("is_deleted", false)).fetch();
26464
+ const results = await mediaCollection.query(import_watermelondb19.Q.where("media_id", mediaId), import_watermelondb19.Q.where("is_deleted", false)).fetch();
26453
26465
  return results.length > 0 ? await mediaToStored(results[0], ctx.walletAddress, ctx.signMessage, ctx.embeddedWalletSigner) : null;
26454
26466
  }
26455
26467
  async function getMediaBySourceUrlOp(ctx, sourceUrl, walletAddress) {
26456
26468
  const mediaCollection = ctx.database.get("media");
26457
26469
  const results = await mediaCollection.query(
26458
- import_watermelondb20.Q.where("source_url", sourceUrl),
26459
- import_watermelondb20.Q.where("wallet_address", walletAddress),
26460
- import_watermelondb20.Q.where("is_deleted", false)
26470
+ import_watermelondb19.Q.where("source_url", sourceUrl),
26471
+ import_watermelondb19.Q.where("wallet_address", walletAddress),
26472
+ import_watermelondb19.Q.where("is_deleted", false)
26461
26473
  ).fetch();
26462
26474
  return results.length > 0 ? await mediaToStored(results[0], ctx.walletAddress, ctx.signMessage, ctx.embeddedWalletSigner) : null;
26463
26475
  }
26464
26476
  async function updateMediaOp(ctx, mediaId, options) {
26465
26477
  const mediaCollection = ctx.database.get("media");
26466
- const results = await mediaCollection.query(import_watermelondb20.Q.where("media_id", mediaId)).fetch();
26478
+ const results = await mediaCollection.query(import_watermelondb19.Q.where("media_id", mediaId)).fetch();
26467
26479
  if (results.length === 0) {
26468
26480
  return null;
26469
26481
  }
@@ -26483,7 +26495,7 @@ async function updateMediaOp(ctx, mediaId, options) {
26483
26495
  m._setRaw("updated_at", now);
26484
26496
  });
26485
26497
  });
26486
- const updated = await mediaCollection.query(import_watermelondb20.Q.where("media_id", mediaId)).fetch();
26498
+ const updated = await mediaCollection.query(import_watermelondb19.Q.where("media_id", mediaId)).fetch();
26487
26499
  return updated.length > 0 ? await mediaToStored(updated[0], ctx.walletAddress, ctx.signMessage, ctx.embeddedWalletSigner) : null;
26488
26500
  }
26489
26501
  async function updateMediaMessageIdBatchOp(ctx, mediaIds, messageId) {
@@ -26491,7 +26503,7 @@ async function updateMediaMessageIdBatchOp(ctx, mediaIds, messageId) {
26491
26503
  return 0;
26492
26504
  }
26493
26505
  const mediaCollection = ctx.database.get("media");
26494
- const results = await mediaCollection.query(import_watermelondb20.Q.where("media_id", import_watermelondb20.Q.oneOf(mediaIds))).fetch();
26506
+ const results = await mediaCollection.query(import_watermelondb19.Q.where("media_id", import_watermelondb19.Q.oneOf(mediaIds))).fetch();
26495
26507
  if (results.length === 0) {
26496
26508
  return 0;
26497
26509
  }
@@ -26513,13 +26525,13 @@ var IMAGE_VIDEO_MIMES = VIDEO_EXTENSIONS.map((ext) => `image/${ext}`);
26513
26525
  async function relinkMisclassifiedVideosOp(ctx, walletAddress) {
26514
26526
  const mediaCollection = ctx.database.get("media");
26515
26527
  const candidates = await mediaCollection.query(
26516
- import_watermelondb20.Q.where("wallet_address", walletAddress),
26517
- import_watermelondb20.Q.where("is_deleted", false),
26518
- import_watermelondb20.Q.where("media_type", "image"),
26519
- import_watermelondb20.Q.or(
26520
- import_watermelondb20.Q.where("mime_type", import_watermelondb20.Q.like("video/%")),
26521
- ...IMAGE_VIDEO_MIMES.map((m) => import_watermelondb20.Q.where("mime_type", m)),
26522
- import_watermelondb20.Q.where("mime_type", "application/octet-stream")
26528
+ import_watermelondb19.Q.where("wallet_address", walletAddress),
26529
+ import_watermelondb19.Q.where("is_deleted", false),
26530
+ import_watermelondb19.Q.where("media_type", "image"),
26531
+ import_watermelondb19.Q.or(
26532
+ import_watermelondb19.Q.where("mime_type", import_watermelondb19.Q.like("video/%")),
26533
+ ...IMAGE_VIDEO_MIMES.map((m) => import_watermelondb19.Q.where("mime_type", m)),
26534
+ import_watermelondb19.Q.where("mime_type", "application/octet-stream")
26523
26535
  )
26524
26536
  ).fetch();
26525
26537
  if (candidates.length === 0) {
@@ -26568,7 +26580,7 @@ async function relinkMisclassifiedVideosOp(ctx, walletAddress) {
26568
26580
  }
26569
26581
  async function deleteMediaOp(ctx, mediaId) {
26570
26582
  const mediaCollection = ctx.database.get("media");
26571
- const results = await mediaCollection.query(import_watermelondb20.Q.where("media_id", mediaId)).fetch();
26583
+ const results = await mediaCollection.query(import_watermelondb19.Q.where("media_id", mediaId)).fetch();
26572
26584
  if (results.length === 0) {
26573
26585
  return false;
26574
26586
  }
@@ -26586,7 +26598,7 @@ async function deleteMediaOp(ctx, mediaId) {
26586
26598
  }
26587
26599
  async function hardDeleteMediaOp(ctx, mediaId) {
26588
26600
  const mediaCollection = ctx.database.get("media");
26589
- const results = await mediaCollection.query(import_watermelondb20.Q.where("media_id", mediaId)).fetch();
26601
+ const results = await mediaCollection.query(import_watermelondb19.Q.where("media_id", mediaId)).fetch();
26590
26602
  if (results.length === 0) {
26591
26603
  return false;
26592
26604
  }
@@ -26598,28 +26610,28 @@ async function hardDeleteMediaOp(ctx, mediaId) {
26598
26610
  }
26599
26611
  async function getMediaOp(ctx, filters) {
26600
26612
  const mediaCollection = ctx.database.get("media");
26601
- const conditions = [import_watermelondb20.Q.where("wallet_address", filters.walletAddress)];
26613
+ const conditions = [import_watermelondb19.Q.where("wallet_address", filters.walletAddress)];
26602
26614
  if (!filters.includeDeleted) {
26603
- conditions.push(import_watermelondb20.Q.where("is_deleted", false));
26615
+ conditions.push(import_watermelondb19.Q.where("is_deleted", false));
26604
26616
  }
26605
26617
  if (filters.mediaType) {
26606
- conditions.push(import_watermelondb20.Q.where("media_type", filters.mediaType));
26618
+ conditions.push(import_watermelondb19.Q.where("media_type", filters.mediaType));
26607
26619
  }
26608
26620
  if (filters.role) {
26609
- conditions.push(import_watermelondb20.Q.where("role", filters.role));
26621
+ conditions.push(import_watermelondb19.Q.where("role", filters.role));
26610
26622
  }
26611
26623
  if (filters.conversationId) {
26612
- conditions.push(import_watermelondb20.Q.where("conversation_id", filters.conversationId));
26624
+ conditions.push(import_watermelondb19.Q.where("conversation_id", filters.conversationId));
26613
26625
  }
26614
26626
  if (filters.model) {
26615
- conditions.push(import_watermelondb20.Q.where("model", filters.model));
26627
+ conditions.push(import_watermelondb19.Q.where("model", filters.model));
26616
26628
  }
26617
- conditions.push(import_watermelondb20.Q.sortBy("created_at", import_watermelondb20.Q.desc));
26629
+ conditions.push(import_watermelondb19.Q.sortBy("created_at", import_watermelondb19.Q.desc));
26618
26630
  if (filters.limit) {
26619
- conditions.push(import_watermelondb20.Q.take(filters.limit));
26631
+ conditions.push(import_watermelondb19.Q.take(filters.limit));
26620
26632
  }
26621
26633
  if (filters.offset) {
26622
- conditions.push(import_watermelondb20.Q.skip(filters.offset));
26634
+ conditions.push(import_watermelondb19.Q.skip(filters.offset));
26623
26635
  }
26624
26636
  const results = await mediaCollection.query(...conditions).fetch();
26625
26637
  return Promise.all(
@@ -26649,9 +26661,9 @@ async function getMediaByConversationOp(ctx, walletAddress, conversationId, limi
26649
26661
  async function getMediaByMessageOp(ctx, messageId) {
26650
26662
  const mediaCollection = ctx.database.get("media");
26651
26663
  const results = await mediaCollection.query(
26652
- import_watermelondb20.Q.where("message_id", messageId),
26653
- import_watermelondb20.Q.where("is_deleted", false),
26654
- import_watermelondb20.Q.sortBy("created_at", import_watermelondb20.Q.asc)
26664
+ import_watermelondb19.Q.where("message_id", messageId),
26665
+ import_watermelondb19.Q.where("is_deleted", false),
26666
+ import_watermelondb19.Q.sortBy("created_at", import_watermelondb19.Q.asc)
26655
26667
  ).fetch();
26656
26668
  return Promise.all(
26657
26669
  results.map(
@@ -26664,9 +26676,9 @@ async function getMediaByIdsOp(ctx, mediaIds, includeDeleted = false) {
26664
26676
  return [];
26665
26677
  }
26666
26678
  const mediaCollection = ctx.database.get("media");
26667
- const conditions = [import_watermelondb20.Q.where("media_id", import_watermelondb20.Q.oneOf(mediaIds))];
26679
+ const conditions = [import_watermelondb19.Q.where("media_id", import_watermelondb19.Q.oneOf(mediaIds))];
26668
26680
  if (!includeDeleted) {
26669
- conditions.push(import_watermelondb20.Q.where("is_deleted", false));
26681
+ conditions.push(import_watermelondb19.Q.where("is_deleted", false));
26670
26682
  }
26671
26683
  const results = await mediaCollection.query(...conditions).fetch();
26672
26684
  const mediaMap = new Map(results.map((m) => [m.mediaId, m]));
@@ -26703,10 +26715,10 @@ async function searchMediaOp(ctx, walletAddress, query, limit) {
26703
26715
  const queryLower = query.toLowerCase();
26704
26716
  const MAX_SEARCH_RECORDS = 500;
26705
26717
  const allResults = await mediaCollection.query(
26706
- import_watermelondb20.Q.where("wallet_address", walletAddress),
26707
- import_watermelondb20.Q.where("is_deleted", false),
26708
- import_watermelondb20.Q.sortBy("created_at", import_watermelondb20.Q.desc),
26709
- import_watermelondb20.Q.take(MAX_SEARCH_RECORDS)
26718
+ import_watermelondb19.Q.where("wallet_address", walletAddress),
26719
+ import_watermelondb19.Q.where("is_deleted", false),
26720
+ import_watermelondb19.Q.sortBy("created_at", import_watermelondb19.Q.desc),
26721
+ import_watermelondb19.Q.take(MAX_SEARCH_RECORDS)
26710
26722
  ).fetch();
26711
26723
  const decrypted = await Promise.all(
26712
26724
  allResults.map(
@@ -26719,11 +26731,11 @@ async function searchMediaOp(ctx, walletAddress, query, limit) {
26719
26731
  async function getMediaCountOp(ctx, walletAddress, mediaType) {
26720
26732
  const mediaCollection = ctx.database.get("media");
26721
26733
  const conditions = [
26722
- import_watermelondb20.Q.where("wallet_address", walletAddress),
26723
- import_watermelondb20.Q.where("is_deleted", false)
26734
+ import_watermelondb19.Q.where("wallet_address", walletAddress),
26735
+ import_watermelondb19.Q.where("is_deleted", false)
26724
26736
  ];
26725
26737
  if (mediaType) {
26726
- conditions.push(import_watermelondb20.Q.where("media_type", mediaType));
26738
+ conditions.push(import_watermelondb19.Q.where("media_type", mediaType));
26727
26739
  }
26728
26740
  return await mediaCollection.query(...conditions).fetchCount();
26729
26741
  }
@@ -26738,7 +26750,7 @@ async function getMediaCountsByTypeOp(ctx, walletAddress) {
26738
26750
  }
26739
26751
  async function deleteMediaByConversationOp(ctx, conversationId) {
26740
26752
  const mediaCollection = ctx.database.get("media");
26741
- const results = await mediaCollection.query(import_watermelondb20.Q.where("conversation_id", conversationId), import_watermelondb20.Q.where("is_deleted", false)).fetch();
26753
+ const results = await mediaCollection.query(import_watermelondb19.Q.where("conversation_id", conversationId), import_watermelondb19.Q.where("is_deleted", false)).fetch();
26742
26754
  if (results.length === 0) {
26743
26755
  return 0;
26744
26756
  }
@@ -26759,7 +26771,7 @@ async function deleteMediaByConversationOp(ctx, conversationId) {
26759
26771
  }
26760
26772
  async function deleteMediaByMessageOp(ctx, messageId) {
26761
26773
  const mediaCollection = ctx.database.get("media");
26762
- const results = await mediaCollection.query(import_watermelondb20.Q.where("message_id", messageId), import_watermelondb20.Q.where("is_deleted", false)).fetch();
26774
+ const results = await mediaCollection.query(import_watermelondb19.Q.where("message_id", messageId), import_watermelondb19.Q.where("is_deleted", false)).fetch();
26763
26775
  if (results.length === 0) {
26764
26776
  return 0;
26765
26777
  }
@@ -26780,7 +26792,7 @@ async function deleteMediaByMessageOp(ctx, messageId) {
26780
26792
  }
26781
26793
 
26782
26794
  // src/lib/db/userPreferences/operations.ts
26783
- var import_watermelondb21 = __toESM(require_watermelondb());
26795
+ var import_watermelondb20 = __toESM(require_watermelondb());
26784
26796
  function userPreferenceToStored(preference) {
26785
26797
  return {
26786
26798
  uniqueId: preference.id,
@@ -26795,7 +26807,7 @@ function userPreferenceToStored(preference) {
26795
26807
  };
26796
26808
  }
26797
26809
  async function getUserPreferenceOp(ctx, walletAddress) {
26798
- const results = await ctx.userPreferencesCollection.query(import_watermelondb21.Q.where("wallet_address", walletAddress)).fetch();
26810
+ const results = await ctx.userPreferencesCollection.query(import_watermelondb20.Q.where("wallet_address", walletAddress)).fetch();
26799
26811
  return results.length > 0 ? userPreferenceToStored(results[0]) : null;
26800
26812
  }
26801
26813
  async function createUserPreferenceOp(ctx, opts) {
@@ -26815,7 +26827,7 @@ async function createUserPreferenceOp(ctx, opts) {
26815
26827
  return userPreferenceToStored(created);
26816
26828
  }
26817
26829
  async function updateUserPreferenceOp(ctx, walletAddress, opts) {
26818
- const results = await ctx.userPreferencesCollection.query(import_watermelondb21.Q.where("wallet_address", walletAddress)).fetch();
26830
+ const results = await ctx.userPreferencesCollection.query(import_watermelondb20.Q.where("wallet_address", walletAddress)).fetch();
26819
26831
  if (results.length === 0) return null;
26820
26832
  const preference = results[0];
26821
26833
  await ctx.database.write(async () => {
@@ -26843,7 +26855,7 @@ async function updateUserPreferenceOp(ctx, walletAddress, opts) {
26843
26855
  async function setUserPreferenceOp(ctx, walletAddress, opts) {
26844
26856
  const now = Date.now();
26845
26857
  const result = await ctx.database.write(async () => {
26846
- const results = await ctx.userPreferencesCollection.query(import_watermelondb21.Q.where("wallet_address", walletAddress)).fetch();
26858
+ const results = await ctx.userPreferencesCollection.query(import_watermelondb20.Q.where("wallet_address", walletAddress)).fetch();
26847
26859
  if (results.length > 0) {
26848
26860
  const preference = results[0];
26849
26861
  await preference.update((pref) => {
@@ -26891,7 +26903,7 @@ async function updateModelsOp(ctx, walletAddress, models) {
26891
26903
  return updateUserPreferenceOp(ctx, walletAddress, { models });
26892
26904
  }
26893
26905
  async function deleteUserPreferenceOp(ctx, walletAddress) {
26894
- const results = await ctx.userPreferencesCollection.query(import_watermelondb21.Q.where("wallet_address", walletAddress)).fetch();
26906
+ const results = await ctx.userPreferencesCollection.query(import_watermelondb20.Q.where("wallet_address", walletAddress)).fetch();
26895
26907
  if (results.length === 0) return false;
26896
26908
  await ctx.database.write(async () => {
26897
26909
  await results[0].destroyPermanently();
@@ -26906,9 +26918,9 @@ async function migrateFromModelPreferencesOp(ctx, walletAddress) {
26906
26918
  if (existing) {
26907
26919
  return existing;
26908
26920
  }
26909
- const modelResults = await ctx.modelPreferencesCollection.query(import_watermelondb21.Q.where("wallet_address", walletAddress)).fetch();
26921
+ const modelResults = await ctx.modelPreferencesCollection.query(import_watermelondb20.Q.where("wallet_address", walletAddress)).fetch();
26910
26922
  const personalityKey = `${walletAddress}_personality_settings`;
26911
- const personalityResults = await ctx.modelPreferencesCollection.query(import_watermelondb21.Q.where("wallet_address", personalityKey)).fetch();
26923
+ const personalityResults = await ctx.modelPreferencesCollection.query(import_watermelondb20.Q.where("wallet_address", personalityKey)).fetch();
26912
26924
  if (modelResults.length === 0 && personalityResults.length === 0) {
26913
26925
  return null;
26914
26926
  }
@@ -26988,7 +27000,7 @@ var SLIDER_CONFIG = [
26988
27000
  ];
26989
27001
 
26990
27002
  // src/lib/db/settings/operations.ts
26991
- var import_watermelondb22 = __toESM(require_watermelondb());
27003
+ var import_watermelondb21 = __toESM(require_watermelondb());
26992
27004
  function modelPreferenceToStored(preference) {
26993
27005
  return {
26994
27006
  uniqueId: preference.id,
@@ -26997,12 +27009,12 @@ function modelPreferenceToStored(preference) {
26997
27009
  };
26998
27010
  }
26999
27011
  async function getModelPreferenceOp(ctx, walletAddress) {
27000
- const results = await ctx.modelPreferencesCollection.query(import_watermelondb22.Q.where("wallet_address", walletAddress)).fetch();
27012
+ const results = await ctx.modelPreferencesCollection.query(import_watermelondb21.Q.where("wallet_address", walletAddress)).fetch();
27001
27013
  return results.length > 0 ? modelPreferenceToStored(results[0]) : null;
27002
27014
  }
27003
27015
  async function setModelPreferenceOp(ctx, walletAddress, models) {
27004
27016
  const result = await ctx.database.write(async () => {
27005
- const results = await ctx.modelPreferencesCollection.query(import_watermelondb22.Q.where("wallet_address", walletAddress)).fetch();
27017
+ const results = await ctx.modelPreferencesCollection.query(import_watermelondb21.Q.where("wallet_address", walletAddress)).fetch();
27006
27018
  if (results.length > 0) {
27007
27019
  const preference = results[0];
27008
27020
  await preference.update((pref) => {
@@ -27020,7 +27032,7 @@ async function setModelPreferenceOp(ctx, walletAddress, models) {
27020
27032
  return modelPreferenceToStored(result);
27021
27033
  }
27022
27034
  async function deleteModelPreferenceOp(ctx, walletAddress) {
27023
- const results = await ctx.modelPreferencesCollection.query(import_watermelondb22.Q.where("wallet_address", walletAddress)).fetch();
27035
+ const results = await ctx.modelPreferencesCollection.query(import_watermelondb21.Q.where("wallet_address", walletAddress)).fetch();
27024
27036
  if (results.length === 0) return false;
27025
27037
  await ctx.database.write(async () => {
27026
27038
  await results[0].destroyPermanently();
@@ -27366,7 +27378,7 @@ function createMemoryVaultTool(vaultCtx, options, embeddingOptions, cache) {
27366
27378
  }
27367
27379
 
27368
27380
  // src/lib/memory/autoExtract.ts
27369
- var import_watermelondb23 = __toESM(require_watermelondb());
27381
+ var import_watermelondb22 = __toESM(require_watermelondb());
27370
27382
  init_operations2();
27371
27383
  init_types3();
27372
27384
  init_logger();
@@ -27835,6 +27847,11 @@ async function retain(content, ctx, options = {}) {
27835
27847
  ...options.folderId !== void 0 && { folderId: options.folderId }
27836
27848
  }
27837
27849
  );
27850
+ if (prepared.embeddingFailure || prepared.embeddingsUnavailable) {
27851
+ throw new Error(
27852
+ "retain: embeddings unavailable \u2014 refusing to auto-merge against an inert cosine lane, which would create a duplicate instead of merging into the existing memory. Retry when embeddings recover, or pass enableAutoMerge: false to force a create."
27853
+ );
27854
+ }
27838
27855
  if (options.consolidateOptions) {
27839
27856
  const outcome = await tryConsolidate(trimmed, ctx, options, prepared);
27840
27857
  if (outcome) {
@@ -28159,7 +28176,7 @@ async function assertMergeTargetGoneOrThrow(ctx, targetId) {
28159
28176
  // src/lib/memory/autoExtract.ts
28160
28177
  async function isMemoryTopicsUserManaged(ctx, memoryId) {
28161
28178
  try {
28162
- const rows = await ctx.database.get(VaultMemory.table).query(import_watermelondb23.Q.where("id", memoryId)).fetch();
28179
+ const rows = await ctx.database.get(VaultMemory.table).query(import_watermelondb22.Q.where("id", memoryId)).fetch();
28163
28180
  return rows[0]?.topicsUserManaged === true;
28164
28181
  } catch {
28165
28182
  return true;
@@ -29086,12 +29103,7 @@ init_recall();
29086
29103
 
29087
29104
  // src/lib/memory/recallTool.ts
29088
29105
  init_recall();
29089
-
29090
- // src/lib/memory/recallConstants.ts
29091
- var RECALL_TOOL_NAME = "recall_memory";
29092
- var RECALL_MAX_LIMIT = 50;
29093
-
29094
- // src/lib/memory/recallTool.ts
29106
+ init_recallConstants();
29095
29107
  var DEFAULT_LIMIT2 = 8;
29096
29108
  var DEFAULT_BUDGET2 = "low";
29097
29109
  function formatEventTime(start, end, kind) {
@@ -29241,7 +29253,11 @@ function createRecallTool(ctx, toolOptions, callbacks) {
29241
29253
  conversationMemories += effectiveLimit;
29242
29254
  let surfaced = 0;
29243
29255
  try {
29256
+ let recallDegraded = [];
29244
29257
  const recallOpts = {
29258
+ onDiagnostics: (d) => {
29259
+ recallDegraded = d.degraded;
29260
+ },
29245
29261
  types: defaultTypes,
29246
29262
  limit: effectiveLimit,
29247
29263
  budget: defaultBudget,
@@ -29273,6 +29289,9 @@ function createRecallTool(ctx, toolOptions, callbacks) {
29273
29289
  }
29274
29290
  }
29275
29291
  surfaced = result.memories.length;
29292
+ if (result.memories.length === 0 && recallDegraded.includes("embeddings-unavailable")) {
29293
+ return EMBEDDINGS_DEGRADED_EMPTY;
29294
+ }
29276
29295
  const formatted = formatRecallResult(result.memories);
29277
29296
  return truncatedByBudget && surfaced > 0 ? `${formatted}
29278
29297
 
@@ -29453,6 +29472,7 @@ init_embeddings();
29453
29472
  init_vector();
29454
29473
  init_observationTrend();
29455
29474
  init_recall();
29475
+ init_recallConstants();
29456
29476
  var DEFAULT_SYNTHESIS_MODEL = "inclusionai/ling-2.6-flash";
29457
29477
  var DEFAULT_FACET_RECALL_LIMIT = 20;
29458
29478
  var DEFAULT_FACET_MAX_TOKENS = 512;
@@ -35661,7 +35681,6 @@ function buildSystemPrompt(ctx, options) {
35661
35681
  TextProcessor,
35662
35682
  UserPreference,
35663
35683
  VAULT_SIZE_HOP_CAP,
35664
- VaultFolder,
35665
35684
  VaultMemory,
35666
35685
  WalletPoller,
35667
35686
  WordProcessor,
@@ -35717,7 +35736,6 @@ function buildSystemPrompt(ctx, options) {
35717
35736
  createStockPricePreProcessor,
35718
35737
  createSummaryContext,
35719
35738
  createVaultEmbeddingCache,
35720
- createVaultFolderOp,
35721
35739
  createVaultMemoriesBatchOp,
35722
35740
  createVaultMemoryOp,
35723
35741
  createWeatherPreProcessor,
@@ -35738,7 +35756,6 @@ function buildSystemPrompt(ctx, options) {
35738
35756
  deleteModelPreferenceOp,
35739
35757
  deleteProjectOp,
35740
35758
  deleteUserPreferenceOp,
35741
- deleteVaultFolderOp,
35742
35759
  deleteVaultMemoryOp,
35743
35760
  eagerEmbedContent,
35744
35761
  embedAllMessages,
@@ -35747,7 +35764,6 @@ function buildSystemPrompt(ctx, options) {
35747
35764
  encryptDataBatch,
35748
35765
  encryptDataBytes,
35749
35766
  encryptDataWithKey,
35750
- ensureDefaultFoldersOp,
35751
35767
  estimateMessagesTokens,
35752
35768
  estimateTokens,
35753
35769
  exportPublicKey,
@@ -35763,7 +35779,6 @@ function buildSystemPrompt(ctx, options) {
35763
35779
  generateProjectId,
35764
35780
  getAIGeneratedMediaOp,
35765
35781
  getAllFilesOp,
35766
- getAllVaultFoldersOp,
35767
35782
  getAllVaultMemoriesOp,
35768
35783
  getAllVaultMemoryContentsOp,
35769
35784
  getAudioOp,
@@ -35806,7 +35821,6 @@ function buildSystemPrompt(ctx, options) {
35806
35821
  getUnfiledVaultMemoriesOp,
35807
35822
  getUserPreferenceOp,
35808
35823
  getUserUploadedMediaOp,
35809
- getVaultFolderMemoryCountOp,
35810
35824
  getVaultMemoryOp,
35811
35825
  getVideosOp,
35812
35826
  hardDeleteDecayedOp,
@@ -35822,7 +35836,6 @@ function buildSystemPrompt(ctx, options) {
35822
35836
  maybeSummarizeHistory,
35823
35837
  mediaToStored,
35824
35838
  migrateFromModelPreferencesOp,
35825
- moveMemoriesToFolderOp,
35826
35839
  onKeyAvailable,
35827
35840
  preEmbedVaultMemories,
35828
35841
  preprocessFiles,
@@ -35883,8 +35896,6 @@ function buildSystemPrompt(ctx, options) {
35883
35896
  updateProfileOp,
35884
35897
  updateProjectNameOp,
35885
35898
  updateProjectOp,
35886
- updateVaultFolderContextOp,
35887
- updateVaultFolderOp,
35888
35899
  updateVaultMemoryEmbeddingOp,
35889
35900
  updateVaultMemoryOp,
35890
35901
  upsertConversationSummaryOp,