@agentuity/sandbox 3.0.12 → 3.1.1

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 (122) hide show
  1. package/AGENTS.md +3 -3
  2. package/dist/api-reference.d.ts +1221 -0
  3. package/dist/api-reference.d.ts.map +1 -0
  4. package/dist/api-reference.js +1046 -0
  5. package/dist/api-reference.js.map +1 -0
  6. package/dist/base64.d.ts +2 -0
  7. package/dist/base64.d.ts.map +1 -0
  8. package/dist/base64.js +14 -0
  9. package/dist/base64.js.map +1 -0
  10. package/dist/client.d.ts +431 -0
  11. package/dist/client.d.ts.map +1 -0
  12. package/dist/client.js +632 -0
  13. package/dist/client.js.map +1 -0
  14. package/dist/create.d.ts +203 -0
  15. package/dist/create.d.ts.map +1 -0
  16. package/dist/create.js +235 -0
  17. package/dist/create.js.map +1 -0
  18. package/dist/destroy.d.ts +23 -0
  19. package/dist/destroy.d.ts.map +1 -0
  20. package/dist/destroy.js +30 -0
  21. package/dist/destroy.js.map +1 -0
  22. package/dist/disk-checkpoint.d.ts +108 -0
  23. package/dist/disk-checkpoint.d.ts.map +1 -0
  24. package/dist/disk-checkpoint.js +124 -0
  25. package/dist/disk-checkpoint.js.map +1 -0
  26. package/dist/events.d.ts +56 -0
  27. package/dist/events.d.ts.map +1 -0
  28. package/dist/events.js +54 -0
  29. package/dist/events.js.map +1 -0
  30. package/dist/execute.d.ts +99 -0
  31. package/dist/execute.d.ts.map +1 -0
  32. package/dist/execute.js +138 -0
  33. package/dist/execute.js.map +1 -0
  34. package/dist/execution.d.ts +150 -0
  35. package/dist/execution.d.ts.map +1 -0
  36. package/dist/execution.js +120 -0
  37. package/dist/execution.js.map +1 -0
  38. package/dist/files.d.ts +283 -0
  39. package/dist/files.d.ts.map +1 -0
  40. package/dist/files.js +471 -0
  41. package/dist/files.js.map +1 -0
  42. package/dist/get.d.ts +288 -0
  43. package/dist/get.d.ts.map +1 -0
  44. package/dist/get.js +256 -0
  45. package/dist/get.js.map +1 -0
  46. package/dist/getStatus.d.ts +23 -0
  47. package/dist/getStatus.d.ts.map +1 -0
  48. package/dist/getStatus.js +53 -0
  49. package/dist/getStatus.js.map +1 -0
  50. package/dist/index.d.ts +42 -1
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +22 -1
  53. package/dist/index.js.map +1 -1
  54. package/dist/job.d.ts +227 -0
  55. package/dist/job.d.ts.map +1 -0
  56. package/dist/job.js +109 -0
  57. package/dist/job.js.map +1 -0
  58. package/dist/list.d.ts +330 -0
  59. package/dist/list.d.ts.map +1 -0
  60. package/dist/list.js +209 -0
  61. package/dist/list.js.map +1 -0
  62. package/dist/pause.d.ts +39 -0
  63. package/dist/pause.d.ts.map +1 -0
  64. package/dist/pause.js +48 -0
  65. package/dist/pause.js.map +1 -0
  66. package/dist/resolve.d.ts +75 -0
  67. package/dist/resolve.d.ts.map +1 -0
  68. package/dist/resolve.js +76 -0
  69. package/dist/resolve.js.map +1 -0
  70. package/dist/resume.d.ts +23 -0
  71. package/dist/resume.d.ts.map +1 -0
  72. package/dist/resume.js +30 -0
  73. package/dist/resume.js.map +1 -0
  74. package/dist/run.d.ts +73 -0
  75. package/dist/run.d.ts.map +1 -0
  76. package/dist/run.js +568 -0
  77. package/dist/run.js.map +1 -0
  78. package/dist/runtime.d.ts +94 -0
  79. package/dist/runtime.d.ts.map +1 -0
  80. package/dist/runtime.js +82 -0
  81. package/dist/runtime.js.map +1 -0
  82. package/dist/snapshot-build.d.ts +48 -0
  83. package/dist/snapshot-build.d.ts.map +1 -0
  84. package/dist/snapshot-build.js +72 -0
  85. package/dist/snapshot-build.js.map +1 -0
  86. package/dist/snapshot.d.ts +596 -0
  87. package/dist/snapshot.d.ts.map +1 -0
  88. package/dist/snapshot.js +612 -0
  89. package/dist/snapshot.js.map +1 -0
  90. package/dist/types.d.ts +1010 -0
  91. package/dist/types.d.ts.map +1 -0
  92. package/dist/types.js +853 -0
  93. package/dist/types.js.map +1 -0
  94. package/dist/util.d.ts +296 -0
  95. package/dist/util.d.ts.map +1 -0
  96. package/dist/util.js +234 -0
  97. package/dist/util.js.map +1 -0
  98. package/package.json +7 -2
  99. package/src/api-reference.ts +1094 -0
  100. package/src/base64.ts +14 -0
  101. package/src/client.ts +998 -0
  102. package/src/create.ts +273 -0
  103. package/src/destroy.ts +43 -0
  104. package/src/disk-checkpoint.ts +184 -0
  105. package/src/events.ts +72 -0
  106. package/src/execute.ts +167 -0
  107. package/src/execution.ts +152 -0
  108. package/src/files.ts +637 -0
  109. package/src/get.ts +291 -0
  110. package/src/getStatus.ts +72 -0
  111. package/src/index.ts +252 -18
  112. package/src/job.ts +161 -0
  113. package/src/list.ts +239 -0
  114. package/src/pause.ts +75 -0
  115. package/src/resolve.ts +96 -0
  116. package/src/resume.ts +41 -0
  117. package/src/run.ts +783 -0
  118. package/src/runtime.ts +106 -0
  119. package/src/snapshot-build.ts +94 -0
  120. package/src/snapshot.ts +791 -0
  121. package/src/types.ts +1033 -0
  122. package/src/util.ts +280 -0
package/dist/run.js ADDED
@@ -0,0 +1,568 @@
1
+ import { PassThrough } from 'node:stream';
2
+ import { finished } from 'node:stream/promises';
3
+ import { z } from 'zod';
4
+ import { PaymentRequiredError } from '@agentuity/api';
5
+ import { sandboxCreate } from './create.js';
6
+ import { sandboxDestroy } from './destroy.js';
7
+ import { executionGet } from './execution.js';
8
+ import { sandboxGetStatus } from './getStatus.js';
9
+ import { ExecutionCancelledError, writeAndDrain } from './util.js';
10
+ import { SandboxRunOptionsSchema } from './types.js';
11
+ import { getServiceUrls } from '@agentuity/config';
12
+ const timingLogsEnabled = false;
13
+ const EXECUTION_WAIT_DURATION = '5m';
14
+ const EXIT_CODE_FAST_WAIT_DURATION = '250ms';
15
+ const TERMINAL_EXECUTION_STATUSES = new Set(['completed', 'failed', 'timeout', 'cancelled']);
16
+ /**
17
+ * Creates a Writable stream that captures all chunks to a buffer array
18
+ * and optionally tees (forwards) them to one or more user-provided streams.
19
+ *
20
+ * @param chunks - Array to collect Buffer chunks into
21
+ * @param userStreams - Optional user-provided Writable stream(s) to forward chunks to
22
+ * @returns A Writable stream that captures and optionally forwards data
23
+ */
24
+ function createTeeWritable(chunks, ...userStreams) {
25
+ const tee = new PassThrough();
26
+ // Always capture chunks to the buffer
27
+ tee.on('data', (chunk) => {
28
+ chunks.push(chunk);
29
+ });
30
+ // Pipe to all provided user streams with proper backpressure handling
31
+ for (const userStream of userStreams) {
32
+ if (userStream) {
33
+ tee.pipe(userStream, { end: false });
34
+ }
35
+ }
36
+ return tee;
37
+ }
38
+ export const SandboxRunParamsSchema = z.object({
39
+ options: SandboxRunOptionsSchema.describe('sandbox run options'),
40
+ orgId: z.string().optional().describe('organization id'),
41
+ region: z.string().optional().describe('region id'),
42
+ apiKey: z.string().optional().describe('api key'),
43
+ signal: z.custom().optional().describe('abort signal'),
44
+ stdin: z.custom().optional().describe('stdin readable stream'),
45
+ stdout: z.custom().optional().describe('stdout writable stream'),
46
+ stderr: z.custom().optional().describe('stderr writable stream'),
47
+ logger: z.custom().optional().describe('logger instance'),
48
+ });
49
+ /**
50
+ * Creates a sandbox, executes a command, and waits for completion.
51
+ *
52
+ * This is a high-level convenience function that handles the full lifecycle:
53
+ * creating a sandbox, streaming I/O, polling for completion, and cleanup.
54
+ *
55
+ * @param client - The API client to use for the request
56
+ * @param params - Parameters including command options, I/O streams, and timeout settings
57
+ * @returns The run result including exit code and duration
58
+ * @throws {SandboxResponseError} If sandbox creation fails, execution times out, or is cancelled
59
+ */
60
+ export async function sandboxRun(client, params) {
61
+ const { options, orgId, region, apiKey, signal, stdin, stdout, stderr, logger } = params;
62
+ const started = Date.now();
63
+ if (timingLogsEnabled)
64
+ console.error(`[TIMING] +0ms: sandbox run started`);
65
+ let stdinStreamId;
66
+ let stdinStreamUrl;
67
+ // Handle stdin stream configuration:
68
+ // - If stdin is "ignore", pass it through to skip stdin handling on server
69
+ // - If stdin is an explicit stream ID, use it directly
70
+ // - If stdin readable is provided, create a stream for it
71
+ const stdinConfig = options.stream?.stdin;
72
+ if (stdinConfig === 'ignore') {
73
+ stdinStreamId = 'ignore';
74
+ logger?.debug('stdin explicitly ignored');
75
+ }
76
+ else if (stdinConfig && stdinConfig !== 'ignore') {
77
+ // User provided an explicit stream ID
78
+ stdinStreamId = stdinConfig;
79
+ logger?.debug('using provided stdin stream ID: %s', stdinStreamId);
80
+ }
81
+ else if (stdin && region && apiKey) {
82
+ const streamResult = await createStdinStream(region, apiKey, orgId, logger);
83
+ stdinStreamId = streamResult.id;
84
+ stdinStreamUrl = streamResult.url;
85
+ logger?.debug('created stdin stream: %s', stdinStreamId);
86
+ }
87
+ const createResponse = await sandboxCreate(client, {
88
+ options: {
89
+ ...options,
90
+ command: {
91
+ exec: options.command.exec,
92
+ files: options.command.files,
93
+ mode: 'oneshot',
94
+ },
95
+ stream: {
96
+ ...options.stream,
97
+ stdin: stdinStreamId,
98
+ },
99
+ },
100
+ orgId,
101
+ });
102
+ const sandboxId = createResponse.sandboxId;
103
+ const stdoutStreamUrl = createResponse.stdoutStreamUrl;
104
+ const stderrStreamUrl = createResponse.stderrStreamUrl;
105
+ logger?.debug('sandbox created: %s, stdoutUrl: %s, stderrUrl: %s', sandboxId, stdoutStreamUrl ?? 'none', stderrStreamUrl ?? 'none');
106
+ if (timingLogsEnabled)
107
+ console.error(`[TIMING] +${Date.now() - started}ms: sandbox created (${sandboxId})`);
108
+ const abortController = new AbortController();
109
+ const streamPromises = [];
110
+ // Create capture buffers for stdout/stderr
111
+ const stdoutChunks = [];
112
+ const stderrChunks = [];
113
+ try {
114
+ // Start stdin streaming if we have stdin and a stream URL
115
+ if (stdin && stdinStreamUrl && apiKey) {
116
+ const stdinPromise = streamStdinToUrl(stdin, stdinStreamUrl, apiKey, abortController.signal, logger);
117
+ streamPromises.push(stdinPromise);
118
+ }
119
+ // Check if stdout and stderr are the same stream (combined output)
120
+ const isCombinedOutput = stdoutStreamUrl && stderrStreamUrl && stdoutStreamUrl === stderrStreamUrl;
121
+ if (isCombinedOutput) {
122
+ // Stream combined output to stdout only to avoid duplicates
123
+ if (stdoutStreamUrl) {
124
+ logger?.debug('using combined output stream (stdout === stderr)');
125
+ const teeStream = createTeeWritable(stdoutChunks, stdout);
126
+ const combinedPromise = streamUrlToWritable(stdoutStreamUrl, teeStream, abortController.signal, logger, started);
127
+ streamPromises.push(combinedPromise);
128
+ }
129
+ }
130
+ else {
131
+ // Start stdout streaming with capture
132
+ if (stdoutStreamUrl) {
133
+ const teeStream = createTeeWritable(stdoutChunks, stdout);
134
+ const stdoutPromise = streamUrlToWritable(stdoutStreamUrl, teeStream, abortController.signal, logger, started);
135
+ streamPromises.push(stdoutPromise);
136
+ }
137
+ // Start stderr streaming with capture
138
+ if (stderrStreamUrl) {
139
+ const teeStream = createTeeWritable(stderrChunks, stderr);
140
+ const stderrPromise = streamUrlToWritable(stderrStreamUrl, teeStream, abortController.signal, logger, started);
141
+ streamPromises.push(stderrPromise);
142
+ }
143
+ }
144
+ // Wait for execution completion in parallel with stream consumption. The old
145
+ // flow waited for stream EOF first and only then started polling for the
146
+ // final exit code, which adds avoidable tail latency now that create returns
147
+ // an execution ID immediately for oneshot sandboxes.
148
+ let finalExecution;
149
+ if (createResponse.executionId) {
150
+ logger?.debug('waiting for execution %s and %d stream(s) in parallel', createResponse.executionId, streamPromises.length);
151
+ const completionPromise = waitForRunCompletion(client, sandboxId, createResponse.executionId, orgId, signal, logger, started);
152
+ finalExecution = signal
153
+ ? await raceWithAbort(completionPromise, signal, abortController, sandboxId)
154
+ : await completionPromise;
155
+ await waitForStreamsToDrain(streamPromises, signal, abortController, sandboxId);
156
+ }
157
+ else {
158
+ logger?.debug('missing executionId on create response, falling back to stream-first completion');
159
+ await waitForStreamsToDrain(streamPromises, signal, abortController, sandboxId);
160
+ }
161
+ if (timingLogsEnabled)
162
+ console.error(`[TIMING] +${Date.now() - started}ms: completion wait finished`);
163
+ logger?.debug('completion wait finished, resolving final exit code');
164
+ // Stream EOF means the sandbox is done — hadron only closes streams after the
165
+ // container exits. Poll for the exit code with retries because the lifecycle
166
+ // event (carrying the exit code) may still be in flight to Catalyst when the
167
+ // stream completes.
168
+ //
169
+ // Hadron drains container logs for up to 5s after exit, then closes the
170
+ // stream, then sends the lifecycle event in a goroutine. So the exit code
171
+ // typically arrives at Catalyst 5–7s after the container exits. We use a
172
+ // linear 1s polling interval (not exponential backoff) so we don't overshoot
173
+ // the window — 15 attempts × 1s = 15s total, which comfortably covers the
174
+ // drain + lifecycle propagation delay.
175
+ let exitCode = finalExecution?.exitCode ?? 0;
176
+ const statusPollStart = Date.now();
177
+ let shouldWaitForSandboxStatus = finalExecution?.exitCode == null;
178
+ let sandboxStatusReconciled = false;
179
+ if (finalExecution?.exitCode == null) {
180
+ if (createResponse.executionId && finalExecution?.status === 'completed') {
181
+ try {
182
+ const execution = await executionGet(client, {
183
+ executionId: createResponse.executionId,
184
+ orgId,
185
+ wait: EXIT_CODE_FAST_WAIT_DURATION,
186
+ signal,
187
+ });
188
+ if (execution.exitCode != null) {
189
+ exitCode = execution.exitCode;
190
+ finalExecution.exitCode = execution.exitCode;
191
+ shouldWaitForSandboxStatus = false;
192
+ logger?.debug('[run] exit code %d found from fast execution retry (+%dms)', exitCode, Date.now() - statusPollStart);
193
+ }
194
+ }
195
+ catch (err) {
196
+ if (!(err instanceof DOMException && err.name === 'AbortError')) {
197
+ logger?.debug('[run] fast execution exit code retry failed (+%dms): %s', Date.now() - statusPollStart, err);
198
+ }
199
+ }
200
+ }
201
+ }
202
+ if (shouldWaitForSandboxStatus) {
203
+ try {
204
+ const sandboxStatus = await sandboxGetStatus(client, {
205
+ sandboxId,
206
+ orgId,
207
+ waitForStatus: ['terminated', 'failed'],
208
+ waitMs: 15000,
209
+ });
210
+ if (sandboxStatus.exitCode != null) {
211
+ exitCode = sandboxStatus.exitCode;
212
+ sandboxStatusReconciled = true;
213
+ logger?.debug('[run] exit code %d found after server-side wait (+%dms)', exitCode, Date.now() - statusPollStart);
214
+ }
215
+ else if (sandboxStatus.status === 'failed') {
216
+ exitCode = 1;
217
+ sandboxStatusReconciled = true;
218
+ logger?.debug('[run] sandbox failed after server-side wait (+%dms)', Date.now() - statusPollStart);
219
+ }
220
+ else if (sandboxStatus.status === 'terminated') {
221
+ sandboxStatusReconciled = true;
222
+ logger?.debug('[run] sandbox terminated without exit code after server-side wait (+%dms)', Date.now() - statusPollStart);
223
+ }
224
+ else {
225
+ logger?.debug('[run] sandbox status wait expired with status=%s (+%dms)', sandboxStatus.status, Date.now() - statusPollStart);
226
+ }
227
+ }
228
+ catch (err) {
229
+ if (!(err instanceof DOMException && err.name === 'AbortError')) {
230
+ logger?.debug('[run] sandboxGetStatus server-side wait failed (+%dms): %s', Date.now() - statusPollStart, err);
231
+ }
232
+ }
233
+ }
234
+ if (finalExecution &&
235
+ finalExecution?.exitCode == null &&
236
+ finalExecution?.status !== 'completed' &&
237
+ !sandboxStatusReconciled) {
238
+ exitCode = 1;
239
+ logger?.debug('[run] using fallback exit code 1 for terminal status=%s after sandbox status reconciliation failed', finalExecution?.status);
240
+ }
241
+ if (exitCode === 0) {
242
+ if (finalExecution?.exitCode != null) {
243
+ logger?.debug('[run] using execution exit code 0 from long-poll result');
244
+ }
245
+ else {
246
+ logger?.debug('[run] exit code wait finished with default 0 (+%dms)', Date.now() - statusPollStart);
247
+ }
248
+ }
249
+ if (timingLogsEnabled)
250
+ console.error(`[TIMING] +${Date.now() - started}ms: sandboxGet complete (exit: ${exitCode})`);
251
+ // Build captured output strings
252
+ const capturedStdout = Buffer.concat(stdoutChunks).toString('utf-8');
253
+ const capturedStderr = isCombinedOutput
254
+ ? capturedStdout
255
+ : Buffer.concat(stderrChunks).toString('utf-8');
256
+ return {
257
+ sandboxId,
258
+ exitCode,
259
+ durationMs: Date.now() - started,
260
+ stdout: capturedStdout,
261
+ stderr: capturedStderr,
262
+ };
263
+ }
264
+ catch (error) {
265
+ abortController.abort();
266
+ try {
267
+ await sandboxDestroy(client, { sandboxId, orgId });
268
+ }
269
+ catch {
270
+ // Ignore cleanup errors
271
+ }
272
+ throw error;
273
+ }
274
+ }
275
+ async function waitForRunCompletion(client, sandboxId, executionId, orgId, signal, logger, started) {
276
+ const completionAbortController = new AbortController();
277
+ let onAbort;
278
+ if (signal) {
279
+ onAbort = () => completionAbortController.abort(signal.reason);
280
+ if (signal.aborted) {
281
+ onAbort();
282
+ }
283
+ else {
284
+ signal.addEventListener('abort', onAbort, { once: true });
285
+ }
286
+ }
287
+ try {
288
+ const completionSignal = completionAbortController.signal;
289
+ const executionPromise = waitForExecutionCompletion(client, executionId, orgId, completionSignal, logger, started);
290
+ const statusPromise = waitForSandboxStatusCompletion(client, sandboxId, orgId, completionSignal, logger, started).catch((err) => {
291
+ if (completionSignal.aborted) {
292
+ throw err;
293
+ }
294
+ logger?.debug('[run] sandbox status completion wait failed: %s', err);
295
+ return new Promise(() => { });
296
+ });
297
+ const result = await Promise.race([executionPromise, statusPromise]);
298
+ return result;
299
+ }
300
+ finally {
301
+ if (onAbort && signal) {
302
+ signal.removeEventListener('abort', onAbort);
303
+ }
304
+ }
305
+ }
306
+ async function waitForExecutionCompletion(client, executionId, orgId, signal, logger, started) {
307
+ while (true) {
308
+ if (signal?.aborted) {
309
+ throw new DOMException('Aborted', 'AbortError');
310
+ }
311
+ const result = await executionGet(client, {
312
+ executionId,
313
+ orgId,
314
+ wait: EXECUTION_WAIT_DURATION,
315
+ signal,
316
+ });
317
+ logger?.debug('[run] execution wait: id=%s status=%s exit=%s +%dms', executionId, result.status, result.exitCode ?? 'undefined', Date.now() - started);
318
+ if (TERMINAL_EXECUTION_STATUSES.has(result.status)) {
319
+ return {
320
+ exitCode: result.exitCode,
321
+ status: result.status,
322
+ };
323
+ }
324
+ }
325
+ }
326
+ async function waitForSandboxStatusCompletion(client, sandboxId, orgId, signal, logger, started) {
327
+ while (true) {
328
+ if (signal?.aborted) {
329
+ throw new DOMException('Aborted', 'AbortError');
330
+ }
331
+ const result = await sandboxGetStatus(client, {
332
+ sandboxId,
333
+ orgId,
334
+ waitForStatus: ['idle', 'terminated', 'failed'],
335
+ waitMs: 300000,
336
+ signal,
337
+ });
338
+ logger?.debug('[run] sandbox status wait: sandbox=%s status=%s exit=%s +%dms', sandboxId, result.status, result.exitCode ?? 'undefined', Date.now() - started);
339
+ if (result.exitCode != null) {
340
+ return {
341
+ exitCode: result.exitCode,
342
+ status: 'completed',
343
+ };
344
+ }
345
+ if (result.status === 'failed') {
346
+ return {
347
+ exitCode: 1,
348
+ status: 'failed',
349
+ };
350
+ }
351
+ if (result.status === 'terminated') {
352
+ return {
353
+ status: 'completed',
354
+ };
355
+ }
356
+ await new Promise((resolve) => setTimeout(resolve, 25));
357
+ }
358
+ }
359
+ async function waitForStreamsToDrain(streamPromises, signal, abortController, sandboxId) {
360
+ if (streamPromises.length === 0) {
361
+ return;
362
+ }
363
+ if (signal) {
364
+ let onAbort;
365
+ try {
366
+ await Promise.race([
367
+ Promise.allSettled(streamPromises).then(() => undefined),
368
+ new Promise((_, reject) => {
369
+ onAbort = () => {
370
+ abortController.abort();
371
+ reject(new ExecutionCancelledError({
372
+ message: 'Sandbox execution cancelled',
373
+ sandboxId,
374
+ }));
375
+ };
376
+ if (signal.aborted) {
377
+ onAbort();
378
+ }
379
+ else {
380
+ signal.addEventListener('abort', onAbort, { once: true });
381
+ }
382
+ }),
383
+ ]);
384
+ }
385
+ finally {
386
+ if (onAbort) {
387
+ signal.removeEventListener('abort', onAbort);
388
+ }
389
+ }
390
+ return;
391
+ }
392
+ await Promise.allSettled(streamPromises);
393
+ }
394
+ async function raceWithAbort(promise, signal, abortController, sandboxId) {
395
+ let onAbort;
396
+ try {
397
+ return await Promise.race([
398
+ promise,
399
+ new Promise((_, reject) => {
400
+ onAbort = () => {
401
+ abortController.abort();
402
+ reject(new ExecutionCancelledError({
403
+ message: 'Sandbox execution cancelled',
404
+ sandboxId,
405
+ }));
406
+ };
407
+ if (signal.aborted) {
408
+ onAbort();
409
+ }
410
+ else {
411
+ signal.addEventListener('abort', onAbort, { once: true });
412
+ }
413
+ }),
414
+ ]);
415
+ }
416
+ finally {
417
+ if (onAbort) {
418
+ signal.removeEventListener('abort', onAbort);
419
+ }
420
+ }
421
+ }
422
+ async function createStdinStream(region, apiKey, orgId, logger) {
423
+ const urls = getServiceUrls(region);
424
+ const streamBaseUrl = urls.stream;
425
+ // Build URL with orgId query param for CLI token validation
426
+ const queryParams = new URLSearchParams();
427
+ if (orgId) {
428
+ queryParams.set('orgId', orgId);
429
+ }
430
+ const queryString = queryParams.toString();
431
+ const url = `${streamBaseUrl}${queryString ? `?${queryString}` : ''}`;
432
+ logger?.trace('creating stdin stream: %s', url);
433
+ const response = await fetch(url, {
434
+ method: 'POST',
435
+ headers: {
436
+ 'Content-Type': 'application/json',
437
+ Authorization: `Bearer ${apiKey}`,
438
+ },
439
+ body: JSON.stringify({
440
+ name: `sandbox-stdin-${Date.now()}`,
441
+ }),
442
+ });
443
+ if (!response.ok) {
444
+ if (response.status === 402) {
445
+ throw new PaymentRequiredError({
446
+ url: url,
447
+ });
448
+ }
449
+ throw new Error(`Failed to create stdin stream: ${response.status} ${response.statusText}`);
450
+ }
451
+ const data = (await response.json());
452
+ logger?.debug('created stdin stream: %s', data.id);
453
+ // Include orgId in the URL for subsequent PUT requests (needed for CLI token auth)
454
+ const putQueryString = orgId ? `?orgId=${encodeURIComponent(orgId)}` : '';
455
+ return {
456
+ id: data.id,
457
+ url: `${streamBaseUrl}/${data.id}${putQueryString}`,
458
+ };
459
+ }
460
+ async function streamStdinToUrl(stdin, url, apiKey, signal, logger) {
461
+ try {
462
+ logger?.debug('streaming stdin to: %s', url);
463
+ // Convert Node.js Readable to a web ReadableStream for fetch body
464
+ let controllerClosed = false;
465
+ const webStream = new ReadableStream({
466
+ start(controller) {
467
+ stdin.on('data', (chunk) => {
468
+ if (!signal.aborted && !controllerClosed) {
469
+ controller.enqueue(chunk);
470
+ }
471
+ });
472
+ stdin.on('end', () => {
473
+ if (!controllerClosed) {
474
+ controllerClosed = true;
475
+ controller.close();
476
+ }
477
+ });
478
+ stdin.on('error', (err) => {
479
+ if (!controllerClosed) {
480
+ controllerClosed = true;
481
+ controller.error(err);
482
+ }
483
+ });
484
+ signal.addEventListener('abort', () => {
485
+ if (!controllerClosed) {
486
+ controllerClosed = true;
487
+ controller.close();
488
+ }
489
+ });
490
+ },
491
+ });
492
+ const response = await fetch(url, {
493
+ method: 'PUT',
494
+ headers: {
495
+ Authorization: `Bearer ${apiKey}`,
496
+ },
497
+ body: webStream,
498
+ signal,
499
+ duplex: 'half',
500
+ });
501
+ if (!response.ok) {
502
+ logger?.debug('stdin stream PUT failed: %d', response.status);
503
+ }
504
+ else {
505
+ logger?.debug('stdin stream completed');
506
+ }
507
+ }
508
+ catch (err) {
509
+ if (err instanceof Error && err.name === 'AbortError') {
510
+ logger?.debug('stdin stream aborted (expected on completion)');
511
+ }
512
+ else {
513
+ logger?.debug('stdin stream error: %s', err);
514
+ }
515
+ }
516
+ }
517
+ async function streamUrlToWritable(url, writable, signal, logger, _started) {
518
+ const streamStart = Date.now();
519
+ try {
520
+ // Signal to Pulse that this is a v2 stream so it waits for v2 metadata
521
+ // instead of falling back to the legacy download path on a short timeout.
522
+ const v2Url = new URL(url);
523
+ v2Url.searchParams.set('v', '2');
524
+ logger?.debug('[stream] fetching: %s', v2Url.href);
525
+ const response = await fetch(v2Url.href, { signal });
526
+ logger?.debug('[stream] response status=%d in %dms', response.status, Date.now() - streamStart);
527
+ if (!response.ok || !response.body) {
528
+ logger?.debug('[stream] not ok or no body (status=%d) — returning empty', response.status);
529
+ return;
530
+ }
531
+ const reader = response.body.getReader();
532
+ let chunks = 0;
533
+ let totalBytes = 0;
534
+ // Read until EOF - Pulse will block until data is available
535
+ while (true) {
536
+ const { done, value } = await reader.read();
537
+ if (done) {
538
+ logger?.debug('[stream] EOF after %dms (%d chunks, %d bytes)', Date.now() - streamStart, chunks, totalBytes);
539
+ break;
540
+ }
541
+ if (value) {
542
+ chunks++;
543
+ totalBytes += value.length;
544
+ if (chunks <= 3 || chunks % 100 === 0) {
545
+ logger?.debug('[stream] chunk #%d: %d bytes (total: %d bytes, +%dms)', chunks, value.length, totalBytes, Date.now() - streamStart);
546
+ }
547
+ await writeAndDrain(writable, value);
548
+ }
549
+ }
550
+ // Signal end-of-stream to the tee/pipe chain so downstream
551
+ // consumers (e.g. process.stdout pipe) know no more data is coming.
552
+ writable.end();
553
+ if ('once' in writable) {
554
+ await finished(writable).catch(() => {
555
+ // Ignore finish errors here; the main read/write path already
556
+ // reported meaningful stream errors.
557
+ });
558
+ }
559
+ }
560
+ catch (err) {
561
+ if (err instanceof Error && err.name === 'AbortError') {
562
+ logger?.debug('[stream] aborted after %dms', Date.now() - streamStart);
563
+ return;
564
+ }
565
+ logger?.debug('[stream] error after %dms: %s', Date.now() - streamStart, err);
566
+ }
567
+ }
568
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"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"}