@steno-ai/engine 0.1.6 → 0.1.7
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/extraction/cross-linker.d.ts +16 -15
- package/dist/extraction/cross-linker.d.ts.map +1 -1
- package/dist/extraction/cross-linker.js +113 -80
- package/dist/extraction/cross-linker.js.map +1 -1
- package/dist/extraction/pipeline.js +1 -1
- package/dist/extraction/pipeline.js.map +1 -1
- package/dist/sessions/index.d.ts +1 -1
- package/dist/sessions/index.d.ts.map +1 -1
- package/dist/sessions/index.js +1 -1
- package/dist/sessions/index.js.map +1 -1
- package/package.json +1 -1
- package/src/extraction/cross-linker.ts +130 -85
- package/src/extraction/pipeline.ts +1 -1
- package/src/sessions/index.ts +1 -1
|
@@ -1,23 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Cross-Fact Edge Linker —
|
|
2
|
+
* Cross-Fact Edge Linker — LLM-Powered Relationship Classification
|
|
3
3
|
*
|
|
4
|
-
* After extraction, finds existing facts that share entities with new facts
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* After extraction, finds existing facts that share entities with new facts,
|
|
5
|
+
* then uses ONE LLM call to classify the relationship structure:
|
|
6
|
+
* - part_of: "session ingestion" is part_of "steno roadmap"
|
|
7
|
+
* - has_child: "steno roadmap" has_child "session ingestion"
|
|
8
|
+
* - extends: new fact adds detail to existing
|
|
9
|
+
* - derives: new fact is inferred from existing
|
|
10
|
+
* - relates_to: loosely related (fallback)
|
|
7
11
|
*
|
|
8
|
-
* Heuristics
|
|
9
|
-
*
|
|
10
|
-
* 2. Content similarity (required) — facts have overlapping keywords (>30% overlap)
|
|
11
|
-
* 3. Temporal proximity (bonus) — facts created within 7 days get priority
|
|
12
|
-
* 4. Skip generic entities — "user" entity is too broad to link on
|
|
12
|
+
* Heuristics filter candidates FIRST (shared entity + keyword overlap),
|
|
13
|
+
* then ONE LLM call classifies the batch. No wasted LLM calls on unrelated facts.
|
|
13
14
|
*/
|
|
14
15
|
import type { StorageAdapter } from '../adapters/storage.js';
|
|
16
|
+
import type { LLMAdapter } from '../adapters/llm.js';
|
|
15
17
|
/**
|
|
16
|
-
* Link newly created facts to existing related facts
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* they both mention "Steno" or "user".
|
|
18
|
+
* Link newly created facts to existing related facts.
|
|
19
|
+
* Step 1: Heuristic filter (shared entity + keyword overlap)
|
|
20
|
+
* Step 2: ONE LLM call to classify relationship types for the batch
|
|
21
|
+
* Step 3: Create typed edges (part_of, has_child, extends, derives, relates_to)
|
|
21
22
|
*/
|
|
22
|
-
export declare function linkRelatedFacts(storage: StorageAdapter, tenantId: string, newFactIds: string[], entityIdMap: Map<string, string
|
|
23
|
+
export declare function linkRelatedFacts(storage: StorageAdapter, tenantId: string, newFactIds: string[], entityIdMap: Map<string, string>, llm?: LLMAdapter): Promise<number>;
|
|
23
24
|
//# sourceMappingURL=cross-linker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cross-linker.d.ts","sourceRoot":"","sources":["../../src/extraction/cross-linker.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"cross-linker.d.ts","sourceRoot":"","sources":["../../src/extraction/cross-linker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AA0CrD;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAAE,EACpB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAChC,GAAG,CAAC,EAAE,UAAU,GACf,OAAO,CAAC,MAAM,CAAC,CA4IjB"}
|
|
@@ -1,24 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Cross-Fact Edge Linker —
|
|
2
|
+
* Cross-Fact Edge Linker — LLM-Powered Relationship Classification
|
|
3
3
|
*
|
|
4
|
-
* After extraction, finds existing facts that share entities with new facts
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* After extraction, finds existing facts that share entities with new facts,
|
|
5
|
+
* then uses ONE LLM call to classify the relationship structure:
|
|
6
|
+
* - part_of: "session ingestion" is part_of "steno roadmap"
|
|
7
|
+
* - has_child: "steno roadmap" has_child "session ingestion"
|
|
8
|
+
* - extends: new fact adds detail to existing
|
|
9
|
+
* - derives: new fact is inferred from existing
|
|
10
|
+
* - relates_to: loosely related (fallback)
|
|
7
11
|
*
|
|
8
|
-
* Heuristics
|
|
9
|
-
*
|
|
10
|
-
* 2. Content similarity (required) — facts have overlapping keywords (>30% overlap)
|
|
11
|
-
* 3. Temporal proximity (bonus) — facts created within 7 days get priority
|
|
12
|
-
* 4. Skip generic entities — "user" entity is too broad to link on
|
|
13
|
-
*/
|
|
14
|
-
const GENERIC_ENTITIES = new Set(['user', 'assistant', 'navia', 'steno']);
|
|
15
|
-
const MIN_KEYWORD_OVERLAP = 0.25; // 25% of keywords must overlap
|
|
16
|
-
const MAX_LINKS_PER_FACT = 3; // Don't create too many edges per new fact
|
|
17
|
-
const TEMPORAL_WINDOW_DAYS = 14; // Prefer facts within 2 weeks
|
|
18
|
-
/**
|
|
19
|
-
* Extract meaningful keywords from fact content for similarity comparison.
|
|
20
|
-
* Strips stop words, lowercases, returns unique tokens.
|
|
12
|
+
* Heuristics filter candidates FIRST (shared entity + keyword overlap),
|
|
13
|
+
* then ONE LLM call classifies the batch. No wasted LLM calls on unrelated facts.
|
|
21
14
|
*/
|
|
15
|
+
const GENERIC_ENTITIES = new Set(['user', 'assistant', 'navia']);
|
|
16
|
+
const MIN_KEYWORD_OVERLAP = 0.20;
|
|
17
|
+
const MAX_CANDIDATES_PER_ENTITY = 5;
|
|
22
18
|
function extractKeywords(content) {
|
|
23
19
|
const stopWords = new Set([
|
|
24
20
|
'the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'been', 'being',
|
|
@@ -36,10 +32,6 @@ function extractKeywords(content) {
|
|
|
36
32
|
.split(/\s+/)
|
|
37
33
|
.filter(w => w.length >= 3 && !stopWords.has(w)));
|
|
38
34
|
}
|
|
39
|
-
/**
|
|
40
|
-
* Calculate keyword overlap ratio between two facts.
|
|
41
|
-
* Returns 0-1 where 1 = identical keywords.
|
|
42
|
-
*/
|
|
43
35
|
function keywordOverlap(a, b) {
|
|
44
36
|
if (a.size === 0 || b.size === 0)
|
|
45
37
|
return 0;
|
|
@@ -48,30 +40,17 @@ function keywordOverlap(a, b) {
|
|
|
48
40
|
if (b.has(word))
|
|
49
41
|
shared++;
|
|
50
42
|
}
|
|
51
|
-
|
|
52
|
-
return shared / minSize;
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Check if two facts are temporally close (within TEMPORAL_WINDOW_DAYS).
|
|
56
|
-
*/
|
|
57
|
-
function isTemporallyClose(a, b) {
|
|
58
|
-
const aDate = new Date(a.createdAt).getTime();
|
|
59
|
-
const bDate = new Date(b.createdAt).getTime();
|
|
60
|
-
const diffDays = Math.abs(aDate - bDate) / (1000 * 60 * 60 * 24);
|
|
61
|
-
return diffDays <= TEMPORAL_WINDOW_DAYS;
|
|
43
|
+
return shared / Math.min(a.size, b.size);
|
|
62
44
|
}
|
|
63
45
|
/**
|
|
64
|
-
* Link newly created facts to existing related facts
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
* they both mention "Steno" or "user".
|
|
46
|
+
* Link newly created facts to existing related facts.
|
|
47
|
+
* Step 1: Heuristic filter (shared entity + keyword overlap)
|
|
48
|
+
* Step 2: ONE LLM call to classify relationship types for the batch
|
|
49
|
+
* Step 3: Create typed edges (part_of, has_child, extends, derives, relates_to)
|
|
69
50
|
*/
|
|
70
|
-
export async function linkRelatedFacts(storage, tenantId, newFactIds, entityIdMap) {
|
|
51
|
+
export async function linkRelatedFacts(storage, tenantId, newFactIds, entityIdMap, llm) {
|
|
71
52
|
if (newFactIds.length === 0 || entityIdMap.size === 0)
|
|
72
53
|
return 0;
|
|
73
|
-
let edgesCreated = 0;
|
|
74
|
-
// Get the new facts' content for keyword extraction
|
|
75
54
|
const newFacts = await storage.getFactsByIds(tenantId, newFactIds);
|
|
76
55
|
if (newFacts.length === 0)
|
|
77
56
|
return 0;
|
|
@@ -79,67 +58,121 @@ export async function linkRelatedFacts(storage, tenantId, newFactIds, entityIdMa
|
|
|
79
58
|
for (const f of newFacts) {
|
|
80
59
|
newFactKeywords.set(f.id, extractKeywords(f.content));
|
|
81
60
|
}
|
|
82
|
-
//
|
|
61
|
+
// Step 1: Find candidate pairs via heuristic
|
|
62
|
+
const candidates = [];
|
|
63
|
+
const newFactSet = new Set(newFactIds);
|
|
83
64
|
for (const [canonicalName, entityId] of entityIdMap) {
|
|
84
65
|
if (GENERIC_ENTITIES.has(canonicalName))
|
|
85
|
-
continue;
|
|
66
|
+
continue;
|
|
86
67
|
try {
|
|
87
68
|
const linkedFacts = await storage.getFactsForEntity(tenantId, entityId, { limit: 20 });
|
|
88
69
|
if (linkedFacts.data.length < 2)
|
|
89
70
|
continue;
|
|
90
|
-
const
|
|
91
|
-
const existingFacts = linkedFacts.data.filter(f => !newFactSet.has(f.id) &&
|
|
92
|
-
!f.tags?.includes('scratchpad') // Skip scratchpad blobs
|
|
93
|
-
);
|
|
71
|
+
const existingFacts = linkedFacts.data.filter(f => !newFactSet.has(f.id) && !f.tags?.includes('scratchpad'));
|
|
94
72
|
for (const newFact of newFacts) {
|
|
95
73
|
const newKw = newFactKeywords.get(newFact.id);
|
|
96
74
|
if (!newKw || newKw.size < 2)
|
|
97
|
-
continue;
|
|
98
|
-
let
|
|
75
|
+
continue;
|
|
76
|
+
let count = 0;
|
|
99
77
|
for (const existingFact of existingFacts) {
|
|
100
|
-
if (
|
|
78
|
+
if (count >= MAX_CANDIDATES_PER_ENTITY)
|
|
101
79
|
break;
|
|
102
80
|
const existingKw = extractKeywords(existingFact.content);
|
|
103
81
|
const overlap = keywordOverlap(newKw, existingKw);
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
// Boost score for temporal proximity
|
|
108
|
-
const temporalBoost = isTemporallyClose(newFact, existingFact) ? 0.1 : 0;
|
|
109
|
-
const relevanceScore = overlap + temporalBoost;
|
|
110
|
-
try {
|
|
111
|
-
await storage.createEdge({
|
|
112
|
-
id: crypto.randomUUID(),
|
|
113
|
-
tenantId,
|
|
114
|
-
sourceId: entityId,
|
|
115
|
-
targetId: entityId,
|
|
116
|
-
relation: 'relates_to',
|
|
117
|
-
edgeType: 'associative',
|
|
118
|
-
weight: Math.min(relevanceScore, 1.0),
|
|
119
|
-
factId: newFact.id,
|
|
120
|
-
confidence: overlap,
|
|
121
|
-
metadata: {
|
|
122
|
-
linkedFactId: existingFact.id,
|
|
123
|
-
reason: 'shared_entity_and_content',
|
|
124
|
-
entity: canonicalName,
|
|
125
|
-
keywordOverlap: overlap.toFixed(2),
|
|
126
|
-
},
|
|
127
|
-
});
|
|
128
|
-
edgesCreated++;
|
|
129
|
-
linksForThisFact++;
|
|
130
|
-
}
|
|
131
|
-
catch {
|
|
132
|
-
// Duplicate or constraint — skip
|
|
82
|
+
if (overlap >= MIN_KEYWORD_OVERLAP) {
|
|
83
|
+
candidates.push({ newFact, existingFact, entityId, entityName: canonicalName, overlap });
|
|
84
|
+
count++;
|
|
133
85
|
}
|
|
134
86
|
}
|
|
135
87
|
}
|
|
136
88
|
}
|
|
89
|
+
catch { /* continue */ }
|
|
90
|
+
}
|
|
91
|
+
if (candidates.length === 0)
|
|
92
|
+
return 0;
|
|
93
|
+
// Deduplicate by fact pair
|
|
94
|
+
const seen = new Set();
|
|
95
|
+
const uniqueCandidates = candidates.filter(c => {
|
|
96
|
+
const key = `${c.newFact.id}|${c.existingFact.id}`;
|
|
97
|
+
if (seen.has(key))
|
|
98
|
+
return false;
|
|
99
|
+
seen.add(key);
|
|
100
|
+
return true;
|
|
101
|
+
});
|
|
102
|
+
// Step 2: ONE LLM call to classify all relationships
|
|
103
|
+
let classifications = [];
|
|
104
|
+
if (llm && uniqueCandidates.length > 0) {
|
|
105
|
+
try {
|
|
106
|
+
const pairsText = uniqueCandidates.map((c, i) => `[${i}] NEW: "${c.newFact.content.slice(0, 150)}"\n EXISTING: "${c.existingFact.content.slice(0, 150)}"\n SHARED ENTITY: ${c.entityName}`).join('\n\n');
|
|
107
|
+
const response = await llm.complete([
|
|
108
|
+
{
|
|
109
|
+
role: 'system',
|
|
110
|
+
content: `Classify the relationship between each pair of facts. For each pair, output:
|
|
111
|
+
- relation: one of "part_of", "has_child", "extends", "derives", "relates_to"
|
|
112
|
+
- direction: "forward" (NEW → EXISTING) or "reverse" (EXISTING → NEW)
|
|
113
|
+
|
|
114
|
+
Relationship meanings:
|
|
115
|
+
- part_of: the NEW fact is a component/subtask/member of the EXISTING fact (forward: NEW part_of EXISTING)
|
|
116
|
+
- has_child: the NEW fact is a parent/container of the EXISTING fact (forward: NEW has_child EXISTING)
|
|
117
|
+
- extends: the NEW fact adds detail to the EXISTING fact without contradicting it
|
|
118
|
+
- derives: the NEW fact is inferred from or builds upon the EXISTING fact
|
|
119
|
+
- relates_to: loosely related but no clear hierarchy
|
|
120
|
+
|
|
121
|
+
Return ONLY a JSON array: [{"index": 0, "relation": "part_of", "direction": "forward"}, ...]`
|
|
122
|
+
},
|
|
123
|
+
{ role: 'user', content: pairsText }
|
|
124
|
+
], { temperature: 0, responseFormat: 'json' });
|
|
125
|
+
classifications = JSON.parse(response.content);
|
|
126
|
+
}
|
|
137
127
|
catch {
|
|
138
|
-
//
|
|
128
|
+
// LLM failed — fall back to heuristic relates_to
|
|
129
|
+
classifications = uniqueCandidates.map((_, i) => ({ index: i, relation: 'relates_to', direction: 'forward' }));
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
// No LLM — all relates_to
|
|
134
|
+
classifications = uniqueCandidates.map((_, i) => ({ index: i, relation: 'relates_to', direction: 'forward' }));
|
|
135
|
+
}
|
|
136
|
+
// Step 3: Create typed edges
|
|
137
|
+
let edgesCreated = 0;
|
|
138
|
+
for (const cls of classifications) {
|
|
139
|
+
const candidate = uniqueCandidates[cls.index];
|
|
140
|
+
if (!candidate)
|
|
141
|
+
continue;
|
|
142
|
+
const validRelations = ['part_of', 'has_child', 'extends', 'derives', 'relates_to'];
|
|
143
|
+
const relation = validRelations.includes(cls.relation) ? cls.relation : 'relates_to';
|
|
144
|
+
// Map relation to edge type
|
|
145
|
+
const edgeType = relation === 'extends' ? 'extends'
|
|
146
|
+
: relation === 'derives' ? 'derives'
|
|
147
|
+
: 'associative';
|
|
148
|
+
// Determine source/target based on direction
|
|
149
|
+
const sourceFactId = cls.direction === 'forward' ? candidate.newFact.id : candidate.existingFact.id;
|
|
150
|
+
const targetFactId = cls.direction === 'forward' ? candidate.existingFact.id : candidate.newFact.id;
|
|
151
|
+
try {
|
|
152
|
+
await storage.createEdge({
|
|
153
|
+
id: crypto.randomUUID(),
|
|
154
|
+
tenantId,
|
|
155
|
+
sourceId: candidate.entityId,
|
|
156
|
+
targetId: candidate.entityId,
|
|
157
|
+
relation,
|
|
158
|
+
edgeType,
|
|
159
|
+
weight: Math.min(candidate.overlap + 0.2, 1.0),
|
|
160
|
+
factId: sourceFactId,
|
|
161
|
+
confidence: candidate.overlap,
|
|
162
|
+
metadata: {
|
|
163
|
+
sourceFactId,
|
|
164
|
+
targetFactId,
|
|
165
|
+
reason: llm ? 'llm_classified' : 'heuristic_keyword_overlap',
|
|
166
|
+
entity: candidate.entityName,
|
|
167
|
+
keywordOverlap: candidate.overlap.toFixed(2),
|
|
168
|
+
},
|
|
169
|
+
});
|
|
170
|
+
edgesCreated++;
|
|
139
171
|
}
|
|
172
|
+
catch { /* duplicate or constraint */ }
|
|
140
173
|
}
|
|
141
174
|
if (edgesCreated > 0) {
|
|
142
|
-
console.error(`[steno] Cross-linked ${edgesCreated}
|
|
175
|
+
console.error(`[steno] Cross-linked ${edgesCreated} facts (${llm ? 'LLM-classified' : 'heuristic'}): ${uniqueCandidates.map(c => c.entityName).filter((v, i, a) => a.indexOf(v) === i).join(', ')}`);
|
|
143
176
|
}
|
|
144
177
|
return edgesCreated;
|
|
145
178
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cross-linker.js","sourceRoot":"","sources":["../../src/extraction/cross-linker.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"cross-linker.js","sourceRoot":"","sources":["../../src/extraction/cross-linker.ts"],"names":[],"mappings":"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"}
|
|
@@ -245,7 +245,7 @@ async function executeExtraction(config, extractionId, input, startTime) {
|
|
|
245
245
|
// Cross-link new facts to existing related facts via shared entities + keyword overlap
|
|
246
246
|
if (createdFactIds.length > 0) {
|
|
247
247
|
try {
|
|
248
|
-
const crossLinked = await linkRelatedFacts(config.storage, input.tenantId, createdFactIds, entityIdMap);
|
|
248
|
+
const crossLinked = await linkRelatedFacts(config.storage, input.tenantId, createdFactIds, entityIdMap, config.cheapLLM);
|
|
249
249
|
edgesCreated += crossLinked;
|
|
250
250
|
}
|
|
251
251
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/extraction/pipeline.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/extraction/pipeline.ts"],"names":[],"mappings":"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"}
|
package/dist/sessions/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { startSession, endSession } from './manager.js';
|
|
1
|
+
export { startSession, endSession, getOrCreateActiveSession } from './manager.js';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sessions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sessions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/sessions/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { startSession, endSession } from './manager.js';
|
|
1
|
+
export { startSession, endSession, getOrCreateActiveSession } from './manager.js';
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sessions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sessions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,29 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Cross-Fact Edge Linker —
|
|
2
|
+
* Cross-Fact Edge Linker — LLM-Powered Relationship Classification
|
|
3
3
|
*
|
|
4
|
-
* After extraction, finds existing facts that share entities with new facts
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* After extraction, finds existing facts that share entities with new facts,
|
|
5
|
+
* then uses ONE LLM call to classify the relationship structure:
|
|
6
|
+
* - part_of: "session ingestion" is part_of "steno roadmap"
|
|
7
|
+
* - has_child: "steno roadmap" has_child "session ingestion"
|
|
8
|
+
* - extends: new fact adds detail to existing
|
|
9
|
+
* - derives: new fact is inferred from existing
|
|
10
|
+
* - relates_to: loosely related (fallback)
|
|
7
11
|
*
|
|
8
|
-
* Heuristics
|
|
9
|
-
*
|
|
10
|
-
* 2. Content similarity (required) — facts have overlapping keywords (>30% overlap)
|
|
11
|
-
* 3. Temporal proximity (bonus) — facts created within 7 days get priority
|
|
12
|
-
* 4. Skip generic entities — "user" entity is too broad to link on
|
|
12
|
+
* Heuristics filter candidates FIRST (shared entity + keyword overlap),
|
|
13
|
+
* then ONE LLM call classifies the batch. No wasted LLM calls on unrelated facts.
|
|
13
14
|
*/
|
|
14
15
|
|
|
15
16
|
import type { StorageAdapter } from '../adapters/storage.js';
|
|
17
|
+
import type { LLMAdapter } from '../adapters/llm.js';
|
|
16
18
|
import type { Fact } from '../models/fact.js';
|
|
17
19
|
|
|
18
|
-
const GENERIC_ENTITIES = new Set(['user', 'assistant', 'navia'
|
|
19
|
-
const MIN_KEYWORD_OVERLAP = 0.
|
|
20
|
-
const
|
|
21
|
-
const TEMPORAL_WINDOW_DAYS = 14; // Prefer facts within 2 weeks
|
|
20
|
+
const GENERIC_ENTITIES = new Set(['user', 'assistant', 'navia']);
|
|
21
|
+
const MIN_KEYWORD_OVERLAP = 0.20;
|
|
22
|
+
const MAX_CANDIDATES_PER_ENTITY = 5;
|
|
22
23
|
|
|
23
|
-
/**
|
|
24
|
-
* Extract meaningful keywords from fact content for similarity comparison.
|
|
25
|
-
* Strips stop words, lowercases, returns unique tokens.
|
|
26
|
-
*/
|
|
27
24
|
function extractKeywords(content: string): Set<string> {
|
|
28
25
|
const stopWords = new Set([
|
|
29
26
|
'the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'been', 'being',
|
|
@@ -36,7 +33,6 @@ function extractKeywords(content: string): Set<string> {
|
|
|
36
33
|
'about', 'up', 'out', 'if', 'then', 'that', 'this', 'these', 'those',
|
|
37
34
|
'it', 'its', 'user', 'users', 'they', 'them', 'their', 'he', 'she',
|
|
38
35
|
]);
|
|
39
|
-
|
|
40
36
|
return new Set(
|
|
41
37
|
content.toLowerCase()
|
|
42
38
|
.replace(/[^a-z0-9\s-]/g, ' ')
|
|
@@ -45,48 +41,36 @@ function extractKeywords(content: string): Set<string> {
|
|
|
45
41
|
);
|
|
46
42
|
}
|
|
47
43
|
|
|
48
|
-
/**
|
|
49
|
-
* Calculate keyword overlap ratio between two facts.
|
|
50
|
-
* Returns 0-1 where 1 = identical keywords.
|
|
51
|
-
*/
|
|
52
44
|
function keywordOverlap(a: Set<string>, b: Set<string>): number {
|
|
53
45
|
if (a.size === 0 || b.size === 0) return 0;
|
|
54
46
|
let shared = 0;
|
|
55
|
-
for (const word of a) {
|
|
56
|
-
|
|
57
|
-
}
|
|
58
|
-
const minSize = Math.min(a.size, b.size);
|
|
59
|
-
return shared / minSize;
|
|
47
|
+
for (const word of a) { if (b.has(word)) shared++; }
|
|
48
|
+
return shared / Math.min(a.size, b.size);
|
|
60
49
|
}
|
|
61
50
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
const diffDays = Math.abs(aDate - bDate) / (1000 * 60 * 60 * 24);
|
|
69
|
-
return diffDays <= TEMPORAL_WINDOW_DAYS;
|
|
51
|
+
interface CandidatePair {
|
|
52
|
+
newFact: Fact;
|
|
53
|
+
existingFact: Fact;
|
|
54
|
+
entityId: string;
|
|
55
|
+
entityName: string;
|
|
56
|
+
overlap: number;
|
|
70
57
|
}
|
|
71
58
|
|
|
72
59
|
/**
|
|
73
|
-
* Link newly created facts to existing related facts
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
* they both mention "Steno" or "user".
|
|
60
|
+
* Link newly created facts to existing related facts.
|
|
61
|
+
* Step 1: Heuristic filter (shared entity + keyword overlap)
|
|
62
|
+
* Step 2: ONE LLM call to classify relationship types for the batch
|
|
63
|
+
* Step 3: Create typed edges (part_of, has_child, extends, derives, relates_to)
|
|
78
64
|
*/
|
|
79
65
|
export async function linkRelatedFacts(
|
|
80
66
|
storage: StorageAdapter,
|
|
81
67
|
tenantId: string,
|
|
82
68
|
newFactIds: string[],
|
|
83
69
|
entityIdMap: Map<string, string>,
|
|
70
|
+
llm?: LLMAdapter,
|
|
84
71
|
): Promise<number> {
|
|
85
72
|
if (newFactIds.length === 0 || entityIdMap.size === 0) return 0;
|
|
86
73
|
|
|
87
|
-
let edgesCreated = 0;
|
|
88
|
-
|
|
89
|
-
// Get the new facts' content for keyword extraction
|
|
90
74
|
const newFacts = await storage.getFactsByIds(tenantId, newFactIds);
|
|
91
75
|
if (newFacts.length === 0) return 0;
|
|
92
76
|
|
|
@@ -95,71 +79,132 @@ export async function linkRelatedFacts(
|
|
|
95
79
|
newFactKeywords.set(f.id, extractKeywords(f.content));
|
|
96
80
|
}
|
|
97
81
|
|
|
98
|
-
//
|
|
82
|
+
// Step 1: Find candidate pairs via heuristic
|
|
83
|
+
const candidates: CandidatePair[] = [];
|
|
84
|
+
const newFactSet = new Set(newFactIds);
|
|
85
|
+
|
|
99
86
|
for (const [canonicalName, entityId] of entityIdMap) {
|
|
100
|
-
if (GENERIC_ENTITIES.has(canonicalName)) continue;
|
|
87
|
+
if (GENERIC_ENTITIES.has(canonicalName)) continue;
|
|
101
88
|
|
|
102
89
|
try {
|
|
103
90
|
const linkedFacts = await storage.getFactsForEntity(tenantId, entityId, { limit: 20 });
|
|
104
91
|
if (linkedFacts.data.length < 2) continue;
|
|
105
92
|
|
|
106
|
-
const newFactSet = new Set(newFactIds);
|
|
107
93
|
const existingFacts = linkedFacts.data.filter(f =>
|
|
108
|
-
!newFactSet.has(f.id) &&
|
|
109
|
-
!f.tags?.includes('scratchpad') // Skip scratchpad blobs
|
|
94
|
+
!newFactSet.has(f.id) && !f.tags?.includes('scratchpad')
|
|
110
95
|
);
|
|
111
96
|
|
|
112
97
|
for (const newFact of newFacts) {
|
|
113
98
|
const newKw = newFactKeywords.get(newFact.id);
|
|
114
|
-
if (!newKw || newKw.size < 2) continue;
|
|
115
|
-
|
|
116
|
-
let linksForThisFact = 0;
|
|
99
|
+
if (!newKw || newKw.size < 2) continue;
|
|
117
100
|
|
|
101
|
+
let count = 0;
|
|
118
102
|
for (const existingFact of existingFacts) {
|
|
119
|
-
if (
|
|
120
|
-
|
|
103
|
+
if (count >= MAX_CANDIDATES_PER_ENTITY) break;
|
|
121
104
|
const existingKw = extractKeywords(existingFact.content);
|
|
122
105
|
const overlap = keywordOverlap(newKw, existingKw);
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
// Boost score for temporal proximity
|
|
128
|
-
const temporalBoost = isTemporallyClose(newFact, existingFact) ? 0.1 : 0;
|
|
129
|
-
const relevanceScore = overlap + temporalBoost;
|
|
130
|
-
|
|
131
|
-
try {
|
|
132
|
-
await storage.createEdge({
|
|
133
|
-
id: crypto.randomUUID(),
|
|
134
|
-
tenantId,
|
|
135
|
-
sourceId: entityId,
|
|
136
|
-
targetId: entityId,
|
|
137
|
-
relation: 'relates_to',
|
|
138
|
-
edgeType: 'associative',
|
|
139
|
-
weight: Math.min(relevanceScore, 1.0),
|
|
140
|
-
factId: newFact.id,
|
|
141
|
-
confidence: overlap,
|
|
142
|
-
metadata: {
|
|
143
|
-
linkedFactId: existingFact.id,
|
|
144
|
-
reason: 'shared_entity_and_content',
|
|
145
|
-
entity: canonicalName,
|
|
146
|
-
keywordOverlap: overlap.toFixed(2),
|
|
147
|
-
},
|
|
148
|
-
});
|
|
149
|
-
edgesCreated++;
|
|
150
|
-
linksForThisFact++;
|
|
151
|
-
} catch {
|
|
152
|
-
// Duplicate or constraint — skip
|
|
106
|
+
if (overlap >= MIN_KEYWORD_OVERLAP) {
|
|
107
|
+
candidates.push({ newFact, existingFact, entityId, entityName: canonicalName, overlap });
|
|
108
|
+
count++;
|
|
153
109
|
}
|
|
154
110
|
}
|
|
155
111
|
}
|
|
112
|
+
} catch { /* continue */ }
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
if (candidates.length === 0) return 0;
|
|
116
|
+
|
|
117
|
+
// Deduplicate by fact pair
|
|
118
|
+
const seen = new Set<string>();
|
|
119
|
+
const uniqueCandidates = candidates.filter(c => {
|
|
120
|
+
const key = `${c.newFact.id}|${c.existingFact.id}`;
|
|
121
|
+
if (seen.has(key)) return false;
|
|
122
|
+
seen.add(key);
|
|
123
|
+
return true;
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
// Step 2: ONE LLM call to classify all relationships
|
|
127
|
+
let classifications: Array<{ index: number; relation: string; direction: 'forward' | 'reverse' }> = [];
|
|
128
|
+
|
|
129
|
+
if (llm && uniqueCandidates.length > 0) {
|
|
130
|
+
try {
|
|
131
|
+
const pairsText = uniqueCandidates.map((c, i) =>
|
|
132
|
+
`[${i}] NEW: "${c.newFact.content.slice(0, 150)}"\n EXISTING: "${c.existingFact.content.slice(0, 150)}"\n SHARED ENTITY: ${c.entityName}`
|
|
133
|
+
).join('\n\n');
|
|
134
|
+
|
|
135
|
+
const response = await llm.complete([
|
|
136
|
+
{
|
|
137
|
+
role: 'system',
|
|
138
|
+
content: `Classify the relationship between each pair of facts. For each pair, output:
|
|
139
|
+
- relation: one of "part_of", "has_child", "extends", "derives", "relates_to"
|
|
140
|
+
- direction: "forward" (NEW → EXISTING) or "reverse" (EXISTING → NEW)
|
|
141
|
+
|
|
142
|
+
Relationship meanings:
|
|
143
|
+
- part_of: the NEW fact is a component/subtask/member of the EXISTING fact (forward: NEW part_of EXISTING)
|
|
144
|
+
- has_child: the NEW fact is a parent/container of the EXISTING fact (forward: NEW has_child EXISTING)
|
|
145
|
+
- extends: the NEW fact adds detail to the EXISTING fact without contradicting it
|
|
146
|
+
- derives: the NEW fact is inferred from or builds upon the EXISTING fact
|
|
147
|
+
- relates_to: loosely related but no clear hierarchy
|
|
148
|
+
|
|
149
|
+
Return ONLY a JSON array: [{"index": 0, "relation": "part_of", "direction": "forward"}, ...]`
|
|
150
|
+
},
|
|
151
|
+
{ role: 'user', content: pairsText }
|
|
152
|
+
], { temperature: 0, responseFormat: 'json' });
|
|
153
|
+
|
|
154
|
+
classifications = JSON.parse(response.content) as typeof classifications;
|
|
156
155
|
} catch {
|
|
157
|
-
//
|
|
156
|
+
// LLM failed — fall back to heuristic relates_to
|
|
157
|
+
classifications = uniqueCandidates.map((_, i) => ({ index: i, relation: 'relates_to', direction: 'forward' as const }));
|
|
158
158
|
}
|
|
159
|
+
} else {
|
|
160
|
+
// No LLM — all relates_to
|
|
161
|
+
classifications = uniqueCandidates.map((_, i) => ({ index: i, relation: 'relates_to', direction: 'forward' as const }));
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Step 3: Create typed edges
|
|
165
|
+
let edgesCreated = 0;
|
|
166
|
+
|
|
167
|
+
for (const cls of classifications) {
|
|
168
|
+
const candidate = uniqueCandidates[cls.index];
|
|
169
|
+
if (!candidate) continue;
|
|
170
|
+
|
|
171
|
+
const validRelations = ['part_of', 'has_child', 'extends', 'derives', 'relates_to'];
|
|
172
|
+
const relation = validRelations.includes(cls.relation) ? cls.relation : 'relates_to';
|
|
173
|
+
|
|
174
|
+
// Map relation to edge type
|
|
175
|
+
const edgeType = relation === 'extends' ? 'extends' as const
|
|
176
|
+
: relation === 'derives' ? 'derives' as const
|
|
177
|
+
: 'associative' as const;
|
|
178
|
+
|
|
179
|
+
// Determine source/target based on direction
|
|
180
|
+
const sourceFactId = cls.direction === 'forward' ? candidate.newFact.id : candidate.existingFact.id;
|
|
181
|
+
const targetFactId = cls.direction === 'forward' ? candidate.existingFact.id : candidate.newFact.id;
|
|
182
|
+
|
|
183
|
+
try {
|
|
184
|
+
await storage.createEdge({
|
|
185
|
+
id: crypto.randomUUID(),
|
|
186
|
+
tenantId,
|
|
187
|
+
sourceId: candidate.entityId,
|
|
188
|
+
targetId: candidate.entityId,
|
|
189
|
+
relation,
|
|
190
|
+
edgeType,
|
|
191
|
+
weight: Math.min(candidate.overlap + 0.2, 1.0),
|
|
192
|
+
factId: sourceFactId,
|
|
193
|
+
confidence: candidate.overlap,
|
|
194
|
+
metadata: {
|
|
195
|
+
sourceFactId,
|
|
196
|
+
targetFactId,
|
|
197
|
+
reason: llm ? 'llm_classified' : 'heuristic_keyword_overlap',
|
|
198
|
+
entity: candidate.entityName,
|
|
199
|
+
keywordOverlap: candidate.overlap.toFixed(2),
|
|
200
|
+
},
|
|
201
|
+
});
|
|
202
|
+
edgesCreated++;
|
|
203
|
+
} catch { /* duplicate or constraint */ }
|
|
159
204
|
}
|
|
160
205
|
|
|
161
206
|
if (edgesCreated > 0) {
|
|
162
|
-
console.error(`[steno] Cross-linked ${edgesCreated}
|
|
207
|
+
console.error(`[steno] Cross-linked ${edgesCreated} facts (${llm ? 'LLM-classified' : 'heuristic'}): ${uniqueCandidates.map(c => c.entityName).filter((v, i, a) => a.indexOf(v) === i).join(', ')}`);
|
|
163
208
|
}
|
|
164
209
|
|
|
165
210
|
return edgesCreated;
|
|
@@ -331,7 +331,7 @@ async function executeExtraction(
|
|
|
331
331
|
// Cross-link new facts to existing related facts via shared entities + keyword overlap
|
|
332
332
|
if (createdFactIds.length > 0) {
|
|
333
333
|
try {
|
|
334
|
-
const crossLinked = await linkRelatedFacts(config.storage, input.tenantId, createdFactIds, entityIdMap);
|
|
334
|
+
const crossLinked = await linkRelatedFacts(config.storage, input.tenantId, createdFactIds, entityIdMap, config.cheapLLM);
|
|
335
335
|
edgesCreated += crossLinked;
|
|
336
336
|
} catch (err) {
|
|
337
337
|
console.error('[steno] Cross-linking failed:', err instanceof Error ? err.message : err);
|
package/src/sessions/index.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { startSession, endSession } from './manager.js';
|
|
1
|
+
export { startSession, endSession, getOrCreateActiveSession } from './manager.js';
|