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.
- package/CHANGELOG.md +34 -0
- package/CONTRIBUTING.md +59 -0
- package/LICENSE +21 -0
- package/README.md +434 -0
- package/SECURITY.md +29 -0
- package/config.example.json +52 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/db.d.ts +16 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +360 -0
- package/dist/db.js.map +1 -0
- package/dist/embedder.d.ts +22 -0
- package/dist/embedder.d.ts.map +1 -0
- package/dist/embedder.js +109 -0
- package/dist/embedder.js.map +1 -0
- package/dist/import/cli.d.ts +12 -0
- package/dist/import/cli.d.ts.map +1 -0
- package/dist/import/cli.js +105 -0
- package/dist/import/cli.js.map +1 -0
- package/dist/import/config-loader.d.ts +29 -0
- package/dist/import/config-loader.d.ts.map +1 -0
- package/dist/import/config-loader.js +140 -0
- package/dist/import/config-loader.js.map +1 -0
- package/dist/import/kb-config.d.ts +27 -0
- package/dist/import/kb-config.d.ts.map +1 -0
- package/dist/import/kb-config.js +10 -0
- package/dist/import/kb-config.js.map +1 -0
- package/dist/import/kb-import.d.ts +45 -0
- package/dist/import/kb-import.d.ts.map +1 -0
- package/dist/import/kb-import.js +285 -0
- package/dist/import/kb-import.js.map +1 -0
- package/dist/import/md-parser.d.ts +35 -0
- package/dist/import/md-parser.d.ts.map +1 -0
- package/dist/import/md-parser.js +104 -0
- package/dist/import/md-parser.js.map +1 -0
- package/dist/index-http.d.ts +12 -0
- package/dist/index-http.d.ts.map +1 -0
- package/dist/index-http.js +202 -0
- package/dist/index-http.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +16 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +341 -0
- package/dist/server.js.map +1 -0
- package/dist/stemmer.d.ts +29 -0
- package/dist/stemmer.d.ts.map +1 -0
- package/dist/stemmer.js +68 -0
- package/dist/stemmer.js.map +1 -0
- package/dist/stop-words.d.ts +12 -0
- package/dist/stop-words.d.ts.map +1 -0
- package/dist/stop-words.js +112 -0
- package/dist/stop-words.js.map +1 -0
- package/dist/tools/memory-add.d.ts +15 -0
- package/dist/tools/memory-add.d.ts.map +1 -0
- package/dist/tools/memory-add.js +120 -0
- package/dist/tools/memory-add.js.map +1 -0
- package/dist/tools/memory-delete.d.ts +10 -0
- package/dist/tools/memory-delete.d.ts.map +1 -0
- package/dist/tools/memory-delete.js +39 -0
- package/dist/tools/memory-delete.js.map +1 -0
- package/dist/tools/memory-export.d.ts +10 -0
- package/dist/tools/memory-export.d.ts.map +1 -0
- package/dist/tools/memory-export.js +102 -0
- package/dist/tools/memory-export.js.map +1 -0
- package/dist/tools/memory-health.d.ts +11 -0
- package/dist/tools/memory-health.d.ts.map +1 -0
- package/dist/tools/memory-health.js +79 -0
- package/dist/tools/memory-health.js.map +1 -0
- package/dist/tools/memory-inspect.d.ts +10 -0
- package/dist/tools/memory-inspect.d.ts.map +1 -0
- package/dist/tools/memory-inspect.js +139 -0
- package/dist/tools/memory-inspect.js.map +1 -0
- package/dist/tools/memory-search.d.ts +16 -0
- package/dist/tools/memory-search.d.ts.map +1 -0
- package/dist/tools/memory-search.js +459 -0
- package/dist/tools/memory-search.js.map +1 -0
- package/dist/tools/memory-update.d.ts +11 -0
- package/dist/tools/memory-update.d.ts.map +1 -0
- package/dist/tools/memory-update.js +142 -0
- package/dist/tools/memory-update.js.map +1 -0
- package/dist/tools/style-extract.d.ts +40 -0
- package/dist/tools/style-extract.d.ts.map +1 -0
- package/dist/tools/style-extract.js +43 -0
- package/dist/tools/style-extract.js.map +1 -0
- package/dist/tools/utils.d.ts +28 -0
- package/dist/tools/utils.d.ts.map +1 -0
- package/dist/tools/utils.js +33 -0
- package/dist/tools/utils.js.map +1 -0
- package/dist/types.d.ts +216 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/validation.d.ts +122 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +96 -0
- package/dist/validation.js.map +1 -0
- package/dist/vector.d.ts +30 -0
- package/dist/vector.d.ts.map +1 -0
- package/dist/vector.js +90 -0
- package/dist/vector.js.map +1 -0
- 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"}
|