mtech-ai-local-runner 0.1.8 → 0.1.9
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 +45 -4
- package/dist/src/adapters/claude-code/adapter.js +157 -98
- package/dist/src/adapters/claude-code/completion-report.js +2 -64
- package/dist/src/adapters/claude-code/prompt-compiler.js +1 -60
- package/dist/src/adapters/claude-code/runtime-options.js +72 -0
- package/dist/src/adapters/codex/adapter.js +170 -0
- package/dist/src/adapters/codex/app-server-events.js +84 -0
- package/dist/src/adapters/codex/compatibility.js +45 -0
- package/dist/src/adapters/codex/config-builder.js +40 -0
- package/dist/src/adapters/codex/host-admission.js +3 -0
- package/dist/src/adapters/codex/inspection-rpc.js +48 -0
- package/dist/src/adapters/codex/job-rpc.js +189 -0
- package/dist/src/adapters/codex/native-policy.js +112 -0
- package/dist/src/adapters/codex/native-proof.js +14 -0
- package/dist/src/adapters/codex/native-session.js +375 -0
- package/dist/src/adapters/codex/plugin.js +26 -0
- package/dist/src/adapters/codex/pre-model-gate.js +112 -0
- package/dist/src/adapters/codex/prompt-compiler.js +13 -0
- package/dist/src/adapters/codex/runtime-options.js +163 -0
- package/dist/src/adapters/codex/scratch.js +28 -0
- package/dist/src/adapters/codex/stdio-rpc.js +113 -0
- package/dist/src/adapters/codex/stream-parser.js +85 -0
- package/dist/src/adapters/codex/supported-admission.js +97 -0
- package/dist/src/adapters/codex/tool-dispatcher.js +20 -0
- package/dist/src/adapters/completion-report.js +64 -0
- package/dist/src/adapters/discovery.js +76 -0
- package/dist/src/adapters/prompt-compiler.js +60 -0
- package/dist/src/adapters/registry.js +10 -5
- package/dist/src/cli.js +50 -58
- package/dist/src/commands/doctor.js +7 -1
- package/dist/src/commands/setup.js +3 -0
- package/dist/src/daemon/execution-coordinator.js +19 -2
- package/dist/src/daemon/runtime.js +34 -41
- package/dist/src/process/node-process-group-host.js +74 -0
- package/dist/src/safety/cli-host-admission.js +74 -0
- package/dist/src/safety/cli-security-modes.js +4 -0
- package/dist/src/safety/codex-production-host.js +267 -0
- package/dist/src/safety/codex-supported-releases.js +1 -0
- package/dist/src/safety/hook-cli.js +21 -7
- package/dist/src/safety/hook-policy-builder.js +4 -11
- package/dist/src/safety/job-security-policy.js +62 -0
- package/dist/src/safety/job-security-receipt.js +20 -0
- package/dist/src/safety/job-security-session.js +133 -0
- package/dist/src/safety/job-tool-dispatcher.js +52 -0
- package/dist/src/safety/job-tool-policy.js +61 -0
- package/dist/src/safety/job-tool-session.js +82 -0
- package/dist/src/safety/local-tool-policy.js +101 -0
- package/dist/src/safety/local-tool-server.js +174 -0
- package/dist/src/safety/local-tool-worker.js +57 -0
- package/dist/src/safety/pre-tool-use-hook.js +3 -39
- package/dist/src/safety/registered-command-integrity.js +52 -0
- package/dist/src/safety/security-requirements.js +38 -0
- package/dist/src/safety/subprocess-sandbox.js +62 -0
- package/package.json +1 -1
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { realpathSync } from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
const quote = (value) => JSON.stringify(value);
|
|
5
|
+
/** Deny-default Seatbelt profile. No inherited profile, environment or shell. */
|
|
6
|
+
export function sandboxProfile(request) {
|
|
7
|
+
const executable = realpathSync(request.executable);
|
|
8
|
+
const directories = new Set(['/']);
|
|
9
|
+
for (const file of [executable, ...request.readFiles, ...request.writeFiles ?? []]) {
|
|
10
|
+
let directory = path.dirname(file);
|
|
11
|
+
while (directory !== '/') {
|
|
12
|
+
directories.add(directory);
|
|
13
|
+
directory = path.dirname(directory);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
const read = [...directories, ...request.readFiles, executable, '/dev/null', '/dev/random', '/dev/urandom'].map(file => `(literal ${quote(file)})`).join(' ');
|
|
17
|
+
const write = (request.writeFiles ?? []).map(file => `(literal ${quote(file)})`).join(' ');
|
|
18
|
+
return `(version 1)(deny default)(allow process-exec (literal ${quote(executable)}))(allow sysctl-read)(allow file-read-metadata)(allow file-map-executable (subpath "/System/Library") (subpath "/usr/lib") (literal ${quote(executable)}))(allow file-read-data (subpath "/System/Library") (subpath "/usr/lib") (subpath "/usr/share") ${read})${write ? `(allow file-write* ${write})` : ''}`;
|
|
19
|
+
}
|
|
20
|
+
export async function runSandboxed(request) {
|
|
21
|
+
if (process.platform !== 'darwin')
|
|
22
|
+
throw new Error('LOCAL_SANDBOX_UNAVAILABLE: macOS Seatbelt required');
|
|
23
|
+
const profile = sandboxProfile(request);
|
|
24
|
+
return new Promise((resolve, reject) => {
|
|
25
|
+
const chunks = [];
|
|
26
|
+
let size = 0, settled = false;
|
|
27
|
+
const child = spawn('/usr/bin/sandbox-exec', ['-p', profile, realpathSync(request.executable), ...request.argv], {
|
|
28
|
+
cwd: request.cwd ?? '/', env: { PATH: '/usr/bin:/bin', LANG: 'C', HOME: '/nonexistent', TMPDIR: '/nonexistent' }, stdio: ['ignore', 'pipe', 'pipe'], detached: true, signal: request.signal,
|
|
29
|
+
});
|
|
30
|
+
const finish = (error) => {
|
|
31
|
+
if (settled)
|
|
32
|
+
return;
|
|
33
|
+
settled = true;
|
|
34
|
+
clearTimeout(timer);
|
|
35
|
+
if (error)
|
|
36
|
+
reject(error);
|
|
37
|
+
else
|
|
38
|
+
resolve(Buffer.concat(chunks).toString('utf8'));
|
|
39
|
+
};
|
|
40
|
+
const kill = () => {
|
|
41
|
+
try {
|
|
42
|
+
if (child.pid)
|
|
43
|
+
process.kill(-child.pid, 'SIGKILL');
|
|
44
|
+
}
|
|
45
|
+
catch { /* already exited */ }
|
|
46
|
+
};
|
|
47
|
+
const timer = request.timeoutMs === undefined ? undefined : setTimeout(() => { kill(); finish(new Error('LOCAL_SANDBOX_UNAVAILABLE: command timed out')); }, request.timeoutMs);
|
|
48
|
+
child.stdout.on('data', (chunk) => {
|
|
49
|
+
size += chunk.length;
|
|
50
|
+
if (size > 1024 * 1024) {
|
|
51
|
+
kill();
|
|
52
|
+
finish(new Error('LOCAL_SANDBOX_UNAVAILABLE: output limit'));
|
|
53
|
+
}
|
|
54
|
+
else
|
|
55
|
+
chunks.push(chunk);
|
|
56
|
+
});
|
|
57
|
+
// Do not disclose arbitrary subprocess stderr or paths to the model.
|
|
58
|
+
child.stderr.resume();
|
|
59
|
+
child.on('error', () => { kill(); finish(new Error('LOCAL_SANDBOX_UNAVAILABLE: could not start restricted process')); });
|
|
60
|
+
child.on('close', (code) => { kill(); finish(code === 0 ? undefined : new Error('LOCAL_SANDBOX_UNAVAILABLE: restricted process failed')); });
|
|
61
|
+
});
|
|
62
|
+
}
|