@soleri/core 2.0.0 → 2.0.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.
Files changed (68) hide show
  1. package/dist/brain/brain.d.ts +3 -12
  2. package/dist/brain/brain.d.ts.map +1 -1
  3. package/dist/brain/brain.js +13 -245
  4. package/dist/brain/brain.js.map +1 -1
  5. package/dist/curator/curator.d.ts +28 -0
  6. package/dist/curator/curator.d.ts.map +1 -0
  7. package/dist/curator/curator.js +523 -0
  8. package/dist/curator/curator.js.map +1 -0
  9. package/dist/curator/types.d.ts +87 -0
  10. package/dist/curator/types.d.ts.map +1 -0
  11. package/dist/curator/types.js +3 -0
  12. package/dist/curator/types.js.map +1 -0
  13. package/dist/facades/types.d.ts +1 -1
  14. package/dist/index.d.ts +9 -2
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +10 -2
  17. package/dist/index.js.map +1 -1
  18. package/dist/llm/llm-client.d.ts +28 -0
  19. package/dist/llm/llm-client.d.ts.map +1 -0
  20. package/dist/llm/llm-client.js +219 -0
  21. package/dist/llm/llm-client.js.map +1 -0
  22. package/dist/runtime/core-ops.d.ts +17 -0
  23. package/dist/runtime/core-ops.d.ts.map +1 -0
  24. package/dist/runtime/core-ops.js +448 -0
  25. package/dist/runtime/core-ops.js.map +1 -0
  26. package/dist/runtime/domain-ops.d.ts +25 -0
  27. package/dist/runtime/domain-ops.d.ts.map +1 -0
  28. package/dist/runtime/domain-ops.js +130 -0
  29. package/dist/runtime/domain-ops.js.map +1 -0
  30. package/dist/runtime/runtime.d.ts +19 -0
  31. package/dist/runtime/runtime.d.ts.map +1 -0
  32. package/dist/runtime/runtime.js +62 -0
  33. package/dist/runtime/runtime.js.map +1 -0
  34. package/dist/runtime/types.d.ts +39 -0
  35. package/dist/runtime/types.d.ts.map +1 -0
  36. package/dist/runtime/types.js +2 -0
  37. package/dist/{cognee → runtime}/types.js.map +1 -1
  38. package/dist/text/similarity.d.ts +8 -0
  39. package/dist/text/similarity.d.ts.map +1 -0
  40. package/dist/text/similarity.js +161 -0
  41. package/dist/text/similarity.js.map +1 -0
  42. package/package.json +6 -2
  43. package/src/__tests__/brain.test.ts +27 -222
  44. package/src/__tests__/core-ops.test.ts +190 -0
  45. package/src/__tests__/curator.test.ts +479 -0
  46. package/src/__tests__/domain-ops.test.ts +124 -0
  47. package/src/__tests__/llm-client.test.ts +69 -0
  48. package/src/__tests__/runtime.test.ts +93 -0
  49. package/src/brain/brain.ts +19 -275
  50. package/src/curator/curator.ts +662 -0
  51. package/src/curator/types.ts +114 -0
  52. package/src/index.ts +40 -11
  53. package/src/llm/llm-client.ts +316 -0
  54. package/src/runtime/core-ops.ts +472 -0
  55. package/src/runtime/domain-ops.ts +144 -0
  56. package/src/runtime/runtime.ts +71 -0
  57. package/src/runtime/types.ts +37 -0
  58. package/src/text/similarity.ts +168 -0
  59. package/dist/cognee/client.d.ts +0 -35
  60. package/dist/cognee/client.d.ts.map +0 -1
  61. package/dist/cognee/client.js +0 -289
  62. package/dist/cognee/client.js.map +0 -1
  63. package/dist/cognee/types.d.ts +0 -46
  64. package/dist/cognee/types.d.ts.map +0 -1
  65. package/dist/cognee/types.js +0 -3
  66. package/src/__tests__/cognee-client.test.ts +0 -524
  67. package/src/cognee/client.ts +0 -350
  68. package/src/cognee/types.ts +0 -62
@@ -0,0 +1,523 @@
1
+ import { tokenize, calculateTfIdf, cosineSimilarity, } from '../text/similarity.js';
2
+ // ─── Constants ──────────────────────────────────────────────────────
3
+ const DEFAULT_DUPLICATE_THRESHOLD = 0.45;
4
+ const MERGE_SUGGESTION_THRESHOLD = 0.65;
5
+ const DEFAULT_CONTRADICTION_THRESHOLD = 0.4;
6
+ const DEFAULT_STALE_DAYS = 90;
7
+ const DEFAULT_TAG_ALIASES = [
8
+ ['a11y', 'accessibility'],
9
+ ['ts', 'typescript'],
10
+ ['js', 'javascript'],
11
+ ['css', 'styling'],
12
+ ['tailwind', 'styling'],
13
+ ['tw', 'styling'],
14
+ ['vitest', 'testing'],
15
+ ['jest', 'testing'],
16
+ ['perf', 'performance'],
17
+ ['sec', 'security'],
18
+ ['auth', 'authentication'],
19
+ ['i18n', 'internationalization'],
20
+ ['l10n', 'localization'],
21
+ ];
22
+ // ─── Curator Class ──────────────────────────────────────────────────
23
+ export class Curator {
24
+ vault;
25
+ constructor(vault) {
26
+ this.vault = vault;
27
+ this.initializeTables();
28
+ this.seedDefaultAliases();
29
+ }
30
+ // ─── Schema ─────────────────────────────────────────────────────
31
+ initializeTables() {
32
+ const db = this.vault.getDb();
33
+ db.exec(`
34
+ CREATE TABLE IF NOT EXISTS curator_entry_state (
35
+ entry_id TEXT PRIMARY KEY,
36
+ status TEXT NOT NULL DEFAULT 'active' CHECK(status IN ('active', 'stale', 'archived')),
37
+ confidence REAL NOT NULL DEFAULT 1.0,
38
+ source TEXT NOT NULL DEFAULT 'unknown' CHECK(source IN ('manual', 'capture', 'seed', 'unknown')),
39
+ last_groomed_at INTEGER,
40
+ created_at INTEGER NOT NULL DEFAULT (unixepoch())
41
+ );
42
+
43
+ CREATE TABLE IF NOT EXISTS curator_tag_canonical (
44
+ tag TEXT PRIMARY KEY,
45
+ description TEXT,
46
+ created_at INTEGER NOT NULL DEFAULT (unixepoch())
47
+ );
48
+
49
+ CREATE TABLE IF NOT EXISTS curator_tag_alias (
50
+ alias TEXT PRIMARY KEY,
51
+ canonical TEXT NOT NULL,
52
+ created_at INTEGER NOT NULL DEFAULT (unixepoch()),
53
+ FOREIGN KEY (canonical) REFERENCES curator_tag_canonical(tag)
54
+ );
55
+
56
+ CREATE TABLE IF NOT EXISTS curator_changelog (
57
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
58
+ action TEXT NOT NULL,
59
+ entry_id TEXT NOT NULL,
60
+ before_value TEXT,
61
+ after_value TEXT,
62
+ reason TEXT NOT NULL,
63
+ created_at INTEGER NOT NULL DEFAULT (unixepoch())
64
+ );
65
+
66
+ CREATE TABLE IF NOT EXISTS curator_contradictions (
67
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
68
+ pattern_id TEXT NOT NULL,
69
+ antipattern_id TEXT NOT NULL,
70
+ similarity REAL NOT NULL,
71
+ status TEXT NOT NULL DEFAULT 'open' CHECK(status IN ('open', 'resolved', 'dismissed')),
72
+ created_at INTEGER NOT NULL DEFAULT (unixepoch()),
73
+ resolved_at INTEGER,
74
+ UNIQUE(pattern_id, antipattern_id)
75
+ );
76
+ `);
77
+ }
78
+ seedDefaultAliases() {
79
+ const db = this.vault.getDb();
80
+ const insertCanonical = db.prepare('INSERT OR IGNORE INTO curator_tag_canonical (tag) VALUES (?)');
81
+ const insertAlias = db.prepare('INSERT OR IGNORE INTO curator_tag_alias (alias, canonical) VALUES (?, ?)');
82
+ const tx = db.transaction(() => {
83
+ const canonicals = new Set(DEFAULT_TAG_ALIASES.map(([, c]) => c));
84
+ for (const tag of canonicals) {
85
+ insertCanonical.run(tag);
86
+ }
87
+ for (const [alias, canonical] of DEFAULT_TAG_ALIASES) {
88
+ insertAlias.run(alias, canonical);
89
+ }
90
+ });
91
+ tx();
92
+ }
93
+ // ─── Status ─────────────────────────────────────────────────────
94
+ getStatus() {
95
+ const db = this.vault.getDb();
96
+ const tableCount = (table) => db.prepare(`SELECT COUNT(*) as count FROM ${table}`).get().count;
97
+ const lastGroomed = db
98
+ .prepare('SELECT MAX(last_groomed_at) as ts FROM curator_entry_state WHERE last_groomed_at IS NOT NULL')
99
+ .get();
100
+ return {
101
+ initialized: true,
102
+ tables: {
103
+ entry_state: tableCount('curator_entry_state'),
104
+ tag_canonical: tableCount('curator_tag_canonical'),
105
+ tag_alias: tableCount('curator_tag_alias'),
106
+ changelog: tableCount('curator_changelog'),
107
+ contradictions: tableCount('curator_contradictions'),
108
+ },
109
+ lastGroomedAt: lastGroomed.ts,
110
+ };
111
+ }
112
+ // ─── Tag Normalization ──────────────────────────────────────────
113
+ normalizeTag(tag) {
114
+ const db = this.vault.getDb();
115
+ const lower = tag.toLowerCase().trim();
116
+ const row = db.prepare('SELECT canonical FROM curator_tag_alias WHERE alias = ?').get(lower);
117
+ if (row) {
118
+ return { original: tag, normalized: row.canonical, wasAliased: true };
119
+ }
120
+ return { original: tag, normalized: lower, wasAliased: false };
121
+ }
122
+ normalizeTags(entryId) {
123
+ const entry = this.vault.get(entryId);
124
+ if (!entry)
125
+ return [];
126
+ const results = [];
127
+ const normalizedTags = [];
128
+ let changed = false;
129
+ for (const tag of entry.tags) {
130
+ const result = this.normalizeTag(tag);
131
+ results.push(result);
132
+ normalizedTags.push(result.normalized);
133
+ if (result.normalized !== tag)
134
+ changed = true;
135
+ }
136
+ if (changed) {
137
+ const dedupedTags = [...new Set(normalizedTags)];
138
+ const db = this.vault.getDb();
139
+ db.prepare('UPDATE entries SET tags = ?, updated_at = unixepoch() WHERE id = ?').run(JSON.stringify(dedupedTags), entryId);
140
+ this.logChange('normalize_tags', entryId, JSON.stringify(entry.tags), JSON.stringify(dedupedTags), 'Tag normalization');
141
+ }
142
+ return results;
143
+ }
144
+ addTagAlias(alias, canonical) {
145
+ const db = this.vault.getDb();
146
+ const lower = alias.toLowerCase().trim();
147
+ const canonicalLower = canonical.toLowerCase().trim();
148
+ db.prepare('INSERT OR IGNORE INTO curator_tag_canonical (tag) VALUES (?)').run(canonicalLower);
149
+ db.prepare('INSERT OR REPLACE INTO curator_tag_alias (alias, canonical) VALUES (?, ?)').run(lower, canonicalLower);
150
+ }
151
+ getCanonicalTags() {
152
+ const db = this.vault.getDb();
153
+ const rows = db
154
+ .prepare(`SELECT c.tag, c.description,
155
+ (SELECT COUNT(*) FROM curator_tag_alias a WHERE a.canonical = c.tag) as alias_count
156
+ FROM curator_tag_canonical c
157
+ ORDER BY c.tag`)
158
+ .all();
159
+ return rows.map((row) => ({
160
+ tag: row.tag,
161
+ description: row.description,
162
+ usageCount: this.countTagUsage(row.tag),
163
+ aliasCount: row.alias_count,
164
+ }));
165
+ }
166
+ countTagUsage(tag) {
167
+ const db = this.vault.getDb();
168
+ const row = db
169
+ .prepare('SELECT COUNT(*) as count FROM entries WHERE tags LIKE ?')
170
+ .get(`%"${tag}"%`);
171
+ return row.count;
172
+ }
173
+ // ─── Duplicate Detection ────────────────────────────────────────
174
+ detectDuplicates(entryId, threshold) {
175
+ const effectiveThreshold = threshold ?? DEFAULT_DUPLICATE_THRESHOLD;
176
+ const entries = this.vault.list({ limit: 100000 });
177
+ if (entries.length === 0)
178
+ return [];
179
+ // Build transient vocabulary
180
+ const vocabulary = this.buildVocabulary(entries);
181
+ // Build vectors for all entries
182
+ const vectors = new Map();
183
+ for (const entry of entries) {
184
+ const text = [entry.title, entry.description, entry.context ?? '', entry.tags.join(' ')].join(' ');
185
+ vectors.set(entry.id, calculateTfIdf(tokenize(text), vocabulary));
186
+ }
187
+ const targetEntries = entryId
188
+ ? entries.filter((e) => e.id === entryId)
189
+ : entries;
190
+ const results = [];
191
+ for (const entry of targetEntries) {
192
+ const entryVec = vectors.get(entry.id);
193
+ const matches = [];
194
+ for (const other of entries) {
195
+ if (other.id === entry.id)
196
+ continue;
197
+ const otherVec = vectors.get(other.id);
198
+ const similarity = cosineSimilarity(entryVec, otherVec);
199
+ if (similarity >= effectiveThreshold) {
200
+ matches.push({
201
+ entryId: other.id,
202
+ title: other.title,
203
+ similarity,
204
+ suggestMerge: similarity >= MERGE_SUGGESTION_THRESHOLD,
205
+ });
206
+ }
207
+ }
208
+ if (matches.length > 0) {
209
+ matches.sort((a, b) => b.similarity - a.similarity);
210
+ results.push({
211
+ entryId: entry.id,
212
+ matches,
213
+ scannedCount: entries.length - 1,
214
+ });
215
+ }
216
+ }
217
+ return results;
218
+ }
219
+ // ─── Contradictions ─────────────────────────────────────────────
220
+ detectContradictions(threshold) {
221
+ const effectiveThreshold = threshold ?? DEFAULT_CONTRADICTION_THRESHOLD;
222
+ const entries = this.vault.list({ limit: 100000 });
223
+ const antipatterns = entries.filter((e) => e.type === 'anti-pattern');
224
+ const patterns = entries.filter((e) => e.type === 'pattern');
225
+ if (antipatterns.length === 0 || patterns.length === 0)
226
+ return [];
227
+ const vocabulary = this.buildVocabulary(entries);
228
+ const db = this.vault.getDb();
229
+ const detected = [];
230
+ const insertStmt = db.prepare(`INSERT OR IGNORE INTO curator_contradictions (pattern_id, antipattern_id, similarity)
231
+ VALUES (?, ?, ?)`);
232
+ for (const ap of antipatterns) {
233
+ // Stage 1: FTS5 candidate retrieval (fall back to all patterns if FTS returns empty)
234
+ let candidates;
235
+ try {
236
+ const searchResults = this.vault.search(ap.title, { type: 'pattern', limit: 20 });
237
+ candidates = searchResults.length > 0 ? searchResults.map((r) => r.entry) : patterns;
238
+ }
239
+ catch {
240
+ candidates = patterns;
241
+ }
242
+ // Stage 2: TF-IDF cosine similarity
243
+ const apText = [ap.title, ap.description, ap.context ?? ''].join(' ');
244
+ const apVec = calculateTfIdf(tokenize(apText), vocabulary);
245
+ for (const pattern of candidates) {
246
+ const pText = [pattern.title, pattern.description, pattern.context ?? ''].join(' ');
247
+ const pVec = calculateTfIdf(tokenize(pText), vocabulary);
248
+ const similarity = cosineSimilarity(apVec, pVec);
249
+ if (similarity >= effectiveThreshold) {
250
+ const result = insertStmt.run(pattern.id, ap.id, similarity);
251
+ if (result.changes > 0) {
252
+ const row = db
253
+ .prepare('SELECT * FROM curator_contradictions WHERE pattern_id = ? AND antipattern_id = ?')
254
+ .get(pattern.id, ap.id);
255
+ detected.push(this.rowToContradiction(row));
256
+ }
257
+ }
258
+ }
259
+ }
260
+ return detected;
261
+ }
262
+ getContradictions(status) {
263
+ const db = this.vault.getDb();
264
+ const query = status
265
+ ? 'SELECT * FROM curator_contradictions WHERE status = ? ORDER BY similarity DESC'
266
+ : 'SELECT * FROM curator_contradictions ORDER BY similarity DESC';
267
+ const rows = (status ? db.prepare(query).all(status) : db.prepare(query).all());
268
+ return rows.map((r) => this.rowToContradiction(r));
269
+ }
270
+ resolveContradiction(id, resolution) {
271
+ const db = this.vault.getDb();
272
+ db.prepare('UPDATE curator_contradictions SET status = ?, resolved_at = unixepoch() WHERE id = ?').run(resolution, id);
273
+ const row = db.prepare('SELECT * FROM curator_contradictions WHERE id = ?').get(id);
274
+ return row ? this.rowToContradiction(row) : null;
275
+ }
276
+ // ─── Grooming ───────────────────────────────────────────────────
277
+ groomEntry(entryId) {
278
+ const entry = this.vault.get(entryId);
279
+ if (!entry)
280
+ return null;
281
+ const tagsNormalized = this.normalizeTags(entryId);
282
+ // Check staleness based on entry's updated_at timestamp
283
+ const db = this.vault.getDb();
284
+ const row = db.prepare('SELECT updated_at FROM entries WHERE id = ?').get(entryId);
285
+ const now = Math.floor(Date.now() / 1000);
286
+ const stale = row ? now - row.updated_at > DEFAULT_STALE_DAYS * 86400 : false;
287
+ const status = stale ? 'stale' : 'active';
288
+ // Upsert entry state
289
+ db.prepare(`INSERT INTO curator_entry_state (entry_id, status, last_groomed_at)
290
+ VALUES (?, ?, unixepoch())
291
+ ON CONFLICT(entry_id) DO UPDATE SET status = excluded.status, last_groomed_at = unixepoch()`).run(entryId, status);
292
+ this.logChange('groom', entryId, null, `status=${status}`, 'Routine grooming');
293
+ return {
294
+ entryId,
295
+ tagsNormalized,
296
+ stale,
297
+ lastGroomedAt: now,
298
+ };
299
+ }
300
+ groomAll() {
301
+ const start = Date.now();
302
+ const entries = this.vault.list({ limit: 100000 });
303
+ let tagsNormalized = 0;
304
+ let staleCount = 0;
305
+ for (const entry of entries) {
306
+ const result = this.groomEntry(entry.id);
307
+ if (result) {
308
+ tagsNormalized += result.tagsNormalized.filter((t) => t.wasAliased).length;
309
+ if (result.stale)
310
+ staleCount++;
311
+ }
312
+ }
313
+ return {
314
+ totalEntries: entries.length,
315
+ groomedCount: entries.length,
316
+ tagsNormalized,
317
+ staleCount,
318
+ durationMs: Date.now() - start,
319
+ };
320
+ }
321
+ // ─── Consolidation ─────────────────────────────────────────────
322
+ consolidate(options) {
323
+ const start = Date.now();
324
+ const dryRun = options?.dryRun ?? true;
325
+ const staleDaysThreshold = options?.staleDaysThreshold ?? DEFAULT_STALE_DAYS;
326
+ const duplicateThreshold = options?.duplicateThreshold ?? DEFAULT_DUPLICATE_THRESHOLD;
327
+ const contradictionThreshold = options?.contradictionThreshold ?? DEFAULT_CONTRADICTION_THRESHOLD;
328
+ // Detect duplicates
329
+ const duplicates = this.detectDuplicates(undefined, duplicateThreshold);
330
+ // Detect stale entries
331
+ const db = this.vault.getDb();
332
+ const now = Math.floor(Date.now() / 1000);
333
+ const staleThreshold = now - staleDaysThreshold * 86400;
334
+ const staleRows = db
335
+ .prepare('SELECT id FROM entries WHERE updated_at < ?')
336
+ .all(staleThreshold);
337
+ const staleEntries = staleRows.map((r) => r.id);
338
+ // Detect contradictions
339
+ const contradictions = this.detectContradictions(contradictionThreshold);
340
+ let mutations = 0;
341
+ if (!dryRun) {
342
+ // Archive stale entries
343
+ for (const entryId of staleEntries) {
344
+ db.prepare(`INSERT INTO curator_entry_state (entry_id, status, last_groomed_at)
345
+ VALUES (?, 'archived', unixepoch())
346
+ ON CONFLICT(entry_id) DO UPDATE SET status = 'archived', last_groomed_at = unixepoch()`).run(entryId);
347
+ this.logChange('archive', entryId, 'active', 'archived', 'Stale entry archived during consolidation');
348
+ mutations++;
349
+ }
350
+ // Remove lower-similarity duplicates (keep the first entry, remove matches)
351
+ const removed = new Set();
352
+ for (const result of duplicates) {
353
+ for (const match of result.matches) {
354
+ if (!removed.has(match.entryId) && match.entryId !== result.entryId) {
355
+ this.vault.remove(match.entryId);
356
+ this.logChange('remove_duplicate', match.entryId, null, null, `Duplicate of ${result.entryId} (similarity: ${match.similarity.toFixed(3)})`);
357
+ removed.add(match.entryId);
358
+ mutations++;
359
+ }
360
+ }
361
+ }
362
+ }
363
+ return {
364
+ dryRun,
365
+ duplicates,
366
+ staleEntries,
367
+ contradictions,
368
+ mutations,
369
+ durationMs: Date.now() - start,
370
+ };
371
+ }
372
+ // ─── Changelog ──────────────────────────────────────────────────
373
+ getEntryHistory(entryId, limit) {
374
+ const db = this.vault.getDb();
375
+ const rows = db
376
+ .prepare('SELECT * FROM curator_changelog WHERE entry_id = ? ORDER BY created_at DESC, id DESC LIMIT ?')
377
+ .all(entryId, limit ?? 50);
378
+ return rows.map((r) => this.rowToChangelog(r));
379
+ }
380
+ // ─── Health Audit ───────────────────────────────────────────────
381
+ healthAudit() {
382
+ const entries = this.vault.list({ limit: 100000 });
383
+ const recommendations = [];
384
+ if (entries.length === 0) {
385
+ return {
386
+ score: 100,
387
+ metrics: { coverage: 1, freshness: 1, quality: 1, tagHealth: 1 },
388
+ recommendations: ['Vault is empty — add knowledge entries to get started.'],
389
+ };
390
+ }
391
+ let score = 100;
392
+ // Coverage: penalize if no anti-patterns or no patterns
393
+ const typeCount = { pattern: 0, 'anti-pattern': 0, rule: 0 };
394
+ for (const e of entries) {
395
+ typeCount[e.type] = (typeCount[e.type] ?? 0) + 1;
396
+ }
397
+ const hasPatterns = typeCount.pattern > 0;
398
+ const hasAntiPatterns = typeCount['anti-pattern'] > 0;
399
+ const hasRules = typeCount.rule > 0;
400
+ let coverageScore = 1;
401
+ if (!hasPatterns) {
402
+ score -= 10;
403
+ coverageScore -= 0.33;
404
+ recommendations.push('No patterns found — add patterns to improve coverage.');
405
+ }
406
+ if (!hasAntiPatterns) {
407
+ score -= 5;
408
+ coverageScore -= 0.17;
409
+ recommendations.push('No anti-patterns found — add anti-patterns to detect contradictions.');
410
+ }
411
+ if (!hasRules) {
412
+ score -= 5;
413
+ coverageScore -= 0.17;
414
+ recommendations.push('No rules found — add rules for completeness.');
415
+ }
416
+ coverageScore = Math.max(0, coverageScore);
417
+ // Freshness: penalize stale entries
418
+ const db = this.vault.getDb();
419
+ const now = Math.floor(Date.now() / 1000);
420
+ const staleThreshold = now - DEFAULT_STALE_DAYS * 86400;
421
+ const staleCount = db.prepare('SELECT COUNT(*) as count FROM entries WHERE updated_at < ?').get(staleThreshold).count;
422
+ const staleRatio = staleCount / entries.length;
423
+ const freshnessScore = 1 - staleRatio;
424
+ if (staleRatio > 0.3) {
425
+ const penalty = Math.min(20, Math.round(staleRatio * 30));
426
+ score -= penalty;
427
+ recommendations.push(`${staleCount} stale entries (${Math.round(staleRatio * 100)}%) — run grooming to update.`);
428
+ }
429
+ // Quality: penalize duplicates and contradictions
430
+ const duplicates = this.detectDuplicates();
431
+ const contradictions = this.getContradictions('open');
432
+ let qualityScore = 1;
433
+ if (duplicates.length > 0) {
434
+ const penalty = Math.min(15, duplicates.length * 3);
435
+ score -= penalty;
436
+ qualityScore -= penalty / 30;
437
+ recommendations.push(`${duplicates.length} entries have duplicates — run consolidation.`);
438
+ }
439
+ if (contradictions.length > 0) {
440
+ const penalty = Math.min(15, contradictions.length * 5);
441
+ score -= penalty;
442
+ qualityScore -= penalty / 30;
443
+ recommendations.push(`${contradictions.length} open contradictions — resolve or dismiss.`);
444
+ }
445
+ qualityScore = Math.max(0, qualityScore);
446
+ // Tag health: penalize entries with few or no tags
447
+ const lowTagEntries = entries.filter((e) => e.tags.length < 2);
448
+ const lowTagRatio = lowTagEntries.length / entries.length;
449
+ const tagHealthScore = 1 - lowTagRatio;
450
+ if (lowTagRatio > 0.3) {
451
+ const penalty = Math.min(10, Math.round(lowTagRatio * 15));
452
+ score -= penalty;
453
+ recommendations.push(`${lowTagEntries.length} entries have fewer than 2 tags — improve tagging.`);
454
+ }
455
+ // Penalize ungroomed entries
456
+ const groomedCount = db.prepare('SELECT COUNT(*) as count FROM curator_entry_state WHERE last_groomed_at IS NOT NULL').get().count;
457
+ if (groomedCount < entries.length) {
458
+ const ungroomed = entries.length - groomedCount;
459
+ const penalty = Math.min(10, Math.round((ungroomed / entries.length) * 10));
460
+ score -= penalty;
461
+ recommendations.push(`${ungroomed} entries never groomed — run groomAll().`);
462
+ }
463
+ score = Math.max(0, score);
464
+ if (recommendations.length === 0) {
465
+ recommendations.push('Vault is healthy — no issues detected.');
466
+ }
467
+ return {
468
+ score,
469
+ metrics: {
470
+ coverage: coverageScore,
471
+ freshness: freshnessScore,
472
+ quality: qualityScore,
473
+ tagHealth: tagHealthScore,
474
+ },
475
+ recommendations,
476
+ };
477
+ }
478
+ // ─── Private Helpers ────────────────────────────────────────────
479
+ buildVocabulary(entries) {
480
+ const docCount = entries.length;
481
+ const termDocFreq = new Map();
482
+ for (const entry of entries) {
483
+ const text = [entry.title, entry.description, entry.context ?? '', entry.tags.join(' ')].join(' ');
484
+ const tokens = new Set(tokenize(text));
485
+ for (const token of tokens) {
486
+ termDocFreq.set(token, (termDocFreq.get(token) ?? 0) + 1);
487
+ }
488
+ }
489
+ const vocabulary = new Map();
490
+ for (const [term, df] of termDocFreq) {
491
+ const idf = Math.log((docCount + 1) / (df + 1)) + 1;
492
+ vocabulary.set(term, idf);
493
+ }
494
+ return vocabulary;
495
+ }
496
+ logChange(action, entryId, beforeValue, afterValue, reason) {
497
+ const db = this.vault.getDb();
498
+ db.prepare('INSERT INTO curator_changelog (action, entry_id, before_value, after_value, reason) VALUES (?, ?, ?, ?, ?)').run(action, entryId, beforeValue, afterValue, reason);
499
+ }
500
+ rowToContradiction(row) {
501
+ return {
502
+ id: row.id,
503
+ patternId: row.pattern_id,
504
+ antipatternId: row.antipattern_id,
505
+ similarity: row.similarity,
506
+ status: row.status,
507
+ createdAt: row.created_at,
508
+ resolvedAt: row.resolved_at ?? null,
509
+ };
510
+ }
511
+ rowToChangelog(row) {
512
+ return {
513
+ id: row.id,
514
+ action: row.action,
515
+ entryId: row.entry_id,
516
+ beforeValue: row.before_value ?? null,
517
+ afterValue: row.after_value ?? null,
518
+ reason: row.reason,
519
+ createdAt: row.created_at,
520
+ };
521
+ }
522
+ }
523
+ //# sourceMappingURL=curator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"curator.js","sourceRoot":"","sources":["../../src/curator/curator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ export type EntryStatus = 'active' | 'stale' | 'archived';
2
+ export type EntrySource = 'manual' | 'capture' | 'seed' | 'unknown';
3
+ export interface TagNormalizationResult {
4
+ original: string;
5
+ normalized: string;
6
+ wasAliased: boolean;
7
+ }
8
+ export interface CanonicalTag {
9
+ tag: string;
10
+ description: string | null;
11
+ usageCount: number;
12
+ aliasCount: number;
13
+ }
14
+ export interface DuplicateCandidate {
15
+ entryId: string;
16
+ title: string;
17
+ similarity: number;
18
+ suggestMerge: boolean;
19
+ }
20
+ export interface DuplicateDetectionResult {
21
+ entryId: string;
22
+ matches: DuplicateCandidate[];
23
+ scannedCount: number;
24
+ }
25
+ export type ContradictionStatus = 'open' | 'resolved' | 'dismissed';
26
+ export interface Contradiction {
27
+ id: number;
28
+ patternId: string;
29
+ antipatternId: string;
30
+ similarity: number;
31
+ status: ContradictionStatus;
32
+ createdAt: number;
33
+ resolvedAt: number | null;
34
+ }
35
+ export interface GroomResult {
36
+ entryId: string;
37
+ tagsNormalized: TagNormalizationResult[];
38
+ stale: boolean;
39
+ lastGroomedAt: number;
40
+ }
41
+ export interface GroomAllResult {
42
+ totalEntries: number;
43
+ groomedCount: number;
44
+ tagsNormalized: number;
45
+ staleCount: number;
46
+ durationMs: number;
47
+ }
48
+ export interface ConsolidationOptions {
49
+ dryRun?: boolean;
50
+ staleDaysThreshold?: number;
51
+ duplicateThreshold?: number;
52
+ contradictionThreshold?: number;
53
+ }
54
+ export interface ConsolidationResult {
55
+ dryRun: boolean;
56
+ duplicates: DuplicateDetectionResult[];
57
+ staleEntries: string[];
58
+ contradictions: Contradiction[];
59
+ mutations: number;
60
+ durationMs: number;
61
+ }
62
+ export interface ChangelogEntry {
63
+ id: number;
64
+ action: string;
65
+ entryId: string;
66
+ beforeValue: string | null;
67
+ afterValue: string | null;
68
+ reason: string;
69
+ createdAt: number;
70
+ }
71
+ export interface HealthMetrics {
72
+ coverage: number;
73
+ freshness: number;
74
+ quality: number;
75
+ tagHealth: number;
76
+ }
77
+ export interface HealthAuditResult {
78
+ score: number;
79
+ metrics: HealthMetrics;
80
+ recommendations: string[];
81
+ }
82
+ export interface CuratorStatus {
83
+ initialized: boolean;
84
+ tables: Record<string, number>;
85
+ lastGroomedAt: number | null;
86
+ }
87
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/curator/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ // ─── Curator Types ──────────────────────────────────────────────────
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/curator/types.ts"],"names":[],"mappings":"AAAA,uEAAuE"}