feat(memory): Add opt-in temporal decay for hybrid search scoring

Exponential decay (half-life configurable, default 30 days) applied
before MMR re-ranking. Dated daily files (memory/YYYY-MM-DD.md) use
filename date; evergreen files (MEMORY.md, topic files) are not
decayed; other sources fall back to file mtime.

Config: memorySearch.query.hybrid.temporalDecay.{enabled, halfLifeDays}
Default: disabled (backwards compatible, opt-in).
This commit is contained in:
Rodrigo Uroz
2026-02-10 08:42:22 -03:00
committed by Peter Steinberger
parent fa9420069a
commit 6b3e0710f4
13 changed files with 1372 additions and 35 deletions

View File

@@ -17,8 +17,8 @@ describe("memory hybrid helpers", () => {
expect(bm25RankToScore(-100)).toBeCloseTo(1);
});
it("mergeHybridResults unions by id and combines weighted scores", () => {
const merged = mergeHybridResults({
it("mergeHybridResults unions by id and combines weighted scores", async () => {
const merged = await mergeHybridResults({
vectorWeight: 0.7,
textWeight: 0.3,
vector: [
@@ -52,8 +52,8 @@ describe("memory hybrid helpers", () => {
expect(b?.score).toBeCloseTo(0.3 * 1.0);
});
it("mergeHybridResults prefers keyword snippet when ids overlap", () => {
const merged = mergeHybridResults({
it("mergeHybridResults prefers keyword snippet when ids overlap", async () => {
const merged = await mergeHybridResults({
vectorWeight: 0.5,
textWeight: 0.5,
vector: [