@kybernesis/brain-core 0.1.0
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/claude-call.d.ts +37 -0
- package/dist/claude-call.d.ts.map +1 -0
- package/dist/claude-call.js +55 -0
- package/dist/claude-call.js.map +1 -0
- package/dist/entity-graph.d.ts +79 -0
- package/dist/entity-graph.d.ts.map +1 -0
- package/dist/entity-graph.js +611 -0
- package/dist/entity-graph.js.map +1 -0
- package/dist/fact-contradiction.d.ts +25 -0
- package/dist/fact-contradiction.d.ts.map +1 -0
- package/dist/fact-contradiction.js +109 -0
- package/dist/fact-contradiction.js.map +1 -0
- package/dist/fact-extractor.d.ts +26 -0
- package/dist/fact-extractor.d.ts.map +1 -0
- package/dist/fact-extractor.js +98 -0
- package/dist/fact-extractor.js.map +1 -0
- package/dist/fact-retrieval.d.ts +51 -0
- package/dist/fact-retrieval.d.ts.map +1 -0
- package/dist/fact-retrieval.js +401 -0
- package/dist/fact-retrieval.js.map +1 -0
- package/dist/fact-store.d.ts +26 -0
- package/dist/fact-store.d.ts.map +1 -0
- package/dist/fact-store.js +181 -0
- package/dist/fact-store.js.map +1 -0
- package/dist/fact-temporal.d.ts +20 -0
- package/dist/fact-temporal.d.ts.map +1 -0
- package/dist/fact-temporal.js +79 -0
- package/dist/fact-temporal.js.map +1 -0
- package/dist/fts-sanitizer.d.ts +32 -0
- package/dist/fts-sanitizer.d.ts.map +1 -0
- package/dist/fts-sanitizer.js +61 -0
- package/dist/fts-sanitizer.js.map +1 -0
- package/dist/hybrid-search.d.ts +44 -0
- package/dist/hybrid-search.d.ts.map +1 -0
- package/dist/hybrid-search.js +410 -0
- package/dist/hybrid-search.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/ops.d.ts +28 -0
- package/dist/ops.d.ts.map +1 -0
- package/dist/ops.js +307 -0
- package/dist/ops.js.map +1 -0
- package/dist/queue.d.ts +13 -0
- package/dist/queue.d.ts.map +1 -0
- package/dist/queue.js +28 -0
- package/dist/queue.js.map +1 -0
- package/dist/relationship-extractor.d.ts +38 -0
- package/dist/relationship-extractor.d.ts.map +1 -0
- package/dist/relationship-extractor.js +119 -0
- package/dist/relationship-extractor.js.map +1 -0
- package/dist/sleep/config.d.ts +47 -0
- package/dist/sleep/config.d.ts.map +1 -0
- package/dist/sleep/config.js +46 -0
- package/dist/sleep/config.js.map +1 -0
- package/dist/sleep/db.d.ts +16 -0
- package/dist/sleep/db.d.ts.map +1 -0
- package/dist/sleep/db.js +114 -0
- package/dist/sleep/db.js.map +1 -0
- package/dist/sleep/index.d.ts +69 -0
- package/dist/sleep/index.d.ts.map +1 -0
- package/dist/sleep/index.js +99 -0
- package/dist/sleep/index.js.map +1 -0
- package/dist/sleep/steps/consolidate.d.ts +19 -0
- package/dist/sleep/steps/consolidate.d.ts.map +1 -0
- package/dist/sleep/steps/consolidate.js +74 -0
- package/dist/sleep/steps/consolidate.js.map +1 -0
- package/dist/sleep/steps/decay.d.ts +19 -0
- package/dist/sleep/steps/decay.d.ts.map +1 -0
- package/dist/sleep/steps/decay.js +121 -0
- package/dist/sleep/steps/decay.js.map +1 -0
- package/dist/sleep/steps/entity-hygiene.d.ts +29 -0
- package/dist/sleep/steps/entity-hygiene.d.ts.map +1 -0
- package/dist/sleep/steps/entity-hygiene.js +452 -0
- package/dist/sleep/steps/entity-hygiene.js.map +1 -0
- package/dist/sleep/steps/link.d.ts +20 -0
- package/dist/sleep/steps/link.d.ts.map +1 -0
- package/dist/sleep/steps/link.js +216 -0
- package/dist/sleep/steps/link.js.map +1 -0
- package/dist/sleep/steps/observe.d.ts +17 -0
- package/dist/sleep/steps/observe.d.ts.map +1 -0
- package/dist/sleep/steps/observe.js +192 -0
- package/dist/sleep/steps/observe.js.map +1 -0
- package/dist/sleep/steps/profile.d.ts +15 -0
- package/dist/sleep/steps/profile.d.ts.map +1 -0
- package/dist/sleep/steps/profile.js +26 -0
- package/dist/sleep/steps/profile.js.map +1 -0
- package/dist/sleep/steps/reasoning.d.ts +19 -0
- package/dist/sleep/steps/reasoning.d.ts.map +1 -0
- package/dist/sleep/steps/reasoning.js +173 -0
- package/dist/sleep/steps/reasoning.js.map +1 -0
- package/dist/sleep/steps/summarize.d.ts +21 -0
- package/dist/sleep/steps/summarize.d.ts.map +1 -0
- package/dist/sleep/steps/summarize.js +206 -0
- package/dist/sleep/steps/summarize.js.map +1 -0
- package/dist/sleep/steps/tag.d.ts +16 -0
- package/dist/sleep/steps/tag.d.ts.map +1 -0
- package/dist/sleep/steps/tag.js +84 -0
- package/dist/sleep/steps/tag.js.map +1 -0
- package/dist/sleep/steps/tier.d.ts +18 -0
- package/dist/sleep/steps/tier.d.ts.map +1 -0
- package/dist/sleep/steps/tier.js +112 -0
- package/dist/sleep/steps/tier.js.map +1 -0
- package/dist/sleep/utils/checkpoint.d.ts +11 -0
- package/dist/sleep/utils/checkpoint.d.ts.map +1 -0
- package/dist/sleep/utils/checkpoint.js +26 -0
- package/dist/sleep/utils/checkpoint.js.map +1 -0
- package/dist/sleep/utils/jaccard.d.ts +7 -0
- package/dist/sleep/utils/jaccard.d.ts.map +1 -0
- package/dist/sleep/utils/jaccard.js +19 -0
- package/dist/sleep/utils/jaccard.js.map +1 -0
- package/dist/store-conversation.d.ts +29 -0
- package/dist/store-conversation.d.ts.map +1 -0
- package/dist/store-conversation.js +227 -0
- package/dist/store-conversation.js.map +1 -0
- package/dist/timeline.d.ts +50 -0
- package/dist/timeline.d.ts.map +1 -0
- package/dist/timeline.js +389 -0
- package/dist/timeline.js.map +1 -0
- package/dist/user-profile.d.ts +30 -0
- package/dist/user-profile.d.ts.map +1 -0
- package/dist/user-profile.js +147 -0
- package/dist/user-profile.js.map +1 -0
- package/dist/vectors.d.ts +56 -0
- package/dist/vectors.d.ts.map +1 -0
- package/dist/vectors.js +132 -0
- package/dist/vectors.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hybrid search — port of KAD's hybrid-search.ts.
|
|
3
|
+
*
|
|
4
|
+
* Combines semantic search (vectors), keyword search (FTS5), and temporal
|
|
5
|
+
* search. Uses Reciprocal Rank Fusion (RRF k=60) to merge ranked lists.
|
|
6
|
+
*
|
|
7
|
+
* Bug Fix #3: the null `getSleepDb` stub that made sleep-edge enrichment
|
|
8
|
+
* dead code has been deleted. Uses `getDb(t, 'sleep')` directly.
|
|
9
|
+
*/
|
|
10
|
+
import { getDb } from '@kybernesis/brain-storage-sqlite';
|
|
11
|
+
import { semanticSearch } from './vectors.js';
|
|
12
|
+
import { callClaude } from './claude-call.js';
|
|
13
|
+
// ─── RRF ─────────────────────────────────────────────────────────────────────
|
|
14
|
+
function reciprocalRankFusion(lists, k = 60) {
|
|
15
|
+
const fused = new Map();
|
|
16
|
+
for (const list of lists) {
|
|
17
|
+
const sorted = [...list].sort((a, b) => b.score - a.score);
|
|
18
|
+
for (let rank = 0; rank < sorted.length; rank++) {
|
|
19
|
+
const item = sorted[rank];
|
|
20
|
+
const contribution = 1 / (k + rank + 1);
|
|
21
|
+
const existing = fused.get(item.source_path);
|
|
22
|
+
if (existing) {
|
|
23
|
+
existing.rrfScore += contribution;
|
|
24
|
+
if (item.data['content'] && String(item.data['content']).length > String(existing.data['content'] ?? '').length) {
|
|
25
|
+
Object.assign(existing.data, item.data);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
fused.set(item.source_path, { rrfScore: contribution, data: { ...item.data } });
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return fused;
|
|
34
|
+
}
|
|
35
|
+
// ─── Temporal search channel ──────────────────────────────────────────────────
|
|
36
|
+
async function temporalSearch(t, query, limit) {
|
|
37
|
+
const datePatterns = [
|
|
38
|
+
/\b(january|february|march|april|may|june|july|august|september|october|november|december)\b/gi,
|
|
39
|
+
/\b(20\d{2})\b/g,
|
|
40
|
+
/\b(\d{1,2})\s+(january|february|march|april|may|june|july|august|september|october|november|december)/gi,
|
|
41
|
+
];
|
|
42
|
+
const dateTerms = [];
|
|
43
|
+
for (const p of datePatterns) {
|
|
44
|
+
const m = query.match(p);
|
|
45
|
+
if (m)
|
|
46
|
+
dateTerms.push(...m);
|
|
47
|
+
}
|
|
48
|
+
if (dateTerms.length === 0)
|
|
49
|
+
return [];
|
|
50
|
+
const db = getDb(t, 'timeline');
|
|
51
|
+
const results = [];
|
|
52
|
+
for (const term of dateTerms) {
|
|
53
|
+
try {
|
|
54
|
+
const rows = db.prepare(`
|
|
55
|
+
SELECT id, title, summary, source_path, timestamp, type
|
|
56
|
+
FROM timeline_events
|
|
57
|
+
WHERE LOWER(title) LIKE ? OR LOWER(summary) LIKE ?
|
|
58
|
+
ORDER BY timestamp DESC LIMIT ?
|
|
59
|
+
`).all(`%${term.toLowerCase()}%`, `%${term.toLowerCase()}%`, limit);
|
|
60
|
+
for (const row of rows) {
|
|
61
|
+
results.push({
|
|
62
|
+
source_path: row.source_path,
|
|
63
|
+
score: 1.0,
|
|
64
|
+
data: {
|
|
65
|
+
id: String(row.id), title: row.title, content: row.summary || '',
|
|
66
|
+
source_path: row.source_path, timestamp: row.timestamp, type: row.type,
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch { /* best-effort */ }
|
|
72
|
+
}
|
|
73
|
+
return results;
|
|
74
|
+
}
|
|
75
|
+
// ─── Haiku reranking (opt-in) ─────────────────────────────────────────────────
|
|
76
|
+
async function haikuRerank(query, candidates, limit) {
|
|
77
|
+
if (candidates.length <= 3)
|
|
78
|
+
return candidates;
|
|
79
|
+
const toRerank = candidates.slice(0, Math.min(20, candidates.length));
|
|
80
|
+
const numbered = toRerank.map((r, i) => `[${i + 1}] ${r.content.slice(0, 200)}`).join('\n');
|
|
81
|
+
const prompt = `Given the search query, rank these ${toRerank.length} text passages by relevance. Return ONLY a JSON array of the passage numbers in order of relevance, most relevant first. Example: [3, 1, 7, 2]
|
|
82
|
+
|
|
83
|
+
Query: "${query}"
|
|
84
|
+
|
|
85
|
+
Passages:
|
|
86
|
+
${numbered}
|
|
87
|
+
|
|
88
|
+
Ranking (JSON array of numbers):`;
|
|
89
|
+
try {
|
|
90
|
+
const response = await callClaude(prompt, { maxTokens: 200 });
|
|
91
|
+
if (!response)
|
|
92
|
+
return candidates;
|
|
93
|
+
const match = response.match(/\[[\d,\s]+\]/);
|
|
94
|
+
if (!match)
|
|
95
|
+
return candidates;
|
|
96
|
+
const ranking = JSON.parse(match[0]);
|
|
97
|
+
const reranked = [];
|
|
98
|
+
for (const idx of ranking) {
|
|
99
|
+
const i = idx - 1;
|
|
100
|
+
if (i >= 0 && i < toRerank.length) {
|
|
101
|
+
const r = toRerank[i];
|
|
102
|
+
r.hybridScore = 1.0 - reranked.length * 0.05;
|
|
103
|
+
reranked.push(r);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
for (const c of toRerank) {
|
|
107
|
+
if (!reranked.includes(c)) {
|
|
108
|
+
c.hybridScore = 0.1;
|
|
109
|
+
reranked.push(c);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
reranked.push(...candidates.slice(20));
|
|
113
|
+
return reranked.slice(0, limit);
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
console.warn('[brain-core/hybrid-search] rerank failed, returning unranked', { err: String(err) });
|
|
117
|
+
return candidates;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// ─── Query expansion ──────────────────────────────────────────────────────────
|
|
121
|
+
function expandQueryTerms(query) {
|
|
122
|
+
const stopwords = new Set([
|
|
123
|
+
'what', 'when', 'where', 'who', 'how', 'does', 'did', 'is', 'was',
|
|
124
|
+
'are', 'were', 'the', 'a', 'an', 'in', 'on', 'at', 'to', 'for',
|
|
125
|
+
'of', 'with', 'has', 'have', 'had', 'do', 'from', 'about', 'been',
|
|
126
|
+
'they', 'this', 'that', 'would', 'could', 'should', 'which', 'will',
|
|
127
|
+
'can', 'but', 'not', 'all', 'her', 'his', 'its', 'our', 'your',
|
|
128
|
+
]);
|
|
129
|
+
const words = query.toLowerCase().replace(/[?.,!'"]/g, '').split(/\s+/)
|
|
130
|
+
.filter(w => w.length >= 3 && !stopwords.has(w));
|
|
131
|
+
if (words.length <= 3)
|
|
132
|
+
return [query];
|
|
133
|
+
const subs = [query];
|
|
134
|
+
for (let i = 0; i < words.length && subs.length < 5; i++) {
|
|
135
|
+
for (let j = i + 1; j < words.length && j < i + 3 && subs.length < 5; j++) {
|
|
136
|
+
subs.push(`${words[i]} ${words[j]}`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return subs;
|
|
140
|
+
}
|
|
141
|
+
function metadataSearch(t, query, limit) {
|
|
142
|
+
const db = getDb(t, 'timeline');
|
|
143
|
+
const words = query.toLowerCase().split(/\s+/).filter(w => w.length >= 3);
|
|
144
|
+
if (words.length === 0)
|
|
145
|
+
return [];
|
|
146
|
+
const ftsQuery = words.join(' OR ');
|
|
147
|
+
let candidates = [];
|
|
148
|
+
try {
|
|
149
|
+
candidates = db.prepare(`
|
|
150
|
+
SELECT t.id, t.source_path, t.title, t.summary, t.type, t.timestamp,
|
|
151
|
+
t.tier, t.priority, t.tags_json
|
|
152
|
+
FROM timeline_events t
|
|
153
|
+
JOIN timeline_fts fts ON t.id = fts.rowid
|
|
154
|
+
WHERE timeline_fts MATCH ? ORDER BY rank LIMIT ?
|
|
155
|
+
`).all(ftsQuery, limit);
|
|
156
|
+
}
|
|
157
|
+
catch { /* FTS query failed (e.g. bad token) — candidates stays [] */ }
|
|
158
|
+
return candidates.map(r => {
|
|
159
|
+
let score = 0;
|
|
160
|
+
const titleL = (r.title || '').toLowerCase();
|
|
161
|
+
const summaryL = (r.summary || '').toLowerCase();
|
|
162
|
+
const parsed = JSON.parse(r.tags_json || '[]');
|
|
163
|
+
const tags = (Array.isArray(parsed) ? parsed :
|
|
164
|
+
(typeof parsed === 'string' ? parsed.split(',').map((s) => s.trim()) : [])).map((t) => t.toLowerCase());
|
|
165
|
+
for (const w of words) {
|
|
166
|
+
if (titleL === w)
|
|
167
|
+
score += 10;
|
|
168
|
+
else if (titleL.includes(w))
|
|
169
|
+
score += 5;
|
|
170
|
+
if (tags.includes(w))
|
|
171
|
+
score += 8;
|
|
172
|
+
else if (tags.some(t => t.includes(w)))
|
|
173
|
+
score += 4;
|
|
174
|
+
if (summaryL.includes(w))
|
|
175
|
+
score += 2;
|
|
176
|
+
}
|
|
177
|
+
score *= 1 + (r.priority || 0.5);
|
|
178
|
+
if (r.tier === 'hot')
|
|
179
|
+
score *= 1.2;
|
|
180
|
+
else if (r.tier === 'archive')
|
|
181
|
+
score *= 0.8;
|
|
182
|
+
return {
|
|
183
|
+
id: r.id, source_path: r.source_path, title: r.title, summary: r.summary,
|
|
184
|
+
type: r.type, timestamp: r.timestamp, tier: r.tier || 'warm',
|
|
185
|
+
priority: r.priority || 0.5, tags, score,
|
|
186
|
+
};
|
|
187
|
+
}).sort((a, b) => b.score - a.score);
|
|
188
|
+
}
|
|
189
|
+
// ─── Sleep-edge enrichment (Bug Fix #3) ──────────────────────────────────────
|
|
190
|
+
function addRelatedMemories(t, results) {
|
|
191
|
+
// Bug Fix #3: use real getDb(t, 'sleep') — the null stub from KAD is gone.
|
|
192
|
+
// sleep.db may not exist yet (it's seeded by the sleep pipeline in Day 4).
|
|
193
|
+
// Open gracefully; if the DB has no memory_edges table the query simply
|
|
194
|
+
// returns [] and we pass through unchanged.
|
|
195
|
+
let sleep = null;
|
|
196
|
+
try {
|
|
197
|
+
sleep = getDb(t, 'sleep');
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
return results;
|
|
201
|
+
}
|
|
202
|
+
for (const result of results) {
|
|
203
|
+
try {
|
|
204
|
+
const related = sleep.prepare(`
|
|
205
|
+
SELECT
|
|
206
|
+
CASE WHEN from_path = ? THEN to_path ELSE from_path END as related_path,
|
|
207
|
+
confidence
|
|
208
|
+
FROM memory_edges
|
|
209
|
+
WHERE from_path = ? OR to_path = ?
|
|
210
|
+
ORDER BY confidence DESC LIMIT 3
|
|
211
|
+
`).all(result.source_path, result.source_path, result.source_path);
|
|
212
|
+
if (related.length > 0)
|
|
213
|
+
result.relatedMemories = related.map(r => r.related_path);
|
|
214
|
+
}
|
|
215
|
+
catch { /* memory_edges may not exist yet */ }
|
|
216
|
+
}
|
|
217
|
+
return results;
|
|
218
|
+
}
|
|
219
|
+
// ─── Enrichment ───────────────────────────────────────────────────────────────
|
|
220
|
+
function enrichResults(t, merged) {
|
|
221
|
+
const needs = Array.from(merged.values()).filter(r => !r.tier || !r.tags);
|
|
222
|
+
if (needs.length === 0)
|
|
223
|
+
return;
|
|
224
|
+
const db = getDb(t, 'timeline');
|
|
225
|
+
for (const result of needs) {
|
|
226
|
+
try {
|
|
227
|
+
const row = db.prepare(`
|
|
228
|
+
SELECT tier, priority, tags_json, entities_json FROM timeline_events WHERE source_path = ?
|
|
229
|
+
`).get(result.source_path);
|
|
230
|
+
if (row) {
|
|
231
|
+
result.tier = row.tier || 'warm';
|
|
232
|
+
result.priority = row.priority ?? 0.5;
|
|
233
|
+
const parsed = JSON.parse(row.tags_json || '[]');
|
|
234
|
+
result.tags = Array.isArray(parsed) ? parsed :
|
|
235
|
+
(typeof parsed === 'string' ? parsed.split(',').map((s) => s.trim()).filter(Boolean) : []);
|
|
236
|
+
result.hybridScore *= 1 + (result.priority || 0.5);
|
|
237
|
+
if (result.tier === 'hot')
|
|
238
|
+
result.hybridScore *= 1.2;
|
|
239
|
+
else if (result.tier === 'archive')
|
|
240
|
+
result.hybridScore *= 0.8;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
catch { /* non-critical */ }
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
// ─── Main ─────────────────────────────────────────────────────────────────────
|
|
247
|
+
export async function hybridSearch(t, query, options = {}) {
|
|
248
|
+
const { limit = 20, tier = 'all', minPriority = 0, includeRelated = true, type, entity, entityMatch = 'all', after, before, expandQuery = false, factFirst = false, rerank = false, } = options;
|
|
249
|
+
// Fact-first delegation
|
|
250
|
+
if (factFirst) {
|
|
251
|
+
const { factFirstSearch } = await import('./fact-retrieval.js');
|
|
252
|
+
const result = await factFirstSearch(t, query, { limit, tokenBudget: 4000, includeSupporting: true });
|
|
253
|
+
return result.facts.map(f => ({
|
|
254
|
+
id: String(f.id), title: `[${f.category}] ${f.content.slice(0, 80)}`,
|
|
255
|
+
content: f.content, source_path: `fact://${f.id}`, timestamp: f.timestamp,
|
|
256
|
+
type: 'note', semanticScore: f.score, metadataScore: 0,
|
|
257
|
+
hybridScore: f.score, matchType: 'semantic',
|
|
258
|
+
}));
|
|
259
|
+
}
|
|
260
|
+
const queries = expandQuery ? expandQueryTerms(query) : [query];
|
|
261
|
+
// Channel 1: semantic
|
|
262
|
+
let semanticResults = [];
|
|
263
|
+
for (const q of queries) {
|
|
264
|
+
try {
|
|
265
|
+
const r = await semanticSearch(t, q, { limit: limit * 3, type });
|
|
266
|
+
semanticResults.push(...r);
|
|
267
|
+
}
|
|
268
|
+
catch { /* semantic unavailable */ }
|
|
269
|
+
}
|
|
270
|
+
const seenPaths = new Map();
|
|
271
|
+
for (const r of semanticResults) {
|
|
272
|
+
const ex = seenPaths.get(r.metadata.source_path);
|
|
273
|
+
if (!ex || r.distance < ex.distance)
|
|
274
|
+
seenPaths.set(r.metadata.source_path, r);
|
|
275
|
+
}
|
|
276
|
+
semanticResults = Array.from(seenPaths.values());
|
|
277
|
+
const semanticList = semanticResults.map(r => ({
|
|
278
|
+
source_path: r.metadata.source_path,
|
|
279
|
+
score: 1 - r.distance,
|
|
280
|
+
data: {
|
|
281
|
+
id: r.id, title: r.metadata.title || 'Untitled', content: r.content,
|
|
282
|
+
source_path: r.metadata.source_path, timestamp: r.metadata.timestamp,
|
|
283
|
+
type: r.metadata.type,
|
|
284
|
+
},
|
|
285
|
+
}));
|
|
286
|
+
// Channel 2: metadata keyword
|
|
287
|
+
const metaResults = metadataSearch(t, query, limit * 3);
|
|
288
|
+
const metaList = metaResults.map(r => ({
|
|
289
|
+
source_path: r.source_path, score: r.score,
|
|
290
|
+
data: {
|
|
291
|
+
id: String(r.id), title: r.title, content: r.summary || '',
|
|
292
|
+
source_path: r.source_path, timestamp: r.timestamp, type: r.type,
|
|
293
|
+
tier: r.tier, priority: r.priority, tags: r.tags,
|
|
294
|
+
},
|
|
295
|
+
}));
|
|
296
|
+
// Channel 3: temporal
|
|
297
|
+
const temporalList = await temporalSearch(t, query, limit * 3);
|
|
298
|
+
// Channel 4: entity graph augmentation
|
|
299
|
+
const entityList = [];
|
|
300
|
+
if (expandQuery) {
|
|
301
|
+
try {
|
|
302
|
+
const db = getDb(t, 'timeline');
|
|
303
|
+
const entityDb = getDb(t, 'entityGraph');
|
|
304
|
+
const queryLower = query.toLowerCase();
|
|
305
|
+
const allEntities = entityDb.prepare('SELECT id, name FROM entities ORDER BY mention_count DESC LIMIT 100').all();
|
|
306
|
+
const matched = allEntities.filter(e => queryLower.includes(e.name.toLowerCase()) && e.name.length >= 3);
|
|
307
|
+
for (const ent of matched.slice(0, 3)) {
|
|
308
|
+
const mentions = entityDb.prepare('SELECT DISTINCT source_path FROM entity_mentions WHERE entity_id = ? ORDER BY timestamp DESC LIMIT 10').all(ent.id);
|
|
309
|
+
for (const m of mentions) {
|
|
310
|
+
const event = db.prepare('SELECT id, title, summary, source_path, timestamp, type FROM timeline_events WHERE source_path = ?').get(m.source_path);
|
|
311
|
+
if (event) {
|
|
312
|
+
entityList.push({
|
|
313
|
+
source_path: event.source_path, score: 0.8,
|
|
314
|
+
data: {
|
|
315
|
+
id: String(event.id), title: event.title || '', content: event.summary || '',
|
|
316
|
+
source_path: event.source_path, timestamp: event.timestamp, type: event.type,
|
|
317
|
+
},
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
catch (err) {
|
|
324
|
+
console.warn('[brain-core/hybrid-search] entity augmentation failed', { err: String(err) });
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
// RRF fusion
|
|
328
|
+
const rankedLists = [semanticList, metaList];
|
|
329
|
+
if (temporalList.length > 0)
|
|
330
|
+
rankedLists.push(temporalList);
|
|
331
|
+
if (entityList.length > 0)
|
|
332
|
+
rankedLists.push(entityList);
|
|
333
|
+
const fused = reciprocalRankFusion(rankedLists);
|
|
334
|
+
const semanticPaths = new Set(semanticList.map(r => r.source_path));
|
|
335
|
+
const metaPaths = new Set(metaList.map(r => r.source_path));
|
|
336
|
+
const merged = new Map();
|
|
337
|
+
for (const [sourcePath, { rrfScore, data }] of fused) {
|
|
338
|
+
const inS = semanticPaths.has(sourcePath);
|
|
339
|
+
const inM = metaPaths.has(sourcePath);
|
|
340
|
+
const matchType = inS && inM ? 'both' : inS ? 'semantic' : 'keyword';
|
|
341
|
+
merged.set(sourcePath, {
|
|
342
|
+
id: String(data['id'] ?? sourcePath), title: String(data['title'] ?? 'Untitled'),
|
|
343
|
+
content: String(data['content'] ?? ''), source_path: sourcePath,
|
|
344
|
+
timestamp: String(data['timestamp'] ?? ''), type: String(data['type'] ?? 'note'),
|
|
345
|
+
tier: data['tier'],
|
|
346
|
+
priority: data['priority'],
|
|
347
|
+
tags: data['tags'],
|
|
348
|
+
semanticScore: inS ? rrfScore : 0, metadataScore: inM ? rrfScore : 0,
|
|
349
|
+
hybridScore: rrfScore, matchType,
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
// Segment dedup (MAX_SEGMENTS_PER_PARENT = 3)
|
|
353
|
+
const parentCounts = new Map();
|
|
354
|
+
const toRemove = [];
|
|
355
|
+
const sorted = Array.from(merged.entries()).sort((a, b) => b[1].hybridScore - a[1].hybridScore);
|
|
356
|
+
for (const [sp] of sorted) {
|
|
357
|
+
const parent = sp.replace(/\/seg_\d+$/, '');
|
|
358
|
+
const count = parentCounts.get(parent) || 0;
|
|
359
|
+
if (count >= 3) {
|
|
360
|
+
toRemove.push(sp);
|
|
361
|
+
}
|
|
362
|
+
else {
|
|
363
|
+
parentCounts.set(parent, count + 1);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
for (const sp of toRemove)
|
|
367
|
+
merged.delete(sp);
|
|
368
|
+
// Enrich
|
|
369
|
+
enrichResults(t, merged);
|
|
370
|
+
// Filter + sort
|
|
371
|
+
let results = Array.from(merged.values()).filter(r => {
|
|
372
|
+
if (tier !== 'all' && r.tier && r.tier !== tier)
|
|
373
|
+
return false;
|
|
374
|
+
if (r.priority !== undefined && r.priority < minPriority)
|
|
375
|
+
return false;
|
|
376
|
+
if (type && r.type !== type)
|
|
377
|
+
return false;
|
|
378
|
+
if (entity) {
|
|
379
|
+
const targets = entity.split(',').map(e => e.trim().toLowerCase()).filter(Boolean);
|
|
380
|
+
const rTags = (r.tags || []).map(t => t.toLowerCase());
|
|
381
|
+
const titleL = r.title.toLowerCase();
|
|
382
|
+
const contentL = r.content.toLowerCase();
|
|
383
|
+
const matches = targets.map(tgt => rTags.some(t => t.includes(tgt)) || titleL.includes(tgt) || contentL.includes(tgt));
|
|
384
|
+
if (entityMatch === 'all' && !matches.every(Boolean))
|
|
385
|
+
return false;
|
|
386
|
+
if (entityMatch === 'any' && !matches.some(Boolean))
|
|
387
|
+
return false;
|
|
388
|
+
}
|
|
389
|
+
if (after || before) {
|
|
390
|
+
const ts = new Date(r.timestamp);
|
|
391
|
+
if (after && ts < after)
|
|
392
|
+
return false;
|
|
393
|
+
if (before && ts > before)
|
|
394
|
+
return false;
|
|
395
|
+
}
|
|
396
|
+
return true;
|
|
397
|
+
}).sort((a, b) => b.hybridScore - a.hybridScore);
|
|
398
|
+
if (rerank && results.length > 3) {
|
|
399
|
+
results = await haikuRerank(query, results, limit);
|
|
400
|
+
}
|
|
401
|
+
else {
|
|
402
|
+
results = results.slice(0, limit);
|
|
403
|
+
}
|
|
404
|
+
// Sleep-edge related memories (Bug Fix #3 — real DB, not null stub)
|
|
405
|
+
if (includeRelated && results.length > 0) {
|
|
406
|
+
results = addRelatedMemories(t, results);
|
|
407
|
+
}
|
|
408
|
+
return results;
|
|
409
|
+
}
|
|
410
|
+
//# sourceMappingURL=hybrid-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hybrid-search.js","sourceRoot":"","sources":["../src/hybrid-search.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export type { TenantContext } from '@kybernesis/brain-contracts';
|
|
2
|
+
export { enqueueWrite, queueDepth } from './queue.js';
|
|
3
|
+
export { addToTimeline, removeFromTimeline, updateTimelineEvent, deleteTimelineEventById, getEventById, getEventByPath, queryTimeline, getRecentActivity, getActivityOnDate, getActivityInRange, searchTimeline, findRecentDuplicate, incrementTimelineEventCount, getTimelineStats, addConversationToTimeline, addIdeaToTimeline, resetTimelineDb, } from './timeline.js';
|
|
4
|
+
export type { TimelineQuery, TimelineStats } from './timeline.js';
|
|
5
|
+
export { findOrCreateEntity, addEntityAlias, addEntityMention, linkEntities, linkEntitiesWithType, getTypedRelationships, linkEntitiesFromConversation, getEntityContext, searchEntities, getRecentEntities, getMostMentionedEntities, getEntityGraphStats, detectEntitiesInQuery, mergeEntities, deleteEntity, getEntityProfile, saveEntityProfile, createContradiction, getOpenContradictions, resolveContradiction, applyContradictions, saveEntityInsight, getEntityInsights, markInsightsStale, getEntitiesForReasoning, markEntityReasoned, pinEntity, listPinned, } from './entity-graph.js';
|
|
6
|
+
export type { ConversationEntity } from './entity-graph.js';
|
|
7
|
+
export { ensureFactsTable, storeFact, retractFact, reinforceFact, getFactById, getFactsForEntity, markFactSuperseded, factsCount, listFacts, listTemporalFacts, searchFactsFts, VALID_CATEGORIES, } from './fact-store.js';
|
|
8
|
+
export { sanitizeFtsQuery } from './fts-sanitizer.js';
|
|
9
|
+
export { setLLMProvider, resetLLMProvider, llmAvailable, callClaude, callClaudeJSON, } from './claude-call.js';
|
|
10
|
+
export type { LLMProvider } from './claude-call.js';
|
|
11
|
+
export { indexChunk, semanticSearch, vectorStats, setEmbeddingProvider, resetEmbeddingProvider, embeddingAvailable, EMBEDDING_DIM, } from './vectors.js';
|
|
12
|
+
export type { SearchResult, IndexChunkMeta, EmbeddingProvider, IndexChunkResult, } from './vectors.js';
|
|
13
|
+
export { runSleepCycleNow, ensureSleepSchema, recoverStaleSleepRuns, DEFAULT_CONFIG as SLEEP_DEFAULT_CONFIG, } from './sleep/index.js';
|
|
14
|
+
export type { SleepConfig, RunMetrics as SleepRunMetrics } from './sleep/index.js';
|
|
15
|
+
export { jaccardSimilarity, jaccardSimilarityArrays } from './sleep/utils/jaccard.js';
|
|
16
|
+
export { detectTemporalExpiry } from './fact-temporal.js';
|
|
17
|
+
export type { TemporalResult } from './fact-temporal.js';
|
|
18
|
+
export { extractRelationships, formatRelationship } from './relationship-extractor.js';
|
|
19
|
+
export type { ExtractedRelationship, RelationshipExtractionResult } from './relationship-extractor.js';
|
|
20
|
+
export { extractFactsRealtime } from './fact-extractor.js';
|
|
21
|
+
export { detectContradictions } from './fact-contradiction.js';
|
|
22
|
+
export type { ContradictionResult } from './fact-contradiction.js';
|
|
23
|
+
export { generateUserProfile, getCachedProfile, cacheProfile, getProfileAge, formatProfileForPrompt, } from './user-profile.js';
|
|
24
|
+
export type { UserProfile } from './user-profile.js';
|
|
25
|
+
export { factFirstSearch } from './fact-retrieval.js';
|
|
26
|
+
export type { FactSearchOptions, FactSearchResult } from './fact-retrieval.js';
|
|
27
|
+
export { hybridSearch } from './hybrid-search.js';
|
|
28
|
+
export type { HybridSearchResult, HybridSearchOptions } from './hybrid-search.js';
|
|
29
|
+
export { storeConversation, filterNoiseEntities, isStoreActive, } from './store-conversation.js';
|
|
30
|
+
export type { ConversationInput } from './store-conversation.js';
|
|
31
|
+
export { formatRecall, formatTimelineRich, formatSearchRich, } from './ops.js';
|
|
32
|
+
export type { TimelineFormatOpts, SearchFormatOpts } from './ops.js';
|
|
33
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export { enqueueWrite, queueDepth } from './queue.js';
|
|
2
|
+
export { addToTimeline, removeFromTimeline, updateTimelineEvent, deleteTimelineEventById, getEventById, getEventByPath, queryTimeline, getRecentActivity, getActivityOnDate, getActivityInRange, searchTimeline, findRecentDuplicate, incrementTimelineEventCount, getTimelineStats, addConversationToTimeline, addIdeaToTimeline, resetTimelineDb, } from './timeline.js';
|
|
3
|
+
export { findOrCreateEntity, addEntityAlias, addEntityMention, linkEntities, linkEntitiesWithType, getTypedRelationships, linkEntitiesFromConversation, getEntityContext, searchEntities, getRecentEntities, getMostMentionedEntities, getEntityGraphStats, detectEntitiesInQuery, mergeEntities, deleteEntity, getEntityProfile, saveEntityProfile, createContradiction, getOpenContradictions, resolveContradiction, applyContradictions, saveEntityInsight, getEntityInsights, markInsightsStale, getEntitiesForReasoning, markEntityReasoned, pinEntity, listPinned, } from './entity-graph.js';
|
|
4
|
+
export { ensureFactsTable, storeFact, retractFact, reinforceFact, getFactById, getFactsForEntity, markFactSuperseded, factsCount, listFacts, listTemporalFacts, searchFactsFts, VALID_CATEGORIES, } from './fact-store.js';
|
|
5
|
+
export { sanitizeFtsQuery } from './fts-sanitizer.js';
|
|
6
|
+
export { setLLMProvider, resetLLMProvider, llmAvailable, callClaude, callClaudeJSON, } from './claude-call.js';
|
|
7
|
+
export { indexChunk, semanticSearch, vectorStats, setEmbeddingProvider, resetEmbeddingProvider, embeddingAvailable, EMBEDDING_DIM, } from './vectors.js';
|
|
8
|
+
export { runSleepCycleNow, ensureSleepSchema, recoverStaleSleepRuns, DEFAULT_CONFIG as SLEEP_DEFAULT_CONFIG, } from './sleep/index.js';
|
|
9
|
+
export { jaccardSimilarity, jaccardSimilarityArrays } from './sleep/utils/jaccard.js';
|
|
10
|
+
export { detectTemporalExpiry } from './fact-temporal.js';
|
|
11
|
+
export { extractRelationships, formatRelationship } from './relationship-extractor.js';
|
|
12
|
+
export { extractFactsRealtime } from './fact-extractor.js';
|
|
13
|
+
export { detectContradictions } from './fact-contradiction.js';
|
|
14
|
+
export { generateUserProfile, getCachedProfile, cacheProfile, getProfileAge, formatProfileForPrompt, } from './user-profile.js';
|
|
15
|
+
export { factFirstSearch } from './fact-retrieval.js';
|
|
16
|
+
export { hybridSearch } from './hybrid-search.js';
|
|
17
|
+
export { storeConversation, filterNoiseEntities, isStoreActive, } from './store-conversation.js';
|
|
18
|
+
export { formatRecall, formatTimelineRich, formatSearchRich, } from './ops.js';
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEtD,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,uBAAuB,EACvB,YAAY,EACZ,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,mBAAmB,EACnB,2BAA2B,EAC3B,gBAAgB,EAChB,yBAAyB,EACzB,iBAAiB,EACjB,eAAe,GAChB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,EACpB,qBAAqB,EACrB,4BAA4B,EAC5B,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,wBAAwB,EACxB,mBAAmB,EACnB,qBAAqB,EACrB,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,kBAAkB,EAClB,SAAS,EACT,UAAU,GACX,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,WAAW,EACX,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,UAAU,EACV,SAAS,EACT,iBAAiB,EACjB,cAAc,EACd,gBAAgB,GACjB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,cAAc,GACf,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,UAAU,EAAE,cAAc,EAAE,WAAW,EACvC,oBAAoB,EAAE,sBAAsB,EAAE,kBAAkB,EAChE,aAAa,GACd,MAAM,cAAc,CAAC;AAKtB,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,cAAc,IAAI,oBAAoB,GACvC,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAEtF,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAG1D,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAGvF,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAG/D,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,sBAAsB,GACvB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,GACd,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,UAAU,CAAC"}
|
package/dist/ops.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI output formatters — port of KAD's cli-formatters.ts (renamed ops.ts
|
|
3
|
+
* per CANONICAL.md §4). Output is byte-identical to what KAD renders.
|
|
4
|
+
* Wire contract for MCP skills — do NOT change output format.
|
|
5
|
+
*/
|
|
6
|
+
import type { TenantContext } from '@kybernesis/brain-contracts';
|
|
7
|
+
export declare function formatRecall(t: TenantContext, query: string | undefined): Promise<string>;
|
|
8
|
+
export interface TimelineFormatOpts {
|
|
9
|
+
today?: boolean;
|
|
10
|
+
yesterday?: boolean;
|
|
11
|
+
week?: boolean;
|
|
12
|
+
search?: string;
|
|
13
|
+
type?: string;
|
|
14
|
+
limit?: number;
|
|
15
|
+
stats?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export declare function formatTimelineRich(t: TenantContext, opts: TimelineFormatOpts): Promise<string>;
|
|
18
|
+
export interface SearchFormatOpts {
|
|
19
|
+
q: string;
|
|
20
|
+
limit?: number;
|
|
21
|
+
entity?: string;
|
|
22
|
+
entityMatch?: 'all' | 'any';
|
|
23
|
+
type?: string;
|
|
24
|
+
after?: string;
|
|
25
|
+
before?: string;
|
|
26
|
+
}
|
|
27
|
+
export declare function formatSearchRich(t: TenantContext, opts: SearchFormatOpts): Promise<string>;
|
|
28
|
+
//# sourceMappingURL=ops.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ops.d.ts","sourceRoot":"","sources":["../src/ops.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAA4B,MAAM,6BAA6B,CAAC;AAwK3F,wBAAsB,YAAY,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CA+B/F;AAmED,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,kBAAkB,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAkBpG;AAID,MAAM,WAAW,gBAAgB;IAC/B,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,gBAAgB,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAchG"}
|