@agentuity/cli 1.0.22 → 1.0.23
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/auth.d.ts.map +1 -1
- package/dist/auth.js +7 -0
- package/dist/auth.js.map +1 -1
- package/dist/cache/resource-region.d.ts +1 -1
- package/dist/cache/resource-region.d.ts.map +1 -1
- package/dist/cache/resource-region.js.map +1 -1
- package/dist/cmd/ai/claude-code/install.d.ts.map +1 -1
- package/dist/cmd/ai/claude-code/install.js +0 -1
- package/dist/cmd/ai/claude-code/install.js.map +1 -1
- package/dist/cmd/build/vite/public-asset-path-plugin.d.ts +4 -2
- package/dist/cmd/build/vite/public-asset-path-plugin.d.ts.map +1 -1
- package/dist/cmd/build/vite/public-asset-path-plugin.js +18 -4
- package/dist/cmd/build/vite/public-asset-path-plugin.js.map +1 -1
- package/dist/cmd/cloud/email/create.d.ts +3 -0
- package/dist/cmd/cloud/email/create.d.ts.map +1 -0
- package/dist/cmd/cloud/email/create.js +58 -0
- package/dist/cmd/cloud/email/create.js.map +1 -0
- package/dist/cmd/cloud/email/delete.d.ts +3 -0
- package/dist/cmd/cloud/email/delete.d.ts.map +1 -0
- package/dist/cmd/cloud/email/delete.js +47 -0
- package/dist/cmd/cloud/email/delete.js.map +1 -0
- package/dist/cmd/cloud/email/destination/delete.d.ts +3 -0
- package/dist/cmd/cloud/email/destination/delete.d.ts.map +1 -0
- package/dist/cmd/cloud/email/destination/delete.js +54 -0
- package/dist/cmd/cloud/email/destination/delete.js.map +1 -0
- package/dist/cmd/cloud/email/destination/index.d.ts +3 -0
- package/dist/cmd/cloud/email/destination/index.d.ts.map +1 -0
- package/dist/cmd/cloud/email/destination/index.js +14 -0
- package/dist/cmd/cloud/email/destination/index.js.map +1 -0
- package/dist/cmd/cloud/email/destination/list.d.ts +3 -0
- package/dist/cmd/cloud/email/destination/list.d.ts.map +1 -0
- package/dist/cmd/cloud/email/destination/list.js +39 -0
- package/dist/cmd/cloud/email/destination/list.js.map +1 -0
- package/dist/cmd/cloud/email/destination/schemas.d.ts +9 -0
- package/dist/cmd/cloud/email/destination/schemas.d.ts.map +1 -0
- package/dist/cmd/cloud/email/destination/schemas.js +9 -0
- package/dist/cmd/cloud/email/destination/schemas.js.map +1 -0
- package/dist/cmd/cloud/email/destination/url.d.ts +3 -0
- package/dist/cmd/cloud/email/destination/url.d.ts.map +1 -0
- package/dist/cmd/cloud/email/destination/url.js +64 -0
- package/dist/cmd/cloud/email/destination/url.js.map +1 -0
- package/dist/cmd/cloud/email/get.d.ts +3 -0
- package/dist/cmd/cloud/email/get.d.ts.map +1 -0
- package/dist/cmd/cloud/email/get.js +43 -0
- package/dist/cmd/cloud/email/get.js.map +1 -0
- package/dist/cmd/cloud/email/inbound/get.d.ts +3 -0
- package/dist/cmd/cloud/email/inbound/get.d.ts.map +1 -0
- package/dist/cmd/cloud/email/inbound/get.js +44 -0
- package/dist/cmd/cloud/email/inbound/get.js.map +1 -0
- package/dist/cmd/cloud/email/inbound/index.d.ts +3 -0
- package/dist/cmd/cloud/email/inbound/index.d.ts.map +1 -0
- package/dist/cmd/cloud/email/inbound/index.js +12 -0
- package/dist/cmd/cloud/email/inbound/index.js.map +1 -0
- package/dist/cmd/cloud/email/inbound/list.d.ts +3 -0
- package/dist/cmd/cloud/email/inbound/list.d.ts.map +1 -0
- package/dist/cmd/cloud/email/inbound/list.js +43 -0
- package/dist/cmd/cloud/email/inbound/list.js.map +1 -0
- package/dist/cmd/cloud/email/inbound/schemas.d.ts +11 -0
- package/dist/cmd/cloud/email/inbound/schemas.d.ts.map +1 -0
- package/dist/cmd/cloud/email/inbound/schemas.js +11 -0
- package/dist/cmd/cloud/email/inbound/schemas.js.map +1 -0
- package/dist/cmd/cloud/email/index.d.ts +3 -0
- package/dist/cmd/cloud/email/index.d.ts.map +1 -0
- package/dist/cmd/cloud/email/index.js +28 -0
- package/dist/cmd/cloud/email/index.js.map +1 -0
- package/dist/cmd/cloud/email/list.d.ts +3 -0
- package/dist/cmd/cloud/email/list.d.ts.map +1 -0
- package/dist/cmd/cloud/email/list.js +37 -0
- package/dist/cmd/cloud/email/list.js.map +1 -0
- package/dist/cmd/cloud/email/outbound/get.d.ts +3 -0
- package/dist/cmd/cloud/email/outbound/get.d.ts.map +1 -0
- package/dist/cmd/cloud/email/outbound/get.js +45 -0
- package/dist/cmd/cloud/email/outbound/get.js.map +1 -0
- package/dist/cmd/cloud/email/outbound/index.d.ts +3 -0
- package/dist/cmd/cloud/email/outbound/index.d.ts.map +1 -0
- package/dist/cmd/cloud/email/outbound/index.js +12 -0
- package/dist/cmd/cloud/email/outbound/index.js.map +1 -0
- package/dist/cmd/cloud/email/outbound/list.d.ts +3 -0
- package/dist/cmd/cloud/email/outbound/list.d.ts.map +1 -0
- package/dist/cmd/cloud/email/outbound/list.js +43 -0
- package/dist/cmd/cloud/email/outbound/list.js.map +1 -0
- package/dist/cmd/cloud/email/outbound/schemas.d.ts +15 -0
- package/dist/cmd/cloud/email/outbound/schemas.d.ts.map +1 -0
- package/dist/cmd/cloud/email/outbound/schemas.js +15 -0
- package/dist/cmd/cloud/email/outbound/schemas.js.map +1 -0
- package/dist/cmd/cloud/email/send.d.ts +3 -0
- package/dist/cmd/cloud/email/send.d.ts.map +1 -0
- package/dist/cmd/cloud/email/send.js +77 -0
- package/dist/cmd/cloud/email/send.js.map +1 -0
- package/dist/cmd/cloud/email/util.d.ts +26 -0
- package/dist/cmd/cloud/email/util.d.ts.map +1 -0
- package/dist/cmd/cloud/email/util.js +57 -0
- package/dist/cmd/cloud/email/util.js.map +1 -0
- package/dist/cmd/cloud/index.d.ts.map +1 -1
- package/dist/cmd/cloud/index.js +8 -0
- package/dist/cmd/cloud/index.js.map +1 -1
- package/dist/cmd/cloud/region-lookup.d.ts +1 -1
- package/dist/cmd/cloud/region-lookup.d.ts.map +1 -1
- package/dist/cmd/cloud/region-lookup.js +44 -2
- package/dist/cmd/cloud/region-lookup.js.map +1 -1
- package/dist/cmd/cloud/sandbox/snapshot/build.d.ts +7 -0
- package/dist/cmd/cloud/sandbox/snapshot/build.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/snapshot/build.js +46 -28
- package/dist/cmd/cloud/sandbox/snapshot/build.js.map +1 -1
- package/dist/cmd/cloud/sandbox/snapshot/generate.d.ts.map +1 -1
- package/dist/cmd/cloud/sandbox/snapshot/generate.js +5 -1
- package/dist/cmd/cloud/sandbox/snapshot/generate.js.map +1 -1
- package/dist/cmd/cloud/schedule/create.d.ts +3 -0
- package/dist/cmd/cloud/schedule/create.d.ts.map +1 -0
- package/dist/cmd/cloud/schedule/create.js +72 -0
- package/dist/cmd/cloud/schedule/create.js.map +1 -0
- package/dist/cmd/cloud/schedule/delete.d.ts +3 -0
- package/dist/cmd/cloud/schedule/delete.d.ts.map +1 -0
- package/dist/cmd/cloud/schedule/delete.js +38 -0
- package/dist/cmd/cloud/schedule/delete.js.map +1 -0
- package/dist/cmd/cloud/schedule/delivery/get.d.ts +3 -0
- package/dist/cmd/cloud/schedule/delivery/get.d.ts.map +1 -0
- package/dist/cmd/cloud/schedule/delivery/get.js +78 -0
- package/dist/cmd/cloud/schedule/delivery/get.js.map +1 -0
- package/dist/cmd/cloud/schedule/delivery/index.d.ts +3 -0
- package/dist/cmd/cloud/schedule/delivery/index.d.ts.map +1 -0
- package/dist/cmd/cloud/schedule/delivery/index.js +23 -0
- package/dist/cmd/cloud/schedule/delivery/index.js.map +1 -0
- package/dist/cmd/cloud/schedule/delivery/list.d.ts +3 -0
- package/dist/cmd/cloud/schedule/delivery/list.d.ts.map +1 -0
- package/dist/cmd/cloud/schedule/delivery/list.js +67 -0
- package/dist/cmd/cloud/schedule/delivery/list.js.map +1 -0
- package/dist/cmd/cloud/schedule/destination/create.d.ts +3 -0
- package/dist/cmd/cloud/schedule/destination/create.d.ts.map +1 -0
- package/dist/cmd/cloud/schedule/destination/create.js +97 -0
- package/dist/cmd/cloud/schedule/destination/create.js.map +1 -0
- package/dist/cmd/cloud/schedule/destination/delete.d.ts +3 -0
- package/dist/cmd/cloud/schedule/destination/delete.d.ts.map +1 -0
- package/dist/cmd/cloud/schedule/destination/delete.js +41 -0
- package/dist/cmd/cloud/schedule/destination/delete.js.map +1 -0
- package/dist/cmd/cloud/schedule/destination/get.d.ts +3 -0
- package/dist/cmd/cloud/schedule/destination/get.d.ts.map +1 -0
- package/dist/cmd/cloud/schedule/destination/get.js +57 -0
- package/dist/cmd/cloud/schedule/destination/get.js.map +1 -0
- package/dist/cmd/cloud/schedule/destination/index.d.ts +3 -0
- package/dist/cmd/cloud/schedule/destination/index.d.ts.map +1 -0
- package/dist/cmd/cloud/schedule/destination/index.js +26 -0
- package/dist/cmd/cloud/schedule/destination/index.js.map +1 -0
- package/dist/cmd/cloud/schedule/destination/list.d.ts +3 -0
- package/dist/cmd/cloud/schedule/destination/list.d.ts.map +1 -0
- package/dist/cmd/cloud/schedule/destination/list.js +58 -0
- package/dist/cmd/cloud/schedule/destination/list.js.map +1 -0
- package/dist/cmd/cloud/schedule/get.d.ts +3 -0
- package/dist/cmd/cloud/schedule/get.d.ts.map +1 -0
- package/dist/cmd/cloud/schedule/get.js +76 -0
- package/dist/cmd/cloud/schedule/get.js.map +1 -0
- package/dist/cmd/cloud/schedule/index.d.ts +3 -0
- package/dist/cmd/cloud/schedule/index.d.ts.map +1 -0
- package/dist/cmd/cloud/schedule/index.js +35 -0
- package/dist/cmd/cloud/schedule/index.js.map +1 -0
- package/dist/cmd/cloud/schedule/list.d.ts +3 -0
- package/dist/cmd/cloud/schedule/list.d.ts.map +1 -0
- package/dist/cmd/cloud/schedule/list.js +60 -0
- package/dist/cmd/cloud/schedule/list.js.map +1 -0
- package/dist/cmd/cloud/schedule/update.d.ts +3 -0
- package/dist/cmd/cloud/schedule/update.d.ts.map +1 -0
- package/dist/cmd/cloud/schedule/update.js +65 -0
- package/dist/cmd/cloud/schedule/update.js.map +1 -0
- package/dist/cmd/cloud/schedule/util.d.ts +11 -0
- package/dist/cmd/cloud/schedule/util.d.ts.map +1 -0
- package/dist/cmd/cloud/schedule/util.js +17 -0
- package/dist/cmd/cloud/schedule/util.js.map +1 -0
- package/dist/cmd/cloud/task/create.d.ts +3 -0
- package/dist/cmd/cloud/task/create.d.ts.map +1 -0
- package/dist/cmd/cloud/task/create.js +108 -0
- package/dist/cmd/cloud/task/create.js.map +1 -0
- package/dist/cmd/cloud/task/get.d.ts +3 -0
- package/dist/cmd/cloud/task/get.d.ts.map +1 -0
- package/dist/cmd/cloud/task/get.js +124 -0
- package/dist/cmd/cloud/task/get.js.map +1 -0
- package/dist/cmd/cloud/task/index.d.ts +3 -0
- package/dist/cmd/cloud/task/index.d.ts.map +1 -0
- package/dist/cmd/cloud/task/index.js +33 -0
- package/dist/cmd/cloud/task/index.js.map +1 -0
- package/dist/cmd/cloud/task/list.d.ts +3 -0
- package/dist/cmd/cloud/task/list.d.ts.map +1 -0
- package/dist/cmd/cloud/task/list.js +174 -0
- package/dist/cmd/cloud/task/list.js.map +1 -0
- package/dist/cmd/cloud/task/update.d.ts +3 -0
- package/dist/cmd/cloud/task/update.d.ts.map +1 -0
- package/dist/cmd/cloud/task/update.js +118 -0
- package/dist/cmd/cloud/task/update.js.map +1 -0
- package/dist/cmd/cloud/task/util.d.ts +18 -0
- package/dist/cmd/cloud/task/util.d.ts.map +1 -0
- package/dist/cmd/cloud/task/util.js +45 -0
- package/dist/cmd/cloud/task/util.js.map +1 -0
- package/dist/cmd/cloud/webhook/create.d.ts +3 -0
- package/dist/cmd/cloud/webhook/create.d.ts.map +1 -0
- package/dist/cmd/cloud/webhook/create.js +54 -0
- package/dist/cmd/cloud/webhook/create.js.map +1 -0
- package/dist/cmd/cloud/webhook/delete.d.ts +3 -0
- package/dist/cmd/cloud/webhook/delete.d.ts.map +1 -0
- package/dist/cmd/cloud/webhook/delete.js +50 -0
- package/dist/cmd/cloud/webhook/delete.js.map +1 -0
- package/dist/cmd/cloud/webhook/deliveries.d.ts +3 -0
- package/dist/cmd/cloud/webhook/deliveries.d.ts.map +1 -0
- package/dist/cmd/cloud/webhook/deliveries.js +123 -0
- package/dist/cmd/cloud/webhook/deliveries.js.map +1 -0
- package/dist/cmd/cloud/webhook/destinations.d.ts +3 -0
- package/dist/cmd/cloud/webhook/destinations.d.ts.map +1 -0
- package/dist/cmd/cloud/webhook/destinations.js +212 -0
- package/dist/cmd/cloud/webhook/destinations.js.map +1 -0
- package/dist/cmd/cloud/webhook/get.d.ts +3 -0
- package/dist/cmd/cloud/webhook/get.d.ts.map +1 -0
- package/dist/cmd/cloud/webhook/get.js +50 -0
- package/dist/cmd/cloud/webhook/get.js.map +1 -0
- package/dist/cmd/cloud/webhook/index.d.ts +3 -0
- package/dist/cmd/cloud/webhook/index.d.ts.map +1 -0
- package/dist/cmd/cloud/webhook/index.js +45 -0
- package/dist/cmd/cloud/webhook/index.js.map +1 -0
- package/dist/cmd/cloud/webhook/list.d.ts +3 -0
- package/dist/cmd/cloud/webhook/list.d.ts.map +1 -0
- package/dist/cmd/cloud/webhook/list.js +72 -0
- package/dist/cmd/cloud/webhook/list.js.map +1 -0
- package/dist/cmd/cloud/webhook/receipts.d.ts +3 -0
- package/dist/cmd/cloud/webhook/receipts.d.ts.map +1 -0
- package/dist/cmd/cloud/webhook/receipts.js +128 -0
- package/dist/cmd/cloud/webhook/receipts.js.map +1 -0
- package/dist/cmd/cloud/webhook/util.d.ts +27 -0
- package/dist/cmd/cloud/webhook/util.d.ts.map +1 -0
- package/dist/cmd/cloud/webhook/util.js +20 -0
- package/dist/cmd/cloud/webhook/util.js.map +1 -0
- package/dist/config.d.ts +8 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/types.d.ts +10 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +3 -2
- package/dist/types.js.map +1 -1
- package/dist/version-check.d.ts.map +1 -1
- package/dist/version-check.js +18 -3
- package/dist/version-check.js.map +1 -1
- package/package.json +6 -6
- package/src/auth.ts +7 -0
- package/src/cache/resource-region.ts +4 -1
- package/src/cmd/ai/claude-code/install.ts +0 -3
- package/src/cmd/build/vite/public-asset-path-plugin.ts +18 -4
- package/src/cmd/cloud/email/create.ts +70 -0
- package/src/cmd/cloud/email/delete.ts +53 -0
- package/src/cmd/cloud/email/destination/delete.ts +65 -0
- package/src/cmd/cloud/email/destination/index.ts +15 -0
- package/src/cmd/cloud/email/destination/list.ts +46 -0
- package/src/cmd/cloud/email/destination/schemas.ts +9 -0
- package/src/cmd/cloud/email/destination/url.ts +75 -0
- package/src/cmd/cloud/email/get.ts +52 -0
- package/src/cmd/cloud/email/inbound/get.ts +53 -0
- package/src/cmd/cloud/email/inbound/index.ts +13 -0
- package/src/cmd/cloud/email/inbound/list.ts +50 -0
- package/src/cmd/cloud/email/inbound/schemas.ts +11 -0
- package/src/cmd/cloud/email/index.ts +29 -0
- package/src/cmd/cloud/email/list.ts +44 -0
- package/src/cmd/cloud/email/outbound/get.ts +54 -0
- package/src/cmd/cloud/email/outbound/index.ts +13 -0
- package/src/cmd/cloud/email/outbound/list.ts +50 -0
- package/src/cmd/cloud/email/outbound/schemas.ts +15 -0
- package/src/cmd/cloud/email/send.ts +91 -0
- package/src/cmd/cloud/email/util.ts +89 -0
- package/src/cmd/cloud/index.ts +8 -0
- package/src/cmd/cloud/region-lookup.ts +58 -2
- package/src/cmd/cloud/sandbox/snapshot/build.ts +59 -55
- package/src/cmd/cloud/sandbox/snapshot/generate.ts +5 -1
- package/src/cmd/cloud/schedule/create.ts +83 -0
- package/src/cmd/cloud/schedule/delete.ts +43 -0
- package/src/cmd/cloud/schedule/delivery/get.ts +85 -0
- package/src/cmd/cloud/schedule/delivery/index.ts +24 -0
- package/src/cmd/cloud/schedule/delivery/list.ts +82 -0
- package/src/cmd/cloud/schedule/destination/create.ts +110 -0
- package/src/cmd/cloud/schedule/destination/delete.ts +46 -0
- package/src/cmd/cloud/schedule/destination/get.ts +66 -0
- package/src/cmd/cloud/schedule/destination/index.ts +27 -0
- package/src/cmd/cloud/schedule/destination/list.ts +72 -0
- package/src/cmd/cloud/schedule/get.ts +92 -0
- package/src/cmd/cloud/schedule/index.ts +36 -0
- package/src/cmd/cloud/schedule/list.ts +78 -0
- package/src/cmd/cloud/schedule/update.ts +74 -0
- package/src/cmd/cloud/schedule/util.ts +34 -0
- package/src/cmd/cloud/task/create.ts +124 -0
- package/src/cmd/cloud/task/get.ts +138 -0
- package/src/cmd/cloud/task/index.ts +34 -0
- package/src/cmd/cloud/task/list.ts +191 -0
- package/src/cmd/cloud/task/update.ts +123 -0
- package/src/cmd/cloud/task/util.ts +74 -0
- package/src/cmd/cloud/webhook/create.ts +66 -0
- package/src/cmd/cloud/webhook/delete.ts +57 -0
- package/src/cmd/cloud/webhook/deliveries.ts +149 -0
- package/src/cmd/cloud/webhook/destinations.ts +274 -0
- package/src/cmd/cloud/webhook/get.ts +59 -0
- package/src/cmd/cloud/webhook/index.ts +46 -0
- package/src/cmd/cloud/webhook/list.ts +82 -0
- package/src/cmd/cloud/webhook/receipts.ts +157 -0
- package/src/cmd/cloud/webhook/util.ts +35 -0
- package/src/types.ts +3 -1
- package/src/version-check.ts +22 -3
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { StreamStorageService, type Logger } from '@agentuity/core';
|
|
1
|
+
import { StreamStorageService, TaskStorageService, type Logger } from '@agentuity/core';
|
|
2
2
|
import {
|
|
3
3
|
projectGet,
|
|
4
4
|
sandboxResolve,
|
|
5
5
|
deploymentGet,
|
|
6
|
+
getWebhook,
|
|
6
7
|
type APIClient,
|
|
7
8
|
createServerFetchAdapter,
|
|
8
9
|
getServiceUrls,
|
|
@@ -13,7 +14,7 @@ import type { AuthData, Config } from '../../types';
|
|
|
13
14
|
import * as tui from '../../tui';
|
|
14
15
|
import { ErrorCode } from '../../errors';
|
|
15
16
|
|
|
16
|
-
export type IdentifierType = 'project' | 'deployment' | 'sandbox' | 'stream';
|
|
17
|
+
export type IdentifierType = 'project' | 'deployment' | 'sandbox' | 'stream' | 'webhook' | 'task';
|
|
17
18
|
|
|
18
19
|
/**
|
|
19
20
|
* Determine the type of identifier based on its prefix
|
|
@@ -28,9 +29,15 @@ export function getIdentifierType(identifier: string): IdentifierType {
|
|
|
28
29
|
if (identifier.startsWith('sbx_')) {
|
|
29
30
|
return 'sandbox';
|
|
30
31
|
}
|
|
32
|
+
if (identifier.startsWith('task_')) {
|
|
33
|
+
return 'task';
|
|
34
|
+
}
|
|
31
35
|
if (identifier.startsWith('stream_')) {
|
|
32
36
|
return 'stream';
|
|
33
37
|
}
|
|
38
|
+
if (identifier.startsWith('wh_')) {
|
|
39
|
+
return 'webhook';
|
|
40
|
+
}
|
|
34
41
|
// Default to project for unknown prefixes
|
|
35
42
|
return 'project';
|
|
36
43
|
}
|
|
@@ -82,6 +89,34 @@ export async function getIdentifierRegion(
|
|
|
82
89
|
}
|
|
83
90
|
const deployment = await deploymentGet(apiClient, identifier);
|
|
84
91
|
region = deployment.cloudRegion ?? null;
|
|
92
|
+
} else if (identifierType === 'task') {
|
|
93
|
+
// Tasks live in per-tenant DBs accessible from any regional Catalyst.
|
|
94
|
+
// Use default region to reach Catalyst, which can resolve the task for the org.
|
|
95
|
+
const taskDefaultRegion = await getDefaultRegion(profileName, config);
|
|
96
|
+
const taskBaseUrl = getServiceUrls(taskDefaultRegion).catalyst;
|
|
97
|
+
const resolvedTaskOrgId =
|
|
98
|
+
orgId ?? process.env.AGENTUITY_CLOUD_ORG_ID ?? config?.preferences?.orgId;
|
|
99
|
+
if (!resolvedTaskOrgId) {
|
|
100
|
+
tui.fatal(
|
|
101
|
+
`Organization ID required to resolve task '${identifier}'. Use --org-id or set AGENTUITY_CLOUD_ORG_ID.`,
|
|
102
|
+
ErrorCode.INVALID_ARGUMENT
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
const taskAdapter = createServerFetchAdapter(
|
|
106
|
+
{
|
|
107
|
+
headers: {
|
|
108
|
+
Authorization: `Bearer ${auth.apiKey}`,
|
|
109
|
+
'x-agentuity-orgid': resolvedTaskOrgId,
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
|
+
logger
|
|
113
|
+
);
|
|
114
|
+
const taskService = new TaskStorageService(taskBaseUrl, taskAdapter);
|
|
115
|
+
const taskResult = await taskService.get(identifier);
|
|
116
|
+
if (taskResult) {
|
|
117
|
+
region = taskDefaultRegion;
|
|
118
|
+
orgId = resolvedTaskOrgId;
|
|
119
|
+
}
|
|
85
120
|
} else if (identifierType === 'sandbox') {
|
|
86
121
|
// sandbox - use CLI API to resolve across all orgs the user has access to
|
|
87
122
|
if (!apiClient) {
|
|
@@ -96,6 +131,27 @@ export async function getIdentifierRegion(
|
|
|
96
131
|
if (sandbox.orgId) {
|
|
97
132
|
orgId = sandbox.orgId;
|
|
98
133
|
}
|
|
134
|
+
} else if (identifierType === 'webhook') {
|
|
135
|
+
// Webhook tenant DB is not regional — any global Catalyst can serve the request.
|
|
136
|
+
// We still look up the webhook to validate it exists and cache the orgId.
|
|
137
|
+
if (!apiClient) {
|
|
138
|
+
tui.fatal(
|
|
139
|
+
`API client required for webhook region lookup. This is an internal error.`,
|
|
140
|
+
ErrorCode.INVALID_ARGUMENT
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
const resolvedOrgId =
|
|
144
|
+
orgId ?? process.env.AGENTUITY_CLOUD_ORG_ID ?? config?.preferences?.orgId;
|
|
145
|
+
const webhook = await getWebhook(
|
|
146
|
+
apiClient,
|
|
147
|
+
identifier,
|
|
148
|
+
resolvedOrgId ? { orgId: resolvedOrgId } : undefined
|
|
149
|
+
);
|
|
150
|
+
if (webhook) {
|
|
151
|
+
orgId = resolvedOrgId;
|
|
152
|
+
}
|
|
153
|
+
// Use default region since webhooks are global
|
|
154
|
+
region = await getDefaultRegion(profileName, config);
|
|
99
155
|
} else {
|
|
100
156
|
// stream - use the streams service to look up stream info
|
|
101
157
|
// Any regional streams service can look up any stream and return its info
|
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
7
|
-
import * as tui from '../../../../tui';
|
|
8
|
-
import { ErrorCode } from '../../../../errors';
|
|
9
|
-
import { getCommand } from '../../../../command-prefix';
|
|
1
|
+
import { createHash, createPublicKey, randomUUID } from 'node:crypto';
|
|
2
|
+
import { createReadStream, createWriteStream, existsSync, statSync } from 'node:fs';
|
|
3
|
+
import { rm } from 'node:fs/promises';
|
|
4
|
+
import { tmpdir } from 'node:os';
|
|
5
|
+
import { extname, isAbsolute, join, resolve } from 'node:path';
|
|
6
|
+
import type { SnapshotBuildGitInfo, SnapshotFileInfo } from '@agentuity/server';
|
|
10
7
|
import {
|
|
11
|
-
|
|
8
|
+
NPM_PACKAGE_NAME_PATTERN,
|
|
9
|
+
SnapshotBuildFileSchema,
|
|
12
10
|
snapshotBuildFinalize,
|
|
11
|
+
snapshotBuildInit,
|
|
13
12
|
snapshotUpload,
|
|
14
|
-
SnapshotBuildFileSchema,
|
|
15
|
-
NPM_PACKAGE_NAME_PATTERN,
|
|
16
13
|
} from '@agentuity/server';
|
|
17
|
-
import
|
|
14
|
+
import { YAML } from 'bun';
|
|
15
|
+
import * as tar from 'tar';
|
|
16
|
+
import { z } from 'zod';
|
|
17
|
+
import { getCommand } from '../../../../command-prefix';
|
|
18
18
|
import { getCatalystAPIClient } from '../../../../config';
|
|
19
|
+
import { encryptFIPSKEMDEMStream } from '../../../../crypto/box';
|
|
20
|
+
import { ErrorCode } from '../../../../errors';
|
|
21
|
+
import * as tui from '../../../../tui';
|
|
22
|
+
import { createCommand } from '../../../../types';
|
|
19
23
|
import { validateAptDependencies } from '../../../../utils/apt-validator';
|
|
20
24
|
import { getGitInfo, mergeGitInfo } from '../../../../utils/git';
|
|
21
|
-
import { encryptFIPSKEMDEMStream } from '../../../../crypto/box';
|
|
22
|
-
import { tmpdir } from 'node:os';
|
|
23
|
-
import { randomUUID, createHash, createPublicKey } from 'node:crypto';
|
|
24
|
-
import { rm } from 'node:fs/promises';
|
|
25
25
|
|
|
26
26
|
export const SNAPSHOT_TAG_REGEX = /^[a-zA-Z0-9][a-zA-Z0-9._-]*$/;
|
|
27
27
|
export const MAX_SNAPSHOT_TAG_LENGTH = 128;
|
|
@@ -175,9 +175,9 @@ function substituteVariables(
|
|
|
175
175
|
}
|
|
176
176
|
|
|
177
177
|
// Default patterns that are always excluded from snapshot builds
|
|
178
|
-
const DEFAULT_EXCLUSIONS = ['.git', '.git/**', 'node_modules/**', '.agentuity/**', '.env*'];
|
|
178
|
+
export const DEFAULT_EXCLUSIONS = ['.git', '.git/**', 'node_modules/**', '.agentuity/**', '.env*'];
|
|
179
179
|
|
|
180
|
-
async function resolveFileGlobs(
|
|
180
|
+
export async function resolveFileGlobs(
|
|
181
181
|
directory: string,
|
|
182
182
|
patterns: string[]
|
|
183
183
|
): Promise<Map<string, FileEntry>> {
|
|
@@ -206,9 +206,9 @@ async function resolveFileGlobs(
|
|
|
206
206
|
size: stat.size,
|
|
207
207
|
});
|
|
208
208
|
}
|
|
209
|
-
} catch {
|
|
209
|
+
} catch (err) {
|
|
210
210
|
// Skip files that can't be stat'd (broken symlinks, permission issues, etc.)
|
|
211
|
-
|
|
211
|
+
console.debug(`Skipping ${file}: ${err instanceof Error ? err.message : err}`);
|
|
212
212
|
}
|
|
213
213
|
}
|
|
214
214
|
}
|
|
@@ -358,9 +358,7 @@ export const buildSubcommand = createCommand({
|
|
|
358
358
|
description: 'Build using a custom build file',
|
|
359
359
|
},
|
|
360
360
|
{
|
|
361
|
-
command: getCommand(
|
|
362
|
-
'cloud sandbox snapshot build . --env API_KEY=secret --tag production'
|
|
363
|
-
),
|
|
361
|
+
command: getCommand('cloud sandbox snapshot build . --env API_KEY=secret --tag production'),
|
|
364
362
|
description: 'Build with environment variable substitution and custom tag',
|
|
365
363
|
},
|
|
366
364
|
{
|
|
@@ -381,10 +379,7 @@ export const buildSubcommand = createCommand({
|
|
|
381
379
|
.string()
|
|
382
380
|
.optional()
|
|
383
381
|
.describe('Path to build file (defaults to agentuity-snapshot.[json|yaml|yml])'),
|
|
384
|
-
env: z
|
|
385
|
-
.array(z.string())
|
|
386
|
-
.optional()
|
|
387
|
-
.describe('Environment variable substitution (KEY=VALUE)'),
|
|
382
|
+
env: z.array(z.string()).optional().describe('Environment variable substitution (KEY=VALUE)'),
|
|
388
383
|
name: z.string().optional().describe('Snapshot name (overrides build file)'),
|
|
389
384
|
tag: z.string().optional().describe('Snapshot tag (defaults to "latest")'),
|
|
390
385
|
description: z.string().optional().describe('Snapshot description (overrides build file)'),
|
|
@@ -416,7 +411,7 @@ export const buildSubcommand = createCommand({
|
|
|
416
411
|
|
|
417
412
|
const dryRun = options.dryRun === true;
|
|
418
413
|
|
|
419
|
-
|
|
414
|
+
let directory = resolve(args.directory);
|
|
420
415
|
if (!existsSync(directory)) {
|
|
421
416
|
logger.fatal(`Directory not found: ${directory}`);
|
|
422
417
|
}
|
|
@@ -475,6 +470,29 @@ export const buildSubcommand = createCommand({
|
|
|
475
470
|
|
|
476
471
|
const buildConfig = validationResult.data;
|
|
477
472
|
|
|
473
|
+
// If dir is specified in the build file, use it as the effective build context
|
|
474
|
+
if (buildConfig.dir) {
|
|
475
|
+
if (isAbsolute(buildConfig.dir)) {
|
|
476
|
+
logger.fatal(`'dir' must be a relative path, got: ${buildConfig.dir}`);
|
|
477
|
+
}
|
|
478
|
+
const dirPath = resolve(directory, buildConfig.dir);
|
|
479
|
+
if (!dirPath.startsWith(`${directory}/`) && dirPath !== directory) {
|
|
480
|
+
logger.fatal(`'dir' resolves outside the build root: ${dirPath}`);
|
|
481
|
+
}
|
|
482
|
+
let isDir = false;
|
|
483
|
+
try {
|
|
484
|
+
isDir = statSync(dirPath).isDirectory();
|
|
485
|
+
} catch {
|
|
486
|
+
// path does not exist
|
|
487
|
+
}
|
|
488
|
+
if (!isDir) {
|
|
489
|
+
logger.fatal(
|
|
490
|
+
`Build context directory not found or is not a directory: ${dirPath} (specified by 'dir: ${buildConfig.dir}' in build file)`
|
|
491
|
+
);
|
|
492
|
+
}
|
|
493
|
+
directory = dirPath;
|
|
494
|
+
}
|
|
495
|
+
|
|
478
496
|
// Determine if snapshot is public: CLI flag takes precedence, otherwise use build file
|
|
479
497
|
const isPublic =
|
|
480
498
|
opts.public === true || (opts.public === undefined && buildConfig.public === true);
|
|
@@ -483,21 +501,21 @@ export const buildSubcommand = createCommand({
|
|
|
483
501
|
if (!opts.confirm) {
|
|
484
502
|
if (!tui.isTTYLike()) {
|
|
485
503
|
logger.fatal(
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
504
|
+
'Publishing a public snapshot requires confirmation.\n\n' +
|
|
505
|
+
'Public snapshots make all environment variables and files publicly accessible.\n\n' +
|
|
506
|
+
'To proceed, add the --confirm flag:\n' +
|
|
489
507
|
` ${getCommand('cloud sandbox snapshot build . --public --confirm')}\n\n` +
|
|
490
|
-
|
|
508
|
+
'To preview what will be published, use --dry-run first:\n' +
|
|
491
509
|
` ${getCommand('cloud sandbox snapshot build . --public --dry-run')}`
|
|
492
510
|
);
|
|
493
511
|
}
|
|
494
512
|
|
|
495
513
|
tui.warningBox(
|
|
496
514
|
'Public Snapshot',
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
515
|
+
'You are publishing a public snapshot.\n\n' +
|
|
516
|
+
'This will make all environment variables and\n' +
|
|
517
|
+
'files in the snapshot publicly accessible.\n\n' +
|
|
518
|
+
'Run with --dry-run to preview the contents.'
|
|
501
519
|
);
|
|
502
520
|
console.log('');
|
|
503
521
|
|
|
@@ -511,9 +529,7 @@ export const buildSubcommand = createCommand({
|
|
|
511
529
|
|
|
512
530
|
if (opts.tag) {
|
|
513
531
|
if (opts.tag.length > MAX_SNAPSHOT_TAG_LENGTH) {
|
|
514
|
-
logger.fatal(
|
|
515
|
-
`Invalid snapshot tag: must be at most ${MAX_SNAPSHOT_TAG_LENGTH} characters`
|
|
516
|
-
);
|
|
532
|
+
logger.fatal(`Invalid snapshot tag: must be at most ${MAX_SNAPSHOT_TAG_LENGTH} characters`);
|
|
517
533
|
}
|
|
518
534
|
if (!SNAPSHOT_TAG_REGEX.test(opts.tag)) {
|
|
519
535
|
logger.fatal(
|
|
@@ -560,12 +576,7 @@ export const buildSubcommand = createCommand({
|
|
|
560
576
|
message: 'Validating apt dependencies...',
|
|
561
577
|
type: 'simple',
|
|
562
578
|
callback: async () => {
|
|
563
|
-
return await validateAptDependencies(
|
|
564
|
-
buildConfig.dependencies!,
|
|
565
|
-
region,
|
|
566
|
-
config,
|
|
567
|
-
logger
|
|
568
|
-
);
|
|
579
|
+
return await validateAptDependencies(buildConfig.dependencies!, region, config, logger);
|
|
569
580
|
},
|
|
570
581
|
});
|
|
571
582
|
|
|
@@ -879,11 +890,7 @@ export const buildSubcommand = createCommand({
|
|
|
879
890
|
clearOnError: true,
|
|
880
891
|
callback: async (updateProgress) => {
|
|
881
892
|
const uploadFile = Bun.file(uploadPath);
|
|
882
|
-
const progressStream = createProgressStream(
|
|
883
|
-
uploadFile,
|
|
884
|
-
uploadSize,
|
|
885
|
-
updateProgress
|
|
886
|
-
);
|
|
893
|
+
const progressStream = createProgressStream(uploadFile, uploadSize, updateProgress);
|
|
887
894
|
await snapshotUpload(client, {
|
|
888
895
|
snapshotId: initResult.snapshotId!,
|
|
889
896
|
body: progressStream,
|
|
@@ -926,10 +933,7 @@ export const buildSubcommand = createCommand({
|
|
|
926
933
|
'Malware Detected',
|
|
927
934
|
`Your snapshot was rejected because it contains malware.\n\nVirus: ${virusName}\n\nPlease remove the infected files and try again.`
|
|
928
935
|
);
|
|
929
|
-
tui.fatal(
|
|
930
|
-
'Snapshot build failed due to malware detection',
|
|
931
|
-
ErrorCode.MALWARE_DETECTED
|
|
932
|
-
);
|
|
936
|
+
tui.fatal('Snapshot build failed due to malware detection', ErrorCode.MALWARE_DETECTED);
|
|
933
937
|
}
|
|
934
938
|
|
|
935
939
|
throw err;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import { createCommand } from '../../../../types';
|
|
3
2
|
import { getCommand } from '../../../../command-prefix';
|
|
3
|
+
import { createCommand } from '../../../../types';
|
|
4
4
|
|
|
5
5
|
const TEMPLATE_YAML = `# yaml-language-server: $schema=https://agentuity.dev/schema/cli/v1/agentuity-snapshot.json
|
|
6
6
|
#
|
|
@@ -27,6 +27,10 @@ runtime: bun:1
|
|
|
27
27
|
# Can be overridden with --description flag
|
|
28
28
|
description: My sandbox snapshot
|
|
29
29
|
|
|
30
|
+
# Optional: Subdirectory to use as the build context
|
|
31
|
+
# Files are resolved relative to this directory instead of the CLI directory argument
|
|
32
|
+
# dir: src
|
|
33
|
+
|
|
30
34
|
# Optional: Apt packages to install
|
|
31
35
|
# Packages are validated against Debian stable repositories
|
|
32
36
|
# Supports version pinning: package=version or package=version* (prefix match)
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { createCommand } from '../../../types';
|
|
3
|
+
import * as tui from '../../../tui';
|
|
4
|
+
import { createScheduleAdapter } from './util';
|
|
5
|
+
import { getCommand } from '../../../command-prefix';
|
|
6
|
+
|
|
7
|
+
const CreateScheduleResponseSchema = z.object({
|
|
8
|
+
schedule: z.object({
|
|
9
|
+
id: z.string(),
|
|
10
|
+
name: z.string(),
|
|
11
|
+
expression: z.string(),
|
|
12
|
+
description: z.string().nullable(),
|
|
13
|
+
due_date: z.string(),
|
|
14
|
+
created_at: z.string(),
|
|
15
|
+
updated_at: z.string(),
|
|
16
|
+
created_by: z.string(),
|
|
17
|
+
}),
|
|
18
|
+
destinations: z.array(
|
|
19
|
+
z.object({
|
|
20
|
+
id: z.string(),
|
|
21
|
+
schedule_id: z.string(),
|
|
22
|
+
created_at: z.string(),
|
|
23
|
+
updated_at: z.string(),
|
|
24
|
+
created_by: z.string(),
|
|
25
|
+
type: z.enum(['url', 'sandbox']),
|
|
26
|
+
config: z.record(z.string(), z.unknown()),
|
|
27
|
+
})
|
|
28
|
+
),
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
export const createSubcommand = createCommand({
|
|
32
|
+
name: 'create',
|
|
33
|
+
description: 'Create a schedule',
|
|
34
|
+
tags: ['mutating', 'creates-resource', 'requires-auth'],
|
|
35
|
+
requires: { auth: true, region: true },
|
|
36
|
+
optional: { project: true },
|
|
37
|
+
examples: [
|
|
38
|
+
{
|
|
39
|
+
command: getCommand("cloud schedule create --name nightly --expression '0 0 * * *'"),
|
|
40
|
+
description: 'Create a nightly schedule',
|
|
41
|
+
},
|
|
42
|
+
],
|
|
43
|
+
schema: {
|
|
44
|
+
options: z.object({
|
|
45
|
+
name: z.string().min(1).describe('Schedule name'),
|
|
46
|
+
expression: z.string().min(1).describe('Cron expression'),
|
|
47
|
+
description: z.string().optional().describe('Schedule description'),
|
|
48
|
+
}),
|
|
49
|
+
response: CreateScheduleResponseSchema,
|
|
50
|
+
},
|
|
51
|
+
|
|
52
|
+
async handler(ctx) {
|
|
53
|
+
const { opts, options } = ctx;
|
|
54
|
+
const schedule = createScheduleAdapter(ctx);
|
|
55
|
+
const result = await schedule.create({
|
|
56
|
+
name: opts.name,
|
|
57
|
+
expression: opts.expression,
|
|
58
|
+
description: opts.description,
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
if (!options.json) {
|
|
62
|
+
tui.success(`Created schedule: ${result.schedule.name}`);
|
|
63
|
+
tui.table(
|
|
64
|
+
[
|
|
65
|
+
{
|
|
66
|
+
Name: result.schedule.name,
|
|
67
|
+
ID: result.schedule.id,
|
|
68
|
+
Expression: result.schedule.expression,
|
|
69
|
+
Description: result.schedule.description ?? '-',
|
|
70
|
+
'Next Due': result.schedule.due_date,
|
|
71
|
+
Created: new Date(result.schedule.created_at).toLocaleString(),
|
|
72
|
+
},
|
|
73
|
+
],
|
|
74
|
+
undefined,
|
|
75
|
+
{ layout: 'vertical' }
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return result;
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
export default createSubcommand;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { createCommand } from '../../../types';
|
|
3
|
+
import * as tui from '../../../tui';
|
|
4
|
+
import { createScheduleAdapter } from './util';
|
|
5
|
+
import { getCommand } from '../../../command-prefix';
|
|
6
|
+
|
|
7
|
+
const ScheduleDeleteResponseSchema = z.object({
|
|
8
|
+
success: z.boolean(),
|
|
9
|
+
schedule_id: z.string(),
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
export const deleteSubcommand = createCommand({
|
|
13
|
+
name: 'delete',
|
|
14
|
+
aliases: ['rm'],
|
|
15
|
+
description: 'Delete a schedule',
|
|
16
|
+
tags: ['destructive', 'deletes-resource', 'slow', 'requires-auth'],
|
|
17
|
+
requires: { auth: true, region: true },
|
|
18
|
+
optional: { project: true },
|
|
19
|
+
idempotent: true,
|
|
20
|
+
examples: [
|
|
21
|
+
{ command: getCommand('cloud schedule delete sched_abc123'), description: 'Delete a schedule' },
|
|
22
|
+
],
|
|
23
|
+
schema: {
|
|
24
|
+
args: z.object({
|
|
25
|
+
schedule_id: z.string().min(1).describe('Schedule ID'),
|
|
26
|
+
}),
|
|
27
|
+
response: ScheduleDeleteResponseSchema,
|
|
28
|
+
},
|
|
29
|
+
|
|
30
|
+
async handler(ctx) {
|
|
31
|
+
const { args, options } = ctx;
|
|
32
|
+
const schedule = createScheduleAdapter(ctx);
|
|
33
|
+
await schedule.delete(args.schedule_id);
|
|
34
|
+
|
|
35
|
+
if (!options.json) {
|
|
36
|
+
tui.success(`Deleted schedule: ${args.schedule_id}`);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return { success: true, schedule_id: args.schedule_id };
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
export default deleteSubcommand;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { createCommand } from '../../../../types';
|
|
3
|
+
import * as tui from '../../../../tui';
|
|
4
|
+
import { createScheduleAdapter } from '../util';
|
|
5
|
+
import { getCommand } from '../../../../command-prefix';
|
|
6
|
+
|
|
7
|
+
const DeliveryGetResponseSchema = z.object({
|
|
8
|
+
delivery: z.object({
|
|
9
|
+
id: z.string(),
|
|
10
|
+
date: z.string(),
|
|
11
|
+
schedule_id: z.string(),
|
|
12
|
+
schedule_destination_id: z.string(),
|
|
13
|
+
status: z.enum(['pending', 'success', 'failed']),
|
|
14
|
+
retries: z.number(),
|
|
15
|
+
error: z.string().nullable(),
|
|
16
|
+
response: z.record(z.string(), z.unknown()).nullable(),
|
|
17
|
+
}),
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
export const getSubcommand = createCommand({
|
|
21
|
+
name: 'get',
|
|
22
|
+
description: 'Get delivery details',
|
|
23
|
+
tags: ['read-only', 'fast', 'requires-auth'],
|
|
24
|
+
requires: { auth: true, region: true },
|
|
25
|
+
optional: { project: true },
|
|
26
|
+
idempotent: true,
|
|
27
|
+
examples: [
|
|
28
|
+
{
|
|
29
|
+
command: getCommand('cloud schedule delivery get sched_abc123 sdel_abc456'),
|
|
30
|
+
description: 'Get delivery details',
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
schema: {
|
|
34
|
+
args: z.object({
|
|
35
|
+
schedule_id: z.string().min(1).describe('Schedule ID'),
|
|
36
|
+
delivery_id: z.string().min(1).describe('Delivery ID'),
|
|
37
|
+
}),
|
|
38
|
+
options: z.object({
|
|
39
|
+
limit: z.coerce
|
|
40
|
+
.number()
|
|
41
|
+
.min(0)
|
|
42
|
+
.optional()
|
|
43
|
+
.describe('Maximum number of deliveries to scan while filtering'),
|
|
44
|
+
offset: z.coerce
|
|
45
|
+
.number()
|
|
46
|
+
.min(0)
|
|
47
|
+
.optional()
|
|
48
|
+
.describe('Offset while scanning deliveries for filtering'),
|
|
49
|
+
}),
|
|
50
|
+
response: DeliveryGetResponseSchema,
|
|
51
|
+
},
|
|
52
|
+
|
|
53
|
+
async handler(ctx) {
|
|
54
|
+
const { args, opts, options } = ctx;
|
|
55
|
+
const schedule = createScheduleAdapter(ctx);
|
|
56
|
+
const delivery = await schedule.getDelivery(args.schedule_id, args.delivery_id, {
|
|
57
|
+
limit: opts.limit,
|
|
58
|
+
offset: opts.offset,
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
if (!options.json) {
|
|
62
|
+
const details: Record<string, unknown> = {
|
|
63
|
+
ID: delivery.id,
|
|
64
|
+
'Schedule ID': delivery.schedule_id,
|
|
65
|
+
'Destination ID': delivery.schedule_destination_id,
|
|
66
|
+
Date: new Date(delivery.date).toLocaleString(),
|
|
67
|
+
Status: delivery.status,
|
|
68
|
+
Retries: delivery.retries,
|
|
69
|
+
Error: delivery.error ?? '-',
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
tui.table([details], undefined, { layout: 'vertical' });
|
|
73
|
+
|
|
74
|
+
if (delivery.response) {
|
|
75
|
+
tui.newline();
|
|
76
|
+
tui.info('Response');
|
|
77
|
+
tui.json(delivery.response);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return { delivery };
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
export default getSubcommand;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { createCommand } from '../../../../types';
|
|
2
|
+
import { listSubcommand } from './list';
|
|
3
|
+
import { getSubcommand } from './get';
|
|
4
|
+
import { getCommand } from '../../../../command-prefix';
|
|
5
|
+
|
|
6
|
+
export const command = createCommand({
|
|
7
|
+
name: 'delivery',
|
|
8
|
+
description: 'Manage schedule delivery attempts',
|
|
9
|
+
tags: ['requires-auth'],
|
|
10
|
+
requires: { auth: true },
|
|
11
|
+
subcommands: [listSubcommand, getSubcommand],
|
|
12
|
+
examples: [
|
|
13
|
+
{
|
|
14
|
+
command: getCommand('cloud schedule delivery list sched_abc123'),
|
|
15
|
+
description: 'List deliveries for schedule',
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
command: getCommand('cloud schedule delivery get sched_abc123 sdel_abc456'),
|
|
19
|
+
description: 'Get delivery details',
|
|
20
|
+
},
|
|
21
|
+
],
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
export default command;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { createCommand } from '../../../../types';
|
|
3
|
+
import * as tui from '../../../../tui';
|
|
4
|
+
import { createScheduleAdapter } from '../util';
|
|
5
|
+
import { getCommand } from '../../../../command-prefix';
|
|
6
|
+
|
|
7
|
+
const DeliveryListResponseSchema = z.object({
|
|
8
|
+
deliveries: z.array(
|
|
9
|
+
z.object({
|
|
10
|
+
id: z.string(),
|
|
11
|
+
date: z.string(),
|
|
12
|
+
schedule_id: z.string(),
|
|
13
|
+
schedule_destination_id: z.string(),
|
|
14
|
+
status: z.enum(['pending', 'success', 'failed']),
|
|
15
|
+
retries: z.number(),
|
|
16
|
+
error: z.string().nullable(),
|
|
17
|
+
response: z.record(z.string(), z.unknown()).nullable(),
|
|
18
|
+
})
|
|
19
|
+
),
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
export const listSubcommand = createCommand({
|
|
23
|
+
name: 'list',
|
|
24
|
+
aliases: ['ls'],
|
|
25
|
+
description: 'List deliveries for a schedule',
|
|
26
|
+
tags: ['read-only', 'fast', 'requires-auth'],
|
|
27
|
+
requires: { auth: true, region: true },
|
|
28
|
+
optional: { project: true },
|
|
29
|
+
idempotent: true,
|
|
30
|
+
examples: [
|
|
31
|
+
{
|
|
32
|
+
command: getCommand('cloud schedule delivery list sched_abc123 --limit 50'),
|
|
33
|
+
description: 'List schedule deliveries',
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
schema: {
|
|
37
|
+
args: z.object({
|
|
38
|
+
schedule_id: z.string().min(1).describe('Schedule ID'),
|
|
39
|
+
}),
|
|
40
|
+
options: z.object({
|
|
41
|
+
limit: z.coerce.number().min(0).optional().describe('Maximum number of deliveries'),
|
|
42
|
+
offset: z.coerce.number().min(0).optional().describe('Pagination offset'),
|
|
43
|
+
}),
|
|
44
|
+
response: DeliveryListResponseSchema,
|
|
45
|
+
},
|
|
46
|
+
|
|
47
|
+
async handler(ctx) {
|
|
48
|
+
const { args, opts, options } = ctx;
|
|
49
|
+
const schedule = createScheduleAdapter(ctx);
|
|
50
|
+
const result = await schedule.listDeliveries(args.schedule_id, {
|
|
51
|
+
limit: opts.limit,
|
|
52
|
+
offset: opts.offset,
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
if (!options.json) {
|
|
56
|
+
if (result.deliveries.length === 0) {
|
|
57
|
+
tui.info('No deliveries found');
|
|
58
|
+
} else {
|
|
59
|
+
tui.table(
|
|
60
|
+
result.deliveries.map((delivery: {
|
|
61
|
+
id: string;
|
|
62
|
+
date: string;
|
|
63
|
+
status: 'pending' | 'success' | 'failed';
|
|
64
|
+
retries: number;
|
|
65
|
+
schedule_destination_id: string;
|
|
66
|
+
}) => ({
|
|
67
|
+
ID: delivery.id,
|
|
68
|
+
Date: new Date(delivery.date).toLocaleString(),
|
|
69
|
+
Status: delivery.status,
|
|
70
|
+
Retries: delivery.retries,
|
|
71
|
+
'Destination ID': delivery.schedule_destination_id,
|
|
72
|
+
})),
|
|
73
|
+
['ID', 'Date', 'Status', 'Retries', 'Destination ID']
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return result;
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
export default listSubcommand;
|