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.
- package/CHANGELOG.md +22 -0
- package/README.md +16 -12
- package/config/sqlite-schema.sql +31 -0
- package/dist/cli.js +6 -49
- package/dist/cli.js.map +1 -1
- package/dist/consolidation/pipeline.d.ts +25 -6
- package/dist/consolidation/pipeline.d.ts.map +1 -1
- package/dist/consolidation/pipeline.js +310 -67
- package/dist/consolidation/pipeline.js.map +1 -1
- package/dist/memory-layers/semantic-memory.d.ts +8 -3
- package/dist/memory-layers/semantic-memory.d.ts.map +1 -1
- package/dist/memory-layers/semantic-memory.js +110 -50
- package/dist/memory-layers/semantic-memory.js.map +1 -1
- package/dist/memory-layers/skill-library.d.ts +9 -9
- package/dist/memory-layers/skill-library.d.ts.map +1 -1
- package/dist/memory-layers/skill-library.js +85 -56
- package/dist/memory-layers/skill-library.js.map +1 -1
- package/dist/memory-layers/working-memory.d.ts +2 -2
- package/dist/memory-layers/working-memory.d.ts.map +1 -1
- package/dist/memory-layers/working-memory.js +57 -47
- package/dist/memory-layers/working-memory.js.map +1 -1
- package/dist/retrieval/hybrid-search.d.ts.map +1 -1
- package/dist/retrieval/hybrid-search.js +10 -5
- package/dist/retrieval/hybrid-search.js.map +1 -1
- package/dist/retrieval/index-outbox.d.ts +50 -0
- package/dist/retrieval/index-outbox.d.ts.map +1 -0
- package/dist/retrieval/index-outbox.js +225 -0
- package/dist/retrieval/index-outbox.js.map +1 -0
- package/dist/retrieval/memory-retriever.d.ts +123 -0
- package/dist/retrieval/memory-retriever.d.ts.map +1 -0
- package/dist/retrieval/memory-retriever.js +723 -0
- package/dist/retrieval/memory-retriever.js.map +1 -0
- package/dist/router/smart-router.js +18 -18
- package/dist/server-wrapper.js +0 -0
- package/dist/server.d.ts +9 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +859 -355
- package/dist/server.js.map +1 -1
- package/dist/utils/claude-mcp-config.d.ts +3 -0
- package/dist/utils/claude-mcp-config.d.ts.map +1 -0
- package/dist/utils/claude-mcp-config.js +42 -0
- package/dist/utils/claude-mcp-config.js.map +1 -0
- package/dist/utils/monitoring.d.ts +1 -0
- package/dist/utils/monitoring.d.ts.map +1 -1
- package/dist/utils/monitoring.js +1 -0
- package/dist/utils/monitoring.js.map +1 -1
- package/dist/utils/paths.d.ts +13 -1
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +24 -0
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/validation.d.ts +14 -2
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +64 -48
- package/dist/utils/validation.js.map +1 -1
- package/docker-compose.yml +3 -3
- package/package.json +7 -4
- package/scripts/README.md +1 -1
- package/scripts/health-check.sh +8 -4
- package/scripts/init-qdrant.ts +42 -60
- package/scripts/test-mcp-server.sh +2 -2
- package/dist/config/rate-limits.d.ts +0 -76
- package/dist/config/rate-limits.d.ts.map +0 -1
- package/dist/config/rate-limits.js +0 -161
- package/dist/config/rate-limits.js.map +0 -1
- package/dist/middleware/auth.d.ts +0 -287
- package/dist/middleware/auth.d.ts.map +0 -1
- package/dist/middleware/auth.js +0 -610
- package/dist/middleware/auth.js.map +0 -1
- package/dist/monitoring/health.d.ts +0 -241
- package/dist/monitoring/health.d.ts.map +0 -1
- package/dist/monitoring/health.js +0 -649
- package/dist/monitoring/health.js.map +0 -1
- package/dist/monitoring/metrics.d.ts +0 -153
- package/dist/monitoring/metrics.d.ts.map +0 -1
- package/dist/monitoring/metrics.js +0 -349
- package/dist/monitoring/metrics.js.map +0 -1
- package/dist/security/rate-limit-middleware.d.ts +0 -119
- package/dist/security/rate-limit-middleware.d.ts.map +0 -1
- package/dist/security/rate-limit-middleware.js +0 -193
- 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
|
-
|
|
13
|
-
|
|
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(
|
|
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
|
-
//
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
for (const
|
|
40
|
-
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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(
|
|
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:
|
|
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:
|
|
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
|
|
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 [
|
|
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 =
|
|
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
|
|
127
|
-
|
|
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
|
-
`)
|
|
260
|
+
`)
|
|
261
|
+
.all(namespace, namespace);
|
|
136
262
|
for (const conflict of conflicts) {
|
|
137
263
|
// Check if already flagged
|
|
138
|
-
const existing = this.db
|
|
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 =
|
|
141
|
-
this.db
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
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(
|
|
147
|
-
this.db.prepare(
|
|
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 =
|
|
288
|
+
pruneMemories(namespace = "default") {
|
|
157
289
|
// Find relationships to prune (weak relationships with low-access entities)
|
|
158
|
-
const toPrune = this.db
|
|
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
|
-
`)
|
|
300
|
+
`)
|
|
301
|
+
.all(namespace);
|
|
168
302
|
// Delete them
|
|
169
303
|
let deleted = 0;
|
|
170
304
|
for (const row of toPrune) {
|
|
171
|
-
this.db.prepare(
|
|
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 =
|
|
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(
|
|
317
|
+
if (memory.topics && memory.topics.includes("analysis")) {
|
|
184
318
|
// Check if skill already exists
|
|
185
|
-
const existing = this.skillLibrary.search(
|
|
319
|
+
const existing = this.skillLibrary.search("data analysis", 1, namespace);
|
|
186
320
|
if (existing.length === 0) {
|
|
187
321
|
this.skillLibrary.addSkill({
|
|
188
|
-
name:
|
|
189
|
-
description:
|
|
190
|
-
category:
|
|
191
|
-
triggers: [
|
|
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 =
|
|
204
|
-
const now =
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
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
|
|
7
|
+
import Database from "better-sqlite3";
|
|
8
8
|
export interface Entity {
|
|
9
9
|
id: string;
|
|
10
10
|
name: string;
|
|
11
|
-
type:
|
|
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;
|
|
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"}
|