@elizaos/plugin-memory 1.1.0 → 1.1.2

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 +230 -330
  2. package/dist/actions/remember.d.ts +11 -0
  3. package/dist/browser/index.browser.js +205 -348
  4. package/dist/browser/index.browser.js.map +13 -23
  5. package/dist/cjs/index.node.cjs +936 -2193
  6. package/dist/cjs/index.node.js.map +13 -23
  7. package/dist/evaluators/long-term-extraction.d.ts +8 -0
  8. package/dist/evaluators/summarization.d.ts +25 -6
  9. package/dist/index.d.ts +32 -152
  10. package/dist/node/index.node.js +944 -2210
  11. package/dist/node/index.node.js.map +13 -23
  12. package/dist/providers/context-summary.d.ts +12 -0
  13. package/dist/providers/long-term-memory.d.ts +11 -18
  14. package/dist/schemas/index.d.ts +6 -16
  15. package/dist/schemas/long-term-memories.d.ts +70 -308
  16. package/dist/schemas/memory-access-logs.d.ts +154 -0
  17. package/dist/schemas/session-summaries.d.ts +283 -0
  18. package/dist/services/memory-service.d.ts +51 -95
  19. package/dist/types/index.d.ts +53 -298
  20. package/package.json +2 -84
  21. package/dist/evaluators/consolidation.d.ts +0 -19
  22. package/dist/prompts/consolidation.d.ts +0 -35
  23. package/dist/prompts/summarization.d.ts +0 -25
  24. package/dist/providers/action-results.d.ts +0 -2
  25. package/dist/providers/recent-conversation-summary.d.ts +0 -2
  26. package/dist/repositories/conversation-summary.d.ts +0 -33
  27. package/dist/repositories/index.d.ts +0 -17
  28. package/dist/repositories/long-term-memory.d.ts +0 -53
  29. package/dist/schemas/conversation-summaries.d.ts +0 -494
  30. package/dist/utils/db-mapping.d.ts +0 -20
  31. package/dist/utils/decay-scoring.d.ts +0 -41
  32. package/dist/utils/embedding.d.ts +0 -21
  33. package/dist/utils/formatting.d.ts +0 -17
  34. package/dist/utils/index.d.ts +0 -17
  35. package/dist/utils/search-merging.d.ts +0 -18
  36. package/dist/utils/token-counter.d.ts +0 -53
@@ -0,0 +1,283 @@
1
+ /**
2
+ * Session summaries table
3
+ * Stores condensed summaries of conversation sessions
4
+ */
5
+ export declare const sessionSummaries: import("drizzle-orm/pg-core").PgTableWithColumns<{
6
+ name: "session_summaries";
7
+ schema: undefined;
8
+ columns: {
9
+ id: import("drizzle-orm/pg-core").PgColumn<{
10
+ name: "id";
11
+ tableName: "session_summaries";
12
+ dataType: "string";
13
+ columnType: "PgVarchar";
14
+ data: string;
15
+ driverParam: string;
16
+ notNull: true;
17
+ hasDefault: false;
18
+ isPrimaryKey: true;
19
+ isAutoincrement: false;
20
+ hasRuntimeDefault: false;
21
+ enumValues: [string, ...string[]];
22
+ baseColumn: never;
23
+ identity: undefined;
24
+ generated: undefined;
25
+ }, {}, {
26
+ length: 36;
27
+ }>;
28
+ agentId: import("drizzle-orm/pg-core").PgColumn<{
29
+ name: "agent_id";
30
+ tableName: "session_summaries";
31
+ dataType: "string";
32
+ columnType: "PgVarchar";
33
+ data: string;
34
+ driverParam: string;
35
+ notNull: true;
36
+ hasDefault: false;
37
+ isPrimaryKey: false;
38
+ isAutoincrement: false;
39
+ hasRuntimeDefault: false;
40
+ enumValues: [string, ...string[]];
41
+ baseColumn: never;
42
+ identity: undefined;
43
+ generated: undefined;
44
+ }, {}, {
45
+ length: 36;
46
+ }>;
47
+ roomId: import("drizzle-orm/pg-core").PgColumn<{
48
+ name: "room_id";
49
+ tableName: "session_summaries";
50
+ dataType: "string";
51
+ columnType: "PgVarchar";
52
+ data: string;
53
+ driverParam: string;
54
+ notNull: true;
55
+ hasDefault: false;
56
+ isPrimaryKey: false;
57
+ isAutoincrement: false;
58
+ hasRuntimeDefault: false;
59
+ enumValues: [string, ...string[]];
60
+ baseColumn: never;
61
+ identity: undefined;
62
+ generated: undefined;
63
+ }, {}, {
64
+ length: 36;
65
+ }>;
66
+ entityId: import("drizzle-orm/pg-core").PgColumn<{
67
+ name: "entity_id";
68
+ tableName: "session_summaries";
69
+ dataType: "string";
70
+ columnType: "PgVarchar";
71
+ data: string;
72
+ driverParam: string;
73
+ notNull: false;
74
+ hasDefault: false;
75
+ isPrimaryKey: false;
76
+ isAutoincrement: false;
77
+ hasRuntimeDefault: false;
78
+ enumValues: [string, ...string[]];
79
+ baseColumn: never;
80
+ identity: undefined;
81
+ generated: undefined;
82
+ }, {}, {
83
+ length: 36;
84
+ }>;
85
+ summary: import("drizzle-orm/pg-core").PgColumn<{
86
+ name: "summary";
87
+ tableName: "session_summaries";
88
+ dataType: "string";
89
+ columnType: "PgText";
90
+ data: string;
91
+ driverParam: string;
92
+ notNull: true;
93
+ hasDefault: false;
94
+ isPrimaryKey: false;
95
+ isAutoincrement: false;
96
+ hasRuntimeDefault: false;
97
+ enumValues: [string, ...string[]];
98
+ baseColumn: never;
99
+ identity: undefined;
100
+ generated: undefined;
101
+ }, {}, {}>;
102
+ messageCount: import("drizzle-orm/pg-core").PgColumn<{
103
+ name: "message_count";
104
+ tableName: "session_summaries";
105
+ dataType: "number";
106
+ columnType: "PgInteger";
107
+ data: number;
108
+ driverParam: string | number;
109
+ notNull: true;
110
+ hasDefault: false;
111
+ isPrimaryKey: false;
112
+ isAutoincrement: false;
113
+ hasRuntimeDefault: false;
114
+ enumValues: undefined;
115
+ baseColumn: never;
116
+ identity: undefined;
117
+ generated: undefined;
118
+ }, {}, {}>;
119
+ lastMessageOffset: import("drizzle-orm/pg-core").PgColumn<{
120
+ name: "last_message_offset";
121
+ tableName: "session_summaries";
122
+ dataType: "number";
123
+ columnType: "PgInteger";
124
+ data: number;
125
+ driverParam: string | number;
126
+ notNull: true;
127
+ hasDefault: true;
128
+ isPrimaryKey: false;
129
+ isAutoincrement: false;
130
+ hasRuntimeDefault: false;
131
+ enumValues: undefined;
132
+ baseColumn: never;
133
+ identity: undefined;
134
+ generated: undefined;
135
+ }, {}, {}>;
136
+ startTime: import("drizzle-orm/pg-core").PgColumn<{
137
+ name: "start_time";
138
+ tableName: "session_summaries";
139
+ dataType: "date";
140
+ columnType: "PgTimestamp";
141
+ data: Date;
142
+ driverParam: string;
143
+ notNull: true;
144
+ hasDefault: false;
145
+ isPrimaryKey: false;
146
+ isAutoincrement: false;
147
+ hasRuntimeDefault: false;
148
+ enumValues: undefined;
149
+ baseColumn: never;
150
+ identity: undefined;
151
+ generated: undefined;
152
+ }, {}, {}>;
153
+ endTime: import("drizzle-orm/pg-core").PgColumn<{
154
+ name: "end_time";
155
+ tableName: "session_summaries";
156
+ dataType: "date";
157
+ columnType: "PgTimestamp";
158
+ data: Date;
159
+ driverParam: string;
160
+ notNull: true;
161
+ hasDefault: false;
162
+ isPrimaryKey: false;
163
+ isAutoincrement: false;
164
+ hasRuntimeDefault: false;
165
+ enumValues: undefined;
166
+ baseColumn: never;
167
+ identity: undefined;
168
+ generated: undefined;
169
+ }, {}, {}>;
170
+ topics: import("drizzle-orm/pg-core").PgColumn<{
171
+ name: "topics";
172
+ tableName: "session_summaries";
173
+ dataType: "json";
174
+ columnType: "PgJsonb";
175
+ data: unknown;
176
+ driverParam: unknown;
177
+ notNull: false;
178
+ hasDefault: false;
179
+ isPrimaryKey: false;
180
+ isAutoincrement: false;
181
+ hasRuntimeDefault: false;
182
+ enumValues: undefined;
183
+ baseColumn: never;
184
+ identity: undefined;
185
+ generated: undefined;
186
+ }, {}, {}>;
187
+ metadata: import("drizzle-orm/pg-core").PgColumn<{
188
+ name: "metadata";
189
+ tableName: "session_summaries";
190
+ dataType: "json";
191
+ columnType: "PgJsonb";
192
+ data: unknown;
193
+ driverParam: unknown;
194
+ notNull: false;
195
+ hasDefault: false;
196
+ isPrimaryKey: false;
197
+ isAutoincrement: false;
198
+ hasRuntimeDefault: false;
199
+ enumValues: undefined;
200
+ baseColumn: never;
201
+ identity: undefined;
202
+ generated: undefined;
203
+ }, {}, {}>;
204
+ embedding: import("drizzle-orm/pg-core").PgColumn<{
205
+ name: "embedding";
206
+ tableName: "session_summaries";
207
+ dataType: "array";
208
+ columnType: "PgArray";
209
+ data: number[];
210
+ driverParam: string | (string | number)[];
211
+ notNull: false;
212
+ hasDefault: false;
213
+ isPrimaryKey: false;
214
+ isAutoincrement: false;
215
+ hasRuntimeDefault: false;
216
+ enumValues: undefined;
217
+ baseColumn: import("drizzle-orm").Column<{
218
+ name: "embedding";
219
+ tableName: "session_summaries";
220
+ dataType: "number";
221
+ columnType: "PgReal";
222
+ data: number;
223
+ driverParam: string | number;
224
+ notNull: false;
225
+ hasDefault: false;
226
+ isPrimaryKey: false;
227
+ isAutoincrement: false;
228
+ hasRuntimeDefault: false;
229
+ enumValues: undefined;
230
+ baseColumn: never;
231
+ identity: undefined;
232
+ generated: undefined;
233
+ }, {}, {}>;
234
+ identity: undefined;
235
+ generated: undefined;
236
+ }, {}, {
237
+ baseBuilder: import("drizzle-orm/pg-core").PgColumnBuilder<{
238
+ name: "embedding";
239
+ dataType: "number";
240
+ columnType: "PgReal";
241
+ data: number;
242
+ driverParam: string | number;
243
+ enumValues: undefined;
244
+ }, {}, {}, import("drizzle-orm").ColumnBuilderExtraConfig>;
245
+ size: undefined;
246
+ }>;
247
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
248
+ name: "created_at";
249
+ tableName: "session_summaries";
250
+ dataType: "date";
251
+ columnType: "PgTimestamp";
252
+ data: Date;
253
+ driverParam: string;
254
+ notNull: true;
255
+ hasDefault: true;
256
+ isPrimaryKey: false;
257
+ isAutoincrement: false;
258
+ hasRuntimeDefault: false;
259
+ enumValues: undefined;
260
+ baseColumn: never;
261
+ identity: undefined;
262
+ generated: undefined;
263
+ }, {}, {}>;
264
+ updatedAt: import("drizzle-orm/pg-core").PgColumn<{
265
+ name: "updated_at";
266
+ tableName: "session_summaries";
267
+ dataType: "date";
268
+ columnType: "PgTimestamp";
269
+ data: Date;
270
+ driverParam: string;
271
+ notNull: true;
272
+ hasDefault: true;
273
+ isPrimaryKey: false;
274
+ isAutoincrement: false;
275
+ hasRuntimeDefault: false;
276
+ enumValues: undefined;
277
+ baseColumn: never;
278
+ identity: undefined;
279
+ generated: undefined;
280
+ }, {}, {}>;
281
+ };
282
+ dialect: "pg";
283
+ }>;
@@ -1,146 +1,102 @@
1
1
  import { type IAgentRuntime, Service, type UUID, type ServiceTypeName } from '@elizaos/core';
2
- import type { Metadata } from '@elizaos/core';
3
- import { type LongTermMemory, type LongTermMemoryConfig, type LongTermMemorySearchParams, type LongTermMemoryRetrievalResult, type ConversationSummary, MemoryType } from '../types/index';
2
+ import { type LongTermMemory, type SessionSummary, type MemoryConfig, LongTermMemoryCategory } from '../types/index';
4
3
  /**
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
4
+ * Memory Service
5
+ * Manages both short-term (session summaries) and long-term (persistent facts) memory
22
6
  */
23
7
  export declare class MemoryService extends Service {
24
8
  static serviceType: ServiceTypeName;
25
- config: LongTermMemoryConfig & Metadata;
26
- private bm25Index;
27
- private embeddingDimension?;
28
- private isInitialized;
29
- private longTermMemoryRepo;
30
- private conversationSummaryRepo;
9
+ private sessionMessageCounts;
10
+ private memoryConfig;
11
+ private lastExtractionCheckpoints;
31
12
  capabilityDescription: string;
32
- /**
33
- * Default configuration based on research recommendations
34
- * Research: Section 6 "Implementation Strategy"
35
- */
36
- private static defaultConfig;
37
13
  constructor(runtime?: IAgentRuntime);
38
14
  static start(runtime: IAgentRuntime): Promise<Service>;
39
15
  stop(): Promise<void>;
40
16
  initialize(runtime: IAgentRuntime): Promise<void>;
41
17
  /**
42
- * Load configuration from runtime settings
18
+ * Get the Drizzle database instance
43
19
  */
44
- private loadConfiguration;
20
+ private getDb;
45
21
  /**
46
- * Ensure embedding dimension is set dynamically based on the model
22
+ * Get configuration
47
23
  */
48
- private ensureEmbeddingDimension;
24
+ getConfig(): MemoryConfig;
49
25
  /**
50
- * Get current configuration
26
+ * Update configuration
51
27
  */
52
- getConfig(): LongTermMemoryConfig;
28
+ updateConfig(updates: Partial<MemoryConfig>): void;
53
29
  /**
54
- * Update configuration
30
+ * Track message count for a room
55
31
  */
56
- updateConfig(updates: Partial<LongTermMemoryConfig>): void;
32
+ incrementMessageCount(roomId: UUID): number;
57
33
  /**
58
- * Store a new long-term memory
59
- *
60
- * Research: Section 3.2.1 "Contextual Embeddings"
34
+ * Reset message count for a room
61
35
  */
62
- storeLongTermMemory(memory: Omit<LongTermMemory, 'id' | 'createdAt' | 'lastAccessedAt' | 'accessCount' | 'isActive' | 'embedding'>): Promise<LongTermMemory>;
36
+ resetMessageCount(roomId: UUID): void;
63
37
  /**
64
- * Retrieve long-term memory by ID
38
+ * Check if summarization is needed for a room
65
39
  */
66
- getLongTermMemory(id: UUID): Promise<LongTermMemory | null>;
40
+ shouldSummarize(roomId: UUID): Promise<boolean>;
67
41
  /**
68
- * Update an existing long-term memory
69
- *
70
- * Research: Section 4.3.2 "Resolution Strategies"
42
+ * Generate cache key for tracking extraction checkpoints per entity-room pair
71
43
  */
72
- updateLongTermMemory(id: UUID, updates: Partial<Omit<LongTermMemory, 'id' | 'agentId' | 'createdAt'>>): Promise<void>;
44
+ private getExtractionKey;
73
45
  /**
74
- * Delete a long-term memory (hard delete)
46
+ * Get the last extraction checkpoint for an entity in a room
47
+ * Uses the cache table via adapter
75
48
  */
76
- deleteLongTermMemory(id: UUID): Promise<void>;
49
+ getLastExtractionCheckpoint(entityId: UUID, roomId: UUID): Promise<number>;
77
50
  /**
78
- * Get all long-term memories for an entity (with basic filtering)
51
+ * Set the last extraction checkpoint for an entity in a room
52
+ * Uses the cache table via adapter
79
53
  */
80
- getLongTermMemories(entityId: UUID, type?: MemoryType, limit?: number, includeInactive?: boolean): Promise<LongTermMemory[]>;
54
+ setLastExtractionCheckpoint(entityId: UUID, roomId: UUID, messageCount: number): Promise<void>;
81
55
  /**
82
- * Handle contradictory long-term memory
83
- *
84
- * Research: Section 4.3 "Handling Contradictions"
56
+ * Check if long-term extraction should run based on message count and interval
85
57
  */
86
- handleContradiction(entityId: UUID, newMemory: Omit<LongTermMemory, 'id' | 'createdAt' | 'lastAccessedAt' | 'accessCount' | 'isActive' | 'embedding'>): Promise<void>;
58
+ shouldRunExtraction(entityId: UUID, roomId: UUID, currentMessageCount: number): Promise<boolean>;
87
59
  /**
88
- * Detect if new memory contradicts any existing memory
89
- *
90
- * Research: Section 4.3.1 "Detection Logic"
60
+ * Store a long-term memory
91
61
  */
92
- detectContradiction(newMemory: Omit<LongTermMemory, 'id' | 'createdAt' | 'lastAccessedAt' | 'accessCount' | 'isActive' | 'embedding'>, existingMemories: LongTermMemoryRetrievalResult[]): Promise<LongTermMemory | null>;
62
+ storeLongTermMemory(memory: Omit<LongTermMemory, 'id' | 'createdAt' | 'updatedAt'>): Promise<LongTermMemory>;
93
63
  /**
94
- * Search long-term memories with hybrid retrieval
95
- *
96
- * Research: Section 3 "Retrieval Augmented Generation Strategy"
64
+ * Retrieve long-term memories for an entity
97
65
  */
98
- searchLongTermMemories(params: LongTermMemorySearchParams): Promise<LongTermMemoryRetrievalResult[]>;
66
+ getLongTermMemories(entityId: UUID, category?: LongTermMemoryCategory, limit?: number): Promise<LongTermMemory[]>;
99
67
  /**
100
- * Vector search implementation
68
+ * Update a long-term memory
69
+ * Enforces multi-tenancy by verifying agentId and entityId
101
70
  */
102
- private vectorSearch;
71
+ updateLongTermMemory(id: UUID, entityId: UUID, updates: Partial<Omit<LongTermMemory, 'id' | 'agentId' | 'entityId' | 'createdAt'>>): Promise<void>;
103
72
  /**
104
- * BM25 search implementation
73
+ * Delete a long-term memory
74
+ * Enforces multi-tenancy by verifying agentId and entityId
105
75
  */
106
- private bm25Search;
76
+ deleteLongTermMemory(id: UUID, entityId: UUID): Promise<void>;
107
77
  /**
108
- * Rebuild BM25 index from database
78
+ * Get the current session summary for a room (latest one)
109
79
  */
110
- private rebuildBM25Index;
80
+ getCurrentSessionSummary(roomId: UUID): Promise<SessionSummary | null>;
111
81
  /**
112
- * Get formatted memories for context injection
113
- *
114
- * Research: Section 5.1.3 "Tier 3: Just-In-Time Injection"
82
+ * Store a session summary (initial creation)
115
83
  */
116
- getFormattedLongTermMemoriesForContext(entityId: UUID, query: string, roomId?: UUID): Promise<string>;
84
+ storeSessionSummary(summary: Omit<SessionSummary, 'id' | 'createdAt' | 'updatedAt'>): Promise<SessionSummary>;
117
85
  /**
118
- * Store a conversation summary
119
- *
120
- * Research: Section 5.1.2 "Hierarchical Conversation Summarization"
86
+ * Update an existing session summary
87
+ * Enforces multi-tenancy by verifying agentId
121
88
  */
122
- storeSummary(summary: Omit<ConversationSummary, 'id' | 'createdAt' | 'lastAccessedAt' | 'accessCount'>): Promise<ConversationSummary>;
89
+ updateSessionSummary(id: UUID, roomId: UUID, updates: Partial<Omit<SessionSummary, 'id' | 'agentId' | 'roomId' | 'createdAt' | 'updatedAt'>>): Promise<void>;
123
90
  /**
124
- * Get summaries at a specific level for a room
91
+ * Get session summaries for a room
125
92
  */
126
- getSummariesByLevel(roomId: UUID, level: number): Promise<ConversationSummary[]>;
93
+ getSessionSummaries(roomId: UUID, limit?: number): Promise<SessionSummary[]>;
127
94
  /**
128
- * Search summaries by semantic similarity
129
- *
130
- * Research: Section 5.1.2 "Tier 2: The Conversation Summary"
95
+ * Search long-term memories by semantic similarity (if embeddings are available)
131
96
  */
132
- searchSummaries(params: {
133
- entityId: UUID;
134
- roomId: UUID;
135
- query: string;
136
- limit?: number;
137
- tokenBudget?: number;
138
- }): Promise<ConversationSummary[]>;
97
+ searchLongTermMemories(entityId: UUID, queryEmbedding: number[], limit?: number, matchThreshold?: number): Promise<LongTermMemory[]>;
139
98
  /**
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
99
+ * Get all long-term memories formatted for context
144
100
  */
145
- getMostRecentLevel1Summary(roomId: UUID, entityId: UUID): Promise<ConversationSummary | null>;
101
+ getFormattedLongTermMemories(entityId: UUID): Promise<string>;
146
102
  }