@zhin.js/plugin-code-runner 1.1.9 → 1.1.10

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 CHANGED
@@ -34,3 +34,9 @@ namespace. `commands/run/[language]/index.ts` binds the language, while code and
34
34
  centrally declared in the same definition. Code keeps quotes and newlines; its limit is
35
35
  10,000 characters. Use `--` before code containing option-like words. Unsupported languages,
36
36
  missing code and invalid timeout values are rejected before the remote request.
37
+
38
+ ## Language / 语言
39
+
40
+ 命令说明和执行反馈跟随当前操作语言(简体中文或英文);用户输入与第三方内容保持原样,不进行自动翻译。语言与时区、权限和实际执行行为独立。参见[官方插件语言说明](../../README.md#语言与内容)。
41
+
42
+ Command feedback follows the operation language. User input and third-party content remain unchanged. See the [localization guide](../../../docs/en/configuration/localization.md).
@@ -2,16 +2,16 @@
2
2
  import { defineCommand } from 'zhin.js/command';
3
3
  import { formatResult, MAX_CODE_LENGTH, runCode, supportedLanguages } from "../../../lib/run-code.js";
4
4
  export default defineCommand({
5
- description: '在远程沙箱中运行代码片段',
5
+ description: '在远程沙箱中运行代码片段', descriptionI18n: { en: "Run a code snippet in a remote sandbox" },
6
6
  params: {
7
7
  language: {
8
- type: 'string', description: `执行语言:${supportedLanguages.join(', ')}(不区分大小写)`,
8
+ type: 'string', description: `执行语言:${supportedLanguages.join(', ')}(不区分大小写)`, descriptionI18n: { en: `Language: ${supportedLanguages.join(', ')} (case-insensitive)` },
9
9
  validate: (value) => typeof value === 'string' && supportedLanguages.includes(value.toLowerCase().trim()),
10
10
  },
11
- code: { type: 'text', min: 1, max: MAX_CODE_LENGTH, description: '要运行的代码' },
11
+ code: { type: 'text', min: 1, max: MAX_CODE_LENGTH, description: '要运行的代码', descriptionI18n: { en: "Code to execute" } },
12
12
  },
13
- options: { timeout: { type: 'integer', alias: 't', default: 30, min: 1, max: 30, description: '请求超时(秒)' } },
14
- async execute({ params, options }) {
15
- return formatResult(await runCode(params.language, params.code, options.timeout));
13
+ options: { timeout: { type: 'integer', alias: 't', default: 30, min: 1, max: 30, description: '请求超时(秒)', descriptionI18n: { en: "Request timeout in seconds" } } },
14
+ async execute({ params, options, locale }) {
15
+ return formatResult(await runCode(params.language, params.code, options.timeout, locale), locale);
16
16
  },
17
17
  });
@@ -2,16 +2,16 @@ import { defineCommand, type CommandParameterValue } from 'zhin.js/command';
2
2
  import { formatResult, MAX_CODE_LENGTH, runCode, supportedLanguages } from '../../../src/run-code.js';
3
3
 
4
4
  export default defineCommand({
5
- description: '在远程沙箱中运行代码片段',
5
+ description: '在远程沙箱中运行代码片段', descriptionI18n: { en: "Run a code snippet in a remote sandbox" },
6
6
  params: {
7
7
  language: {
8
- type: 'string', description: `执行语言:${supportedLanguages.join(', ')}(不区分大小写)`,
8
+ type: 'string', description: `执行语言:${supportedLanguages.join(', ')}(不区分大小写)`, descriptionI18n: { en: `Language: ${supportedLanguages.join(', ')} (case-insensitive)` },
9
9
  validate: (value: CommandParameterValue) => typeof value === 'string' && supportedLanguages.includes(value.toLowerCase().trim()),
10
10
  },
11
- code: { type: 'text', min: 1, max: MAX_CODE_LENGTH, description: '要运行的代码' },
11
+ code: { type: 'text', min: 1, max: MAX_CODE_LENGTH, description: '要运行的代码', descriptionI18n: { en: "Code to execute" } },
12
12
  },
13
- options: { timeout: { type: 'integer', alias: 't', default: 30, min: 1, max: 30, description: '请求超时(秒)' } },
14
- async execute({ params, options }) {
15
- return formatResult(await runCode(params.language, params.code, options.timeout));
13
+ options: { timeout: { type: 'integer', alias: 't', default: 30, min: 1, max: 30, description: '请求超时(秒)', descriptionI18n: { en: "Request timeout in seconds" } } },
14
+ async execute({ params, options, locale }) {
15
+ return formatResult(await runCode(params.language, params.code, options.timeout, locale), locale);
16
16
  },
17
17
  });
package/lib/i18n.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare const messages: (locale: import("@zhin.js/plugin-runtime").Locale | undefined, key: "language" | "length" | "request" | "timeout" | "unknown" | "empty", values?: import("@zhin.js/plugin-runtime").MessageValues) => string;
2
+ //# sourceMappingURL=i18n.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ,8MAyBnB,CAAC"}
package/lib/i18n.js ADDED
@@ -0,0 +1,28 @@
1
+ import { createMessages } from 'zhin.js/i18n';
2
+ export const messages = createMessages({
3
+ "language": {
4
+ "zh-CN": "不支持的语言: {language}。支持: {supported}",
5
+ "en": "Unsupported language: {language}. Supported: {supported}"
6
+ },
7
+ "length": {
8
+ "zh-CN": "代码长度超过上限 {max} 字符(当前 {length})",
9
+ "en": "Code exceeds the {max}-character limit (currently {length})."
10
+ },
11
+ "request": {
12
+ "zh-CN": "API 请求失败: {status} {text}",
13
+ "en": "API request failed: {status} {text}"
14
+ },
15
+ "timeout": {
16
+ "zh-CN": "请求超时({seconds}s)",
17
+ "en": "Request timed out after {seconds}s."
18
+ },
19
+ "unknown": {
20
+ "zh-CN": "未知错误",
21
+ "en": "Unknown error"
22
+ },
23
+ "empty": {
24
+ "zh-CN": "(无输出)",
25
+ "en": "(no output)"
26
+ }
27
+ });
28
+ //# sourceMappingURL=i18n.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.js","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,CAAC,MAAM,QAAQ,GAAG,cAAc,CAAC;IACrC,UAAU,EAAE;QACV,OAAO,EAAE,oCAAoC;QAC7C,IAAI,EAAE,0DAA0D;KACjE;IACD,QAAQ,EAAE;QACR,OAAO,EAAE,gCAAgC;QACzC,IAAI,EAAE,8DAA8D;KACrE;IACD,SAAS,EAAE;QACT,OAAO,EAAE,2BAA2B;QACpC,IAAI,EAAE,qCAAqC;KAC5C;IACD,SAAS,EAAE;QACT,OAAO,EAAE,kBAAkB;QAC3B,IAAI,EAAE,qCAAqC;KAC5C;IACD,SAAS,EAAE;QACT,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,eAAe;KACtB;IACD,OAAO,EAAE;QACP,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,aAAa;KACpB;CACF,CAAC,CAAC"}
package/lib/run-code.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import type { Locale } from 'zhin.js/i18n';
1
2
  export declare const MAX_CODE_LENGTH = 10000;
2
3
  export declare const supportedLanguages: readonly string[];
3
4
  interface RunResult {
@@ -5,7 +6,7 @@ interface RunResult {
5
6
  stderr: string;
6
7
  error: string;
7
8
  }
8
- export declare function runCode(language: string, code: string, timeoutSeconds?: number): Promise<RunResult>;
9
- export declare function formatResult(result: RunResult): string;
9
+ export declare function runCode(language: string, code: string, timeoutSeconds?: number, locale?: Locale): Promise<RunResult>;
10
+ export declare function formatResult(result: RunResult, locale?: Locale): string;
10
11
  export {};
11
12
  //# sourceMappingURL=run-code.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"run-code.d.ts","sourceRoot":"","sources":["../src/run-code.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,QAAQ,CAAC;AAerC,eAAO,MAAM,kBAAkB,mBAAkD,CAAC;AAIlF,UAAU,SAAS;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,SAAK,GAAG,OAAO,CAAC,SAAS,CAAC,CAmDrG;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAMtD"}
1
+ {"version":3,"file":"run-code.d.ts","sourceRoot":"","sources":["../src/run-code.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C,eAAO,MAAM,eAAe,QAAQ,CAAC;AAerC,eAAO,MAAM,kBAAkB,mBAAkD,CAAC;AAIlF,UAAU,SAAS;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,SAAK,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAmDtH;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAMvE"}
package/lib/run-code.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { messages as t } from './i18n.js';
1
2
  export const MAX_CODE_LENGTH = 10000;
2
3
  const SUPPORTED_LANGUAGES = {
3
4
  python: 'main.py',
@@ -13,20 +14,20 @@ const SUPPORTED_LANGUAGES = {
13
14
  };
14
15
  export const supportedLanguages = Object.freeze(Object.keys(SUPPORTED_LANGUAGES));
15
16
  const GLOT_API_BASE = 'https://glot.io/api/run';
16
- export async function runCode(language, code, timeoutSeconds = 30) {
17
+ export async function runCode(language, code, timeoutSeconds = 30, locale) {
17
18
  const lang = language.toLowerCase().trim();
18
19
  if (!SUPPORTED_LANGUAGES[lang]) {
19
20
  return {
20
21
  stdout: '',
21
22
  stderr: '',
22
- error: `不支持的语言: ${lang}。支持: ${Object.keys(SUPPORTED_LANGUAGES).join(', ')}`,
23
+ error: t(locale, 'language', { language: lang, supported: Object.keys(SUPPORTED_LANGUAGES).join(', ') }),
23
24
  };
24
25
  }
25
26
  if (code.length > MAX_CODE_LENGTH) {
26
27
  return {
27
28
  stdout: '',
28
29
  stderr: '',
29
- error: `代码长度超过上限 ${MAX_CODE_LENGTH} 字符(当前 ${code.length})`,
30
+ error: t(locale, 'length', { max: MAX_CODE_LENGTH, length: code.length }),
30
31
  };
31
32
  }
32
33
  const fileName = SUPPORTED_LANGUAGES[lang];
@@ -44,7 +45,7 @@ export async function runCode(language, code, timeoutSeconds = 30) {
44
45
  return {
45
46
  stdout: '',
46
47
  stderr: '',
47
- error: `API 请求失败: ${response.status} ${response.statusText}`,
48
+ error: t(locale, 'request', { status: response.status, text: response.statusText }),
48
49
  };
49
50
  }
50
51
  const data = (await response.json());
@@ -56,11 +57,11 @@ export async function runCode(language, code, timeoutSeconds = 30) {
56
57
  }
57
58
  catch (e) {
58
59
  const err = e;
59
- const msg = err.name === 'TimeoutError' ? `请求超时(${timeoutSeconds}s)` : err.message || '未知错误';
60
+ const msg = err.name === 'TimeoutError' ? t(locale, 'timeout', { seconds: timeoutSeconds }) : err.message || t(locale, 'unknown');
60
61
  return { stdout: '', stderr: '', error: msg };
61
62
  }
62
63
  }
63
- export function formatResult(result) {
64
+ export function formatResult(result, locale) {
64
65
  const parts = [];
65
66
  if (result.stdout)
66
67
  parts.push(`[stdout]\n${result.stdout}`);
@@ -68,6 +69,6 @@ export function formatResult(result) {
68
69
  parts.push(`[stderr]\n${result.stderr}`);
69
70
  if (result.error)
70
71
  parts.push(`[error]\n${result.error}`);
71
- return parts.length ? parts.join('\n') : '(无输出)';
72
+ return parts.length ? parts.join('\n') : t(locale, 'empty');
72
73
  }
73
74
  //# sourceMappingURL=run-code.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"run-code.js","sourceRoot":"","sources":["../src/run-code.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run-code.js","sourceRoot":"","sources":["../src/run-code.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zhin.js/plugin-code-runner",
3
- "version": "1.1.9",
3
+ "version": "1.1.10",
4
4
  "description": "Sandboxed code execution plugin for Zhin.js (Plugin Runtime)",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",
@@ -41,12 +41,12 @@
41
41
  "typescript": "^6.0.3",
42
42
  "vitest": "^4.1.10",
43
43
  "zod": "^4.4.3",
44
- "zhin.js": "1.1.15"
44
+ "zhin.js": "1.1.16"
45
45
  },
46
46
  "peerDependencies": {
47
47
  "zod": "^4.0.0",
48
- "@zhin.js/command": "^1.1.10",
49
- "zhin.js": "^1.1.15"
48
+ "@zhin.js/command": "^1.1.11",
49
+ "zhin.js": "^1.1.16"
50
50
  },
51
51
  "peerDependenciesMeta": {
52
52
  "@zhin.js/command": {
@@ -91,8 +91,8 @@
91
91
  "plugins": []
92
92
  },
93
93
  "dependencies": {
94
- "@zhin.js/tool": "1.1.9",
95
- "@zhin.js/skill": "1.1.9"
94
+ "@zhin.js/tool": "1.1.10",
95
+ "@zhin.js/skill": "1.1.10"
96
96
  },
97
97
  "scripts": {
98
98
  "build": "tsc",
@@ -10,8 +10,8 @@ export default defineAgentTool({
10
10
  }),
11
11
  keywords: ['运行代码', '执行代码', 'run code', 'execute', '代码'],
12
12
  tags: ['code', 'run', 'execute', 'sandbox'],
13
- async execute({ language, code }) {
14
- const result = await runCode(language, code);
15
- return formatResult(result);
13
+ async execute({ language, code }, context) {
14
+ const result = await runCode(language, code, undefined, context.locale);
15
+ return formatResult(result, context.locale);
16
16
  },
17
17
  });
@@ -10,8 +10,8 @@ export default defineAgentTool<{ language: string; code: string }>({
10
10
  }),
11
11
  keywords: ['运行代码', '执行代码', 'run code', 'execute', '代码'],
12
12
  tags: ['code', 'run', 'execute', 'sandbox'],
13
- async execute({ language, code }) {
14
- const result = await runCode(language, code);
15
- return formatResult(result);
13
+ async execute({ language, code }, context) {
14
+ const result = await runCode(language, code, undefined, context.locale);
15
+ return formatResult(result, context.locale);
16
16
  },
17
17
  });
package/src/i18n.ts ADDED
@@ -0,0 +1,28 @@
1
+ import { createMessages } from 'zhin.js/i18n';
2
+
3
+ export const messages = createMessages({
4
+ "language": {
5
+ "zh-CN": "不支持的语言: {language}。支持: {supported}",
6
+ "en": "Unsupported language: {language}. Supported: {supported}"
7
+ },
8
+ "length": {
9
+ "zh-CN": "代码长度超过上限 {max} 字符(当前 {length})",
10
+ "en": "Code exceeds the {max}-character limit (currently {length})."
11
+ },
12
+ "request": {
13
+ "zh-CN": "API 请求失败: {status} {text}",
14
+ "en": "API request failed: {status} {text}"
15
+ },
16
+ "timeout": {
17
+ "zh-CN": "请求超时({seconds}s)",
18
+ "en": "Request timed out after {seconds}s."
19
+ },
20
+ "unknown": {
21
+ "zh-CN": "未知错误",
22
+ "en": "Unknown error"
23
+ },
24
+ "empty": {
25
+ "zh-CN": "(无输出)",
26
+ "en": "(no output)"
27
+ }
28
+ });
package/src/run-code.ts CHANGED
@@ -1,3 +1,6 @@
1
+ import type { Locale } from 'zhin.js/i18n';
2
+ import { messages as t } from './i18n.js';
3
+
1
4
  export const MAX_CODE_LENGTH = 10000;
2
5
 
3
6
  const SUPPORTED_LANGUAGES: Record<string, string> = {
@@ -23,14 +26,14 @@ interface RunResult {
23
26
  error: string;
24
27
  }
25
28
 
26
- export async function runCode(language: string, code: string, timeoutSeconds = 30): Promise<RunResult> {
29
+ export async function runCode(language: string, code: string, timeoutSeconds = 30, locale?: Locale): Promise<RunResult> {
27
30
  const lang = language.toLowerCase().trim();
28
31
 
29
32
  if (!SUPPORTED_LANGUAGES[lang]) {
30
33
  return {
31
34
  stdout: '',
32
35
  stderr: '',
33
- error: `不支持的语言: ${lang}。支持: ${Object.keys(SUPPORTED_LANGUAGES).join(', ')}`,
36
+ error: t(locale, 'language', { language: lang, supported: Object.keys(SUPPORTED_LANGUAGES).join(', ') }),
34
37
  };
35
38
  }
36
39
 
@@ -38,7 +41,7 @@ export async function runCode(language: string, code: string, timeoutSeconds = 3
38
41
  return {
39
42
  stdout: '',
40
43
  stderr: '',
41
- error: `代码长度超过上限 ${MAX_CODE_LENGTH} 字符(当前 ${code.length})`,
44
+ error: t(locale, 'length', { max: MAX_CODE_LENGTH, length: code.length }),
42
45
  };
43
46
  }
44
47
 
@@ -59,7 +62,7 @@ export async function runCode(language: string, code: string, timeoutSeconds = 3
59
62
  return {
60
63
  stdout: '',
61
64
  stderr: '',
62
- error: `API 请求失败: ${response.status} ${response.statusText}`,
65
+ error: t(locale, 'request', { status: response.status, text: response.statusText }),
63
66
  };
64
67
  }
65
68
 
@@ -71,15 +74,15 @@ export async function runCode(language: string, code: string, timeoutSeconds = 3
71
74
  };
72
75
  } catch (e: unknown) {
73
76
  const err = e as Error;
74
- const msg = err.name === 'TimeoutError' ? `请求超时(${timeoutSeconds}s)` : err.message || '未知错误';
77
+ const msg = err.name === 'TimeoutError' ? t(locale, 'timeout', { seconds: timeoutSeconds }) : err.message || t(locale, 'unknown');
75
78
  return { stdout: '', stderr: '', error: msg };
76
79
  }
77
80
  }
78
81
 
79
- export function formatResult(result: RunResult): string {
82
+ export function formatResult(result: RunResult, locale?: Locale): string {
80
83
  const parts: string[] = [];
81
84
  if (result.stdout) parts.push(`[stdout]\n${result.stdout}`);
82
85
  if (result.stderr) parts.push(`[stderr]\n${result.stderr}`);
83
86
  if (result.error) parts.push(`[error]\n${result.error}`);
84
- return parts.length ? parts.join('\n') : '(无输出)';
87
+ return parts.length ? parts.join('\n') : t(locale, 'empty');
85
88
  }