universal-agent-memory 0.6.2 → 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.
Files changed (85) hide show
  1. package/dist/benchmarks/agents/naive-agent.d.ts +60 -0
  2. package/dist/benchmarks/agents/naive-agent.d.ts.map +1 -0
  3. package/dist/benchmarks/agents/naive-agent.js +144 -0
  4. package/dist/benchmarks/agents/naive-agent.js.map +1 -0
  5. package/dist/benchmarks/agents/uam-agent.d.ts +167 -0
  6. package/dist/benchmarks/agents/uam-agent.d.ts.map +1 -0
  7. package/dist/benchmarks/agents/uam-agent.js +386 -0
  8. package/dist/benchmarks/agents/uam-agent.js.map +1 -0
  9. package/dist/benchmarks/benchmark.d.ts +328 -0
  10. package/dist/benchmarks/benchmark.d.ts.map +1 -0
  11. package/dist/benchmarks/benchmark.js +104 -0
  12. package/dist/benchmarks/benchmark.js.map +1 -0
  13. package/dist/benchmarks/execution-verifier.d.ts +41 -0
  14. package/dist/benchmarks/execution-verifier.d.ts.map +1 -0
  15. package/dist/benchmarks/execution-verifier.js +342 -0
  16. package/dist/benchmarks/execution-verifier.js.map +1 -0
  17. package/dist/benchmarks/hierarchical-prompting.d.ts +37 -0
  18. package/dist/benchmarks/hierarchical-prompting.d.ts.map +1 -0
  19. package/dist/benchmarks/hierarchical-prompting.js +260 -0
  20. package/dist/benchmarks/hierarchical-prompting.js.map +1 -0
  21. package/dist/benchmarks/improved-benchmark.d.ts +88 -0
  22. package/dist/benchmarks/improved-benchmark.d.ts.map +1 -0
  23. package/dist/benchmarks/improved-benchmark.js +533 -0
  24. package/dist/benchmarks/improved-benchmark.js.map +1 -0
  25. package/dist/benchmarks/index.d.ts +10 -0
  26. package/dist/benchmarks/index.d.ts.map +1 -0
  27. package/dist/benchmarks/index.js +10 -0
  28. package/dist/benchmarks/index.js.map +1 -0
  29. package/dist/benchmarks/multi-turn-agent.d.ts +44 -0
  30. package/dist/benchmarks/multi-turn-agent.d.ts.map +1 -0
  31. package/dist/benchmarks/multi-turn-agent.js +235 -0
  32. package/dist/benchmarks/multi-turn-agent.js.map +1 -0
  33. package/dist/benchmarks/runner.d.ts +2 -0
  34. package/dist/benchmarks/runner.d.ts.map +1 -0
  35. package/dist/benchmarks/runner.js +2 -0
  36. package/dist/benchmarks/runner.js.map +1 -0
  37. package/dist/benchmarks/tasks.d.ts +19 -0
  38. package/dist/benchmarks/tasks.d.ts.map +1 -0
  39. package/dist/benchmarks/tasks.js +371 -0
  40. package/dist/benchmarks/tasks.js.map +1 -0
  41. package/dist/index.d.ts +14 -0
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +11 -0
  44. package/dist/index.js.map +1 -1
  45. package/dist/memory/backends/qdrant-cloud.d.ts +1 -1
  46. package/dist/memory/backends/qdrant-cloud.d.ts.map +1 -1
  47. package/dist/memory/backends/qdrant-cloud.js +6 -4
  48. package/dist/memory/backends/qdrant-cloud.js.map +1 -1
  49. package/dist/memory/context-compressor.d.ts +66 -0
  50. package/dist/memory/context-compressor.d.ts.map +1 -0
  51. package/dist/memory/context-compressor.js +250 -0
  52. package/dist/memory/context-compressor.js.map +1 -0
  53. package/dist/memory/dynamic-retrieval.d.ts +26 -0
  54. package/dist/memory/dynamic-retrieval.d.ts.map +1 -0
  55. package/dist/memory/dynamic-retrieval.js +378 -0
  56. package/dist/memory/dynamic-retrieval.js.map +1 -0
  57. package/dist/memory/embeddings.d.ts +93 -0
  58. package/dist/memory/embeddings.d.ts.map +1 -0
  59. package/dist/memory/embeddings.js +391 -0
  60. package/dist/memory/embeddings.js.map +1 -0
  61. package/dist/memory/hierarchical-memory.d.ts +116 -0
  62. package/dist/memory/hierarchical-memory.d.ts.map +1 -0
  63. package/dist/memory/hierarchical-memory.js +299 -0
  64. package/dist/memory/hierarchical-memory.js.map +1 -0
  65. package/dist/memory/memory-consolidator.d.ts +88 -0
  66. package/dist/memory/memory-consolidator.d.ts.map +1 -0
  67. package/dist/memory/memory-consolidator.js +348 -0
  68. package/dist/memory/memory-consolidator.js.map +1 -0
  69. package/dist/memory/speculative-cache.d.ts +89 -0
  70. package/dist/memory/speculative-cache.d.ts.map +1 -0
  71. package/dist/memory/speculative-cache.js +259 -0
  72. package/dist/memory/speculative-cache.js.map +1 -0
  73. package/dist/memory/task-classifier.d.ts +33 -0
  74. package/dist/memory/task-classifier.d.ts.map +1 -0
  75. package/dist/memory/task-classifier.js +277 -0
  76. package/dist/memory/task-classifier.js.map +1 -0
  77. package/dist/utils/rate-limiter.d.ts +62 -0
  78. package/dist/utils/rate-limiter.d.ts.map +1 -0
  79. package/dist/utils/rate-limiter.js +150 -0
  80. package/dist/utils/rate-limiter.js.map +1 -0
  81. package/dist/utils/validate-json.d.ts +52 -0
  82. package/dist/utils/validate-json.d.ts.map +1 -0
  83. package/dist/utils/validate-json.js +99 -0
  84. package/dist/utils/validate-json.js.map +1 -0
  85. package/package.json +2 -1
@@ -0,0 +1,299 @@
1
+ /**
2
+ * Hierarchical Memory System for UAM
3
+ *
4
+ * Implements hot/warm/cold memory tiering with automatic promotion/demotion.
5
+ * Based on MemGPT and R³Mem research for efficient memory management.
6
+ */
7
+ import { getEmbeddingService } from './embeddings.js';
8
+ import { compressMemoryEntry, summarizeMemories, estimateTokens } from './context-compressor.js';
9
+ const DEFAULT_CONFIG = {
10
+ hotMaxEntries: 10,
11
+ warmMaxEntries: 50,
12
+ coldMaxEntries: 500,
13
+ hotMaxTokens: 2000,
14
+ decayRate: 0.95,
15
+ promotionThreshold: 0.7,
16
+ demotionThreshold: 0.3,
17
+ };
18
+ /**
19
+ * Calculate effective importance with time decay
20
+ * Formula: effective_importance = importance × (decayRate ^ days_since_access)
21
+ */
22
+ export function calculateEffectiveImportance(entry, decayRate = 0.95) {
23
+ const lastAccessed = new Date(entry.lastAccessed);
24
+ const now = new Date();
25
+ const daysSinceAccess = (now.getTime() - lastAccessed.getTime()) / (1000 * 60 * 60 * 24);
26
+ return entry.importance * Math.pow(decayRate, daysSinceAccess);
27
+ }
28
+ /**
29
+ * Hierarchical Memory Manager
30
+ */
31
+ export class HierarchicalMemoryManager {
32
+ config;
33
+ memory;
34
+ accessLog = new Map();
35
+ constructor(config = {}) {
36
+ this.config = { ...DEFAULT_CONFIG, ...config };
37
+ this.memory = { hot: [], warm: [], cold: [] };
38
+ }
39
+ /**
40
+ * Add a new memory entry
41
+ */
42
+ add(entry) {
43
+ const now = new Date().toISOString();
44
+ const fullEntry = {
45
+ ...entry,
46
+ accessCount: 1,
47
+ lastAccessed: now,
48
+ tier: 'hot',
49
+ };
50
+ // Add to hot tier
51
+ this.memory.hot.unshift(fullEntry);
52
+ // Trigger rebalancing
53
+ this.rebalance();
54
+ }
55
+ /**
56
+ * Access a memory (promote if accessed frequently)
57
+ */
58
+ access(id) {
59
+ const entry = this.findEntry(id);
60
+ if (!entry)
61
+ return null;
62
+ // Update access metrics
63
+ entry.accessCount++;
64
+ entry.lastAccessed = new Date().toISOString();
65
+ // Log access for pattern analysis
66
+ const now = Date.now();
67
+ const accessTimes = this.accessLog.get(id) || [];
68
+ accessTimes.push(now);
69
+ this.accessLog.set(id, accessTimes.slice(-10)); // Keep last 10 access times
70
+ // Check for promotion
71
+ this.checkPromotion(entry);
72
+ return entry;
73
+ }
74
+ /**
75
+ * Query memories with automatic tier traversal
76
+ */
77
+ async query(queryText, limit = 5) {
78
+ const results = [];
79
+ const embeddingService = getEmbeddingService();
80
+ // First check hot tier (always include recent)
81
+ for (const entry of this.memory.hot) {
82
+ const score = this.textSimilarity(queryText, entry.content);
83
+ if (score > 0.3) {
84
+ results.push({ entry, score: score + 0.3 }); // Bonus for hot tier
85
+ }
86
+ }
87
+ // Check warm tier
88
+ for (const entry of this.memory.warm) {
89
+ const score = this.textSimilarity(queryText, entry.content);
90
+ if (score > 0.4) {
91
+ results.push({ entry, score: score + 0.1 }); // Small bonus for warm
92
+ }
93
+ }
94
+ // Semantic search in cold tier if we need more results
95
+ if (results.length < limit && this.memory.cold.length > 0) {
96
+ try {
97
+ const queryEmbedding = await embeddingService.embed(queryText);
98
+ for (const entry of this.memory.cold) {
99
+ if (entry.embedding) {
100
+ const score = embeddingService.cosineSimilarity(queryEmbedding, entry.embedding);
101
+ if (score > 0.5) {
102
+ results.push({ entry, score });
103
+ }
104
+ }
105
+ }
106
+ }
107
+ catch {
108
+ // Fall back to text similarity
109
+ for (const entry of this.memory.cold) {
110
+ const score = this.textSimilarity(queryText, entry.content);
111
+ if (score > 0.5) {
112
+ results.push({ entry, score });
113
+ }
114
+ }
115
+ }
116
+ }
117
+ // Sort by score and return top entries
118
+ results.sort((a, b) => b.score - a.score);
119
+ const topEntries = results.slice(0, limit).map(r => r.entry);
120
+ // Mark accessed entries
121
+ for (const entry of topEntries) {
122
+ this.access(entry.id);
123
+ }
124
+ return topEntries;
125
+ }
126
+ /**
127
+ * Get hot tier context (for inclusion in prompts)
128
+ */
129
+ getHotContext() {
130
+ let totalTokens = 0;
131
+ const entries = [];
132
+ for (const entry of this.memory.hot) {
133
+ const tokens = estimateTokens(entry.content);
134
+ if (totalTokens + tokens <= this.config.hotMaxTokens) {
135
+ entries.push(entry);
136
+ totalTokens += tokens;
137
+ }
138
+ }
139
+ return { entries, tokens: totalTokens };
140
+ }
141
+ /**
142
+ * Consolidate old memories into summaries
143
+ */
144
+ async consolidate() {
145
+ const now = Date.now();
146
+ const oneDayAgo = now - 24 * 60 * 60 * 1000;
147
+ // Find old warm entries to summarize
148
+ const oldWarm = this.memory.warm.filter(e => new Date(e.lastAccessed).getTime() < oneDayAgo);
149
+ if (oldWarm.length >= 10) {
150
+ // Create summary
151
+ const summary = summarizeMemories(oldWarm);
152
+ // Add summary as new cold entry
153
+ const summaryEntry = {
154
+ id: `summary-${Date.now()}`,
155
+ content: summary,
156
+ type: 'observation',
157
+ timestamp: new Date().toISOString(),
158
+ importance: 6,
159
+ accessCount: 1,
160
+ lastAccessed: new Date().toISOString(),
161
+ tier: 'cold',
162
+ };
163
+ this.memory.cold.unshift(summaryEntry);
164
+ // Remove summarized entries from warm
165
+ const oldIds = new Set(oldWarm.map(e => e.id));
166
+ this.memory.warm = this.memory.warm.filter(e => !oldIds.has(e.id));
167
+ // Limit cold tier size
168
+ if (this.memory.cold.length > this.config.coldMaxEntries) {
169
+ this.memory.cold = this.memory.cold.slice(0, this.config.coldMaxEntries);
170
+ }
171
+ }
172
+ }
173
+ /**
174
+ * Rebalance tiers based on importance and access patterns
175
+ */
176
+ rebalance() {
177
+ const { hotMaxEntries, warmMaxEntries, decayRate } = this.config;
178
+ // Calculate effective importance for all entries
179
+ const scoredHot = this.memory.hot.map(e => ({
180
+ entry: e,
181
+ score: calculateEffectiveImportance(e, decayRate),
182
+ }));
183
+ const scoredWarm = this.memory.warm.map(e => ({
184
+ entry: e,
185
+ score: calculateEffectiveImportance(e, decayRate),
186
+ }));
187
+ // Sort hot tier
188
+ scoredHot.sort((a, b) => b.score - a.score);
189
+ // Demote excess hot entries to warm
190
+ if (scoredHot.length > hotMaxEntries) {
191
+ const demoted = scoredHot.slice(hotMaxEntries);
192
+ for (const { entry } of demoted) {
193
+ entry.tier = 'warm';
194
+ this.memory.warm.unshift(entry);
195
+ }
196
+ this.memory.hot = scoredHot.slice(0, hotMaxEntries).map(s => s.entry);
197
+ }
198
+ // Sort warm tier
199
+ scoredWarm.sort((a, b) => b.score - a.score);
200
+ // Demote excess warm entries to cold
201
+ if (this.memory.warm.length > warmMaxEntries) {
202
+ const demoted = this.memory.warm.slice(warmMaxEntries);
203
+ for (const entry of demoted) {
204
+ entry.tier = 'cold';
205
+ // Compress content before moving to cold
206
+ const compressed = compressMemoryEntry(entry.content, { compressionLevel: 'aggressive' });
207
+ entry.compressed = compressed.compressed;
208
+ this.memory.cold.unshift(entry);
209
+ }
210
+ this.memory.warm = this.memory.warm.slice(0, warmMaxEntries);
211
+ }
212
+ }
213
+ /**
214
+ * Check and promote entry if accessed frequently
215
+ */
216
+ checkPromotion(entry) {
217
+ if (entry.tier === 'hot')
218
+ return;
219
+ const accessTimes = this.accessLog.get(entry.id) || [];
220
+ // Calculate access frequency (accesses per hour)
221
+ if (accessTimes.length >= 3) {
222
+ const timeSpan = accessTimes[accessTimes.length - 1] - accessTimes[0];
223
+ const hoursSpan = timeSpan / (1000 * 60 * 60) || 1;
224
+ const frequency = accessTimes.length / hoursSpan;
225
+ // Promote if accessed more than once per hour
226
+ if (frequency > 1 && entry.tier === 'warm') {
227
+ entry.tier = 'hot';
228
+ this.memory.warm = this.memory.warm.filter(e => e.id !== entry.id);
229
+ this.memory.hot.unshift(entry);
230
+ this.rebalance();
231
+ }
232
+ else if (frequency > 0.5 && entry.tier === 'cold') {
233
+ entry.tier = 'warm';
234
+ this.memory.cold = this.memory.cold.filter(e => e.id !== entry.id);
235
+ this.memory.warm.unshift(entry);
236
+ this.rebalance();
237
+ }
238
+ }
239
+ }
240
+ /**
241
+ * Find entry across all tiers
242
+ */
243
+ findEntry(id) {
244
+ for (const tier of ['hot', 'warm', 'cold']) {
245
+ const entry = this.memory[tier].find(e => e.id === id);
246
+ if (entry)
247
+ return entry;
248
+ }
249
+ return null;
250
+ }
251
+ /**
252
+ * Simple text similarity (Jaccard on words)
253
+ */
254
+ textSimilarity(a, b) {
255
+ const wordsA = new Set(a.toLowerCase().split(/\W+/).filter(w => w.length > 2));
256
+ const wordsB = new Set(b.toLowerCase().split(/\W+/).filter(w => w.length > 2));
257
+ const intersection = new Set([...wordsA].filter(x => wordsB.has(x)));
258
+ const union = new Set([...wordsA, ...wordsB]);
259
+ return intersection.size / (union.size || 1);
260
+ }
261
+ /**
262
+ * Get stats about memory usage
263
+ */
264
+ getStats() {
265
+ const hotTokens = this.memory.hot.reduce((sum, e) => sum + estimateTokens(e.content), 0);
266
+ const warmTokens = this.memory.warm.reduce((sum, e) => sum + estimateTokens(e.content), 0);
267
+ const coldTokens = this.memory.cold.reduce((sum, e) => sum + estimateTokens(e.compressed || e.content), 0);
268
+ return {
269
+ hot: { count: this.memory.hot.length, tokens: hotTokens },
270
+ warm: { count: this.memory.warm.length, tokens: warmTokens },
271
+ cold: { count: this.memory.cold.length, tokens: coldTokens },
272
+ total: {
273
+ count: this.memory.hot.length + this.memory.warm.length + this.memory.cold.length,
274
+ tokens: hotTokens + warmTokens + coldTokens,
275
+ },
276
+ };
277
+ }
278
+ /**
279
+ * Export all memories (for persistence)
280
+ */
281
+ export() {
282
+ return { ...this.memory };
283
+ }
284
+ /**
285
+ * Import memories (for initialization)
286
+ */
287
+ import(data) {
288
+ this.memory = { ...data };
289
+ }
290
+ }
291
+ // Singleton instance
292
+ let globalManager = null;
293
+ export function getHierarchicalMemoryManager(config) {
294
+ if (!globalManager) {
295
+ globalManager = new HierarchicalMemoryManager(config);
296
+ }
297
+ return globalManager;
298
+ }
299
+ //# sourceMappingURL=hierarchical-memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hierarchical-memory.js","sourceRoot":"","sources":["../../src/memory/hierarchical-memory.ts"],"names":[],"mappings":"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"}
@@ -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"}