vesper-memory 0.5.3 → 0.6.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 (80) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +16 -12
  3. package/config/sqlite-schema.sql +31 -0
  4. package/dist/cli.js +6 -49
  5. package/dist/cli.js.map +1 -1
  6. package/dist/consolidation/pipeline.d.ts +25 -6
  7. package/dist/consolidation/pipeline.d.ts.map +1 -1
  8. package/dist/consolidation/pipeline.js +310 -67
  9. package/dist/consolidation/pipeline.js.map +1 -1
  10. package/dist/memory-layers/semantic-memory.d.ts +8 -3
  11. package/dist/memory-layers/semantic-memory.d.ts.map +1 -1
  12. package/dist/memory-layers/semantic-memory.js +110 -50
  13. package/dist/memory-layers/semantic-memory.js.map +1 -1
  14. package/dist/memory-layers/skill-library.d.ts +9 -9
  15. package/dist/memory-layers/skill-library.d.ts.map +1 -1
  16. package/dist/memory-layers/skill-library.js +85 -56
  17. package/dist/memory-layers/skill-library.js.map +1 -1
  18. package/dist/memory-layers/working-memory.d.ts +2 -2
  19. package/dist/memory-layers/working-memory.d.ts.map +1 -1
  20. package/dist/memory-layers/working-memory.js +57 -47
  21. package/dist/memory-layers/working-memory.js.map +1 -1
  22. package/dist/retrieval/hybrid-search.d.ts.map +1 -1
  23. package/dist/retrieval/hybrid-search.js +10 -5
  24. package/dist/retrieval/hybrid-search.js.map +1 -1
  25. package/dist/retrieval/index-outbox.d.ts +50 -0
  26. package/dist/retrieval/index-outbox.d.ts.map +1 -0
  27. package/dist/retrieval/index-outbox.js +225 -0
  28. package/dist/retrieval/index-outbox.js.map +1 -0
  29. package/dist/retrieval/memory-retriever.d.ts +123 -0
  30. package/dist/retrieval/memory-retriever.d.ts.map +1 -0
  31. package/dist/retrieval/memory-retriever.js +723 -0
  32. package/dist/retrieval/memory-retriever.js.map +1 -0
  33. package/dist/router/smart-router.js +18 -18
  34. package/dist/server-wrapper.js +0 -0
  35. package/dist/server.d.ts +9 -1
  36. package/dist/server.d.ts.map +1 -1
  37. package/dist/server.js +859 -355
  38. package/dist/server.js.map +1 -1
  39. package/dist/utils/claude-mcp-config.d.ts +3 -0
  40. package/dist/utils/claude-mcp-config.d.ts.map +1 -0
  41. package/dist/utils/claude-mcp-config.js +42 -0
  42. package/dist/utils/claude-mcp-config.js.map +1 -0
  43. package/dist/utils/monitoring.d.ts +1 -0
  44. package/dist/utils/monitoring.d.ts.map +1 -1
  45. package/dist/utils/monitoring.js +1 -0
  46. package/dist/utils/monitoring.js.map +1 -1
  47. package/dist/utils/paths.d.ts +13 -1
  48. package/dist/utils/paths.d.ts.map +1 -1
  49. package/dist/utils/paths.js +24 -0
  50. package/dist/utils/paths.js.map +1 -1
  51. package/dist/utils/validation.d.ts +14 -2
  52. package/dist/utils/validation.d.ts.map +1 -1
  53. package/dist/utils/validation.js +64 -48
  54. package/dist/utils/validation.js.map +1 -1
  55. package/docker-compose.yml +3 -3
  56. package/package.json +7 -4
  57. package/scripts/README.md +1 -1
  58. package/scripts/health-check.sh +8 -4
  59. package/scripts/init-qdrant.ts +42 -60
  60. package/scripts/test-mcp-server.sh +2 -2
  61. package/dist/config/rate-limits.d.ts +0 -76
  62. package/dist/config/rate-limits.d.ts.map +0 -1
  63. package/dist/config/rate-limits.js +0 -161
  64. package/dist/config/rate-limits.js.map +0 -1
  65. package/dist/middleware/auth.d.ts +0 -287
  66. package/dist/middleware/auth.d.ts.map +0 -1
  67. package/dist/middleware/auth.js +0 -610
  68. package/dist/middleware/auth.js.map +0 -1
  69. package/dist/monitoring/health.d.ts +0 -241
  70. package/dist/monitoring/health.d.ts.map +0 -1
  71. package/dist/monitoring/health.js +0 -649
  72. package/dist/monitoring/health.js.map +0 -1
  73. package/dist/monitoring/metrics.d.ts +0 -153
  74. package/dist/monitoring/metrics.d.ts.map +0 -1
  75. package/dist/monitoring/metrics.js +0 -349
  76. package/dist/monitoring/metrics.js.map +0 -1
  77. package/dist/security/rate-limit-middleware.d.ts +0 -119
  78. package/dist/security/rate-limit-middleware.d.ts.map +0 -1
  79. package/dist/security/rate-limit-middleware.js +0 -193
  80. package/dist/security/rate-limit-middleware.js.map +0 -1
@@ -4,16 +4,31 @@
4
4
  * Nightly process: working → semantic memory transformation.
5
5
  * Runs at 3 AM, extracts knowledge, applies decay, detects conflicts.
6
6
  */
7
+ import Database from "better-sqlite3";
8
+ import { randomUUID } from "node:crypto";
9
+ import * as fs from "node:fs";
10
+ import * as path from "node:path";
11
+ import { ensureBackupsDirectory } from "../utils/paths.js";
7
12
  export class ConsolidationPipeline {
8
- workingMemory;
9
13
  semanticMemory;
10
14
  skillLibrary;
11
15
  db;
12
- constructor(workingMemory, semanticMemory, skillLibrary, db) {
13
- this.workingMemory = workingMemory;
16
+ batchSize;
17
+ backupDirectory;
18
+ now;
19
+ backupRetentionDays;
20
+ constructor(workingMemory, semanticMemory, skillLibrary, db, options = {}) {
21
+ // Kept in the signature for API compatibility. Canonical ingestion no
22
+ // longer reads Redis through WorkingMemoryLayer.
23
+ void workingMemory;
14
24
  this.semanticMemory = semanticMemory;
15
25
  this.skillLibrary = skillLibrary;
16
26
  this.db = db;
27
+ this.batchSize = Math.max(1, Math.floor(options.batchSize ?? 100));
28
+ this.backupDirectory = options.backupDirectory;
29
+ this.now = options.now ?? (() => new Date());
30
+ this.backupRetentionDays = Math.max(1, options.backupRetentionDays ?? 7);
31
+ this.ensureDurabilitySchema();
17
32
  }
18
33
  /**
19
34
  * Run full consolidation cycle
@@ -21,7 +36,7 @@ export class ConsolidationPipeline {
21
36
  */
22
37
  async consolidate(namespace) {
23
38
  const startTime = Date.now();
24
- console.error('[CONSOLIDATION] Starting consolidation cycle...');
39
+ console.error("[CONSOLIDATION] Starting consolidation cycle...");
25
40
  const stats = {
26
41
  memoriesProcessed: 0,
27
42
  entitiesExtracted: 0,
@@ -32,36 +47,40 @@ export class ConsolidationPipeline {
32
47
  duration: 0,
33
48
  };
34
49
  try {
35
- // Determine namespaces to consolidate
36
- const namespacesToProcess = namespace
37
- ? [namespace]
38
- : this.getDistinctNamespaces();
39
- for (const ns of namespacesToProcess) {
40
- // Step 1: Extract from working memory
41
- const recentMemories = await this.workingMemory.getRecent(100, ns);
42
- stats.memoriesProcessed += recentMemories.length;
43
- for (const memory of recentMemories) {
44
- const extracted = this.extractKnowledge(memory);
45
- for (const entity of extracted.entities) {
46
- this.semanticMemory.upsertEntity(entity, ns);
47
- stats.entitiesExtracted++;
48
- }
49
- for (const rel of extracted.relationships) {
50
- this.semanticMemory.upsertRelationship(rel, ns);
51
- stats.relationshipsCreated++;
52
- }
50
+ // Step 1: Read a bounded batch from the canonical SQLite store. Redis is
51
+ // a cache and must not determine whether a durable memory is processed.
52
+ const canonicalMemories = this.getUnconsolidatedMemories(namespace);
53
+ const processedNamespaces = new Set();
54
+ for (const row of canonicalMemories) {
55
+ const ns = row.namespace || "default";
56
+ const memory = this.toConsolidationMemory(row);
57
+ try {
58
+ const result = this.processMemory(row, memory, ns);
59
+ stats.memoriesProcessed++;
60
+ stats.entitiesExtracted += result.entitiesExtracted;
61
+ stats.relationshipsCreated += result.relationshipsCreated;
62
+ stats.skillsExtracted += result.skillsExtracted;
63
+ processedNamespaces.add(ns);
64
+ }
65
+ catch (error) {
66
+ // The per-memory transaction rolls back both derived work and the
67
+ // checkpoint. A malformed or transiently failing row remains retryable.
68
+ console.error(`[CONSOLIDATION] Failed memory ${row.id}; leaving unconsolidated:`, error instanceof Error ? error.message : String(error));
53
69
  }
70
+ }
71
+ const namespacesToMaintain = namespace
72
+ ? [namespace]
73
+ : Array.from(new Set([...this.getDistinctNamespaces(), ...processedNamespaces]));
74
+ for (const ns of namespacesToMaintain) {
54
75
  // Step 2: Apply temporal decay
55
- this.semanticMemory.applyTemporalDecay(ns);
76
+ this.semanticMemory.applyTemporalDecay(ns, this.now());
56
77
  // Step 3: Detect conflicts
57
78
  stats.conflictsDetected += this.detectConflicts(ns);
58
79
  // Step 4: Prune low-value memories
59
80
  stats.memoriesPruned += this.pruneMemories(ns);
60
- // Step 5: Extract skills (simplified)
61
- stats.skillsExtracted += this.extractSkills(recentMemories, ns);
62
81
  }
63
82
  // Step 6: Create backup
64
- this.createBackup();
83
+ await this.createBackup();
65
84
  stats.duration = Date.now() - startTime;
66
85
  console.error(`[CONSOLIDATION] Complete! Processed ${stats.memoriesProcessed} memories in ${stats.duration}ms`);
67
86
  console.error(`[CONSOLIDATION] Extracted ${stats.entitiesExtracted} entities, ${stats.relationshipsCreated} relationships`);
@@ -69,10 +88,112 @@ export class ConsolidationPipeline {
69
88
  return stats;
70
89
  }
71
90
  catch (error) {
72
- console.error('[CONSOLIDATION] Error:', error);
91
+ console.error("[CONSOLIDATION] Error:", error);
73
92
  throw error;
74
93
  }
75
94
  }
95
+ ensureDurabilitySchema() {
96
+ const memoryColumns = this.db.pragma("table_info(memories)");
97
+ if (memoryColumns.length > 0 &&
98
+ !memoryColumns.some((column) => column.name === "consolidated_at")) {
99
+ this.db.exec("ALTER TABLE memories ADD COLUMN consolidated_at INTEGER");
100
+ }
101
+ const conflictColumns = this.db.pragma("table_info(conflicts)");
102
+ if (conflictColumns.length > 0) {
103
+ if (!conflictColumns.some((column) => column.name === "entity_id")) {
104
+ this.db.exec("ALTER TABLE conflicts ADD COLUMN entity_id TEXT");
105
+ }
106
+ if (!conflictColumns.some((column) => column.name === "property")) {
107
+ this.db.exec("ALTER TABLE conflicts ADD COLUMN property TEXT");
108
+ }
109
+ }
110
+ this.db.exec(`
111
+ CREATE INDEX IF NOT EXISTS idx_memories_consolidation
112
+ ON memories(namespace, consolidated_at, created_at)
113
+ `);
114
+ }
115
+ getUnconsolidatedMemories(namespace) {
116
+ if (namespace) {
117
+ return this.db
118
+ .prepare(`
119
+ SELECT id, content, memory_type, created_at, metadata, namespace
120
+ FROM memories
121
+ WHERE consolidated_at IS NULL
122
+ AND COALESCE(namespace, 'default') = ?
123
+ ORDER BY created_at ASC, id ASC
124
+ LIMIT ?
125
+ `)
126
+ .all(namespace, this.batchSize);
127
+ }
128
+ return this.db
129
+ .prepare(`
130
+ SELECT id, content, memory_type, created_at, metadata, namespace
131
+ FROM memories
132
+ WHERE consolidated_at IS NULL
133
+ ORDER BY created_at ASC, id ASC
134
+ LIMIT ?
135
+ `)
136
+ .all(this.batchSize);
137
+ }
138
+ toConsolidationMemory(row) {
139
+ let metadata = {};
140
+ if (row.metadata) {
141
+ try {
142
+ const parsed = JSON.parse(row.metadata);
143
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
144
+ metadata = parsed;
145
+ }
146
+ }
147
+ catch {
148
+ // Invalid optional metadata must not make the canonical content unusable.
149
+ }
150
+ }
151
+ const stringArray = (value) => Array.isArray(value)
152
+ ? value.filter((item) => typeof item === "string" && item.trim().length > 0)
153
+ : [];
154
+ const timestamp = typeof row.created_at === "number" ? new Date(row.created_at) : new Date(row.created_at);
155
+ return {
156
+ conversationId: row.id,
157
+ timestamp: Number.isNaN(timestamp.getTime()) ? this.now() : timestamp,
158
+ fullText: row.content,
159
+ keyEntities: stringArray(metadata.keyEntities ?? metadata.key_entities),
160
+ topics: stringArray(metadata.topics),
161
+ userIntent: typeof metadata.userIntent === "string"
162
+ ? metadata.userIntent
163
+ : typeof metadata.user_intent === "string"
164
+ ? metadata.user_intent
165
+ : "",
166
+ };
167
+ }
168
+ processMemory(row, memory, namespace) {
169
+ return this.db.transaction(() => {
170
+ const extracted = this.extractKnowledge(memory);
171
+ for (const entity of extracted.entities) {
172
+ this.semanticMemory.upsertEntity(entity, namespace);
173
+ }
174
+ for (const rel of extracted.relationships) {
175
+ this.semanticMemory.upsertRelationship(rel, namespace);
176
+ }
177
+ const skillsExtracted = this.extractSkills([memory], namespace);
178
+ const checkpoint = this.db
179
+ .prepare(`
180
+ UPDATE memories
181
+ SET consolidated_at = ?
182
+ WHERE id = ?
183
+ AND COALESCE(namespace, 'default') = ?
184
+ AND consolidated_at IS NULL
185
+ `)
186
+ .run(this.now().getTime(), row.id, namespace);
187
+ if (checkpoint.changes !== 1) {
188
+ throw new Error("Canonical memory checkpoint was not acquired");
189
+ }
190
+ return {
191
+ entitiesExtracted: extracted.entities.length,
192
+ relationshipsCreated: extracted.relationships.length,
193
+ skillsExtracted,
194
+ };
195
+ })();
196
+ }
76
197
  /**
77
198
  * Extract entities and relationships from memory
78
199
  * Simple keyword-based extraction (will enhance with LLM later)
@@ -85,23 +206,19 @@ export class ConsolidationPipeline {
85
206
  for (const entityName of memory.keyEntities) {
86
207
  entities.push({
87
208
  name: entityName,
88
- type: 'concept',
209
+ type: "concept",
89
210
  confidence: 0.8,
90
211
  });
91
212
  }
92
213
  }
93
214
  // Extract preferences
94
- const prefPatterns = [
95
- /prefer (\w+)/gi,
96
- /like (\w+)/gi,
97
- /favorite is (\w+)/gi,
98
- ];
215
+ const prefPatterns = [/prefer (\w+)/gi, /like (\w+)/gi, /favorite is (\w+)/gi];
99
216
  for (const pattern of prefPatterns) {
100
217
  const matches = memory.fullText.matchAll(pattern);
101
218
  for (const match of matches) {
102
219
  entities.push({
103
220
  name: match[1],
104
- type: 'preference',
221
+ type: "preference",
105
222
  confidence: 0.9,
106
223
  });
107
224
  }
@@ -112,19 +229,27 @@ export class ConsolidationPipeline {
112
229
  * Get distinct namespaces from memories table
113
230
  */
114
231
  getDistinctNamespaces() {
115
- const rows = this.db.prepare("SELECT DISTINCT namespace FROM memories WHERE namespace IS NOT NULL").all();
232
+ const rows = this.db
233
+ .prepare(`SELECT namespace FROM (
234
+ SELECT COALESCE(namespace, 'default') AS namespace FROM memories
235
+ UNION
236
+ SELECT COALESCE(namespace, 'default') AS namespace FROM relationships
237
+ ) ORDER BY namespace`)
238
+ .all();
116
239
  if (rows.length === 0)
117
- return ['default'];
118
- return rows.map(r => r.namespace);
240
+ return ["default"];
241
+ return rows.map((r) => r.namespace);
119
242
  }
120
243
  /**
121
244
  * Detect simple conflicts (temporal impossibilities, contradictions)
122
245
  */
123
- detectConflicts(namespace = 'default') {
246
+ detectConflicts(namespace = "default") {
124
247
  let detected = 0;
125
248
  // Temporal conflicts: same property, overlapping time ranges, different values
126
- const conflicts = this.db.prepare(`
127
- SELECT f1.id as id1, f2.id as id2, f1.property, f1.value as val1, f2.value as val2
249
+ const conflicts = this.db
250
+ .prepare(`
251
+ SELECT f1.id as id1, f2.id as id2, f1.entity_id, f1.property,
252
+ f1.value as val1, f2.value as val2
128
253
  FROM facts f1
129
254
  JOIN facts f2 ON f1.entity_id = f2.entity_id AND f1.property = f2.property
130
255
  WHERE f1.id < f2.id
@@ -132,19 +257,26 @@ export class ConsolidationPipeline {
132
257
  AND f1.valid_until IS NULL
133
258
  AND f2.valid_until IS NULL
134
259
  AND f1.namespace = ? AND f2.namespace = ?
135
- `).all(namespace, namespace);
260
+ `)
261
+ .all(namespace, namespace);
136
262
  for (const conflict of conflicts) {
137
263
  // Check if already flagged
138
- const existing = this.db.prepare('SELECT * FROM conflicts WHERE fact_id_1 = ? AND fact_id_2 = ?').get(conflict.id1, conflict.id2);
264
+ const existing = this.db
265
+ .prepare("SELECT * FROM conflicts WHERE fact_id_1 = ? AND fact_id_2 = ?")
266
+ .get(conflict.id1, conflict.id2);
139
267
  if (!existing) {
140
- const conflictId = 'conflict_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);
141
- this.db.prepare(`
142
- INSERT INTO conflicts (id, fact_id_1, fact_id_2, conflict_type, description, severity, resolution_status, namespace)
143
- VALUES (?, ?, ?, ?, ?, ?, ?, ?)
144
- `).run(conflictId, conflict.id1, conflict.id2, 'contradiction', `Conflicting values for ${conflict.property}: "${conflict.val1}" vs "${conflict.val2}"`, 'medium', 'flagged', namespace);
268
+ const conflictId = "conflict_" + Date.now() + "_" + Math.random().toString(36).substr(2, 9);
269
+ this.db
270
+ .prepare(`
271
+ INSERT INTO conflicts (
272
+ id, fact_id_1, fact_id_2, conflict_type, entity_id, property,
273
+ description, severity, resolution_status, namespace
274
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
275
+ `)
276
+ .run(conflictId, conflict.id1, conflict.id2, "contradiction", conflict.entity_id, conflict.property, `Conflicting values for ${conflict.property}: "${conflict.val1}" vs "${conflict.val2}"`, "medium", "flagged", namespace);
145
277
  // Lower confidence on both facts
146
- this.db.prepare('UPDATE facts SET confidence = 0.5 WHERE id = ?').run(conflict.id1);
147
- this.db.prepare('UPDATE facts SET confidence = 0.5 WHERE id = ?').run(conflict.id2);
278
+ this.db.prepare("UPDATE facts SET confidence = 0.5 WHERE id = ?").run(conflict.id1);
279
+ this.db.prepare("UPDATE facts SET confidence = 0.5 WHERE id = ?").run(conflict.id2);
148
280
  detected++;
149
281
  }
150
282
  }
@@ -153,9 +285,10 @@ export class ConsolidationPipeline {
153
285
  /**
154
286
  * Prune low-value memories
155
287
  */
156
- pruneMemories(namespace = 'default') {
288
+ pruneMemories(namespace = "default") {
157
289
  // Find relationships to prune (weak relationships with low-access entities)
158
- const toPrune = this.db.prepare(`
290
+ const toPrune = this.db
291
+ .prepare(`
159
292
  SELECT r.id
160
293
  FROM relationships r
161
294
  INNER JOIN entities source ON r.source_id = source.id
@@ -164,11 +297,12 @@ export class ConsolidationPipeline {
164
297
  AND source.access_count < 3
165
298
  AND target.access_count < 3
166
299
  AND r.namespace = ?
167
- `).all(namespace);
300
+ `)
301
+ .all(namespace);
168
302
  // Delete them
169
303
  let deleted = 0;
170
304
  for (const row of toPrune) {
171
- this.db.prepare('DELETE FROM relationships WHERE id = ?').run(row.id);
305
+ this.db.prepare("DELETE FROM relationships WHERE id = ?").run(row.id);
172
306
  deleted++;
173
307
  }
174
308
  return deleted;
@@ -176,19 +310,19 @@ export class ConsolidationPipeline {
176
310
  /**
177
311
  * Extract skills from positive interactions
178
312
  */
179
- extractSkills(memories, namespace = 'default') {
313
+ extractSkills(memories, namespace = "default") {
180
314
  let extracted = 0;
181
315
  for (const memory of memories) {
182
316
  // Look for repeated patterns
183
- if (memory.topics && memory.topics.includes('analysis')) {
317
+ if (memory.topics && memory.topics.includes("analysis")) {
184
318
  // Check if skill already exists
185
- const existing = this.skillLibrary.search('data analysis', 1, namespace);
319
+ const existing = this.skillLibrary.search("data analysis", 1, namespace);
186
320
  if (existing.length === 0) {
187
321
  this.skillLibrary.addSkill({
188
- name: 'Data Analysis',
189
- description: 'Analyze datasets and provide insights',
190
- category: 'analysis',
191
- triggers: ['analyze', 'data', 'insights'],
322
+ name: "Data Analysis",
323
+ description: "Analyze datasets and provide insights",
324
+ category: "analysis",
325
+ triggers: ["analyze", "data", "insights"],
192
326
  }, namespace);
193
327
  extracted++;
194
328
  }
@@ -199,13 +333,122 @@ export class ConsolidationPipeline {
199
333
  /**
200
334
  * Create backup for rollback capability
201
335
  */
202
- createBackup() {
203
- const backupId = 'backup_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);
204
- const now = new Date().toISOString();
205
- this.db.prepare(`
206
- INSERT INTO backup_metadata (id, backup_timestamp, backup_type, status, backup_path, created_at, expires_at)
207
- VALUES (?, ?, ?, ?, ?, ?, ?)
208
- `).run(backupId, now, 'consolidation', 'completed', './backups/' + backupId + '.db', now, new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString());
336
+ async createBackup() {
337
+ const backupId = `backup_${this.now().getTime()}_${randomUUID()}`;
338
+ const now = this.now();
339
+ const nowIso = now.toISOString();
340
+ const expiresAt = new Date(now.getTime() + this.backupRetentionDays * 24 * 60 * 60 * 1000).toISOString();
341
+ const backupDirectory = this.backupDirectory
342
+ ? path.resolve(this.backupDirectory)
343
+ : ensureBackupsDirectory();
344
+ fs.mkdirSync(backupDirectory, { recursive: true, mode: 0o700 });
345
+ const backupDirectoryStats = fs.lstatSync(backupDirectory);
346
+ if (backupDirectoryStats.isSymbolicLink() || !backupDirectoryStats.isDirectory()) {
347
+ throw new Error(`Backup destination is not a secure directory: ${backupDirectory}`);
348
+ }
349
+ fs.chmodSync(backupDirectory, 0o700);
350
+ const backupPath = path.join(backupDirectory, `${backupId}.db`);
351
+ await this.db.backup(backupPath);
352
+ fs.chmodSync(backupPath, 0o600);
353
+ const fileStats = fs.statSync(backupPath);
354
+ if (!fileStats.isFile() || fileStats.size === 0) {
355
+ throw new Error(`SQLite backup was not created at ${backupPath}`);
356
+ }
357
+ const verificationDb = new Database(backupPath, { readonly: true, fileMustExist: true });
358
+ try {
359
+ const quickCheck = verificationDb.pragma("quick_check", { simple: true });
360
+ if (quickCheck !== "ok") {
361
+ throw new Error(`SQLite backup verification failed: ${String(quickCheck)}`);
362
+ }
363
+ }
364
+ finally {
365
+ verificationDb.close();
366
+ }
367
+ const counts = {
368
+ memories: this.tableCount("memories"),
369
+ entities: this.tableCount("entities"),
370
+ relationships: this.tableCount("relationships"),
371
+ facts: this.tableCount("facts"),
372
+ skills: this.tableCount("skills"),
373
+ };
374
+ this.insertBackupMetadata({
375
+ id: backupId,
376
+ path: backupPath,
377
+ createdAt: nowIso,
378
+ expiresAt,
379
+ size: fileStats.size,
380
+ counts,
381
+ });
382
+ this.removeExpiredBackups(backupDirectory, now);
383
+ }
384
+ removeExpiredBackups(backupDirectory, now) {
385
+ const root = path.resolve(backupDirectory);
386
+ const rows = this.db
387
+ .prepare(`SELECT id, backup_path FROM backup_metadata
388
+ WHERE expires_at IS NOT NULL AND expires_at <= ?`)
389
+ .all(now.toISOString());
390
+ const removeMetadata = this.db.prepare("DELETE FROM backup_metadata WHERE id = ?");
391
+ for (const row of rows) {
392
+ if (!row.backup_path) {
393
+ removeMetadata.run(row.id);
394
+ continue;
395
+ }
396
+ const candidate = path.resolve(row.backup_path);
397
+ const isInsideRoot = candidate.startsWith(`${root}${path.sep}`);
398
+ if (!isInsideRoot || path.dirname(candidate) !== root) {
399
+ console.error(`[CONSOLIDATION] Refusing to delete backup outside configured directory: ${candidate}`);
400
+ continue;
401
+ }
402
+ if (fs.existsSync(candidate)) {
403
+ const stats = fs.lstatSync(candidate);
404
+ if (stats.isSymbolicLink() || !stats.isFile()) {
405
+ console.error(`[CONSOLIDATION] Refusing to delete unsafe backup path: ${candidate}`);
406
+ continue;
407
+ }
408
+ fs.unlinkSync(candidate);
409
+ }
410
+ removeMetadata.run(row.id);
411
+ }
412
+ }
413
+ tableCount(table) {
414
+ const exists = this.db
415
+ .prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?")
416
+ .get(table);
417
+ if (!exists)
418
+ return 0;
419
+ return this.db.prepare(`SELECT COUNT(*) AS count FROM ${table}`).get()
420
+ .count;
421
+ }
422
+ insertBackupMetadata(backup) {
423
+ const available = new Set(this.db.pragma("table_info(backup_metadata)").map((column) => column.name));
424
+ if (available.size === 0) {
425
+ throw new Error("backup_metadata table is missing");
426
+ }
427
+ const candidates = [
428
+ ["id", backup.id],
429
+ ["backup_timestamp", backup.createdAt],
430
+ ["backup_type", "consolidation"],
431
+ ["status", "completed"],
432
+ ["backup_path", backup.path],
433
+ ["file_size_bytes", backup.size],
434
+ ["num_memories", backup.counts.memories],
435
+ ["num_entities", backup.counts.entities],
436
+ ["entities_count", backup.counts.entities],
437
+ ["num_relationships", backup.counts.relationships],
438
+ ["relationships_count", backup.counts.relationships],
439
+ ["facts_count", backup.counts.facts],
440
+ ["skills_count", backup.counts.skills],
441
+ ["created_at", backup.createdAt],
442
+ ["expires_at", backup.expiresAt],
443
+ ["notes", "Verified with PRAGMA quick_check after better-sqlite3 backup"],
444
+ ["metadata", JSON.stringify({ verified: true, method: "better-sqlite3.backup" })],
445
+ ];
446
+ const values = candidates.filter(([column]) => available.has(column));
447
+ const columns = values.map(([column]) => column);
448
+ const placeholders = columns.map(() => "?").join(", ");
449
+ this.db
450
+ .prepare(`INSERT INTO backup_metadata (${columns.join(", ")}) VALUES (${placeholders})`)
451
+ .run(...values.map(([, value]) => value));
209
452
  }
210
453
  }
211
454
  //# sourceMappingURL=pipeline.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/consolidation/pipeline.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/consolidation/pipeline.ts"],"names":[],"mappings":"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"}
@@ -4,11 +4,11 @@
4
4
  * SQLite knowledge graph with HippoRAG Personalized PageRank.
5
5
  * v0.5.0: Added namespace parameter for multi-agent isolation.
6
6
  */
7
- import Database from 'better-sqlite3';
7
+ import Database from "better-sqlite3";
8
8
  export interface Entity {
9
9
  id: string;
10
10
  name: string;
11
- type: 'person' | 'project' | 'concept' | 'preference';
11
+ type: "person" | "project" | "concept" | "preference";
12
12
  description?: string;
13
13
  confidence: number;
14
14
  }
@@ -46,6 +46,11 @@ export interface PageRankWithFactsResult {
46
46
  export declare class SemanticMemoryLayer {
47
47
  private db;
48
48
  constructor(db: Database.Database);
49
+ /**
50
+ * Older databases predate incremental decay. Keep the migration next to the
51
+ * behavior so every caller gets the non-compounding semantics.
52
+ */
53
+ private ensureDecayCursor;
49
54
  upsertEntity(entity: Partial<Entity> & {
50
55
  name: string;
51
56
  type: string;
@@ -59,7 +64,7 @@ export declare class SemanticMemoryLayer {
59
64
  }, namespace?: string): void;
60
65
  personalizedPageRank(entityId: string, depth?: number, namespace?: string): any[];
61
66
  personalizedPageRankWithFacts(entityId: string, depth?: number, namespace?: string): PageRankWithFactsResult;
62
- applyTemporalDecay(namespace?: string): number;
67
+ applyTemporalDecay(namespace?: string, now?: Date): number;
63
68
  getPreferences(domain?: string, namespace?: string): any[];
64
69
  getByTimeRange(start?: Date, end?: Date, namespace?: string): any[];
65
70
  }
@@ -1 +1 @@
1
- {"version":3,"file":"semantic-memory.d.ts","sourceRoot":"","sources":["../../src/memory-layers/semantic-memory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,YAAY,CAAC;IACtD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,KAAK,CAAC,MAAM,GAAG;QAAE,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrD,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;CACtB;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,EAAE,CAAoB;gBAElB,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAIjC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,SAAS,GAAE,MAAkB,GAAG,MAAM;IAiC7G,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,MAAkB,GAAG,GAAG,GAAG,IAAI;IAclE,kBAAkB,CAAC,GAAG,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,SAAS,GAAE,MAAkB,GAAG,IAAI;IAuB7I,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,EAAE,SAAS,GAAE,MAAkB,GAAG,GAAG,EAAE;IAmC/F,6BAA6B,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,EAAE,SAAS,GAAE,MAAkB,GAAG,uBAAuB;IA4H1H,kBAAkB,CAAC,SAAS,GAAE,MAAkB,GAAG,MAAM;IAezD,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,GAAE,MAAkB,GAAG,GAAG,EAAE;IASrE,cAAc,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,GAAE,MAAkB,GAAG,GAAG,EAAE;CAgB/E"}
1
+ {"version":3,"file":"semantic-memory.d.ts","sourceRoot":"","sources":["../../src/memory-layers/semantic-memory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,YAAY,CAAC;IACtD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,KAAK,CAAC,MAAM,GAAG;QAAE,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrD,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC;CACtB;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,EAAE,CAAoB;gBAElB,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAKjC;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAOzB,YAAY,CACV,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EACxD,SAAS,GAAE,MAAkB,GAC5B,MAAM;IAiDT,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,MAAkB,GAAG,GAAG,GAAG,IAAI;IAkBlE,kBAAkB,CAChB,GAAG,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,EACpF,SAAS,GAAE,MAAkB,GAC5B,IAAI;IAuCP,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,EAAE,SAAS,GAAE,MAAkB,GAAG,GAAG,EAAE;IAuC/F,6BAA6B,CAC3B,QAAQ,EAAE,MAAM,EAChB,KAAK,GAAE,MAAU,EACjB,SAAS,GAAE,MAAkB,GAC5B,uBAAuB;IA0I1B,kBAAkB,CAAC,SAAS,GAAE,MAAkB,EAAE,GAAG,GAAE,IAAiB,GAAG,MAAM;IA4BjF,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,GAAE,MAAkB,GAAG,GAAG,EAAE;IAarE,cAAc,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,GAAE,MAAkB,GAAG,GAAG,EAAE;CAgB/E"}