universal-agent-memory 0.6.3 → 0.7.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.
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Memory Consolidation Service for UAM
3
+ *
4
+ * Implements the consolidation rules from CLAUDE.md:
5
+ * - Trigger: Every 10 working memory entries
6
+ * - Action: Summarize → session_memories, Extract lessons → semantic memory
7
+ * - Dedup: Skip if content_hash exists OR similarity > 0.92
8
+ */
9
+ export interface ConsolidationConfig {
10
+ triggerThreshold: number;
11
+ minImportanceForLongTerm: number;
12
+ similarityThreshold: number;
13
+ maxSummaryLength: number;
14
+ }
15
+ export interface ConsolidationResult {
16
+ memoriesProcessed: number;
17
+ summariesCreated: number;
18
+ lessonsExtracted: number;
19
+ duplicatesSkipped: number;
20
+ tokensReduced: number;
21
+ }
22
+ /**
23
+ * Memory Consolidation Service
24
+ */
25
+ export declare class MemoryConsolidator {
26
+ private config;
27
+ private db;
28
+ private contentHashes;
29
+ private lastConsolidationId;
30
+ constructor(config?: Partial<ConsolidationConfig>);
31
+ /**
32
+ * Initialize with database connection
33
+ */
34
+ initialize(dbPath: string): void;
35
+ /**
36
+ * Load existing content hashes for deduplication
37
+ */
38
+ private loadContentHashes;
39
+ /**
40
+ * Hash content for deduplication
41
+ */
42
+ private hashContent;
43
+ /**
44
+ * Check if consolidation should run
45
+ */
46
+ shouldConsolidate(): boolean;
47
+ /**
48
+ * Run consolidation process
49
+ */
50
+ consolidate(): Promise<ConsolidationResult>;
51
+ /**
52
+ * Detect if content contains a lesson/insight
53
+ */
54
+ private detectLesson;
55
+ /**
56
+ * Check for semantic duplicates using embeddings
57
+ */
58
+ private checkSemanticDuplicate;
59
+ /**
60
+ * Store session memory
61
+ */
62
+ private storeSessionMemory;
63
+ /**
64
+ * Store lesson in long-term memory
65
+ */
66
+ private storeLesson;
67
+ /**
68
+ * Run decay on old memories
69
+ * Formula: effective_importance = importance × (0.95 ^ days_since_access)
70
+ */
71
+ runDecay(): Promise<number>;
72
+ /**
73
+ * Get consolidation stats
74
+ */
75
+ getStats(): {
76
+ totalMemories: number;
77
+ totalSessionMemories: number;
78
+ totalLessons: number;
79
+ lastConsolidationId: number;
80
+ uniqueHashes: number;
81
+ };
82
+ /**
83
+ * Close database connection
84
+ */
85
+ close(): void;
86
+ }
87
+ export declare function getMemoryConsolidator(config?: Partial<ConsolidationConfig>): MemoryConsolidator;
88
+ //# sourceMappingURL=memory-consolidator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-consolidator.d.ts","sourceRoot":"","sources":["../../src/memory/memory-consolidator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAQH,MAAM,WAAW,mBAAmB;IAClC,gBAAgB,EAAE,MAAM,CAAC;IACzB,wBAAwB,EAAE,MAAM,CAAC;IACjC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AASD,MAAM,WAAW,mBAAmB;IAClC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,EAAE,CAAkC;IAC5C,OAAO,CAAC,aAAa,CAA0B;IAC/C,OAAO,CAAC,mBAAmB,CAAa;gBAE5B,MAAM,GAAE,OAAO,CAAC,mBAAmB,CAAM;IAIrD;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAQhC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAmBzB;;OAEG;IACH,OAAO,CAAC,WAAW;IAMnB;;OAEG;IACH,iBAAiB,IAAI,OAAO;IAiB5B;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAsGjD;;OAEG;IACH,OAAO,CAAC,YAAY;IAmBpB;;OAEG;YACW,sBAAsB;IAwCpC;;OAEG;YACW,kBAAkB;IAehC;;OAEG;YACW,WAAW;IAWzB;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC;IAwCjC;;OAEG;IACH,QAAQ,IAAI;QACV,aAAa,EAAE,MAAM,CAAC;QACtB,oBAAoB,EAAE,MAAM,CAAC;QAC7B,YAAY,EAAE,MAAM,CAAC;QACrB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,YAAY,EAAE,MAAM,CAAC;KACtB;IAwCD;;OAEG;IACH,KAAK,IAAI,IAAI;CAMd;AAKD,wBAAgB,qBAAqB,CACnC,MAAM,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,GACpC,kBAAkB,CAKpB"}
@@ -0,0 +1,348 @@
1
+ /**
2
+ * Memory Consolidation Service for UAM
3
+ *
4
+ * Implements the consolidation rules from CLAUDE.md:
5
+ * - Trigger: Every 10 working memory entries
6
+ * - Action: Summarize → session_memories, Extract lessons → semantic memory
7
+ * - Dedup: Skip if content_hash exists OR similarity > 0.92
8
+ */
9
+ import { createHash } from 'crypto';
10
+ import { existsSync } from 'fs';
11
+ import Database from 'better-sqlite3';
12
+ import { summarizeMemories, compressMemoryEntry } from './context-compressor.js';
13
+ import { getEmbeddingService } from './embeddings.js';
14
+ const DEFAULT_CONFIG = {
15
+ triggerThreshold: 10,
16
+ minImportanceForLongTerm: 7,
17
+ similarityThreshold: 0.92,
18
+ maxSummaryLength: 500,
19
+ };
20
+ /**
21
+ * Memory Consolidation Service
22
+ */
23
+ export class MemoryConsolidator {
24
+ config;
25
+ db = null;
26
+ contentHashes = new Set();
27
+ lastConsolidationId = 0;
28
+ constructor(config = {}) {
29
+ this.config = { ...DEFAULT_CONFIG, ...config };
30
+ }
31
+ /**
32
+ * Initialize with database connection
33
+ */
34
+ initialize(dbPath) {
35
+ if (!existsSync(dbPath)) {
36
+ throw new Error(`Database not found: ${dbPath}`);
37
+ }
38
+ this.db = new Database(dbPath);
39
+ this.loadContentHashes();
40
+ }
41
+ /**
42
+ * Load existing content hashes for deduplication
43
+ */
44
+ loadContentHashes() {
45
+ if (!this.db)
46
+ return;
47
+ try {
48
+ const stmt = this.db.prepare(`
49
+ SELECT content FROM memories
50
+ UNION
51
+ SELECT content FROM session_memories
52
+ `);
53
+ const rows = stmt.all();
54
+ for (const row of rows) {
55
+ this.contentHashes.add(this.hashContent(row.content));
56
+ }
57
+ }
58
+ catch {
59
+ // Tables might not exist yet
60
+ }
61
+ }
62
+ /**
63
+ * Hash content for deduplication
64
+ */
65
+ hashContent(content) {
66
+ return createHash('md5')
67
+ .update(content.toLowerCase().trim())
68
+ .digest('hex');
69
+ }
70
+ /**
71
+ * Check if consolidation should run
72
+ */
73
+ shouldConsolidate() {
74
+ if (!this.db)
75
+ return false;
76
+ try {
77
+ const stmt = this.db.prepare(`
78
+ SELECT COUNT(*) as count, MAX(id) as maxId
79
+ FROM memories
80
+ WHERE id > ?
81
+ `);
82
+ const result = stmt.get(this.lastConsolidationId);
83
+ return result.count >= this.config.triggerThreshold;
84
+ }
85
+ catch {
86
+ return false;
87
+ }
88
+ }
89
+ /**
90
+ * Run consolidation process
91
+ */
92
+ async consolidate() {
93
+ if (!this.db) {
94
+ throw new Error('Database not initialized');
95
+ }
96
+ const result = {
97
+ memoriesProcessed: 0,
98
+ summariesCreated: 0,
99
+ lessonsExtracted: 0,
100
+ duplicatesSkipped: 0,
101
+ tokensReduced: 0,
102
+ };
103
+ // Get memories since last consolidation
104
+ const stmt = this.db.prepare(`
105
+ SELECT id, timestamp, type, content
106
+ FROM memories
107
+ WHERE id > ?
108
+ ORDER BY id ASC
109
+ LIMIT 100
110
+ `);
111
+ const memories = stmt.all(this.lastConsolidationId);
112
+ if (memories.length === 0)
113
+ return result;
114
+ result.memoriesProcessed = memories.length;
115
+ const originalTokens = memories.reduce((sum, m) => sum + m.content.length / 4, 0);
116
+ // Group by type for summarization
117
+ const byType = {};
118
+ for (const mem of memories) {
119
+ if (!byType[mem.type])
120
+ byType[mem.type] = [];
121
+ byType[mem.type].push(mem);
122
+ }
123
+ // Create summaries for each type
124
+ for (const [_type, typeMemories] of Object.entries(byType)) {
125
+ if (typeMemories.length >= 3) {
126
+ const summary = summarizeMemories(typeMemories.map(m => ({
127
+ content: m.content,
128
+ timestamp: m.timestamp,
129
+ type: m.type,
130
+ })), this.config.maxSummaryLength);
131
+ const summaryHash = this.hashContent(summary);
132
+ if (!this.contentHashes.has(summaryHash)) {
133
+ // Store in session_memories
134
+ await this.storeSessionMemory(summary, 'summary', 6);
135
+ this.contentHashes.add(summaryHash);
136
+ result.summariesCreated++;
137
+ }
138
+ else {
139
+ result.duplicatesSkipped++;
140
+ }
141
+ }
142
+ }
143
+ // Extract lessons from high-importance observations
144
+ const lessons = memories.filter(m => m.type === 'observation' &&
145
+ this.detectLesson(m.content));
146
+ for (const lesson of lessons) {
147
+ const compressed = compressMemoryEntry(lesson.content, { compressionLevel: 'medium' });
148
+ const hash = this.hashContent(compressed.compressed);
149
+ if (!this.contentHashes.has(hash)) {
150
+ // Check semantic similarity
151
+ const isDuplicate = await this.checkSemanticDuplicate(compressed.compressed);
152
+ if (!isDuplicate) {
153
+ await this.storeLesson(compressed.compressed, lesson.timestamp);
154
+ this.contentHashes.add(hash);
155
+ result.lessonsExtracted++;
156
+ }
157
+ else {
158
+ result.duplicatesSkipped++;
159
+ }
160
+ }
161
+ else {
162
+ result.duplicatesSkipped++;
163
+ }
164
+ }
165
+ // Calculate token reduction
166
+ const summaryTokens = result.summariesCreated * (this.config.maxSummaryLength / 4);
167
+ const lessonTokens = result.lessonsExtracted * 100; // Approximate
168
+ result.tokensReduced = Math.max(0, originalTokens - summaryTokens - lessonTokens);
169
+ // Update last consolidation pointer
170
+ this.lastConsolidationId = memories[memories.length - 1].id;
171
+ return result;
172
+ }
173
+ /**
174
+ * Detect if content contains a lesson/insight
175
+ */
176
+ detectLesson(content) {
177
+ const lessonIndicators = [
178
+ /learned that/i,
179
+ /important to/i,
180
+ /mistake was/i,
181
+ /better to/i,
182
+ /should always/i,
183
+ /should never/i,
184
+ /key insight/i,
185
+ /gotcha/i,
186
+ /watch out for/i,
187
+ /best practice/i,
188
+ /pattern/i,
189
+ /tip:/i,
190
+ ];
191
+ return lessonIndicators.some(pattern => pattern.test(content));
192
+ }
193
+ /**
194
+ * Check for semantic duplicates using embeddings
195
+ */
196
+ async checkSemanticDuplicate(content) {
197
+ if (!this.db)
198
+ return false;
199
+ try {
200
+ const embeddingService = getEmbeddingService();
201
+ const newEmbedding = await embeddingService.embed(content);
202
+ // Get recent session memories for comparison
203
+ const stmt = this.db.prepare(`
204
+ SELECT content FROM session_memories
205
+ ORDER BY id DESC
206
+ LIMIT 50
207
+ `);
208
+ const existing = stmt.all();
209
+ for (const { content: existingContent } of existing) {
210
+ const existingEmbedding = await embeddingService.embed(existingContent);
211
+ const similarity = embeddingService.cosineSimilarity(newEmbedding, existingEmbedding);
212
+ if (similarity > this.config.similarityThreshold) {
213
+ return true;
214
+ }
215
+ }
216
+ return false;
217
+ }
218
+ catch {
219
+ // Fall back to text comparison
220
+ const normalizedNew = content.toLowerCase().trim();
221
+ const stmt = this.db.prepare(`
222
+ SELECT content FROM session_memories
223
+ WHERE LOWER(TRIM(content)) = ?
224
+ LIMIT 1
225
+ `);
226
+ const match = stmt.get(normalizedNew);
227
+ return !!match;
228
+ }
229
+ }
230
+ /**
231
+ * Store session memory
232
+ */
233
+ async storeSessionMemory(content, type, importance) {
234
+ if (!this.db)
235
+ return;
236
+ const stmt = this.db.prepare(`
237
+ INSERT OR IGNORE INTO session_memories (session_id, timestamp, type, content, importance)
238
+ VALUES ('consolidation', ?, ?, ?, ?)
239
+ `);
240
+ stmt.run(new Date().toISOString(), type, content, importance);
241
+ }
242
+ /**
243
+ * Store lesson in long-term memory
244
+ */
245
+ async storeLesson(content, timestamp) {
246
+ if (!this.db)
247
+ return;
248
+ const stmt = this.db.prepare(`
249
+ INSERT OR IGNORE INTO session_memories (session_id, timestamp, type, content, importance)
250
+ VALUES ('lessons', ?, 'lesson', ?, ?)
251
+ `);
252
+ stmt.run(timestamp, content, this.config.minImportanceForLongTerm);
253
+ }
254
+ /**
255
+ * Run decay on old memories
256
+ * Formula: effective_importance = importance × (0.95 ^ days_since_access)
257
+ */
258
+ async runDecay() {
259
+ if (!this.db)
260
+ return 0;
261
+ try {
262
+ // SQLite doesn't have POW, so we do this in application code
263
+ const stmt = this.db.prepare(`
264
+ SELECT id, importance, timestamp
265
+ FROM session_memories
266
+ WHERE importance > 1
267
+ `);
268
+ const rows = stmt.all();
269
+ let updated = 0;
270
+ const now = Date.now();
271
+ const updateStmt = this.db.prepare(`
272
+ UPDATE session_memories
273
+ SET importance = ?
274
+ WHERE id = ?
275
+ `);
276
+ for (const row of rows) {
277
+ const daysSince = (now - new Date(row.timestamp).getTime()) / (1000 * 60 * 60 * 24);
278
+ const decayed = Math.round(row.importance * Math.pow(0.95, daysSince));
279
+ if (decayed !== row.importance && decayed >= 1) {
280
+ updateStmt.run(decayed, row.id);
281
+ updated++;
282
+ }
283
+ }
284
+ return updated;
285
+ }
286
+ catch {
287
+ return 0;
288
+ }
289
+ }
290
+ /**
291
+ * Get consolidation stats
292
+ */
293
+ getStats() {
294
+ if (!this.db) {
295
+ return {
296
+ totalMemories: 0,
297
+ totalSessionMemories: 0,
298
+ totalLessons: 0,
299
+ lastConsolidationId: this.lastConsolidationId,
300
+ uniqueHashes: this.contentHashes.size,
301
+ };
302
+ }
303
+ try {
304
+ const memoriesStmt = this.db.prepare('SELECT COUNT(*) as count FROM memories');
305
+ const sessionStmt = this.db.prepare('SELECT COUNT(*) as count FROM session_memories');
306
+ const lessonsStmt = this.db.prepare(`
307
+ SELECT COUNT(*) as count FROM session_memories WHERE type = 'lesson'
308
+ `);
309
+ const memories = memoriesStmt.get().count;
310
+ const session = sessionStmt.get().count;
311
+ const lessons = lessonsStmt.get().count;
312
+ return {
313
+ totalMemories: memories,
314
+ totalSessionMemories: session,
315
+ totalLessons: lessons,
316
+ lastConsolidationId: this.lastConsolidationId,
317
+ uniqueHashes: this.contentHashes.size,
318
+ };
319
+ }
320
+ catch {
321
+ return {
322
+ totalMemories: 0,
323
+ totalSessionMemories: 0,
324
+ totalLessons: 0,
325
+ lastConsolidationId: this.lastConsolidationId,
326
+ uniqueHashes: this.contentHashes.size,
327
+ };
328
+ }
329
+ }
330
+ /**
331
+ * Close database connection
332
+ */
333
+ close() {
334
+ if (this.db) {
335
+ this.db.close();
336
+ this.db = null;
337
+ }
338
+ }
339
+ }
340
+ // Singleton instance
341
+ let globalConsolidator = null;
342
+ export function getMemoryConsolidator(config) {
343
+ if (!globalConsolidator) {
344
+ globalConsolidator = new MemoryConsolidator(config);
345
+ }
346
+ return globalConsolidator;
347
+ }
348
+ //# sourceMappingURL=memory-consolidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-consolidator.js","sourceRoot":"","sources":["../../src/memory/memory-consolidator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAStD,MAAM,cAAc,GAAwB;IAC1C,gBAAgB,EAAE,EAAE;IACpB,wBAAwB,EAAE,CAAC;IAC3B,mBAAmB,EAAE,IAAI;IACzB,gBAAgB,EAAE,GAAG;CACtB,CAAC;AAUF;;GAEG;AACH,MAAM,OAAO,kBAAkB;IACrB,MAAM,CAAsB;IAC5B,EAAE,GAA6B,IAAI,CAAC;IACpC,aAAa,GAAgB,IAAI,GAAG,EAAE,CAAC;IACvC,mBAAmB,GAAW,CAAC,CAAC;IAExC,YAAY,SAAuC,EAAE;QACnD,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;IACjD,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,MAAc;QACvB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,uBAAuB,MAAM,EAAE,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,CAAC,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACK,iBAAiB;QACvB,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO;QAErB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;OAI5B,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAgC,CAAC;YAEtD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,6BAA6B;QAC/B,CAAC;IACH,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,OAAe;QACjC,OAAO,UAAU,CAAC,KAAK,CAAC;aACrB,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;aACpC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO,KAAK,CAAC;QAE3B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;OAI5B,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAA4C,CAAC;YAE7F,OAAO,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW;QACf,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,MAAM,GAAwB;YAClC,iBAAiB,EAAE,CAAC;YACpB,gBAAgB,EAAE,CAAC;YACnB,gBAAgB,EAAE,CAAC;YACnB,iBAAiB,EAAE,CAAC;YACpB,aAAa,EAAE,CAAC;SACjB,CAAC;QAEF,wCAAwC;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;;;KAM5B,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAKhD,CAAC;QAEH,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC;QAEzC,MAAM,CAAC,iBAAiB,GAAG,QAAQ,CAAC,MAAM,CAAC;QAC3C,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAElF,kCAAkC;QAClC,MAAM,MAAM,GAAoC,EAAE,CAAC;QACnD,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;QAED,iCAAiC;QACjC,KAAK,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3D,IAAI,YAAY,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBAC7B,MAAM,OAAO,GAAG,iBAAiB,CAC/B,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;oBACrB,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,SAAS,EAAE,CAAC,CAAC,SAAS;oBACtB,IAAI,EAAE,CAAC,CAAC,IAAI;iBACb,CAAC,CAAC,EACH,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAC7B,CAAC;gBAEF,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBAE9C,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;oBACzC,4BAA4B;oBAC5B,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;oBACrD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;oBACpC,MAAM,CAAC,gBAAgB,EAAE,CAAC;gBAC5B,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,iBAAiB,EAAE,CAAC;gBAC7B,CAAC;YACH,CAAC;QACH,CAAC;QAED,oDAAoD;QACpD,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAClC,CAAC,CAAC,IAAI,KAAK,aAAa;YACxB,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAC7B,CAAC;QAEF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,UAAU,GAAG,mBAAmB,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC,CAAC;YACvF,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YAErD,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClC,4BAA4B;gBAC5B,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;gBAE7E,IAAI,CAAC,WAAW,EAAE,CAAC;oBACjB,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;oBAChE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBAC7B,MAAM,CAAC,gBAAgB,EAAE,CAAC;gBAC5B,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,iBAAiB,EAAE,CAAC;gBAC7B,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,4BAA4B;QAC5B,MAAM,aAAa,GAAG,MAAM,CAAC,gBAAgB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC;QACnF,MAAM,YAAY,GAAG,MAAM,CAAC,gBAAgB,GAAG,GAAG,CAAC,CAAC,cAAc;QAClE,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,GAAG,aAAa,GAAG,YAAY,CAAC,CAAC;QAElF,oCAAoC;QACpC,IAAI,CAAC,mBAAmB,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAE5D,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,OAAe;QAClC,MAAM,gBAAgB,GAAG;YACvB,eAAe;YACf,eAAe;YACf,cAAc;YACd,YAAY;YACZ,gBAAgB;YAChB,eAAe;YACf,cAAc;YACd,SAAS;YACT,gBAAgB;YAChB,gBAAgB;YAChB,UAAU;YACV,OAAO;SACR,CAAC;QAEF,OAAO,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACjE,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,sBAAsB,CAAC,OAAe;QAClD,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO,KAAK,CAAC;QAE3B,IAAI,CAAC;YACH,MAAM,gBAAgB,GAAG,mBAAmB,EAAE,CAAC;YAC/C,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAE3D,6CAA6C;YAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;OAI5B,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAgC,CAAC;YAE1D,KAAK,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,QAAQ,EAAE,CAAC;gBACpD,MAAM,iBAAiB,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;gBACxE,MAAM,UAAU,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;gBAEtF,IAAI,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;oBACjD,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;YAED,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,MAAM,CAAC;YACP,+BAA+B;YAC/B,MAAM,aAAa,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;YAEnD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;OAI5B,CAAC,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAEtC,OAAO,CAAC,CAAC,KAAK,CAAC;QACjB,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,kBAAkB,CAC9B,OAAe,EACf,IAAY,EACZ,UAAkB;QAElB,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO;QAErB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;KAG5B,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;IAChE,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,WAAW,CAAC,OAAe,EAAE,SAAiB;QAC1D,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO;QAErB,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;KAG5B,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC;IACrE,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO,CAAC,CAAC;QAEvB,IAAI,CAAC;YACH,6DAA6D;YAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;OAI5B,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAInB,CAAC;YAEH,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;;;OAIlC,CAAC,CAAC;YAEH,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,SAAS,GAAG,CAAC,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;gBACpF,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;gBAEvE,IAAI,OAAO,KAAK,GAAG,CAAC,UAAU,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;oBAC/C,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;oBAChC,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAED;;OAEG;IACH,QAAQ;QAON,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,OAAO;gBACL,aAAa,EAAE,CAAC;gBAChB,oBAAoB,EAAE,CAAC;gBACvB,YAAY,EAAE,CAAC;gBACf,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;gBAC7C,YAAY,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI;aACtC,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC;YAC/E,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,gDAAgD,CAAC,CAAC;YACtF,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC;;OAEnC,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAI,YAAY,CAAC,GAAG,EAAwB,CAAC,KAAK,CAAC;YACjE,MAAM,OAAO,GAAI,WAAW,CAAC,GAAG,EAAwB,CAAC,KAAK,CAAC;YAC/D,MAAM,OAAO,GAAI,WAAW,CAAC,GAAG,EAAwB,CAAC,KAAK,CAAC;YAE/D,OAAO;gBACL,aAAa,EAAE,QAAQ;gBACvB,oBAAoB,EAAE,OAAO;gBAC7B,YAAY,EAAE,OAAO;gBACrB,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;gBAC7C,YAAY,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI;aACtC,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,aAAa,EAAE,CAAC;gBAChB,oBAAoB,EAAE,CAAC;gBACvB,YAAY,EAAE,CAAC;gBACf,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;gBAC7C,YAAY,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI;aACtC,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC;CACF;AAED,qBAAqB;AACrB,IAAI,kBAAkB,GAA8B,IAAI,CAAC;AAEzD,MAAM,UAAU,qBAAqB,CACnC,MAAqC;IAErC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,kBAAkB,GAAG,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,kBAAkB,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Speculative Cache for UAM Memory System
3
+ *
4
+ * Pre-computes likely next queries based on task patterns.
5
+ * Reduces latency by predicting and caching memory retrievals.
6
+ */
7
+ export interface CacheEntry {
8
+ query: string;
9
+ result: unknown[];
10
+ embedding?: number[];
11
+ usageCount: number;
12
+ lastUsed: Date;
13
+ createdAt: Date;
14
+ predictedBy?: string;
15
+ }
16
+ export interface CacheConfig {
17
+ maxEntries: number;
18
+ ttlMs: number;
19
+ preWarmEnabled: boolean;
20
+ predictionDepth: number;
21
+ }
22
+ /**
23
+ * Speculative Memory Cache
24
+ */
25
+ export declare class SpeculativeCache {
26
+ private config;
27
+ private cache;
28
+ private queryHistory;
29
+ private taskPatterns;
30
+ constructor(config?: Partial<CacheConfig>);
31
+ /**
32
+ * Get from cache with automatic staleness check
33
+ */
34
+ get(query: string): CacheEntry | null;
35
+ /**
36
+ * Set cache entry
37
+ */
38
+ set(query: string, result: unknown[], predictedBy?: string): void;
39
+ /**
40
+ * Record query for pattern analysis
41
+ */
42
+ private recordQuery;
43
+ /**
44
+ * Detect task category from query
45
+ */
46
+ private detectCategory;
47
+ /**
48
+ * Get predicted queries based on current context
49
+ */
50
+ getPredictedQueries(currentQuery: string): string[];
51
+ /**
52
+ * Analyze query sequences for patterns
53
+ */
54
+ private analyzeQuerySequences;
55
+ /**
56
+ * Pre-warm cache with predicted queries
57
+ */
58
+ preWarm(currentQuery: string, fetcher: (query: string) => Promise<unknown[]>): Promise<void>;
59
+ /**
60
+ * Evict least recently used entry
61
+ */
62
+ private evictLRU;
63
+ /**
64
+ * Normalize query for cache key
65
+ */
66
+ private normalizeQuery;
67
+ /**
68
+ * Get cache statistics
69
+ */
70
+ getStats(): {
71
+ size: number;
72
+ hitRate: number;
73
+ avgUsage: number;
74
+ topPatterns: Array<{
75
+ category: string;
76
+ count: number;
77
+ }>;
78
+ };
79
+ /**
80
+ * Clear expired entries
81
+ */
82
+ cleanup(): number;
83
+ /**
84
+ * Clear all cache
85
+ */
86
+ clear(): void;
87
+ }
88
+ export declare function getSpeculativeCache(config?: Partial<CacheConfig>): SpeculativeCache;
89
+ //# sourceMappingURL=speculative-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"speculative-cache.d.ts","sourceRoot":"","sources":["../../src/memory/speculative-cache.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,IAAI,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,OAAO,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;CACzB;AAuCD;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,KAAK,CAAsC;IACnD,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,YAAY,CAAkC;gBAE1C,MAAM,GAAE,OAAO,CAAC,WAAW,CAAM;IAI7C;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAoBrC;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;IAqBjE;;OAEG;IACH,OAAO,CAAC,WAAW;IAgBnB;;OAEG;IACH,OAAO,CAAC,cAAc;IActB;;OAEG;IACH,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE;IAkBnD;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAiC7B;;OAEG;IACG,OAAO,CACX,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,GAC7C,OAAO,CAAC,IAAI,CAAC;IAoBhB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAehB;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IACH,QAAQ,IAAI;QACV,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,KAAK,CAAC;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACzD;IAkBD;;OAEG;IACH,OAAO,IAAI,MAAM;IAejB;;OAEG;IACH,KAAK,IAAI,IAAI;CAKd;AAKD,wBAAgB,mBAAmB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,gBAAgB,CAKnF"}