fix(memory): defensive markNeedsReindex + drain setImmediate in legacy tests

- store.ts: wrap markMemoryNeedsReindex in safeMarkNeedsReindex helper that swallows
  errors when the DB is no longer available (e.g. test teardown after the parent
  promise resolved). Prevents fire-and-forget vector upserts from triggering
  unhandledRejection in tests.
- memory-store.test.ts: drain setImmediate in afterEach/after hooks so pending
  vector upsert tasks settle before DATA_DIR is removed.
- memory-settings.test.ts: extend deepEqual expected shape with the 7 new fields
  introduced by plan 21 F5 (embeddingSource, embeddingProviderModel,
  transformersEnabled, staticEnabled, rerankEnabled, rerankProviderModel,
  vectorStore).
This commit is contained in:
diegosouzapw
2026-05-28 11:02:25 -03:00
parent 6435a3376d
commit cc243a9d47
3 changed files with 43 additions and 4 deletions

View File

@@ -101,6 +101,19 @@ function findExistingMemory(
* Fire-and-forget: generate embedding for a memory and upsert into sqlite-vec.
* Errors are logged but never thrown — this must never block the SQLite write.
*/
/**
* Best-effort: try to mark a memory needs_reindex. Swallows errors so that DB-closed
* states (e.g. test teardown after the parent promise resolved) never escape as
* unhandledRejection. Producing this side-effect is opportunistic by design.
*/
function safeMarkNeedsReindex(id: string, needs: boolean): void {
try {
markMemoryNeedsReindex(id, needs);
} catch {
// intentional swallow — DB may be closed (test teardown) or schema not yet ready
}
}
function scheduleVectorUpsert(id: string, content: string): void {
setImmediate(async () => {
try {
@@ -115,25 +128,25 @@ function scheduleVectorUpsert(id: string, content: string): void {
reason: embeddingResult.reason,
message: sanitizeErrorMessage(embeddingResult.message),
});
markMemoryNeedsReindex(id, true);
safeMarkNeedsReindex(id, true);
return;
}
const vec = getVectorStore();
if (!vec) {
markMemoryNeedsReindex(id, true);
safeMarkNeedsReindex(id, true);
return;
}
await vec.ensureReady(resolution);
await vec.upsertVector(id, embeddingResult.vector);
markMemoryNeedsReindex(id, false);
safeMarkNeedsReindex(id, false);
} catch (err: unknown) {
log.warn("memory.vec.upsert.fail", {
id,
error: sanitizeErrorMessage(err instanceof Error ? err.message : String(err)),
});
markMemoryNeedsReindex(id, true);
safeMarkNeedsReindex(id, true);
}
});
}