persisted-memory 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 (56) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +281 -0
  3. package/dist/cli/generate-summary.d.ts +1 -0
  4. package/dist/cli/generate-summary.js +13 -0
  5. package/dist/cli/generate-summary.js.map +1 -0
  6. package/dist/cli/viewer.d.ts +1 -0
  7. package/dist/cli/viewer.js +4 -0
  8. package/dist/cli/viewer.js.map +1 -0
  9. package/dist/embeddings/ollama.d.ts +3 -0
  10. package/dist/embeddings/ollama.js +63 -0
  11. package/dist/embeddings/ollama.js.map +1 -0
  12. package/dist/index.d.ts +2 -0
  13. package/dist/index.js +25 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/search/hybrid.d.ts +8 -0
  16. package/dist/search/hybrid.js +54 -0
  17. package/dist/search/hybrid.js.map +1 -0
  18. package/dist/server.d.ts +2 -0
  19. package/dist/server.js +399 -0
  20. package/dist/server.js.map +1 -0
  21. package/dist/storage/knowledge-graph.d.ts +32 -0
  22. package/dist/storage/knowledge-graph.js +259 -0
  23. package/dist/storage/knowledge-graph.js.map +1 -0
  24. package/dist/storage/lance-store.d.ts +21 -0
  25. package/dist/storage/lance-store.js +288 -0
  26. package/dist/storage/lance-store.js.map +1 -0
  27. package/dist/storage/markdown-store.d.ts +7 -0
  28. package/dist/storage/markdown-store.js +63 -0
  29. package/dist/storage/markdown-store.js.map +1 -0
  30. package/dist/storage/types.d.ts +19 -0
  31. package/dist/storage/types.js +13 -0
  32. package/dist/storage/types.js.map +1 -0
  33. package/dist/utils/chunking.d.ts +1 -0
  34. package/dist/utils/chunking.js +55 -0
  35. package/dist/utils/chunking.js.map +1 -0
  36. package/dist/utils/privacy.d.ts +13 -0
  37. package/dist/utils/privacy.js +23 -0
  38. package/dist/utils/privacy.js.map +1 -0
  39. package/dist/utils/project.d.ts +3 -0
  40. package/dist/utils/project.js +11 -0
  41. package/dist/utils/project.js.map +1 -0
  42. package/dist/utils/summarize.d.ts +12 -0
  43. package/dist/utils/summarize.js +123 -0
  44. package/dist/utils/summarize.js.map +1 -0
  45. package/dist/viewer/index.html +328 -0
  46. package/dist/viewer/server.d.ts +1 -0
  47. package/dist/viewer/server.js +203 -0
  48. package/dist/viewer/server.js.map +1 -0
  49. package/hooks/on-post-tool.sh +17 -0
  50. package/hooks/on-pre-compact.sh +20 -0
  51. package/hooks/on-session-end.sh +46 -0
  52. package/hooks/on-session-start.sh +14 -0
  53. package/hooks/on-stop.sh +6 -0
  54. package/package.json +60 -0
  55. package/scripts/install.sh +125 -0
  56. package/scripts/uninstall.sh +59 -0
package/dist/server.js ADDED
@@ -0,0 +1,399 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { z } from "zod";
3
+ import { randomUUID } from "node:crypto";
4
+ import { join, dirname } from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ import { spawn } from "node:child_process";
7
+ import { MEMORY_TYPES, IMPORTANCE_LEVELS } from "./storage/types.js";
8
+ import * as lanceStore from "./storage/lance-store.js";
9
+ import * as mdStore from "./storage/markdown-store.js";
10
+ import * as kgStore from "./storage/knowledge-graph.js";
11
+ import { embed, isAvailable } from "./embeddings/ollama.js";
12
+ import { hybridSearch } from "./search/hybrid.js";
13
+ import { chunkText } from "./utils/chunking.js";
14
+ import { getMemoryDir, getProjectName } from "./utils/project.js";
15
+ import { stripPrivate, hasPrivateContent } from "./utils/privacy.js";
16
+ const __filename = fileURLToPath(import.meta.url);
17
+ const __dirname = dirname(__filename);
18
+ const SUMMARY_TRUNCATE_LENGTH = 200;
19
+ // Lazy initialization cache per memory dir
20
+ const initPromises = new Map();
21
+ async function ensureInit() {
22
+ const memoryDir = getMemoryDir();
23
+ if (!initPromises.has(memoryDir)) {
24
+ initPromises.set(memoryDir, (async () => {
25
+ mdStore.ensureDirs(memoryDir);
26
+ await lanceStore.init(memoryDir);
27
+ return memoryDir;
28
+ })());
29
+ }
30
+ return initPromises.get(memoryDir);
31
+ }
32
+ let graphMutex = Promise.resolve();
33
+ async function withGraphLock(fn) {
34
+ const prev = graphMutex;
35
+ let resolve;
36
+ graphMutex = new Promise((r) => { resolve = r; });
37
+ await prev;
38
+ try {
39
+ return fn();
40
+ }
41
+ finally {
42
+ resolve();
43
+ }
44
+ }
45
+ export function createServer() {
46
+ const server = new McpServer({
47
+ name: "persisted-memory",
48
+ version: "1.0.0",
49
+ });
50
+ // --- memory_store ---
51
+ server.tool("memory_store", "Store a memory entry. Wrap sensitive content in <private>...</private> tags to exclude it from summaries and public views. Dual-writes to both LanceDB (vector index) and Markdown files (source of truth).", {
52
+ text: z.string().describe("The memory content to store"),
53
+ type: z.enum(MEMORY_TYPES).describe("Category of memory"),
54
+ importance: z.enum(IMPORTANCE_LEVELS).describe("How important this memory is"),
55
+ file_paths: z.array(z.string()).optional().describe("Related file paths"),
56
+ tags: z.array(z.string()).optional().describe("Free-form tags"),
57
+ session_id: z.string().optional().describe("Claude Code session ID"),
58
+ }, async (params) => {
59
+ const memoryDir = await ensureInit();
60
+ const entry = {
61
+ id: randomUUID(),
62
+ text: params.text,
63
+ type: params.type,
64
+ importance: params.importance,
65
+ timestamp: Date.now(),
66
+ session_id: params.session_id,
67
+ file_paths: params.file_paths,
68
+ tags: params.tags,
69
+ };
70
+ // Get embedding
71
+ const chunks = chunkText(entry.text);
72
+ const vector = await embed(chunks[0]);
73
+ // Store in LanceDB
74
+ await lanceStore.store(entry, vector || new Array(768).fill(0));
75
+ // If text is long, store additional chunks
76
+ for (let i = 1; i < chunks.length; i++) {
77
+ const chunkEntry = {
78
+ ...entry,
79
+ id: randomUUID(),
80
+ text: chunks[i],
81
+ };
82
+ const chunkVec = await embed(chunks[i]);
83
+ await lanceStore.store(chunkEntry, chunkVec || new Array(768).fill(0));
84
+ }
85
+ // Dual-write to Markdown
86
+ mdStore.appendDaily(memoryDir, `**[${entry.type}]** (${entry.importance})\n\n${entry.text}`);
87
+ if (entry.type === "decision") {
88
+ mdStore.appendDecision(memoryDir, entry.text);
89
+ }
90
+ // Update knowledge graph with extracted entities
91
+ await withGraphLock(() => {
92
+ const graph = kgStore.loadGraph(memoryDir);
93
+ kgStore.updateGraphFromMemory(graph, entry.id, entry.text, entry.tags, entry.file_paths);
94
+ kgStore.saveGraph(memoryDir, graph);
95
+ });
96
+ return {
97
+ content: [
98
+ {
99
+ type: "text",
100
+ text: JSON.stringify({
101
+ id: entry.id,
102
+ stored: true,
103
+ chunks: chunks.length,
104
+ project: getProjectName(),
105
+ }),
106
+ },
107
+ ],
108
+ };
109
+ });
110
+ // --- memory_search ---
111
+ server.tool("memory_search", "Search memories using hybrid search (70% semantic + 30% keyword). Falls back to keyword-only if Ollama is unavailable.", {
112
+ query: z.string().describe("Search query"),
113
+ limit: z.number().optional().default(10).describe("Max results to return"),
114
+ type: z.enum(MEMORY_TYPES).optional().describe("Filter by memory type"),
115
+ importance: z.enum(IMPORTANCE_LEVELS).optional().describe("Filter by importance"),
116
+ }, async (params) => {
117
+ await ensureInit();
118
+ const results = await hybridSearch(params.query, params.limit, {
119
+ type: params.type,
120
+ importance: params.importance,
121
+ });
122
+ return {
123
+ content: [
124
+ {
125
+ type: "text",
126
+ text: JSON.stringify({
127
+ results: results.map((r) => ({
128
+ id: r.id,
129
+ text: stripPrivate(r.text),
130
+ type: r.type,
131
+ importance: r.importance,
132
+ score: Math.round(r.score * 1000) / 1000,
133
+ timestamp: r.timestamp,
134
+ file_paths: r.file_paths,
135
+ tags: r.tags,
136
+ })),
137
+ count: results.length,
138
+ project: getProjectName(),
139
+ }),
140
+ },
141
+ ],
142
+ };
143
+ });
144
+ // --- memory_recall ---
145
+ server.tool("memory_recall", "Recall memories about a specific topic. Returns formatted, human-readable results optimized for context injection. Supports progressive disclosure via detail_level to save tokens.", {
146
+ topic: z.string().describe("Topic to recall memories about"),
147
+ limit: z.number().optional().default(5).describe("Max results"),
148
+ detail_level: z.enum(["summary", "detailed", "ids_only"]).optional().default("summary").describe("Level of detail: 'summary' (default, token-efficient), 'detailed' (full text), 'ids_only' (minimal)"),
149
+ }, async (params) => {
150
+ await ensureInit();
151
+ const results = await hybridSearch(params.topic, params.limit);
152
+ if (results.length === 0) {
153
+ return {
154
+ content: [
155
+ {
156
+ type: "text",
157
+ text: `No memories found for topic: "${params.topic}"`,
158
+ },
159
+ ],
160
+ };
161
+ }
162
+ const detailLevel = params.detail_level ?? "summary";
163
+ if (detailLevel === "ids_only") {
164
+ const items = results.map((r) => ({
165
+ id: r.id,
166
+ type: r.type,
167
+ importance: r.importance,
168
+ score: Math.round(r.score * 1000) / 1000,
169
+ }));
170
+ return {
171
+ content: [
172
+ {
173
+ type: "text",
174
+ text: JSON.stringify({
175
+ results: items,
176
+ count: results.length,
177
+ project: getProjectName(),
178
+ hint: `Use detail_level: "detailed" for full content, or memory_search with specific IDs`,
179
+ }),
180
+ },
181
+ ],
182
+ };
183
+ }
184
+ if (detailLevel === "detailed") {
185
+ const formatted = results
186
+ .map((r, i) => {
187
+ const date = new Date(r.timestamp).toISOString().slice(0, 16).replace("T", " ");
188
+ const tags = r.tags?.length ? ` [${r.tags.join(", ")}]` : "";
189
+ const displayText = stripPrivate(r.text);
190
+ const privateFlag = hasPrivateContent(r.text) ? " [private]" : "";
191
+ return `${i + 1}. **${r.type}** (${r.importance}) — ${date}${tags}${privateFlag}\n ${displayText}`;
192
+ })
193
+ .join("\n\n");
194
+ return {
195
+ content: [
196
+ {
197
+ type: "text",
198
+ text: `## Memories: ${params.topic}\n\n${formatted}`,
199
+ },
200
+ ],
201
+ };
202
+ }
203
+ // Default: summary — truncated text for token efficiency
204
+ const formatted = results
205
+ .map((r, i) => {
206
+ const date = new Date(r.timestamp).toISOString().slice(0, 16).replace("T", " ");
207
+ const tags = r.tags?.length ? ` [${r.tags.join(", ")}]` : "";
208
+ const displayText = stripPrivate(r.text);
209
+ const privateFlag = hasPrivateContent(r.text) ? " [private]" : "";
210
+ const truncatedText = displayText.length > SUMMARY_TRUNCATE_LENGTH ? displayText.slice(0, SUMMARY_TRUNCATE_LENGTH) + "..." : displayText;
211
+ return `${i + 1}. **${r.type}** (${r.importance}) — ${date}${tags}${privateFlag}\n ${truncatedText}`;
212
+ })
213
+ .join("\n\n");
214
+ return {
215
+ content: [
216
+ {
217
+ type: "text",
218
+ text: `## Memories: ${params.topic}\n\n${formatted}\n\n_Use detail_level: "detailed" for full content, or memory_search with specific IDs_`,
219
+ },
220
+ ],
221
+ };
222
+ });
223
+ // --- memory_list ---
224
+ server.tool("memory_list", "List stored memories with pagination. Returns entries sorted by timestamp (newest first).", {
225
+ limit: z.number().optional().default(20).describe("Max entries to return"),
226
+ offset: z.number().optional().default(0).describe("Offset for pagination"),
227
+ type: z.enum(MEMORY_TYPES).optional().describe("Filter by memory type"),
228
+ }, async (params) => {
229
+ await ensureInit();
230
+ const entries = await lanceStore.list(params.limit, params.offset, params.type);
231
+ const total = await lanceStore.count();
232
+ return {
233
+ content: [
234
+ {
235
+ type: "text",
236
+ text: JSON.stringify({
237
+ entries: entries.map((e) => {
238
+ const displayText = stripPrivate(e.text);
239
+ return {
240
+ id: e.id,
241
+ text: displayText.slice(0, SUMMARY_TRUNCATE_LENGTH) + (displayText.length > SUMMARY_TRUNCATE_LENGTH ? "..." : ""),
242
+ type: e.type,
243
+ importance: e.importance,
244
+ timestamp: e.timestamp,
245
+ };
246
+ }),
247
+ total,
248
+ project: getProjectName(),
249
+ }),
250
+ },
251
+ ],
252
+ };
253
+ });
254
+ // --- memory_status ---
255
+ server.tool("memory_status", "Get memory system status: total entries, entries by type, Ollama availability, and memory directory path.", {}, async () => {
256
+ const memoryDir = await ensureInit();
257
+ const [total, byType, ollamaAvailable] = await Promise.all([
258
+ lanceStore.count(),
259
+ lanceStore.countByType(),
260
+ isAvailable(),
261
+ ]);
262
+ const summary = mdStore.readSummary(memoryDir);
263
+ return {
264
+ content: [
265
+ {
266
+ type: "text",
267
+ text: JSON.stringify({
268
+ total,
269
+ by_type: byType,
270
+ ollama_available: ollamaAvailable,
271
+ memory_dir: memoryDir,
272
+ project: getProjectName(),
273
+ has_summary: summary !== null,
274
+ }),
275
+ },
276
+ ],
277
+ };
278
+ });
279
+ // --- memory_forget ---
280
+ server.tool("memory_forget", "Delete a specific memory entry by ID from the vector index.", {
281
+ id: z.string().describe("Memory entry ID to delete"),
282
+ }, async (params) => {
283
+ const memoryDir = await ensureInit();
284
+ await lanceStore.deleteEntry(params.id);
285
+ // Prune knowledge graph of references to the deleted memory
286
+ await withGraphLock(() => {
287
+ const graph = kgStore.loadGraph(memoryDir);
288
+ kgStore.removeMemoryFromGraph(graph, params.id);
289
+ kgStore.saveGraph(memoryDir, graph);
290
+ });
291
+ return {
292
+ content: [
293
+ {
294
+ type: "text",
295
+ text: JSON.stringify({ deleted: true, id: params.id }),
296
+ },
297
+ ],
298
+ };
299
+ });
300
+ // --- memory_consolidate ---
301
+ server.tool("memory_consolidate", "Consolidate memories by finding and removing near-duplicate entries (cosine similarity > 0.95). Keeps the entry with higher importance or newer timestamp.", {}, async () => {
302
+ await ensureInit();
303
+ const result = await lanceStore.consolidate(embed);
304
+ return {
305
+ content: [
306
+ {
307
+ type: "text",
308
+ text: JSON.stringify({
309
+ merged: result.merged,
310
+ removed: result.removed,
311
+ project: getProjectName(),
312
+ }),
313
+ },
314
+ ],
315
+ };
316
+ });
317
+ // --- memory_graph ---
318
+ server.tool("memory_graph", "Explore the knowledge graph. Find entities and their relationships to understand how concepts connect across memories.", {
319
+ entity: z.string().optional().describe("Entity name to explore connections for"),
320
+ list_entities: z.boolean().optional().default(false).describe("List all known entities"),
321
+ }, async (params) => {
322
+ const memoryDir = await ensureInit();
323
+ const graph = kgStore.loadGraph(memoryDir);
324
+ if (params.entity) {
325
+ const result = kgStore.findRelated(graph, params.entity);
326
+ const target = graph.entities[params.entity.toLowerCase().trim()];
327
+ return {
328
+ content: [
329
+ {
330
+ type: "text",
331
+ text: JSON.stringify({
332
+ entity: target || null,
333
+ connected_entities: result.entities,
334
+ relations: result.relations,
335
+ project: getProjectName(),
336
+ }),
337
+ },
338
+ ],
339
+ };
340
+ }
341
+ if (params.list_entities) {
342
+ const entities = Object.values(graph.entities).sort((a, b) => b.last_seen - a.last_seen);
343
+ return {
344
+ content: [
345
+ {
346
+ type: "text",
347
+ text: JSON.stringify({
348
+ entities,
349
+ total: entities.length,
350
+ project: getProjectName(),
351
+ }),
352
+ },
353
+ ],
354
+ };
355
+ }
356
+ // Default: return graph summary
357
+ const entityCount = Object.keys(graph.entities).length;
358
+ const relationCount = graph.relations.length;
359
+ return {
360
+ content: [
361
+ {
362
+ type: "text",
363
+ text: JSON.stringify({
364
+ entity_count: entityCount,
365
+ relation_count: relationCount,
366
+ project: getProjectName(),
367
+ hint: "Use entity param to explore connections, or list_entities: true to see all entities.",
368
+ }),
369
+ },
370
+ ],
371
+ };
372
+ });
373
+ // --- memory_viewer ---
374
+ server.tool("memory_viewer", "Launch the web-based memory viewer for visual exploration of stored memories.", {
375
+ port: z.number().optional().default(3777).describe("Port to serve the viewer on"),
376
+ }, async (params) => {
377
+ const viewerScript = join(__dirname, "cli", "viewer.js");
378
+ const child = spawn("node", [viewerScript], {
379
+ env: { ...process.env, PORT: String(params.port) },
380
+ stdio: "ignore",
381
+ detached: true,
382
+ });
383
+ child.unref();
384
+ return {
385
+ content: [
386
+ {
387
+ type: "text",
388
+ text: JSON.stringify({
389
+ launched: true,
390
+ url: `http://localhost:${params.port}`,
391
+ note: "Memory viewer launched. Open the URL in your browser.",
392
+ }),
393
+ },
394
+ ],
395
+ };
396
+ });
397
+ return server;
398
+ }
399
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export interface Entity {
2
+ name: string;
3
+ type: "concept" | "file" | "tool" | "person" | "project" | "technology";
4
+ memory_ids: string[];
5
+ first_seen: number;
6
+ last_seen: number;
7
+ }
8
+ export interface Relation {
9
+ from: string;
10
+ to: string;
11
+ type: "relates_to" | "depends_on" | "replaces" | "contradicts" | "part_of";
12
+ memory_id: string;
13
+ timestamp: number;
14
+ }
15
+ export interface KnowledgeGraph {
16
+ entities: Record<string, Entity>;
17
+ relations: Relation[];
18
+ }
19
+ export declare function loadGraph(memoryDir: string): KnowledgeGraph;
20
+ export declare function saveGraph(memoryDir: string, graph: KnowledgeGraph): void;
21
+ export declare function addEntity(graph: KnowledgeGraph, name: string, type: Entity["type"], memoryId: string): void;
22
+ export declare function addRelation(graph: KnowledgeGraph, from: string, to: string, type: Relation["type"], memoryId: string): void;
23
+ export declare function findRelated(graph: KnowledgeGraph, entityName: string): {
24
+ entities: Entity[];
25
+ relations: Relation[];
26
+ };
27
+ export declare function extractEntities(text: string, tags?: string[], filePaths?: string[]): Array<{
28
+ name: string;
29
+ type: Entity["type"];
30
+ }>;
31
+ export declare function updateGraphFromMemory(graph: KnowledgeGraph, memoryId: string, text: string, tags?: string[], filePaths?: string[]): void;
32
+ export declare function removeMemoryFromGraph(graph: KnowledgeGraph, memoryId: string): void;