@neverinfamous/mysql-mcp 2.2.0 → 2.3.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/.github/workflows/docker-publish.yml +1 -2
- package/CHANGELOG.md +85 -0
- package/CODE_MODE.md +245 -0
- package/DOCKER_README.md +59 -36
- package/README.md +65 -42
- package/VERSION +1 -1
- package/dist/adapters/mysql/MySQLAdapter.d.ts +4 -0
- package/dist/adapters/mysql/MySQLAdapter.d.ts.map +1 -1
- package/dist/adapters/mysql/MySQLAdapter.js +9 -0
- package/dist/adapters/mysql/MySQLAdapter.js.map +1 -1
- package/dist/adapters/mysql/prompts/index.d.ts +8 -1
- package/dist/adapters/mysql/prompts/index.d.ts.map +1 -1
- package/dist/adapters/mysql/prompts/index.js +8 -1
- package/dist/adapters/mysql/prompts/index.js.map +1 -1
- package/dist/adapters/mysql/prompts/routerSetup.d.ts.map +1 -1
- package/dist/adapters/mysql/prompts/routerSetup.js +5 -0
- package/dist/adapters/mysql/prompts/routerSetup.js.map +1 -1
- package/dist/adapters/mysql/resources/capabilities.d.ts.map +1 -1
- package/dist/adapters/mysql/resources/capabilities.js +6 -5
- package/dist/adapters/mysql/resources/capabilities.js.map +1 -1
- package/dist/adapters/mysql/resources/index.d.ts +9 -1
- package/dist/adapters/mysql/resources/index.d.ts.map +1 -1
- package/dist/adapters/mysql/resources/index.js +9 -1
- package/dist/adapters/mysql/resources/index.js.map +1 -1
- package/dist/adapters/mysql/tools/admin/backup.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/admin/backup.js +3 -3
- package/dist/adapters/mysql/tools/admin/backup.js.map +1 -1
- package/dist/adapters/mysql/tools/admin/maintenance.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/admin/maintenance.js +5 -5
- package/dist/adapters/mysql/tools/admin/maintenance.js.map +1 -1
- package/dist/adapters/mysql/tools/cluster/innodb-cluster.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/cluster/innodb-cluster.js +26 -5
- package/dist/adapters/mysql/tools/cluster/innodb-cluster.js.map +1 -1
- package/dist/adapters/mysql/tools/codemode/index.d.ts +38 -0
- package/dist/adapters/mysql/tools/codemode/index.d.ts.map +1 -0
- package/dist/adapters/mysql/tools/codemode/index.js +203 -0
- package/dist/adapters/mysql/tools/codemode/index.js.map +1 -0
- package/dist/adapters/mysql/tools/core.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/core.js +32 -20
- package/dist/adapters/mysql/tools/core.js.map +1 -1
- package/dist/adapters/mysql/tools/events.js +18 -6
- package/dist/adapters/mysql/tools/events.js.map +1 -1
- package/dist/adapters/mysql/tools/json/core.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/json/core.js +5 -5
- package/dist/adapters/mysql/tools/json/core.js.map +1 -1
- package/dist/adapters/mysql/tools/json/helpers.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/json/helpers.js +9 -3
- package/dist/adapters/mysql/tools/json/helpers.js.map +1 -1
- package/dist/adapters/mysql/tools/partitioning.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/partitioning.js +38 -6
- package/dist/adapters/mysql/tools/partitioning.js.map +1 -1
- package/dist/adapters/mysql/tools/performance/analysis.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/performance/analysis.js +67 -20
- package/dist/adapters/mysql/tools/performance/analysis.js.map +1 -1
- package/dist/adapters/mysql/tools/performance/optimization.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/performance/optimization.js +36 -6
- package/dist/adapters/mysql/tools/performance/optimization.js.map +1 -1
- package/dist/adapters/mysql/tools/security/data-protection.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/security/data-protection.js +9 -4
- package/dist/adapters/mysql/tools/security/data-protection.js.map +1 -1
- package/dist/adapters/mysql/tools/shell/common.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/shell/common.js +28 -2
- package/dist/adapters/mysql/tools/shell/common.js.map +1 -1
- package/dist/adapters/mysql/tools/shell/restore.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/shell/restore.js +54 -4
- package/dist/adapters/mysql/tools/shell/restore.js.map +1 -1
- package/dist/adapters/mysql/tools/spatial/operations.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/spatial/operations.js +10 -2
- package/dist/adapters/mysql/tools/spatial/operations.js.map +1 -1
- package/dist/adapters/mysql/tools/spatial/setup.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/spatial/setup.js +18 -0
- package/dist/adapters/mysql/tools/spatial/setup.js.map +1 -1
- package/dist/adapters/mysql/tools/sysschema/resources.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/sysschema/resources.js +5 -0
- package/dist/adapters/mysql/tools/sysschema/resources.js.map +1 -1
- package/dist/adapters/mysql/tools/text/fulltext.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/text/fulltext.js +6 -4
- package/dist/adapters/mysql/tools/text/fulltext.js.map +1 -1
- package/dist/adapters/mysql/tools/text/processing.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/text/processing.js +10 -45
- package/dist/adapters/mysql/tools/text/processing.js.map +1 -1
- package/dist/adapters/mysql/tools/transactions.d.ts.map +1 -1
- package/dist/adapters/mysql/tools/transactions.js +8 -8
- package/dist/adapters/mysql/tools/transactions.js.map +1 -1
- package/dist/adapters/mysql/types.d.ts +968 -78
- package/dist/adapters/mysql/types.d.ts.map +1 -1
- package/dist/adapters/mysql/types.js +1084 -78
- package/dist/adapters/mysql/types.js.map +1 -1
- package/dist/auth/scopes.d.ts.map +1 -1
- package/dist/auth/scopes.js +1 -0
- package/dist/auth/scopes.js.map +1 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +12 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/codemode/api.d.ts +69 -0
- package/dist/codemode/api.d.ts.map +1 -0
- package/dist/codemode/api.js +1035 -0
- package/dist/codemode/api.js.map +1 -0
- package/dist/codemode/index.d.ts +13 -0
- package/dist/codemode/index.d.ts.map +1 -0
- package/dist/codemode/index.js +17 -0
- package/dist/codemode/index.js.map +1 -0
- package/dist/codemode/sandbox-factory.d.ts +72 -0
- package/dist/codemode/sandbox-factory.d.ts.map +1 -0
- package/dist/codemode/sandbox-factory.js +88 -0
- package/dist/codemode/sandbox-factory.js.map +1 -0
- package/dist/codemode/sandbox.d.ts +96 -0
- package/dist/codemode/sandbox.d.ts.map +1 -0
- package/dist/codemode/sandbox.js +345 -0
- package/dist/codemode/sandbox.js.map +1 -0
- package/dist/codemode/security.d.ts +44 -0
- package/dist/codemode/security.d.ts.map +1 -0
- package/dist/codemode/security.js +149 -0
- package/dist/codemode/security.js.map +1 -0
- package/dist/codemode/types.d.ts +137 -0
- package/dist/codemode/types.d.ts.map +1 -0
- package/dist/codemode/types.js +46 -0
- package/dist/codemode/types.js.map +1 -0
- package/dist/codemode/worker-sandbox.d.ts +82 -0
- package/dist/codemode/worker-sandbox.d.ts.map +1 -0
- package/dist/codemode/worker-sandbox.js +244 -0
- package/dist/codemode/worker-sandbox.js.map +1 -0
- package/dist/codemode/worker-script.d.ts +8 -0
- package/dist/codemode/worker-script.d.ts.map +1 -0
- package/dist/codemode/worker-script.js +113 -0
- package/dist/codemode/worker-script.js.map +1 -0
- package/dist/constants/ServerInstructions.d.ts +1 -1
- package/dist/constants/ServerInstructions.d.ts.map +1 -1
- package/dist/constants/ServerInstructions.js +33 -9
- package/dist/constants/ServerInstructions.js.map +1 -1
- package/dist/filtering/ToolConstants.d.ts +11 -11
- package/dist/filtering/ToolConstants.d.ts.map +1 -1
- package/dist/filtering/ToolConstants.js +37 -19
- package/dist/filtering/ToolConstants.js.map +1 -1
- package/dist/filtering/ToolFilter.d.ts.map +1 -1
- package/dist/filtering/ToolFilter.js +12 -0
- package/dist/filtering/ToolFilter.js.map +1 -1
- package/dist/server/McpServer.js +1 -1
- package/dist/server/McpServer.js.map +1 -1
- package/dist/types/modules/server.d.ts +2 -0
- package/dist/types/modules/server.d.ts.map +1 -1
- package/dist/types/modules/tools.d.ts +1 -1
- package/dist/types/modules/tools.d.ts.map +1 -1
- package/dist/utils/logger.d.ts +1 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js.map +1 -1
- package/package.json +12 -7
- package/releases/v2.2.0-release-notes.md +18 -18
- package/releases/v2.3.0-release-notes.md +191 -0
- package/src/__tests__/perf.test.ts +12 -12
- package/src/adapters/mysql/MySQLAdapter.ts +10 -0
- package/src/adapters/mysql/__tests__/MySQLAdapter.test.ts +1 -1
- package/src/adapters/mysql/prompts/index.ts +8 -1
- package/src/adapters/mysql/prompts/routerSetup.ts +5 -0
- package/src/adapters/mysql/resources/__tests__/capabilities.test.ts +50 -1
- package/src/adapters/mysql/resources/capabilities.ts +6 -4
- package/src/adapters/mysql/resources/index.ts +9 -1
- package/src/adapters/mysql/tools/__tests__/core.test.ts +68 -0
- package/src/adapters/mysql/tools/__tests__/events.test.ts +56 -2
- package/src/adapters/mysql/tools/__tests__/json_core.test.ts +1 -1
- package/src/adapters/mysql/tools/__tests__/json_helpers.test.ts +46 -4
- package/src/adapters/mysql/tools/__tests__/replication.test.ts +144 -42
- package/src/adapters/mysql/tools/__tests__/security.test.ts +39 -0
- package/src/adapters/mysql/tools/__tests__/spatial.test.ts +39 -7
- package/src/adapters/mysql/tools/__tests__/spatial_handler.test.ts +35 -3
- package/src/adapters/mysql/tools/__tests__/transactions.test.ts +3 -5
- package/src/adapters/mysql/tools/admin/backup.ts +8 -3
- package/src/adapters/mysql/tools/admin/maintenance.ts +8 -4
- package/src/adapters/mysql/tools/cluster/__tests__/innodb-cluster.test.ts +35 -0
- package/src/adapters/mysql/tools/cluster/innodb-cluster.ts +26 -5
- package/src/adapters/mysql/tools/codemode/index.ts +249 -0
- package/src/adapters/mysql/tools/core.ts +44 -27
- package/src/adapters/mysql/tools/events.ts +23 -7
- package/src/adapters/mysql/tools/json/__tests__/helpers.test.ts +59 -14
- package/src/adapters/mysql/tools/json/core.ts +8 -4
- package/src/adapters/mysql/tools/json/helpers.ts +13 -3
- package/src/adapters/mysql/tools/partitioning.ts +53 -6
- package/src/adapters/mysql/tools/performance/__tests__/analysis.test.ts +227 -4
- package/src/adapters/mysql/tools/performance/__tests__/optimization.test.ts +35 -0
- package/src/adapters/mysql/tools/performance/analysis.ts +75 -21
- package/src/adapters/mysql/tools/performance/optimization.ts +44 -6
- package/src/adapters/mysql/tools/security/data-protection.ts +10 -4
- package/src/adapters/mysql/tools/shell/__tests__/common.test.ts +46 -0
- package/src/adapters/mysql/tools/shell/__tests__/restore.test.ts +28 -1
- package/src/adapters/mysql/tools/shell/common.ts +34 -2
- package/src/adapters/mysql/tools/shell/restore.ts +70 -7
- package/src/adapters/mysql/tools/spatial/__tests__/operations.test.ts +29 -0
- package/src/adapters/mysql/tools/spatial/operations.ts +13 -2
- package/src/adapters/mysql/tools/spatial/setup.ts +23 -0
- package/src/adapters/mysql/tools/sysschema/__tests__/resources.test.ts +21 -0
- package/src/adapters/mysql/tools/sysschema/resources.ts +5 -0
- package/src/adapters/mysql/tools/text/fulltext.ts +13 -5
- package/src/adapters/mysql/tools/text/processing.ts +20 -49
- package/src/adapters/mysql/tools/transactions.ts +11 -7
- package/src/adapters/mysql/types.ts +1241 -87
- package/src/auth/scopes.ts +1 -0
- package/src/cli/args.ts +14 -0
- package/src/codemode/api.ts +1224 -0
- package/src/codemode/index.ts +51 -0
- package/src/codemode/sandbox-factory.ts +146 -0
- package/src/codemode/sandbox.ts +450 -0
- package/src/codemode/security.ts +188 -0
- package/src/codemode/types.ts +194 -0
- package/src/codemode/worker-sandbox.ts +326 -0
- package/src/codemode/worker-script.ts +144 -0
- package/src/constants/ServerInstructions.ts +33 -9
- package/src/filtering/ToolConstants.ts +37 -19
- package/src/filtering/ToolFilter.ts +15 -0
- package/src/filtering/__tests__/ToolFilter.test.ts +65 -38
- package/src/server/McpServer.ts +1 -1
- package/src/types/modules/server.ts +3 -0
- package/src/types/modules/tools.ts +2 -1
- package/src/utils/logger.ts +2 -1
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* mysql-mcp - Code Mode Types
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for the sandboxed code execution environment.
|
|
5
|
+
*/
|
|
6
|
+
import type { ToolGroup } from "../types/index.js";
|
|
7
|
+
/**
|
|
8
|
+
* Options for sandbox execution
|
|
9
|
+
*/
|
|
10
|
+
export interface SandboxOptions {
|
|
11
|
+
/** Memory limit in MB (default: 128) */
|
|
12
|
+
memoryLimitMb?: number;
|
|
13
|
+
/** Execution timeout in milliseconds (default: 30000) */
|
|
14
|
+
timeoutMs?: number;
|
|
15
|
+
/** CPU time limit in milliseconds (default: 10000) */
|
|
16
|
+
cpuLimitMs?: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Options for the sandbox pool
|
|
20
|
+
*/
|
|
21
|
+
export interface PoolOptions {
|
|
22
|
+
/** Minimum instances to keep warm (default: 2) */
|
|
23
|
+
minInstances?: number;
|
|
24
|
+
/** Maximum instances in pool (default: 10) */
|
|
25
|
+
maxInstances?: number;
|
|
26
|
+
/** Idle timeout before disposing instance (default: 60000ms) */
|
|
27
|
+
idleTimeoutMs?: number;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Default sandbox configuration
|
|
31
|
+
*/
|
|
32
|
+
export declare const DEFAULT_SANDBOX_OPTIONS: Required<SandboxOptions>;
|
|
33
|
+
/**
|
|
34
|
+
* Default pool configuration
|
|
35
|
+
*/
|
|
36
|
+
export declare const DEFAULT_POOL_OPTIONS: Required<PoolOptions>;
|
|
37
|
+
/**
|
|
38
|
+
* Metrics collected during sandbox execution
|
|
39
|
+
*/
|
|
40
|
+
export interface ExecutionMetrics {
|
|
41
|
+
/** Wall clock time in milliseconds */
|
|
42
|
+
wallTimeMs: number;
|
|
43
|
+
/** CPU time consumed in milliseconds */
|
|
44
|
+
cpuTimeMs: number;
|
|
45
|
+
/** Peak memory usage in MB */
|
|
46
|
+
memoryUsedMb: number;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Result of sandbox code execution
|
|
50
|
+
*/
|
|
51
|
+
export interface SandboxResult {
|
|
52
|
+
/** Whether execution completed successfully */
|
|
53
|
+
success: boolean;
|
|
54
|
+
/** Return value from the code (if successful) */
|
|
55
|
+
result?: unknown;
|
|
56
|
+
/** Error message (if failed) */
|
|
57
|
+
error?: string | undefined;
|
|
58
|
+
/** Stack trace (if failed) */
|
|
59
|
+
stack?: string | undefined;
|
|
60
|
+
/** Execution metrics */
|
|
61
|
+
metrics: ExecutionMetrics;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Security configuration for code validation
|
|
65
|
+
*/
|
|
66
|
+
export interface SecurityConfig {
|
|
67
|
+
/** Maximum code length in bytes (default: 50KB) */
|
|
68
|
+
maxCodeLength: number;
|
|
69
|
+
/** Maximum executions per minute per client (default: 60) */
|
|
70
|
+
maxExecutionsPerMinute: number;
|
|
71
|
+
/** Maximum result size in bytes (default: 10MB) */
|
|
72
|
+
maxResultSize: number;
|
|
73
|
+
/** Patterns to block in code */
|
|
74
|
+
blockedPatterns: RegExp[];
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Default security configuration
|
|
78
|
+
*/
|
|
79
|
+
export declare const DEFAULT_SECURITY_CONFIG: SecurityConfig;
|
|
80
|
+
/**
|
|
81
|
+
* Validation result from security checks
|
|
82
|
+
*/
|
|
83
|
+
export interface ValidationResult {
|
|
84
|
+
/** Whether the code passed validation */
|
|
85
|
+
valid: boolean;
|
|
86
|
+
/** Validation errors (if any) */
|
|
87
|
+
errors: string[];
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Execution record for audit logging
|
|
91
|
+
*/
|
|
92
|
+
export interface ExecutionRecord {
|
|
93
|
+
/** Unique execution ID */
|
|
94
|
+
id: string;
|
|
95
|
+
/** Client identifier (for rate limiting) */
|
|
96
|
+
clientId?: string | undefined;
|
|
97
|
+
/** Timestamp of execution start */
|
|
98
|
+
timestamp: Date;
|
|
99
|
+
/** Code that was executed (truncated for logging) */
|
|
100
|
+
codePreview: string;
|
|
101
|
+
/** Execution result */
|
|
102
|
+
result: SandboxResult;
|
|
103
|
+
/** Whether code was in readonly mode */
|
|
104
|
+
readonly: boolean;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Tool group API interface - each group exposes its tools as methods
|
|
108
|
+
*/
|
|
109
|
+
export interface GroupApi {
|
|
110
|
+
/** Tool group name */
|
|
111
|
+
readonly groupName: ToolGroup;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Options passed to mysql_execute_code tool
|
|
115
|
+
*/
|
|
116
|
+
export interface ExecuteCodeOptions {
|
|
117
|
+
/** TypeScript code to execute */
|
|
118
|
+
code: string;
|
|
119
|
+
/** Timeout in milliseconds (max 30000) */
|
|
120
|
+
timeout?: number;
|
|
121
|
+
/** Restrict to read-only operations */
|
|
122
|
+
readonly?: boolean;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Result returned by mysql_execute_code tool
|
|
126
|
+
*/
|
|
127
|
+
export interface ExecuteCodeResult {
|
|
128
|
+
/** Whether execution succeeded */
|
|
129
|
+
success: boolean;
|
|
130
|
+
/** Return value from the code */
|
|
131
|
+
result?: unknown;
|
|
132
|
+
/** Error message (if failed) */
|
|
133
|
+
error?: string;
|
|
134
|
+
/** Execution metrics */
|
|
135
|
+
metrics: ExecutionMetrics;
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/codemode/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* mysql-mcp - Code Mode Types
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for the sandboxed code execution environment.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Default sandbox configuration
|
|
8
|
+
*/
|
|
9
|
+
export const DEFAULT_SANDBOX_OPTIONS = {
|
|
10
|
+
memoryLimitMb: 128,
|
|
11
|
+
timeoutMs: 30000,
|
|
12
|
+
cpuLimitMs: 10000,
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Default pool configuration
|
|
16
|
+
*/
|
|
17
|
+
export const DEFAULT_POOL_OPTIONS = {
|
|
18
|
+
minInstances: 2,
|
|
19
|
+
maxInstances: 10,
|
|
20
|
+
idleTimeoutMs: 60000,
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Default security configuration
|
|
24
|
+
*/
|
|
25
|
+
export const DEFAULT_SECURITY_CONFIG = {
|
|
26
|
+
maxCodeLength: 50 * 1024, // 50KB
|
|
27
|
+
maxExecutionsPerMinute: 60,
|
|
28
|
+
maxResultSize: 10 * 1024 * 1024, // 10MB
|
|
29
|
+
blockedPatterns: [
|
|
30
|
+
/\brequire\s*\(/, // No require()
|
|
31
|
+
/\bimport\s*\(/, // No dynamic import()
|
|
32
|
+
/\bprocess\./, // No process access
|
|
33
|
+
/\bglobal\./, // No global access
|
|
34
|
+
/\bglobalThis\./, // No globalThis access
|
|
35
|
+
/\beval\s*\(/, // No eval()
|
|
36
|
+
/\bFunction\s*\(/, // No Function constructor
|
|
37
|
+
/\b__proto__\b/, // No prototype pollution
|
|
38
|
+
/\bconstructor\.constructor/, // No constructor chaining
|
|
39
|
+
/\bchild_process/, // No child processes
|
|
40
|
+
/\bfs\./, // No filesystem
|
|
41
|
+
/\bnet\./, // No networking
|
|
42
|
+
/\bhttp\./, // No HTTP
|
|
43
|
+
/\bhttps\./, // No HTTPS
|
|
44
|
+
],
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/codemode/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAgCH;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAA6B;IAC/D,aAAa,EAAE,GAAG;IAClB,SAAS,EAAE,KAAK;IAChB,UAAU,EAAE,KAAK;CAClB,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAA0B;IACzD,YAAY,EAAE,CAAC;IACf,YAAY,EAAE,EAAE;IAChB,aAAa,EAAE,KAAK;CACrB,CAAC;AAoDF;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAmB;IACrD,aAAa,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO;IACjC,sBAAsB,EAAE,EAAE;IAC1B,aAAa,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,OAAO;IACxC,eAAe,EAAE;QACf,gBAAgB,EAAE,eAAe;QACjC,eAAe,EAAE,sBAAsB;QACvC,aAAa,EAAE,oBAAoB;QACnC,YAAY,EAAE,mBAAmB;QACjC,gBAAgB,EAAE,uBAAuB;QACzC,aAAa,EAAE,YAAY;QAC3B,iBAAiB,EAAE,0BAA0B;QAC7C,eAAe,EAAE,yBAAyB;QAC1C,4BAA4B,EAAE,0BAA0B;QACxD,iBAAiB,EAAE,qBAAqB;QACxC,QAAQ,EAAE,gBAAgB;QAC1B,SAAS,EAAE,gBAAgB;QAC3B,UAAU,EAAE,UAAU;QACtB,WAAW,EAAE,WAAW;KACzB;CACF,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* mysql-mcp - Code Mode Worker Sandbox
|
|
3
|
+
*
|
|
4
|
+
* Enhanced sandboxed execution using worker_threads for process-level isolation.
|
|
5
|
+
* Provides stronger isolation than vm module by running code in a separate thread
|
|
6
|
+
* with isolated memory space.
|
|
7
|
+
*
|
|
8
|
+
* Features:
|
|
9
|
+
* - Separate V8 instance per worker thread
|
|
10
|
+
* - Hard timeout enforcement (worker termination)
|
|
11
|
+
* - Isolated memory space
|
|
12
|
+
* - Clean process state on each execution
|
|
13
|
+
*/
|
|
14
|
+
import { type SandboxOptions, type PoolOptions, type SandboxResult } from "./types.js";
|
|
15
|
+
/**
|
|
16
|
+
* A sandboxed execution context using worker_threads
|
|
17
|
+
* Provides stronger isolation than vm module with separate V8 instance
|
|
18
|
+
*/
|
|
19
|
+
export declare class WorkerSandbox {
|
|
20
|
+
private readonly options;
|
|
21
|
+
private disposed;
|
|
22
|
+
private constructor();
|
|
23
|
+
/**
|
|
24
|
+
* Create a new worker sandbox instance
|
|
25
|
+
*/
|
|
26
|
+
static create(options?: SandboxOptions): WorkerSandbox;
|
|
27
|
+
/**
|
|
28
|
+
* Execute code in a worker thread
|
|
29
|
+
* Each execution spawns a fresh worker for maximum isolation
|
|
30
|
+
*/
|
|
31
|
+
execute(code: string, apiBindings: Record<string, unknown>): Promise<SandboxResult>;
|
|
32
|
+
/**
|
|
33
|
+
* Serialize API bindings for worker transfer
|
|
34
|
+
* We can't transfer functions directly, so we send method names
|
|
35
|
+
*/
|
|
36
|
+
private serializeBindings;
|
|
37
|
+
/**
|
|
38
|
+
* Calculate execution metrics
|
|
39
|
+
*/
|
|
40
|
+
private calculateMetrics;
|
|
41
|
+
/**
|
|
42
|
+
* Check if sandbox is healthy
|
|
43
|
+
*/
|
|
44
|
+
isHealthy(): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Dispose of the sandbox
|
|
47
|
+
*/
|
|
48
|
+
dispose(): void;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Pool of worker sandboxes
|
|
52
|
+
* Unlike VM pool, worker sandboxes are created fresh for each execution
|
|
53
|
+
* so this pool is simpler (mainly for statistics and control)
|
|
54
|
+
*/
|
|
55
|
+
export declare class WorkerSandboxPool {
|
|
56
|
+
private readonly options;
|
|
57
|
+
private readonly sandboxOptions;
|
|
58
|
+
private activeCount;
|
|
59
|
+
private disposed;
|
|
60
|
+
constructor(poolOptions?: PoolOptions, sandboxOptions?: SandboxOptions);
|
|
61
|
+
/**
|
|
62
|
+
* Initialize the pool
|
|
63
|
+
*/
|
|
64
|
+
initialize(): void;
|
|
65
|
+
/**
|
|
66
|
+
* Execute code using a worker sandbox
|
|
67
|
+
*/
|
|
68
|
+
execute(code: string, apiBindings: Record<string, unknown>): Promise<SandboxResult>;
|
|
69
|
+
/**
|
|
70
|
+
* Get pool statistics
|
|
71
|
+
*/
|
|
72
|
+
getStats(): {
|
|
73
|
+
available: number;
|
|
74
|
+
inUse: number;
|
|
75
|
+
max: number;
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* Dispose of the pool
|
|
79
|
+
*/
|
|
80
|
+
dispose(): void;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=worker-sandbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-sandbox.d.ts","sourceRoot":"","sources":["../../src/codemode/worker-sandbox.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,aAAa,EAEnB,MAAM,YAAY,CAAC;AAMpB;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;IACnD,OAAO,CAAC,QAAQ,CAAS;IAEzB,OAAO;IAIP;;OAEG;IACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,aAAa;IAKtD;;;OAGG;IACG,OAAO,CACX,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACnC,OAAO,CAAC,aAAa,CAAC;IAyIzB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAYzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAgBxB;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,OAAO,IAAI,IAAI;CAGhB;AAED;;;;GAIG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA2B;IAC1D,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,QAAQ,CAAS;gBAEb,WAAW,CAAC,EAAE,WAAW,EAAE,cAAc,CAAC,EAAE,cAAc;IAKtE;;OAEG;IACH,UAAU,IAAI,IAAI;IASlB;;OAEG;IACG,OAAO,CACX,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACnC,OAAO,CAAC,aAAa,CAAC;IA0BzB;;OAEG;IACH,QAAQ,IAAI;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE;IAQ7D;;OAEG;IACH,OAAO,IAAI,IAAI;CAMhB"}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* mysql-mcp - Code Mode Worker Sandbox
|
|
3
|
+
*
|
|
4
|
+
* Enhanced sandboxed execution using worker_threads for process-level isolation.
|
|
5
|
+
* Provides stronger isolation than vm module by running code in a separate thread
|
|
6
|
+
* with isolated memory space.
|
|
7
|
+
*
|
|
8
|
+
* Features:
|
|
9
|
+
* - Separate V8 instance per worker thread
|
|
10
|
+
* - Hard timeout enforcement (worker termination)
|
|
11
|
+
* - Isolated memory space
|
|
12
|
+
* - Clean process state on each execution
|
|
13
|
+
*/
|
|
14
|
+
import { Worker } from "node:worker_threads";
|
|
15
|
+
import { fileURLToPath } from "node:url";
|
|
16
|
+
import { dirname, join } from "node:path";
|
|
17
|
+
import { logger } from "../utils/logger.js";
|
|
18
|
+
import { DEFAULT_SANDBOX_OPTIONS, DEFAULT_POOL_OPTIONS, } from "./types.js";
|
|
19
|
+
// Get directory for worker script
|
|
20
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
21
|
+
const WORKER_SCRIPT_PATH = join(__dirname, "worker-script.js");
|
|
22
|
+
/**
|
|
23
|
+
* A sandboxed execution context using worker_threads
|
|
24
|
+
* Provides stronger isolation than vm module with separate V8 instance
|
|
25
|
+
*/
|
|
26
|
+
export class WorkerSandbox {
|
|
27
|
+
options;
|
|
28
|
+
disposed = false;
|
|
29
|
+
constructor(options) {
|
|
30
|
+
this.options = options;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Create a new worker sandbox instance
|
|
34
|
+
*/
|
|
35
|
+
static create(options) {
|
|
36
|
+
const opts = { ...DEFAULT_SANDBOX_OPTIONS, ...options };
|
|
37
|
+
return new WorkerSandbox(opts);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Execute code in a worker thread
|
|
41
|
+
* Each execution spawns a fresh worker for maximum isolation
|
|
42
|
+
*/
|
|
43
|
+
async execute(code, apiBindings) {
|
|
44
|
+
if (this.disposed) {
|
|
45
|
+
return {
|
|
46
|
+
success: false,
|
|
47
|
+
error: "Sandbox has been disposed",
|
|
48
|
+
metrics: { wallTimeMs: 0, cpuTimeMs: 0, memoryUsedMb: 0 },
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
const startTime = performance.now();
|
|
52
|
+
const startMemory = process.memoryUsage().heapUsed;
|
|
53
|
+
return new Promise((resolve) => {
|
|
54
|
+
let worker = null;
|
|
55
|
+
let timeoutId = null;
|
|
56
|
+
let resolved = false;
|
|
57
|
+
const cleanup = () => {
|
|
58
|
+
if (timeoutId) {
|
|
59
|
+
clearTimeout(timeoutId);
|
|
60
|
+
timeoutId = null;
|
|
61
|
+
}
|
|
62
|
+
if (worker) {
|
|
63
|
+
worker.terminate().catch(() => {
|
|
64
|
+
/* intentionally empty */
|
|
65
|
+
});
|
|
66
|
+
worker = null;
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
const respond = (result) => {
|
|
70
|
+
if (resolved)
|
|
71
|
+
return;
|
|
72
|
+
resolved = true;
|
|
73
|
+
cleanup();
|
|
74
|
+
resolve(result);
|
|
75
|
+
};
|
|
76
|
+
try {
|
|
77
|
+
worker = new Worker(WORKER_SCRIPT_PATH, {
|
|
78
|
+
workerData: {
|
|
79
|
+
code,
|
|
80
|
+
apiBindings: this.serializeBindings(apiBindings),
|
|
81
|
+
timeout: this.options.timeoutMs,
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
// Set hard timeout (will kill worker)
|
|
85
|
+
timeoutId = setTimeout(() => {
|
|
86
|
+
const endTime = performance.now();
|
|
87
|
+
const endMemory = process.memoryUsage().heapUsed;
|
|
88
|
+
respond({
|
|
89
|
+
success: false,
|
|
90
|
+
error: `Execution timeout: exceeded ${String(this.options.timeoutMs)}ms limit`,
|
|
91
|
+
metrics: this.calculateMetrics(startTime, endTime, startMemory, endMemory),
|
|
92
|
+
});
|
|
93
|
+
}, this.options.timeoutMs + 1000); // Extra buffer for cleanup
|
|
94
|
+
worker.on("message", (result) => {
|
|
95
|
+
const endTime = performance.now();
|
|
96
|
+
const endMemory = process.memoryUsage().heapUsed;
|
|
97
|
+
respond({
|
|
98
|
+
success: result.success,
|
|
99
|
+
result: result.result,
|
|
100
|
+
error: result.error,
|
|
101
|
+
stack: result.stack,
|
|
102
|
+
metrics: this.calculateMetrics(startTime, endTime, startMemory, endMemory),
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
worker.on("error", (error) => {
|
|
106
|
+
const endTime = performance.now();
|
|
107
|
+
const endMemory = process.memoryUsage().heapUsed;
|
|
108
|
+
respond({
|
|
109
|
+
success: false,
|
|
110
|
+
error: error.message,
|
|
111
|
+
stack: error.stack,
|
|
112
|
+
metrics: this.calculateMetrics(startTime, endTime, startMemory, endMemory),
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
worker.on("exit", (exitCode) => {
|
|
116
|
+
if (!resolved && exitCode !== 0) {
|
|
117
|
+
const endTime = performance.now();
|
|
118
|
+
const endMemory = process.memoryUsage().heapUsed;
|
|
119
|
+
respond({
|
|
120
|
+
success: false,
|
|
121
|
+
error: `Worker exited with code ${String(exitCode)}`,
|
|
122
|
+
metrics: this.calculateMetrics(startTime, endTime, startMemory, endMemory),
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
const endTime = performance.now();
|
|
129
|
+
const endMemory = process.memoryUsage().heapUsed;
|
|
130
|
+
respond({
|
|
131
|
+
success: false,
|
|
132
|
+
error: error instanceof Error ? error.message : String(error),
|
|
133
|
+
stack: error instanceof Error ? error.stack : undefined,
|
|
134
|
+
metrics: this.calculateMetrics(startTime, endTime, startMemory, endMemory),
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Serialize API bindings for worker transfer
|
|
141
|
+
* We can't transfer functions directly, so we send method names
|
|
142
|
+
*/
|
|
143
|
+
serializeBindings(bindings) {
|
|
144
|
+
const serialized = {};
|
|
145
|
+
for (const [group, methods] of Object.entries(bindings)) {
|
|
146
|
+
if (typeof methods === "object" && methods !== null) {
|
|
147
|
+
serialized[group] = Object.keys(methods);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return serialized;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Calculate execution metrics
|
|
154
|
+
*/
|
|
155
|
+
calculateMetrics(startTime, endTime, startMemory, endMemory) {
|
|
156
|
+
return {
|
|
157
|
+
wallTimeMs: Math.round(endTime - startTime),
|
|
158
|
+
cpuTimeMs: Math.round(endTime - startTime), // Approximation
|
|
159
|
+
memoryUsedMb: Math.max(0, Math.round(((endMemory - startMemory) / (1024 * 1024)) * 100) / 100),
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Check if sandbox is healthy
|
|
164
|
+
*/
|
|
165
|
+
isHealthy() {
|
|
166
|
+
return !this.disposed;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Dispose of the sandbox
|
|
170
|
+
*/
|
|
171
|
+
dispose() {
|
|
172
|
+
this.disposed = true;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Pool of worker sandboxes
|
|
177
|
+
* Unlike VM pool, worker sandboxes are created fresh for each execution
|
|
178
|
+
* so this pool is simpler (mainly for statistics and control)
|
|
179
|
+
*/
|
|
180
|
+
export class WorkerSandboxPool {
|
|
181
|
+
options;
|
|
182
|
+
sandboxOptions;
|
|
183
|
+
activeCount = 0;
|
|
184
|
+
disposed = false;
|
|
185
|
+
constructor(poolOptions, sandboxOptions) {
|
|
186
|
+
this.options = { ...DEFAULT_POOL_OPTIONS, ...poolOptions };
|
|
187
|
+
this.sandboxOptions = { ...DEFAULT_SANDBOX_OPTIONS, ...sandboxOptions };
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Initialize the pool
|
|
191
|
+
*/
|
|
192
|
+
initialize() {
|
|
193
|
+
logger.info(`Worker sandbox pool initialized (max: ${String(this.options.maxInstances)} concurrent)`, {
|
|
194
|
+
module: "CODEMODE",
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Execute code using a worker sandbox
|
|
199
|
+
*/
|
|
200
|
+
async execute(code, apiBindings) {
|
|
201
|
+
if (this.disposed) {
|
|
202
|
+
return {
|
|
203
|
+
success: false,
|
|
204
|
+
error: "Pool has been disposed",
|
|
205
|
+
metrics: { wallTimeMs: 0, cpuTimeMs: 0, memoryUsedMb: 0 },
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
if (this.activeCount >= this.options.maxInstances) {
|
|
209
|
+
return {
|
|
210
|
+
success: false,
|
|
211
|
+
error: `Worker pool exhausted (max: ${String(this.options.maxInstances)} concurrent)`,
|
|
212
|
+
metrics: { wallTimeMs: 0, cpuTimeMs: 0, memoryUsedMb: 0 },
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
this.activeCount++;
|
|
216
|
+
try {
|
|
217
|
+
const sandbox = WorkerSandbox.create(this.sandboxOptions);
|
|
218
|
+
return await sandbox.execute(code, apiBindings);
|
|
219
|
+
}
|
|
220
|
+
finally {
|
|
221
|
+
this.activeCount--;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Get pool statistics
|
|
226
|
+
*/
|
|
227
|
+
getStats() {
|
|
228
|
+
return {
|
|
229
|
+
available: this.options.maxInstances - this.activeCount,
|
|
230
|
+
inUse: this.activeCount,
|
|
231
|
+
max: this.options.maxInstances,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Dispose of the pool
|
|
236
|
+
*/
|
|
237
|
+
dispose() {
|
|
238
|
+
this.disposed = true;
|
|
239
|
+
logger.info("Worker sandbox pool disposed", {
|
|
240
|
+
module: "CODEMODE",
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=worker-sandbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-sandbox.js","sourceRoot":"","sources":["../../src/codemode/worker-sandbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-script.d.ts","sourceRoot":"","sources":["../../src/codemode/worker-script.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* mysql-mcp - Code Mode Worker Script
|
|
3
|
+
*
|
|
4
|
+
* This script runs in a worker thread to execute user code in isolation.
|
|
5
|
+
* It uses Node.js vm module within the worker for additional sandboxing.
|
|
6
|
+
*/
|
|
7
|
+
import { parentPort, workerData } from "node:worker_threads";
|
|
8
|
+
import vm from "node:vm";
|
|
9
|
+
/**
|
|
10
|
+
* Execute code in a sandboxed vm context within the worker
|
|
11
|
+
*/
|
|
12
|
+
async function executeCode() {
|
|
13
|
+
const { code, timeout } = workerData;
|
|
14
|
+
try {
|
|
15
|
+
// Create minimal sandbox context
|
|
16
|
+
const logBuffer = [];
|
|
17
|
+
const sandbox = {
|
|
18
|
+
console: {
|
|
19
|
+
log: (...args) => {
|
|
20
|
+
logBuffer.push(args
|
|
21
|
+
.map((a) => typeof a === "object" && a !== null
|
|
22
|
+
? JSON.stringify(a)
|
|
23
|
+
: String(a))
|
|
24
|
+
.join(" "));
|
|
25
|
+
},
|
|
26
|
+
warn: (...args) => logBuffer.push("[WARN] " + args.map((a) => String(a)).join(" ")),
|
|
27
|
+
error: (...args) => logBuffer.push("[ERROR] " + args.map((a) => String(a)).join(" ")),
|
|
28
|
+
info: (...args) => logBuffer.push("[INFO] " + args.map((a) => String(a)).join(" ")),
|
|
29
|
+
},
|
|
30
|
+
// Block dangerous globals
|
|
31
|
+
require: undefined,
|
|
32
|
+
process: undefined,
|
|
33
|
+
global: undefined,
|
|
34
|
+
globalThis: undefined,
|
|
35
|
+
__dirname: undefined,
|
|
36
|
+
__filename: undefined,
|
|
37
|
+
module: undefined,
|
|
38
|
+
exports: undefined,
|
|
39
|
+
// Safe built-ins
|
|
40
|
+
JSON,
|
|
41
|
+
Math,
|
|
42
|
+
Date,
|
|
43
|
+
Array,
|
|
44
|
+
Object,
|
|
45
|
+
String,
|
|
46
|
+
Number,
|
|
47
|
+
Boolean,
|
|
48
|
+
Map,
|
|
49
|
+
Set,
|
|
50
|
+
Promise,
|
|
51
|
+
Error,
|
|
52
|
+
TypeError,
|
|
53
|
+
RangeError,
|
|
54
|
+
SyntaxError,
|
|
55
|
+
// Disabled for security
|
|
56
|
+
setTimeout: undefined,
|
|
57
|
+
setInterval: undefined,
|
|
58
|
+
setImmediate: undefined,
|
|
59
|
+
// mysql API placeholder (populated by main thread via message passing)
|
|
60
|
+
mysql: {},
|
|
61
|
+
};
|
|
62
|
+
const context = vm.createContext(sandbox);
|
|
63
|
+
// Wrap code in async IIFE to support await
|
|
64
|
+
const wrappedCode = `
|
|
65
|
+
(async () => {
|
|
66
|
+
${code}
|
|
67
|
+
})();
|
|
68
|
+
`;
|
|
69
|
+
// Compile and run with timeout
|
|
70
|
+
const script = new vm.Script(wrappedCode, {
|
|
71
|
+
filename: "worker-codemode-script.js",
|
|
72
|
+
});
|
|
73
|
+
const result = await script.runInContext(context, {
|
|
74
|
+
timeout,
|
|
75
|
+
breakOnSigint: true,
|
|
76
|
+
});
|
|
77
|
+
const response = {
|
|
78
|
+
success: true,
|
|
79
|
+
result,
|
|
80
|
+
};
|
|
81
|
+
parentPort?.postMessage(response);
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
85
|
+
const stack = error instanceof Error ? error.stack : undefined;
|
|
86
|
+
// Check for timeout
|
|
87
|
+
if (errorMessage.includes("Script execution timed out")) {
|
|
88
|
+
const response = {
|
|
89
|
+
success: false,
|
|
90
|
+
error: `Execution timeout: exceeded ${String(timeout)}ms limit`,
|
|
91
|
+
stack,
|
|
92
|
+
};
|
|
93
|
+
parentPort?.postMessage(response);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const response = {
|
|
97
|
+
success: false,
|
|
98
|
+
error: errorMessage,
|
|
99
|
+
stack,
|
|
100
|
+
};
|
|
101
|
+
parentPort?.postMessage(response);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Execute immediately
|
|
105
|
+
executeCode().catch((error) => {
|
|
106
|
+
const response = {
|
|
107
|
+
success: false,
|
|
108
|
+
error: error instanceof Error ? error.message : String(error),
|
|
109
|
+
stack: error instanceof Error ? error.stack : undefined,
|
|
110
|
+
};
|
|
111
|
+
parentPort?.postMessage(response);
|
|
112
|
+
});
|
|
113
|
+
//# sourceMappingURL=worker-script.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-script.js","sourceRoot":"","sources":["../../src/codemode/worker-script.ts"],"names":[],"mappings":"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"}
|