@inquir/compute 0.4.4 → 0.4.5

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,359 @@
1
+ /**
2
+ * `client.sandboxes`: isolated, short-lived Linux environments for agents,
3
+ * builds and untrusted code (docs/roadmap/SANDBOXES.md §5, §6.3).
4
+ *
5
+ * The spec is the one `SandboxSpec` every surface speaks (REST body, CLI
6
+ * flags, MCP tool input, dashboard form): no SDK-only shape. Every call maps
7
+ * onto one /v1/sandboxes endpoint:
8
+ *
9
+ * create POST /v1/sandboxes (?wait=running, Idempotency-Key)
10
+ * list GET /v1/sandboxes (?status=all, ?limit, ?cursor)
11
+ * get GET /v1/sandboxes/:id
12
+ * exec POST /v1/sandboxes/:id/exec (NDJSON stream: start, stdout/stderr, exit | error)
13
+ * files.* PUT/GET /v1/sandboxes/:id/files?path= (a file, or a directory as tar)
14
+ * keepAlive POST /v1/sandboxes/:id/keepalive
15
+ * destroy DELETE /v1/sandboxes/:id
16
+ *
17
+ * `create` and `get` return a {@link Sandbox} handle bound to one sandbox;
18
+ * with `await using` it is destroyed when the block exits.
19
+ */
20
+ import { ApiError, authHeaders, toApiError } from './transport.js';
21
+ /** S/M/L, the same presets as `inquir sandbox create --size` and the dashboard form. */
22
+ export const SANDBOX_SIZES = Object.freeze({
23
+ s: { vcpu: 0.5, memoryMb: 512, diskGb: 2 },
24
+ m: { vcpu: 1, memoryMb: 1_024, diskGb: 5 },
25
+ l: { vcpu: 2, memoryMb: 4_096, diskGb: 10 },
26
+ });
27
+ export const LIVE_SANDBOX_STATUSES = ['PENDING', 'STARTING', 'RUNNING', 'STOPPING'];
28
+ /* ------------------------------------------------------------- transport */
29
+ const DEFAULT_MAX_BUFFERED_BYTES = 16 * 1024 * 1024;
30
+ function sandboxPath(id, suffix = '') {
31
+ if (!id)
32
+ throw new TypeError('sandbox id is required');
33
+ return `/v1/sandboxes/${encodeURIComponent(id)}${suffix}`;
34
+ }
35
+ async function readPayload(response) {
36
+ const text = await response.text();
37
+ try {
38
+ return text ? JSON.parse(text) : undefined;
39
+ }
40
+ catch {
41
+ return text;
42
+ }
43
+ }
44
+ async function send(client, method, pathname, init = {}) {
45
+ const response = await client.fetchImpl(`${client.baseUrl}${pathname}`, {
46
+ method,
47
+ headers: { ...(init.headers ?? {}), ...authHeaders(client) },
48
+ ...(init.body !== undefined ? { body: init.body } : {}),
49
+ ...(init.signal ? { signal: init.signal } : {}),
50
+ // Credentials are attached: never let fetch replay them to a redirect target.
51
+ redirect: 'error',
52
+ });
53
+ if (!response.ok)
54
+ throw toApiError(response, await readPayload(response));
55
+ return response;
56
+ }
57
+ async function json(client, method, pathname, body, options = {}) {
58
+ const response = await send(client, method, pathname, {
59
+ ...(body !== undefined ? { body: JSON.stringify(body) } : {}),
60
+ headers: { ...(body !== undefined ? { 'Content-Type': 'application/json' } : {}), ...(options.headers ?? {}) },
61
+ ...(options.signal ? { signal: options.signal } : {}),
62
+ });
63
+ return (await readPayload(response));
64
+ }
65
+ async function toBody(data) {
66
+ if (typeof data === 'string')
67
+ return new TextEncoder().encode(data);
68
+ if (data instanceof Uint8Array)
69
+ return data;
70
+ if (data instanceof ArrayBuffer)
71
+ return new Uint8Array(data);
72
+ return new Uint8Array(await data.arrayBuffer());
73
+ }
74
+ function randomKey() {
75
+ const crypto = globalThis.crypto;
76
+ if (crypto?.randomUUID)
77
+ return crypto.randomUUID();
78
+ return `sdk-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 12)}`;
79
+ }
80
+ /** Parse NDJSON lines from a byte stream, frame by frame. */
81
+ async function* ndjsonFrames(body) {
82
+ const reader = body.getReader();
83
+ const decoder = new TextDecoder();
84
+ let buffer = '';
85
+ let finished = false;
86
+ try {
87
+ for (;;) {
88
+ const { value, done } = await reader.read();
89
+ if (done)
90
+ break;
91
+ buffer += decoder.decode(value, { stream: true });
92
+ let newline = buffer.indexOf('\n');
93
+ while (newline >= 0) {
94
+ const line = buffer.slice(0, newline).trim();
95
+ buffer = buffer.slice(newline + 1);
96
+ if (line)
97
+ yield JSON.parse(line);
98
+ newline = buffer.indexOf('\n');
99
+ }
100
+ }
101
+ buffer += decoder.decode();
102
+ if (buffer.trim())
103
+ yield JSON.parse(buffer);
104
+ finished = true;
105
+ }
106
+ finally {
107
+ // The consumer left early (break, throw): closing the body cancels the exec on the server.
108
+ if (!finished)
109
+ await reader.cancel().catch(() => undefined);
110
+ reader.releaseLock();
111
+ }
112
+ }
113
+ function toFrame(raw) {
114
+ switch (raw.type) {
115
+ case 'start':
116
+ return { type: 'start', execId: String(raw.execId ?? '') };
117
+ case 'stdout':
118
+ case 'stderr':
119
+ return { type: raw.type, data: typeof raw.data === 'string' ? raw.data : '' };
120
+ case 'exit':
121
+ return {
122
+ type: 'exit',
123
+ exitCode: typeof raw.exitCode === 'number' ? raw.exitCode : null,
124
+ timedOut: raw.timedOut === true,
125
+ truncated: raw.truncated === true,
126
+ durationMs: typeof raw.durationMs === 'number' ? raw.durationMs : 0,
127
+ stdoutBytes: typeof raw.stdoutBytes === 'number' ? raw.stdoutBytes : 0,
128
+ stderrBytes: typeof raw.stderrBytes === 'number' ? raw.stderrBytes : 0,
129
+ };
130
+ case 'error':
131
+ return { type: 'error', code: String(raw.code ?? 'SANDBOX_EXEC_FAILED'), message: String(raw.message ?? raw.code ?? 'The exec failed') };
132
+ default:
133
+ // A frame type this SDK does not know yet: skip it rather than fail the exec.
134
+ return null;
135
+ }
136
+ }
137
+ function execBody(cmd, options) {
138
+ const body = { cmd };
139
+ if (options.cwd !== undefined)
140
+ body.cwd = options.cwd;
141
+ if (options.env !== undefined)
142
+ body.env = options.env;
143
+ if (options.timeoutMs !== undefined)
144
+ body.timeoutMs = options.timeoutMs;
145
+ if (options.stdin !== undefined)
146
+ body.stdin = options.stdin;
147
+ return body;
148
+ }
149
+ async function* execFrames(client, id, cmd, options = {}) {
150
+ const body = execBody(cmd, options);
151
+ const response = await send(client, 'POST', sandboxPath(id, '/exec'), {
152
+ body: JSON.stringify(body),
153
+ headers: { 'Content-Type': 'application/json', Accept: 'application/x-ndjson' },
154
+ ...(options.signal ? { signal: options.signal } : {}),
155
+ });
156
+ if (!response.body)
157
+ throw new ApiError('The exec response has no body', { status: response.status, code: 'SANDBOX_STREAM_ENDED' });
158
+ let ended = false;
159
+ for await (const raw of ndjsonFrames(response.body)) {
160
+ const frame = toFrame(raw);
161
+ if (!frame)
162
+ continue;
163
+ if (frame.type === 'exit' || frame.type === 'error')
164
+ ended = true;
165
+ yield frame;
166
+ }
167
+ if (!ended)
168
+ yield { type: 'error', code: 'SANDBOX_STREAM_ENDED', message: 'The exec stream ended without an exit status' };
169
+ }
170
+ function utf8Length(codePoint) {
171
+ if (codePoint < 0x80)
172
+ return 1;
173
+ if (codePoint < 0x800)
174
+ return 2;
175
+ return codePoint < 0x10000 ? 3 : 4;
176
+ }
177
+ /**
178
+ * The longest prefix of `text` that is at most `maxBytes` of UTF-8, cut
179
+ * between characters: never inside a surrogate pair or a multi-byte sequence.
180
+ */
181
+ function utf8Prefix(text, maxBytes) {
182
+ let bytes = 0;
183
+ let end = 0;
184
+ for (const char of text) {
185
+ const size = utf8Length(char.codePointAt(0) ?? 0);
186
+ if (bytes + size > maxBytes)
187
+ break;
188
+ bytes += size;
189
+ end += char.length;
190
+ }
191
+ return { text: text.slice(0, end), bytes };
192
+ }
193
+ async function runExec(client, id, cmd, options = {}) {
194
+ const keep = options.buffer !== false;
195
+ const cap = options.maxBufferedBytes ?? DEFAULT_MAX_BUFFERED_BYTES;
196
+ const kept = { stdout: '', stderr: '' };
197
+ const keptBytes = { stdout: 0, stderr: 0 };
198
+ const result = { execId: null, exitCode: null, timedOut: false, truncated: false, durationMs: 0, stdout: '', stderr: '' };
199
+ for await (const frame of execFrames(client, id, cmd, options)) {
200
+ switch (frame.type) {
201
+ case 'start':
202
+ result.execId = frame.execId;
203
+ break;
204
+ case 'stdout':
205
+ case 'stderr': {
206
+ (frame.type === 'stdout' ? options.onStdout : options.onStderr)?.(frame.data);
207
+ if (keep && frame.data) {
208
+ const room = cap - keptBytes[frame.type];
209
+ const part = utf8Prefix(frame.data, room);
210
+ kept[frame.type] += part.text;
211
+ keptBytes[frame.type] += part.bytes;
212
+ if (part.text.length < frame.data.length)
213
+ result.truncated = true;
214
+ }
215
+ break;
216
+ }
217
+ case 'exit':
218
+ result.exitCode = frame.exitCode;
219
+ result.timedOut = frame.timedOut;
220
+ result.truncated = result.truncated || frame.truncated;
221
+ result.durationMs = frame.durationMs;
222
+ break;
223
+ case 'error':
224
+ result.errorCode = frame.code;
225
+ result.errorMessage = frame.message;
226
+ break;
227
+ }
228
+ }
229
+ result.stdout = kept.stdout;
230
+ result.stderr = kept.stderr;
231
+ return result;
232
+ }
233
+ /* ---------------------------------------------------------------- client */
234
+ function filesApi(client) {
235
+ const put = async (id, path, data, format, signal) => {
236
+ const response = await send(client, 'PUT', sandboxPath(id, `/files?${new URLSearchParams({ path })}`), {
237
+ body: await toBody(data),
238
+ headers: { 'Content-Type': format === 'tar' ? 'application/x-tar' : 'application/octet-stream' },
239
+ ...(signal ? { signal } : {}),
240
+ });
241
+ return (await readPayload(response));
242
+ };
243
+ const get = async (id, path, format, signal) => {
244
+ const response = await send(client, 'GET', sandboxPath(id, `/files?${new URLSearchParams({ path, format })}`), signal ? { signal } : {});
245
+ return new Uint8Array(await response.arrayBuffer());
246
+ };
247
+ return {
248
+ write: (id, path, data, options = {}) => put(id, path, data, 'file', options.signal),
249
+ read: (id, path, options = {}) => get(id, path, 'file', options.signal),
250
+ readText: async (id, path, options = {}) => new TextDecoder().decode(await get(id, path, 'file', options.signal)),
251
+ upload: (id, directory, tar, options = {}) => put(id, directory, tar, 'tar', options.signal),
252
+ download: (id, directory, options = {}) => get(id, directory, 'tar', options.signal),
253
+ };
254
+ }
255
+ class SandboxHandle {
256
+ api;
257
+ files;
258
+ current;
259
+ constructor(api, info) {
260
+ this.api = api;
261
+ this.current = info;
262
+ this.files = {
263
+ write: (path, data, options) => api.files.write(this.id, path, data, options),
264
+ read: (path, options) => api.files.read(this.id, path, options),
265
+ readText: (path, options) => api.files.readText(this.id, path, options),
266
+ upload: (directory, tar, options) => api.files.upload(this.id, directory, tar, options),
267
+ download: (directory, options) => api.files.download(this.id, directory, options),
268
+ };
269
+ }
270
+ get id() { return this.current.id; }
271
+ get info() { return this.current; }
272
+ async refresh() {
273
+ this.current = (await this.api.get(this.id)).info;
274
+ return this.current;
275
+ }
276
+ exec(cmd, options) {
277
+ return this.api.exec(this.id, cmd, options);
278
+ }
279
+ stream(cmd, options) {
280
+ return this.api.stream(this.id, cmd, options);
281
+ }
282
+ async keepAlive() {
283
+ this.current = await this.api.keepAlive(this.id);
284
+ return this.current;
285
+ }
286
+ execDetached(cmd, options) {
287
+ return this.api.execDetached(this.id, cmd, options);
288
+ }
289
+ getExec(execId, options) {
290
+ return this.api.getExec(this.id, execId, options);
291
+ }
292
+ shellTicket(size) {
293
+ return this.api.shellTicket(this.id, size);
294
+ }
295
+ get shellUrl() { return this.api.shellUrl(this.id); }
296
+ async destroy() {
297
+ this.current = await this.api.destroy(this.id);
298
+ return this.current;
299
+ }
300
+ async [Symbol.asyncDispose]() {
301
+ try {
302
+ await this.destroy();
303
+ }
304
+ catch (error) {
305
+ // Already gone is the goal of a dispose, not a failure.
306
+ if (!(error instanceof ApiError && error.status === 404))
307
+ throw error;
308
+ }
309
+ }
310
+ }
311
+ /** The sandboxes API on a transport client; `createClient()` exposes it as `client.sandboxes`. */
312
+ export function createSandboxesClient(client) {
313
+ const files = filesApi(client);
314
+ const api = {
315
+ async create(spec = {}, options = {}) {
316
+ const query = options.wait === false ? '' : '?wait=running';
317
+ const info = await json(client, 'POST', `/v1/sandboxes${query}`, spec, {
318
+ headers: { 'Idempotency-Key': options.idempotencyKey ?? randomKey() },
319
+ ...(options.signal ? { signal: options.signal } : {}),
320
+ });
321
+ return new SandboxHandle(api, info);
322
+ },
323
+ async get(id, options = {}) {
324
+ return new SandboxHandle(api, await json(client, 'GET', sandboxPath(id), undefined, options));
325
+ },
326
+ list(options = {}) {
327
+ const query = new URLSearchParams();
328
+ if (options.all)
329
+ query.set('status', 'all');
330
+ if (options.limit !== undefined)
331
+ query.set('limit', String(options.limit));
332
+ if (options.cursor)
333
+ query.set('cursor', options.cursor);
334
+ const suffix = query.toString() ? `?${query}` : '';
335
+ return json(client, 'GET', `/v1/sandboxes${suffix}`, undefined, options.signal ? { signal: options.signal } : {});
336
+ },
337
+ async *iterate(options = {}) {
338
+ let cursor;
339
+ do {
340
+ const page = await api.list({ ...options, ...(cursor ? { cursor } : {}) });
341
+ yield* page.items;
342
+ cursor = page.nextCursor ?? undefined;
343
+ } while (cursor);
344
+ },
345
+ exec: (id, cmd, options) => runExec(client, id, cmd, options),
346
+ stream: (id, cmd, options) => execFrames(client, id, cmd, options),
347
+ files,
348
+ keepAlive: (id, options = {}) => json(client, 'POST', sandboxPath(id, '/keepalive'), undefined, options),
349
+ destroy: (id, options = {}) => json(client, 'DELETE', sandboxPath(id), undefined, options),
350
+ execDetached: (id, cmd, options = {}) => json(client, 'POST', sandboxPath(id, '/exec?detach=1'), execBody(cmd, options)),
351
+ getExec: (id, execId, options = {}) => json(client, 'GET', sandboxPath(id, `/exec/${encodeURIComponent(execId)}${options.encoding ? `?encoding=${options.encoding}` : ''}`), undefined, options.signal ? { signal: options.signal } : {}),
352
+ shellTicket: (id, size = {}, options = {}) => json(client, 'POST', sandboxPath(id, '/shell-ticket'), size, options.signal ? { signal: options.signal } : {}),
353
+ shellUrl: (id) => `${client.baseUrl.replace(/^http/, 'ws')}${sandboxPath(id, '/shell')}`,
354
+ usage: (options = {}) => json(client, 'GET', '/v1/sandboxes/usage', undefined, options),
355
+ capabilities: (options = {}) => json(client, 'GET', '/v1/sandboxes/capabilities', undefined, options),
356
+ };
357
+ return api;
358
+ }
359
+ //# sourceMappingURL=sandboxes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandboxes.js","sourceRoot":"","sources":["../src/sandboxes.ts"],"names":[],"mappings":"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"}