@hilbras/remembra 3.3.0 → 3.5.0
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/CHANGELOG.md +77 -0
- package/dist/backend.d.ts +3 -1
- package/dist/http.d.ts +1 -1
- package/dist/http.js +44 -4
- package/dist/http.js.map +1 -1
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/retrieval.d.ts +14 -6
- package/dist/retrieval.js +22 -12
- package/dist/retrieval.js.map +1 -1
- package/dist/service.d.ts +8 -1
- package/dist/service.js +95 -8
- package/dist/service.js.map +1 -1
- package/dist/store.d.ts +28 -1
- package/dist/store.js +102 -11
- package/dist/store.js.map +1 -1
- package/dist/types.d.ts +19 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -1
- package/docs/architecture.md +47 -0
- package/docs/clients.md +1 -0
- package/docs/memory-model.md +26 -9
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,83 @@ Format follows [Keep a Changelog](https://keepachangelog.com/).
|
|
|
7
7
|
> (3.0.0 = v3). Earlier releases used independent semver: 0.1.0 = v1,
|
|
8
8
|
> 0.2.0 = v1.5, 0.3.0 = v2, 0.4.0 = v3.
|
|
9
9
|
|
|
10
|
+
## [3.5.0] — 2026-09-23
|
|
11
|
+
|
|
12
|
+
**Phase 5 of the deep audit** — performance & scalability.
|
|
13
|
+
|
|
14
|
+
### Added
|
|
15
|
+
- **mtime-validated LRU parse cache** (audit: in-memory cache for parsed
|
|
16
|
+
memories + the lazy-loading item deferred from Phase 4) — reads cost one
|
|
17
|
+
`stat()` when the file hasn't changed (validated by mtime+size, so writers
|
|
18
|
+
in *other* processes are caught automatically); writes refresh their own
|
|
19
|
+
entry, deletes/renames evict. Configurable via `REMEMBRA_CACHE_SIZE`
|
|
20
|
+
(default 10000 entries, `0` disables); `store.cacheStats()` exposes
|
|
21
|
+
size/capacity. The directory walk still runs every query — discovering
|
|
22
|
+
new/deleted files is its job.
|
|
23
|
+
- **Pagination** (audit: paginate `/memories`) — `offset`/`limit` on
|
|
24
|
+
`GET /memories` and the `memory_list` MCP tool (opt-in: absent = full list,
|
|
25
|
+
so existing clients don't break), `total` always returned, and a
|
|
26
|
+
`Showing X–Y of Z` text header when paginated. Invalid query params fall
|
|
27
|
+
back to unpaginated behavior.
|
|
28
|
+
- **Chunked streaming** (audit: streaming large search results) — list/search
|
|
29
|
+
responses estimated ≥ 64 KiB stream as chunked JSON (no `content-length`,
|
|
30
|
+
item-per-write); smaller responses keep the Phase-1 Content-Length shape.
|
|
31
|
+
|
|
32
|
+
### Declined with evidence
|
|
33
|
+
- **Vector index (FAISS/HNSW)** — native dependencies for double-digit-ms
|
|
34
|
+
savings: the new benchmark measures brute-force cosine over **10,000 ×
|
|
35
|
+
768-dim vectors in ~32 ms**. Revisit at >50k vectors or p95 >100 ms;
|
|
36
|
+
rationale and both thresholds documented in `docs/architecture.md`, seam
|
|
37
|
+
identified (`MemoryBackend` + rebuildable index over frontmatter vectors).
|
|
38
|
+
|
|
39
|
+
### Added (tests)
|
|
40
|
+
8 Phase-5 tests: cache staleness (external edit), cross-instance coherence,
|
|
41
|
+
validated-hit proof (read is skipped), LRU capacity/disable, pagination
|
|
42
|
+
(service + HTTP + schema), chunked-vs-Content-Length streaming, and the
|
|
43
|
+
10K×768 brute-force benchmark with a <1000 ms ceiling. **104/104 total.**
|
|
44
|
+
|
|
45
|
+
## [3.4.0] — 2026-09-23
|
|
46
|
+
|
|
47
|
+
**Phase 4 of the deep audit** — retrieval & memory quality.
|
|
48
|
+
|
|
49
|
+
### Changed
|
|
50
|
+
- **Exponential recency decay** — ~30-day half-life replaces the linear ramp
|
|
51
|
+
that hit a hard zero at 60 days (audit #20): a 60-day-old memory now earns
|
|
52
|
+
~5 points instead of 0, and old-but-important facts stop falling off a
|
|
53
|
+
cliff. Future-dated files clamp to "fresh"; invalid dates score 0.
|
|
54
|
+
- **Importance normalized across modes** — keyword mode drops ×10 → ×4 to
|
|
55
|
+
match semantic mode (audit: "same memory ranks differently depending on
|
|
56
|
+
embedding enablement"). The delta for importance 1→5 is now identical
|
|
57
|
+
(+16) in both modes.
|
|
58
|
+
|
|
59
|
+
### Added
|
|
60
|
+
- **Provenance weighting** (audit: "source stored but never ranked") —
|
|
61
|
+
memories carry `provenance: explicit | auto` in frontmatter: direct
|
|
62
|
+
tool/API stores are `explicit` (+10 in ranking, both modes), digest
|
|
63
|
+
extractions are `auto`. Pre-3.4.0 files have no field and score neutrally.
|
|
64
|
+
Preserved through export/import.
|
|
65
|
+
- **Fuzzy dedup fast path** (audit: "dedup tolerance for fuzzy matches") —
|
|
66
|
+
three dedup tiers now: exact → textual near-identity (Sørensen–Dice ≥ 0.9
|
|
67
|
+
over bigrams; punctuation/case/typos) skipped **without an LLM call** →
|
|
68
|
+
LLM merge for everything semantically evolved. Changed quantities
|
|
69
|
+
(100→500 rpm, v2→v3) are explicitly *not* near-duplicates — they always
|
|
70
|
+
reach the merge arbiter. Works against active, revives archived, and
|
|
71
|
+
dedupes within a single digest batch.
|
|
72
|
+
- `docs/memory-model.md`: dedup tiers, corrected ranking weights, provenance
|
|
73
|
+
row, stale "8-char id"/"embeddings planned for v2" text fixed.
|
|
74
|
+
|
|
75
|
+
### Deferred (recorded, not dropped)
|
|
76
|
+
- **Lazy loading for >10K stores** (audit Phase 4, P2) — the mechanism that
|
|
77
|
+
actually serves this is the parsed-memory cache scheduled for Phase 5
|
|
78
|
+
(performance); building a separate metadata index now would duplicate it.
|
|
79
|
+
Tracked here per scope decision.
|
|
80
|
+
|
|
81
|
+
### Added (tests)
|
|
82
|
+
10 Phase-4 tests: decay curve + half-life + no-cliff, importance-delta
|
|
83
|
+
equality across modes, provenance deltas + ordering + persistence + snapshot
|
|
84
|
+
round trip, fuzzy skip (punctuation/typo/quantity guard), in-batch dedup,
|
|
85
|
+
archived revive, cross-scope isolation. **96/96 total.**
|
|
86
|
+
|
|
10
87
|
## [3.3.0] — 2026-09-23
|
|
11
88
|
|
|
12
89
|
**Phase 3 of the deep audit** — architecture: swappable backend, cross-process
|
package/dist/backend.d.ts
CHANGED
|
@@ -15,7 +15,9 @@ import type { Memory, StoreInput } from "./types.js";
|
|
|
15
15
|
* - `importMemory` must refuse ids that already exist (return false).
|
|
16
16
|
*/
|
|
17
17
|
export interface MemoryBackend {
|
|
18
|
-
store(input: StoreInput, embedding?: number[]
|
|
18
|
+
store(input: StoreInput, embedding?: number[], opts?: {
|
|
19
|
+
provenance?: Memory["provenance"];
|
|
20
|
+
}): Promise<Memory>;
|
|
19
21
|
get(id: string): Promise<Memory | null>;
|
|
20
22
|
all(includeArchived?: boolean): Promise<Memory[]>;
|
|
21
23
|
update(memory: Memory): Promise<Memory>;
|
package/dist/http.d.ts
CHANGED
|
@@ -26,7 +26,7 @@ export declare function resolveListen(host: string | undefined, hasKey: boolean)
|
|
|
26
26
|
* GET /health → liveness (no auth)
|
|
27
27
|
* POST /memories → store a memory
|
|
28
28
|
* GET /memories/search → ?query=&scope=&type=&limit=
|
|
29
|
-
* GET /memories → ?scope=&type=&includeArchived=
|
|
29
|
+
* GET /memories → ?scope=&type=&includeArchived=&offset=&limit=
|
|
30
30
|
* POST /memories/digest → LLM extraction
|
|
31
31
|
* POST /maintain → decay sweep + vector backfill
|
|
32
32
|
* DELETE /memories/:id → forget
|
package/dist/http.js
CHANGED
|
@@ -28,7 +28,7 @@ export function resolveListen(host, hasKey) {
|
|
|
28
28
|
* GET /health → liveness (no auth)
|
|
29
29
|
* POST /memories → store a memory
|
|
30
30
|
* GET /memories/search → ?query=&scope=&type=&limit=
|
|
31
|
-
* GET /memories → ?scope=&type=&includeArchived=
|
|
31
|
+
* GET /memories → ?scope=&type=&includeArchived=&offset=&limit=
|
|
32
32
|
* POST /memories/digest → LLM extraction
|
|
33
33
|
* POST /maintain → decay sweep + vector backfill
|
|
34
34
|
* DELETE /memories/:id → forget
|
|
@@ -75,16 +75,18 @@ export function createHttpServer(service, opts = {}) {
|
|
|
75
75
|
type: url.searchParams.get("type") ?? undefined,
|
|
76
76
|
limit,
|
|
77
77
|
});
|
|
78
|
-
return
|
|
78
|
+
return sendListLike(res, 200, result, "results");
|
|
79
79
|
}
|
|
80
|
-
// GET /memories
|
|
80
|
+
// GET /memories — ?scope=&type=&includeArchived=&offset=&limit=
|
|
81
81
|
if (req.method === "GET" && path === "/memories") {
|
|
82
82
|
const result = await service.list({
|
|
83
83
|
scope: url.searchParams.get("scope") ?? undefined,
|
|
84
84
|
type: url.searchParams.get("type") ?? undefined,
|
|
85
85
|
includeArchived: url.searchParams.get("includeArchived") === "true",
|
|
86
|
+
offset: intParam(url.searchParams.get("offset"), 0),
|
|
87
|
+
limit: intParam(url.searchParams.get("limit"), 1),
|
|
86
88
|
});
|
|
87
|
-
return
|
|
89
|
+
return sendListLike(res, 200, result, "memories");
|
|
88
90
|
}
|
|
89
91
|
// DELETE /memories/:id
|
|
90
92
|
const del = path.match(/^\/memories\/([^/]+)$/);
|
|
@@ -143,6 +145,44 @@ function send(res, status, body) {
|
|
|
143
145
|
});
|
|
144
146
|
res.end(data);
|
|
145
147
|
}
|
|
148
|
+
/** Responses at or below this estimated size keep Content-Length + pretty JSON. */
|
|
149
|
+
const STREAM_THRESHOLD = 64 * 1024;
|
|
150
|
+
/** Parse an integer query param, rejecting non-integers / out-of-range values. */
|
|
151
|
+
function intParam(raw, min) {
|
|
152
|
+
if (raw === null || !/^\d+$/.test(raw.trim()))
|
|
153
|
+
return undefined;
|
|
154
|
+
const n = Number(raw);
|
|
155
|
+
return Number.isSafeInteger(n) && n >= min ? n : undefined;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Search/list responses: small bodies go out with Content-Length (pretty
|
|
159
|
+
* JSON, Phase 1 shape); estimated-large bodies stream as chunked JSON —
|
|
160
|
+
* each item is written as it is serialized instead of buffering one giant
|
|
161
|
+
* string first (audit Phase 5: streaming large search results).
|
|
162
|
+
*/
|
|
163
|
+
function sendListLike(res, status, body, itemKey) {
|
|
164
|
+
const items = body[itemKey] ?? [];
|
|
165
|
+
let est = 256;
|
|
166
|
+
for (const k of Object.keys(body))
|
|
167
|
+
est += k.length + 16;
|
|
168
|
+
for (const it of items)
|
|
169
|
+
est += (it.content?.length ?? 0) + (it.embedding?.length ?? 0) * 10 + 256;
|
|
170
|
+
if (est < STREAM_THRESHOLD)
|
|
171
|
+
return send(res, status, body);
|
|
172
|
+
const { [itemKey]: _items, ...rest } = body;
|
|
173
|
+
const tail = "]" +
|
|
174
|
+
Object.entries(rest)
|
|
175
|
+
.map(([k, v]) => `,${JSON.stringify(k)}:${JSON.stringify(v)}`)
|
|
176
|
+
.join("") +
|
|
177
|
+
"}";
|
|
178
|
+
res.writeHead(status, { "content-type": "application/json; charset=utf-8" }); // no length → chunked
|
|
179
|
+
res.write(`{"${itemKey}":[`);
|
|
180
|
+
for (let i = 0; i < items.length; i++) {
|
|
181
|
+
res.write((i > 0 ? "," : "") + JSON.stringify(items[i]));
|
|
182
|
+
}
|
|
183
|
+
res.write(tail);
|
|
184
|
+
res.end();
|
|
185
|
+
}
|
|
146
186
|
function readBody(req, maxBytes) {
|
|
147
187
|
return new Promise((resolve, reject) => {
|
|
148
188
|
const declared = Number(req.headers["content-length"] ?? 0);
|
package/dist/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -78,7 +78,7 @@ else {
|
|
|
78
78
|
await startMcp();
|
|
79
79
|
}
|
|
80
80
|
async function startMcp() {
|
|
81
|
-
const server = new McpServer({ name: "remembra", version: "3.
|
|
81
|
+
const server = new McpServer({ name: "remembra", version: "3.5.0" });
|
|
82
82
|
server.registerTool("memory_store", {
|
|
83
83
|
title: "Store a memory",
|
|
84
84
|
description: "Persist a fact, decision, role or history entry so it survives context window resets. " +
|
|
@@ -97,7 +97,8 @@ async function startMcp() {
|
|
|
97
97
|
server.registerTool("memory_digest", {
|
|
98
98
|
title: "Digest a session",
|
|
99
99
|
description: "Extract facts, decisions, roles and history from a conversation transcript and store " +
|
|
100
|
-
"them automatically (exact duplicates are skipped
|
|
100
|
+
"them automatically (exact and near-identical duplicates are skipped; changed "
|
|
101
|
+
+ "quantities go to the LLM merge). Call at the end of a session with " +
|
|
101
102
|
"the transcript or a detailed summary of it. Requires REMEMBRA_LLM + an API key.",
|
|
102
103
|
inputSchema: digestInputShape,
|
|
103
104
|
}, async (args) => {
|
|
@@ -147,7 +148,7 @@ async function startMcp() {
|
|
|
147
148
|
});
|
|
148
149
|
server.registerTool("memory_list", {
|
|
149
150
|
title: "List memories",
|
|
150
|
-
description: "List stored memories, optionally filtered by scope or type.",
|
|
151
|
+
description: "List stored memories, optionally filtered by scope or type; paginate with offset/limit.",
|
|
151
152
|
inputSchema: listInputShape,
|
|
152
153
|
}, async (args) => {
|
|
153
154
|
try {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EACL,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC;AACzD,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC;AAEzC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACzC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AACvC,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAEpE,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;IACzB,4EAA4E;IAC5E,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,cAAc,EAAE,CAAC;IAChD,MAAM,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,YAAY,QAAQ,CAAC,QAAQ,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC,CAAC;IACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;KAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;IAChC,2EAA2E;IAC3E,6DAA6D;IAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,IAAa,CAAC;IAClB,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,wBAAwB,KAAK,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAC5F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,QAAQ,cAAc,MAAM,CAAC,OAAO,UAAU,CAAC,CAAC;QAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,sCAAsC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAChG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;KAAM,IAAI,YAAY,EAAE,CAAC;IACxB,uEAAuE;IACvE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;KAAM,IAAI,QAAQ,EAAE,CAAC;IACpB,2EAA2E;IAC3E,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,EAAE;QAC3C,IAAI;QACJ,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB;KACrC,CAAC,CAAC;IACH,0EAA0E;IAC1E,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,EAAE;QAC/B,OAAO,CAAC,KAAK,CAAC,sBAAsB,GAAG,iBAAiB,CAAC,CAAC;QAC1D,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;IAClD,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;AACnD,CAAC;KAAM,CAAC;IACN,iEAAiE;IACjE,MAAM,QAAQ,EAAE,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,QAAQ;IACrB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAErE,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;QACE,KAAK,EAAE,gBAAgB;QACvB,WAAW,EACT,wFAAwF;YACxF,6EAA6E;YAC7E,0FAA0F;QAC5F,WAAW,EAAE,eAAe;KAC7B,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACzC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QAC/D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,KAAK,EAAE,kBAAkB;QACzB,WAAW,EACT,uFAAuF;YACvF,+EAA+E;cAC7E,qEAAqE;YACvE,iFAAiF;QACnF,WAAW,EAAE,gBAAgB;KAC9B,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7D,MAAM,IAAI,GACR,oBAAoB,MAAM,CAAC,SAAS,eAAe,MAAM,CAAC,MAAM,CAAC,MAAM,WAAW;gBAClF,GAAG,MAAM,CAAC,MAAM,oBAAoB,MAAM,CAAC,iBAAiB,sBAAsB;gBAClF,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,iBAAiB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACtE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EACT,0FAA0F;YAC1F,2FAA2F;YAC3F,qEAAqE;QACvE,WAAW,EAAE,EAAE;KAChB,EACD,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;YACxC,MAAM,IAAI,GACR,yBAAyB,MAAM,CAAC,QAAQ,CAAC,MAAM,aAAa;gBAC5D,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,aAAa,MAAM,CAAC,QAAQ,sBAAsB;gBAC1E,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3E,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC3E,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EACT,wFAAwF;YACxF,yFAAyF;QAC3F,WAAW,EAAE,gBAAgB;KAC9B,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC1C,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QAC5D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,aAAa,EACb;QACE,KAAK,EAAE,eAAe;QACtB,WAAW,EACT,yFAAyF;QAC3F,WAAW,EAAE,cAAc;KAC5B,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QAC5D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,wCAAwC;QACrD,WAAW,EAAE,gBAAgB;KAC9B,EACD,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;QACf,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACxC,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC9C,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE;aACpB,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,sEAAsE;IACtE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,WAAW,WAAW,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3F,OAAO,CAAC,KAAK,CAAC,8BAA8B,QAAQ,EAAE,CAAC,CAAC;AAC1D,CAAC"}
|
package/dist/retrieval.d.ts
CHANGED
|
@@ -1,15 +1,23 @@
|
|
|
1
1
|
import { Memory, SearchQuery } from "./types.js";
|
|
2
2
|
/**
|
|
3
|
-
* Layered retrieval (decisions Q4 + v2-Q3):
|
|
3
|
+
* Layered retrieval (decisions Q4 + v2-Q3, Phase 4 quality pass):
|
|
4
4
|
*
|
|
5
5
|
* Hard gates (never bypassed by scores):
|
|
6
6
|
* - roles always pass (+1000)
|
|
7
7
|
* - other scopes' memories are excluded entirely
|
|
8
8
|
*
|
|
9
|
-
* Ranking
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* -
|
|
9
|
+
* Ranking (additive terms are identical in keyword and semantic mode so a
|
|
10
|
+
* memory ranks consistently whether embeddings are on or off — audit #2):
|
|
11
|
+
* - provenance: deliberate `explicit` stores +10 over auto-extracted (#4)
|
|
12
|
+
* - importance: importance × 4 (both modes)
|
|
13
|
+
* - recency: exponential decay, ~30-day half-life, no cliff (#1)
|
|
14
|
+
* - keywords (keyword mode) / cosine similarity (semantic mode)
|
|
14
15
|
*/
|
|
15
16
|
export declare function search(memories: Memory[], q: SearchQuery, queryVec?: number[] | null): Memory[];
|
|
17
|
+
/** Scored exposed for tests — the full layered formula for one memory. */
|
|
18
|
+
export declare function score(m: Memory, terms: string[], scope: string | undefined, now: number, queryVec?: number[] | null): number;
|
|
19
|
+
/**
|
|
20
|
+
* Exponential recency decay (audit #20): ~30-day half-life, never a hard
|
|
21
|
+
* cutoff — a 60-day-old memory keeps ~5 points instead of dropping to 0.
|
|
22
|
+
*/
|
|
23
|
+
export declare function recencyScore(m: Memory, now: number): number;
|
package/dist/retrieval.js
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import { cosine } from "./embeddings.js";
|
|
2
2
|
/**
|
|
3
|
-
* Layered retrieval (decisions Q4 + v2-Q3):
|
|
3
|
+
* Layered retrieval (decisions Q4 + v2-Q3, Phase 4 quality pass):
|
|
4
4
|
*
|
|
5
5
|
* Hard gates (never bypassed by scores):
|
|
6
6
|
* - roles always pass (+1000)
|
|
7
7
|
* - other scopes' memories are excluded entirely
|
|
8
8
|
*
|
|
9
|
-
* Ranking
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* -
|
|
9
|
+
* Ranking (additive terms are identical in keyword and semantic mode so a
|
|
10
|
+
* memory ranks consistently whether embeddings are on or off — audit #2):
|
|
11
|
+
* - provenance: deliberate `explicit` stores +10 over auto-extracted (#4)
|
|
12
|
+
* - importance: importance × 4 (both modes)
|
|
13
|
+
* - recency: exponential decay, ~30-day half-life, no cliff (#1)
|
|
14
|
+
* - keywords (keyword mode) / cosine similarity (semantic mode)
|
|
14
15
|
*/
|
|
15
16
|
export function search(memories, q, queryVec) {
|
|
16
17
|
const now = Date.now();
|
|
@@ -25,7 +26,8 @@ export function search(memories, q, queryVec) {
|
|
|
25
26
|
.sort((a, b) => b.score - a.score || b.m.updatedAt.localeCompare(a.m.updatedAt));
|
|
26
27
|
return scored.slice(0, q.limit ?? 10).map(({ m }) => m);
|
|
27
28
|
}
|
|
28
|
-
|
|
29
|
+
/** Scored exposed for tests — the full layered formula for one memory. */
|
|
30
|
+
export function score(m, terms, scope, now, queryVec) {
|
|
29
31
|
let s = 0;
|
|
30
32
|
// --- hard gates ---
|
|
31
33
|
if (m.type === "role")
|
|
@@ -36,6 +38,9 @@ function score(m, terms, scope, now, queryVec) {
|
|
|
36
38
|
s += 100;
|
|
37
39
|
if (scope && m.scope === scope)
|
|
38
40
|
s += 150;
|
|
41
|
+
// --- provenance (Phase 4 / audit #4): deliberate stores beat auto-extracts ---
|
|
42
|
+
if (m.provenance === "explicit")
|
|
43
|
+
s += 10;
|
|
39
44
|
// --- semantic mode (embeddings on) ---
|
|
40
45
|
if (queryVec && queryVec.length > 0) {
|
|
41
46
|
if (m.embedding && m.embedding.length > 0) {
|
|
@@ -50,13 +55,13 @@ function score(m, terms, scope, now, queryVec) {
|
|
|
50
55
|
// Memory without a vector: fall back to keyword scoring for it.
|
|
51
56
|
s += keywordScore(m, terms);
|
|
52
57
|
}
|
|
53
|
-
// Modifiers
|
|
58
|
+
// Modifiers — same weights as keyword mode (normalized, audit #2).
|
|
54
59
|
s += m.importance * 4;
|
|
55
60
|
s += recencyScore(m, now) * 0.5;
|
|
56
61
|
return s;
|
|
57
62
|
}
|
|
58
63
|
// --- keyword mode (embeddings off — v1 behavior) ---
|
|
59
|
-
s += m.importance *
|
|
64
|
+
s += m.importance * 4;
|
|
60
65
|
s += recencyScore(m, now);
|
|
61
66
|
if (terms.length > 0)
|
|
62
67
|
s += keywordScore(m, terms);
|
|
@@ -64,11 +69,16 @@ function score(m, terms, scope, now, queryVec) {
|
|
|
64
69
|
s += 10; // no query: everything eligible scores a little
|
|
65
70
|
return s;
|
|
66
71
|
}
|
|
67
|
-
|
|
72
|
+
/**
|
|
73
|
+
* Exponential recency decay (audit #20): ~30-day half-life, never a hard
|
|
74
|
+
* cutoff — a 60-day-old memory keeps ~5 points instead of dropping to 0.
|
|
75
|
+
*/
|
|
76
|
+
export function recencyScore(m, now) {
|
|
68
77
|
const ageDays = (now - Date.parse(m.updatedAt)) / 86_400_000;
|
|
69
|
-
if (Number.
|
|
78
|
+
if (!Number.isFinite(ageDays))
|
|
70
79
|
return 0;
|
|
71
|
-
|
|
80
|
+
const age = Math.max(0, ageDays); // future-dated files count as fresh
|
|
81
|
+
return 20 * Math.pow(2, -age / 30);
|
|
72
82
|
}
|
|
73
83
|
function keywordScore(m, terms) {
|
|
74
84
|
if (terms.length === 0)
|
package/dist/retrieval.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retrieval.js","sourceRoot":"","sources":["../src/retrieval.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC
|
|
1
|
+
{"version":3,"file":"retrieval.js","sourceRoot":"","sources":["../src/retrieval.ts"],"names":[],"mappings":"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"}
|
package/dist/service.d.ts
CHANGED
|
@@ -56,7 +56,9 @@ export declare class MemoryService {
|
|
|
56
56
|
constructor(db: MemoryBackend, deps?: ServiceDeps);
|
|
57
57
|
get embeddingsEnabled(): boolean;
|
|
58
58
|
private maybeEmbed;
|
|
59
|
-
store(input: unknown
|
|
59
|
+
store(input: unknown, opts?: {
|
|
60
|
+
provenance?: Memory["provenance"];
|
|
61
|
+
}): Promise<{
|
|
60
62
|
id: string;
|
|
61
63
|
message: string;
|
|
62
64
|
memory: Memory;
|
|
@@ -74,9 +76,14 @@ export declare class MemoryService {
|
|
|
74
76
|
scope?: string;
|
|
75
77
|
type?: MemoryType;
|
|
76
78
|
includeArchived?: boolean;
|
|
79
|
+
offset?: number;
|
|
80
|
+
limit?: number;
|
|
77
81
|
}): Promise<{
|
|
82
|
+
limit?: number | undefined;
|
|
83
|
+
offset?: number | undefined;
|
|
78
84
|
text: string;
|
|
79
85
|
memories: Memory[];
|
|
86
|
+
total: number;
|
|
80
87
|
}>;
|
|
81
88
|
forget(id: string): Promise<{
|
|
82
89
|
ok: boolean;
|
package/dist/service.js
CHANGED
|
@@ -45,7 +45,7 @@ export class MemoryService {
|
|
|
45
45
|
return undefined;
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
|
-
async store(input) {
|
|
48
|
+
async store(input, opts) {
|
|
49
49
|
let parsed;
|
|
50
50
|
try {
|
|
51
51
|
parsed = StoreInput.parse(input);
|
|
@@ -54,7 +54,9 @@ export class MemoryService {
|
|
|
54
54
|
throw inputError(err, "INVALID_INPUT");
|
|
55
55
|
}
|
|
56
56
|
const embedding = await this.maybeEmbed(parsed.content);
|
|
57
|
-
const memory = await this.db.store(parsed, embedding
|
|
57
|
+
const memory = await this.db.store(parsed, embedding, {
|
|
58
|
+
provenance: opts?.provenance ?? "explicit",
|
|
59
|
+
});
|
|
58
60
|
return {
|
|
59
61
|
id: memory.id,
|
|
60
62
|
message: `Stored ${memory.type} memory ${memory.id} (scope: ${memory.scope})`,
|
|
@@ -87,12 +89,29 @@ export class MemoryService {
|
|
|
87
89
|
if (q.type)
|
|
88
90
|
memories = memories.filter((m) => m.type === q.type);
|
|
89
91
|
memories.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));
|
|
90
|
-
const
|
|
92
|
+
const total = memories.length;
|
|
93
|
+
// Pagination is opt-in: without offset/limit the full list is returned
|
|
94
|
+
// (unchanged behavior — existing clients depend on it).
|
|
95
|
+
const paginated = q.offset !== undefined || q.limit !== undefined;
|
|
96
|
+
const start = q.offset ?? 0;
|
|
97
|
+
const page = paginated ? memories.slice(start, q.limit !== undefined ? start + q.limit : undefined) : memories;
|
|
98
|
+
const header = paginated && total > 0
|
|
99
|
+
? `Showing ${Math.min(start + 1, total)}–${Math.min(start + page.length, total)} of ${total}\n\n`
|
|
100
|
+
: "";
|
|
101
|
+
const body = total === 0
|
|
91
102
|
? "No memories stored yet."
|
|
92
|
-
:
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
103
|
+
: page.length === 0
|
|
104
|
+
? "No memories at this offset."
|
|
105
|
+
: page
|
|
106
|
+
.map((m) => `[${m.id}]${m.archivedAt ? " [archived]" : ""} ${m.type} (${m.scope}): ${m.content.split("\n")[0]}`)
|
|
107
|
+
.join("\n");
|
|
108
|
+
return {
|
|
109
|
+
text: header + body,
|
|
110
|
+
memories: page,
|
|
111
|
+
total,
|
|
112
|
+
...(q.offset !== undefined ? { offset: q.offset } : {}),
|
|
113
|
+
...(q.limit !== undefined ? { limit: q.limit } : {}),
|
|
114
|
+
};
|
|
96
115
|
}
|
|
97
116
|
async forget(id) {
|
|
98
117
|
const ok = await this.db.forget(id);
|
|
@@ -144,6 +163,24 @@ export class MemoryService {
|
|
|
144
163
|
continue;
|
|
145
164
|
}
|
|
146
165
|
}
|
|
166
|
+
// Fuzzy fast path (Phase 4 / audit: dedup tolerance): textually
|
|
167
|
+
// near-identical same-type/same-scope memory → skip without an LLM
|
|
168
|
+
// call. Semantic near-duplicates (paraphrases) stay below this
|
|
169
|
+
// threshold and still go through the LLM merge below.
|
|
170
|
+
const fuzzyActive = active.find((m) => m.type === item.type && m.scope === scope && nearDuplicate(item.content, m.content));
|
|
171
|
+
if (fuzzyActive) {
|
|
172
|
+
skippedDuplicates++;
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
const fuzzyArchived = archived.find((m) => m.type === item.type && m.scope === scope && nearDuplicate(item.content, m.content));
|
|
176
|
+
if (fuzzyArchived) {
|
|
177
|
+
const revived = await this.db.revive(fuzzyArchived.id);
|
|
178
|
+
if (revived) {
|
|
179
|
+
seen.add(key);
|
|
180
|
+
merged++;
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
147
184
|
// Evolved fact → LLM decides: store fresh, skip, or merge.
|
|
148
185
|
const itemVec = (await this.maybeEmbed(item.content)) ?? null;
|
|
149
186
|
const candidate = this.findCandidate(item, scope, [...active, ...archived], itemVec);
|
|
@@ -187,8 +224,9 @@ export class MemoryService {
|
|
|
187
224
|
tags: item.tags,
|
|
188
225
|
importance: item.importance,
|
|
189
226
|
source: opts.source,
|
|
190
|
-
});
|
|
227
|
+
}, { provenance: "auto" });
|
|
191
228
|
stored.push(memory);
|
|
229
|
+
active.push(memory); // so later items in this batch dedup against it
|
|
192
230
|
}
|
|
193
231
|
return {
|
|
194
232
|
extracted: extracted.length,
|
|
@@ -327,6 +365,55 @@ export class MemoryService {
|
|
|
327
365
|
function dedupKey(type, content, scope) {
|
|
328
366
|
return `${type}|${scope}|${content.toLowerCase().replace(/\s+/g, " ").trim()}`;
|
|
329
367
|
}
|
|
368
|
+
/** Punctuation/case-folded text for fuzzy comparison. */
|
|
369
|
+
function normalizeForFuzzy(s) {
|
|
370
|
+
return s
|
|
371
|
+
.toLowerCase()
|
|
372
|
+
.replace(/[^\p{L}\p{N}]+/gu, " ")
|
|
373
|
+
.replace(/\s+/g, " ")
|
|
374
|
+
.trim();
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Textual near-identity (Phase 4 fast path): normalized equality or a
|
|
378
|
+
* Sørensen–Dice coefficient over character bigrams ≥ 0.9. Catches typos,
|
|
379
|
+
* punctuation and minor edits without spending an LLM call. Genuinely
|
|
380
|
+
* different wordings score well below 0.9 and keep going to the LLM merge.
|
|
381
|
+
*/
|
|
382
|
+
function nearDuplicate(a, b) {
|
|
383
|
+
const na = normalizeForFuzzy(a);
|
|
384
|
+
const nb = normalizeForFuzzy(b);
|
|
385
|
+
if (na === nb)
|
|
386
|
+
return true; // equal apart from punctuation/case (dedupKey only folds case+whitespace)
|
|
387
|
+
// A changed quantity (100→500 rpm, v2→v3, dates) is a *different fact*,
|
|
388
|
+
// textually near-identical or not — defer to the LLM merge.
|
|
389
|
+
const numsA = (na.match(/\d+/g) ?? []).join(",");
|
|
390
|
+
const numsB = (nb.match(/\d+/g) ?? []).join(",");
|
|
391
|
+
if (numsA !== numsB)
|
|
392
|
+
return false;
|
|
393
|
+
if (na.length < 8 || nb.length < 8)
|
|
394
|
+
return false; // too short to judge by bigrams
|
|
395
|
+
return diceBigrams(na, nb) >= 0.9;
|
|
396
|
+
}
|
|
397
|
+
function diceBigrams(a, b) {
|
|
398
|
+
const grams = (s) => {
|
|
399
|
+
const m = new Map();
|
|
400
|
+
for (let i = 0; i < s.length - 1; i++) {
|
|
401
|
+
const g = s.slice(i, i + 2);
|
|
402
|
+
m.set(g, (m.get(g) ?? 0) + 1);
|
|
403
|
+
}
|
|
404
|
+
return m;
|
|
405
|
+
};
|
|
406
|
+
const ga = grams(a);
|
|
407
|
+
const gb = grams(b);
|
|
408
|
+
let overlap = 0;
|
|
409
|
+
for (const [g, c] of ga)
|
|
410
|
+
overlap += Math.min(c, gb.get(g) ?? 0);
|
|
411
|
+
const totalA = [...ga.values()].reduce((x, y) => x + y, 0);
|
|
412
|
+
const totalB = [...gb.values()].reduce((x, y) => x + y, 0);
|
|
413
|
+
if (totalA === 0 || totalB === 0)
|
|
414
|
+
return 0;
|
|
415
|
+
return (2 * overlap) / (totalA + totalB);
|
|
416
|
+
}
|
|
330
417
|
/** Similarity: embeddings (cosine) when both sides have vectors, else keyword overlap. */
|
|
331
418
|
function candidateSimilarity(newContent, m, itemVec) {
|
|
332
419
|
if (itemVec && m.embedding && m.embedding.length === itemVec.length) {
|