atabey 0.1.1-beta → 0.1.2

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 (229) hide show
  1. package/README.md +144 -78
  2. package/dist/atabey/src/cli/commands/coverage.js +17 -12
  3. package/dist/atabey/src/cli/commands/coverage.js.map +1 -1
  4. package/dist/atabey/src/cli/commands/lint.d.ts +2 -1
  5. package/dist/atabey/src/cli/commands/lint.js +20 -1
  6. package/dist/atabey/src/cli/commands/lint.js.map +1 -1
  7. package/dist/atabey/src/cli/commands/mcp.js +56 -23
  8. package/dist/atabey/src/cli/commands/mcp.js.map +1 -1
  9. package/dist/atabey/src/cli/commands/orchestrate.d.ts +6 -6
  10. package/dist/shared/src/agent-identity.d.ts +1 -34
  11. package/dist/shared/src/agent-identity.js +1 -76
  12. package/dist/shared/src/agent-identity.js.map +1 -1
  13. package/dist/shared/src/api-catalog.d.ts +1 -57
  14. package/dist/shared/src/api-catalog.js +1 -253
  15. package/dist/shared/src/api-catalog.js.map +1 -1
  16. package/dist/shared/src/audit-chain.d.ts +1 -80
  17. package/dist/shared/src/audit-chain.js +1 -261
  18. package/dist/shared/src/audit-chain.js.map +1 -1
  19. package/dist/shared/src/audit.d.ts +1 -121
  20. package/dist/shared/src/audit.js +1 -321
  21. package/dist/shared/src/audit.js.map +1 -1
  22. package/dist/shared/src/constants.d.ts +1 -150
  23. package/dist/shared/src/constants.js +1 -211
  24. package/dist/shared/src/constants.js.map +1 -1
  25. package/dist/shared/src/database.d.ts +1 -6
  26. package/dist/shared/src/database.js +1 -15
  27. package/dist/shared/src/database.js.map +1 -1
  28. package/dist/shared/src/errors.d.ts +1 -46
  29. package/dist/shared/src/errors.js +1 -68
  30. package/dist/shared/src/errors.js.map +1 -1
  31. package/dist/shared/src/file-lock.d.ts +1 -93
  32. package/dist/shared/src/file-lock.js +1 -239
  33. package/dist/shared/src/file-lock.js.map +1 -1
  34. package/dist/shared/src/fs.d.ts +1 -9
  35. package/dist/shared/src/fs.js +1 -53
  36. package/dist/shared/src/fs.js.map +1 -1
  37. package/dist/shared/src/index.d.ts +2 -31
  38. package/dist/shared/src/index.js +2 -31
  39. package/dist/shared/src/index.js.map +1 -1
  40. package/dist/shared/src/job-queue.d.ts +1 -76
  41. package/dist/shared/src/job-queue.js +1 -199
  42. package/dist/shared/src/job-queue.js.map +1 -1
  43. package/dist/shared/src/lock.d.ts +1 -82
  44. package/dist/shared/src/lock.js +1 -158
  45. package/dist/shared/src/lock.js.map +1 -1
  46. package/dist/shared/src/logger.d.ts +1 -31
  47. package/dist/shared/src/logger.js +1 -152
  48. package/dist/shared/src/logger.js.map +1 -1
  49. package/dist/shared/src/memory-prune.d.ts +1 -18
  50. package/dist/shared/src/memory-prune.js +1 -47
  51. package/dist/shared/src/memory-prune.js.map +1 -1
  52. package/dist/shared/src/migrations.d.ts +1 -69
  53. package/dist/shared/src/migrations.js +1 -393
  54. package/dist/shared/src/migrations.js.map +1 -1
  55. package/dist/shared/src/modules/agent/agent-identity.d.ts +34 -0
  56. package/dist/shared/src/modules/agent/agent-identity.js +77 -0
  57. package/dist/shared/src/modules/agent/agent-identity.js.map +1 -0
  58. package/dist/shared/src/modules/agent/api-catalog.d.ts +57 -0
  59. package/dist/shared/src/modules/agent/api-catalog.js +254 -0
  60. package/dist/shared/src/modules/agent/api-catalog.js.map +1 -0
  61. package/dist/shared/src/modules/agent/index.d.ts +3 -0
  62. package/dist/shared/src/modules/agent/index.js +4 -0
  63. package/dist/shared/src/modules/agent/index.js.map +1 -0
  64. package/dist/shared/src/modules/agent/tokenizer.d.ts +54 -0
  65. package/dist/shared/src/modules/agent/tokenizer.js +272 -0
  66. package/dist/shared/src/modules/agent/tokenizer.js.map +1 -0
  67. package/dist/shared/src/modules/concurrency/file-lock.d.ts +93 -0
  68. package/dist/shared/src/modules/concurrency/file-lock.js +240 -0
  69. package/dist/shared/src/modules/concurrency/file-lock.js.map +1 -0
  70. package/dist/shared/src/modules/concurrency/index.d.ts +6 -0
  71. package/dist/shared/src/modules/concurrency/index.js +7 -0
  72. package/dist/shared/src/modules/concurrency/index.js.map +1 -0
  73. package/dist/shared/src/modules/concurrency/job-queue.d.ts +76 -0
  74. package/dist/shared/src/modules/concurrency/job-queue.js +200 -0
  75. package/dist/shared/src/modules/concurrency/job-queue.js.map +1 -0
  76. package/dist/shared/src/modules/concurrency/lock.d.ts +82 -0
  77. package/dist/shared/src/modules/concurrency/lock.js +159 -0
  78. package/dist/shared/src/modules/concurrency/lock.js.map +1 -0
  79. package/dist/shared/src/modules/concurrency/resilience.d.ts +84 -0
  80. package/dist/shared/src/modules/concurrency/resilience.js +217 -0
  81. package/dist/shared/src/modules/concurrency/resilience.js.map +1 -0
  82. package/dist/shared/src/modules/concurrency/worker-pool.d.ts +52 -0
  83. package/dist/shared/src/modules/concurrency/worker-pool.js +229 -0
  84. package/dist/shared/src/modules/concurrency/worker-pool.js.map +1 -0
  85. package/dist/shared/src/modules/concurrency/worker-thread.d.ts +21 -0
  86. package/dist/shared/src/modules/concurrency/worker-thread.js +67 -0
  87. package/dist/shared/src/modules/concurrency/worker-thread.js.map +1 -0
  88. package/dist/shared/src/modules/index.d.ts +14 -0
  89. package/dist/shared/src/modules/index.js +15 -0
  90. package/dist/shared/src/modules/index.js.map +1 -0
  91. package/dist/shared/src/modules/observability/audit-chain.d.ts +80 -0
  92. package/dist/shared/src/modules/observability/audit-chain.js +262 -0
  93. package/dist/shared/src/modules/observability/audit-chain.js.map +1 -0
  94. package/dist/shared/src/modules/observability/audit.d.ts +121 -0
  95. package/dist/shared/src/modules/observability/audit.js +322 -0
  96. package/dist/shared/src/modules/observability/audit.js.map +1 -0
  97. package/dist/shared/src/modules/observability/index.d.ts +4 -0
  98. package/dist/shared/src/modules/observability/index.js +5 -0
  99. package/dist/shared/src/modules/observability/index.js.map +1 -0
  100. package/dist/shared/src/modules/observability/logger.d.ts +31 -0
  101. package/dist/shared/src/modules/observability/logger.js +153 -0
  102. package/dist/shared/src/modules/observability/logger.js.map +1 -0
  103. package/dist/shared/src/modules/observability/otel.d.ts +39 -0
  104. package/dist/shared/src/modules/observability/otel.js +93 -0
  105. package/dist/shared/src/modules/observability/otel.js.map +1 -0
  106. package/dist/shared/src/modules/primitives/constants.d.ts +150 -0
  107. package/dist/shared/src/modules/primitives/constants.js +212 -0
  108. package/dist/shared/src/modules/primitives/constants.js.map +1 -0
  109. package/dist/shared/src/modules/primitives/errors.d.ts +46 -0
  110. package/dist/shared/src/modules/primitives/errors.js +69 -0
  111. package/dist/shared/src/modules/primitives/errors.js.map +1 -0
  112. package/dist/shared/src/modules/primitives/fs.d.ts +9 -0
  113. package/dist/shared/src/modules/primitives/fs.js +54 -0
  114. package/dist/shared/src/modules/primitives/fs.js.map +1 -0
  115. package/dist/shared/src/modules/primitives/index.d.ts +7 -0
  116. package/dist/shared/src/modules/primitives/index.js +8 -0
  117. package/dist/shared/src/modules/primitives/index.js.map +1 -0
  118. package/dist/shared/src/modules/primitives/outbound-http.d.ts +32 -0
  119. package/dist/shared/src/modules/primitives/outbound-http.js +88 -0
  120. package/dist/shared/src/modules/primitives/outbound-http.js.map +1 -0
  121. package/dist/shared/src/modules/primitives/string.d.ts +1 -0
  122. package/dist/shared/src/modules/primitives/string.js +30 -0
  123. package/dist/shared/src/modules/primitives/string.js.map +1 -0
  124. package/dist/shared/src/modules/primitives/time.d.ts +5 -0
  125. package/dist/shared/src/modules/primitives/time.js +35 -0
  126. package/dist/shared/src/modules/primitives/time.js.map +1 -0
  127. package/dist/shared/src/modules/primitives/types.d.ts +27 -0
  128. package/dist/shared/src/modules/primitives/types.js +17 -0
  129. package/dist/shared/src/modules/primitives/types.js.map +1 -0
  130. package/dist/shared/src/modules/sandbox/index.d.ts +3 -0
  131. package/dist/shared/src/modules/sandbox/index.js +4 -0
  132. package/dist/shared/src/modules/sandbox/index.js.map +1 -0
  133. package/dist/shared/src/modules/sandbox/sandbox-fs.d.ts +28 -0
  134. package/dist/shared/src/modules/sandbox/sandbox-fs.js +143 -0
  135. package/dist/shared/src/modules/sandbox/sandbox-fs.js.map +1 -0
  136. package/dist/shared/src/modules/sandbox/sandbox-runtime.d.ts +78 -0
  137. package/dist/shared/src/modules/sandbox/sandbox-runtime.js +282 -0
  138. package/dist/shared/src/modules/sandbox/sandbox-runtime.js.map +1 -0
  139. package/dist/shared/src/modules/sandbox/sandbox.d.ts +54 -0
  140. package/dist/shared/src/modules/sandbox/sandbox.js +179 -0
  141. package/dist/shared/src/modules/sandbox/sandbox.js.map +1 -0
  142. package/dist/shared/src/modules/security/index.d.ts +5 -0
  143. package/dist/shared/src/modules/security/index.js +6 -0
  144. package/dist/shared/src/modules/security/index.js.map +1 -0
  145. package/dist/shared/src/modules/security/pii.d.ts +70 -0
  146. package/dist/shared/src/modules/security/pii.js +276 -0
  147. package/dist/shared/src/modules/security/pii.js.map +1 -0
  148. package/dist/shared/src/modules/security/policy-gate.d.ts +42 -0
  149. package/dist/shared/src/modules/security/policy-gate.js +172 -0
  150. package/dist/shared/src/modules/security/policy-gate.js.map +1 -0
  151. package/dist/shared/src/modules/security/retention.d.ts +68 -0
  152. package/dist/shared/src/modules/security/retention.js +218 -0
  153. package/dist/shared/src/modules/security/retention.js.map +1 -0
  154. package/dist/shared/src/modules/security/secrets.d.ts +99 -0
  155. package/dist/shared/src/modules/security/secrets.js +371 -0
  156. package/dist/shared/src/modules/security/secrets.js.map +1 -0
  157. package/dist/shared/src/modules/security/tls.d.ts +87 -0
  158. package/dist/shared/src/modules/security/tls.js +154 -0
  159. package/dist/shared/src/modules/security/tls.js.map +1 -0
  160. package/dist/shared/src/modules/storage/database.d.ts +6 -0
  161. package/dist/shared/src/modules/storage/database.js +16 -0
  162. package/dist/shared/src/modules/storage/database.js.map +1 -0
  163. package/dist/shared/src/modules/storage/index.d.ts +4 -0
  164. package/dist/shared/src/modules/storage/index.js +5 -0
  165. package/dist/shared/src/modules/storage/index.js.map +1 -0
  166. package/dist/shared/src/modules/storage/memory-prune.d.ts +18 -0
  167. package/dist/shared/src/modules/storage/memory-prune.js +48 -0
  168. package/dist/shared/src/modules/storage/memory-prune.js.map +1 -0
  169. package/dist/shared/src/modules/storage/migrations.d.ts +69 -0
  170. package/dist/shared/src/modules/storage/migrations.js +394 -0
  171. package/dist/shared/src/modules/storage/migrations.js.map +1 -0
  172. package/dist/shared/src/modules/storage/storage.d.ts +341 -0
  173. package/dist/shared/src/modules/storage/storage.js +1004 -0
  174. package/dist/shared/src/modules/storage/storage.js.map +1 -0
  175. package/dist/shared/src/otel.d.ts +1 -39
  176. package/dist/shared/src/otel.js +1 -92
  177. package/dist/shared/src/otel.js.map +1 -1
  178. package/dist/shared/src/outbound-http.d.ts +1 -32
  179. package/dist/shared/src/outbound-http.js +1 -87
  180. package/dist/shared/src/outbound-http.js.map +1 -1
  181. package/dist/shared/src/pii.d.ts +1 -70
  182. package/dist/shared/src/pii.js +1 -275
  183. package/dist/shared/src/pii.js.map +1 -1
  184. package/dist/shared/src/policy-gate.d.ts +1 -42
  185. package/dist/shared/src/policy-gate.js +1 -171
  186. package/dist/shared/src/policy-gate.js.map +1 -1
  187. package/dist/shared/src/resilience.d.ts +1 -84
  188. package/dist/shared/src/resilience.js +1 -216
  189. package/dist/shared/src/resilience.js.map +1 -1
  190. package/dist/shared/src/retention.d.ts +1 -68
  191. package/dist/shared/src/retention.js +1 -217
  192. package/dist/shared/src/retention.js.map +1 -1
  193. package/dist/shared/src/sandbox-fs.d.ts +1 -28
  194. package/dist/shared/src/sandbox-fs.js +1 -142
  195. package/dist/shared/src/sandbox-fs.js.map +1 -1
  196. package/dist/shared/src/sandbox-runtime.d.ts +1 -78
  197. package/dist/shared/src/sandbox-runtime.js +1 -281
  198. package/dist/shared/src/sandbox-runtime.js.map +1 -1
  199. package/dist/shared/src/sandbox.d.ts +1 -54
  200. package/dist/shared/src/sandbox.js +1 -178
  201. package/dist/shared/src/sandbox.js.map +1 -1
  202. package/dist/shared/src/secrets.d.ts +1 -99
  203. package/dist/shared/src/secrets.js +1 -370
  204. package/dist/shared/src/secrets.js.map +1 -1
  205. package/dist/shared/src/storage.d.ts +1 -341
  206. package/dist/shared/src/storage.js +1 -1003
  207. package/dist/shared/src/storage.js.map +1 -1
  208. package/dist/shared/src/string.d.ts +1 -1
  209. package/dist/shared/src/string.js +1 -29
  210. package/dist/shared/src/string.js.map +1 -1
  211. package/dist/shared/src/time.d.ts +1 -5
  212. package/dist/shared/src/time.js +1 -34
  213. package/dist/shared/src/time.js.map +1 -1
  214. package/dist/shared/src/tls.d.ts +1 -87
  215. package/dist/shared/src/tls.js +1 -153
  216. package/dist/shared/src/tls.js.map +1 -1
  217. package/dist/shared/src/tokenizer.d.ts +1 -54
  218. package/dist/shared/src/tokenizer.js +1 -271
  219. package/dist/shared/src/tokenizer.js.map +1 -1
  220. package/dist/shared/src/types.d.ts +1 -27
  221. package/dist/shared/src/types.js +1 -16
  222. package/dist/shared/src/types.js.map +1 -1
  223. package/dist/shared/src/worker-pool.d.ts +1 -52
  224. package/dist/shared/src/worker-pool.js +1 -228
  225. package/dist/shared/src/worker-pool.js.map +1 -1
  226. package/dist/shared/src/worker-thread.d.ts +1 -21
  227. package/dist/shared/src/worker-thread.js +1 -66
  228. package/dist/shared/src/worker-thread.js.map +1 -1
  229. package/package.json +4 -4
@@ -1,143 +1,2 @@
1
- /**
2
- * Sandboxed filesystem mutations — Phase 1.2.
3
- *
4
- * - Always holds AtomicFileLock (try/finally).
5
- * - When runtime=container: write via container stdin → /workspace/<path>
6
- * - When runtime=uid|none: write on host under projectRoot (safePath caller responsibility)
7
- * - ATABEY_SANDBOX_REQUIRED=true rejects writes if isolation is none
8
- */
9
- import fs from "fs";
10
- import path from "path";
11
- import crypto from "crypto";
12
- import { AtomicFileLock } from "./file-lock.js";
13
- import { resolveSandboxRuntimeConfig, SandboxRequiredError, } from "./sandbox-runtime.js";
14
- /**
15
- * Normalize user path to a project-relative POSIX path.
16
- * Absolute paths are accepted only if they resolve inside projectRoot.
17
- */
18
- export function assertSafeRelativePath(userPath, projectRoot) {
19
- if (!userPath || !userPath.trim()) {
20
- throw new Error("[SANDBOX_FS] Empty path is not allowed");
21
- }
22
- const trimmed = userPath.trim();
23
- if (trimmed.includes("\0")) {
24
- throw new Error("[SANDBOX_FS] Illegal null byte in path");
25
- }
26
- let rel = trimmed.replace(/\\/g, "/");
27
- // Absolute path → must live under projectRoot
28
- if (path.isAbsolute(trimmed) || rel.startsWith("/")) {
29
- if (!projectRoot) {
30
- throw new Error(`[SANDBOX_FS] Absolute paths require projectRoot: "${userPath}"`);
31
- }
32
- const root = path.resolve(projectRoot);
33
- const abs = path.resolve(trimmed);
34
- const rootCheck = process.platform === "win32" ? root.toLowerCase() : root;
35
- const absCheck = process.platform === "win32" ? abs.toLowerCase() : abs;
36
- if (!absCheck.startsWith(rootCheck + path.sep) && absCheck !== rootCheck) {
37
- throw new Error(`[SANDBOX_FS] Absolute path escapes project root: "${userPath}"`);
38
- }
39
- rel = path.relative(root, abs).replace(/\\/g, "/");
40
- if (!rel || rel === ".") {
41
- throw new Error("[SANDBOX_FS] Path resolves to project root; refuse write");
42
- }
43
- if (rel.startsWith("..")) {
44
- throw new Error(`[SANDBOX_FS] Path traversal denied: "${userPath}"`);
45
- }
46
- return rel;
47
- }
48
- // Relative: reject .. segments
49
- const parts = [];
50
- for (const seg of rel.split("/")) {
51
- if (!seg || seg === ".")
52
- continue;
53
- if (seg === "..") {
54
- throw new Error(`[SANDBOX_FS] Path traversal denied: "${userPath}"`);
55
- }
56
- parts.push(seg);
57
- }
58
- if (parts.length === 0) {
59
- throw new Error("[SANDBOX_FS] Path resolves to project root; refuse write");
60
- }
61
- return parts.join("/");
62
- }
63
- function createLock(projectRoot) {
64
- return new AtomicFileLock({
65
- projectRoot,
66
- locksDir: path.join(projectRoot, ".atabey", "locks"),
67
- ttlMs: 5 * 60 * 1000,
68
- timeoutMs: 15_000,
69
- });
70
- }
71
- function hostWriteAtomic(absolutePath, content) {
72
- const dir = path.dirname(absolutePath);
73
- if (!fs.existsSync(dir)) {
74
- fs.mkdirSync(dir, { recursive: true });
75
- }
76
- // Write exact bytes (callers decide trailing newline — patch/replace need fidelity)
77
- const tempPath = `${absolutePath}.${crypto.randomBytes(6).toString("hex")}.tmp`;
78
- try {
79
- fs.writeFileSync(tempPath, content, "utf8");
80
- fs.renameSync(tempPath, absolutePath);
81
- }
82
- catch (err) {
83
- try {
84
- if (fs.existsSync(tempPath))
85
- fs.unlinkSync(tempPath);
86
- }
87
- catch { /* ignore */ }
88
- throw err;
89
- }
90
- }
91
- /**
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.
112
- */
113
- export async function writeFileInSandbox(projectRoot, userPath, content, options) {
114
- const root = path.resolve(projectRoot);
115
- const relativePath = assertSafeRelativePath(userPath, root);
116
- const absolutePath = path.resolve(root, relativePath);
117
- if (!absolutePath.startsWith(root + path.sep) && absolutePath !== root) {
118
- throw new Error(`[SANDBOX_FS] Resolved path escapes project root: "${userPath}"`);
119
- }
120
- assertRealPathInsideRoot(absolutePath, root);
121
- const cfg = resolveSandboxRuntimeConfig(root, options?.timeoutMs);
122
- if (cfg.required && cfg.effectiveMode === "none") {
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.");
125
- }
126
- const owner = options?.ownerId || process.env.ATABEY_ACTIVE_AGENT || "mcp-writer";
127
- const lock = createLock(root);
128
- return lock.withLock(relativePath, owner, async () => {
129
- hostWriteAtomic(absolutePath, content);
130
- return {
131
- absolutePath,
132
- relativePath,
133
- runtime: cfg.effectiveMode,
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)",
139
- bytes: Buffer.byteLength(content, "utf8"),
140
- };
141
- });
142
- }
1
+ export * from "./modules/sandbox/sandbox-fs.js";
143
2
  //# sourceMappingURL=sandbox-fs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sandbox-fs.js","sourceRoot":"","sources":["../../../../shared/src/sandbox-fs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sandbox-fs.js","sourceRoot":"","sources":["../../../../shared/src/sandbox-fs.ts"],"names":[],"mappings":"AAAA,cAAc,iCAAiC,CAAC"}
@@ -1,78 +1 @@
1
- /**
2
- * Sandbox Runtime — Pure local OS process isolation for agent commands (Zero Docker/Container).
3
- *
4
- * Modes (ATABEY_SANDBOX_RUNTIME):
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
10
- *
11
- * Hardening:
12
- * ATABEY_SANDBOX_REQUIRED=true → deny execution when isolation is effectively "none"
13
- * ATABEY_SANDBOX_NETWORK=none → deny outbound/inbound network inside seatbelt (default: none)
14
- */
15
- import { resolveSandboxIdentity } from "./sandbox.js";
16
- export type SandboxRuntimeMode = "none" | "uid" | "seatbelt" | "auto";
17
- export type SandboxEngine = "seatbelt" | "none";
18
- export interface SandboxRuntimeConfig {
19
- mode: SandboxRuntimeMode;
20
- /** Resolved effective mode after auto detection. */
21
- effectiveMode: "none" | "uid" | "seatbelt";
22
- engine: SandboxEngine;
23
- network: string;
24
- required: boolean;
25
- projectRoot: string;
26
- timeoutMs: number;
27
- }
28
- export interface RunInSandboxRequest {
29
- command: string;
30
- args: string[];
31
- projectRoot: string;
32
- timeoutMs?: number;
33
- env?: NodeJS.ProcessEnv;
34
- /** Optional stdin payload. */
35
- stdin?: string | Buffer;
36
- }
37
- export interface RunInSandboxResult {
38
- code: number | null;
39
- stdout: string;
40
- stderr: string;
41
- runtime: SandboxRuntimeConfig["effectiveMode"];
42
- engine: SandboxEngine;
43
- /** Human-readable isolation description for logs/errors. */
44
- isolationLabel: string;
45
- }
46
- export declare class SandboxRequiredError extends Error {
47
- constructor(message: string);
48
- }
49
- export declare const SEATBELT_BINARY = "/usr/bin/sandbox-exec";
50
- export declare function resolveDefaultSandboxRequired(_mode?: SandboxRuntimeMode): boolean;
51
- /**
52
- * Detect available native OS sandbox engine (cached).
53
- */
54
- export declare function detectOsSandboxEngine(): SandboxEngine;
55
- /** Test helper */
56
- export declare function clearSandboxRuntimeCache(): void;
57
- /**
58
- * Resolve full runtime configuration for a project.
59
- */
60
- export declare function resolveSandboxRuntimeConfig(projectRoot: string, timeoutMs?: number): SandboxRuntimeConfig;
61
- /**
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"`.
65
- */
66
- export declare function buildSeatbeltArgs(cfg: SandboxRuntimeConfig, command: string, args: string[]): string[];
67
- /**
68
- * Run a command under the configured local OS sandbox runtime.
69
- */
70
- export declare function runInSandbox(req: RunInSandboxRequest): Promise<RunInSandboxResult>;
71
- /**
72
- * Diagnostic snapshot for CLI.
73
- */
74
- export declare function getSandboxRuntimeStatus(projectRoot?: string): {
75
- config: SandboxRuntimeConfig;
76
- isolationLabel: string;
77
- identity: ReturnType<typeof resolveSandboxIdentity>;
78
- };
1
+ export * from "./modules/sandbox/sandbox-runtime.js";
@@ -1,282 +1,2 @@
1
- /**
2
- * Sandbox Runtime — Pure local OS process isolation for agent commands (Zero Docker/Container).
3
- *
4
- * Modes (ATABEY_SANDBOX_RUNTIME):
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
10
- *
11
- * Hardening:
12
- * ATABEY_SANDBOX_REQUIRED=true → deny execution when isolation is effectively "none"
13
- * ATABEY_SANDBOX_NETWORK=none → deny outbound/inbound network inside seatbelt (default: none)
14
- */
15
- import { spawn, execFileSync } from "child_process";
16
- import fs from "fs";
17
- import path from "path";
18
- import { applySandboxToSpawnOptions, resolveSandboxIdentity, sandboxSpawn, } from "./sandbox.js";
19
- import { scrubEnvForSubprocess } from "./secrets.js";
20
- export class SandboxRequiredError extends Error {
21
- constructor(message) {
22
- super(message);
23
- this.name = "SandboxRequiredError";
24
- }
25
- }
26
- export const SEATBELT_BINARY = "/usr/bin/sandbox-exec";
27
- let cachedEngine = null;
28
- function envStr(key, fallback) {
29
- const v = process.env[key];
30
- return v && v.trim() ? v.trim() : fallback;
31
- }
32
- function envBool(key, fallback = false) {
33
- const v = process.env[key];
34
- if (v === undefined)
35
- return fallback;
36
- return v === "true" || v === "1" || v === "yes";
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
- }
61
- /**
62
- * Detect available native OS sandbox engine (cached).
63
- */
64
- export function detectOsSandboxEngine() {
65
- if (cachedEngine)
66
- return cachedEngine;
67
- const prefer = envStr("ATABEY_SANDBOX_ENGINE", "auto").toLowerCase();
68
- if (prefer === "none") {
69
- cachedEngine = "none";
70
- return cachedEngine;
71
- }
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";
79
- return cachedEngine;
80
- }
81
- catch {
82
- cachedEngine = "none";
83
- return cachedEngine;
84
- }
85
- }
86
- /** Test helper */
87
- export function clearSandboxRuntimeCache() {
88
- cachedEngine = null;
89
- }
90
- /**
91
- * Resolve full runtime configuration for a project.
92
- */
93
- export function resolveSandboxRuntimeConfig(projectRoot, timeoutMs) {
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();
99
- const identity = resolveSandboxIdentity();
100
- const required = resolveDefaultSandboxRequired(mode);
101
- let effectiveMode;
102
- if (mode === "none") {
103
- effectiveMode = "none";
104
- }
105
- else if (mode === "uid") {
106
- effectiveMode = identity.enabled ? "uid" : "none";
107
- }
108
- else if (mode === "seatbelt") {
109
- effectiveMode = engine === "seatbelt" ? "seatbelt" : "none";
110
- }
111
- else {
112
- // auto: prefer native OS seatbelt, then uid drop, else none
113
- if (engine === "seatbelt")
114
- effectiveMode = "seatbelt";
115
- else if (identity.enabled)
116
- effectiveMode = "uid";
117
- else
118
- effectiveMode = "none";
119
- }
120
- return {
121
- mode,
122
- effectiveMode,
123
- engine: effectiveMode === "seatbelt" ? "seatbelt" : "none",
124
- network: envStr("ATABEY_SANDBOX_NETWORK", "none"),
125
- required,
126
- projectRoot: path.resolve(projectRoot),
127
- timeoutMs: timeoutMs ?? parseInt(process.env.MCP_COMMAND_TIMEOUT_MS || "30000", 10),
128
- };
129
- }
130
- function isolationLabel(cfg) {
131
- if (cfg.effectiveMode === "seatbelt") {
132
- return `os/seatbelt network=${cfg.network} root=${cfg.projectRoot}`;
133
- }
134
- if (cfg.effectiveMode === "uid") {
135
- const id = resolveSandboxIdentity();
136
- return `uid=${id.uid}${id.gid !== undefined ? ` gid=${id.gid}` : ""}`;
137
- }
138
- return "none (host process)";
139
- }
140
- function escapeSbplString(value) {
141
- return value.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
142
- }
143
- /**
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"`.
147
- */
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];
175
- }
176
- function collectOutput(child, stdin) {
177
- return new Promise((resolve) => {
178
- let stdout = "";
179
- let stderr = "";
180
- child.stdout?.on("data", (d) => { stdout += d.toString(); });
181
- child.stderr?.on("data", (d) => { stderr += d.toString(); });
182
- child.on("error", (err) => {
183
- stderr += err.message;
184
- resolve({ code: 1, stdout, stderr });
185
- });
186
- child.on("close", (code) => {
187
- resolve({ code, stdout, stderr });
188
- });
189
- if (stdin !== undefined && child.stdin) {
190
- child.stdin.end(stdin);
191
- }
192
- else if (child.stdin) {
193
- child.stdin.end();
194
- }
195
- });
196
- }
197
- /**
198
- * Run a command under the configured local OS sandbox runtime.
199
- */
200
- export async function runInSandbox(req) {
201
- const cfg = resolveSandboxRuntimeConfig(req.projectRoot, req.timeoutMs);
202
- const label = isolationLabel(cfg);
203
- if (cfg.required && cfg.effectiveMode === "none") {
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 " +
206
- "(ATABEY_SANDBOX_RUNTIME=uid), or set ATABEY_SANDBOX_REQUIRED=false for local dev.");
207
- }
208
- if (!fs.existsSync(cfg.projectRoot)) {
209
- throw new Error(`[SANDBOX] Project root does not exist: ${cfg.projectRoot}`);
210
- }
211
- const stdio = [
212
- req.stdin !== undefined ? "pipe" : "ignore",
213
- "pipe",
214
- "pipe",
215
- ];
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, {
239
- cwd: cfg.projectRoot,
240
- timeout: cfg.timeoutMs,
241
- shell: false,
242
- stdio,
243
- env: childEnv,
244
- });
245
- const result = await collectOutput(child, req.stdin);
246
- return {
247
- ...result,
248
- runtime: "seatbelt",
249
- engine: "seatbelt",
250
- isolationLabel: label,
251
- };
252
- }
253
- const spawnOpts = {
254
- cwd: cfg.projectRoot,
255
- timeout: cfg.timeoutMs,
256
- shell: false,
257
- stdio,
258
- env: childEnv,
259
- };
260
- const child = cfg.effectiveMode === "uid"
261
- ? sandboxSpawn(req.command, req.args, spawnOpts)
262
- : spawn(req.command, req.args, applySandboxToSpawnOptions({ ...spawnOpts, disableSandbox: true }));
263
- const result = await collectOutput(child, req.stdin);
264
- return {
265
- ...result,
266
- runtime: cfg.effectiveMode,
267
- engine: "none",
268
- isolationLabel: label,
269
- };
270
- }
271
- /**
272
- * Diagnostic snapshot for CLI.
273
- */
274
- export function getSandboxRuntimeStatus(projectRoot = process.cwd()) {
275
- const config = resolveSandboxRuntimeConfig(projectRoot);
276
- return {
277
- config,
278
- isolationLabel: isolationLabel(config),
279
- identity: resolveSandboxIdentity(),
280
- };
281
- }
1
+ export * from "./modules/sandbox/sandbox-runtime.js";
282
2
  //# sourceMappingURL=sandbox-runtime.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sandbox-runtime.js","sourceRoot":"","sources":["../../../../shared/src/sandbox-runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sandbox-runtime.js","sourceRoot":"","sources":["../../../../shared/src/sandbox-runtime.ts"],"names":[],"mappings":"AAAA,cAAc,sCAAsC,CAAC"}
@@ -1,54 +1 @@
1
- /**
2
- * OS-level subprocess isolation via uid/gid (no Docker required).
3
- *
4
- * On Unix, child_process.spawn accepts `uid` and `gid`. When configured,
5
- * agent-triggered shell commands run as a restricted system user so that
6
- * even a hallucinated destructive command hits EACCES / Permission Denied
7
- * on protected paths.
8
- *
9
- * Windows: uid/gid are ignored; isolation is a no-op (allow-list still applies).
10
- *
11
- * Configuration (any of):
12
- * ATABEY_SANDBOX_UID=501
13
- * ATABEY_SANDBOX_GID=20
14
- * ATABEY_SANDBOX_USER=atabey-sandbox (resolved via `id -u` / `id -g` when possible)
15
- * ATABEY_SANDBOX_ENABLED=true|false (default: true when uid/gid resolvable)
16
- */
17
- import { SpawnOptions, ChildProcess } from "child_process";
18
- export interface SandboxIdentity {
19
- uid?: number;
20
- gid?: number;
21
- user?: string;
22
- enabled: boolean;
23
- /** Why sandbox is off (for diagnostics). */
24
- reason?: string;
25
- }
26
- export interface SandboxSpawnOptions extends SpawnOptions {
27
- /** Force-disable sandbox for this call. */
28
- disableSandbox?: boolean;
29
- }
30
- /**
31
- * Resolve sandbox identity from env (cached).
32
- * Call `clearSandboxIdentityCache()` in tests after env changes.
33
- */
34
- export declare function resolveSandboxIdentity(): SandboxIdentity;
35
- export declare function clearSandboxIdentityCache(): void;
36
- /**
37
- * Build spawn options with uid/gid when sandbox is active.
38
- */
39
- export declare function applySandboxToSpawnOptions(options?: SandboxSpawnOptions): SpawnOptions;
40
- /**
41
- * spawn() wrapper that applies OS sandbox identity when configured.
42
- */
43
- export declare function sandboxSpawn(command: string, args: readonly string[], options?: SandboxSpawnOptions): ChildProcess;
44
- /**
45
- * Human-readable status for CLI diagnostics.
46
- */
47
- export declare function getSandboxStatus(): {
48
- platform: string;
49
- identity: SandboxIdentity;
50
- processUid: number | null;
51
- processGid: number | null;
52
- };
53
- /** Default restricted paths agents should not touch even with shell allow-list. */
54
- export declare const SANDBOX_PROTECTED_HINTS: readonly ["/etc", "/usr", "/bin", "/sbin", "/System", string];
1
+ export * from "./modules/sandbox/sandbox.js";