@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.
- package/dist/expo/{chunk-7CTI3XR6.mjs → chunk-7AW2VD5W.mjs} +284 -93
- package/dist/expo/index.cjs +303 -99
- package/dist/expo/index.d.mts +14 -1
- package/dist/expo/index.d.ts +14 -1
- package/dist/expo/index.mjs +16 -5
- package/dist/expo/{recall-IBGUFY4P.mjs → recall-JWQ4IJX6.mjs} +1 -1
- package/dist/react/{chunk-LAFUCS4U.mjs → chunk-L2QRTJII.mjs} +284 -93
- package/dist/react/index.cjs +303 -99
- package/dist/react/index.d.mts +14 -1
- package/dist/react/index.d.ts +14 -1
- package/dist/react/index.mjs +16 -5
- package/dist/react/{recall-Q5V5DN4L.mjs → recall-DOFCEH2I.mjs} +1 -1
- package/dist/server/{chunk-NCKDSZPQ.mjs → chunk-FZZCEZL2.mjs} +284 -93
- package/dist/server/index.cjs +378 -367
- package/dist/server/index.d.mts +15 -83
- package/dist/server/index.d.ts +15 -83
- package/dist/server/index.mjs +82 -254
- package/dist/server/{recall-AN7HBEFS.mjs → recall-QH3YX6T4.mjs} +1 -1
- package/package.json +1 -1
package/dist/server/index.cjs
CHANGED
|
@@ -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
|
|
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 =
|
|
12388
|
-
this.description =
|
|
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, [
|
|
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
|
|
12412
|
-
})), (0, _toConsumableArray2.default)(where), (0, _toConsumableArray2.default)(sortBy), (0, _toConsumableArray2.default)(take ? [
|
|
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
|
|
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(
|
|
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
|
|
14274
|
-
exports2.Q =
|
|
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
|
|
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(
|
|
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
|
-
|
|
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 {
|
|
21672
|
+
return {
|
|
21673
|
+
memories: [],
|
|
21674
|
+
embeddedItems: [],
|
|
21675
|
+
queryEmbedding: [],
|
|
21676
|
+
vaultSize: 0,
|
|
21677
|
+
laneEmbedFailed: false
|
|
21678
|
+
};
|
|
21616
21679
|
}
|
|
21617
|
-
const queryEmbedding = await
|
|
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
|
-
|
|
21624
|
-
const
|
|
21625
|
-
|
|
21626
|
-
|
|
21627
|
-
|
|
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
|
-
|
|
21664
|
-
|
|
21665
|
-
|
|
21666
|
-
|
|
21667
|
-
|
|
21668
|
-
|
|
21669
|
-
|
|
21670
|
-
|
|
21671
|
-
|
|
21672
|
-
|
|
21673
|
-
|
|
21674
|
-
|
|
21675
|
-
|
|
21676
|
-
|
|
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 {
|
|
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 {
|
|
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 {
|
|
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 {
|
|
21881
|
+
return {
|
|
21882
|
+
memories: [],
|
|
21883
|
+
embeddedItems: [],
|
|
21884
|
+
queryEmbedding: [],
|
|
21885
|
+
vaultSize: loaded.length,
|
|
21886
|
+
embeddingsUnavailable: false,
|
|
21887
|
+
embeddingFailure: false
|
|
21888
|
+
};
|
|
21764
21889
|
}
|
|
21765
|
-
queryEmbedding = await
|
|
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
|
-
|
|
21799
|
-
|
|
21800
|
-
|
|
21801
|
-
|
|
21802
|
-
|
|
21803
|
-
|
|
21804
|
-
|
|
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
|
-
|
|
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
|
-
|
|
21897
|
-
|
|
21898
|
-
|
|
21899
|
-
|
|
21900
|
-
|
|
21901
|
-
|
|
21902
|
-
|
|
21903
|
-
|
|
21904
|
-
|
|
21905
|
-
|
|
21906
|
-
|
|
21907
|
-
|
|
21908
|
-
|
|
21909
|
-
|
|
21910
|
-
|
|
21911
|
-
|
|
21912
|
-
|
|
21913
|
-
|
|
21914
|
-
|
|
21915
|
-
|
|
21916
|
-
|
|
21917
|
-
|
|
21918
|
-
|
|
21919
|
-
|
|
21920
|
-
|
|
21921
|
-
|
|
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 {
|
|
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 {
|
|
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 {
|
|
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
|
-
|
|
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
|
|
22063
|
-
|
|
22064
|
-
|
|
22065
|
-
|
|
22066
|
-
|
|
22067
|
-
|
|
22068
|
-
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
26176
|
-
|
|
26177
|
-
|
|
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(
|
|
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
|
|
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(
|
|
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(
|
|
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
|
-
|
|
26459
|
-
|
|
26460
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
26517
|
-
|
|
26518
|
-
|
|
26519
|
-
|
|
26520
|
-
|
|
26521
|
-
...IMAGE_VIDEO_MIMES.map((m) =>
|
|
26522
|
-
|
|
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(
|
|
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(
|
|
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 = [
|
|
26613
|
+
const conditions = [import_watermelondb19.Q.where("wallet_address", filters.walletAddress)];
|
|
26602
26614
|
if (!filters.includeDeleted) {
|
|
26603
|
-
conditions.push(
|
|
26615
|
+
conditions.push(import_watermelondb19.Q.where("is_deleted", false));
|
|
26604
26616
|
}
|
|
26605
26617
|
if (filters.mediaType) {
|
|
26606
|
-
conditions.push(
|
|
26618
|
+
conditions.push(import_watermelondb19.Q.where("media_type", filters.mediaType));
|
|
26607
26619
|
}
|
|
26608
26620
|
if (filters.role) {
|
|
26609
|
-
conditions.push(
|
|
26621
|
+
conditions.push(import_watermelondb19.Q.where("role", filters.role));
|
|
26610
26622
|
}
|
|
26611
26623
|
if (filters.conversationId) {
|
|
26612
|
-
conditions.push(
|
|
26624
|
+
conditions.push(import_watermelondb19.Q.where("conversation_id", filters.conversationId));
|
|
26613
26625
|
}
|
|
26614
26626
|
if (filters.model) {
|
|
26615
|
-
conditions.push(
|
|
26627
|
+
conditions.push(import_watermelondb19.Q.where("model", filters.model));
|
|
26616
26628
|
}
|
|
26617
|
-
conditions.push(
|
|
26629
|
+
conditions.push(import_watermelondb19.Q.sortBy("created_at", import_watermelondb19.Q.desc));
|
|
26618
26630
|
if (filters.limit) {
|
|
26619
|
-
conditions.push(
|
|
26631
|
+
conditions.push(import_watermelondb19.Q.take(filters.limit));
|
|
26620
26632
|
}
|
|
26621
26633
|
if (filters.offset) {
|
|
26622
|
-
conditions.push(
|
|
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
|
-
|
|
26653
|
-
|
|
26654
|
-
|
|
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 = [
|
|
26679
|
+
const conditions = [import_watermelondb19.Q.where("media_id", import_watermelondb19.Q.oneOf(mediaIds))];
|
|
26668
26680
|
if (!includeDeleted) {
|
|
26669
|
-
conditions.push(
|
|
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
|
-
|
|
26707
|
-
|
|
26708
|
-
|
|
26709
|
-
|
|
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
|
-
|
|
26723
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
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
|
|
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(
|
|
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,
|