@minded-ai/mindedjs 3.1.41-beta.12 → 3.1.41-beta.14
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/cli/agentWorker.js +14 -0
- package/dist/cli/agentWorker.js.map +1 -1
- package/dist/cli/agentWorker.ts +19 -0
- package/dist/cli/lambdaHandlerTemplate.d.ts +3 -2
- package/dist/cli/lambdaHandlerTemplate.d.ts.map +1 -1
- package/dist/cli/lambdaHandlerTemplate.js +55 -5
- package/dist/cli/lambdaHandlerTemplate.js.map +1 -1
- package/dist/cli/lambdaHandlerTemplate.ts +63 -7
- package/package.json +1 -1
- package/src/cli/agentWorker.ts +19 -0
- package/src/cli/lambdaHandlerTemplate.ts +63 -7
package/dist/cli/agentWorker.js
CHANGED
|
@@ -10,6 +10,13 @@ process.on('message', async (message) => {
|
|
|
10
10
|
if (message.type === 'execute') {
|
|
11
11
|
try {
|
|
12
12
|
const { modulePath, agentFunctionName, agentFunctionBody } = message;
|
|
13
|
+
mindedjs_1.logger.info({
|
|
14
|
+
msg: 'Lambda agent worker invoked',
|
|
15
|
+
awsRequestId: message.awsRequestId,
|
|
16
|
+
awsFunctionName: message.awsFunctionName,
|
|
17
|
+
modulePath,
|
|
18
|
+
agentFunctionName,
|
|
19
|
+
});
|
|
13
20
|
if (!modulePath || !agentFunctionName) {
|
|
14
21
|
throw new Error('Missing required parameters');
|
|
15
22
|
}
|
|
@@ -45,6 +52,8 @@ process.on('message', async (message) => {
|
|
|
45
52
|
agent = null;
|
|
46
53
|
mindedjs_1.logger.error({
|
|
47
54
|
msg: 'Lambda agent runner execution error',
|
|
55
|
+
awsRequestId: message.awsRequestId,
|
|
56
|
+
awsFunctionName: message.awsFunctionName,
|
|
48
57
|
err,
|
|
49
58
|
});
|
|
50
59
|
// Send error response back to parent
|
|
@@ -61,6 +70,11 @@ process.on('message', async (message) => {
|
|
|
61
70
|
}
|
|
62
71
|
else if (message.type === 'cleanup') {
|
|
63
72
|
try {
|
|
73
|
+
mindedjs_1.logger.info({
|
|
74
|
+
msg: 'Lambda agent worker cleanup invoked',
|
|
75
|
+
awsRequestId: message.awsRequestId,
|
|
76
|
+
awsFunctionName: message.awsFunctionName,
|
|
77
|
+
});
|
|
64
78
|
// Call cleanup if available
|
|
65
79
|
(_a = agent === null || agent === void 0 ? void 0 : agent.onEnd) === null || _a === void 0 ? void 0 : _a.call(agent);
|
|
66
80
|
agent = null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agentWorker.js","sourceRoot":"","sources":["../../src/cli/agentWorker.ts"],"names":[],"mappings":";AAAA,uEAAuE;;AAEvE,6DAA6D;AAC7D,kDAA6C;
|
|
1
|
+
{"version":3,"file":"agentWorker.js","sourceRoot":"","sources":["../../src/cli/agentWorker.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/agentWorker.ts
CHANGED
|
@@ -9,9 +9,13 @@ type WorkerMessage =
|
|
|
9
9
|
modulePath: string;
|
|
10
10
|
agentFunctionName: string;
|
|
11
11
|
agentFunctionBody: any;
|
|
12
|
+
awsRequestId: string;
|
|
13
|
+
awsFunctionName: string;
|
|
12
14
|
}
|
|
13
15
|
| {
|
|
14
16
|
type: 'cleanup';
|
|
17
|
+
awsRequestId: string;
|
|
18
|
+
awsFunctionName: string;
|
|
15
19
|
};
|
|
16
20
|
|
|
17
21
|
interface WorkerResponse {
|
|
@@ -30,6 +34,13 @@ process.on('message', async (message: WorkerMessage) => {
|
|
|
30
34
|
if (message.type === 'execute') {
|
|
31
35
|
try {
|
|
32
36
|
const { modulePath, agentFunctionName, agentFunctionBody } = message;
|
|
37
|
+
logger.info({
|
|
38
|
+
msg: 'Lambda agent worker invoked',
|
|
39
|
+
awsRequestId: message.awsRequestId,
|
|
40
|
+
awsFunctionName: message.awsFunctionName,
|
|
41
|
+
modulePath,
|
|
42
|
+
agentFunctionName,
|
|
43
|
+
});
|
|
33
44
|
|
|
34
45
|
if (!modulePath || !agentFunctionName) {
|
|
35
46
|
throw new Error('Missing required parameters');
|
|
@@ -71,6 +82,8 @@ process.on('message', async (message: WorkerMessage) => {
|
|
|
71
82
|
|
|
72
83
|
logger.error({
|
|
73
84
|
msg: 'Lambda agent runner execution error',
|
|
85
|
+
awsRequestId: message.awsRequestId,
|
|
86
|
+
awsFunctionName: message.awsFunctionName,
|
|
74
87
|
err,
|
|
75
88
|
});
|
|
76
89
|
|
|
@@ -88,6 +101,12 @@ process.on('message', async (message: WorkerMessage) => {
|
|
|
88
101
|
}
|
|
89
102
|
} else if (message.type === 'cleanup') {
|
|
90
103
|
try {
|
|
104
|
+
logger.info({
|
|
105
|
+
msg: 'Lambda agent worker cleanup invoked',
|
|
106
|
+
awsRequestId: message.awsRequestId,
|
|
107
|
+
awsFunctionName: message.awsFunctionName,
|
|
108
|
+
});
|
|
109
|
+
|
|
91
110
|
// Call cleanup if available
|
|
92
111
|
agent?.onEnd?.();
|
|
93
112
|
agent = null;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
interface LambdaContext {
|
|
2
|
-
getRemainingTimeInMillis(): number;
|
|
3
|
-
awsRequestId: string;
|
|
4
2
|
functionName: string;
|
|
3
|
+
functionVersion: string;
|
|
4
|
+
awsRequestId: string;
|
|
5
|
+
getRemainingTimeInMillis(): number;
|
|
5
6
|
}
|
|
6
7
|
export declare const handler: (event: any, context: LambdaContext) => Promise<{
|
|
7
8
|
statusCode: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lambdaHandlerTemplate.d.ts","sourceRoot":"","sources":["../../src/cli/lambdaHandlerTemplate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"lambdaHandlerTemplate.d.ts","sourceRoot":"","sources":["../../src/cli/lambdaHandlerTemplate.ts"],"names":[],"mappings":"AAkCA,UAAU,aAAa;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,wBAAwB,IAAI,MAAM,CAAC;CACpC;AAED,eAAO,MAAM,OAAO,GAAU,OAAO,GAAG,EAAE,SAAS,aAAa;;;;;;;;EAoG/D,CAAC"}
|
|
@@ -38,11 +38,20 @@ exports.handler = void 0;
|
|
|
38
38
|
const mindedjs_1 = require("@minded-ai/mindedjs");
|
|
39
39
|
const child_process_1 = require("child_process");
|
|
40
40
|
const path = __importStar(require("path"));
|
|
41
|
+
const fs = __importStar(require("fs"));
|
|
41
42
|
const handler = async (event, context) => {
|
|
42
43
|
let child = null;
|
|
43
44
|
try {
|
|
44
45
|
const modulePath = '{MODULE_PATH}'; // Module path placeholder - DO NOT CHANGE THE {MODULE_PATH} TOKEN
|
|
45
46
|
const { agentFunctionName, agentFunctionBody } = event.body ? JSON.parse(event.body) : event;
|
|
47
|
+
const mindedVersion = getMindedVersion();
|
|
48
|
+
mindedjs_1.logger.info({
|
|
49
|
+
msg: 'Lambda handler invoked',
|
|
50
|
+
awsRequestId: context.awsRequestId,
|
|
51
|
+
awsFunctionName: context.functionName,
|
|
52
|
+
agentFunctionName,
|
|
53
|
+
mindedVersion,
|
|
54
|
+
});
|
|
46
55
|
// Filter out AWS credentials and any AWS_* environment variables
|
|
47
56
|
const filteredEnv = {};
|
|
48
57
|
for (const [key, value] of Object.entries(process.env)) {
|
|
@@ -59,11 +68,20 @@ const handler = async (event, context) => {
|
|
|
59
68
|
context,
|
|
60
69
|
});
|
|
61
70
|
child = childProcess;
|
|
71
|
+
mindedjs_1.logger.info({
|
|
72
|
+
msg: 'Lambda handler got result from worker',
|
|
73
|
+
awsRequestId: context.awsRequestId,
|
|
74
|
+
awsFunctionName: context.functionName,
|
|
75
|
+
agentFunctionName,
|
|
76
|
+
});
|
|
62
77
|
// Handle voice session special case - wait for Lambda remaining time before closing the socket
|
|
63
78
|
if (agentFunctionName === 'startVoiceSession') {
|
|
64
79
|
while (context.getRemainingTimeInMillis() > 1500) {
|
|
65
80
|
mindedjs_1.logger.info({
|
|
66
81
|
msg: 'Waiting for Lambda remaining time',
|
|
82
|
+
awsRequestId: context.awsRequestId,
|
|
83
|
+
awsFunctionName: context.functionName,
|
|
84
|
+
agentFunctionName,
|
|
67
85
|
remainingTime: context.getRemainingTimeInMillis() / 1000,
|
|
68
86
|
});
|
|
69
87
|
await wait(1000);
|
|
@@ -90,9 +108,9 @@ const handler = async (event, context) => {
|
|
|
90
108
|
}
|
|
91
109
|
mindedjs_1.logger.error({
|
|
92
110
|
msg: 'Lambda runtime error',
|
|
111
|
+
awsRequestId: context.awsRequestId,
|
|
112
|
+
awsFunctionName: context.functionName,
|
|
93
113
|
err,
|
|
94
|
-
requestId: context.awsRequestId,
|
|
95
|
-
functionName: context.functionName,
|
|
96
114
|
});
|
|
97
115
|
return {
|
|
98
116
|
statusCode: 500,
|
|
@@ -192,6 +210,8 @@ function executeInChildProcess(params) {
|
|
|
192
210
|
modulePath,
|
|
193
211
|
agentFunctionName,
|
|
194
212
|
agentFunctionBody,
|
|
213
|
+
awsRequestId: context.awsRequestId,
|
|
214
|
+
awsFunctionName: context.functionName,
|
|
195
215
|
};
|
|
196
216
|
child.send(message);
|
|
197
217
|
});
|
|
@@ -207,7 +227,11 @@ function cleanupChildProcess(child, context) {
|
|
|
207
227
|
return;
|
|
208
228
|
}
|
|
209
229
|
isResolved = true;
|
|
210
|
-
mindedjs_1.logger.warn({
|
|
230
|
+
mindedjs_1.logger.warn({
|
|
231
|
+
msg: 'Cleanup timeout, force killing worker',
|
|
232
|
+
awsRequestId: context.awsRequestId,
|
|
233
|
+
awsFunctionName: context.functionName,
|
|
234
|
+
});
|
|
211
235
|
child.kill('SIGKILL');
|
|
212
236
|
resolve(); // Resolve anyway, cleanup is best-effort
|
|
213
237
|
}, timeoutMs);
|
|
@@ -222,7 +246,12 @@ function cleanupChildProcess(child, context) {
|
|
|
222
246
|
clearTimeout(timeoutId);
|
|
223
247
|
}
|
|
224
248
|
if (!response.success) {
|
|
225
|
-
mindedjs_1.logger.error({
|
|
249
|
+
mindedjs_1.logger.error({
|
|
250
|
+
msg: 'Cleanup failed',
|
|
251
|
+
awsRequestId: context.awsRequestId,
|
|
252
|
+
awsFunctionName: context.functionName,
|
|
253
|
+
err: response.error,
|
|
254
|
+
});
|
|
226
255
|
}
|
|
227
256
|
resolve();
|
|
228
257
|
});
|
|
@@ -240,6 +269,8 @@ function cleanupChildProcess(child, context) {
|
|
|
240
269
|
// Send cleanup request
|
|
241
270
|
const message = {
|
|
242
271
|
type: 'cleanup',
|
|
272
|
+
awsRequestId: context.awsRequestId,
|
|
273
|
+
awsFunctionName: context.functionName,
|
|
243
274
|
};
|
|
244
275
|
child.send(message, (err) => {
|
|
245
276
|
if (err && !isResolved) {
|
|
@@ -247,7 +278,12 @@ function cleanupChildProcess(child, context) {
|
|
|
247
278
|
if (timeoutId) {
|
|
248
279
|
clearTimeout(timeoutId);
|
|
249
280
|
}
|
|
250
|
-
mindedjs_1.logger.error({
|
|
281
|
+
mindedjs_1.logger.error({
|
|
282
|
+
msg: 'Failed to send cleanup message',
|
|
283
|
+
awsRequestId: context.awsRequestId,
|
|
284
|
+
awsFunctionName: context.functionName,
|
|
285
|
+
err,
|
|
286
|
+
});
|
|
251
287
|
child.kill('SIGKILL');
|
|
252
288
|
resolve(); // Resolve anyway, cleanup is best-effort
|
|
253
289
|
}
|
|
@@ -255,4 +291,18 @@ function cleanupChildProcess(child, context) {
|
|
|
255
291
|
});
|
|
256
292
|
}
|
|
257
293
|
const wait = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
294
|
+
function getMindedVersion() {
|
|
295
|
+
var _a;
|
|
296
|
+
try {
|
|
297
|
+
const packageJsonPath = path.join(process.cwd(), 'package.json');
|
|
298
|
+
if (!fs.existsSync(packageJsonPath)) {
|
|
299
|
+
return 'unknown';
|
|
300
|
+
}
|
|
301
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
|
|
302
|
+
return ((_a = packageJson.dependencies) === null || _a === void 0 ? void 0 : _a['@minded-ai/mindedjs']) || 'unknown';
|
|
303
|
+
}
|
|
304
|
+
catch (_b) {
|
|
305
|
+
return 'unknown';
|
|
306
|
+
}
|
|
307
|
+
}
|
|
258
308
|
//# sourceMappingURL=lambdaHandlerTemplate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lambdaHandlerTemplate.js","sourceRoot":"","sources":["../../src/cli/lambdaHandlerTemplate.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6FAA6F;AAC7F,kDAA6C;AAC7C,iDAAmD;AACnD,2CAA6B;
|
|
1
|
+
{"version":3,"file":"lambdaHandlerTemplate.js","sourceRoot":"","sources":["../../src/cli/lambdaHandlerTemplate.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { logger } from '@minded-ai/mindedjs';
|
|
3
3
|
import { fork, ChildProcess } from 'child_process';
|
|
4
4
|
import * as path from 'path';
|
|
5
|
+
import * as fs from 'fs';
|
|
5
6
|
|
|
6
7
|
// This is the template for the Lambda handler with isolated user code execution
|
|
7
8
|
// The {MODULE_PATH} placeholder will be replaced with the actual path
|
|
@@ -12,9 +13,13 @@ type WorkerMessage =
|
|
|
12
13
|
modulePath: string;
|
|
13
14
|
agentFunctionName: string;
|
|
14
15
|
agentFunctionBody: any;
|
|
16
|
+
awsRequestId: string;
|
|
17
|
+
awsFunctionName: string;
|
|
15
18
|
}
|
|
16
19
|
| {
|
|
17
20
|
type: 'cleanup';
|
|
21
|
+
awsRequestId: string;
|
|
22
|
+
awsFunctionName: string;
|
|
18
23
|
};
|
|
19
24
|
|
|
20
25
|
interface WorkerResponse {
|
|
@@ -28,9 +33,10 @@ interface WorkerResponse {
|
|
|
28
33
|
|
|
29
34
|
// Minimal Lambda Context interface - only the properties we use
|
|
30
35
|
interface LambdaContext {
|
|
31
|
-
getRemainingTimeInMillis(): number;
|
|
32
|
-
awsRequestId: string;
|
|
33
36
|
functionName: string;
|
|
37
|
+
functionVersion: string;
|
|
38
|
+
awsRequestId: string;
|
|
39
|
+
getRemainingTimeInMillis(): number;
|
|
34
40
|
}
|
|
35
41
|
|
|
36
42
|
export const handler = async (event: any, context: LambdaContext) => {
|
|
@@ -39,6 +45,15 @@ export const handler = async (event: any, context: LambdaContext) => {
|
|
|
39
45
|
try {
|
|
40
46
|
const modulePath = '{MODULE_PATH}'; // Module path placeholder - DO NOT CHANGE THE {MODULE_PATH} TOKEN
|
|
41
47
|
const { agentFunctionName, agentFunctionBody } = event.body ? JSON.parse(event.body) : event;
|
|
48
|
+
const mindedVersion = getMindedVersion();
|
|
49
|
+
|
|
50
|
+
logger.info({
|
|
51
|
+
msg: 'Lambda handler invoked',
|
|
52
|
+
awsRequestId: context.awsRequestId,
|
|
53
|
+
awsFunctionName: context.functionName,
|
|
54
|
+
agentFunctionName,
|
|
55
|
+
mindedVersion,
|
|
56
|
+
});
|
|
42
57
|
|
|
43
58
|
// Filter out AWS credentials and any AWS_* environment variables
|
|
44
59
|
const filteredEnv: NodeJS.ProcessEnv = {};
|
|
@@ -59,11 +74,21 @@ export const handler = async (event: any, context: LambdaContext) => {
|
|
|
59
74
|
|
|
60
75
|
child = childProcess;
|
|
61
76
|
|
|
77
|
+
logger.info({
|
|
78
|
+
msg: 'Lambda handler got result from worker',
|
|
79
|
+
awsRequestId: context.awsRequestId,
|
|
80
|
+
awsFunctionName: context.functionName,
|
|
81
|
+
agentFunctionName,
|
|
82
|
+
});
|
|
83
|
+
|
|
62
84
|
// Handle voice session special case - wait for Lambda remaining time before closing the socket
|
|
63
85
|
if (agentFunctionName === 'startVoiceSession') {
|
|
64
86
|
while (context.getRemainingTimeInMillis() > 1500) {
|
|
65
87
|
logger.info({
|
|
66
88
|
msg: 'Waiting for Lambda remaining time',
|
|
89
|
+
awsRequestId: context.awsRequestId,
|
|
90
|
+
awsFunctionName: context.functionName,
|
|
91
|
+
agentFunctionName,
|
|
67
92
|
remainingTime: context.getRemainingTimeInMillis() / 1000,
|
|
68
93
|
});
|
|
69
94
|
await wait(1000);
|
|
@@ -93,9 +118,9 @@ export const handler = async (event: any, context: LambdaContext) => {
|
|
|
93
118
|
|
|
94
119
|
logger.error({
|
|
95
120
|
msg: 'Lambda runtime error',
|
|
121
|
+
awsRequestId: context.awsRequestId,
|
|
122
|
+
awsFunctionName: context.functionName,
|
|
96
123
|
err,
|
|
97
|
-
requestId: context.awsRequestId,
|
|
98
|
-
functionName: context.functionName,
|
|
99
124
|
});
|
|
100
125
|
|
|
101
126
|
return {
|
|
@@ -215,6 +240,8 @@ function executeInChildProcess(params: {
|
|
|
215
240
|
modulePath,
|
|
216
241
|
agentFunctionName,
|
|
217
242
|
agentFunctionBody,
|
|
243
|
+
awsRequestId: context.awsRequestId,
|
|
244
|
+
awsFunctionName: context.functionName,
|
|
218
245
|
};
|
|
219
246
|
|
|
220
247
|
child.send(message);
|
|
@@ -234,7 +261,11 @@ function cleanupChildProcess(child: ChildProcess, context: LambdaContext): Promi
|
|
|
234
261
|
return;
|
|
235
262
|
}
|
|
236
263
|
isResolved = true;
|
|
237
|
-
logger.warn({
|
|
264
|
+
logger.warn({
|
|
265
|
+
msg: 'Cleanup timeout, force killing worker',
|
|
266
|
+
awsRequestId: context.awsRequestId,
|
|
267
|
+
awsFunctionName: context.functionName,
|
|
268
|
+
});
|
|
238
269
|
child.kill('SIGKILL');
|
|
239
270
|
resolve(); // Resolve anyway, cleanup is best-effort
|
|
240
271
|
}, timeoutMs);
|
|
@@ -252,7 +283,12 @@ function cleanupChildProcess(child: ChildProcess, context: LambdaContext): Promi
|
|
|
252
283
|
}
|
|
253
284
|
|
|
254
285
|
if (!response.success) {
|
|
255
|
-
logger.error({
|
|
286
|
+
logger.error({
|
|
287
|
+
msg: 'Cleanup failed',
|
|
288
|
+
awsRequestId: context.awsRequestId,
|
|
289
|
+
awsFunctionName: context.functionName,
|
|
290
|
+
err: response.error,
|
|
291
|
+
});
|
|
256
292
|
}
|
|
257
293
|
|
|
258
294
|
resolve();
|
|
@@ -274,6 +310,8 @@ function cleanupChildProcess(child: ChildProcess, context: LambdaContext): Promi
|
|
|
274
310
|
// Send cleanup request
|
|
275
311
|
const message: WorkerMessage = {
|
|
276
312
|
type: 'cleanup',
|
|
313
|
+
awsRequestId: context.awsRequestId,
|
|
314
|
+
awsFunctionName: context.functionName,
|
|
277
315
|
};
|
|
278
316
|
|
|
279
317
|
child.send(message, (err) => {
|
|
@@ -282,7 +320,12 @@ function cleanupChildProcess(child: ChildProcess, context: LambdaContext): Promi
|
|
|
282
320
|
if (timeoutId) {
|
|
283
321
|
clearTimeout(timeoutId);
|
|
284
322
|
}
|
|
285
|
-
logger.error({
|
|
323
|
+
logger.error({
|
|
324
|
+
msg: 'Failed to send cleanup message',
|
|
325
|
+
awsRequestId: context.awsRequestId,
|
|
326
|
+
awsFunctionName: context.functionName,
|
|
327
|
+
err,
|
|
328
|
+
});
|
|
286
329
|
child.kill('SIGKILL');
|
|
287
330
|
resolve(); // Resolve anyway, cleanup is best-effort
|
|
288
331
|
}
|
|
@@ -291,3 +334,16 @@ function cleanupChildProcess(child: ChildProcess, context: LambdaContext): Promi
|
|
|
291
334
|
}
|
|
292
335
|
|
|
293
336
|
const wait = (ms: number) => new Promise((r) => setTimeout(r, ms));
|
|
337
|
+
|
|
338
|
+
function getMindedVersion(): string {
|
|
339
|
+
try {
|
|
340
|
+
const packageJsonPath = path.join(process.cwd(), 'package.json');
|
|
341
|
+
if (!fs.existsSync(packageJsonPath)) {
|
|
342
|
+
return 'unknown';
|
|
343
|
+
}
|
|
344
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
|
|
345
|
+
return packageJson.dependencies?.['@minded-ai/mindedjs'] || 'unknown';
|
|
346
|
+
} catch {
|
|
347
|
+
return 'unknown';
|
|
348
|
+
}
|
|
349
|
+
}
|
package/package.json
CHANGED
package/src/cli/agentWorker.ts
CHANGED
|
@@ -9,9 +9,13 @@ type WorkerMessage =
|
|
|
9
9
|
modulePath: string;
|
|
10
10
|
agentFunctionName: string;
|
|
11
11
|
agentFunctionBody: any;
|
|
12
|
+
awsRequestId: string;
|
|
13
|
+
awsFunctionName: string;
|
|
12
14
|
}
|
|
13
15
|
| {
|
|
14
16
|
type: 'cleanup';
|
|
17
|
+
awsRequestId: string;
|
|
18
|
+
awsFunctionName: string;
|
|
15
19
|
};
|
|
16
20
|
|
|
17
21
|
interface WorkerResponse {
|
|
@@ -30,6 +34,13 @@ process.on('message', async (message: WorkerMessage) => {
|
|
|
30
34
|
if (message.type === 'execute') {
|
|
31
35
|
try {
|
|
32
36
|
const { modulePath, agentFunctionName, agentFunctionBody } = message;
|
|
37
|
+
logger.info({
|
|
38
|
+
msg: 'Lambda agent worker invoked',
|
|
39
|
+
awsRequestId: message.awsRequestId,
|
|
40
|
+
awsFunctionName: message.awsFunctionName,
|
|
41
|
+
modulePath,
|
|
42
|
+
agentFunctionName,
|
|
43
|
+
});
|
|
33
44
|
|
|
34
45
|
if (!modulePath || !agentFunctionName) {
|
|
35
46
|
throw new Error('Missing required parameters');
|
|
@@ -71,6 +82,8 @@ process.on('message', async (message: WorkerMessage) => {
|
|
|
71
82
|
|
|
72
83
|
logger.error({
|
|
73
84
|
msg: 'Lambda agent runner execution error',
|
|
85
|
+
awsRequestId: message.awsRequestId,
|
|
86
|
+
awsFunctionName: message.awsFunctionName,
|
|
74
87
|
err,
|
|
75
88
|
});
|
|
76
89
|
|
|
@@ -88,6 +101,12 @@ process.on('message', async (message: WorkerMessage) => {
|
|
|
88
101
|
}
|
|
89
102
|
} else if (message.type === 'cleanup') {
|
|
90
103
|
try {
|
|
104
|
+
logger.info({
|
|
105
|
+
msg: 'Lambda agent worker cleanup invoked',
|
|
106
|
+
awsRequestId: message.awsRequestId,
|
|
107
|
+
awsFunctionName: message.awsFunctionName,
|
|
108
|
+
});
|
|
109
|
+
|
|
91
110
|
// Call cleanup if available
|
|
92
111
|
agent?.onEnd?.();
|
|
93
112
|
agent = null;
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import { logger } from '@minded-ai/mindedjs';
|
|
3
3
|
import { fork, ChildProcess } from 'child_process';
|
|
4
4
|
import * as path from 'path';
|
|
5
|
+
import * as fs from 'fs';
|
|
5
6
|
|
|
6
7
|
// This is the template for the Lambda handler with isolated user code execution
|
|
7
8
|
// The {MODULE_PATH} placeholder will be replaced with the actual path
|
|
@@ -12,9 +13,13 @@ type WorkerMessage =
|
|
|
12
13
|
modulePath: string;
|
|
13
14
|
agentFunctionName: string;
|
|
14
15
|
agentFunctionBody: any;
|
|
16
|
+
awsRequestId: string;
|
|
17
|
+
awsFunctionName: string;
|
|
15
18
|
}
|
|
16
19
|
| {
|
|
17
20
|
type: 'cleanup';
|
|
21
|
+
awsRequestId: string;
|
|
22
|
+
awsFunctionName: string;
|
|
18
23
|
};
|
|
19
24
|
|
|
20
25
|
interface WorkerResponse {
|
|
@@ -28,9 +33,10 @@ interface WorkerResponse {
|
|
|
28
33
|
|
|
29
34
|
// Minimal Lambda Context interface - only the properties we use
|
|
30
35
|
interface LambdaContext {
|
|
31
|
-
getRemainingTimeInMillis(): number;
|
|
32
|
-
awsRequestId: string;
|
|
33
36
|
functionName: string;
|
|
37
|
+
functionVersion: string;
|
|
38
|
+
awsRequestId: string;
|
|
39
|
+
getRemainingTimeInMillis(): number;
|
|
34
40
|
}
|
|
35
41
|
|
|
36
42
|
export const handler = async (event: any, context: LambdaContext) => {
|
|
@@ -39,6 +45,15 @@ export const handler = async (event: any, context: LambdaContext) => {
|
|
|
39
45
|
try {
|
|
40
46
|
const modulePath = '{MODULE_PATH}'; // Module path placeholder - DO NOT CHANGE THE {MODULE_PATH} TOKEN
|
|
41
47
|
const { agentFunctionName, agentFunctionBody } = event.body ? JSON.parse(event.body) : event;
|
|
48
|
+
const mindedVersion = getMindedVersion();
|
|
49
|
+
|
|
50
|
+
logger.info({
|
|
51
|
+
msg: 'Lambda handler invoked',
|
|
52
|
+
awsRequestId: context.awsRequestId,
|
|
53
|
+
awsFunctionName: context.functionName,
|
|
54
|
+
agentFunctionName,
|
|
55
|
+
mindedVersion,
|
|
56
|
+
});
|
|
42
57
|
|
|
43
58
|
// Filter out AWS credentials and any AWS_* environment variables
|
|
44
59
|
const filteredEnv: NodeJS.ProcessEnv = {};
|
|
@@ -59,11 +74,21 @@ export const handler = async (event: any, context: LambdaContext) => {
|
|
|
59
74
|
|
|
60
75
|
child = childProcess;
|
|
61
76
|
|
|
77
|
+
logger.info({
|
|
78
|
+
msg: 'Lambda handler got result from worker',
|
|
79
|
+
awsRequestId: context.awsRequestId,
|
|
80
|
+
awsFunctionName: context.functionName,
|
|
81
|
+
agentFunctionName,
|
|
82
|
+
});
|
|
83
|
+
|
|
62
84
|
// Handle voice session special case - wait for Lambda remaining time before closing the socket
|
|
63
85
|
if (agentFunctionName === 'startVoiceSession') {
|
|
64
86
|
while (context.getRemainingTimeInMillis() > 1500) {
|
|
65
87
|
logger.info({
|
|
66
88
|
msg: 'Waiting for Lambda remaining time',
|
|
89
|
+
awsRequestId: context.awsRequestId,
|
|
90
|
+
awsFunctionName: context.functionName,
|
|
91
|
+
agentFunctionName,
|
|
67
92
|
remainingTime: context.getRemainingTimeInMillis() / 1000,
|
|
68
93
|
});
|
|
69
94
|
await wait(1000);
|
|
@@ -93,9 +118,9 @@ export const handler = async (event: any, context: LambdaContext) => {
|
|
|
93
118
|
|
|
94
119
|
logger.error({
|
|
95
120
|
msg: 'Lambda runtime error',
|
|
121
|
+
awsRequestId: context.awsRequestId,
|
|
122
|
+
awsFunctionName: context.functionName,
|
|
96
123
|
err,
|
|
97
|
-
requestId: context.awsRequestId,
|
|
98
|
-
functionName: context.functionName,
|
|
99
124
|
});
|
|
100
125
|
|
|
101
126
|
return {
|
|
@@ -215,6 +240,8 @@ function executeInChildProcess(params: {
|
|
|
215
240
|
modulePath,
|
|
216
241
|
agentFunctionName,
|
|
217
242
|
agentFunctionBody,
|
|
243
|
+
awsRequestId: context.awsRequestId,
|
|
244
|
+
awsFunctionName: context.functionName,
|
|
218
245
|
};
|
|
219
246
|
|
|
220
247
|
child.send(message);
|
|
@@ -234,7 +261,11 @@ function cleanupChildProcess(child: ChildProcess, context: LambdaContext): Promi
|
|
|
234
261
|
return;
|
|
235
262
|
}
|
|
236
263
|
isResolved = true;
|
|
237
|
-
logger.warn({
|
|
264
|
+
logger.warn({
|
|
265
|
+
msg: 'Cleanup timeout, force killing worker',
|
|
266
|
+
awsRequestId: context.awsRequestId,
|
|
267
|
+
awsFunctionName: context.functionName,
|
|
268
|
+
});
|
|
238
269
|
child.kill('SIGKILL');
|
|
239
270
|
resolve(); // Resolve anyway, cleanup is best-effort
|
|
240
271
|
}, timeoutMs);
|
|
@@ -252,7 +283,12 @@ function cleanupChildProcess(child: ChildProcess, context: LambdaContext): Promi
|
|
|
252
283
|
}
|
|
253
284
|
|
|
254
285
|
if (!response.success) {
|
|
255
|
-
logger.error({
|
|
286
|
+
logger.error({
|
|
287
|
+
msg: 'Cleanup failed',
|
|
288
|
+
awsRequestId: context.awsRequestId,
|
|
289
|
+
awsFunctionName: context.functionName,
|
|
290
|
+
err: response.error,
|
|
291
|
+
});
|
|
256
292
|
}
|
|
257
293
|
|
|
258
294
|
resolve();
|
|
@@ -274,6 +310,8 @@ function cleanupChildProcess(child: ChildProcess, context: LambdaContext): Promi
|
|
|
274
310
|
// Send cleanup request
|
|
275
311
|
const message: WorkerMessage = {
|
|
276
312
|
type: 'cleanup',
|
|
313
|
+
awsRequestId: context.awsRequestId,
|
|
314
|
+
awsFunctionName: context.functionName,
|
|
277
315
|
};
|
|
278
316
|
|
|
279
317
|
child.send(message, (err) => {
|
|
@@ -282,7 +320,12 @@ function cleanupChildProcess(child: ChildProcess, context: LambdaContext): Promi
|
|
|
282
320
|
if (timeoutId) {
|
|
283
321
|
clearTimeout(timeoutId);
|
|
284
322
|
}
|
|
285
|
-
logger.error({
|
|
323
|
+
logger.error({
|
|
324
|
+
msg: 'Failed to send cleanup message',
|
|
325
|
+
awsRequestId: context.awsRequestId,
|
|
326
|
+
awsFunctionName: context.functionName,
|
|
327
|
+
err,
|
|
328
|
+
});
|
|
286
329
|
child.kill('SIGKILL');
|
|
287
330
|
resolve(); // Resolve anyway, cleanup is best-effort
|
|
288
331
|
}
|
|
@@ -291,3 +334,16 @@ function cleanupChildProcess(child: ChildProcess, context: LambdaContext): Promi
|
|
|
291
334
|
}
|
|
292
335
|
|
|
293
336
|
const wait = (ms: number) => new Promise((r) => setTimeout(r, ms));
|
|
337
|
+
|
|
338
|
+
function getMindedVersion(): string {
|
|
339
|
+
try {
|
|
340
|
+
const packageJsonPath = path.join(process.cwd(), 'package.json');
|
|
341
|
+
if (!fs.existsSync(packageJsonPath)) {
|
|
342
|
+
return 'unknown';
|
|
343
|
+
}
|
|
344
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
|
|
345
|
+
return packageJson.dependencies?.['@minded-ai/mindedjs'] || 'unknown';
|
|
346
|
+
} catch {
|
|
347
|
+
return 'unknown';
|
|
348
|
+
}
|
|
349
|
+
}
|