@steno-ai/engine 0.1.14 → 0.1.16
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/adapters/storage.d.ts +29 -2
- package/dist/adapters/storage.d.ts.map +1 -1
- package/dist/extraction/pipeline.d.ts.map +1 -1
- package/dist/extraction/pipeline.js +165 -0
- package/dist/extraction/pipeline.js.map +1 -1
- package/dist/extraction/types.d.ts +2 -0
- package/dist/extraction/types.d.ts.map +1 -1
- package/dist/identity/index.d.ts +2 -0
- package/dist/identity/index.d.ts.map +1 -0
- package/dist/identity/index.js +2 -0
- package/dist/identity/index.js.map +1 -0
- package/dist/identity/resolver.d.ts +31 -0
- package/dist/identity/resolver.d.ts.map +1 -0
- package/dist/identity/resolver.js +122 -0
- package/dist/identity/resolver.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/models/entity.d.ts +32 -0
- package/dist/models/entity.d.ts.map +1 -1
- package/dist/models/entity.js +11 -0
- package/dist/models/entity.js.map +1 -1
- package/dist/retrieval/graph-traversal.d.ts +4 -1
- package/dist/retrieval/graph-traversal.d.ts.map +1 -1
- package/dist/retrieval/graph-traversal.js +6 -3
- package/dist/retrieval/graph-traversal.js.map +1 -1
- package/dist/retrieval/search.d.ts.map +1 -1
- package/dist/retrieval/search.js +56 -3
- package/dist/retrieval/search.js.map +1 -1
- package/dist/retrieval/types.d.ts +1 -0
- package/dist/retrieval/types.d.ts.map +1 -1
- package/dist/retrieval/types.js.map +1 -1
- package/package.json +1 -1
- package/src/adapters/storage.ts +35 -2
- package/src/extraction/pipeline.ts +213 -0
- package/src/extraction/types.ts +2 -0
- package/src/identity/index.ts +1 -0
- package/src/identity/resolver.ts +149 -0
- package/src/index.ts +1 -0
- package/src/models/entity.ts +13 -0
- package/src/retrieval/graph-traversal.ts +7 -4
- package/src/retrieval/search.ts +58 -3
- package/src/retrieval/types.ts +1 -0
- package/src/adapters/cache.d.ts +0 -9
- package/src/adapters/cache.d.ts.map +0 -1
- package/src/adapters/cache.js +0 -2
- package/src/adapters/cache.js.map +0 -1
- package/src/adapters/embedding.d.ts +0 -7
- package/src/adapters/embedding.d.ts.map +0 -1
- package/src/adapters/embedding.js +0 -2
- package/src/adapters/embedding.js.map +0 -1
- package/src/adapters/llm.d.ts +0 -19
- package/src/adapters/llm.d.ts.map +0 -1
- package/src/adapters/llm.js +0 -2
- package/src/adapters/llm.js.map +0 -1
- package/src/adapters/perplexity-embedding.d.ts +0 -24
- package/src/adapters/perplexity-embedding.d.ts.map +0 -1
- package/src/adapters/perplexity-embedding.js +0 -78
- package/src/adapters/perplexity-embedding.js.map +0 -1
- package/src/adapters/storage.d.ts +0 -173
- package/src/adapters/storage.d.ts.map +0 -1
- package/src/adapters/storage.js +0 -2
- package/src/adapters/storage.js.map +0 -1
- package/src/config.d.ts +0 -296
- package/src/config.d.ts.map +0 -1
- package/src/config.js +0 -92
- package/src/config.js.map +0 -1
- package/src/extraction/contradiction.d.ts +0 -15
- package/src/extraction/contradiction.d.ts.map +0 -1
- package/src/extraction/contradiction.js +0 -23
- package/src/extraction/contradiction.js.map +0 -1
- package/src/extraction/cross-linker.d.ts +0 -23
- package/src/extraction/cross-linker.d.ts.map +0 -1
- package/src/extraction/cross-linker.js +0 -146
- package/src/extraction/cross-linker.js.map +0 -1
- package/src/extraction/dedup.d.ts +0 -12
- package/src/extraction/dedup.d.ts.map +0 -1
- package/src/extraction/dedup.js +0 -93
- package/src/extraction/dedup.js.map +0 -1
- package/src/extraction/entity-extractor.d.ts +0 -30
- package/src/extraction/entity-extractor.d.ts.map +0 -1
- package/src/extraction/entity-extractor.js +0 -145
- package/src/extraction/entity-extractor.js.map +0 -1
- package/src/extraction/hasher.d.ts +0 -5
- package/src/extraction/hasher.d.ts.map +0 -1
- package/src/extraction/hasher.js +0 -8
- package/src/extraction/hasher.js.map +0 -1
- package/src/extraction/heuristic.d.ts +0 -3
- package/src/extraction/heuristic.d.ts.map +0 -1
- package/src/extraction/heuristic.js +0 -282
- package/src/extraction/heuristic.js.map +0 -1
- package/src/extraction/llm-extractor.d.ts +0 -23
- package/src/extraction/llm-extractor.d.ts.map +0 -1
- package/src/extraction/llm-extractor.js +0 -240
- package/src/extraction/llm-extractor.js.map +0 -1
- package/src/extraction/pipeline.d.ts +0 -30
- package/src/extraction/pipeline.d.ts.map +0 -1
- package/src/extraction/pipeline.js +0 -413
- package/src/extraction/pipeline.js.map +0 -1
- package/src/extraction/prompts.d.ts +0 -28
- package/src/extraction/prompts.d.ts.map +0 -1
- package/src/extraction/prompts.js +0 -205
- package/src/extraction/prompts.js.map +0 -1
- package/src/extraction/sliding-window.d.ts +0 -41
- package/src/extraction/sliding-window.d.ts.map +0 -1
- package/src/extraction/sliding-window.js +0 -84
- package/src/extraction/sliding-window.js.map +0 -1
- package/src/extraction/types.d.ts +0 -80
- package/src/extraction/types.d.ts.map +0 -1
- package/src/extraction/types.js +0 -2
- package/src/extraction/types.js.map +0 -1
- package/src/feedback/tracker.d.ts +0 -25
- package/src/feedback/tracker.d.ts.map +0 -1
- package/src/feedback/tracker.js +0 -90
- package/src/feedback/tracker.js.map +0 -1
- package/src/models/api-key.d.ts +0 -54
- package/src/models/api-key.d.ts.map +0 -1
- package/src/models/api-key.js +0 -21
- package/src/models/api-key.js.map +0 -1
- package/src/models/edge.d.ts +0 -78
- package/src/models/edge.d.ts.map +0 -1
- package/src/models/edge.js +0 -29
- package/src/models/edge.js.map +0 -1
- package/src/models/entity.d.ts +0 -60
- package/src/models/entity.d.ts.map +0 -1
- package/src/models/entity.js +0 -22
- package/src/models/entity.js.map +0 -1
- package/src/models/extraction.d.ts +0 -111
- package/src/models/extraction.d.ts.map +0 -1
- package/src/models/extraction.js +0 -40
- package/src/models/extraction.js.map +0 -1
- package/src/models/fact-entity.d.ts +0 -33
- package/src/models/fact-entity.d.ts.map +0 -1
- package/src/models/fact-entity.js +0 -14
- package/src/models/fact-entity.js.map +0 -1
- package/src/models/fact.d.ts +0 -191
- package/src/models/fact.d.ts.map +0 -1
- package/src/models/fact.js +0 -72
- package/src/models/fact.js.map +0 -1
- package/src/models/index.d.ts +0 -13
- package/src/models/index.d.ts.map +0 -1
- package/src/models/index.js +0 -13
- package/src/models/index.js.map +0 -1
- package/src/models/memory-access.d.ts +0 -89
- package/src/models/memory-access.d.ts.map +0 -1
- package/src/models/memory-access.js +0 -33
- package/src/models/memory-access.js.map +0 -1
- package/src/models/session.d.ts +0 -60
- package/src/models/session.d.ts.map +0 -1
- package/src/models/session.js +0 -23
- package/src/models/session.js.map +0 -1
- package/src/models/tenant.d.ts +0 -448
- package/src/models/tenant.d.ts.map +0 -1
- package/src/models/tenant.js +0 -23
- package/src/models/tenant.js.map +0 -1
- package/src/models/trigger.d.ts +0 -87
- package/src/models/trigger.d.ts.map +0 -1
- package/src/models/trigger.js +0 -41
- package/src/models/trigger.js.map +0 -1
- package/src/models/usage-record.d.ts +0 -37
- package/src/models/usage-record.d.ts.map +0 -1
- package/src/models/usage-record.js +0 -14
- package/src/models/usage-record.js.map +0 -1
- package/src/models/webhook.d.ts +0 -50
- package/src/models/webhook.d.ts.map +0 -1
- package/src/models/webhook.js +0 -25
- package/src/models/webhook.js.map +0 -1
- package/src/retrieval/compound-search.d.ts +0 -13
- package/src/retrieval/compound-search.d.ts.map +0 -1
- package/src/retrieval/compound-search.js +0 -87
- package/src/retrieval/compound-search.js.map +0 -1
- package/src/retrieval/contradiction-surfacer.d.ts +0 -18
- package/src/retrieval/contradiction-surfacer.d.ts.map +0 -1
- package/src/retrieval/contradiction-surfacer.js +0 -64
- package/src/retrieval/contradiction-surfacer.js.map +0 -1
- package/src/retrieval/embedding-cache.d.ts +0 -17
- package/src/retrieval/embedding-cache.d.ts.map +0 -1
- package/src/retrieval/embedding-cache.js +0 -56
- package/src/retrieval/embedding-cache.js.map +0 -1
- package/src/retrieval/fusion.d.ts +0 -27
- package/src/retrieval/fusion.d.ts.map +0 -1
- package/src/retrieval/fusion.js +0 -87
- package/src/retrieval/fusion.js.map +0 -1
- package/src/retrieval/graph-traversal.d.ts +0 -29
- package/src/retrieval/graph-traversal.d.ts.map +0 -1
- package/src/retrieval/graph-traversal.js +0 -208
- package/src/retrieval/graph-traversal.js.map +0 -1
- package/src/retrieval/query-expansion.d.ts +0 -20
- package/src/retrieval/query-expansion.d.ts.map +0 -1
- package/src/retrieval/query-expansion.js +0 -76
- package/src/retrieval/query-expansion.js.map +0 -1
- package/src/retrieval/reranker.d.ts +0 -15
- package/src/retrieval/reranker.d.ts.map +0 -1
- package/src/retrieval/reranker.js +0 -47
- package/src/retrieval/reranker.js.map +0 -1
- package/src/retrieval/salience-scorer.d.ts +0 -15
- package/src/retrieval/salience-scorer.d.ts.map +0 -1
- package/src/retrieval/salience-scorer.js +0 -41
- package/src/retrieval/salience-scorer.js.map +0 -1
- package/src/retrieval/search.d.ts +0 -21
- package/src/retrieval/search.d.ts.map +0 -1
- package/src/retrieval/search.js +0 -228
- package/src/retrieval/search.js.map +0 -1
- package/src/retrieval/temporal-scorer.d.ts +0 -18
- package/src/retrieval/temporal-scorer.d.ts.map +0 -1
- package/src/retrieval/temporal-scorer.js +0 -106
- package/src/retrieval/temporal-scorer.js.map +0 -1
- package/src/retrieval/trigger-matcher.d.ts +0 -18
- package/src/retrieval/trigger-matcher.d.ts.map +0 -1
- package/src/retrieval/trigger-matcher.js +0 -134
- package/src/retrieval/trigger-matcher.js.map +0 -1
- package/src/retrieval/types.d.ts +0 -70
- package/src/retrieval/types.d.ts.map +0 -1
- package/src/retrieval/types.js +0 -9
- package/src/retrieval/types.js.map +0 -1
- package/src/retrieval/vector-search.d.ts +0 -5
- package/src/retrieval/vector-search.d.ts.map +0 -1
- package/src/retrieval/vector-search.js +0 -24
- package/src/retrieval/vector-search.js.map +0 -1
- package/src/salience/decay.d.ts +0 -9
- package/src/salience/decay.d.ts.map +0 -1
- package/src/salience/decay.js +0 -15
- package/src/salience/decay.js.map +0 -1
- package/src/scratchpad/scratchpad.d.ts +0 -23
- package/src/scratchpad/scratchpad.d.ts.map +0 -1
- package/src/scratchpad/scratchpad.js +0 -137
- package/src/scratchpad/scratchpad.js.map +0 -1
- package/src/sessions/manager.d.ts +0 -11
- package/src/sessions/manager.d.ts.map +0 -1
- package/src/sessions/manager.js +0 -63
- package/src/sessions/manager.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cross-linker.js","sourceRoot":"","sources":["cross-linker.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { EmbeddingAdapter } from '../adapters/embedding.js';
|
|
2
|
-
import type { LLMAdapter } from '../adapters/llm.js';
|
|
3
|
-
import type { StorageAdapter } from '../adapters/storage.js';
|
|
4
|
-
import type { ExtractedFact } from './types.js';
|
|
5
|
-
export interface DedupConfig {
|
|
6
|
-
storage: StorageAdapter;
|
|
7
|
-
embedding: EmbeddingAdapter;
|
|
8
|
-
llm: LLMAdapter;
|
|
9
|
-
similarityThreshold?: number;
|
|
10
|
-
}
|
|
11
|
-
export declare function deduplicateFacts(config: DedupConfig, facts: ExtractedFact[], tenantId: string, scope: string, scopeId: string): Promise<ExtractedFact[]>;
|
|
12
|
-
//# sourceMappingURL=dedup.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dedup.d.ts","sourceRoot":"","sources":["dedup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,oBAAoB,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,cAAc,CAAC;IACxB,SAAS,EAAE,gBAAgB,CAAC;IAC5B,GAAG,EAAE,UAAU,CAAC;IAChB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,aAAa,EAAE,EACtB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,aAAa,EAAE,CAAC,CA+C1B"}
|
package/src/extraction/dedup.js
DELETED
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
export async function deduplicateFacts(config, facts, tenantId, scope, scopeId) {
|
|
2
|
-
const threshold = config.similarityThreshold ?? 0.55;
|
|
3
|
-
const result = [];
|
|
4
|
-
for (const fact of facts) {
|
|
5
|
-
// If LLM already decided and it's not 'add', trust it
|
|
6
|
-
if (fact.operation && fact.operation !== 'add') {
|
|
7
|
-
result.push(fact);
|
|
8
|
-
continue;
|
|
9
|
-
}
|
|
10
|
-
// Embed the fact
|
|
11
|
-
const embedding = await config.embedding.embed(fact.content);
|
|
12
|
-
// Search for similar existing facts
|
|
13
|
-
const matches = await config.storage.vectorSearch({
|
|
14
|
-
embedding,
|
|
15
|
-
tenantId,
|
|
16
|
-
scope,
|
|
17
|
-
scopeId,
|
|
18
|
-
limit: 5,
|
|
19
|
-
minSimilarity: threshold,
|
|
20
|
-
validOnly: true,
|
|
21
|
-
});
|
|
22
|
-
if (matches.length === 0) {
|
|
23
|
-
// No similar facts — this is new
|
|
24
|
-
result.push({ ...fact, operation: 'add' });
|
|
25
|
-
continue;
|
|
26
|
-
}
|
|
27
|
-
// Similar facts found — ask LLM to classify
|
|
28
|
-
const decision = await classifyWithLLM(config.llm, fact.content, matches.map(m => ({
|
|
29
|
-
id: m.fact.id,
|
|
30
|
-
lineageId: m.fact.lineageId ?? '',
|
|
31
|
-
content: m.fact.content,
|
|
32
|
-
similarity: m.similarity,
|
|
33
|
-
})));
|
|
34
|
-
result.push({ ...fact, ...decision });
|
|
35
|
-
}
|
|
36
|
-
return result;
|
|
37
|
-
}
|
|
38
|
-
async function classifyWithLLM(llm, candidateContent, existingMatches) {
|
|
39
|
-
const messages = [
|
|
40
|
-
{
|
|
41
|
-
role: 'system',
|
|
42
|
-
content: `You are a memory deduplication classifier. Compare a NEW fact against EXISTING facts.
|
|
43
|
-
|
|
44
|
-
RULES:
|
|
45
|
-
- "noop" if the new fact says the SAME thing as an existing fact (even with different wording). Be AGGRESSIVE about noop — "User's name is Caroline" and "User is called Caroline" are NOOP.
|
|
46
|
-
- "update" if the new fact adds detail or changes a value ("User likes cats" → "User loves cats and has 3")
|
|
47
|
-
- "contradict" if the new fact directly conflicts ("User likes cats" vs "User hates cats")
|
|
48
|
-
- "add" ONLY if genuinely new information not covered by ANY existing fact
|
|
49
|
-
|
|
50
|
-
Return JSON:
|
|
51
|
-
{"operation": "add|update|noop|contradict", "existing_lineage_id": "...", "contradicts_fact_id": "..."}
|
|
52
|
-
|
|
53
|
-
Return ONLY valid JSON.`,
|
|
54
|
-
},
|
|
55
|
-
{
|
|
56
|
-
role: 'user',
|
|
57
|
-
content: `NEW FACT: "${candidateContent}"
|
|
58
|
-
|
|
59
|
-
EXISTING FACTS:
|
|
60
|
-
${existingMatches.map(m => `[id: ${m.id}, lineage_id: ${m.lineageId}, similarity: ${m.similarity.toFixed(3)}] ${m.content}`).join('\n')}
|
|
61
|
-
|
|
62
|
-
Classify the new fact.`,
|
|
63
|
-
},
|
|
64
|
-
];
|
|
65
|
-
try {
|
|
66
|
-
const response = await llm.complete(messages, { temperature: 0, responseFormat: 'json' });
|
|
67
|
-
const parsed = JSON.parse(response.content);
|
|
68
|
-
const operation = isValidDedupOp(parsed.operation) ? parsed.operation : 'add';
|
|
69
|
-
// Map dedup operations to relational versioning types
|
|
70
|
-
const relationType = operation === 'update' ? 'updates'
|
|
71
|
-
: operation === 'contradict' ? 'updates'
|
|
72
|
-
: undefined;
|
|
73
|
-
// Find the best matching existing fact for the relation
|
|
74
|
-
const relatedFactId = (operation === 'update' || operation === 'contradict') && existingMatches.length > 0
|
|
75
|
-
? existingMatches[0].id
|
|
76
|
-
: undefined;
|
|
77
|
-
return {
|
|
78
|
-
operation,
|
|
79
|
-
existingLineageId: typeof parsed.existing_lineage_id === 'string' ? parsed.existing_lineage_id : undefined,
|
|
80
|
-
contradictsFactId: typeof parsed.contradicts_fact_id === 'string' ? parsed.contradicts_fact_id : undefined,
|
|
81
|
-
relationType,
|
|
82
|
-
relatedFactId,
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
catch {
|
|
86
|
-
// If LLM fails, default to 'add' (safe — might create a duplicate, but won't lose data)
|
|
87
|
-
return { operation: 'add' };
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
function isValidDedupOp(op) {
|
|
91
|
-
return typeof op === 'string' && ['add', 'update', 'noop', 'contradict', 'invalidate'].includes(op);
|
|
92
|
-
}
|
|
93
|
-
//# sourceMappingURL=dedup.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dedup.js","sourceRoot":"","sources":["dedup.ts"],"names":[],"mappings":"AAYA,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAmB,EACnB,KAAsB,EACtB,QAAgB,EAChB,KAAa,EACb,OAAe;IAEf,MAAM,SAAS,GAAG,MAAM,CAAC,mBAAmB,IAAI,IAAI,CAAC;IACrD,MAAM,MAAM,GAAoB,EAAE,CAAC;IAEnC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,sDAAsD;QACtD,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;YAC/C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,SAAS;QACX,CAAC;QAED,iBAAiB;QACjB,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE7D,oCAAoC;QACpC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC;YAChD,SAAS;YACT,QAAQ;YACR,KAAK;YACL,OAAO;YACP,KAAK,EAAE,CAAC;YACR,aAAa,EAAE,SAAS;YACxB,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,iCAAiC;YACjC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;YAC3C,SAAS;QACX,CAAC;QAED,4CAA4C;QAC5C,MAAM,QAAQ,GAAG,MAAM,eAAe,CACpC,MAAM,CAAC,GAAG,EACV,IAAI,CAAC,OAAO,EACZ,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAChB,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE;YACb,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE;YACjC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO;YACvB,UAAU,EAAE,CAAC,CAAC,UAAU;SACzB,CAAC,CAAC,CACJ,CAAC;QAEF,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,GAAe,EACf,gBAAwB,EACxB,eAA8F;IAE9F,MAAM,QAAQ,GAAiB;QAC7B;YACE,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE;;;;;;;;;;;wBAWS;SACnB;QACD;YACE,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,cAAc,gBAAgB;;;EAG3C,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC,SAAS,iBAAiB,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;;uBAEhH;SAClB;KACF,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC;QAC1F,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAA4B,CAAC;QAEvE,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;QAE9E,sDAAsD;QACtD,MAAM,YAAY,GAAG,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAkB;YAC9D,CAAC,CAAC,SAAS,KAAK,YAAY,CAAC,CAAC,CAAC,SAAkB;gBACjD,CAAC,CAAC,SAAS,CAAC;QAEd,wDAAwD;QACxD,MAAM,aAAa,GAAG,CAAC,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,YAAY,CAAC,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC;YACxG,CAAC,CAAC,eAAe,CAAC,CAAC,CAAE,CAAC,EAAE;YACxB,CAAC,CAAC,SAAS,CAAC;QAEd,OAAO;YACL,SAAS;YACT,iBAAiB,EACf,OAAO,MAAM,CAAC,mBAAmB,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC,SAAS;YACzF,iBAAiB,EACf,OAAO,MAAM,CAAC,mBAAmB,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC,SAAS;YACzF,YAAY;YACZ,aAAa;SACd,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,wFAAwF;QACxF,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,EAAW;IACjC,OAAO,OAAO,EAAE,KAAK,QAAQ,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AACtG,CAAC"}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import type { StorageAdapter } from '../adapters/storage.js';
|
|
2
|
-
import type { EmbeddingAdapter } from '../adapters/embedding.js';
|
|
3
|
-
import type { ExtractedEntity, ExtractedEdge } from './types.js';
|
|
4
|
-
export interface EntityPersistenceResult {
|
|
5
|
-
entitiesCreated: number;
|
|
6
|
-
edgesCreated: number;
|
|
7
|
-
entityIdMap: Map<string, string>;
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* Create or find all entities in the database.
|
|
11
|
-
* Does NOT link entities to any fact or create edges.
|
|
12
|
-
* Returns a map of canonicalName → entity.id for use in subsequent operations.
|
|
13
|
-
*/
|
|
14
|
-
export declare function buildEntityIdMap(storage: StorageAdapter, embedding: EmbeddingAdapter, tenantId: string, entities: ExtractedEntity[]): Promise<{
|
|
15
|
-
entityIdMap: Map<string, string>;
|
|
16
|
-
entitiesCreated: number;
|
|
17
|
-
}>;
|
|
18
|
-
export declare function persistEdges(storage: StorageAdapter, tenantId: string, factId: string, edges: ExtractedEdge[], entityIdMap: Map<string, string>): Promise<number>;
|
|
19
|
-
/**
|
|
20
|
-
* Persist extracted entities and edges to the database.
|
|
21
|
-
* - Creates new entities if canonical name doesn't exist for this tenant
|
|
22
|
-
* - Reuses existing entities if canonical name matches
|
|
23
|
-
* - Links all entities to the fact via fact_entities junction
|
|
24
|
-
* - Creates edges between entities
|
|
25
|
-
*
|
|
26
|
-
* @deprecated Use buildEntityIdMap + persistEdges directly for better control.
|
|
27
|
-
* This function is kept for backward compatibility.
|
|
28
|
-
*/
|
|
29
|
-
export declare function persistEntitiesAndEdges(storage: StorageAdapter, embedding: EmbeddingAdapter, tenantId: string, factId: string, entities: ExtractedEntity[], edges: ExtractedEdge[]): Promise<EntityPersistenceResult>;
|
|
30
|
-
//# sourceMappingURL=entity-extractor.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"entity-extractor.d.ts","sourceRoot":"","sources":["entity-extractor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEjE,MAAM,WAAW,uBAAuB;IACtC,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,gBAAgB,EAC3B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,eAAe,EAAE,GAC1B,OAAO,CAAC;IAAE,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,CAAC,CAuCxE;AA8CD,wBAAsB,YAAY,CAChC,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,aAAa,EAAE,EACtB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAAC,MAAM,CAAC,CA6CjB;AAED;;;;;;;;;GASG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,gBAAgB,EAC3B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,eAAe,EAAE,EAC3B,KAAK,EAAE,aAAa,EAAE,GACrB,OAAO,CAAC,uBAAuB,CAAC,CAiBlC"}
|
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Create or find all entities in the database.
|
|
3
|
-
* Does NOT link entities to any fact or create edges.
|
|
4
|
-
* Returns a map of canonicalName → entity.id for use in subsequent operations.
|
|
5
|
-
*/
|
|
6
|
-
export async function buildEntityIdMap(storage, embedding, tenantId, entities) {
|
|
7
|
-
const entityIdMap = new Map();
|
|
8
|
-
let entitiesCreated = 0;
|
|
9
|
-
// Deduplicate entities by canonical name within this batch
|
|
10
|
-
const uniqueEntities = new Map();
|
|
11
|
-
for (const entity of entities) {
|
|
12
|
-
if (!uniqueEntities.has(entity.canonicalName)) {
|
|
13
|
-
uniqueEntities.set(entity.canonicalName, entity);
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
// Create or find each entity
|
|
17
|
-
for (const entity of uniqueEntities.values()) {
|
|
18
|
-
const existing = await storage.findEntityByCanonicalName(tenantId, entity.canonicalName, entity.entityType);
|
|
19
|
-
if (existing) {
|
|
20
|
-
entityIdMap.set(entity.canonicalName, existing.id);
|
|
21
|
-
}
|
|
22
|
-
else {
|
|
23
|
-
const id = crypto.randomUUID();
|
|
24
|
-
const emb = await embedding.embed(entity.name);
|
|
25
|
-
await storage.createEntity({
|
|
26
|
-
...entity,
|
|
27
|
-
id,
|
|
28
|
-
tenantId,
|
|
29
|
-
embedding: emb,
|
|
30
|
-
embeddingModel: embedding.model,
|
|
31
|
-
embeddingDim: embedding.dimensions,
|
|
32
|
-
});
|
|
33
|
-
entityIdMap.set(entity.canonicalName, id);
|
|
34
|
-
entitiesCreated++;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
return { entityIdMap, entitiesCreated };
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Create edges between already-persisted entities.
|
|
41
|
-
* Uses the entityIdMap built by buildEntityIdMap.
|
|
42
|
-
*/
|
|
43
|
-
// Normalize relation names so "loves_deeply" and "loves" merge
|
|
44
|
-
const RELATION_SYNONYMS = {
|
|
45
|
-
loves_deeply: 'loves',
|
|
46
|
-
has_relationship: 'partner_of',
|
|
47
|
-
has_relationship_with: 'partner_of',
|
|
48
|
-
dating: 'partner_of',
|
|
49
|
-
in_relationship_with: 'partner_of',
|
|
50
|
-
romantic_partner: 'partner_of',
|
|
51
|
-
girlfriend_of: 'partner_of',
|
|
52
|
-
boyfriend_of: 'partner_of',
|
|
53
|
-
married_to: 'partner_of',
|
|
54
|
-
works_for: 'works_at',
|
|
55
|
-
employed_at: 'works_at',
|
|
56
|
-
employed_by: 'works_at',
|
|
57
|
-
resides_in: 'lives_in',
|
|
58
|
-
located_at: 'located_in',
|
|
59
|
-
friends_with: 'friend_of',
|
|
60
|
-
acquainted_with: 'knows',
|
|
61
|
-
knows_about: 'knows',
|
|
62
|
-
interested_in: 'prefers',
|
|
63
|
-
attracted_to: 'prefers',
|
|
64
|
-
likes: 'prefers',
|
|
65
|
-
replaces: 'updates',
|
|
66
|
-
supersedes: 'updates',
|
|
67
|
-
overrides: 'updates',
|
|
68
|
-
corrects: 'updates',
|
|
69
|
-
supplements: 'extends',
|
|
70
|
-
refines: 'extends',
|
|
71
|
-
elaborates: 'extends',
|
|
72
|
-
details: 'extends',
|
|
73
|
-
infers: 'derives',
|
|
74
|
-
implies: 'derives',
|
|
75
|
-
combines: 'derives',
|
|
76
|
-
};
|
|
77
|
-
function normalizeRelation(relation) {
|
|
78
|
-
const lower = relation.toLowerCase().trim();
|
|
79
|
-
return RELATION_SYNONYMS[lower] ?? lower;
|
|
80
|
-
}
|
|
81
|
-
export async function persistEdges(storage, tenantId, factId, edges, entityIdMap) {
|
|
82
|
-
// Deduplicate edges by (source, target, normalized_relation) within this batch
|
|
83
|
-
const seen = new Set();
|
|
84
|
-
const dedupedEdges = [];
|
|
85
|
-
for (const edge of edges) {
|
|
86
|
-
const normalizedRelation = normalizeRelation(edge.relation);
|
|
87
|
-
const key = `${edge.sourceName}|${normalizedRelation}|${edge.targetName}`;
|
|
88
|
-
if (!seen.has(key)) {
|
|
89
|
-
seen.add(key);
|
|
90
|
-
dedupedEdges.push({ ...edge, relation: normalizedRelation });
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
let edgesCreated = 0;
|
|
94
|
-
for (const edge of dedupedEdges) {
|
|
95
|
-
const sourceId = entityIdMap.get(edge.sourceName);
|
|
96
|
-
const targetId = entityIdMap.get(edge.targetName);
|
|
97
|
-
if (sourceId && targetId) {
|
|
98
|
-
try {
|
|
99
|
-
await storage.createEdge({
|
|
100
|
-
tenantId,
|
|
101
|
-
sourceId,
|
|
102
|
-
targetId,
|
|
103
|
-
relation: edge.relation,
|
|
104
|
-
edgeType: edge.edgeType,
|
|
105
|
-
confidence: edge.confidence,
|
|
106
|
-
weight: 1.0,
|
|
107
|
-
metadata: {},
|
|
108
|
-
factId,
|
|
109
|
-
id: crypto.randomUUID(),
|
|
110
|
-
});
|
|
111
|
-
edgesCreated++;
|
|
112
|
-
}
|
|
113
|
-
catch {
|
|
114
|
-
// Edge creation failed (e.g., duplicate) — continue
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
if (!sourceId || !targetId) {
|
|
118
|
-
console.warn(`[steno] Edge dropped: "${edge.sourceName}" → "${edge.relation}" → "${edge.targetName}" ` +
|
|
119
|
-
`(source=${sourceId ? 'found' : 'MISSING'}, target=${targetId ? 'found' : 'MISSING'}) ` +
|
|
120
|
-
`entityMap keys: [${[...entityIdMap.keys()].join(', ')}]`);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
return edgesCreated;
|
|
124
|
-
}
|
|
125
|
-
/**
|
|
126
|
-
* Persist extracted entities and edges to the database.
|
|
127
|
-
* - Creates new entities if canonical name doesn't exist for this tenant
|
|
128
|
-
* - Reuses existing entities if canonical name matches
|
|
129
|
-
* - Links all entities to the fact via fact_entities junction
|
|
130
|
-
* - Creates edges between entities
|
|
131
|
-
*
|
|
132
|
-
* @deprecated Use buildEntityIdMap + persistEdges directly for better control.
|
|
133
|
-
* This function is kept for backward compatibility.
|
|
134
|
-
*/
|
|
135
|
-
export async function persistEntitiesAndEdges(storage, embedding, tenantId, factId, entities, edges) {
|
|
136
|
-
const { entityIdMap, entitiesCreated } = await buildEntityIdMap(storage, embedding, tenantId, entities);
|
|
137
|
-
// Link all entities to this fact
|
|
138
|
-
for (const [canonicalName, entityId] of entityIdMap) {
|
|
139
|
-
void canonicalName; // used as key only
|
|
140
|
-
await storage.linkFactEntity(factId, entityId, 'mentioned');
|
|
141
|
-
}
|
|
142
|
-
const edgesCreated = await persistEdges(storage, tenantId, factId, edges, entityIdMap);
|
|
143
|
-
return { entitiesCreated, edgesCreated, entityIdMap };
|
|
144
|
-
}
|
|
145
|
-
//# sourceMappingURL=entity-extractor.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"entity-extractor.js","sourceRoot":"","sources":["entity-extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hasher.d.ts","sourceRoot":"","sources":["hasher.ts"],"names":[],"mappings":"AAAA,wBAAsB,SAAS,CAAC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAMvF"}
|
package/src/extraction/hasher.js
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
export async function hashInput(input) {
|
|
2
|
-
const payload = JSON.stringify({ type: input.type, data: input.data });
|
|
3
|
-
const encoded = new TextEncoder().encode(payload);
|
|
4
|
-
const hashBuffer = await crypto.subtle.digest('SHA-256', encoded);
|
|
5
|
-
const hashArray = Array.from(new Uint8Array(hashBuffer));
|
|
6
|
-
return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
|
|
7
|
-
}
|
|
8
|
-
//# sourceMappingURL=hasher.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hasher.js","sourceRoot":"","sources":["hasher.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAsC;IACpE,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAClE,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;IACzD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACtE,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"heuristic.d.ts","sourceRoot":"","sources":["heuristic.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAkC,MAAM,YAAY,CAAC;AA8SnF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAqC/D"}
|
|
@@ -1,282 +0,0 @@
|
|
|
1
|
-
import nlp from 'compromise';
|
|
2
|
-
// ---------------------------------------------------------------------------
|
|
3
|
-
// Regex patterns
|
|
4
|
-
// ---------------------------------------------------------------------------
|
|
5
|
-
const REGEX = {
|
|
6
|
-
email: /\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,
|
|
7
|
-
phone: /(?:\+?1[\s\-.]?)?\(?\d{3}\)?[\s\-.]?\d{3}[\s\-.]?\d{4}\b/g,
|
|
8
|
-
url: /https?:\/\/[^\s/$.?#].[^\s]*/g,
|
|
9
|
-
date: /\b(?:\d{1,2}[\/\-]\d{1,2}[\/\-]\d{2,4}|\d{4}[\/\-]\d{2}[\/\-]\d{2}|(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\s+\d{1,2}(?:st|nd|rd|th)?,?\s+\d{4}|\d{1,2}(?:st|nd|rd|th)?\s+(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May|Jun(?:e)?|Jul(?:y)?|Aug(?:ust)?|Sep(?:tember)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?)\s+\d{4})\b/gi,
|
|
10
|
-
money: /\$\s?\d+(?:[.,]\d+)*(?:\.\d{2})?|\b\d+(?:[.,]\d+)*(?:\.\d{2})?\s?(?:dollars?|USD|EUR|GBP|euros?|pounds?)\b/gi,
|
|
11
|
-
};
|
|
12
|
-
const PATTERN_RULES = [
|
|
13
|
-
// Health / allergy — importance 0.95
|
|
14
|
-
{
|
|
15
|
-
pattern: /\bi(?:'m| am)\s+allergic\s+to\s+(.+?)(?:[.!?]|$)/i,
|
|
16
|
-
template: (m) => `User is allergic to ${m[1].trim()}`,
|
|
17
|
-
importance: 0.95,
|
|
18
|
-
tags: ['health', 'allergy'],
|
|
19
|
-
},
|
|
20
|
-
{
|
|
21
|
-
pattern: /\bi\s+have\s+(?:a\s+)?(?:allergy|allergies)\s+to\s+(.+?)(?:[.!?]|$)/i,
|
|
22
|
-
template: (m) => `User is allergic to ${m[1].trim()}`,
|
|
23
|
-
importance: 0.95,
|
|
24
|
-
tags: ['health', 'allergy'],
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
pattern: /\bi\s+(?:have|suffer from|was diagnosed with)\s+(.+?)(?:[.!?]|$)/i,
|
|
28
|
-
template: (m) => `User has ${m[1].trim()}`,
|
|
29
|
-
importance: 0.95,
|
|
30
|
-
tags: ['health'],
|
|
31
|
-
},
|
|
32
|
-
// Name — importance 0.9
|
|
33
|
-
{
|
|
34
|
-
pattern: /\bmy\s+name\s+is\s+([A-Za-z][a-zA-Z\s\-']{1,40}?)(?:[.!?,]|$)/i,
|
|
35
|
-
template: (m) => `User's name is ${m[1].trim()}`,
|
|
36
|
-
importance: 0.9,
|
|
37
|
-
tags: ['identity', 'name'],
|
|
38
|
-
},
|
|
39
|
-
{
|
|
40
|
-
pattern: /\bthey\s+call\s+me\s+([A-Za-z][a-zA-Z\s\-']{1,40}?)(?:[.!?,]|$)/i,
|
|
41
|
-
template: (m) => `User's name is ${m[1].trim()}`,
|
|
42
|
-
importance: 0.9,
|
|
43
|
-
tags: ['identity', 'name'],
|
|
44
|
-
},
|
|
45
|
-
// Identity — importance 0.85
|
|
46
|
-
{
|
|
47
|
-
pattern: /\bi(?:'m| am)\s+a(?:n)?\s+(.+?)(?:[.!?]|$)/i,
|
|
48
|
-
template: (m) => `User is a ${m[1].trim()}`,
|
|
49
|
-
importance: 0.85,
|
|
50
|
-
tags: ['identity'],
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
pattern: /\bi(?:'m| am)\s+([A-Z][a-z]+(?:\s+[A-Z][a-z]+)*)(?:[.!?,]|$)/,
|
|
54
|
-
template: (m) => `User is ${m[1].trim()}`,
|
|
55
|
-
importance: 0.85,
|
|
56
|
-
tags: ['identity'],
|
|
57
|
-
},
|
|
58
|
-
// Work / company — importance 0.8
|
|
59
|
-
{
|
|
60
|
-
pattern: /\bi\s+work\s+(?:at|for)\s+(.+?)(?:[.!?]|$)/i,
|
|
61
|
-
template: (m) => `User works at ${m[1].trim()}`,
|
|
62
|
-
importance: 0.8,
|
|
63
|
-
tags: ['work', 'company'],
|
|
64
|
-
},
|
|
65
|
-
{
|
|
66
|
-
pattern: /\bmy\s+(?:job|career|profession|occupation)\s+is\s+(.+?)(?:[.!?]|$)/i,
|
|
67
|
-
template: (m) => `User's job is ${m[1].trim()}`,
|
|
68
|
-
importance: 0.8,
|
|
69
|
-
tags: ['work'],
|
|
70
|
-
},
|
|
71
|
-
{
|
|
72
|
-
pattern: /\bi\s+(?:work|am employed)\s+as\s+(?:a(?:n)?\s+)?(.+?)(?:[.!?]|$)/i,
|
|
73
|
-
template: (m) => `User works as ${m[1].trim()}`,
|
|
74
|
-
importance: 0.8,
|
|
75
|
-
tags: ['work'],
|
|
76
|
-
},
|
|
77
|
-
// Location — importance 0.7
|
|
78
|
-
{
|
|
79
|
-
pattern: /\bi\s+live\s+in\s+(.+?)(?:[.!?]|$)/i,
|
|
80
|
-
template: (m) => `User lives in ${m[1].trim()}`,
|
|
81
|
-
importance: 0.7,
|
|
82
|
-
tags: ['location'],
|
|
83
|
-
},
|
|
84
|
-
{
|
|
85
|
-
pattern: /\bi(?:'m| am)\s+from\s+(.+?)(?:[.!?]|$)/i,
|
|
86
|
-
template: (m) => `User is from ${m[1].trim()}`,
|
|
87
|
-
importance: 0.7,
|
|
88
|
-
tags: ['location'],
|
|
89
|
-
},
|
|
90
|
-
{
|
|
91
|
-
pattern: /\bi\s+(?:moved|relocated)\s+to\s+(.+?)(?:[.!?]|$)/i,
|
|
92
|
-
template: (m) => `User moved to ${m[1].trim()}`,
|
|
93
|
-
importance: 0.7,
|
|
94
|
-
tags: ['location'],
|
|
95
|
-
},
|
|
96
|
-
// Preferences (like/love/enjoy) — importance 0.6
|
|
97
|
-
{
|
|
98
|
-
pattern: /\bi\s+(?:really\s+)?(?:like|love|enjoy|adore)\s+(.+?)(?:[.!?]|$)/i,
|
|
99
|
-
template: (m) => `User likes ${m[1].trim()}`,
|
|
100
|
-
importance: 0.6,
|
|
101
|
-
tags: ['preference', 'like'],
|
|
102
|
-
},
|
|
103
|
-
{
|
|
104
|
-
pattern: /\bmy\s+favorite\s+(?:\w+\s+)?is\s+(.+?)(?:[.!?]|$)/i,
|
|
105
|
-
template: (m) => `User's favorite is ${m[1].trim()}`,
|
|
106
|
-
importance: 0.6,
|
|
107
|
-
tags: ['preference', 'like'],
|
|
108
|
-
},
|
|
109
|
-
// Dislikes — importance 0.6
|
|
110
|
-
{
|
|
111
|
-
pattern: /\bi\s+(?:really\s+)?(?:hate|dislike|can'?t stand|despise|detest)\s+(.+?)(?:[.!?]|$)/i,
|
|
112
|
-
template: (m) => `User dislikes ${m[1].trim()}`,
|
|
113
|
-
importance: 0.6,
|
|
114
|
-
tags: ['preference', 'dislike'],
|
|
115
|
-
},
|
|
116
|
-
// Trivia / other — importance 0.3
|
|
117
|
-
{
|
|
118
|
-
pattern: /\bi\s+(?:think|believe|feel|guess|suppose)\s+(?:that\s+)?(.+?)(?:[.!?]|$)/i,
|
|
119
|
-
template: (m) => `User thinks ${m[1].trim()}`,
|
|
120
|
-
importance: 0.3,
|
|
121
|
-
tags: ['opinion'],
|
|
122
|
-
},
|
|
123
|
-
];
|
|
124
|
-
// ---------------------------------------------------------------------------
|
|
125
|
-
// Helpers
|
|
126
|
-
// ---------------------------------------------------------------------------
|
|
127
|
-
/** Strip a "role: " prefix like "user: " or "assistant: " from a line. */
|
|
128
|
-
function stripRolePrefix(line) {
|
|
129
|
-
return line.replace(/^[a-zA-Z_\-]+:\s*/, '');
|
|
130
|
-
}
|
|
131
|
-
function makeFact(content, originalContent, importance, confidence, tags, entityCanonicalNames = []) {
|
|
132
|
-
return {
|
|
133
|
-
content,
|
|
134
|
-
importance,
|
|
135
|
-
confidence,
|
|
136
|
-
sourceType: 'conversation',
|
|
137
|
-
modality: 'text',
|
|
138
|
-
tags,
|
|
139
|
-
originalContent,
|
|
140
|
-
operation: 'add',
|
|
141
|
-
entityCanonicalNames,
|
|
142
|
-
};
|
|
143
|
-
}
|
|
144
|
-
// ---------------------------------------------------------------------------
|
|
145
|
-
// Regex extraction (runs on the full text)
|
|
146
|
-
// ---------------------------------------------------------------------------
|
|
147
|
-
function extractRegex(text) {
|
|
148
|
-
const facts = [];
|
|
149
|
-
const seenContents = new Set();
|
|
150
|
-
function addFact(content, original, tags) {
|
|
151
|
-
if (!seenContents.has(content)) {
|
|
152
|
-
seenContents.add(content);
|
|
153
|
-
facts.push(makeFact(content, original, 0.8, 0.9, tags));
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
// Emails
|
|
157
|
-
for (const match of text.matchAll(REGEX.email)) {
|
|
158
|
-
const email = match[0];
|
|
159
|
-
addFact(`User's email is ${email}`, email, ['contact', 'email']);
|
|
160
|
-
}
|
|
161
|
-
// Phone numbers
|
|
162
|
-
for (const match of text.matchAll(REGEX.phone)) {
|
|
163
|
-
const phone = match[0];
|
|
164
|
-
addFact(`User's phone number is ${phone}`, phone, ['contact', 'phone']);
|
|
165
|
-
}
|
|
166
|
-
// URLs
|
|
167
|
-
for (const match of text.matchAll(REGEX.url)) {
|
|
168
|
-
const url = match[0];
|
|
169
|
-
addFact(`User mentioned URL: ${url}`, url, ['url']);
|
|
170
|
-
}
|
|
171
|
-
// Dates
|
|
172
|
-
for (const match of text.matchAll(REGEX.date)) {
|
|
173
|
-
const date = match[0];
|
|
174
|
-
addFact(`Mentioned date: ${date}`, date, ['date']);
|
|
175
|
-
}
|
|
176
|
-
// Money
|
|
177
|
-
for (const match of text.matchAll(REGEX.money)) {
|
|
178
|
-
const amount = match[0];
|
|
179
|
-
addFact(`Mentioned monetary amount: ${amount}`, amount, ['money']);
|
|
180
|
-
}
|
|
181
|
-
return facts;
|
|
182
|
-
}
|
|
183
|
-
// ---------------------------------------------------------------------------
|
|
184
|
-
// Pattern extraction (runs line by line, role prefix stripped)
|
|
185
|
-
// ---------------------------------------------------------------------------
|
|
186
|
-
function extractPatterns(lines) {
|
|
187
|
-
const facts = [];
|
|
188
|
-
const seenContents = new Set();
|
|
189
|
-
for (const rawLine of lines) {
|
|
190
|
-
const line = stripRolePrefix(rawLine).trim();
|
|
191
|
-
if (!line)
|
|
192
|
-
continue;
|
|
193
|
-
for (const rule of PATTERN_RULES) {
|
|
194
|
-
// Reset lastIndex for global regexes (these aren't global, but be safe)
|
|
195
|
-
const match = line.match(rule.pattern);
|
|
196
|
-
if (match) {
|
|
197
|
-
const content = rule.template(match);
|
|
198
|
-
if (!seenContents.has(content)) {
|
|
199
|
-
seenContents.add(content);
|
|
200
|
-
facts.push(makeFact(content, line, rule.importance, 0.7, rule.tags));
|
|
201
|
-
}
|
|
202
|
-
// Only use the first matching rule per line to avoid overlapping facts
|
|
203
|
-
break;
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
return facts;
|
|
208
|
-
}
|
|
209
|
-
// ---------------------------------------------------------------------------
|
|
210
|
-
// NER via compromise
|
|
211
|
-
// ---------------------------------------------------------------------------
|
|
212
|
-
function extractEntities(text) {
|
|
213
|
-
const doc = nlp(text);
|
|
214
|
-
const entities = [];
|
|
215
|
-
const seenCanonical = new Set();
|
|
216
|
-
function addEntity(name, entityType) {
|
|
217
|
-
const trimmed = name.trim();
|
|
218
|
-
if (!trimmed)
|
|
219
|
-
return;
|
|
220
|
-
const canonical = trimmed.toLowerCase();
|
|
221
|
-
if (!seenCanonical.has(`${entityType}:${canonical}`)) {
|
|
222
|
-
seenCanonical.add(`${entityType}:${canonical}`);
|
|
223
|
-
entities.push({
|
|
224
|
-
name: trimmed,
|
|
225
|
-
entityType,
|
|
226
|
-
canonicalName: canonical,
|
|
227
|
-
properties: {},
|
|
228
|
-
});
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
// People
|
|
232
|
-
const people = doc.people().out('array');
|
|
233
|
-
for (const name of people) {
|
|
234
|
-
addEntity(name, 'person');
|
|
235
|
-
}
|
|
236
|
-
// Organizations
|
|
237
|
-
const orgs = doc.organizations().out('array');
|
|
238
|
-
for (const org of orgs) {
|
|
239
|
-
addEntity(org, 'organization');
|
|
240
|
-
}
|
|
241
|
-
// Places
|
|
242
|
-
const places = doc.places().out('array');
|
|
243
|
-
for (const place of places) {
|
|
244
|
-
addEntity(place, 'location');
|
|
245
|
-
}
|
|
246
|
-
return entities;
|
|
247
|
-
}
|
|
248
|
-
// ---------------------------------------------------------------------------
|
|
249
|
-
// Main export
|
|
250
|
-
// ---------------------------------------------------------------------------
|
|
251
|
-
export function extractHeuristic(text) {
|
|
252
|
-
const lines = text.split('\n');
|
|
253
|
-
// 1. Regex extraction — run on full text
|
|
254
|
-
const regexFacts = extractRegex(text);
|
|
255
|
-
const regexContents = new Set(regexFacts.map((f) => f.content));
|
|
256
|
-
// 2. Pattern extraction — line by line, strip role prefix
|
|
257
|
-
const patternFacts = extractPatterns(lines);
|
|
258
|
-
// 3. De-duplicate: remove pattern facts whose content overlaps with regex facts
|
|
259
|
-
// (e.g., if regex grabbed the email and a pattern also mentions it)
|
|
260
|
-
const filteredPatternFacts = patternFacts.filter((f) => !regexContents.has(f.content));
|
|
261
|
-
// 4. NER entities via compromise
|
|
262
|
-
const entities = extractEntities(text);
|
|
263
|
-
const facts = [...regexFacts, ...filteredPatternFacts];
|
|
264
|
-
// Overall confidence: weighted average or fixed 0.9 for regex, 0.7 for pattern
|
|
265
|
-
// Use the maximum confidence across extracted facts, or 0.9 if only regex results exist
|
|
266
|
-
const confidence = facts.length > 0
|
|
267
|
-
? Math.max(...facts.map((f) => f.confidence))
|
|
268
|
-
: entities.length > 0
|
|
269
|
-
? 0.6
|
|
270
|
-
: 0.5;
|
|
271
|
-
return {
|
|
272
|
-
facts,
|
|
273
|
-
entities,
|
|
274
|
-
edges: [],
|
|
275
|
-
tier: 'heuristic',
|
|
276
|
-
confidence,
|
|
277
|
-
tokensInput: 0,
|
|
278
|
-
tokensOutput: 0,
|
|
279
|
-
model: null,
|
|
280
|
-
};
|
|
281
|
-
}
|
|
282
|
-
//# sourceMappingURL=heuristic.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"heuristic.js","sourceRoot":"","sources":["heuristic.ts"],"names":[],"mappings":"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"}
|