@agentuity/cli 0.1.16 → 0.1.17

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 (185) hide show
  1. package/dist/cli.d.ts.map +1 -1
  2. package/dist/cli.js +3 -1
  3. package/dist/cli.js.map +1 -1
  4. package/dist/cmd/build/ast.d.ts.map +1 -1
  5. package/dist/cmd/build/ast.js +68 -2
  6. package/dist/cmd/build/ast.js.map +1 -1
  7. package/dist/cmd/build/vite/registry-generator.d.ts.map +1 -1
  8. package/dist/cmd/build/vite/registry-generator.js +112 -23
  9. package/dist/cmd/build/vite/registry-generator.js.map +1 -1
  10. package/dist/cmd/build/vite/route-discovery.d.ts +4 -0
  11. package/dist/cmd/build/vite/route-discovery.d.ts.map +1 -1
  12. package/dist/cmd/build/vite/route-discovery.js +4 -0
  13. package/dist/cmd/build/vite/route-discovery.js.map +1 -1
  14. package/dist/cmd/cloud/env/delete.d.ts.map +1 -1
  15. package/dist/cmd/cloud/env/delete.js +8 -2
  16. package/dist/cmd/cloud/env/delete.js.map +1 -1
  17. package/dist/cmd/cloud/env/get.d.ts.map +1 -1
  18. package/dist/cmd/cloud/env/get.js +4 -1
  19. package/dist/cmd/cloud/env/get.js.map +1 -1
  20. package/dist/cmd/cloud/env/import.d.ts.map +1 -1
  21. package/dist/cmd/cloud/env/import.js +5 -8
  22. package/dist/cmd/cloud/env/import.js.map +1 -1
  23. package/dist/cmd/cloud/env/list.d.ts.map +1 -1
  24. package/dist/cmd/cloud/env/list.js +11 -6
  25. package/dist/cmd/cloud/env/list.js.map +1 -1
  26. package/dist/cmd/cloud/env/pull.d.ts.map +1 -1
  27. package/dist/cmd/cloud/env/pull.js.map +1 -1
  28. package/dist/cmd/cloud/env/push.d.ts.map +1 -1
  29. package/dist/cmd/cloud/env/push.js +1 -7
  30. package/dist/cmd/cloud/env/push.js.map +1 -1
  31. package/dist/cmd/cloud/env/set.d.ts.map +1 -1
  32. package/dist/cmd/cloud/env/set.js +4 -1
  33. package/dist/cmd/cloud/env/set.js.map +1 -1
  34. package/dist/cmd/cloud/index.d.ts.map +1 -1
  35. package/dist/cmd/cloud/index.js +2 -0
  36. package/dist/cmd/cloud/index.js.map +1 -1
  37. package/dist/cmd/cloud/queue/ack.d.ts +3 -0
  38. package/dist/cmd/cloud/queue/ack.d.ts.map +1 -0
  39. package/dist/cmd/cloud/queue/ack.js +45 -0
  40. package/dist/cmd/cloud/queue/ack.js.map +1 -0
  41. package/dist/cmd/cloud/queue/create.d.ts +3 -0
  42. package/dist/cmd/cloud/queue/create.d.ts.map +1 -0
  43. package/dist/cmd/cloud/queue/create.js +80 -0
  44. package/dist/cmd/cloud/queue/create.js.map +1 -0
  45. package/dist/cmd/cloud/queue/delete.d.ts +3 -0
  46. package/dist/cmd/cloud/queue/delete.d.ts.map +1 -0
  47. package/dist/cmd/cloud/queue/delete.js +50 -0
  48. package/dist/cmd/cloud/queue/delete.js.map +1 -0
  49. package/dist/cmd/cloud/queue/destinations.d.ts +3 -0
  50. package/dist/cmd/cloud/queue/destinations.d.ts.map +1 -0
  51. package/dist/cmd/cloud/queue/destinations.js +232 -0
  52. package/dist/cmd/cloud/queue/destinations.js.map +1 -0
  53. package/dist/cmd/cloud/queue/dlq.d.ts +3 -0
  54. package/dist/cmd/cloud/queue/dlq.d.ts.map +1 -0
  55. package/dist/cmd/cloud/queue/dlq.js +168 -0
  56. package/dist/cmd/cloud/queue/dlq.js.map +1 -0
  57. package/dist/cmd/cloud/queue/get.d.ts +3 -0
  58. package/dist/cmd/cloud/queue/get.d.ts.map +1 -0
  59. package/dist/cmd/cloud/queue/get.js +130 -0
  60. package/dist/cmd/cloud/queue/get.js.map +1 -0
  61. package/dist/cmd/cloud/queue/index.d.ts +3 -0
  62. package/dist/cmd/cloud/queue/index.d.ts.map +1 -0
  63. package/dist/cmd/cloud/queue/index.js +65 -0
  64. package/dist/cmd/cloud/queue/index.js.map +1 -0
  65. package/dist/cmd/cloud/queue/list.d.ts +3 -0
  66. package/dist/cmd/cloud/queue/list.d.ts.map +1 -0
  67. package/dist/cmd/cloud/queue/list.js +71 -0
  68. package/dist/cmd/cloud/queue/list.js.map +1 -0
  69. package/dist/cmd/cloud/queue/messages.d.ts +3 -0
  70. package/dist/cmd/cloud/queue/messages.d.ts.map +1 -0
  71. package/dist/cmd/cloud/queue/messages.js +137 -0
  72. package/dist/cmd/cloud/queue/messages.js.map +1 -0
  73. package/dist/cmd/cloud/queue/nack.d.ts +3 -0
  74. package/dist/cmd/cloud/queue/nack.d.ts.map +1 -0
  75. package/dist/cmd/cloud/queue/nack.js +45 -0
  76. package/dist/cmd/cloud/queue/nack.js.map +1 -0
  77. package/dist/cmd/cloud/queue/pause.d.ts +3 -0
  78. package/dist/cmd/cloud/queue/pause.d.ts.map +1 -0
  79. package/dist/cmd/cloud/queue/pause.js +36 -0
  80. package/dist/cmd/cloud/queue/pause.js.map +1 -0
  81. package/dist/cmd/cloud/queue/publish.d.ts +3 -0
  82. package/dist/cmd/cloud/queue/publish.d.ts.map +1 -0
  83. package/dist/cmd/cloud/queue/publish.js +76 -0
  84. package/dist/cmd/cloud/queue/publish.js.map +1 -0
  85. package/dist/cmd/cloud/queue/receive.d.ts +3 -0
  86. package/dist/cmd/cloud/queue/receive.d.ts.map +1 -0
  87. package/dist/cmd/cloud/queue/receive.js +67 -0
  88. package/dist/cmd/cloud/queue/receive.js.map +1 -0
  89. package/dist/cmd/cloud/queue/resume.d.ts +3 -0
  90. package/dist/cmd/cloud/queue/resume.d.ts.map +1 -0
  91. package/dist/cmd/cloud/queue/resume.js +35 -0
  92. package/dist/cmd/cloud/queue/resume.js.map +1 -0
  93. package/dist/cmd/cloud/queue/sources.d.ts +3 -0
  94. package/dist/cmd/cloud/queue/sources.d.ts.map +1 -0
  95. package/dist/cmd/cloud/queue/sources.js +290 -0
  96. package/dist/cmd/cloud/queue/sources.js.map +1 -0
  97. package/dist/cmd/cloud/queue/stats.d.ts +3 -0
  98. package/dist/cmd/cloud/queue/stats.d.ts.map +1 -0
  99. package/dist/cmd/cloud/queue/stats.js +239 -0
  100. package/dist/cmd/cloud/queue/stats.js.map +1 -0
  101. package/dist/cmd/cloud/queue/util.d.ts +26 -0
  102. package/dist/cmd/cloud/queue/util.d.ts.map +1 -0
  103. package/dist/cmd/cloud/queue/util.js +19 -0
  104. package/dist/cmd/cloud/queue/util.js.map +1 -0
  105. package/dist/cmd/cloud/sandbox/snapshot/build.d.ts.map +1 -1
  106. package/dist/cmd/cloud/sandbox/snapshot/build.js +122 -28
  107. package/dist/cmd/cloud/sandbox/snapshot/build.js.map +1 -1
  108. package/dist/cmd/cloud/sandbox/snapshot/create.d.ts.map +1 -1
  109. package/dist/cmd/cloud/sandbox/snapshot/create.js +19 -7
  110. package/dist/cmd/cloud/sandbox/snapshot/create.js.map +1 -1
  111. package/dist/cmd/cloud/sandbox/snapshot/get.d.ts.map +1 -1
  112. package/dist/cmd/cloud/sandbox/snapshot/get.js +16 -0
  113. package/dist/cmd/cloud/sandbox/snapshot/get.js.map +1 -1
  114. package/dist/cmd/cloud/sandbox/snapshot/list.d.ts.map +1 -1
  115. package/dist/cmd/cloud/sandbox/snapshot/list.js +4 -0
  116. package/dist/cmd/cloud/sandbox/snapshot/list.js.map +1 -1
  117. package/dist/cmd/cloud/vector/stats.d.ts.map +1 -1
  118. package/dist/cmd/cloud/vector/stats.js +8 -0
  119. package/dist/cmd/cloud/vector/stats.js.map +1 -1
  120. package/dist/cmd/project/template-flow.d.ts.map +1 -1
  121. package/dist/cmd/project/template-flow.js.map +1 -1
  122. package/dist/env-util.d.ts +6 -1
  123. package/dist/env-util.d.ts.map +1 -1
  124. package/dist/env-util.js +16 -2
  125. package/dist/env-util.js.map +1 -1
  126. package/dist/errors.d.ts +4 -2
  127. package/dist/errors.d.ts.map +1 -1
  128. package/dist/errors.js +6 -0
  129. package/dist/errors.js.map +1 -1
  130. package/dist/schema-parser.d.ts.map +1 -1
  131. package/dist/schema-parser.js +2 -2
  132. package/dist/schema-parser.js.map +1 -1
  133. package/dist/tui/box.d.ts +4 -0
  134. package/dist/tui/box.d.ts.map +1 -1
  135. package/dist/tui/box.js +39 -0
  136. package/dist/tui/box.js.map +1 -1
  137. package/dist/tui.d.ts +11 -1
  138. package/dist/tui.d.ts.map +1 -1
  139. package/dist/tui.js +16 -8
  140. package/dist/tui.js.map +1 -1
  141. package/dist/types.d.ts.map +1 -1
  142. package/dist/types.js.map +1 -1
  143. package/package.json +6 -6
  144. package/src/cli.ts +5 -1
  145. package/src/cmd/build/ast.ts +88 -2
  146. package/src/cmd/build/vite/registry-generator.ts +120 -24
  147. package/src/cmd/build/vite/route-discovery.ts +16 -0
  148. package/src/cmd/cloud/env/delete.ts +18 -5
  149. package/src/cmd/cloud/env/get.ts +10 -3
  150. package/src/cmd/cloud/env/import.ts +10 -11
  151. package/src/cmd/cloud/env/list.ts +19 -9
  152. package/src/cmd/cloud/env/org-util.ts +1 -1
  153. package/src/cmd/cloud/env/pull.ts +9 -4
  154. package/src/cmd/cloud/env/push.ts +5 -9
  155. package/src/cmd/cloud/env/set.ts +10 -3
  156. package/src/cmd/cloud/index.ts +2 -0
  157. package/src/cmd/cloud/queue/ack.ts +50 -0
  158. package/src/cmd/cloud/queue/create.ts +91 -0
  159. package/src/cmd/cloud/queue/delete.ts +57 -0
  160. package/src/cmd/cloud/queue/destinations.ts +287 -0
  161. package/src/cmd/cloud/queue/dlq.ts +203 -0
  162. package/src/cmd/cloud/queue/get.ts +158 -0
  163. package/src/cmd/cloud/queue/index.ts +66 -0
  164. package/src/cmd/cloud/queue/list.ts +81 -0
  165. package/src/cmd/cloud/queue/messages.ts +160 -0
  166. package/src/cmd/cloud/queue/nack.ts +50 -0
  167. package/src/cmd/cloud/queue/pause.ts +41 -0
  168. package/src/cmd/cloud/queue/publish.ts +88 -0
  169. package/src/cmd/cloud/queue/receive.ts +76 -0
  170. package/src/cmd/cloud/queue/resume.ts +40 -0
  171. package/src/cmd/cloud/queue/sources.ts +352 -0
  172. package/src/cmd/cloud/queue/stats.ts +297 -0
  173. package/src/cmd/cloud/queue/util.ts +34 -0
  174. package/src/cmd/cloud/sandbox/snapshot/build.ts +146 -29
  175. package/src/cmd/cloud/sandbox/snapshot/create.ts +24 -7
  176. package/src/cmd/cloud/sandbox/snapshot/get.ts +16 -0
  177. package/src/cmd/cloud/sandbox/snapshot/list.ts +4 -0
  178. package/src/cmd/cloud/vector/stats.ts +9 -0
  179. package/src/cmd/project/template-flow.ts +1 -3
  180. package/src/env-util.ts +17 -2
  181. package/src/errors.ts +8 -0
  182. package/src/schema-parser.ts +6 -3
  183. package/src/tui/box.ts +52 -0
  184. package/src/tui.ts +28 -8
  185. package/src/types.ts +0 -1
@@ -0,0 +1,91 @@
1
+ import { z } from 'zod';
2
+ import { createCommand } from '../../../types';
3
+ import * as tui from '../../../tui';
4
+ import { createQueueAPIClient, getQueueApiOptions } from './util';
5
+ import { getCommand } from '../../../command-prefix';
6
+ import { createQueue, QueueTypeSchema } from '@agentuity/server';
7
+
8
+ const QueueCreateResponseSchema = z.object({
9
+ id: z.string(),
10
+ name: z.string(),
11
+ queue_type: z.string(),
12
+ created_at: z.string(),
13
+ });
14
+
15
+ export const createSubcommand = createCommand({
16
+ name: 'create',
17
+ description: 'Create a new queue',
18
+ tags: ['mutating', 'creates-resource', 'requires-auth'],
19
+ requires: { auth: true, org: true },
20
+ examples: [
21
+ {
22
+ command: getCommand('cloud queue create worker --name my-tasks'),
23
+ description: 'Create a worker queue named my-tasks',
24
+ },
25
+ {
26
+ command: getCommand('cloud queue create pubsub --name events --ttl 86400'),
27
+ description: 'Create a pubsub queue with 24h TTL',
28
+ },
29
+ ],
30
+ schema: {
31
+ args: z.object({
32
+ queue_type: QueueTypeSchema.describe('Queue type: worker or pubsub'),
33
+ }),
34
+ options: z.object({
35
+ name: z.string().optional().describe('Queue name (auto-generated if not provided)'),
36
+ description: z.string().optional().describe('Queue description'),
37
+ ttl: z.coerce.number().optional().describe('Default message TTL in seconds'),
38
+ visibilityTimeout: z.coerce
39
+ .number()
40
+ .optional()
41
+ .describe('Default visibility timeout in seconds (worker queues)'),
42
+ maxRetries: z.coerce
43
+ .number()
44
+ .optional()
45
+ .describe('Maximum retry attempts for failed messages'),
46
+ }),
47
+ response: QueueCreateResponseSchema,
48
+ },
49
+
50
+ async handler(ctx) {
51
+ const { args, opts, options } = ctx;
52
+ const client = await createQueueAPIClient(ctx);
53
+
54
+ const settings: Record<string, number | undefined> = {};
55
+ if (opts?.ttl !== undefined) {
56
+ settings.default_ttl_seconds = opts.ttl;
57
+ }
58
+ if (opts?.visibilityTimeout !== undefined) {
59
+ settings.default_visibility_timeout_seconds = opts.visibilityTimeout;
60
+ }
61
+ if (opts?.maxRetries !== undefined) {
62
+ settings.default_max_retries = opts.maxRetries;
63
+ }
64
+
65
+ const queue = await createQueue(
66
+ client,
67
+ {
68
+ name: opts?.name,
69
+ description: opts?.description,
70
+ queue_type: args.queue_type,
71
+ settings: Object.keys(settings).length > 0 ? settings : undefined,
72
+ },
73
+ getQueueApiOptions(ctx)
74
+ );
75
+
76
+ if (!options.json) {
77
+ tui.success(`Created queue: ${queue.name}`);
78
+ console.log(` ID: ${queue.id}`);
79
+ console.log(` Type: ${queue.queue_type}`);
80
+ }
81
+
82
+ return {
83
+ id: queue.id,
84
+ name: queue.name,
85
+ queue_type: queue.queue_type,
86
+ created_at: queue.created_at,
87
+ };
88
+ },
89
+ });
90
+
91
+ export default createSubcommand;
@@ -0,0 +1,57 @@
1
+ import { z } from 'zod';
2
+ import { createCommand } from '../../../types';
3
+ import * as tui from '../../../tui';
4
+ import { createQueueAPIClient, getQueueApiOptions } from './util';
5
+ import { getCommand } from '../../../command-prefix';
6
+ import { deleteQueue } from '@agentuity/server';
7
+ import { ErrorCode } from '../../../errors';
8
+
9
+ const DeleteResponseSchema = z.object({
10
+ success: z.boolean(),
11
+ name: z.string(),
12
+ });
13
+
14
+ export const deleteSubcommand = createCommand({
15
+ name: 'delete',
16
+ aliases: ['rm'],
17
+ description: 'Delete a queue by name',
18
+ tags: ['mutating', 'deletes-resource', 'requires-auth'],
19
+ requires: { auth: true },
20
+ examples: [
21
+ {
22
+ command: getCommand('cloud queue delete my-queue --confirm'),
23
+ description: 'Delete a queue (requires confirmation)',
24
+ },
25
+ ],
26
+ schema: {
27
+ args: z.object({
28
+ name: z.string().min(1).describe('Queue name'),
29
+ }),
30
+ options: z.object({
31
+ confirm: z.boolean().default(false).describe('Skip confirmation prompt'),
32
+ }),
33
+ response: DeleteResponseSchema,
34
+ },
35
+
36
+ async handler(ctx) {
37
+ const { args, opts, options } = ctx;
38
+
39
+ if (!opts.confirm) {
40
+ tui.fatal('Use --confirm to confirm queue deletion', ErrorCode.INVALID_ARGUMENT);
41
+ }
42
+
43
+ const client = await createQueueAPIClient(ctx);
44
+ await deleteQueue(client, args.name, getQueueApiOptions(ctx));
45
+
46
+ if (!options.json) {
47
+ tui.success(`Deleted queue: ${args.name}`);
48
+ }
49
+
50
+ return {
51
+ success: true,
52
+ name: args.name,
53
+ };
54
+ },
55
+ });
56
+
57
+ export default deleteSubcommand;
@@ -0,0 +1,287 @@
1
+ import { z } from 'zod';
2
+ import { createCommand, createSubcommand } from '../../../types';
3
+ import * as tui from '../../../tui';
4
+ import { createQueueAPIClient, getQueueApiOptions } from './util';
5
+ import { getCommand } from '../../../command-prefix';
6
+ import { ErrorCode } from '../../../errors';
7
+ import {
8
+ createDestination,
9
+ listDestinations,
10
+ updateDestination,
11
+ deleteDestination,
12
+ DestinationSchema,
13
+ DestinationAlreadyExistsError,
14
+ type Destination,
15
+ } from '@agentuity/server';
16
+
17
+ const DestinationsListResponseSchema = z.object({
18
+ destinations: z.array(
19
+ z.object({
20
+ id: z.string(),
21
+ destination_type: z.string(),
22
+ url: z.string(),
23
+ enabled: z.boolean(),
24
+ created_at: z.string(),
25
+ })
26
+ ),
27
+ });
28
+
29
+ const listDestinationsSubcommand = createSubcommand({
30
+ name: 'list',
31
+ aliases: ['ls'],
32
+ description: 'List destinations for a queue',
33
+ tags: ['read-only', 'fast', 'requires-auth'],
34
+ requires: { auth: true },
35
+ examples: [
36
+ {
37
+ command: getCommand('cloud queue destinations list my-queue'),
38
+ description: 'List queue destinations',
39
+ },
40
+ ],
41
+ schema: {
42
+ args: z.object({
43
+ queue_name: z.string().min(1).describe('Queue name'),
44
+ }),
45
+ response: DestinationsListResponseSchema,
46
+ },
47
+ idempotent: true,
48
+
49
+ async handler(ctx) {
50
+ const { args, options } = ctx;
51
+ const client = await createQueueAPIClient(ctx);
52
+ const destinations = await listDestinations(client, args.queue_name, getQueueApiOptions(ctx));
53
+
54
+ if (!options.json) {
55
+ if (destinations.length === 0) {
56
+ tui.info('No destinations configured');
57
+ } else {
58
+ const tableData = destinations.map((d: Destination) => ({
59
+ ID: d.id,
60
+ Type: d.destination_type,
61
+ URL: d.config.url,
62
+ Enabled: d.enabled ? 'Yes' : 'No',
63
+ Created: new Date(d.created_at).toLocaleString(),
64
+ }));
65
+ tui.table(tableData, ['ID', 'Type', 'URL', 'Enabled', 'Created']);
66
+ }
67
+ }
68
+
69
+ return {
70
+ destinations: destinations.map((d: Destination) => ({
71
+ id: d.id,
72
+ destination_type: d.destination_type,
73
+ url: d.config.url,
74
+ enabled: d.enabled,
75
+ created_at: d.created_at,
76
+ })),
77
+ };
78
+ },
79
+ });
80
+
81
+ const createDestinationSubcommand = createSubcommand({
82
+ name: 'create',
83
+ description: 'Create a webhook destination for a queue',
84
+ tags: ['mutating', 'creates-resource', 'requires-auth'],
85
+ requires: { auth: true },
86
+ examples: [
87
+ {
88
+ command: getCommand(
89
+ 'cloud queue destinations create my-queue --url https://example.com/webhook'
90
+ ),
91
+ description: 'Create a webhook destination',
92
+ },
93
+ ],
94
+ schema: {
95
+ args: z.object({
96
+ queue_name: z.string().min(1).describe('Queue name'),
97
+ }),
98
+ options: z.object({
99
+ url: z.string().url().describe('Webhook URL'),
100
+ method: z.string().default('POST').optional().describe('HTTP method (default: POST)'),
101
+ timeout: z.coerce.number().optional().describe('Request timeout in milliseconds'),
102
+ }),
103
+ response: DestinationSchema,
104
+ },
105
+
106
+ async handler(ctx) {
107
+ const { args, opts, options } = ctx;
108
+ const client = await createQueueAPIClient(ctx);
109
+
110
+ try {
111
+ const destination = await createDestination(
112
+ client,
113
+ args.queue_name,
114
+ {
115
+ destination_type: 'http',
116
+ config: {
117
+ url: opts.url,
118
+ method: opts.method || 'POST',
119
+ timeout_ms: opts.timeout ?? 30000,
120
+ },
121
+ enabled: true,
122
+ },
123
+ getQueueApiOptions(ctx)
124
+ );
125
+
126
+ if (!options.json) {
127
+ tui.success(`Created destination: ${destination.id}`);
128
+ console.log(` URL: ${destination.config.url}`);
129
+ console.log(` Method: ${destination.config.method}`);
130
+ }
131
+
132
+ return destination;
133
+ } catch (error) {
134
+ if (error instanceof DestinationAlreadyExistsError) {
135
+ tui.fatal(
136
+ `A destination with URL "${opts.url}" already exists for queue "${args.queue_name}". Use a different URL or delete the existing destination first.`,
137
+ ErrorCode.RESOURCE_ALREADY_EXISTS
138
+ );
139
+ }
140
+ throw error;
141
+ }
142
+ },
143
+ });
144
+
145
+ const updateDestinationSubcommand = createSubcommand({
146
+ name: 'update',
147
+ description: 'Update a destination',
148
+ tags: ['mutating', 'requires-auth'],
149
+ requires: { auth: true },
150
+ examples: [
151
+ {
152
+ command: getCommand('cloud queue destinations update my-queue dest_abc123 --disabled'),
153
+ description: 'Disable a destination',
154
+ },
155
+ ],
156
+ schema: {
157
+ args: z.object({
158
+ queue_name: z.string().min(1).describe('Queue name'),
159
+ destination_id: z.string().min(1).describe('Destination ID'),
160
+ }),
161
+ options: z.object({
162
+ url: z.string().url().optional().describe('Webhook URL'),
163
+ method: z.string().optional().describe('HTTP method'),
164
+ timeout: z.coerce.number().optional().describe('Request timeout in milliseconds'),
165
+ enabled: z.boolean().optional().describe('Enable the destination'),
166
+ disabled: z.boolean().optional().describe('Disable the destination'),
167
+ }),
168
+ response: DestinationSchema,
169
+ },
170
+
171
+ async handler(ctx) {
172
+ const { args, opts, options } = ctx;
173
+ const client = await createQueueAPIClient(ctx);
174
+
175
+ const updateParams: {
176
+ config?: { url?: string; method?: string; timeout_ms?: number };
177
+ enabled?: boolean;
178
+ } = {};
179
+
180
+ if (opts.url || opts.method || opts.timeout !== undefined) {
181
+ updateParams.config = {};
182
+ if (opts.url) updateParams.config.url = opts.url;
183
+ if (opts.method) updateParams.config.method = opts.method;
184
+ if (opts.timeout !== undefined) updateParams.config.timeout_ms = opts.timeout;
185
+ }
186
+ if (opts.enabled && opts.disabled) {
187
+ tui.fatal(
188
+ 'Cannot specify both --enabled and --disabled flags',
189
+ ErrorCode.INVALID_ARGUMENT
190
+ );
191
+ }
192
+ if (opts.enabled) updateParams.enabled = true;
193
+ if (opts.disabled) updateParams.enabled = false;
194
+
195
+ const destination = await updateDestination(
196
+ client,
197
+ args.queue_name,
198
+ args.destination_id,
199
+ updateParams,
200
+ getQueueApiOptions(ctx)
201
+ );
202
+
203
+ if (!options.json) {
204
+ tui.success(`Updated destination: ${destination.id}`);
205
+ console.log(` URL: ${destination.config.url}`);
206
+ console.log(` Enabled: ${destination.enabled ? 'Yes' : 'No'}`);
207
+ }
208
+
209
+ return destination;
210
+ },
211
+ });
212
+
213
+ const DeleteDestinationResponseSchema = z.object({
214
+ success: z.boolean(),
215
+ queue_name: z.string(),
216
+ destination_id: z.string(),
217
+ });
218
+
219
+ const deleteDestinationSubcommand = createSubcommand({
220
+ name: 'delete',
221
+ aliases: ['rm'],
222
+ description: 'Delete a destination from a queue',
223
+ tags: ['mutating', 'deletes-resource', 'requires-auth'],
224
+ requires: { auth: true },
225
+ examples: [
226
+ {
227
+ command: getCommand('cloud queue destinations delete my-queue dest-123'),
228
+ description: 'Delete a destination',
229
+ },
230
+ ],
231
+ schema: {
232
+ args: z.object({
233
+ queue_name: z.string().min(1).describe('Queue name'),
234
+ destination_id: z.string().min(1).describe('Destination ID'),
235
+ }),
236
+ response: DeleteDestinationResponseSchema,
237
+ },
238
+
239
+ async handler(ctx) {
240
+ const { args, options } = ctx;
241
+ const client = await createQueueAPIClient(ctx);
242
+ await deleteDestination(
243
+ client,
244
+ args.queue_name,
245
+ args.destination_id,
246
+ getQueueApiOptions(ctx)
247
+ );
248
+
249
+ if (!options.json) {
250
+ tui.success(`Deleted destination: ${args.destination_id}`);
251
+ }
252
+
253
+ return {
254
+ success: true,
255
+ queue_name: args.queue_name,
256
+ destination_id: args.destination_id,
257
+ };
258
+ },
259
+ });
260
+
261
+ export const destinationsSubcommand = createCommand({
262
+ name: 'destinations',
263
+ aliases: ['dest'],
264
+ description: 'Manage queue destinations (webhooks)',
265
+ tags: ['requires-auth'],
266
+ requires: { auth: true },
267
+ examples: [
268
+ {
269
+ command: getCommand('cloud queue destinations list my-queue'),
270
+ description: 'List destinations',
271
+ },
272
+ {
273
+ command: getCommand(
274
+ 'cloud queue destinations create my-queue --url https://example.com/webhook'
275
+ ),
276
+ description: 'Create a webhook destination',
277
+ },
278
+ ],
279
+ subcommands: [
280
+ listDestinationsSubcommand,
281
+ createDestinationSubcommand,
282
+ updateDestinationSubcommand,
283
+ deleteDestinationSubcommand,
284
+ ],
285
+ });
286
+
287
+ export default destinationsSubcommand;
@@ -0,0 +1,203 @@
1
+ import { z } from 'zod';
2
+ import { createCommand, createSubcommand } from '../../../types';
3
+ import * as tui from '../../../tui';
4
+ import { createQueueAPIClient, getQueueApiOptions } from './util';
5
+ import { getCommand } from '../../../command-prefix';
6
+ import {
7
+ listDeadLetterMessages,
8
+ replayDeadLetterMessage,
9
+ purgeDeadLetter,
10
+ type DeadLetterMessage,
11
+ MessageSchema,
12
+ } from '@agentuity/server';
13
+ import { ErrorCode } from '../../../errors';
14
+
15
+ const DlqListResponseSchema = z.object({
16
+ messages: z.array(
17
+ z.object({
18
+ id: z.string(),
19
+ offset: z.number(),
20
+ failure_reason: z.string().nullable(),
21
+ delivery_attempts: z.number(),
22
+ moved_at: z.string(),
23
+ })
24
+ ),
25
+ total: z.number().optional(),
26
+ });
27
+
28
+ const listDlqSubcommand = createSubcommand({
29
+ name: 'list',
30
+ aliases: ['ls'],
31
+ description: 'List messages in the dead letter queue',
32
+ tags: ['read-only', 'fast', 'requires-auth'],
33
+ requires: { auth: true },
34
+ examples: [
35
+ {
36
+ command: getCommand('cloud queue dlq list my-queue'),
37
+ description: 'List DLQ messages',
38
+ },
39
+ ],
40
+ schema: {
41
+ args: z.object({
42
+ queue_name: z.string().min(1).describe('Queue name'),
43
+ }),
44
+ options: z.object({
45
+ limit: z.coerce.number().optional().describe('Maximum number of messages to return'),
46
+ offset: z.coerce.number().optional().describe('Offset for pagination'),
47
+ }),
48
+ response: DlqListResponseSchema,
49
+ },
50
+
51
+ async handler(ctx) {
52
+ const { args, opts, options } = ctx;
53
+ const client = await createQueueAPIClient(ctx);
54
+ const result = await listDeadLetterMessages(
55
+ client,
56
+ args.queue_name,
57
+ {
58
+ limit: opts.limit,
59
+ offset: opts.offset,
60
+ },
61
+ getQueueApiOptions(ctx)
62
+ );
63
+
64
+ if (!options.json) {
65
+ if (result.messages.length === 0) {
66
+ tui.info('No messages in dead letter queue');
67
+ } else {
68
+ const tableData = result.messages.map((m: DeadLetterMessage) => ({
69
+ ID: m.id.substring(0, 8) + '...',
70
+ Offset: m.offset,
71
+ Reason: m.failure_reason?.substring(0, 30) || 'Unknown',
72
+ Attempts: m.delivery_attempts,
73
+ 'Moved At': new Date(m.moved_at).toLocaleString(),
74
+ }));
75
+ tui.table(tableData, ['ID', 'Offset', 'Reason', 'Attempts', 'Moved At']);
76
+ }
77
+ }
78
+
79
+ return {
80
+ messages: result.messages.map((m: DeadLetterMessage) => ({
81
+ id: m.id,
82
+ offset: m.offset,
83
+ failure_reason: m.failure_reason ?? null,
84
+ delivery_attempts: m.delivery_attempts,
85
+ moved_at: m.moved_at,
86
+ })),
87
+ total: result.total,
88
+ };
89
+ },
90
+ });
91
+
92
+ const ReplayResponseSchema = z.object({
93
+ success: z.boolean(),
94
+ message: MessageSchema,
95
+ });
96
+
97
+ const replayDlqSubcommand = createSubcommand({
98
+ name: 'replay',
99
+ description: 'Replay a message from the dead letter queue',
100
+ tags: ['mutating', 'updates-resource', 'requires-auth'],
101
+ requires: { auth: true },
102
+ examples: [
103
+ {
104
+ command: getCommand('cloud queue dlq replay my-queue msg-123'),
105
+ description: 'Replay a DLQ message',
106
+ },
107
+ ],
108
+ schema: {
109
+ args: z.object({
110
+ queue_name: z.string().min(1).describe('Queue name'),
111
+ message_id: z.string().min(1).describe('Message ID'),
112
+ }),
113
+ response: ReplayResponseSchema,
114
+ },
115
+
116
+ async handler(ctx) {
117
+ const { args, options } = ctx;
118
+ const client = await createQueueAPIClient(ctx);
119
+ const message = await replayDeadLetterMessage(
120
+ client,
121
+ args.queue_name,
122
+ args.message_id,
123
+ getQueueApiOptions(ctx)
124
+ );
125
+
126
+ if (!options.json) {
127
+ tui.success(`Replayed message: ${message.id}`);
128
+ tui.info(` New offset: ${message.offset}`);
129
+ }
130
+
131
+ return {
132
+ success: true,
133
+ message,
134
+ };
135
+ },
136
+ });
137
+
138
+ const PurgeResponseSchema = z.object({
139
+ success: z.boolean(),
140
+ queue_name: z.string(),
141
+ });
142
+
143
+ const purgeDlqSubcommand = createSubcommand({
144
+ name: 'purge',
145
+ description: 'Purge all messages from the dead letter queue',
146
+ tags: ['mutating', 'deletes-resource', 'requires-auth'],
147
+ requires: { auth: true },
148
+ examples: [
149
+ {
150
+ command: getCommand('cloud queue dlq purge my-queue --confirm'),
151
+ description: 'Purge all DLQ messages',
152
+ },
153
+ ],
154
+ schema: {
155
+ args: z.object({
156
+ queue_name: z.string().min(1).describe('Queue name'),
157
+ }),
158
+ options: z.object({
159
+ confirm: z.boolean().default(false).describe('Skip confirmation prompt'),
160
+ }),
161
+ response: PurgeResponseSchema,
162
+ },
163
+
164
+ async handler(ctx) {
165
+ const { args, opts, options } = ctx;
166
+
167
+ if (!opts.confirm) {
168
+ tui.fatal('Use --confirm to confirm DLQ purge', ErrorCode.INVALID_ARGUMENT);
169
+ }
170
+
171
+ const client = await createQueueAPIClient(ctx);
172
+ await purgeDeadLetter(client, args.queue_name, getQueueApiOptions(ctx));
173
+
174
+ if (!options.json) {
175
+ tui.success(`Purged dead letter queue for: ${args.queue_name}`);
176
+ }
177
+
178
+ return {
179
+ success: true,
180
+ queue_name: args.queue_name,
181
+ };
182
+ },
183
+ });
184
+
185
+ export const dlqSubcommand = createCommand({
186
+ name: 'dlq',
187
+ description: 'Dead letter queue operations',
188
+ tags: ['requires-auth'],
189
+ requires: { auth: true },
190
+ examples: [
191
+ {
192
+ command: getCommand('cloud queue dlq list my-queue'),
193
+ description: 'List DLQ messages',
194
+ },
195
+ {
196
+ command: getCommand('cloud queue dlq replay my-queue msg-123'),
197
+ description: 'Replay a message',
198
+ },
199
+ ],
200
+ subcommands: [listDlqSubcommand, replayDlqSubcommand, purgeDlqSubcommand],
201
+ });
202
+
203
+ export default dlqSubcommand;