atabey-shared 0.0.37 → 0.1.1-beta
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 +2 -2
- package/dist/agent-identity.d.ts +34 -0
- package/dist/agent-identity.js +77 -0
- package/dist/agent-identity.js.map +1 -0
- package/dist/api-catalog.d.ts +57 -0
- package/dist/api-catalog.js +254 -0
- package/dist/api-catalog.js.map +1 -0
- package/dist/audit-chain.d.ts +32 -3
- package/dist/audit-chain.js +187 -10
- package/dist/audit-chain.js.map +1 -1
- package/dist/audit.d.ts +8 -0
- package/dist/audit.js +44 -7
- package/dist/audit.js.map +1 -1
- package/dist/constants.d.ts +7 -9
- package/dist/constants.js +14 -18
- package/dist/constants.js.map +1 -1
- package/dist/database.d.ts +1 -0
- package/dist/database.js +3 -0
- package/dist/database.js.map +1 -1
- package/dist/errors.d.ts +1 -1
- package/dist/errors.js +1 -1
- package/dist/file-lock.d.ts +5 -0
- package/dist/file-lock.js +20 -31
- package/dist/file-lock.js.map +1 -1
- package/dist/index.d.ts +9 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/job-queue.d.ts +32 -9
- package/dist/job-queue.js +81 -8
- package/dist/job-queue.js.map +1 -1
- package/dist/logger.d.ts +1 -0
- package/dist/logger.js +33 -7
- package/dist/logger.js.map +1 -1
- package/dist/memory-prune.d.ts +18 -0
- package/dist/memory-prune.js +48 -0
- package/dist/memory-prune.js.map +1 -0
- package/dist/migrations.d.ts +69 -0
- package/dist/migrations.js +394 -0
- package/dist/migrations.js.map +1 -0
- package/dist/otel.d.ts +39 -0
- package/dist/otel.js +93 -0
- package/dist/otel.js.map +1 -0
- package/dist/outbound-http.d.ts +32 -0
- package/dist/outbound-http.js +88 -0
- package/dist/outbound-http.js.map +1 -0
- package/dist/pii.d.ts +1 -0
- package/dist/pii.js +82 -26
- package/dist/pii.js.map +1 -1
- package/dist/policy-gate.js +27 -3
- package/dist/policy-gate.js.map +1 -1
- package/dist/retention.d.ts +6 -1
- package/dist/retention.js +56 -9
- package/dist/retention.js.map +1 -1
- package/dist/sandbox-fs.d.ts +1 -1
- package/dist/sandbox-fs.js +31 -38
- package/dist/sandbox-fs.js.map +1 -1
- package/dist/sandbox-runtime.d.ts +22 -29
- package/dist/sandbox-runtime.js +125 -93
- package/dist/sandbox-runtime.js.map +1 -1
- package/dist/sandbox.d.ts +1 -1
- package/dist/sandbox.js +1 -1
- package/dist/secrets.d.ts +99 -0
- package/dist/secrets.js +371 -0
- package/dist/secrets.js.map +1 -0
- package/dist/storage.d.ts +67 -0
- package/dist/storage.js +291 -11
- package/dist/storage.js.map +1 -1
- package/dist/time.js +6 -2
- package/dist/time.js.map +1 -1
- package/dist/tls.d.ts +87 -0
- package/dist/tls.js +154 -0
- package/dist/tls.js.map +1 -0
- package/dist/tokenizer.d.ts +54 -0
- package/dist/tokenizer.js +272 -0
- package/dist/tokenizer.js.map +1 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.js +1 -1
- package/dist/worker-pool.js +19 -0
- package/dist/worker-pool.js.map +1 -1
- package/package.json +19 -7
package/dist/sandbox-fs.js
CHANGED
|
@@ -8,8 +8,9 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import fs from "fs";
|
|
10
10
|
import path from "path";
|
|
11
|
+
import crypto from "crypto";
|
|
11
12
|
import { AtomicFileLock } from "./file-lock.js";
|
|
12
|
-
import { resolveSandboxRuntimeConfig,
|
|
13
|
+
import { resolveSandboxRuntimeConfig, SandboxRequiredError, } from "./sandbox-runtime.js";
|
|
13
14
|
/**
|
|
14
15
|
* Normalize user path to a project-relative POSIX path.
|
|
15
16
|
* Absolute paths are accepted only if they resolve inside projectRoot.
|
|
@@ -59,10 +60,6 @@ export function assertSafeRelativePath(userPath, projectRoot) {
|
|
|
59
60
|
}
|
|
60
61
|
return parts.join("/");
|
|
61
62
|
}
|
|
62
|
-
function shellSingleQuote(s) {
|
|
63
|
-
// Safe for sh single-quoted strings
|
|
64
|
-
return `'${s.replace(/'/g, `'\\''`)}'`;
|
|
65
|
-
}
|
|
66
63
|
function createLock(projectRoot) {
|
|
67
64
|
return new AtomicFileLock({
|
|
68
65
|
projectRoot,
|
|
@@ -77,7 +74,7 @@ function hostWriteAtomic(absolutePath, content) {
|
|
|
77
74
|
fs.mkdirSync(dir, { recursive: true });
|
|
78
75
|
}
|
|
79
76
|
// Write exact bytes (callers decide trailing newline — patch/replace need fidelity)
|
|
80
|
-
const tempPath = `${absolutePath}.${
|
|
77
|
+
const tempPath = `${absolutePath}.${crypto.randomBytes(6).toString("hex")}.tmp`;
|
|
81
78
|
try {
|
|
82
79
|
fs.writeFileSync(tempPath, content, "utf8");
|
|
83
80
|
fs.renameSync(tempPath, absolutePath);
|
|
@@ -92,57 +89,53 @@ function hostWriteAtomic(absolutePath, content) {
|
|
|
92
89
|
}
|
|
93
90
|
}
|
|
94
91
|
/**
|
|
95
|
-
*
|
|
92
|
+
* Reject writes whose real (symlink-resolved) path escapes the project root.
|
|
93
|
+
* Lexical checks alone are defeated by a symlink inside the project that
|
|
94
|
+
* points at e.g. ~/.ssh/authorized_keys.
|
|
95
|
+
*/
|
|
96
|
+
function assertRealPathInsideRoot(absolutePath, root) {
|
|
97
|
+
const realRoot = fs.existsSync(root) ? fs.realpathSync(root) : root;
|
|
98
|
+
let probe = absolutePath;
|
|
99
|
+
while (probe !== path.dirname(probe)) {
|
|
100
|
+
if (fs.existsSync(probe)) {
|
|
101
|
+
const real = fs.realpathSync(probe) + absolutePath.slice(probe.length);
|
|
102
|
+
if (real !== realRoot && !real.startsWith(realRoot + path.sep)) {
|
|
103
|
+
throw new Error(`[SANDBOX_FS] Symlink escape denied: "${absolutePath}"`);
|
|
104
|
+
}
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
probe = path.dirname(probe);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Write file content under project root using the active local sandbox runtime.
|
|
96
112
|
*/
|
|
97
113
|
export async function writeFileInSandbox(projectRoot, userPath, content, options) {
|
|
98
114
|
const root = path.resolve(projectRoot);
|
|
99
115
|
const relativePath = assertSafeRelativePath(userPath, root);
|
|
100
116
|
const absolutePath = path.resolve(root, relativePath);
|
|
101
|
-
// Belt-and-suspenders: stay inside root
|
|
102
117
|
if (!absolutePath.startsWith(root + path.sep) && absolutePath !== root) {
|
|
103
118
|
throw new Error(`[SANDBOX_FS] Resolved path escapes project root: "${userPath}"`);
|
|
104
119
|
}
|
|
120
|
+
assertRealPathInsideRoot(absolutePath, root);
|
|
105
121
|
const cfg = resolveSandboxRuntimeConfig(root, options?.timeoutMs);
|
|
106
122
|
if (cfg.required && cfg.effectiveMode === "none") {
|
|
107
|
-
throw new SandboxRequiredError("[SANDBOX_REQUIRED] File write blocked: no sandbox isolation available. " +
|
|
108
|
-
"Set ATABEY_SANDBOX_RUNTIME=
|
|
123
|
+
throw new SandboxRequiredError("[SANDBOX_REQUIRED] File write blocked: no OS sandbox isolation available. " +
|
|
124
|
+
"Set ATABEY_SANDBOX_RUNTIME=seatbelt or uid, or disable ATABEY_SANDBOX_REQUIRED.");
|
|
109
125
|
}
|
|
110
126
|
const owner = options?.ownerId || process.env.ATABEY_ACTIVE_AGENT || "mcp-writer";
|
|
111
127
|
const lock = createLock(root);
|
|
112
|
-
const posixRel = relativePath.split(path.sep).join("/");
|
|
113
128
|
return lock.withLock(relativePath, owner, async () => {
|
|
114
|
-
if (cfg.effectiveMode === "container" && cfg.engine !== "none") {
|
|
115
|
-
const dir = path.posix.dirname(posixRel);
|
|
116
|
-
const script = dir === "."
|
|
117
|
-
? `cat > ${shellSingleQuote(posixRel)}`
|
|
118
|
-
: `mkdir -p ${shellSingleQuote(dir)} && cat > ${shellSingleQuote(posixRel)}`;
|
|
119
|
-
const result = await runInSandbox({
|
|
120
|
-
command: "sh",
|
|
121
|
-
args: ["-c", script],
|
|
122
|
-
projectRoot: root,
|
|
123
|
-
timeoutMs: options?.timeoutMs ?? cfg.timeoutMs,
|
|
124
|
-
stdin: content,
|
|
125
|
-
});
|
|
126
|
-
if (result.code !== 0) {
|
|
127
|
-
throw new Error(`[SANDBOX_FS] Container write failed (code ${result.code}): ${result.stderr || result.stdout}`.trim());
|
|
128
|
-
}
|
|
129
|
-
return {
|
|
130
|
-
absolutePath,
|
|
131
|
-
relativePath,
|
|
132
|
-
runtime: "container",
|
|
133
|
-
isolationLabel: result.isolationLabel,
|
|
134
|
-
bytes: Buffer.byteLength(content, "utf8"),
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
// uid | none — host write confined to project root
|
|
138
129
|
hostWriteAtomic(absolutePath, content);
|
|
139
130
|
return {
|
|
140
131
|
absolutePath,
|
|
141
132
|
relativePath,
|
|
142
133
|
runtime: cfg.effectiveMode,
|
|
143
|
-
isolationLabel: cfg.effectiveMode === "
|
|
144
|
-
? "
|
|
145
|
-
:
|
|
134
|
+
isolationLabel: cfg.effectiveMode === "seatbelt"
|
|
135
|
+
? "seatbelt host write (project-bound)"
|
|
136
|
+
: cfg.effectiveMode === "uid"
|
|
137
|
+
? "uid host write (project-bound)"
|
|
138
|
+
: "host write (project-bound)",
|
|
146
139
|
bytes: Buffer.byteLength(content, "utf8"),
|
|
147
140
|
};
|
|
148
141
|
});
|
package/dist/sandbox-fs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sandbox-fs.js","sourceRoot":"","sources":["../src/sandbox-fs.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EACH,2BAA2B,EAC3B,
|
|
1
|
+
{"version":3,"file":"sandbox-fs.js","sourceRoot":"","sources":["../src/sandbox-fs.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,35 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Sandbox Runtime —
|
|
2
|
+
* Sandbox Runtime — Pure local OS process isolation for agent commands (Zero Docker/Container).
|
|
3
3
|
*
|
|
4
4
|
* Modes (ATABEY_SANDBOX_RUNTIME):
|
|
5
|
-
* none — host spawn (
|
|
6
|
-
* uid — host spawn with uid/gid drop (see sandbox.ts)
|
|
7
|
-
*
|
|
8
|
-
*
|
|
5
|
+
* none — host spawn (allow-list + env scrubbing)
|
|
6
|
+
* uid — host spawn with POSIX uid/gid drop (see sandbox.ts)
|
|
7
|
+
* seatbelt — macOS kernel sandbox (/usr/bin/sandbox-exec) confining writes to projectRoot
|
|
8
|
+
* and denying network access by default
|
|
9
|
+
* auto — seatbelt if available on macOS, else uid if configured, else none
|
|
9
10
|
*
|
|
10
|
-
*
|
|
11
|
+
* Hardening:
|
|
11
12
|
* ATABEY_SANDBOX_REQUIRED=true → deny execution when isolation is effectively "none"
|
|
12
|
-
*
|
|
13
|
-
* Container defaults:
|
|
14
|
-
* ATABEY_SANDBOX_ENGINE=podman|docker|auto (prefer podman, then docker)
|
|
15
|
-
* ATABEY_SANDBOX_IMAGE=node:20-bookworm-slim
|
|
16
|
-
* ATABEY_SANDBOX_MEMORY=512m
|
|
17
|
-
* ATABEY_SANDBOX_CPUS=1
|
|
18
|
-
* ATABEY_SANDBOX_PIDS=256
|
|
19
|
-
* ATABEY_SANDBOX_NETWORK=none
|
|
13
|
+
* ATABEY_SANDBOX_NETWORK=none → deny outbound/inbound network inside seatbelt (default: none)
|
|
20
14
|
*/
|
|
21
15
|
import { resolveSandboxIdentity } from "./sandbox.js";
|
|
22
|
-
export type SandboxRuntimeMode = "none" | "uid" | "
|
|
23
|
-
export type SandboxEngine = "
|
|
16
|
+
export type SandboxRuntimeMode = "none" | "uid" | "seatbelt" | "auto";
|
|
17
|
+
export type SandboxEngine = "seatbelt" | "none";
|
|
24
18
|
export interface SandboxRuntimeConfig {
|
|
25
19
|
mode: SandboxRuntimeMode;
|
|
26
20
|
/** Resolved effective mode after auto detection. */
|
|
27
|
-
effectiveMode: "none" | "uid" | "
|
|
21
|
+
effectiveMode: "none" | "uid" | "seatbelt";
|
|
28
22
|
engine: SandboxEngine;
|
|
29
|
-
image: string;
|
|
30
|
-
memory: string;
|
|
31
|
-
cpus: string;
|
|
32
|
-
pidsLimit: number;
|
|
33
23
|
network: string;
|
|
34
24
|
required: boolean;
|
|
35
25
|
projectRoot: string;
|
|
@@ -41,7 +31,7 @@ export interface RunInSandboxRequest {
|
|
|
41
31
|
projectRoot: string;
|
|
42
32
|
timeoutMs?: number;
|
|
43
33
|
env?: NodeJS.ProcessEnv;
|
|
44
|
-
/** Optional stdin payload
|
|
34
|
+
/** Optional stdin payload. */
|
|
45
35
|
stdin?: string | Buffer;
|
|
46
36
|
}
|
|
47
37
|
export interface RunInSandboxResult {
|
|
@@ -56,10 +46,12 @@ export interface RunInSandboxResult {
|
|
|
56
46
|
export declare class SandboxRequiredError extends Error {
|
|
57
47
|
constructor(message: string);
|
|
58
48
|
}
|
|
49
|
+
export declare const SEATBELT_BINARY = "/usr/bin/sandbox-exec";
|
|
50
|
+
export declare function resolveDefaultSandboxRequired(_mode?: SandboxRuntimeMode): boolean;
|
|
59
51
|
/**
|
|
60
|
-
* Detect available
|
|
52
|
+
* Detect available native OS sandbox engine (cached).
|
|
61
53
|
*/
|
|
62
|
-
export declare function
|
|
54
|
+
export declare function detectOsSandboxEngine(): SandboxEngine;
|
|
63
55
|
/** Test helper */
|
|
64
56
|
export declare function clearSandboxRuntimeCache(): void;
|
|
65
57
|
/**
|
|
@@ -67,16 +59,17 @@ export declare function clearSandboxRuntimeCache(): void;
|
|
|
67
59
|
*/
|
|
68
60
|
export declare function resolveSandboxRuntimeConfig(projectRoot: string, timeoutMs?: number): SandboxRuntimeConfig;
|
|
69
61
|
/**
|
|
70
|
-
* Build
|
|
71
|
-
*
|
|
62
|
+
* Build macOS Seatbelt (`/usr/bin/sandbox-exec`) SBPL profile and argv.
|
|
63
|
+
* Confines file writes strictly to `projectRoot` and OS temp directories,
|
|
64
|
+
* and denies network access when `cfg.network === "none"`.
|
|
72
65
|
*/
|
|
73
|
-
export declare function
|
|
66
|
+
export declare function buildSeatbeltArgs(cfg: SandboxRuntimeConfig, command: string, args: string[]): string[];
|
|
74
67
|
/**
|
|
75
|
-
* Run a command under the configured sandbox runtime.
|
|
68
|
+
* Run a command under the configured local OS sandbox runtime.
|
|
76
69
|
*/
|
|
77
70
|
export declare function runInSandbox(req: RunInSandboxRequest): Promise<RunInSandboxResult>;
|
|
78
71
|
/**
|
|
79
|
-
* Diagnostic snapshot for
|
|
72
|
+
* Diagnostic snapshot for CLI.
|
|
80
73
|
*/
|
|
81
74
|
export declare function getSandboxRuntimeStatus(projectRoot?: string): {
|
|
82
75
|
config: SandboxRuntimeConfig;
|
package/dist/sandbox-runtime.js
CHANGED
|
@@ -1,33 +1,29 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Sandbox Runtime —
|
|
2
|
+
* Sandbox Runtime — Pure local OS process isolation for agent commands (Zero Docker/Container).
|
|
3
3
|
*
|
|
4
4
|
* Modes (ATABEY_SANDBOX_RUNTIME):
|
|
5
|
-
* none — host spawn (
|
|
6
|
-
* uid — host spawn with uid/gid drop (see sandbox.ts)
|
|
7
|
-
*
|
|
8
|
-
*
|
|
5
|
+
* none — host spawn (allow-list + env scrubbing)
|
|
6
|
+
* uid — host spawn with POSIX uid/gid drop (see sandbox.ts)
|
|
7
|
+
* seatbelt — macOS kernel sandbox (/usr/bin/sandbox-exec) confining writes to projectRoot
|
|
8
|
+
* and denying network access by default
|
|
9
|
+
* auto — seatbelt if available on macOS, else uid if configured, else none
|
|
9
10
|
*
|
|
10
|
-
*
|
|
11
|
+
* Hardening:
|
|
11
12
|
* ATABEY_SANDBOX_REQUIRED=true → deny execution when isolation is effectively "none"
|
|
12
|
-
*
|
|
13
|
-
* Container defaults:
|
|
14
|
-
* ATABEY_SANDBOX_ENGINE=podman|docker|auto (prefer podman, then docker)
|
|
15
|
-
* ATABEY_SANDBOX_IMAGE=node:20-bookworm-slim
|
|
16
|
-
* ATABEY_SANDBOX_MEMORY=512m
|
|
17
|
-
* ATABEY_SANDBOX_CPUS=1
|
|
18
|
-
* ATABEY_SANDBOX_PIDS=256
|
|
19
|
-
* ATABEY_SANDBOX_NETWORK=none
|
|
13
|
+
* ATABEY_SANDBOX_NETWORK=none → deny outbound/inbound network inside seatbelt (default: none)
|
|
20
14
|
*/
|
|
21
15
|
import { spawn, execFileSync } from "child_process";
|
|
22
16
|
import fs from "fs";
|
|
23
17
|
import path from "path";
|
|
24
18
|
import { applySandboxToSpawnOptions, resolveSandboxIdentity, sandboxSpawn, } from "./sandbox.js";
|
|
19
|
+
import { scrubEnvForSubprocess } from "./secrets.js";
|
|
25
20
|
export class SandboxRequiredError extends Error {
|
|
26
21
|
constructor(message) {
|
|
27
22
|
super(message);
|
|
28
23
|
this.name = "SandboxRequiredError";
|
|
29
24
|
}
|
|
30
25
|
}
|
|
26
|
+
export const SEATBELT_BINARY = "/usr/bin/sandbox-exec";
|
|
31
27
|
let cachedEngine = null;
|
|
32
28
|
function envStr(key, fallback) {
|
|
33
29
|
const v = process.env[key];
|
|
@@ -39,40 +35,53 @@ function envBool(key, fallback = false) {
|
|
|
39
35
|
return fallback;
|
|
40
36
|
return v === "true" || v === "1" || v === "yes";
|
|
41
37
|
}
|
|
38
|
+
let warnedDevUnsandboxed = false;
|
|
39
|
+
export function resolveDefaultSandboxRequired(_mode = "auto") {
|
|
40
|
+
if (process.env.ATABEY_SANDBOX_REQUIRED !== undefined) {
|
|
41
|
+
return envBool("ATABEY_SANDBOX_REQUIRED", true);
|
|
42
|
+
}
|
|
43
|
+
if (envBool("ATABEY_ALLOW_UNSANDBOXED", false)) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
const profile = (process.env.ATABEY_PROFILE || "").toLowerCase();
|
|
47
|
+
if (process.env.NODE_ENV === "production" || profile === "enterprise") {
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
const isTestEnv = Boolean(process.env.VITEST) || process.env.NODE_ENV === "test";
|
|
51
|
+
if (isTestEnv) {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
if (!warnedDevUnsandboxed) {
|
|
55
|
+
warnedDevUnsandboxed = true;
|
|
56
|
+
process.stderr.write("[SANDBOX] No isolation enforced (local dev). Set ATABEY_SANDBOX_REQUIRED=true " +
|
|
57
|
+
"to enforce OS process isolation (seatbelt/uid).\n");
|
|
58
|
+
}
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
42
61
|
/**
|
|
43
|
-
* Detect available
|
|
62
|
+
* Detect available native OS sandbox engine (cached).
|
|
44
63
|
*/
|
|
45
|
-
export function
|
|
64
|
+
export function detectOsSandboxEngine() {
|
|
46
65
|
if (cachedEngine)
|
|
47
66
|
return cachedEngine;
|
|
48
67
|
const prefer = envStr("ATABEY_SANDBOX_ENGINE", "auto").toLowerCase();
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
execFileSync(name, ["--version"], {
|
|
52
|
-
encoding: "utf8",
|
|
53
|
-
timeout: 3000,
|
|
54
|
-
stdio: ["ignore", "pipe", "ignore"],
|
|
55
|
-
});
|
|
56
|
-
return true;
|
|
57
|
-
}
|
|
58
|
-
catch {
|
|
59
|
-
return false;
|
|
60
|
-
}
|
|
61
|
-
};
|
|
62
|
-
if (prefer === "podman" || prefer === "docker") {
|
|
63
|
-
cachedEngine = tryEngine(prefer) ? prefer : "none";
|
|
68
|
+
if (prefer === "none") {
|
|
69
|
+
cachedEngine = "none";
|
|
64
70
|
return cachedEngine;
|
|
65
71
|
}
|
|
66
|
-
|
|
67
|
-
|
|
72
|
+
try {
|
|
73
|
+
execFileSync(SEATBELT_BINARY, ["-p", "(version 1)(allow default)", "/usr/bin/true"], {
|
|
74
|
+
encoding: "utf8",
|
|
75
|
+
timeout: 3000,
|
|
76
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
77
|
+
});
|
|
78
|
+
cachedEngine = "seatbelt";
|
|
68
79
|
return cachedEngine;
|
|
69
80
|
}
|
|
70
|
-
|
|
71
|
-
cachedEngine = "
|
|
81
|
+
catch {
|
|
82
|
+
cachedEngine = "none";
|
|
72
83
|
return cachedEngine;
|
|
73
84
|
}
|
|
74
|
-
cachedEngine = "none";
|
|
75
|
-
return cachedEngine;
|
|
76
85
|
}
|
|
77
86
|
/** Test helper */
|
|
78
87
|
export function clearSandboxRuntimeCache() {
|
|
@@ -82,10 +91,13 @@ export function clearSandboxRuntimeCache() {
|
|
|
82
91
|
* Resolve full runtime configuration for a project.
|
|
83
92
|
*/
|
|
84
93
|
export function resolveSandboxRuntimeConfig(projectRoot, timeoutMs) {
|
|
85
|
-
const
|
|
86
|
-
const
|
|
94
|
+
const rawMode = envStr("ATABEY_SANDBOX_RUNTIME", "auto").toLowerCase() || "auto";
|
|
95
|
+
const mode = ["none", "uid", "seatbelt", "auto"].includes(rawMode)
|
|
96
|
+
? rawMode
|
|
97
|
+
: "auto";
|
|
98
|
+
const engine = detectOsSandboxEngine();
|
|
87
99
|
const identity = resolveSandboxIdentity();
|
|
88
|
-
const required =
|
|
100
|
+
const required = resolveDefaultSandboxRequired(mode);
|
|
89
101
|
let effectiveMode;
|
|
90
102
|
if (mode === "none") {
|
|
91
103
|
effectiveMode = "none";
|
|
@@ -93,26 +105,22 @@ export function resolveSandboxRuntimeConfig(projectRoot, timeoutMs) {
|
|
|
93
105
|
else if (mode === "uid") {
|
|
94
106
|
effectiveMode = identity.enabled ? "uid" : "none";
|
|
95
107
|
}
|
|
96
|
-
else if (mode === "
|
|
97
|
-
effectiveMode = engine
|
|
108
|
+
else if (mode === "seatbelt") {
|
|
109
|
+
effectiveMode = engine === "seatbelt" ? "seatbelt" : "none";
|
|
98
110
|
}
|
|
99
111
|
else {
|
|
100
|
-
// auto
|
|
101
|
-
if (engine
|
|
102
|
-
effectiveMode = "
|
|
112
|
+
// auto: prefer native OS seatbelt, then uid drop, else none
|
|
113
|
+
if (engine === "seatbelt")
|
|
114
|
+
effectiveMode = "seatbelt";
|
|
103
115
|
else if (identity.enabled)
|
|
104
116
|
effectiveMode = "uid";
|
|
105
117
|
else
|
|
106
118
|
effectiveMode = "none";
|
|
107
119
|
}
|
|
108
120
|
return {
|
|
109
|
-
mode
|
|
121
|
+
mode,
|
|
110
122
|
effectiveMode,
|
|
111
|
-
engine,
|
|
112
|
-
image: envStr("ATABEY_SANDBOX_IMAGE", "node:20-bookworm-slim"),
|
|
113
|
-
memory: envStr("ATABEY_SANDBOX_MEMORY", "512m"),
|
|
114
|
-
cpus: envStr("ATABEY_SANDBOX_CPUS", "1"),
|
|
115
|
-
pidsLimit: parseInt(envStr("ATABEY_SANDBOX_PIDS", "256"), 10) || 256,
|
|
123
|
+
engine: effectiveMode === "seatbelt" ? "seatbelt" : "none",
|
|
116
124
|
network: envStr("ATABEY_SANDBOX_NETWORK", "none"),
|
|
117
125
|
required,
|
|
118
126
|
projectRoot: path.resolve(projectRoot),
|
|
@@ -120,8 +128,8 @@ export function resolveSandboxRuntimeConfig(projectRoot, timeoutMs) {
|
|
|
120
128
|
};
|
|
121
129
|
}
|
|
122
130
|
function isolationLabel(cfg) {
|
|
123
|
-
if (cfg.effectiveMode === "
|
|
124
|
-
return `
|
|
131
|
+
if (cfg.effectiveMode === "seatbelt") {
|
|
132
|
+
return `os/seatbelt network=${cfg.network} root=${cfg.projectRoot}`;
|
|
125
133
|
}
|
|
126
134
|
if (cfg.effectiveMode === "uid") {
|
|
127
135
|
const id = resolveSandboxIdentity();
|
|
@@ -129,36 +137,41 @@ function isolationLabel(cfg) {
|
|
|
129
137
|
}
|
|
130
138
|
return "none (host process)";
|
|
131
139
|
}
|
|
140
|
+
function escapeSbplString(value) {
|
|
141
|
+
return value.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
|
|
142
|
+
}
|
|
132
143
|
/**
|
|
133
|
-
* Build
|
|
134
|
-
*
|
|
144
|
+
* Build macOS Seatbelt (`/usr/bin/sandbox-exec`) SBPL profile and argv.
|
|
145
|
+
* Confines file writes strictly to `projectRoot` and OS temp directories,
|
|
146
|
+
* and denies network access when `cfg.network === "none"`.
|
|
135
147
|
*/
|
|
136
|
-
export function
|
|
137
|
-
const
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
const
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
"
|
|
145
|
-
"
|
|
146
|
-
"
|
|
147
|
-
"
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
148
|
+
export function buildSeatbeltArgs(cfg, command, args) {
|
|
149
|
+
const resolvedRoot = fs.existsSync(cfg.projectRoot)
|
|
150
|
+
? fs.realpathSync(cfg.projectRoot)
|
|
151
|
+
: path.resolve(cfg.projectRoot);
|
|
152
|
+
const lexicalRoot = path.resolve(cfg.projectRoot);
|
|
153
|
+
const allowPaths = new Set([
|
|
154
|
+
resolvedRoot,
|
|
155
|
+
lexicalRoot,
|
|
156
|
+
"/tmp",
|
|
157
|
+
"/private/tmp",
|
|
158
|
+
"/var/folders",
|
|
159
|
+
"/private/var/folders",
|
|
160
|
+
]);
|
|
161
|
+
const subpathRules = [...allowPaths]
|
|
162
|
+
.map((p) => `(subpath "${escapeSbplString(p)}")`)
|
|
163
|
+
.join(" ");
|
|
164
|
+
const netRule = cfg.network === "none" ? "(deny network*)" : "";
|
|
165
|
+
const profile = [
|
|
166
|
+
"(version 1)",
|
|
167
|
+
"(allow default)",
|
|
168
|
+
netRule,
|
|
169
|
+
'(deny file-write* (subpath "/"))',
|
|
170
|
+
`(allow file-write* ${subpathRules} (literal "/dev/null") (literal "/dev/zero") (literal "/dev/tty"))`,
|
|
171
|
+
]
|
|
172
|
+
.filter(Boolean)
|
|
173
|
+
.join("");
|
|
174
|
+
return ["-p", profile, command, ...args];
|
|
162
175
|
}
|
|
163
176
|
function collectOutput(child, stdin) {
|
|
164
177
|
return new Promise((resolve) => {
|
|
@@ -182,14 +195,14 @@ function collectOutput(child, stdin) {
|
|
|
182
195
|
});
|
|
183
196
|
}
|
|
184
197
|
/**
|
|
185
|
-
* Run a command under the configured sandbox runtime.
|
|
198
|
+
* Run a command under the configured local OS sandbox runtime.
|
|
186
199
|
*/
|
|
187
200
|
export async function runInSandbox(req) {
|
|
188
201
|
const cfg = resolveSandboxRuntimeConfig(req.projectRoot, req.timeoutMs);
|
|
189
202
|
const label = isolationLabel(cfg);
|
|
190
203
|
if (cfg.required && cfg.effectiveMode === "none") {
|
|
191
|
-
throw new SandboxRequiredError("[SANDBOX_REQUIRED] ATABEY_SANDBOX_REQUIRED=true but no isolation is available. " +
|
|
192
|
-
"
|
|
204
|
+
throw new SandboxRequiredError("[SANDBOX_REQUIRED] ATABEY_SANDBOX_REQUIRED=true but no OS isolation is available. " +
|
|
205
|
+
"Use macOS seatbelt (ATABEY_SANDBOX_RUNTIME=seatbelt) or configure ATABEY_SANDBOX_UID/USER " +
|
|
193
206
|
"(ATABEY_SANDBOX_RUNTIME=uid), or set ATABEY_SANDBOX_REQUIRED=false for local dev.");
|
|
194
207
|
}
|
|
195
208
|
if (!fs.existsSync(cfg.projectRoot)) {
|
|
@@ -200,30 +213,49 @@ export async function runInSandbox(req) {
|
|
|
200
213
|
"pipe",
|
|
201
214
|
"pipe",
|
|
202
215
|
];
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
216
|
+
const baseEnv = req.env ?? process.env;
|
|
217
|
+
const childEnv = envBool("ATABEY_SANDBOX_PASS_ENV", false)
|
|
218
|
+
? baseEnv
|
|
219
|
+
: scrubEnvForSubprocess(baseEnv);
|
|
220
|
+
if (!envBool("ATABEY_ALLOW_INTERACTIVE", false)) {
|
|
221
|
+
const nonInteractive = {
|
|
222
|
+
CI: "true",
|
|
223
|
+
DEBIAN_FRONTEND: "noninteractive",
|
|
224
|
+
GIT_TERMINAL_PROMPT: "0",
|
|
225
|
+
GIT_ASKPASS: "echo",
|
|
226
|
+
PAGER: "cat",
|
|
227
|
+
TERM: "dumb",
|
|
228
|
+
npm_config_yes: "true",
|
|
229
|
+
PIP_NO_INPUT: "1",
|
|
230
|
+
};
|
|
231
|
+
for (const [k, v] of Object.entries(nonInteractive)) {
|
|
232
|
+
if (childEnv[k] === undefined)
|
|
233
|
+
childEnv[k] = v;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
if (cfg.effectiveMode === "seatbelt" && cfg.engine === "seatbelt") {
|
|
237
|
+
const seatbeltArgs = buildSeatbeltArgs(cfg, req.command, req.args);
|
|
238
|
+
const child = spawn(SEATBELT_BINARY, seatbeltArgs, {
|
|
206
239
|
cwd: cfg.projectRoot,
|
|
207
240
|
timeout: cfg.timeoutMs,
|
|
208
241
|
shell: false,
|
|
209
242
|
stdio,
|
|
210
|
-
env:
|
|
243
|
+
env: childEnv,
|
|
211
244
|
});
|
|
212
245
|
const result = await collectOutput(child, req.stdin);
|
|
213
246
|
return {
|
|
214
247
|
...result,
|
|
215
|
-
runtime: "
|
|
216
|
-
engine:
|
|
248
|
+
runtime: "seatbelt",
|
|
249
|
+
engine: "seatbelt",
|
|
217
250
|
isolationLabel: label,
|
|
218
251
|
};
|
|
219
252
|
}
|
|
220
|
-
// uid or none — host spawn (uid options applied when available)
|
|
221
253
|
const spawnOpts = {
|
|
222
254
|
cwd: cfg.projectRoot,
|
|
223
255
|
timeout: cfg.timeoutMs,
|
|
224
256
|
shell: false,
|
|
225
257
|
stdio,
|
|
226
|
-
env:
|
|
258
|
+
env: childEnv,
|
|
227
259
|
};
|
|
228
260
|
const child = cfg.effectiveMode === "uid"
|
|
229
261
|
? sandboxSpawn(req.command, req.args, spawnOpts)
|
|
@@ -237,7 +269,7 @@ export async function runInSandbox(req) {
|
|
|
237
269
|
};
|
|
238
270
|
}
|
|
239
271
|
/**
|
|
240
|
-
* Diagnostic snapshot for
|
|
272
|
+
* Diagnostic snapshot for CLI.
|
|
241
273
|
*/
|
|
242
274
|
export function getSandboxRuntimeStatus(projectRoot = process.cwd()) {
|
|
243
275
|
const config = resolveSandboxRuntimeConfig(projectRoot);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sandbox-runtime.js","sourceRoot":"","sources":["../src/sandbox-runtime.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"sandbox-runtime.js","sourceRoot":"","sources":["../src/sandbox-runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/sandbox.d.ts
CHANGED
|
@@ -42,7 +42,7 @@ export declare function applySandboxToSpawnOptions(options?: SandboxSpawnOptions
|
|
|
42
42
|
*/
|
|
43
43
|
export declare function sandboxSpawn(command: string, args: readonly string[], options?: SandboxSpawnOptions): ChildProcess;
|
|
44
44
|
/**
|
|
45
|
-
* Human-readable status for
|
|
45
|
+
* Human-readable status for CLI diagnostics.
|
|
46
46
|
*/
|
|
47
47
|
export declare function getSandboxStatus(): {
|
|
48
48
|
platform: string;
|