atabey-shared 0.0.37 → 0.1.0-beta.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.
Files changed (72) hide show
  1. package/README.md +2 -2
  2. package/dist/agent-identity.d.ts +34 -0
  3. package/dist/agent-identity.js +77 -0
  4. package/dist/agent-identity.js.map +1 -0
  5. package/dist/api-catalog.d.ts +57 -0
  6. package/dist/api-catalog.js +254 -0
  7. package/dist/api-catalog.js.map +1 -0
  8. package/dist/audit-chain.d.ts +32 -3
  9. package/dist/audit-chain.js +187 -10
  10. package/dist/audit-chain.js.map +1 -1
  11. package/dist/audit.d.ts +8 -0
  12. package/dist/audit.js +44 -7
  13. package/dist/audit.js.map +1 -1
  14. package/dist/constants.d.ts +4 -3
  15. package/dist/constants.js +11 -12
  16. package/dist/constants.js.map +1 -1
  17. package/dist/errors.d.ts +1 -1
  18. package/dist/errors.js +1 -1
  19. package/dist/file-lock.d.ts +5 -0
  20. package/dist/file-lock.js +20 -31
  21. package/dist/file-lock.js.map +1 -1
  22. package/dist/index.d.ts +9 -0
  23. package/dist/index.js +9 -0
  24. package/dist/index.js.map +1 -1
  25. package/dist/logger.d.ts +1 -0
  26. package/dist/logger.js +33 -7
  27. package/dist/logger.js.map +1 -1
  28. package/dist/memory-prune.d.ts +18 -0
  29. package/dist/memory-prune.js +48 -0
  30. package/dist/memory-prune.js.map +1 -0
  31. package/dist/migrations.d.ts +69 -0
  32. package/dist/migrations.js +375 -0
  33. package/dist/migrations.js.map +1 -0
  34. package/dist/otel.d.ts +39 -0
  35. package/dist/otel.js +93 -0
  36. package/dist/otel.js.map +1 -0
  37. package/dist/outbound-http.d.ts +32 -0
  38. package/dist/outbound-http.js +88 -0
  39. package/dist/outbound-http.js.map +1 -0
  40. package/dist/pii.d.ts +1 -0
  41. package/dist/pii.js +82 -26
  42. package/dist/pii.js.map +1 -1
  43. package/dist/policy-gate.js +27 -3
  44. package/dist/policy-gate.js.map +1 -1
  45. package/dist/retention.d.ts +6 -1
  46. package/dist/retention.js +56 -9
  47. package/dist/retention.js.map +1 -1
  48. package/dist/sandbox-fs.d.ts +1 -1
  49. package/dist/sandbox-fs.js +31 -38
  50. package/dist/sandbox-fs.js.map +1 -1
  51. package/dist/sandbox-runtime.d.ts +21 -28
  52. package/dist/sandbox-runtime.js +124 -92
  53. package/dist/sandbox-runtime.js.map +1 -1
  54. package/dist/secrets.d.ts +99 -0
  55. package/dist/secrets.js +371 -0
  56. package/dist/secrets.js.map +1 -0
  57. package/dist/storage.d.ts +67 -0
  58. package/dist/storage.js +291 -11
  59. package/dist/storage.js.map +1 -1
  60. package/dist/time.js +6 -2
  61. package/dist/time.js.map +1 -1
  62. package/dist/tls.d.ts +87 -0
  63. package/dist/tls.js +154 -0
  64. package/dist/tls.js.map +1 -0
  65. package/dist/tokenizer.d.ts +54 -0
  66. package/dist/tokenizer.js +272 -0
  67. package/dist/tokenizer.js.map +1 -0
  68. package/dist/types.d.ts +1 -1
  69. package/dist/types.js +1 -1
  70. package/dist/worker-pool.js +19 -0
  71. package/dist/worker-pool.js.map +1 -1
  72. package/package.json +18 -6
@@ -1,35 +1,25 @@
1
1
  /**
2
- * Sandbox Runtime — Phase 1.1 execution isolation for agent shell commands.
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 (legacy; allow-list only)
6
- * uid — host spawn with uid/gid drop (see sandbox.ts)
7
- * container — Docker/Podman run with network=none, resource limits, project mount
8
- * auto — container if engine available, else uid if configured, else none
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
- * Enterprise hardening:
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" | "container" | "auto";
23
- export type SandboxEngine = "podman" | "docker" | "none";
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" | "container";
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 (e.g. file content for container-mediated writes). */
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 container engine (cached).
52
+ * Detect available native OS sandbox engine (cached).
61
53
  */
62
- export declare function detectContainerEngine(): SandboxEngine;
54
+ export declare function detectOsSandboxEngine(): SandboxEngine;
63
55
  /** Test helper */
64
56
  export declare function clearSandboxRuntimeCache(): void;
65
57
  /**
@@ -67,12 +59,13 @@ export declare function clearSandboxRuntimeCache(): void;
67
59
  */
68
60
  export declare function resolveSandboxRuntimeConfig(projectRoot: string, timeoutMs?: number): SandboxRuntimeConfig;
69
61
  /**
70
- * Build docker/podman argv for an isolated run.
71
- * Project is mounted at /workspace; command runs with -w /workspace.
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 buildContainerArgs(cfg: SandboxRuntimeConfig, command: string, args: string[]): string[];
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
  /**
@@ -1,33 +1,29 @@
1
1
  /**
2
- * Sandbox Runtime — Phase 1.1 execution isolation for agent shell commands.
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 (legacy; allow-list only)
6
- * uid — host spawn with uid/gid drop (see sandbox.ts)
7
- * container — Docker/Podman run with network=none, resource limits, project mount
8
- * auto — container if engine available, else uid if configured, else none
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
- * Enterprise hardening:
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 container engine (cached).
62
+ * Detect available native OS sandbox engine (cached).
44
63
  */
45
- export function detectContainerEngine() {
64
+ export function detectOsSandboxEngine() {
46
65
  if (cachedEngine)
47
66
  return cachedEngine;
48
67
  const prefer = envStr("ATABEY_SANDBOX_ENGINE", "auto").toLowerCase();
49
- const tryEngine = (name) => {
50
- try {
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
- if (tryEngine("podman")) {
67
- cachedEngine = "podman";
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
- if (tryEngine("docker")) {
71
- cachedEngine = "docker";
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 mode = (envStr("ATABEY_SANDBOX_RUNTIME", "auto").toLowerCase() || "auto");
86
- const engine = detectContainerEngine();
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 = envBool("ATABEY_SANDBOX_REQUIRED", false);
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 === "container") {
97
- effectiveMode = engine !== "none" ? "container" : "none";
108
+ else if (mode === "seatbelt") {
109
+ effectiveMode = engine === "seatbelt" ? "seatbelt" : "none";
98
110
  }
99
111
  else {
100
- // auto
101
- if (engine !== "none")
102
- effectiveMode = "container";
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: ["none", "uid", "container", "auto"].includes(mode) ? mode : "auto",
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 === "container") {
124
- return `container/${cfg.engine} image=${cfg.image} network=${cfg.network} mem=${cfg.memory}`;
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 docker/podman argv for an isolated run.
134
- * Project is mounted at /workspace; command runs with -w /workspace.
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 buildContainerArgs(cfg, command, args) {
137
- const root = cfg.projectRoot;
138
- // Prefer :rw so installs/builds work; network still none by default
139
- const mount = `${root}:/workspace:rw`;
140
- const argv = [
141
- "run",
142
- "--rm",
143
- "--network", cfg.network,
144
- "--memory", cfg.memory,
145
- "--cpus", cfg.cpus,
146
- "--pids-limit", String(cfg.pidsLimit),
147
- "-v", mount,
148
- "-w", "/workspace",
149
- // Drop ambient capabilities when supported (docker/podman)
150
- "--security-opt", "no-new-privileges",
151
- ];
152
- // Optional: read-only root FS with writable tmp (stronger isolation)
153
- if (envBool("ATABEY_SANDBOX_READ_ONLY_ROOT", false)) {
154
- argv.push("--read-only", "--tmpfs", "/tmp:rw,noexec,nosuid,size=64m");
155
- }
156
- // Do not pass host secrets by default — empty env except PATH-ish via image
157
- if (!envBool("ATABEY_SANDBOX_PASS_ENV", false)) {
158
- argv.push("--env", "HOME=/tmp", "--env", "NPM_CONFIG_UPDATE_NOTIFIER=false");
159
- }
160
- argv.push(cfg.image, command, ...args);
161
- return argv;
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
- "Install Podman/Docker (ATABEY_SANDBOX_RUNTIME=container) or configure ATABEY_SANDBOX_UID/USER " +
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
- if (cfg.effectiveMode === "container" && cfg.engine !== "none") {
204
- const containerArgs = buildContainerArgs(cfg, req.command, req.args);
205
- const child = spawn(cfg.engine, containerArgs, {
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: req.env ?? process.env,
243
+ env: childEnv,
211
244
  });
212
245
  const result = await collectOutput(child, req.stdin);
213
246
  return {
214
247
  ...result,
215
- runtime: "container",
216
- engine: cfg.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: req.env ?? process.env,
258
+ env: childEnv,
227
259
  };
228
260
  const child = cfg.effectiveMode === "uid"
229
261
  ? sandboxSpawn(req.command, req.args, spawnOpts)
@@ -1 +1 @@
1
- {"version":3,"file":"sandbox-runtime.js","sourceRoot":"","sources":["../src/sandbox-runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sandbox-runtime.js","sourceRoot":"","sources":["../src/sandbox-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Secret Management & Leak Guard (Phase 1.5)
3
+ *
4
+ * Provides:
5
+ * 1. Encrypted local secret vault (.atabey/secrets.vault.json) using AES-256-GCM
6
+ * with per-secret random salt (HKDF-SHA256) and 96-bit IV.
7
+ * 2. Subprocess environment scrubber (strips sensitive keys before spawning child processes).
8
+ * 3. Secret leak scanner (detects API keys, cloud credentials, private keys, and vault values).
9
+ */
10
+ export interface VaultEntry {
11
+ /** Base64-encoded 16-byte HKDF salt */
12
+ salt: string;
13
+ /** Base64-encoded 12-byte GCM initialization vector */
14
+ iv: string;
15
+ /** Base64-encoded 16-byte GCM authentication tag */
16
+ tag: string;
17
+ /** Base64-encoded ciphertext */
18
+ ciphertext: string;
19
+ /** ISO-8601 creation timestamp */
20
+ createdAt: string;
21
+ /** ISO-8601 last update timestamp */
22
+ updatedAt: string;
23
+ /** Optional non-sensitive description */
24
+ description?: string;
25
+ }
26
+ export interface VaultFile {
27
+ version: 1;
28
+ entries: Record<string, VaultEntry>;
29
+ }
30
+ export interface SecretMetadata {
31
+ name: string;
32
+ createdAt: string;
33
+ updatedAt: string;
34
+ description?: string;
35
+ }
36
+ export interface SecretFinding {
37
+ ruleId: string;
38
+ description: string;
39
+ matchPreview: string;
40
+ index: number;
41
+ }
42
+ export declare class SecretManager {
43
+ private static resolveVaultDir;
44
+ private static resolveMasterKey;
45
+ private static vaultFilePath;
46
+ private static readVault;
47
+ private static writeVault;
48
+ /**
49
+ * Encrypt and store a secret in the local AES-256-GCM vault.
50
+ */
51
+ static setSecret(name: string, value: string, options?: {
52
+ description?: string;
53
+ vaultDir?: string;
54
+ }): void;
55
+ /**
56
+ * Retrieve and decrypt a secret by name.
57
+ * Checks process.env[name] fallback only when allowEnvFallback is true.
58
+ */
59
+ static getSecret(name: string, options?: {
60
+ vaultDir?: string;
61
+ allowEnvFallback?: boolean;
62
+ }): string | null;
63
+ /**
64
+ * Delete a secret from the vault.
65
+ */
66
+ static deleteSecret(name: string, options?: {
67
+ vaultDir?: string;
68
+ }): boolean;
69
+ /**
70
+ * List stored secret metadata without exposing plaintext values.
71
+ */
72
+ static listSecrets(options?: {
73
+ vaultDir?: string;
74
+ }): SecretMetadata[];
75
+ /**
76
+ * Re-encrypt all vault entries under a new 32-byte master key.
77
+ *
78
+ * Safe ordering: decrypt everything first, build the new vault in memory,
79
+ * then atomically swap. The previous key is kept as `master.key.bak` for
80
+ * the duration of the swap and restored on failure, so a mid-rotation error
81
+ * cannot make the vault permanently undecryptable.
82
+ */
83
+ static rotateMasterKey(newKeyMaterial: string | Buffer, options?: {
84
+ vaultDir?: string;
85
+ }): number;
86
+ }
87
+ /**
88
+ * Scrub sensitive credentials from an environment object before passing to a child process.
89
+ */
90
+ export declare function scrubEnvForSubprocess(env?: NodeJS.ProcessEnv, extraAllowedKeys?: string[]): NodeJS.ProcessEnv;
91
+ /**
92
+ * Scan arbitrary text (command output, file content, tool arguments) for leaked secrets.
93
+ */
94
+ export declare function scanForSecrets(text: string): SecretFinding[];
95
+ /**
96
+ * Redact leaked secrets from text before it is returned to an AI/LLM.
97
+ * Complements PII masking with cloud-credential/private-key patterns.
98
+ */
99
+ export declare function redactSecrets(text: string): string;