@steno-ai/engine 0.1.6 → 0.1.8
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 +135 -84
- 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 +153 -90
- 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,CA8JjB"}
|
|
@@ -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,98 +40,157 @@ function keywordOverlap(a, b) {
|
|
|
48
40
|
if (b.has(word))
|
|
49
41
|
shared++;
|
|
50
42
|
}
|
|
51
|
-
|
|
52
|
-
return shared / minSize;
|
|
43
|
+
return shared / Math.min(a.size, b.size);
|
|
53
44
|
}
|
|
54
45
|
/**
|
|
55
|
-
*
|
|
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)
|
|
56
50
|
*/
|
|
57
|
-
function
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
const diffDays = Math.abs(aDate - bDate) / (1000 * 60 * 60 * 24);
|
|
61
|
-
return diffDays <= TEMPORAL_WINDOW_DAYS;
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Link newly created facts to existing related facts through shared entities.
|
|
65
|
-
* Uses keyword overlap + temporal proximity to determine relevance.
|
|
66
|
-
*
|
|
67
|
-
* Only creates edges when facts are genuinely related — not just because
|
|
68
|
-
* they both mention "Steno" or "user".
|
|
69
|
-
*/
|
|
70
|
-
export async function linkRelatedFacts(storage, tenantId, newFactIds, entityIdMap) {
|
|
71
|
-
if (newFactIds.length === 0 || entityIdMap.size === 0)
|
|
51
|
+
export async function linkRelatedFacts(storage, tenantId, newFactIds, entityIdMap, llm) {
|
|
52
|
+
const mapSize = entityIdMap instanceof Map ? entityIdMap.size : Object.keys(entityIdMap).length;
|
|
53
|
+
if (newFactIds.length === 0 || mapSize === 0)
|
|
72
54
|
return 0;
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
55
|
+
// Normalize entityIdMap to array of entries (handle both Map and plain object)
|
|
56
|
+
const entityEntries = entityIdMap instanceof Map
|
|
57
|
+
? Array.from(entityIdMap.entries())
|
|
58
|
+
: Object.entries(entityIdMap);
|
|
59
|
+
let newFacts;
|
|
60
|
+
try {
|
|
61
|
+
newFacts = await storage.getFactsByIds(tenantId, newFactIds);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return 0;
|
|
65
|
+
}
|
|
66
|
+
if (!newFacts || newFacts.length === 0)
|
|
77
67
|
return 0;
|
|
78
68
|
const newFactKeywords = new Map();
|
|
79
69
|
for (const f of newFacts) {
|
|
80
70
|
newFactKeywords.set(f.id, extractKeywords(f.content));
|
|
81
71
|
}
|
|
82
|
-
//
|
|
83
|
-
|
|
72
|
+
// Step 1: Find candidate pairs via heuristic
|
|
73
|
+
const candidates = [];
|
|
74
|
+
const newFactSet = new Set(newFactIds);
|
|
75
|
+
for (const [canonicalName, entityId] of entityEntries) {
|
|
84
76
|
if (GENERIC_ENTITIES.has(canonicalName))
|
|
85
|
-
continue;
|
|
77
|
+
continue;
|
|
86
78
|
try {
|
|
87
79
|
const linkedFacts = await storage.getFactsForEntity(tenantId, entityId, { limit: 20 });
|
|
88
80
|
if (linkedFacts.data.length < 2)
|
|
89
81
|
continue;
|
|
90
|
-
const
|
|
91
|
-
const existingFacts = linkedFacts.data.filter(f => !newFactSet.has(f.id) &&
|
|
92
|
-
!f.tags?.includes('scratchpad') // Skip scratchpad blobs
|
|
93
|
-
);
|
|
82
|
+
const existingFacts = linkedFacts.data.filter(f => !newFactSet.has(f.id) && !f.tags?.includes('scratchpad'));
|
|
94
83
|
for (const newFact of newFacts) {
|
|
95
84
|
const newKw = newFactKeywords.get(newFact.id);
|
|
96
85
|
if (!newKw || newKw.size < 2)
|
|
97
|
-
continue;
|
|
98
|
-
let
|
|
86
|
+
continue;
|
|
87
|
+
let count = 0;
|
|
99
88
|
for (const existingFact of existingFacts) {
|
|
100
|
-
if (
|
|
89
|
+
if (count >= MAX_CANDIDATES_PER_ENTITY)
|
|
101
90
|
break;
|
|
102
91
|
const existingKw = extractKeywords(existingFact.content);
|
|
103
92
|
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
|
|
93
|
+
if (overlap >= MIN_KEYWORD_OVERLAP) {
|
|
94
|
+
candidates.push({ newFact, existingFact, entityId, entityName: canonicalName, overlap });
|
|
95
|
+
count++;
|
|
133
96
|
}
|
|
134
97
|
}
|
|
135
98
|
}
|
|
136
99
|
}
|
|
100
|
+
catch { /* continue */ }
|
|
101
|
+
}
|
|
102
|
+
if (candidates.length === 0)
|
|
103
|
+
return 0;
|
|
104
|
+
// Deduplicate by fact pair
|
|
105
|
+
const seen = new Set();
|
|
106
|
+
const uniqueCandidates = candidates.filter(c => {
|
|
107
|
+
const key = `${c.newFact.id}|${c.existingFact.id}`;
|
|
108
|
+
if (seen.has(key))
|
|
109
|
+
return false;
|
|
110
|
+
seen.add(key);
|
|
111
|
+
return true;
|
|
112
|
+
});
|
|
113
|
+
// Step 2: ONE LLM call to classify all relationships
|
|
114
|
+
let classifications = [];
|
|
115
|
+
if (llm && uniqueCandidates.length > 0) {
|
|
116
|
+
try {
|
|
117
|
+
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');
|
|
118
|
+
const response = await llm.complete([
|
|
119
|
+
{
|
|
120
|
+
role: 'system',
|
|
121
|
+
content: `Classify the relationship between each pair of facts. For each pair, output:
|
|
122
|
+
- relation: one of "part_of", "has_child", "extends", "derives", "relates_to"
|
|
123
|
+
- direction: "forward" (NEW → EXISTING) or "reverse" (EXISTING → NEW)
|
|
124
|
+
|
|
125
|
+
Relationship meanings:
|
|
126
|
+
- part_of: the NEW fact is a component/subtask/member of the EXISTING fact (forward: NEW part_of EXISTING)
|
|
127
|
+
- has_child: the NEW fact is a parent/container of the EXISTING fact (forward: NEW has_child EXISTING)
|
|
128
|
+
- extends: the NEW fact adds detail to the EXISTING fact without contradicting it
|
|
129
|
+
- derives: the NEW fact is inferred from or builds upon the EXISTING fact
|
|
130
|
+
- relates_to: loosely related but no clear hierarchy
|
|
131
|
+
|
|
132
|
+
Return ONLY a JSON array: [{"index": 0, "relation": "part_of", "direction": "forward"}, ...]`
|
|
133
|
+
},
|
|
134
|
+
{ role: 'user', content: pairsText }
|
|
135
|
+
], { temperature: 0, responseFormat: 'json' });
|
|
136
|
+
const parsed = JSON.parse(response.content);
|
|
137
|
+
// LLM might return array directly or wrapped: {"classifications": [...]} or {"results": [...]}
|
|
138
|
+
const arr = Array.isArray(parsed) ? parsed
|
|
139
|
+
: Array.isArray(parsed?.classifications) ? parsed.classifications
|
|
140
|
+
: Array.isArray(parsed?.results) ? parsed.results
|
|
141
|
+
: Array.isArray(parsed?.edges) ? parsed.edges
|
|
142
|
+
: null;
|
|
143
|
+
classifications = arr ?? uniqueCandidates.map((_, i) => ({ index: i, relation: 'relates_to', direction: 'forward' }));
|
|
144
|
+
}
|
|
137
145
|
catch {
|
|
138
|
-
//
|
|
146
|
+
// LLM failed — fall back to heuristic relates_to
|
|
147
|
+
classifications = uniqueCandidates.map((_, i) => ({ index: i, relation: 'relates_to', direction: 'forward' }));
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
// No LLM — all relates_to
|
|
152
|
+
classifications = uniqueCandidates.map((_, i) => ({ index: i, relation: 'relates_to', direction: 'forward' }));
|
|
153
|
+
}
|
|
154
|
+
// Step 3: Create typed edges
|
|
155
|
+
let edgesCreated = 0;
|
|
156
|
+
for (const cls of classifications) {
|
|
157
|
+
const candidate = uniqueCandidates[cls.index];
|
|
158
|
+
if (!candidate)
|
|
159
|
+
continue;
|
|
160
|
+
const validRelations = ['part_of', 'has_child', 'extends', 'derives', 'relates_to'];
|
|
161
|
+
const relation = validRelations.includes(cls.relation) ? cls.relation : 'relates_to';
|
|
162
|
+
// Map relation to edge type
|
|
163
|
+
const edgeType = relation === 'extends' ? 'extends'
|
|
164
|
+
: relation === 'derives' ? 'derives'
|
|
165
|
+
: 'associative';
|
|
166
|
+
// Determine source/target based on direction
|
|
167
|
+
const sourceFactId = cls.direction === 'forward' ? candidate.newFact.id : candidate.existingFact.id;
|
|
168
|
+
const targetFactId = cls.direction === 'forward' ? candidate.existingFact.id : candidate.newFact.id;
|
|
169
|
+
try {
|
|
170
|
+
await storage.createEdge({
|
|
171
|
+
id: crypto.randomUUID(),
|
|
172
|
+
tenantId,
|
|
173
|
+
sourceId: candidate.entityId,
|
|
174
|
+
targetId: candidate.entityId,
|
|
175
|
+
relation,
|
|
176
|
+
edgeType,
|
|
177
|
+
weight: Math.min(candidate.overlap + 0.2, 1.0),
|
|
178
|
+
factId: sourceFactId,
|
|
179
|
+
confidence: candidate.overlap,
|
|
180
|
+
metadata: {
|
|
181
|
+
sourceFactId,
|
|
182
|
+
targetFactId,
|
|
183
|
+
reason: llm ? 'llm_classified' : 'heuristic_keyword_overlap',
|
|
184
|
+
entity: candidate.entityName,
|
|
185
|
+
keywordOverlap: candidate.overlap.toFixed(2),
|
|
186
|
+
},
|
|
187
|
+
});
|
|
188
|
+
edgesCreated++;
|
|
139
189
|
}
|
|
190
|
+
catch { /* duplicate or constraint */ }
|
|
140
191
|
}
|
|
141
192
|
if (edgesCreated > 0) {
|
|
142
|
-
console.error(`[steno] Cross-linked ${edgesCreated}
|
|
193
|
+
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
194
|
}
|
|
144
195
|
return edgesCreated;
|
|
145
196
|
}
|
|
@@ -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,121 +41,188 @@ 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
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
72
|
+
const mapSize = entityIdMap instanceof Map ? entityIdMap.size : Object.keys(entityIdMap).length;
|
|
73
|
+
if (newFactIds.length === 0 || mapSize === 0) return 0;
|
|
74
|
+
|
|
75
|
+
// Normalize entityIdMap to array of entries (handle both Map and plain object)
|
|
76
|
+
const entityEntries: Array<[string, string]> = entityIdMap instanceof Map
|
|
77
|
+
? Array.from(entityIdMap.entries())
|
|
78
|
+
: Object.entries(entityIdMap) as Array<[string, string]>;
|
|
79
|
+
|
|
80
|
+
let newFacts: any[];
|
|
81
|
+
try {
|
|
82
|
+
newFacts = await storage.getFactsByIds(tenantId, newFactIds);
|
|
83
|
+
} catch {
|
|
84
|
+
return 0;
|
|
85
|
+
}
|
|
86
|
+
if (!newFacts || newFacts.length === 0) return 0;
|
|
92
87
|
|
|
93
88
|
const newFactKeywords = new Map<string, Set<string>>();
|
|
94
89
|
for (const f of newFacts) {
|
|
95
90
|
newFactKeywords.set(f.id, extractKeywords(f.content));
|
|
96
91
|
}
|
|
97
92
|
|
|
98
|
-
//
|
|
99
|
-
|
|
100
|
-
|
|
93
|
+
// Step 1: Find candidate pairs via heuristic
|
|
94
|
+
const candidates: CandidatePair[] = [];
|
|
95
|
+
const newFactSet = new Set(newFactIds);
|
|
96
|
+
|
|
97
|
+
for (const [canonicalName, entityId] of entityEntries) {
|
|
98
|
+
if (GENERIC_ENTITIES.has(canonicalName)) continue;
|
|
101
99
|
|
|
102
100
|
try {
|
|
103
101
|
const linkedFacts = await storage.getFactsForEntity(tenantId, entityId, { limit: 20 });
|
|
104
102
|
if (linkedFacts.data.length < 2) continue;
|
|
105
103
|
|
|
106
|
-
const newFactSet = new Set(newFactIds);
|
|
107
104
|
const existingFacts = linkedFacts.data.filter(f =>
|
|
108
|
-
!newFactSet.has(f.id) &&
|
|
109
|
-
!f.tags?.includes('scratchpad') // Skip scratchpad blobs
|
|
105
|
+
!newFactSet.has(f.id) && !f.tags?.includes('scratchpad')
|
|
110
106
|
);
|
|
111
107
|
|
|
112
108
|
for (const newFact of newFacts) {
|
|
113
109
|
const newKw = newFactKeywords.get(newFact.id);
|
|
114
|
-
if (!newKw || newKw.size < 2) continue;
|
|
115
|
-
|
|
116
|
-
let linksForThisFact = 0;
|
|
110
|
+
if (!newKw || newKw.size < 2) continue;
|
|
117
111
|
|
|
112
|
+
let count = 0;
|
|
118
113
|
for (const existingFact of existingFacts) {
|
|
119
|
-
if (
|
|
120
|
-
|
|
114
|
+
if (count >= MAX_CANDIDATES_PER_ENTITY) break;
|
|
121
115
|
const existingKw = extractKeywords(existingFact.content);
|
|
122
116
|
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
|
|
117
|
+
if (overlap >= MIN_KEYWORD_OVERLAP) {
|
|
118
|
+
candidates.push({ newFact, existingFact, entityId, entityName: canonicalName, overlap });
|
|
119
|
+
count++;
|
|
153
120
|
}
|
|
154
121
|
}
|
|
155
122
|
}
|
|
123
|
+
} catch { /* continue */ }
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
if (candidates.length === 0) return 0;
|
|
127
|
+
|
|
128
|
+
// Deduplicate by fact pair
|
|
129
|
+
const seen = new Set<string>();
|
|
130
|
+
const uniqueCandidates = candidates.filter(c => {
|
|
131
|
+
const key = `${c.newFact.id}|${c.existingFact.id}`;
|
|
132
|
+
if (seen.has(key)) return false;
|
|
133
|
+
seen.add(key);
|
|
134
|
+
return true;
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
// Step 2: ONE LLM call to classify all relationships
|
|
138
|
+
let classifications: Array<{ index: number; relation: string; direction: 'forward' | 'reverse' }> = [];
|
|
139
|
+
|
|
140
|
+
if (llm && uniqueCandidates.length > 0) {
|
|
141
|
+
try {
|
|
142
|
+
const pairsText = uniqueCandidates.map((c, i) =>
|
|
143
|
+
`[${i}] NEW: "${c.newFact.content.slice(0, 150)}"\n EXISTING: "${c.existingFact.content.slice(0, 150)}"\n SHARED ENTITY: ${c.entityName}`
|
|
144
|
+
).join('\n\n');
|
|
145
|
+
|
|
146
|
+
const response = await llm.complete([
|
|
147
|
+
{
|
|
148
|
+
role: 'system',
|
|
149
|
+
content: `Classify the relationship between each pair of facts. For each pair, output:
|
|
150
|
+
- relation: one of "part_of", "has_child", "extends", "derives", "relates_to"
|
|
151
|
+
- direction: "forward" (NEW → EXISTING) or "reverse" (EXISTING → NEW)
|
|
152
|
+
|
|
153
|
+
Relationship meanings:
|
|
154
|
+
- part_of: the NEW fact is a component/subtask/member of the EXISTING fact (forward: NEW part_of EXISTING)
|
|
155
|
+
- has_child: the NEW fact is a parent/container of the EXISTING fact (forward: NEW has_child EXISTING)
|
|
156
|
+
- extends: the NEW fact adds detail to the EXISTING fact without contradicting it
|
|
157
|
+
- derives: the NEW fact is inferred from or builds upon the EXISTING fact
|
|
158
|
+
- relates_to: loosely related but no clear hierarchy
|
|
159
|
+
|
|
160
|
+
Return ONLY a JSON array: [{"index": 0, "relation": "part_of", "direction": "forward"}, ...]`
|
|
161
|
+
},
|
|
162
|
+
{ role: 'user', content: pairsText }
|
|
163
|
+
], { temperature: 0, responseFormat: 'json' });
|
|
164
|
+
|
|
165
|
+
const parsed = JSON.parse(response.content);
|
|
166
|
+
// LLM might return array directly or wrapped: {"classifications": [...]} or {"results": [...]}
|
|
167
|
+
const arr = Array.isArray(parsed) ? parsed
|
|
168
|
+
: Array.isArray(parsed?.classifications) ? parsed.classifications
|
|
169
|
+
: Array.isArray(parsed?.results) ? parsed.results
|
|
170
|
+
: Array.isArray(parsed?.edges) ? parsed.edges
|
|
171
|
+
: null;
|
|
172
|
+
classifications = arr ?? uniqueCandidates.map((_, i) => ({ index: i, relation: 'relates_to', direction: 'forward' as const }));
|
|
156
173
|
} catch {
|
|
157
|
-
//
|
|
174
|
+
// LLM failed — fall back to heuristic relates_to
|
|
175
|
+
classifications = uniqueCandidates.map((_, i) => ({ index: i, relation: 'relates_to', direction: 'forward' as const }));
|
|
158
176
|
}
|
|
177
|
+
} else {
|
|
178
|
+
// No LLM — all relates_to
|
|
179
|
+
classifications = uniqueCandidates.map((_, i) => ({ index: i, relation: 'relates_to', direction: 'forward' as const }));
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Step 3: Create typed edges
|
|
183
|
+
let edgesCreated = 0;
|
|
184
|
+
|
|
185
|
+
for (const cls of classifications) {
|
|
186
|
+
const candidate = uniqueCandidates[cls.index];
|
|
187
|
+
if (!candidate) continue;
|
|
188
|
+
|
|
189
|
+
const validRelations = ['part_of', 'has_child', 'extends', 'derives', 'relates_to'];
|
|
190
|
+
const relation = validRelations.includes(cls.relation) ? cls.relation : 'relates_to';
|
|
191
|
+
|
|
192
|
+
// Map relation to edge type
|
|
193
|
+
const edgeType = relation === 'extends' ? 'extends' as const
|
|
194
|
+
: relation === 'derives' ? 'derives' as const
|
|
195
|
+
: 'associative' as const;
|
|
196
|
+
|
|
197
|
+
// Determine source/target based on direction
|
|
198
|
+
const sourceFactId = cls.direction === 'forward' ? candidate.newFact.id : candidate.existingFact.id;
|
|
199
|
+
const targetFactId = cls.direction === 'forward' ? candidate.existingFact.id : candidate.newFact.id;
|
|
200
|
+
|
|
201
|
+
try {
|
|
202
|
+
await storage.createEdge({
|
|
203
|
+
id: crypto.randomUUID(),
|
|
204
|
+
tenantId,
|
|
205
|
+
sourceId: candidate.entityId,
|
|
206
|
+
targetId: candidate.entityId,
|
|
207
|
+
relation,
|
|
208
|
+
edgeType,
|
|
209
|
+
weight: Math.min(candidate.overlap + 0.2, 1.0),
|
|
210
|
+
factId: sourceFactId,
|
|
211
|
+
confidence: candidate.overlap,
|
|
212
|
+
metadata: {
|
|
213
|
+
sourceFactId,
|
|
214
|
+
targetFactId,
|
|
215
|
+
reason: llm ? 'llm_classified' : 'heuristic_keyword_overlap',
|
|
216
|
+
entity: candidate.entityName,
|
|
217
|
+
keywordOverlap: candidate.overlap.toFixed(2),
|
|
218
|
+
},
|
|
219
|
+
});
|
|
220
|
+
edgesCreated++;
|
|
221
|
+
} catch { /* duplicate or constraint */ }
|
|
159
222
|
}
|
|
160
223
|
|
|
161
224
|
if (edgesCreated > 0) {
|
|
162
|
-
console.error(`[steno] Cross-linked ${edgesCreated}
|
|
225
|
+
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
226
|
}
|
|
164
227
|
|
|
165
228
|
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';
|