@agentuity/server 1.0.18 → 1.0.20

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 (74) hide show
  1. package/dist/api/api.d.ts.map +1 -1
  2. package/dist/api/api.js.map +1 -1
  3. package/dist/api/queue/analytics.d.ts.map +1 -1
  4. package/dist/api/queue/analytics.js.map +1 -1
  5. package/dist/api/queue/destinations.d.ts.map +1 -1
  6. package/dist/api/queue/destinations.js +2 -2
  7. package/dist/api/queue/destinations.js.map +1 -1
  8. package/dist/api/queue/dlq.d.ts.map +1 -1
  9. package/dist/api/queue/dlq.js +1 -1
  10. package/dist/api/queue/dlq.js.map +1 -1
  11. package/dist/api/queue/queues.d.ts.map +1 -1
  12. package/dist/api/queue/queues.js.map +1 -1
  13. package/dist/api/queue/sources.d.ts.map +1 -1
  14. package/dist/api/queue/sources.js +1 -1
  15. package/dist/api/queue/sources.js.map +1 -1
  16. package/dist/api/queue/websocket.d.ts +24 -0
  17. package/dist/api/queue/websocket.d.ts.map +1 -1
  18. package/dist/api/queue/websocket.js +20 -2
  19. package/dist/api/queue/websocket.js.map +1 -1
  20. package/dist/api/region/create.d.ts.map +1 -1
  21. package/dist/api/region/create.js +6 -0
  22. package/dist/api/region/create.js.map +1 -1
  23. package/dist/api/sandbox/cli-list.d.ts.map +1 -1
  24. package/dist/api/sandbox/cli-list.js.map +1 -1
  25. package/dist/api/sandbox/client.d.ts +4 -0
  26. package/dist/api/sandbox/client.d.ts.map +1 -1
  27. package/dist/api/sandbox/client.js +1 -0
  28. package/dist/api/sandbox/client.js.map +1 -1
  29. package/dist/api/sandbox/create.d.ts +6 -0
  30. package/dist/api/sandbox/create.d.ts.map +1 -1
  31. package/dist/api/sandbox/create.js +12 -1
  32. package/dist/api/sandbox/create.js.map +1 -1
  33. package/dist/api/sandbox/get.d.ts +4 -0
  34. package/dist/api/sandbox/get.d.ts.map +1 -1
  35. package/dist/api/sandbox/get.js +15 -1
  36. package/dist/api/sandbox/get.js.map +1 -1
  37. package/dist/api/sandbox/getStatus.d.ts +16 -0
  38. package/dist/api/sandbox/getStatus.d.ts.map +1 -0
  39. package/dist/api/sandbox/getStatus.js +32 -0
  40. package/dist/api/sandbox/getStatus.js.map +1 -0
  41. package/dist/api/sandbox/index.d.ts +2 -0
  42. package/dist/api/sandbox/index.d.ts.map +1 -1
  43. package/dist/api/sandbox/index.js +1 -0
  44. package/dist/api/sandbox/index.js.map +1 -1
  45. package/dist/api/sandbox/list.d.ts +6 -0
  46. package/dist/api/sandbox/list.d.ts.map +1 -1
  47. package/dist/api/sandbox/list.js +15 -1
  48. package/dist/api/sandbox/list.js.map +1 -1
  49. package/dist/api/sandbox/pause.d.ts.map +1 -1
  50. package/dist/api/sandbox/pause.js.map +1 -1
  51. package/dist/api/sandbox/resume.d.ts.map +1 -1
  52. package/dist/api/sandbox/resume.js.map +1 -1
  53. package/dist/api/sandbox/run.d.ts.map +1 -1
  54. package/dist/api/sandbox/run.js +94 -70
  55. package/dist/api/sandbox/run.js.map +1 -1
  56. package/package.json +4 -4
  57. package/src/api/api.ts +3 -8
  58. package/src/api/queue/analytics.ts +1 -7
  59. package/src/api/queue/destinations.ts +5 -6
  60. package/src/api/queue/dlq.ts +7 -7
  61. package/src/api/queue/queues.ts +6 -1
  62. package/src/api/queue/sources.ts +1 -6
  63. package/src/api/queue/websocket.ts +32 -6
  64. package/src/api/region/create.ts +6 -0
  65. package/src/api/sandbox/cli-list.ts +9 -1
  66. package/src/api/sandbox/client.ts +6 -0
  67. package/src/api/sandbox/create.ts +14 -1
  68. package/src/api/sandbox/get.ts +15 -1
  69. package/src/api/sandbox/getStatus.ts +54 -0
  70. package/src/api/sandbox/index.ts +2 -0
  71. package/src/api/sandbox/list.ts +15 -1
  72. package/src/api/sandbox/pause.ts +1 -4
  73. package/src/api/sandbox/resume.ts +1 -4
  74. package/src/api/sandbox/run.ts +103 -78
@@ -2,9 +2,10 @@ import { PassThrough } from 'node:stream';
2
2
  import { PaymentRequiredError } from "../api.js";
3
3
  import { sandboxCreate } from "./create.js";
4
4
  import { sandboxDestroy } from "./destroy.js";
5
- import { sandboxGet } from "./get.js";
6
- import { ExecutionCancelledError, ExecutionTimeoutError, writeAndDrain } from "./util.js";
5
+ import { sandboxGetStatus } from "./getStatus.js";
6
+ import { ExecutionCancelledError, writeAndDrain } from "./util.js";
7
7
  import { getServiceUrls } from "../../config.js";
8
+ const timingLogsEnabled = false;
8
9
  /**
9
10
  * Creates a Writable stream that captures all chunks to a buffer array
10
11
  * and optionally tees (forwards) them to one or more user-provided streams.
@@ -22,13 +23,11 @@ function createTeeWritable(chunks, ...userStreams) {
22
23
  // Pipe to all provided user streams with proper backpressure handling
23
24
  for (const userStream of userStreams) {
24
25
  if (userStream) {
25
- tee.pipe(userStream);
26
+ tee.pipe(userStream, { end: false });
26
27
  }
27
28
  }
28
29
  return tee;
29
30
  }
30
- const POLL_INTERVAL_MS = 500;
31
- const MAX_POLL_ATTEMPTS = 7200;
32
31
  /**
33
32
  * Creates a sandbox, executes a command, and waits for completion.
34
33
  *
@@ -43,6 +42,8 @@ const MAX_POLL_ATTEMPTS = 7200;
43
42
  export async function sandboxRun(client, params) {
44
43
  const { options, orgId, region, apiKey, signal, stdin, stdout, stderr, logger } = params;
45
44
  const started = Date.now();
45
+ if (timingLogsEnabled)
46
+ console.error(`[TIMING] +0ms: sandbox run started`);
46
47
  let stdinStreamId;
47
48
  let stdinStreamUrl;
48
49
  // If stdin is provided and has data, create a stream for it
@@ -71,6 +72,8 @@ export async function sandboxRun(client, params) {
71
72
  const stdoutStreamUrl = createResponse.stdoutStreamUrl;
72
73
  const stderrStreamUrl = createResponse.stderrStreamUrl;
73
74
  logger?.debug('sandbox created: %s, stdoutUrl: %s, stderrUrl: %s', sandboxId, stdoutStreamUrl ?? 'none', stderrStreamUrl ?? 'none');
75
+ if (timingLogsEnabled)
76
+ console.error(`[TIMING] +${Date.now() - started}ms: sandbox created (${sandboxId})`);
74
77
  const abortController = new AbortController();
75
78
  const streamPromises = [];
76
79
  // Create capture buffers for stdout/stderr
@@ -85,12 +88,11 @@ export async function sandboxRun(client, params) {
85
88
  // Check if stdout and stderr are the same stream (combined output)
86
89
  const isCombinedOutput = stdoutStreamUrl && stderrStreamUrl && stdoutStreamUrl === stderrStreamUrl;
87
90
  if (isCombinedOutput) {
88
- // Stream combined output - capture to stdoutChunks, tee to both user's stdout AND stderr
91
+ // Stream combined output to stdout only to avoid duplicates
89
92
  if (stdoutStreamUrl) {
90
93
  logger?.debug('using combined output stream (stdout === stderr)');
91
- // Tee to both stdout and stderr so both user streams receive real-time data
92
- const teeStream = createTeeWritable(stdoutChunks, stdout, stderr);
93
- const combinedPromise = streamUrlToWritable(stdoutStreamUrl, teeStream, abortController.signal, logger);
94
+ const teeStream = createTeeWritable(stdoutChunks, stdout);
95
+ const combinedPromise = streamUrlToWritable(stdoutStreamUrl, teeStream, abortController.signal, logger, started);
94
96
  streamPromises.push(combinedPromise);
95
97
  }
96
98
  }
@@ -98,82 +100,94 @@ export async function sandboxRun(client, params) {
98
100
  // Start stdout streaming with capture
99
101
  if (stdoutStreamUrl) {
100
102
  const teeStream = createTeeWritable(stdoutChunks, stdout);
101
- const stdoutPromise = streamUrlToWritable(stdoutStreamUrl, teeStream, abortController.signal, logger);
103
+ const stdoutPromise = streamUrlToWritable(stdoutStreamUrl, teeStream, abortController.signal, logger, started);
102
104
  streamPromises.push(stdoutPromise);
103
105
  }
104
106
  // Start stderr streaming with capture
105
107
  if (stderrStreamUrl) {
106
108
  const teeStream = createTeeWritable(stderrChunks, stderr);
107
- const stderrPromise = streamUrlToWritable(stderrStreamUrl, teeStream, abortController.signal, logger);
109
+ const stderrPromise = streamUrlToWritable(stderrStreamUrl, teeStream, abortController.signal, logger, started);
108
110
  streamPromises.push(stderrPromise);
109
111
  }
110
112
  }
111
- // Poll for sandbox completion in parallel with streaming
112
- let attempts = 0;
113
- let finalStatus = null;
114
- let finalExitCode;
115
- while (attempts < MAX_POLL_ATTEMPTS) {
116
- if (signal?.aborted) {
117
- abortController.abort();
118
- throw new ExecutionCancelledError({
119
- message: 'Sandbox execution cancelled',
120
- sandboxId,
121
- });
122
- }
123
- await sleep(POLL_INTERVAL_MS);
124
- attempts++;
125
- try {
126
- const sandboxInfo = await sandboxGet(client, { sandboxId, orgId });
127
- if (sandboxInfo.status === 'terminated') {
128
- finalStatus = 'terminated';
129
- finalExitCode = sandboxInfo.exitCode;
130
- break;
113
+ // Wait for streams to complete Pulse closes streams on sandbox termination (EOF).
114
+ // This is our primary completion signal; no polling needed.
115
+ logger?.debug('waiting for streams to complete...');
116
+ if (streamPromises.length > 0) {
117
+ if (signal) {
118
+ // Race streams against abort signal, cleaning up the listener
119
+ // in all cases so an orphaned reject cannot fire after settlement.
120
+ let onAbort;
121
+ try {
122
+ await Promise.race([
123
+ Promise.allSettled(streamPromises),
124
+ new Promise((_, reject) => {
125
+ onAbort = () => {
126
+ abortController.abort();
127
+ reject(new ExecutionCancelledError({
128
+ message: 'Sandbox execution cancelled',
129
+ sandboxId,
130
+ }));
131
+ };
132
+ if (signal.aborted) {
133
+ onAbort();
134
+ }
135
+ else {
136
+ signal.addEventListener('abort', onAbort, { once: true });
137
+ }
138
+ }),
139
+ ]);
131
140
  }
132
- if (sandboxInfo.status === 'failed') {
133
- finalStatus = 'failed';
134
- finalExitCode = sandboxInfo.exitCode;
135
- break;
141
+ finally {
142
+ if (onAbort && signal) {
143
+ signal.removeEventListener('abort', onAbort);
144
+ }
136
145
  }
137
146
  }
138
- catch {
139
- // Ignore polling errors, continue
140
- continue;
147
+ else {
148
+ await Promise.allSettled(streamPromises);
141
149
  }
142
150
  }
143
- // Sandbox completed - wait for streams to complete naturally (EOF)
144
- // Pulse closes streams when the sandbox terminates, so streams should EOF
145
- // We must wait for streams to fully drain before returning
146
- logger?.debug('waiting for streams to complete...');
147
- await Promise.allSettled(streamPromises);
148
- logger?.debug('streams completed');
151
+ else {
152
+ // No streams available (shouldn't happen for oneshot, but handle defensively).
153
+ // Fall back to a single wait then check.
154
+ logger?.debug('no streams to wait on, checking sandbox status directly');
155
+ }
156
+ if (timingLogsEnabled)
157
+ console.error(`[TIMING] +${Date.now() - started}ms: all streams done, fetching exit code`);
158
+ logger?.debug('streams completed, fetching final status');
159
+ // Stream EOF means the sandbox is done — hadron only closes streams after the
160
+ // container exits. Fetch status once for the exit code; if lifecycle events
161
+ // haven't propagated to Catalyst yet, default to exit code 0.
162
+ let exitCode = 0;
163
+ try {
164
+ const sandboxStatus = await sandboxGetStatus(client, { sandboxId, orgId });
165
+ if (sandboxStatus.exitCode != null) {
166
+ exitCode = sandboxStatus.exitCode;
167
+ }
168
+ else if (sandboxStatus.status === 'failed') {
169
+ exitCode = 1;
170
+ }
171
+ }
172
+ catch {
173
+ // Sandbox may already be destroyed (fire-and-forget teardown).
174
+ // Stream EOF already confirmed execution completed.
175
+ logger?.debug('sandboxGetStatus failed after stream EOF, using default exit code 0');
176
+ }
177
+ if (timingLogsEnabled)
178
+ console.error(`[TIMING] +${Date.now() - started}ms: sandboxGet complete (exit: ${exitCode})`);
149
179
  // Build captured output strings
150
180
  const capturedStdout = Buffer.concat(stdoutChunks).toString('utf-8');
151
- // For combined output, stderr is the same as stdout; otherwise use stderrChunks
152
181
  const capturedStderr = isCombinedOutput
153
182
  ? capturedStdout
154
183
  : Buffer.concat(stderrChunks).toString('utf-8');
155
- if (finalStatus === 'terminated') {
156
- return {
157
- sandboxId,
158
- exitCode: finalExitCode ?? 0,
159
- durationMs: Date.now() - started,
160
- stdout: capturedStdout,
161
- stderr: capturedStderr,
162
- };
163
- }
164
- if (finalStatus === 'failed') {
165
- return {
166
- sandboxId,
167
- exitCode: finalExitCode ?? 1,
168
- durationMs: Date.now() - started,
169
- stdout: capturedStdout,
170
- stderr: capturedStderr,
171
- };
172
- }
173
- throw new ExecutionTimeoutError({
174
- message: 'Sandbox execution polling timed out',
184
+ return {
175
185
  sandboxId,
176
- });
186
+ exitCode,
187
+ durationMs: Date.now() - started,
188
+ stdout: capturedStdout,
189
+ stderr: capturedStderr,
190
+ };
177
191
  }
178
192
  catch (error) {
179
193
  abortController.abort();
@@ -281,28 +295,41 @@ async function streamStdinToUrl(stdin, url, apiKey, signal, logger) {
281
295
  }
282
296
  }
283
297
  }
284
- async function streamUrlToWritable(url, writable, signal, logger) {
298
+ async function streamUrlToWritable(url, writable, signal, logger, started) {
285
299
  try {
286
300
  logger?.debug('fetching stream: %s', url);
287
301
  const response = await fetch(url, { signal });
288
302
  logger?.debug('stream response status: %d', response.status);
303
+ if (timingLogsEnabled && started)
304
+ console.error(`[TIMING] +${Date.now() - started}ms: stream response received (status: ${response.status})`);
289
305
  if (!response.ok || !response.body) {
290
306
  logger?.debug('stream response not ok or no body');
291
307
  return;
292
308
  }
293
309
  const reader = response.body.getReader();
310
+ let firstChunk = true;
294
311
  // Read until EOF - Pulse will block until data is available
295
312
  while (true) {
296
313
  const { done, value } = await reader.read();
297
314
  if (done) {
298
315
  logger?.debug('stream EOF');
316
+ if (timingLogsEnabled && started)
317
+ console.error(`[TIMING] +${Date.now() - started}ms: stream EOF`);
299
318
  break;
300
319
  }
301
320
  if (value) {
321
+ if (firstChunk && started) {
322
+ if (timingLogsEnabled)
323
+ console.error(`[TIMING] +${Date.now() - started}ms: first chunk (${value.length} bytes)`);
324
+ firstChunk = false;
325
+ }
302
326
  logger?.debug('stream chunk: %d bytes', value.length);
303
327
  await writeAndDrain(writable, value);
304
328
  }
305
329
  }
330
+ // Signal end-of-stream to the tee/pipe chain so downstream
331
+ // consumers (e.g. process.stdout pipe) know no more data is coming.
332
+ writable.end();
306
333
  }
307
334
  catch (err) {
308
335
  if (err instanceof Error && err.name === 'AbortError') {
@@ -312,7 +339,4 @@ async function streamUrlToWritable(url, writable, signal, logger) {
312
339
  logger?.debug('stream error: %s', err);
313
340
  }
314
341
  }
315
- function sleep(ms) {
316
- return new Promise((resolve) => setTimeout(resolve, ms));
317
- }
318
342
  //# sourceMappingURL=run.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/api/sandbox/run.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/api/sandbox/run.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentuity/server",
3
- "version": "1.0.18",
3
+ "version": "1.0.20",
4
4
  "license": "Apache-2.0",
5
5
  "author": "Agentuity employees and contributors",
6
6
  "type": "module",
@@ -25,12 +25,12 @@
25
25
  "prepublishOnly": "bun run clean && bun run build"
26
26
  },
27
27
  "dependencies": {
28
- "@agentuity/core": "1.0.18",
29
- "@agentuity/schema": "1.0.18",
28
+ "@agentuity/core": "1.0.20",
29
+ "@agentuity/schema": "1.0.20",
30
30
  "zod": "^4.3.5"
31
31
  },
32
32
  "devDependencies": {
33
- "@agentuity/test-utils": "1.0.18",
33
+ "@agentuity/test-utils": "1.0.20",
34
34
  "@types/bun": "latest",
35
35
  "@types/node": "^22.0.0",
36
36
  "bun-types": "latest",
package/src/api/api.ts CHANGED
@@ -368,8 +368,7 @@ export class APIClient {
368
368
 
369
369
  const maxRetries = this.#config?.maxRetries ?? 3;
370
370
  const baseDelayMs = this.#config?.retryDelayMs ?? 100;
371
- const serviceUnavailableTimeoutMs =
372
- this.#config?.serviceUnavailableTimeoutMs ?? 30_000;
371
+ const serviceUnavailableTimeoutMs = this.#config?.serviceUnavailableTimeoutMs ?? 30_000;
373
372
 
374
373
  // Track when we first see a 502/503 so we can retry for up to the timeout
375
374
  let serviceUnavailableStart: number | null = null;
@@ -535,8 +534,7 @@ export class APIClient {
535
534
  // 502/503 indicate the service is restarting (hot-swap) — retry
536
535
  // for up to serviceUnavailableTimeoutMs (default 30s) with a
537
536
  // slower backoff (1s base) so we survive typical restart windows.
538
- const isServiceUnavailable =
539
- response.status === 502 || response.status === 503;
537
+ const isServiceUnavailable = response.status === 502 || response.status === 503;
540
538
 
541
539
  if (isServiceUnavailable && canRetry) {
542
540
  if (serviceUnavailableStart === null) {
@@ -545,10 +543,7 @@ export class APIClient {
545
543
  const elapsed = Date.now() - serviceUnavailableStart;
546
544
  if (elapsed < serviceUnavailableTimeoutMs) {
547
545
  // Use 1s base delay with exponential backoff, capped at 5s
548
- const delayMs = Math.min(
549
- this.#getRetryDelay(attempt, 1000),
550
- 5000
551
- );
546
+ const delayMs = Math.min(this.#getRetryDelay(attempt, 1000), 5000);
552
547
  this.#logger.debug(
553
548
  `Got ${response.status} sending to ${url}, service unavailable for ${Math.round(elapsed / 1000)}s, retrying (will delay ${delayMs}ms), sessionId: ${sessionId ?? null}`
554
549
  );
@@ -172,13 +172,7 @@ export async function getQueueTimeSeries(
172
172
  const queryString = buildAnalyticsQuery(options);
173
173
  const url = queueApiPathWithQuery('analytics/timeseries', queryString, name);
174
174
  const resp = await withQueueErrorHandling(
175
- () =>
176
- client.get(
177
- url,
178
- TimeSeriesResponseSchema,
179
- undefined,
180
- buildQueueHeaders(options?.orgId)
181
- ),
175
+ () => client.get(url, TimeSeriesResponseSchema, undefined, buildQueueHeaders(options?.orgId)),
182
176
  { queueName: name }
183
177
  );
184
178
 
@@ -9,13 +9,12 @@ import {
9
9
  type UpdateDestinationRequest,
10
10
  UpdateDestinationRequestSchema,
11
11
  } from './types.ts';
12
+ import { buildQueueHeaders, QueueError, queueApiPath, withQueueErrorHandling } from './util.ts';
12
13
  import {
13
- buildQueueHeaders,
14
- QueueError,
15
- queueApiPath,
16
- withQueueErrorHandling,
17
- } from './util.ts';
18
- import { validateDestinationConfig, validateDestinationId, validateQueueName } from './validation.ts';
14
+ validateDestinationConfig,
15
+ validateDestinationId,
16
+ validateQueueName,
17
+ } from './validation.ts';
19
18
 
20
19
  export const DestinationResponseSchema = APIResponseSchema(
21
20
  z.object({ destination: DestinationSchema })
@@ -15,7 +15,12 @@ import {
15
15
  queueApiPathWithQuery,
16
16
  withQueueErrorHandling,
17
17
  } from './util.ts';
18
- import { validateLimit, validateMessageId, validateOffset, validateQueueName } from './validation.ts';
18
+ import {
19
+ validateLimit,
20
+ validateMessageId,
21
+ validateOffset,
22
+ validateQueueName,
23
+ } from './validation.ts';
19
24
 
20
25
  export const DlqListResponseSchema = APIResponseSchema(
21
26
  z.object({
@@ -223,12 +228,7 @@ export async function deleteDeadLetterMessage(
223
228
  const url = queueApiPath('dlq/delete', queueName, messageId);
224
229
  const resp = await withQueueErrorHandling(
225
230
  () =>
226
- client.delete(
227
- url,
228
- DeleteDlqResponseSchema,
229
- undefined,
230
- buildQueueHeaders(options?.orgId)
231
- ),
231
+ client.delete(url, DeleteDlqResponseSchema, undefined, buildQueueHeaders(options?.orgId)),
232
232
  { queueName, messageId }
233
233
  );
234
234
 
@@ -342,7 +342,12 @@ export async function deleteQueue(
342
342
  const url = queueApiPath('delete', name);
343
343
  const resp = await withQueueErrorHandling(
344
344
  () =>
345
- client.delete(url, DeleteQueueResponseSchema, undefined, buildQueueHeaders(options?.orgId)),
345
+ client.delete(
346
+ url,
347
+ DeleteQueueResponseSchema,
348
+ undefined,
349
+ buildQueueHeaders(options?.orgId)
350
+ ),
346
351
  { queueName: name }
347
352
  );
348
353
 
@@ -9,12 +9,7 @@ import {
9
9
  type UpdateSourceRequest,
10
10
  UpdateSourceRequestSchema,
11
11
  } from './types.ts';
12
- import {
13
- buildQueueHeaders,
14
- QueueError,
15
- queueApiPath,
16
- withQueueErrorHandling,
17
- } from './util.ts';
12
+ import { buildQueueHeaders, QueueError, queueApiPath, withQueueErrorHandling } from './util.ts';
18
13
  import { validateQueueName, validateSourceId, validateSourceName } from './validation.ts';
19
14
 
20
15
  export const SourceResponseSchema = APIResponseSchema(z.object({ source: SourceSchema }));
@@ -26,6 +26,22 @@
26
26
  * connection.close();
27
27
  * ```
28
28
  *
29
+ * @example Resuming from a previous session
30
+ * ```typescript
31
+ * import { createQueueWebSocket } from '@agentuity/server';
32
+ *
33
+ * // Use a previously obtained clientId and lastOffset to resume
34
+ * const connection = createQueueWebSocket({
35
+ * queueName: 'order-processing',
36
+ * baseUrl: 'https://catalyst.agentuity.cloud',
37
+ * clientId: previousClientId,
38
+ * lastOffset: previousOffset,
39
+ * onMessage: (message) => {
40
+ * console.log('Received:', message.id, message.payload);
41
+ * },
42
+ * });
43
+ * ```
44
+ *
29
45
  * @example Async iterator API
30
46
  * ```typescript
31
47
  * import { subscribeToQueue } from '@agentuity/server';
@@ -82,6 +98,10 @@ export interface QueueWebSocketOptions {
82
98
  reconnectDelayMs?: number;
83
99
  /** Maximum reconnection delay in ms (default: 30000). */
84
100
  maxReconnectDelayMs?: number;
101
+ /** Optional client ID from a previous session to resume a subscription. */
102
+ clientId?: string;
103
+ /** Optional last processed offset from a previous session to resume from. */
104
+ lastOffset?: number;
85
105
  }
86
106
 
87
107
  /** Return type from {@link createQueueWebSocket}. */
@@ -106,6 +126,10 @@ export interface SubscribeToQueueOptions {
106
126
  baseUrl: string;
107
127
  /** AbortSignal to stop the subscription. */
108
128
  signal?: AbortSignal;
129
+ /** Optional client ID from a previous session to resume a subscription. */
130
+ clientId?: string;
131
+ /** Optional last processed offset from a previous session to resume from. */
132
+ lastOffset?: number;
109
133
  }
110
134
 
111
135
  // ============================================================================
@@ -192,8 +216,8 @@ export function createQueueWebSocket(options: QueueWebSocketOptions): QueueWebSo
192
216
  let intentionallyClosed = false;
193
217
  let reconnectAttempts = 0;
194
218
  let reconnectTimer: ReturnType<typeof setTimeout> | null = null;
195
- let clientId: string | undefined;
196
- let lastProcessedOffset: number | undefined;
219
+ let clientId: string | undefined = options.clientId;
220
+ let lastProcessedOffset: number | undefined = options.lastOffset;
197
221
 
198
222
  function connect() {
199
223
  if (intentionallyClosed) return;
@@ -210,7 +234,7 @@ export function createQueueWebSocket(options: QueueWebSocketOptions): QueueWebSo
210
234
  message: `Failed to create WebSocket connection: ${err instanceof Error ? err.message : String(err)}`,
211
235
  queueName,
212
236
  cause: err instanceof Error ? err : undefined,
213
- }),
237
+ })
214
238
  );
215
239
  scheduleReconnect();
216
240
  return;
@@ -319,7 +343,7 @@ export function createQueueWebSocket(options: QueueWebSocketOptions): QueueWebSo
319
343
  new QueueError({
320
344
  message: 'WebSocket connection error',
321
345
  queueName,
322
- }),
346
+ })
323
347
  );
324
348
  };
325
349
  }
@@ -331,7 +355,7 @@ export function createQueueWebSocket(options: QueueWebSocketOptions): QueueWebSo
331
355
  new QueueError({
332
356
  message: `Exceeded maximum reconnection attempts (${maxReconnectAttempts})`,
333
357
  queueName,
334
- }),
358
+ })
335
359
  );
336
360
  return;
337
361
  }
@@ -405,7 +429,7 @@ export function createQueueWebSocket(options: QueueWebSocketOptions): QueueWebSo
405
429
  * ```
406
430
  */
407
431
  export async function* subscribeToQueue(
408
- options: SubscribeToQueueOptions,
432
+ options: SubscribeToQueueOptions
409
433
  ): AsyncGenerator<Message, void, unknown> {
410
434
  const { signal } = options;
411
435
 
@@ -440,6 +464,8 @@ export async function* subscribeToQueue(
440
464
  queueName: options.queueName,
441
465
  apiKey: options.apiKey,
442
466
  baseUrl: options.baseUrl,
467
+ clientId: options.clientId,
468
+ lastOffset: options.lastOffset,
443
469
  onMessage: push,
444
470
  onError: (err) => finish(err),
445
471
  onClose: () => {
@@ -51,6 +51,12 @@ export function validateDatabaseName(name: string): { valid: boolean; error?: st
51
51
  error: 'database name must start with a letter or underscore and contain only lowercase letters, digits, and underscores',
52
52
  };
53
53
  }
54
+ if (name.startsWith('pg_')) {
55
+ return {
56
+ valid: false,
57
+ error: "database name cannot start with 'pg_' (reserved by PostgreSQL)",
58
+ };
59
+ }
54
60
  return { valid: true };
55
61
  }
56
62
 
@@ -45,7 +45,15 @@ export interface CLISandboxListOptions {
45
45
  /**
46
46
  * Filter by sandbox status
47
47
  */
48
- status?: 'creating' | 'idle' | 'running' | 'paused' | 'stopping' | 'suspended' | 'terminated' | 'failed';
48
+ status?:
49
+ | 'creating'
50
+ | 'idle'
51
+ | 'running'
52
+ | 'paused'
53
+ | 'stopping'
54
+ | 'suspended'
55
+ | 'terminated'
56
+ | 'failed';
49
57
  /**
50
58
  * Maximum number of sandboxes to return (default: 50, max: 100)
51
59
  */
@@ -177,6 +177,11 @@ export interface SandboxInstance {
177
177
  */
178
178
  stderrStreamUrl?: string;
179
179
 
180
+ /**
181
+ * URL to stream audit events (eBPF/Tetragon security events)
182
+ */
183
+ auditStreamUrl?: string;
184
+
180
185
  /**
181
186
  * Execute a command in the sandbox
182
187
  */
@@ -313,6 +318,7 @@ export class SandboxClient {
313
318
  status: response.status,
314
319
  stdoutStreamUrl: response.stdoutStreamUrl,
315
320
  stderrStreamUrl: response.stderrStreamUrl,
321
+ auditStreamUrl: response.auditStreamUrl,
316
322
 
317
323
  async execute(executeOptions: ExecuteOptions): Promise<Execution> {
318
324
  const { pipe, ...coreOptions } = executeOptions;
@@ -122,12 +122,23 @@ export const SandboxCreateDataSchema = z
122
122
  .object({
123
123
  sandboxId: z.string().describe('Unique identifier for the created sandbox'),
124
124
  status: z
125
- .enum(['creating', 'idle', 'running', 'paused', 'stopping', 'suspended', 'terminated', 'failed'])
125
+ .enum([
126
+ 'creating',
127
+ 'idle',
128
+ 'running',
129
+ 'paused',
130
+ 'stopping',
131
+ 'suspended',
132
+ 'terminated',
133
+ 'failed',
134
+ ])
126
135
  .describe('Current status of the sandbox'),
127
136
  stdoutStreamId: z.string().optional().describe('Stream ID for reading stdout'),
128
137
  stdoutStreamUrl: z.string().optional().describe('URL for streaming stdout output'),
129
138
  stderrStreamId: z.string().optional().describe('Stream ID for reading stderr'),
130
139
  stderrStreamUrl: z.string().optional().describe('URL for streaming stderr output'),
140
+ auditStreamId: z.string().optional().describe('Stream ID for reading audit events'),
141
+ auditStreamUrl: z.string().optional().describe('URL for streaming audit events'),
131
142
  })
132
143
  .describe('Response data from sandbox creation');
133
144
 
@@ -140,6 +151,8 @@ export interface SandboxCreateResponse {
140
151
  stdoutStreamUrl?: string;
141
152
  stderrStreamId?: string;
142
153
  stderrStreamUrl?: string;
154
+ auditStreamId?: string;
155
+ auditStreamUrl?: string;
143
156
  }
144
157
 
145
158
  export interface SandboxCreateParams {