@zhivex-ai/sandbox-docker 0.0.1 → 0.2.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 (47) hide show
  1. package/README.md +89 -1
  2. package/dist/docker-client.d.ts +92 -0
  3. package/dist/docker-client.d.ts.map +1 -0
  4. package/dist/docker-client.js +464 -0
  5. package/dist/docker-client.js.map +1 -0
  6. package/dist/environment.d.ts +119 -0
  7. package/dist/environment.d.ts.map +1 -0
  8. package/dist/environment.js +1056 -0
  9. package/dist/environment.js.map +1 -0
  10. package/dist/errors.d.ts +7 -0
  11. package/dist/errors.d.ts.map +1 -0
  12. package/dist/errors.js +9 -0
  13. package/dist/errors.js.map +1 -0
  14. package/dist/index.d.ts +8 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +8 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/memory-docker-client.d.ts +13 -0
  19. package/dist/memory-docker-client.d.ts.map +1 -0
  20. package/dist/memory-docker-client.js +348 -0
  21. package/dist/memory-docker-client.js.map +1 -0
  22. package/dist/network.d.ts +43 -0
  23. package/dist/network.d.ts.map +1 -0
  24. package/dist/network.js +323 -0
  25. package/dist/network.js.map +1 -0
  26. package/dist/paths.d.ts +7 -0
  27. package/dist/paths.d.ts.map +1 -0
  28. package/dist/paths.js +58 -0
  29. package/dist/paths.js.map +1 -0
  30. package/dist/stores.d.ts +42 -0
  31. package/dist/stores.d.ts.map +1 -0
  32. package/dist/stores.js +396 -0
  33. package/dist/stores.js.map +1 -0
  34. package/dist/stream.d.ts +11 -0
  35. package/dist/stream.d.ts.map +1 -0
  36. package/dist/stream.js +75 -0
  37. package/dist/stream.js.map +1 -0
  38. package/dist/tar.d.ts +13 -0
  39. package/dist/tar.d.ts.map +1 -0
  40. package/dist/tar.js +230 -0
  41. package/dist/tar.js.map +1 -0
  42. package/dist/tools.d.ts +35 -0
  43. package/dist/tools.d.ts.map +1 -0
  44. package/dist/tools.js +90 -0
  45. package/dist/tools.js.map +1 -0
  46. package/docker/Dockerfile +11 -0
  47. package/package.json +46 -4
package/dist/tar.js ADDED
@@ -0,0 +1,230 @@
1
+ import { SandboxError } from "./errors.js";
2
+ const BLOCK = 512;
3
+ const MAX_PATH_BYTES = 4096;
4
+ const encoder = new TextEncoder();
5
+ const decoder = new TextDecoder();
6
+ const octal = (value, length) => {
7
+ const digits = Math.max(0, Math.floor(value)).toString(8).padStart(length - 1, "0").slice(-(length - 1));
8
+ return encoder.encode(`${digits}\0`);
9
+ };
10
+ const writeField = (header, offset, length, value) => {
11
+ const bytes = encoder.encode(value);
12
+ if (bytes.length > length) {
13
+ throw new SandboxError("TAR_PATH", `Tar field exceeds ${length} bytes.`);
14
+ }
15
+ header.set(bytes, offset);
16
+ };
17
+ const checksum = (header) => {
18
+ let sum = 0;
19
+ for (let index = 0; index < BLOCK; index += 1) {
20
+ sum += index >= 148 && index < 156 ? 32 : header[index] ?? 0;
21
+ }
22
+ return sum;
23
+ };
24
+ const pad = (bytes) => {
25
+ const extra = (BLOCK - (bytes.length % BLOCK)) % BLOCK;
26
+ if (extra === 0)
27
+ return bytes;
28
+ const out = new Uint8Array(bytes.length + extra);
29
+ out.set(bytes);
30
+ return out;
31
+ };
32
+ const finishHeader = (header) => {
33
+ const sum = checksum(header);
34
+ header.set(encoder.encode(`${sum.toString(8).padStart(6, "0")}\0 `), 148);
35
+ return header;
36
+ };
37
+ const headerShell = (name, size, typeFlag, prefix = "") => {
38
+ const header = new Uint8Array(BLOCK);
39
+ writeField(header, 0, 100, name);
40
+ header.set(octal(typeFlag === "5" ? 0o755 : 0o644, 8), 100);
41
+ header.set(octal(0, 8), 108);
42
+ header.set(octal(0, 8), 116);
43
+ header.set(octal(size, 12), 124);
44
+ header.set(octal(0, 12), 136);
45
+ header.set(encoder.encode(" "), 148);
46
+ header[156] = encoder.encode(typeFlag)[0] ?? 0;
47
+ writeField(header, 257, 6, "ustar");
48
+ header.set(encoder.encode("00"), 263);
49
+ if (prefix)
50
+ writeField(header, 345, 155, prefix);
51
+ return finishHeader(header);
52
+ };
53
+ const ustarSplit = (filePath) => {
54
+ if (encoder.encode(filePath).length <= 100)
55
+ return { name: filePath, prefix: "" };
56
+ let match;
57
+ for (let index = 0; index < filePath.length; index += 1) {
58
+ if (filePath[index] !== "/")
59
+ continue;
60
+ const prefix = filePath.slice(0, index);
61
+ const name = filePath.slice(index + 1);
62
+ if (!prefix || !name)
63
+ continue;
64
+ if (encoder.encode(prefix).length <= 155 && encoder.encode(name).length <= 100)
65
+ match = { name, prefix };
66
+ }
67
+ return match;
68
+ };
69
+ const shortName = (filePath) => {
70
+ const slash = filePath.lastIndexOf("/");
71
+ const base = slash === -1 ? filePath : filePath.slice(slash + 1);
72
+ return encoder.encode(base).length <= 100 ? base : "entry";
73
+ };
74
+ const paxPathRecord = (filePath) => {
75
+ const payload = encoder.encode(` path=${filePath}\n`);
76
+ let digits = 1;
77
+ let total = digits + payload.length;
78
+ while (String(total).length !== digits) {
79
+ digits = String(total).length;
80
+ total = digits + payload.length;
81
+ }
82
+ return encoder.encode(`${total} path=${filePath}\n`);
83
+ };
84
+ const paxBlocks = (filePath) => {
85
+ const content = paxPathRecord(filePath);
86
+ const label = `PaxHeaders.0/${shortName(filePath)}`;
87
+ const header = headerShell(encoder.encode(label).length <= 100 ? label : "PaxHeaders.0/entry", content.byteLength, "x");
88
+ return [header, pad(content)];
89
+ };
90
+ export const packTar = (entries) => {
91
+ const blocks = [];
92
+ for (const entry of entries) {
93
+ if (encoder.encode(entry.path).length > MAX_PATH_BYTES) {
94
+ throw new SandboxError("TAR_PATH", `Tar path exceeds ${MAX_PATH_BYTES} bytes.`);
95
+ }
96
+ if (entry.linkTarget && encoder.encode(entry.linkTarget).length > 100) {
97
+ throw new SandboxError("TAR_PATH", "Tar link target exceeds 100 bytes.");
98
+ }
99
+ const split = ustarSplit(entry.path);
100
+ if (!split)
101
+ blocks.push(...paxBlocks(entry.path));
102
+ const header = new Uint8Array(BLOCK);
103
+ const content = entry.type === "file" ? entry.content ?? new Uint8Array() : new Uint8Array();
104
+ writeField(header, 0, 100, split?.name ?? shortName(entry.path));
105
+ header.set(octal(entry.mode ?? (entry.type === "directory" ? 0o755 : 0o644), 8), 100);
106
+ header.set(octal(entry.uid ?? 65534, 8), 108);
107
+ header.set(octal(entry.gid ?? 65534, 8), 116);
108
+ header.set(octal(content.byteLength, 12), 124);
109
+ header.set(octal(0, 12), 136);
110
+ header.set(encoder.encode(" "), 148);
111
+ header[156] = encoder.encode(entry.type === "directory" ? "5" : entry.type === "symlink" ? "2" : "0")[0] ?? 0;
112
+ if (entry.linkTarget)
113
+ writeField(header, 157, 100, entry.linkTarget);
114
+ writeField(header, 257, 6, "ustar");
115
+ header.set(encoder.encode("00"), 263);
116
+ if (split?.prefix)
117
+ writeField(header, 345, 155, split.prefix);
118
+ blocks.push(finishHeader(header), pad(content));
119
+ }
120
+ blocks.push(new Uint8Array(BLOCK * 2));
121
+ const size = blocks.reduce((total, block) => total + block.length, 0);
122
+ const out = new Uint8Array(size);
123
+ let offset = 0;
124
+ for (const block of blocks) {
125
+ out.set(block, offset);
126
+ offset += block.length;
127
+ }
128
+ return out;
129
+ };
130
+ const fieldText = (header, offset, length) => {
131
+ const field = header.subarray(offset, offset + length);
132
+ const nul = field.indexOf(0);
133
+ return decoder.decode(nul === -1 ? field : field.subarray(0, nul));
134
+ };
135
+ const readOctal = (header, offset, length) => {
136
+ const text = fieldText(header, offset, length).trim();
137
+ if (!text)
138
+ return 0;
139
+ const value = Number.parseInt(text, 8);
140
+ if (!Number.isFinite(value)) {
141
+ throw new SandboxError("TAR_INVALID", "Tar header contains a non-octal numeric field.");
142
+ }
143
+ return value;
144
+ };
145
+ const readText = (header, offset, length) => fieldText(header, offset, length);
146
+ const isZero = (header) => header.every(byte => byte === 0);
147
+ const parsePax = (content) => {
148
+ const records = new Map();
149
+ let offset = 0;
150
+ while (offset < content.length) {
151
+ if (content[offset] === 0)
152
+ break;
153
+ const space = content.indexOf(0x20, offset);
154
+ if (space <= offset)
155
+ throw new SandboxError("TAR_INVALID", "Tar pax record is missing its length.");
156
+ let length = 0;
157
+ for (let index = offset; index < space; index += 1) {
158
+ const digit = content[index] ?? 0;
159
+ if (digit < 0x30 || digit > 0x39)
160
+ throw new SandboxError("TAR_INVALID", "Tar pax record length is not decimal.");
161
+ length = length * 10 + (digit - 0x30);
162
+ }
163
+ if (length < space - offset + 1 || offset + length > content.length) {
164
+ throw new SandboxError("TAR_INVALID", "Tar pax record length is invalid.");
165
+ }
166
+ const record = content.subarray(offset, offset + length);
167
+ const equals = record.indexOf(0x3d);
168
+ if (equals === -1)
169
+ throw new SandboxError("TAR_INVALID", "Tar pax record is missing a key.");
170
+ const key = decoder.decode(record.subarray(space - offset + 1, equals));
171
+ const end = record[record.length - 1] === 0x0a ? record.length - 1 : record.length;
172
+ records.set(key, decoder.decode(record.subarray(equals + 1, end)));
173
+ offset += length;
174
+ }
175
+ return records;
176
+ };
177
+ export const unpackTar = (bytes) => {
178
+ const entries = [];
179
+ let offset = 0;
180
+ let extendedPath;
181
+ while (offset + BLOCK <= bytes.length) {
182
+ const header = bytes.subarray(offset, offset + BLOCK);
183
+ offset += BLOCK;
184
+ if (isZero(header))
185
+ break;
186
+ const stored = readOctal(header, 148, 8);
187
+ if (stored !== checksum(header)) {
188
+ throw new SandboxError("TAR_INVALID", "Tar header checksum does not match.");
189
+ }
190
+ const typeFlag = String.fromCharCode(header[156] ?? 0);
191
+ const size = readOctal(header, 124, 12);
192
+ const content = bytes.subarray(offset, offset + size);
193
+ offset += Math.ceil(size / BLOCK) * BLOCK;
194
+ if (typeFlag === "x" || typeFlag === "g") {
195
+ const records = parsePax(content);
196
+ const extended = records.get("path");
197
+ if (extended !== undefined) {
198
+ if (encoder.encode(extended).length > MAX_PATH_BYTES) {
199
+ throw new SandboxError("TAR_PATH", `Tar path exceeds ${MAX_PATH_BYTES} bytes.`);
200
+ }
201
+ extendedPath = extended;
202
+ }
203
+ continue;
204
+ }
205
+ const name = readText(header, 0, 100);
206
+ const prefix = readText(header, 345, 155);
207
+ const path = extendedPath ?? (prefix ? `${prefix}/${name}` : name);
208
+ extendedPath = undefined;
209
+ const type = typeFlag === "5" ? "directory" : typeFlag === "2" ? "symlink" : "file";
210
+ entries.push({
211
+ path: path.endsWith("/") ? path.slice(0, -1) : path,
212
+ type,
213
+ content: type === "file" ? content : undefined,
214
+ linkTarget: type === "symlink" ? readText(header, 157, 100) : "",
215
+ mode: readOctal(header, 100, 8),
216
+ uid: readOctal(header, 108, 8),
217
+ gid: readOctal(header, 116, 8)
218
+ });
219
+ }
220
+ return entries;
221
+ };
222
+ export const stripTarRoot = (entries, rootName) => entries.flatMap(entry => {
223
+ if (entry.path === rootName)
224
+ return [];
225
+ const prefix = `${rootName}/`;
226
+ if (!entry.path.startsWith(prefix))
227
+ return [entry];
228
+ return [{ ...entry, path: entry.path.slice(prefix.length) }];
229
+ });
230
+ //# sourceMappingURL=tar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tar.js","sourceRoot":"","sources":["../src/tar.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { z } from "zod";
2
+ /** Filesystem and shell tools that execute only inside the acquired Docker session. */
3
+ export declare const createDockerSandboxTools: () => {
4
+ sandbox_read_file: import("@zhivex-ai/core").ToolDefinition<z.ZodObject<{
5
+ path: z.ZodString;
6
+ }, z.core.$strip>, {
7
+ path: string;
8
+ encoding: string;
9
+ text: string;
10
+ }, unknown>;
11
+ sandbox_write_file: import("@zhivex-ai/core").ToolDefinition<z.ZodObject<{
12
+ path: z.ZodString;
13
+ contents: z.ZodString;
14
+ }, z.core.$strip>, {
15
+ path: string;
16
+ bytes: number;
17
+ }, unknown>;
18
+ sandbox_list: import("@zhivex-ai/core").ToolDefinition<z.ZodObject<{
19
+ path: z.ZodOptional<z.ZodString>;
20
+ }, z.core.$strip>, {
21
+ path: string;
22
+ entries: string[];
23
+ }, unknown>;
24
+ sandbox_exec: import("@zhivex-ai/core").ToolDefinition<z.ZodObject<{
25
+ argv: z.ZodArray<z.ZodString>;
26
+ timeoutMs: z.ZodOptional<z.ZodNumber>;
27
+ }, z.core.$strip>, {
28
+ exitCode: number;
29
+ stdout: string;
30
+ stderr: string;
31
+ truncated: boolean;
32
+ timedOut: boolean;
33
+ }, unknown>;
34
+ };
35
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAkBxB,uFAAuF;AACvF,eAAO,MAAM,wBAAwB;IACnC,iBAAiB;;;;;;;IAejB,kBAAkB;;;;;;;IAgBlB,YAAY;;;;;;IAeZ,YAAY;;;;;;;;;;CAyBZ,CAAC"}
package/dist/tools.js ADDED
@@ -0,0 +1,90 @@
1
+ import { tool } from "@zhivex-ai/core";
2
+ import { z } from "zod";
3
+ import { SandboxError } from "./errors.js";
4
+ import { isDockerSandboxSession } from "./environment.js";
5
+ const sessionFrom = (context) => {
6
+ if (!isDockerSandboxSession(context?.executionEnvironment)) {
7
+ throw new SandboxError("SESSION_REQUIRED", "Sandbox tools require an acquired Docker execution environment.");
8
+ }
9
+ return context.executionEnvironment;
10
+ };
11
+ const approval = {
12
+ requiresApproval: true,
13
+ approvalMode: "interrupt",
14
+ approvalVersion: "docker-sandbox-1"
15
+ };
16
+ /** Filesystem and shell tools that execute only inside the acquired Docker session. */
17
+ export const createDockerSandboxTools = () => ({
18
+ sandbox_read_file: tool({
19
+ name: "sandbox_read_file",
20
+ description: "Read a UTF-8 file inside the sandbox workspace.",
21
+ schema: z.object({ path: z.string().min(1) }),
22
+ metadata: {
23
+ advancedRegistry: {
24
+ permissions: ["filesystem"],
25
+ audit: { riskLevel: "low" }
26
+ }
27
+ },
28
+ execute: async ({ path }, context) => {
29
+ const bytes = await sessionFrom(context).readFile(path);
30
+ return { path, encoding: "utf-8", text: new TextDecoder("utf-8", { fatal: false }).decode(bytes) };
31
+ }
32
+ }),
33
+ sandbox_write_file: tool({
34
+ name: "sandbox_write_file",
35
+ description: "Write a UTF-8 file inside the sandbox workspace.",
36
+ schema: z.object({ path: z.string().min(1), contents: z.string() }),
37
+ ...approval,
38
+ metadata: {
39
+ advancedRegistry: {
40
+ permissions: ["filesystem", "write"],
41
+ audit: { riskLevel: "high" }
42
+ }
43
+ },
44
+ execute: async ({ path, contents }, context) => {
45
+ await sessionFrom(context).writeFile(path, contents);
46
+ return { path, bytes: new TextEncoder().encode(contents).byteLength };
47
+ }
48
+ }),
49
+ sandbox_list: tool({
50
+ name: "sandbox_list",
51
+ description: "List one directory level inside the sandbox workspace.",
52
+ schema: z.object({ path: z.string().min(1).optional() }),
53
+ metadata: {
54
+ advancedRegistry: {
55
+ permissions: ["filesystem"],
56
+ audit: { riskLevel: "low" }
57
+ }
58
+ },
59
+ execute: async ({ path }, context) => ({
60
+ path: path ?? ".",
61
+ entries: await sessionFrom(context).list(path ?? ".")
62
+ })
63
+ }),
64
+ sandbox_exec: tool({
65
+ name: "sandbox_exec",
66
+ description: "Run an argv command inside the sandbox. There is no host shell and no inherited process environment.",
67
+ schema: z.object({
68
+ argv: z.array(z.string().min(1)).min(1).max(64),
69
+ timeoutMs: z.number().int().positive().optional()
70
+ }),
71
+ ...approval,
72
+ metadata: {
73
+ advancedRegistry: {
74
+ permissions: ["shell", "code-execution"],
75
+ audit: { riskLevel: "high" }
76
+ }
77
+ },
78
+ execute: async ({ argv, timeoutMs }, context) => {
79
+ const result = await sessionFrom(context).exec(argv, timeoutMs === undefined ? undefined : { timeoutMs });
80
+ return {
81
+ exitCode: result.exitCode,
82
+ stdout: result.stdout,
83
+ stderr: result.stderr,
84
+ truncated: result.truncated,
85
+ timedOut: result.timedOut
86
+ };
87
+ }
88
+ })
89
+ });
90
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ # Optional image for createDockerSandboxEnvironment({ image, user: "1000:1000" }).
2
+ # The default configuration uses the public alpine:3.21 image and user 65534:65534.
3
+ FROM alpine:3.21
4
+
5
+ RUN adduser -D -u 1000 -h /tmp sandbox \
6
+ && mkdir -p /workspace \
7
+ && chown 1000:1000 /workspace
8
+
9
+ USER 1000:1000
10
+ WORKDIR /workspace
11
+ CMD ["/bin/sh", "-c", "while true; do sleep 3600; done"]
package/package.json CHANGED
@@ -1,7 +1,49 @@
1
1
  {
2
2
  "name": "@zhivex-ai/sandbox-docker",
3
- "version": "0.0.1",
4
- "description": "Placeholder. Real releases are published from github.com/Zhivex/zhivex-ai-sdk via trusted publishing.",
5
- "license": "Apache-2.0",
6
- "repository": {"type": "git", "url": "git+https://github.com/Zhivex/zhivex-ai-sdk.git", "directory": "packages/sandbox-docker"}
3
+ "version": "0.2.0",
4
+ "description": "Reference Docker execution environment for Zhivex workspace agents.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "engines": {
10
+ "node": ">=18.18.0",
11
+ "bun": ">=1.3.7"
12
+ },
13
+ "exports": {
14
+ ".": {
15
+ "types": "./dist/index.d.ts",
16
+ "import": "./dist/index.js"
17
+ }
18
+ },
19
+ "files": [
20
+ "dist",
21
+ "docker",
22
+ "README.md"
23
+ ],
24
+ "sideEffects": false,
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "git+https://github.com/Zhivex/zhivex-ai-sdk.git",
28
+ "directory": "packages/sandbox-docker"
29
+ },
30
+ "homepage": "https://github.com/Zhivex/zhivex-ai-sdk#readme",
31
+ "bugs": {
32
+ "url": "https://github.com/Zhivex/zhivex-ai-sdk/issues"
33
+ },
34
+ "keywords": [
35
+ "ai",
36
+ "sdk",
37
+ "sandbox",
38
+ "docker",
39
+ "agents",
40
+ "typescript"
41
+ ],
42
+ "publishConfig": {
43
+ "access": "public"
44
+ },
45
+ "dependencies": {
46
+ "@zhivex-ai/core": "^1.35.0",
47
+ "zod": "^4.6.3"
48
+ }
7
49
  }