@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.
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +3 -1
- package/dist/cli.js.map +1 -1
- package/dist/cmd/build/ast.d.ts.map +1 -1
- package/dist/cmd/build/ast.js +68 -2
- package/dist/cmd/build/ast.js.map +1 -1
- package/dist/cmd/build/vite/registry-generator.d.ts.map +1 -1
- package/dist/cmd/build/vite/registry-generator.js +112 -23
- package/dist/cmd/build/vite/registry-generator.js.map +1 -1
- package/dist/cmd/build/vite/route-discovery.d.ts +4 -0
- package/dist/cmd/build/vite/route-discovery.d.ts.map +1 -1
- package/dist/cmd/build/vite/route-discovery.js +4 -0
- package/dist/cmd/build/vite/route-discovery.js.map +1 -1
- package/dist/cmd/cloud/env/delete.d.ts.map +1 -1
- package/dist/cmd/cloud/env/delete.js +8 -2
- package/dist/cmd/cloud/env/delete.js.map +1 -1
- package/dist/cmd/cloud/env/get.d.ts.map +1 -1
- package/dist/cmd/cloud/env/get.js +4 -1
- package/dist/cmd/cloud/env/get.js.map +1 -1
- package/dist/cmd/cloud/env/import.d.ts.map +1 -1
- package/dist/cmd/cloud/env/import.js +5 -8
- package/dist/cmd/cloud/env/import.js.map +1 -1
- package/dist/cmd/cloud/env/list.d.ts.map +1 -1
- package/dist/cmd/cloud/env/list.js +11 -6
- package/dist/cmd/cloud/env/list.js.map +1 -1
- package/dist/cmd/cloud/env/pull.d.ts.map +1 -1
- package/dist/cmd/cloud/env/pull.js.map +1 -1
- package/dist/cmd/cloud/env/push.d.ts.map +1 -1
- package/dist/cmd/cloud/env/push.js +1 -7
- package/dist/cmd/cloud/env/push.js.map +1 -1
- package/dist/cmd/cloud/env/set.d.ts.map +1 -1
- package/dist/cmd/cloud/env/set.js +4 -1
- package/dist/cmd/cloud/env/set.js.map +1 -1
- package/dist/cmd/cloud/index.d.ts.map +1 -1
- package/dist/cmd/cloud/index.js +2 -0
- package/dist/cmd/cloud/index.js.map +1 -1
- package/dist/cmd/cloud/queue/ack.d.ts +3 -0
- package/dist/cmd/cloud/queue/ack.d.ts.map +1 -0
- package/dist/cmd/cloud/queue/ack.js +45 -0
- package/dist/cmd/cloud/queue/ack.js.map +1 -0
- package/dist/cmd/cloud/queue/create.d.ts +3 -0
- package/dist/cmd/cloud/queue/create.d.ts.map +1 -0
- package/dist/cmd/cloud/queue/create.js +80 -0
- package/dist/cmd/cloud/queue/create.js.map +1 -0
- package/dist/cmd/cloud/queue/delete.d.ts +3 -0
- package/dist/cmd/cloud/queue/delete.d.ts.map +1 -0
- package/dist/cmd/cloud/queue/delete.js +50 -0
- package/dist/cmd/cloud/queue/delete.js.map +1 -0
- package/dist/cmd/cloud/queue/destinations.d.ts +3 -0
- package/dist/cmd/cloud/queue/destinations.d.ts.map +1 -0
- package/dist/cmd/cloud/queue/destinations.js +232 -0
- package/dist/cmd/cloud/queue/destinations.js.map +1 -0
- package/dist/cmd/cloud/queue/dlq.d.ts +3 -0
- package/dist/cmd/cloud/queue/dlq.d.ts.map +1 -0
- package/dist/cmd/cloud/queue/dlq.js +168 -0
- package/dist/cmd/cloud/queue/dlq.js.map +1 -0
- package/dist/cmd/cloud/queue/get.d.ts +3 -0
- package/dist/cmd/cloud/queue/get.d.ts.map +1 -0
- package/dist/cmd/cloud/queue/get.js +130 -0
- package/dist/cmd/cloud/queue/get.js.map +1 -0
- package/dist/cmd/cloud/queue/index.d.ts +3 -0
- package/dist/cmd/cloud/queue/index.d.ts.map +1 -0
- package/dist/cmd/cloud/queue/index.js +65 -0
- package/dist/cmd/cloud/queue/index.js.map +1 -0
- package/dist/cmd/cloud/queue/list.d.ts +3 -0
- package/dist/cmd/cloud/queue/list.d.ts.map +1 -0
- package/dist/cmd/cloud/queue/list.js +71 -0
- package/dist/cmd/cloud/queue/list.js.map +1 -0
- package/dist/cmd/cloud/queue/messages.d.ts +3 -0
- package/dist/cmd/cloud/queue/messages.d.ts.map +1 -0
- package/dist/cmd/cloud/queue/messages.js +137 -0
- package/dist/cmd/cloud/queue/messages.js.map +1 -0
- package/dist/cmd/cloud/queue/nack.d.ts +3 -0
- package/dist/cmd/cloud/queue/nack.d.ts.map +1 -0
- package/dist/cmd/cloud/queue/nack.js +45 -0
- package/dist/cmd/cloud/queue/nack.js.map +1 -0
- package/dist/cmd/cloud/queue/pause.d.ts +3 -0
- package/dist/cmd/cloud/queue/pause.d.ts.map +1 -0
- package/dist/cmd/cloud/queue/pause.js +36 -0
- package/dist/cmd/cloud/queue/pause.js.map +1 -0
- package/dist/cmd/cloud/queue/publish.d.ts +3 -0
- package/dist/cmd/cloud/queue/publish.d.ts.map +1 -0
- package/dist/cmd/cloud/queue/publish.js +76 -0
- package/dist/cmd/cloud/queue/publish.js.map +1 -0
- package/dist/cmd/cloud/queue/receive.d.ts +3 -0
- package/dist/cmd/cloud/queue/receive.d.ts.map +1 -0
- package/dist/cmd/cloud/queue/receive.js +67 -0
- package/dist/cmd/cloud/queue/receive.js.map +1 -0
- package/dist/cmd/cloud/queue/resume.d.ts +3 -0
- package/dist/cmd/cloud/queue/resume.d.ts.map +1 -0
- package/dist/cmd/cloud/queue/resume.js +35 -0
- package/dist/cmd/cloud/queue/resume.js.map +1 -0
- package/dist/cmd/cloud/queue/sources.d.ts +3 -0
- package/dist/cmd/cloud/queue/sources.d.ts.map +1 -0
- package/dist/cmd/cloud/queue/sources.js +290 -0
- package/dist/cmd/cloud/queue/sources.js.map +1 -0
- package/dist/cmd/cloud/queue/stats.d.ts +3 -0
- package/dist/cmd/cloud/queue/stats.d.ts.map +1 -0
- package/dist/cmd/cloud/queue/stats.js +239 -0
- package/dist/cmd/cloud/queue/stats.js.map +1 -0
- package/dist/cmd/cloud/queue/util.d.ts +26 -0
- package/dist/cmd/cloud/queue/util.d.ts.map +1 -0
- package/dist/cmd/cloud/queue/util.js +19 -0
- package/dist/cmd/cloud/queue/util.js.map +1 -0
- package/dist/cmd/cloud/sandbox/snapshot/build.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/snapshot/build.js +122 -28
- package/dist/cmd/cloud/sandbox/snapshot/build.js.map +1 -1
- package/dist/cmd/cloud/sandbox/snapshot/create.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/snapshot/create.js +19 -7
- package/dist/cmd/cloud/sandbox/snapshot/create.js.map +1 -1
- package/dist/cmd/cloud/sandbox/snapshot/get.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/snapshot/get.js +16 -0
- package/dist/cmd/cloud/sandbox/snapshot/get.js.map +1 -1
- package/dist/cmd/cloud/sandbox/snapshot/list.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/snapshot/list.js +4 -0
- package/dist/cmd/cloud/sandbox/snapshot/list.js.map +1 -1
- package/dist/cmd/cloud/vector/stats.d.ts.map +1 -1
- package/dist/cmd/cloud/vector/stats.js +8 -0
- package/dist/cmd/cloud/vector/stats.js.map +1 -1
- package/dist/cmd/project/template-flow.d.ts.map +1 -1
- package/dist/cmd/project/template-flow.js.map +1 -1
- package/dist/env-util.d.ts +6 -1
- package/dist/env-util.d.ts.map +1 -1
- package/dist/env-util.js +16 -2
- package/dist/env-util.js.map +1 -1
- package/dist/errors.d.ts +4 -2
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +6 -0
- package/dist/errors.js.map +1 -1
- package/dist/schema-parser.d.ts.map +1 -1
- package/dist/schema-parser.js +2 -2
- package/dist/schema-parser.js.map +1 -1
- package/dist/tui/box.d.ts +4 -0
- package/dist/tui/box.d.ts.map +1 -1
- package/dist/tui/box.js +39 -0
- package/dist/tui/box.js.map +1 -1
- package/dist/tui.d.ts +11 -1
- package/dist/tui.d.ts.map +1 -1
- package/dist/tui.js +16 -8
- package/dist/tui.js.map +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +6 -6
- package/src/cli.ts +5 -1
- package/src/cmd/build/ast.ts +88 -2
- package/src/cmd/build/vite/registry-generator.ts +120 -24
- package/src/cmd/build/vite/route-discovery.ts +16 -0
- package/src/cmd/cloud/env/delete.ts +18 -5
- package/src/cmd/cloud/env/get.ts +10 -3
- package/src/cmd/cloud/env/import.ts +10 -11
- package/src/cmd/cloud/env/list.ts +19 -9
- package/src/cmd/cloud/env/org-util.ts +1 -1
- package/src/cmd/cloud/env/pull.ts +9 -4
- package/src/cmd/cloud/env/push.ts +5 -9
- package/src/cmd/cloud/env/set.ts +10 -3
- package/src/cmd/cloud/index.ts +2 -0
- package/src/cmd/cloud/queue/ack.ts +50 -0
- package/src/cmd/cloud/queue/create.ts +91 -0
- package/src/cmd/cloud/queue/delete.ts +57 -0
- package/src/cmd/cloud/queue/destinations.ts +287 -0
- package/src/cmd/cloud/queue/dlq.ts +203 -0
- package/src/cmd/cloud/queue/get.ts +158 -0
- package/src/cmd/cloud/queue/index.ts +66 -0
- package/src/cmd/cloud/queue/list.ts +81 -0
- package/src/cmd/cloud/queue/messages.ts +160 -0
- package/src/cmd/cloud/queue/nack.ts +50 -0
- package/src/cmd/cloud/queue/pause.ts +41 -0
- package/src/cmd/cloud/queue/publish.ts +88 -0
- package/src/cmd/cloud/queue/receive.ts +76 -0
- package/src/cmd/cloud/queue/resume.ts +40 -0
- package/src/cmd/cloud/queue/sources.ts +352 -0
- package/src/cmd/cloud/queue/stats.ts +297 -0
- package/src/cmd/cloud/queue/util.ts +34 -0
- package/src/cmd/cloud/sandbox/snapshot/build.ts +146 -29
- package/src/cmd/cloud/sandbox/snapshot/create.ts +24 -7
- package/src/cmd/cloud/sandbox/snapshot/get.ts +16 -0
- package/src/cmd/cloud/sandbox/snapshot/list.ts +4 -0
- package/src/cmd/cloud/vector/stats.ts +9 -0
- package/src/cmd/project/template-flow.ts +1 -3
- package/src/env-util.ts +17 -2
- package/src/errors.ts +8 -0
- package/src/schema-parser.ts +6 -3
- package/src/tui/box.ts +52 -0
- package/src/tui.ts +28 -8
- package/src/types.ts +0 -1
|
@@ -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;
|
|
@@ -0,0 +1,50 @@
|
|
|
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 { nackMessage } from '@agentuity/server';
|
|
7
|
+
|
|
8
|
+
const NackResponseSchema = z.object({
|
|
9
|
+
success: z.boolean(),
|
|
10
|
+
queue_name: z.string(),
|
|
11
|
+
message_id: z.string(),
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
export const nackSubcommand = createCommand({
|
|
15
|
+
name: 'nack',
|
|
16
|
+
description: 'Negative acknowledge a message (return to queue for retry)',
|
|
17
|
+
tags: ['mutating', 'updates-resource', 'requires-auth'],
|
|
18
|
+
requires: { auth: true },
|
|
19
|
+
examples: [
|
|
20
|
+
{
|
|
21
|
+
command: getCommand('cloud queue nack my-queue msg-123'),
|
|
22
|
+
description: 'Return message to queue for retry',
|
|
23
|
+
},
|
|
24
|
+
],
|
|
25
|
+
schema: {
|
|
26
|
+
args: z.object({
|
|
27
|
+
queue_name: z.string().min(1).describe('Queue name'),
|
|
28
|
+
message_id: z.string().min(1).describe('Message ID'),
|
|
29
|
+
}),
|
|
30
|
+
response: NackResponseSchema,
|
|
31
|
+
},
|
|
32
|
+
|
|
33
|
+
async handler(ctx) {
|
|
34
|
+
const { args, options } = ctx;
|
|
35
|
+
const client = await createQueueAPIClient(ctx);
|
|
36
|
+
await nackMessage(client, args.queue_name, args.message_id, getQueueApiOptions(ctx));
|
|
37
|
+
|
|
38
|
+
if (!options.json) {
|
|
39
|
+
tui.success(`Returned message to queue: ${args.message_id}`);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return {
|
|
43
|
+
success: true,
|
|
44
|
+
queue_name: args.queue_name,
|
|
45
|
+
message_id: args.message_id,
|
|
46
|
+
};
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
export default nackSubcommand;
|
|
@@ -0,0 +1,41 @@
|
|
|
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 { pauseQueue, QueueSchema } from '@agentuity/server';
|
|
7
|
+
|
|
8
|
+
export const pauseSubcommand = createCommand({
|
|
9
|
+
name: 'pause',
|
|
10
|
+
description: 'Pause message delivery for a queue',
|
|
11
|
+
tags: ['mutating', 'updates-resource', 'requires-auth'],
|
|
12
|
+
requires: { auth: true },
|
|
13
|
+
examples: [
|
|
14
|
+
{
|
|
15
|
+
command: getCommand('cloud queue pause my-queue'),
|
|
16
|
+
description: 'Pause a queue',
|
|
17
|
+
},
|
|
18
|
+
],
|
|
19
|
+
schema: {
|
|
20
|
+
args: z.object({
|
|
21
|
+
name: z.string().min(1).describe('Queue name'),
|
|
22
|
+
}),
|
|
23
|
+
response: QueueSchema,
|
|
24
|
+
},
|
|
25
|
+
|
|
26
|
+
async handler(ctx) {
|
|
27
|
+
const { args, options } = ctx;
|
|
28
|
+
const client = await createQueueAPIClient(ctx);
|
|
29
|
+
|
|
30
|
+
const queue = await pauseQueue(client, args.name, getQueueApiOptions(ctx));
|
|
31
|
+
|
|
32
|
+
if (!options.json) {
|
|
33
|
+
tui.success(`Paused queue: ${queue.name}`);
|
|
34
|
+
tui.info(` Paused at: ${queue.paused_at}`);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return queue;
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
export default pauseSubcommand;
|
|
@@ -0,0 +1,88 @@
|
|
|
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 { publishMessage, MessageSchema } from '@agentuity/server';
|
|
7
|
+
import { ErrorCode } from '../../../errors';
|
|
8
|
+
|
|
9
|
+
export const publishSubcommand = createCommand({
|
|
10
|
+
name: 'publish',
|
|
11
|
+
aliases: ['pub', 'send'],
|
|
12
|
+
description: 'Publish a message to a queue',
|
|
13
|
+
tags: ['mutating', 'creates-resource', 'requires-auth'],
|
|
14
|
+
requires: { auth: true },
|
|
15
|
+
examples: [
|
|
16
|
+
{
|
|
17
|
+
command: getCommand('cloud queue publish my-queue \'{"task":"process"}\''),
|
|
18
|
+
description: 'Publish a JSON message',
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
command: getCommand(
|
|
22
|
+
'cloud queue publish my-queue \'{"task":"process"}\' --metadata \'{"priority":"high"}\''
|
|
23
|
+
),
|
|
24
|
+
description: 'Publish with metadata',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
command: getCommand('cloud queue publish my-queue "hello" --ttl 3600'),
|
|
28
|
+
description: 'Publish with 1h TTL',
|
|
29
|
+
},
|
|
30
|
+
],
|
|
31
|
+
schema: {
|
|
32
|
+
args: z.object({
|
|
33
|
+
queue_name: z.string().min(1).describe('Queue name'),
|
|
34
|
+
payload: z.string().min(1).describe('Message payload (JSON)'),
|
|
35
|
+
}),
|
|
36
|
+
options: z.object({
|
|
37
|
+
metadata: z.string().optional().describe('Message metadata as JSON'),
|
|
38
|
+
partitionKey: z.string().optional().describe('Partition key for ordering'),
|
|
39
|
+
idempotencyKey: z.string().optional().describe('Idempotency key to prevent duplicates'),
|
|
40
|
+
ttl: z.coerce.number().optional().describe('Message TTL in seconds'),
|
|
41
|
+
}),
|
|
42
|
+
response: MessageSchema,
|
|
43
|
+
},
|
|
44
|
+
|
|
45
|
+
async handler(ctx) {
|
|
46
|
+
const { args, opts, options } = ctx;
|
|
47
|
+
const client = await createQueueAPIClient(ctx);
|
|
48
|
+
|
|
49
|
+
let payload: unknown;
|
|
50
|
+
try {
|
|
51
|
+
payload = JSON.parse(args.payload);
|
|
52
|
+
} catch {
|
|
53
|
+
tui.fatal('Invalid payload JSON', ErrorCode.INVALID_ARGUMENT);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
let metadata: Record<string, unknown> | undefined;
|
|
57
|
+
if (opts.metadata) {
|
|
58
|
+
try {
|
|
59
|
+
metadata = JSON.parse(opts.metadata);
|
|
60
|
+
} catch {
|
|
61
|
+
tui.fatal('Invalid metadata JSON', ErrorCode.INVALID_ARGUMENT);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const message = await publishMessage(
|
|
66
|
+
client,
|
|
67
|
+
args.queue_name,
|
|
68
|
+
{
|
|
69
|
+
payload,
|
|
70
|
+
metadata,
|
|
71
|
+
partition_key: opts.partitionKey,
|
|
72
|
+
idempotency_key: opts.idempotencyKey,
|
|
73
|
+
ttl_seconds: opts.ttl,
|
|
74
|
+
},
|
|
75
|
+
getQueueApiOptions(ctx)
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
if (!options.json) {
|
|
79
|
+
tui.success(`Published message: ${message.id}`);
|
|
80
|
+
console.log(` Offset: ${message.offset}`);
|
|
81
|
+
console.log(` State: ${message.state}`);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return message;
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
export default publishSubcommand;
|