vesper-memory 0.3.2 → 0.5.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/.env.example +8 -4
- package/CHANGELOG.md +129 -3
- package/LICENSE +59 -0
- package/README.md +422 -24
- package/config/migrations/001_add_skill_summary.sql +75 -0
- package/config/migrations/001_rollback_skill_summary.sql +60 -0
- package/config/sqlite-schema.sql +68 -4
- package/dist/benchmark/types.d.ts +4 -4
- package/dist/cli.js +204 -10
- package/dist/cli.js.map +1 -1
- package/dist/consolidation/pipeline.d.ts +6 -1
- package/dist/consolidation/pipeline.d.ts.map +1 -1
- package/dist/consolidation/pipeline.js +53 -35
- package/dist/consolidation/pipeline.js.map +1 -1
- package/dist/memory-layers/semantic-memory.d.ts +9 -19
- package/dist/memory-layers/semantic-memory.d.ts.map +1 -1
- package/dist/memory-layers/semantic-memory.js +31 -54
- package/dist/memory-layers/semantic-memory.js.map +1 -1
- package/dist/memory-layers/skill-lazy-loading.d.ts +160 -0
- package/dist/memory-layers/skill-lazy-loading.d.ts.map +1 -0
- package/dist/memory-layers/skill-lazy-loading.js +247 -0
- package/dist/memory-layers/skill-lazy-loading.js.map +1 -0
- package/dist/memory-layers/skill-library.d.ts +133 -4
- package/dist/memory-layers/skill-library.d.ts.map +1 -1
- package/dist/memory-layers/skill-library.js +427 -8
- package/dist/memory-layers/skill-library.js.map +1 -1
- package/dist/memory-layers/working-memory.d.ts +35 -14
- package/dist/memory-layers/working-memory.d.ts.map +1 -1
- package/dist/memory-layers/working-memory.js +114 -36
- package/dist/memory-layers/working-memory.js.map +1 -1
- package/dist/retrieval/hybrid-search.d.ts +2 -2
- package/dist/retrieval/hybrid-search.d.ts.map +1 -1
- package/dist/retrieval/hybrid-search.js +4 -3
- package/dist/retrieval/hybrid-search.js.map +1 -1
- package/dist/router/smart-router.d.ts +25 -0
- package/dist/router/smart-router.d.ts.map +1 -1
- package/dist/router/smart-router.js +90 -10
- package/dist/router/smart-router.js.map +1 -1
- package/dist/scheduler/consolidation-scheduler.d.ts +129 -0
- package/dist/scheduler/consolidation-scheduler.d.ts.map +1 -0
- package/dist/scheduler/consolidation-scheduler.js +179 -0
- package/dist/scheduler/consolidation-scheduler.js.map +1 -0
- package/dist/scheduler/index.d.ts +7 -0
- package/dist/scheduler/index.d.ts.map +1 -0
- package/dist/scheduler/index.js +7 -0
- package/dist/scheduler/index.js.map +1 -0
- package/dist/server-wrapper.js +0 -0
- package/dist/server.js +892 -30
- package/dist/server.js.map +1 -1
- package/dist/synthesis/conflict-detector.d.ts +4 -6
- package/dist/synthesis/conflict-detector.d.ts.map +1 -1
- package/dist/synthesis/conflict-detector.js +19 -21
- package/dist/synthesis/conflict-detector.js.map +1 -1
- package/dist/utils/paths.d.ts +72 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +160 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/validation.d.ts +123 -1
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +146 -7
- package/dist/utils/validation.js.map +1 -1
- package/docker-compose.yml +11 -13
- package/embedding-service/README.md +8 -0
- package/package.json +6 -3
- package/scripts/FRESH_INSTALL.md +1 -1
- package/scripts/ensure-infrastructure.sh +86 -15
- package/scripts/health-check.sh +2 -1
- package/scripts/stop-infrastructure.sh +23 -0
- package/scripts/test-mcp-server.sh +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/consolidation/pipeline.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,MAAM,WAAW,kBAAkB;IACjC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,cAAc,CAAsB;IAC5C,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,EAAE,CAAoB;gBAG5B,aAAa,EAAE,kBAAkB,EACjC,cAAc,EAAE,mBAAmB,EACnC,YAAY,EAAE,YAAY,EAC1B,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAQvB
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/consolidation/pipeline.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,MAAM,WAAW,kBAAkB;IACjC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,cAAc,CAAsB;IAC5C,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,EAAE,CAAoB;gBAG5B,aAAa,EAAE,kBAAkB,EACjC,cAAc,EAAE,mBAAmB,EACnC,YAAY,EAAE,YAAY,EAC1B,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAQvB;;;OAGG;IACG,WAAW,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAoElE;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAuCxB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAQ7B;;OAEG;IACH,OAAO,CAAC,eAAe;IAiDvB;;OAEG;IACH,OAAO,CAAC,aAAa;IAuBrB;;OAEG;IACH,OAAO,CAAC,aAAa;IAwBrB;;OAEG;IACH,OAAO,CAAC,YAAY;CAiBrB"}
|
|
@@ -17,8 +17,9 @@ export class ConsolidationPipeline {
|
|
|
17
17
|
}
|
|
18
18
|
/**
|
|
19
19
|
* Run full consolidation cycle
|
|
20
|
+
* If namespace is omitted, consolidates all namespaces.
|
|
20
21
|
*/
|
|
21
|
-
async consolidate() {
|
|
22
|
+
async consolidate(namespace) {
|
|
22
23
|
const startTime = Date.now();
|
|
23
24
|
console.error('[CONSOLIDATION] Starting consolidation cycle...');
|
|
24
25
|
const stats = {
|
|
@@ -31,29 +32,34 @@ export class ConsolidationPipeline {
|
|
|
31
32
|
duration: 0,
|
|
32
33
|
};
|
|
33
34
|
try {
|
|
34
|
-
//
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
+
}
|
|
47
53
|
}
|
|
54
|
+
// Step 2: Apply temporal decay
|
|
55
|
+
this.semanticMemory.applyTemporalDecay(ns);
|
|
56
|
+
// Step 3: Detect conflicts
|
|
57
|
+
stats.conflictsDetected += this.detectConflicts(ns);
|
|
58
|
+
// Step 4: Prune low-value memories
|
|
59
|
+
stats.memoriesPruned += this.pruneMemories(ns);
|
|
60
|
+
// Step 5: Extract skills (simplified)
|
|
61
|
+
stats.skillsExtracted += this.extractSkills(recentMemories, ns);
|
|
48
62
|
}
|
|
49
|
-
// Step 2: Apply temporal decay
|
|
50
|
-
this.semanticMemory.applyTemporalDecay();
|
|
51
|
-
// Step 3: Detect conflicts
|
|
52
|
-
stats.conflictsDetected = this.detectConflicts();
|
|
53
|
-
// Step 4: Prune low-value memories
|
|
54
|
-
stats.memoriesPruned = this.pruneMemories();
|
|
55
|
-
// Step 5: Extract skills (simplified)
|
|
56
|
-
stats.skillsExtracted = this.extractSkills(recentMemories);
|
|
57
63
|
// Step 6: Create backup
|
|
58
64
|
this.createBackup();
|
|
59
65
|
stats.duration = Date.now() - startTime;
|
|
@@ -102,10 +108,19 @@ export class ConsolidationPipeline {
|
|
|
102
108
|
}
|
|
103
109
|
return { entities, relationships };
|
|
104
110
|
}
|
|
111
|
+
/**
|
|
112
|
+
* Get distinct namespaces from memories table
|
|
113
|
+
*/
|
|
114
|
+
getDistinctNamespaces() {
|
|
115
|
+
const rows = this.db.prepare("SELECT DISTINCT namespace FROM memories WHERE namespace IS NOT NULL").all();
|
|
116
|
+
if (rows.length === 0)
|
|
117
|
+
return ['default'];
|
|
118
|
+
return rows.map(r => r.namespace);
|
|
119
|
+
}
|
|
105
120
|
/**
|
|
106
121
|
* Detect simple conflicts (temporal impossibilities, contradictions)
|
|
107
122
|
*/
|
|
108
|
-
detectConflicts() {
|
|
123
|
+
detectConflicts(namespace = 'default') {
|
|
109
124
|
let detected = 0;
|
|
110
125
|
// Temporal conflicts: same property, overlapping time ranges, different values
|
|
111
126
|
const conflicts = this.db.prepare(`
|
|
@@ -116,16 +131,17 @@ export class ConsolidationPipeline {
|
|
|
116
131
|
AND f1.value != f2.value
|
|
117
132
|
AND f1.valid_until IS NULL
|
|
118
133
|
AND f2.valid_until IS NULL
|
|
119
|
-
|
|
134
|
+
AND f1.namespace = ? AND f2.namespace = ?
|
|
135
|
+
`).all(namespace, namespace);
|
|
120
136
|
for (const conflict of conflicts) {
|
|
121
137
|
// Check if already flagged
|
|
122
138
|
const existing = this.db.prepare('SELECT * FROM conflicts WHERE fact_id_1 = ? AND fact_id_2 = ?').get(conflict.id1, conflict.id2);
|
|
123
139
|
if (!existing) {
|
|
124
140
|
const conflictId = 'conflict_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);
|
|
125
141
|
this.db.prepare(`
|
|
126
|
-
INSERT INTO conflicts (id, fact_id_1, fact_id_2, conflict_type, description, severity, resolution_status)
|
|
127
|
-
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
128
|
-
`).run(conflictId, conflict.id1, conflict.id2, 'contradiction', `Conflicting values for ${conflict.property}: "${conflict.val1}" vs "${conflict.val2}"`, 'medium', 'flagged');
|
|
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);
|
|
129
145
|
// Lower confidence on both facts
|
|
130
146
|
this.db.prepare('UPDATE facts SET confidence = 0.5 WHERE id = ?').run(conflict.id1);
|
|
131
147
|
this.db.prepare('UPDATE facts SET confidence = 0.5 WHERE id = ?').run(conflict.id2);
|
|
@@ -137,7 +153,7 @@ export class ConsolidationPipeline {
|
|
|
137
153
|
/**
|
|
138
154
|
* Prune low-value memories
|
|
139
155
|
*/
|
|
140
|
-
pruneMemories() {
|
|
156
|
+
pruneMemories(namespace = 'default') {
|
|
141
157
|
// Find relationships to prune (weak relationships with low-access entities)
|
|
142
158
|
const toPrune = this.db.prepare(`
|
|
143
159
|
SELECT r.id
|
|
@@ -147,7 +163,8 @@ export class ConsolidationPipeline {
|
|
|
147
163
|
WHERE r.strength < 0.05
|
|
148
164
|
AND source.access_count < 3
|
|
149
165
|
AND target.access_count < 3
|
|
150
|
-
|
|
166
|
+
AND r.namespace = ?
|
|
167
|
+
`).all(namespace);
|
|
151
168
|
// Delete them
|
|
152
169
|
let deleted = 0;
|
|
153
170
|
for (const row of toPrune) {
|
|
@@ -159,20 +176,20 @@ export class ConsolidationPipeline {
|
|
|
159
176
|
/**
|
|
160
177
|
* Extract skills from positive interactions
|
|
161
178
|
*/
|
|
162
|
-
extractSkills(memories) {
|
|
179
|
+
extractSkills(memories, namespace = 'default') {
|
|
163
180
|
let extracted = 0;
|
|
164
181
|
for (const memory of memories) {
|
|
165
182
|
// Look for repeated patterns
|
|
166
183
|
if (memory.topics && memory.topics.includes('analysis')) {
|
|
167
184
|
// Check if skill already exists
|
|
168
|
-
const existing = this.skillLibrary.search('data analysis', 1);
|
|
185
|
+
const existing = this.skillLibrary.search('data analysis', 1, namespace);
|
|
169
186
|
if (existing.length === 0) {
|
|
170
187
|
this.skillLibrary.addSkill({
|
|
171
188
|
name: 'Data Analysis',
|
|
172
189
|
description: 'Analyze datasets and provide insights',
|
|
173
190
|
category: 'analysis',
|
|
174
191
|
triggers: ['analyze', 'data', 'insights'],
|
|
175
|
-
});
|
|
192
|
+
}, namespace);
|
|
176
193
|
extracted++;
|
|
177
194
|
}
|
|
178
195
|
}
|
|
@@ -184,10 +201,11 @@ export class ConsolidationPipeline {
|
|
|
184
201
|
*/
|
|
185
202
|
createBackup() {
|
|
186
203
|
const backupId = 'backup_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);
|
|
204
|
+
const now = new Date().toISOString();
|
|
187
205
|
this.db.prepare(`
|
|
188
|
-
INSERT INTO backup_metadata (id, backup_type, backup_path, created_at, expires_at)
|
|
189
|
-
VALUES (?, ?, ?, ?, ?)
|
|
190
|
-
`).run(backupId, 'consolidation', './backups/' + backupId + '.db',
|
|
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());
|
|
191
209
|
}
|
|
192
210
|
}
|
|
193
211
|
//# sourceMappingURL=pipeline.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/consolidation/pipeline.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiBH,MAAM,OAAO,qBAAqB;IACxB,aAAa,CAAqB;IAClC,cAAc,CAAsB;IACpC,YAAY,CAAe;IAC3B,EAAE,CAAoB;IAE9B,YACE,aAAiC,EACjC,cAAmC,EACnC,YAA0B,EAC1B,EAAqB;QAErB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,CAAC;IAED
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/consolidation/pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Semantic Memory Layer - v3.0 Implementation
|
|
3
3
|
*
|
|
4
4
|
* SQLite knowledge graph with HippoRAG Personalized PageRank.
|
|
5
|
+
* v0.5.0: Added namespace parameter for multi-agent isolation.
|
|
5
6
|
*/
|
|
6
7
|
import Database from 'better-sqlite3';
|
|
7
8
|
export interface Entity {
|
|
@@ -48,29 +49,18 @@ export declare class SemanticMemoryLayer {
|
|
|
48
49
|
upsertEntity(entity: Partial<Entity> & {
|
|
49
50
|
name: string;
|
|
50
51
|
type: string;
|
|
51
|
-
}): Entity;
|
|
52
|
-
getEntity(name: string): any | null;
|
|
52
|
+
}, namespace?: string): Entity;
|
|
53
|
+
getEntity(name: string, namespace?: string): any | null;
|
|
53
54
|
upsertRelationship(rel: {
|
|
54
55
|
sourceId: string;
|
|
55
56
|
targetId: string;
|
|
56
57
|
relationType: string;
|
|
57
58
|
strength?: number;
|
|
58
|
-
}): void;
|
|
59
|
-
personalizedPageRank(entityId: string, depth?: number): any[];
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
* enabling multi-hop query answering (e.g., "What protocol does Vesper follow?"
|
|
65
|
-
* can chain Vesper -> MCP -> "Model Context Protocol").
|
|
66
|
-
*
|
|
67
|
-
* @param entityId - Starting entity ID for traversal
|
|
68
|
-
* @param depth - Maximum hops to traverse (default: 3 for multi-hop queries)
|
|
69
|
-
* @returns PageRankWithFactsResult containing entities, facts, paths, and chains
|
|
70
|
-
*/
|
|
71
|
-
personalizedPageRankWithFacts(entityId: string, depth?: number): PageRankWithFactsResult;
|
|
72
|
-
applyTemporalDecay(): number;
|
|
73
|
-
getPreferences(domain?: string): any[];
|
|
74
|
-
getByTimeRange(start?: Date, end?: Date): any[];
|
|
59
|
+
}, namespace?: string): void;
|
|
60
|
+
personalizedPageRank(entityId: string, depth?: number, namespace?: string): any[];
|
|
61
|
+
personalizedPageRankWithFacts(entityId: string, depth?: number, namespace?: string): PageRankWithFactsResult;
|
|
62
|
+
applyTemporalDecay(namespace?: string): number;
|
|
63
|
+
getPreferences(domain?: string, namespace?: string): any[];
|
|
64
|
+
getByTimeRange(start?: Date, end?: Date, namespace?: string): any[];
|
|
75
65
|
}
|
|
76
66
|
//# sourceMappingURL=semantic-memory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"semantic-memory.d.ts","sourceRoot":"","sources":["../../src/memory-layers/semantic-memory.ts"],"names":[],"mappings":"AAAA
|
|
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"}
|
|
@@ -2,17 +2,18 @@
|
|
|
2
2
|
* Semantic Memory Layer - v3.0 Implementation
|
|
3
3
|
*
|
|
4
4
|
* SQLite knowledge graph with HippoRAG Personalized PageRank.
|
|
5
|
+
* v0.5.0: Added namespace parameter for multi-agent isolation.
|
|
5
6
|
*/
|
|
6
7
|
export class SemanticMemoryLayer {
|
|
7
8
|
db;
|
|
8
9
|
constructor(db) {
|
|
9
10
|
this.db = db;
|
|
10
11
|
}
|
|
11
|
-
upsertEntity(entity) {
|
|
12
|
+
upsertEntity(entity, namespace = 'default') {
|
|
12
13
|
if (!entity.name || entity.name.trim() === '') {
|
|
13
14
|
throw new Error('Entity name cannot be empty');
|
|
14
15
|
}
|
|
15
|
-
const existing = this.db.prepare('SELECT * FROM entities WHERE name = ? AND type = ?').get(entity.name, entity.type);
|
|
16
|
+
const existing = this.db.prepare('SELECT * FROM entities WHERE name = ? AND type = ? AND namespace = ?').get(entity.name, entity.type, namespace);
|
|
16
17
|
if (existing) {
|
|
17
18
|
this.db.prepare('UPDATE entities SET last_accessed = ?, access_count = access_count + 1 WHERE id = ?').run(new Date().toISOString(), existing.id);
|
|
18
19
|
return existing;
|
|
@@ -20,9 +21,9 @@ export class SemanticMemoryLayer {
|
|
|
20
21
|
const id = 'entity_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);
|
|
21
22
|
const now = new Date().toISOString();
|
|
22
23
|
this.db.prepare(`
|
|
23
|
-
INSERT INTO entities (id, name, type, description, confidence, created_at, last_accessed, access_count)
|
|
24
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
25
|
-
`).run(id, entity.name, entity.type, entity.description || null, entity.confidence || 1.0, now, now, 1);
|
|
24
|
+
INSERT INTO entities (id, name, type, description, confidence, created_at, last_accessed, access_count, namespace)
|
|
25
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
26
|
+
`).run(id, entity.name, entity.type, entity.description || null, entity.confidence || 1.0, now, now, 1, namespace);
|
|
26
27
|
return {
|
|
27
28
|
id,
|
|
28
29
|
name: entity.name,
|
|
@@ -31,15 +32,15 @@ export class SemanticMemoryLayer {
|
|
|
31
32
|
confidence: entity.confidence || 1.0
|
|
32
33
|
};
|
|
33
34
|
}
|
|
34
|
-
getEntity(name) {
|
|
35
|
-
const result = this.db.prepare('SELECT * FROM entities WHERE name = ? ORDER BY confidence DESC LIMIT 1').get(name);
|
|
35
|
+
getEntity(name, namespace = 'default') {
|
|
36
|
+
const result = this.db.prepare('SELECT * FROM entities WHERE name = ? AND namespace = ? ORDER BY confidence DESC LIMIT 1').get(name, namespace);
|
|
36
37
|
if (result) {
|
|
37
38
|
this.db.prepare('UPDATE entities SET last_accessed = ?, access_count = access_count + 1 WHERE id = ?').run(new Date().toISOString(), result.id);
|
|
38
39
|
}
|
|
39
40
|
return result || null;
|
|
40
41
|
}
|
|
41
|
-
upsertRelationship(rel) {
|
|
42
|
-
const existing = this.db.prepare('SELECT * FROM relationships WHERE source_id = ? AND target_id = ? AND relation_type = ?').get(rel.sourceId, rel.targetId, rel.relationType);
|
|
42
|
+
upsertRelationship(rel, namespace = 'default') {
|
|
43
|
+
const existing = this.db.prepare('SELECT * FROM relationships WHERE source_id = ? AND target_id = ? AND relation_type = ? AND namespace = ?').get(rel.sourceId, rel.targetId, rel.relationType, namespace);
|
|
43
44
|
const now = new Date().toISOString();
|
|
44
45
|
if (existing) {
|
|
45
46
|
const newStrength = Math.min(1.0, existing.strength + 0.2);
|
|
@@ -48,11 +49,11 @@ export class SemanticMemoryLayer {
|
|
|
48
49
|
}
|
|
49
50
|
const id = 'rel_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);
|
|
50
51
|
this.db.prepare(`
|
|
51
|
-
INSERT INTO relationships (id, source_id, target_id, relation_type, strength, evidence, created_at, last_reinforced)
|
|
52
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
53
|
-
`).run(id, rel.sourceId, rel.targetId, rel.relationType, rel.strength || 0.8, '[]', now, now);
|
|
52
|
+
INSERT INTO relationships (id, source_id, target_id, relation_type, strength, evidence, created_at, last_reinforced, namespace)
|
|
53
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
54
|
+
`).run(id, rel.sourceId, rel.targetId, rel.relationType, rel.strength || 0.8, '[]', now, now, namespace);
|
|
54
55
|
}
|
|
55
|
-
personalizedPageRank(entityId, depth = 3) {
|
|
56
|
+
personalizedPageRank(entityId, depth = 3, namespace = 'default') {
|
|
56
57
|
const visited = new Set();
|
|
57
58
|
const results = [];
|
|
58
59
|
let currentLayer = [{ entityId, score: 1.0 }];
|
|
@@ -62,10 +63,10 @@ export class SemanticMemoryLayer {
|
|
|
62
63
|
if (visited.has(node.entityId))
|
|
63
64
|
continue;
|
|
64
65
|
visited.add(node.entityId);
|
|
65
|
-
const entity = this.db.prepare('SELECT * FROM entities WHERE id = ?').get(node.entityId);
|
|
66
|
+
const entity = this.db.prepare('SELECT * FROM entities WHERE id = ? AND namespace = ?').get(node.entityId, namespace);
|
|
66
67
|
if (entity)
|
|
67
68
|
results.push({ ...entity, relevanceScore: node.score });
|
|
68
|
-
const rels = this.db.prepare('SELECT * FROM relationships WHERE source_id = ? OR target_id = ?').all(node.entityId, node.entityId);
|
|
69
|
+
const rels = this.db.prepare('SELECT * FROM relationships WHERE (source_id = ? OR target_id = ?) AND namespace = ?').all(node.entityId, node.entityId, namespace);
|
|
69
70
|
for (const rel of rels) {
|
|
70
71
|
const nextId = rel.source_id === node.entityId ? rel.target_id : rel.source_id;
|
|
71
72
|
const score = node.score * rel.strength * 0.7;
|
|
@@ -78,26 +79,13 @@ export class SemanticMemoryLayer {
|
|
|
78
79
|
}
|
|
79
80
|
return results.sort((a, b) => b.relevanceScore - a.relevanceScore);
|
|
80
81
|
}
|
|
81
|
-
|
|
82
|
-
* Enhanced Personalized PageRank with fact retrieval for multi-hop reasoning.
|
|
83
|
-
*
|
|
84
|
-
* Returns both entities AND their associated facts along the traversal path,
|
|
85
|
-
* enabling multi-hop query answering (e.g., "What protocol does Vesper follow?"
|
|
86
|
-
* can chain Vesper -> MCP -> "Model Context Protocol").
|
|
87
|
-
*
|
|
88
|
-
* @param entityId - Starting entity ID for traversal
|
|
89
|
-
* @param depth - Maximum hops to traverse (default: 3 for multi-hop queries)
|
|
90
|
-
* @returns PageRankWithFactsResult containing entities, facts, paths, and chains
|
|
91
|
-
*/
|
|
92
|
-
personalizedPageRankWithFacts(entityId, depth = 3) {
|
|
82
|
+
personalizedPageRankWithFacts(entityId, depth = 3, namespace = 'default') {
|
|
93
83
|
const visited = new Set();
|
|
94
84
|
const entities = [];
|
|
95
85
|
const allFacts = [];
|
|
96
86
|
const paths = [];
|
|
97
87
|
const chains = [];
|
|
98
|
-
// Track paths for explainability: entityId -> { path: string[], hops: number }
|
|
99
88
|
const pathTracker = new Map();
|
|
100
|
-
// BFS with score propagation
|
|
101
89
|
let currentLayer = [{
|
|
102
90
|
entityId,
|
|
103
91
|
score: 1.0,
|
|
@@ -105,8 +93,7 @@ export class SemanticMemoryLayer {
|
|
|
105
93
|
depth: 0,
|
|
106
94
|
lastRelationType: 'start'
|
|
107
95
|
}];
|
|
108
|
-
|
|
109
|
-
const startEntity = this.db.prepare('SELECT * FROM entities WHERE id = ?').get(entityId);
|
|
96
|
+
const startEntity = this.db.prepare('SELECT * FROM entities WHERE id = ? AND namespace = ?').get(entityId, namespace);
|
|
110
97
|
if (!startEntity) {
|
|
111
98
|
return { entities: [], facts: [], paths: [], chains: [] };
|
|
112
99
|
}
|
|
@@ -116,19 +103,16 @@ export class SemanticMemoryLayer {
|
|
|
116
103
|
if (visited.has(node.entityId))
|
|
117
104
|
continue;
|
|
118
105
|
visited.add(node.entityId);
|
|
119
|
-
|
|
120
|
-
const entity = this.db.prepare('SELECT * FROM entities WHERE id = ?').get(node.entityId);
|
|
106
|
+
const entity = this.db.prepare('SELECT * FROM entities WHERE id = ? AND namespace = ?').get(node.entityId, namespace);
|
|
121
107
|
if (entity) {
|
|
122
108
|
entities.push({ ...entity, relevanceScore: node.score });
|
|
123
|
-
// Get facts for this entity (valid facts only)
|
|
124
109
|
const entityFacts = this.db.prepare(`
|
|
125
110
|
SELECT * FROM facts
|
|
126
|
-
WHERE entity_id = ?
|
|
111
|
+
WHERE entity_id = ? AND namespace = ?
|
|
127
112
|
AND (valid_until IS NULL OR valid_until > datetime('now'))
|
|
128
113
|
ORDER BY confidence DESC
|
|
129
|
-
`).all(node.entityId);
|
|
114
|
+
`).all(node.entityId, namespace);
|
|
130
115
|
allFacts.push(...entityFacts);
|
|
131
|
-
// Track path if not the starting node
|
|
132
116
|
if (node.depth > 0) {
|
|
133
117
|
pathTracker.set(node.entityId, {
|
|
134
118
|
path: node.path,
|
|
@@ -142,12 +126,11 @@ export class SemanticMemoryLayer {
|
|
|
142
126
|
path: node.path,
|
|
143
127
|
relationType: node.lastRelationType
|
|
144
128
|
});
|
|
145
|
-
// Build chain info for inference
|
|
146
129
|
if (node.path.length > 2) {
|
|
147
130
|
const intermediaryIds = node.path.slice(1, -1);
|
|
148
131
|
const intermediaryNames = [];
|
|
149
132
|
for (const interId of intermediaryIds) {
|
|
150
|
-
const interEntity = this.db.prepare('SELECT name FROM entities WHERE id = ?').get(interId);
|
|
133
|
+
const interEntity = this.db.prepare('SELECT name FROM entities WHERE id = ? AND namespace = ?').get(interId, namespace);
|
|
151
134
|
if (interEntity) {
|
|
152
135
|
intermediaryNames.push(interEntity.name);
|
|
153
136
|
}
|
|
@@ -161,13 +144,11 @@ export class SemanticMemoryLayer {
|
|
|
161
144
|
}
|
|
162
145
|
}
|
|
163
146
|
}
|
|
164
|
-
// Continue only if we have more depth to traverse
|
|
165
147
|
if (d < depth) {
|
|
166
|
-
const rels = this.db.prepare('SELECT * FROM relationships WHERE source_id = ? OR target_id = ?').all(node.entityId, node.entityId);
|
|
148
|
+
const rels = this.db.prepare('SELECT * FROM relationships WHERE (source_id = ? OR target_id = ?) AND namespace = ?').all(node.entityId, node.entityId, namespace);
|
|
167
149
|
for (const rel of rels) {
|
|
168
150
|
const nextId = rel.source_id === node.entityId ? rel.target_id : rel.source_id;
|
|
169
151
|
const score = node.score * rel.strength * 0.7;
|
|
170
|
-
// Lower threshold for multi-hop to ensure we reach deeper nodes
|
|
171
152
|
if (!visited.has(nextId) && score > 0.05) {
|
|
172
153
|
nextLayer.push({
|
|
173
154
|
entityId: nextId,
|
|
@@ -182,11 +163,8 @@ export class SemanticMemoryLayer {
|
|
|
182
163
|
}
|
|
183
164
|
currentLayer = nextLayer;
|
|
184
165
|
}
|
|
185
|
-
// Sort entities by relevance score
|
|
186
166
|
entities.sort((a, b) => b.relevanceScore - a.relevanceScore);
|
|
187
|
-
// Sort facts by confidence
|
|
188
167
|
allFacts.sort((a, b) => b.confidence - a.confidence);
|
|
189
|
-
// Deduplicate facts (same fact might be reached via different paths)
|
|
190
168
|
const uniqueFacts = allFacts.filter((fact, index, self) => index === self.findIndex(f => f.id === fact.id));
|
|
191
169
|
return {
|
|
192
170
|
entities,
|
|
@@ -195,27 +173,26 @@ export class SemanticMemoryLayer {
|
|
|
195
173
|
chains: chains.length > 0 ? chains : undefined
|
|
196
174
|
};
|
|
197
175
|
}
|
|
198
|
-
applyTemporalDecay() {
|
|
199
|
-
const relationships = this.db.prepare('SELECT * FROM relationships').all();
|
|
176
|
+
applyTemporalDecay(namespace = 'default') {
|
|
177
|
+
const relationships = this.db.prepare('SELECT * FROM relationships WHERE namespace = ?').all(namespace);
|
|
200
178
|
let updated = 0;
|
|
201
179
|
for (const rel of relationships) {
|
|
202
180
|
const daysSince = (Date.now() - new Date(rel.last_reinforced).getTime()) / (1000 * 60 * 60 * 24);
|
|
203
181
|
const newStrength = rel.strength * Math.exp(-daysSince / 30);
|
|
204
|
-
// Just update strength, pruning happens later in consolidation
|
|
205
182
|
this.db.prepare('UPDATE relationships SET strength = ? WHERE id = ?').run(newStrength, rel.id);
|
|
206
183
|
updated++;
|
|
207
184
|
}
|
|
208
185
|
return updated;
|
|
209
186
|
}
|
|
210
|
-
getPreferences(domain) {
|
|
187
|
+
getPreferences(domain, namespace = 'default') {
|
|
211
188
|
if (domain) {
|
|
212
|
-
return this.db.prepare('SELECT * FROM entities WHERE type = ? AND (name LIKE ? OR description LIKE ?)').all('preference', `%${domain}%`, `%${domain}%`);
|
|
189
|
+
return this.db.prepare('SELECT * FROM entities WHERE type = ? AND namespace = ? AND (name LIKE ? OR description LIKE ?)').all('preference', namespace, `%${domain}%`, `%${domain}%`);
|
|
213
190
|
}
|
|
214
|
-
return this.db.prepare('SELECT * FROM entities WHERE type = ?').all('preference');
|
|
191
|
+
return this.db.prepare('SELECT * FROM entities WHERE type = ? AND namespace = ?').all('preference', namespace);
|
|
215
192
|
}
|
|
216
|
-
getByTimeRange(start, end) {
|
|
217
|
-
let query = 'SELECT * FROM entities WHERE
|
|
218
|
-
const params = [];
|
|
193
|
+
getByTimeRange(start, end, namespace = 'default') {
|
|
194
|
+
let query = 'SELECT * FROM entities WHERE namespace = ?';
|
|
195
|
+
const params = [namespace];
|
|
219
196
|
if (start) {
|
|
220
197
|
query += ' AND created_at >= ?';
|
|
221
198
|
params.push(start.toISOString());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"semantic-memory.js","sourceRoot":"","sources":["../../src/memory-layers/semantic-memory.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"semantic-memory.js","sourceRoot":"","sources":["../../src/memory-layers/semantic-memory.ts"],"names":[],"mappings":"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"}
|