@ainetwork/adk-provider-memory-mongodb 0.4.0 → 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.
- package/dist/{chunk-GPOFS7ZT.js → chunk-2XJ6S2W5.js} +12 -7
- package/dist/chunk-2XJ6S2W5.js.map +1 -0
- package/dist/{chunk-5CCEN7NK.js → chunk-QULDFKGZ.js} +5 -1
- package/dist/chunk-QULDFKGZ.js.map +1 -0
- package/dist/chunk-RC275GLE.js +70 -0
- package/dist/chunk-RC275GLE.js.map +1 -0
- package/dist/{chunk-NGLXQZLX.js → chunk-SJ2FHHN6.js} +13 -10
- package/dist/chunk-SJ2FHHN6.js.map +1 -0
- package/dist/index.cjs +322 -75
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +11 -3
- package/dist/index.d.ts +11 -3
- package/dist/index.js +232 -59
- package/dist/index.js.map +1 -1
- package/dist/models/messages.model.cjs +4 -0
- package/dist/models/messages.model.cjs.map +1 -1
- package/dist/models/messages.model.d.cts +14 -1
- package/dist/models/messages.model.d.ts +14 -1
- package/dist/models/messages.model.js +1 -1
- package/dist/models/threads.model.cjs +11 -6
- package/dist/models/threads.model.cjs.map +1 -1
- package/dist/models/threads.model.d.cts +22 -9
- package/dist/models/threads.model.d.ts +22 -9
- package/dist/models/threads.model.js +1 -1
- package/dist/models/user-workflow.model.cjs +105 -0
- package/dist/models/user-workflow.model.cjs.map +1 -0
- package/dist/models/user-workflow.model.d.cts +92 -0
- package/dist/models/user-workflow.model.d.ts +92 -0
- package/dist/models/user-workflow.model.js +9 -0
- package/dist/models/{workflow.model.cjs → workflow-template.model.cjs} +18 -15
- package/dist/models/workflow-template.model.cjs.map +1 -0
- package/dist/models/workflow-template.model.d.cts +60 -0
- package/dist/models/workflow-template.model.d.ts +60 -0
- package/dist/models/workflow-template.model.js +9 -0
- package/dist/models/workflow-template.model.js.map +1 -0
- package/implements/base.memory.ts +130 -12
- package/implements/thread.memory.ts +48 -22
- package/implements/user-workflow.memory.ts +87 -0
- package/implements/workflow-template.memory.ts +69 -0
- package/models/messages.model.ts +7 -0
- package/models/threads.model.ts +16 -9
- package/models/user-workflow.model.ts +91 -0
- package/models/workflow-template.model.ts +58 -0
- package/package.json +3 -3
- package/dist/chunk-5CCEN7NK.js.map +0 -1
- package/dist/chunk-GPOFS7ZT.js.map +0 -1
- package/dist/chunk-NGLXQZLX.js.map +0 -1
- package/dist/models/workflow.model.cjs.map +0 -1
- package/dist/models/workflow.model.d.cts +0 -54
- package/dist/models/workflow.model.d.ts +0 -54
- package/dist/models/workflow.model.js +0 -9
- package/implements/workflow.memory.ts +0 -78
- package/models/workflow.model.ts +0 -46
- /package/dist/models/{workflow.model.js.map → user-workflow.model.js.map} +0 -0
package/dist/index.js
CHANGED
|
@@ -6,13 +6,16 @@ import {
|
|
|
6
6
|
} from "./chunk-YFW7JXII.js";
|
|
7
7
|
import {
|
|
8
8
|
MessageModel
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-QULDFKGZ.js";
|
|
10
10
|
import {
|
|
11
11
|
ThreadModel
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-2XJ6S2W5.js";
|
|
13
13
|
import {
|
|
14
|
-
|
|
15
|
-
} from "./chunk-
|
|
14
|
+
UserWorkflowModel
|
|
15
|
+
} from "./chunk-RC275GLE.js";
|
|
16
|
+
import {
|
|
17
|
+
WorkflowTemplateModel
|
|
18
|
+
} from "./chunk-SJ2FHHN6.js";
|
|
16
19
|
|
|
17
20
|
// implements/base.memory.ts
|
|
18
21
|
import mongoose from "mongoose";
|
|
@@ -179,6 +182,8 @@ var MongoDBThread = class {
|
|
|
179
182
|
userId: thread.userId,
|
|
180
183
|
type: thread.type,
|
|
181
184
|
title: thread.title || "New thread",
|
|
185
|
+
isPinned: thread.isPinned ?? false,
|
|
186
|
+
workflowId: thread.workflowId,
|
|
182
187
|
messages: []
|
|
183
188
|
};
|
|
184
189
|
messages.forEach((message) => {
|
|
@@ -193,36 +198,39 @@ var MongoDBThread = class {
|
|
|
193
198
|
return threadObject;
|
|
194
199
|
}, `getThread(${userId}, ${threadId})`);
|
|
195
200
|
}
|
|
196
|
-
async createThread(type, userId, threadId, title) {
|
|
201
|
+
async createThread(type, userId, threadId, title, workflowId) {
|
|
197
202
|
return this.executeWithRetry(async () => {
|
|
198
|
-
const now = Date.now();
|
|
199
203
|
await ThreadModel.create({
|
|
200
204
|
type,
|
|
201
205
|
userId,
|
|
202
206
|
threadId,
|
|
203
207
|
title,
|
|
204
|
-
|
|
205
|
-
created_at: now
|
|
208
|
+
workflowId
|
|
206
209
|
});
|
|
207
|
-
return { type, userId, threadId, title, messages: [] };
|
|
210
|
+
return { type, userId, threadId, title, workflowId, messages: [] };
|
|
208
211
|
}, `createThread(${userId}, ${threadId})`);
|
|
209
212
|
}
|
|
210
213
|
async addMessagesToThread(userId, threadId, messages) {
|
|
211
214
|
return this.executeWithRetry(async () => {
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
215
|
+
if (messages.length > 0) {
|
|
216
|
+
const messageIds = messages.map((m) => m.messageId);
|
|
217
|
+
await MessageModel.deleteMany({ threadId, userId, messageId: { $in: messageIds } });
|
|
218
|
+
await MessageModel.insertMany(
|
|
219
|
+
messages.map((message) => ({
|
|
220
|
+
threadId,
|
|
221
|
+
messageId: message.messageId,
|
|
222
|
+
userId,
|
|
223
|
+
role: message.role,
|
|
224
|
+
content: message.content,
|
|
225
|
+
timestamp: message.timestamp,
|
|
226
|
+
metadata: message.metadata
|
|
227
|
+
}))
|
|
228
|
+
);
|
|
225
229
|
}
|
|
230
|
+
await ThreadModel.updateOne(
|
|
231
|
+
{ threadId, userId },
|
|
232
|
+
{ $set: { updatedAt: /* @__PURE__ */ new Date() } }
|
|
233
|
+
);
|
|
226
234
|
}, `addMessagesToThread(${userId}, ${threadId})`);
|
|
227
235
|
}
|
|
228
236
|
async deleteThread(userId, threadId) {
|
|
@@ -232,73 +240,142 @@ var MongoDBThread = class {
|
|
|
232
240
|
await ThreadModel.deleteOne({ userId, threadId }).maxTimeMS(timeout);
|
|
233
241
|
}, `deleteThread(${userId}, ${threadId})`);
|
|
234
242
|
}
|
|
235
|
-
async listThreads(userId) {
|
|
243
|
+
async listThreads(userId, filter) {
|
|
236
244
|
return this.executeWithRetry(async () => {
|
|
237
245
|
const timeout = this.getOperationTimeout();
|
|
238
|
-
const
|
|
246
|
+
const query = { userId };
|
|
247
|
+
if (filter?.workflowId) query.workflowId = filter.workflowId;
|
|
248
|
+
if (filter?.type) query.type = filter.type;
|
|
249
|
+
const threads = await ThreadModel.find(query).sort({ updatedAt: -1 }).maxTimeMS(timeout);
|
|
239
250
|
const data = threads.map((thread) => {
|
|
240
251
|
return {
|
|
241
252
|
type: thread.type,
|
|
242
253
|
userId,
|
|
243
254
|
threadId: thread.threadId,
|
|
244
255
|
title: thread.title,
|
|
245
|
-
|
|
256
|
+
isPinned: thread.isPinned ?? false,
|
|
257
|
+
workflowId: thread.workflowId,
|
|
258
|
+
createdAt: thread.createdAt?.toISOString(),
|
|
259
|
+
updatedAt: thread.updatedAt?.toISOString()
|
|
246
260
|
};
|
|
247
261
|
});
|
|
248
262
|
return data;
|
|
249
263
|
}, `listThreads(${userId})`);
|
|
250
264
|
}
|
|
265
|
+
async updateThreadPin(userId, threadId, isPinned) {
|
|
266
|
+
return this.executeWithRetry(async () => {
|
|
267
|
+
const timeout = this.getOperationTimeout();
|
|
268
|
+
await ThreadModel.updateOne(
|
|
269
|
+
{ threadId, userId },
|
|
270
|
+
{ $set: { isPinned } }
|
|
271
|
+
).maxTimeMS(timeout);
|
|
272
|
+
}, `updateThreadPin(${userId}, ${threadId})`);
|
|
273
|
+
}
|
|
251
274
|
};
|
|
252
275
|
|
|
253
|
-
// implements/workflow.memory.ts
|
|
254
|
-
var
|
|
276
|
+
// implements/user-workflow.memory.ts
|
|
277
|
+
var MongoDBUserWorkflow = class {
|
|
255
278
|
executeWithRetry;
|
|
256
279
|
getOperationTimeout;
|
|
257
280
|
constructor(executeWithRetry, getOperationTimeout) {
|
|
258
281
|
this.executeWithRetry = executeWithRetry;
|
|
259
282
|
this.getOperationTimeout = getOperationTimeout;
|
|
260
283
|
}
|
|
261
|
-
async
|
|
284
|
+
async createUserWorkflow(workflow) {
|
|
262
285
|
return this.executeWithRetry(async () => {
|
|
263
|
-
const
|
|
264
|
-
const created = await WorkflowModel.create(workflow);
|
|
286
|
+
const created = await UserWorkflowModel.create(workflow);
|
|
265
287
|
return created.toObject();
|
|
266
|
-
}, "
|
|
288
|
+
}, "createUserWorkflow()");
|
|
267
289
|
}
|
|
268
|
-
async
|
|
290
|
+
async getUserWorkflow(workflowId) {
|
|
269
291
|
return this.executeWithRetry(async () => {
|
|
270
292
|
const timeout = this.getOperationTimeout();
|
|
271
|
-
const workflow = await
|
|
272
|
-
workflowId
|
|
273
|
-
}).maxTimeMS(timeout).lean();
|
|
293
|
+
const workflow = await UserWorkflowModel.findOne({ workflowId }).maxTimeMS(timeout).lean();
|
|
274
294
|
return workflow || void 0;
|
|
275
|
-
}, "
|
|
295
|
+
}, "getUserWorkflow()");
|
|
276
296
|
}
|
|
277
|
-
async
|
|
297
|
+
async updateUserWorkflow(workflowId, updates) {
|
|
278
298
|
if (!updates.userId) {
|
|
279
|
-
throw new Error("userId is required for
|
|
299
|
+
throw new Error("userId is required for updateUserWorkflow");
|
|
280
300
|
}
|
|
301
|
+
const { userId, workflowId: _workflowId, ...mutableUpdates } = updates;
|
|
281
302
|
return this.executeWithRetry(async () => {
|
|
282
303
|
const timeout = this.getOperationTimeout();
|
|
283
|
-
await
|
|
284
|
-
{ workflowId, userId
|
|
285
|
-
{ $set:
|
|
304
|
+
await UserWorkflowModel.updateOne(
|
|
305
|
+
{ workflowId, userId },
|
|
306
|
+
{ $set: mutableUpdates }
|
|
286
307
|
).maxTimeMS(timeout);
|
|
287
|
-
}, "
|
|
308
|
+
}, "updateUserWorkflow()");
|
|
288
309
|
}
|
|
289
|
-
async
|
|
310
|
+
async deleteUserWorkflow(workflowId, userId) {
|
|
290
311
|
return this.executeWithRetry(async () => {
|
|
291
312
|
const timeout = this.getOperationTimeout();
|
|
292
|
-
await
|
|
293
|
-
}, "
|
|
313
|
+
await UserWorkflowModel.deleteOne({ workflowId, userId }).maxTimeMS(timeout);
|
|
314
|
+
}, "deleteUserWorkflow()");
|
|
294
315
|
}
|
|
295
|
-
async
|
|
316
|
+
async listUserWorkflows(userId) {
|
|
296
317
|
return this.executeWithRetry(async () => {
|
|
297
318
|
const timeout = this.getOperationTimeout();
|
|
298
|
-
const query = userId ? {
|
|
299
|
-
const workflows = await
|
|
319
|
+
const query = userId ? { userId } : {};
|
|
320
|
+
const workflows = await UserWorkflowModel.find(query).maxTimeMS(timeout).lean();
|
|
300
321
|
return workflows;
|
|
301
|
-
}, "
|
|
322
|
+
}, "listUserWorkflows()");
|
|
323
|
+
}
|
|
324
|
+
async listActiveScheduledWorkflows() {
|
|
325
|
+
return this.executeWithRetry(async () => {
|
|
326
|
+
const timeout = this.getOperationTimeout();
|
|
327
|
+
const workflows = await UserWorkflowModel.find({
|
|
328
|
+
active: true,
|
|
329
|
+
schedule: { $exists: true, $ne: null }
|
|
330
|
+
}).maxTimeMS(timeout).lean();
|
|
331
|
+
return workflows;
|
|
332
|
+
}, "listActiveScheduledWorkflows()");
|
|
333
|
+
}
|
|
334
|
+
};
|
|
335
|
+
|
|
336
|
+
// implements/workflow-template.memory.ts
|
|
337
|
+
var MongoDBWorkflowTemplate = class {
|
|
338
|
+
executeWithRetry;
|
|
339
|
+
getOperationTimeout;
|
|
340
|
+
constructor(executeWithRetry, getOperationTimeout) {
|
|
341
|
+
this.executeWithRetry = executeWithRetry;
|
|
342
|
+
this.getOperationTimeout = getOperationTimeout;
|
|
343
|
+
}
|
|
344
|
+
async createTemplate(template) {
|
|
345
|
+
return this.executeWithRetry(async () => {
|
|
346
|
+
const created = await WorkflowTemplateModel.create(template);
|
|
347
|
+
return created.toObject();
|
|
348
|
+
}, "createTemplate()");
|
|
349
|
+
}
|
|
350
|
+
async getTemplate(templateId) {
|
|
351
|
+
return this.executeWithRetry(async () => {
|
|
352
|
+
const timeout = this.getOperationTimeout();
|
|
353
|
+
const template = await WorkflowTemplateModel.findOne({ templateId }).maxTimeMS(timeout).lean();
|
|
354
|
+
return template || void 0;
|
|
355
|
+
}, "getTemplate()");
|
|
356
|
+
}
|
|
357
|
+
async updateTemplate(templateId, updates) {
|
|
358
|
+
const { templateId: _templateId, ...mutableUpdates } = updates;
|
|
359
|
+
return this.executeWithRetry(async () => {
|
|
360
|
+
const timeout = this.getOperationTimeout();
|
|
361
|
+
await WorkflowTemplateModel.updateOne(
|
|
362
|
+
{ templateId },
|
|
363
|
+
{ $set: mutableUpdates }
|
|
364
|
+
).maxTimeMS(timeout);
|
|
365
|
+
}, "updateTemplate()");
|
|
366
|
+
}
|
|
367
|
+
async deleteTemplate(templateId) {
|
|
368
|
+
return this.executeWithRetry(async () => {
|
|
369
|
+
const timeout = this.getOperationTimeout();
|
|
370
|
+
await WorkflowTemplateModel.deleteOne({ templateId }).maxTimeMS(timeout);
|
|
371
|
+
}, "deleteTemplate()");
|
|
372
|
+
}
|
|
373
|
+
async listTemplates() {
|
|
374
|
+
return this.executeWithRetry(async () => {
|
|
375
|
+
const timeout = this.getOperationTimeout();
|
|
376
|
+
const templates = await WorkflowTemplateModel.find().maxTimeMS(timeout).lean();
|
|
377
|
+
return templates;
|
|
378
|
+
}, "listTemplates()");
|
|
302
379
|
}
|
|
303
380
|
};
|
|
304
381
|
|
|
@@ -314,18 +391,26 @@ var MongoDBMemory = class _MongoDBMemory {
|
|
|
314
391
|
connectionConfig;
|
|
315
392
|
eventListenersSetup = false;
|
|
316
393
|
operationTimeoutMS;
|
|
394
|
+
threadTTLSeconds;
|
|
395
|
+
orphanCleanupTimer;
|
|
317
396
|
agentMemory;
|
|
318
397
|
intentMemory;
|
|
319
398
|
threadMemory;
|
|
320
|
-
|
|
399
|
+
workflowTemplateMemory;
|
|
400
|
+
userWorkflowMemory;
|
|
321
401
|
constructor(config) {
|
|
322
402
|
const cfg = typeof config === "string" ? { uri: config } : config;
|
|
323
403
|
this.uri = cfg.uri;
|
|
324
404
|
this.maxReconnectAttempts = cfg.maxReconnectAttempts ?? 5;
|
|
325
405
|
this.reconnectInterval = cfg.reconnectInterval ?? 5e3;
|
|
326
406
|
this.operationTimeoutMS = cfg.operationTimeoutMS ?? 1e4;
|
|
407
|
+
if (cfg.threadTTLSeconds !== void 0 && cfg.threadTTLSeconds > 0) {
|
|
408
|
+
this.threadTTLSeconds = cfg.threadTTLSeconds;
|
|
409
|
+
}
|
|
327
410
|
this.connectionConfig = {
|
|
328
|
-
maxPoolSize: cfg.maxPoolSize ??
|
|
411
|
+
maxPoolSize: cfg.maxPoolSize ?? 10,
|
|
412
|
+
minPoolSize: 0,
|
|
413
|
+
maxIdleTimeMS: 3e4,
|
|
329
414
|
serverSelectionTimeoutMS: cfg.serverSelectionTimeoutMS ?? 3e4,
|
|
330
415
|
socketTimeoutMS: cfg.socketTimeoutMS ?? 45e3,
|
|
331
416
|
connectTimeoutMS: cfg.connectTimeoutMS ?? 3e4,
|
|
@@ -350,7 +435,11 @@ var MongoDBMemory = class _MongoDBMemory {
|
|
|
350
435
|
this.executeWithRetry.bind(this),
|
|
351
436
|
this.getOperationTimeout.bind(this)
|
|
352
437
|
);
|
|
353
|
-
this.
|
|
438
|
+
this.workflowTemplateMemory = new MongoDBWorkflowTemplate(
|
|
439
|
+
this.executeWithRetry.bind(this),
|
|
440
|
+
this.getOperationTimeout.bind(this)
|
|
441
|
+
);
|
|
442
|
+
this.userWorkflowMemory = new MongoDBUserWorkflow(
|
|
354
443
|
this.executeWithRetry.bind(this),
|
|
355
444
|
this.getOperationTimeout.bind(this)
|
|
356
445
|
);
|
|
@@ -364,8 +453,11 @@ var MongoDBMemory = class _MongoDBMemory {
|
|
|
364
453
|
getIntentMemory() {
|
|
365
454
|
return this.intentMemory;
|
|
366
455
|
}
|
|
367
|
-
|
|
368
|
-
return this.
|
|
456
|
+
getWorkflowTemplateMemory() {
|
|
457
|
+
return this.workflowTemplateMemory;
|
|
458
|
+
}
|
|
459
|
+
getUserWorkflowMemory() {
|
|
460
|
+
return this.userWorkflowMemory;
|
|
369
461
|
}
|
|
370
462
|
setupMongooseEventListeners() {
|
|
371
463
|
if (this.eventListenersSetup) return;
|
|
@@ -398,7 +490,7 @@ var MongoDBMemory = class _MongoDBMemory {
|
|
|
398
490
|
return;
|
|
399
491
|
}
|
|
400
492
|
this.reconnecting = true;
|
|
401
|
-
while (this.reconnectAttempts < this.maxReconnectAttempts && !this.
|
|
493
|
+
while (this.reconnectAttempts < this.maxReconnectAttempts && !this.connected) {
|
|
402
494
|
this.reconnectAttempts++;
|
|
403
495
|
loggers2.agent.info(
|
|
404
496
|
`Attempting to reconnect to MongoDB (${this.reconnectAttempts}/${this.maxReconnectAttempts})...`
|
|
@@ -423,7 +515,7 @@ var MongoDBMemory = class _MongoDBMemory {
|
|
|
423
515
|
}
|
|
424
516
|
}
|
|
425
517
|
this.reconnecting = false;
|
|
426
|
-
if (!this.
|
|
518
|
+
if (!this.connected) {
|
|
427
519
|
loggers2.agent.error(
|
|
428
520
|
`Failed to reconnect to MongoDB after ${this.maxReconnectAttempts} attempts`
|
|
429
521
|
);
|
|
@@ -437,16 +529,22 @@ var MongoDBMemory = class _MongoDBMemory {
|
|
|
437
529
|
await mongoose.connect(this.uri, this.connectionConfig);
|
|
438
530
|
this.connected = true;
|
|
439
531
|
this.reconnectAttempts = 0;
|
|
532
|
+
await this.setupTTLIndex();
|
|
533
|
+
this.startOrphanCleanup();
|
|
440
534
|
} catch (error) {
|
|
441
535
|
loggers2.agent.error("Failed to connect to MongoDB:", error);
|
|
442
536
|
throw error;
|
|
443
537
|
}
|
|
444
538
|
}
|
|
445
539
|
async disconnect() {
|
|
446
|
-
if (!this.
|
|
540
|
+
if (!this.connected) {
|
|
447
541
|
return;
|
|
448
542
|
}
|
|
449
543
|
try {
|
|
544
|
+
if (this.orphanCleanupTimer) {
|
|
545
|
+
clearInterval(this.orphanCleanupTimer);
|
|
546
|
+
this.orphanCleanupTimer = void 0;
|
|
547
|
+
}
|
|
450
548
|
await mongoose.disconnect();
|
|
451
549
|
this.connected = false;
|
|
452
550
|
} catch (error) {
|
|
@@ -458,7 +556,7 @@ var MongoDBMemory = class _MongoDBMemory {
|
|
|
458
556
|
return this.connected;
|
|
459
557
|
}
|
|
460
558
|
async ensureConnection() {
|
|
461
|
-
if (!this.
|
|
559
|
+
if (!this.connected && !this.reconnecting) {
|
|
462
560
|
await this.connect();
|
|
463
561
|
}
|
|
464
562
|
const maxWaitTime = 3e4;
|
|
@@ -466,10 +564,66 @@ var MongoDBMemory = class _MongoDBMemory {
|
|
|
466
564
|
while (this.reconnecting && Date.now() - startTime < maxWaitTime) {
|
|
467
565
|
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
468
566
|
}
|
|
469
|
-
if (!this.
|
|
567
|
+
if (!this.connected) {
|
|
470
568
|
throw new Error("MongoDB is not connected and reconnection failed");
|
|
471
569
|
}
|
|
472
570
|
}
|
|
571
|
+
async setupTTLIndex() {
|
|
572
|
+
if (this.threadTTLSeconds === void 0) return;
|
|
573
|
+
try {
|
|
574
|
+
const db = mongoose.connection.db;
|
|
575
|
+
if (!db) return;
|
|
576
|
+
const collection = db.collection("threads");
|
|
577
|
+
const indexes = await collection.indexes();
|
|
578
|
+
const existingTTL = indexes.find(
|
|
579
|
+
(idx) => idx.key?.updatedAt !== void 0 && idx.expireAfterSeconds !== void 0
|
|
580
|
+
);
|
|
581
|
+
if (existingTTL) {
|
|
582
|
+
if (existingTTL.expireAfterSeconds !== this.threadTTLSeconds) {
|
|
583
|
+
await db.command({
|
|
584
|
+
collMod: "threads",
|
|
585
|
+
index: { keyPattern: { updatedAt: 1 }, expireAfterSeconds: this.threadTTLSeconds }
|
|
586
|
+
});
|
|
587
|
+
loggers2.agent.info(`Thread TTL index updated to ${this.threadTTLSeconds} seconds`);
|
|
588
|
+
}
|
|
589
|
+
} else {
|
|
590
|
+
await collection.createIndex(
|
|
591
|
+
{ updatedAt: 1 },
|
|
592
|
+
{ expireAfterSeconds: this.threadTTLSeconds }
|
|
593
|
+
);
|
|
594
|
+
loggers2.agent.info(`Thread TTL index created with ${this.threadTTLSeconds} seconds`);
|
|
595
|
+
}
|
|
596
|
+
} catch (error) {
|
|
597
|
+
loggers2.agent.error("Failed to setup TTL index:", error);
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
startOrphanCleanup() {
|
|
601
|
+
if (this.threadTTLSeconds === void 0) return;
|
|
602
|
+
if (this.orphanCleanupTimer) return;
|
|
603
|
+
const intervalMs = Math.max(6e4, Math.min(this.threadTTLSeconds * 500, 36e5));
|
|
604
|
+
this.orphanCleanupTimer = setInterval(() => {
|
|
605
|
+
this.cleanupOrphanedMessages().catch((error) => {
|
|
606
|
+
loggers2.agent.error("Orphaned message cleanup failed:", error);
|
|
607
|
+
});
|
|
608
|
+
}, intervalMs);
|
|
609
|
+
loggers2.agent.info(`Orphaned message cleanup scheduled every ${Math.round(intervalMs / 1e3)}s`);
|
|
610
|
+
}
|
|
611
|
+
async cleanupOrphanedMessages() {
|
|
612
|
+
if (!this.connected) return;
|
|
613
|
+
try {
|
|
614
|
+
const db = mongoose.connection.db;
|
|
615
|
+
if (!db) return;
|
|
616
|
+
const existingThreadIds = await db.collection("threads").distinct("threadId");
|
|
617
|
+
const result = await MessageModel.deleteMany({
|
|
618
|
+
threadId: { $nin: existingThreadIds }
|
|
619
|
+
});
|
|
620
|
+
if (result.deletedCount > 0) {
|
|
621
|
+
loggers2.agent.info(`Cleaned up ${result.deletedCount} orphaned messages`);
|
|
622
|
+
}
|
|
623
|
+
} catch (error) {
|
|
624
|
+
loggers2.agent.error("Failed to cleanup orphaned messages:", error);
|
|
625
|
+
}
|
|
626
|
+
}
|
|
473
627
|
/**
|
|
474
628
|
* Get the operation timeout in milliseconds
|
|
475
629
|
*/
|
|
@@ -489,6 +643,25 @@ var MongoDBMemory = class _MongoDBMemory {
|
|
|
489
643
|
loggers2.agent.error(`${operationName} exceeded time limit`);
|
|
490
644
|
throw error;
|
|
491
645
|
}
|
|
646
|
+
if (error.code === 261 || error.codeName === "TooManyLogicalSessions") {
|
|
647
|
+
loggers2.agent.warn(
|
|
648
|
+
`${operationName} failed due to too many sessions, disconnecting to release sessions...`
|
|
649
|
+
);
|
|
650
|
+
try {
|
|
651
|
+
await mongoose.disconnect();
|
|
652
|
+
this.connected = false;
|
|
653
|
+
} catch (disconnectError) {
|
|
654
|
+
loggers2.agent.error("Failed to disconnect during session cleanup:", disconnectError);
|
|
655
|
+
}
|
|
656
|
+
await new Promise((resolve) => setTimeout(resolve, 5e3));
|
|
657
|
+
await this.ensureConnection();
|
|
658
|
+
try {
|
|
659
|
+
return await operation();
|
|
660
|
+
} catch (retryError) {
|
|
661
|
+
loggers2.agent.error(`${operationName} failed after session cleanup retry:`, retryError);
|
|
662
|
+
throw retryError;
|
|
663
|
+
}
|
|
664
|
+
}
|
|
492
665
|
if (error.name === "MongoNetworkError" || error.name === "MongoServerError" || error.message?.includes("connection") || error.message?.includes("disconnect")) {
|
|
493
666
|
loggers2.agent.warn(
|
|
494
667
|
`${operationName} failed due to connection issue, attempting reconnection...`
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../implements/base.memory.ts","../implements/agent.memory.ts","../implements/intent.memory.ts","../implements/thread.memory.ts","../implements/workflow.memory.ts"],"sourcesContent":["import { IAgentMemory, IIntentMemory, IMemory, IThreadMemory, IWorkflowMemory } from \"@ainetwork/adk/modules\";\nimport mongoose from \"mongoose\";\nimport { loggers } from \"@ainetwork/adk/utils/logger\";\nimport { MongoDBAgent } from \"./agent.memory\";\nimport { MongoDBIntent } from \"./intent.memory\";\nimport { MongoDBThread } from \"./thread.memory\";\nimport { MongoDBWorkflow } from \"./workflow.memory\";\n\nexport interface MongoDBMemoryConfig {\n uri: string;\n maxReconnectAttempts?: number;\n reconnectInterval?: number;\n maxPoolSize?: number;\n serverSelectionTimeoutMS?: number;\n socketTimeoutMS?: number;\n connectTimeoutMS?: number;\n operationTimeoutMS?: number; // Timeout for database operations\n}\n\nexport class MongoDBMemory implements IMemory {\n private static instance: MongoDBMemory;\n private uri: string;\n private connected: boolean = false;\n private reconnectAttempts: number = 0;\n private maxReconnectAttempts: number;\n private reconnectInterval: number;\n private reconnecting: boolean = false;\n private connectionConfig: mongoose.ConnectOptions;\n private eventListenersSetup: boolean = false;\n private operationTimeoutMS: number;\n\n private agentMemory: MongoDBAgent;\n private intentMemory: MongoDBIntent;\n private threadMemory: MongoDBThread;\n private workflowMemory: MongoDBWorkflow;\n\n constructor(config: string | MongoDBMemoryConfig) {\n const cfg = typeof config === 'string' ? { uri: config } : config;\n\n this.uri = cfg.uri;\n this.maxReconnectAttempts = cfg.maxReconnectAttempts ?? 5;\n this.reconnectInterval = cfg.reconnectInterval ?? 5000;\n this.operationTimeoutMS = cfg.operationTimeoutMS ?? 10000; // Default 10 seconds\n this.connectionConfig = {\n maxPoolSize: cfg.maxPoolSize ?? 1,\n serverSelectionTimeoutMS: cfg.serverSelectionTimeoutMS ?? 30000,\n socketTimeoutMS: cfg.socketTimeoutMS ?? 45000,\n connectTimeoutMS: cfg.connectTimeoutMS ?? 30000,\n bufferCommands: false,\n };\n\n if (!MongoDBMemory.instance) {\n MongoDBMemory.instance = this;\n this.setupMongooseEventListeners();\n } else {\n // Use existing instance's connection state\n this.connected = MongoDBMemory.instance.connected;\n this.operationTimeoutMS = MongoDBMemory.instance.operationTimeoutMS;\n }\n\n\t\tthis.agentMemory = new MongoDBAgent(\n\t\t\tthis.executeWithRetry.bind(this),\n\t\t\tthis.getOperationTimeout.bind(this)\n\t\t);\n\n\t\tthis.threadMemory = new MongoDBThread(\n\t\t\tthis.executeWithRetry.bind(this),\n\t\t\tthis.getOperationTimeout.bind(this)\n\t\t);\n\n\t\tthis.intentMemory = new MongoDBIntent(\n\t\t\tthis.executeWithRetry.bind(this),\n\t\t\tthis.getOperationTimeout.bind(this)\n\t\t);\n\n\t\tthis.workflowMemory = new MongoDBWorkflow(\n\t\t\tthis.executeWithRetry.bind(this),\n\t\t\tthis.getOperationTimeout.bind(this)\n\t\t);\n }\n\n public getAgentMemory(): IAgentMemory {\n return this.agentMemory;\n }\n\n public getThreadMemory(): IThreadMemory {\n return this.threadMemory;\n }\n\n public getIntentMemory(): IIntentMemory {\n return this.intentMemory;\n }\n\n public getWorkflowMemory(): IWorkflowMemory {\n return this.workflowMemory;\n }\n\n private setupMongooseEventListeners(): void {\n if (this.eventListenersSetup) return;\n\n this.eventListenersSetup = true;\n\n mongoose.connection.on(\"connected\", () => {\n this.connected = true;\n this.reconnectAttempts = 0;\n this.reconnecting = false;\n loggers.agent.info(\"MongoDB connected successfully\");\n });\n\n mongoose.connection.on(\"disconnected\", () => {\n this.connected = false;\n loggers.agent.warn(\"MongoDB disconnected\");\n this.handleDisconnection();\n });\n\n mongoose.connection.on(\"error\", (error) => {\n this.connected = false;\n loggers.agent.error(\"MongoDB connection error:\", error);\n this.handleDisconnection();\n });\n\n mongoose.connection.on(\"reconnected\", () => {\n this.connected = true;\n this.reconnectAttempts = 0;\n this.reconnecting = false;\n loggers.agent.info(\"MongoDB reconnected successfully\");\n });\n }\n\n private async handleDisconnection(): Promise<void> {\n if (this.reconnecting) {\n return;\n }\n\n this.reconnecting = true;\n\n while (this.reconnectAttempts < this.maxReconnectAttempts && !this.isConnected) {\n this.reconnectAttempts++;\n loggers.agent.info(\n `Attempting to reconnect to MongoDB (${this.reconnectAttempts}/${this.maxReconnectAttempts})...`\n );\n\n try {\n await mongoose.connect(this.uri, this.connectionConfig);\n this.connected = true;\n this.reconnectAttempts = 0;\n this.reconnecting = false;\n loggers.agent.info(\"MongoDB reconnection successful\");\n return;\n } catch (error) {\n loggers.agent.error(\n `Reconnection attempt ${this.reconnectAttempts} failed:`,\n error\n );\n\n if (this.reconnectAttempts < this.maxReconnectAttempts) {\n await new Promise((resolve) =>\n setTimeout(resolve, this.reconnectInterval)\n );\n }\n }\n }\n\n this.reconnecting = false;\n\n if (!this.isConnected) {\n loggers.agent.error(\n `Failed to reconnect to MongoDB after ${this.maxReconnectAttempts} attempts`\n );\n }\n }\n\n public async connect(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n try {\n await mongoose.connect(this.uri, this.connectionConfig);\n this.connected = true;\n this.reconnectAttempts = 0;\n } catch (error) {\n loggers.agent.error(\"Failed to connect to MongoDB:\", error);\n throw error;\n }\n }\n\n public async disconnect(): Promise<void> {\n if (!this.isConnected) {\n return;\n }\n\n try {\n await mongoose.disconnect();\n this.connected = false;\n } catch (error) {\n loggers.agent.error(\"Failed to disconnect from MongoDB:\", error);\n throw error;\n }\n }\n\n public isConnected(): boolean {\n return this.connected;\n }\n\n private async ensureConnection(): Promise<void> {\n if (!this.isConnected && !this.reconnecting) {\n await this.connect();\n }\n\n // Wait for reconnection if in progress\n const maxWaitTime = 30000; // 30 seconds\n const startTime = Date.now();\n while (this.reconnecting && Date.now() - startTime < maxWaitTime) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n\n if (!this.isConnected) {\n throw new Error(\"MongoDB is not connected and reconnection failed\");\n }\n }\n\n /**\n * Get the operation timeout in milliseconds\n */\n protected getOperationTimeout(): number {\n return this.operationTimeoutMS;\n }\n\n /**\n * Execute a database operation with automatic retry on connection errors\n * Note: Use mongoose's maxTimeMS option in queries for timeout control\n */\n protected async executeWithRetry<T>(\n operation: () => Promise<T>,\n operationName: string = \"Database operation\"\n ): Promise<T> {\n await this.ensureConnection();\n\n try {\n return await operation();\n } catch (error: any) {\n // Check if it's a timeout error from MongoDB\n if (error.code === 50 || error.message?.includes(\"operation exceeded time limit\")) {\n loggers.agent.error(`${operationName} exceeded time limit`);\n throw error;\n }\n\n // Check if it's a connection-related error\n if (\n error.name === \"MongoNetworkError\" ||\n error.name === \"MongoServerError\" ||\n error.message?.includes(\"connection\") ||\n error.message?.includes(\"disconnect\")\n ) {\n loggers.agent.warn(\n `${operationName} failed due to connection issue, attempting reconnection...`\n );\n\n await this.ensureConnection();\n\n // Retry the operation once after reconnection\n try {\n return await operation();\n } catch (retryError: any) {\n loggers.agent.error(`${operationName} failed after retry:`, retryError);\n throw retryError;\n }\n }\n\n // If it's not a connection error, just throw it\n throw error;\n }\n }\n}\n","import { IAgentMemory } from \"@ainetwork/adk/modules\";\nimport { AgentModel } from \"../models/agent.model\";\n\nexport type ExecuteWithRetryFn = <T>(\n operation: () => Promise<T>,\n operationName?: string\n) => Promise<T>;\n\nexport type GetOperationTimeoutFn = () => number;\n\ntype PromptDocument = {\n id: string;\n prompt: string;\n}\n\nexport class MongoDBAgent implements IAgentMemory {\n private executeWithRetry: ExecuteWithRetryFn;\n private getOperationTimeout: GetOperationTimeoutFn;\n\n constructor(\n executeWithRetry: ExecuteWithRetryFn,\n getOperationTimeout: GetOperationTimeoutFn\n ) {\n this.executeWithRetry = executeWithRetry;\n this.getOperationTimeout = getOperationTimeout;\n }\n\n public async getAgentPrompt(): Promise<string> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n const metadata = await AgentModel.findOne({\n id: \"agent_prompt\"\n }).maxTimeMS(timeout)\n .lean<PromptDocument>();\n return metadata?.prompt || \"\";\n }, \"getAgentPrompt()\");\n };\n \n public async updateAgentPrompt(prompt: string): Promise<void> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n await AgentModel.updateOne({\n id: \"agent_prompt\",\n }, { \"prompt\": prompt }, { upsert: true }).maxTimeMS(timeout);\n }, \"updateAgentPrompt()\");\n };\n\n public async getAggregatePrompt(): Promise<string> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n const metadata = await AgentModel.findOne({\n id: \"aggregate_prompt\"\n }).maxTimeMS(timeout)\n .lean<PromptDocument>();\n return metadata?.prompt || \"\";\n }, \"getAggregatePrompt()\");\n };\n\n public async getGenerateTitlePrompt(): Promise<string> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n const metadata = await AgentModel.findOne({\n id: \"generate_title_prompt\"\n }).maxTimeMS(timeout)\n .lean<PromptDocument>();\n return metadata?.prompt || \"\";\n }, \"getGenerateTitlePrompt()\");\n };\n\n public async getSingleTriggerPrompt(): Promise<string> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n const metadata = await AgentModel.findOne({\n id: \"single_trigger_prompt\"\n }).maxTimeMS(timeout)\n .lean<PromptDocument>();\n return metadata?.prompt || \"\";\n }, \"getSingleTriggerPrompt()\");\n };\n\n public async getMultiTriggerPrompt(): Promise<string> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n const metadata = await AgentModel.findOne({\n id: \"multi_trigger_prompt\"\n }).maxTimeMS(timeout)\n .lean<PromptDocument>();\n return metadata?.prompt || \"\";\n }, \"getMultiTriggerPrompt()\");\n };\n\n public async getToolSelectPrompt(): Promise<string> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n const metadata = await AgentModel.findOne({\n id: \"tool_select_prompt\"\n }).maxTimeMS(timeout)\n .lean<PromptDocument>();\n return metadata?.prompt || \"\";\n }, \"getToolSelectPrompt()\");\n };\n\n public async getPIIDetectPrompt(): Promise<string> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n const metadata = await AgentModel.findOne({\n id: \"pii_detect_prompt\"\n }).maxTimeMS(timeout)\n .lean<PromptDocument>();\n return metadata?.prompt || \"\";\n }, \"getPIIDetectPrompt()\");\n };\n\n public async getPIIFilterPrompt(): Promise<string> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n const metadata = await AgentModel.findOne({\n id: \"pii_filter_prompt\"\n }).maxTimeMS(timeout)\n .lean<PromptDocument>();\n return metadata?.prompt || \"\";\n }, \"getPIIFilterPrompt()\");\n };\n}\n","import type { Intent } from \"@ainetwork/adk/types/memory\";\nimport { IIntentMemory } from \"@ainetwork/adk/modules\";\nimport { IntentModel } from \"../models/intent.model\";\n\nexport type ExecuteWithRetryFn = <T>(\n operation: () => Promise<T>,\n operationName?: string\n) => Promise<T>;\n\nexport type GetOperationTimeoutFn = () => number;\n\nexport class MongoDBIntent implements IIntentMemory {\n private executeWithRetry: ExecuteWithRetryFn;\n private getOperationTimeout: GetOperationTimeoutFn;\n\n constructor(\n executeWithRetry: ExecuteWithRetryFn,\n getOperationTimeout: GetOperationTimeoutFn\n ) {\n this.executeWithRetry = executeWithRetry;\n this.getOperationTimeout = getOperationTimeout;\n }\n\n public async getIntent(intentId: string): Promise<Intent | undefined> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n const intent = await IntentModel.findOne({ id: intentId })\n .maxTimeMS(timeout)\n .lean<Intent>();\n return intent || undefined;\n }, `getIntent(${intentId})`);\n };\n\n public async getIntentByName(intentName: string): Promise<Intent | undefined> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n const intent = await IntentModel.findOne({ name: intentName })\n .maxTimeMS(timeout)\n .lean<Intent>();\n return intent || undefined;\n }, `getIntentByName(${intentName})`);\n }\n\n public async saveIntent(intent: Intent): Promise<void> {\n return this.executeWithRetry(async () => {\n await IntentModel.create(intent);\n }, `saveIntent(${intent.id})`);\n };\n\n public async updateIntent(intentId: string, intent: Intent): Promise<void> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n await IntentModel.updateOne({\n id: intentId,\n }, intent).maxTimeMS(timeout);\n }, `updateIntent(${intentId})`);\n };\n\n public async deleteIntent(intentId: string): Promise<void> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n await IntentModel.deleteOne({ id: intentId }).maxTimeMS(timeout);\n }, `deleteIntent(${intentId})`);\n };\n\n public async listIntents(): Promise<Intent[]> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n const intents = await IntentModel.find()\n .maxTimeMS(timeout)\n .lean<Intent[]>();\n return intents;\n }, `listIntents()`);\n };\n}\n","import type { MessageObject, ThreadMetadata, ThreadObject, ThreadType } from \"@ainetwork/adk/types/memory\";\nimport { MessageRole } from \"@ainetwork/adk/types/memory\";\nimport { IThreadMemory } from \"@ainetwork/adk/modules\";\nimport { ThreadDocument, ThreadModel } from \"../models/threads.model\";\nimport { MessageDocument, MessageModel } from \"../models/messages.model\";\nimport { loggers } from \"@ainetwork/adk/utils/logger\";\n\nexport type ExecuteWithRetryFn = <T>(\n operation: () => Promise<T>,\n operationName?: string\n) => Promise<T>;\n\nexport type GetOperationTimeoutFn = () => number;\n\nexport class MongoDBThread implements IThreadMemory {\n private executeWithRetry: ExecuteWithRetryFn;\n private getOperationTimeout: GetOperationTimeoutFn;\n\n constructor(\n executeWithRetry: ExecuteWithRetryFn,\n getOperationTimeout: GetOperationTimeoutFn\n ) {\n this.executeWithRetry = executeWithRetry;\n this.getOperationTimeout = getOperationTimeout;\n }\n\n public async getThread(\n userId: string,\n threadId: string\n ): Promise<ThreadObject | undefined> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n const thread = await ThreadModel.findOne({ threadId, userId }).maxTimeMS(timeout);\n const messages = await MessageModel.find({ threadId, userId })\n .sort({ timestamp: 1 })\n .maxTimeMS(timeout);\n\n if (!thread) return undefined;\n\n loggers.agent.debug(`Found ${messages.length} messages for thread ${threadId}`);\n\n const threadObject: ThreadObject = {\n threadId: thread.threadId,\n userId: thread.userId,\n type: thread.type as ThreadType,\n title: thread.title || \"New thread\",\n messages: []\n };\n messages.forEach((message: MessageDocument) => {\n threadObject.messages.push({\n messageId: message.messageId,\n role: message.role as MessageRole,\n content: message.content,\n timestamp: message.timestamp,\n metadata: message.metadata,\n });\n });\n\n return threadObject;\n }, `getThread(${userId}, ${threadId})`);\n };\n\n public async createThread(\n type: ThreadType,\n userId: string,\n threadId: string,\n title: string,\n ): Promise<ThreadObject> {\n return this.executeWithRetry(async () => {\n const now = Date.now();\n await ThreadModel.create({\n type,\n userId,\n threadId,\n title,\n updated_at: now,\n created_at: now,\n });\n\n return { type, userId, threadId, title, messages: []};\n }, `createThread(${userId}, ${threadId})`);\n };\n\n public async addMessagesToThread(\n userId: string,\n threadId: string,\n messages: MessageObject[]\n ): Promise<void> {\n return this.executeWithRetry(async () => {\n await ThreadModel.updateOne({ threadId, userId }, {\n updated_at: Date.now(),\n });\n for (const message of messages) {\n await MessageModel.create({\n threadId,\n messageId: message.messageId,\n userId,\n role: message.role,\n content: message.content,\n timestamp: message.timestamp,\n metadata: message.metadata,\n });\n }\n }, `addMessagesToThread(${userId}, ${threadId})`);\n };\n\n public async deleteThread(userId: string, threadId: string): Promise<void> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n\n // Delete all messages for this thread\n await MessageModel.deleteMany({ userId, threadId }).maxTimeMS(timeout);\n\n // Delete the thread itself\n await ThreadModel.deleteOne({ userId, threadId }).maxTimeMS(timeout);\n }, `deleteThread(${userId}, ${threadId})`);\n };\n\n public async listThreads(userId: string): Promise<ThreadMetadata[]> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n const threads = await ThreadModel.find({ userId })\n .sort({ updated_at: -1 })\n .maxTimeMS(timeout);\n const data: ThreadMetadata[] = threads.map((thread: ThreadDocument) => {\n return {\n type: thread.type,\n userId,\n threadId: thread.threadId,\n title: thread.title,\n updatedAt: thread.updated_at\n } as ThreadMetadata;\n })\n return data;\n }, `listThreads(${userId})`);\n };\n}\n","import type { IWorkflowMemory } from \"@ainetwork/adk/modules\";\nimport type { Workflow } from \"@ainetwork/adk/types/memory\";\nimport { WorkflowModel } from \"../models/workflow.model\";\n\nexport type ExecuteWithRetryFn = <T>(\n operation: () => Promise<T>,\n operationName?: string\n) => Promise<T>;\n\nexport type GetOperationTimeoutFn = () => number;\n\nexport class MongoDBWorkflow implements IWorkflowMemory {\n private executeWithRetry: ExecuteWithRetryFn;\n private getOperationTimeout: GetOperationTimeoutFn;\n\n constructor(\n executeWithRetry: ExecuteWithRetryFn,\n getOperationTimeout: GetOperationTimeoutFn\n ) {\n this.executeWithRetry = executeWithRetry;\n this.getOperationTimeout = getOperationTimeout;\n }\n\n public async createWorkflow(workflow: Workflow): Promise<Workflow> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n const created = await WorkflowModel.create(workflow);\n return created.toObject() as Workflow;\n }, \"createWorkflow()\");\n }\n\n public async getWorkflow(workflowId: string): Promise<Workflow | undefined> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n const workflow = await WorkflowModel.findOne({\n workflowId\n }).maxTimeMS(timeout).lean<Workflow>();\n return workflow || undefined;\n }, \"getWorkflow()\");\n }\n\n public async updateWorkflow(workflowId: string, updates: Partial<Workflow>): Promise<void> {\n if (!updates.userId) {\n throw new Error(\"userId is required for updateWorkflow\");\n }\n\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n // userId를 조건에 포함하여 소유자만 수정 가능하도록 함\n await WorkflowModel.updateOne(\n { workflowId, userId: updates.userId },\n { $set: updates }\n ).maxTimeMS(timeout);\n }, \"updateWorkflow()\");\n }\n\n public async deleteWorkflow(workflowId: string, userId: string): Promise<void> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n await WorkflowModel.deleteOne({ workflowId, userId }).maxTimeMS(timeout);\n }, \"deleteWorkflow()\");\n }\n\n public async listWorkflows(userId?: string): Promise<Workflow[]> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n // userId가 있으면: 해당 유저 소유 + 템플릿(userId 없음)\n // userId가 없으면: 템플릿만 반환\n const query = userId\n ? { $or: [{ userId }, { userId: { $exists: false } }, { userId: null }] }\n : { $or: [{ userId: { $exists: false } }, { userId: null }] };\n const workflows = await WorkflowModel.find(query)\n .maxTimeMS(timeout)\n .lean<Workflow[]>();\n return workflows;\n }, \"listWorkflows()\");\n }\n}\n"],"mappings":"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","names":["loggers","loggers"]}
|
|
1
|
+
{"version":3,"sources":["../implements/base.memory.ts","../implements/agent.memory.ts","../implements/intent.memory.ts","../implements/thread.memory.ts","../implements/user-workflow.memory.ts","../implements/workflow-template.memory.ts"],"sourcesContent":["import { IAgentMemory, IIntentMemory, IMemory, IUserWorkflowMemory, IThreadMemory, IWorkflowTemplateMemory } from \"@ainetwork/adk/modules\";\nimport mongoose from \"mongoose\";\nimport { loggers } from \"@ainetwork/adk/utils/logger\";\nimport { MongoDBAgent } from \"./agent.memory\";\nimport { MongoDBIntent } from \"./intent.memory\";\nimport { MongoDBThread } from \"./thread.memory\";\nimport { MongoDBUserWorkflow } from \"./user-workflow.memory\";\nimport { MongoDBWorkflowTemplate } from \"./workflow-template.memory\";\nimport { MessageModel } from \"../models/messages.model\";\n\nexport interface MongoDBMemoryConfig {\n uri: string;\n maxReconnectAttempts?: number;\n reconnectInterval?: number;\n maxPoolSize?: number;\n serverSelectionTimeoutMS?: number;\n socketTimeoutMS?: number;\n connectTimeoutMS?: number;\n operationTimeoutMS?: number; // Timeout for database operations\n threadTTLSeconds?: number; // TTL for thread documents (in seconds). Orphaned messages are periodically cleaned up.\n}\n\nexport class MongoDBMemory implements IMemory {\n private static instance: MongoDBMemory;\n private uri: string;\n private connected: boolean = false;\n private reconnectAttempts: number = 0;\n private maxReconnectAttempts: number;\n private reconnectInterval: number;\n private reconnecting: boolean = false;\n private connectionConfig: mongoose.ConnectOptions;\n private eventListenersSetup: boolean = false;\n private operationTimeoutMS: number;\n private threadTTLSeconds?: number;\n private orphanCleanupTimer?: ReturnType<typeof setInterval>;\n\n private agentMemory: MongoDBAgent;\n private intentMemory: MongoDBIntent;\n private threadMemory: MongoDBThread;\n private workflowTemplateMemory: MongoDBWorkflowTemplate;\n private userWorkflowMemory: MongoDBUserWorkflow;\n\n constructor(config: string | MongoDBMemoryConfig) {\n const cfg = typeof config === 'string' ? { uri: config } : config;\n\n this.uri = cfg.uri;\n this.maxReconnectAttempts = cfg.maxReconnectAttempts ?? 5;\n this.reconnectInterval = cfg.reconnectInterval ?? 5000;\n this.operationTimeoutMS = cfg.operationTimeoutMS ?? 10000; // Default 10 seconds\n if (cfg.threadTTLSeconds !== undefined && cfg.threadTTLSeconds > 0) {\n this.threadTTLSeconds = cfg.threadTTLSeconds;\n }\n this.connectionConfig = {\n maxPoolSize: cfg.maxPoolSize ?? 10,\n minPoolSize: 0,\n maxIdleTimeMS: 30000,\n serverSelectionTimeoutMS: cfg.serverSelectionTimeoutMS ?? 30000,\n socketTimeoutMS: cfg.socketTimeoutMS ?? 45000,\n connectTimeoutMS: cfg.connectTimeoutMS ?? 30000,\n bufferCommands: false,\n };\n\n if (!MongoDBMemory.instance) {\n MongoDBMemory.instance = this;\n this.setupMongooseEventListeners();\n } else {\n // Use existing instance's connection state\n this.connected = MongoDBMemory.instance.connected;\n this.operationTimeoutMS = MongoDBMemory.instance.operationTimeoutMS;\n }\n\n\t\tthis.agentMemory = new MongoDBAgent(\n\t\t\tthis.executeWithRetry.bind(this),\n\t\t\tthis.getOperationTimeout.bind(this)\n\t\t);\n\n\t\tthis.threadMemory = new MongoDBThread(\n\t\t\tthis.executeWithRetry.bind(this),\n\t\t\tthis.getOperationTimeout.bind(this)\n\t\t);\n\n\t\tthis.intentMemory = new MongoDBIntent(\n\t\t\tthis.executeWithRetry.bind(this),\n\t\t\tthis.getOperationTimeout.bind(this)\n\t\t);\n\n\t\tthis.workflowTemplateMemory = new MongoDBWorkflowTemplate(\n\t\t\tthis.executeWithRetry.bind(this),\n\t\t\tthis.getOperationTimeout.bind(this)\n\t\t);\n\n\t\tthis.userWorkflowMemory = new MongoDBUserWorkflow(\n\t\t\tthis.executeWithRetry.bind(this),\n\t\t\tthis.getOperationTimeout.bind(this)\n\t\t);\n }\n\n public getAgentMemory(): IAgentMemory {\n return this.agentMemory;\n }\n\n public getThreadMemory(): IThreadMemory {\n return this.threadMemory;\n }\n\n public getIntentMemory(): IIntentMemory {\n return this.intentMemory;\n }\n\n public getWorkflowTemplateMemory(): IWorkflowTemplateMemory {\n return this.workflowTemplateMemory;\n }\n\n public getUserWorkflowMemory(): IUserWorkflowMemory {\n return this.userWorkflowMemory;\n }\n\n private setupMongooseEventListeners(): void {\n if (this.eventListenersSetup) return;\n\n this.eventListenersSetup = true;\n\n mongoose.connection.on(\"connected\", () => {\n this.connected = true;\n this.reconnectAttempts = 0;\n this.reconnecting = false;\n loggers.agent.info(\"MongoDB connected successfully\");\n });\n\n mongoose.connection.on(\"disconnected\", () => {\n this.connected = false;\n loggers.agent.warn(\"MongoDB disconnected\");\n this.handleDisconnection();\n });\n\n mongoose.connection.on(\"error\", (error) => {\n this.connected = false;\n loggers.agent.error(\"MongoDB connection error:\", error);\n this.handleDisconnection();\n });\n\n mongoose.connection.on(\"reconnected\", () => {\n this.connected = true;\n this.reconnectAttempts = 0;\n this.reconnecting = false;\n loggers.agent.info(\"MongoDB reconnected successfully\");\n });\n }\n\n private async handleDisconnection(): Promise<void> {\n if (this.reconnecting) {\n return;\n }\n\n this.reconnecting = true;\n\n while (this.reconnectAttempts < this.maxReconnectAttempts && !this.connected) {\n this.reconnectAttempts++;\n loggers.agent.info(\n `Attempting to reconnect to MongoDB (${this.reconnectAttempts}/${this.maxReconnectAttempts})...`\n );\n\n try {\n await mongoose.connect(this.uri, this.connectionConfig);\n this.connected = true;\n this.reconnectAttempts = 0;\n this.reconnecting = false;\n loggers.agent.info(\"MongoDB reconnection successful\");\n return;\n } catch (error) {\n loggers.agent.error(\n `Reconnection attempt ${this.reconnectAttempts} failed:`,\n error\n );\n\n if (this.reconnectAttempts < this.maxReconnectAttempts) {\n await new Promise((resolve) =>\n setTimeout(resolve, this.reconnectInterval)\n );\n }\n }\n }\n\n this.reconnecting = false;\n\n if (!this.connected) {\n loggers.agent.error(\n `Failed to reconnect to MongoDB after ${this.maxReconnectAttempts} attempts`\n );\n }\n }\n\n public async connect(): Promise<void> {\n if (this.connected) {\n return;\n }\n\n try {\n await mongoose.connect(this.uri, this.connectionConfig);\n this.connected = true;\n this.reconnectAttempts = 0;\n await this.setupTTLIndex();\n this.startOrphanCleanup();\n } catch (error) {\n loggers.agent.error(\"Failed to connect to MongoDB:\", error);\n throw error;\n }\n }\n\n public async disconnect(): Promise<void> {\n if (!this.connected) {\n return;\n }\n\n try {\n if (this.orphanCleanupTimer) {\n clearInterval(this.orphanCleanupTimer);\n this.orphanCleanupTimer = undefined;\n }\n await mongoose.disconnect();\n this.connected = false;\n } catch (error) {\n loggers.agent.error(\"Failed to disconnect from MongoDB:\", error);\n throw error;\n }\n }\n\n public isConnected(): boolean {\n return this.connected;\n }\n\n private async ensureConnection(): Promise<void> {\n if (!this.connected && !this.reconnecting) {\n await this.connect();\n }\n\n // Wait for reconnection if in progress\n const maxWaitTime = 30000; // 30 seconds\n const startTime = Date.now();\n while (this.reconnecting && Date.now() - startTime < maxWaitTime) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n\n if (!this.connected) {\n throw new Error(\"MongoDB is not connected and reconnection failed\");\n }\n }\n\n private async setupTTLIndex(): Promise<void> {\n if (this.threadTTLSeconds === undefined) return;\n\n try {\n const db = mongoose.connection.db;\n if (!db) return;\n\n const collection = db.collection('threads');\n const indexes = await collection.indexes();\n const existingTTL = indexes.find(\n (idx) => idx.key?.updatedAt !== undefined && idx.expireAfterSeconds !== undefined\n );\n\n if (existingTTL) {\n if (existingTTL.expireAfterSeconds !== this.threadTTLSeconds) {\n await db.command({\n collMod: 'threads',\n index: { keyPattern: { updatedAt: 1 }, expireAfterSeconds: this.threadTTLSeconds },\n });\n loggers.agent.info(`Thread TTL index updated to ${this.threadTTLSeconds} seconds`);\n }\n } else {\n await collection.createIndex(\n { updatedAt: 1 },\n { expireAfterSeconds: this.threadTTLSeconds },\n );\n loggers.agent.info(`Thread TTL index created with ${this.threadTTLSeconds} seconds`);\n }\n } catch (error) {\n loggers.agent.error('Failed to setup TTL index:', error);\n }\n }\n\n private startOrphanCleanup(): void {\n if (this.threadTTLSeconds === undefined) return;\n if (this.orphanCleanupTimer) return;\n\n // Run cleanup at half the TTL interval, with a minimum of 60s and maximum of 1 hour\n const intervalMs = Math.max(60_000, Math.min(this.threadTTLSeconds * 500, 3_600_000));\n this.orphanCleanupTimer = setInterval(() => {\n this.cleanupOrphanedMessages().catch((error) => {\n loggers.agent.error('Orphaned message cleanup failed:', error);\n });\n }, intervalMs);\n\n loggers.agent.info(`Orphaned message cleanup scheduled every ${Math.round(intervalMs / 1000)}s`);\n }\n\n private async cleanupOrphanedMessages(): Promise<void> {\n if (!this.connected) return;\n\n try {\n const db = mongoose.connection.db;\n if (!db) return;\n\n const existingThreadIds = await db.collection('threads').distinct('threadId');\n const result = await MessageModel.deleteMany({\n threadId: { $nin: existingThreadIds },\n });\n\n if (result.deletedCount > 0) {\n loggers.agent.info(`Cleaned up ${result.deletedCount} orphaned messages`);\n }\n } catch (error) {\n loggers.agent.error('Failed to cleanup orphaned messages:', error);\n }\n }\n\n /**\n * Get the operation timeout in milliseconds\n */\n protected getOperationTimeout(): number {\n return this.operationTimeoutMS;\n }\n\n /**\n * Execute a database operation with automatic retry on connection errors\n * Note: Use mongoose's maxTimeMS option in queries for timeout control\n */\n protected async executeWithRetry<T>(\n operation: () => Promise<T>,\n operationName: string = \"Database operation\"\n ): Promise<T> {\n await this.ensureConnection();\n\n try {\n return await operation();\n } catch (error: any) {\n // Check if it's a timeout error from MongoDB\n if (error.code === 50 || error.message?.includes(\"operation exceeded time limit\")) {\n loggers.agent.error(`${operationName} exceeded time limit`);\n throw error;\n }\n\n // Check if it's a TooManyLogicalSessions error\n if (error.code === 261 || error.codeName === \"TooManyLogicalSessions\") {\n loggers.agent.warn(\n `${operationName} failed due to too many sessions, disconnecting to release sessions...`\n );\n\n try {\n await mongoose.disconnect();\n this.connected = false;\n } catch (disconnectError) {\n loggers.agent.error(\"Failed to disconnect during session cleanup:\", disconnectError);\n }\n\n await new Promise((resolve) => setTimeout(resolve, 5000));\n await this.ensureConnection();\n\n try {\n return await operation();\n } catch (retryError: any) {\n loggers.agent.error(`${operationName} failed after session cleanup retry:`, retryError);\n throw retryError;\n }\n }\n\n // Check if it's a connection-related error\n if (\n error.name === \"MongoNetworkError\" ||\n error.name === \"MongoServerError\" ||\n error.message?.includes(\"connection\") ||\n error.message?.includes(\"disconnect\")\n ) {\n loggers.agent.warn(\n `${operationName} failed due to connection issue, attempting reconnection...`\n );\n\n await this.ensureConnection();\n\n // Retry the operation once after reconnection\n try {\n return await operation();\n } catch (retryError: any) {\n loggers.agent.error(`${operationName} failed after retry:`, retryError);\n throw retryError;\n }\n }\n\n // If it's not a connection error, just throw it\n throw error;\n }\n }\n}\n","import { IAgentMemory } from \"@ainetwork/adk/modules\";\nimport { AgentModel } from \"../models/agent.model\";\n\nexport type ExecuteWithRetryFn = <T>(\n operation: () => Promise<T>,\n operationName?: string\n) => Promise<T>;\n\nexport type GetOperationTimeoutFn = () => number;\n\ntype PromptDocument = {\n id: string;\n prompt: string;\n}\n\nexport class MongoDBAgent implements IAgentMemory {\n private executeWithRetry: ExecuteWithRetryFn;\n private getOperationTimeout: GetOperationTimeoutFn;\n\n constructor(\n executeWithRetry: ExecuteWithRetryFn,\n getOperationTimeout: GetOperationTimeoutFn\n ) {\n this.executeWithRetry = executeWithRetry;\n this.getOperationTimeout = getOperationTimeout;\n }\n\n public async getAgentPrompt(): Promise<string> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n const metadata = await AgentModel.findOne({\n id: \"agent_prompt\"\n }).maxTimeMS(timeout)\n .lean<PromptDocument>();\n return metadata?.prompt || \"\";\n }, \"getAgentPrompt()\");\n };\n \n public async updateAgentPrompt(prompt: string): Promise<void> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n await AgentModel.updateOne({\n id: \"agent_prompt\",\n }, { \"prompt\": prompt }, { upsert: true }).maxTimeMS(timeout);\n }, \"updateAgentPrompt()\");\n };\n\n public async getAggregatePrompt(): Promise<string> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n const metadata = await AgentModel.findOne({\n id: \"aggregate_prompt\"\n }).maxTimeMS(timeout)\n .lean<PromptDocument>();\n return metadata?.prompt || \"\";\n }, \"getAggregatePrompt()\");\n };\n\n public async getGenerateTitlePrompt(): Promise<string> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n const metadata = await AgentModel.findOne({\n id: \"generate_title_prompt\"\n }).maxTimeMS(timeout)\n .lean<PromptDocument>();\n return metadata?.prompt || \"\";\n }, \"getGenerateTitlePrompt()\");\n };\n\n public async getSingleTriggerPrompt(): Promise<string> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n const metadata = await AgentModel.findOne({\n id: \"single_trigger_prompt\"\n }).maxTimeMS(timeout)\n .lean<PromptDocument>();\n return metadata?.prompt || \"\";\n }, \"getSingleTriggerPrompt()\");\n };\n\n public async getMultiTriggerPrompt(): Promise<string> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n const metadata = await AgentModel.findOne({\n id: \"multi_trigger_prompt\"\n }).maxTimeMS(timeout)\n .lean<PromptDocument>();\n return metadata?.prompt || \"\";\n }, \"getMultiTriggerPrompt()\");\n };\n\n public async getToolSelectPrompt(): Promise<string> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n const metadata = await AgentModel.findOne({\n id: \"tool_select_prompt\"\n }).maxTimeMS(timeout)\n .lean<PromptDocument>();\n return metadata?.prompt || \"\";\n }, \"getToolSelectPrompt()\");\n };\n\n public async getPIIDetectPrompt(): Promise<string> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n const metadata = await AgentModel.findOne({\n id: \"pii_detect_prompt\"\n }).maxTimeMS(timeout)\n .lean<PromptDocument>();\n return metadata?.prompt || \"\";\n }, \"getPIIDetectPrompt()\");\n };\n\n public async getPIIFilterPrompt(): Promise<string> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n const metadata = await AgentModel.findOne({\n id: \"pii_filter_prompt\"\n }).maxTimeMS(timeout)\n .lean<PromptDocument>();\n return metadata?.prompt || \"\";\n }, \"getPIIFilterPrompt()\");\n };\n}\n","import type { Intent } from \"@ainetwork/adk/types/memory\";\nimport { IIntentMemory } from \"@ainetwork/adk/modules\";\nimport { IntentModel } from \"../models/intent.model\";\n\nexport type ExecuteWithRetryFn = <T>(\n operation: () => Promise<T>,\n operationName?: string\n) => Promise<T>;\n\nexport type GetOperationTimeoutFn = () => number;\n\nexport class MongoDBIntent implements IIntentMemory {\n private executeWithRetry: ExecuteWithRetryFn;\n private getOperationTimeout: GetOperationTimeoutFn;\n\n constructor(\n executeWithRetry: ExecuteWithRetryFn,\n getOperationTimeout: GetOperationTimeoutFn\n ) {\n this.executeWithRetry = executeWithRetry;\n this.getOperationTimeout = getOperationTimeout;\n }\n\n public async getIntent(intentId: string): Promise<Intent | undefined> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n const intent = await IntentModel.findOne({ id: intentId })\n .maxTimeMS(timeout)\n .lean<Intent>();\n return intent || undefined;\n }, `getIntent(${intentId})`);\n };\n\n public async getIntentByName(intentName: string): Promise<Intent | undefined> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n const intent = await IntentModel.findOne({ name: intentName })\n .maxTimeMS(timeout)\n .lean<Intent>();\n return intent || undefined;\n }, `getIntentByName(${intentName})`);\n }\n\n public async saveIntent(intent: Intent): Promise<void> {\n return this.executeWithRetry(async () => {\n await IntentModel.create(intent);\n }, `saveIntent(${intent.id})`);\n };\n\n public async updateIntent(intentId: string, intent: Intent): Promise<void> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n await IntentModel.updateOne({\n id: intentId,\n }, intent).maxTimeMS(timeout);\n }, `updateIntent(${intentId})`);\n };\n\n public async deleteIntent(intentId: string): Promise<void> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n await IntentModel.deleteOne({ id: intentId }).maxTimeMS(timeout);\n }, `deleteIntent(${intentId})`);\n };\n\n public async listIntents(): Promise<Intent[]> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n const intents = await IntentModel.find()\n .maxTimeMS(timeout)\n .lean<Intent[]>();\n return intents;\n }, `listIntents()`);\n };\n}\n","import type { MessageObject, ThreadMetadata, ThreadObject, ThreadType, ThreadFilter } from \"@ainetwork/adk/types/memory\";\nimport { MessageRole } from \"@ainetwork/adk/types/memory\";\nimport { IThreadMemory } from \"@ainetwork/adk/modules\";\nimport { ThreadDocument, ThreadModel } from \"../models/threads.model\";\nimport { MessageDocument, MessageModel } from \"../models/messages.model\";\nimport { loggers } from \"@ainetwork/adk/utils/logger\";\n\nexport type ExecuteWithRetryFn = <T>(\n operation: () => Promise<T>,\n operationName?: string\n) => Promise<T>;\n\nexport type GetOperationTimeoutFn = () => number;\n\nexport class MongoDBThread implements IThreadMemory {\n private executeWithRetry: ExecuteWithRetryFn;\n private getOperationTimeout: GetOperationTimeoutFn;\n\n constructor(\n executeWithRetry: ExecuteWithRetryFn,\n getOperationTimeout: GetOperationTimeoutFn\n ) {\n this.executeWithRetry = executeWithRetry;\n this.getOperationTimeout = getOperationTimeout;\n }\n\n public async getThread(\n userId: string,\n threadId: string\n ): Promise<ThreadObject | undefined> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n const thread = await ThreadModel.findOne({ threadId, userId }).maxTimeMS(timeout);\n const messages = await MessageModel.find({ threadId, userId })\n .sort({ timestamp: 1 })\n .maxTimeMS(timeout);\n\n if (!thread) return undefined;\n\n loggers.agent.debug(`Found ${messages.length} messages for thread ${threadId}`);\n\n const threadObject: ThreadObject = {\n threadId: thread.threadId,\n userId: thread.userId,\n type: thread.type as ThreadType,\n title: thread.title || \"New thread\",\n isPinned: thread.isPinned ?? false,\n workflowId: thread.workflowId,\n messages: []\n };\n messages.forEach((message: MessageDocument) => {\n threadObject.messages.push({\n messageId: message.messageId,\n role: message.role as MessageRole,\n content: message.content,\n timestamp: message.timestamp,\n metadata: message.metadata,\n });\n });\n\n return threadObject;\n }, `getThread(${userId}, ${threadId})`);\n };\n\n public async createThread(\n type: ThreadType,\n userId: string,\n threadId: string,\n title: string,\n workflowId?: string,\n ): Promise<ThreadObject> {\n return this.executeWithRetry(async () => {\n await ThreadModel.create({\n type,\n userId,\n threadId,\n title,\n workflowId,\n });\n\n return { type, userId, threadId, title, workflowId, messages: []};\n }, `createThread(${userId}, ${threadId})`);\n };\n\n public async addMessagesToThread(\n userId: string,\n threadId: string,\n messages: MessageObject[]\n ): Promise<void> {\n return this.executeWithRetry(async () => {\n if (messages.length > 0) {\n const messageIds = messages.map((m) => m.messageId);\n await MessageModel.deleteMany({ threadId, userId, messageId: { $in: messageIds } });\n await MessageModel.insertMany(\n messages.map((message) => ({\n threadId,\n messageId: message.messageId,\n userId,\n role: message.role,\n content: message.content,\n timestamp: message.timestamp,\n metadata: message.metadata,\n }))\n );\n }\n await ThreadModel.updateOne(\n { threadId, userId },\n { $set: { updatedAt: new Date() } }\n );\n }, `addMessagesToThread(${userId}, ${threadId})`);\n };\n\n public async deleteThread(userId: string, threadId: string): Promise<void> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n\n // Delete all messages for this thread\n await MessageModel.deleteMany({ userId, threadId }).maxTimeMS(timeout);\n\n // Delete the thread itself\n await ThreadModel.deleteOne({ userId, threadId }).maxTimeMS(timeout);\n }, `deleteThread(${userId}, ${threadId})`);\n };\n\n public async listThreads(userId: string, filter?: ThreadFilter): Promise<ThreadMetadata[]> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n const query: Record<string, any> = { userId };\n if (filter?.workflowId) query.workflowId = filter.workflowId;\n if (filter?.type) query.type = filter.type;\n const threads = await ThreadModel.find(query)\n .sort({ updatedAt: -1 })\n .maxTimeMS(timeout);\n const data: ThreadMetadata[] = threads.map((thread: ThreadDocument) => {\n return {\n type: thread.type,\n userId,\n threadId: thread.threadId,\n title: thread.title,\n isPinned: thread.isPinned ?? false,\n workflowId: thread.workflowId,\n createdAt: thread.createdAt?.toISOString(),\n updatedAt: thread.updatedAt?.toISOString(),\n } as ThreadMetadata;\n })\n return data;\n }, `listThreads(${userId})`);\n };\n\n public async updateThreadPin(\n userId: string,\n threadId: string,\n isPinned: boolean\n ): Promise<void> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n await ThreadModel.updateOne(\n { threadId, userId },\n { $set: { isPinned } }\n ).maxTimeMS(timeout);\n }, `updateThreadPin(${userId}, ${threadId})`);\n };\n}\n","import type { IUserWorkflowMemory } from \"@ainetwork/adk/modules\";\nimport type { UserWorkflow } from \"@ainetwork/adk/types/memory\";\nimport { UserWorkflowModel } from \"../models/user-workflow.model\";\n\nexport type ExecuteWithRetryFn = <T>(\n operation: () => Promise<T>,\n operationName?: string\n) => Promise<T>;\n\nexport type GetOperationTimeoutFn = () => number;\n\nexport class MongoDBUserWorkflow implements IUserWorkflowMemory {\n private executeWithRetry: ExecuteWithRetryFn;\n private getOperationTimeout: GetOperationTimeoutFn;\n\n constructor(\n executeWithRetry: ExecuteWithRetryFn,\n getOperationTimeout: GetOperationTimeoutFn\n ) {\n this.executeWithRetry = executeWithRetry;\n this.getOperationTimeout = getOperationTimeout;\n }\n\n public async createUserWorkflow(workflow: UserWorkflow): Promise<UserWorkflow> {\n return this.executeWithRetry(async () => {\n const created = await UserWorkflowModel.create(workflow);\n return created.toObject() as UserWorkflow;\n }, \"createUserWorkflow()\");\n }\n\n public async getUserWorkflow(workflowId: string): Promise<UserWorkflow | undefined> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n const workflow = await UserWorkflowModel.findOne({ workflowId })\n .maxTimeMS(timeout)\n .lean<UserWorkflow>();\n return workflow || undefined;\n }, \"getUserWorkflow()\");\n }\n\n public async updateUserWorkflow(workflowId: string, updates: Partial<UserWorkflow>): Promise<void> {\n if (!updates.userId) {\n throw new Error(\"userId is required for updateUserWorkflow\");\n }\n\n const { userId, workflowId: _workflowId, ...mutableUpdates } = updates;\n\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n await UserWorkflowModel.updateOne(\n { workflowId, userId },\n { $set: mutableUpdates }\n ).maxTimeMS(timeout);\n }, \"updateUserWorkflow()\");\n }\n\n public async deleteUserWorkflow(workflowId: string, userId: string): Promise<void> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n await UserWorkflowModel.deleteOne({ workflowId, userId }).maxTimeMS(timeout);\n }, \"deleteUserWorkflow()\");\n }\n\n public async listUserWorkflows(userId?: string): Promise<UserWorkflow[]> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n const query = userId ? { userId } : {};\n const workflows = await UserWorkflowModel.find(query)\n .maxTimeMS(timeout)\n .lean<UserWorkflow[]>();\n return workflows;\n }, \"listUserWorkflows()\");\n }\n\n public async listActiveScheduledWorkflows(): Promise<UserWorkflow[]> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n const workflows = await UserWorkflowModel.find({\n active: true,\n schedule: { $exists: true, $ne: null },\n })\n .maxTimeMS(timeout)\n .lean<UserWorkflow[]>();\n return workflows;\n }, \"listActiveScheduledWorkflows()\");\n }\n}\n","import type { IWorkflowTemplateMemory } from \"@ainetwork/adk/modules\";\nimport type { WorkflowTemplate } from \"@ainetwork/adk/types/memory\";\nimport { WorkflowTemplateModel } from \"../models/workflow-template.model\";\n\nexport type ExecuteWithRetryFn = <T>(\n operation: () => Promise<T>,\n operationName?: string\n) => Promise<T>;\n\nexport type GetOperationTimeoutFn = () => number;\n\nexport class MongoDBWorkflowTemplate implements IWorkflowTemplateMemory {\n private executeWithRetry: ExecuteWithRetryFn;\n private getOperationTimeout: GetOperationTimeoutFn;\n\n constructor(\n executeWithRetry: ExecuteWithRetryFn,\n getOperationTimeout: GetOperationTimeoutFn\n ) {\n this.executeWithRetry = executeWithRetry;\n this.getOperationTimeout = getOperationTimeout;\n }\n\n public async createTemplate(template: WorkflowTemplate): Promise<WorkflowTemplate> {\n return this.executeWithRetry(async () => {\n const created = await WorkflowTemplateModel.create(template);\n return created.toObject() as WorkflowTemplate;\n }, \"createTemplate()\");\n }\n\n public async getTemplate(templateId: string): Promise<WorkflowTemplate | undefined> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n const template = await WorkflowTemplateModel.findOne({ templateId })\n .maxTimeMS(timeout)\n .lean<WorkflowTemplate>();\n return template || undefined;\n }, \"getTemplate()\");\n }\n\n public async updateTemplate(templateId: string, updates: Partial<WorkflowTemplate>): Promise<void> {\n const { templateId: _templateId, ...mutableUpdates } = updates;\n\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n await WorkflowTemplateModel.updateOne(\n { templateId },\n { $set: mutableUpdates }\n ).maxTimeMS(timeout);\n }, \"updateTemplate()\");\n }\n\n public async deleteTemplate(templateId: string): Promise<void> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n await WorkflowTemplateModel.deleteOne({ templateId }).maxTimeMS(timeout);\n }, \"deleteTemplate()\");\n }\n\n public async listTemplates(): Promise<WorkflowTemplate[]> {\n return this.executeWithRetry(async () => {\n const timeout = this.getOperationTimeout();\n const templates = await WorkflowTemplateModel.find()\n .maxTimeMS(timeout)\n .lean<WorkflowTemplate[]>();\n return templates;\n }, \"listTemplates()\");\n }\n}\n"],"mappings":"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","names":["loggers","loggers"]}
|