@agent-relay/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.
@@ -0,0 +1,453 @@
1
+ /**
2
+ * Context Compaction for Long Agent Sessions
3
+ *
4
+ * Manages conversation context to prevent token limit exhaustion.
5
+ * Provides token counting, message summarization, and context pruning.
6
+ *
7
+ * Inspired by russian-code-ts context management targets:
8
+ * - Token estimation: <20ms
9
+ * - Embeddings-based semantic search for relevant context
10
+ *
11
+ * Strategies:
12
+ * 1. Fast token estimation (character-based heuristic)
13
+ * 2. Importance-weighted message retention
14
+ * 3. Sliding window with summary injection
15
+ * 4. Semantic deduplication of similar messages
16
+ */
17
+ // =============================================================================
18
+ // Default Configuration
19
+ // =============================================================================
20
+ const DEFAULT_CONFIG = {
21
+ maxTokens: 100000, // 100k tokens (Claude's typical limit)
22
+ targetUsage: 0.7, // Target 70% after compaction
23
+ compactionThreshold: 0.85, // Trigger at 85% usage
24
+ minImportanceRetain: 30, // Keep messages with importance >= 30
25
+ keepRecentCount: 10, // Always keep last 10 messages
26
+ enableSummarization: true,
27
+ enableDeduplication: true,
28
+ deduplicationThreshold: 0.85,
29
+ };
30
+ // =============================================================================
31
+ // Token Estimation
32
+ // =============================================================================
33
+ /**
34
+ * Fast token estimation using character-based heuristic.
35
+ * Targets <20ms latency for large texts.
36
+ *
37
+ * Heuristic: ~4 characters per token for English text.
38
+ * Adjusts for code (more tokens per char) and whitespace.
39
+ */
40
+ export function estimateTokens(text) {
41
+ if (!text)
42
+ return 0;
43
+ const length = text.length;
44
+ // Fast path for short texts
45
+ if (length < 100) {
46
+ return Math.ceil(length / 3.5);
47
+ }
48
+ // Sample-based estimation for longer texts
49
+ // Count different character types in sample
50
+ const sampleSize = Math.min(1000, length);
51
+ const sample = text.substring(0, sampleSize);
52
+ let codeChars = 0;
53
+ let whitespaceChars = 0;
54
+ let _punctuationChars = 0;
55
+ for (let i = 0; i < sample.length; i++) {
56
+ const char = sample[i];
57
+ if (/\s/.test(char)) {
58
+ whitespaceChars++;
59
+ }
60
+ else if (/[{}[\]();:,.<>!=+\-*/&|^~`@#$%]/.test(char)) {
61
+ _punctuationChars++;
62
+ codeChars++;
63
+ }
64
+ }
65
+ const codeRatio = codeChars / sampleSize;
66
+ const whitespaceRatio = whitespaceChars / sampleSize;
67
+ // Adjust chars per token based on content type
68
+ // Heuristics based on tokenization patterns:
69
+ // - Base prose: ~4 chars/token (average English text)
70
+ // - Code: ~3 chars/token (more tokens due to symbols/structure)
71
+ // - High whitespace: ~3.5 chars/token (more word boundaries = more tokens)
72
+ const baseCharsPerToken = 4;
73
+ const codeAdjustment = codeRatio * 1.5; // Code reduces chars/token (more tokens)
74
+ const whitespaceAdjustment = whitespaceRatio * 0.5; // Whitespace reduces chars/token (more word boundaries)
75
+ const charsPerToken = baseCharsPerToken - codeAdjustment - whitespaceAdjustment;
76
+ const adjustedCharsPerToken = Math.max(2.5, Math.min(5, charsPerToken));
77
+ return Math.ceil(length / adjustedCharsPerToken);
78
+ }
79
+ /**
80
+ * Estimate tokens for a message (uses caching).
81
+ */
82
+ export function estimateMessageTokens(message) {
83
+ if (message.tokenCount !== undefined) {
84
+ return message.tokenCount;
85
+ }
86
+ // Role overhead: ~4 tokens for role markers
87
+ const roleOverhead = 4;
88
+ const contentTokens = estimateTokens(message.content);
89
+ message.tokenCount = roleOverhead + contentTokens;
90
+ return message.tokenCount;
91
+ }
92
+ /**
93
+ * Estimate tokens for entire context.
94
+ */
95
+ export function estimateContextTokens(messages) {
96
+ let total = 0;
97
+ for (const msg of messages) {
98
+ total += estimateMessageTokens(msg);
99
+ }
100
+ // Add overhead for message separators (~2 tokens per message)
101
+ total += messages.length * 2;
102
+ return total;
103
+ }
104
+ // =============================================================================
105
+ // Importance Scoring
106
+ // =============================================================================
107
+ /**
108
+ * Calculate importance score for a message.
109
+ * Higher scores = more important to retain.
110
+ */
111
+ export function calculateImportance(message, index, total) {
112
+ let score = 50; // Base score
113
+ // Recency bonus (0-20 points)
114
+ const recencyRatio = index / total;
115
+ score += recencyRatio * 20;
116
+ // System messages are important
117
+ if (message.role === 'system') {
118
+ score += 30;
119
+ }
120
+ // Check for important content patterns
121
+ const content = message.content.toLowerCase();
122
+ // Task-related keywords
123
+ if (/\b(todo|task|implement|fix|bug|error|important|critical|urgent)\b/.test(content)) {
124
+ score += 15;
125
+ }
126
+ // Code blocks are often important context
127
+ if (/```[\s\S]*```/.test(message.content)) {
128
+ score += 10;
129
+ }
130
+ // Questions that might need answers retained
131
+ if (/\?/.test(content) && message.role === 'user') {
132
+ score += 10;
133
+ }
134
+ // Acknowledgments and status updates can be lower priority
135
+ if (/^(ok|ack|got it|understood|done|completed)/i.test(content)) {
136
+ score -= 20;
137
+ }
138
+ // Very short messages are usually less important
139
+ if (message.content.length < 50) {
140
+ score -= 10;
141
+ }
142
+ // Summaries should be kept
143
+ if (message.isSummary) {
144
+ score += 25;
145
+ }
146
+ // User-specified importance overrides
147
+ if (message.importance !== undefined) {
148
+ score = (score + message.importance) / 2;
149
+ }
150
+ return Math.max(0, Math.min(100, score));
151
+ }
152
+ // =============================================================================
153
+ // Similarity Detection
154
+ // =============================================================================
155
+ /**
156
+ * Simple similarity score between two strings (Jaccard on word set).
157
+ * Returns 0-1 where 1 = identical.
158
+ */
159
+ export function calculateSimilarity(a, b) {
160
+ const wordsA = new Set(a.toLowerCase().split(/\s+/).filter(w => w.length > 2));
161
+ const wordsB = new Set(b.toLowerCase().split(/\s+/).filter(w => w.length > 2));
162
+ if (wordsA.size === 0 || wordsB.size === 0) {
163
+ return 0;
164
+ }
165
+ let intersection = 0;
166
+ for (const word of wordsA) {
167
+ if (wordsB.has(word)) {
168
+ intersection++;
169
+ }
170
+ }
171
+ const union = wordsA.size + wordsB.size - intersection;
172
+ return intersection / union;
173
+ }
174
+ /**
175
+ * Find duplicate/similar messages.
176
+ */
177
+ export function findDuplicates(messages, threshold = 0.85) {
178
+ const duplicates = new Map();
179
+ for (let i = 0; i < messages.length; i++) {
180
+ for (let j = i + 1; j < messages.length; j++) {
181
+ const similarity = calculateSimilarity(messages[i].content, messages[j].content);
182
+ if (similarity >= threshold) {
183
+ const key = messages[i].id;
184
+ const existing = duplicates.get(key) ?? [];
185
+ existing.push(messages[j].id);
186
+ duplicates.set(key, existing);
187
+ }
188
+ }
189
+ }
190
+ return duplicates;
191
+ }
192
+ // =============================================================================
193
+ // Summarization
194
+ // =============================================================================
195
+ /**
196
+ * Create a summary of multiple messages.
197
+ * This is a simple extractive summary - in production, use an LLM.
198
+ */
199
+ export function createSummary(messages) {
200
+ const messageCount = messages.length;
201
+ const roles = new Set(messages.map(m => m.role));
202
+ const threads = new Set(messages.filter(m => m.thread).map(m => m.thread));
203
+ // Extract key sentences (first sentence of each message, or first 100 chars)
204
+ const keyPoints = [];
205
+ for (const msg of messages.slice(0, 5)) { // Take up to 5 key points
206
+ const firstSentence = msg.content.split(/[.!?]\s/)[0];
207
+ if (firstSentence && firstSentence.length < 200) {
208
+ keyPoints.push(`- ${firstSentence}`);
209
+ }
210
+ }
211
+ const content = [
212
+ `[Summary of ${messageCount} messages]`,
213
+ `Participants: ${Array.from(roles).join(', ')}`,
214
+ threads.size > 0 ? `Threads: ${Array.from(threads).join(', ')}` : '',
215
+ 'Key points:',
216
+ ...keyPoints,
217
+ `[End summary]`,
218
+ ].filter(Boolean).join('\n');
219
+ return {
220
+ id: `summary_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`,
221
+ role: 'system',
222
+ content,
223
+ timestamp: Date.now(),
224
+ importance: 70,
225
+ isSummary: true,
226
+ summarizes: messages.map(m => m.id),
227
+ };
228
+ }
229
+ // =============================================================================
230
+ // Context Compaction
231
+ // =============================================================================
232
+ /**
233
+ * Context compaction manager.
234
+ */
235
+ export class ContextCompactor {
236
+ config;
237
+ constructor(config = {}) {
238
+ this.config = { ...DEFAULT_CONFIG, ...config };
239
+ }
240
+ /**
241
+ * Get current context window status.
242
+ */
243
+ getContextWindow(messages) {
244
+ const totalTokens = estimateContextTokens(messages);
245
+ return {
246
+ messages,
247
+ totalTokens,
248
+ maxTokens: this.config.maxTokens,
249
+ usagePercent: totalTokens / this.config.maxTokens,
250
+ };
251
+ }
252
+ /**
253
+ * Check if compaction is needed.
254
+ */
255
+ needsCompaction(messages) {
256
+ const window = this.getContextWindow(messages);
257
+ return window.usagePercent >= this.config.compactionThreshold;
258
+ }
259
+ /**
260
+ * Perform context compaction.
261
+ */
262
+ compact(messages) {
263
+ const window = this.getContextWindow(messages);
264
+ // No compaction needed
265
+ if (window.usagePercent < this.config.compactionThreshold) {
266
+ return {
267
+ messages,
268
+ messagesRemoved: 0,
269
+ tokensSaved: 0,
270
+ strategy: 'none',
271
+ };
272
+ }
273
+ const targetTokens = Math.floor(this.config.maxTokens * this.config.targetUsage);
274
+ let result = [...messages];
275
+ let strategy = 'none';
276
+ const originalTokens = window.totalTokens;
277
+ // Calculate importance for all messages
278
+ const importanceMap = new Map();
279
+ for (let i = 0; i < result.length; i++) {
280
+ importanceMap.set(result[i].id, calculateImportance(result[i], i, result.length));
281
+ }
282
+ // Strategy 1: Deduplicate similar messages
283
+ if (this.config.enableDeduplication) {
284
+ const duplicates = findDuplicates(result, this.config.deduplicationThreshold);
285
+ if (duplicates.size > 0) {
286
+ const toRemove = new Set();
287
+ for (const [, dups] of duplicates) {
288
+ for (const id of dups) {
289
+ toRemove.add(id);
290
+ }
291
+ }
292
+ result = result.filter(m => !toRemove.has(m.id));
293
+ if (toRemove.size > 0) {
294
+ strategy = 'deduplicate';
295
+ }
296
+ }
297
+ }
298
+ // Check if we've met target
299
+ if (estimateContextTokens(result) <= targetTokens) {
300
+ return {
301
+ messages: result,
302
+ messagesRemoved: messages.length - result.length,
303
+ tokensSaved: originalTokens - estimateContextTokens(result),
304
+ strategy,
305
+ };
306
+ }
307
+ // Strategy 2: Remove low-importance messages (keep recent)
308
+ const recentIds = new Set(result.slice(-this.config.keepRecentCount).map(m => m.id));
309
+ result = result.filter(m => {
310
+ if (recentIds.has(m.id))
311
+ return true;
312
+ if (m.isSummary)
313
+ return true;
314
+ if (m.role === 'system')
315
+ return true;
316
+ const importance = importanceMap.get(m.id) ?? 50;
317
+ return importance >= this.config.minImportanceRetain;
318
+ });
319
+ if (result.length < messages.length) {
320
+ strategy = 'trim_low_importance';
321
+ }
322
+ // Check if we've met target
323
+ if (estimateContextTokens(result) <= targetTokens) {
324
+ return {
325
+ messages: result,
326
+ messagesRemoved: messages.length - result.length,
327
+ tokensSaved: originalTokens - estimateContextTokens(result),
328
+ strategy,
329
+ };
330
+ }
331
+ // Strategy 3: Summarize old messages
332
+ if (this.config.enableSummarization) {
333
+ const messagesToSummarize = result.slice(0, -this.config.keepRecentCount)
334
+ .filter(m => !m.isSummary && m.role !== 'system');
335
+ if (messagesToSummarize.length >= 3) {
336
+ const summary = createSummary(messagesToSummarize);
337
+ const summaryIds = new Set(messagesToSummarize.map(m => m.id));
338
+ result = [
339
+ summary,
340
+ ...result.filter(m => !summaryIds.has(m.id)),
341
+ ];
342
+ strategy = 'summarize';
343
+ return {
344
+ messages: result,
345
+ messagesRemoved: messages.length - result.length,
346
+ tokensSaved: originalTokens - estimateContextTokens(result),
347
+ summaryAdded: summary,
348
+ strategy,
349
+ };
350
+ }
351
+ }
352
+ // Strategy 4: Aggressive trim (last resort)
353
+ while (estimateContextTokens(result) > targetTokens && result.length > this.config.keepRecentCount + 1) {
354
+ // Remove oldest non-system, non-summary message
355
+ const removeIndex = result.findIndex(m => !m.isSummary && m.role !== 'system');
356
+ if (removeIndex === -1)
357
+ break;
358
+ result.splice(removeIndex, 1);
359
+ }
360
+ strategy = 'aggressive';
361
+ return {
362
+ messages: result,
363
+ messagesRemoved: messages.length - result.length,
364
+ tokensSaved: originalTokens - estimateContextTokens(result),
365
+ strategy,
366
+ };
367
+ }
368
+ /**
369
+ * Add a message to context with automatic compaction if needed.
370
+ */
371
+ addMessage(messages, newMessage) {
372
+ const updated = [...messages, newMessage];
373
+ if (this.needsCompaction(updated)) {
374
+ const result = this.compact(updated);
375
+ return {
376
+ messages: result.messages,
377
+ compacted: true,
378
+ result,
379
+ };
380
+ }
381
+ return {
382
+ messages: updated,
383
+ compacted: false,
384
+ };
385
+ }
386
+ /**
387
+ * Get token budget remaining.
388
+ */
389
+ getTokenBudget(messages) {
390
+ const used = estimateContextTokens(messages);
391
+ return {
392
+ used,
393
+ remaining: this.config.maxTokens - used,
394
+ percentUsed: (used / this.config.maxTokens) * 100,
395
+ };
396
+ }
397
+ }
398
+ // =============================================================================
399
+ // Factory Function
400
+ // =============================================================================
401
+ /**
402
+ * Create a context compactor with the given configuration.
403
+ */
404
+ export function createContextCompactor(config) {
405
+ return new ContextCompactor(config);
406
+ }
407
+ // =============================================================================
408
+ // Utilities
409
+ // =============================================================================
410
+ /**
411
+ * Format token count for display.
412
+ */
413
+ export function formatTokenCount(tokens) {
414
+ if (tokens >= 1000000) {
415
+ return `${(tokens / 1000000).toFixed(1)}M`;
416
+ }
417
+ if (tokens >= 1000) {
418
+ return `${(tokens / 1000).toFixed(1)}k`;
419
+ }
420
+ return tokens.toString();
421
+ }
422
+ /**
423
+ * Benchmark token estimation performance.
424
+ */
425
+ export function benchmarkTokenEstimation(iterations = 10000) {
426
+ const testTexts = [
427
+ 'Hello world',
428
+ 'This is a longer piece of text that contains multiple sentences and should take more time to process.',
429
+ '```typescript\nfunction hello() {\n console.log("Hello");\n}\n```',
430
+ 'A'.repeat(10000), // 10k chars
431
+ ];
432
+ let maxNs = 0;
433
+ let totalTokens = 0;
434
+ const start = process.hrtime.bigint();
435
+ for (let i = 0; i < iterations; i++) {
436
+ for (const text of testTexts) {
437
+ const s = process.hrtime.bigint();
438
+ const tokens = estimateTokens(text);
439
+ totalTokens += tokens;
440
+ const elapsed = Number(process.hrtime.bigint() - s);
441
+ if (elapsed > maxNs)
442
+ maxNs = elapsed;
443
+ }
444
+ }
445
+ const totalNs = Number(process.hrtime.bigint() - start);
446
+ const totalMs = totalNs / 1_000_000;
447
+ return {
448
+ avgNs: totalNs / (iterations * testTexts.length),
449
+ maxNs,
450
+ tokensPerMs: totalTokens / totalMs,
451
+ };
452
+ }
453
+ //# sourceMappingURL=context-compaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-compaction.js","sourceRoot":"","sources":["../src/context-compaction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAsEH,gFAAgF;AAChF,wBAAwB;AACxB,gFAAgF;AAEhF,MAAM,cAAc,GAAqB;IACvC,SAAS,EAAE,MAAM,EAAQ,uCAAuC;IAChE,WAAW,EAAE,GAAG,EAAS,8BAA8B;IACvD,mBAAmB,EAAE,IAAI,EAAE,uBAAuB;IAClD,mBAAmB,EAAE,EAAE,EAAE,sCAAsC;IAC/D,eAAe,EAAE,EAAE,EAAM,+BAA+B;IACxD,mBAAmB,EAAE,IAAI;IACzB,mBAAmB,EAAE,IAAI;IACzB,sBAAsB,EAAE,IAAI;CAC7B,CAAC;AAEF,gFAAgF;AAChF,mBAAmB;AACnB,gFAAgF;AAEhF;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,CAAC;IAEpB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAE3B,4BAA4B;IAC5B,IAAI,MAAM,GAAG,GAAG,EAAE,CAAC;QACjB,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;IACjC,CAAC;IAED,2CAA2C;IAC3C,4CAA4C;IAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IAE7C,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAE1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACpB,eAAe,EAAE,CAAC;QACpB,CAAC;aAAM,IAAI,iCAAiC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACxD,iBAAiB,EAAE,CAAC;YACpB,SAAS,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;IACzC,MAAM,eAAe,GAAG,eAAe,GAAG,UAAU,CAAC;IAErD,+CAA+C;IAC/C,6CAA6C;IAC7C,sDAAsD;IACtD,gEAAgE;IAChE,2EAA2E;IAC3E,MAAM,iBAAiB,GAAG,CAAC,CAAC;IAC5B,MAAM,cAAc,GAAG,SAAS,GAAG,GAAG,CAAC,CAAC,yCAAyC;IACjF,MAAM,oBAAoB,GAAG,eAAe,GAAG,GAAG,CAAC,CAAC,wDAAwD;IAE5G,MAAM,aAAa,GAAG,iBAAiB,GAAG,cAAc,GAAG,oBAAoB,CAAC;IAChF,MAAM,qBAAqB,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;IAExE,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,qBAAqB,CAAC,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACrC,OAAO,OAAO,CAAC,UAAU,CAAC;IAC5B,CAAC;IAED,4CAA4C;IAC5C,MAAM,YAAY,GAAG,CAAC,CAAC;IACvB,MAAM,aAAa,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAEtD,OAAO,CAAC,UAAU,GAAG,YAAY,GAAG,aAAa,CAAC;IAClD,OAAO,OAAO,CAAC,UAAU,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAmB;IACvD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,KAAK,IAAI,qBAAqB,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC;IACD,8DAA8D;IAC9D,KAAK,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IAC7B,OAAO,KAAK,CAAC;AACf,CAAC;AAED,gFAAgF;AAChF,qBAAqB;AACrB,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAgB,EAAE,KAAa,EAAE,KAAa;IAChF,IAAI,KAAK,GAAG,EAAE,CAAC,CAAC,aAAa;IAE7B,8BAA8B;IAC9B,MAAM,YAAY,GAAG,KAAK,GAAG,KAAK,CAAC;IACnC,KAAK,IAAI,YAAY,GAAG,EAAE,CAAC;IAE3B,gCAAgC;IAChC,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC9B,KAAK,IAAI,EAAE,CAAC;IACd,CAAC;IAED,uCAAuC;IACvC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;IAE9C,wBAAwB;IACxB,IAAI,mEAAmE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACtF,KAAK,IAAI,EAAE,CAAC;IACd,CAAC;IAED,0CAA0C;IAC1C,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1C,KAAK,IAAI,EAAE,CAAC;IACd,CAAC;IAED,6CAA6C;IAC7C,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAClD,KAAK,IAAI,EAAE,CAAC;IACd,CAAC;IAED,2DAA2D;IAC3D,IAAI,6CAA6C,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAChE,KAAK,IAAI,EAAE,CAAC;IACd,CAAC;IAED,iDAAiD;IACjD,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QAChC,KAAK,IAAI,EAAE,CAAC;IACd,CAAC;IAED,2BAA2B;IAC3B,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtB,KAAK,IAAI,EAAE,CAAC;IACd,CAAC;IAED,sCAAsC;IACtC,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACrC,KAAK,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,gFAAgF;AAChF,uBAAuB;AACvB,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,CAAS,EAAE,CAAS;IACtD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IAC/E,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IAE/E,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC1B,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,YAAY,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,GAAG,YAAY,CAAC;IACvD,OAAO,YAAY,GAAG,KAAK,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAC5B,QAAmB,EACnB,YAAoB,IAAI;IAExB,MAAM,UAAU,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,MAAM,UAAU,GAAG,mBAAmB,CACpC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,EACnB,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CACpB,CAAC;YAEF,IAAI,UAAU,IAAI,SAAS,EAAE,CAAC;gBAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3B,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC3C,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC9B,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,gFAAgF;AAChF,gBAAgB;AAChB,gFAAgF;AAEhF;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,QAAmB;IAC/C,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC;IACrC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAE3E,6EAA6E;IAC7E,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,0BAA0B;QAClE,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,IAAI,aAAa,IAAI,aAAa,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YAChD,SAAS,CAAC,IAAI,CAAC,KAAK,aAAa,EAAE,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG;QACd,eAAe,YAAY,YAAY;QACvC,iBAAiB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QAC/C,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;QACpE,aAAa;QACb,GAAG,SAAS;QACZ,eAAe;KAChB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE7B,OAAO;QACL,EAAE,EAAE,WAAW,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;QACzE,IAAI,EAAE,QAAQ;QACd,OAAO;QACP,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,UAAU,EAAE,EAAE;QACd,SAAS,EAAE,IAAI;QACf,UAAU,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpC,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,qBAAqB;AACrB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,OAAO,gBAAgB;IACnB,MAAM,CAAmB;IAEjC,YAAY,SAAoC,EAAE;QAChD,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;IACjD,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,QAAmB;QAClC,MAAM,WAAW,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QACpD,OAAO;YACL,QAAQ;YACR,WAAW;YACX,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;YAChC,YAAY,EAAE,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS;SAClD,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,QAAmB;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC/C,OAAO,MAAM,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC;IAChE,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,QAAmB;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAE/C,uBAAuB;QACvB,IAAI,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;YAC1D,OAAO;gBACL,QAAQ;gBACR,eAAe,EAAE,CAAC;gBAClB,WAAW,EAAE,CAAC;gBACd,QAAQ,EAAE,MAAM;aACjB,CAAC;QACJ,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QACjF,IAAI,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;QAC3B,IAAI,QAAQ,GAAuB,MAAM,CAAC;QAC1C,MAAM,cAAc,GAAG,MAAM,CAAC,WAAW,CAAC;QAE1C,wCAAwC;QACxC,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;QAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QACpF,CAAC;QAED,2CAA2C;QAC3C,IAAI,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;YACpC,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;YAC9E,IAAI,UAAU,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBACxB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;gBACnC,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,IAAI,UAAU,EAAE,CAAC;oBAClC,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;wBACtB,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBACnB,CAAC;gBACH,CAAC;gBACD,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACjD,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;oBACtB,QAAQ,GAAG,aAAa,CAAC;gBAC3B,CAAC;YACH,CAAC;QACH,CAAC;QAED,4BAA4B;QAC5B,IAAI,qBAAqB,CAAC,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;YAClD,OAAO;gBACL,QAAQ,EAAE,MAAM;gBAChB,eAAe,EAAE,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM;gBAChD,WAAW,EAAE,cAAc,GAAG,qBAAqB,CAAC,MAAM,CAAC;gBAC3D,QAAQ;aACT,CAAC;QACJ,CAAC;QAED,2DAA2D;QAC3D,MAAM,SAAS,GAAG,IAAI,GAAG,CACvB,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAC1D,CAAC;QAEF,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;YACzB,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAAE,OAAO,IAAI,CAAC;YACrC,IAAI,CAAC,CAAC,SAAS;gBAAE,OAAO,IAAI,CAAC;YAC7B,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAC;YACrC,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;YACjD,OAAO,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;YACpC,QAAQ,GAAG,qBAAqB,CAAC;QACnC,CAAC;QAED,4BAA4B;QAC5B,IAAI,qBAAqB,CAAC,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;YAClD,OAAO;gBACL,QAAQ,EAAE,MAAM;gBAChB,eAAe,EAAE,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM;gBAChD,WAAW,EAAE,cAAc,GAAG,qBAAqB,CAAC,MAAM,CAAC;gBAC3D,QAAQ;aACT,CAAC;QACJ,CAAC;QAED,qCAAqC;QACrC,IAAI,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;YACpC,MAAM,mBAAmB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;iBACtE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YAEpD,IAAI,mBAAmB,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBACpC,MAAM,OAAO,GAAG,aAAa,CAAC,mBAAmB,CAAC,CAAC;gBACnD,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAE/D,MAAM,GAAG;oBACP,OAAO;oBACP,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;iBAC7C,CAAC;gBAEF,QAAQ,GAAG,WAAW,CAAC;gBAEvB,OAAO;oBACL,QAAQ,EAAE,MAAM;oBAChB,eAAe,EAAE,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM;oBAChD,WAAW,EAAE,cAAc,GAAG,qBAAqB,CAAC,MAAM,CAAC;oBAC3D,YAAY,EAAE,OAAO;oBACrB,QAAQ;iBACT,CAAC;YACJ,CAAC;QACH,CAAC;QAED,4CAA4C;QAC5C,OAAO,qBAAqB,CAAC,MAAM,CAAC,GAAG,YAAY,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;YACvG,gDAAgD;YAChD,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;YAC/E,IAAI,WAAW,KAAK,CAAC,CAAC;gBAAE,MAAM;YAC9B,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAChC,CAAC;QAED,QAAQ,GAAG,YAAY,CAAC;QAExB,OAAO;YACL,QAAQ,EAAE,MAAM;YAChB,eAAe,EAAE,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM;YAChD,WAAW,EAAE,cAAc,GAAG,qBAAqB,CAAC,MAAM,CAAC;YAC3D,QAAQ;SACT,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,UAAU,CACR,QAAmB,EACnB,UAAmB;QAEnB,MAAM,OAAO,GAAG,CAAC,GAAG,QAAQ,EAAE,UAAU,CAAC,CAAC;QAE1C,IAAI,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACrC,OAAO;gBACL,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,SAAS,EAAE,IAAI;gBACf,MAAM;aACP,CAAC;QACJ,CAAC;QAED,OAAO;YACL,QAAQ,EAAE,OAAO;YACjB,SAAS,EAAE,KAAK;SACjB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,QAAmB;QAKhC,MAAM,IAAI,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;QAC7C,OAAO;YACL,IAAI;YACJ,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI;YACvC,WAAW,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,GAAG;SAClD,CAAC;IACJ,CAAC;CACF;AAED,gFAAgF;AAChF,mBAAmB;AACnB,gFAAgF;AAEhF;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAkC;IACvE,OAAO,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;AACtC,CAAC;AAED,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,IAAI,MAAM,IAAI,OAAO,EAAE,CAAC;QACtB,OAAO,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC7C,CAAC;IACD,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;QACnB,OAAO,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC1C,CAAC;IACD,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,aAAqB,KAAK;IAKjE,MAAM,SAAS,GAAG;QAChB,aAAa;QACb,uGAAuG;QACvG,oEAAoE;QACpE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,YAAY;KAChC,CAAC;IAEF,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;IAEtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;YACpC,WAAW,IAAI,MAAM,CAAC;YACtB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;YACpD,IAAI,OAAO,GAAG,KAAK;gBAAE,KAAK,GAAG,OAAO,CAAC;QACvC,CAAC;IACH,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;IAEpC,OAAO;QACL,KAAK,EAAE,OAAO,GAAG,CAAC,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC;QAChD,KAAK;QACL,WAAW,EAAE,WAAW,GAAG,OAAO;KACnC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Memory Adapter Factory
3
+ *
4
+ * Creates memory adapters based on configuration.
5
+ * Supports environment variables for configuration.
6
+ */
7
+ import type { MemoryAdapter, MemoryConfig } from './types.js';
8
+ /**
9
+ * Get memory configuration from environment variables
10
+ *
11
+ * Environment variables:
12
+ * - AGENT_RELAY_MEMORY_TYPE: 'inmemory', 'supermemory', 'claude'
13
+ * - AGENT_RELAY_MEMORY_API_KEY: API key for external services
14
+ * - AGENT_RELAY_MEMORY_ENDPOINT: Custom API endpoint
15
+ * - SUPERMEMORY_API_KEY: Supermemory-specific API key (fallback)
16
+ */
17
+ export declare function getMemoryConfigFromEnv(): MemoryConfig;
18
+ /**
19
+ * Create a memory adapter based on configuration
20
+ *
21
+ * @param config - Memory configuration (merged with env vars)
22
+ * @returns Initialized memory adapter
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * // Use environment variables
27
+ * const memory = await createMemoryAdapter();
28
+ *
29
+ * // Explicit configuration
30
+ * const memory = await createMemoryAdapter({
31
+ * type: 'supermemory',
32
+ * apiKey: 'my-api-key',
33
+ * });
34
+ * ```
35
+ */
36
+ export declare function createMemoryAdapter(config?: Partial<MemoryConfig>): Promise<MemoryAdapter>;
37
+ /**
38
+ * Check if a memory adapter type is available
39
+ *
40
+ * @param type - Adapter type to check
41
+ * @returns Whether the adapter is available
42
+ */
43
+ export declare function isMemoryAdapterAvailable(type: string): boolean;
44
+ /**
45
+ * Get list of available memory adapter types
46
+ */
47
+ export declare function getAvailableMemoryAdapters(): string[];
48
+ //# sourceMappingURL=factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI9D;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,IAAI,YAAY,CAarD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAC7B,OAAO,CAAC,aAAa,CAAC,CAoExB;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAyB9D;AAED;;GAEG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,EAAE,CAQrD"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Memory Adapter Factory
3
+ *
4
+ * Creates memory adapters based on configuration.
5
+ * Supports environment variables for configuration.
6
+ */
7
+ import { InMemoryAdapter } from './adapters/inmemory.js';
8
+ import { SupermemoryAdapter } from './adapters/supermemory.js';
9
+ /**
10
+ * Get memory configuration from environment variables
11
+ *
12
+ * Environment variables:
13
+ * - AGENT_RELAY_MEMORY_TYPE: 'inmemory', 'supermemory', 'claude'
14
+ * - AGENT_RELAY_MEMORY_API_KEY: API key for external services
15
+ * - AGENT_RELAY_MEMORY_ENDPOINT: Custom API endpoint
16
+ * - SUPERMEMORY_API_KEY: Supermemory-specific API key (fallback)
17
+ */
18
+ export function getMemoryConfigFromEnv() {
19
+ const type = process.env.AGENT_RELAY_MEMORY_TYPE ?? 'inmemory';
20
+ const apiKey = process.env.AGENT_RELAY_MEMORY_API_KEY ??
21
+ process.env.SUPERMEMORY_API_KEY;
22
+ return {
23
+ type,
24
+ apiKey,
25
+ endpoint: process.env.AGENT_RELAY_MEMORY_ENDPOINT,
26
+ defaultAgentId: process.env.AGENT_RELAY_AGENT_ID,
27
+ defaultProjectId: process.env.AGENT_RELAY_PROJECT_ID,
28
+ };
29
+ }
30
+ /**
31
+ * Create a memory adapter based on configuration
32
+ *
33
+ * @param config - Memory configuration (merged with env vars)
34
+ * @returns Initialized memory adapter
35
+ *
36
+ * @example
37
+ * ```typescript
38
+ * // Use environment variables
39
+ * const memory = await createMemoryAdapter();
40
+ *
41
+ * // Explicit configuration
42
+ * const memory = await createMemoryAdapter({
43
+ * type: 'supermemory',
44
+ * apiKey: 'my-api-key',
45
+ * });
46
+ * ```
47
+ */
48
+ export async function createMemoryAdapter(config) {
49
+ // Merge with environment config
50
+ const envConfig = getMemoryConfigFromEnv();
51
+ const finalConfig = {
52
+ type: config?.type ?? envConfig.type ?? 'inmemory',
53
+ apiKey: config?.apiKey ?? envConfig.apiKey,
54
+ endpoint: config?.endpoint ?? envConfig.endpoint,
55
+ defaultAgentId: config?.defaultAgentId ?? envConfig.defaultAgentId,
56
+ defaultProjectId: config?.defaultProjectId ?? envConfig.defaultProjectId,
57
+ options: { ...envConfig.options, ...config?.options },
58
+ };
59
+ const adapterType = finalConfig.type.toLowerCase();
60
+ let adapter;
61
+ switch (adapterType) {
62
+ case 'supermemory':
63
+ case 'supermemory.ai': {
64
+ if (!finalConfig.apiKey) {
65
+ throw new Error('Supermemory adapter requires an API key. ' +
66
+ 'Set AGENT_RELAY_MEMORY_API_KEY or SUPERMEMORY_API_KEY environment variable, ' +
67
+ 'or provide apiKey in config.');
68
+ }
69
+ adapter = new SupermemoryAdapter({
70
+ apiKey: finalConfig.apiKey,
71
+ endpoint: finalConfig.endpoint,
72
+ defaultAgentId: finalConfig.defaultAgentId,
73
+ defaultProjectId: finalConfig.defaultProjectId,
74
+ container: finalConfig.options?.container,
75
+ timeout: finalConfig.options?.timeout,
76
+ });
77
+ break;
78
+ }
79
+ case 'claude':
80
+ case 'claude-memory': {
81
+ // Claude memory is not yet available as a public API
82
+ // Fall back to in-memory with a warning
83
+ console.warn('[memory] Claude memory adapter not yet available. ' +
84
+ 'Using in-memory adapter as fallback.');
85
+ adapter = new InMemoryAdapter({
86
+ defaultAgentId: finalConfig.defaultAgentId,
87
+ defaultProjectId: finalConfig.defaultProjectId,
88
+ maxMemories: finalConfig.options?.maxMemories,
89
+ });
90
+ break;
91
+ }
92
+ case 'inmemory':
93
+ case 'memory':
94
+ case 'none':
95
+ default: {
96
+ adapter = new InMemoryAdapter({
97
+ defaultAgentId: finalConfig.defaultAgentId,
98
+ defaultProjectId: finalConfig.defaultProjectId,
99
+ maxMemories: finalConfig.options?.maxMemories,
100
+ });
101
+ break;
102
+ }
103
+ }
104
+ await adapter.init();
105
+ return adapter;
106
+ }
107
+ /**
108
+ * Check if a memory adapter type is available
109
+ *
110
+ * @param type - Adapter type to check
111
+ * @returns Whether the adapter is available
112
+ */
113
+ export function isMemoryAdapterAvailable(type) {
114
+ const adapterType = type.toLowerCase();
115
+ switch (adapterType) {
116
+ case 'inmemory':
117
+ case 'memory':
118
+ case 'none':
119
+ return true;
120
+ case 'supermemory':
121
+ case 'supermemory.ai':
122
+ // Available if API key is configured
123
+ return !!(process.env.AGENT_RELAY_MEMORY_API_KEY ||
124
+ process.env.SUPERMEMORY_API_KEY);
125
+ case 'claude':
126
+ case 'claude-memory':
127
+ // Not yet available
128
+ return false;
129
+ default:
130
+ return false;
131
+ }
132
+ }
133
+ /**
134
+ * Get list of available memory adapter types
135
+ */
136
+ export function getAvailableMemoryAdapters() {
137
+ const adapters = ['inmemory'];
138
+ if (process.env.AGENT_RELAY_MEMORY_API_KEY || process.env.SUPERMEMORY_API_KEY) {
139
+ adapters.push('supermemory');
140
+ }
141
+ return adapters;
142
+ }
143
+ //# sourceMappingURL=factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D;;;;;;;;GAQG;AACH,MAAM,UAAU,sBAAsB;IACpC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,UAAU,CAAC;IAC/D,MAAM,MAAM,GACV,OAAO,CAAC,GAAG,CAAC,0BAA0B;QACtC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IAElC,OAAO;QACL,IAAI;QACJ,MAAM;QACN,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,2BAA2B;QACjD,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB;QAChD,gBAAgB,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB;KACrD,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAA8B;IAE9B,gCAAgC;IAChC,MAAM,SAAS,GAAG,sBAAsB,EAAE,CAAC;IAC3C,MAAM,WAAW,GAAiB;QAChC,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI,SAAS,CAAC,IAAI,IAAI,UAAU;QAClD,MAAM,EAAE,MAAM,EAAE,MAAM,IAAI,SAAS,CAAC,MAAM;QAC1C,QAAQ,EAAE,MAAM,EAAE,QAAQ,IAAI,SAAS,CAAC,QAAQ;QAChD,cAAc,EAAE,MAAM,EAAE,cAAc,IAAI,SAAS,CAAC,cAAc;QAClE,gBAAgB,EAAE,MAAM,EAAE,gBAAgB,IAAI,SAAS,CAAC,gBAAgB;QACxE,OAAO,EAAE,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE;KACtD,CAAC;IAEF,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IACnD,IAAI,OAAsB,CAAC;IAE3B,QAAQ,WAAW,EAAE,CAAC;QACpB,KAAK,aAAa,CAAC;QACnB,KAAK,gBAAgB,CAAC,CAAC,CAAC;YACtB,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CACb,2CAA2C;oBAC3C,8EAA8E;oBAC9E,8BAA8B,CAC/B,CAAC;YACJ,CAAC;YAED,OAAO,GAAG,IAAI,kBAAkB,CAAC;gBAC/B,MAAM,EAAE,WAAW,CAAC,MAAM;gBAC1B,QAAQ,EAAE,WAAW,CAAC,QAAQ;gBAC9B,cAAc,EAAE,WAAW,CAAC,cAAc;gBAC1C,gBAAgB,EAAE,WAAW,CAAC,gBAAgB;gBAC9C,SAAS,EAAE,WAAW,CAAC,OAAO,EAAE,SAA+B;gBAC/D,OAAO,EAAE,WAAW,CAAC,OAAO,EAAE,OAA6B;aAC5D,CAAC,CAAC;YACH,MAAM;QACR,CAAC;QAED,KAAK,QAAQ,CAAC;QACd,KAAK,eAAe,CAAC,CAAC,CAAC;YACrB,qDAAqD;YACrD,wCAAwC;YACxC,OAAO,CAAC,IAAI,CACV,oDAAoD;gBACpD,sCAAsC,CACvC,CAAC;YACF,OAAO,GAAG,IAAI,eAAe,CAAC;gBAC5B,cAAc,EAAE,WAAW,CAAC,cAAc;gBAC1C,gBAAgB,EAAE,WAAW,CAAC,gBAAgB;gBAC9C,WAAW,EAAE,WAAW,CAAC,OAAO,EAAE,WAAiC;aACpE,CAAC,CAAC;YACH,MAAM;QACR,CAAC;QAED,KAAK,UAAU,CAAC;QAChB,KAAK,QAAQ,CAAC;QACd,KAAK,MAAM,CAAC;QACZ,OAAO,CAAC,CAAC,CAAC;YACR,OAAO,GAAG,IAAI,eAAe,CAAC;gBAC5B,cAAc,EAAE,WAAW,CAAC,cAAc;gBAC1C,gBAAgB,EAAE,WAAW,CAAC,gBAAgB;gBAC9C,WAAW,EAAE,WAAW,CAAC,OAAO,EAAE,WAAiC;aACpE,CAAC,CAAC;YACH,MAAM;QACR,CAAC;IACH,CAAC;IAED,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;IACrB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CAAC,IAAY;IACnD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAEvC,QAAQ,WAAW,EAAE,CAAC;QACpB,KAAK,UAAU,CAAC;QAChB,KAAK,QAAQ,CAAC;QACd,KAAK,MAAM;YACT,OAAO,IAAI,CAAC;QAEd,KAAK,aAAa,CAAC;QACnB,KAAK,gBAAgB;YACnB,qCAAqC;YACrC,OAAO,CAAC,CAAC,CACP,OAAO,CAAC,GAAG,CAAC,0BAA0B;gBACtC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAChC,CAAC;QAEJ,KAAK,QAAQ,CAAC;QACd,KAAK,eAAe;YAClB,oBAAoB;YACpB,OAAO,KAAK,CAAC;QAEf;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B;IACxC,MAAM,QAAQ,GAAa,CAAC,UAAU,CAAC,CAAC;IAExC,IAAI,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC;QAC9E,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}