@agentuity/server 0.1.16 → 0.1.18

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 (93) hide show
  1. package/dist/api/api.d.ts +11 -6
  2. package/dist/api/api.d.ts.map +1 -1
  3. package/dist/api/api.js +19 -12
  4. package/dist/api/api.js.map +1 -1
  5. package/dist/api/index.d.ts +1 -0
  6. package/dist/api/index.d.ts.map +1 -1
  7. package/dist/api/index.js +1 -0
  8. package/dist/api/index.js.map +1 -1
  9. package/dist/api/org/env-delete.d.ts.map +1 -1
  10. package/dist/api/org/env-delete.js.map +1 -1
  11. package/dist/api/org/env-get.d.ts.map +1 -1
  12. package/dist/api/org/env-get.js.map +1 -1
  13. package/dist/api/org/env-update.d.ts.map +1 -1
  14. package/dist/api/org/env-update.js.map +1 -1
  15. package/dist/api/queue/analytics.d.ts +108 -0
  16. package/dist/api/queue/analytics.d.ts.map +1 -0
  17. package/dist/api/queue/analytics.js +245 -0
  18. package/dist/api/queue/analytics.js.map +1 -0
  19. package/dist/api/queue/destinations.d.ts +108 -0
  20. package/dist/api/queue/destinations.d.ts.map +1 -0
  21. package/dist/api/queue/destinations.js +238 -0
  22. package/dist/api/queue/destinations.js.map +1 -0
  23. package/dist/api/queue/dlq.d.ts +100 -0
  24. package/dist/api/queue/dlq.d.ts.map +1 -0
  25. package/dist/api/queue/dlq.js +204 -0
  26. package/dist/api/queue/dlq.js.map +1 -0
  27. package/dist/api/queue/index.d.ts +55 -0
  28. package/dist/api/queue/index.d.ts.map +1 -0
  29. package/dist/api/queue/index.js +86 -0
  30. package/dist/api/queue/index.js.map +1 -0
  31. package/dist/api/queue/messages.d.ts +332 -0
  32. package/dist/api/queue/messages.d.ts.map +1 -0
  33. package/dist/api/queue/messages.js +637 -0
  34. package/dist/api/queue/messages.js.map +1 -0
  35. package/dist/api/queue/queues.d.ts +153 -0
  36. package/dist/api/queue/queues.d.ts.map +1 -0
  37. package/dist/api/queue/queues.js +319 -0
  38. package/dist/api/queue/queues.js.map +1 -0
  39. package/dist/api/queue/sources.d.ts +132 -0
  40. package/dist/api/queue/sources.d.ts.map +1 -0
  41. package/dist/api/queue/sources.js +285 -0
  42. package/dist/api/queue/sources.js.map +1 -0
  43. package/dist/api/queue/types.d.ts +1129 -0
  44. package/dist/api/queue/types.d.ts.map +1 -0
  45. package/dist/api/queue/types.js +949 -0
  46. package/dist/api/queue/types.js.map +1 -0
  47. package/dist/api/queue/util.d.ts +262 -0
  48. package/dist/api/queue/util.d.ts.map +1 -0
  49. package/dist/api/queue/util.js +171 -0
  50. package/dist/api/queue/util.js.map +1 -0
  51. package/dist/api/queue/validation.d.ts +247 -0
  52. package/dist/api/queue/validation.d.ts.map +1 -0
  53. package/dist/api/queue/validation.js +513 -0
  54. package/dist/api/queue/validation.js.map +1 -0
  55. package/dist/api/sandbox/get.d.ts.map +1 -1
  56. package/dist/api/sandbox/get.js +5 -0
  57. package/dist/api/sandbox/get.js.map +1 -1
  58. package/dist/api/sandbox/index.d.ts +3 -3
  59. package/dist/api/sandbox/index.d.ts.map +1 -1
  60. package/dist/api/sandbox/index.js +1 -1
  61. package/dist/api/sandbox/index.js.map +1 -1
  62. package/dist/api/sandbox/run.d.ts.map +1 -1
  63. package/dist/api/sandbox/run.js +5 -2
  64. package/dist/api/sandbox/run.js.map +1 -1
  65. package/dist/api/sandbox/snapshot-build.d.ts +2 -0
  66. package/dist/api/sandbox/snapshot-build.d.ts.map +1 -1
  67. package/dist/api/sandbox/snapshot-build.js +4 -0
  68. package/dist/api/sandbox/snapshot-build.js.map +1 -1
  69. package/dist/api/sandbox/snapshot.d.ts +143 -1
  70. package/dist/api/sandbox/snapshot.d.ts.map +1 -1
  71. package/dist/api/sandbox/snapshot.js +183 -4
  72. package/dist/api/sandbox/snapshot.js.map +1 -1
  73. package/package.json +4 -4
  74. package/src/api/api.ts +62 -13
  75. package/src/api/index.ts +1 -0
  76. package/src/api/org/env-delete.ts +1 -4
  77. package/src/api/org/env-get.ts +1 -4
  78. package/src/api/org/env-update.ts +1 -4
  79. package/src/api/queue/analytics.ts +313 -0
  80. package/src/api/queue/destinations.ts +321 -0
  81. package/src/api/queue/dlq.ts +283 -0
  82. package/src/api/queue/index.ts +261 -0
  83. package/src/api/queue/messages.ts +875 -0
  84. package/src/api/queue/queues.ts +448 -0
  85. package/src/api/queue/sources.ts +384 -0
  86. package/src/api/queue/types.ts +1253 -0
  87. package/src/api/queue/util.ts +204 -0
  88. package/src/api/queue/validation.ts +560 -0
  89. package/src/api/sandbox/get.ts +5 -0
  90. package/src/api/sandbox/index.ts +13 -1
  91. package/src/api/sandbox/run.ts +5 -2
  92. package/src/api/sandbox/snapshot-build.ts +4 -0
  93. package/src/api/sandbox/snapshot.ts +223 -5
@@ -0,0 +1,384 @@
1
+ import { z } from 'zod';
2
+ import { APIClient, APIResponseSchema, APIResponseSchemaNoData, APIError } from '../api';
3
+ import {
4
+ SourceSchema,
5
+ type Source,
6
+ type CreateSourceRequest,
7
+ type UpdateSourceRequest,
8
+ type QueueApiOptions,
9
+ CreateSourceRequestSchema,
10
+ UpdateSourceRequestSchema,
11
+ } from './types';
12
+ import {
13
+ QueueError,
14
+ QueueNotFoundError,
15
+ SourceNotFoundError,
16
+ SourceAlreadyExistsError,
17
+ queueApiPath,
18
+ buildQueueHeaders,
19
+ } from './util';
20
+ import { validateQueueName, validateSourceId, validateSourceName } from './validation';
21
+
22
+ const SourceResponseSchema = APIResponseSchema(z.object({ source: SourceSchema }));
23
+ const SourcesListResponseSchema = APIResponseSchema(
24
+ z.object({
25
+ sources: z.array(SourceSchema),
26
+ })
27
+ );
28
+ const DeleteSourceResponseSchema = APIResponseSchemaNoData();
29
+
30
+ /**
31
+ * Create a source for a queue.
32
+ *
33
+ * Sources are public HTTP ingestion endpoints that allow external systems to
34
+ * publish messages to a queue. They support various authentication methods
35
+ * to secure access.
36
+ *
37
+ * @param client - The API client instance
38
+ * @param queueName - The name of the queue to add the source to
39
+ * @param params - Source configuration including name and optional auth settings
40
+ * @returns The created source with assigned ID and public URL
41
+ * @throws {QueueValidationError} If validation fails (invalid queue name or source name)
42
+ * @throws {QueueNotFoundError} If the queue does not exist
43
+ * @throws {SourceAlreadyExistsError} If a source with the same name already exists
44
+ * @throws {QueueError} If the API request fails
45
+ *
46
+ * @example
47
+ * ```typescript
48
+ * const source = await createSource(client, 'order-events', {
49
+ * name: 'webhook-ingestion',
50
+ * description: 'Receives webhooks from external service',
51
+ * auth_type: 'header',
52
+ * auth_value: 'Bearer my-secret-token',
53
+ * });
54
+ * console.log(`Created source ${source.id} at ${source.url}`);
55
+ * ```
56
+ */
57
+ export async function createSource(
58
+ client: APIClient,
59
+ queueName: string,
60
+ params: CreateSourceRequest,
61
+ options?: QueueApiOptions
62
+ ): Promise<Source> {
63
+ validateQueueName(queueName);
64
+ validateSourceName(params.name);
65
+
66
+ const url = queueApiPath('sources/create', queueName);
67
+
68
+ try {
69
+ const resp = await client.post(
70
+ url,
71
+ params,
72
+ SourceResponseSchema,
73
+ CreateSourceRequestSchema,
74
+ undefined,
75
+ buildQueueHeaders(options?.orgId)
76
+ );
77
+
78
+ if (resp.success) {
79
+ return resp.data.source;
80
+ }
81
+
82
+ if (resp.message?.includes('queue') && resp.message?.includes('not found')) {
83
+ throw new QueueNotFoundError({
84
+ queueName,
85
+ message: resp.message,
86
+ });
87
+ }
88
+
89
+ if (resp.message?.includes('already exists')) {
90
+ throw new SourceAlreadyExistsError({
91
+ queueName,
92
+ name: params.name,
93
+ message: `A source with name "${params.name}" already exists for queue "${queueName}"`,
94
+ });
95
+ }
96
+
97
+ throw new QueueError({
98
+ queueName,
99
+ message: resp.message || 'Failed to create source',
100
+ });
101
+ } catch (error) {
102
+ if (error instanceof APIError) {
103
+ const message = error.message || '';
104
+ if (message.includes('already exists')) {
105
+ throw new SourceAlreadyExistsError({
106
+ queueName,
107
+ name: params.name,
108
+ message: `A source with name "${params.name}" already exists for queue "${queueName}"`,
109
+ });
110
+ }
111
+ if (message.includes('queue') && message.includes('not found')) {
112
+ throw new QueueNotFoundError({
113
+ queueName,
114
+ message,
115
+ });
116
+ }
117
+ throw new QueueError({
118
+ queueName,
119
+ message: message || 'Failed to create source',
120
+ });
121
+ }
122
+ throw error;
123
+ }
124
+ }
125
+
126
+ /**
127
+ * List all sources for a queue.
128
+ *
129
+ * Retrieves all HTTP ingestion endpoints configured for a queue. Each source
130
+ * provides a public URL for external systems to publish messages.
131
+ *
132
+ * @param client - The API client instance
133
+ * @param queueName - The name of the queue
134
+ * @returns Array of sources configured for the queue
135
+ * @throws {QueueValidationError} If validation fails (invalid queue name)
136
+ * @throws {QueueNotFoundError} If the queue does not exist
137
+ * @throws {QueueError} If the API request fails
138
+ *
139
+ * @example
140
+ * ```typescript
141
+ * const sources = await listSources(client, 'order-events');
142
+ * for (const source of sources) {
143
+ * console.log(`Source ${source.id}: ${source.name} (${source.enabled ? 'enabled' : 'disabled'})`);
144
+ * console.log(` URL: ${source.url}`);
145
+ * console.log(` Success rate: ${source.success_count}/${source.request_count}`);
146
+ * }
147
+ * ```
148
+ */
149
+ export async function listSources(
150
+ client: APIClient,
151
+ queueName: string,
152
+ options?: QueueApiOptions
153
+ ): Promise<Source[]> {
154
+ validateQueueName(queueName);
155
+ const url = queueApiPath('sources/list', queueName);
156
+ const resp = await client.get(
157
+ url,
158
+ SourcesListResponseSchema,
159
+ undefined,
160
+ buildQueueHeaders(options?.orgId)
161
+ );
162
+
163
+ if (resp.success) {
164
+ return resp.data.sources;
165
+ }
166
+
167
+ if (resp.message?.includes('not found')) {
168
+ throw new QueueNotFoundError({
169
+ queueName,
170
+ message: resp.message,
171
+ });
172
+ }
173
+
174
+ throw new QueueError({
175
+ queueName,
176
+ message: resp.message || 'Failed to list sources',
177
+ });
178
+ }
179
+
180
+ /**
181
+ * Get a source by ID.
182
+ *
183
+ * Retrieves a specific source's details including its public URL and statistics.
184
+ *
185
+ * @param client - The API client instance
186
+ * @param queueName - The name of the queue
187
+ * @param sourceId - The source ID to retrieve (prefixed with qsrc_)
188
+ * @returns The source details
189
+ * @throws {QueueValidationError} If validation fails (invalid queue name or source ID)
190
+ * @throws {SourceNotFoundError} If the source does not exist
191
+ * @throws {QueueNotFoundError} If the queue does not exist
192
+ * @throws {QueueError} If the API request fails
193
+ *
194
+ * @example
195
+ * ```typescript
196
+ * const source = await getSource(client, 'order-events', 'qsrc_abc123');
197
+ * console.log(`Source: ${source.name}`);
198
+ * console.log(`URL: ${source.url}`);
199
+ * console.log(`Auth type: ${source.auth_type}`);
200
+ * console.log(`Last request: ${source.last_request_at}`);
201
+ * ```
202
+ */
203
+ export async function getSource(
204
+ client: APIClient,
205
+ queueName: string,
206
+ sourceId: string,
207
+ options?: QueueApiOptions
208
+ ): Promise<Source> {
209
+ validateQueueName(queueName);
210
+ validateSourceId(sourceId);
211
+
212
+ const url = queueApiPath('sources/get', queueName, sourceId);
213
+ const resp = await client.get(
214
+ url,
215
+ SourceResponseSchema,
216
+ undefined,
217
+ buildQueueHeaders(options?.orgId)
218
+ );
219
+
220
+ if (resp.success) {
221
+ return resp.data.source;
222
+ }
223
+
224
+ if (resp.message?.includes('source') && resp.message?.includes('not found')) {
225
+ throw new SourceNotFoundError({
226
+ queueName,
227
+ sourceId,
228
+ message: resp.message,
229
+ });
230
+ }
231
+
232
+ if (resp.message?.includes('queue') && resp.message?.includes('not found')) {
233
+ throw new QueueNotFoundError({
234
+ queueName,
235
+ message: resp.message,
236
+ });
237
+ }
238
+
239
+ throw new QueueError({
240
+ queueName,
241
+ message: resp.message || 'Failed to get source',
242
+ });
243
+ }
244
+
245
+ /**
246
+ * Update a source's configuration.
247
+ *
248
+ * Modifies an existing source's settings such as name, enabled status,
249
+ * or authentication configuration. Only the fields provided in params will be updated.
250
+ *
251
+ * @param client - The API client instance
252
+ * @param queueName - The name of the queue
253
+ * @param sourceId - The source ID to update (prefixed with qsrc_)
254
+ * @param params - Fields to update (partial update supported)
255
+ * @returns The updated source
256
+ * @throws {QueueValidationError} If validation fails (invalid queue name or source ID)
257
+ * @throws {SourceNotFoundError} If the source does not exist
258
+ * @throws {QueueNotFoundError} If the queue does not exist
259
+ * @throws {QueueError} If the API request fails
260
+ *
261
+ * @example
262
+ * ```typescript
263
+ * // Disable a source temporarily
264
+ * const updated = await updateSource(client, 'order-events', 'qsrc_abc123', {
265
+ * enabled: false,
266
+ * });
267
+ *
268
+ * // Update authentication
269
+ * const updated = await updateSource(client, 'order-events', 'qsrc_abc123', {
270
+ * auth_type: 'basic',
271
+ * auth_value: 'user:password',
272
+ * });
273
+ * ```
274
+ */
275
+ export async function updateSource(
276
+ client: APIClient,
277
+ queueName: string,
278
+ sourceId: string,
279
+ params: UpdateSourceRequest,
280
+ options?: QueueApiOptions
281
+ ): Promise<Source> {
282
+ validateQueueName(queueName);
283
+ validateSourceId(sourceId);
284
+ if (params.name) {
285
+ validateSourceName(params.name);
286
+ }
287
+
288
+ const url = queueApiPath('sources/update', queueName, sourceId);
289
+ const resp = await client.patch(
290
+ url,
291
+ params,
292
+ SourceResponseSchema,
293
+ UpdateSourceRequestSchema,
294
+ undefined,
295
+ buildQueueHeaders(options?.orgId)
296
+ );
297
+
298
+ if (resp.success) {
299
+ return resp.data.source;
300
+ }
301
+
302
+ if (resp.message?.includes('source') && resp.message?.includes('not found')) {
303
+ throw new SourceNotFoundError({
304
+ queueName,
305
+ sourceId,
306
+ message: resp.message,
307
+ });
308
+ }
309
+
310
+ if (resp.message?.includes('queue') && resp.message?.includes('not found')) {
311
+ throw new QueueNotFoundError({
312
+ queueName,
313
+ message: resp.message,
314
+ });
315
+ }
316
+
317
+ throw new QueueError({
318
+ queueName,
319
+ message: resp.message || 'Failed to update source',
320
+ });
321
+ }
322
+
323
+ /**
324
+ * Delete a source from a queue.
325
+ *
326
+ * Permanently removes an HTTP ingestion endpoint. The public URL will no longer
327
+ * accept requests. This action cannot be undone.
328
+ *
329
+ * @param client - The API client instance
330
+ * @param queueName - The name of the queue
331
+ * @param sourceId - The source ID to delete (prefixed with qsrc_)
332
+ * @returns void
333
+ * @throws {QueueValidationError} If validation fails (invalid queue name or source ID)
334
+ * @throws {SourceNotFoundError} If the source does not exist
335
+ * @throws {QueueNotFoundError} If the queue does not exist
336
+ * @throws {QueueError} If the API request fails
337
+ *
338
+ * @example
339
+ * ```typescript
340
+ * await deleteSource(client, 'order-events', 'qsrc_abc123');
341
+ * console.log('Source deleted');
342
+ * ```
343
+ */
344
+ export async function deleteSource(
345
+ client: APIClient,
346
+ queueName: string,
347
+ sourceId: string,
348
+ options?: QueueApiOptions
349
+ ): Promise<void> {
350
+ validateQueueName(queueName);
351
+ validateSourceId(sourceId);
352
+
353
+ const url = queueApiPath('sources/delete', queueName, sourceId);
354
+ const resp = await client.delete(
355
+ url,
356
+ DeleteSourceResponseSchema,
357
+ undefined,
358
+ buildQueueHeaders(options?.orgId)
359
+ );
360
+
361
+ if (resp.success) {
362
+ return;
363
+ }
364
+
365
+ if (resp.message?.includes('source') && resp.message?.includes('not found')) {
366
+ throw new SourceNotFoundError({
367
+ queueName,
368
+ sourceId,
369
+ message: resp.message,
370
+ });
371
+ }
372
+
373
+ if (resp.message?.includes('queue') && resp.message?.includes('not found')) {
374
+ throw new QueueNotFoundError({
375
+ queueName,
376
+ message: resp.message,
377
+ });
378
+ }
379
+
380
+ throw new QueueError({
381
+ queueName,
382
+ message: resp.message || 'Failed to delete source',
383
+ });
384
+ }