@steno-ai/engine 0.1.1 → 0.1.2
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/llm-extractor.d.ts.map +1 -1
- package/dist/extraction/llm-extractor.js +5 -3
- package/dist/extraction/llm-extractor.js.map +1 -1
- package/dist/extraction/prompts.d.ts +2 -2
- package/dist/extraction/prompts.d.ts.map +1 -1
- package/dist/extraction/prompts.js +7 -1
- package/dist/extraction/prompts.js.map +1 -1
- package/package.json +1 -1
- package/src/adapters/cache.js +2 -0
- package/src/adapters/embedding.js +2 -0
- package/src/adapters/llm.js +2 -0
- package/src/adapters/perplexity-embedding.js +78 -0
- package/src/adapters/storage.js +2 -0
- package/src/config.d.ts +211 -1
- package/src/config.d.ts.map +1 -1
- package/src/config.js +92 -0
- package/src/config.js.map +1 -1
- package/src/extraction/contradiction.js +23 -0
- package/src/extraction/dedup.js +93 -0
- package/src/extraction/dedup.js.map +1 -1
- package/src/extraction/entity-extractor.d.ts.map +1 -1
- package/src/extraction/entity-extractor.js +145 -0
- package/src/extraction/entity-extractor.js.map +1 -1
- package/src/extraction/hasher.js +8 -0
- package/src/extraction/heuristic.js +282 -0
- package/src/extraction/llm-extractor.d.ts +3 -1
- package/src/extraction/llm-extractor.d.ts.map +1 -1
- package/src/extraction/llm-extractor.js +238 -0
- package/src/extraction/llm-extractor.js.map +1 -1
- package/src/extraction/llm-extractor.ts +7 -5
- package/src/extraction/pipeline.d.ts +3 -0
- package/src/extraction/pipeline.d.ts.map +1 -1
- package/src/extraction/pipeline.js +398 -0
- package/src/extraction/pipeline.js.map +1 -1
- package/src/extraction/prompts.d.ts +28 -0
- package/src/extraction/prompts.d.ts.map +1 -0
- package/src/extraction/prompts.js +196 -0
- package/src/extraction/prompts.js.map +1 -1
- package/src/extraction/prompts.ts +7 -1
- package/src/extraction/sliding-window.js +84 -0
- package/src/extraction/sliding-window.js.map +1 -1
- package/src/extraction/types.d.ts +12 -0
- package/src/extraction/types.d.ts.map +1 -1
- package/src/extraction/types.js +2 -0
- package/src/feedback/tracker.js +90 -0
- package/src/models/api-key.d.ts +2 -2
- package/src/models/api-key.js +21 -0
- package/src/models/edge.d.ts +6 -6
- package/src/models/edge.js +29 -0
- package/src/models/entity.d.ts +2 -2
- package/src/models/entity.js +22 -0
- package/src/models/extraction.d.ts +6 -6
- package/src/models/extraction.js +40 -0
- package/src/models/fact-entity.js +14 -0
- package/src/models/fact.d.ts +191 -0
- package/src/models/fact.d.ts.map +1 -0
- package/src/models/fact.js +72 -0
- package/src/models/fact.js.map +1 -0
- package/src/models/index.js +13 -0
- package/src/models/memory-access.d.ts +4 -4
- package/src/models/memory-access.js +33 -0
- package/src/models/session.js +23 -0
- package/src/models/tenant.d.ts +248 -14
- package/src/models/tenant.d.ts.map +1 -1
- package/src/models/tenant.js +23 -0
- package/src/models/trigger.d.ts +5 -5
- package/src/models/trigger.js +41 -0
- package/src/models/usage-record.js +14 -0
- package/src/models/webhook.d.ts +1 -1
- package/src/models/webhook.js +25 -0
- package/src/retrieval/compound-search.d.ts.map +1 -1
- package/src/retrieval/compound-search.js +87 -0
- package/src/retrieval/compound-search.js.map +1 -1
- package/src/retrieval/contradiction-surfacer.js +64 -0
- package/src/retrieval/embedding-cache.js +56 -0
- package/src/retrieval/fusion.d.ts +1 -0
- package/src/retrieval/fusion.d.ts.map +1 -1
- package/src/retrieval/fusion.js +87 -0
- package/src/retrieval/fusion.js.map +1 -1
- package/src/retrieval/graph-traversal.d.ts +2 -1
- package/src/retrieval/graph-traversal.d.ts.map +1 -1
- package/src/retrieval/graph-traversal.js +208 -0
- package/src/retrieval/graph-traversal.js.map +1 -1
- package/src/retrieval/query-expansion.js +76 -0
- package/src/retrieval/reranker.js +47 -0
- package/src/retrieval/salience-scorer.js +41 -0
- package/src/retrieval/search.d.ts.map +1 -1
- package/src/retrieval/search.js +228 -0
- package/src/retrieval/search.js.map +1 -1
- package/src/retrieval/temporal-scorer.d.ts +18 -0
- package/src/retrieval/temporal-scorer.d.ts.map +1 -0
- package/src/retrieval/temporal-scorer.js +106 -0
- package/src/retrieval/temporal-scorer.js.map +1 -0
- package/src/retrieval/trigger-matcher.d.ts.map +1 -1
- package/src/retrieval/trigger-matcher.js +134 -0
- package/src/retrieval/trigger-matcher.js.map +1 -1
- package/src/retrieval/types.d.ts +4 -0
- package/src/retrieval/types.d.ts.map +1 -1
- package/src/retrieval/types.js +9 -0
- package/src/retrieval/types.js.map +1 -1
- package/src/retrieval/vector-search.d.ts.map +1 -1
- package/src/retrieval/vector-search.js +24 -0
- package/src/retrieval/vector-search.js.map +1 -1
- package/src/salience/decay.js +15 -0
- package/src/scratchpad/scratchpad.js +107 -0
- package/src/sessions/manager.d.ts +11 -0
- package/src/sessions/manager.d.ts.map +1 -0
- package/src/sessions/manager.js +63 -0
- package/src/sessions/manager.js.map +1 -0
|
@@ -0,0 +1,41 @@
|
|
|
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 +1 @@
|
|
|
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;
|
|
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"}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { DEFAULT_FUSION_WEIGHTS } from './types.js';
|
|
2
|
+
import { compoundSearchSignal } from './compound-search.js';
|
|
3
|
+
import { graphSearch } from './graph-traversal.js';
|
|
4
|
+
import { matchTriggers } from './trigger-matcher.js';
|
|
5
|
+
import { scoreSalience } from './salience-scorer.js';
|
|
6
|
+
import { fuseAndRank } from './fusion.js';
|
|
7
|
+
import { surfaceContradictions } from './contradiction-surfacer.js';
|
|
8
|
+
import { recordAccesses } from '../feedback/tracker.js';
|
|
9
|
+
import { CachedEmbeddingAdapter } from './embedding-cache.js';
|
|
10
|
+
import { extractTimeReference, scoreTemporalRelevance } from './temporal-scorer.js';
|
|
11
|
+
export async function search(config, options) {
|
|
12
|
+
const startTime = Date.now();
|
|
13
|
+
const limit = Math.min(options.limit ?? 10, 100);
|
|
14
|
+
const weights = options.weights ?? config.defaultWeights ?? DEFAULT_FUSION_WEIGHTS;
|
|
15
|
+
const fetchMultiplier = 3; // fetch 3x limit from each signal for better fusion
|
|
16
|
+
// Wrap embedding with cache if available
|
|
17
|
+
const effectiveEmbedding = config.cache
|
|
18
|
+
? new CachedEmbeddingAdapter(config.embedding, config.cache)
|
|
19
|
+
: config.embedding;
|
|
20
|
+
// 1. Run all signals in PARALLEL — ONE compound search (not multiple)
|
|
21
|
+
// Multi-query expansion adds latency (3× embedding calls). Instead:
|
|
22
|
+
// - Single compound search with original query (vector + keyword in 1 DB call)
|
|
23
|
+
// - Graph search with original query
|
|
24
|
+
// - Trigger matching
|
|
25
|
+
// All parallel = single round trip time.
|
|
26
|
+
const t0 = Date.now();
|
|
27
|
+
const tCompound = Date.now();
|
|
28
|
+
const compoundPromise = compoundSearchSignal(config.storage, effectiveEmbedding, options.query, options.tenantId, options.scope, options.scopeId, limit * fetchMultiplier).catch(() => ({ vectorCandidates: [], keywordCandidates: [] }));
|
|
29
|
+
const tGraph = Date.now();
|
|
30
|
+
const graphPromise = graphSearch(config.storage, effectiveEmbedding, options.query, options.tenantId, options.scope, options.scopeId, limit * fetchMultiplier, { maxDepth: config.graphMaxDepth, maxEntities: config.graphMaxEntities, asOf: options.temporalFilter?.asOf }).catch(() => []);
|
|
31
|
+
const tTrigger = Date.now();
|
|
32
|
+
const triggerPromise = matchTriggers(config.storage, effectiveEmbedding, options.query, options.tenantId, options.scope, options.scopeId).catch(() => ({ candidates: [], triggersMatched: [] }));
|
|
33
|
+
const [compoundResult, graphSettled, triggerSettled] = await Promise.all([
|
|
34
|
+
compoundPromise.then(r => { console.error(`[steno-search] compound: ${Date.now() - tCompound}ms (vec=${r.vectorCandidates.length}, kw=${r.keywordCandidates.length})`); return r; }),
|
|
35
|
+
graphPromise.then(r => { console.error(`[steno-search] graph: ${Date.now() - tGraph}ms (${Array.isArray(r) ? r.length : 0} candidates)`); return r; }),
|
|
36
|
+
triggerPromise.then(r => { console.error(`[steno-search] trigger: ${Date.now() - tTrigger}ms`); return r; }),
|
|
37
|
+
]);
|
|
38
|
+
console.error(`[steno-search] Signals total: ${Date.now() - t0}ms`);
|
|
39
|
+
const vectorCandidates = compoundResult.vectorCandidates;
|
|
40
|
+
const keywordCandidates = compoundResult.keywordCandidates;
|
|
41
|
+
const graphCandidates = Array.isArray(graphSettled) ? graphSettled : [];
|
|
42
|
+
const triggerResult = triggerSettled;
|
|
43
|
+
const triggersMatched = triggerResult.triggersMatched;
|
|
44
|
+
// 2. Triple-tier pre-fusion reranking — rerank each stream INDEPENDENTLY
|
|
45
|
+
// Only rerank when there are enough candidates to justify the embedding cost
|
|
46
|
+
// before fusion, like Hydra DB's triple-tier architecture.
|
|
47
|
+
const t1 = Date.now();
|
|
48
|
+
// Batch-embed query + all unique candidate contents in ONE call
|
|
49
|
+
const allPreRerankCandidates = [...vectorCandidates, ...graphCandidates];
|
|
50
|
+
let queryEmbedding = null;
|
|
51
|
+
const candidateEmbeddings = new Map();
|
|
52
|
+
// Only rerank if we have >10 candidates — for small sets the original order is fine
|
|
53
|
+
if (allPreRerankCandidates.length > 10) {
|
|
54
|
+
try {
|
|
55
|
+
const uniqueTexts = new Map();
|
|
56
|
+
for (const c of allPreRerankCandidates) {
|
|
57
|
+
if (!uniqueTexts.has(c.fact.id))
|
|
58
|
+
uniqueTexts.set(c.fact.id, c.fact.content);
|
|
59
|
+
}
|
|
60
|
+
const textsToEmbed = [options.query, ...uniqueTexts.values()];
|
|
61
|
+
const embeddings = await effectiveEmbedding.embedBatch(textsToEmbed);
|
|
62
|
+
queryEmbedding = embeddings[0];
|
|
63
|
+
let idx = 1;
|
|
64
|
+
for (const [factId] of uniqueTexts) {
|
|
65
|
+
candidateEmbeddings.set(factId, embeddings[idx++]);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// Reranking fails silently — proceed without it
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Rerank vector candidates
|
|
73
|
+
if (queryEmbedding && vectorCandidates.length > 1) {
|
|
74
|
+
const RERANK_W = 0.4;
|
|
75
|
+
for (const c of vectorCandidates) {
|
|
76
|
+
const factEmb = candidateEmbeddings.get(c.fact.id);
|
|
77
|
+
if (factEmb) {
|
|
78
|
+
const sim = cosineSim(queryEmbedding, factEmb);
|
|
79
|
+
c.vectorScore = c.vectorScore * (1 - RERANK_W) + sim * RERANK_W;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
vectorCandidates.sort((a, b) => b.vectorScore - a.vectorScore);
|
|
83
|
+
}
|
|
84
|
+
// Rerank graph candidates
|
|
85
|
+
if (queryEmbedding && graphCandidates.length > 1) {
|
|
86
|
+
const RERANK_W = 0.4;
|
|
87
|
+
for (const c of graphCandidates) {
|
|
88
|
+
const factEmb = candidateEmbeddings.get(c.fact.id);
|
|
89
|
+
if (factEmb) {
|
|
90
|
+
const sim = cosineSim(queryEmbedding, factEmb);
|
|
91
|
+
c.graphScore = c.graphScore * (1 - RERANK_W) + sim * RERANK_W;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
graphCandidates.sort((a, b) => b.graphScore - a.graphScore);
|
|
95
|
+
}
|
|
96
|
+
// Keyword candidates skip reranking — FTS scores shouldn't be overridden by embeddings
|
|
97
|
+
console.error(`[steno-search] Pre-fusion rerank: ${Date.now() - t1}ms`);
|
|
98
|
+
// 3. Merge all pre-reranked streams
|
|
99
|
+
const allCandidates = [
|
|
100
|
+
...vectorCandidates,
|
|
101
|
+
...keywordCandidates,
|
|
102
|
+
...graphCandidates,
|
|
103
|
+
...triggerResult.candidates,
|
|
104
|
+
];
|
|
105
|
+
if (allCandidates.length === 0) {
|
|
106
|
+
return {
|
|
107
|
+
results: [],
|
|
108
|
+
triggersMatched,
|
|
109
|
+
totalCandidates: 0,
|
|
110
|
+
durationMs: Date.now() - startTime,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
// 4. Score salience + recency on all candidates
|
|
114
|
+
const scoredCandidates = scoreSalience(allCandidates, {
|
|
115
|
+
halfLifeDays: config.salienceHalfLifeDays,
|
|
116
|
+
normalizationK: config.salienceNormalizationK,
|
|
117
|
+
});
|
|
118
|
+
// 4b. Score temporal relevance if query has time reference
|
|
119
|
+
const timeRef = extractTimeReference(options.query);
|
|
120
|
+
if (timeRef) {
|
|
121
|
+
scoreTemporalRelevance(scoredCandidates, timeRef);
|
|
122
|
+
}
|
|
123
|
+
// 5. Fuse and rank
|
|
124
|
+
const fusionResults = fuseAndRank(scoredCandidates, weights, limit);
|
|
125
|
+
// 5b. Lineage dedup — keep only the NEWEST version per lineage
|
|
126
|
+
// Git-style append-only means multiple versions coexist. For normal queries,
|
|
127
|
+
// show only the latest version (by createdAt). For "includeHistory", show all.
|
|
128
|
+
let dedupedResults = fusionResults;
|
|
129
|
+
if (!options.includeHistory) {
|
|
130
|
+
const lineageBest = new Map();
|
|
131
|
+
for (let i = 0; i < fusionResults.length; i++) {
|
|
132
|
+
const r = fusionResults[i];
|
|
133
|
+
const lid = r.fact.lineageId;
|
|
134
|
+
if (!lid)
|
|
135
|
+
continue;
|
|
136
|
+
const existing = lineageBest.get(lid);
|
|
137
|
+
const createdAt = new Date(r.fact.createdAt);
|
|
138
|
+
if (!existing || createdAt > existing.createdAt) {
|
|
139
|
+
lineageBest.set(lid, { idx: i, createdAt, score: r.score });
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
const keepIndices = new Set(Array.from(lineageBest.values()).map(v => v.idx));
|
|
143
|
+
// Also keep facts with no lineage match (unique facts)
|
|
144
|
+
dedupedResults = fusionResults.filter((r, idx) => {
|
|
145
|
+
const lid = r.fact.lineageId;
|
|
146
|
+
if (!lid)
|
|
147
|
+
return true;
|
|
148
|
+
return keepIndices.has(idx);
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
// 5c. Knowledge chain resolution — if a result has metadata.relationType === 'updates',
|
|
152
|
+
// check if the fact it updates is ALSO in results. If so, suppress the older one.
|
|
153
|
+
const updatedFactIds = new Set();
|
|
154
|
+
for (const r of dedupedResults) {
|
|
155
|
+
const meta = r.fact.metadata;
|
|
156
|
+
if (meta?.relationType === 'updates' && meta?.relatedFactId) {
|
|
157
|
+
updatedFactIds.add(meta.relatedFactId);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
if (updatedFactIds.size > 0) {
|
|
161
|
+
dedupedResults = dedupedResults.filter(r => !updatedFactIds.has(r.fact.id));
|
|
162
|
+
}
|
|
163
|
+
// 5d. Token budget trimming — keep highest-scored results that fit within budget
|
|
164
|
+
if (options.tokenBudget && options.tokenBudget > 0) {
|
|
165
|
+
let tokenCount = 0;
|
|
166
|
+
const budgetResults = [];
|
|
167
|
+
for (const r of dedupedResults) {
|
|
168
|
+
// Rough token estimate: content chars / 4, plus sourceChunk if present
|
|
169
|
+
const factTokens = Math.ceil(r.fact.content.length / 4) +
|
|
170
|
+
(r.fact.sourceChunk ? Math.ceil(r.fact.sourceChunk.length / 4) : 0);
|
|
171
|
+
if (tokenCount + factTokens > options.tokenBudget)
|
|
172
|
+
break;
|
|
173
|
+
tokenCount += factTokens;
|
|
174
|
+
budgetResults.push(r);
|
|
175
|
+
}
|
|
176
|
+
dedupedResults = budgetResults;
|
|
177
|
+
}
|
|
178
|
+
// 6. Enrich with contradiction context
|
|
179
|
+
let results = await surfaceContradictions(config.storage, options.tenantId, dedupedResults);
|
|
180
|
+
console.error(`[steno-search] Fusion + dedup: ${Date.now() - t1}ms, Total: ${Date.now() - startTime}ms`);
|
|
181
|
+
// 6. Optionally enrich with graph context
|
|
182
|
+
if (options.includeGraph) {
|
|
183
|
+
for (const result of results) {
|
|
184
|
+
const entities = await config.storage.getEntitiesForFact(result.fact.id);
|
|
185
|
+
const edges = [];
|
|
186
|
+
for (const entity of entities) {
|
|
187
|
+
const entityEdges = await config.storage.getEdgesForEntity(options.tenantId, entity.id);
|
|
188
|
+
edges.push(...entityEdges);
|
|
189
|
+
}
|
|
190
|
+
result.graph = { entities, edges };
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// 7. Optionally enrich with fact history (previous versions)
|
|
194
|
+
if (options.includeHistory) {
|
|
195
|
+
for (const result of results) {
|
|
196
|
+
const history = await config.storage.getFactsByLineage(options.tenantId, result.fact.lineageId);
|
|
197
|
+
// Filter out the current fact, sort by version ascending
|
|
198
|
+
result.history = history
|
|
199
|
+
.filter(f => f.id !== result.fact.id)
|
|
200
|
+
.sort((a, b) => a.version - b.version);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// 8. Record memory accesses for metamemory + update decay scores (fire-and-forget)
|
|
204
|
+
void recordAccesses(config.storage, options.tenantId, options.query, results, {
|
|
205
|
+
halfLifeDays: config.salienceHalfLifeDays,
|
|
206
|
+
normalizationK: config.salienceNormalizationK,
|
|
207
|
+
}).catch(err => console.error('[steno] Failed to record memory accesses:', err));
|
|
208
|
+
return {
|
|
209
|
+
results,
|
|
210
|
+
triggersMatched,
|
|
211
|
+
totalCandidates: allCandidates.length,
|
|
212
|
+
durationMs: Date.now() - startTime,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
/** Fast cosine similarity for pre-fusion reranking */
|
|
216
|
+
function cosineSim(a, b) {
|
|
217
|
+
if (a.length !== b.length || a.length === 0)
|
|
218
|
+
return 0;
|
|
219
|
+
let dot = 0, normA = 0, normB = 0;
|
|
220
|
+
for (let i = 0; i < a.length; i++) {
|
|
221
|
+
dot += a[i] * b[i];
|
|
222
|
+
normA += a[i] * a[i];
|
|
223
|
+
normB += b[i] * b[i];
|
|
224
|
+
}
|
|
225
|
+
const denom = Math.sqrt(normA) * Math.sqrt(normB);
|
|
226
|
+
return denom === 0 ? 0 : dot / denom;
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["search.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Candidate } from './types.js';
|
|
2
|
+
export interface TimeReference {
|
|
3
|
+
year?: number;
|
|
4
|
+
month?: number;
|
|
5
|
+
day?: number;
|
|
6
|
+
ordering?: 'first' | 'last';
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Extract temporal references from a search query.
|
|
10
|
+
* Returns null if query has no temporal component.
|
|
11
|
+
*/
|
|
12
|
+
export declare function extractTimeReference(query: string): TimeReference | null;
|
|
13
|
+
/**
|
|
14
|
+
* Score candidates by temporal proximity to the query's time reference.
|
|
15
|
+
* Mutates candidates in place, setting their `temporalScore`.
|
|
16
|
+
*/
|
|
17
|
+
export declare function scoreTemporalRelevance(candidates: Candidate[], timeRef: TimeReference): void;
|
|
18
|
+
//# sourceMappingURL=temporal-scorer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"temporal-scorer.d.ts","sourceRoot":"","sources":["temporal-scorer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAC7B;AAWD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CA8CxE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAoC5F"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
const MONTH_NAMES = [
|
|
2
|
+
'january', 'february', 'march', 'april', 'may', 'june',
|
|
3
|
+
'july', 'august', 'september', 'october', 'november', 'december',
|
|
4
|
+
];
|
|
5
|
+
const MONTH_ABBR = [
|
|
6
|
+
'jan', 'feb', 'mar', 'apr', 'may', 'jun',
|
|
7
|
+
'jul', 'aug', 'sep', 'oct', 'nov', 'dec',
|
|
8
|
+
];
|
|
9
|
+
/**
|
|
10
|
+
* Extract temporal references from a search query.
|
|
11
|
+
* Returns null if query has no temporal component.
|
|
12
|
+
*/
|
|
13
|
+
export function extractTimeReference(query) {
|
|
14
|
+
const lower = query.toLowerCase();
|
|
15
|
+
let ordering;
|
|
16
|
+
if (/\bfirst\b/.test(lower))
|
|
17
|
+
ordering = 'first';
|
|
18
|
+
if (/\blast\b/.test(lower) && !/\blast\s+(week|month|year)\b/.test(lower))
|
|
19
|
+
ordering = 'last';
|
|
20
|
+
// Try explicit date: "March 15th", "March 15, 2023"
|
|
21
|
+
for (let i = 0; i < MONTH_NAMES.length; i++) {
|
|
22
|
+
const name = MONTH_NAMES[i];
|
|
23
|
+
const abbr = MONTH_ABBR[i];
|
|
24
|
+
const monthPattern = new RegExp(`(?:${name}|${abbr})\\.?\\s+(\\d{1,2})(?:st|nd|rd|th)?(?:[,\\s]+(\\d{4}))?`, 'i');
|
|
25
|
+
const match = lower.match(monthPattern);
|
|
26
|
+
if (match) {
|
|
27
|
+
return { month: i, day: parseInt(match[1], 10), year: match[2] ? parseInt(match[2], 10) : undefined, ordering };
|
|
28
|
+
}
|
|
29
|
+
const reversePattern = new RegExp(`(\\d{1,2})(?:st|nd|rd|th)?\\s+(?:${name}|${abbr})(?:[,\\s]+(\\d{4}))?`, 'i');
|
|
30
|
+
const revMatch = lower.match(reversePattern);
|
|
31
|
+
if (revMatch) {
|
|
32
|
+
return { month: i, day: parseInt(revMatch[1], 10), year: revMatch[2] ? parseInt(revMatch[2], 10) : undefined, ordering };
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// Month-only: "in February", "during March"
|
|
36
|
+
for (let i = 0; i < MONTH_NAMES.length; i++) {
|
|
37
|
+
if (lower.includes(MONTH_NAMES[i]) || lower.includes(MONTH_ABBR[i])) {
|
|
38
|
+
return { month: i, ordering };
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Relative: "yesterday", "last week", "last month"
|
|
42
|
+
if (/\byesterday\b/.test(lower)) {
|
|
43
|
+
const d = new Date();
|
|
44
|
+
d.setDate(d.getDate() - 1);
|
|
45
|
+
return { year: d.getFullYear(), month: d.getMonth(), day: d.getDate(), ordering };
|
|
46
|
+
}
|
|
47
|
+
if (/\blast\s+week\b/.test(lower)) {
|
|
48
|
+
const d = new Date();
|
|
49
|
+
d.setDate(d.getDate() - 7);
|
|
50
|
+
return { year: d.getFullYear(), month: d.getMonth(), day: d.getDate(), ordering };
|
|
51
|
+
}
|
|
52
|
+
if (/\blast\s+month\b/.test(lower)) {
|
|
53
|
+
const d = new Date();
|
|
54
|
+
d.setMonth(d.getMonth() - 1);
|
|
55
|
+
return { year: d.getFullYear(), month: d.getMonth(), ordering };
|
|
56
|
+
}
|
|
57
|
+
if (ordering)
|
|
58
|
+
return { ordering };
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Score candidates by temporal proximity to the query's time reference.
|
|
63
|
+
* Mutates candidates in place, setting their `temporalScore`.
|
|
64
|
+
*/
|
|
65
|
+
export function scoreTemporalRelevance(candidates, timeRef) {
|
|
66
|
+
// For ordering queries ("which first/last"), score by eventDate order
|
|
67
|
+
if (timeRef.ordering && !timeRef.month && !timeRef.day && !timeRef.year) {
|
|
68
|
+
const withDates = candidates.filter(c => c.fact.eventDate != null);
|
|
69
|
+
if (withDates.length === 0)
|
|
70
|
+
return;
|
|
71
|
+
withDates.sort((a, b) => {
|
|
72
|
+
const aDate = new Date(a.fact.eventDate).getTime();
|
|
73
|
+
const bDate = new Date(b.fact.eventDate).getTime();
|
|
74
|
+
return timeRef.ordering === 'first' ? aDate - bDate : bDate - aDate;
|
|
75
|
+
});
|
|
76
|
+
for (let i = 0; i < withDates.length; i++) {
|
|
77
|
+
withDates[i].temporalScore = 1.0 - (i / withDates.length);
|
|
78
|
+
}
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
// For date-proximity queries, score by distance to reference date
|
|
82
|
+
const now = new Date();
|
|
83
|
+
const refDate = new Date(timeRef.year ?? now.getFullYear(), timeRef.month ?? 0, timeRef.day ?? 15);
|
|
84
|
+
const refTime = refDate.getTime();
|
|
85
|
+
let maxDistance = 0;
|
|
86
|
+
for (const c of candidates) {
|
|
87
|
+
const eventDate = c.fact.eventDate ?? c.fact.documentDate;
|
|
88
|
+
if (!eventDate)
|
|
89
|
+
continue;
|
|
90
|
+
const dist = Math.abs(new Date(eventDate).getTime() - refTime);
|
|
91
|
+
if (dist > maxDistance)
|
|
92
|
+
maxDistance = dist;
|
|
93
|
+
}
|
|
94
|
+
if (maxDistance === 0)
|
|
95
|
+
return;
|
|
96
|
+
for (const c of candidates) {
|
|
97
|
+
const eventDate = c.fact.eventDate ?? c.fact.documentDate;
|
|
98
|
+
if (!eventDate) {
|
|
99
|
+
c.temporalScore = 0;
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
const dist = Math.abs(new Date(eventDate).getTime() - refTime);
|
|
103
|
+
c.temporalScore = 1.0 - (dist / maxDistance);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=temporal-scorer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"temporal-scorer.js","sourceRoot":"","sources":["temporal-scorer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trigger-matcher.d.ts","sourceRoot":"","sources":["trigger-matcher.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,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAG7D,wBAAsB,aAAa,CACjC,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,gBAAgB,EAC3B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,UAAU,EAAE,SAAS,EAAE,CAAC;IAAC,eAAe,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"trigger-matcher.d.ts","sourceRoot":"","sources":["trigger-matcher.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,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAG7D,wBAAsB,aAAa,CACjC,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,gBAAgB,EAC3B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,UAAU,EAAE,SAAS,EAAE,CAAC;IAAC,eAAe,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAgFjE;AAED,sDAAsD;AACtD,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,gBAAgB,EAC3B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE;IACP,OAAO,EAAE,cAAc,CAAC;IACxB,SAAS,EAAE,gBAAgB,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB,GACA,OAAO,CAAC,OAAO,CAAC,CA2DlB;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAYjE"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { vectorSearch } from './vector-search.js';
|
|
2
|
+
export async function matchTriggers(storage, embedding, query, tenantId, scope, scopeId) {
|
|
3
|
+
// 1. Get active triggers, sorted by priority descending
|
|
4
|
+
const triggers = await storage.getActiveTriggers(tenantId, scope, scopeId);
|
|
5
|
+
// triggers should already be sorted by priority DESC from storage
|
|
6
|
+
const candidates = [];
|
|
7
|
+
const triggersMatched = [];
|
|
8
|
+
// 2. Evaluate each trigger
|
|
9
|
+
for (const trigger of triggers) {
|
|
10
|
+
const matches = await evaluateCondition(trigger.condition, query, {
|
|
11
|
+
storage,
|
|
12
|
+
embedding,
|
|
13
|
+
tenantId,
|
|
14
|
+
scope,
|
|
15
|
+
scopeId,
|
|
16
|
+
});
|
|
17
|
+
if (matches) {
|
|
18
|
+
triggersMatched.push(trigger.id);
|
|
19
|
+
// Surface facts from factIds (batch fetch)
|
|
20
|
+
if (trigger.factIds && trigger.factIds.length > 0) {
|
|
21
|
+
const facts = await storage.getFactsByIds(tenantId, trigger.factIds);
|
|
22
|
+
for (const fact of facts) {
|
|
23
|
+
if (fact.validUntil === null) {
|
|
24
|
+
candidates.push({
|
|
25
|
+
fact,
|
|
26
|
+
vectorScore: 0,
|
|
27
|
+
keywordScore: 0,
|
|
28
|
+
graphScore: 0,
|
|
29
|
+
recencyScore: 0,
|
|
30
|
+
salienceScore: 0,
|
|
31
|
+
temporalScore: 0,
|
|
32
|
+
source: 'trigger',
|
|
33
|
+
triggeredBy: trigger.id,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// Surface facts for entityIds
|
|
39
|
+
if (trigger.entityIds && trigger.entityIds.length > 0) {
|
|
40
|
+
for (const entityId of trigger.entityIds) {
|
|
41
|
+
const result = await storage.getFactsForEntity(tenantId, entityId, { limit: 10 });
|
|
42
|
+
for (const fact of result.data) {
|
|
43
|
+
if (fact.validUntil === null) {
|
|
44
|
+
candidates.push({
|
|
45
|
+
fact,
|
|
46
|
+
vectorScore: 0,
|
|
47
|
+
keywordScore: 0,
|
|
48
|
+
graphScore: 0,
|
|
49
|
+
recencyScore: 0,
|
|
50
|
+
salienceScore: 0,
|
|
51
|
+
temporalScore: 0,
|
|
52
|
+
source: 'trigger',
|
|
53
|
+
triggeredBy: trigger.id,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Handle queryTemplate — run a vector sub-search with the template
|
|
60
|
+
if (trigger.queryTemplate) {
|
|
61
|
+
const templateResults = await vectorSearch(storage, embedding, trigger.queryTemplate, tenantId, scope, scopeId, 5);
|
|
62
|
+
for (const c of templateResults) {
|
|
63
|
+
candidates.push({ ...c, source: 'trigger', triggeredBy: trigger.id });
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Increment trigger fire count (fire and forget)
|
|
67
|
+
void storage.incrementTriggerFired(tenantId, trigger.id).catch(() => { });
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return { candidates, triggersMatched };
|
|
71
|
+
}
|
|
72
|
+
/** Evaluate a trigger condition against query text */
|
|
73
|
+
export async function evaluateCondition(condition, query, context) {
|
|
74
|
+
const lowerQuery = query.toLowerCase();
|
|
75
|
+
// AND: all sub-conditions must match (checked first — if present, only AND logic applies)
|
|
76
|
+
if (condition.AND && condition.AND.length > 0) {
|
|
77
|
+
const results = await Promise.all(condition.AND.map((sub) => evaluateCondition(sub, query, context)));
|
|
78
|
+
return results.every(Boolean);
|
|
79
|
+
}
|
|
80
|
+
// OR: any sub-condition must match (checked second — if present, only OR logic applies)
|
|
81
|
+
if (condition.OR && condition.OR.length > 0) {
|
|
82
|
+
const results = await Promise.all(condition.OR.map((sub) => evaluateCondition(sub, query, context)));
|
|
83
|
+
return results.some(Boolean);
|
|
84
|
+
}
|
|
85
|
+
// topic_match: any topic word appears in query
|
|
86
|
+
if (condition.topic_match && condition.topic_match.length > 0) {
|
|
87
|
+
if (condition.topic_match.some((topic) => lowerQuery.includes(topic.toLowerCase()))) {
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// keyword_any: any keyword appears in query
|
|
92
|
+
if (condition.keyword_any && condition.keyword_any.length > 0) {
|
|
93
|
+
if (condition.keyword_any.some((kw) => lowerQuery.includes(kw.toLowerCase()))) {
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// entity_present: check if entities of given type(s) exist for this tenant
|
|
98
|
+
// NOTE: entity_present currently checks tenant-wide, not scope-specific.
|
|
99
|
+
// A scope-filtered version would require joining through fact_entities → facts.
|
|
100
|
+
// This is acceptable for v1 but should be improved when per-scope entity queries are added.
|
|
101
|
+
if (condition.entity_present && condition.entity_present.length > 0) {
|
|
102
|
+
const entities = await context.storage.getEntitiesForTenant(context.tenantId, { limit: 100 });
|
|
103
|
+
const hasMatchingEntity = entities.data.some((e) => condition.entity_present.some((type) => e.entityType.toLowerCase() === type.toLowerCase()));
|
|
104
|
+
if (hasMatchingEntity)
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
// semantic_similarity: embed both texts and compare
|
|
108
|
+
if (condition.semantic_similarity) {
|
|
109
|
+
const { text, threshold } = condition.semantic_similarity;
|
|
110
|
+
const [queryEmb, condEmb] = await Promise.all([
|
|
111
|
+
context.embedding.embed(query),
|
|
112
|
+
context.embedding.embed(text),
|
|
113
|
+
]);
|
|
114
|
+
const similarity = cosineSimilarity(queryEmb, condEmb);
|
|
115
|
+
if (similarity >= threshold)
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
export function cosineSimilarity(a, b) {
|
|
121
|
+
if (a.length !== b.length || a.length === 0)
|
|
122
|
+
return 0;
|
|
123
|
+
let dot = 0;
|
|
124
|
+
let normA = 0;
|
|
125
|
+
let normB = 0;
|
|
126
|
+
for (let i = 0; i < a.length; i++) {
|
|
127
|
+
dot += a[i] * b[i];
|
|
128
|
+
normA += a[i] * a[i];
|
|
129
|
+
normB += b[i] * b[i];
|
|
130
|
+
}
|
|
131
|
+
const denom = Math.sqrt(normA) * Math.sqrt(normB);
|
|
132
|
+
return denom === 0 ? 0 : dot / denom;
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=trigger-matcher.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trigger-matcher.js","sourceRoot":"","sources":["trigger-matcher.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"trigger-matcher.js","sourceRoot":"","sources":["trigger-matcher.ts"],"names":[],"mappings":"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"}
|