@elizaos/plugin-memory 1.0.5 → 2.0.1

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 (36) hide show
  1. package/README.md +339 -207
  2. package/dist/browser/index.browser.js +348 -151
  3. package/dist/browser/index.browser.js.map +23 -13
  4. package/dist/cjs/index.node.cjs +2200 -1047
  5. package/dist/cjs/index.node.js.map +23 -13
  6. package/dist/evaluators/consolidation.d.ts +19 -0
  7. package/dist/evaluators/summarization.d.ts +5 -24
  8. package/dist/index.d.ts +152 -30
  9. package/dist/node/index.node.js +2242 -1084
  10. package/dist/node/index.node.js.map +23 -13
  11. package/dist/prompts/consolidation.d.ts +35 -0
  12. package/dist/prompts/summarization.d.ts +25 -0
  13. package/dist/providers/action-results.d.ts +2 -0
  14. package/dist/providers/long-term-memory.d.ts +18 -11
  15. package/dist/providers/recent-conversation-summary.d.ts +2 -0
  16. package/dist/repositories/conversation-summary.d.ts +33 -0
  17. package/dist/repositories/index.d.ts +17 -0
  18. package/dist/repositories/long-term-memory.d.ts +53 -0
  19. package/dist/schemas/conversation-summaries.d.ts +494 -0
  20. package/dist/schemas/index.d.ts +16 -6
  21. package/dist/schemas/long-term-memories.d.ts +308 -70
  22. package/dist/services/memory-service.d.ts +95 -51
  23. package/dist/types/index.d.ts +299 -55
  24. package/dist/utils/db-mapping.d.ts +20 -0
  25. package/dist/utils/decay-scoring.d.ts +41 -0
  26. package/dist/utils/embedding.d.ts +21 -0
  27. package/dist/utils/formatting.d.ts +17 -0
  28. package/dist/utils/index.d.ts +17 -0
  29. package/dist/utils/search-merging.d.ts +18 -0
  30. package/dist/utils/token-counter.d.ts +53 -0
  31. package/package.json +83 -1
  32. package/dist/actions/remember.d.ts +0 -11
  33. package/dist/evaluators/long-term-extraction.d.ts +0 -8
  34. package/dist/providers/short-term-memory.d.ts +0 -19
  35. package/dist/schemas/memory-access-logs.d.ts +0 -154
  36. package/dist/schemas/session-summaries.d.ts +0 -283
@@ -1,6 +1,17 @@
1
1
  /**
2
- * Long-term memory storage table
3
- * Stores persistent facts about users across all conversations
2
+ * Long-term Memory Storage Table
3
+ *
4
+ * Research: Section 4.1 "The SOTA Memory Schema"
5
+ *
6
+ * This table stores ALL persistent memories (episodic, semantic, procedural) with:
7
+ * - Memory type taxonomy (3-tier cognitive hierarchy)
8
+ * - Decay parameters for exponential forgetting
9
+ * - Confidence and provenance tracking
10
+ * - Contextual embeddings for superior retrieval
11
+ * - Soft delete for contradiction handling
12
+ *
13
+ * Design Decision: Single unified table vs separate tables per type
14
+ * Rationale: Easier to query across types, unified retrieval logic, flexible type reassignment
4
15
  */
5
16
  export declare const longTermMemories: import("drizzle-orm/pg-core").PgTableWithColumns<{
6
17
  name: "long_term_memories";
@@ -63,8 +74,27 @@ export declare const longTermMemories: import("drizzle-orm/pg-core").PgTableWith
63
74
  }, {}, {
64
75
  length: 36;
65
76
  }>;
66
- category: import("drizzle-orm/pg-core").PgColumn<{
67
- name: "category";
77
+ roomId: import("drizzle-orm/pg-core").PgColumn<{
78
+ name: "room_id";
79
+ tableName: "long_term_memories";
80
+ dataType: "string";
81
+ columnType: "PgVarchar";
82
+ data: string;
83
+ driverParam: string;
84
+ notNull: false;
85
+ hasDefault: false;
86
+ isPrimaryKey: false;
87
+ isAutoincrement: false;
88
+ hasRuntimeDefault: false;
89
+ enumValues: [string, ...string[]];
90
+ baseColumn: never;
91
+ identity: undefined;
92
+ generated: undefined;
93
+ }, {}, {
94
+ length: 36;
95
+ }>;
96
+ type: import("drizzle-orm/pg-core").PgColumn<{
97
+ name: "type";
68
98
  tableName: "long_term_memories";
69
99
  dataType: "string";
70
100
  columnType: "PgText";
@@ -97,74 +127,48 @@ export declare const longTermMemories: import("drizzle-orm/pg-core").PgTableWith
97
127
  identity: undefined;
98
128
  generated: undefined;
99
129
  }, {}, {}>;
100
- metadata: import("drizzle-orm/pg-core").PgColumn<{
101
- name: "metadata";
130
+ embeddingContext: import("drizzle-orm/pg-core").PgColumn<{
131
+ name: "embedding_context";
102
132
  tableName: "long_term_memories";
103
- dataType: "json";
104
- columnType: "PgJsonb";
105
- data: unknown;
106
- driverParam: unknown;
107
- notNull: false;
133
+ dataType: "string";
134
+ columnType: "PgText";
135
+ data: string;
136
+ driverParam: string;
137
+ notNull: true;
108
138
  hasDefault: false;
109
139
  isPrimaryKey: false;
110
140
  isAutoincrement: false;
111
141
  hasRuntimeDefault: false;
112
- enumValues: undefined;
142
+ enumValues: [string, ...string[]];
113
143
  baseColumn: never;
114
144
  identity: undefined;
115
145
  generated: undefined;
116
146
  }, {}, {}>;
117
- embedding: import("drizzle-orm/pg-core").PgColumn<{
118
- name: "embedding";
147
+ confidence: import("drizzle-orm/pg-core").PgColumn<{
148
+ name: "confidence";
119
149
  tableName: "long_term_memories";
120
- dataType: "array";
121
- columnType: "PgArray";
122
- data: number[];
123
- driverParam: string | (string | number)[];
124
- notNull: false;
125
- hasDefault: false;
150
+ dataType: "number";
151
+ columnType: "PgReal";
152
+ data: number;
153
+ driverParam: string | number;
154
+ notNull: true;
155
+ hasDefault: true;
126
156
  isPrimaryKey: false;
127
157
  isAutoincrement: false;
128
158
  hasRuntimeDefault: false;
129
159
  enumValues: undefined;
130
- baseColumn: import("drizzle-orm").Column<{
131
- name: "embedding";
132
- tableName: "long_term_memories";
133
- dataType: "number";
134
- columnType: "PgReal";
135
- data: number;
136
- driverParam: string | number;
137
- notNull: false;
138
- hasDefault: false;
139
- isPrimaryKey: false;
140
- isAutoincrement: false;
141
- hasRuntimeDefault: false;
142
- enumValues: undefined;
143
- baseColumn: never;
144
- identity: undefined;
145
- generated: undefined;
146
- }, {}, {}>;
160
+ baseColumn: never;
147
161
  identity: undefined;
148
162
  generated: undefined;
149
- }, {}, {
150
- baseBuilder: import("drizzle-orm/pg-core").PgColumnBuilder<{
151
- name: "embedding";
152
- dataType: "number";
153
- columnType: "PgReal";
154
- data: number;
155
- driverParam: string | number;
156
- enumValues: undefined;
157
- }, {}, {}, import("drizzle-orm").ColumnBuilderExtraConfig>;
158
- size: undefined;
159
- }>;
160
- confidence: import("drizzle-orm/pg-core").PgColumn<{
161
- name: "confidence";
163
+ }, {}, {}>;
164
+ decayRate: import("drizzle-orm/pg-core").PgColumn<{
165
+ name: "decay_rate";
162
166
  tableName: "long_term_memories";
163
167
  dataType: "number";
164
168
  columnType: "PgReal";
165
169
  data: number;
166
170
  driverParam: string | number;
167
- notNull: false;
171
+ notNull: true;
168
172
  hasDefault: true;
169
173
  isPrimaryKey: false;
170
174
  isAutoincrement: false;
@@ -174,15 +178,15 @@ export declare const longTermMemories: import("drizzle-orm/pg-core").PgTableWith
174
178
  identity: undefined;
175
179
  generated: undefined;
176
180
  }, {}, {}>;
177
- source: import("drizzle-orm/pg-core").PgColumn<{
178
- name: "source";
181
+ decayFunction: import("drizzle-orm/pg-core").PgColumn<{
182
+ name: "decay_function";
179
183
  tableName: "long_term_memories";
180
184
  dataType: "string";
181
185
  columnType: "PgText";
182
186
  data: string;
183
187
  driverParam: string;
184
- notNull: false;
185
- hasDefault: false;
188
+ notNull: true;
189
+ hasDefault: true;
186
190
  isPrimaryKey: false;
187
191
  isAutoincrement: false;
188
192
  hasRuntimeDefault: false;
@@ -208,13 +212,30 @@ export declare const longTermMemories: import("drizzle-orm/pg-core").PgTableWith
208
212
  identity: undefined;
209
213
  generated: undefined;
210
214
  }, {}, {}>;
211
- updatedAt: import("drizzle-orm/pg-core").PgColumn<{
212
- name: "updated_at";
215
+ lastAccessedAt: import("drizzle-orm/pg-core").PgColumn<{
216
+ name: "last_accessed_at";
213
217
  tableName: "long_term_memories";
214
218
  dataType: "date";
215
219
  columnType: "PgTimestamp";
216
220
  data: Date;
217
221
  driverParam: string;
222
+ notNull: false;
223
+ hasDefault: false;
224
+ isPrimaryKey: false;
225
+ isAutoincrement: false;
226
+ hasRuntimeDefault: false;
227
+ enumValues: undefined;
228
+ baseColumn: never;
229
+ identity: undefined;
230
+ generated: undefined;
231
+ }, {}, {}>;
232
+ accessCount: import("drizzle-orm/pg-core").PgColumn<{
233
+ name: "access_count";
234
+ tableName: "long_term_memories";
235
+ dataType: "number";
236
+ columnType: "PgInteger";
237
+ data: number;
238
+ driverParam: string | number;
218
239
  notNull: true;
219
240
  hasDefault: true;
220
241
  isPrimaryKey: false;
@@ -225,12 +246,132 @@ export declare const longTermMemories: import("drizzle-orm/pg-core").PgTableWith
225
246
  identity: undefined;
226
247
  generated: undefined;
227
248
  }, {}, {}>;
228
- lastAccessedAt: import("drizzle-orm/pg-core").PgColumn<{
229
- name: "last_accessed_at";
249
+ isActive: import("drizzle-orm/pg-core").PgColumn<{
250
+ name: "is_active";
230
251
  tableName: "long_term_memories";
231
- dataType: "date";
232
- columnType: "PgTimestamp";
233
- data: Date;
252
+ dataType: "boolean";
253
+ columnType: "PgBoolean";
254
+ data: boolean;
255
+ driverParam: boolean;
256
+ notNull: true;
257
+ hasDefault: true;
258
+ isPrimaryKey: false;
259
+ isAutoincrement: false;
260
+ hasRuntimeDefault: false;
261
+ enumValues: undefined;
262
+ baseColumn: never;
263
+ identity: undefined;
264
+ generated: undefined;
265
+ }, {}, {}>;
266
+ source: import("drizzle-orm/pg-core").PgColumn<{
267
+ name: "source";
268
+ tableName: "long_term_memories";
269
+ dataType: "json";
270
+ columnType: "PgJsonb";
271
+ data: unknown;
272
+ driverParam: unknown;
273
+ notNull: true;
274
+ hasDefault: true;
275
+ isPrimaryKey: false;
276
+ isAutoincrement: false;
277
+ hasRuntimeDefault: false;
278
+ enumValues: undefined;
279
+ baseColumn: never;
280
+ identity: undefined;
281
+ generated: undefined;
282
+ }, {}, {}>;
283
+ metadata: import("drizzle-orm/pg-core").PgColumn<{
284
+ name: "metadata";
285
+ tableName: "long_term_memories";
286
+ dataType: "json";
287
+ columnType: "PgJsonb";
288
+ data: unknown;
289
+ driverParam: unknown;
290
+ notNull: true;
291
+ hasDefault: true;
292
+ isPrimaryKey: false;
293
+ isAutoincrement: false;
294
+ hasRuntimeDefault: false;
295
+ enumValues: undefined;
296
+ baseColumn: never;
297
+ identity: undefined;
298
+ generated: undefined;
299
+ }, {}, {}>;
300
+ supersedesId: import("drizzle-orm/pg-core").PgColumn<{
301
+ name: "supersedes_id";
302
+ tableName: "long_term_memories";
303
+ dataType: "string";
304
+ columnType: "PgVarchar";
305
+ data: string;
306
+ driverParam: string;
307
+ notNull: false;
308
+ hasDefault: false;
309
+ isPrimaryKey: false;
310
+ isAutoincrement: false;
311
+ hasRuntimeDefault: false;
312
+ enumValues: [string, ...string[]];
313
+ baseColumn: never;
314
+ identity: undefined;
315
+ generated: undefined;
316
+ }, {}, {
317
+ length: 36;
318
+ }>;
319
+ };
320
+ dialect: "pg";
321
+ }>;
322
+ /**
323
+ * Long-term Memory Embeddings Table
324
+ * Stores vector embeddings for semantic search with dynamic dimension support
325
+ * Research: Section 3 "RAG Strategy"
326
+ */
327
+ export declare const longTermMemoryEmbeddings: import("drizzle-orm/pg-core").PgTableWithColumns<{
328
+ name: "long_term_memory_embeddings";
329
+ schema: undefined;
330
+ columns: {
331
+ id: import("drizzle-orm/pg-core").PgColumn<{
332
+ name: "id";
333
+ tableName: "long_term_memory_embeddings";
334
+ dataType: "string";
335
+ columnType: "PgVarchar";
336
+ data: string;
337
+ driverParam: string;
338
+ notNull: true;
339
+ hasDefault: false;
340
+ isPrimaryKey: true;
341
+ isAutoincrement: false;
342
+ hasRuntimeDefault: false;
343
+ enumValues: [string, ...string[]];
344
+ baseColumn: never;
345
+ identity: undefined;
346
+ generated: undefined;
347
+ }, {}, {
348
+ length: 36;
349
+ }>;
350
+ memoryId: import("drizzle-orm/pg-core").PgColumn<{
351
+ name: "memory_id";
352
+ tableName: "long_term_memory_embeddings";
353
+ dataType: "string";
354
+ columnType: "PgVarchar";
355
+ data: string;
356
+ driverParam: string;
357
+ notNull: true;
358
+ hasDefault: false;
359
+ isPrimaryKey: false;
360
+ isAutoincrement: false;
361
+ hasRuntimeDefault: false;
362
+ enumValues: [string, ...string[]];
363
+ baseColumn: never;
364
+ identity: undefined;
365
+ generated: undefined;
366
+ }, {}, {
367
+ length: 36;
368
+ }>;
369
+ dim384: import("drizzle-orm/pg-core").PgColumn<{
370
+ name: "dim_384";
371
+ tableName: "long_term_memory_embeddings";
372
+ dataType: "array";
373
+ columnType: "PgVector";
374
+ data: number[];
234
375
  driverParam: string;
235
376
  notNull: false;
236
377
  hasDefault: false;
@@ -241,15 +382,112 @@ export declare const longTermMemories: import("drizzle-orm/pg-core").PgTableWith
241
382
  baseColumn: never;
242
383
  identity: undefined;
243
384
  generated: undefined;
244
- }, {}, {}>;
245
- accessCount: import("drizzle-orm/pg-core").PgColumn<{
246
- name: "access_count";
247
- tableName: "long_term_memories";
248
- dataType: "number";
249
- columnType: "PgInteger";
250
- data: number;
251
- driverParam: string | number;
385
+ }, {}, {
386
+ dimensions: 384;
387
+ }>;
388
+ dim512: import("drizzle-orm/pg-core").PgColumn<{
389
+ name: "dim_512";
390
+ tableName: "long_term_memory_embeddings";
391
+ dataType: "array";
392
+ columnType: "PgVector";
393
+ data: number[];
394
+ driverParam: string;
252
395
  notNull: false;
396
+ hasDefault: false;
397
+ isPrimaryKey: false;
398
+ isAutoincrement: false;
399
+ hasRuntimeDefault: false;
400
+ enumValues: undefined;
401
+ baseColumn: never;
402
+ identity: undefined;
403
+ generated: undefined;
404
+ }, {}, {
405
+ dimensions: 512;
406
+ }>;
407
+ dim768: import("drizzle-orm/pg-core").PgColumn<{
408
+ name: "dim_768";
409
+ tableName: "long_term_memory_embeddings";
410
+ dataType: "array";
411
+ columnType: "PgVector";
412
+ data: number[];
413
+ driverParam: string;
414
+ notNull: false;
415
+ hasDefault: false;
416
+ isPrimaryKey: false;
417
+ isAutoincrement: false;
418
+ hasRuntimeDefault: false;
419
+ enumValues: undefined;
420
+ baseColumn: never;
421
+ identity: undefined;
422
+ generated: undefined;
423
+ }, {}, {
424
+ dimensions: 768;
425
+ }>;
426
+ dim1024: import("drizzle-orm/pg-core").PgColumn<{
427
+ name: "dim_1024";
428
+ tableName: "long_term_memory_embeddings";
429
+ dataType: "array";
430
+ columnType: "PgVector";
431
+ data: number[];
432
+ driverParam: string;
433
+ notNull: false;
434
+ hasDefault: false;
435
+ isPrimaryKey: false;
436
+ isAutoincrement: false;
437
+ hasRuntimeDefault: false;
438
+ enumValues: undefined;
439
+ baseColumn: never;
440
+ identity: undefined;
441
+ generated: undefined;
442
+ }, {}, {
443
+ dimensions: 1024;
444
+ }>;
445
+ dim1536: import("drizzle-orm/pg-core").PgColumn<{
446
+ name: "dim_1536";
447
+ tableName: "long_term_memory_embeddings";
448
+ dataType: "array";
449
+ columnType: "PgVector";
450
+ data: number[];
451
+ driverParam: string;
452
+ notNull: false;
453
+ hasDefault: false;
454
+ isPrimaryKey: false;
455
+ isAutoincrement: false;
456
+ hasRuntimeDefault: false;
457
+ enumValues: undefined;
458
+ baseColumn: never;
459
+ identity: undefined;
460
+ generated: undefined;
461
+ }, {}, {
462
+ dimensions: 1536;
463
+ }>;
464
+ dim3072: import("drizzle-orm/pg-core").PgColumn<{
465
+ name: "dim_3072";
466
+ tableName: "long_term_memory_embeddings";
467
+ dataType: "array";
468
+ columnType: "PgVector";
469
+ data: number[];
470
+ driverParam: string;
471
+ notNull: false;
472
+ hasDefault: false;
473
+ isPrimaryKey: false;
474
+ isAutoincrement: false;
475
+ hasRuntimeDefault: false;
476
+ enumValues: undefined;
477
+ baseColumn: never;
478
+ identity: undefined;
479
+ generated: undefined;
480
+ }, {}, {
481
+ dimensions: 3072;
482
+ }>;
483
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
484
+ name: "created_at";
485
+ tableName: "long_term_memory_embeddings";
486
+ dataType: "date";
487
+ columnType: "PgTimestamp";
488
+ data: Date;
489
+ driverParam: string;
490
+ notNull: true;
253
491
  hasDefault: true;
254
492
  isPrimaryKey: false;
255
493
  isAutoincrement: false;
@@ -1,102 +1,146 @@
1
1
  import { type IAgentRuntime, Service, type UUID, type ServiceTypeName } from '@elizaos/core';
2
- import { type LongTermMemory, type SessionSummary, type MemoryConfig, LongTermMemoryCategory } from '../types/index';
2
+ import type { Metadata } from '@elizaos/core';
3
+ import { type LongTermMemory, type LongTermMemoryConfig, type LongTermMemorySearchParams, type LongTermMemoryRetrievalResult, type ConversationSummary, MemoryType } from '../types/index';
3
4
  /**
4
- * Memory Service
5
- * Manages both short-term (session summaries) and long-term (persistent facts) memory
5
+ * Long-Term Memory Service - State-of-the-Art Cognitive Memory System
6
+ *
7
+ * Research: Based on comprehensive analysis in refactor.md
8
+ *
9
+ * This service implements:
10
+ * 1. Three-tier long-term memory taxonomy (Episodic, Semantic, Procedural)
11
+ * 2. Memory consolidation pipeline (transient filtering)
12
+ * 3. Hybrid retrieval (Vector + BM25 + Graph)
13
+ * 4. Exponential decay for long-term memory forgetting
14
+ * 5. Contextual embeddings for superior retrieval
15
+ * 6. Contradiction detection and resolution
16
+ *
17
+ * Architecture Philosophy:
18
+ * - Async consolidation: Don't block the conversation loop
19
+ * - Decay-weighted scoring: Recent and frequently accessed long-term memories score higher
20
+ * - Graph-guided retrieval: Use relations for context
21
+ * - Confidence-based filtering: Only store high-quality extractions
6
22
  */
7
23
  export declare class MemoryService extends Service {
8
24
  static serviceType: ServiceTypeName;
9
- private sessionMessageCounts;
10
- private memoryConfig;
11
- private lastExtractionCheckpoints;
25
+ config: LongTermMemoryConfig & Metadata;
26
+ private bm25Index;
27
+ private embeddingDimension?;
28
+ private isInitialized;
29
+ private longTermMemoryRepo;
30
+ private conversationSummaryRepo;
12
31
  capabilityDescription: string;
32
+ /**
33
+ * Default configuration based on research recommendations
34
+ * Research: Section 6 "Implementation Strategy"
35
+ */
36
+ private static defaultConfig;
13
37
  constructor(runtime?: IAgentRuntime);
14
38
  static start(runtime: IAgentRuntime): Promise<Service>;
15
39
  stop(): Promise<void>;
16
40
  initialize(runtime: IAgentRuntime): Promise<void>;
17
41
  /**
18
- * Get the Drizzle database instance
42
+ * Load configuration from runtime settings
19
43
  */
20
- private getDb;
44
+ private loadConfiguration;
21
45
  /**
22
- * Get configuration
46
+ * Ensure embedding dimension is set dynamically based on the model
23
47
  */
24
- getConfig(): MemoryConfig;
48
+ private ensureEmbeddingDimension;
25
49
  /**
26
- * Update configuration
50
+ * Get current configuration
27
51
  */
28
- updateConfig(updates: Partial<MemoryConfig>): void;
52
+ getConfig(): LongTermMemoryConfig;
29
53
  /**
30
- * Track message count for a room
54
+ * Update configuration
31
55
  */
32
- incrementMessageCount(roomId: UUID): number;
56
+ updateConfig(updates: Partial<LongTermMemoryConfig>): void;
33
57
  /**
34
- * Reset message count for a room
58
+ * Store a new long-term memory
59
+ *
60
+ * Research: Section 3.2.1 "Contextual Embeddings"
35
61
  */
36
- resetMessageCount(roomId: UUID): void;
62
+ storeLongTermMemory(memory: Omit<LongTermMemory, 'id' | 'createdAt' | 'lastAccessedAt' | 'accessCount' | 'isActive' | 'embedding'>): Promise<LongTermMemory>;
37
63
  /**
38
- * Check if summarization is needed for a room
64
+ * Retrieve long-term memory by ID
39
65
  */
40
- shouldSummarize(roomId: UUID): Promise<boolean>;
66
+ getLongTermMemory(id: UUID): Promise<LongTermMemory | null>;
41
67
  /**
42
- * Generate cache key for tracking extraction checkpoints per entity-room pair
68
+ * Update an existing long-term memory
69
+ *
70
+ * Research: Section 4.3.2 "Resolution Strategies"
43
71
  */
44
- private getExtractionKey;
72
+ updateLongTermMemory(id: UUID, updates: Partial<Omit<LongTermMemory, 'id' | 'agentId' | 'createdAt'>>): Promise<void>;
45
73
  /**
46
- * Get the last extraction checkpoint for an entity in a room
47
- * Uses the cache table via adapter
74
+ * Delete a long-term memory (hard delete)
48
75
  */
49
- getLastExtractionCheckpoint(entityId: UUID, roomId: UUID): Promise<number>;
76
+ deleteLongTermMemory(id: UUID): Promise<void>;
50
77
  /**
51
- * Set the last extraction checkpoint for an entity in a room
52
- * Uses the cache table via adapter
78
+ * Get all long-term memories for an entity (with basic filtering)
53
79
  */
54
- setLastExtractionCheckpoint(entityId: UUID, roomId: UUID, messageCount: number): Promise<void>;
80
+ getLongTermMemories(entityId: UUID, type?: MemoryType, limit?: number, includeInactive?: boolean): Promise<LongTermMemory[]>;
55
81
  /**
56
- * Check if long-term extraction should run based on message count and interval
82
+ * Handle contradictory long-term memory
83
+ *
84
+ * Research: Section 4.3 "Handling Contradictions"
57
85
  */
58
- shouldRunExtraction(entityId: UUID, roomId: UUID, currentMessageCount: number): Promise<boolean>;
86
+ handleContradiction(entityId: UUID, newMemory: Omit<LongTermMemory, 'id' | 'createdAt' | 'lastAccessedAt' | 'accessCount' | 'isActive' | 'embedding'>): Promise<void>;
59
87
  /**
60
- * Store a long-term memory
88
+ * Detect if new memory contradicts any existing memory
89
+ *
90
+ * Research: Section 4.3.1 "Detection Logic"
61
91
  */
62
- storeLongTermMemory(memory: Omit<LongTermMemory, 'id' | 'createdAt' | 'updatedAt'>): Promise<LongTermMemory>;
92
+ detectContradiction(newMemory: Omit<LongTermMemory, 'id' | 'createdAt' | 'lastAccessedAt' | 'accessCount' | 'isActive' | 'embedding'>, existingMemories: LongTermMemoryRetrievalResult[]): Promise<LongTermMemory | null>;
63
93
  /**
64
- * Retrieve long-term memories for an entity
94
+ * Search long-term memories with hybrid retrieval
95
+ *
96
+ * Research: Section 3 "Retrieval Augmented Generation Strategy"
65
97
  */
66
- getLongTermMemories(entityId: UUID, category?: LongTermMemoryCategory, limit?: number): Promise<LongTermMemory[]>;
98
+ searchLongTermMemories(params: LongTermMemorySearchParams): Promise<LongTermMemoryRetrievalResult[]>;
67
99
  /**
68
- * Update a long-term memory
69
- * Enforces multi-tenancy by verifying agentId and entityId
100
+ * Vector search implementation
70
101
  */
71
- updateLongTermMemory(id: UUID, entityId: UUID, updates: Partial<Omit<LongTermMemory, 'id' | 'agentId' | 'entityId' | 'createdAt'>>): Promise<void>;
102
+ private vectorSearch;
72
103
  /**
73
- * Delete a long-term memory
74
- * Enforces multi-tenancy by verifying agentId and entityId
104
+ * BM25 search implementation
75
105
  */
76
- deleteLongTermMemory(id: UUID, entityId: UUID): Promise<void>;
106
+ private bm25Search;
77
107
  /**
78
- * Get the current session summary for a room (latest one)
108
+ * Rebuild BM25 index from database
79
109
  */
80
- getCurrentSessionSummary(roomId: UUID): Promise<SessionSummary | null>;
110
+ private rebuildBM25Index;
81
111
  /**
82
- * Store a session summary (initial creation)
112
+ * Get formatted memories for context injection
113
+ *
114
+ * Research: Section 5.1.3 "Tier 3: Just-In-Time Injection"
83
115
  */
84
- storeSessionSummary(summary: Omit<SessionSummary, 'id' | 'createdAt' | 'updatedAt'>): Promise<SessionSummary>;
116
+ getFormattedLongTermMemoriesForContext(entityId: UUID, query: string, roomId?: UUID): Promise<string>;
85
117
  /**
86
- * Update an existing session summary
87
- * Enforces multi-tenancy by verifying agentId
118
+ * Store a conversation summary
119
+ *
120
+ * Research: Section 5.1.2 "Hierarchical Conversation Summarization"
88
121
  */
89
- updateSessionSummary(id: UUID, roomId: UUID, updates: Partial<Omit<SessionSummary, 'id' | 'agentId' | 'roomId' | 'createdAt' | 'updatedAt'>>): Promise<void>;
122
+ storeSummary(summary: Omit<ConversationSummary, 'id' | 'createdAt' | 'lastAccessedAt' | 'accessCount'>): Promise<ConversationSummary>;
90
123
  /**
91
- * Get session summaries for a room
124
+ * Get summaries at a specific level for a room
92
125
  */
93
- getSessionSummaries(roomId: UUID, limit?: number): Promise<SessionSummary[]>;
126
+ getSummariesByLevel(roomId: UUID, level: number): Promise<ConversationSummary[]>;
94
127
  /**
95
- * Search long-term memories by semantic similarity (if embeddings are available)
128
+ * Search summaries by semantic similarity
129
+ *
130
+ * Research: Section 5.1.2 "Tier 2: The Conversation Summary"
96
131
  */
97
- searchLongTermMemories(entityId: UUID, queryEmbedding: number[], limit?: number, matchThreshold?: number): Promise<LongTermMemory[]>;
132
+ searchSummaries(params: {
133
+ entityId: UUID;
134
+ roomId: UUID;
135
+ query: string;
136
+ limit?: number;
137
+ tokenBudget?: number;
138
+ }): Promise<ConversationSummary[]>;
98
139
  /**
99
- * Get all long-term memories formatted for context
140
+ * Get the most recent Level 1 summary for a room and entity
141
+ * Used to determine which messages have already been summarized
142
+ *
143
+ * @returns The most recent Level 1 summary, or null if none exist
100
144
  */
101
- getFormattedLongTermMemories(entityId: UUID): Promise<string>;
145
+ getMostRecentLevel1Summary(roomId: UUID, entityId: UUID): Promise<ConversationSummary | null>;
102
146
  }