@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,338 @@
1
+ /**
2
+ * Supermemory.ai Memory Adapter
3
+ *
4
+ * Integration with supermemory.ai for semantic memory storage and retrieval.
5
+ * Provides AI-optimized search with embedding-based similarity.
6
+ *
7
+ * @see https://supermemory.ai/docs
8
+ */
9
+ /**
10
+ * Supermemory.ai adapter for semantic memory storage
11
+ */
12
+ export class SupermemoryAdapter {
13
+ type = 'supermemory';
14
+ apiKey;
15
+ endpoint;
16
+ container;
17
+ defaultAgentId;
18
+ defaultProjectId;
19
+ timeout;
20
+ initialized = false;
21
+ constructor(options) {
22
+ if (!options.apiKey) {
23
+ throw new Error('SupermemoryAdapter requires an API key');
24
+ }
25
+ this.apiKey = options.apiKey;
26
+ this.endpoint = options.endpoint ?? 'https://api.supermemory.ai';
27
+ this.container = options.container;
28
+ this.defaultAgentId = options.defaultAgentId;
29
+ this.defaultProjectId = options.defaultProjectId;
30
+ this.timeout = options.timeout ?? 30000;
31
+ }
32
+ async init() {
33
+ // Verify API key by making a simple request
34
+ try {
35
+ const response = await this.fetch('/v3/documents/list', {
36
+ method: 'POST',
37
+ body: JSON.stringify({ limit: 1 }),
38
+ });
39
+ if (!response.ok && response.status !== 404) {
40
+ const error = await response.text();
41
+ throw new Error(`Supermemory API error: ${error}`);
42
+ }
43
+ this.initialized = true;
44
+ }
45
+ catch (error) {
46
+ if (error instanceof Error && error.message.includes('fetch')) {
47
+ throw new Error(`Failed to connect to Supermemory API: ${error.message}`);
48
+ }
49
+ throw error;
50
+ }
51
+ }
52
+ async add(content, options) {
53
+ try {
54
+ const metadata = {
55
+ source: options?.source ?? 'agent-relay',
56
+ agentId: options?.agentId ?? this.defaultAgentId,
57
+ projectId: options?.projectId ?? this.defaultProjectId,
58
+ sessionId: options?.sessionId,
59
+ tags: options?.tags,
60
+ ...options?.metadata,
61
+ };
62
+ // Remove undefined values
63
+ Object.keys(metadata).forEach(key => {
64
+ if (metadata[key] === undefined) {
65
+ delete metadata[key];
66
+ }
67
+ });
68
+ const body = {
69
+ content,
70
+ metadata,
71
+ };
72
+ if (this.container) {
73
+ body.containerTags = [this.container];
74
+ }
75
+ const response = await this.fetch('/v3/documents', {
76
+ method: 'POST',
77
+ body: JSON.stringify(body),
78
+ });
79
+ if (!response.ok) {
80
+ const error = await response.text();
81
+ return { success: false, error: `Failed to add memory: ${error}` };
82
+ }
83
+ const result = await response.json();
84
+ return { success: true, id: result.id ?? result.documentId };
85
+ }
86
+ catch (error) {
87
+ return {
88
+ success: false,
89
+ error: error instanceof Error ? error.message : 'Unknown error',
90
+ };
91
+ }
92
+ }
93
+ async search(query) {
94
+ try {
95
+ const filters = {};
96
+ if (query.agentId) {
97
+ filters.agentId = query.agentId;
98
+ }
99
+ if (query.projectId) {
100
+ filters.projectId = query.projectId;
101
+ }
102
+ if (query.tags && query.tags.length > 0) {
103
+ filters.tags = query.tags;
104
+ }
105
+ const body = {
106
+ query: query.query,
107
+ limit: query.limit ?? 10,
108
+ minScore: query.minScore ?? 0.5,
109
+ };
110
+ if (Object.keys(filters).length > 0) {
111
+ body.filters = filters;
112
+ }
113
+ if (this.container) {
114
+ body.containerTags = [this.container];
115
+ }
116
+ // Use v4 search for lower latency
117
+ const response = await this.fetch('/v4/search', {
118
+ method: 'POST',
119
+ body: JSON.stringify(body),
120
+ });
121
+ if (!response.ok) {
122
+ console.error('[supermemory] Search failed:', await response.text());
123
+ return [];
124
+ }
125
+ const result = await response.json();
126
+ const results = result.results ?? [];
127
+ return results.map(doc => this.documentToMemoryEntry(doc));
128
+ }
129
+ catch (error) {
130
+ console.error('[supermemory] Search error:', error);
131
+ return [];
132
+ }
133
+ }
134
+ async get(id) {
135
+ try {
136
+ const response = await this.fetch(`/v3/documents/${encodeURIComponent(id)}`, {
137
+ method: 'GET',
138
+ });
139
+ if (!response.ok) {
140
+ if (response.status === 404) {
141
+ return null;
142
+ }
143
+ console.error('[supermemory] Get failed:', await response.text());
144
+ return null;
145
+ }
146
+ const doc = await response.json();
147
+ return this.documentToMemoryEntry(doc);
148
+ }
149
+ catch (error) {
150
+ console.error('[supermemory] Get error:', error);
151
+ return null;
152
+ }
153
+ }
154
+ async delete(id) {
155
+ try {
156
+ const response = await this.fetch(`/v3/documents/${encodeURIComponent(id)}`, {
157
+ method: 'DELETE',
158
+ });
159
+ if (!response.ok && response.status !== 404) {
160
+ const error = await response.text();
161
+ return { success: false, error: `Failed to delete: ${error}` };
162
+ }
163
+ return { success: true, id };
164
+ }
165
+ catch (error) {
166
+ return {
167
+ success: false,
168
+ error: error instanceof Error ? error.message : 'Unknown error',
169
+ };
170
+ }
171
+ }
172
+ async update(id, content, options) {
173
+ try {
174
+ const body = { content };
175
+ if (options) {
176
+ const metadata = {};
177
+ if (options.tags)
178
+ metadata.tags = options.tags;
179
+ if (options.metadata)
180
+ Object.assign(metadata, options.metadata);
181
+ if (Object.keys(metadata).length > 0) {
182
+ body.metadata = metadata;
183
+ }
184
+ }
185
+ const response = await this.fetch(`/v3/documents/${encodeURIComponent(id)}`, {
186
+ method: 'PATCH',
187
+ body: JSON.stringify(body),
188
+ });
189
+ if (!response.ok) {
190
+ const error = await response.text();
191
+ return { success: false, error: `Failed to update: ${error}` };
192
+ }
193
+ return { success: true, id };
194
+ }
195
+ catch (error) {
196
+ return {
197
+ success: false,
198
+ error: error instanceof Error ? error.message : 'Unknown error',
199
+ };
200
+ }
201
+ }
202
+ async list(options) {
203
+ try {
204
+ const body = {
205
+ limit: options?.limit ?? 50,
206
+ sortBy: 'createdAt',
207
+ sortOrder: 'desc',
208
+ };
209
+ const filters = {};
210
+ if (options?.agentId)
211
+ filters.agentId = options.agentId;
212
+ if (options?.projectId)
213
+ filters.projectId = options.projectId;
214
+ if (Object.keys(filters).length > 0) {
215
+ body.filters = filters;
216
+ }
217
+ if (this.container) {
218
+ body.containerTags = [this.container];
219
+ }
220
+ const response = await this.fetch('/v3/documents/list', {
221
+ method: 'POST',
222
+ body: JSON.stringify(body),
223
+ });
224
+ if (!response.ok) {
225
+ console.error('[supermemory] List failed:', await response.text());
226
+ return [];
227
+ }
228
+ const result = await response.json();
229
+ return (result.documents ?? []).map(doc => this.documentToMemoryEntry(doc));
230
+ }
231
+ catch (error) {
232
+ console.error('[supermemory] List error:', error);
233
+ return [];
234
+ }
235
+ }
236
+ async clear(options) {
237
+ try {
238
+ // Supermemory supports bulk delete by container tags
239
+ // For more specific filtering, we need to list and delete individually
240
+ if (!options?.agentId && !options?.projectId && this.container) {
241
+ // Delete by container
242
+ const response = await this.fetch('/v3/documents/bulk', {
243
+ method: 'DELETE',
244
+ body: JSON.stringify({ containerTags: [this.container] }),
245
+ });
246
+ if (!response.ok) {
247
+ return { success: false, error: await response.text() };
248
+ }
249
+ return { success: true };
250
+ }
251
+ // List and delete matching memories
252
+ const memories = await this.list({
253
+ limit: 1000,
254
+ agentId: options?.agentId,
255
+ projectId: options?.projectId,
256
+ });
257
+ const toDelete = options?.before
258
+ ? memories.filter(m => m.createdAt < options.before)
259
+ : memories;
260
+ for (const memory of toDelete) {
261
+ await this.delete(memory.id);
262
+ }
263
+ return { success: true };
264
+ }
265
+ catch (error) {
266
+ return {
267
+ success: false,
268
+ error: error instanceof Error ? error.message : 'Unknown error',
269
+ };
270
+ }
271
+ }
272
+ async stats() {
273
+ // Supermemory doesn't have a stats endpoint, so we approximate
274
+ const memories = await this.list({ limit: 1000 });
275
+ const byAgent = {};
276
+ const byProject = {};
277
+ for (const memory of memories) {
278
+ if (memory.agentId) {
279
+ byAgent[memory.agentId] = (byAgent[memory.agentId] ?? 0) + 1;
280
+ }
281
+ if (memory.projectId) {
282
+ byProject[memory.projectId] = (byProject[memory.projectId] ?? 0) + 1;
283
+ }
284
+ }
285
+ return {
286
+ totalCount: memories.length,
287
+ byAgent,
288
+ byProject,
289
+ };
290
+ }
291
+ async close() {
292
+ this.initialized = false;
293
+ }
294
+ /**
295
+ * Make a fetch request to the Supermemory API
296
+ */
297
+ async fetch(path, options) {
298
+ const url = `${this.endpoint}${path}`;
299
+ const controller = new AbortController();
300
+ const timeoutId = setTimeout(() => controller.abort(), this.timeout);
301
+ try {
302
+ const response = await fetch(url, {
303
+ ...options,
304
+ headers: {
305
+ 'Content-Type': 'application/json',
306
+ 'Authorization': `Bearer ${this.apiKey}`,
307
+ ...options.headers,
308
+ },
309
+ signal: controller.signal,
310
+ });
311
+ return response;
312
+ }
313
+ finally {
314
+ clearTimeout(timeoutId);
315
+ }
316
+ }
317
+ /**
318
+ * Convert a Supermemory document to a MemoryEntry
319
+ */
320
+ documentToMemoryEntry(doc) {
321
+ const metadata = doc.metadata ?? {};
322
+ return {
323
+ id: doc.id,
324
+ content: doc.content,
325
+ createdAt: doc.createdAt
326
+ ? new Date(doc.createdAt).getTime()
327
+ : Date.now(),
328
+ tags: metadata.tags,
329
+ source: metadata.source,
330
+ agentId: metadata.agentId,
331
+ projectId: metadata.projectId,
332
+ sessionId: metadata.sessionId,
333
+ score: doc.score,
334
+ metadata,
335
+ };
336
+ }
337
+ }
338
+ //# sourceMappingURL=supermemory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supermemory.js","sourceRoot":"","sources":["../../src/adapters/supermemory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,156 @@
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
+ export interface Message {
18
+ id: string;
19
+ role: 'user' | 'assistant' | 'system';
20
+ content: string;
21
+ timestamp: number;
22
+ /** Message importance (0-100, higher = more important) */
23
+ importance?: number;
24
+ /** Whether this is a summary message */
25
+ isSummary?: boolean;
26
+ /** Original message IDs if this is a summary */
27
+ summarizes?: string[];
28
+ /** Thread ID for grouping */
29
+ thread?: string;
30
+ /** Token count (cached) */
31
+ tokenCount?: number;
32
+ }
33
+ export interface ContextWindow {
34
+ messages: Message[];
35
+ totalTokens: number;
36
+ maxTokens: number;
37
+ usagePercent: number;
38
+ }
39
+ export interface CompactionResult {
40
+ /** Messages after compaction */
41
+ messages: Message[];
42
+ /** Number of messages removed */
43
+ messagesRemoved: number;
44
+ /** Tokens saved */
45
+ tokensSaved: number;
46
+ /** Summary message added (if any) */
47
+ summaryAdded?: Message;
48
+ /** Compaction strategy used */
49
+ strategy: CompactionStrategy;
50
+ }
51
+ export type CompactionStrategy = 'none' | 'trim_old' | 'trim_low_importance' | 'summarize' | 'deduplicate' | 'aggressive';
52
+ export interface CompactionConfig {
53
+ /** Maximum tokens for context window */
54
+ maxTokens: number;
55
+ /** Target token usage after compaction (e.g., 0.7 = 70%) */
56
+ targetUsage: number;
57
+ /** Threshold to trigger compaction (e.g., 0.9 = 90%) */
58
+ compactionThreshold: number;
59
+ /** Minimum importance to retain during compaction */
60
+ minImportanceRetain: number;
61
+ /** Number of recent messages to always keep */
62
+ keepRecentCount: number;
63
+ /** Enable summarization */
64
+ enableSummarization: boolean;
65
+ /** Enable semantic deduplication */
66
+ enableDeduplication: boolean;
67
+ /** Similarity threshold for deduplication (0-1) */
68
+ deduplicationThreshold: number;
69
+ }
70
+ /**
71
+ * Fast token estimation using character-based heuristic.
72
+ * Targets <20ms latency for large texts.
73
+ *
74
+ * Heuristic: ~4 characters per token for English text.
75
+ * Adjusts for code (more tokens per char) and whitespace.
76
+ */
77
+ export declare function estimateTokens(text: string): number;
78
+ /**
79
+ * Estimate tokens for a message (uses caching).
80
+ */
81
+ export declare function estimateMessageTokens(message: Message): number;
82
+ /**
83
+ * Estimate tokens for entire context.
84
+ */
85
+ export declare function estimateContextTokens(messages: Message[]): number;
86
+ /**
87
+ * Calculate importance score for a message.
88
+ * Higher scores = more important to retain.
89
+ */
90
+ export declare function calculateImportance(message: Message, index: number, total: number): number;
91
+ /**
92
+ * Simple similarity score between two strings (Jaccard on word set).
93
+ * Returns 0-1 where 1 = identical.
94
+ */
95
+ export declare function calculateSimilarity(a: string, b: string): number;
96
+ /**
97
+ * Find duplicate/similar messages.
98
+ */
99
+ export declare function findDuplicates(messages: Message[], threshold?: number): Map<string, string[]>;
100
+ /**
101
+ * Create a summary of multiple messages.
102
+ * This is a simple extractive summary - in production, use an LLM.
103
+ */
104
+ export declare function createSummary(messages: Message[]): Message;
105
+ /**
106
+ * Context compaction manager.
107
+ */
108
+ export declare class ContextCompactor {
109
+ private config;
110
+ constructor(config?: Partial<CompactionConfig>);
111
+ /**
112
+ * Get current context window status.
113
+ */
114
+ getContextWindow(messages: Message[]): ContextWindow;
115
+ /**
116
+ * Check if compaction is needed.
117
+ */
118
+ needsCompaction(messages: Message[]): boolean;
119
+ /**
120
+ * Perform context compaction.
121
+ */
122
+ compact(messages: Message[]): CompactionResult;
123
+ /**
124
+ * Add a message to context with automatic compaction if needed.
125
+ */
126
+ addMessage(messages: Message[], newMessage: Message): {
127
+ messages: Message[];
128
+ compacted: boolean;
129
+ result?: CompactionResult;
130
+ };
131
+ /**
132
+ * Get token budget remaining.
133
+ */
134
+ getTokenBudget(messages: Message[]): {
135
+ used: number;
136
+ remaining: number;
137
+ percentUsed: number;
138
+ };
139
+ }
140
+ /**
141
+ * Create a context compactor with the given configuration.
142
+ */
143
+ export declare function createContextCompactor(config?: Partial<CompactionConfig>): ContextCompactor;
144
+ /**
145
+ * Format token count for display.
146
+ */
147
+ export declare function formatTokenCount(tokens: number): string;
148
+ /**
149
+ * Benchmark token estimation performance.
150
+ */
151
+ export declare function benchmarkTokenEstimation(iterations?: number): {
152
+ avgNs: number;
153
+ maxNs: number;
154
+ tokensPerMs: number;
155
+ };
156
+ //# sourceMappingURL=context-compaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-compaction.d.ts","sourceRoot":"","sources":["../src/context-compaction.ts"],"names":[],"mappings":"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"}