@agentuity/server 1.0.14 → 1.0.16

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 (60) hide show
  1. package/dist/api/api.d.ts +6 -0
  2. package/dist/api/api.d.ts.map +1 -1
  3. package/dist/api/api.js +27 -5
  4. package/dist/api/api.js.map +1 -1
  5. package/dist/api/queue/index.d.ts +2 -1
  6. package/dist/api/queue/index.d.ts.map +1 -1
  7. package/dist/api/queue/index.js +5 -1
  8. package/dist/api/queue/index.js.map +1 -1
  9. package/dist/api/queue/types.d.ts +61 -0
  10. package/dist/api/queue/types.d.ts.map +1 -1
  11. package/dist/api/queue/types.js +41 -0
  12. package/dist/api/queue/types.js.map +1 -1
  13. package/dist/api/queue/websocket.d.ts +144 -0
  14. package/dist/api/queue/websocket.d.ts.map +1 -0
  15. package/dist/api/queue/websocket.js +376 -0
  16. package/dist/api/queue/websocket.js.map +1 -0
  17. package/dist/api/region/create.d.ts.map +1 -1
  18. package/dist/api/region/create.js +7 -0
  19. package/dist/api/region/create.js.map +1 -1
  20. package/dist/api/sandbox/create.d.ts +1 -0
  21. package/dist/api/sandbox/create.d.ts.map +1 -1
  22. package/dist/api/sandbox/create.js +10 -0
  23. package/dist/api/sandbox/create.js.map +1 -1
  24. package/dist/api/sandbox/get.d.ts +2 -0
  25. package/dist/api/sandbox/get.d.ts.map +1 -1
  26. package/dist/api/sandbox/get.js +5 -0
  27. package/dist/api/sandbox/get.js.map +1 -1
  28. package/dist/api/sandbox/index.d.ts +1 -1
  29. package/dist/api/sandbox/index.d.ts.map +1 -1
  30. package/dist/api/sandbox/index.js +1 -1
  31. package/dist/api/sandbox/index.js.map +1 -1
  32. package/dist/api/sandbox/snapshot-build.d.ts +14 -1
  33. package/dist/api/sandbox/snapshot-build.d.ts.map +1 -1
  34. package/dist/api/sandbox/snapshot-build.js +21 -3
  35. package/dist/api/sandbox/snapshot-build.js.map +1 -1
  36. package/dist/api/sandbox/snapshot.d.ts +1 -0
  37. package/dist/api/sandbox/snapshot.d.ts.map +1 -1
  38. package/dist/api/sandbox/snapshot.js +10 -1
  39. package/dist/api/sandbox/snapshot.js.map +1 -1
  40. package/dist/index.d.ts +1 -0
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +2 -0
  43. package/dist/index.js.map +1 -1
  44. package/dist/util/mime.d.ts +10 -0
  45. package/dist/util/mime.d.ts.map +1 -0
  46. package/dist/util/mime.js +102 -0
  47. package/dist/util/mime.js.map +1 -0
  48. package/package.json +4 -4
  49. package/src/api/api.ts +43 -7
  50. package/src/api/queue/index.ts +19 -0
  51. package/src/api/queue/types.ts +51 -0
  52. package/src/api/queue/websocket.ts +488 -0
  53. package/src/api/region/create.ts +7 -0
  54. package/src/api/sandbox/create.ts +15 -0
  55. package/src/api/sandbox/get.ts +5 -0
  56. package/src/api/sandbox/index.ts +1 -1
  57. package/src/api/sandbox/snapshot-build.ts +29 -3
  58. package/src/api/sandbox/snapshot.ts +15 -1
  59. package/src/index.ts +3 -0
  60. package/src/util/mime.ts +109 -0
@@ -0,0 +1,144 @@
1
+ /**
2
+ * @module websocket
3
+ *
4
+ * WebSocket client for real-time queue message subscriptions.
5
+ *
6
+ * Provides both a callback-based API ({@link createQueueWebSocket}) and an
7
+ * async iterator API ({@link subscribeToQueue}) for receiving messages from
8
+ * a queue in real time via WebSocket.
9
+ *
10
+ * @example Callback-based API
11
+ * ```typescript
12
+ * import { createQueueWebSocket } from '@agentuity/server';
13
+ *
14
+ * const connection = createQueueWebSocket({
15
+ * queueName: 'order-processing',
16
+ * baseUrl: 'https://catalyst.agentuity.cloud',
17
+ * onMessage: (message) => {
18
+ * console.log('Received:', message.id, message.payload);
19
+ * },
20
+ * onOpen: () => console.log('Connected'),
21
+ * onClose: (code, reason) => console.log('Closed:', code, reason),
22
+ * onError: (error) => console.error('Error:', error),
23
+ * });
24
+ *
25
+ * // Later: close the connection
26
+ * connection.close();
27
+ * ```
28
+ *
29
+ * @example Async iterator API
30
+ * ```typescript
31
+ * import { subscribeToQueue } from '@agentuity/server';
32
+ *
33
+ * const controller = new AbortController();
34
+ * for await (const message of subscribeToQueue({
35
+ * queueName: 'order-processing',
36
+ * baseUrl: 'https://catalyst.agentuity.cloud',
37
+ * signal: controller.signal,
38
+ * })) {
39
+ * console.log('Received:', message.id, message.payload);
40
+ * }
41
+ * ```
42
+ */
43
+ import type { Message } from './types';
44
+ /** Connection state for a queue WebSocket connection. */
45
+ export type QueueWebSocketState = 'connecting' | 'authenticating' | 'connected' | 'reconnecting' | 'closed';
46
+ /** Options for creating a queue WebSocket subscription. */
47
+ export interface QueueWebSocketOptions {
48
+ /** Queue name to subscribe to. */
49
+ queueName: string;
50
+ /** API key for authentication (if not provided, uses AGENTUITY_SDK_KEY env var). */
51
+ apiKey?: string;
52
+ /** Base URL of the catalyst service (e.g., https://catalyst.agentuity.cloud). */
53
+ baseUrl: string;
54
+ /** Called when a message is received. */
55
+ onMessage: (message: Message) => void;
56
+ /** Called when the connection is established and authenticated. */
57
+ onOpen?: () => void;
58
+ /** Called when the connection is closed. */
59
+ onClose?: (code: number, reason: string) => void;
60
+ /** Called when an error occurs. */
61
+ onError?: (error: Error) => void;
62
+ /** Whether to automatically reconnect on disconnection (default: true). */
63
+ autoReconnect?: boolean;
64
+ /** Maximum number of reconnection attempts (default: Infinity). */
65
+ maxReconnectAttempts?: number;
66
+ /** Initial reconnection delay in ms (default: 1000). Uses exponential backoff. */
67
+ reconnectDelayMs?: number;
68
+ /** Maximum reconnection delay in ms (default: 30000). */
69
+ maxReconnectDelayMs?: number;
70
+ }
71
+ /** Return type from {@link createQueueWebSocket}. */
72
+ export interface QueueWebSocketConnection {
73
+ /** Close the WebSocket connection. Disables auto-reconnect. */
74
+ close(): void;
75
+ /** The current connection state. */
76
+ readonly state: QueueWebSocketState;
77
+ /** The client/subscription ID assigned by the server. Stable across reconnections. */
78
+ readonly clientId: string | undefined;
79
+ /** The offset of the last message processed. */
80
+ readonly lastOffset: number | undefined;
81
+ }
82
+ /** Options for the async iterator queue subscription. */
83
+ export interface SubscribeToQueueOptions {
84
+ /** Queue name to subscribe to. */
85
+ queueName: string;
86
+ /** API key for authentication (if not provided, uses AGENTUITY_SDK_KEY env var). */
87
+ apiKey?: string;
88
+ /** Base URL of the catalyst service. */
89
+ baseUrl: string;
90
+ /** AbortSignal to stop the subscription. */
91
+ signal?: AbortSignal;
92
+ }
93
+ /**
94
+ * Create a WebSocket connection to receive real-time messages from a queue.
95
+ *
96
+ * The connection handles authentication, automatic reconnection with exponential
97
+ * backoff, and ping/pong keep-alive (handled automatically by the WebSocket
98
+ * implementation).
99
+ *
100
+ * @param options - Configuration for the WebSocket connection
101
+ * @returns A {@link QueueWebSocketConnection} handle for managing the connection
102
+ * @throws {QueueError} If no API key is available
103
+ * @throws {QueueValidationError} If the queue name is invalid
104
+ *
105
+ * @example
106
+ * ```typescript
107
+ * const connection = createQueueWebSocket({
108
+ * queueName: 'order-processing',
109
+ * baseUrl: 'https://catalyst.agentuity.cloud',
110
+ * onMessage: (message) => {
111
+ * console.log('Received:', message.id, message.payload);
112
+ * },
113
+ * });
114
+ *
115
+ * // Later: close the connection
116
+ * connection.close();
117
+ * ```
118
+ */
119
+ export declare function createQueueWebSocket(options: QueueWebSocketOptions): QueueWebSocketConnection;
120
+ /**
121
+ * Subscribe to real-time messages from a queue via WebSocket.
122
+ *
123
+ * Returns an async iterator that yields messages as they arrive.
124
+ * The connection is automatically managed (auth, reconnection, cleanup).
125
+ *
126
+ * @param options - Configuration for the subscription
127
+ * @returns An async generator that yields {@link Message} objects
128
+ * @throws {QueueError} If no API key is available
129
+ * @throws {QueueValidationError} If the queue name is invalid
130
+ *
131
+ * @example
132
+ * ```typescript
133
+ * const controller = new AbortController();
134
+ * for await (const message of subscribeToQueue({
135
+ * queueName: 'order-processing',
136
+ * baseUrl: 'https://catalyst.agentuity.cloud',
137
+ * signal: controller.signal,
138
+ * })) {
139
+ * console.log('Received:', message.id, message.payload);
140
+ * }
141
+ * ```
142
+ */
143
+ export declare function subscribeToQueue(options: SubscribeToQueueOptions): AsyncGenerator<Message, void, unknown>;
144
+ //# sourceMappingURL=websocket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../../src/api/queue/websocket.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AASvC,yDAAyD;AACzD,MAAM,MAAM,mBAAmB,GAC5B,YAAY,GACZ,gBAAgB,GAChB,WAAW,GACX,cAAc,GACd,QAAQ,CAAC;AAEZ,2DAA2D;AAC3D,MAAM,WAAW,qBAAqB;IACrC,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,oFAAoF;IACpF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iFAAiF;IACjF,OAAO,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,mCAAmC;IACnC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,2EAA2E;IAC3E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mEAAmE;IACnE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,kFAAkF;IAClF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yDAAyD;IACzD,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,qDAAqD;AACrD,MAAM,WAAW,wBAAwB;IACxC,+DAA+D;IAC/D,KAAK,IAAI,IAAI,CAAC;IACd,oCAAoC;IACpC,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAC;IACpC,sFAAsF;IACtF,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,gDAAgD;IAChD,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC;AAED,yDAAyD;AACzD,MAAM,WAAW,uBAAuB;IACvC,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,oFAAoF;IACpF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB;AAqCD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG,wBAAwB,CA8M7F;AAMD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAuB,gBAAgB,CACtC,OAAO,EAAE,uBAAuB,GAC9B,cAAc,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CA+ExC"}
@@ -0,0 +1,376 @@
1
+ /**
2
+ * @module websocket
3
+ *
4
+ * WebSocket client for real-time queue message subscriptions.
5
+ *
6
+ * Provides both a callback-based API ({@link createQueueWebSocket}) and an
7
+ * async iterator API ({@link subscribeToQueue}) for receiving messages from
8
+ * a queue in real time via WebSocket.
9
+ *
10
+ * @example Callback-based API
11
+ * ```typescript
12
+ * import { createQueueWebSocket } from '@agentuity/server';
13
+ *
14
+ * const connection = createQueueWebSocket({
15
+ * queueName: 'order-processing',
16
+ * baseUrl: 'https://catalyst.agentuity.cloud',
17
+ * onMessage: (message) => {
18
+ * console.log('Received:', message.id, message.payload);
19
+ * },
20
+ * onOpen: () => console.log('Connected'),
21
+ * onClose: (code, reason) => console.log('Closed:', code, reason),
22
+ * onError: (error) => console.error('Error:', error),
23
+ * });
24
+ *
25
+ * // Later: close the connection
26
+ * connection.close();
27
+ * ```
28
+ *
29
+ * @example Async iterator API
30
+ * ```typescript
31
+ * import { subscribeToQueue } from '@agentuity/server';
32
+ *
33
+ * const controller = new AbortController();
34
+ * for await (const message of subscribeToQueue({
35
+ * queueName: 'order-processing',
36
+ * baseUrl: 'https://catalyst.agentuity.cloud',
37
+ * signal: controller.signal,
38
+ * })) {
39
+ * console.log('Received:', message.id, message.payload);
40
+ * }
41
+ * ```
42
+ */
43
+ import { WebSocketAuthResponseSchema, WebSocketMessageSchema } from './types';
44
+ import { QueueError } from './util';
45
+ import { validateQueueName } from './validation';
46
+ // ============================================================================
47
+ // Internal Helpers
48
+ // ============================================================================
49
+ /**
50
+ * Resolve the API key from the options or the AGENTUITY_SDK_KEY environment variable.
51
+ * Throws a {@link QueueError} if no API key is available.
52
+ */
53
+ function resolveApiKey(apiKey) {
54
+ const key = apiKey ?? process.env.AGENTUITY_SDK_KEY;
55
+ if (!key) {
56
+ throw new QueueError({
57
+ message: 'No API key provided. Pass apiKey in options or set the AGENTUITY_SDK_KEY environment variable.',
58
+ });
59
+ }
60
+ return key;
61
+ }
62
+ /**
63
+ * Convert an HTTP(S) base URL to a WebSocket URL and append the queue path.
64
+ *
65
+ * The WebSocket route is registered at `/queue/ws/{name}` (not versioned).
66
+ */
67
+ function buildWebSocketUrl(baseUrl, queueName) {
68
+ const wsUrl = baseUrl.replace(/^https:\/\//, 'wss://').replace(/^http:\/\//, 'ws://');
69
+ // Remove trailing slash if present
70
+ const base = wsUrl.replace(/\/$/, '');
71
+ return `${base}/queue/ws/${encodeURIComponent(queueName)}`;
72
+ }
73
+ // ============================================================================
74
+ // Callback-based API
75
+ // ============================================================================
76
+ /**
77
+ * Create a WebSocket connection to receive real-time messages from a queue.
78
+ *
79
+ * The connection handles authentication, automatic reconnection with exponential
80
+ * backoff, and ping/pong keep-alive (handled automatically by the WebSocket
81
+ * implementation).
82
+ *
83
+ * @param options - Configuration for the WebSocket connection
84
+ * @returns A {@link QueueWebSocketConnection} handle for managing the connection
85
+ * @throws {QueueError} If no API key is available
86
+ * @throws {QueueValidationError} If the queue name is invalid
87
+ *
88
+ * @example
89
+ * ```typescript
90
+ * const connection = createQueueWebSocket({
91
+ * queueName: 'order-processing',
92
+ * baseUrl: 'https://catalyst.agentuity.cloud',
93
+ * onMessage: (message) => {
94
+ * console.log('Received:', message.id, message.payload);
95
+ * },
96
+ * });
97
+ *
98
+ * // Later: close the connection
99
+ * connection.close();
100
+ * ```
101
+ */
102
+ export function createQueueWebSocket(options) {
103
+ // Validate inputs eagerly so callers get immediate feedback.
104
+ validateQueueName(options.queueName);
105
+ const apiKey = resolveApiKey(options.apiKey);
106
+ const { queueName, baseUrl, onMessage, onOpen, onClose, onError, autoReconnect = true, maxReconnectAttempts = Infinity, reconnectDelayMs = 1000, maxReconnectDelayMs = 30000, } = options;
107
+ let state = 'connecting';
108
+ let ws = null;
109
+ let intentionallyClosed = false;
110
+ let reconnectAttempts = 0;
111
+ let reconnectTimer = null;
112
+ let clientId;
113
+ let lastProcessedOffset;
114
+ function connect() {
115
+ if (intentionallyClosed)
116
+ return;
117
+ const url = buildWebSocketUrl(baseUrl, queueName);
118
+ state = reconnectAttempts > 0 ? 'reconnecting' : 'connecting';
119
+ try {
120
+ ws = new WebSocket(url);
121
+ }
122
+ catch (err) {
123
+ state = 'closed';
124
+ onError?.(new QueueError({
125
+ message: `Failed to create WebSocket connection: ${err instanceof Error ? err.message : String(err)}`,
126
+ queueName,
127
+ cause: err instanceof Error ? err : undefined,
128
+ }));
129
+ scheduleReconnect();
130
+ return;
131
+ }
132
+ ws.onopen = () => {
133
+ state = 'authenticating';
134
+ // Send auth message — raw API key, no "Bearer " prefix.
135
+ // Include client_id and last_offset on reconnect for resumption.
136
+ const authPayload = { authorization: apiKey };
137
+ if (clientId) {
138
+ authPayload.client_id = clientId;
139
+ }
140
+ if (lastProcessedOffset !== undefined) {
141
+ authPayload.last_offset = lastProcessedOffset;
142
+ }
143
+ ws.send(JSON.stringify(authPayload));
144
+ };
145
+ /** Whether the auth handshake has completed successfully. */
146
+ let authenticated = false;
147
+ ws.onmessage = (event) => {
148
+ const raw = typeof event.data === 'string' ? event.data : String(event.data);
149
+ if (!authenticated) {
150
+ // First message after open must be the auth response.
151
+ try {
152
+ const parsed = JSON.parse(raw);
153
+ const authResult = WebSocketAuthResponseSchema.safeParse(parsed);
154
+ if (!authResult.success) {
155
+ const err = new QueueError({
156
+ message: `Unexpected auth response from server: ${raw}`,
157
+ queueName,
158
+ });
159
+ onError?.(err);
160
+ ws?.close(4000, 'Invalid auth response');
161
+ return;
162
+ }
163
+ if (!authResult.data.success) {
164
+ const err = new QueueError({
165
+ message: `Authentication failed: ${authResult.data.error ?? 'Unknown error'}`,
166
+ queueName,
167
+ });
168
+ onError?.(err);
169
+ // Auth rejection is terminal — do not reconnect with the same bad credentials.
170
+ intentionallyClosed = true;
171
+ ws?.close(4001, 'Auth failed');
172
+ return;
173
+ }
174
+ authenticated = true;
175
+ reconnectAttempts = 0; // Reset on successful auth.
176
+ state = 'connected';
177
+ if (authResult.data.client_id) {
178
+ clientId = authResult.data.client_id;
179
+ }
180
+ onOpen?.();
181
+ }
182
+ catch {
183
+ const err = new QueueError({
184
+ message: `Failed to parse auth response: ${raw}`,
185
+ queueName,
186
+ });
187
+ onError?.(err);
188
+ ws?.close(4000, 'Invalid auth response');
189
+ }
190
+ return;
191
+ }
192
+ // Normal message after authentication.
193
+ try {
194
+ const parsed = JSON.parse(raw);
195
+ const msgResult = WebSocketMessageSchema.safeParse(parsed);
196
+ if (msgResult.success && msgResult.data.messages.length > 0) {
197
+ for (const msg of msgResult.data.messages) {
198
+ onMessage(msg);
199
+ if (msg.offset !== undefined) {
200
+ lastProcessedOffset = msg.offset;
201
+ }
202
+ }
203
+ }
204
+ }
205
+ catch {
206
+ // Non-JSON frames are silently ignored; the server may send
207
+ // ping text frames that are not JSON.
208
+ }
209
+ };
210
+ ws.onclose = (event) => {
211
+ state = 'closed';
212
+ ws = null;
213
+ onClose?.(event.code, event.reason);
214
+ // Reconnect on any unintentional close — whether we were fully
215
+ // connected, mid-auth, or never authenticated (transient network issue).
216
+ if (!intentionallyClosed) {
217
+ scheduleReconnect();
218
+ }
219
+ };
220
+ ws.onerror = () => {
221
+ // The browser/Node WebSocket fires `error` then `close`.
222
+ // We report the error but let `onclose` handle reconnection.
223
+ onError?.(new QueueError({
224
+ message: 'WebSocket connection error',
225
+ queueName,
226
+ }));
227
+ };
228
+ }
229
+ function scheduleReconnect() {
230
+ if (intentionallyClosed || !autoReconnect)
231
+ return;
232
+ if (reconnectAttempts >= maxReconnectAttempts) {
233
+ onError?.(new QueueError({
234
+ message: `Exceeded maximum reconnection attempts (${maxReconnectAttempts})`,
235
+ queueName,
236
+ }));
237
+ return;
238
+ }
239
+ // Exponential backoff with jitter, capped at maxReconnectDelayMs.
240
+ const baseDelay = reconnectDelayMs * Math.pow(2, reconnectAttempts);
241
+ const jitter = 0.5 + Math.random() * 0.5;
242
+ const delay = Math.min(Math.floor(baseDelay * jitter), maxReconnectDelayMs);
243
+ reconnectAttempts++;
244
+ state = 'reconnecting';
245
+ reconnectTimer = setTimeout(() => {
246
+ reconnectTimer = null;
247
+ connect();
248
+ }, delay);
249
+ }
250
+ // Kick off the initial connection.
251
+ connect();
252
+ return {
253
+ close() {
254
+ intentionallyClosed = true;
255
+ if (reconnectTimer !== null) {
256
+ clearTimeout(reconnectTimer);
257
+ reconnectTimer = null;
258
+ }
259
+ if (ws) {
260
+ ws.close(1000, 'Client closed');
261
+ ws = null;
262
+ }
263
+ state = 'closed';
264
+ },
265
+ get state() {
266
+ return state;
267
+ },
268
+ get clientId() {
269
+ return clientId;
270
+ },
271
+ get lastOffset() {
272
+ return lastProcessedOffset;
273
+ },
274
+ };
275
+ }
276
+ // ============================================================================
277
+ // Async Iterator API
278
+ // ============================================================================
279
+ /**
280
+ * Subscribe to real-time messages from a queue via WebSocket.
281
+ *
282
+ * Returns an async iterator that yields messages as they arrive.
283
+ * The connection is automatically managed (auth, reconnection, cleanup).
284
+ *
285
+ * @param options - Configuration for the subscription
286
+ * @returns An async generator that yields {@link Message} objects
287
+ * @throws {QueueError} If no API key is available
288
+ * @throws {QueueValidationError} If the queue name is invalid
289
+ *
290
+ * @example
291
+ * ```typescript
292
+ * const controller = new AbortController();
293
+ * for await (const message of subscribeToQueue({
294
+ * queueName: 'order-processing',
295
+ * baseUrl: 'https://catalyst.agentuity.cloud',
296
+ * signal: controller.signal,
297
+ * })) {
298
+ * console.log('Received:', message.id, message.payload);
299
+ * }
300
+ * ```
301
+ */
302
+ export async function* subscribeToQueue(options) {
303
+ const { signal } = options;
304
+ // Check if already aborted.
305
+ if (signal?.aborted)
306
+ return;
307
+ // A queue for buffering messages between the WebSocket callbacks and the
308
+ // async iterator consumer.
309
+ const buffer = [];
310
+ let resolve = null;
311
+ let done = false;
312
+ let lastError = null;
313
+ function push(message) {
314
+ buffer.push(message);
315
+ if (resolve) {
316
+ resolve();
317
+ resolve = null;
318
+ }
319
+ }
320
+ function finish(error) {
321
+ done = true;
322
+ if (error)
323
+ lastError = error;
324
+ if (resolve) {
325
+ resolve();
326
+ resolve = null;
327
+ }
328
+ }
329
+ const connection = createQueueWebSocket({
330
+ queueName: options.queueName,
331
+ apiKey: options.apiKey,
332
+ baseUrl: options.baseUrl,
333
+ onMessage: push,
334
+ onError: (err) => finish(err),
335
+ onClose: () => {
336
+ // Only finish if the connection is intentionally closed (signal aborted).
337
+ // Otherwise, the callback-based API handles reconnection.
338
+ },
339
+ autoReconnect: true,
340
+ });
341
+ // Wire up the abort signal to close the connection.
342
+ const onAbort = () => {
343
+ connection.close();
344
+ finish();
345
+ };
346
+ signal?.addEventListener('abort', onAbort, { once: true });
347
+ try {
348
+ while (!done) {
349
+ // Drain buffered messages.
350
+ while (buffer.length > 0) {
351
+ yield buffer.shift();
352
+ // Re-check after yield in case signal was aborted.
353
+ if (done || signal?.aborted)
354
+ return;
355
+ }
356
+ if (done || signal?.aborted)
357
+ return;
358
+ // Wait for the next message or completion.
359
+ await new Promise((r) => {
360
+ resolve = r;
361
+ });
362
+ }
363
+ // Drain any remaining messages.
364
+ while (buffer.length > 0) {
365
+ yield buffer.shift();
366
+ }
367
+ if (lastError) {
368
+ throw lastError;
369
+ }
370
+ }
371
+ finally {
372
+ signal?.removeEventListener('abort', onAbort);
373
+ connection.close();
374
+ }
375
+ }
376
+ //# sourceMappingURL=websocket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../../src/api/queue/websocket.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/api/region/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAqB,SAAS,EAAE,MAAM,QAAQ,CAAC;AA6BtD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAoBrF;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA8CnF;AAgBD,eAAO,MAAM,YAAY;;;;;;;iBAIvB,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;;;;;;;iBAEjC,CAAC;AAEH,eAAO,MAAM,eAAe;;;;iBAI1B,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;;;;iBAElC,CAAC;AAEH,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;8BAA6C,CAAC;AAExF,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAC5E,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AACpF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE9D;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CACpC,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAC1E,OAAO,CAAC,eAAe,EAAE,CAAC,CA8B5B"}
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/api/region/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAqB,SAAS,EAAE,MAAM,QAAQ,CAAC;AA6BtD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAoBrF;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAqDnF;AAgBD,eAAO,MAAM,YAAY;;;;;;;iBAIvB,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;;;;;;;iBAEjC,CAAC;AAEH,eAAO,MAAM,eAAe;;;;iBAI1B,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;;;;iBAElC,CAAC;AAEH,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;8BAA6C,CAAC;AAExF,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAC5E,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC,CAAC;AACpF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE9D;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CACpC,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAC1E,OAAO,CAAC,eAAe,EAAE,CAAC,CA8B5B"}
@@ -95,6 +95,13 @@ export function validateBucketName(name) {
95
95
  if (isIPv4Address(name)) {
96
96
  return { valid: false, error: 'bucket name cannot be an IP address' };
97
97
  }
98
+ // Reserved prefixes (system-generated names)
99
+ if (name.startsWith('ag-') || name.startsWith('ago-')) {
100
+ return {
101
+ valid: false,
102
+ error: 'bucket names starting with "ag-" or "ago-" are reserved for system use',
103
+ };
104
+ }
98
105
  return { valid: true };
99
106
  }
100
107
  function isIPv4Address(s) {
@@ -1 +1 @@
1
- {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/api/region/create.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/api/region/create.ts"],"names":[],"mappings":"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"}
@@ -44,6 +44,7 @@ export declare const SandboxCreateRequestSchema: z.ZodObject<{
44
44
  }, z.core.$strip>>>;
45
45
  snapshot: z.ZodOptional<z.ZodString>;
46
46
  dependencies: z.ZodOptional<z.ZodArray<z.ZodString>>;
47
+ packages: z.ZodOptional<z.ZodArray<z.ZodString>>;
47
48
  metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
48
49
  }, z.core.$strip>;
49
50
  export declare const SandboxCreateDataSchema: z.ZodObject<{
@@ -1 +1 @@
1
- {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/api/sandbox/create.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,KAAK,SAAS,EAAqB,MAAM,QAAQ,CAAC;AAG3D,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAqGc,CAAC;AAEtD,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;iBAWa,CAAC;AAElD,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;8BAA6C,CAAC;AAEtF,MAAM,WAAW,qBAAqB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,aAAa,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IACnC,OAAO,CAAC,EAAE,oBAAoB,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAClC,MAAM,EAAE,SAAS,EACjB,MAAM,GAAE,mBAAwB,GAC9B,OAAO,CAAC,qBAAqB,CAAC,CA+EhC"}
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/api/sandbox/create.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,KAAK,SAAS,EAAqB,MAAM,QAAQ,CAAC;AAI3D,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAgHc,CAAC;AAEtD,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;iBAWa,CAAC;AAElD,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;8BAA6C,CAAC;AAEtF,MAAM,WAAW,qBAAqB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,aAAa,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IACnC,OAAO,CAAC,EAAE,oBAAoB,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAClC,MAAM,EAAE,SAAS,EACjB,MAAM,GAAE,mBAAwB,GAC9B,OAAO,CAAC,qBAAqB,CAAC,CAkFhC"}
@@ -1,5 +1,6 @@
1
1
  import { z } from 'zod';
2
2
  import { APIResponseSchema } from '../api';
3
+ import { NPM_PACKAGE_NAME_PATTERN } from './snapshot-build';
3
4
  import { API_VERSION, throwSandboxError } from './util';
4
5
  export const SandboxCreateRequestSchema = z
5
6
  .object({
@@ -80,6 +81,12 @@ export const SandboxCreateRequestSchema = z
80
81
  .array(z.string())
81
82
  .optional()
82
83
  .describe('Apt packages to install when creating the sandbox'),
84
+ packages: z
85
+ .array(z
86
+ .string()
87
+ .regex(NPM_PACKAGE_NAME_PATTERN, 'Invalid npm/bun package specifier: must not contain whitespace, semicolons, backticks, pipes, or dollar signs'))
88
+ .optional()
89
+ .describe('npm/bun packages to install globally when creating the sandbox'),
83
90
  metadata: z
84
91
  .record(z.string(), z.unknown())
85
92
  .optional()
@@ -172,6 +179,9 @@ export async function sandboxCreate(client, params = {}) {
172
179
  if (options.dependencies && options.dependencies.length > 0) {
173
180
  body.dependencies = options.dependencies;
174
181
  }
182
+ if (options.packages && options.packages.length > 0) {
183
+ body.packages = options.packages;
184
+ }
175
185
  if (options.metadata) {
176
186
  body.metadata = options.metadata;
177
187
  }