@agentuity/cli 0.1.15 → 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 (255) hide show
  1. package/dist/cli.d.ts.map +1 -1
  2. package/dist/cli.js +18 -2
  3. package/dist/cli.js.map +1 -1
  4. package/dist/cmd/ai/opencode/install.js +1 -1
  5. package/dist/cmd/ai/opencode/install.js.map +1 -1
  6. package/dist/cmd/build/ast.d.ts.map +1 -1
  7. package/dist/cmd/build/ast.js +68 -2
  8. package/dist/cmd/build/ast.js.map +1 -1
  9. package/dist/cmd/build/vite/registry-generator.d.ts.map +1 -1
  10. package/dist/cmd/build/vite/registry-generator.js +112 -23
  11. package/dist/cmd/build/vite/registry-generator.js.map +1 -1
  12. package/dist/cmd/build/vite/route-discovery.d.ts +4 -0
  13. package/dist/cmd/build/vite/route-discovery.d.ts.map +1 -1
  14. package/dist/cmd/build/vite/route-discovery.js +4 -0
  15. package/dist/cmd/build/vite/route-discovery.js.map +1 -1
  16. package/dist/cmd/cloud/env/delete.d.ts.map +1 -1
  17. package/dist/cmd/cloud/env/delete.js +93 -34
  18. package/dist/cmd/cloud/env/delete.js.map +1 -1
  19. package/dist/cmd/cloud/env/get.d.ts.map +1 -1
  20. package/dist/cmd/cloud/env/get.js +53 -16
  21. package/dist/cmd/cloud/env/get.js.map +1 -1
  22. package/dist/cmd/cloud/env/import.d.ts.map +1 -1
  23. package/dist/cmd/cloud/env/import.js +80 -39
  24. package/dist/cmd/cloud/env/import.js.map +1 -1
  25. package/dist/cmd/cloud/env/index.d.ts.map +1 -1
  26. package/dist/cmd/cloud/env/index.js +6 -2
  27. package/dist/cmd/cloud/env/index.js.map +1 -1
  28. package/dist/cmd/cloud/env/list.d.ts.map +1 -1
  29. package/dist/cmd/cloud/env/list.js +99 -23
  30. package/dist/cmd/cloud/env/list.js.map +1 -1
  31. package/dist/cmd/cloud/env/org-util.d.ts +16 -0
  32. package/dist/cmd/cloud/env/org-util.d.ts.map +1 -0
  33. package/dist/cmd/cloud/env/org-util.js +28 -0
  34. package/dist/cmd/cloud/env/org-util.js.map +1 -0
  35. package/dist/cmd/cloud/env/pull.d.ts.map +1 -1
  36. package/dist/cmd/cloud/env/pull.js +61 -29
  37. package/dist/cmd/cloud/env/pull.js.map +1 -1
  38. package/dist/cmd/cloud/env/push.d.ts.map +1 -1
  39. package/dist/cmd/cloud/env/push.js +70 -30
  40. package/dist/cmd/cloud/env/push.js.map +1 -1
  41. package/dist/cmd/cloud/env/set.d.ts.map +1 -1
  42. package/dist/cmd/cloud/env/set.js +72 -26
  43. package/dist/cmd/cloud/env/set.js.map +1 -1
  44. package/dist/cmd/cloud/index.d.ts.map +1 -1
  45. package/dist/cmd/cloud/index.js +2 -0
  46. package/dist/cmd/cloud/index.js.map +1 -1
  47. package/dist/cmd/cloud/keyvalue/create-namespace.js +1 -1
  48. package/dist/cmd/cloud/keyvalue/create-namespace.js.map +1 -1
  49. package/dist/cmd/cloud/keyvalue/delete-namespace.js +2 -2
  50. package/dist/cmd/cloud/keyvalue/delete-namespace.js.map +1 -1
  51. package/dist/cmd/cloud/keyvalue/delete.js +1 -1
  52. package/dist/cmd/cloud/keyvalue/delete.js.map +1 -1
  53. package/dist/cmd/cloud/keyvalue/get.js +1 -1
  54. package/dist/cmd/cloud/keyvalue/get.js.map +1 -1
  55. package/dist/cmd/cloud/keyvalue/index.js +1 -1
  56. package/dist/cmd/cloud/keyvalue/index.js.map +1 -1
  57. package/dist/cmd/cloud/keyvalue/keys.js +1 -1
  58. package/dist/cmd/cloud/keyvalue/keys.js.map +1 -1
  59. package/dist/cmd/cloud/keyvalue/list-namespaces.js +1 -1
  60. package/dist/cmd/cloud/keyvalue/list-namespaces.js.map +1 -1
  61. package/dist/cmd/cloud/keyvalue/repl.d.ts.map +1 -1
  62. package/dist/cmd/cloud/keyvalue/repl.js +8 -5
  63. package/dist/cmd/cloud/keyvalue/repl.js.map +1 -1
  64. package/dist/cmd/cloud/keyvalue/search.js +1 -1
  65. package/dist/cmd/cloud/keyvalue/search.js.map +1 -1
  66. package/dist/cmd/cloud/keyvalue/set.js +1 -1
  67. package/dist/cmd/cloud/keyvalue/set.js.map +1 -1
  68. package/dist/cmd/cloud/keyvalue/stats.js +1 -1
  69. package/dist/cmd/cloud/keyvalue/stats.js.map +1 -1
  70. package/dist/cmd/cloud/keyvalue/util.d.ts +4 -4
  71. package/dist/cmd/cloud/keyvalue/util.d.ts.map +1 -1
  72. package/dist/cmd/cloud/keyvalue/util.js +4 -9
  73. package/dist/cmd/cloud/keyvalue/util.js.map +1 -1
  74. package/dist/cmd/cloud/queue/ack.d.ts +3 -0
  75. package/dist/cmd/cloud/queue/ack.d.ts.map +1 -0
  76. package/dist/cmd/cloud/queue/ack.js +45 -0
  77. package/dist/cmd/cloud/queue/ack.js.map +1 -0
  78. package/dist/cmd/cloud/queue/create.d.ts +3 -0
  79. package/dist/cmd/cloud/queue/create.d.ts.map +1 -0
  80. package/dist/cmd/cloud/queue/create.js +80 -0
  81. package/dist/cmd/cloud/queue/create.js.map +1 -0
  82. package/dist/cmd/cloud/queue/delete.d.ts +3 -0
  83. package/dist/cmd/cloud/queue/delete.d.ts.map +1 -0
  84. package/dist/cmd/cloud/queue/delete.js +50 -0
  85. package/dist/cmd/cloud/queue/delete.js.map +1 -0
  86. package/dist/cmd/cloud/queue/destinations.d.ts +3 -0
  87. package/dist/cmd/cloud/queue/destinations.d.ts.map +1 -0
  88. package/dist/cmd/cloud/queue/destinations.js +232 -0
  89. package/dist/cmd/cloud/queue/destinations.js.map +1 -0
  90. package/dist/cmd/cloud/queue/dlq.d.ts +3 -0
  91. package/dist/cmd/cloud/queue/dlq.d.ts.map +1 -0
  92. package/dist/cmd/cloud/queue/dlq.js +168 -0
  93. package/dist/cmd/cloud/queue/dlq.js.map +1 -0
  94. package/dist/cmd/cloud/queue/get.d.ts +3 -0
  95. package/dist/cmd/cloud/queue/get.d.ts.map +1 -0
  96. package/dist/cmd/cloud/queue/get.js +130 -0
  97. package/dist/cmd/cloud/queue/get.js.map +1 -0
  98. package/dist/cmd/cloud/queue/index.d.ts +3 -0
  99. package/dist/cmd/cloud/queue/index.d.ts.map +1 -0
  100. package/dist/cmd/cloud/queue/index.js +65 -0
  101. package/dist/cmd/cloud/queue/index.js.map +1 -0
  102. package/dist/cmd/cloud/queue/list.d.ts +3 -0
  103. package/dist/cmd/cloud/queue/list.d.ts.map +1 -0
  104. package/dist/cmd/cloud/queue/list.js +71 -0
  105. package/dist/cmd/cloud/queue/list.js.map +1 -0
  106. package/dist/cmd/cloud/queue/messages.d.ts +3 -0
  107. package/dist/cmd/cloud/queue/messages.d.ts.map +1 -0
  108. package/dist/cmd/cloud/queue/messages.js +137 -0
  109. package/dist/cmd/cloud/queue/messages.js.map +1 -0
  110. package/dist/cmd/cloud/queue/nack.d.ts +3 -0
  111. package/dist/cmd/cloud/queue/nack.d.ts.map +1 -0
  112. package/dist/cmd/cloud/queue/nack.js +45 -0
  113. package/dist/cmd/cloud/queue/nack.js.map +1 -0
  114. package/dist/cmd/cloud/queue/pause.d.ts +3 -0
  115. package/dist/cmd/cloud/queue/pause.d.ts.map +1 -0
  116. package/dist/cmd/cloud/queue/pause.js +36 -0
  117. package/dist/cmd/cloud/queue/pause.js.map +1 -0
  118. package/dist/cmd/cloud/queue/publish.d.ts +3 -0
  119. package/dist/cmd/cloud/queue/publish.d.ts.map +1 -0
  120. package/dist/cmd/cloud/queue/publish.js +76 -0
  121. package/dist/cmd/cloud/queue/publish.js.map +1 -0
  122. package/dist/cmd/cloud/queue/receive.d.ts +3 -0
  123. package/dist/cmd/cloud/queue/receive.d.ts.map +1 -0
  124. package/dist/cmd/cloud/queue/receive.js +67 -0
  125. package/dist/cmd/cloud/queue/receive.js.map +1 -0
  126. package/dist/cmd/cloud/queue/resume.d.ts +3 -0
  127. package/dist/cmd/cloud/queue/resume.d.ts.map +1 -0
  128. package/dist/cmd/cloud/queue/resume.js +35 -0
  129. package/dist/cmd/cloud/queue/resume.js.map +1 -0
  130. package/dist/cmd/cloud/queue/sources.d.ts +3 -0
  131. package/dist/cmd/cloud/queue/sources.d.ts.map +1 -0
  132. package/dist/cmd/cloud/queue/sources.js +290 -0
  133. package/dist/cmd/cloud/queue/sources.js.map +1 -0
  134. package/dist/cmd/cloud/queue/stats.d.ts +3 -0
  135. package/dist/cmd/cloud/queue/stats.d.ts.map +1 -0
  136. package/dist/cmd/cloud/queue/stats.js +239 -0
  137. package/dist/cmd/cloud/queue/stats.js.map +1 -0
  138. package/dist/cmd/cloud/queue/util.d.ts +26 -0
  139. package/dist/cmd/cloud/queue/util.d.ts.map +1 -0
  140. package/dist/cmd/cloud/queue/util.js +19 -0
  141. package/dist/cmd/cloud/queue/util.js.map +1 -0
  142. package/dist/cmd/cloud/sandbox/snapshot/build.d.ts.map +1 -1
  143. package/dist/cmd/cloud/sandbox/snapshot/build.js +122 -28
  144. package/dist/cmd/cloud/sandbox/snapshot/build.js.map +1 -1
  145. package/dist/cmd/cloud/sandbox/snapshot/create.d.ts.map +1 -1
  146. package/dist/cmd/cloud/sandbox/snapshot/create.js +19 -7
  147. package/dist/cmd/cloud/sandbox/snapshot/create.js.map +1 -1
  148. package/dist/cmd/cloud/sandbox/snapshot/get.d.ts.map +1 -1
  149. package/dist/cmd/cloud/sandbox/snapshot/get.js +16 -0
  150. package/dist/cmd/cloud/sandbox/snapshot/get.js.map +1 -1
  151. package/dist/cmd/cloud/sandbox/snapshot/list.d.ts.map +1 -1
  152. package/dist/cmd/cloud/sandbox/snapshot/list.js +4 -0
  153. package/dist/cmd/cloud/sandbox/snapshot/list.js.map +1 -1
  154. package/dist/cmd/cloud/vector/stats.d.ts.map +1 -1
  155. package/dist/cmd/cloud/vector/stats.js +8 -0
  156. package/dist/cmd/cloud/vector/stats.js.map +1 -1
  157. package/dist/cmd/project/create.d.ts.map +1 -1
  158. package/dist/cmd/project/create.js +12 -0
  159. package/dist/cmd/project/create.js.map +1 -1
  160. package/dist/cmd/project/template-flow.d.ts +3 -0
  161. package/dist/cmd/project/template-flow.d.ts.map +1 -1
  162. package/dist/cmd/project/template-flow.js +157 -68
  163. package/dist/cmd/project/template-flow.js.map +1 -1
  164. package/dist/cmd/setup/index.d.ts.map +1 -1
  165. package/dist/cmd/setup/index.js +2 -1
  166. package/dist/cmd/setup/index.js.map +1 -1
  167. package/dist/env-util.d.ts +6 -1
  168. package/dist/env-util.d.ts.map +1 -1
  169. package/dist/env-util.js +16 -2
  170. package/dist/env-util.js.map +1 -1
  171. package/dist/errors.d.ts +4 -2
  172. package/dist/errors.d.ts.map +1 -1
  173. package/dist/errors.js +6 -0
  174. package/dist/errors.js.map +1 -1
  175. package/dist/onboarding/agentPrompt.d.ts +8 -0
  176. package/dist/onboarding/agentPrompt.d.ts.map +1 -0
  177. package/dist/onboarding/agentPrompt.js +263 -0
  178. package/dist/onboarding/agentPrompt.js.map +1 -0
  179. package/dist/schema-generator.d.ts +1 -1
  180. package/dist/schema-generator.d.ts.map +1 -1
  181. package/dist/schema-parser.d.ts +1 -1
  182. package/dist/schema-parser.d.ts.map +1 -1
  183. package/dist/schema-parser.js +36 -1
  184. package/dist/schema-parser.js.map +1 -1
  185. package/dist/tui/box.d.ts +4 -0
  186. package/dist/tui/box.d.ts.map +1 -1
  187. package/dist/tui/box.js +39 -0
  188. package/dist/tui/box.js.map +1 -1
  189. package/dist/tui.d.ts +11 -1
  190. package/dist/tui.d.ts.map +1 -1
  191. package/dist/tui.js +33 -15
  192. package/dist/tui.js.map +1 -1
  193. package/dist/types.d.ts.map +1 -1
  194. package/dist/types.js.map +1 -1
  195. package/package.json +6 -6
  196. package/src/cli.ts +19 -2
  197. package/src/cmd/ai/opencode/install.ts +1 -1
  198. package/src/cmd/build/ast.ts +88 -2
  199. package/src/cmd/build/vite/registry-generator.ts +120 -24
  200. package/src/cmd/build/vite/route-discovery.ts +16 -0
  201. package/src/cmd/cloud/env/delete.ts +113 -41
  202. package/src/cmd/cloud/env/get.ts +60 -16
  203. package/src/cmd/cloud/env/import.ts +92 -44
  204. package/src/cmd/cloud/env/index.ts +6 -2
  205. package/src/cmd/cloud/env/list.ts +112 -27
  206. package/src/cmd/cloud/env/org-util.ts +37 -0
  207. package/src/cmd/cloud/env/pull.ts +72 -31
  208. package/src/cmd/cloud/env/push.ts +84 -35
  209. package/src/cmd/cloud/env/set.ts +89 -33
  210. package/src/cmd/cloud/index.ts +2 -0
  211. package/src/cmd/cloud/keyvalue/create-namespace.ts +1 -1
  212. package/src/cmd/cloud/keyvalue/delete-namespace.ts +2 -2
  213. package/src/cmd/cloud/keyvalue/delete.ts +1 -1
  214. package/src/cmd/cloud/keyvalue/get.ts +1 -1
  215. package/src/cmd/cloud/keyvalue/index.ts +1 -1
  216. package/src/cmd/cloud/keyvalue/keys.ts +1 -1
  217. package/src/cmd/cloud/keyvalue/list-namespaces.ts +1 -1
  218. package/src/cmd/cloud/keyvalue/repl.ts +8 -5
  219. package/src/cmd/cloud/keyvalue/search.ts +1 -1
  220. package/src/cmd/cloud/keyvalue/set.ts +1 -1
  221. package/src/cmd/cloud/keyvalue/stats.ts +1 -1
  222. package/src/cmd/cloud/keyvalue/util.ts +8 -17
  223. package/src/cmd/cloud/queue/ack.ts +50 -0
  224. package/src/cmd/cloud/queue/create.ts +91 -0
  225. package/src/cmd/cloud/queue/delete.ts +57 -0
  226. package/src/cmd/cloud/queue/destinations.ts +287 -0
  227. package/src/cmd/cloud/queue/dlq.ts +203 -0
  228. package/src/cmd/cloud/queue/get.ts +158 -0
  229. package/src/cmd/cloud/queue/index.ts +66 -0
  230. package/src/cmd/cloud/queue/list.ts +81 -0
  231. package/src/cmd/cloud/queue/messages.ts +160 -0
  232. package/src/cmd/cloud/queue/nack.ts +50 -0
  233. package/src/cmd/cloud/queue/pause.ts +41 -0
  234. package/src/cmd/cloud/queue/publish.ts +88 -0
  235. package/src/cmd/cloud/queue/receive.ts +76 -0
  236. package/src/cmd/cloud/queue/resume.ts +40 -0
  237. package/src/cmd/cloud/queue/sources.ts +352 -0
  238. package/src/cmd/cloud/queue/stats.ts +297 -0
  239. package/src/cmd/cloud/queue/util.ts +34 -0
  240. package/src/cmd/cloud/sandbox/snapshot/build.ts +146 -29
  241. package/src/cmd/cloud/sandbox/snapshot/create.ts +24 -7
  242. package/src/cmd/cloud/sandbox/snapshot/get.ts +16 -0
  243. package/src/cmd/cloud/sandbox/snapshot/list.ts +4 -0
  244. package/src/cmd/cloud/vector/stats.ts +9 -0
  245. package/src/cmd/project/create.ts +12 -0
  246. package/src/cmd/project/template-flow.ts +181 -69
  247. package/src/cmd/setup/index.ts +2 -1
  248. package/src/env-util.ts +17 -2
  249. package/src/errors.ts +8 -0
  250. package/src/onboarding/agentPrompt.ts +263 -0
  251. package/src/schema-generator.ts +1 -1
  252. package/src/schema-parser.ts +45 -3
  253. package/src/tui/box.ts +52 -0
  254. package/src/tui.ts +47 -17
  255. package/src/types.ts +0 -1
@@ -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;
@@ -0,0 +1,158 @@
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 { getQueue, getMessage, QueueSchema, MessageSchema, type Message } from '@agentuity/server';
7
+
8
+ const GetResponseSchema = z.union([
9
+ z.object({ type: z.literal('queue'), queue: QueueSchema }),
10
+ z.object({ type: z.literal('message'), message: MessageSchema }),
11
+ ]);
12
+
13
+ function displayMessage(message: Message): void {
14
+ const details: Record<string, unknown> = {
15
+ ID: message.id,
16
+ 'Queue ID': message.queue_id,
17
+ Offset: message.offset,
18
+ State: message.state,
19
+ 'Delivery Attempts': message.delivery_attempts,
20
+ };
21
+
22
+ if (message.partition_key) {
23
+ details['Partition Key'] = message.partition_key;
24
+ }
25
+ if (message.idempotency_key) {
26
+ details['Idempotency Key'] = message.idempotency_key;
27
+ }
28
+
29
+ details.Published = message.published_at ? new Date(message.published_at).toLocaleString() : '-';
30
+ details.Created = message.created_at ? new Date(message.created_at).toLocaleString() : '-';
31
+
32
+ if (message.expires_at) {
33
+ details.Expires = new Date(message.expires_at).toLocaleString();
34
+ }
35
+ if (message.delivered_at) {
36
+ details.Delivered = new Date(message.delivered_at).toLocaleString();
37
+ }
38
+ if (message.acknowledged_at) {
39
+ details.Acknowledged = new Date(message.acknowledged_at).toLocaleString();
40
+ }
41
+
42
+ tui.table([details], undefined, { layout: 'vertical' });
43
+
44
+ tui.newline();
45
+ tui.info('Payload');
46
+ tui.json(message.payload);
47
+
48
+ if (message.metadata && Object.keys(message.metadata).length > 0) {
49
+ tui.newline();
50
+ tui.info('Metadata');
51
+ tui.json(message.metadata);
52
+ }
53
+ }
54
+
55
+ export const getSubcommand = createCommand({
56
+ name: 'get',
57
+ description: 'Get queue or message details',
58
+ tags: ['read-only', 'fast', 'requires-auth'],
59
+ requires: { auth: true },
60
+ examples: [
61
+ { command: getCommand('cloud queue get my-queue'), description: 'Get queue details' },
62
+ {
63
+ command: getCommand('cloud queue get my-queue msg_abc123'),
64
+ description: 'Get message details',
65
+ },
66
+ ],
67
+ schema: {
68
+ args: z.object({
69
+ queue_name: z.string().min(1).describe('Queue name'),
70
+ message_id: z.string().optional().describe('Message ID (msg_...) to get message details'),
71
+ }),
72
+ response: GetResponseSchema,
73
+ },
74
+ idempotent: true,
75
+
76
+ async handler(ctx) {
77
+ const { args, options } = ctx;
78
+ const client = await createQueueAPIClient(ctx);
79
+ const apiOptions = getQueueApiOptions(ctx);
80
+
81
+ if (args.message_id) {
82
+ const message = await getMessage(client, args.queue_name, args.message_id, apiOptions);
83
+
84
+ if (!options.json) {
85
+ displayMessage(message);
86
+ }
87
+
88
+ return { type: 'message' as const, message };
89
+ }
90
+
91
+ const queue = await getQueue(client, args.queue_name, apiOptions);
92
+
93
+ if (!options.json) {
94
+ const details: Record<string, unknown> = {
95
+ Name: queue.name,
96
+ ID: queue.id,
97
+ Type: queue.queue_type,
98
+ };
99
+
100
+ if (queue.description) {
101
+ details.Description = queue.description;
102
+ }
103
+
104
+ if (queue.paused_at) {
105
+ details.Status = 'Paused';
106
+ details['Paused At'] = new Date(queue.paused_at).toLocaleString();
107
+ } else {
108
+ details.Status = 'Active';
109
+ }
110
+
111
+ details.Created = new Date(queue.created_at).toLocaleString();
112
+ details.Updated = new Date(queue.updated_at).toLocaleString();
113
+
114
+ tui.table([details], undefined, { layout: 'vertical' });
115
+
116
+ if (
117
+ queue.message_count !== undefined ||
118
+ queue.dlq_count !== undefined ||
119
+ queue.next_offset !== undefined
120
+ ) {
121
+ tui.newline();
122
+ tui.info('Stats');
123
+ tui.table(
124
+ [
125
+ {
126
+ Messages: queue.message_count ?? 0,
127
+ 'DLQ Count': queue.dlq_count ?? 0,
128
+ 'Next Offset': queue.next_offset ?? 0,
129
+ },
130
+ ],
131
+ undefined,
132
+ { layout: 'vertical' }
133
+ );
134
+ }
135
+
136
+ if (queue.default_visibility_timeout_seconds !== undefined) {
137
+ tui.newline();
138
+ tui.info('Settings');
139
+ const settings: Record<string, unknown> = {};
140
+ if (queue.default_ttl_seconds != null) {
141
+ settings['Default TTL'] = `${queue.default_ttl_seconds}s`;
142
+ }
143
+ settings['Visibility Timeout'] = `${queue.default_visibility_timeout_seconds}s`;
144
+ settings['Max Retries'] = queue.default_max_retries;
145
+ settings['Retry Backoff'] = `${queue.default_retry_backoff_ms}ms`;
146
+ settings['Max Backoff'] = `${queue.default_retry_max_backoff_ms}ms`;
147
+ settings['Backoff Multiplier'] = `${queue.default_retry_multiplier}x`;
148
+ settings['Max In-Flight'] = queue.max_in_flight_per_client;
149
+
150
+ tui.table([settings], undefined, { layout: 'vertical' });
151
+ }
152
+ }
153
+
154
+ return { type: 'queue' as const, queue };
155
+ },
156
+ });
157
+
158
+ export default getSubcommand;
@@ -0,0 +1,66 @@
1
+ import { createCommand } from '../../../types';
2
+ import { listSubcommand } from './list';
3
+ import { createSubcommand } from './create';
4
+ import { getSubcommand } from './get';
5
+ import { deleteSubcommand } from './delete';
6
+ import { publishSubcommand } from './publish';
7
+ import { messagesSubcommand } from './messages';
8
+ import { receiveSubcommand } from './receive';
9
+ import { ackSubcommand } from './ack';
10
+ import { nackSubcommand } from './nack';
11
+ import { dlqSubcommand } from './dlq';
12
+ import { destinationsSubcommand } from './destinations';
13
+ import { sourcesSubcommand } from './sources';
14
+ import { pauseSubcommand } from './pause';
15
+ import { resumeSubcommand } from './resume';
16
+ import { statsSubcommand } from './stats';
17
+ import { getCommand } from '../../../command-prefix';
18
+
19
+ export const command = createCommand({
20
+ name: 'queue',
21
+ aliases: ['queues'],
22
+ description: 'Manage message queues',
23
+ tags: ['requires-auth'],
24
+ examples: [
25
+ {
26
+ command: getCommand('cloud queue list'),
27
+ description: 'List all queues',
28
+ },
29
+ {
30
+ command: getCommand('cloud queue create worker --name my-tasks'),
31
+ description: 'Create a worker queue',
32
+ },
33
+ {
34
+ command: getCommand('cloud queue publish my-queue \'{"task":"process"}\''),
35
+ description: 'Publish a message',
36
+ },
37
+ {
38
+ command: getCommand('cloud queue receive my-queue'),
39
+ description: 'Receive a message from a worker queue',
40
+ },
41
+ {
42
+ command: getCommand('cloud queue stats'),
43
+ description: 'View analytics for all queues',
44
+ },
45
+ ],
46
+ subcommands: [
47
+ listSubcommand,
48
+ createSubcommand,
49
+ getSubcommand,
50
+ deleteSubcommand,
51
+ publishSubcommand,
52
+ messagesSubcommand,
53
+ receiveSubcommand,
54
+ ackSubcommand,
55
+ nackSubcommand,
56
+ dlqSubcommand,
57
+ destinationsSubcommand,
58
+ sourcesSubcommand,
59
+ pauseSubcommand,
60
+ resumeSubcommand,
61
+ statsSubcommand,
62
+ ],
63
+ requires: { auth: true },
64
+ });
65
+
66
+ export default command;
@@ -0,0 +1,81 @@
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 { listQueues, type Queue } from '@agentuity/server';
7
+
8
+ const QueueListResponseSchema = z.object({
9
+ queues: z.array(
10
+ z.object({
11
+ name: z.string(),
12
+ queue_type: z.string(),
13
+ message_count: z.number(),
14
+ dlq_count: z.number(),
15
+ created_at: z.string(),
16
+ })
17
+ ),
18
+ total: z.number().optional(),
19
+ });
20
+
21
+ export const listSubcommand = createCommand({
22
+ name: 'list',
23
+ aliases: ['ls'],
24
+ description: 'List all queues',
25
+ tags: ['read-only', 'fast', 'requires-auth'],
26
+ requires: { auth: true },
27
+ examples: [
28
+ { command: getCommand('cloud queue list'), description: 'List all queues' },
29
+ { command: getCommand('cloud queue ls'), description: 'List all queues (alias)' },
30
+ ],
31
+ schema: {
32
+ args: z.object({}),
33
+ options: z.object({
34
+ limit: z.coerce.number().optional().describe('Maximum number of queues to return'),
35
+ offset: z.coerce.number().optional().describe('Offset for pagination'),
36
+ }),
37
+ response: QueueListResponseSchema,
38
+ },
39
+ idempotent: true,
40
+
41
+ async handler(ctx) {
42
+ const { options, opts } = ctx;
43
+ const client = await createQueueAPIClient(ctx);
44
+ const result = await listQueues(
45
+ client,
46
+ {
47
+ limit: opts.limit,
48
+ offset: opts.offset,
49
+ },
50
+ getQueueApiOptions(ctx)
51
+ );
52
+
53
+ if (!options.json) {
54
+ if (result.queues.length === 0) {
55
+ tui.info('No queues found');
56
+ } else {
57
+ const tableData = result.queues.map((q: Queue) => ({
58
+ Name: q.name,
59
+ Type: q.queue_type,
60
+ Messages: q.message_count ?? 0,
61
+ DLQ: q.dlq_count ?? 0,
62
+ Created: new Date(q.created_at).toLocaleString(),
63
+ }));
64
+ tui.table(tableData, ['Name', 'Type', 'Messages', 'DLQ', 'Created']);
65
+ }
66
+ }
67
+
68
+ return {
69
+ queues: result.queues.map((q: Queue) => ({
70
+ name: q.name,
71
+ queue_type: q.queue_type,
72
+ message_count: q.message_count ?? 0,
73
+ dlq_count: q.dlq_count ?? 0,
74
+ created_at: q.created_at,
75
+ })),
76
+ total: result.total,
77
+ };
78
+ },
79
+ });
80
+
81
+ export default listSubcommand;
@@ -0,0 +1,160 @@
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 { listMessages, getMessage, MessageSchema, type Message } from '@agentuity/server';
7
+
8
+ const MessagesListResponseSchema = z.object({
9
+ messages: z.array(
10
+ z.object({
11
+ id: z.string(),
12
+ offset: z.number(),
13
+ state: z.string().optional(),
14
+ size: z.number().optional(),
15
+ created_at: z.string().optional(),
16
+ })
17
+ ),
18
+ total: z.number().optional(),
19
+ });
20
+
21
+ const MessagesResponseSchema = z.union([
22
+ z.object({ type: z.literal('list'), data: MessagesListResponseSchema }),
23
+ z.object({ type: z.literal('message'), message: MessageSchema }),
24
+ ]);
25
+
26
+ function displayMessage(message: Message): void {
27
+ const details: Record<string, unknown> = {
28
+ ID: message.id,
29
+ 'Queue ID': message.queue_id,
30
+ Offset: message.offset,
31
+ State: message.state,
32
+ 'Delivery Attempts': message.delivery_attempts,
33
+ };
34
+
35
+ if (message.partition_key) {
36
+ details['Partition Key'] = message.partition_key;
37
+ }
38
+ if (message.idempotency_key) {
39
+ details['Idempotency Key'] = message.idempotency_key;
40
+ }
41
+
42
+ details.Published = message.published_at ? new Date(message.published_at).toLocaleString() : '-';
43
+ details.Created = message.created_at ? new Date(message.created_at).toLocaleString() : '-';
44
+
45
+ if (message.expires_at) {
46
+ details.Expires = new Date(message.expires_at).toLocaleString();
47
+ }
48
+ if (message.delivered_at) {
49
+ details.Delivered = new Date(message.delivered_at).toLocaleString();
50
+ }
51
+ if (message.acknowledged_at) {
52
+ details.Acknowledged = new Date(message.acknowledged_at).toLocaleString();
53
+ }
54
+
55
+ tui.table([details], undefined, { layout: 'vertical' });
56
+
57
+ tui.newline();
58
+ tui.info('Payload');
59
+ tui.json(message.payload);
60
+
61
+ if (message.metadata && Object.keys(message.metadata).length > 0) {
62
+ tui.newline();
63
+ tui.info('Metadata');
64
+ tui.json(message.metadata);
65
+ }
66
+ }
67
+
68
+ export const messagesSubcommand = createCommand({
69
+ name: 'messages',
70
+ aliases: ['msgs'],
71
+ description: 'List messages in a queue or get a specific message',
72
+ tags: ['read-only', 'fast', 'requires-auth'],
73
+ requires: { auth: true },
74
+ examples: [
75
+ {
76
+ command: getCommand('cloud queue messages my-queue'),
77
+ description: 'List messages in a queue',
78
+ },
79
+ {
80
+ command: getCommand('cloud queue messages my-queue --limit 10'),
81
+ description: 'List first 10 messages',
82
+ },
83
+ {
84
+ command: getCommand('cloud queue messages my-queue msg_abc123'),
85
+ description: 'Get a specific message by ID',
86
+ },
87
+ ],
88
+ schema: {
89
+ args: z.object({
90
+ queue_name: z.string().min(1).describe('Queue name'),
91
+ message_id: z
92
+ .string()
93
+ .optional()
94
+ .describe('Message ID (optional, to get a specific message)'),
95
+ }),
96
+ options: z.object({
97
+ limit: z.number().optional().describe('Maximum number of messages to return'),
98
+ offset: z.number().optional().describe('Offset for pagination'),
99
+ }),
100
+ response: MessagesResponseSchema,
101
+ },
102
+ idempotent: true,
103
+
104
+ async handler(ctx) {
105
+ const { args, opts, options } = ctx;
106
+ const client = await createQueueAPIClient(ctx);
107
+ const apiOptions = getQueueApiOptions(ctx);
108
+
109
+ if (args.message_id) {
110
+ const message = await getMessage(client, args.queue_name, args.message_id, apiOptions);
111
+
112
+ if (!options.json) {
113
+ displayMessage(message);
114
+ }
115
+
116
+ return { type: 'message' as const, message };
117
+ }
118
+
119
+ const result = await listMessages(
120
+ client,
121
+ args.queue_name,
122
+ {
123
+ limit: opts.limit,
124
+ offset: opts.offset,
125
+ },
126
+ apiOptions
127
+ );
128
+
129
+ if (!options.json) {
130
+ if (result.messages.length === 0) {
131
+ tui.info('No messages found');
132
+ } else {
133
+ const tableData = result.messages.map((m: Message) => ({
134
+ ID: m.id,
135
+ Offset: m.offset,
136
+ State: m.state,
137
+ Size: m.size,
138
+ Created: m.created_at ? new Date(m.created_at).toLocaleString() : 'N/A',
139
+ }));
140
+ tui.table(tableData, ['ID', 'Offset', 'State', 'Size', 'Created']);
141
+ }
142
+ }
143
+
144
+ return {
145
+ type: 'list' as const,
146
+ data: {
147
+ messages: result.messages.map((m: Message) => ({
148
+ id: m.id,
149
+ offset: m.offset,
150
+ state: m.state,
151
+ size: m.size,
152
+ created_at: m.created_at,
153
+ })),
154
+ total: result.total,
155
+ },
156
+ };
157
+ },
158
+ });
159
+
160
+ export default messagesSubcommand;