@aalis/plugin-tool-code-runner 0.1.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/README.md +21 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +236 -0
- package/dist/index.js.map +1 -0
- package/dist/runner.d.ts +38 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +69 -0
- package/dist/runner.js.map +1 -0
- package/package.json +38 -0
package/README.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# @aalis/plugin-tool-code-runner
|
|
2
|
+
|
|
3
|
+
运行时插件
|
|
4
|
+
|
|
5
|
+
## 角色
|
|
6
|
+
|
|
7
|
+
运行时插件
|
|
8
|
+
|
|
9
|
+
## 安装
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
pnpm add @aalis/plugin-tool-code-runner
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## 文档
|
|
16
|
+
|
|
17
|
+
详见 [docs/plugins/plugin-tool-code-runner.md](../../docs/plugins/plugin-tool-code-runner.md)。
|
|
18
|
+
|
|
19
|
+
## 许可
|
|
20
|
+
|
|
21
|
+
见仓库根目录 LICENSE。
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ConfigSchema, Context } from '@aalis/core';
|
|
2
|
+
import '@aalis/plugin-tools-api';
|
|
3
|
+
export declare const name = "@aalis/plugin-tool-code-runner";
|
|
4
|
+
export declare const displayName = "\u4EE3\u7801\u6267\u884C\u5668";
|
|
5
|
+
export declare const subsystem = "tools";
|
|
6
|
+
export declare const inject: {
|
|
7
|
+
required: (string | {
|
|
8
|
+
service: string;
|
|
9
|
+
capabilities: string[];
|
|
10
|
+
})[];
|
|
11
|
+
};
|
|
12
|
+
export declare const configSchema: ConfigSchema;
|
|
13
|
+
export declare const defaultConfig: {
|
|
14
|
+
python: {
|
|
15
|
+
enabled: boolean;
|
|
16
|
+
interpreter: string;
|
|
17
|
+
};
|
|
18
|
+
javascript: {
|
|
19
|
+
enabled: boolean;
|
|
20
|
+
interpreter: string;
|
|
21
|
+
};
|
|
22
|
+
defaultTimeout: number;
|
|
23
|
+
maxTimeout: number;
|
|
24
|
+
maxOutputSize: number;
|
|
25
|
+
workingDirectory: string;
|
|
26
|
+
};
|
|
27
|
+
export declare function apply(ctx: Context, config: Record<string, unknown>): void;
|
|
28
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAMzD,OAAO,yBAAyB,CAAC;AAIjC,eAAO,MAAM,IAAI,mCAAmC,CAAC;AACrD,eAAO,MAAM,WAAW,mCAAU,CAAC;AACnC,eAAO,MAAM,SAAS,UAAU,CAAC;AACjC,eAAO,MAAM,MAAM;;;;;CAElB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,YAiD1B,CAAC;AAEF,eAAO,MAAM,aAAa;;;;;;;;;;;;;CAOzB,CAAC;AA8DF,wBAAgB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAiIzE"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { createProcessGateway } from '@aalis/plugin-process-api';
|
|
2
|
+
import { createStorageGateway } from '@aalis/plugin-storage-api';
|
|
3
|
+
import { toolsWithGroups, toStorageUri, useToolService } from '@aalis/plugin-tools-api';
|
|
4
|
+
import { runCode } from './runner.js';
|
|
5
|
+
import '@aalis/plugin-tools-api';
|
|
6
|
+
// ===== 插件元数据 =====
|
|
7
|
+
export const name = '@aalis/plugin-tool-code-runner';
|
|
8
|
+
export const displayName = '代码执行器';
|
|
9
|
+
export const subsystem = 'tools';
|
|
10
|
+
export const inject = {
|
|
11
|
+
required: [{ service: 'storage', capabilities: ['local-path'] }, 'process'],
|
|
12
|
+
};
|
|
13
|
+
export const configSchema = {
|
|
14
|
+
python: {
|
|
15
|
+
label: 'Python',
|
|
16
|
+
fields: {
|
|
17
|
+
enabled: { type: 'boolean', label: '启用 run_python', default: true },
|
|
18
|
+
interpreter: {
|
|
19
|
+
type: 'string',
|
|
20
|
+
label: '解释器路径',
|
|
21
|
+
default: 'python3',
|
|
22
|
+
description: 'Python 解释器路径或命令名,如 python3、/usr/bin/python3',
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
javascript: {
|
|
27
|
+
label: 'JavaScript (Node.js)',
|
|
28
|
+
fields: {
|
|
29
|
+
enabled: { type: 'boolean', label: '启用 run_javascript', default: true },
|
|
30
|
+
interpreter: {
|
|
31
|
+
type: 'string',
|
|
32
|
+
label: '解释器路径',
|
|
33
|
+
default: 'node',
|
|
34
|
+
description: 'Node.js 解释器路径或命令名',
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
defaultTimeout: {
|
|
39
|
+
type: 'number',
|
|
40
|
+
label: '默认超时 (ms)',
|
|
41
|
+
default: 60000,
|
|
42
|
+
description: '脚本执行默认超时时间',
|
|
43
|
+
},
|
|
44
|
+
maxTimeout: {
|
|
45
|
+
type: 'number',
|
|
46
|
+
label: '最大超时 (ms)',
|
|
47
|
+
default: 300000,
|
|
48
|
+
description: '允许指定的最大超时时间',
|
|
49
|
+
},
|
|
50
|
+
maxOutputSize: {
|
|
51
|
+
type: 'number',
|
|
52
|
+
label: '最大输出字节',
|
|
53
|
+
default: 131072,
|
|
54
|
+
description: 'stdout/stderr 各自的最大输出字节数',
|
|
55
|
+
},
|
|
56
|
+
workingDirectory: {
|
|
57
|
+
type: 'string',
|
|
58
|
+
label: '逻辑工作目录',
|
|
59
|
+
default: 'workspace:/',
|
|
60
|
+
description: '脚本执行时的 storage URI 工作目录,如 workspace:/ 或 tmp:/run;相对路径会解释为 workspace:/ 下路径。',
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
export const defaultConfig = {
|
|
64
|
+
python: { enabled: true, interpreter: 'python3' },
|
|
65
|
+
javascript: { enabled: true, interpreter: 'node' },
|
|
66
|
+
defaultTimeout: 60000,
|
|
67
|
+
maxTimeout: 300000,
|
|
68
|
+
maxOutputSize: 131072,
|
|
69
|
+
workingDirectory: 'workspace:/',
|
|
70
|
+
};
|
|
71
|
+
function resolveConfig(config) {
|
|
72
|
+
const py = config.python;
|
|
73
|
+
const js = config.javascript;
|
|
74
|
+
return {
|
|
75
|
+
python: {
|
|
76
|
+
enabled: py?.enabled ?? true,
|
|
77
|
+
interpreter: py?.interpreter || 'python3',
|
|
78
|
+
},
|
|
79
|
+
javascript: {
|
|
80
|
+
enabled: js?.enabled ?? true,
|
|
81
|
+
interpreter: js?.interpreter || 'node',
|
|
82
|
+
},
|
|
83
|
+
defaultTimeout: config.defaultTimeout ?? 60000,
|
|
84
|
+
maxTimeout: config.maxTimeout ?? 300000,
|
|
85
|
+
maxOutputSize: config.maxOutputSize ?? 131072,
|
|
86
|
+
workingDirectory: config.workingDirectory ?? 'workspace:/',
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
function toRunnerCwdUri(input) {
|
|
90
|
+
return toStorageUri(input, { errorContext: '代码执行器工作目录' });
|
|
91
|
+
}
|
|
92
|
+
function safeEnv() {
|
|
93
|
+
const keep = ['PATH', 'LANG', 'LC_ALL', 'TERM', 'SystemRoot', 'WINDIR', 'COMSPEC', 'PATHEXT'];
|
|
94
|
+
const env = {};
|
|
95
|
+
for (const key of keep) {
|
|
96
|
+
if (process.env[key])
|
|
97
|
+
env[key] = process.env[key];
|
|
98
|
+
}
|
|
99
|
+
return env;
|
|
100
|
+
}
|
|
101
|
+
async function createRunnerConfig(ctx, cfg) {
|
|
102
|
+
if (ctx.getAllServices('storage', ['local-path']).length === 0) {
|
|
103
|
+
throw new Error('代码执行器需要至少一个支持 local-path 的 storage entry');
|
|
104
|
+
}
|
|
105
|
+
const storage = createStorageGateway(ctx);
|
|
106
|
+
const cwdUri = toRunnerCwdUri(cfg.workingDirectory);
|
|
107
|
+
return {
|
|
108
|
+
defaultTimeout: cfg.defaultTimeout,
|
|
109
|
+
maxTimeout: cfg.maxTimeout,
|
|
110
|
+
maxOutputSize: cfg.maxOutputSize,
|
|
111
|
+
cwd: await storage.resolveLocalPath(cwdUri, 'read'),
|
|
112
|
+
env: safeEnv(),
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
// ===== 插件入口 =====
|
|
116
|
+
export function apply(ctx, config) {
|
|
117
|
+
const cfg = resolveConfig(config);
|
|
118
|
+
const cwdUri = toRunnerCwdUri(cfg.workingDirectory);
|
|
119
|
+
const proc = createProcessGateway(ctx);
|
|
120
|
+
const storage = createStorageGateway(ctx);
|
|
121
|
+
// 创建带分组标记的工具视图
|
|
122
|
+
const baseTools = useToolService(ctx);
|
|
123
|
+
const groupTools = toolsWithGroups(baseTools, ['code-runner']);
|
|
124
|
+
// 注册工具分组
|
|
125
|
+
baseTools.registerGroup({
|
|
126
|
+
name: 'code-runner',
|
|
127
|
+
label: '代码执行',
|
|
128
|
+
description: '编写并运行 Python / JavaScript 代码来解决计算、分析、文件处理等问题',
|
|
129
|
+
});
|
|
130
|
+
const osName = process.platform === 'darwin' ? 'macOS' : process.platform === 'win32' ? 'Windows' : 'Linux';
|
|
131
|
+
// ==================== run_python ====================
|
|
132
|
+
if (cfg.python.enabled) {
|
|
133
|
+
groupTools.register({
|
|
134
|
+
definition: {
|
|
135
|
+
type: 'function',
|
|
136
|
+
function: {
|
|
137
|
+
name: 'run_python',
|
|
138
|
+
description: `在本机 ${osName} 系统上编写并执行一段 Python 脚本,返回 stdout 和 stderr。` +
|
|
139
|
+
'代码会保存到临时文件后执行,无需担心转义问题,可以编写任意多行代码。\n\n' +
|
|
140
|
+
'**适用场景(请在合适时主动使用):**\n' +
|
|
141
|
+
'- 复杂数学计算、方程求解、符号推导(math / sympy / numpy / scipy)\n' +
|
|
142
|
+
'- 数据统计分析、CSV/JSON 数据处理(pandas / json / csv)\n' +
|
|
143
|
+
'- 批量文件解析与文本处理(正则匹配、格式转换、批量重命名)\n' +
|
|
144
|
+
'- 编码转换、加解密、哈希计算(base64 / hashlib)\n' +
|
|
145
|
+
'- 日期 / 时间计算(datetime / calendar)\n' +
|
|
146
|
+
'- 需要精确结果而非近似回答的任何计算问题\n' +
|
|
147
|
+
'- 生成结构化输出(表格、Markdown、LaTeX)\n\n' +
|
|
148
|
+
'**使用技巧:**\n' +
|
|
149
|
+
'- 将最终结果通过 print() 输出,该输出会作为工具返回值\n' +
|
|
150
|
+
'- 可使用标准库和已安装的第三方库(如 numpy, sympy, pandas 等)\n' +
|
|
151
|
+
'- 处理多个文件时,在一个脚本内循环处理并汇总输出,效率远高于多次调用\n' +
|
|
152
|
+
'- 若需读写文件,请优先使用相对于逻辑工作目录的路径;不要依赖宿主机绝对路径',
|
|
153
|
+
parameters: {
|
|
154
|
+
type: 'object',
|
|
155
|
+
properties: {
|
|
156
|
+
code: {
|
|
157
|
+
type: 'string',
|
|
158
|
+
description: '完整的 Python 脚本源代码',
|
|
159
|
+
},
|
|
160
|
+
timeout: {
|
|
161
|
+
type: 'number',
|
|
162
|
+
description: `超时毫秒数(可选,默认 ${cfg.defaultTimeout},最大 ${cfg.maxTimeout})`,
|
|
163
|
+
},
|
|
164
|
+
},
|
|
165
|
+
required: ['code'],
|
|
166
|
+
additionalProperties: false,
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
},
|
|
170
|
+
authority: 5,
|
|
171
|
+
safety: 'dangerous',
|
|
172
|
+
permissions: ['tool:code.python', 'system:process.exec', 'runtime:python'],
|
|
173
|
+
handler: async (args) => {
|
|
174
|
+
const code = args.code;
|
|
175
|
+
const timeout = args.timeout;
|
|
176
|
+
ctx.logger.debug(`run_python: ${code.length} 字符`);
|
|
177
|
+
const runnerConfig = await createRunnerConfig(ctx, cfg);
|
|
178
|
+
const result = await runCode(proc, storage, cfg.python.interpreter, code, '.py', runnerConfig, timeout);
|
|
179
|
+
return JSON.stringify(result);
|
|
180
|
+
},
|
|
181
|
+
});
|
|
182
|
+
ctx.logger.info(`Python 代码执行工具已启用 (解释器: ${cfg.python.interpreter})`);
|
|
183
|
+
}
|
|
184
|
+
// ==================== run_javascript ====================
|
|
185
|
+
if (cfg.javascript.enabled) {
|
|
186
|
+
groupTools.register({
|
|
187
|
+
definition: {
|
|
188
|
+
type: 'function',
|
|
189
|
+
function: {
|
|
190
|
+
name: 'run_javascript',
|
|
191
|
+
description: `在本机 ${osName} 系统上编写并执行一段 JavaScript (Node.js) 脚本,返回 stdout 和 stderr。` +
|
|
192
|
+
'代码会保存为 .mjs 文件(ESM 模块)后执行,支持 top-level await。\n\n' +
|
|
193
|
+
'**适用场景(请在合适时主动使用):**\n' +
|
|
194
|
+
'- JSON 数据处理与转换\n' +
|
|
195
|
+
'- 正则表达式测试与文本处理\n' +
|
|
196
|
+
'- Node.js API 调用、文件系统操作\n' +
|
|
197
|
+
'- HTTP 请求与 API 测试(fetch)\n' +
|
|
198
|
+
'- 需要 JavaScript 运行时特性的验证和计算\n\n' +
|
|
199
|
+
'**使用技巧:**\n' +
|
|
200
|
+
'- 通过 console.log() 输出结果\n' +
|
|
201
|
+
'- 使用 ESM import 语法导入模块\n' +
|
|
202
|
+
'- 支持 top-level await,可直接使用 await fetch(...) 等',
|
|
203
|
+
parameters: {
|
|
204
|
+
type: 'object',
|
|
205
|
+
properties: {
|
|
206
|
+
code: {
|
|
207
|
+
type: 'string',
|
|
208
|
+
description: '完整的 JavaScript (Node.js ESM) 脚本源代码',
|
|
209
|
+
},
|
|
210
|
+
timeout: {
|
|
211
|
+
type: 'number',
|
|
212
|
+
description: `超时毫秒数(可选,默认 ${cfg.defaultTimeout},最大 ${cfg.maxTimeout})`,
|
|
213
|
+
},
|
|
214
|
+
},
|
|
215
|
+
required: ['code'],
|
|
216
|
+
additionalProperties: false,
|
|
217
|
+
},
|
|
218
|
+
},
|
|
219
|
+
},
|
|
220
|
+
authority: 5,
|
|
221
|
+
safety: 'dangerous',
|
|
222
|
+
permissions: ['tool:code.javascript', 'system:process.exec', 'runtime:javascript'],
|
|
223
|
+
handler: async (args) => {
|
|
224
|
+
const code = args.code;
|
|
225
|
+
const timeout = args.timeout;
|
|
226
|
+
ctx.logger.debug(`run_javascript: ${code.length} 字符`);
|
|
227
|
+
const runnerConfig = await createRunnerConfig(ctx, cfg);
|
|
228
|
+
const result = await runCode(proc, storage, cfg.javascript.interpreter, code, '.mjs', runnerConfig, timeout);
|
|
229
|
+
return JSON.stringify(result);
|
|
230
|
+
},
|
|
231
|
+
});
|
|
232
|
+
ctx.logger.info(`JavaScript 代码执行工具已启用 (解释器: ${cfg.javascript.interpreter})`);
|
|
233
|
+
}
|
|
234
|
+
ctx.logger.info(`代码执行器插件已启动 (工作目录: ${cwdUri})`);
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/runner.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 代码执行器 —— 编写临时脚本并运行
|
|
3
|
+
*
|
|
4
|
+
* 临时目录通过 ProcessService.makeTempDir 在 storage tmp:/ 下分配,
|
|
5
|
+
* 子进程通过 ProcessService.spawn 启动;不直接依赖 node:fs/child_process。
|
|
6
|
+
*/
|
|
7
|
+
import type { ProcessService } from '@aalis/plugin-process-api';
|
|
8
|
+
import type { StorageService } from '@aalis/plugin-storage-api';
|
|
9
|
+
export interface RunnerConfig {
|
|
10
|
+
defaultTimeout: number;
|
|
11
|
+
maxTimeout: number;
|
|
12
|
+
maxOutputSize: number;
|
|
13
|
+
/** 子进程 cwd(已通过 storage.resolveLocalPath 解析的本地路径) */
|
|
14
|
+
cwd: string;
|
|
15
|
+
/** 透传给子进程的环境变量;不提供时由 ProcessService 默认合入 process.env */
|
|
16
|
+
env?: Record<string, string | undefined>;
|
|
17
|
+
}
|
|
18
|
+
export interface RunResult {
|
|
19
|
+
exitCode: number;
|
|
20
|
+
stdout: string;
|
|
21
|
+
stderr: string;
|
|
22
|
+
timedOut?: boolean;
|
|
23
|
+
error?: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 执行代码脚本
|
|
27
|
+
*
|
|
28
|
+
* @param proc ProcessService 句柄
|
|
29
|
+
* @param storage StorageService(用于写脚本到 tmp)
|
|
30
|
+
* @param interpreter 解释器路径 (python3 / node)
|
|
31
|
+
* @param code 完整源代码
|
|
32
|
+
* @param ext 临时文件扩展名 (.py / .mjs)
|
|
33
|
+
* @param config 超时 / 输出限制
|
|
34
|
+
* @param timeout 可选自定义超时
|
|
35
|
+
* @param extraArgs 额外的解释器参数
|
|
36
|
+
*/
|
|
37
|
+
export declare function runCode(proc: ProcessService, storage: StorageService, interpreter: string, code: string, ext: string, config: RunnerConfig, timeout?: number, extraArgs?: string[]): Promise<RunResult>;
|
|
38
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEhE,MAAM,WAAW,YAAY;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,GAAG,EAAE,MAAM,CAAC;IACZ,wDAAwD;IACxD,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAQD;;;;;;;;;;;GAWG;AACH,wBAAsB,OAAO,CAC3B,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE,MAAM,EAChB,SAAS,GAAE,MAAM,EAAO,GACvB,OAAO,CAAC,SAAS,CAAC,CA2CpB"}
|
package/dist/runner.js
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 代码执行器 —— 编写临时脚本并运行
|
|
3
|
+
*
|
|
4
|
+
* 临时目录通过 ProcessService.makeTempDir 在 storage tmp:/ 下分配,
|
|
5
|
+
* 子进程通过 ProcessService.spawn 启动;不直接依赖 node:fs/child_process。
|
|
6
|
+
*/
|
|
7
|
+
import { Buffer } from 'node:buffer';
|
|
8
|
+
function truncateOutput(output, maxSize) {
|
|
9
|
+
if (Buffer.byteLength(output, 'utf-8') <= maxSize)
|
|
10
|
+
return output;
|
|
11
|
+
const truncated = Buffer.from(output, 'utf-8').subarray(0, maxSize).toString('utf-8');
|
|
12
|
+
return `${truncated}\n...[输出截断,超过 ${maxSize} 字节]`;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* 执行代码脚本
|
|
16
|
+
*
|
|
17
|
+
* @param proc ProcessService 句柄
|
|
18
|
+
* @param storage StorageService(用于写脚本到 tmp)
|
|
19
|
+
* @param interpreter 解释器路径 (python3 / node)
|
|
20
|
+
* @param code 完整源代码
|
|
21
|
+
* @param ext 临时文件扩展名 (.py / .mjs)
|
|
22
|
+
* @param config 超时 / 输出限制
|
|
23
|
+
* @param timeout 可选自定义超时
|
|
24
|
+
* @param extraArgs 额外的解释器参数
|
|
25
|
+
*/
|
|
26
|
+
export async function runCode(proc, storage, interpreter, code, ext, config, timeout, extraArgs = []) {
|
|
27
|
+
const effectiveTimeout = Math.min(Math.max(1000, timeout ?? config.defaultTimeout), config.maxTimeout);
|
|
28
|
+
const tmp = await proc.makeTempDir('code-runner');
|
|
29
|
+
try {
|
|
30
|
+
const scriptUri = `${tmp.uri}/script${ext}`;
|
|
31
|
+
await storage.writeFile(scriptUri, Buffer.from(code, 'utf-8'));
|
|
32
|
+
const scriptPath = `${tmp.path}/script${ext}`;
|
|
33
|
+
try {
|
|
34
|
+
const result = await proc.execFile(interpreter, [...extraArgs, scriptPath], {
|
|
35
|
+
cwd: config.cwd,
|
|
36
|
+
env: { ...(config.env ?? {}), PYTHONIOENCODING: 'utf-8' },
|
|
37
|
+
timeout: effectiveTimeout,
|
|
38
|
+
});
|
|
39
|
+
return {
|
|
40
|
+
exitCode: result.code ?? -1,
|
|
41
|
+
stdout: truncateOutput(result.stdout, config.maxOutputSize),
|
|
42
|
+
stderr: truncateOutput(result.stderr, config.maxOutputSize),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
// ProcessService.execFile 在非 0 退出时抛错,但会把 .result 挂上
|
|
47
|
+
const e = err;
|
|
48
|
+
if (e.result) {
|
|
49
|
+
const timedOut = e.result.signal === 'SIGKILL';
|
|
50
|
+
return {
|
|
51
|
+
exitCode: e.result.code ?? -1,
|
|
52
|
+
stdout: truncateOutput(e.result.stdout, config.maxOutputSize),
|
|
53
|
+
stderr: truncateOutput(e.result.stderr, config.maxOutputSize),
|
|
54
|
+
...(timedOut ? { timedOut: true } : {}),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
exitCode: -1,
|
|
59
|
+
stdout: '',
|
|
60
|
+
stderr: '',
|
|
61
|
+
error: e.message,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
finally {
|
|
66
|
+
await tmp.cleanup();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@aalis/plugin-tool-code-runner",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"aalis-plugin"
|
|
7
|
+
],
|
|
8
|
+
"main": "dist/index.js",
|
|
9
|
+
"types": "dist/index.d.ts",
|
|
10
|
+
"files": [
|
|
11
|
+
"dist"
|
|
12
|
+
],
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"@aalis/plugin-process-api": "^0.1.0",
|
|
15
|
+
"@aalis/plugin-tools-api": "^0.1.0",
|
|
16
|
+
"@aalis/plugin-storage-api": "^0.1.0"
|
|
17
|
+
},
|
|
18
|
+
"devDependencies": {
|
|
19
|
+
"@types/node": "^22.0.0",
|
|
20
|
+
"typescript": "^5.7.0",
|
|
21
|
+
"@aalis/core": "0.1.0"
|
|
22
|
+
},
|
|
23
|
+
"peerDependencies": {
|
|
24
|
+
"@aalis/core": "^0.1.0"
|
|
25
|
+
},
|
|
26
|
+
"aalis": {
|
|
27
|
+
"service": {
|
|
28
|
+
"required": [
|
|
29
|
+
"storage",
|
|
30
|
+
"process"
|
|
31
|
+
]
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"scripts": {
|
|
35
|
+
"build": "tsc",
|
|
36
|
+
"dev": "tsc --watch"
|
|
37
|
+
}
|
|
38
|
+
}
|