@justanothermldude/mcp-exec 1.3.1 → 1.3.2
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/bridge/index.d.ts +1 -1
- package/dist/bridge/index.d.ts.map +1 -1
- package/dist/bridge/index.js +1 -1
- package/dist/bridge/index.js.map +1 -1
- package/dist/bridge/port-cleanup.d.ts +9 -2
- package/dist/bridge/port-cleanup.d.ts.map +1 -1
- package/dist/bridge/port-cleanup.js +58 -3
- package/dist/bridge/port-cleanup.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +96 -6
- package/dist/index.js.map +1 -1
- package/dist/server.js +3 -3
- package/dist/server.js.map +1 -1
- package/dist/tools/execute-with-wrappers.d.ts +5 -2
- package/dist/tools/execute-with-wrappers.d.ts.map +1 -1
- package/dist/tools/execute-with-wrappers.js +67 -4
- package/dist/tools/execute-with-wrappers.js.map +1 -1
- package/package.json +1 -1
package/dist/bridge/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { MCPBridge } from './server.js';
|
|
2
2
|
export type { CallRequest, CallResponse, MCPBridgeConfig } from './server.js';
|
|
3
|
-
export { cleanupStaleProcess, isPortInUse } from './port-cleanup.js';
|
|
3
|
+
export { cleanupStaleProcess, cleanupOrphanedProcesses, isPortInUse } from './port-cleanup.js';
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bridge/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bridge/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/bridge/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
// MCP Bridge HTTP server exports
|
|
2
2
|
export { MCPBridge } from './server.js';
|
|
3
|
-
export { cleanupStaleProcess, isPortInUse } from './port-cleanup.js';
|
|
3
|
+
export { cleanupStaleProcess, cleanupOrphanedProcesses, isPortInUse } from './port-cleanup.js';
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
package/dist/bridge/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bridge/index.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bridge/index.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -1,11 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Attempt to clean up stale mcp-exec processes on a specific port
|
|
3
|
-
*
|
|
2
|
+
* Attempt to clean up stale mcp-exec processes on a specific port.
|
|
3
|
+
* Kills processes that match mcp-exec/meta-mcp in their command line OR are orphaned (PPID=1).
|
|
4
4
|
*
|
|
5
5
|
* @param port - Port number to check for stale processes
|
|
6
6
|
* @returns true if any processes were killed, false otherwise
|
|
7
7
|
*/
|
|
8
8
|
export declare function cleanupStaleProcess(port: number): Promise<boolean>;
|
|
9
|
+
/**
|
|
10
|
+
* Kill all orphaned mcp-exec processes (PPID=1) system-wide.
|
|
11
|
+
* Should be called at startup to clean up leftovers from crashed/closed parent sessions.
|
|
12
|
+
*
|
|
13
|
+
* @returns number of processes killed
|
|
14
|
+
*/
|
|
15
|
+
export declare function cleanupOrphanedProcesses(): Promise<number>;
|
|
9
16
|
/**
|
|
10
17
|
* Check if a port is currently in use
|
|
11
18
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"port-cleanup.d.ts","sourceRoot":"","sources":["../../src/bridge/port-cleanup.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"port-cleanup.d.ts","sourceRoot":"","sources":["../../src/bridge/port-cleanup.ts"],"names":[],"mappings":"AA+DA;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAuBxE;AAED;;;;;GAKG;AACH,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,MAAM,CAAC,CAoBhE;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjD"}
|
|
@@ -14,6 +14,18 @@ function isMcpExecProcess(pid) {
|
|
|
14
14
|
return false;
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* Check if a process is orphaned (parent is init/launchd, PID 1)
|
|
19
|
+
*/
|
|
20
|
+
function isOrphanedProcess(pid) {
|
|
21
|
+
try {
|
|
22
|
+
const ppid = execSync(`ps -p ${pid} -o ppid=`, { encoding: 'utf8' }).trim();
|
|
23
|
+
return parseInt(ppid, 10) === 1;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
17
29
|
/**
|
|
18
30
|
* Get PIDs of processes listening on a specific port
|
|
19
31
|
*/
|
|
@@ -33,8 +45,26 @@ function getProcessesOnPort(port) {
|
|
|
33
45
|
}
|
|
34
46
|
}
|
|
35
47
|
/**
|
|
36
|
-
*
|
|
37
|
-
|
|
48
|
+
* Find all mcp-exec process PIDs system-wide, excluding the current process
|
|
49
|
+
*/
|
|
50
|
+
function getAllMcpExecPids() {
|
|
51
|
+
try {
|
|
52
|
+
const result = execSync(`pgrep -f 'mcp-exec'`, { encoding: 'utf8' }).trim();
|
|
53
|
+
if (!result)
|
|
54
|
+
return [];
|
|
55
|
+
return result
|
|
56
|
+
.split('\n')
|
|
57
|
+
.filter(Boolean)
|
|
58
|
+
.map((pid) => parseInt(pid, 10))
|
|
59
|
+
.filter((pid) => !isNaN(pid) && pid !== process.pid);
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return [];
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Attempt to clean up stale mcp-exec processes on a specific port.
|
|
67
|
+
* Kills processes that match mcp-exec/meta-mcp in their command line OR are orphaned (PPID=1).
|
|
38
68
|
*
|
|
39
69
|
* @param port - Port number to check for stale processes
|
|
40
70
|
* @returns true if any processes were killed, false otherwise
|
|
@@ -45,7 +75,7 @@ export async function cleanupStaleProcess(port) {
|
|
|
45
75
|
return false;
|
|
46
76
|
let killedAny = false;
|
|
47
77
|
for (const pid of pids) {
|
|
48
|
-
if (isMcpExecProcess(pid)) {
|
|
78
|
+
if (isMcpExecProcess(pid) || isOrphanedProcess(pid)) {
|
|
49
79
|
try {
|
|
50
80
|
process.kill(pid, 'SIGTERM');
|
|
51
81
|
killedAny = true;
|
|
@@ -61,6 +91,31 @@ export async function cleanupStaleProcess(port) {
|
|
|
61
91
|
}
|
|
62
92
|
return killedAny;
|
|
63
93
|
}
|
|
94
|
+
/**
|
|
95
|
+
* Kill all orphaned mcp-exec processes (PPID=1) system-wide.
|
|
96
|
+
* Should be called at startup to clean up leftovers from crashed/closed parent sessions.
|
|
97
|
+
*
|
|
98
|
+
* @returns number of processes killed
|
|
99
|
+
*/
|
|
100
|
+
export async function cleanupOrphanedProcesses() {
|
|
101
|
+
const pids = getAllMcpExecPids();
|
|
102
|
+
let killed = 0;
|
|
103
|
+
for (const pid of pids) {
|
|
104
|
+
if (isOrphanedProcess(pid)) {
|
|
105
|
+
try {
|
|
106
|
+
process.kill(pid, 'SIGTERM');
|
|
107
|
+
killed++;
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
// Process may have already exited
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (killed > 0) {
|
|
115
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
116
|
+
}
|
|
117
|
+
return killed;
|
|
118
|
+
}
|
|
64
119
|
/**
|
|
65
120
|
* Check if a port is currently in use
|
|
66
121
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"port-cleanup.js","sourceRoot":"","sources":["../../src/bridge/port-cleanup.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC;;GAEG;AACH,SAAS,gBAAgB,CAAC,GAAW;IACnC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,GAAG,cAAc,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAClF,OAAO,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACtE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,IAAY;IACtC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1E,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC;QACvB,OAAO,MAAM;aACV,KAAK,CAAC,IAAI,CAAC;aACX,MAAM,CAAC,OAAO,CAAC;aACf,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;aAC/B,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAY;IACpD,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEpC,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"port-cleanup.js","sourceRoot":"","sources":["../../src/bridge/port-cleanup.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAYA,cAAc,kBAAkB,CAAC;AAGjC,cAAc,oBAAoB,CAAC;AAGnC,cAAc,oBAAoB,CAAC;AAGnC,cAAc,mBAAmB,CAAC;AAGlC,cAAc,kBAAkB,CAAC;AAGjC,OAAO,EAAE,mBAAmB,EAAE,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAG5E,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAE9E,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEjF,eAAO,MAAM,QAAQ,aAAa,CAAC;AACnC,eAAO,MAAM,OAAO,yBAAyB,CAAC;AAe9C;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAInF;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,CAAC,EAAE,qBAAqB,GAAG,eAAe,CAE9E"}
|
package/dist/index.js
CHANGED
|
@@ -879,6 +879,15 @@ function isMcpExecProcess(pid) {
|
|
|
879
879
|
}
|
|
880
880
|
}
|
|
881
881
|
__name(isMcpExecProcess, "isMcpExecProcess");
|
|
882
|
+
function isOrphanedProcess(pid) {
|
|
883
|
+
try {
|
|
884
|
+
const ppid = execSync(`ps -p ${pid} -o ppid=`, { encoding: "utf8" }).trim();
|
|
885
|
+
return parseInt(ppid, 10) === 1;
|
|
886
|
+
} catch {
|
|
887
|
+
return false;
|
|
888
|
+
}
|
|
889
|
+
}
|
|
890
|
+
__name(isOrphanedProcess, "isOrphanedProcess");
|
|
882
891
|
function getProcessesOnPort(port) {
|
|
883
892
|
try {
|
|
884
893
|
const result = execSync(`lsof -ti :${port}`, { encoding: "utf8" }).trim();
|
|
@@ -890,13 +899,24 @@ function getProcessesOnPort(port) {
|
|
|
890
899
|
}
|
|
891
900
|
}
|
|
892
901
|
__name(getProcessesOnPort, "getProcessesOnPort");
|
|
902
|
+
function getAllMcpExecPids() {
|
|
903
|
+
try {
|
|
904
|
+
const result = execSync(`pgrep -f 'mcp-exec'`, { encoding: "utf8" }).trim();
|
|
905
|
+
if (!result)
|
|
906
|
+
return [];
|
|
907
|
+
return result.split("\n").filter(Boolean).map((pid) => parseInt(pid, 10)).filter((pid) => !isNaN(pid) && pid !== process.pid);
|
|
908
|
+
} catch {
|
|
909
|
+
return [];
|
|
910
|
+
}
|
|
911
|
+
}
|
|
912
|
+
__name(getAllMcpExecPids, "getAllMcpExecPids");
|
|
893
913
|
async function cleanupStaleProcess(port) {
|
|
894
914
|
const pids = getProcessesOnPort(port);
|
|
895
915
|
if (pids.length === 0)
|
|
896
916
|
return false;
|
|
897
917
|
let killedAny = false;
|
|
898
918
|
for (const pid of pids) {
|
|
899
|
-
if (isMcpExecProcess(pid)) {
|
|
919
|
+
if (isMcpExecProcess(pid) || isOrphanedProcess(pid)) {
|
|
900
920
|
try {
|
|
901
921
|
process.kill(pid, "SIGTERM");
|
|
902
922
|
killedAny = true;
|
|
@@ -910,6 +930,24 @@ async function cleanupStaleProcess(port) {
|
|
|
910
930
|
return killedAny;
|
|
911
931
|
}
|
|
912
932
|
__name(cleanupStaleProcess, "cleanupStaleProcess");
|
|
933
|
+
async function cleanupOrphanedProcesses() {
|
|
934
|
+
const pids = getAllMcpExecPids();
|
|
935
|
+
let killed = 0;
|
|
936
|
+
for (const pid of pids) {
|
|
937
|
+
if (isOrphanedProcess(pid)) {
|
|
938
|
+
try {
|
|
939
|
+
process.kill(pid, "SIGTERM");
|
|
940
|
+
killed++;
|
|
941
|
+
} catch {
|
|
942
|
+
}
|
|
943
|
+
}
|
|
944
|
+
}
|
|
945
|
+
if (killed > 0) {
|
|
946
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
947
|
+
}
|
|
948
|
+
return killed;
|
|
949
|
+
}
|
|
950
|
+
__name(cleanupOrphanedProcesses, "cleanupOrphanedProcesses");
|
|
913
951
|
function isPortInUse(port) {
|
|
914
952
|
return getProcessesOnPort(port).length > 0;
|
|
915
953
|
}
|
|
@@ -1269,6 +1307,34 @@ function isExecuteWithWrappersInput(args2) {
|
|
|
1269
1307
|
return typeof args2 === "object" && args2 !== null && "code" in args2 && typeof args2.code === "string" && "wrappers" in args2 && Array.isArray(args2.wrappers) && args2.wrappers.every((w) => typeof w === "string");
|
|
1270
1308
|
}
|
|
1271
1309
|
__name(isExecuteWithWrappersInput, "isExecuteWithWrappersInput");
|
|
1310
|
+
function wrapUserCodeForReturnCapture(code) {
|
|
1311
|
+
const trimmed = code.trimEnd();
|
|
1312
|
+
if (!trimmed)
|
|
1313
|
+
return code;
|
|
1314
|
+
const lines = trimmed.split("\n");
|
|
1315
|
+
let lastIdx = lines.length - 1;
|
|
1316
|
+
while (lastIdx >= 0) {
|
|
1317
|
+
const t = lines[lastIdx].trim();
|
|
1318
|
+
if (t && !t.startsWith("//") && !t.startsWith("*") && !t.startsWith("/*"))
|
|
1319
|
+
break;
|
|
1320
|
+
lastIdx--;
|
|
1321
|
+
}
|
|
1322
|
+
if (lastIdx < 0)
|
|
1323
|
+
return code;
|
|
1324
|
+
const lastTrimmed = lines[lastIdx].trim();
|
|
1325
|
+
const isStatement = /^(const|let|var|function\s|class\s|import\s|export\s|return\b|throw\b|if\s*\(|else\b|for\s*[\({]|while\s*\(|do\s*\{|switch\s*\(|try\s*\{|catch\s*\(|finally\s*\{|break\b|continue\b|;)/.test(lastTrimmed);
|
|
1326
|
+
if (isStatement)
|
|
1327
|
+
return code;
|
|
1328
|
+
const expr = lastTrimmed.replace(/;$/, "");
|
|
1329
|
+
const indent = lines[lastIdx].match(/^(\s*)/)?.[1] ?? "";
|
|
1330
|
+
lines[lastIdx] = `${indent}const __execResult = await Promise.resolve(${expr});
|
|
1331
|
+
${indent}if (__execResult !== undefined) {
|
|
1332
|
+
${indent} const __out = typeof __execResult === 'string' ? __execResult : JSON.stringify(__execResult, null, 2);
|
|
1333
|
+
${indent} process.stdout.write(__out + '\\n');
|
|
1334
|
+
${indent}}`;
|
|
1335
|
+
return lines.join("\n");
|
|
1336
|
+
}
|
|
1337
|
+
__name(wrapUserCodeForReturnCapture, "wrapUserCodeForReturnCapture");
|
|
1272
1338
|
function getMcpPreamble(bridgePort) {
|
|
1273
1339
|
return `
|
|
1274
1340
|
// MCP helper for calling tools via HTTP bridge
|
|
@@ -1298,7 +1364,18 @@ globalThis.mcp = {
|
|
|
1298
1364
|
__name(getMcpPreamble, "getMcpPreamble");
|
|
1299
1365
|
function createExecuteWithWrappersHandler(pool, config = {}) {
|
|
1300
1366
|
const preferredPort = config.bridgeConfig?.port ?? 3e3;
|
|
1301
|
-
|
|
1367
|
+
let activeBridge = null;
|
|
1368
|
+
async function stopActiveBridge() {
|
|
1369
|
+
if (activeBridge?.isRunning()) {
|
|
1370
|
+
try {
|
|
1371
|
+
await activeBridge.stop();
|
|
1372
|
+
} catch {
|
|
1373
|
+
}
|
|
1374
|
+
}
|
|
1375
|
+
activeBridge = null;
|
|
1376
|
+
}
|
|
1377
|
+
__name(stopActiveBridge, "stopActiveBridge");
|
|
1378
|
+
async function executeWithWrappersHandler(args2) {
|
|
1302
1379
|
const { code, wrappers, timeout_ms = DEFAULT_TIMEOUT_MS } = args2;
|
|
1303
1380
|
if (!code || typeof code !== "string") {
|
|
1304
1381
|
return {
|
|
@@ -1329,6 +1406,7 @@ function createExecuteWithWrappersHandler(pool, config = {}) {
|
|
|
1329
1406
|
...config.bridgeConfig,
|
|
1330
1407
|
port: preferredPort
|
|
1331
1408
|
});
|
|
1409
|
+
activeBridge = bridge;
|
|
1332
1410
|
try {
|
|
1333
1411
|
await bridge.start();
|
|
1334
1412
|
const actualPort = bridge.getPort();
|
|
@@ -1352,12 +1430,13 @@ function createExecuteWithWrappersHandler(pool, config = {}) {
|
|
|
1352
1430
|
const generatedWrappers = wrapperModules.join("\n\n");
|
|
1353
1431
|
const mcpDictionary = generateMcpDictionary(wrappers);
|
|
1354
1432
|
const mcpPreamble = getMcpPreamble(actualPort);
|
|
1433
|
+
const instrumentedCode = wrapUserCodeForReturnCapture(code);
|
|
1355
1434
|
const fullCode = `${generatedWrappers}
|
|
1356
1435
|
|
|
1357
1436
|
${mcpDictionary}
|
|
1358
1437
|
|
|
1359
1438
|
${mcpPreamble}
|
|
1360
|
-
${
|
|
1439
|
+
${instrumentedCode}`;
|
|
1361
1440
|
const sandboxConfig = {
|
|
1362
1441
|
...config.sandboxConfig,
|
|
1363
1442
|
mcpBridgePort: actualPort
|
|
@@ -1365,6 +1444,7 @@ ${code}`;
|
|
|
1365
1444
|
const executor = new SandboxExecutor(sandboxConfig);
|
|
1366
1445
|
result = await executor.execute(fullCode, timeout_ms);
|
|
1367
1446
|
await bridge.stop();
|
|
1447
|
+
activeBridge = null;
|
|
1368
1448
|
return formatResult(result);
|
|
1369
1449
|
} catch (error) {
|
|
1370
1450
|
try {
|
|
@@ -1373,10 +1453,13 @@ ${code}`;
|
|
|
1373
1453
|
}
|
|
1374
1454
|
} catch {
|
|
1375
1455
|
}
|
|
1456
|
+
activeBridge = null;
|
|
1376
1457
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
1377
1458
|
return formatErrorResult(errorMessage, result);
|
|
1378
1459
|
}
|
|
1379
|
-
}
|
|
1460
|
+
}
|
|
1461
|
+
__name(executeWithWrappersHandler, "executeWithWrappersHandler");
|
|
1462
|
+
return { handler: executeWithWrappersHandler, stopActiveBridge };
|
|
1380
1463
|
}
|
|
1381
1464
|
__name(createExecuteWithWrappersHandler, "createExecuteWithWrappersHandler");
|
|
1382
1465
|
function formatResult(result) {
|
|
@@ -1426,7 +1509,7 @@ function createMcpExecServer(pool, config = {}) {
|
|
|
1426
1509
|
});
|
|
1427
1510
|
const listServersHandler = createListServersHandler();
|
|
1428
1511
|
const getToolSchemaHandler = createGetToolSchemaHandler(pool);
|
|
1429
|
-
const executeWithWrappersHandler = createExecuteWithWrappersHandler(pool, config.handlerConfig);
|
|
1512
|
+
const { handler: executeWithWrappersHandler, stopActiveBridge } = createExecuteWithWrappersHandler(pool, config.handlerConfig);
|
|
1430
1513
|
const tools = [
|
|
1431
1514
|
listAvailableMcpServersTool,
|
|
1432
1515
|
getMcpToolSchemaTool,
|
|
@@ -1487,6 +1570,7 @@ function createMcpExecServer(pool, config = {}) {
|
|
|
1487
1570
|
return callToolRequestHandler(request.params);
|
|
1488
1571
|
});
|
|
1489
1572
|
const shutdown = /* @__PURE__ */ __name(async () => {
|
|
1573
|
+
await stopActiveBridge();
|
|
1490
1574
|
}, "shutdown");
|
|
1491
1575
|
return {
|
|
1492
1576
|
server,
|
|
@@ -1500,7 +1584,7 @@ __name(createMcpExecServer, "createMcpExecServer");
|
|
|
1500
1584
|
// dist/index.js
|
|
1501
1585
|
import { ServerPool, createConnection, getServerConfig as getServerConfig2, loadServerManifest as loadServerManifest2 } from "@justanothermldude/meta-mcp-core";
|
|
1502
1586
|
var APP_NAME = "mcp-exec";
|
|
1503
|
-
var VERSION2 = "1.3.
|
|
1587
|
+
var VERSION2 = "1.3.2";
|
|
1504
1588
|
var defaultExecutor = null;
|
|
1505
1589
|
function getDefaultExecutor() {
|
|
1506
1590
|
if (!defaultExecutor) {
|
|
@@ -1542,6 +1626,11 @@ Environment:
|
|
|
1542
1626
|
process.exit(0);
|
|
1543
1627
|
}
|
|
1544
1628
|
async function main() {
|
|
1629
|
+
const killed = await cleanupOrphanedProcesses();
|
|
1630
|
+
if (killed > 0) {
|
|
1631
|
+
process.stderr.write(`Cleaned up ${killed} orphaned mcp-exec process(es)
|
|
1632
|
+
`);
|
|
1633
|
+
}
|
|
1545
1634
|
const configPath = process.env.SERVERS_CONFIG;
|
|
1546
1635
|
if (configPath) {
|
|
1547
1636
|
process.stderr.write(`Loading config from: ${configPath}
|
|
@@ -1594,6 +1683,7 @@ export {
|
|
|
1594
1683
|
SandboxExecutor,
|
|
1595
1684
|
VERSION2 as VERSION,
|
|
1596
1685
|
VirtualModuleResolver,
|
|
1686
|
+
cleanupOrphanedProcesses,
|
|
1597
1687
|
cleanupStaleProcess,
|
|
1598
1688
|
createDefaultFilesystemConfig,
|
|
1599
1689
|
createDefaultNetworkConfig,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;GAIG;AACH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/server.js
CHANGED
|
@@ -27,7 +27,7 @@ export function createMcpExecServer(pool, config = {}) {
|
|
|
27
27
|
// Create the get_mcp_tool_schema handler with the pool
|
|
28
28
|
const getToolSchemaHandler = createGetToolSchemaHandler(pool);
|
|
29
29
|
// Create the execute_code_with_wrappers handler with the pool
|
|
30
|
-
const executeWithWrappersHandler = createExecuteWithWrappersHandler(pool, config.handlerConfig);
|
|
30
|
+
const { handler: executeWithWrappersHandler, stopActiveBridge } = createExecuteWithWrappersHandler(pool, config.handlerConfig);
|
|
31
31
|
// Register all tools
|
|
32
32
|
const tools = [
|
|
33
33
|
listAvailableMcpServersTool,
|
|
@@ -89,8 +89,8 @@ export function createMcpExecServer(pool, config = {}) {
|
|
|
89
89
|
return callToolRequestHandler(request.params);
|
|
90
90
|
});
|
|
91
91
|
const shutdown = async () => {
|
|
92
|
-
//
|
|
93
|
-
|
|
92
|
+
// Stop any in-flight bridge so it doesn't keep the event loop alive
|
|
93
|
+
await stopActiveBridge();
|
|
94
94
|
};
|
|
95
95
|
return {
|
|
96
96
|
server,
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GAGvB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,EACxB,kBAAkB,EAClB,oBAAoB,EACpB,0BAA0B,EAC1B,oBAAoB,EACpB,2BAA2B,EAC3B,gCAAgC,EAChC,0BAA0B,GAE3B,MAAM,kBAAkB,CAAC;AAE1B,MAAM,OAAO,GAAG,OAAO,CAAC;AAYxB;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAgB,EAAE,SAA8B,EAAE;IACpF,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;QACE,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,OAAO;KACjB,EACD;QACE,YAAY,EAAE;YACZ,KAAK,EAAE,EAAE;SACV;KACF,CACF,CAAC;IAEF,gDAAgD;IAChD,MAAM,kBAAkB,GAAG,wBAAwB,EAAE,CAAC;IAEtD,uDAAuD;IACvD,MAAM,oBAAoB,GAAG,0BAA0B,CAAC,IAAI,CAAC,CAAC;IAE9D,8DAA8D;IAC9D,MAAM,0BAA0B,GAAG,gCAAgC,CAAC,IAAI,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -76,7 +76,10 @@ export declare function isExecuteWithWrappersInput(args: unknown): args is Execu
|
|
|
76
76
|
*
|
|
77
77
|
* @param pool - Server pool for MCP connections
|
|
78
78
|
* @param config - Optional handler configuration
|
|
79
|
-
* @returns
|
|
79
|
+
* @returns Object with handler function and stopActiveBridge for graceful shutdown
|
|
80
80
|
*/
|
|
81
|
-
export declare function createExecuteWithWrappersHandler(pool: ServerPool, config?: ExecuteWithWrappersHandlerConfig):
|
|
81
|
+
export declare function createExecuteWithWrappersHandler(pool: ServerPool, config?: ExecuteWithWrappersHandlerConfig): {
|
|
82
|
+
handler: (args: ExecuteWithWrappersInput) => Promise<CallToolResult>;
|
|
83
|
+
stopActiveBridge: () => Promise<void>;
|
|
84
|
+
};
|
|
82
85
|
//# sourceMappingURL=execute-with-wrappers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute-with-wrappers.d.ts","sourceRoot":"","sources":["../../src/tools/execute-with-wrappers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAEnE,OAAO,EAAmB,KAAK,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAa,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrE;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;CAyBvC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,gCAAgC;IAC/C,6CAA6C;IAC7C,aAAa,CAAC,EAAE,qBAAqB,CAAC;IACtC,uCAAuC;IACvC,YAAY,CAAC,EAAE,eAAe,CAAC;CAChC;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,wBAAwB,CAU1F;
|
|
1
|
+
{"version":3,"file":"execute-with-wrappers.d.ts","sourceRoot":"","sources":["../../src/tools/execute-with-wrappers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAEnE,OAAO,EAAmB,KAAK,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAa,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrE;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,qDAAqD;IACrD,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;CAyBvC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,gCAAgC;IAC/C,6CAA6C;IAC7C,aAAa,CAAC,EAAE,qBAAqB,CAAC;IACtC,uCAAuC;IACvC,YAAY,CAAC,EAAE,eAAe,CAAC;CAChC;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,wBAAwB,CAU1F;AAgFD;;;;;;GAMG;AACH,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,UAAU,EAChB,MAAM,GAAE,gCAAqC;oBA0BrC,wBAAwB,KAC7B,OAAO,CAAC,cAAc,CAAC;4BAhBS,OAAO,CAAC,IAAI,CAAC;EAkIjD"}
|
|
@@ -42,6 +42,48 @@ export function isExecuteWithWrappersInput(args) {
|
|
|
42
42
|
Array.isArray(args.wrappers) &&
|
|
43
43
|
args.wrappers.every((w) => typeof w === 'string'));
|
|
44
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* REPL-like return value capture: if the last expression of userCode is a bare
|
|
47
|
+
* expression statement (not a declaration or control-flow keyword), transform it
|
|
48
|
+
* to an async IIFE that returns that expression and prints the result.
|
|
49
|
+
*
|
|
50
|
+
* Handles common cases:
|
|
51
|
+
* `42` → prints 42
|
|
52
|
+
* `someVar` → prints value of someVar
|
|
53
|
+
* `await mcp.callTool(...)` → prints result
|
|
54
|
+
*
|
|
55
|
+
* Skips if last statement starts with const/let/var/function/class/return/throw/if/for/…
|
|
56
|
+
*/
|
|
57
|
+
function wrapUserCodeForReturnCapture(code) {
|
|
58
|
+
const trimmed = code.trimEnd();
|
|
59
|
+
if (!trimmed)
|
|
60
|
+
return code;
|
|
61
|
+
const lines = trimmed.split('\n');
|
|
62
|
+
let lastIdx = lines.length - 1;
|
|
63
|
+
// Find last non-empty, non-comment line
|
|
64
|
+
while (lastIdx >= 0) {
|
|
65
|
+
const t = lines[lastIdx].trim();
|
|
66
|
+
if (t && !t.startsWith('//') && !t.startsWith('*') && !t.startsWith('/*'))
|
|
67
|
+
break;
|
|
68
|
+
lastIdx--;
|
|
69
|
+
}
|
|
70
|
+
if (lastIdx < 0)
|
|
71
|
+
return code;
|
|
72
|
+
const lastTrimmed = lines[lastIdx].trim();
|
|
73
|
+
// Skip if it's a statement keyword, declaration, or already a return
|
|
74
|
+
const isStatement = /^(const|let|var|function\s|class\s|import\s|export\s|return\b|throw\b|if\s*\(|else\b|for\s*[\({]|while\s*\(|do\s*\{|switch\s*\(|try\s*\{|catch\s*\(|finally\s*\{|break\b|continue\b|;)/.test(lastTrimmed);
|
|
75
|
+
if (isStatement)
|
|
76
|
+
return code;
|
|
77
|
+
// Strip trailing semicolon from the last expression before wrapping
|
|
78
|
+
const expr = lastTrimmed.replace(/;$/, '');
|
|
79
|
+
const indent = lines[lastIdx].match(/^(\s*)/)?.[1] ?? '';
|
|
80
|
+
lines[lastIdx] = `${indent}const __execResult = await Promise.resolve(${expr});
|
|
81
|
+
${indent}if (__execResult !== undefined) {
|
|
82
|
+
${indent} const __out = typeof __execResult === 'string' ? __execResult : JSON.stringify(__execResult, null, 2);
|
|
83
|
+
${indent} process.stdout.write(__out + '\\n');
|
|
84
|
+
${indent}}`;
|
|
85
|
+
return lines.join('\n');
|
|
86
|
+
}
|
|
45
87
|
/**
|
|
46
88
|
* Generate the MCP helper preamble that provides the global `mcp` object
|
|
47
89
|
* for calling MCP tools via the HTTP bridge
|
|
@@ -77,15 +119,31 @@ globalThis.mcp = {
|
|
|
77
119
|
*
|
|
78
120
|
* @param pool - Server pool for MCP connections
|
|
79
121
|
* @param config - Optional handler configuration
|
|
80
|
-
* @returns
|
|
122
|
+
* @returns Object with handler function and stopActiveBridge for graceful shutdown
|
|
81
123
|
*/
|
|
82
124
|
export function createExecuteWithWrappersHandler(pool, config = {}) {
|
|
83
125
|
// Preferred port (actual port determined at runtime via dynamic allocation)
|
|
84
126
|
const preferredPort = config.bridgeConfig?.port ?? 3000;
|
|
127
|
+
// Track the bridge that is currently running (at most one per handler instance)
|
|
128
|
+
let activeBridge = null;
|
|
129
|
+
/**
|
|
130
|
+
* Stop the currently active bridge, if any. Called during graceful shutdown.
|
|
131
|
+
*/
|
|
132
|
+
async function stopActiveBridge() {
|
|
133
|
+
if (activeBridge?.isRunning()) {
|
|
134
|
+
try {
|
|
135
|
+
await activeBridge.stop();
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
// Ignore — process is shutting down anyway
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
activeBridge = null;
|
|
142
|
+
}
|
|
85
143
|
/**
|
|
86
144
|
* Execute code with wrappers handler - generates wrappers, composes code, and executes
|
|
87
145
|
*/
|
|
88
|
-
|
|
146
|
+
async function executeWithWrappersHandler(args) {
|
|
89
147
|
const { code, wrappers, timeout_ms = DEFAULT_TIMEOUT_MS } = args;
|
|
90
148
|
// Validate input
|
|
91
149
|
if (!code || typeof code !== 'string') {
|
|
@@ -118,6 +176,7 @@ export function createExecuteWithWrappersHandler(pool, config = {}) {
|
|
|
118
176
|
...config.bridgeConfig,
|
|
119
177
|
port: preferredPort,
|
|
120
178
|
});
|
|
179
|
+
activeBridge = bridge;
|
|
121
180
|
try {
|
|
122
181
|
// Step 1: Start the MCP bridge server (gets dynamic port)
|
|
123
182
|
await bridge.start();
|
|
@@ -149,7 +208,8 @@ export function createExecuteWithWrappersHandler(pool, config = {}) {
|
|
|
149
208
|
const generatedWrappers = wrapperModules.join('\n\n');
|
|
150
209
|
const mcpDictionary = generateMcpDictionary(wrappers);
|
|
151
210
|
const mcpPreamble = getMcpPreamble(actualPort);
|
|
152
|
-
const
|
|
211
|
+
const instrumentedCode = wrapUserCodeForReturnCapture(code);
|
|
212
|
+
const fullCode = `${generatedWrappers}\n\n${mcpDictionary}\n\n${mcpPreamble}\n${instrumentedCode}`;
|
|
153
213
|
// Step 4: Create executor with actual port for sandbox network config
|
|
154
214
|
const sandboxConfig = {
|
|
155
215
|
...config.sandboxConfig,
|
|
@@ -160,6 +220,7 @@ export function createExecuteWithWrappersHandler(pool, config = {}) {
|
|
|
160
220
|
result = await executor.execute(fullCode, timeout_ms);
|
|
161
221
|
// Step 6: Stop the bridge server
|
|
162
222
|
await bridge.stop();
|
|
223
|
+
activeBridge = null;
|
|
163
224
|
// Step 7: Format and return result
|
|
164
225
|
return formatResult(result);
|
|
165
226
|
}
|
|
@@ -173,11 +234,13 @@ export function createExecuteWithWrappersHandler(pool, config = {}) {
|
|
|
173
234
|
catch {
|
|
174
235
|
// Ignore cleanup errors
|
|
175
236
|
}
|
|
237
|
+
activeBridge = null;
|
|
176
238
|
// Return error with any partial output
|
|
177
239
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
178
240
|
return formatErrorResult(errorMessage, result);
|
|
179
241
|
}
|
|
180
|
-
}
|
|
242
|
+
}
|
|
243
|
+
return { handler: executeWithWrappersHandler, stopActiveBridge };
|
|
181
244
|
}
|
|
182
245
|
/**
|
|
183
246
|
* Format a successful execution result
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execute-with-wrappers.js","sourceRoot":"","sources":["../../src/tools/execute-with-wrappers.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,eAAe,EAA8B,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,SAAS,EAAwB,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAwB,MAAM,uBAAuB,CAAC;AA8BjF;;GAEG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,IAAI,EAAE,4BAA4B;IAClC,WAAW,EACT,mGAAmG;QACnG,gGAAgG;QAChG,kEAAkE;IACpE,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,2FAA2F;aACzG;YACD,QAAQ,EAAE;gBACR,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACzB,WAAW,EAAE,0DAA0D;aACxE;YACD,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,oDAAoD,kBAAkB,GAAG;aACvF;SACF;QACD,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC;KAC/B;CACF,CAAC;AAYF;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,IAAa;IACtD,OAAO,CACL,OAAO,IAAI,KAAK,QAAQ;QACxB,IAAI,KAAK,IAAI;QACb,MAAM,IAAI,IAAI;QACd,OAAQ,IAAiC,CAAC,IAAI,KAAK,QAAQ;QAC3D,UAAU,IAAI,IAAI;QAClB,KAAK,CAAC,OAAO,CAAE,IAAiC,CAAC,QAAQ,CAAC;QACzD,IAAiC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAChF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CAAC,UAAkB;IACxC,OAAO;;;;;;;;;;qDAU4C,UAAU;;;;;;;;;;;;;CAa9D,CAAC;AACF,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gCAAgC,CAC9C,IAAgB,EAChB,SAA2C,EAAE;IAE7C,4EAA4E;IAC5E,MAAM,aAAa,GAAG,MAAM,CAAC,YAAY,EAAE,IAAI,IAAI,IAAI,CAAC;IAExD;;OAEG;IACH,
|
|
1
|
+
{"version":3,"file":"execute-with-wrappers.js","sourceRoot":"","sources":["../../src/tools/execute-with-wrappers.ts"],"names":[],"mappings":"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"}
|