@aalis/plugin-code-sandbox-os 0.6.0 → 0.8.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 CHANGED
@@ -13,7 +13,7 @@ pnpm add @aalis/plugin-code-sandbox-os
13
13
  `definePlugin` 默认导出:
14
14
 
15
15
  - provides:`codeSandbox`(服务名 `code-sandbox`)
16
- - uses:`processService`(`process`)、`logger`、`provide`
16
+ - uses:`processService`(`process`)、`logger`、`lifecycle`、`provide`;可选 `doctor`
17
17
 
18
18
  ## 文档
19
19
 
package/dist/index.d.ts CHANGED
@@ -1,8 +1,9 @@
1
1
  import { type ProcessService } from '@aalis/api-process';
2
- import { type Logger } from '@aalis/core';
3
2
  declare const _default: import("@aalis/core").PluginDefinition<{
4
- processService: import("@aalis/core").ServiceDescriptor<ProcessService, import("@aalis/core").ServiceRef<ProcessService>>;
5
- logger: import("@aalis/core").ServiceDescriptor<(identity: symbol) => Logger, Logger>;
3
+ processService: import("@aalis/core").ServiceDescriptor<ProcessService, ProcessService>;
4
+ doctor: import("@aalis/core").OptionalUse<import("@aalis/api-doctor").DoctorService, import("@aalis/api-doctor").BoundDoctor>;
5
+ logger: import("@aalis/core").ServiceDescriptor<(identity: symbol) => import("@aalis/core").Logger, import("@aalis/core").Logger>;
6
+ lifecycle: import("@aalis/core").ServiceDescriptor<(identity: symbol) => import("@aalis/core").LifecycleCap, import("@aalis/core").LifecycleCap>;
6
7
  provide: import("@aalis/core").ServiceDescriptor<(identity: symbol) => import("@aalis/core").Provide, import("@aalis/core").Provide>;
7
8
  }>;
8
9
  export default _default;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAyC,KAAK,cAAc,EAAkB,MAAM,oBAAoB,CAAC;AAChH,OAAO,EAAgB,KAAK,MAAM,EAAmB,MAAM,aAAa,CAAC;;;;;;AAoDzE,wBAeG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAAmB,KAAK,cAAc,EAAkB,MAAM,oBAAoB,CAAC;;;;;;;;AAsF1F,wBAwBG"}
package/dist/index.js CHANGED
@@ -2,36 +2,66 @@
2
2
  // @aalis/plugin-code-sandbox-os — code-sandbox 的 OS 原生实现
3
3
  //
4
4
  // Linux bubblewrap / macOS sandbox-exec。把不可信代码包成沙箱启动器命令后,
5
- // **经现有 `process` 服务网关** spawn(不碰 process-api / process-local 的实现,
6
- // 也不直接 import node:child_process / node:fs——OS 探测靠经网关功能性试跑)。
5
+ // **经现有 `process` 服务** spawn(不碰 process-api / process-local 的实现,
6
+ // 也不直接 import node:child_process / node:fs——OS 探测靠经 process 服务功能性试跑)。
7
7
  // ============================================================
8
8
  import { codeSandbox } from '@aalis/api-code-sandbox';
9
- import { createProcessGateway, processService } from '@aalis/api-process';
10
- import { definePlugin, logger, provide } from '@aalis/core';
9
+ import { doctor } from '@aalis/api-doctor';
10
+ import { processService } from '@aalis/api-process';
11
+ import { definePlugin, lifecycle, logger, optional, provide } from '@aalis/core';
12
+ import { textOf, toSource } from '@aalis/schema-i18n';
11
13
  import { wrapForSandbox } from './sandbox.js';
14
+ import { t } from './texts.js';
12
15
  /**
13
- * 功能性探测:经 process 网关真正跑一次最小沙箱命令,跑通才算可用。
16
+ * 各平台的最小沙箱命令:跑通即有该后端,跑不通时按 fix 修。Linux 与正式运行(sandbox.ts 的 buildBwrapArgs)一样挂 /dev 与 /proc:
17
+ * 只放开 seccomp、挂不了 /proc 的容器里,不挂的探测会报 bwrap 可用,之后每次运行都失败
18
+ */
19
+ const PROBES = {
20
+ darwin: {
21
+ backend: 'seatbelt',
22
+ cmd: 'sandbox-exec',
23
+ args: ['-p', '(version 1) (allow default)', 'true'],
24
+ fix: t('fixSeatbelt'),
25
+ },
26
+ linux: {
27
+ backend: 'bwrap',
28
+ cmd: 'bwrap',
29
+ args: ['--ro-bind', '/', '/', '--dev', '/dev', '--proc', '/proc', '--unshare-all', 'true'],
30
+ fix: t('fixBwrap'),
31
+ },
32
+ };
33
+ /** 没有后端时的结论:code_runner 的 auto 模式在没有沙箱时拒绝执行(fail-closed) */
34
+ const NONE = t('none');
35
+ /**
36
+ * 功能性探测:经 process 服务真正跑一次最小沙箱命令,退出码为 0 才算有后端。
14
37
  * 比「命令是否存在」更强——一次覆盖 存在性 + Linux unprivileged userns 是否真能用。
38
+ * 没有后端时 problem 写怎么修与原因(日志取原文,诊断交文字对象)。
39
+ * 停用、停机时随 signal 中止并抛出(不落成「无后端」),启动器挂住也不拖满停机宽限。
15
40
  */
16
- async function probeBackend(proc, logger) {
41
+ async function probeBackend(proc, signal) {
17
42
  const platform = process.platform;
43
+ const probe = PROBES[platform];
44
+ if (!probe)
45
+ return { backend: 'none', problem: t('noPlatform', { platform }) };
46
+ let result;
47
+ let error;
18
48
  try {
19
- if (platform === 'darwin') {
20
- await proc.execFile('sandbox-exec', ['-p', '(version 1) (allow default)', 'true'], { timeout: 5000 });
21
- return 'seatbelt';
22
- }
23
- if (platform === 'linux') {
24
- await proc.execFile('bwrap', ['--ro-bind', '/', '/', '--unshare-all', 'true'], { timeout: 5000 });
25
- return 'bwrap';
26
- }
27
- logger.warn(`平台 ${platform} 暂无 OS 沙箱后端,code_runner auto 模式将 fail-closed`);
28
- return 'none';
49
+ result = await proc.spawn(probe.cmd, probe.args, { stdio: 'ignore', timeout: 5000, signal }).wait();
29
50
  }
30
- catch {
31
- // 启动器不存在 / 不可用(如 Linux 未安装 bwrap、或 unprivileged user namespaces 被禁)→ 无后端
32
- logger.warn(`OS 沙箱后端探测失败(platform=${platform}):无可用沙箱,code_runner auto 模式将 fail-closed`);
33
- return 'none';
51
+ catch (err) {
52
+ error = err;
34
53
  }
54
+ // 被中止(spawn 同步抛出、wait 被拒或随中止落定)一律抛出,apply 随之落定
55
+ signal.throwIfAborted();
56
+ if (result?.code === 0)
57
+ return { backend: probe.backend };
58
+ // 启动器不存在 / 不可用(如 Linux 未安装 bwrap、或 unprivileged user namespaces 被禁)/ 超时 → 无后端
59
+ const reason = result
60
+ ? result.code === null
61
+ ? t('killed', { signal: String(result.signal) })
62
+ : t('exitCode', { code: result.code })
63
+ : textOf(error);
64
+ return { backend: 'none', problem: t('probeFailed', { fix: probe.fix, cmd: probe.cmd, reason }) };
35
65
  }
36
66
  class OsCodeSandboxService {
37
67
  proc;
@@ -51,23 +81,34 @@ class OsCodeSandboxService {
51
81
  throw new Error('code-sandbox: 无可用后端,run() 不应被调用(调用方应先检查 available)');
52
82
  }
53
83
  const wrapped = wrapForSandbox(this._backend, req.policy, req.cmd, req.args, req.cwd, req.env ?? {});
54
- // 经 process 网关 spawn 包好的启动器命令;env 已由 wrapper 的 --clearenv / env -i 注入白名单,
84
+ // 经 process 服务 spawn 包好的启动器命令;env 已由 wrapper 的 --clearenv / env -i 注入白名单,
55
85
  // 故此处不再传 env(外层启动器进程继承宿主 env 无妨,wrapper 已为内层不可信子进程清空)。
56
- return this.proc.execFile(wrapped.cmd, wrapped.args, { cwd: req.cwd, timeout: req.timeout });
86
+ return this.proc.execFile(wrapped.cmd, wrapped.args, { cwd: req.cwd, timeout: req.timeout, signal: req.signal });
57
87
  }
58
88
  }
59
89
  export default definePlugin({
60
90
  name: '@aalis/plugin-code-sandbox-os',
61
- displayName: '代码沙箱(OS)',
91
+ displayName: t('displayName'),
92
+ subsystem: 'tools',
62
93
  provides: [codeSandbox],
63
- uses: { processService, logger, provide },
94
+ uses: { processService, doctor: optional(doctor), logger, lifecycle, provide },
64
95
  async apply(caps) {
65
- const log = caps.logger.child('code-sandbox-os');
66
- // 网关每次调用重新解析当前胜者,process 提供者换人后无需重启本插件
67
- const proc = createProcessGateway(caps.processService);
68
- const backend = await probeBackend(proc, log);
69
- caps.provide(codeSandbox, new OsCodeSandboxService(proc, backend));
70
- log.info(`code-sandbox-os 就绪(后端: ${backend === 'none' ? '无 —— 沙箱不可用,code_runner 将 fail-closed' : backend})`);
96
+ const log = caps.logger.use.child('code-sandbox-os');
97
+ // 业务句柄每次调用转发给当前选中的提供者,process 提供者换人后无需重启本插件
98
+ const proc = caps.processService.use;
99
+ const { backend, problem } = await probeBackend(proc, caps.lifecycle.use.signal);
100
+ if (problem)
101
+ log.warn(`${toSource(NONE)}:${toSource(problem)}`);
102
+ caps.provide.use(codeSandbox, new OsCodeSandboxService(proc, backend));
103
+ // 这台机器上没有沙箱时整个插件用不了:在诊断里给出修法,没装 WebUI 的用户靠 /doctor 看到
104
+ caps.doctor.use.registerCheck({
105
+ id: 'code-sandbox.backend',
106
+ category: 'env',
107
+ run: () => problem
108
+ ? { id: 'code-sandbox.backend', category: 'env', level: 'warn', message: NONE, detail: problem }
109
+ : { id: 'code-sandbox.backend', category: 'env', level: 'ok', message: t('available', { backend }) },
110
+ });
111
+ log.info(`code-sandbox-os 就绪(后端: ${backend})`);
71
112
  },
72
113
  });
73
114
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,yDAAyD;AACzD,EAAE;AACF,0DAA0D;AAC1D,iEAAiE;AACjE,sEAAsE;AACtE,+DAA+D;AAE/D,OAAO,EAA2B,WAAW,EAA0B,MAAM,yBAAyB,CAAC;AACvG,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAwC,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC1F,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EAAgB,MAAM,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAuB,cAAc,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,CAAC,EAAE,MAAM,YAAY,CAAC;AAE/B;;;GAGG;AACH,MAAM,MAAM,GACV;IACE,MAAM,EAAE;QACN,OAAO,EAAE,UAAU;QACnB,GAAG,EAAE,cAAc;QACnB,IAAI,EAAE,CAAC,IAAI,EAAE,6BAA6B,EAAE,MAAM,CAAC;QACnD,GAAG,EAAE,CAAC,CAAC,aAAa,CAAC;KACtB;IACD,KAAK,EAAE;QACL,OAAO,EAAE,OAAO;QAChB,GAAG,EAAE,OAAO;QACZ,IAAI,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,CAAC;QAC1F,GAAG,EAAE,CAAC,CAAC,UAAU,CAAC;KACnB;CACF,CAAC;AAEJ,4DAA4D;AAC5D,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvB;;;;;GAKG;AACH,KAAK,UAAU,YAAY,CACzB,IAAoB,EACpB,MAAmB;IAEnB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/B,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IAC/E,IAAI,MAA8B,CAAC;IACnC,IAAI,KAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACtG,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,KAAK,GAAG,GAAG,CAAC;IACd,CAAC;IACD,+CAA+C;IAC/C,MAAM,CAAC,cAAc,EAAE,CAAC;IACxB,IAAI,MAAM,EAAE,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;IAC1D,8EAA8E;IAC9E,MAAM,MAAM,GAAG,MAAM;QACnB,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,IAAI;YACpB,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YAChD,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;QACxC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAClB,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,aAAa,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AACpG,CAAC;AAED,MAAM,oBAAoB;IAEL;IACA;IAFnB,YACmB,IAAoB,EACpB,QAAwB;QADxB,SAAI,GAAJ,IAAI,CAAgB;QACpB,aAAQ,GAAR,QAAQ,CAAgB;IACxC,CAAC;IAEJ,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,QAAQ,KAAK,MAAM,CAAC;IAClC,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAsB;QAC9B,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACxE,CAAC;QACD,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;QACrG,0EAA0E;QAC1E,uDAAuD;QACvD,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IACnH,CAAC;CACF;AAED,eAAe,YAAY,CAAC;IAC1B,IAAI,EAAE,+BAA+B;IACrC,WAAW,EAAE,CAAC,CAAC,aAAa,CAAC;IAC7B,SAAS,EAAE,OAAO;IAClB,QAAQ,EAAE,CAAC,WAAW,CAAC;IACvB,IAAI,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE;IAC9E,KAAK,CAAC,KAAK,CAAC,IAAI;QACd,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACrD,4CAA4C;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;QACrC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACjF,IAAI,OAAO;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,oBAAoB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QACvE,sDAAsD;QACtD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC;YAC5B,EAAE,EAAE,sBAAsB;YAC1B,QAAQ,EAAE,KAAK;YACf,GAAG,EAAE,GAAG,EAAE,CACR,OAAO;gBACL,CAAC,CAAC,EAAE,EAAE,EAAE,sBAAsB,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;gBAChG,CAAC,CAAC,EAAE,EAAE,EAAE,sBAAsB,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE;SACzG,CAAC,CAAC;QACH,GAAG,CAAC,IAAI,CAAC,0BAA0B,OAAO,GAAG,CAAC,CAAC;IACjD,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,13 @@
1
+ declare const _default: {
2
+ readonly displayName: "Code sandbox (OS)";
3
+ readonly none: "No OS sandbox is available; code_runner in auto mode will refuse to run code";
4
+ readonly noPlatform: "This platform ({platform}) has no OS sandbox backend: to use the sandbox, run Aalis on macOS, Linux or WSL";
5
+ readonly fixSeatbelt: "sandbox-exec ships with macOS; make sure /usr/bin/sandbox-exec can run, then reload this plugin";
6
+ readonly fixBwrap: "Install bubblewrap (bwrap) and enable unprivileged user namespaces; inside a container, /proc must also be mountable. Reload this plugin after fixing it";
7
+ readonly probeFailed: "{fix}. Probing {cmd} failed: {reason}";
8
+ readonly killed: "terminated by signal {signal} (including the 5-second timeout)";
9
+ readonly exitCode: "exit code {code}";
10
+ readonly available: "OS sandbox available ({backend})";
11
+ };
12
+ export default _default;
13
+ //# sourceMappingURL=en.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../src/locales/en.ts"],"names":[],"mappings":";;;;;;;;;;;AAGA,wBAYG"}
@@ -0,0 +1,13 @@
1
+ import { defineLocale } from '@aalis/schema-i18n';
2
+ export default defineLocale()({
3
+ displayName: 'Code sandbox (OS)',
4
+ none: 'No OS sandbox is available; code_runner in auto mode will refuse to run code',
5
+ noPlatform: 'This platform ({platform}) has no OS sandbox backend: to use the sandbox, run Aalis on macOS, Linux or WSL',
6
+ fixSeatbelt: 'sandbox-exec ships with macOS; make sure /usr/bin/sandbox-exec can run, then reload this plugin',
7
+ fixBwrap: 'Install bubblewrap (bwrap) and enable unprivileged user namespaces; inside a container, /proc must also be mountable. Reload this plugin after fixing it',
8
+ probeFailed: '{fix}. Probing {cmd} failed: {reason}',
9
+ killed: 'terminated by signal {signal} (including the 5-second timeout)',
10
+ exitCode: 'exit code {code}',
11
+ available: 'OS sandbox available ({backend})',
12
+ });
13
+ //# sourceMappingURL=en.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"en.js","sourceRoot":"","sources":["../../src/locales/en.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGlD,eAAe,YAAY,EAAU,CAAC;IACpC,WAAW,EAAE,mBAAmB;IAChC,IAAI,EAAE,8EAA8E;IACpF,UAAU,EACR,4GAA4G;IAC9G,WAAW,EAAE,iGAAiG;IAC9G,QAAQ,EACN,0JAA0J;IAC5J,WAAW,EAAE,uCAAuC;IACpD,MAAM,EAAE,gEAAgE;IACxE,QAAQ,EAAE,kBAAkB;IAC5B,SAAS,EAAE,kCAAkC;CAC9C,CAAC,CAAC"}
package/dist/sandbox.js CHANGED
@@ -5,7 +5,7 @@
5
5
  // - macOS → sandbox-exec -p '<SBPL>' env -i <allowlist> <cmd> <args>
6
6
  // - Linux → bwrap <flags> --clearenv --setenv ... -- <cmd> <args>
7
7
  // v1 语义:读放开(解释器需系统库)、写限定 fsWrite、网络粗粒度开关、env 仅白名单(防 secrets 泄漏)。
8
- // 后端探测(功能性 probe)在 index.ts 经 process 网关做;本文件只做纯生成。
8
+ // 后端探测(功能性 probe)在 index.ts 经 process 服务做;本文件只做纯生成。
9
9
  // ============================================================
10
10
  /** 取 env 中非空键值对(保序),用于 --setenv / `env -i` */
11
11
  function envPairs(env) {
@@ -0,0 +1,25 @@
1
+ declare const SOURCE: {
2
+ readonly displayName: "代码沙箱(OS)";
3
+ readonly none: "没有可用的 OS 沙箱,code_runner 的 auto 模式会拒绝执行代码";
4
+ readonly noPlatform: "这个平台({platform})没有 OS 沙箱后端:要用沙箱就在 macOS、Linux 或 WSL 上运行 Aalis";
5
+ readonly fixSeatbelt: "sandbox-exec 是 macOS 自带的,确认 /usr/bin/sandbox-exec 能执行后重载本插件";
6
+ readonly fixBwrap: "装上 bubblewrap(bwrap),并开启非特权用户命名空间(unprivileged user namespaces);在容器里运行时还要能挂 /proc。改好后重载本插件";
7
+ readonly probeFailed: "{fix}。探测 {cmd} 失败:{reason}";
8
+ readonly killed: "被信号 {signal} 终止(含 5 秒超时)";
9
+ readonly exitCode: "退出码 {code}";
10
+ readonly available: "OS 沙箱可用({backend})";
11
+ };
12
+ export type Source = typeof SOURCE;
13
+ export declare const t: import("@aalis/schema-i18n").TextFactory<{
14
+ readonly displayName: "代码沙箱(OS)";
15
+ readonly none: "没有可用的 OS 沙箱,code_runner 的 auto 模式会拒绝执行代码";
16
+ readonly noPlatform: "这个平台({platform})没有 OS 沙箱后端:要用沙箱就在 macOS、Linux 或 WSL 上运行 Aalis";
17
+ readonly fixSeatbelt: "sandbox-exec 是 macOS 自带的,确认 /usr/bin/sandbox-exec 能执行后重载本插件";
18
+ readonly fixBwrap: "装上 bubblewrap(bwrap),并开启非特权用户命名空间(unprivileged user namespaces);在容器里运行时还要能挂 /proc。改好后重载本插件";
19
+ readonly probeFailed: "{fix}。探测 {cmd} 失败:{reason}";
20
+ readonly killed: "被信号 {signal} 终止(含 5 秒超时)";
21
+ readonly exitCode: "退出码 {code}";
22
+ readonly available: "OS 沙箱可用({backend})";
23
+ }>;
24
+ export {};
25
+ //# sourceMappingURL=texts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"texts.d.ts","sourceRoot":"","sources":["../src/texts.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM;;;;;;;;;;CAWF,CAAC;AACX,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC;AAEnC,eAAO,MAAM,CAAC;;;;;;;;;;EAKZ,CAAC"}
package/dist/texts.js ADDED
@@ -0,0 +1,21 @@
1
+ // 本插件自己的原文字典:显示名,探测沙箱后端的结论与原因(诊断项交文字对象,日志取原文)
2
+ import { defineTexts } from '@aalis/schema-i18n';
3
+ import en from './locales/en.js';
4
+ const SOURCE = {
5
+ displayName: '代码沙箱(OS)',
6
+ none: '没有可用的 OS 沙箱,code_runner 的 auto 模式会拒绝执行代码',
7
+ noPlatform: '这个平台({platform})没有 OS 沙箱后端:要用沙箱就在 macOS、Linux 或 WSL 上运行 Aalis',
8
+ fixSeatbelt: 'sandbox-exec 是 macOS 自带的,确认 /usr/bin/sandbox-exec 能执行后重载本插件',
9
+ fixBwrap: '装上 bubblewrap(bwrap),并开启非特权用户命名空间(unprivileged user namespaces);在容器里运行时还要能挂 /proc。改好后重载本插件',
10
+ probeFailed: '{fix}。探测 {cmd} 失败:{reason}',
11
+ killed: '被信号 {signal} 终止(含 5 秒超时)',
12
+ exitCode: '退出码 {code}',
13
+ available: 'OS 沙箱可用({backend})',
14
+ };
15
+ export const t = defineTexts({
16
+ ns: '@aalis/plugin-code-sandbox-os',
17
+ language: 'zh-CN',
18
+ source: SOURCE,
19
+ locales: { en },
20
+ });
21
+ //# sourceMappingURL=texts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"texts.js","sourceRoot":"","sources":["../src/texts.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAEjC,MAAM,MAAM,GAAG;IACb,WAAW,EAAE,UAAU;IACvB,IAAI,EAAE,0CAA0C;IAChD,UAAU,EAAE,+DAA+D;IAC3E,WAAW,EAAE,6DAA6D;IAC1E,QAAQ,EACN,4FAA4F;IAC9F,WAAW,EAAE,4BAA4B;IACzC,MAAM,EAAE,0BAA0B;IAClC,QAAQ,EAAE,YAAY;IACtB,SAAS,EAAE,oBAAoB;CACvB,CAAC;AAGX,MAAM,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC;IAC3B,EAAE,EAAE,+BAA+B;IACnC,QAAQ,EAAE,OAAO;IACjB,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,EAAE,EAAE,EAAE;CAChB,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aalis/plugin-code-sandbox-os",
3
- "version": "0.6.0",
3
+ "version": "0.8.0",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -24,24 +24,30 @@
24
24
  "dist"
25
25
  ],
26
26
  "dependencies": {
27
- "@aalis/api-code-sandbox": ">=0.6.0 <1.0.0",
28
- "@aalis/api-process": ">=0.7.0 <1.0.0"
27
+ "@aalis/api-code-sandbox": ">=0.7.0 <1.0.0",
28
+ "@aalis/api-doctor": ">=0.9.0 <1.0.0",
29
+ "@aalis/api-process": ">=0.10.0 <1.0.0",
30
+ "@aalis/schema-i18n": ">=0.1.0 <1.0.0"
29
31
  },
30
32
  "devDependencies": {
31
33
  "@types/node": "^22.0.0",
32
34
  "typescript": "^5.7.0",
33
- "@aalis/core": "0.17.0"
35
+ "@aalis/core": "0.21.0"
34
36
  },
35
37
  "peerDependencies": {
36
- "@aalis/core": ">=0.17.0 <1.0.0"
38
+ "@aalis/core": ">=0.21.0 <1.0.0"
37
39
  },
38
40
  "aalis": {
39
41
  "service": {
40
42
  "required": [
43
+ "lifecycle",
41
44
  "logger",
42
45
  "process",
43
46
  "provide"
44
47
  ],
48
+ "optional": [
49
+ "doctor"
50
+ ],
45
51
  "provides": [
46
52
  "code-sandbox"
47
53
  ]