universal-agent-memory 0.4.1 → 0.5.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,369 @@
1
+ import { execSync, spawn } from 'child_process';
2
+ import { existsSync, mkdirSync } from 'fs';
3
+ /**
4
+ * Serverless Qdrant manager for cost-optimized vector storage.
5
+ * Supports lazy-start local Docker instances and cloud serverless backends.
6
+ */
7
+ export class ServerlessQdrantManager {
8
+ config;
9
+ lastActivityTime = Date.now();
10
+ healthCheckInterval = null;
11
+ idleCheckInterval = null;
12
+ isStarting = false;
13
+ inMemoryFallback = new Map();
14
+ constructor(config) {
15
+ this.config = this.normalizeConfig(config);
16
+ }
17
+ /**
18
+ * Normalize and fill in default config values.
19
+ */
20
+ normalizeConfig(config) {
21
+ return {
22
+ enabled: config.enabled ?? false,
23
+ mode: config.mode ?? 'lazy-local',
24
+ lazyLocal: {
25
+ dockerImage: config.lazyLocal?.dockerImage ?? 'qdrant/qdrant:latest',
26
+ port: config.lazyLocal?.port ?? 6333,
27
+ dataDir: config.lazyLocal?.dataDir ?? './agents/data/qdrant',
28
+ autoStart: config.lazyLocal?.autoStart ?? true,
29
+ autoStop: config.lazyLocal?.autoStop ?? true,
30
+ idleTimeoutMs: config.lazyLocal?.idleTimeoutMs ?? 300000,
31
+ healthCheckIntervalMs: config.lazyLocal?.healthCheckIntervalMs ?? 30000,
32
+ },
33
+ cloudServerless: {
34
+ provider: config.cloudServerless?.provider ?? 'qdrant-cloud',
35
+ url: config.cloudServerless?.url,
36
+ apiKey: config.cloudServerless?.apiKey,
37
+ region: config.cloudServerless?.region ?? 'us-east-1',
38
+ keepWarm: config.cloudServerless?.keepWarm ?? false,
39
+ warmIntervalMs: config.cloudServerless?.warmIntervalMs ?? 240000,
40
+ },
41
+ hybrid: {
42
+ useLocalInDev: config.hybrid?.useLocalInDev ?? true,
43
+ useCloudInProd: config.hybrid?.useCloudInProd ?? true,
44
+ envDetection: config.hybrid?.envDetection ?? 'auto',
45
+ },
46
+ fallbackToMemory: config.fallbackToMemory ?? true,
47
+ };
48
+ }
49
+ /**
50
+ * Get the current environment (dev/prod).
51
+ */
52
+ getEnvironment() {
53
+ const { envDetection } = this.config.hybrid;
54
+ if (envDetection === 'NODE_ENV') {
55
+ return process.env.NODE_ENV === 'production' ? 'prod' : 'dev';
56
+ }
57
+ if (envDetection === 'UAM_ENV') {
58
+ return process.env.UAM_ENV === 'production' ? 'prod' : 'dev';
59
+ }
60
+ // Auto-detect
61
+ if (process.env.NODE_ENV === 'production' || process.env.CI) {
62
+ return 'prod';
63
+ }
64
+ return 'dev';
65
+ }
66
+ /**
67
+ * Get the effective backend based on mode and environment.
68
+ */
69
+ getEffectiveBackend() {
70
+ const { mode } = this.config;
71
+ if (mode === 'lazy-local') {
72
+ return 'local';
73
+ }
74
+ if (mode === 'cloud-serverless') {
75
+ return 'cloud';
76
+ }
77
+ if (mode === 'hybrid') {
78
+ const env = this.getEnvironment();
79
+ if (env === 'dev' && this.config.hybrid.useLocalInDev) {
80
+ return 'local';
81
+ }
82
+ if (env === 'prod' && this.config.hybrid.useCloudInProd) {
83
+ return 'cloud';
84
+ }
85
+ }
86
+ return 'memory';
87
+ }
88
+ /**
89
+ * Get the Qdrant endpoint URL.
90
+ */
91
+ async getEndpoint() {
92
+ const backend = this.getEffectiveBackend();
93
+ if (backend === 'local') {
94
+ await this.ensureLocalRunning();
95
+ return `http://localhost:${this.config.lazyLocal.port}`;
96
+ }
97
+ if (backend === 'cloud') {
98
+ const url = this.config.cloudServerless.url || process.env.QDRANT_URL;
99
+ if (!url) {
100
+ throw new Error('Cloud Qdrant URL not configured');
101
+ }
102
+ return url;
103
+ }
104
+ throw new Error('In-memory fallback active - no endpoint available');
105
+ }
106
+ /**
107
+ * Get the API key for cloud backend.
108
+ */
109
+ getApiKey() {
110
+ return this.config.cloudServerless.apiKey || process.env.QDRANT_API_KEY;
111
+ }
112
+ /**
113
+ * Check if local Qdrant is running.
114
+ */
115
+ isLocalRunning() {
116
+ try {
117
+ const result = execSync(`curl -s -o /dev/null -w "%{http_code}" http://localhost:${this.config.lazyLocal.port}/health`, { encoding: 'utf-8', timeout: 5000 });
118
+ return result.trim() === '200';
119
+ }
120
+ catch {
121
+ return false;
122
+ }
123
+ }
124
+ /**
125
+ * Start local Qdrant Docker container.
126
+ */
127
+ async startLocal() {
128
+ if (this.isStarting) {
129
+ // Wait for existing start to complete
130
+ while (this.isStarting) {
131
+ await new Promise(resolve => setTimeout(resolve, 100));
132
+ }
133
+ return;
134
+ }
135
+ this.isStarting = true;
136
+ try {
137
+ const { dockerImage, port, dataDir } = this.config.lazyLocal;
138
+ // Ensure data directory exists
139
+ if (!existsSync(dataDir)) {
140
+ mkdirSync(dataDir, { recursive: true });
141
+ }
142
+ // Check if container already exists
143
+ try {
144
+ execSync('docker ps -a --format "{{.Names}}" | grep -q uam-qdrant', { stdio: 'pipe' });
145
+ // Container exists, start it
146
+ execSync('docker start uam-qdrant', { stdio: 'pipe' });
147
+ }
148
+ catch {
149
+ // Container doesn't exist, create it
150
+ spawn('docker', [
151
+ 'run',
152
+ '--name', 'uam-qdrant',
153
+ '-p', `${port}:6333`,
154
+ '-v', `${process.cwd()}/${dataDir}:/qdrant/storage`,
155
+ '-d',
156
+ dockerImage,
157
+ ], { stdio: 'pipe', detached: true });
158
+ }
159
+ // Wait for Qdrant to be ready
160
+ let attempts = 0;
161
+ while (!this.isLocalRunning() && attempts < 30) {
162
+ await new Promise(resolve => setTimeout(resolve, 1000));
163
+ attempts++;
164
+ }
165
+ if (!this.isLocalRunning()) {
166
+ throw new Error('Failed to start local Qdrant');
167
+ }
168
+ // Start health check and idle monitoring
169
+ this.startMonitoring();
170
+ }
171
+ finally {
172
+ this.isStarting = false;
173
+ }
174
+ }
175
+ /**
176
+ * Stop local Qdrant Docker container.
177
+ */
178
+ async stopLocal() {
179
+ try {
180
+ execSync('docker stop uam-qdrant', { stdio: 'pipe' });
181
+ }
182
+ catch {
183
+ // Container may not be running
184
+ }
185
+ this.stopMonitoring();
186
+ }
187
+ /**
188
+ * Ensure local Qdrant is running, starting it if needed.
189
+ */
190
+ async ensureLocalRunning() {
191
+ if (!this.isLocalRunning()) {
192
+ if (this.config.lazyLocal.autoStart) {
193
+ await this.startLocal();
194
+ }
195
+ else {
196
+ throw new Error('Local Qdrant not running and autoStart is disabled');
197
+ }
198
+ }
199
+ this.recordActivity();
200
+ }
201
+ /**
202
+ * Record activity to reset idle timer.
203
+ */
204
+ recordActivity() {
205
+ this.lastActivityTime = Date.now();
206
+ }
207
+ /**
208
+ * Start health check and idle monitoring.
209
+ */
210
+ startMonitoring() {
211
+ const { healthCheckIntervalMs, idleTimeoutMs, autoStop } = this.config.lazyLocal;
212
+ // Health check
213
+ this.healthCheckInterval = setInterval(() => {
214
+ if (!this.isLocalRunning()) {
215
+ console.warn('[UAM] Qdrant health check failed, attempting restart...');
216
+ this.startLocal().catch(console.error);
217
+ }
218
+ }, healthCheckIntervalMs);
219
+ // Idle check (auto-stop)
220
+ if (autoStop) {
221
+ this.idleCheckInterval = setInterval(() => {
222
+ const idleTime = Date.now() - this.lastActivityTime;
223
+ if (idleTime > idleTimeoutMs) {
224
+ console.log(`[UAM] Qdrant idle for ${idleTime}ms, stopping...`);
225
+ this.stopLocal().catch(console.error);
226
+ }
227
+ }, 60000); // Check every minute
228
+ }
229
+ }
230
+ /**
231
+ * Stop monitoring intervals.
232
+ */
233
+ stopMonitoring() {
234
+ if (this.healthCheckInterval) {
235
+ clearInterval(this.healthCheckInterval);
236
+ this.healthCheckInterval = null;
237
+ }
238
+ if (this.idleCheckInterval) {
239
+ clearInterval(this.idleCheckInterval);
240
+ this.idleCheckInterval = null;
241
+ }
242
+ }
243
+ /**
244
+ * Store vectors with automatic backend selection.
245
+ */
246
+ async store(collection, vectors) {
247
+ const backend = this.getEffectiveBackend();
248
+ if (backend === 'memory') {
249
+ if (!this.inMemoryFallback.has(collection)) {
250
+ this.inMemoryFallback.set(collection, []);
251
+ }
252
+ this.inMemoryFallback.get(collection).push(...vectors);
253
+ return;
254
+ }
255
+ this.recordActivity();
256
+ const endpoint = await this.getEndpoint();
257
+ const apiKey = this.getApiKey();
258
+ const headers = {
259
+ 'Content-Type': 'application/json',
260
+ };
261
+ if (apiKey) {
262
+ headers['api-key'] = apiKey;
263
+ }
264
+ const response = await fetch(`${endpoint}/collections/${collection}/points`, {
265
+ method: 'PUT',
266
+ headers,
267
+ body: JSON.stringify({ points: vectors }),
268
+ });
269
+ if (!response.ok) {
270
+ throw new Error(`Failed to store vectors: ${response.statusText}`);
271
+ }
272
+ }
273
+ /**
274
+ * Search vectors with automatic backend selection.
275
+ */
276
+ async search(collection, vector, limit = 5) {
277
+ const backend = this.getEffectiveBackend();
278
+ if (backend === 'memory') {
279
+ // Simple in-memory cosine similarity search
280
+ const vectors = this.inMemoryFallback.get(collection) || [];
281
+ return this.inMemorySearch(vectors, vector, limit);
282
+ }
283
+ this.recordActivity();
284
+ const endpoint = await this.getEndpoint();
285
+ const apiKey = this.getApiKey();
286
+ const headers = {
287
+ 'Content-Type': 'application/json',
288
+ };
289
+ if (apiKey) {
290
+ headers['api-key'] = apiKey;
291
+ }
292
+ const response = await fetch(`${endpoint}/collections/${collection}/points/search`, {
293
+ method: 'POST',
294
+ headers,
295
+ body: JSON.stringify({ vector, limit, with_payload: true }),
296
+ });
297
+ if (!response.ok) {
298
+ throw new Error(`Failed to search vectors: ${response.statusText}`);
299
+ }
300
+ const data = await response.json();
301
+ return data.result;
302
+ }
303
+ /**
304
+ * Simple in-memory cosine similarity search (fallback).
305
+ */
306
+ inMemorySearch(vectors, query, limit) {
307
+ const scored = vectors.map(v => ({
308
+ id: v.id,
309
+ score: this.cosineSimilarity(query, v.vector),
310
+ payload: v.payload,
311
+ }));
312
+ return scored
313
+ .sort((a, b) => b.score - a.score)
314
+ .slice(0, limit);
315
+ }
316
+ /**
317
+ * Calculate cosine similarity between two vectors.
318
+ */
319
+ cosineSimilarity(a, b) {
320
+ let dotProduct = 0;
321
+ let normA = 0;
322
+ let normB = 0;
323
+ for (let i = 0; i < a.length; i++) {
324
+ dotProduct += a[i] * b[i];
325
+ normA += a[i] * a[i];
326
+ normB += b[i] * b[i];
327
+ }
328
+ return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
329
+ }
330
+ /**
331
+ * Gracefully shutdown the manager.
332
+ */
333
+ async shutdown() {
334
+ this.stopMonitoring();
335
+ if (this.config.lazyLocal.autoStop) {
336
+ await this.stopLocal();
337
+ }
338
+ }
339
+ /**
340
+ * Get current status.
341
+ */
342
+ getStatus() {
343
+ return {
344
+ backend: this.getEffectiveBackend(),
345
+ localRunning: this.isLocalRunning(),
346
+ lastActivity: this.lastActivityTime,
347
+ inMemorySize: Array.from(this.inMemoryFallback.values())
348
+ .reduce((sum, arr) => sum + arr.length, 0),
349
+ };
350
+ }
351
+ }
352
+ /**
353
+ * Singleton instance.
354
+ */
355
+ let globalManager = null;
356
+ export function getServerlessQdrantManager(config) {
357
+ if (!globalManager && config) {
358
+ globalManager = new ServerlessQdrantManager(config);
359
+ }
360
+ if (!globalManager) {
361
+ throw new Error('ServerlessQdrantManager not initialized');
362
+ }
363
+ return globalManager;
364
+ }
365
+ export function initServerlessQdrant(config) {
366
+ globalManager = new ServerlessQdrantManager(config);
367
+ return globalManager;
368
+ }
369
+ //# sourceMappingURL=serverless-qdrant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serverless-qdrant.js","sourceRoot":"","sources":["../../src/memory/serverless-qdrant.ts"],"names":[],"mappings":"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"}