hippo-memory 1.20.0 → 1.22.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/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +62 -1
- package/dist/cli.js.map +1 -1
- package/dist/customer-notes.d.ts.map +1 -1
- package/dist/customer-notes.js +10 -2
- package/dist/customer-notes.js.map +1 -1
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +264 -1
- package/dist/db.js.map +1 -1
- package/dist/decisions.d.ts.map +1 -1
- package/dist/decisions.js +10 -2
- package/dist/decisions.js.map +1 -1
- package/dist/graph-extract.d.ts.map +1 -1
- package/dist/graph-extract.js +39 -12
- package/dist/graph-extract.js.map +1 -1
- package/dist/graph-recall.d.ts.map +1 -1
- package/dist/graph-recall.js +11 -1
- package/dist/graph-recall.js.map +1 -1
- package/dist/graph-stream.d.ts +71 -0
- package/dist/graph-stream.d.ts.map +1 -0
- package/dist/graph-stream.js +176 -0
- package/dist/graph-stream.js.map +1 -0
- package/dist/graph.d.ts +46 -7
- package/dist/graph.d.ts.map +1 -1
- package/dist/graph.js +129 -29
- package/dist/graph.js.map +1 -1
- package/dist/policies.d.ts.map +1 -1
- package/dist/policies.js +10 -2
- package/dist/policies.js.map +1 -1
- package/dist/project-briefs.d.ts.map +1 -1
- package/dist/project-briefs.js +10 -2
- package/dist/project-briefs.js.map +1 -1
- package/dist/search.d.ts +16 -0
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +31 -1
- package/dist/search.js.map +1 -1
- package/dist/src/cli.js +62 -1
- package/dist/src/cli.js.map +1 -1
- package/dist/src/customer-notes.js +10 -2
- package/dist/src/customer-notes.js.map +1 -1
- package/dist/src/db.js +264 -1
- package/dist/src/db.js.map +1 -1
- package/dist/src/decisions.js +10 -2
- package/dist/src/decisions.js.map +1 -1
- package/dist/src/graph-extract.js +39 -12
- package/dist/src/graph-extract.js.map +1 -1
- package/dist/src/graph-recall.js +11 -1
- package/dist/src/graph-recall.js.map +1 -1
- package/dist/src/graph-stream.js +176 -0
- package/dist/src/graph-stream.js.map +1 -0
- package/dist/src/graph.js +129 -29
- package/dist/src/graph.js.map +1 -1
- package/dist/src/policies.js +10 -2
- package/dist/src/policies.js.map +1 -1
- package/dist/src/project-briefs.js +10 -2
- package/dist/src/project-briefs.js.map +1 -1
- package/dist/src/search.js +31 -1
- package/dist/src/search.js.map +1 -1
- package/dist/src/version.js +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
- package/extensions/openclaw-plugin/package.json +1 -1
- package/openclaw.plugin.json +1 -1
- package/package.json +1 -1
|
@@ -45,6 +45,21 @@ export const MAX_TARGET_NAMES = 5000;
|
|
|
45
45
|
function keyOf(entityType, e2Id) {
|
|
46
46
|
return `${entityType}:${e2Id}`;
|
|
47
47
|
}
|
|
48
|
+
/** The four E2-derived extraction entity types map 1:1 to source_object_type. */
|
|
49
|
+
const ENTITY_TYPE_TO_SOURCE_OBJECT = {
|
|
50
|
+
decision: 'decision',
|
|
51
|
+
policy: 'policy',
|
|
52
|
+
customer: 'customer',
|
|
53
|
+
project: 'project',
|
|
54
|
+
};
|
|
55
|
+
/** The E2 source-object ref for an extraction row (always set: every extracted row is an
|
|
56
|
+
* E2 object). Throws on an unmappable entityType (a graph invariant violation). */
|
|
57
|
+
function sourceObjectOf(entityType, e2Id) {
|
|
58
|
+
const type = ENTITY_TYPE_TO_SOURCE_OBJECT[entityType];
|
|
59
|
+
if (!type)
|
|
60
|
+
throw new Error(`graph-extract: entityType '${entityType}' has no source_object_type mapping`);
|
|
61
|
+
return { type, id: e2Id };
|
|
62
|
+
}
|
|
48
63
|
/** Escape a string for safe use as a literal inside a RegExp alternation. */
|
|
49
64
|
function escapeRegex(s) {
|
|
50
65
|
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
@@ -124,19 +139,22 @@ function rebuildGraphRows(txDb, hippoRoot, tenantId, loaded) {
|
|
|
124
139
|
const truncated = [];
|
|
125
140
|
const allRows = [];
|
|
126
141
|
const entityIdByKey = new Map();
|
|
142
|
+
// The mirror memory per extracted key, null once forgotten/pruned (so a supersedes
|
|
143
|
+
// edge anchors to the successor's object when the mirror is gone but still passes the
|
|
144
|
+
// memory through when it lives).
|
|
127
145
|
const memoryIdByKey = new Map();
|
|
128
146
|
// Created entities ONLY (drives Pass 3 sources + targets), in stable insertion order.
|
|
129
147
|
const created = [];
|
|
130
|
-
// Pass 1: entities.
|
|
131
|
-
//
|
|
148
|
+
// Pass 1: entities. Every ACTIVE/SUPERSEDED E2 row becomes an entity ANCHORED to its
|
|
149
|
+
// authoritative E2 object (source_object_type/id) - it survives a forgotten mirror
|
|
150
|
+
// (memory_id NULL). The mirror memory is passed through only when it still exists
|
|
151
|
+
// (it remains a recall pointer until forgotten/pruned).
|
|
132
152
|
for (const { entityType, rows, hitCap } of loaded) {
|
|
133
153
|
if (hitCap)
|
|
134
154
|
truncated.push(entityType);
|
|
135
155
|
byType[entityType] = 0;
|
|
136
156
|
for (const row of rows) {
|
|
137
157
|
allRows.push(row);
|
|
138
|
-
if (row.memoryId === null)
|
|
139
|
-
continue;
|
|
140
158
|
// Normalise the label so a long/odd-but-valid E2 name can never throw in
|
|
141
159
|
// insertEntity and (because clearGraph already ran) brick the rebuild
|
|
142
160
|
// unrebuildably. E2 name fields (decisionText / policyName) are UNCAPPED at
|
|
@@ -149,21 +167,25 @@ function rebuildGraphRows(txDb, hippoRoot, tenantId, loaded) {
|
|
|
149
167
|
const name = (row.name ?? '').trim().slice(0, MAX_ENTITY_NAME_LEN);
|
|
150
168
|
if (name.length === 0)
|
|
151
169
|
continue;
|
|
170
|
+
const sourceObject = sourceObjectOf(row.entityType, row.e2Id);
|
|
152
171
|
const entity = insertEntity(hippoRoot, tenantId, {
|
|
153
172
|
entityType: row.entityType,
|
|
154
173
|
name,
|
|
155
174
|
memoryId: row.memoryId,
|
|
175
|
+
sourceObject,
|
|
156
176
|
}, txDb);
|
|
157
177
|
const k = keyOf(row.entityType, row.e2Id);
|
|
158
178
|
entityIdByKey.set(k, entity.id);
|
|
159
179
|
memoryIdByKey.set(k, row.memoryId);
|
|
160
|
-
created.push({ entityId: entity.id, entityType: row.entityType, memoryId: row.memoryId, name, searchText: row.searchText ?? '', superseded: row.supersededBy !== null });
|
|
180
|
+
created.push({ entityId: entity.id, entityType: row.entityType, memoryId: row.memoryId, sourceObject, name, searchText: row.searchText ?? '', superseded: row.supersededBy !== null });
|
|
161
181
|
byType[entityType] += 1;
|
|
162
182
|
}
|
|
163
183
|
}
|
|
164
184
|
// Pass 2: `supersedes` relations. For X superseded by Y (Y is the successor), emit
|
|
165
|
-
// "Y supersedes X" - but only when BOTH X and Y were
|
|
166
|
-
// and absent). The
|
|
185
|
+
// "Y supersedes X" - but only when BOTH X and Y were EXTRACTED (e.g. Y may be closed
|
|
186
|
+
// and absent). The emit guard is ENTITY presence (entityIdByKey), not memory presence:
|
|
187
|
+
// a forgotten successor mirror must still emit the edge. The relation is anchored to Y's
|
|
188
|
+
// authoritative E2 object; Y's mirror memory is passed only when it still lives.
|
|
167
189
|
let relations = 0;
|
|
168
190
|
// Entity-id pairs already related by supersedes (unordered). Pass 3 skips a references
|
|
169
191
|
// edge for such a pair: a version-extends-its-predecessor's-name containment (e.g.
|
|
@@ -177,21 +199,23 @@ function rebuildGraphRows(txDb, hippoRoot, tenantId, loaded) {
|
|
|
177
199
|
const yKey = keyOf(row.entityType, row.supersededBy);
|
|
178
200
|
const fromId = entityIdByKey.get(yKey); // successor Y
|
|
179
201
|
const toId = entityIdByKey.get(xKey); // superseded X
|
|
180
|
-
|
|
181
|
-
if (fromId === undefined || toId === undefined || yMemoryId === undefined)
|
|
202
|
+
if (fromId === undefined || toId === undefined)
|
|
182
203
|
continue;
|
|
204
|
+
const yMemoryId = memoryIdByKey.get(yKey) ?? null; // successor's mirror, null if gone
|
|
183
205
|
insertRelation(hippoRoot, tenantId, {
|
|
184
206
|
fromEntityId: fromId,
|
|
185
207
|
toEntityId: toId,
|
|
186
208
|
relType: 'supersedes',
|
|
187
209
|
memoryId: yMemoryId,
|
|
210
|
+
sourceObject: sourceObjectOf(row.entityType, row.supersededBy), // successor Y's object
|
|
188
211
|
}, txDb);
|
|
189
212
|
supersededPairs.add(pairKey(fromId, toId));
|
|
190
213
|
relations += 1;
|
|
191
214
|
}
|
|
192
215
|
// Pass 3: cross-object `references` edges via conservative name matching. A source's
|
|
193
216
|
// text containing a target entity's name -> "source references target". Sources +
|
|
194
|
-
// targets are CREATED entities only,
|
|
217
|
+
// targets are CREATED entities only, each anchored to its E2 source object (so the
|
|
218
|
+
// edge survives a forgotten source mirror).
|
|
195
219
|
const references = extractReferences(hippoRoot, tenantId, created, supersededPairs, truncated, txDb);
|
|
196
220
|
relations += references;
|
|
197
221
|
const entities = created.length;
|
|
@@ -201,7 +225,8 @@ function rebuildGraphRows(txDb, hippoRoot, tenantId, loaded) {
|
|
|
201
225
|
* Pass 3. Build a target-name index from the created entities (names within the length
|
|
202
226
|
* bounds, ambiguous names dropped), scan each created entity's text once with one
|
|
203
227
|
* combined word-boundary regex, and emit `references` edges (self-skipped, deduped,
|
|
204
|
-
* per-source capped).
|
|
228
|
+
* per-source capped). Each edge is anchored to the source entity's E2 object (memoryId
|
|
229
|
+
* passed through only when the mirror lives). Returns the number of references edges written.
|
|
205
230
|
*/
|
|
206
231
|
function extractReferences(hippoRoot, tenantId, created, supersededPairs, truncated, txDb) {
|
|
207
232
|
// Build the target index: normalised name -> single entity id. A name is a target only
|
|
@@ -269,7 +294,9 @@ function extractReferences(hippoRoot, tenantId, created, supersededPairs, trunca
|
|
|
269
294
|
fromEntityId: src.entityId,
|
|
270
295
|
toEntityId: targetId,
|
|
271
296
|
relType: 'references',
|
|
272
|
-
|
|
297
|
+
// Anchored to the source object; its mirror memory is passed only when it lives.
|
|
298
|
+
memoryId: src.memoryId,
|
|
299
|
+
sourceObject: src.sourceObject,
|
|
273
300
|
}, txDb);
|
|
274
301
|
references += 1;
|
|
275
302
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph-extract.js","sourceRoot":"","sources":["../../src/graph-extract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,0BAA0B,EAAE,mBAAmB,
|
|
1
|
+
{"version":3,"file":"graph-extract.js","sourceRoot":"","sources":["../../src/graph-extract.ts"],"names":[],"mappings":"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"}
|
package/dist/src/graph-recall.js
CHANGED
|
@@ -75,6 +75,9 @@ function produceHitsForRoot(root, baseResults, baseScoreByMemId, seenMemoryIds,
|
|
|
75
75
|
// from (for adjacency placement + score inheritance).
|
|
76
76
|
const visitedEntityIds = new Set(seedEntities.map((e) => e.id));
|
|
77
77
|
const reached = new Map();
|
|
78
|
+
// A seed/reached entity whose mirror was forgotten/pruned has a null memoryId; the map
|
|
79
|
+
// tolerates null so traversal still propagates origin, and the null is dropped before
|
|
80
|
+
// any memory load below (a mirror-less node has no memory to surface).
|
|
78
81
|
const originMemByEntityId = new Map();
|
|
79
82
|
for (const se of seedEntities)
|
|
80
83
|
originMemByEntityId.set(se.id, se.memoryId);
|
|
@@ -119,8 +122,13 @@ function produceHitsForRoot(root, baseResults, baseScoreByMemId, seenMemoryIds,
|
|
|
119
122
|
if (reached.size === 0)
|
|
120
123
|
return;
|
|
121
124
|
// Reached entities -> source memory ids -> load DIRECTLY by id (chunked), not lexical.
|
|
125
|
+
// A mirror-less reached entity (memoryId === null) has no memory to load: drop its null
|
|
126
|
+
// id BEFORE it reaches loadByIdsChunked / the Set<string> (it cannot be recall-surfaced;
|
|
127
|
+
// it stays in entities/relations for graph extract / visualization).
|
|
122
128
|
const reachedEntities = loadEntitiesByIds(root, tenantId, [...reached.keys()]);
|
|
123
|
-
const needLoad = [...new Set(reachedEntities
|
|
129
|
+
const needLoad = [...new Set(reachedEntities
|
|
130
|
+
.map((e) => e.memoryId)
|
|
131
|
+
.filter((id) => id !== null && !seenMemoryIds.has(id)))];
|
|
124
132
|
const loadedById = new Map(loadByIdsChunked(root, tenantId, needLoad).map((m) => [m.id, m]));
|
|
125
133
|
// For the bi-temporal as-of rule on a superseded reached row we need its successor's
|
|
126
134
|
// valid_from. Batch-load the successors referenced by the loaded rows.
|
|
@@ -130,6 +138,8 @@ function produceHitsForRoot(root, baseResults, baseScoreByMemId, seenMemoryIds,
|
|
|
130
138
|
successorValidFrom = new Map(loadByIdsChunked(root, tenantId, succIds).map((m) => [m.id, m.valid_from]));
|
|
131
139
|
}
|
|
132
140
|
for (const ent of reachedEntities) {
|
|
141
|
+
if (ent.memoryId === null)
|
|
142
|
+
continue; // mirror-less node: not recall-surfaced
|
|
133
143
|
const mem = loadedById.get(ent.memoryId);
|
|
134
144
|
if (!mem)
|
|
135
145
|
continue; // not found / wrong tenant / already in base
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph-recall.js","sourceRoot":"","sources":["../../src/graph-recall.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,OAAO,EAAqB,cAAc,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,qBAAqB,GACtB,MAAM,YAAY,CAAC;AAEpB;kDACkD;AAClD,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC;AAC1B,2EAA2E;AAC3E,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAC;AACxC;8EAC8E;AAC9E,MAAM,YAAY,GAAG,IAAI,CAAC;AAC1B,qFAAqF;AACrF,MAAM,UAAU,GAAG,GAAG,CAAC;AA6BvB,uFAAuF;AACvF,SAAS,gBAAgB,CAAC,IAAY,EAAE,QAAgB,EAAE,GAAa;IACrE,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,MAAM,GAAG,GAAkB,EAAE,CAAC;IAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC;QAChD,GAAG,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,SAAS,kBAAkB,CACzB,IAAY,EACZ,WAA2B,EAC3B,gBAAqC,EACrC,aAA0B,EAC1B,YAAqC,EACrC,IAA6H;IAE7H,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,iBAAiB,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAE3E,+EAA+E;IAC/E,MAAM,YAAY,GAAG,sBAAsB,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IAChG,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEtC,oFAAoF;IACpF,wFAAwF;IACxF,sDAAsD;IACtD,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAS,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC5C,MAAM,mBAAmB,GAAG,IAAI,GAAG,
|
|
1
|
+
{"version":3,"file":"graph-recall.js","sourceRoot":"","sources":["../../src/graph-recall.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { loadEntitiesByMemoryId, loadEntitiesByIds, loadNeighborRelations, } from './graph.js';
|
|
2
|
+
import { MAX_HOPS, DEFAULT_MAX_NEIGHBORS } from './graph-recall.js';
|
|
3
|
+
/** Default hops expanded from each seed (MVP; hard cap MAX_HOPS=3 reused from graph-recall). */
|
|
4
|
+
export const DEFAULT_GRAPH_HOPS = 2;
|
|
5
|
+
/** Default per-hop multiplicative decay applied to the seed strength. */
|
|
6
|
+
export const DEFAULT_GRAPH_DECAY = 0.5;
|
|
7
|
+
/** Default number of top lexical seeds expanded from. */
|
|
8
|
+
export const DEFAULT_GRAPH_SEED_COUNT = 10;
|
|
9
|
+
/** Recommended RRF weight for the graph stream — a CLI-only convenience default. The
|
|
10
|
+
* library `graphStream.weight` option stays REQUIRED (opt-in is explicit). */
|
|
11
|
+
export const DEFAULT_GRAPH_STREAM_WEIGHT = 0.5;
|
|
12
|
+
/**
|
|
13
|
+
* Pick the top `seedCount` candidates by best lexical rank (lowest position across the
|
|
14
|
+
* BM25 and dense ranked lists), with strength = 1/(bestRank + 1). Pure; exported for
|
|
15
|
+
* direct unit testing. A candidate present in either ranked list is eligible.
|
|
16
|
+
*/
|
|
17
|
+
export function selectGraphSeeds(bm25Ranked, cosineRanked, seedCount) {
|
|
18
|
+
if (seedCount <= 0)
|
|
19
|
+
return [];
|
|
20
|
+
const bestPos = new Map();
|
|
21
|
+
const consider = (list) => {
|
|
22
|
+
for (let p = 0; p < list.length; p++) {
|
|
23
|
+
const idx = list[p];
|
|
24
|
+
const prev = bestPos.get(idx);
|
|
25
|
+
if (prev === undefined || p < prev)
|
|
26
|
+
bestPos.set(idx, p);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
consider(bm25Ranked);
|
|
30
|
+
consider(cosineRanked);
|
|
31
|
+
return [...bestPos.entries()]
|
|
32
|
+
.sort((a, b) => a[1] - b[1] || a[0] - b[0]) // best rank asc, then index asc (deterministic)
|
|
33
|
+
.slice(0, seedCount)
|
|
34
|
+
.map(([index, best]) => ({ index, strength: 1 / (best + 1) }));
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Accumulate per-entryIndex graph-proximity scores from ONE store's graph into
|
|
38
|
+
* `graphScore`. Pure reads. `seeds` are the lexical seeds (index + strength); only the
|
|
39
|
+
* seeds whose entities live in THIS store are expanded. The origin seed strength is
|
|
40
|
+
* carried UNCHANGED along each BFS path; the per-hop decay is applied as decay^depth so
|
|
41
|
+
* a neighbour's score = originSeedStrength x decay^(graph distance).
|
|
42
|
+
*/
|
|
43
|
+
function accumulateForRoot(root, seeds, entries, memIdToIndex, graphScore, hops, decay, maxNeighbors, tenantId) {
|
|
44
|
+
if (seeds.length === 0)
|
|
45
|
+
return;
|
|
46
|
+
// The strongest seed strength per source memory id (a memId could appear once, but
|
|
47
|
+
// guard against dup indices mapping to the same memId).
|
|
48
|
+
const strengthByMemId = new Map();
|
|
49
|
+
for (const s of seeds) {
|
|
50
|
+
const memId = entries[s.index].id;
|
|
51
|
+
strengthByMemId.set(memId, Math.max(strengthByMemId.get(memId) ?? 0, s.strength));
|
|
52
|
+
}
|
|
53
|
+
const seedEntities = loadEntitiesByMemoryId(root, tenantId, [...strengthByMemId.keys()]);
|
|
54
|
+
if (seedEntities.length === 0)
|
|
55
|
+
return;
|
|
56
|
+
// entityId -> origin seed strength (carried unchanged along the path). A seed entity is
|
|
57
|
+
// loaded by memory id, so its memoryId is non-null here; the guard keeps the widened
|
|
58
|
+
// (string | null) type honest (a null-memory entity is not a lexical seed).
|
|
59
|
+
const originStrength = new Map();
|
|
60
|
+
for (const e of seedEntities) {
|
|
61
|
+
if (e.memoryId === null)
|
|
62
|
+
continue;
|
|
63
|
+
const st = strengthByMemId.get(e.memoryId) ?? 0;
|
|
64
|
+
originStrength.set(e.id, Math.max(originStrength.get(e.id) ?? 0, st));
|
|
65
|
+
}
|
|
66
|
+
const visited = new Set(seedEntities.map((e) => e.id)); // seeds never re-reached
|
|
67
|
+
const reachedScore = new Map(); // entityId -> best score
|
|
68
|
+
let frontier = seedEntities.map((e) => e.id);
|
|
69
|
+
let frontierStrength = new Map(originStrength); // entityId -> seed strength
|
|
70
|
+
for (let depth = 1; depth <= hops && frontier.length > 0; depth++) {
|
|
71
|
+
const frontierSet = new Set(frontier);
|
|
72
|
+
const rels = loadNeighborRelations(root, tenantId, frontier, {
|
|
73
|
+
limit: Math.max(maxNeighbors, maxNeighbors * frontier.length),
|
|
74
|
+
});
|
|
75
|
+
const hopFactor = Math.pow(decay, depth);
|
|
76
|
+
// Pass 1: accumulate the STRONGEST reaching-seed strength per new neighbour across ALL
|
|
77
|
+
// relations at this depth BEFORE committing any to `visited` (codex P2). Marking a node
|
|
78
|
+
// visited mid-loop would lock it to whichever relation SQLite returned first, so a later
|
|
79
|
+
// edge from a STRONGER lexical seed would be dropped and the neighbour mis-scored. A node
|
|
80
|
+
// already in `visited` was committed at an earlier (shorter) depth and keeps that score.
|
|
81
|
+
const bestStrengthThisDepth = new Map();
|
|
82
|
+
for (const rel of rels) {
|
|
83
|
+
const fromIn = frontierSet.has(rel.fromEntityId);
|
|
84
|
+
const toIn = frontierSet.has(rel.toEntityId);
|
|
85
|
+
let neighborId;
|
|
86
|
+
let reacherId;
|
|
87
|
+
if (fromIn && !toIn) {
|
|
88
|
+
neighborId = rel.toEntityId;
|
|
89
|
+
reacherId = rel.fromEntityId;
|
|
90
|
+
}
|
|
91
|
+
else if (toIn && !fromIn) {
|
|
92
|
+
neighborId = rel.fromEntityId;
|
|
93
|
+
reacherId = rel.toEntityId;
|
|
94
|
+
}
|
|
95
|
+
else
|
|
96
|
+
continue;
|
|
97
|
+
if (visited.has(neighborId))
|
|
98
|
+
continue;
|
|
99
|
+
const seedStrength = frontierStrength.get(reacherId) ?? originStrength.get(reacherId) ?? 0;
|
|
100
|
+
bestStrengthThisDepth.set(neighborId, Math.max(bestStrengthThisDepth.get(neighborId) ?? 0, seedStrength));
|
|
101
|
+
}
|
|
102
|
+
// Pass 2: commit strongest-first (then id asc — deterministic), so the per-hop fanout cap
|
|
103
|
+
// keeps the highest-scoring neighbours rather than whichever SQLite happened to return.
|
|
104
|
+
const nextFrontier = [];
|
|
105
|
+
const nextStrength = new Map();
|
|
106
|
+
const ordered = [...bestStrengthThisDepth.keys()].sort((a, b) => {
|
|
107
|
+
const d = bestStrengthThisDepth.get(b) - bestStrengthThisDepth.get(a);
|
|
108
|
+
return d !== 0 ? d : a - b;
|
|
109
|
+
});
|
|
110
|
+
for (const neighborId of ordered) {
|
|
111
|
+
if (nextFrontier.length >= maxNeighbors)
|
|
112
|
+
break; // per-hop fanout cap (strongest kept)
|
|
113
|
+
const seedStrength = bestStrengthThisDepth.get(neighborId);
|
|
114
|
+
visited.add(neighborId);
|
|
115
|
+
reachedScore.set(neighborId, Math.max(reachedScore.get(neighborId) ?? 0, seedStrength * hopFactor));
|
|
116
|
+
nextStrength.set(neighborId, seedStrength);
|
|
117
|
+
nextFrontier.push(neighborId);
|
|
118
|
+
}
|
|
119
|
+
frontier = nextFrontier;
|
|
120
|
+
frontierStrength = nextStrength;
|
|
121
|
+
}
|
|
122
|
+
if (reachedScore.size === 0)
|
|
123
|
+
return;
|
|
124
|
+
// Reached entity ids -> source memory ids -> in-pool entry indices.
|
|
125
|
+
const reachedEntities = loadEntitiesByIds(root, tenantId, [...reachedScore.keys()]);
|
|
126
|
+
for (const ent of reachedEntities) {
|
|
127
|
+
if (ent.memoryId === null)
|
|
128
|
+
continue; // mirror-less node: no pool memory to re-rank
|
|
129
|
+
const idx = memIdToIndex.get(ent.memoryId);
|
|
130
|
+
if (idx === undefined)
|
|
131
|
+
continue; // reached memory is not in the candidate pool
|
|
132
|
+
const score = reachedScore.get(ent.id) ?? 0;
|
|
133
|
+
if (score <= 0)
|
|
134
|
+
continue;
|
|
135
|
+
graphScore.set(idx, Math.max(graphScore.get(idx) ?? 0, score));
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Produce the graph-retrieval ranked list: `entries[]` indices ordered by graph
|
|
140
|
+
* proximity (desc) to the lexical `seeds`. Only graph-reached, in-pool, non-seed
|
|
141
|
+
* indices appear; the rest are absent (-> rrfFuse absentRank). Pure reads.
|
|
142
|
+
*
|
|
143
|
+
* Returns `[]` when there are no seeds/entries, the graph is empty, no seed maps to an
|
|
144
|
+
* entity, or nothing reached is in-pool — the caller then skips the 3rd fusion list.
|
|
145
|
+
*/
|
|
146
|
+
export function graphRankStream(entries, seeds, opts) {
|
|
147
|
+
if (seeds.length === 0 || entries.length === 0)
|
|
148
|
+
return [];
|
|
149
|
+
const hops = Math.min(Math.max(opts.hops ?? DEFAULT_GRAPH_HOPS, 1), MAX_HOPS);
|
|
150
|
+
const decay = opts.decay ?? DEFAULT_GRAPH_DECAY;
|
|
151
|
+
const maxNeighbors = opts.maxNeighbors ?? DEFAULT_MAX_NEIGHBORS;
|
|
152
|
+
const memIdToIndex = new Map();
|
|
153
|
+
for (let i = 0; i < entries.length; i++)
|
|
154
|
+
memIdToIndex.set(entries[i].id, i);
|
|
155
|
+
const graphScore = new Map();
|
|
156
|
+
const roots = opts.globalRoot && opts.globalRoot !== opts.hippoRoot
|
|
157
|
+
? [opts.hippoRoot, opts.globalRoot]
|
|
158
|
+
: [opts.hippoRoot];
|
|
159
|
+
for (const root of roots) {
|
|
160
|
+
accumulateForRoot(root, seeds, entries, memIdToIndex, graphScore, hops, decay, maxNeighbors, opts.tenantId);
|
|
161
|
+
}
|
|
162
|
+
// Seed-exclusion guard (plan-eng-critic MED): graphScore is keyed by entryIndex
|
|
163
|
+
// GLOBALLY across roots, but each root's BFS visited-set is per-root, so a memory that
|
|
164
|
+
// is a seed in one store could be reached as a neighbour in the other store and pick up
|
|
165
|
+
// a score via max(). Drop every seed index so the "seeds are never scored by the graph
|
|
166
|
+
// stream" invariant holds across roots, not just within a single store's traversal.
|
|
167
|
+
for (const s of seeds)
|
|
168
|
+
graphScore.delete(s.index);
|
|
169
|
+
if (graphScore.size === 0)
|
|
170
|
+
return [];
|
|
171
|
+
return [...graphScore.keys()].sort((a, b) => {
|
|
172
|
+
const d = (graphScore.get(b) ?? 0) - (graphScore.get(a) ?? 0);
|
|
173
|
+
return d !== 0 ? d : a - b; // score desc, then index asc (deterministic)
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=graph-stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-stream.js","sourceRoot":"","sources":["../../src/graph-stream.ts"],"names":[],"mappings":"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"}
|