diff --git a/src/cli.ts b/src/cli.ts index 2671ec266..199b7eb05 100755 --- a/src/cli.ts +++ b/src/cli.ts @@ -169,6 +169,10 @@ async function main() { const result = JSON.parse(JSON.stringify(rawResult)); const output = formatResult(op.name, result); if (output) process.stdout.write(output); + if (op.name === 'query') { + const { awaitPendingSearchCacheWrites } = await import('./core/search/hybrid.ts'); + await awaitPendingSearchCacheWrites(); + } } catch (e: unknown) { if (e instanceof OperationError) { console.error(`Error [${e.code}]: ${e.message}`); diff --git a/src/core/search/hybrid.ts b/src/core/search/hybrid.ts index b3073d1ac..bdff5766a 100644 --- a/src/core/search/hybrid.ts +++ b/src/core/search/hybrid.ts @@ -31,6 +31,17 @@ import { const RRF_K = 60; const COMPILED_TRUTH_BOOST = 2.0; +const pendingCacheWrites = new Set>(); + +export async function awaitPendingSearchCacheWrites(): Promise { + if (pendingCacheWrites.size === 0) return; + await Promise.allSettled([...pendingCacheWrites]); +} + +function trackCacheWrite(promise: Promise): void { + pendingCacheWrites.add(promise); + promise.finally(() => pendingCacheWrites.delete(promise)).catch(() => { /* swallow */ }); +} /** * Backlink boost coefficient. Score is multiplied by (1 + BACKLINK_BOOST_COEF * log(1 + count)). * - 0 backlinks: factor = 1.0 (no boost). @@ -861,9 +872,11 @@ export async function hybridSearchCached( results.length > 0 && (innerMeta?.vector_enabled ?? false) ) { - void cache - .store(query, queryEmbedding, results, finalMeta, { sourceId: opts?.sourceId, knobsHash: cacheKnobsHash }) - .catch(() => { /* swallow */ }); + trackCacheWrite( + cache + .store(query, queryEmbedding, results, finalMeta, { sourceId: opts?.sourceId, knobsHash: cacheKnobsHash }) + .catch(() => { /* swallow */ }), + ); } return budgeted;