@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.
Files changed (129) hide show
  1. package/dist/claude-call.d.ts +37 -0
  2. package/dist/claude-call.d.ts.map +1 -0
  3. package/dist/claude-call.js +55 -0
  4. package/dist/claude-call.js.map +1 -0
  5. package/dist/entity-graph.d.ts +79 -0
  6. package/dist/entity-graph.d.ts.map +1 -0
  7. package/dist/entity-graph.js +611 -0
  8. package/dist/entity-graph.js.map +1 -0
  9. package/dist/fact-contradiction.d.ts +25 -0
  10. package/dist/fact-contradiction.d.ts.map +1 -0
  11. package/dist/fact-contradiction.js +109 -0
  12. package/dist/fact-contradiction.js.map +1 -0
  13. package/dist/fact-extractor.d.ts +26 -0
  14. package/dist/fact-extractor.d.ts.map +1 -0
  15. package/dist/fact-extractor.js +98 -0
  16. package/dist/fact-extractor.js.map +1 -0
  17. package/dist/fact-retrieval.d.ts +51 -0
  18. package/dist/fact-retrieval.d.ts.map +1 -0
  19. package/dist/fact-retrieval.js +401 -0
  20. package/dist/fact-retrieval.js.map +1 -0
  21. package/dist/fact-store.d.ts +26 -0
  22. package/dist/fact-store.d.ts.map +1 -0
  23. package/dist/fact-store.js +181 -0
  24. package/dist/fact-store.js.map +1 -0
  25. package/dist/fact-temporal.d.ts +20 -0
  26. package/dist/fact-temporal.d.ts.map +1 -0
  27. package/dist/fact-temporal.js +79 -0
  28. package/dist/fact-temporal.js.map +1 -0
  29. package/dist/fts-sanitizer.d.ts +32 -0
  30. package/dist/fts-sanitizer.d.ts.map +1 -0
  31. package/dist/fts-sanitizer.js +61 -0
  32. package/dist/fts-sanitizer.js.map +1 -0
  33. package/dist/hybrid-search.d.ts +44 -0
  34. package/dist/hybrid-search.d.ts.map +1 -0
  35. package/dist/hybrid-search.js +410 -0
  36. package/dist/hybrid-search.js.map +1 -0
  37. package/dist/index.d.ts +33 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +19 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/ops.d.ts +28 -0
  42. package/dist/ops.d.ts.map +1 -0
  43. package/dist/ops.js +307 -0
  44. package/dist/ops.js.map +1 -0
  45. package/dist/queue.d.ts +13 -0
  46. package/dist/queue.d.ts.map +1 -0
  47. package/dist/queue.js +28 -0
  48. package/dist/queue.js.map +1 -0
  49. package/dist/relationship-extractor.d.ts +38 -0
  50. package/dist/relationship-extractor.d.ts.map +1 -0
  51. package/dist/relationship-extractor.js +119 -0
  52. package/dist/relationship-extractor.js.map +1 -0
  53. package/dist/sleep/config.d.ts +47 -0
  54. package/dist/sleep/config.d.ts.map +1 -0
  55. package/dist/sleep/config.js +46 -0
  56. package/dist/sleep/config.js.map +1 -0
  57. package/dist/sleep/db.d.ts +16 -0
  58. package/dist/sleep/db.d.ts.map +1 -0
  59. package/dist/sleep/db.js +114 -0
  60. package/dist/sleep/db.js.map +1 -0
  61. package/dist/sleep/index.d.ts +69 -0
  62. package/dist/sleep/index.d.ts.map +1 -0
  63. package/dist/sleep/index.js +99 -0
  64. package/dist/sleep/index.js.map +1 -0
  65. package/dist/sleep/steps/consolidate.d.ts +19 -0
  66. package/dist/sleep/steps/consolidate.d.ts.map +1 -0
  67. package/dist/sleep/steps/consolidate.js +74 -0
  68. package/dist/sleep/steps/consolidate.js.map +1 -0
  69. package/dist/sleep/steps/decay.d.ts +19 -0
  70. package/dist/sleep/steps/decay.d.ts.map +1 -0
  71. package/dist/sleep/steps/decay.js +121 -0
  72. package/dist/sleep/steps/decay.js.map +1 -0
  73. package/dist/sleep/steps/entity-hygiene.d.ts +29 -0
  74. package/dist/sleep/steps/entity-hygiene.d.ts.map +1 -0
  75. package/dist/sleep/steps/entity-hygiene.js +452 -0
  76. package/dist/sleep/steps/entity-hygiene.js.map +1 -0
  77. package/dist/sleep/steps/link.d.ts +20 -0
  78. package/dist/sleep/steps/link.d.ts.map +1 -0
  79. package/dist/sleep/steps/link.js +216 -0
  80. package/dist/sleep/steps/link.js.map +1 -0
  81. package/dist/sleep/steps/observe.d.ts +17 -0
  82. package/dist/sleep/steps/observe.d.ts.map +1 -0
  83. package/dist/sleep/steps/observe.js +192 -0
  84. package/dist/sleep/steps/observe.js.map +1 -0
  85. package/dist/sleep/steps/profile.d.ts +15 -0
  86. package/dist/sleep/steps/profile.d.ts.map +1 -0
  87. package/dist/sleep/steps/profile.js +26 -0
  88. package/dist/sleep/steps/profile.js.map +1 -0
  89. package/dist/sleep/steps/reasoning.d.ts +19 -0
  90. package/dist/sleep/steps/reasoning.d.ts.map +1 -0
  91. package/dist/sleep/steps/reasoning.js +173 -0
  92. package/dist/sleep/steps/reasoning.js.map +1 -0
  93. package/dist/sleep/steps/summarize.d.ts +21 -0
  94. package/dist/sleep/steps/summarize.d.ts.map +1 -0
  95. package/dist/sleep/steps/summarize.js +206 -0
  96. package/dist/sleep/steps/summarize.js.map +1 -0
  97. package/dist/sleep/steps/tag.d.ts +16 -0
  98. package/dist/sleep/steps/tag.d.ts.map +1 -0
  99. package/dist/sleep/steps/tag.js +84 -0
  100. package/dist/sleep/steps/tag.js.map +1 -0
  101. package/dist/sleep/steps/tier.d.ts +18 -0
  102. package/dist/sleep/steps/tier.d.ts.map +1 -0
  103. package/dist/sleep/steps/tier.js +112 -0
  104. package/dist/sleep/steps/tier.js.map +1 -0
  105. package/dist/sleep/utils/checkpoint.d.ts +11 -0
  106. package/dist/sleep/utils/checkpoint.d.ts.map +1 -0
  107. package/dist/sleep/utils/checkpoint.js +26 -0
  108. package/dist/sleep/utils/checkpoint.js.map +1 -0
  109. package/dist/sleep/utils/jaccard.d.ts +7 -0
  110. package/dist/sleep/utils/jaccard.d.ts.map +1 -0
  111. package/dist/sleep/utils/jaccard.js +19 -0
  112. package/dist/sleep/utils/jaccard.js.map +1 -0
  113. package/dist/store-conversation.d.ts +29 -0
  114. package/dist/store-conversation.d.ts.map +1 -0
  115. package/dist/store-conversation.js +227 -0
  116. package/dist/store-conversation.js.map +1 -0
  117. package/dist/timeline.d.ts +50 -0
  118. package/dist/timeline.d.ts.map +1 -0
  119. package/dist/timeline.js +389 -0
  120. package/dist/timeline.js.map +1 -0
  121. package/dist/user-profile.d.ts +30 -0
  122. package/dist/user-profile.d.ts.map +1 -0
  123. package/dist/user-profile.js +147 -0
  124. package/dist/user-profile.js.map +1 -0
  125. package/dist/vectors.d.ts +56 -0
  126. package/dist/vectors.d.ts.map +1 -0
  127. package/dist/vectors.js +132 -0
  128. package/dist/vectors.js.map +1 -0
  129. package/package.json +53 -0
@@ -0,0 +1,452 @@
1
+ /**
2
+ * Entity hygiene step — port of KAD's sleep/steps/entity-hygiene.ts.
3
+ *
4
+ * Five phases:
5
+ * 0. Clean orphaned relations + mentions (no AI)
6
+ * 1. Delete pattern-matched artifacts (Speaker N, CLI commands, file paths)
7
+ * 2. AI-merge same-name-different-type duplicates (relaxed 0.6 confidence)
8
+ * 3. AI-merge variant-name candidates (strict 0.8 confidence)
9
+ * 4. Prune low-value noise (port-faithful KAD filters — see B11B note)
10
+ * 5. Generate narrative profiles for high-mention entities
11
+ *
12
+ * Bug B11B regression-watchpoint: Phase 4 prune uses **all of KAD's
13
+ * filters**: mention_count ≤ 1 AND type='topic' AND last_seen older than
14
+ * pruneMinAgeDays AND is_pinned IS NULL/0 AND no entity_relations.
15
+ * A v1 port dropped filter(s) and over-pruned the entity graph.
16
+ */
17
+ import { getDb } from '@kybernesis/brain-storage-sqlite';
18
+ import { callClaude } from '../../claude-call.js';
19
+ import { mergeEntities, deleteEntity, getEntityProfile, saveEntityProfile, } from '../../entity-graph.js';
20
+ import { getFactsForEntity } from '../../fact-store.js';
21
+ const ARTIFACT_PATTERNS = [
22
+ /^speaker\s*\d*$/i,
23
+ /^unknown$/i,
24
+ /^person\s*\d+$/i,
25
+ /^user$/i,
26
+ /^narrator$/i,
27
+ /^(curl|wget|bash|sh|zsh|npm|pnpm|yarn|pip|git|docker|node|python|make|gcc)$/i,
28
+ /^[./~].*\//,
29
+ /\.(json|yaml|yml|md|ts|js|py|sh|env|toml|lock|log|txt|csv|db)$/i,
30
+ /^(BLOCKED|ERROR|FAIL|OK|SUCCESS|null|undefined|true|false|none|N\/A)$/i,
31
+ /^(max\s+turns?\s+limit|rate\s+limit|timeout|sandbox|retry|fallback)$/i,
32
+ /^(settings|config|permissions?|terminal|shell|command|script)$/i,
33
+ /^(stdout|stderr|stdin|exit code|error|warning)$/i,
34
+ /^\d+$/,
35
+ /^.{1,2}$/,
36
+ ];
37
+ const STRIP_SUFFIXES = /\s+(llc|inc|corp|ltd|co|company|project|app)\.?$/i;
38
+ const NICKNAME_MAP = {
39
+ nick: ['nicholas', 'nico', 'nicky'], mike: ['michael', 'mikey'],
40
+ tom: ['thomas', 'tommy'], bob: ['robert', 'bobby'], rob: ['robert', 'robby'],
41
+ bill: ['william', 'billy'], will: ['william', 'willy'], jim: ['james', 'jimmy'],
42
+ joe: ['joseph', 'joey'], dan: ['daniel', 'danny'], dave: ['david', 'davey'],
43
+ ed: ['edward', 'eddie', 'edwin'], al: ['alan', 'albert', 'alexander'],
44
+ alex: ['alexander', 'alexandra'], ben: ['benjamin', 'benny'],
45
+ charlie: ['charles'], chris: ['christopher', 'christine', 'christina'],
46
+ dick: ['richard'], rick: ['richard', 'ricky'], rich: ['richard'],
47
+ don: ['donald', 'donny'], jack: ['john', 'jackson'], jake: ['jacob'],
48
+ jeff: ['jeffrey', 'geoffrey'], jen: ['jennifer', 'jenny'],
49
+ jerry: ['gerald', 'jeremy'], jon: ['jonathan', 'john'], josh: ['joshua'],
50
+ matt: ['matthew', 'matty'], max: ['maxwell', 'maximilian'],
51
+ pat: ['patrick', 'patricia'], pete: ['peter'], phil: ['philip', 'phillip'],
52
+ sam: ['samuel', 'samantha'], steve: ['steven', 'stephen'],
53
+ ted: ['theodore', 'edward'], tim: ['timothy', 'timmy'], tony: ['anthony'],
54
+ };
55
+ const FORMAL_TO_NICK = {};
56
+ for (const [nick, formals] of Object.entries(NICKNAME_MAP)) {
57
+ for (const formal of formals) {
58
+ if (!FORMAL_TO_NICK[formal])
59
+ FORMAL_TO_NICK[formal] = [];
60
+ FORMAL_TO_NICK[formal].push(nick);
61
+ }
62
+ }
63
+ function areNicknames(a, b) {
64
+ if (NICKNAME_MAP[a]?.includes(b))
65
+ return true;
66
+ if (NICKNAME_MAP[b]?.includes(a))
67
+ return true;
68
+ if (FORMAL_TO_NICK[a]?.includes(b))
69
+ return true;
70
+ if (FORMAL_TO_NICK[b]?.includes(a))
71
+ return true;
72
+ return false;
73
+ }
74
+ function buildEntityProfile(db, entity) {
75
+ const mentions = db.prepare(`
76
+ SELECT context FROM entity_mentions
77
+ WHERE entity_id = ? AND context IS NOT NULL AND context != ''
78
+ ORDER BY timestamp DESC LIMIT 5
79
+ `).all(entity.id);
80
+ const related = db.prepare(`
81
+ SELECT DISTINCT e.name FROM entity_relations r
82
+ JOIN entities e ON (
83
+ (r.source_id = ? AND e.id = r.target_id) OR
84
+ (r.target_id = ? AND e.id = r.source_id)
85
+ )
86
+ ORDER BY r.strength DESC LIMIT 10
87
+ `).all(entity.id, entity.id);
88
+ return {
89
+ id: entity.id, name: entity.name, type: entity.type,
90
+ mentions: entity.mention_count,
91
+ sampleContexts: mentions.map(m => m.context.slice(0, 200)),
92
+ relatedEntities: related.map(r => r.name),
93
+ };
94
+ }
95
+ function buildSameNameCandidates(db, groups) {
96
+ const candidates = [];
97
+ for (const group of groups) {
98
+ const ids = group.ids.split(',').map(Number);
99
+ const types = group.types.split(',');
100
+ const names = group.names.split(',');
101
+ const mentions = group.mention_counts.split(',').map(Number);
102
+ let keepIdx = 0;
103
+ for (let i = 1; i < ids.length; i++)
104
+ if (mentions[i] > mentions[keepIdx])
105
+ keepIdx = i;
106
+ for (let i = 0; i < ids.length; i++) {
107
+ if (i === keepIdx)
108
+ continue;
109
+ const keepProfile = buildEntityProfile(db, { id: ids[keepIdx], name: names[keepIdx], type: types[keepIdx], mention_count: mentions[keepIdx] });
110
+ const removeProfile = buildEntityProfile(db, { id: ids[i], name: names[i], type: types[i], mention_count: mentions[i] });
111
+ candidates.push({ keep: keepProfile, remove: removeProfile, matchReason: 'same-name-different-type' });
112
+ }
113
+ }
114
+ return candidates;
115
+ }
116
+ function detectVariantMatch(nameA, nameB, typeA, typeB) {
117
+ const a = nameA.toLowerCase();
118
+ const b = nameB.toLowerCase();
119
+ const aStripped = a.replace(STRIP_SUFFIXES, '').trim();
120
+ const bStripped = b.replace(STRIP_SUFFIXES, '').trim();
121
+ if (aStripped === bStripped && a !== b)
122
+ return 'variant-suffix';
123
+ const titlePrefixA = a.replace(/^(dr\.?|mr\.?|mrs\.?|ms\.?|prof\.?)\s+/i, '').trim();
124
+ const titlePrefixB = b.replace(/^(dr\.?|mr\.?|mrs\.?|ms\.?|prof\.?)\s+/i, '').trim();
125
+ if (titlePrefixA !== a && titlePrefixA === b)
126
+ return 'variant-title-prefix';
127
+ if (titlePrefixB !== b && titlePrefixB === a)
128
+ return 'variant-title-prefix';
129
+ if (a.length >= 3 && b.length >= 3) {
130
+ const shorter = a.length <= b.length ? a : b;
131
+ const longer = a.length <= b.length ? b : a;
132
+ if (!shorter.includes(' ') && !longer.includes(' ') && longer.startsWith(shorter)) {
133
+ return 'variant-nickname';
134
+ }
135
+ }
136
+ if (typeA === 'person' && typeB === 'person') {
137
+ const aFirst = a.split(' ')[0];
138
+ const bFirst = b.split(' ')[0];
139
+ const aIsSingle = !a.includes(' ');
140
+ const bIsSingle = !b.includes(' ');
141
+ if (aIsSingle && bFirst === a)
142
+ return 'variant-first-name';
143
+ if (bIsSingle && aFirst === b)
144
+ return 'variant-first-name';
145
+ if (aIsSingle && areNicknames(a, bFirst))
146
+ return 'variant-first-name';
147
+ if (bIsSingle && areNicknames(b, aFirst))
148
+ return 'variant-first-name';
149
+ if (aIsSingle && a.length >= 3 && bFirst.startsWith(a))
150
+ return 'variant-first-name';
151
+ if (bIsSingle && b.length >= 3 && aFirst.startsWith(b))
152
+ return 'variant-first-name';
153
+ }
154
+ const shorter = a.length <= b.length ? a : b;
155
+ const longer = a.length <= b.length ? b : a;
156
+ if (shorter.length >= 4 && longer.includes(shorter) && shorter.length >= longer.length * 0.4) {
157
+ return 'variant-substring';
158
+ }
159
+ const aNorm = a.replace(/[-_\s]/g, '');
160
+ const bNorm = b.replace(/[-_\s]/g, '');
161
+ if (aNorm.length >= 4 && bNorm.length >= 4 && aNorm !== bNorm) {
162
+ const shorterNorm = aNorm.length <= bNorm.length ? aNorm : bNorm;
163
+ const longerNorm = aNorm.length <= bNorm.length ? bNorm : aNorm;
164
+ if (longerNorm.startsWith(shorterNorm))
165
+ return 'variant-compound';
166
+ }
167
+ return null;
168
+ }
169
+ function findVariantCandidates(db) {
170
+ const entities = db.prepare(`
171
+ SELECT id, name, normalized_name, type, mention_count
172
+ FROM entities ORDER BY mention_count DESC LIMIT 500
173
+ `).all();
174
+ const candidates = [];
175
+ const seen = new Set();
176
+ const MAX_CANDIDATES = 50;
177
+ for (let i = 0; i < entities.length; i++) {
178
+ if (candidates.length >= MAX_CANDIDATES)
179
+ break;
180
+ for (let j = i + 1; j < entities.length; j++) {
181
+ if (candidates.length >= MAX_CANDIDATES)
182
+ break;
183
+ const a = entities[i], b = entities[j];
184
+ const key = `${Math.min(a.id, b.id)}-${Math.max(a.id, b.id)}`;
185
+ if (seen.has(key))
186
+ continue;
187
+ if (a.normalized_name === b.normalized_name)
188
+ continue;
189
+ const matchReason = detectVariantMatch(a.normalized_name, b.normalized_name, a.type, b.type);
190
+ if (!matchReason)
191
+ continue;
192
+ seen.add(key);
193
+ const [keep, remove] = a.mention_count >= b.mention_count ? [a, b] : [b, a];
194
+ candidates.push({
195
+ keep: buildEntityProfile(db, keep),
196
+ remove: buildEntityProfile(db, remove),
197
+ matchReason,
198
+ });
199
+ }
200
+ }
201
+ return candidates;
202
+ }
203
+ async function assessBatch(candidates, kind) {
204
+ const pairsDescription = candidates.map((c, idx) => {
205
+ const fmt = (label, p) => {
206
+ let s = ` ${label}: "${p.name}" (type: ${p.type}, mentions: ${p.mentions})`;
207
+ if (p.relatedEntities.length > 0)
208
+ s += `\n Connected to: ${p.relatedEntities.join(', ')}`;
209
+ if (p.sampleContexts.length > 0)
210
+ s += `\n Mention contexts:\n${p.sampleContexts.map(ctx => ` - "${ctx}"`).join('\n')}`;
211
+ return s;
212
+ };
213
+ return `Pair ${idx + 1}:\n${fmt('A', c.keep)}\n${fmt('B', c.remove)}\n Match reason: ${c.matchReason}`;
214
+ }).join('\n\n');
215
+ const prompt = kind === 'same-name'
216
+ ? `You are deduplicating an entity graph for a personal knowledge system. Each pair below has an EXACT normalized-name match — the same literal name was recorded as multiple entity types (e.g. "Kitt" tagged as both person and project). This is almost always a single real-world entity that the upstream extractor labeled inconsistently across turns.
217
+
218
+ ${pairsDescription}
219
+
220
+ For each pair, respond with a JSON array of decisions:
221
+ [
222
+ { "action": "MERGE" | "DIFFERENT" | "UNSURE", "confidence": 0.0-1.0, "rationale": "brief reason" },
223
+ ...
224
+ ]
225
+
226
+ Guidance:
227
+ - Default to MERGE for exact-name matches. The structural evidence (same normalized name across types) is strong enough on its own.
228
+ - Only return DIFFERENT when the mention contexts clearly describe two genuinely distinct things that happen to share a name.
229
+ - Confidence 0.6+ for the typical case. Confidence 0.9+ when contexts align thematically.
230
+ - UNSURE only when you genuinely cannot tell — keep this rare.
231
+
232
+ Return ONLY the JSON array, no other text.`
233
+ : `You are an entity graph deduplication assistant for a personal knowledge system. For each pair below, decide if they refer to the SAME real-world entity and should be merged, or are genuinely DIFFERENT entities.
234
+
235
+ USE CONTEXT TO DECIDE. Each entity includes:
236
+ - **Connected to**: Other entities they co-occur with.
237
+ - **Mention contexts**: How they're described when mentioned.
238
+
239
+ ${pairsDescription}
240
+
241
+ For each pair, respond with a JSON array of decisions:
242
+ [
243
+ { "action": "MERGE" | "DIFFERENT" | "UNSURE", "confidence": 0.0-1.0, "rationale": "brief reason" },
244
+ ...
245
+ ]
246
+
247
+ Rules:
248
+ - MERGE: Same entity, different name variant or type.
249
+ - DIFFERENT: Genuinely different entities that happen to have similar names.
250
+ - UNSURE: Not enough context.
251
+ - A first name like "Nick" and a full name like "Nicholas Frith" ARE the same person if they share connections and context. But two people with the same first name but completely different social graphs are DIFFERENT people.
252
+ - A person and a company with the same name are usually DIFFERENT unless context clearly shows they refer to the same thing.
253
+
254
+ Return ONLY the JSON array, no other text.`;
255
+ const responseText = await callClaude(prompt, { model: 'haiku', maxTokens: 1500 });
256
+ const jsonMatch = (responseText ?? '').match(/\[[\s\S]*\]/);
257
+ if (!jsonMatch) {
258
+ return candidates.map(() => ({ action: 'UNSURE', confidence: 0, rationale: 'no JSON in response' }));
259
+ }
260
+ try {
261
+ const decisions = JSON.parse(jsonMatch[0]);
262
+ while (decisions.length < candidates.length) {
263
+ decisions.push({ action: 'UNSURE', confidence: 0, rationale: 'missing in response' });
264
+ }
265
+ return decisions.slice(0, candidates.length);
266
+ }
267
+ catch {
268
+ return candidates.map(() => ({ action: 'UNSURE', confidence: 0, rationale: 'JSON parse error' }));
269
+ }
270
+ }
271
+ async function assessAndMerge(t, candidates, confidenceThreshold, kind) {
272
+ let mergeCount = 0;
273
+ let assessCount = 0;
274
+ const errs = [];
275
+ for (let i = 0; i < candidates.length; i += 5) {
276
+ const batch = candidates.slice(i, i + 5);
277
+ try {
278
+ const decisions = await assessBatch(batch, kind);
279
+ assessCount += batch.length;
280
+ for (let j = 0; j < decisions.length; j++) {
281
+ const decision = decisions[j];
282
+ const candidate = batch[j];
283
+ if (decision.action === 'MERGE' && decision.confidence >= confidenceThreshold) {
284
+ try {
285
+ await mergeEntities(t, candidate.keep.id, candidate.remove.id, candidate.matchReason, decision.confidence, decision.rationale, 'sleep:entity-hygiene');
286
+ mergeCount++;
287
+ }
288
+ catch (err) {
289
+ errs.push(`merge ${candidate.remove.name} -> ${candidate.keep.name}: ${String(err)}`);
290
+ }
291
+ }
292
+ }
293
+ }
294
+ catch (err) {
295
+ errs.push(`AI assessment batch: ${String(err)}`);
296
+ }
297
+ }
298
+ return { mergeCount, assessCount, errs };
299
+ }
300
+ export async function runEntityHygieneStep(t, config) {
301
+ if (!config.enableEntityHygiene) {
302
+ return { count: 0, artifactsCleaned: 0, merged: 0, pruned: 0, assessed: 0, processed: 0 };
303
+ }
304
+ const errors = [];
305
+ let artifactsCleaned = 0;
306
+ let merged = 0;
307
+ let pruned = 0;
308
+ let assessed = 0;
309
+ let totalActions = 0;
310
+ const db = getDb(t, 'entityGraph');
311
+ try {
312
+ // Phase 0: Clean orphans
313
+ db.prepare(`
314
+ DELETE FROM entity_relations WHERE
315
+ source_id NOT IN (SELECT id FROM entities) OR
316
+ target_id NOT IN (SELECT id FROM entities)
317
+ `).run();
318
+ db.prepare(`
319
+ DELETE FROM entity_mentions WHERE
320
+ entity_id NOT IN (SELECT id FROM entities)
321
+ `).run();
322
+ // Phase 1: Pattern-matched artifacts
323
+ const allEntities = db.prepare('SELECT id, name, type, mention_count FROM entities').all();
324
+ for (const entity of allEntities) {
325
+ if (totalActions >= config.maxMergesPerRun)
326
+ break;
327
+ if (ARTIFACT_PATTERNS.some(p => p.test(entity.name))) {
328
+ try {
329
+ await deleteEntity(t, entity.id, 'artifact-cleanup');
330
+ artifactsCleaned++;
331
+ totalActions++;
332
+ }
333
+ catch (err) {
334
+ errors.push(`artifact ${entity.name}: ${String(err)}`);
335
+ }
336
+ }
337
+ }
338
+ if (totalActions >= config.maxMergesPerRun) {
339
+ return buildResult(artifactsCleaned, merged, pruned, assessed, errors);
340
+ }
341
+ // Phase 2: Same-name-different-type
342
+ const sameNameGroups = db.prepare(`
343
+ SELECT normalized_name, GROUP_CONCAT(id) as ids, GROUP_CONCAT(type) as types,
344
+ GROUP_CONCAT(name) as names, GROUP_CONCAT(mention_count) as mention_counts
345
+ FROM entities
346
+ GROUP BY normalized_name
347
+ HAVING COUNT(DISTINCT type) > 1
348
+ `).all();
349
+ if (sameNameGroups.length > 0) {
350
+ const candidates = buildSameNameCandidates(db, sameNameGroups);
351
+ const batch = candidates.slice(0, config.maxMergesPerRun - totalActions);
352
+ if (batch.length > 0) {
353
+ const { mergeCount, assessCount, errs } = await assessAndMerge(t, batch, 0.6, 'same-name');
354
+ merged += mergeCount;
355
+ assessed += assessCount;
356
+ totalActions += mergeCount;
357
+ errors.push(...errs);
358
+ }
359
+ }
360
+ if (totalActions >= config.maxMergesPerRun) {
361
+ return buildResult(artifactsCleaned, merged, pruned, assessed, errors);
362
+ }
363
+ // Phase 3: Variant names
364
+ const variantCandidates = findVariantCandidates(db);
365
+ if (variantCandidates.length > 0) {
366
+ const batch = variantCandidates.slice(0, config.maxMergesPerRun - totalActions);
367
+ if (batch.length > 0) {
368
+ const { mergeCount, assessCount, errs } = await assessAndMerge(t, batch, config.hygieneConfidenceThreshold, 'variant');
369
+ merged += mergeCount;
370
+ assessed += assessCount;
371
+ totalActions += mergeCount;
372
+ errors.push(...errs);
373
+ }
374
+ }
375
+ // Phase 4: Prune low-value noise — Bug B11B regression-watchpoint.
376
+ // ALL 5 KAD filters must apply (omitting any over-prunes the graph):
377
+ // 1. mention_count <= 1
378
+ // 2. type = 'topic'
379
+ // 3. last_seen < pruneDate
380
+ // 4. is_pinned IS NULL OR is_pinned = 0
381
+ // 5. NOT EXISTS in entity_relations
382
+ const pruneDate = new Date(Date.now() - config.pruneMinAgeDays * 24 * 60 * 60 * 1000).toISOString();
383
+ const noisyEntities = db.prepare(`
384
+ SELECT e.id, e.name, e.type, e.mention_count, e.last_seen, e.is_pinned
385
+ FROM entities e
386
+ WHERE e.mention_count <= 1
387
+ AND e.type = 'topic'
388
+ AND e.last_seen < ?
389
+ AND (e.is_pinned IS NULL OR e.is_pinned = 0)
390
+ AND NOT EXISTS (SELECT 1 FROM entity_relations WHERE source_id = e.id OR target_id = e.id)
391
+ `).all(pruneDate);
392
+ for (const entity of noisyEntities) {
393
+ if (totalActions >= config.maxMergesPerRun)
394
+ break;
395
+ try {
396
+ await deleteEntity(t, entity.id, 'prune-low-value-noise');
397
+ pruned++;
398
+ totalActions++;
399
+ }
400
+ catch (err) {
401
+ errors.push(`prune ${entity.name}: ${String(err)}`);
402
+ }
403
+ }
404
+ }
405
+ catch (err) {
406
+ errors.push(`hygiene step: ${String(err)}`);
407
+ }
408
+ // Phase 5: Narrative profiles for top entities
409
+ try {
410
+ const profileCandidates = db.prepare(`
411
+ SELECT id, name, type FROM entities
412
+ WHERE mention_count >= 3
413
+ ORDER BY mention_count DESC LIMIT 10
414
+ `).all();
415
+ let profilesGenerated = 0;
416
+ const maxProfiles = 5;
417
+ for (const entity of profileCandidates) {
418
+ if (profilesGenerated >= maxProfiles)
419
+ break;
420
+ try {
421
+ const facts = await getFactsForEntity(t, entity.name, { latestOnly: true, limit: 15 });
422
+ if (facts.length < 3)
423
+ continue;
424
+ const existing = await getEntityProfile(t, entity.id);
425
+ if (existing && existing.factCount === facts.length)
426
+ continue;
427
+ const factList = facts.map(f => `- ${f.content}`).join('\n');
428
+ const profileText = await callClaude(`Write a concise 2-sentence profile for this ${entity.type}. Be factual, third person, specific. Do not start with "Based on..." or reference data sources.\n\nEntity: ${entity.name} (${entity.type})\nFacts:\n${factList}`, { model: 'haiku', maxTokens: 200 });
429
+ if (profileText && profileText.length > 20) {
430
+ await saveEntityProfile(t, entity.id, profileText.trim(), facts.length);
431
+ profilesGenerated++;
432
+ }
433
+ }
434
+ catch (err) {
435
+ errors.push(`profile ${entity.name}: ${String(err)}`);
436
+ }
437
+ }
438
+ }
439
+ catch (err) {
440
+ console.warn('[brain-core/sleep/entity-hygiene] profile phase failed', { err: String(err) });
441
+ }
442
+ return buildResult(artifactsCleaned, merged, pruned, assessed, errors);
443
+ }
444
+ function buildResult(artifactsCleaned, merged, pruned, assessed, errors) {
445
+ const count = artifactsCleaned + merged + pruned;
446
+ const processed = artifactsCleaned + merged + pruned + assessed;
447
+ return {
448
+ count, artifactsCleaned, merged, pruned, assessed, processed,
449
+ errors: errors.length > 0 ? errors : undefined,
450
+ };
451
+ }
452
+ //# sourceMappingURL=entity-hygiene.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-hygiene.js","sourceRoot":"","sources":["../../../src/sleep/steps/entity-hygiene.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Link step — port of KAD's sleep/steps/link.ts.
3
+ *
4
+ * Builds memory_edges between timeline events with shared tags via Jaccard
5
+ * similarity. Excluded tags are noise/metadata terms ("pdf", "upload", etc).
6
+ * Edge type is determined by `determineRelationType` — same_person if shared
7
+ * entities, continuation if same channel, same_topic if ≥2 shared tags,
8
+ * referenced if one title contains the other, otherwise 'related'.
9
+ *
10
+ * Phase 2 retypes existing 'related' edges to more-specific relations.
11
+ */
12
+ import type { TenantContext } from '@kybernesis/brain-contracts';
13
+ import type { SleepConfig } from '../config.js';
14
+ export interface LinkResult {
15
+ count: number;
16
+ processed: number;
17
+ errors?: string[];
18
+ }
19
+ export declare function runLinkStep(t: TenantContext, config: SleepConfig): Promise<LinkResult>;
20
+ //# sourceMappingURL=link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../../src/sleep/steps/link.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAIjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AA4CD,wBAAsB,WAAW,CAC/B,CAAC,EAAE,aAAa,EAChB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,UAAU,CAAC,CA4LrB"}