@mce-bt/microagents-memory 0.1.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/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/knowledge-graph.d.ts +179 -0
- package/dist/knowledge-graph.d.ts.map +1 -0
- package/dist/knowledge-graph.js +513 -0
- package/dist/knowledge-graph.js.map +1 -0
- package/dist/ltm.d.ts +82 -0
- package/dist/ltm.d.ts.map +1 -0
- package/dist/ltm.js +223 -0
- package/dist/ltm.js.map +1 -0
- package/dist/manager.d.ts +80 -0
- package/dist/manager.d.ts.map +1 -0
- package/dist/manager.js +182 -0
- package/dist/manager.js.map +1 -0
- package/dist/memory-extractor.d.ts +75 -0
- package/dist/memory-extractor.d.ts.map +1 -0
- package/dist/memory-extractor.js +321 -0
- package/dist/memory-extractor.js.map +1 -0
- package/dist/memory-tools.d.ts +10 -0
- package/dist/memory-tools.d.ts.map +1 -0
- package/dist/memory-tools.js +239 -0
- package/dist/memory-tools.js.map +1 -0
- package/dist/mtm.d.ts +55 -0
- package/dist/mtm.d.ts.map +1 -0
- package/dist/mtm.js +139 -0
- package/dist/mtm.js.map +1 -0
- package/dist/stm.d.ts +55 -0
- package/dist/stm.d.ts.map +1 -0
- package/dist/stm.js +105 -0
- package/dist/stm.js.map +1 -0
- package/dist/summarization-pipeline.d.ts +78 -0
- package/dist/summarization-pipeline.d.ts.map +1 -0
- package/dist/summarization-pipeline.js +155 -0
- package/dist/summarization-pipeline.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,513 @@
|
|
|
1
|
+
import pg from 'pg';
|
|
2
|
+
const { Pool } = pg;
|
|
3
|
+
/**
|
|
4
|
+
* Knowledge Graph — Postgres-backed entity-relation graph with temporal validity.
|
|
5
|
+
*
|
|
6
|
+
* Combines the MCP memory server's entity-relation-observation model with
|
|
7
|
+
* Graphiti's temporal validity windows, all implemented in PostgreSQL.
|
|
8
|
+
*
|
|
9
|
+
* Entities have names, types, observations (atomic facts), and optional embeddings
|
|
10
|
+
* for semantic search. Relations connect entities with typed, directed edges that
|
|
11
|
+
* carry validity windows (valid_from / valid_until) for temporal reasoning.
|
|
12
|
+
*/
|
|
13
|
+
export class KnowledgeGraph {
|
|
14
|
+
pool = null;
|
|
15
|
+
config;
|
|
16
|
+
agentId = '';
|
|
17
|
+
embeddingDimensions;
|
|
18
|
+
constructor(config) {
|
|
19
|
+
this.config = config;
|
|
20
|
+
this.embeddingDimensions = config.embeddingDimensions ?? 1536;
|
|
21
|
+
}
|
|
22
|
+
async start(agentId) {
|
|
23
|
+
this.agentId = agentId;
|
|
24
|
+
this.pool = new Pool({ connectionString: this.config.connectionString });
|
|
25
|
+
await this.ensureSchema();
|
|
26
|
+
}
|
|
27
|
+
async stop() {
|
|
28
|
+
if (this.pool) {
|
|
29
|
+
await this.pool.end();
|
|
30
|
+
this.pool = null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// ─── Schema ───
|
|
34
|
+
async ensureSchema() {
|
|
35
|
+
if (!this.pool)
|
|
36
|
+
return;
|
|
37
|
+
await this.pool.query('CREATE EXTENSION IF NOT EXISTS vector');
|
|
38
|
+
await this.pool.query(`
|
|
39
|
+
CREATE TABLE IF NOT EXISTS kg_entities (
|
|
40
|
+
id TEXT PRIMARY KEY,
|
|
41
|
+
agent_id TEXT NOT NULL,
|
|
42
|
+
name TEXT NOT NULL,
|
|
43
|
+
entity_type TEXT NOT NULL DEFAULT 'general',
|
|
44
|
+
observations TEXT[] DEFAULT '{}',
|
|
45
|
+
embedding vector(${this.embeddingDimensions}),
|
|
46
|
+
metadata JSONB DEFAULT '{}',
|
|
47
|
+
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
48
|
+
updated_at TIMESTAMPTZ DEFAULT NOW()
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_kg_entity_name_agent
|
|
52
|
+
ON kg_entities(agent_id, name);
|
|
53
|
+
CREATE INDEX IF NOT EXISTS idx_kg_entity_type
|
|
54
|
+
ON kg_entities(agent_id, entity_type);
|
|
55
|
+
CREATE INDEX IF NOT EXISTS idx_kg_entity_observations
|
|
56
|
+
ON kg_entities USING GIN(observations);
|
|
57
|
+
`);
|
|
58
|
+
await this.pool.query(`
|
|
59
|
+
CREATE TABLE IF NOT EXISTS kg_relations (
|
|
60
|
+
id TEXT PRIMARY KEY,
|
|
61
|
+
agent_id TEXT NOT NULL,
|
|
62
|
+
from_entity TEXT NOT NULL,
|
|
63
|
+
to_entity TEXT NOT NULL,
|
|
64
|
+
relation_type TEXT NOT NULL,
|
|
65
|
+
weight REAL DEFAULT 1.0,
|
|
66
|
+
valid_from TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
67
|
+
valid_until TIMESTAMPTZ,
|
|
68
|
+
metadata JSONB DEFAULT '{}',
|
|
69
|
+
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
70
|
+
CONSTRAINT fk_from_entity FOREIGN KEY (from_entity)
|
|
71
|
+
REFERENCES kg_entities(id) ON DELETE CASCADE,
|
|
72
|
+
CONSTRAINT fk_to_entity FOREIGN KEY (to_entity)
|
|
73
|
+
REFERENCES kg_entities(id) ON DELETE CASCADE
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
CREATE INDEX IF NOT EXISTS idx_kg_rel_from ON kg_relations(from_entity);
|
|
77
|
+
CREATE INDEX IF NOT EXISTS idx_kg_rel_to ON kg_relations(to_entity);
|
|
78
|
+
CREATE INDEX IF NOT EXISTS idx_kg_rel_type ON kg_relations(relation_type);
|
|
79
|
+
CREATE INDEX IF NOT EXISTS idx_kg_rel_valid
|
|
80
|
+
ON kg_relations(valid_from, valid_until);
|
|
81
|
+
`);
|
|
82
|
+
// Vector index (may fail if not enough data)
|
|
83
|
+
try {
|
|
84
|
+
await this.pool.query(`
|
|
85
|
+
CREATE INDEX IF NOT EXISTS idx_kg_entity_embedding
|
|
86
|
+
ON kg_entities USING ivfflat (embedding vector_cosine_ops)
|
|
87
|
+
WITH (lists = 100)
|
|
88
|
+
`);
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
// IVFFlat needs data to build; will be created later
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// ─── Entity CRUD ───
|
|
95
|
+
/**
|
|
96
|
+
* Create or update an entity. If an entity with the same name already exists
|
|
97
|
+
* for this agent, merges new observations (deduplicates) and updates metadata.
|
|
98
|
+
*/
|
|
99
|
+
async upsertEntity(input) {
|
|
100
|
+
if (!this.pool)
|
|
101
|
+
throw new Error('KnowledgeGraph not started');
|
|
102
|
+
const existing = await this.getEntityByName(input.name);
|
|
103
|
+
if (existing) {
|
|
104
|
+
// Merge observations (deduplicate)
|
|
105
|
+
const newObs = (input.observations ?? []).filter((o) => !existing.observations.includes(o));
|
|
106
|
+
const mergedObs = [...existing.observations, ...newObs];
|
|
107
|
+
const mergedMeta = { ...existing.metadata, ...(input.metadata ?? {}) };
|
|
108
|
+
const embeddingStr = input.embedding
|
|
109
|
+
? `[${input.embedding.join(',')}]`
|
|
110
|
+
: null;
|
|
111
|
+
if (embeddingStr) {
|
|
112
|
+
await this.pool.query(`UPDATE kg_entities
|
|
113
|
+
SET observations = $1, metadata = $2, entity_type = $3,
|
|
114
|
+
embedding = $4::vector, updated_at = NOW()
|
|
115
|
+
WHERE id = $5`, [mergedObs, JSON.stringify(mergedMeta), input.entityType, embeddingStr, existing.id]);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
await this.pool.query(`UPDATE kg_entities
|
|
119
|
+
SET observations = $1, metadata = $2, entity_type = $3, updated_at = NOW()
|
|
120
|
+
WHERE id = $4`, [mergedObs, JSON.stringify(mergedMeta), input.entityType, existing.id]);
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
...existing,
|
|
124
|
+
observations: mergedObs,
|
|
125
|
+
metadata: mergedMeta,
|
|
126
|
+
entityType: input.entityType,
|
|
127
|
+
updatedAt: new Date(),
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
// Create new
|
|
131
|
+
const id = `ent-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
132
|
+
const embeddingStr = input.embedding
|
|
133
|
+
? `[${input.embedding.join(',')}]`
|
|
134
|
+
: null;
|
|
135
|
+
await this.pool.query(`INSERT INTO kg_entities (id, agent_id, name, entity_type, observations, embedding, metadata)
|
|
136
|
+
VALUES ($1, $2, $3, $4, $5, $6::vector, $7)`, [
|
|
137
|
+
id,
|
|
138
|
+
this.agentId,
|
|
139
|
+
input.name,
|
|
140
|
+
input.entityType,
|
|
141
|
+
input.observations ?? [],
|
|
142
|
+
embeddingStr,
|
|
143
|
+
JSON.stringify(input.metadata ?? {}),
|
|
144
|
+
]);
|
|
145
|
+
return {
|
|
146
|
+
id,
|
|
147
|
+
agentId: this.agentId,
|
|
148
|
+
name: input.name,
|
|
149
|
+
entityType: input.entityType,
|
|
150
|
+
observations: input.observations ?? [],
|
|
151
|
+
metadata: input.metadata ?? {},
|
|
152
|
+
createdAt: new Date(),
|
|
153
|
+
updatedAt: new Date(),
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Get an entity by name (scoped to this agent).
|
|
158
|
+
*/
|
|
159
|
+
async getEntityByName(name) {
|
|
160
|
+
if (!this.pool)
|
|
161
|
+
throw new Error('KnowledgeGraph not started');
|
|
162
|
+
const result = await this.pool.query('SELECT * FROM kg_entities WHERE agent_id = $1 AND name = $2', [this.agentId, name]);
|
|
163
|
+
if (result.rows.length === 0)
|
|
164
|
+
return null;
|
|
165
|
+
return this.rowToEntity(result.rows[0]);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Get an entity by ID.
|
|
169
|
+
*/
|
|
170
|
+
async getEntityById(id) {
|
|
171
|
+
if (!this.pool)
|
|
172
|
+
throw new Error('KnowledgeGraph not started');
|
|
173
|
+
const result = await this.pool.query('SELECT * FROM kg_entities WHERE id = $1', [id]);
|
|
174
|
+
if (result.rows.length === 0)
|
|
175
|
+
return null;
|
|
176
|
+
return this.rowToEntity(result.rows[0]);
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Add observations to an existing entity. Deduplicates automatically.
|
|
180
|
+
*/
|
|
181
|
+
async addObservations(entityName, observations) {
|
|
182
|
+
if (!this.pool)
|
|
183
|
+
throw new Error('KnowledgeGraph not started');
|
|
184
|
+
const entity = await this.getEntityByName(entityName);
|
|
185
|
+
if (!entity)
|
|
186
|
+
throw new Error(`Entity "${entityName}" not found`);
|
|
187
|
+
const newObs = observations.filter((o) => !entity.observations.includes(o));
|
|
188
|
+
if (newObs.length === 0)
|
|
189
|
+
return [];
|
|
190
|
+
const merged = [...entity.observations, ...newObs];
|
|
191
|
+
await this.pool.query('UPDATE kg_entities SET observations = $1, updated_at = NOW() WHERE id = $2', [merged, entity.id]);
|
|
192
|
+
return newObs;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Remove specific observations from an entity.
|
|
196
|
+
*/
|
|
197
|
+
async removeObservations(entityName, observations) {
|
|
198
|
+
if (!this.pool)
|
|
199
|
+
throw new Error('KnowledgeGraph not started');
|
|
200
|
+
const entity = await this.getEntityByName(entityName);
|
|
201
|
+
if (!entity)
|
|
202
|
+
return;
|
|
203
|
+
const filtered = entity.observations.filter((o) => !observations.includes(o));
|
|
204
|
+
await this.pool.query('UPDATE kg_entities SET observations = $1, updated_at = NOW() WHERE id = $2', [filtered, entity.id]);
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Delete an entity and all its relations (cascading).
|
|
208
|
+
*/
|
|
209
|
+
async deleteEntity(name) {
|
|
210
|
+
if (!this.pool)
|
|
211
|
+
throw new Error('KnowledgeGraph not started');
|
|
212
|
+
await this.pool.query('DELETE FROM kg_entities WHERE agent_id = $1 AND name = $2', [this.agentId, name]);
|
|
213
|
+
}
|
|
214
|
+
// ─── Relation CRUD ───
|
|
215
|
+
/**
|
|
216
|
+
* Create a relation between two entities. Skips if an identical active relation exists.
|
|
217
|
+
* If a contradicting relation exists (same from/to/type but different validity),
|
|
218
|
+
* the old one is invalidated (valid_until set to now).
|
|
219
|
+
*/
|
|
220
|
+
async createRelation(input) {
|
|
221
|
+
if (!this.pool)
|
|
222
|
+
throw new Error('KnowledgeGraph not started');
|
|
223
|
+
// Resolve entity IDs from names
|
|
224
|
+
const fromEntity = await this.getEntityByName(input.from);
|
|
225
|
+
const toEntity = await this.getEntityByName(input.to);
|
|
226
|
+
if (!fromEntity || !toEntity) {
|
|
227
|
+
throw new Error(`Cannot create relation: entity "${!fromEntity ? input.from : input.to}" not found`);
|
|
228
|
+
}
|
|
229
|
+
// Check for existing active relation of same type
|
|
230
|
+
const existing = await this.pool.query(`SELECT id FROM kg_relations
|
|
231
|
+
WHERE from_entity = $1 AND to_entity = $2
|
|
232
|
+
AND relation_type = $3 AND valid_until IS NULL`, [fromEntity.id, toEntity.id, input.relationType]);
|
|
233
|
+
if (existing.rows.length > 0) {
|
|
234
|
+
// Identical active relation exists — skip
|
|
235
|
+
return null;
|
|
236
|
+
}
|
|
237
|
+
const id = `rel-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
238
|
+
const validFrom = input.validFrom ?? new Date();
|
|
239
|
+
await this.pool.query(`INSERT INTO kg_relations (id, agent_id, from_entity, to_entity, relation_type, weight, valid_from, metadata)
|
|
240
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8)`, [
|
|
241
|
+
id,
|
|
242
|
+
this.agentId,
|
|
243
|
+
fromEntity.id,
|
|
244
|
+
toEntity.id,
|
|
245
|
+
input.relationType,
|
|
246
|
+
input.weight ?? 1.0,
|
|
247
|
+
validFrom,
|
|
248
|
+
JSON.stringify(input.metadata ?? {}),
|
|
249
|
+
]);
|
|
250
|
+
return {
|
|
251
|
+
id,
|
|
252
|
+
agentId: this.agentId,
|
|
253
|
+
fromEntity: fromEntity.id,
|
|
254
|
+
toEntity: toEntity.id,
|
|
255
|
+
relationType: input.relationType,
|
|
256
|
+
weight: input.weight ?? 1.0,
|
|
257
|
+
validFrom,
|
|
258
|
+
validUntil: null,
|
|
259
|
+
metadata: input.metadata ?? {},
|
|
260
|
+
createdAt: new Date(),
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Invalidate a relation by setting valid_until to now.
|
|
265
|
+
* Preserves history — the relation is never deleted.
|
|
266
|
+
*/
|
|
267
|
+
async invalidateRelation(id) {
|
|
268
|
+
if (!this.pool)
|
|
269
|
+
throw new Error('KnowledgeGraph not started');
|
|
270
|
+
await this.pool.query('UPDATE kg_relations SET valid_until = NOW() WHERE id = $1', [id]);
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Delete a relation permanently (use invalidate for temporal preservation).
|
|
274
|
+
*/
|
|
275
|
+
async deleteRelation(input) {
|
|
276
|
+
if (!this.pool)
|
|
277
|
+
throw new Error('KnowledgeGraph not started');
|
|
278
|
+
const fromEntity = await this.getEntityByName(input.from);
|
|
279
|
+
const toEntity = await this.getEntityByName(input.to);
|
|
280
|
+
if (!fromEntity || !toEntity)
|
|
281
|
+
return;
|
|
282
|
+
await this.pool.query(`DELETE FROM kg_relations
|
|
283
|
+
WHERE from_entity = $1 AND to_entity = $2 AND relation_type = $3`, [fromEntity.id, toEntity.id, input.relationType]);
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Get all active relations for an entity (as source or target).
|
|
287
|
+
* Only returns relations where valid_until IS NULL (currently active).
|
|
288
|
+
*/
|
|
289
|
+
async getEntityRelations(entityName, options = {}) {
|
|
290
|
+
if (!this.pool)
|
|
291
|
+
throw new Error('KnowledgeGraph not started');
|
|
292
|
+
const entity = await this.getEntityByName(entityName);
|
|
293
|
+
if (!entity)
|
|
294
|
+
return [];
|
|
295
|
+
const validClause = options.includeExpired
|
|
296
|
+
? ''
|
|
297
|
+
: 'AND r.valid_until IS NULL';
|
|
298
|
+
const result = await this.pool.query(`SELECT r.*,
|
|
299
|
+
fe.name as from_name,
|
|
300
|
+
te.name as to_name
|
|
301
|
+
FROM kg_relations r
|
|
302
|
+
JOIN kg_entities fe ON r.from_entity = fe.id
|
|
303
|
+
JOIN kg_entities te ON r.to_entity = te.id
|
|
304
|
+
WHERE (r.from_entity = $1 OR r.to_entity = $1)
|
|
305
|
+
${validClause}
|
|
306
|
+
ORDER BY r.valid_from DESC`, [entity.id]);
|
|
307
|
+
return result.rows.map((row) => ({
|
|
308
|
+
...this.rowToRelation(row),
|
|
309
|
+
fromName: row.from_name,
|
|
310
|
+
toName: row.to_name,
|
|
311
|
+
}));
|
|
312
|
+
}
|
|
313
|
+
// ─── Search ───
|
|
314
|
+
/**
|
|
315
|
+
* Search entities by text query (matches name, type, and observations).
|
|
316
|
+
*/
|
|
317
|
+
async searchEntities(options = {}) {
|
|
318
|
+
if (!this.pool)
|
|
319
|
+
throw new Error('KnowledgeGraph not started');
|
|
320
|
+
const conditions = ['agent_id = $1'];
|
|
321
|
+
const params = [this.agentId];
|
|
322
|
+
let idx = 2;
|
|
323
|
+
if (options.entityType) {
|
|
324
|
+
conditions.push(`entity_type = $${idx}`);
|
|
325
|
+
params.push(options.entityType);
|
|
326
|
+
idx++;
|
|
327
|
+
}
|
|
328
|
+
if (options.query) {
|
|
329
|
+
const q = options.query.toLowerCase();
|
|
330
|
+
conditions.push(`(LOWER(name) LIKE $${idx}
|
|
331
|
+
OR LOWER(entity_type) LIKE $${idx}
|
|
332
|
+
OR EXISTS (SELECT 1 FROM unnest(observations) obs WHERE LOWER(obs) LIKE $${idx}))`);
|
|
333
|
+
params.push(`%${q}%`);
|
|
334
|
+
idx++;
|
|
335
|
+
}
|
|
336
|
+
const limit = options.limit ?? 20;
|
|
337
|
+
const result = await this.pool.query(`SELECT * FROM kg_entities WHERE ${conditions.join(' AND ')}
|
|
338
|
+
ORDER BY updated_at DESC LIMIT $${idx}`, [...params, limit]);
|
|
339
|
+
return result.rows.map(this.rowToEntity);
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Semantic search entities by embedding similarity.
|
|
343
|
+
*/
|
|
344
|
+
async searchEntitiesByEmbedding(queryEmbedding, options = {}) {
|
|
345
|
+
if (!this.pool)
|
|
346
|
+
throw new Error('KnowledgeGraph not started');
|
|
347
|
+
const conditions = ['agent_id = $1', 'embedding IS NOT NULL'];
|
|
348
|
+
const params = [this.agentId];
|
|
349
|
+
let idx = 2;
|
|
350
|
+
if (options.entityType) {
|
|
351
|
+
conditions.push(`entity_type = $${idx}`);
|
|
352
|
+
params.push(options.entityType);
|
|
353
|
+
idx++;
|
|
354
|
+
}
|
|
355
|
+
const embeddingStr = `[${queryEmbedding.join(',')}]`;
|
|
356
|
+
const limit = options.limit ?? 10;
|
|
357
|
+
const threshold = options.threshold ?? 0.7;
|
|
358
|
+
const result = await this.pool.query(`SELECT *,
|
|
359
|
+
1 - (embedding <=> $${idx}::vector) as similarity
|
|
360
|
+
FROM kg_entities
|
|
361
|
+
WHERE ${conditions.join(' AND ')}
|
|
362
|
+
AND 1 - (embedding <=> $${idx}::vector) >= $${idx + 1}
|
|
363
|
+
ORDER BY embedding <=> $${idx}::vector
|
|
364
|
+
LIMIT $${idx + 2}`, [...params, embeddingStr, threshold, limit]);
|
|
365
|
+
return result.rows.map((row) => ({
|
|
366
|
+
...this.rowToEntity(row),
|
|
367
|
+
similarity: parseFloat(row.similarity),
|
|
368
|
+
}));
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Open specific entities by name and return them with their relations.
|
|
372
|
+
* Similar to MCP memory server's open_nodes.
|
|
373
|
+
*/
|
|
374
|
+
async openEntities(names) {
|
|
375
|
+
if (!this.pool)
|
|
376
|
+
throw new Error('KnowledgeGraph not started');
|
|
377
|
+
if (names.length === 0)
|
|
378
|
+
return { entities: [], relations: [] };
|
|
379
|
+
// Get entities
|
|
380
|
+
const entityResult = await this.pool.query(`SELECT * FROM kg_entities
|
|
381
|
+
WHERE agent_id = $1 AND name = ANY($2)`, [this.agentId, names]);
|
|
382
|
+
const entities = entityResult.rows.map(this.rowToEntity);
|
|
383
|
+
const entityIds = entities.map((e) => e.id);
|
|
384
|
+
if (entityIds.length === 0)
|
|
385
|
+
return { entities: [], relations: [] };
|
|
386
|
+
// Get active relations where at least one endpoint is in the set
|
|
387
|
+
const relResult = await this.pool.query(`SELECT * FROM kg_relations
|
|
388
|
+
WHERE (from_entity = ANY($1) OR to_entity = ANY($1))
|
|
389
|
+
AND valid_until IS NULL
|
|
390
|
+
ORDER BY valid_from DESC`, [entityIds]);
|
|
391
|
+
const relations = relResult.rows.map(this.rowToRelation);
|
|
392
|
+
return { entities, relations };
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Read the full graph for this agent (active relations only).
|
|
396
|
+
*/
|
|
397
|
+
async readGraph(options = {}) {
|
|
398
|
+
if (!this.pool)
|
|
399
|
+
throw new Error('KnowledgeGraph not started');
|
|
400
|
+
const entityResult = await this.pool.query('SELECT * FROM kg_entities WHERE agent_id = $1 ORDER BY name', [this.agentId]);
|
|
401
|
+
const validClause = options.includeExpired
|
|
402
|
+
? ''
|
|
403
|
+
: 'AND valid_until IS NULL';
|
|
404
|
+
const relResult = await this.pool.query(`SELECT * FROM kg_relations WHERE agent_id = $1 ${validClause} ORDER BY valid_from DESC`, [this.agentId]);
|
|
405
|
+
return {
|
|
406
|
+
entities: entityResult.rows.map(this.rowToEntity),
|
|
407
|
+
relations: relResult.rows.map(this.rowToRelation),
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
// ─── Temporal Queries ───
|
|
411
|
+
/**
|
|
412
|
+
* Get the state of relations at a specific point in time.
|
|
413
|
+
*/
|
|
414
|
+
async getRelationsAt(date, options = {}) {
|
|
415
|
+
if (!this.pool)
|
|
416
|
+
throw new Error('KnowledgeGraph not started');
|
|
417
|
+
const conditions = [
|
|
418
|
+
'agent_id = $1',
|
|
419
|
+
'valid_from <= $2',
|
|
420
|
+
'(valid_until IS NULL OR valid_until > $2)',
|
|
421
|
+
];
|
|
422
|
+
const params = [this.agentId, date];
|
|
423
|
+
let idx = 3;
|
|
424
|
+
if (options.entityName) {
|
|
425
|
+
const entity = await this.getEntityByName(options.entityName);
|
|
426
|
+
if (!entity)
|
|
427
|
+
return [];
|
|
428
|
+
conditions.push(`(from_entity = $${idx} OR to_entity = $${idx})`);
|
|
429
|
+
params.push(entity.id);
|
|
430
|
+
idx++;
|
|
431
|
+
}
|
|
432
|
+
const result = await this.pool.query(`SELECT * FROM kg_relations WHERE ${conditions.join(' AND ')} ORDER BY valid_from DESC`, params);
|
|
433
|
+
return result.rows.map(this.rowToRelation);
|
|
434
|
+
}
|
|
435
|
+
/**
|
|
436
|
+
* Get the history of changes to a specific relation type between two entities.
|
|
437
|
+
*/
|
|
438
|
+
async getRelationHistory(from, to, relationType) {
|
|
439
|
+
if (!this.pool)
|
|
440
|
+
throw new Error('KnowledgeGraph not started');
|
|
441
|
+
const fromEntity = await this.getEntityByName(from);
|
|
442
|
+
const toEntity = await this.getEntityByName(to);
|
|
443
|
+
if (!fromEntity || !toEntity)
|
|
444
|
+
return [];
|
|
445
|
+
const result = await this.pool.query(`SELECT * FROM kg_relations
|
|
446
|
+
WHERE from_entity = $1 AND to_entity = $2 AND relation_type = $3
|
|
447
|
+
ORDER BY valid_from DESC`, [fromEntity.id, toEntity.id, relationType]);
|
|
448
|
+
return result.rows.map(this.rowToRelation);
|
|
449
|
+
}
|
|
450
|
+
// ─── Contradiction Detection ───
|
|
451
|
+
/**
|
|
452
|
+
* Update a relation: invalidates the existing one and creates a new one.
|
|
453
|
+
* This preserves temporal history (Graphiti pattern).
|
|
454
|
+
*/
|
|
455
|
+
async supersedRelation(input) {
|
|
456
|
+
if (!this.pool)
|
|
457
|
+
throw new Error('KnowledgeGraph not started');
|
|
458
|
+
const fromEntity = await this.getEntityByName(input.from);
|
|
459
|
+
const toEntity = await this.getEntityByName(input.to);
|
|
460
|
+
if (!fromEntity || !toEntity)
|
|
461
|
+
return null;
|
|
462
|
+
// Invalidate existing active relation
|
|
463
|
+
await this.pool.query(`UPDATE kg_relations SET valid_until = NOW()
|
|
464
|
+
WHERE from_entity = $1 AND to_entity = $2
|
|
465
|
+
AND relation_type = $3 AND valid_until IS NULL`, [fromEntity.id, toEntity.id, input.relationType]);
|
|
466
|
+
// Create the new one
|
|
467
|
+
return this.createRelation(input);
|
|
468
|
+
}
|
|
469
|
+
// ─── Aggregation ───
|
|
470
|
+
/**
|
|
471
|
+
* Get entity counts grouped by type.
|
|
472
|
+
*/
|
|
473
|
+
async getEntityTypeCounts() {
|
|
474
|
+
if (!this.pool)
|
|
475
|
+
throw new Error('KnowledgeGraph not started');
|
|
476
|
+
const result = await this.pool.query(`SELECT entity_type, COUNT(*)::int as count
|
|
477
|
+
FROM kg_entities WHERE agent_id = $1
|
|
478
|
+
GROUP BY entity_type ORDER BY count DESC`, [this.agentId]);
|
|
479
|
+
const counts = {};
|
|
480
|
+
for (const row of result.rows) {
|
|
481
|
+
counts[row.entity_type] = row.count;
|
|
482
|
+
}
|
|
483
|
+
return counts;
|
|
484
|
+
}
|
|
485
|
+
// ─── Row Mappers ───
|
|
486
|
+
rowToEntity(row) {
|
|
487
|
+
return {
|
|
488
|
+
id: row.id,
|
|
489
|
+
agentId: row.agent_id,
|
|
490
|
+
name: row.name,
|
|
491
|
+
entityType: row.entity_type,
|
|
492
|
+
observations: (row.observations ?? []),
|
|
493
|
+
metadata: (row.metadata ?? {}),
|
|
494
|
+
createdAt: new Date(row.created_at),
|
|
495
|
+
updatedAt: new Date(row.updated_at),
|
|
496
|
+
};
|
|
497
|
+
}
|
|
498
|
+
rowToRelation(row) {
|
|
499
|
+
return {
|
|
500
|
+
id: row.id,
|
|
501
|
+
agentId: row.agent_id,
|
|
502
|
+
fromEntity: row.from_entity,
|
|
503
|
+
toEntity: row.to_entity,
|
|
504
|
+
relationType: row.relation_type,
|
|
505
|
+
weight: row.weight,
|
|
506
|
+
validFrom: new Date(row.valid_from),
|
|
507
|
+
validUntil: row.valid_until ? new Date(row.valid_until) : null,
|
|
508
|
+
metadata: (row.metadata ?? {}),
|
|
509
|
+
createdAt: new Date(row.created_at),
|
|
510
|
+
};
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
//# sourceMappingURL=knowledge-graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge-graph.js","sourceRoot":"","sources":["../src/knowledge-graph.ts"],"names":[],"mappings":"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"}
|
package/dist/ltm.d.ts
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
export interface LTMConfig {
|
|
2
|
+
connectionString: string;
|
|
3
|
+
/** Embedding dimensions (default: 1536 for OpenAI text-embedding-3-small) */
|
|
4
|
+
embeddingDimensions?: number;
|
|
5
|
+
}
|
|
6
|
+
export interface KnowledgeFact {
|
|
7
|
+
id: string;
|
|
8
|
+
agentId: string;
|
|
9
|
+
content: string;
|
|
10
|
+
category: string;
|
|
11
|
+
tags: string[];
|
|
12
|
+
embedding?: number[];
|
|
13
|
+
metadata: Record<string, unknown>;
|
|
14
|
+
createdAt: Date;
|
|
15
|
+
updatedAt: Date;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Long-Term Memory (LTM) — PostgreSQL + pgvector knowledge store.
|
|
19
|
+
*
|
|
20
|
+
* Stores persistent semantic knowledge with embeddings for RAG retrieval.
|
|
21
|
+
* Where durable learning lives. Categorized, tagged, searchable.
|
|
22
|
+
*/
|
|
23
|
+
export declare class LongTermMemory {
|
|
24
|
+
private pool;
|
|
25
|
+
private config;
|
|
26
|
+
private agentId;
|
|
27
|
+
private embeddingDimensions;
|
|
28
|
+
constructor(config: LTMConfig);
|
|
29
|
+
start(agentId: string): Promise<void>;
|
|
30
|
+
stop(): Promise<void>;
|
|
31
|
+
private ensureSchema;
|
|
32
|
+
/**
|
|
33
|
+
* Store a knowledge fact with optional embedding.
|
|
34
|
+
*/
|
|
35
|
+
store(fact: {
|
|
36
|
+
content: string;
|
|
37
|
+
category?: string;
|
|
38
|
+
tags?: string[];
|
|
39
|
+
embedding?: number[];
|
|
40
|
+
metadata?: Record<string, unknown>;
|
|
41
|
+
}): Promise<string>;
|
|
42
|
+
/**
|
|
43
|
+
* Semantic similarity search using embedding vector.
|
|
44
|
+
*/
|
|
45
|
+
search(queryEmbedding: number[], options?: {
|
|
46
|
+
category?: string;
|
|
47
|
+
tags?: string[];
|
|
48
|
+
agentId?: string;
|
|
49
|
+
limit?: number;
|
|
50
|
+
threshold?: number;
|
|
51
|
+
}): Promise<(KnowledgeFact & {
|
|
52
|
+
similarity: number;
|
|
53
|
+
})[]>;
|
|
54
|
+
/**
|
|
55
|
+
* Full-text search (keyword-based, no embedding needed).
|
|
56
|
+
*/
|
|
57
|
+
searchByText(query: string, options?: {
|
|
58
|
+
category?: string;
|
|
59
|
+
tags?: string[];
|
|
60
|
+
limit?: number;
|
|
61
|
+
}): Promise<KnowledgeFact[]>;
|
|
62
|
+
/**
|
|
63
|
+
* Get a fact by ID.
|
|
64
|
+
*/
|
|
65
|
+
getById(id: string): Promise<KnowledgeFact | null>;
|
|
66
|
+
/**
|
|
67
|
+
* Update a fact's content and optionally its embedding.
|
|
68
|
+
*/
|
|
69
|
+
update(id: string, updates: {
|
|
70
|
+
content?: string;
|
|
71
|
+
category?: string;
|
|
72
|
+
tags?: string[];
|
|
73
|
+
embedding?: number[];
|
|
74
|
+
metadata?: Record<string, unknown>;
|
|
75
|
+
}): Promise<void>;
|
|
76
|
+
/**
|
|
77
|
+
* Delete a fact.
|
|
78
|
+
*/
|
|
79
|
+
forget(id: string): Promise<void>;
|
|
80
|
+
private rowToFact;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=ltm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ltm.d.ts","sourceRoot":"","sources":["../src/ltm.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,SAAS;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,6EAA6E;IAC7E,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED;;;;;GAKG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,IAAI,CAAwB;IACpC,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,mBAAmB,CAAS;gBAExB,MAAM,EAAE,SAAS;IAKvB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOrC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAOb,YAAY;IAqC1B;;OAEG;IACG,KAAK,CAAC,IAAI,EAAE;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACpC,GAAG,OAAO,CAAC,MAAM,CAAC;IAyBnB;;OAEG;IACG,MAAM,CACV,cAAc,EAAE,MAAM,EAAE,EACxB,OAAO,GAAE;QACP,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;KACf,GACL,OAAO,CAAC,CAAC,aAAa,GAAG;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,EAAE,CAAC;IA6CtD;;OAEG;IACG,YAAY,CAChB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;QACP,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KACX,GACL,OAAO,CAAC,aAAa,EAAE,CAAC;IAsC3B;;OAEG;IACG,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAYxD;;OAEG;IACG,MAAM,CACV,EAAE,EAAE,MAAM,EACV,OAAO,EAAE;QACP,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACpC,GACA,OAAO,CAAC,IAAI,CAAC;IAwChB;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvC,OAAO,CAAC,SAAS;CAYlB"}
|