@steno-ai/engine 0.1.15 → 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 +23 -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 +34 -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,208 +0,0 @@
|
|
|
1
|
-
const DEFAULT_MAX_DEPTH = 2;
|
|
2
|
-
const MAX_ALLOWED_DEPTH = 5;
|
|
3
|
-
const DEFAULT_MAX_ENTITIES = 200;
|
|
4
|
-
const MIN_TOKEN_LENGTH = 2;
|
|
5
|
-
/** Known entity types to search against for each token */
|
|
6
|
-
const ENTITY_TYPES = ['person', 'organization', 'location', 'topic', 'concept', 'product', 'event'];
|
|
7
|
-
/**
|
|
8
|
-
* Tokenize query into candidate entity names.
|
|
9
|
-
* Splits on whitespace and dots, filters short words (< 2 chars), lowercases for canonical lookup.
|
|
10
|
-
* Also preserves dot-separated names as candidate names (e.g., "clean.ai" → tokens ["clean", "ai"] + candidate "clean.ai")
|
|
11
|
-
*/
|
|
12
|
-
export function tokenizeQuery(query) {
|
|
13
|
-
return query
|
|
14
|
-
.split(/[\s.]+/)
|
|
15
|
-
.map((t) => t.replace(/[^\w-]/g, ''))
|
|
16
|
-
.filter((t) => t.length >= MIN_TOKEN_LENGTH)
|
|
17
|
-
.map((t) => t.toLowerCase());
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Graph-based retrieval module.
|
|
21
|
-
*
|
|
22
|
-
* 1. Extracts potential entity names from query (simple tokenization)
|
|
23
|
-
* 2. For each token, tries to find matching entities by canonical name
|
|
24
|
-
* 3. Uses found entity IDs as seeds for graphTraversal
|
|
25
|
-
* 4. Gets facts connected to discovered entities via getFactsForEntity
|
|
26
|
-
* 5. Assigns graphScore based on hop distance: 1/(2^hop_depth)
|
|
27
|
-
* - 0-hop (seed) = 1.0
|
|
28
|
-
* - 1-hop = 0.5
|
|
29
|
-
* - 2-hop = 0.25
|
|
30
|
-
* - 3-hop = 0.125
|
|
31
|
-
*/
|
|
32
|
-
export async function graphSearch(storage, embedding, query, tenantId, _scope, _scopeId, limit, config) {
|
|
33
|
-
const maxDepth = Math.min(config?.maxDepth ?? DEFAULT_MAX_DEPTH, MAX_ALLOWED_DEPTH);
|
|
34
|
-
const maxEntities = Math.min(config?.maxEntities ?? DEFAULT_MAX_ENTITIES, 500);
|
|
35
|
-
const tokens = tokenizeQuery(query);
|
|
36
|
-
if (tokens.length === 0)
|
|
37
|
-
return [];
|
|
38
|
-
const seedEntityIds = [];
|
|
39
|
-
// Build all candidate names to search for (tokens + multi-word combos + original query forms)
|
|
40
|
-
// NOTE: We intentionally do NOT always include 'user' — it's linked to nearly every fact
|
|
41
|
-
// and floods results. The 'user' entity is only included if the query mentions "user" or "me".
|
|
42
|
-
const candidateNames = [];
|
|
43
|
-
if (/\b(user|me|my|i)\b/i.test(query)) {
|
|
44
|
-
candidateNames.push('user');
|
|
45
|
-
}
|
|
46
|
-
for (const token of tokens) {
|
|
47
|
-
if (token.length >= 2)
|
|
48
|
-
candidateNames.push(token);
|
|
49
|
-
}
|
|
50
|
-
// Add multi-word combos from adjacent tokens
|
|
51
|
-
if (tokens.length >= 2) {
|
|
52
|
-
for (let i = 0; i < tokens.length - 1; i++) {
|
|
53
|
-
candidateNames.push(`${tokens[i]} ${tokens[i + 1]}`);
|
|
54
|
-
// Also try dot-separated form (for entities like "clean.ai")
|
|
55
|
-
candidateNames.push(`${tokens[i]}.${tokens[i + 1]}`);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
// Add the full lowercased query as a candidate (catches exact entity names)
|
|
59
|
-
const fullQuery = query.toLowerCase().trim();
|
|
60
|
-
if (fullQuery.length >= 2 && !candidateNames.includes(fullQuery)) {
|
|
61
|
-
candidateNames.push(fullQuery);
|
|
62
|
-
}
|
|
63
|
-
// Also add dot-stripped version (e.g., "clean.ai" → "clean ai")
|
|
64
|
-
const dotStripped = fullQuery.replace(/\./g, ' ').replace(/\s+/g, ' ').trim();
|
|
65
|
-
if (dotStripped !== fullQuery && !candidateNames.includes(dotStripped)) {
|
|
66
|
-
candidateNames.push(dotStripped);
|
|
67
|
-
}
|
|
68
|
-
// ONE query to find all matching entities instead of 78 sequential calls
|
|
69
|
-
try {
|
|
70
|
-
const { data } = await storage.client
|
|
71
|
-
.from('entities')
|
|
72
|
-
.select('id, canonical_name')
|
|
73
|
-
.eq('tenant_id', tenantId)
|
|
74
|
-
.in('canonical_name', candidateNames);
|
|
75
|
-
if (data) {
|
|
76
|
-
for (const row of data) {
|
|
77
|
-
if (!seedEntityIds.includes(row.id)) {
|
|
78
|
-
seedEntityIds.push(row.id);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
catch (err) {
|
|
84
|
-
console.error('[steno-graph] Batch entity lookup failed, falling back to sequential:', err instanceof Error ? err.message : err);
|
|
85
|
-
// Fallback: sequential lookups if batch fails
|
|
86
|
-
const userEntity = await storage.findEntityByCanonicalName(tenantId, 'user', 'person');
|
|
87
|
-
if (userEntity)
|
|
88
|
-
seedEntityIds.push(userEntity.id);
|
|
89
|
-
for (const token of tokens) {
|
|
90
|
-
for (const entityType of ENTITY_TYPES) {
|
|
91
|
-
const entity = await storage.findEntityByCanonicalName(tenantId, token, entityType);
|
|
92
|
-
if (entity && !seedEntityIds.includes(entity.id)) {
|
|
93
|
-
seedEntityIds.push(entity.id);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
if (seedEntityIds.length === 0)
|
|
99
|
-
return [];
|
|
100
|
-
// 2. Graph traversal from seed entities
|
|
101
|
-
const traversalResult = await storage.graphTraversal({
|
|
102
|
-
tenantId,
|
|
103
|
-
entityIds: seedEntityIds,
|
|
104
|
-
maxDepth,
|
|
105
|
-
maxEntities,
|
|
106
|
-
asOf: config?.asOf,
|
|
107
|
-
});
|
|
108
|
-
if (traversalResult.entities.length === 0)
|
|
109
|
-
return [];
|
|
110
|
-
// Build hop-depth map from traversal result using BFS from seed entities
|
|
111
|
-
// via the edge list returned by the traversal
|
|
112
|
-
const entityHopMap = new Map();
|
|
113
|
-
// Initialize seed entities at depth 0
|
|
114
|
-
for (const entity of traversalResult.entities) {
|
|
115
|
-
if (seedEntityIds.includes(entity.id)) {
|
|
116
|
-
entityHopMap.set(entity.id, 0);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
// Build adjacency list from edges
|
|
120
|
-
const adjacency = new Map();
|
|
121
|
-
for (const edge of traversalResult.edges) {
|
|
122
|
-
if (!adjacency.has(edge.sourceId))
|
|
123
|
-
adjacency.set(edge.sourceId, []);
|
|
124
|
-
if (!adjacency.has(edge.targetId))
|
|
125
|
-
adjacency.set(edge.targetId, []);
|
|
126
|
-
adjacency.get(edge.sourceId).push(edge.targetId);
|
|
127
|
-
adjacency.get(edge.targetId).push(edge.sourceId);
|
|
128
|
-
}
|
|
129
|
-
// BFS to compute min hop depth for all reachable entities
|
|
130
|
-
const queue = [...entityHopMap.keys()];
|
|
131
|
-
while (queue.length > 0) {
|
|
132
|
-
const currentId = queue.shift();
|
|
133
|
-
const currentDepth = entityHopMap.get(currentId);
|
|
134
|
-
const neighbors = adjacency.get(currentId) ?? [];
|
|
135
|
-
for (const neighborId of neighbors) {
|
|
136
|
-
if (!entityHopMap.has(neighborId)) {
|
|
137
|
-
entityHopMap.set(neighborId, currentDepth + 1);
|
|
138
|
-
queue.push(neighborId);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
// Any entity not reached by BFS gets maxDepth
|
|
143
|
-
for (const entity of traversalResult.entities) {
|
|
144
|
-
if (!entityHopMap.has(entity.id)) {
|
|
145
|
-
entityHopMap.set(entity.id, maxDepth);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
// 3. Get facts for ALL discovered entities in ONE query via fact_entities join
|
|
149
|
-
// This replaces N sequential getFactsForEntity calls with 1 batch query.
|
|
150
|
-
const candidateMap = new Map();
|
|
151
|
-
const entityIds = traversalResult.entities.map(e => e.id);
|
|
152
|
-
if (entityIds.length > 0) {
|
|
153
|
-
const PER_ENTITY_LIMIT = Math.max(3, Math.ceil(limit / Math.max(entityIds.length, 1)));
|
|
154
|
-
// Single query: get all facts linked to any of these entities
|
|
155
|
-
try {
|
|
156
|
-
const batchResult = await storage.getFactsForEntities(tenantId, entityIds, PER_ENTITY_LIMIT);
|
|
157
|
-
for (const { entityId, fact } of batchResult) {
|
|
158
|
-
const hopDepth = entityHopMap.get(entityId) ?? maxDepth;
|
|
159
|
-
const graphScore = 1 / Math.pow(2, hopDepth);
|
|
160
|
-
const existing = candidateMap.get(fact.id);
|
|
161
|
-
if (existing) {
|
|
162
|
-
if (graphScore > existing.graphScore) {
|
|
163
|
-
existing.graphScore = graphScore;
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
else {
|
|
167
|
-
candidateMap.set(fact.id, {
|
|
168
|
-
fact,
|
|
169
|
-
vectorScore: 0,
|
|
170
|
-
keywordScore: 0,
|
|
171
|
-
graphScore,
|
|
172
|
-
recencyScore: 0,
|
|
173
|
-
salienceScore: 0,
|
|
174
|
-
temporalScore: 0,
|
|
175
|
-
source: 'graph',
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
catch (err) {
|
|
181
|
-
console.error('[steno-graph] Batch getFactsForEntities failed, falling back to sequential:', err instanceof Error ? err.message : err);
|
|
182
|
-
// Fallback to sequential if batch not supported
|
|
183
|
-
for (const entity of traversalResult.entities) {
|
|
184
|
-
const hopDepth = entityHopMap.get(entity.id) ?? maxDepth;
|
|
185
|
-
const graphScore = 1 / Math.pow(2, hopDepth);
|
|
186
|
-
try {
|
|
187
|
-
const factsResult = await storage.getFactsForEntity(tenantId, entity.id, { limit: 3 });
|
|
188
|
-
for (const fact of factsResult.data) {
|
|
189
|
-
if (!candidateMap.has(fact.id)) {
|
|
190
|
-
candidateMap.set(fact.id, {
|
|
191
|
-
fact, vectorScore: 0, keywordScore: 0, graphScore,
|
|
192
|
-
recencyScore: 0, salienceScore: 0, temporalScore: 0, source: 'graph',
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
catch (err) {
|
|
198
|
-
console.error('[steno-graph] getFactsForEntity failed for entity:', entity.id, err instanceof Error ? err.message : err);
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
// 4. Return candidates, sorted by graphScore descending, limited
|
|
204
|
-
return Array.from(candidateMap.values())
|
|
205
|
-
.sort((a, b) => b.graphScore - a.graphScore)
|
|
206
|
-
.slice(0, limit);
|
|
207
|
-
}
|
|
208
|
-
//# sourceMappingURL=graph-traversal.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"graph-traversal.js","sourceRoot":"","sources":["graph-traversal.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import type { LLMAdapter } from '../adapters/llm.js';
|
|
2
|
-
/**
|
|
3
|
-
* Multi-query expansion — like Hydra DB's Adaptive Query Expansion.
|
|
4
|
-
*
|
|
5
|
-
* Takes a single query and generates 3-4 semantically diverse reformulations.
|
|
6
|
-
* Each captures a different interpretation of the user's intent:
|
|
7
|
-
* - Paraphrases
|
|
8
|
-
* - Temporal concretizations ("last week" → "projects from March 18-25")
|
|
9
|
-
* - Domain-specific restatements
|
|
10
|
-
*
|
|
11
|
-
* All expanded queries are searched in parallel for higher recall.
|
|
12
|
-
*/
|
|
13
|
-
export declare function expandQuery(llm: LLMAdapter, query: string): Promise<string[]>;
|
|
14
|
-
/**
|
|
15
|
-
* Fast heuristic expansion — no LLM needed.
|
|
16
|
-
* Generates simple reformulations using string manipulation.
|
|
17
|
-
* Use this when you don't have an LLM available or want zero latency.
|
|
18
|
-
*/
|
|
19
|
-
export declare function expandQueryHeuristic(query: string): string[];
|
|
20
|
-
//# sourceMappingURL=query-expansion.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"query-expansion.d.ts","sourceRoot":"","sources":["query-expansion.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErD;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,UAAU,EACf,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,EAAE,CAAC,CAoCnB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CA0B5D"}
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Multi-query expansion — like Hydra DB's Adaptive Query Expansion.
|
|
3
|
-
*
|
|
4
|
-
* Takes a single query and generates 3-4 semantically diverse reformulations.
|
|
5
|
-
* Each captures a different interpretation of the user's intent:
|
|
6
|
-
* - Paraphrases
|
|
7
|
-
* - Temporal concretizations ("last week" → "projects from March 18-25")
|
|
8
|
-
* - Domain-specific restatements
|
|
9
|
-
*
|
|
10
|
-
* All expanded queries are searched in parallel for higher recall.
|
|
11
|
-
*/
|
|
12
|
-
export async function expandQuery(llm, query) {
|
|
13
|
-
// Short queries or very specific ones don't need expansion
|
|
14
|
-
if (query.length < 15 || query.split(' ').length <= 3) {
|
|
15
|
-
return [query];
|
|
16
|
-
}
|
|
17
|
-
try {
|
|
18
|
-
const response = await llm.complete([
|
|
19
|
-
{
|
|
20
|
-
role: 'system',
|
|
21
|
-
content: `You generate search query expansions for a memory retrieval system. Given a user query, produce 3 alternative phrasings that capture different aspects of the intent.
|
|
22
|
-
|
|
23
|
-
Rules:
|
|
24
|
-
- Each alternative should use different keywords/phrasing
|
|
25
|
-
- Include temporal concretizations if relevant ("recently" → "in the past week")
|
|
26
|
-
- Include domain-specific restatements
|
|
27
|
-
- Keep each alternative concise (under 15 words)
|
|
28
|
-
- Return ONLY a JSON array of strings: ["query1", "query2", "query3"]`,
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
role: 'user',
|
|
32
|
-
content: query,
|
|
33
|
-
},
|
|
34
|
-
], { temperature: 0.3, responseFormat: 'json' });
|
|
35
|
-
const parsed = JSON.parse(response.content);
|
|
36
|
-
const expansions = Array.isArray(parsed)
|
|
37
|
-
? parsed.filter((q) => typeof q === 'string' && q.trim().length > 0)
|
|
38
|
-
: [];
|
|
39
|
-
// Always include the original query first
|
|
40
|
-
return [query, ...expansions.slice(0, 3)];
|
|
41
|
-
}
|
|
42
|
-
catch {
|
|
43
|
-
// If expansion fails, just use the original query
|
|
44
|
-
return [query];
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Fast heuristic expansion — no LLM needed.
|
|
49
|
-
* Generates simple reformulations using string manipulation.
|
|
50
|
-
* Use this when you don't have an LLM available or want zero latency.
|
|
51
|
-
*/
|
|
52
|
-
export function expandQueryHeuristic(query) {
|
|
53
|
-
const queries = [query];
|
|
54
|
-
const lower = query.toLowerCase();
|
|
55
|
-
// Add "User" prefix version if not present
|
|
56
|
-
if (!lower.startsWith('user') && !lower.includes('my ') && !lower.includes('i ')) {
|
|
57
|
-
queries.push(`User ${lower}`);
|
|
58
|
-
}
|
|
59
|
-
// Convert "my X" to "user's X"
|
|
60
|
-
if (lower.includes('my ')) {
|
|
61
|
-
queries.push(lower.replace(/\bmy\b/g, "user's"));
|
|
62
|
-
}
|
|
63
|
-
// Convert questions to statements
|
|
64
|
-
if (lower.startsWith('what ') || lower.startsWith('who ') || lower.startsWith('where ') || lower.startsWith('when ')) {
|
|
65
|
-
const statement = lower
|
|
66
|
-
.replace(/^what (is|are|was|were) /, '')
|
|
67
|
-
.replace(/^who (is|are|was|were) /, '')
|
|
68
|
-
.replace(/^where (is|are|was|were|does|did) /, '')
|
|
69
|
-
.replace(/^when (did|does|was|were|is) /, '')
|
|
70
|
-
.replace(/\?$/, '');
|
|
71
|
-
if (statement !== lower)
|
|
72
|
-
queries.push(statement);
|
|
73
|
-
}
|
|
74
|
-
return queries.slice(0, 4);
|
|
75
|
-
}
|
|
76
|
-
//# sourceMappingURL=query-expansion.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"query-expansion.js","sourceRoot":"","sources":["query-expansion.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,GAAe,EACf,KAAa;IAEb,2DAA2D;IAC3D,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACtD,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC;YAClC;gBACE,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE;;;;;;;sEAOqD;aAC/D;YACD;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,KAAK;aACf;SACF,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC;QAEjD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YACtC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;YACjF,CAAC,CAAC,EAAE,CAAC;QAEP,0CAA0C;QAC1C,OAAO,CAAC,KAAK,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,kDAAkD;QAClD,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC;IACxB,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAElC,2CAA2C;IAC3C,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACjF,OAAO,CAAC,IAAI,CAAC,QAAQ,KAAK,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,+BAA+B;IAC/B,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,kCAAkC;IAClC,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACrH,MAAM,SAAS,GAAG,KAAK;aACpB,OAAO,CAAC,0BAA0B,EAAE,EAAE,CAAC;aACvC,OAAO,CAAC,yBAAyB,EAAE,EAAE,CAAC;aACtC,OAAO,CAAC,oCAAoC,EAAE,EAAE,CAAC;aACjD,OAAO,CAAC,+BAA+B,EAAE,EAAE,CAAC;aAC5C,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACtB,IAAI,SAAS,KAAK,KAAK;YAAE,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7B,CAAC"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { EmbeddingAdapter } from '../adapters/embedding.js';
|
|
2
|
-
import type { SearchResult } from './types.js';
|
|
3
|
-
/**
|
|
4
|
-
* Re-rank search results using embedding cosine similarity.
|
|
5
|
-
* Deterministic, free (uses existing embedding model), no LLM call.
|
|
6
|
-
*
|
|
7
|
-
* How it works:
|
|
8
|
-
* 1. Embed the query
|
|
9
|
-
* 2. Embed all fact content texts in a single batch call
|
|
10
|
-
* 3. Compute cosine similarity between query embedding and each fact embedding
|
|
11
|
-
* 4. Blend the similarity score with the original fusion score
|
|
12
|
-
* 5. Re-sort by blended score
|
|
13
|
-
*/
|
|
14
|
-
export declare function rerank(embedding: EmbeddingAdapter, query: string, results: SearchResult[], topK?: number): Promise<SearchResult[]>;
|
|
15
|
-
//# sourceMappingURL=reranker.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reranker.d.ts","sourceRoot":"","sources":["reranker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C;;;;;;;;;;GAUG;AACH,wBAAsB,MAAM,CAC1B,SAAS,EAAE,gBAAgB,EAC3B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,YAAY,EAAE,EACvB,IAAI,GAAE,MAAW,GAChB,OAAO,CAAC,YAAY,EAAE,CAAC,CAsBzB"}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Re-rank search results using embedding cosine similarity.
|
|
3
|
-
* Deterministic, free (uses existing embedding model), no LLM call.
|
|
4
|
-
*
|
|
5
|
-
* How it works:
|
|
6
|
-
* 1. Embed the query
|
|
7
|
-
* 2. Embed all fact content texts in a single batch call
|
|
8
|
-
* 3. Compute cosine similarity between query embedding and each fact embedding
|
|
9
|
-
* 4. Blend the similarity score with the original fusion score
|
|
10
|
-
* 5. Re-sort by blended score
|
|
11
|
-
*/
|
|
12
|
-
export async function rerank(embedding, query, results, topK = 10) {
|
|
13
|
-
if (results.length === 0)
|
|
14
|
-
return [];
|
|
15
|
-
if (results.length <= 1)
|
|
16
|
-
return results;
|
|
17
|
-
// Embed query + all fact texts in one batch
|
|
18
|
-
const texts = [query, ...results.map(r => r.fact.content)];
|
|
19
|
-
const embeddings = await embedding.embedBatch(texts);
|
|
20
|
-
const queryEmbedding = embeddings[0];
|
|
21
|
-
const factEmbeddings = embeddings.slice(1);
|
|
22
|
-
// Score each result by cosine similarity with the query
|
|
23
|
-
const RERANK_WEIGHT = 0.4; // 40% embedding similarity, 60% original fusion score
|
|
24
|
-
const scored = results.map((r, i) => {
|
|
25
|
-
const rerankScore = cosineSimilarity(queryEmbedding, factEmbeddings[i]);
|
|
26
|
-
const blendedScore = r.score * (1 - RERANK_WEIGHT) + rerankScore * RERANK_WEIGHT;
|
|
27
|
-
return { ...r, score: blendedScore };
|
|
28
|
-
});
|
|
29
|
-
// Sort by blended score
|
|
30
|
-
scored.sort((a, b) => b.score - a.score);
|
|
31
|
-
return scored.slice(0, topK);
|
|
32
|
-
}
|
|
33
|
-
function cosineSimilarity(a, b) {
|
|
34
|
-
if (a.length !== b.length || a.length === 0)
|
|
35
|
-
return 0;
|
|
36
|
-
let dotProduct = 0;
|
|
37
|
-
let normA = 0;
|
|
38
|
-
let normB = 0;
|
|
39
|
-
for (let i = 0; i < a.length; i++) {
|
|
40
|
-
dotProduct += a[i] * b[i];
|
|
41
|
-
normA += a[i] * a[i];
|
|
42
|
-
normB += b[i] * b[i];
|
|
43
|
-
}
|
|
44
|
-
const denom = Math.sqrt(normA) * Math.sqrt(normB);
|
|
45
|
-
return denom === 0 ? 0 : dotProduct / denom;
|
|
46
|
-
}
|
|
47
|
-
//# sourceMappingURL=reranker.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reranker.js","sourceRoot":"","sources":["reranker.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,SAA2B,EAC3B,KAAa,EACb,OAAuB,EACvB,OAAe,EAAE;IAEjB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC;IAExC,4CAA4C;IAC5C,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3D,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACrD,MAAM,cAAc,GAAG,UAAU,CAAC,CAAC,CAAE,CAAC;IACtC,MAAM,cAAc,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE3C,wDAAwD;IACxD,MAAM,aAAa,GAAG,GAAG,CAAC,CAAC,sDAAsD;IACjF,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAClC,MAAM,WAAW,GAAG,gBAAgB,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC,CAAE,CAAC,CAAC;QACzE,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,aAAa,CAAC,GAAG,WAAW,GAAG,aAAa,CAAC;QACjF,OAAO,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,wBAAwB;IACxB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAEzC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,gBAAgB,CAAC,CAAW,EAAE,CAAW;IAChD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACtD,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,UAAU,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QAC5B,KAAK,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACvB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;IACzB,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClD,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,KAAK,CAAC;AAC9C,CAAC"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { Candidate } from './types.js';
|
|
2
|
-
export interface SalienceConfig {
|
|
3
|
-
halfLifeDays: number;
|
|
4
|
-
normalizationK: number;
|
|
5
|
-
}
|
|
6
|
-
/**
|
|
7
|
-
* Score all candidates with recency and salience signals.
|
|
8
|
-
*
|
|
9
|
-
* recencyScore = pure time decay (how recently the fact was accessed)
|
|
10
|
-
* salienceScore = importance x frequency factor (how important and reinforced)
|
|
11
|
-
*
|
|
12
|
-
* These are separate signals that feed into fusion with independent weights.
|
|
13
|
-
*/
|
|
14
|
-
export declare function scoreSalience(candidates: Candidate[], config?: Partial<SalienceConfig>): Candidate[];
|
|
15
|
-
//# sourceMappingURL=salience-scorer.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"salience-scorer.d.ts","sourceRoot":"","sources":["salience-scorer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,UAAU,EAAE,SAAS,EAAE,EACvB,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAC/B,SAAS,EAAE,CAsCb"}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Score all candidates with recency and salience signals.
|
|
3
|
-
*
|
|
4
|
-
* recencyScore = pure time decay (how recently the fact was accessed)
|
|
5
|
-
* salienceScore = importance x frequency factor (how important and reinforced)
|
|
6
|
-
*
|
|
7
|
-
* These are separate signals that feed into fusion with independent weights.
|
|
8
|
-
*/
|
|
9
|
-
export function scoreSalience(candidates, config) {
|
|
10
|
-
const halfLifeDays = config?.halfLifeDays ?? 30;
|
|
11
|
-
const normalizationK = config?.normalizationK ?? 50;
|
|
12
|
-
return candidates.map(candidate => {
|
|
13
|
-
const { fact } = candidate;
|
|
14
|
-
// Recency: blend of access recency + creation recency
|
|
15
|
-
// Access recency = how recently the fact was recalled (reinforcement)
|
|
16
|
-
// Creation recency = how recently the fact was created (freshness)
|
|
17
|
-
// Git-style versioning needs creation recency so newer versions of
|
|
18
|
-
// the same lineage naturally rank higher.
|
|
19
|
-
const lambda = Math.LN2 / halfLifeDays;
|
|
20
|
-
const daysSinceAccess = fact.lastAccessed
|
|
21
|
-
? (Date.now() - new Date(fact.lastAccessed).getTime()) / (1000 * 60 * 60 * 24)
|
|
22
|
-
: Infinity;
|
|
23
|
-
const accessRecency = fact.lastAccessed ? Math.exp(-lambda * daysSinceAccess) : 0;
|
|
24
|
-
const daysSinceCreation = fact.createdAt
|
|
25
|
-
? (Date.now() - new Date(fact.createdAt).getTime()) / (1000 * 60 * 60 * 24)
|
|
26
|
-
: Infinity;
|
|
27
|
-
const creationRecency = fact.createdAt ? Math.exp(-lambda * daysSinceCreation) : 0;
|
|
28
|
-
// Blend: 50% access recency + 50% creation recency
|
|
29
|
-
const recencyScore = 0.5 * accessRecency + 0.5 * creationRecency;
|
|
30
|
-
// Salience: importance x frequency factor
|
|
31
|
-
// This captures "how important is this fact AND how often has it been reinforced"
|
|
32
|
-
const frequencyFactor = Math.min(1.0, Math.log(1 + fact.frequency) / Math.log(1 + normalizationK));
|
|
33
|
-
const salienceScore = fact.importance * frequencyFactor;
|
|
34
|
-
return {
|
|
35
|
-
...candidate,
|
|
36
|
-
recencyScore: Math.max(0, Math.min(1, recencyScore)),
|
|
37
|
-
salienceScore: Math.max(0, Math.min(1, salienceScore)),
|
|
38
|
-
};
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
//# sourceMappingURL=salience-scorer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"salience-scorer.js","sourceRoot":"","sources":["salience-scorer.ts"],"names":[],"mappings":"AAOA;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAC3B,UAAuB,EACvB,MAAgC;IAEhC,MAAM,YAAY,GAAG,MAAM,EAAE,YAAY,IAAI,EAAE,CAAC;IAChD,MAAM,cAAc,GAAG,MAAM,EAAE,cAAc,IAAI,EAAE,CAAC;IAEpD,OAAO,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE;QAChC,MAAM,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC;QAE3B,sDAAsD;QACtD,sEAAsE;QACtE,mEAAmE;QACnE,mEAAmE;QACnE,0CAA0C;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC;QAEvC,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY;YACvC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;YAC9E,CAAC,CAAC,QAAQ,CAAC;QACb,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAElF,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS;YACtC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;YAC3E,CAAC,CAAC,QAAQ,CAAC;QACb,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEnF,mDAAmD;QACnD,MAAM,YAAY,GAAG,GAAG,GAAG,aAAa,GAAG,GAAG,GAAG,eAAe,CAAC;QAEjE,0CAA0C;QAC1C,kFAAkF;QAClF,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC;QACnG,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,GAAG,eAAe,CAAC;QAExD,OAAO;YACL,GAAG,SAAS;YACZ,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;YACpD,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;SACvD,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import type { StorageAdapter } from '../adapters/storage.js';
|
|
2
|
-
import type { EmbeddingAdapter } from '../adapters/embedding.js';
|
|
3
|
-
import type { CacheAdapter } from '../adapters/cache.js';
|
|
4
|
-
import type { LLMAdapter } from '../adapters/llm.js';
|
|
5
|
-
import type { SearchOptions, SearchResponse, FusionWeights } from './types.js';
|
|
6
|
-
export interface SearchConfig {
|
|
7
|
-
storage: StorageAdapter;
|
|
8
|
-
embedding: EmbeddingAdapter;
|
|
9
|
-
cache?: CacheAdapter;
|
|
10
|
-
defaultWeights?: FusionWeights;
|
|
11
|
-
salienceHalfLifeDays?: number;
|
|
12
|
-
salienceNormalizationK?: number;
|
|
13
|
-
graphMaxDepth?: number;
|
|
14
|
-
graphMaxEntities?: number;
|
|
15
|
-
rerankerLLM?: LLMAdapter;
|
|
16
|
-
rerank?: boolean;
|
|
17
|
-
/** LLM for query expansion (optional — falls back to heuristic expansion) */
|
|
18
|
-
expansionLLM?: LLMAdapter;
|
|
19
|
-
}
|
|
20
|
-
export declare function search(config: SearchConfig, options: SearchOptions): Promise<SearchResponse>;
|
|
21
|
-
//# sourceMappingURL=search.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["search.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,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAa,MAAM,YAAY,CAAC;AAc1F,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,cAAc,CAAC;IACxB,SAAS,EAAE,gBAAgB,CAAC;IAC5B,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,cAAc,CAAC,EAAE,aAAa,CAAC;IAC/B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,UAAU,CAAC;IACzB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,UAAU,CAAC;CAC3B;AAED,wBAAsB,MAAM,CAC1B,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,cAAc,CAAC,CA6NzB"}
|