@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.
- package/dist/adapters/index.d.ts +8 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +8 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/inmemory.d.ts +59 -0
- package/dist/adapters/inmemory.d.ts.map +1 -0
- package/dist/adapters/inmemory.js +195 -0
- package/dist/adapters/inmemory.js.map +1 -0
- package/dist/adapters/supermemory.d.ts +71 -0
- package/dist/adapters/supermemory.d.ts.map +1 -0
- package/dist/adapters/supermemory.js +338 -0
- package/dist/adapters/supermemory.js.map +1 -0
- package/dist/context-compaction.d.ts +156 -0
- package/dist/context-compaction.d.ts.map +1 -0
- package/dist/context-compaction.js +453 -0
- package/dist/context-compaction.js.map +1 -0
- package/dist/factory.d.ts +48 -0
- package/dist/factory.d.ts.map +1 -0
- package/dist/factory.js +143 -0
- package/dist/factory.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/memory-hooks.d.ts +60 -0
- package/dist/memory-hooks.d.ts.map +1 -0
- package/dist/memory-hooks.js +313 -0
- package/dist/memory-hooks.js.map +1 -0
- package/dist/service.d.ts +49 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +146 -0
- package/dist/service.js.map +1 -0
- package/dist/types.d.ts +195 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/package.json +35 -0
|
@@ -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":"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"}
|
|
@@ -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"}
|
package/dist/factory.js
ADDED
|
@@ -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":"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"}
|