mnemon-mcp 1.0.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 (104) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/CONTRIBUTING.md +59 -0
  3. package/LICENSE +21 -0
  4. package/README.md +434 -0
  5. package/SECURITY.md +29 -0
  6. package/config.example.json +52 -0
  7. package/dist/.tsbuildinfo +1 -0
  8. package/dist/db.d.ts +16 -0
  9. package/dist/db.d.ts.map +1 -0
  10. package/dist/db.js +360 -0
  11. package/dist/db.js.map +1 -0
  12. package/dist/embedder.d.ts +22 -0
  13. package/dist/embedder.d.ts.map +1 -0
  14. package/dist/embedder.js +109 -0
  15. package/dist/embedder.js.map +1 -0
  16. package/dist/import/cli.d.ts +12 -0
  17. package/dist/import/cli.d.ts.map +1 -0
  18. package/dist/import/cli.js +105 -0
  19. package/dist/import/cli.js.map +1 -0
  20. package/dist/import/config-loader.d.ts +29 -0
  21. package/dist/import/config-loader.d.ts.map +1 -0
  22. package/dist/import/config-loader.js +140 -0
  23. package/dist/import/config-loader.js.map +1 -0
  24. package/dist/import/kb-config.d.ts +27 -0
  25. package/dist/import/kb-config.d.ts.map +1 -0
  26. package/dist/import/kb-config.js +10 -0
  27. package/dist/import/kb-config.js.map +1 -0
  28. package/dist/import/kb-import.d.ts +45 -0
  29. package/dist/import/kb-import.d.ts.map +1 -0
  30. package/dist/import/kb-import.js +285 -0
  31. package/dist/import/kb-import.js.map +1 -0
  32. package/dist/import/md-parser.d.ts +35 -0
  33. package/dist/import/md-parser.d.ts.map +1 -0
  34. package/dist/import/md-parser.js +104 -0
  35. package/dist/import/md-parser.js.map +1 -0
  36. package/dist/index-http.d.ts +12 -0
  37. package/dist/index-http.d.ts.map +1 -0
  38. package/dist/index-http.js +202 -0
  39. package/dist/index-http.js.map +1 -0
  40. package/dist/index.d.ts +9 -0
  41. package/dist/index.d.ts.map +1 -0
  42. package/dist/index.js +56 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/server.d.ts +16 -0
  45. package/dist/server.d.ts.map +1 -0
  46. package/dist/server.js +341 -0
  47. package/dist/server.js.map +1 -0
  48. package/dist/stemmer.d.ts +29 -0
  49. package/dist/stemmer.d.ts.map +1 -0
  50. package/dist/stemmer.js +68 -0
  51. package/dist/stemmer.js.map +1 -0
  52. package/dist/stop-words.d.ts +12 -0
  53. package/dist/stop-words.d.ts.map +1 -0
  54. package/dist/stop-words.js +112 -0
  55. package/dist/stop-words.js.map +1 -0
  56. package/dist/tools/memory-add.d.ts +15 -0
  57. package/dist/tools/memory-add.d.ts.map +1 -0
  58. package/dist/tools/memory-add.js +120 -0
  59. package/dist/tools/memory-add.js.map +1 -0
  60. package/dist/tools/memory-delete.d.ts +10 -0
  61. package/dist/tools/memory-delete.d.ts.map +1 -0
  62. package/dist/tools/memory-delete.js +39 -0
  63. package/dist/tools/memory-delete.js.map +1 -0
  64. package/dist/tools/memory-export.d.ts +10 -0
  65. package/dist/tools/memory-export.d.ts.map +1 -0
  66. package/dist/tools/memory-export.js +102 -0
  67. package/dist/tools/memory-export.js.map +1 -0
  68. package/dist/tools/memory-health.d.ts +11 -0
  69. package/dist/tools/memory-health.d.ts.map +1 -0
  70. package/dist/tools/memory-health.js +79 -0
  71. package/dist/tools/memory-health.js.map +1 -0
  72. package/dist/tools/memory-inspect.d.ts +10 -0
  73. package/dist/tools/memory-inspect.d.ts.map +1 -0
  74. package/dist/tools/memory-inspect.js +139 -0
  75. package/dist/tools/memory-inspect.js.map +1 -0
  76. package/dist/tools/memory-search.d.ts +16 -0
  77. package/dist/tools/memory-search.d.ts.map +1 -0
  78. package/dist/tools/memory-search.js +459 -0
  79. package/dist/tools/memory-search.js.map +1 -0
  80. package/dist/tools/memory-update.d.ts +11 -0
  81. package/dist/tools/memory-update.d.ts.map +1 -0
  82. package/dist/tools/memory-update.js +142 -0
  83. package/dist/tools/memory-update.js.map +1 -0
  84. package/dist/tools/style-extract.d.ts +40 -0
  85. package/dist/tools/style-extract.d.ts.map +1 -0
  86. package/dist/tools/style-extract.js +43 -0
  87. package/dist/tools/style-extract.js.map +1 -0
  88. package/dist/tools/utils.d.ts +28 -0
  89. package/dist/tools/utils.d.ts.map +1 -0
  90. package/dist/tools/utils.js +33 -0
  91. package/dist/tools/utils.js.map +1 -0
  92. package/dist/types.d.ts +216 -0
  93. package/dist/types.d.ts.map +1 -0
  94. package/dist/types.js +6 -0
  95. package/dist/types.js.map +1 -0
  96. package/dist/validation.d.ts +122 -0
  97. package/dist/validation.d.ts.map +1 -0
  98. package/dist/validation.js +96 -0
  99. package/dist/validation.js.map +1 -0
  100. package/dist/vector.d.ts +30 -0
  101. package/dist/vector.d.ts.map +1 -0
  102. package/dist/vector.js +90 -0
  103. package/dist/vector.js.map +1 -0
  104. package/package.json +75 -0
@@ -0,0 +1,79 @@
1
+ /**
2
+ * memory_health — diagnostic report on memory store quality.
3
+ *
4
+ * Returns health metrics: expired entries, orphaned chains, stale memories,
5
+ * low-confidence entries, and storage stats per layer.
6
+ * Optional cleanup=true garbage-collects expired entries.
7
+ */
8
+ export function memoryHealth(db, input) {
9
+ const now = "strftime('%Y-%m-%dT%H:%M:%SZ', 'now')";
10
+ // Total active memories per layer
11
+ const activeByLayer = db
12
+ .prepare(`SELECT layer, COUNT(*) AS count FROM memories
13
+ WHERE superseded_by IS NULL
14
+ GROUP BY layer`)
15
+ .all();
16
+ const totalActive = activeByLayer.reduce((sum, r) => sum + r.count, 0);
17
+ const totalSuperseded = db
18
+ .prepare(`SELECT COUNT(*) AS count FROM memories WHERE superseded_by IS NOT NULL`)
19
+ .get().count;
20
+ // Expired entries (TTL past due, not yet cleaned up)
21
+ const expired = db
22
+ .prepare(`SELECT id, title, expires_at FROM memories
23
+ WHERE expires_at IS NOT NULL AND expires_at < ${now}
24
+ AND superseded_by IS NULL
25
+ ORDER BY expires_at ASC
26
+ LIMIT 50`)
27
+ .all();
28
+ // Orphaned chains: supersedes points to a non-existent memory
29
+ const orphaned = db
30
+ .prepare(`SELECT m.id, m.supersedes FROM memories m
31
+ WHERE m.supersedes IS NOT NULL
32
+ AND NOT EXISTS (SELECT 1 FROM memories m2 WHERE m2.id = m.supersedes)
33
+ LIMIT 50`)
34
+ .all();
35
+ // Stale memories: active, not accessed in 30+ days (or never accessed)
36
+ const staleCount = db
37
+ .prepare(`SELECT COUNT(*) AS count FROM memories
38
+ WHERE superseded_by IS NULL
39
+ AND (last_accessed IS NULL OR julianday('now') - julianday(last_accessed) > 30)
40
+ AND julianday('now') - julianday(created_at) > 7`)
41
+ .get().count;
42
+ // Low-confidence entries (below 0.3)
43
+ const lowConfidenceCount = db
44
+ .prepare(`SELECT COUNT(*) AS count FROM memories
45
+ WHERE superseded_by IS NULL AND confidence < 0.3`)
46
+ .get().count;
47
+ // Optional: clean up expired entries
48
+ let cleaned = 0;
49
+ if (input.cleanup) {
50
+ const result = db.prepare(`DELETE FROM memories
51
+ WHERE expires_at IS NOT NULL AND expires_at < ${now}`).run();
52
+ cleaned = result.changes;
53
+ }
54
+ const issues = [];
55
+ if (expired.length > 0)
56
+ issues.push(`${expired.length} expired entries need cleanup`);
57
+ if (orphaned.length > 0)
58
+ issues.push(`${orphaned.length} orphaned chain references`);
59
+ if (staleCount > 0)
60
+ issues.push(`${staleCount} stale memories (not accessed in 30+ days)`);
61
+ if (lowConfidenceCount > 0)
62
+ issues.push(`${lowConfidenceCount} low-confidence entries (<0.3)`);
63
+ const status = issues.length === 0 ? "healthy" : issues.length <= 2 ? "warning" : "degraded";
64
+ return {
65
+ status,
66
+ issues,
67
+ stats: {
68
+ total_active: totalActive,
69
+ total_superseded: totalSuperseded,
70
+ by_layer: Object.fromEntries(activeByLayer.map((r) => [r.layer, r.count])),
71
+ },
72
+ expired: expired.map((r) => ({ id: r.id, title: r.title, expires_at: r.expires_at })),
73
+ orphaned_chains: orphaned.map((r) => ({ id: r.id, missing_supersedes: r.supersedes })),
74
+ stale_count: staleCount,
75
+ low_confidence_count: lowConfidenceCount,
76
+ ...(input.cleanup ? { cleaned_expired: cleaned } : {}),
77
+ };
78
+ }
79
+ //# sourceMappingURL=memory-health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-health.js","sourceRoot":"","sources":["../../src/tools/memory-health.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * memory_inspect — introspect layer stats or trace a memory's superseding chain.
3
+ *
4
+ * Without id: return aggregate stats per layer.
5
+ * With id: return full memory row + superseded_chain (follow supersedes links).
6
+ */
7
+ import type Database from "better-sqlite3";
8
+ import type { MemoryInspectInput, MemoryInspectOutput } from "../types.js";
9
+ export declare function memoryInspect(db: Database.Database, input: MemoryInspectInput): MemoryInspectOutput;
10
+ //# sourceMappingURL=memory-inspect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-inspect.d.ts","sourceRoot":"","sources":["../../src/tools/memory-inspect.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAGV,kBAAkB,EAClB,mBAAmB,EAEpB,MAAM,aAAa,CAAC;AA8BrB,wBAAgB,aAAa,CAC3B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,kBAAkB,GACxB,mBAAmB,CAMrB"}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * memory_inspect — introspect layer stats or trace a memory's superseding chain.
3
+ *
4
+ * Without id: return aggregate stats per layer.
5
+ * With id: return full memory row + superseded_chain (follow supersedes links).
6
+ */
7
+ const LAYERS = ["episodic", "semantic", "procedural", "resource"];
8
+ /** Explicit column list matching MemoryRow — prevents leaking internal columns (stemmed_*). */
9
+ const MEMORY_COLUMNS = `
10
+ id, layer, content, title, source, source_file, session_id,
11
+ created_at, updated_at, event_at, expires_at,
12
+ confidence, importance, access_count, last_accessed,
13
+ superseded_by, supersedes, entity_type, entity_name,
14
+ scope, embedding, meta, valid_from, valid_until
15
+ `;
16
+ export function memoryInspect(db, input) {
17
+ if (input.id) {
18
+ return inspectById(db, input.id, input.include_history ?? false);
19
+ }
20
+ return inspectLayerStats(db, input);
21
+ }
22
+ function inspectById(db, id, includeHistory) {
23
+ const memory = db
24
+ .prepare(`SELECT ${MEMORY_COLUMNS} FROM memories WHERE id = ?`)
25
+ .get(id);
26
+ if (!memory) {
27
+ throw new Error(`Memory not found: ${id}`);
28
+ }
29
+ // Update access tracking
30
+ db.prepare(`UPDATE memories
31
+ SET access_count = access_count + 1,
32
+ last_accessed = strftime('%Y-%m-%dT%H:%M:%SZ', 'now')
33
+ WHERE id = ?`).run(id);
34
+ const result = { memory };
35
+ if (includeHistory) {
36
+ result.superseded_chain = buildSupersededChain(db, memory);
37
+ }
38
+ return result;
39
+ }
40
+ /**
41
+ * Follow supersedes links backwards to build the full history chain.
42
+ * Stops at MAX_CHAIN_DEPTH to prevent infinite loops in corrupted data.
43
+ */
44
+ function buildSupersededChain(db, root, maxDepth = 50) {
45
+ const chain = [];
46
+ let currentId = root.supersedes;
47
+ let depth = 0;
48
+ while (currentId && depth < maxDepth) {
49
+ const row = db
50
+ .prepare(`SELECT ${MEMORY_COLUMNS} FROM memories WHERE id = ?`)
51
+ .get(currentId);
52
+ if (!row)
53
+ break;
54
+ chain.push(row);
55
+ currentId = row.supersedes;
56
+ depth++;
57
+ }
58
+ return chain;
59
+ }
60
+ function inspectLayerStats(db, input) {
61
+ const layerFilter = input.layer ? `AND layer = ?` : "";
62
+ const entityFilter = input.entity_name ? `AND entity_name = ?` : "";
63
+ const statsParams = [];
64
+ if (input.layer)
65
+ statsParams.push(input.layer);
66
+ if (input.entity_name)
67
+ statsParams.push(input.entity_name);
68
+ const statsRows = db
69
+ .prepare(`SELECT
70
+ layer,
71
+ COUNT(*) AS total,
72
+ SUM(CASE WHEN superseded_by IS NULL THEN 1 ELSE 0 END) AS active,
73
+ SUM(CASE WHEN superseded_by IS NOT NULL THEN 1 ELSE 0 END) AS superseded,
74
+ AVG(CASE WHEN superseded_by IS NULL THEN confidence ELSE NULL END) AS avg_confidence,
75
+ SUM(CASE WHEN superseded_by IS NULL AND access_count = 0 THEN 1 ELSE 0 END) AS never_accessed,
76
+ SUM(CASE WHEN superseded_by IS NULL AND last_accessed IS NOT NULL
77
+ AND julianday('now') - julianday(last_accessed) > 30 THEN 1 ELSE 0 END) AS stale_count,
78
+ AVG(CASE WHEN superseded_by IS NULL
79
+ THEN julianday('now') - julianday(created_at) ELSE NULL END) AS avg_age_days
80
+ FROM memories
81
+ WHERE 1=1 ${layerFilter} ${entityFilter}
82
+ GROUP BY layer`)
83
+ .all(...statsParams);
84
+ // Build stats map with defaults for layers that have no records
85
+ const statsMap = new Map();
86
+ for (const layer of LAYERS) {
87
+ statsMap.set(layer, {
88
+ total: 0,
89
+ active: 0,
90
+ superseded: 0,
91
+ avg_confidence: 0,
92
+ never_accessed: 0,
93
+ stale_count: 0,
94
+ avg_age_days: 0,
95
+ top_entities: [],
96
+ });
97
+ }
98
+ for (const row of statsRows) {
99
+ const layer = row.layer;
100
+ statsMap.set(layer, {
101
+ total: row.total,
102
+ active: row.active,
103
+ superseded: row.superseded,
104
+ avg_confidence: row.avg_confidence ?? 0,
105
+ never_accessed: row.never_accessed ?? 0,
106
+ stale_count: row.stale_count ?? 0,
107
+ avg_age_days: Math.round((row.avg_age_days ?? 0) * 10) / 10,
108
+ top_entities: [],
109
+ });
110
+ }
111
+ // Fetch top 5 entities per layer in a single query using window function
112
+ const entityRows = db
113
+ .prepare(`WITH ranked AS (
114
+ SELECT
115
+ layer,
116
+ entity_name,
117
+ COUNT(*) AS cnt,
118
+ ROW_NUMBER() OVER (PARTITION BY layer ORDER BY COUNT(*) DESC) AS rn
119
+ FROM memories
120
+ WHERE superseded_by IS NULL
121
+ AND entity_name IS NOT NULL
122
+ ${layerFilter} ${entityFilter}
123
+ GROUP BY layer, entity_name
124
+ )
125
+ SELECT layer, entity_name, cnt
126
+ FROM ranked
127
+ WHERE rn <= 5
128
+ ORDER BY layer, cnt DESC`)
129
+ .all(...statsParams);
130
+ for (const row of entityRows) {
131
+ const stat = statsMap.get(row.layer);
132
+ if (stat) {
133
+ stat.top_entities.push({ entity_name: row.entity_name, count: row.cnt });
134
+ }
135
+ }
136
+ const layer_stats = Object.fromEntries(statsMap);
137
+ return { layer_stats };
138
+ }
139
+ //# sourceMappingURL=memory-inspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-inspect.js","sourceRoot":"","sources":["../../src/tools/memory-inspect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * memory_search — FTS5-backed search with layer/entity/date/scope filtering.
3
+ *
4
+ * Default mode: 'fts' — tokenize query into words, build FTS5 AND query.
5
+ * Scores via FTS5 bm25(), normalized to 0–1 range.
6
+ * Superseded entries excluded unless include_superseded=true.
7
+ *
8
+ * Search modes:
9
+ * fts — FTS5 tokenized search (default)
10
+ * exact — LIKE substring match, fixed score 1.0
11
+ */
12
+ import type Database from "better-sqlite3";
13
+ import type { MemorySearchInput, MemorySearchOutput } from "../types.js";
14
+ import type { Embedder } from "../embedder.js";
15
+ export declare function memorySearch(db: Database.Database, input: MemorySearchInput, embedder?: Embedder | null): Promise<MemorySearchOutput>;
16
+ //# sourceMappingURL=memory-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-search.d.ts","sourceRoot":"","sources":["../../src/tools/memory-search.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAGV,iBAAiB,EACjB,kBAAkB,EAEnB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAgI/C,wBAAsB,YAAY,CAChC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,iBAAiB,EACxB,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,GACzB,OAAO,CAAC,kBAAkB,CAAC,CA8F7B"}