@torkbot/sandbox 0.1.0-pre.0 → 0.1.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.
@@ -0,0 +1,192 @@
1
+ import { decodeControlEvent, encodeControlCommand, } from "./control-codec.js";
2
+ export class HostControlTransport {
3
+ incoming;
4
+ #events;
5
+ #connected;
6
+ #channel;
7
+ #pendingExec = new Map();
8
+ #closed = false;
9
+ constructor(options = {}) {
10
+ this.#channel = options.channel ?? null;
11
+ this.#connected = options.connected ?? true;
12
+ this.#events = new AsyncQueue();
13
+ this.incoming = this.#connected
14
+ ? this.#events
15
+ : {
16
+ async *[Symbol.asyncIterator]() {
17
+ throw new Error("sandbox control plane is not connected yet");
18
+ },
19
+ };
20
+ if (this.#channel !== null && this.#connected) {
21
+ void this.#pumpIncoming();
22
+ }
23
+ }
24
+ async send(message) {
25
+ this.#assertOpen();
26
+ if (this.#channel === null) {
27
+ throw new Error("sandbox control send is not connected yet");
28
+ }
29
+ this.#channel.writeControlPacket(encodeControlCommand(message));
30
+ }
31
+ async exec(input) {
32
+ this.#assertOpen();
33
+ const id = input.id ?? crypto.randomUUID();
34
+ if (this.#pendingExec.has(id)) {
35
+ throw new Error(`sandbox exec id is already in flight: ${id}`);
36
+ }
37
+ const completion = new Promise((resolve, reject) => {
38
+ this.#pendingExec.set(id, { resolve, reject });
39
+ });
40
+ try {
41
+ await this.send({
42
+ type: "guest.exec",
43
+ id,
44
+ argv: input.argv,
45
+ env: input.env,
46
+ });
47
+ }
48
+ catch (error) {
49
+ this.#pendingExec.delete(id);
50
+ throw error;
51
+ }
52
+ return await completion;
53
+ }
54
+ async close() {
55
+ if (this.#closed) {
56
+ return;
57
+ }
58
+ this.#closed = true;
59
+ this.#rejectPendingExec(new Error("sandbox control is closed"));
60
+ this.#events.close();
61
+ }
62
+ emit(event) {
63
+ this.#assertOpen();
64
+ this.#dispatchEvent(event);
65
+ }
66
+ #assertOpen() {
67
+ if (this.#closed) {
68
+ throw new Error("sandbox control is closed");
69
+ }
70
+ if (!this.#connected) {
71
+ throw new Error("sandbox control plane is not connected yet");
72
+ }
73
+ }
74
+ async #pumpIncoming() {
75
+ while (!this.#closed && this.#channel !== null) {
76
+ let packet;
77
+ try {
78
+ packet = this.#channel.tryReadControlPacket();
79
+ }
80
+ catch (error) {
81
+ if (this.#closed) {
82
+ return;
83
+ }
84
+ this.#fail(error);
85
+ return;
86
+ }
87
+ if (packet !== null) {
88
+ if (this.#closed) {
89
+ return;
90
+ }
91
+ let event;
92
+ try {
93
+ event = decodeControlEvent(packet);
94
+ }
95
+ catch (error) {
96
+ this.#fail(error);
97
+ return;
98
+ }
99
+ this.#dispatchEvent(event);
100
+ continue;
101
+ }
102
+ await sleep(10);
103
+ }
104
+ }
105
+ #dispatchEvent(event) {
106
+ this.#events.push(event);
107
+ if (event.type !== "guest.exec.complete") {
108
+ return;
109
+ }
110
+ const pending = this.#pendingExec.get(event.id);
111
+ if (pending === undefined) {
112
+ return;
113
+ }
114
+ this.#pendingExec.delete(event.id);
115
+ pending.resolve(event);
116
+ }
117
+ #fail(error) {
118
+ if (this.#closed) {
119
+ return;
120
+ }
121
+ this.#closed = true;
122
+ this.#rejectPendingExec(error);
123
+ this.#events.close(error);
124
+ }
125
+ #rejectPendingExec(error) {
126
+ for (const pending of this.#pendingExec.values()) {
127
+ pending.reject(error);
128
+ }
129
+ this.#pendingExec.clear();
130
+ }
131
+ }
132
+ function sleep(ms) {
133
+ return new Promise((resolve) => {
134
+ const timeout = setTimeout(resolve, ms);
135
+ timeout.unref();
136
+ });
137
+ }
138
+ class AsyncQueue {
139
+ #values = [];
140
+ #waiters = [];
141
+ #closed = false;
142
+ #error;
143
+ push(value) {
144
+ if (this.#closed) {
145
+ throw new Error("async queue is closed");
146
+ }
147
+ const waiter = this.#waiters.shift();
148
+ if (waiter !== undefined) {
149
+ waiter.resolve({ value, done: false });
150
+ return;
151
+ }
152
+ this.#values.push(value);
153
+ }
154
+ close(error) {
155
+ if (this.#closed) {
156
+ return;
157
+ }
158
+ this.#closed = true;
159
+ this.#error = error;
160
+ for (const waiter of this.#waiters.splice(0)) {
161
+ if (error === undefined) {
162
+ waiter.resolve({ value: undefined, done: true });
163
+ }
164
+ else {
165
+ waiter.reject(error);
166
+ }
167
+ }
168
+ }
169
+ [Symbol.asyncIterator]() {
170
+ return {
171
+ next: async () => {
172
+ const value = this.#values.shift();
173
+ if (value !== undefined) {
174
+ return { value, done: false };
175
+ }
176
+ if (this.#closed) {
177
+ if (this.#error !== undefined) {
178
+ throw this.#error;
179
+ }
180
+ return { value: undefined, done: true };
181
+ }
182
+ return await new Promise((resolve, reject) => {
183
+ this.#waiters.push({
184
+ resolve,
185
+ reject,
186
+ });
187
+ });
188
+ },
189
+ };
190
+ }
191
+ }
192
+ //# sourceMappingURL=control.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control.js","sourceRoot":"","sources":["../src/control.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAO5B,MAAM,OAAO,oBAAoB;IACtB,QAAQ,CAAqC;IAE7C,OAAO,CAAkC;IACzC,UAAU,CAAU;IACpB,QAAQ,CAA4B;IACpC,YAAY,GAAG,IAAI,GAAG,EAG3B,CAAC;IACL,OAAO,GAAG,KAAK,CAAC;IAEhB,YAAY,OAAO,GAGf,EAAE;QACJ,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC;QACxC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;QAC5C,IAAI,CAAC,OAAO,GAAG,IAAI,UAAU,EAAE,CAAC;QAChC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU;YAC7B,CAAC,CAAC,IAAI,CAAC,OAAO;YACd,CAAC,CAAC;gBACE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;oBAC3B,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;gBAChE,CAAC;aACF,CAAC;QAEN,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAC9C,KAAK,IAAI,CAAC,aAAa,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAA8B;QACvC,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAIV;QACC,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QAC3C,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,yCAAyC,EAAE,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,MAAM,UAAU,GAAG,IAAI,OAAO,CAAgE,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAChH,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QACH,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,CAAC;gBACd,IAAI,EAAE,YAAY;gBAClB,EAAE;gBACF,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,GAAG,EAAE,KAAK,CAAC,GAAG;aACf,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC7B,MAAM,KAAK,CAAC;QACd,CAAC;QACD,OAAO,MAAM,UAAU,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,kBAAkB,CAAC,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC;QAChE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAED,IAAI,CAAC,KAA0B;QAC7B,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,WAAW;QACT,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,OAAO,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YAC/C,IAAI,MAAyB,CAAC;YAC9B,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,oBAAoB,EAAE,CAAC;YAChD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBACjB,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAClB,OAAO;YACT,CAAC;YACD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACpB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBACjB,OAAO;gBACT,CAAC;gBACD,IAAI,KAA0B,CAAC;gBAC/B,IAAI,CAAC;oBACH,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;gBACrC,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBAClB,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;gBAC3B,SAAS;YACX,CAAC;YAED,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,cAAc,CAAC,KAA0B;QACvC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,IAAI,KAAK,CAAC,IAAI,KAAK,qBAAqB,EAAE,CAAC;YACzC,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAChD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO;QACT,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACnC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,KAAc;QAClB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED,kBAAkB,CAAC,KAAc;QAC/B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC;YACjD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;QACD,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;CACF;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACxC,OAAO,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU;IACL,OAAO,GAAQ,EAAE,CAAC;IAClB,QAAQ,GAGZ,EAAE,CAAC;IACR,OAAO,GAAG,KAAK,CAAC;IAChB,MAAM,CAAU;IAEhB,IAAI,CAAC,KAAQ;QACX,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACrC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACvC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,KAAe;QACnB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,MAAM,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACnD,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IAED,CAAC,MAAM,CAAC,aAAa,CAAC;QACpB,OAAO;YACL,IAAI,EAAE,KAAK,IAAI,EAAE;gBACf,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACnC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;oBACxB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;gBAChC,CAAC;gBAED,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBACjB,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;wBAC9B,MAAM,IAAI,CAAC,MAAM,CAAC;oBACpB,CAAC;oBACD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBAC1C,CAAC;gBAED,OAAO,MAAM,IAAI,OAAO,CAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;oBAC9D,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;wBACjB,OAAO;wBACP,MAAM;qBACP,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;YACL,CAAC;SACF,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ import type { SandboxFileSystem, SandboxHostFileSystemTools } from "./index.ts";
2
+ export declare function createSandboxHostFileSystemTools(fileSystem: SandboxFileSystem): SandboxHostFileSystemTools;
3
+ //# sourceMappingURL=host-filesystem-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-filesystem-tools.d.ts","sourceRoot":"","sources":["../src/host-filesystem-tools.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAEV,iBAAiB,EAEjB,0BAA0B,EAK3B,MAAM,YAAY,CAAC;AAEpB,wBAAgB,gCAAgC,CAC9C,UAAU,EAAE,iBAAiB,GAC5B,0BAA0B,CAE5B"}
@@ -0,0 +1,330 @@
1
+ import { posix } from "node:path";
2
+ import { Bash, } from "just-bash";
3
+ import { isSandboxWritableFileSystem } from "./vfs.js";
4
+ export function createSandboxHostFileSystemTools(fileSystem) {
5
+ return new MountedHostFileSystemTools(fileSystem);
6
+ }
7
+ class MountedHostFileSystemTools {
8
+ #fileSystem;
9
+ constructor(fileSystem) {
10
+ this.#fileSystem = fileSystem;
11
+ }
12
+ async read(input) {
13
+ const path = normalizeMountedPath(input.path);
14
+ const content = await this.#readWholeText(path, input.signal);
15
+ const lines = content.split("\n");
16
+ const startLine = Math.max(1, input.offset ?? 1);
17
+ const limit = Math.max(1, input.limit ?? 2_000);
18
+ const selected = lines.slice(startLine - 1, startLine - 1 + limit);
19
+ return {
20
+ path,
21
+ content: selected.join("\n"),
22
+ totalLines: lines.length,
23
+ truncated: startLine > 1 || selected.length < lines.length,
24
+ };
25
+ }
26
+ async write(input) {
27
+ const path = normalizeMountedPath(input.path);
28
+ const fileSystem = this.#assertWritable();
29
+ const contents = Buffer.from(input.content, "utf8");
30
+ try {
31
+ await this.#fileSystem.stat(path);
32
+ }
33
+ catch {
34
+ await fileSystem.createFile(path);
35
+ }
36
+ await fileSystem.truncate(path, 0);
37
+ const written = await fileSystem.write({
38
+ path,
39
+ offset: 0,
40
+ contents,
41
+ });
42
+ if (written !== contents.byteLength) {
43
+ throw new Error(`short host filesystem write to ${path}: ${written} of ${contents.byteLength} bytes`);
44
+ }
45
+ }
46
+ async patch(input) {
47
+ const path = normalizeMountedPath(input.path);
48
+ let content = (await this.read({
49
+ path,
50
+ signal: input.signal,
51
+ limit: Number.MAX_SAFE_INTEGER,
52
+ })).content;
53
+ for (const edit of input.edits) {
54
+ const first = content.indexOf(edit.oldText);
55
+ if (first === -1) {
56
+ throw new Error(`oldText not found in ${path}`);
57
+ }
58
+ if (content.indexOf(edit.oldText, first + edit.oldText.length) !== -1) {
59
+ throw new Error(`oldText is not unique in ${path}`);
60
+ }
61
+ content =
62
+ content.slice(0, first) +
63
+ edit.newText +
64
+ content.slice(first + edit.oldText.length);
65
+ }
66
+ await this.write({
67
+ path,
68
+ content,
69
+ signal: input.signal,
70
+ });
71
+ }
72
+ async bash(input) {
73
+ const abortController = new AbortController();
74
+ const timeout = input.timeoutMs === undefined
75
+ ? undefined
76
+ : setTimeout(() => {
77
+ abortController.abort(new Error(`bash timeout after ${input.timeoutMs}ms`));
78
+ }, input.timeoutMs);
79
+ const onAbort = () => {
80
+ abortController.abort(input.signal?.reason);
81
+ };
82
+ try {
83
+ if (input.signal?.aborted) {
84
+ abortController.abort(input.signal.reason);
85
+ }
86
+ else {
87
+ input.signal?.addEventListener("abort", onAbort, { once: true });
88
+ }
89
+ const bash = new Bash({
90
+ fs: new JustBashMountedFileSystem(this.#fileSystem),
91
+ cwd: "/",
92
+ env: {
93
+ HOME: "/",
94
+ PWD: "/",
95
+ },
96
+ });
97
+ const result = await bash.exec(input.command, {
98
+ cwd: "/",
99
+ signal: abortController.signal,
100
+ });
101
+ return {
102
+ stdout: result.stdout,
103
+ stderr: result.stderr,
104
+ exitCode: result.exitCode,
105
+ };
106
+ }
107
+ finally {
108
+ if (timeout !== undefined) {
109
+ clearTimeout(timeout);
110
+ }
111
+ input.signal?.removeEventListener("abort", onAbort);
112
+ }
113
+ }
114
+ async #readWholeText(path, signal) {
115
+ const stat = await this.#fileSystem.stat(path);
116
+ if (stat.type !== "file") {
117
+ throw new Error(`host filesystem path is not a file: ${path}`);
118
+ }
119
+ if (stat.sizeBytes === null) {
120
+ throw new Error(`host filesystem file has unknown size: ${path}`);
121
+ }
122
+ const bytes = await this.#fileSystem.read({
123
+ path,
124
+ range: {
125
+ offset: 0,
126
+ length: stat.sizeBytes,
127
+ },
128
+ signal: signal ?? AbortSignal.timeout(30_000),
129
+ });
130
+ return Buffer.from(bytes).toString("utf8");
131
+ }
132
+ #assertWritable() {
133
+ if (!isSandboxWritableFileSystem(this.#fileSystem)) {
134
+ throw new Error("host filesystem mount is read-only");
135
+ }
136
+ return this.#fileSystem;
137
+ }
138
+ }
139
+ function normalizeMountedPath(path) {
140
+ if (path.length === 0) {
141
+ throw new Error("host filesystem path must not be empty");
142
+ }
143
+ return path.startsWith("/") ? path : `/${path}`;
144
+ }
145
+ class JustBashMountedFileSystem {
146
+ #fileSystem;
147
+ constructor(fileSystem) {
148
+ this.#fileSystem = fileSystem;
149
+ }
150
+ async readFile(path) {
151
+ return Buffer.from(await this.readFileBuffer(path)).toString("utf8");
152
+ }
153
+ async readFileBuffer(path) {
154
+ const normalized = normalizeMountedPath(path);
155
+ const stat = await this.#fileSystem.stat(normalized);
156
+ if (stat.type !== "file") {
157
+ throw new Error(`not a file: ${path}`);
158
+ }
159
+ if (stat.sizeBytes === null) {
160
+ throw new Error(`file has unknown size: ${path}`);
161
+ }
162
+ return await this.#fileSystem.read({
163
+ path: normalized,
164
+ range: {
165
+ offset: 0,
166
+ length: stat.sizeBytes,
167
+ },
168
+ signal: AbortSignal.timeout(30_000),
169
+ });
170
+ }
171
+ async writeFile(path, content) {
172
+ const normalized = normalizeMountedPath(path);
173
+ const fileSystem = this.#assertWritable();
174
+ const bytes = typeof content === "string"
175
+ ? Buffer.from(content, "utf8")
176
+ : content;
177
+ try {
178
+ await this.#fileSystem.stat(normalized);
179
+ }
180
+ catch {
181
+ await fileSystem.createFile(normalized);
182
+ }
183
+ await fileSystem.truncate(normalized, 0);
184
+ const written = await fileSystem.write({
185
+ path: normalized,
186
+ offset: 0,
187
+ contents: bytes,
188
+ });
189
+ if (written !== bytes.byteLength) {
190
+ throw new Error(`short write to ${normalized}`);
191
+ }
192
+ }
193
+ async appendFile(path, content) {
194
+ const normalized = normalizeMountedPath(path);
195
+ const fileSystem = this.#assertWritable();
196
+ const bytes = typeof content === "string"
197
+ ? Buffer.from(content, "utf8")
198
+ : content;
199
+ let offset = 0;
200
+ try {
201
+ const stat = await this.#fileSystem.stat(normalized);
202
+ if (stat.type !== "file") {
203
+ throw new Error(`not a file: ${path}`);
204
+ }
205
+ offset = stat.sizeBytes ?? 0;
206
+ }
207
+ catch {
208
+ await fileSystem.createFile(normalized);
209
+ }
210
+ const written = await fileSystem.write({
211
+ path: normalized,
212
+ offset,
213
+ contents: bytes,
214
+ });
215
+ if (written !== bytes.byteLength) {
216
+ throw new Error(`short append to ${normalized}`);
217
+ }
218
+ }
219
+ async exists(path) {
220
+ try {
221
+ await this.#fileSystem.stat(normalizeMountedPath(path));
222
+ return true;
223
+ }
224
+ catch {
225
+ return false;
226
+ }
227
+ }
228
+ async stat(path) {
229
+ return toJustBashStat(await this.#fileSystem.stat(normalizeMountedPath(path)));
230
+ }
231
+ async mkdir(path, options) {
232
+ const normalized = normalizeMountedPath(path);
233
+ if (normalized === "/" || (options?.recursive === true && path === ".")) {
234
+ return;
235
+ }
236
+ const fileSystem = this.#assertPosix();
237
+ if (options?.recursive === true) {
238
+ let current = "";
239
+ for (const component of normalized.split("/").filter((part) => part.length > 0)) {
240
+ current = `${current}/${component}`;
241
+ let stat = null;
242
+ try {
243
+ stat = await this.#fileSystem.stat(current);
244
+ }
245
+ catch {
246
+ await fileSystem.mkdir(current);
247
+ continue;
248
+ }
249
+ if (stat.type !== "directory") {
250
+ throw new Error(`not a directory: ${current}`);
251
+ }
252
+ }
253
+ return;
254
+ }
255
+ await fileSystem.mkdir(normalized);
256
+ }
257
+ async readdir(path) {
258
+ return (await this.#fileSystem.list(normalizeMountedPath(path))).map((entry) => entry.name);
259
+ }
260
+ async readdirWithFileTypes(path) {
261
+ return (await this.#fileSystem.list(normalizeMountedPath(path))).map((entry) => ({
262
+ name: entry.name,
263
+ isFile: entry.type === "file",
264
+ isDirectory: entry.type === "directory",
265
+ isSymbolicLink: entry.type === "symlink",
266
+ }));
267
+ }
268
+ async rm(path, _options) {
269
+ throw new Error(`rm is not supported by this sandbox filesystem: ${path}`);
270
+ }
271
+ async cp(_src, _dest, _options) {
272
+ throw new Error("cp is not supported by this sandbox filesystem");
273
+ }
274
+ async mv(_src, _dest) {
275
+ throw new Error("mv is not supported by this sandbox filesystem");
276
+ }
277
+ resolvePath(base, path) {
278
+ return normalizeMountedPath(posix.resolve(base, path));
279
+ }
280
+ getAllPaths() {
281
+ return [];
282
+ }
283
+ async chmod(path, _mode) {
284
+ await this.#fileSystem.stat(normalizeMountedPath(path));
285
+ }
286
+ async symlink() {
287
+ throw new Error("symlink is not supported by this sandbox filesystem");
288
+ }
289
+ async link() {
290
+ throw new Error("link is not supported by this sandbox filesystem");
291
+ }
292
+ async readlink(path) {
293
+ throw new Error(`not a symbolic link: ${path}`);
294
+ }
295
+ async lstat(path) {
296
+ return await this.stat(path);
297
+ }
298
+ async realpath(path) {
299
+ const normalized = normalizeMountedPath(path);
300
+ await this.#fileSystem.stat(normalized);
301
+ return normalized;
302
+ }
303
+ async utimes(path) {
304
+ await this.#fileSystem.stat(normalizeMountedPath(path));
305
+ }
306
+ #assertWritable() {
307
+ if (!isSandboxWritableFileSystem(this.#fileSystem)) {
308
+ throw new Error("host filesystem mount is read-only");
309
+ }
310
+ return this.#fileSystem;
311
+ }
312
+ #assertPosix() {
313
+ const candidate = this.#assertWritable();
314
+ if (typeof candidate.mkdir !== "function") {
315
+ throw new Error("mkdir is not supported by this sandbox filesystem");
316
+ }
317
+ return candidate;
318
+ }
319
+ }
320
+ function toJustBashStat(stat) {
321
+ return {
322
+ isFile: stat.type === "file",
323
+ isDirectory: stat.type === "directory",
324
+ isSymbolicLink: false,
325
+ mode: stat.writable === true ? 0o666 : 0o444,
326
+ size: stat.sizeBytes ?? 0,
327
+ mtime: stat.modifiedAtMs === null ? new Date(0) : new Date(stat.modifiedAtMs),
328
+ };
329
+ }
330
+ //# sourceMappingURL=host-filesystem-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-filesystem-tools.js","sourceRoot":"","sources":["../src/host-filesystem-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { hostBinaryPath } from "./artifacts.ts";
2
+ import type { HostControlChannel } from "./control.ts";
3
+ import type { HostSpawnSandboxOptions } from "./spawn-options.ts";
4
+ import type { SandboxOptions, SandboxHttpRequestHook, SandboxHttpRequestSelector } from "./index.ts";
5
+ type RegisteredHttpRequestHeadersHook = {
6
+ readonly selector: SandboxHttpRequestSelector;
7
+ readonly hook: SandboxHttpRequestHook;
8
+ active: boolean;
9
+ };
10
+ export declare class HostProcessSandboxVm implements HostControlChannel {
11
+ #private;
12
+ readonly hasControlSocket = true;
13
+ private constructor();
14
+ static spawn(options: SandboxOptions, hostOptions: HostSpawnSandboxOptions, requestHeaderHooks?: Map<string, RegisteredHttpRequestHeadersHook>): Promise<HostProcessSandboxVm>;
15
+ writeControlPacket(packet: Uint8Array): void;
16
+ tryReadControlPacket(): Uint8Array | null;
17
+ close(): Promise<void>;
18
+ terminateHostForTest(): Promise<void>;
19
+ }
20
+ export { hostBinaryPath };
21
+ //# sourceMappingURL=host-process.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-process.d.ts","sourceRoot":"","sources":["../src/host-process.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAElE,OAAO,KAAK,EACV,cAAc,EAGd,sBAAsB,EACtB,0BAA0B,EAC3B,MAAM,YAAY,CAAC;AAEpB,KAAK,gCAAgC,GAAG;IACtC,QAAQ,CAAC,QAAQ,EAAE,0BAA0B,CAAC;IAC9C,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;IACtC,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,qBAAa,oBAAqB,YAAW,kBAAkB;;IAC7D,QAAQ,CAAC,gBAAgB,QAAQ;IAcjC,OAAO,eAyCN;IAED,OAAa,KAAK,CAChB,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE,uBAAuB,EACpC,kBAAkB,GAAE,GAAG,CAAC,MAAM,EAAE,gCAAgC,CAAa,GAC5E,OAAO,CAAC,oBAAoB,CAAC,CAoB/B;IAED,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAG3C;IAED,oBAAoB,IAAI,UAAU,GAAG,IAAI,CAGxC;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CA0B3B;IAEK,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiB1C;CAiXF;AAED,OAAO,EAAE,cAAc,EAAE,CAAC"}