hippo-memory 0.31.0 → 0.33.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/README.md +16 -0
- package/dist/cli.js +213 -19
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +7 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +9 -0
- package/dist/config.js.map +1 -1
- package/dist/consolidate.d.ts +5 -1
- package/dist/consolidate.d.ts.map +1 -1
- package/dist/consolidate.js +66 -10
- package/dist/consolidate.js.map +1 -1
- package/dist/dag.d.ts +20 -0
- package/dist/dag.d.ts.map +1 -0
- package/dist/dag.js +104 -0
- package/dist/dag.js.map +1 -0
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +36 -1
- package/dist/db.js.map +1 -1
- package/dist/extract.d.ts +14 -0
- package/dist/extract.d.ts.map +1 -0
- package/dist/extract.js +87 -0
- package/dist/extract.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/memory.d.ts +9 -0
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +5 -0
- package/dist/memory.js.map +1 -1
- package/dist/multihop.d.ts +11 -0
- package/dist/multihop.d.ts.map +1 -0
- package/dist/multihop.js +32 -0
- package/dist/multihop.js.map +1 -0
- package/dist/search.d.ts +15 -0
- package/dist/search.d.ts.map +1 -1
- package/dist/search.js +188 -7
- package/dist/search.js.map +1 -1
- package/dist/shared.d.ts +4 -0
- package/dist/shared.d.ts.map +1 -1
- package/dist/shared.js +3 -3
- package/dist/shared.js.map +1 -1
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +23 -3
- package/dist/store.js.map +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
package/dist/extract.js
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { Layer, createMemory } from './memory.js';
|
|
2
|
+
import { writeEntry } from './store.js';
|
|
3
|
+
const EXTRACTION_PROMPT = `You are extracting factual statements from a conversation or memory entry. Extract 1-8 standalone factual statements that would be useful to remember later.
|
|
4
|
+
|
|
5
|
+
Rules:
|
|
6
|
+
- Each fact must be a complete, standalone sentence
|
|
7
|
+
- Include the speaker's name in every fact (e.g. "Alice prefers..." not "She prefers...")
|
|
8
|
+
- Preserve specific details: names, numbers, dates, paths, IDs
|
|
9
|
+
- Return a JSON array of objects with: content (string), tags (array of "speaker:X" and "topic:Y" strings), valence ("neutral", "positive", "negative", or "critical")
|
|
10
|
+
- Return an empty array [] for small talk with no extractable facts
|
|
11
|
+
- Output ONLY the JSON array, no preamble or explanation
|
|
12
|
+
|
|
13
|
+
Input text:
|
|
14
|
+
`;
|
|
15
|
+
export async function extractFacts(text, opts) {
|
|
16
|
+
const model = opts.model ?? 'claude-sonnet-4-6';
|
|
17
|
+
const fetchFn = opts.fetcher ?? fetch;
|
|
18
|
+
let res;
|
|
19
|
+
try {
|
|
20
|
+
res = await fetchFn('https://api.anthropic.com/v1/messages', {
|
|
21
|
+
method: 'POST',
|
|
22
|
+
headers: {
|
|
23
|
+
'content-type': 'application/json',
|
|
24
|
+
'x-api-key': opts.apiKey,
|
|
25
|
+
'anthropic-version': '2023-06-01',
|
|
26
|
+
},
|
|
27
|
+
body: JSON.stringify({
|
|
28
|
+
model,
|
|
29
|
+
max_tokens: 1200,
|
|
30
|
+
messages: [{ role: 'user', content: EXTRACTION_PROMPT + text }],
|
|
31
|
+
}),
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return [];
|
|
36
|
+
}
|
|
37
|
+
if (!res.ok)
|
|
38
|
+
return [];
|
|
39
|
+
try {
|
|
40
|
+
const data = await res.json();
|
|
41
|
+
const raw = data.content?.[0]?.text?.trim() ?? '';
|
|
42
|
+
if (!raw)
|
|
43
|
+
return [];
|
|
44
|
+
const parsed = JSON.parse(raw);
|
|
45
|
+
if (!Array.isArray(parsed))
|
|
46
|
+
return [];
|
|
47
|
+
const validValences = new Set(['neutral', 'positive', 'negative', 'critical']);
|
|
48
|
+
const facts = [];
|
|
49
|
+
for (const item of parsed) {
|
|
50
|
+
if (facts.length >= 8)
|
|
51
|
+
break;
|
|
52
|
+
if (!item || typeof item.content !== 'string' || item.content.length < 3)
|
|
53
|
+
continue;
|
|
54
|
+
const tags = Array.isArray(item.tags)
|
|
55
|
+
? item.tags.filter((t) => typeof t === 'string')
|
|
56
|
+
: [];
|
|
57
|
+
const valence = validValences.has(item.valence)
|
|
58
|
+
? item.valence
|
|
59
|
+
: 'neutral';
|
|
60
|
+
facts.push({ content: item.content, tags, valence });
|
|
61
|
+
}
|
|
62
|
+
return facts;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
return [];
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const INHERITABLE_PREFIXES = ['conv:', 'session:', 'scope:', 'path:'];
|
|
69
|
+
export function storeExtractedFacts(hippoRoot, source, facts) {
|
|
70
|
+
const inheritedTags = source.tags.filter((t) => INHERITABLE_PREFIXES.some((p) => t.startsWith(p)));
|
|
71
|
+
const entries = [];
|
|
72
|
+
for (const fact of facts) {
|
|
73
|
+
const tags = ['extracted', ...inheritedTags, ...fact.tags];
|
|
74
|
+
const entry = createMemory(fact.content, {
|
|
75
|
+
layer: Layer.Semantic,
|
|
76
|
+
tags,
|
|
77
|
+
emotional_valence: fact.valence,
|
|
78
|
+
confidence: 'inferred',
|
|
79
|
+
source: source.source,
|
|
80
|
+
extracted_from: source.id,
|
|
81
|
+
});
|
|
82
|
+
writeEntry(hippoRoot, entry);
|
|
83
|
+
entries.push(entry);
|
|
84
|
+
}
|
|
85
|
+
return entries;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=extract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../src/extract.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
* Hippo public API - re-exports for programmatic use.
|
|
3
3
|
*/
|
|
4
4
|
export { MemoryEntry, Layer, EmotionalValence, ConfidenceLevel, DecayOptions, calculateStrength, resolveConfidence, createMemory, applyOutcome, generateId, computeSchemaFit } from './memory.js';
|
|
5
|
-
export { search, hybridSearch, physicsSearch, markRetrieved, estimateTokens, textOverlap, tokenize, explainMatch, SearchResult, MatchExplanation } from './search.js';
|
|
5
|
+
export { search, hybridSearch, physicsSearch, markRetrieved, estimateTokens, textOverlap, tokenize, explainMatch, detectTemporalDirection, temporalBoost, computeTemporalRange, SearchResult, MatchExplanation } from './search.js';
|
|
6
|
+
export { multihopSearch } from './multihop.js';
|
|
6
7
|
export { initStore, loadAllEntries, loadSearchEntries, writeEntry, readEntry, deleteEntry, loadIndex, rebuildIndex, saveActiveTaskSnapshot, loadActiveTaskSnapshot, clearActiveTaskSnapshot, appendSessionEvent, listSessionEvents, listMemoryConflicts, replaceDetectedConflicts, resolveConflict, saveSessionHandoff, loadLatestHandoff, loadHandoffById, loadSessionDecayContext, SessionDecayContext, } from './store.js';
|
|
7
8
|
export { SessionHandoff } from './handoff.js';
|
|
8
9
|
export { consolidate, ConsolidationResult } from './consolidate.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAClM,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAClM,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,uBAAuB,EAAE,aAAa,EAAE,oBAAoB,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpO,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EACL,SAAS,EACT,cAAc,EACd,iBAAiB,EACjB,UAAU,EACV,SAAS,EACT,WAAW,EACX,SAAS,EACT,YAAY,EACZ,sBAAsB,EACtB,sBAAsB,EACtB,uBAAuB,EACvB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,wBAAwB,EACxB,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAGpE,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,WAAW,EACX,QAAQ,GACT,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,YAAY,EACZ,cAAc,EACd,iBAAiB,EACjB,UAAU,EACV,WAAW,GACZ,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,aAAa,EACb,UAAU,EACV,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,WAAW,EACX,SAAS,EACT,SAAS,GACV,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,MAAM,EACN,MAAM,EACN,OAAO,EACP,OAAO,EACP,iBAAiB,EACjB,cAAc,GACf,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,YAAY,EACZ,aAAa,GACd,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
* Hippo public API - re-exports for programmatic use.
|
|
3
3
|
*/
|
|
4
4
|
export { Layer, calculateStrength, resolveConfidence, createMemory, applyOutcome, generateId, computeSchemaFit } from './memory.js';
|
|
5
|
-
export { search, hybridSearch, physicsSearch, markRetrieved, estimateTokens, textOverlap, tokenize, explainMatch } from './search.js';
|
|
5
|
+
export { search, hybridSearch, physicsSearch, markRetrieved, estimateTokens, textOverlap, tokenize, explainMatch, detectTemporalDirection, temporalBoost, computeTemporalRange } from './search.js';
|
|
6
|
+
export { multihopSearch } from './multihop.js';
|
|
6
7
|
export { initStore, loadAllEntries, loadSearchEntries, writeEntry, readEntry, deleteEntry, loadIndex, rebuildIndex, saveActiveTaskSnapshot, loadActiveTaskSnapshot, clearActiveTaskSnapshot, appendSessionEvent, listSessionEvents, listMemoryConflicts, replaceDetectedConflicts, resolveConflict, saveSessionHandoff, loadLatestHandoff, loadHandoffById, loadSessionDecayContext, } from './store.js';
|
|
7
8
|
export { consolidate } from './consolidate.js';
|
|
8
9
|
// Feature 1: Embedding search
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAe,KAAK,EAAmD,iBAAiB,EAAE,iBAAiB,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAClM,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAkC,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAe,KAAK,EAAmD,iBAAiB,EAAE,iBAAiB,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAClM,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,uBAAuB,EAAE,aAAa,EAAE,oBAAoB,EAAkC,MAAM,aAAa,CAAC;AACpO,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EACL,SAAS,EACT,cAAc,EACd,iBAAiB,EACjB,UAAU,EACV,SAAS,EACT,WAAW,EACX,SAAS,EACT,YAAY,EACZ,sBAAsB,EACtB,sBAAsB,EACtB,uBAAuB,EACvB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,wBAAwB,EACxB,eAAe,EACf,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,uBAAuB,GAExB,MAAM,YAAY,CAAC;AAIpB,OAAO,EAAE,WAAW,EAAuB,MAAM,kBAAkB,CAAC;AAEpE,8BAA8B;AAC9B,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EAClB,WAAW,EACX,QAAQ,GACT,MAAM,iBAAiB,CAAC;AAEzB,oCAAoC;AACpC,OAAO,EACL,YAAY,EACZ,cAAc,EACd,iBAAiB,EACjB,UAAU,EACV,WAAW,GACZ,MAAM,gBAAgB,CAAC;AAExB,uCAAuC;AACvC,OAAO,EACL,aAAa,EACb,UAAU,EACV,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EAEjB,aAAa,EACb,WAAW,EACX,SAAS,EACT,SAAS,GACV,MAAM,aAAa,CAAC;AAErB,4BAA4B;AAC5B,OAAO,EACL,MAAM,EACN,MAAM,EACN,OAAO,EACP,OAAO,EAEP,cAAc,GACf,MAAM,qBAAqB,CAAC;AAE7B,8BAA8B;AAC9B,OAAO,EACL,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,aAAa,GAGd,MAAM,gBAAgB,CAAC"}
|
package/dist/memory.d.ts
CHANGED
|
@@ -34,6 +34,11 @@ export interface MemoryEntry {
|
|
|
34
34
|
starred: boolean;
|
|
35
35
|
trace_outcome: TraceOutcome;
|
|
36
36
|
source_session_id: string | null;
|
|
37
|
+
valid_from: string;
|
|
38
|
+
superseded_by: string | null;
|
|
39
|
+
extracted_from: string | null;
|
|
40
|
+
dag_level: number;
|
|
41
|
+
dag_parent_id: string | null;
|
|
37
42
|
}
|
|
38
43
|
export declare const DECISION_HALF_LIFE_DAYS = 90;
|
|
39
44
|
/**
|
|
@@ -114,6 +119,10 @@ export declare function createMemory(content: string, options?: {
|
|
|
114
119
|
baseHalfLifeDays?: number;
|
|
115
120
|
trace_outcome?: TraceOutcome;
|
|
116
121
|
source_session_id?: string | null;
|
|
122
|
+
valid_from?: string;
|
|
123
|
+
extracted_from?: string;
|
|
124
|
+
dag_level?: number;
|
|
125
|
+
dag_parent_id?: string;
|
|
117
126
|
}): MemoryEntry;
|
|
118
127
|
/**
|
|
119
128
|
* Compute how well new content fits existing knowledge patterns.
|
package/dist/memory.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,oBAAY,KAAK;IACf,MAAM,WAAW;IACjB,QAAQ,aAAa;IACrB,QAAQ,aAAa;IACrB,KAAK,UAAU;CAChB;AAED,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;AAEhF,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,CAAC;AAE7E,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,IAAI,CAAC;AAEpE,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,KAAK,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,iBAAiB,EAAE,gBAAgB,CAAC;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,eAAe,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,YAAY,CAAC;IAC5B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"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"}
|
package/dist/memory.js
CHANGED
|
@@ -193,6 +193,11 @@ export function createMemory(content, options = {}) {
|
|
|
193
193
|
starred: false,
|
|
194
194
|
trace_outcome: options.trace_outcome ?? null,
|
|
195
195
|
source_session_id: options.source_session_id ?? null,
|
|
196
|
+
valid_from: options.valid_from ?? now,
|
|
197
|
+
superseded_by: null,
|
|
198
|
+
extracted_from: options.extracted_from ?? null,
|
|
199
|
+
dag_level: options.dag_level ?? 0,
|
|
200
|
+
dag_parent_id: options.dag_parent_id ?? null,
|
|
196
201
|
};
|
|
197
202
|
// Recalculate strength with the emotional multiplier applied
|
|
198
203
|
entry.strength = calculateStrength(entry);
|
package/dist/memory.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEpC,MAAM,CAAN,IAAY,KAKX;AALD,WAAY,KAAK;IACf,0BAAiB,CAAA;IACjB,8BAAqB,CAAA;IACrB,8BAAqB,CAAA;IACrB,wBAAe,CAAA;AACjB,CAAC,EALW,KAAK,KAAL,KAAK,QAKhB;
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../src/memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { MemoryEntry } from './memory.js';
|
|
2
|
+
import { type SearchResult } from './search.js';
|
|
3
|
+
export declare function multihopSearch(query: string, entries: MemoryEntry[], options?: {
|
|
4
|
+
budget?: number;
|
|
5
|
+
now?: Date;
|
|
6
|
+
hippoRoot?: string;
|
|
7
|
+
minResults?: number;
|
|
8
|
+
includeSuperseded?: boolean;
|
|
9
|
+
asOf?: string;
|
|
10
|
+
}): SearchResult[];
|
|
11
|
+
//# sourceMappingURL=multihop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multihop.d.ts","sourceRoot":"","sources":["../src/multihop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAU,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAExD,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,WAAW,EAAE,EACtB,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,IAAI,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GACjI,YAAY,EAAE,CAkChB"}
|
package/dist/multihop.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { search } from './search.js';
|
|
2
|
+
export function multihopSearch(query, entries, options = {}) {
|
|
3
|
+
const pass1 = search(query, entries, { ...options, budget: (options.budget ?? 4000) * 2 });
|
|
4
|
+
const topK = pass1.slice(0, 10);
|
|
5
|
+
if (topK.length === 0)
|
|
6
|
+
return [];
|
|
7
|
+
const entityTags = new Set();
|
|
8
|
+
for (const r of topK) {
|
|
9
|
+
for (const tag of r.entry.tags) {
|
|
10
|
+
if (tag.startsWith('speaker:') || tag.startsWith('topic:')) {
|
|
11
|
+
entityTags.add(tag);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
const queryLower = query.toLowerCase();
|
|
16
|
+
const newEntities = [...entityTags]
|
|
17
|
+
.map((t) => t.split(':')[1])
|
|
18
|
+
.filter((e) => !queryLower.includes(e.toLowerCase()));
|
|
19
|
+
if (newEntities.length === 0)
|
|
20
|
+
return pass1;
|
|
21
|
+
const followUpQuery = newEntities.join(' ') + ' ' + query;
|
|
22
|
+
const pass2 = search(followUpQuery, entries, options);
|
|
23
|
+
const merged = new Map();
|
|
24
|
+
for (const r of [...pass1, ...pass2]) {
|
|
25
|
+
const existing = merged.get(r.entry.id);
|
|
26
|
+
if (!existing || r.score > existing.score) {
|
|
27
|
+
merged.set(r.entry.id, r);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return [...merged.values()].sort((a, b) => b.score - a.score);
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=multihop.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multihop.js","sourceRoot":"","sources":["../src/multihop.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAqB,MAAM,aAAa,CAAC;AAExD,MAAM,UAAU,cAAc,CAC5B,KAAa,EACb,OAAsB,EACtB,UAAgI,EAAE;IAElI,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3F,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEhC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEjC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAC/B,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC3D,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACvC,MAAM,WAAW,GAAG,CAAC,GAAG,UAAU,CAAC;SAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAC3B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAExD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAE3C,MAAM,aAAa,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC;IAC1D,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAEtD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC/C,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;YAC1C,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC"}
|
package/dist/search.d.ts
CHANGED
|
@@ -21,6 +21,15 @@ export declare function buildCorpus(texts: string[]): BM25Corpus;
|
|
|
21
21
|
* Rough token estimate: characters / 4 (works well for English text).
|
|
22
22
|
*/
|
|
23
23
|
export declare function estimateTokens(text: string): number;
|
|
24
|
+
export declare function detectTemporalDirection(query: string): 'recent' | 'oldest' | null;
|
|
25
|
+
export declare function computeTemporalRange(entries: MemoryEntry[]): {
|
|
26
|
+
minTime: number;
|
|
27
|
+
maxTime: number;
|
|
28
|
+
};
|
|
29
|
+
export declare function temporalBoost(entry: MemoryEntry, direction: 'recent' | 'oldest' | null, range: {
|
|
30
|
+
minTime: number;
|
|
31
|
+
maxTime: number;
|
|
32
|
+
}): number;
|
|
24
33
|
export interface SearchResult {
|
|
25
34
|
entry: MemoryEntry;
|
|
26
35
|
score: number;
|
|
@@ -109,6 +118,10 @@ export declare function hybridSearch(query: string, entries: MemoryEntry[], opti
|
|
|
109
118
|
minResults?: number;
|
|
110
119
|
/** Active scope for scope-boost scoring. Auto-detected if not provided. */
|
|
111
120
|
scope?: string | null;
|
|
121
|
+
/** Include superseded memories in results. Default false. */
|
|
122
|
+
includeSuperseded?: boolean;
|
|
123
|
+
/** Filter to memories current at this ISO date string. */
|
|
124
|
+
asOf?: string;
|
|
112
125
|
}): Promise<SearchResult[]>;
|
|
113
126
|
/**
|
|
114
127
|
* MMR (Maximal Marginal Relevance) re-ranking.
|
|
@@ -150,6 +163,8 @@ export declare function search(query: string, entries: MemoryEntry[], options?:
|
|
|
150
163
|
now?: Date;
|
|
151
164
|
hippoRoot?: string;
|
|
152
165
|
minResults?: number;
|
|
166
|
+
includeSuperseded?: boolean;
|
|
167
|
+
asOf?: string;
|
|
153
168
|
}): SearchResult[];
|
|
154
169
|
/**
|
|
155
170
|
* Update retrieval metadata on entries that were returned by a search.
|
package/dist/search.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAqB,MAAM,aAAa,CAAC;AAa7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AASzD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAM/C;AAMD;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxB,CAAC,EAAE,MAAM,CAAC;CACX;AAKD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,UAAU,CAmBvD;AA6BD;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../src/search.ts"],"names":[],"mappings":"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"}
|
package/dist/search.js
CHANGED
|
@@ -78,6 +78,48 @@ function recencyBoost(entry, now) {
|
|
|
78
78
|
// Exponential decay: memories < 1 day get boost ~1.0, older get less
|
|
79
79
|
return Math.exp(-ageDays / 30);
|
|
80
80
|
}
|
|
81
|
+
// ---------------------------------------------------------------------------
|
|
82
|
+
// Temporal-aware scoring
|
|
83
|
+
// ---------------------------------------------------------------------------
|
|
84
|
+
const TEMPORAL_RECENT_CUES = new Set(['recently', 'latest', 'last', 'newest', 'current', 'today']);
|
|
85
|
+
const TEMPORAL_OLDEST_CUES = new Set(['first', 'earliest', 'oldest', 'initially', 'originally']);
|
|
86
|
+
export function detectTemporalDirection(query) {
|
|
87
|
+
const words = query.toLowerCase().split(/\s+/);
|
|
88
|
+
for (const w of words) {
|
|
89
|
+
if (TEMPORAL_RECENT_CUES.has(w))
|
|
90
|
+
return 'recent';
|
|
91
|
+
if (TEMPORAL_OLDEST_CUES.has(w))
|
|
92
|
+
return 'oldest';
|
|
93
|
+
}
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
export function computeTemporalRange(entries) {
|
|
97
|
+
let minTime = Infinity;
|
|
98
|
+
let maxTime = -Infinity;
|
|
99
|
+
for (const e of entries) {
|
|
100
|
+
const t = new Date(e.created).getTime();
|
|
101
|
+
if (t < minTime)
|
|
102
|
+
minTime = t;
|
|
103
|
+
if (t > maxTime)
|
|
104
|
+
maxTime = t;
|
|
105
|
+
}
|
|
106
|
+
return { minTime, maxTime };
|
|
107
|
+
}
|
|
108
|
+
export function temporalBoost(entry, direction, range) {
|
|
109
|
+
if (!direction)
|
|
110
|
+
return 1.0;
|
|
111
|
+
const span = range.maxTime - range.minTime;
|
|
112
|
+
if (span === 0)
|
|
113
|
+
return 1.0;
|
|
114
|
+
const entryTime = new Date(entry.created).getTime();
|
|
115
|
+
const normalized = (entryTime - range.minTime) / span;
|
|
116
|
+
if (direction === 'recent') {
|
|
117
|
+
return 0.8 + 0.4 * normalized;
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
return 0.8 + 0.4 * (1 - normalized);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
81
123
|
/**
|
|
82
124
|
* Hybrid search: BM25 + cosine similarity (when embeddings are available).
|
|
83
125
|
* score = 0.4 * bm25_norm + 0.6 * cosine_sim (with embeddings)
|
|
@@ -95,6 +137,29 @@ export async function hybridSearch(query, entries, options = {}) {
|
|
|
95
137
|
const explain = options.explain ?? false;
|
|
96
138
|
const mmrEnabled = options.mmr ?? true;
|
|
97
139
|
const mmrLambda = options.mmrLambda ?? 0.7;
|
|
140
|
+
// Bi-temporal filtering
|
|
141
|
+
if (options.asOf) {
|
|
142
|
+
const asOfDate = new Date(options.asOf);
|
|
143
|
+
const successorValidFrom = new Map();
|
|
144
|
+
for (const e of entries) {
|
|
145
|
+
if (e.superseded_by) {
|
|
146
|
+
const successor = entries.find(s => s.id === e.superseded_by);
|
|
147
|
+
if (successor)
|
|
148
|
+
successorValidFrom.set(e.id, successor.valid_from);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
entries = entries.filter(e => {
|
|
152
|
+
if (new Date(e.valid_from) > asOfDate)
|
|
153
|
+
return false;
|
|
154
|
+
if (!e.superseded_by)
|
|
155
|
+
return true;
|
|
156
|
+
const succVf = successorValidFrom.get(e.id);
|
|
157
|
+
return succVf ? new Date(succVf) > asOfDate : true;
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
else if (!options.includeSuperseded) {
|
|
161
|
+
entries = entries.filter(e => !e.superseded_by);
|
|
162
|
+
}
|
|
98
163
|
if (entries.length === 0)
|
|
99
164
|
return [];
|
|
100
165
|
const queryTerms = tokenize(query);
|
|
@@ -162,6 +227,8 @@ export async function hybridSearch(query, entries, options = {}) {
|
|
|
162
227
|
const currentPathTags = extractPathTags(process.cwd());
|
|
163
228
|
const activeScope = options.scope !== undefined ? options.scope : detectScope();
|
|
164
229
|
const queryTermSet = new Set(queryTerms);
|
|
230
|
+
const temporalDirAsync = detectTemporalDirection(query);
|
|
231
|
+
const temporalRangeAsync = temporalDirAsync ? computeTemporalRange(entries) : { minTime: 0, maxTime: 0 };
|
|
165
232
|
for (let i = 0; i < entries.length; i++) {
|
|
166
233
|
const rawBm25 = bm25Scores[i];
|
|
167
234
|
const cosineScore = cosineScores[i];
|
|
@@ -211,6 +278,9 @@ export async function hybridSearch(query, entries, options = {}) {
|
|
|
211
278
|
const scopeSignal = scopeMatch(entries[i].tags, activeScope);
|
|
212
279
|
const scopeBoost = scopeSignal === 1 ? 1.5 : scopeSignal === -1 ? 0.5 : 1.0;
|
|
213
280
|
compositeScore *= scopeBoost;
|
|
281
|
+
const extractionBoost = entries[i].tags.includes('extracted') ? 1.3 : 1.0;
|
|
282
|
+
compositeScore *= extractionBoost;
|
|
283
|
+
compositeScore *= temporalBoost(entries[i], temporalDirAsync, temporalRangeAsync);
|
|
214
284
|
if (compositeScore <= 0)
|
|
215
285
|
continue;
|
|
216
286
|
const tokens = estimateTokens(entries[i].content);
|
|
@@ -251,6 +321,48 @@ export async function hybridSearch(query, entries, options = {}) {
|
|
|
251
321
|
}
|
|
252
322
|
// Sort by composite score descending
|
|
253
323
|
scored.sort((a, b) => b.score - a.score);
|
|
324
|
+
// Deduplicate: when an extracted fact and its source both appear,
|
|
325
|
+
// keep only the higher-scoring one (typically the fact).
|
|
326
|
+
const seenExtractedFrom = new Set();
|
|
327
|
+
const deduped = [];
|
|
328
|
+
for (const result of scored) {
|
|
329
|
+
const entry = result.entry;
|
|
330
|
+
if (entry.extracted_from) {
|
|
331
|
+
seenExtractedFrom.add(entry.extracted_from);
|
|
332
|
+
const sourceIdx = deduped.findIndex((d) => d.entry.id === entry.extracted_from);
|
|
333
|
+
if (sourceIdx >= 0)
|
|
334
|
+
deduped.splice(sourceIdx, 1);
|
|
335
|
+
deduped.push(result);
|
|
336
|
+
}
|
|
337
|
+
else if (seenExtractedFrom.has(entry.id)) {
|
|
338
|
+
continue;
|
|
339
|
+
}
|
|
340
|
+
else {
|
|
341
|
+
deduped.push(result);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
const scoredDeduped = deduped;
|
|
345
|
+
// DAG drill-down: when a summary node matches, inject its children
|
|
346
|
+
const summaryIdsAsync = scoredDeduped
|
|
347
|
+
.filter((r) => r.entry.tags.includes('dag-summary'))
|
|
348
|
+
.map((r) => r.entry.id);
|
|
349
|
+
if (summaryIdsAsync.length > 0) {
|
|
350
|
+
const childEntriesAsync = entries.filter((e) => e.dag_parent_id && summaryIdsAsync.includes(e.dag_parent_id));
|
|
351
|
+
for (const child of childEntriesAsync) {
|
|
352
|
+
if (!scoredDeduped.some((r) => r.entry.id === child.id)) {
|
|
353
|
+
const parentResult = scoredDeduped.find((r) => r.entry.id === child.dag_parent_id);
|
|
354
|
+
const childScore = parentResult ? parentResult.score * 0.9 : 0;
|
|
355
|
+
scoredDeduped.push({
|
|
356
|
+
entry: child,
|
|
357
|
+
score: childScore,
|
|
358
|
+
bm25: 0,
|
|
359
|
+
cosine: 0,
|
|
360
|
+
tokens: estimateTokens(child.content),
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
scoredDeduped.sort((a, b) => b.score - a.score);
|
|
365
|
+
}
|
|
254
366
|
// MMR re-ranking: de-cluster near-duplicates by trading relevance for
|
|
255
367
|
// diversity. Only applies when embeddings are loaded (doc-to-doc similarity
|
|
256
368
|
// is via cosine of cached vectors); otherwise we return the pure-relevance
|
|
@@ -261,15 +373,15 @@ export async function hybridSearch(query, entries, options = {}) {
|
|
|
261
373
|
// relevance-scored candidates — anything below top-K was never going to
|
|
262
374
|
// surface anyway after budget filtering.
|
|
263
375
|
const MMR_CANDIDATE_CAP = 100;
|
|
264
|
-
const applyMmr = mmrEnabled && useEmbeddings &&
|
|
376
|
+
const applyMmr = mmrEnabled && useEmbeddings && scoredDeduped.length > 1 && mmrLambda < 1;
|
|
265
377
|
let ordered;
|
|
266
378
|
if (applyMmr) {
|
|
267
|
-
const head =
|
|
268
|
-
const tail =
|
|
379
|
+
const head = scoredDeduped.slice(0, MMR_CANDIDATE_CAP);
|
|
380
|
+
const tail = scoredDeduped.slice(MMR_CANDIDATE_CAP);
|
|
269
381
|
ordered = [...mmrRerank(head, embeddingIndex, mmrLambda, explain), ...tail];
|
|
270
382
|
}
|
|
271
383
|
else {
|
|
272
|
-
ordered =
|
|
384
|
+
ordered = scoredDeduped;
|
|
273
385
|
}
|
|
274
386
|
// Apply token budget (guarantee at least minResults items)
|
|
275
387
|
const results = [];
|
|
@@ -487,6 +599,29 @@ export function search(query, entries, options = {}) {
|
|
|
487
599
|
const now = options.now ?? new Date();
|
|
488
600
|
const budget = options.budget ?? 4000;
|
|
489
601
|
const minResults = options.minResults ?? 1;
|
|
602
|
+
// Bi-temporal filtering
|
|
603
|
+
if (options.asOf) {
|
|
604
|
+
const asOfDate = new Date(options.asOf);
|
|
605
|
+
const successorValidFrom = new Map();
|
|
606
|
+
for (const e of entries) {
|
|
607
|
+
if (e.superseded_by) {
|
|
608
|
+
const successor = entries.find(s => s.id === e.superseded_by);
|
|
609
|
+
if (successor)
|
|
610
|
+
successorValidFrom.set(e.id, successor.valid_from);
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
entries = entries.filter(e => {
|
|
614
|
+
if (new Date(e.valid_from) > asOfDate)
|
|
615
|
+
return false;
|
|
616
|
+
if (!e.superseded_by)
|
|
617
|
+
return true;
|
|
618
|
+
const succVf = successorValidFrom.get(e.id);
|
|
619
|
+
return succVf ? new Date(succVf) > asOfDate : true;
|
|
620
|
+
});
|
|
621
|
+
}
|
|
622
|
+
else if (!options.includeSuperseded) {
|
|
623
|
+
entries = entries.filter(e => !e.superseded_by);
|
|
624
|
+
}
|
|
490
625
|
if (entries.length === 0)
|
|
491
626
|
return [];
|
|
492
627
|
const queryTerms = tokenize(query);
|
|
@@ -499,6 +634,8 @@ export function search(query, entries, options = {}) {
|
|
|
499
634
|
const scored = [];
|
|
500
635
|
const currentPathTagsSync = extractPathTags(process.cwd());
|
|
501
636
|
const activeScopeSync = detectScope();
|
|
637
|
+
const temporalDir = detectTemporalDirection(query);
|
|
638
|
+
const temporalRangeSync = temporalDir ? computeTemporalRange(entries) : { minTime: 0, maxTime: 0 };
|
|
502
639
|
for (let i = 0; i < entries.length; i++) {
|
|
503
640
|
const bm25 = bm25Score(corpus, i, queryTerms);
|
|
504
641
|
if (bm25 <= 0)
|
|
@@ -521,20 +658,62 @@ export function search(query, entries, options = {}) {
|
|
|
521
658
|
const scopeSignalSync = scopeMatch(entries[i].tags, activeScopeSync);
|
|
522
659
|
const scopeBoostSync = scopeSignalSync === 1 ? 1.5 : scopeSignalSync === -1 ? 0.5 : 1.0;
|
|
523
660
|
composite *= scopeBoostSync;
|
|
661
|
+
const extractionBoostSync = entries[i].tags.includes('extracted') ? 1.3 : 1.0;
|
|
662
|
+
composite *= extractionBoostSync;
|
|
663
|
+
composite *= temporalBoost(entries[i], temporalDir, temporalRangeSync);
|
|
524
664
|
const tokens = estimateTokens(entries[i].content);
|
|
525
665
|
scored.push({ entry: entries[i], score: composite, bm25, cosine: 0, tokens });
|
|
526
666
|
}
|
|
527
667
|
// Sort by composite score descending
|
|
528
668
|
scored.sort((a, b) => b.score - a.score);
|
|
669
|
+
const seenExtractedFromSync = new Set();
|
|
670
|
+
const dedupedSync = [];
|
|
671
|
+
for (const result of scored) {
|
|
672
|
+
const entry = result.entry;
|
|
673
|
+
if (entry.extracted_from) {
|
|
674
|
+
seenExtractedFromSync.add(entry.extracted_from);
|
|
675
|
+
const sourceIdx = dedupedSync.findIndex((d) => d.entry.id === entry.extracted_from);
|
|
676
|
+
if (sourceIdx >= 0)
|
|
677
|
+
dedupedSync.splice(sourceIdx, 1);
|
|
678
|
+
dedupedSync.push(result);
|
|
679
|
+
}
|
|
680
|
+
else if (seenExtractedFromSync.has(entry.id)) {
|
|
681
|
+
continue;
|
|
682
|
+
}
|
|
683
|
+
else {
|
|
684
|
+
dedupedSync.push(result);
|
|
685
|
+
}
|
|
686
|
+
}
|
|
687
|
+
// DAG drill-down: when a summary node matches, inject its children
|
|
688
|
+
const summaryIdsSync = dedupedSync
|
|
689
|
+
.filter((r) => r.entry.tags.includes('dag-summary'))
|
|
690
|
+
.map((r) => r.entry.id);
|
|
691
|
+
if (summaryIdsSync.length > 0) {
|
|
692
|
+
const childEntries = entries.filter((e) => e.dag_parent_id && summaryIdsSync.includes(e.dag_parent_id));
|
|
693
|
+
for (const child of childEntries) {
|
|
694
|
+
if (!dedupedSync.some((r) => r.entry.id === child.id)) {
|
|
695
|
+
const parentResult = dedupedSync.find((r) => r.entry.id === child.dag_parent_id);
|
|
696
|
+
const childScore = parentResult ? parentResult.score * 0.9 : 0;
|
|
697
|
+
dedupedSync.push({
|
|
698
|
+
entry: child,
|
|
699
|
+
score: childScore,
|
|
700
|
+
bm25: 0,
|
|
701
|
+
cosine: 0,
|
|
702
|
+
tokens: estimateTokens(child.content),
|
|
703
|
+
});
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
dedupedSync.sort((a, b) => b.score - a.score);
|
|
707
|
+
}
|
|
529
708
|
// Apply token budget
|
|
530
709
|
const results = [];
|
|
531
710
|
let usedTokens = 0;
|
|
532
|
-
for (let i = 0; i <
|
|
533
|
-
const tokens =
|
|
711
|
+
for (let i = 0; i < dedupedSync.length; i++) {
|
|
712
|
+
const tokens = dedupedSync[i].tokens;
|
|
534
713
|
if (results.length >= minResults && usedTokens + tokens > budget)
|
|
535
714
|
continue;
|
|
536
715
|
usedTokens += tokens;
|
|
537
|
-
results.push(
|
|
716
|
+
results.push(dedupedSync[i]);
|
|
538
717
|
}
|
|
539
718
|
return results;
|
|
540
719
|
}
|
|
@@ -544,6 +723,8 @@ export function search(query, entries, options = {}) {
|
|
|
544
723
|
*/
|
|
545
724
|
export function markRetrieved(entries, now = new Date()) {
|
|
546
725
|
return entries.map((e) => {
|
|
726
|
+
if (e.superseded_by)
|
|
727
|
+
return e;
|
|
547
728
|
const updated = {
|
|
548
729
|
...e,
|
|
549
730
|
retrieval_count: e.retrieval_count + 1,
|