@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.
Files changed (297) hide show
  1. package/dist/auth.d.ts.map +1 -1
  2. package/dist/auth.js +7 -0
  3. package/dist/auth.js.map +1 -1
  4. package/dist/cache/resource-region.d.ts +1 -1
  5. package/dist/cache/resource-region.d.ts.map +1 -1
  6. package/dist/cache/resource-region.js.map +1 -1
  7. package/dist/cmd/ai/claude-code/install.d.ts.map +1 -1
  8. package/dist/cmd/ai/claude-code/install.js +0 -1
  9. package/dist/cmd/ai/claude-code/install.js.map +1 -1
  10. package/dist/cmd/build/vite/public-asset-path-plugin.d.ts +4 -2
  11. package/dist/cmd/build/vite/public-asset-path-plugin.d.ts.map +1 -1
  12. package/dist/cmd/build/vite/public-asset-path-plugin.js +18 -4
  13. package/dist/cmd/build/vite/public-asset-path-plugin.js.map +1 -1
  14. package/dist/cmd/cloud/email/create.d.ts +3 -0
  15. package/dist/cmd/cloud/email/create.d.ts.map +1 -0
  16. package/dist/cmd/cloud/email/create.js +58 -0
  17. package/dist/cmd/cloud/email/create.js.map +1 -0
  18. package/dist/cmd/cloud/email/delete.d.ts +3 -0
  19. package/dist/cmd/cloud/email/delete.d.ts.map +1 -0
  20. package/dist/cmd/cloud/email/delete.js +47 -0
  21. package/dist/cmd/cloud/email/delete.js.map +1 -0
  22. package/dist/cmd/cloud/email/destination/delete.d.ts +3 -0
  23. package/dist/cmd/cloud/email/destination/delete.d.ts.map +1 -0
  24. package/dist/cmd/cloud/email/destination/delete.js +54 -0
  25. package/dist/cmd/cloud/email/destination/delete.js.map +1 -0
  26. package/dist/cmd/cloud/email/destination/index.d.ts +3 -0
  27. package/dist/cmd/cloud/email/destination/index.d.ts.map +1 -0
  28. package/dist/cmd/cloud/email/destination/index.js +14 -0
  29. package/dist/cmd/cloud/email/destination/index.js.map +1 -0
  30. package/dist/cmd/cloud/email/destination/list.d.ts +3 -0
  31. package/dist/cmd/cloud/email/destination/list.d.ts.map +1 -0
  32. package/dist/cmd/cloud/email/destination/list.js +39 -0
  33. package/dist/cmd/cloud/email/destination/list.js.map +1 -0
  34. package/dist/cmd/cloud/email/destination/schemas.d.ts +9 -0
  35. package/dist/cmd/cloud/email/destination/schemas.d.ts.map +1 -0
  36. package/dist/cmd/cloud/email/destination/schemas.js +9 -0
  37. package/dist/cmd/cloud/email/destination/schemas.js.map +1 -0
  38. package/dist/cmd/cloud/email/destination/url.d.ts +3 -0
  39. package/dist/cmd/cloud/email/destination/url.d.ts.map +1 -0
  40. package/dist/cmd/cloud/email/destination/url.js +64 -0
  41. package/dist/cmd/cloud/email/destination/url.js.map +1 -0
  42. package/dist/cmd/cloud/email/get.d.ts +3 -0
  43. package/dist/cmd/cloud/email/get.d.ts.map +1 -0
  44. package/dist/cmd/cloud/email/get.js +43 -0
  45. package/dist/cmd/cloud/email/get.js.map +1 -0
  46. package/dist/cmd/cloud/email/inbound/get.d.ts +3 -0
  47. package/dist/cmd/cloud/email/inbound/get.d.ts.map +1 -0
  48. package/dist/cmd/cloud/email/inbound/get.js +44 -0
  49. package/dist/cmd/cloud/email/inbound/get.js.map +1 -0
  50. package/dist/cmd/cloud/email/inbound/index.d.ts +3 -0
  51. package/dist/cmd/cloud/email/inbound/index.d.ts.map +1 -0
  52. package/dist/cmd/cloud/email/inbound/index.js +12 -0
  53. package/dist/cmd/cloud/email/inbound/index.js.map +1 -0
  54. package/dist/cmd/cloud/email/inbound/list.d.ts +3 -0
  55. package/dist/cmd/cloud/email/inbound/list.d.ts.map +1 -0
  56. package/dist/cmd/cloud/email/inbound/list.js +43 -0
  57. package/dist/cmd/cloud/email/inbound/list.js.map +1 -0
  58. package/dist/cmd/cloud/email/inbound/schemas.d.ts +11 -0
  59. package/dist/cmd/cloud/email/inbound/schemas.d.ts.map +1 -0
  60. package/dist/cmd/cloud/email/inbound/schemas.js +11 -0
  61. package/dist/cmd/cloud/email/inbound/schemas.js.map +1 -0
  62. package/dist/cmd/cloud/email/index.d.ts +3 -0
  63. package/dist/cmd/cloud/email/index.d.ts.map +1 -0
  64. package/dist/cmd/cloud/email/index.js +28 -0
  65. package/dist/cmd/cloud/email/index.js.map +1 -0
  66. package/dist/cmd/cloud/email/list.d.ts +3 -0
  67. package/dist/cmd/cloud/email/list.d.ts.map +1 -0
  68. package/dist/cmd/cloud/email/list.js +37 -0
  69. package/dist/cmd/cloud/email/list.js.map +1 -0
  70. package/dist/cmd/cloud/email/outbound/get.d.ts +3 -0
  71. package/dist/cmd/cloud/email/outbound/get.d.ts.map +1 -0
  72. package/dist/cmd/cloud/email/outbound/get.js +45 -0
  73. package/dist/cmd/cloud/email/outbound/get.js.map +1 -0
  74. package/dist/cmd/cloud/email/outbound/index.d.ts +3 -0
  75. package/dist/cmd/cloud/email/outbound/index.d.ts.map +1 -0
  76. package/dist/cmd/cloud/email/outbound/index.js +12 -0
  77. package/dist/cmd/cloud/email/outbound/index.js.map +1 -0
  78. package/dist/cmd/cloud/email/outbound/list.d.ts +3 -0
  79. package/dist/cmd/cloud/email/outbound/list.d.ts.map +1 -0
  80. package/dist/cmd/cloud/email/outbound/list.js +43 -0
  81. package/dist/cmd/cloud/email/outbound/list.js.map +1 -0
  82. package/dist/cmd/cloud/email/outbound/schemas.d.ts +15 -0
  83. package/dist/cmd/cloud/email/outbound/schemas.d.ts.map +1 -0
  84. package/dist/cmd/cloud/email/outbound/schemas.js +15 -0
  85. package/dist/cmd/cloud/email/outbound/schemas.js.map +1 -0
  86. package/dist/cmd/cloud/email/send.d.ts +3 -0
  87. package/dist/cmd/cloud/email/send.d.ts.map +1 -0
  88. package/dist/cmd/cloud/email/send.js +77 -0
  89. package/dist/cmd/cloud/email/send.js.map +1 -0
  90. package/dist/cmd/cloud/email/util.d.ts +26 -0
  91. package/dist/cmd/cloud/email/util.d.ts.map +1 -0
  92. package/dist/cmd/cloud/email/util.js +57 -0
  93. package/dist/cmd/cloud/email/util.js.map +1 -0
  94. package/dist/cmd/cloud/index.d.ts.map +1 -1
  95. package/dist/cmd/cloud/index.js +8 -0
  96. package/dist/cmd/cloud/index.js.map +1 -1
  97. package/dist/cmd/cloud/region-lookup.d.ts +1 -1
  98. package/dist/cmd/cloud/region-lookup.d.ts.map +1 -1
  99. package/dist/cmd/cloud/region-lookup.js +44 -2
  100. package/dist/cmd/cloud/region-lookup.js.map +1 -1
  101. package/dist/cmd/cloud/sandbox/snapshot/build.d.ts +7 -0
  102. package/dist/cmd/cloud/sandbox/snapshot/build.d.ts.map +1 -1
  103. package/dist/cmd/cloud/sandbox/snapshot/build.js +46 -28
  104. package/dist/cmd/cloud/sandbox/snapshot/build.js.map +1 -1
  105. package/dist/cmd/cloud/sandbox/snapshot/generate.d.ts.map +1 -1
  106. package/dist/cmd/cloud/sandbox/snapshot/generate.js +5 -1
  107. package/dist/cmd/cloud/sandbox/snapshot/generate.js.map +1 -1
  108. package/dist/cmd/cloud/schedule/create.d.ts +3 -0
  109. package/dist/cmd/cloud/schedule/create.d.ts.map +1 -0
  110. package/dist/cmd/cloud/schedule/create.js +72 -0
  111. package/dist/cmd/cloud/schedule/create.js.map +1 -0
  112. package/dist/cmd/cloud/schedule/delete.d.ts +3 -0
  113. package/dist/cmd/cloud/schedule/delete.d.ts.map +1 -0
  114. package/dist/cmd/cloud/schedule/delete.js +38 -0
  115. package/dist/cmd/cloud/schedule/delete.js.map +1 -0
  116. package/dist/cmd/cloud/schedule/delivery/get.d.ts +3 -0
  117. package/dist/cmd/cloud/schedule/delivery/get.d.ts.map +1 -0
  118. package/dist/cmd/cloud/schedule/delivery/get.js +78 -0
  119. package/dist/cmd/cloud/schedule/delivery/get.js.map +1 -0
  120. package/dist/cmd/cloud/schedule/delivery/index.d.ts +3 -0
  121. package/dist/cmd/cloud/schedule/delivery/index.d.ts.map +1 -0
  122. package/dist/cmd/cloud/schedule/delivery/index.js +23 -0
  123. package/dist/cmd/cloud/schedule/delivery/index.js.map +1 -0
  124. package/dist/cmd/cloud/schedule/delivery/list.d.ts +3 -0
  125. package/dist/cmd/cloud/schedule/delivery/list.d.ts.map +1 -0
  126. package/dist/cmd/cloud/schedule/delivery/list.js +67 -0
  127. package/dist/cmd/cloud/schedule/delivery/list.js.map +1 -0
  128. package/dist/cmd/cloud/schedule/destination/create.d.ts +3 -0
  129. package/dist/cmd/cloud/schedule/destination/create.d.ts.map +1 -0
  130. package/dist/cmd/cloud/schedule/destination/create.js +97 -0
  131. package/dist/cmd/cloud/schedule/destination/create.js.map +1 -0
  132. package/dist/cmd/cloud/schedule/destination/delete.d.ts +3 -0
  133. package/dist/cmd/cloud/schedule/destination/delete.d.ts.map +1 -0
  134. package/dist/cmd/cloud/schedule/destination/delete.js +41 -0
  135. package/dist/cmd/cloud/schedule/destination/delete.js.map +1 -0
  136. package/dist/cmd/cloud/schedule/destination/get.d.ts +3 -0
  137. package/dist/cmd/cloud/schedule/destination/get.d.ts.map +1 -0
  138. package/dist/cmd/cloud/schedule/destination/get.js +57 -0
  139. package/dist/cmd/cloud/schedule/destination/get.js.map +1 -0
  140. package/dist/cmd/cloud/schedule/destination/index.d.ts +3 -0
  141. package/dist/cmd/cloud/schedule/destination/index.d.ts.map +1 -0
  142. package/dist/cmd/cloud/schedule/destination/index.js +26 -0
  143. package/dist/cmd/cloud/schedule/destination/index.js.map +1 -0
  144. package/dist/cmd/cloud/schedule/destination/list.d.ts +3 -0
  145. package/dist/cmd/cloud/schedule/destination/list.d.ts.map +1 -0
  146. package/dist/cmd/cloud/schedule/destination/list.js +58 -0
  147. package/dist/cmd/cloud/schedule/destination/list.js.map +1 -0
  148. package/dist/cmd/cloud/schedule/get.d.ts +3 -0
  149. package/dist/cmd/cloud/schedule/get.d.ts.map +1 -0
  150. package/dist/cmd/cloud/schedule/get.js +76 -0
  151. package/dist/cmd/cloud/schedule/get.js.map +1 -0
  152. package/dist/cmd/cloud/schedule/index.d.ts +3 -0
  153. package/dist/cmd/cloud/schedule/index.d.ts.map +1 -0
  154. package/dist/cmd/cloud/schedule/index.js +35 -0
  155. package/dist/cmd/cloud/schedule/index.js.map +1 -0
  156. package/dist/cmd/cloud/schedule/list.d.ts +3 -0
  157. package/dist/cmd/cloud/schedule/list.d.ts.map +1 -0
  158. package/dist/cmd/cloud/schedule/list.js +60 -0
  159. package/dist/cmd/cloud/schedule/list.js.map +1 -0
  160. package/dist/cmd/cloud/schedule/update.d.ts +3 -0
  161. package/dist/cmd/cloud/schedule/update.d.ts.map +1 -0
  162. package/dist/cmd/cloud/schedule/update.js +65 -0
  163. package/dist/cmd/cloud/schedule/update.js.map +1 -0
  164. package/dist/cmd/cloud/schedule/util.d.ts +11 -0
  165. package/dist/cmd/cloud/schedule/util.d.ts.map +1 -0
  166. package/dist/cmd/cloud/schedule/util.js +17 -0
  167. package/dist/cmd/cloud/schedule/util.js.map +1 -0
  168. package/dist/cmd/cloud/task/create.d.ts +3 -0
  169. package/dist/cmd/cloud/task/create.d.ts.map +1 -0
  170. package/dist/cmd/cloud/task/create.js +108 -0
  171. package/dist/cmd/cloud/task/create.js.map +1 -0
  172. package/dist/cmd/cloud/task/get.d.ts +3 -0
  173. package/dist/cmd/cloud/task/get.d.ts.map +1 -0
  174. package/dist/cmd/cloud/task/get.js +124 -0
  175. package/dist/cmd/cloud/task/get.js.map +1 -0
  176. package/dist/cmd/cloud/task/index.d.ts +3 -0
  177. package/dist/cmd/cloud/task/index.d.ts.map +1 -0
  178. package/dist/cmd/cloud/task/index.js +33 -0
  179. package/dist/cmd/cloud/task/index.js.map +1 -0
  180. package/dist/cmd/cloud/task/list.d.ts +3 -0
  181. package/dist/cmd/cloud/task/list.d.ts.map +1 -0
  182. package/dist/cmd/cloud/task/list.js +174 -0
  183. package/dist/cmd/cloud/task/list.js.map +1 -0
  184. package/dist/cmd/cloud/task/update.d.ts +3 -0
  185. package/dist/cmd/cloud/task/update.d.ts.map +1 -0
  186. package/dist/cmd/cloud/task/update.js +118 -0
  187. package/dist/cmd/cloud/task/update.js.map +1 -0
  188. package/dist/cmd/cloud/task/util.d.ts +18 -0
  189. package/dist/cmd/cloud/task/util.d.ts.map +1 -0
  190. package/dist/cmd/cloud/task/util.js +45 -0
  191. package/dist/cmd/cloud/task/util.js.map +1 -0
  192. package/dist/cmd/cloud/webhook/create.d.ts +3 -0
  193. package/dist/cmd/cloud/webhook/create.d.ts.map +1 -0
  194. package/dist/cmd/cloud/webhook/create.js +54 -0
  195. package/dist/cmd/cloud/webhook/create.js.map +1 -0
  196. package/dist/cmd/cloud/webhook/delete.d.ts +3 -0
  197. package/dist/cmd/cloud/webhook/delete.d.ts.map +1 -0
  198. package/dist/cmd/cloud/webhook/delete.js +50 -0
  199. package/dist/cmd/cloud/webhook/delete.js.map +1 -0
  200. package/dist/cmd/cloud/webhook/deliveries.d.ts +3 -0
  201. package/dist/cmd/cloud/webhook/deliveries.d.ts.map +1 -0
  202. package/dist/cmd/cloud/webhook/deliveries.js +123 -0
  203. package/dist/cmd/cloud/webhook/deliveries.js.map +1 -0
  204. package/dist/cmd/cloud/webhook/destinations.d.ts +3 -0
  205. package/dist/cmd/cloud/webhook/destinations.d.ts.map +1 -0
  206. package/dist/cmd/cloud/webhook/destinations.js +212 -0
  207. package/dist/cmd/cloud/webhook/destinations.js.map +1 -0
  208. package/dist/cmd/cloud/webhook/get.d.ts +3 -0
  209. package/dist/cmd/cloud/webhook/get.d.ts.map +1 -0
  210. package/dist/cmd/cloud/webhook/get.js +50 -0
  211. package/dist/cmd/cloud/webhook/get.js.map +1 -0
  212. package/dist/cmd/cloud/webhook/index.d.ts +3 -0
  213. package/dist/cmd/cloud/webhook/index.d.ts.map +1 -0
  214. package/dist/cmd/cloud/webhook/index.js +45 -0
  215. package/dist/cmd/cloud/webhook/index.js.map +1 -0
  216. package/dist/cmd/cloud/webhook/list.d.ts +3 -0
  217. package/dist/cmd/cloud/webhook/list.d.ts.map +1 -0
  218. package/dist/cmd/cloud/webhook/list.js +72 -0
  219. package/dist/cmd/cloud/webhook/list.js.map +1 -0
  220. package/dist/cmd/cloud/webhook/receipts.d.ts +3 -0
  221. package/dist/cmd/cloud/webhook/receipts.d.ts.map +1 -0
  222. package/dist/cmd/cloud/webhook/receipts.js +128 -0
  223. package/dist/cmd/cloud/webhook/receipts.js.map +1 -0
  224. package/dist/cmd/cloud/webhook/util.d.ts +27 -0
  225. package/dist/cmd/cloud/webhook/util.d.ts.map +1 -0
  226. package/dist/cmd/cloud/webhook/util.js +20 -0
  227. package/dist/cmd/cloud/webhook/util.js.map +1 -0
  228. package/dist/config.d.ts +8 -0
  229. package/dist/config.d.ts.map +1 -1
  230. package/dist/types.d.ts +10 -2
  231. package/dist/types.d.ts.map +1 -1
  232. package/dist/types.js +3 -2
  233. package/dist/types.js.map +1 -1
  234. package/dist/version-check.d.ts.map +1 -1
  235. package/dist/version-check.js +18 -3
  236. package/dist/version-check.js.map +1 -1
  237. package/package.json +6 -6
  238. package/src/auth.ts +7 -0
  239. package/src/cache/resource-region.ts +4 -1
  240. package/src/cmd/ai/claude-code/install.ts +0 -3
  241. package/src/cmd/build/vite/public-asset-path-plugin.ts +18 -4
  242. package/src/cmd/cloud/email/create.ts +70 -0
  243. package/src/cmd/cloud/email/delete.ts +53 -0
  244. package/src/cmd/cloud/email/destination/delete.ts +65 -0
  245. package/src/cmd/cloud/email/destination/index.ts +15 -0
  246. package/src/cmd/cloud/email/destination/list.ts +46 -0
  247. package/src/cmd/cloud/email/destination/schemas.ts +9 -0
  248. package/src/cmd/cloud/email/destination/url.ts +75 -0
  249. package/src/cmd/cloud/email/get.ts +52 -0
  250. package/src/cmd/cloud/email/inbound/get.ts +53 -0
  251. package/src/cmd/cloud/email/inbound/index.ts +13 -0
  252. package/src/cmd/cloud/email/inbound/list.ts +50 -0
  253. package/src/cmd/cloud/email/inbound/schemas.ts +11 -0
  254. package/src/cmd/cloud/email/index.ts +29 -0
  255. package/src/cmd/cloud/email/list.ts +44 -0
  256. package/src/cmd/cloud/email/outbound/get.ts +54 -0
  257. package/src/cmd/cloud/email/outbound/index.ts +13 -0
  258. package/src/cmd/cloud/email/outbound/list.ts +50 -0
  259. package/src/cmd/cloud/email/outbound/schemas.ts +15 -0
  260. package/src/cmd/cloud/email/send.ts +91 -0
  261. package/src/cmd/cloud/email/util.ts +89 -0
  262. package/src/cmd/cloud/index.ts +8 -0
  263. package/src/cmd/cloud/region-lookup.ts +58 -2
  264. package/src/cmd/cloud/sandbox/snapshot/build.ts +59 -55
  265. package/src/cmd/cloud/sandbox/snapshot/generate.ts +5 -1
  266. package/src/cmd/cloud/schedule/create.ts +83 -0
  267. package/src/cmd/cloud/schedule/delete.ts +43 -0
  268. package/src/cmd/cloud/schedule/delivery/get.ts +85 -0
  269. package/src/cmd/cloud/schedule/delivery/index.ts +24 -0
  270. package/src/cmd/cloud/schedule/delivery/list.ts +82 -0
  271. package/src/cmd/cloud/schedule/destination/create.ts +110 -0
  272. package/src/cmd/cloud/schedule/destination/delete.ts +46 -0
  273. package/src/cmd/cloud/schedule/destination/get.ts +66 -0
  274. package/src/cmd/cloud/schedule/destination/index.ts +27 -0
  275. package/src/cmd/cloud/schedule/destination/list.ts +72 -0
  276. package/src/cmd/cloud/schedule/get.ts +92 -0
  277. package/src/cmd/cloud/schedule/index.ts +36 -0
  278. package/src/cmd/cloud/schedule/list.ts +78 -0
  279. package/src/cmd/cloud/schedule/update.ts +74 -0
  280. package/src/cmd/cloud/schedule/util.ts +34 -0
  281. package/src/cmd/cloud/task/create.ts +124 -0
  282. package/src/cmd/cloud/task/get.ts +138 -0
  283. package/src/cmd/cloud/task/index.ts +34 -0
  284. package/src/cmd/cloud/task/list.ts +191 -0
  285. package/src/cmd/cloud/task/update.ts +123 -0
  286. package/src/cmd/cloud/task/util.ts +74 -0
  287. package/src/cmd/cloud/webhook/create.ts +66 -0
  288. package/src/cmd/cloud/webhook/delete.ts +57 -0
  289. package/src/cmd/cloud/webhook/deliveries.ts +149 -0
  290. package/src/cmd/cloud/webhook/destinations.ts +274 -0
  291. package/src/cmd/cloud/webhook/get.ts +59 -0
  292. package/src/cmd/cloud/webhook/index.ts +46 -0
  293. package/src/cmd/cloud/webhook/list.ts +82 -0
  294. package/src/cmd/cloud/webhook/receipts.ts +157 -0
  295. package/src/cmd/cloud/webhook/util.ts +35 -0
  296. package/src/types.ts +3 -1
  297. 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 { z } from 'zod';
2
- import { resolve, join, extname } from 'node:path';
3
- import { existsSync, statSync, createReadStream, createWriteStream } from 'node:fs';
4
- import { YAML } from 'bun';
5
- import * as tar from 'tar';
6
- import { createCommand } from '../../../../types';
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
- snapshotBuildInit,
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 type { SnapshotFileInfo, SnapshotBuildGitInfo } from '@agentuity/server';
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
- continue;
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
- const directory = resolve(args.directory);
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
- `Publishing a public snapshot requires confirmation.\n\n` +
487
- `Public snapshots make all environment variables and files publicly accessible.\n\n` +
488
- `To proceed, add the --confirm flag:\n` +
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
- `To preview what will be published, use --dry-run first:\n` +
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
- `You are publishing a public snapshot.\n\n` +
498
- `This will make all environment variables and\n` +
499
- `files in the snapshot publicly accessible.\n\n` +
500
- `Run with --dry-run to preview the contents.`
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;