@agentuity/cli 0.0.59 → 0.0.60

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 (125) hide show
  1. package/dist/cli.d.ts.map +1 -1
  2. package/dist/cli.js +14 -1
  3. package/dist/cli.js.map +1 -1
  4. package/dist/cmd/ai/capabilities/show.d.ts.map +1 -1
  5. package/dist/cmd/ai/capabilities/show.js +11 -4
  6. package/dist/cmd/ai/capabilities/show.js.map +1 -1
  7. package/dist/cmd/cloud/db/create.d.ts +2 -0
  8. package/dist/cmd/cloud/db/create.d.ts.map +1 -0
  9. package/dist/cmd/cloud/db/create.js +68 -0
  10. package/dist/cmd/cloud/db/create.js.map +1 -0
  11. package/dist/cmd/cloud/db/delete.d.ts.map +1 -0
  12. package/dist/cmd/cloud/db/delete.js +106 -0
  13. package/dist/cmd/cloud/db/delete.js.map +1 -0
  14. package/dist/cmd/cloud/db/get.d.ts +2 -0
  15. package/dist/cmd/cloud/db/get.d.ts.map +1 -0
  16. package/dist/cmd/cloud/db/get.js +66 -0
  17. package/dist/cmd/cloud/db/get.js.map +1 -0
  18. package/dist/cmd/cloud/db/index.d.ts +2 -0
  19. package/dist/cmd/cloud/db/index.d.ts.map +1 -0
  20. package/dist/cmd/cloud/db/index.js +14 -0
  21. package/dist/cmd/cloud/db/index.js.map +1 -0
  22. package/dist/cmd/cloud/db/list.d.ts.map +1 -0
  23. package/dist/cmd/cloud/db/list.js +75 -0
  24. package/dist/cmd/cloud/db/list.js.map +1 -0
  25. package/dist/cmd/cloud/db/sql.d.ts +2 -0
  26. package/dist/cmd/cloud/db/sql.d.ts.map +1 -0
  27. package/dist/cmd/cloud/db/sql.js +102 -0
  28. package/dist/cmd/cloud/db/sql.js.map +1 -0
  29. package/dist/cmd/cloud/env/get.d.ts.map +1 -1
  30. package/dist/cmd/cloud/env/get.js +2 -3
  31. package/dist/cmd/cloud/env/get.js.map +1 -1
  32. package/dist/cmd/cloud/env/list.d.ts.map +1 -1
  33. package/dist/cmd/cloud/env/list.js +1 -2
  34. package/dist/cmd/cloud/env/list.js.map +1 -1
  35. package/dist/cmd/cloud/index.d.ts.map +1 -1
  36. package/dist/cmd/cloud/index.js +4 -2
  37. package/dist/cmd/cloud/index.js.map +1 -1
  38. package/dist/cmd/cloud/secret/get.d.ts.map +1 -1
  39. package/dist/cmd/cloud/secret/get.js +2 -3
  40. package/dist/cmd/cloud/secret/get.js.map +1 -1
  41. package/dist/cmd/cloud/secret/list.d.ts.map +1 -1
  42. package/dist/cmd/cloud/secret/list.js +1 -2
  43. package/dist/cmd/cloud/secret/list.js.map +1 -1
  44. package/dist/cmd/cloud/storage/create.d.ts +2 -0
  45. package/dist/cmd/cloud/storage/create.d.ts.map +1 -0
  46. package/dist/cmd/cloud/storage/create.js +61 -0
  47. package/dist/cmd/cloud/storage/create.js.map +1 -0
  48. package/dist/cmd/cloud/storage/delete.d.ts +2 -0
  49. package/dist/cmd/cloud/storage/delete.d.ts.map +1 -0
  50. package/dist/cmd/cloud/storage/delete.js +167 -0
  51. package/dist/cmd/cloud/storage/delete.js.map +1 -0
  52. package/dist/cmd/cloud/storage/download.d.ts +2 -0
  53. package/dist/cmd/cloud/storage/download.d.ts.map +1 -0
  54. package/dist/cmd/cloud/storage/download.js +131 -0
  55. package/dist/cmd/cloud/storage/download.js.map +1 -0
  56. package/dist/cmd/cloud/storage/get.d.ts +2 -0
  57. package/dist/cmd/cloud/storage/get.d.ts.map +1 -0
  58. package/dist/cmd/cloud/storage/get.js +86 -0
  59. package/dist/cmd/cloud/storage/get.js.map +1 -0
  60. package/dist/cmd/cloud/storage/index.d.ts +2 -0
  61. package/dist/cmd/cloud/storage/index.d.ts.map +1 -0
  62. package/dist/cmd/cloud/storage/index.js +22 -0
  63. package/dist/cmd/cloud/storage/index.js.map +1 -0
  64. package/dist/cmd/cloud/storage/list.d.ts +2 -0
  65. package/dist/cmd/cloud/storage/list.d.ts.map +1 -0
  66. package/dist/cmd/cloud/storage/list.js +170 -0
  67. package/dist/cmd/cloud/storage/list.js.map +1 -0
  68. package/dist/cmd/cloud/storage/upload.d.ts +2 -0
  69. package/dist/cmd/cloud/storage/upload.d.ts.map +1 -0
  70. package/dist/cmd/cloud/storage/upload.js +133 -0
  71. package/dist/cmd/cloud/storage/upload.js.map +1 -0
  72. package/dist/cmd/cloud/storage/utils.d.ts +18 -0
  73. package/dist/cmd/cloud/storage/utils.d.ts.map +1 -0
  74. package/dist/cmd/cloud/storage/utils.js +21 -0
  75. package/dist/cmd/cloud/storage/utils.js.map +1 -0
  76. package/dist/tui.d.ts +2 -1
  77. package/dist/tui.d.ts.map +1 -1
  78. package/dist/tui.js +3 -0
  79. package/dist/tui.js.map +1 -1
  80. package/dist/version.js +1 -1
  81. package/dist/version.js.map +1 -1
  82. package/package.json +3 -3
  83. package/src/cli.ts +15 -1
  84. package/src/cmd/ai/capabilities/show.ts +11 -4
  85. package/src/cmd/cloud/db/create.ts +72 -0
  86. package/src/cmd/cloud/db/delete.ts +118 -0
  87. package/src/cmd/cloud/db/get.ts +75 -0
  88. package/src/cmd/cloud/db/index.ts +14 -0
  89. package/src/cmd/cloud/db/list.ts +83 -0
  90. package/src/cmd/cloud/db/sql.ts +125 -0
  91. package/src/cmd/cloud/env/get.ts +2 -3
  92. package/src/cmd/cloud/env/list.ts +1 -2
  93. package/src/cmd/cloud/index.ts +5 -2
  94. package/src/cmd/cloud/secret/get.ts +2 -3
  95. package/src/cmd/cloud/secret/list.ts +1 -2
  96. package/src/cmd/cloud/storage/create.ts +65 -0
  97. package/src/cmd/cloud/storage/delete.ts +195 -0
  98. package/src/cmd/cloud/storage/download.ts +154 -0
  99. package/src/cmd/cloud/storage/get.ts +97 -0
  100. package/src/cmd/cloud/storage/index.ts +22 -0
  101. package/src/cmd/cloud/storage/list.ts +197 -0
  102. package/src/cmd/cloud/storage/upload.ts +150 -0
  103. package/src/cmd/cloud/storage/utils.ts +26 -0
  104. package/src/tui.ts +4 -0
  105. package/src/version.ts +1 -1
  106. package/dist/cmd/cloud/resource/add.d.ts +0 -2
  107. package/dist/cmd/cloud/resource/add.d.ts.map +0 -1
  108. package/dist/cmd/cloud/resource/add.js +0 -70
  109. package/dist/cmd/cloud/resource/add.js.map +0 -1
  110. package/dist/cmd/cloud/resource/delete.d.ts.map +0 -1
  111. package/dist/cmd/cloud/resource/delete.js +0 -126
  112. package/dist/cmd/cloud/resource/delete.js.map +0 -1
  113. package/dist/cmd/cloud/resource/index.d.ts +0 -2
  114. package/dist/cmd/cloud/resource/index.d.ts.map +0 -1
  115. package/dist/cmd/cloud/resource/index.js +0 -12
  116. package/dist/cmd/cloud/resource/index.js.map +0 -1
  117. package/dist/cmd/cloud/resource/list.d.ts.map +0 -1
  118. package/dist/cmd/cloud/resource/list.js +0 -100
  119. package/dist/cmd/cloud/resource/list.js.map +0 -1
  120. package/src/cmd/cloud/resource/add.ts +0 -75
  121. package/src/cmd/cloud/resource/delete.ts +0 -141
  122. package/src/cmd/cloud/resource/index.ts +0 -12
  123. package/src/cmd/cloud/resource/list.ts +0 -105
  124. /package/dist/cmd/cloud/{resource → db}/delete.d.ts +0 -0
  125. /package/dist/cmd/cloud/{resource → db}/list.d.ts +0 -0
@@ -0,0 +1,167 @@
1
+ import { z } from 'zod';
2
+ import { listResources, deleteResources } from '@agentuity/server';
3
+ import enquirer from 'enquirer';
4
+ import { createSubcommand } from '../../../types';
5
+ import * as tui from '../../../tui';
6
+ import { getCatalystAPIClient } from '../../../config';
7
+ import { getCommand } from '../../../command-prefix';
8
+ import { isDryRunMode, outputDryRun } from '../../../explain';
9
+ import { ErrorCode } from '../../../errors';
10
+ import { createS3Client } from './utils';
11
+ export const deleteSubcommand = createSubcommand({
12
+ name: 'delete',
13
+ aliases: ['rm', 'del', 'remove'],
14
+ description: 'Delete a storage resource or file',
15
+ tags: ['destructive', 'deletes-resource', 'slow', 'requires-auth', 'requires-deployment'],
16
+ idempotent: false,
17
+ requires: { auth: true, org: true, region: true },
18
+ examples: [
19
+ getCommand('cloud storage delete my-bucket'),
20
+ getCommand('cloud storage rm my-bucket file.txt'),
21
+ getCommand('cloud storage delete'),
22
+ getCommand('--dry-run cloud storage delete my-bucket'),
23
+ ],
24
+ schema: {
25
+ args: z.object({
26
+ name: z.string().optional().describe('Bucket name'),
27
+ filename: z.string().optional().describe('File path to delete from bucket'),
28
+ }),
29
+ options: z.object({
30
+ confirm: z.boolean().optional().describe('Skip confirmation prompts'),
31
+ }),
32
+ response: z.object({
33
+ success: z.boolean().describe('Whether deletion succeeded'),
34
+ name: z.string().describe('Deleted bucket or file name'),
35
+ }),
36
+ },
37
+ async handler(ctx) {
38
+ const { logger, args, opts, config, orgId, region, auth, options } = ctx;
39
+ const catalystClient = getCatalystAPIClient(config, logger, auth);
40
+ const resources = await tui.spinner({
41
+ message: `Fetching storage for ${orgId} in ${region}`,
42
+ clearOnSuccess: true,
43
+ callback: async () => {
44
+ return listResources(catalystClient, orgId, region);
45
+ },
46
+ });
47
+ let bucketName = args.name;
48
+ if (!bucketName) {
49
+ if (resources.s3.length === 0) {
50
+ tui.info('No storage buckets found to delete');
51
+ return { success: false, name: '' };
52
+ }
53
+ const response = await enquirer.prompt({
54
+ type: 'select',
55
+ name: 'bucket',
56
+ message: 'Select storage bucket to delete:',
57
+ choices: resources.s3.map((s3) => ({
58
+ name: s3.bucket_name,
59
+ message: s3.bucket_name,
60
+ })),
61
+ });
62
+ bucketName = response.bucket;
63
+ }
64
+ // If filename is provided, delete the file from the bucket
65
+ if (args.filename) {
66
+ const bucket = resources.s3.find((s3) => s3.bucket_name === bucketName);
67
+ if (!bucket) {
68
+ tui.fatal(`Storage bucket '${bucketName}' not found`, ErrorCode.RESOURCE_NOT_FOUND);
69
+ }
70
+ if (!bucket.access_key || !bucket.secret_key || !bucket.endpoint) {
71
+ tui.fatal(`Storage bucket '${bucketName}' is missing credentials`, ErrorCode.CONFIG_INVALID);
72
+ }
73
+ // Handle dry-run mode
74
+ if (isDryRunMode(options)) {
75
+ outputDryRun(`Would delete file ${args.filename} from bucket ${bucketName}`, options);
76
+ if (!options.json) {
77
+ tui.newline();
78
+ tui.info('[DRY RUN] File deletion skipped');
79
+ }
80
+ return {
81
+ success: false,
82
+ name: args.filename,
83
+ };
84
+ }
85
+ if (!opts.confirm) {
86
+ tui.warning(`You are about to delete file: ${tui.bold(args.filename)} from bucket: ${tui.bold(bucketName)}`);
87
+ const confirm = await enquirer.prompt({
88
+ type: 'confirm',
89
+ name: 'confirm',
90
+ message: 'Are you sure you want to delete this file?',
91
+ initial: false,
92
+ });
93
+ if (!confirm.confirm) {
94
+ tui.info('Deletion cancelled');
95
+ return { success: false, name: args.filename };
96
+ }
97
+ }
98
+ const s3Client = createS3Client({
99
+ endpoint: bucket.endpoint,
100
+ access_key: bucket.access_key,
101
+ secret_key: bucket.secret_key,
102
+ region: bucket.region,
103
+ });
104
+ await tui.spinner({
105
+ message: `Deleting ${args.filename} from ${bucketName}`,
106
+ clearOnSuccess: true,
107
+ callback: async () => {
108
+ await s3Client.delete(args.filename);
109
+ },
110
+ });
111
+ if (!options.json) {
112
+ tui.success(`Deleted file: ${tui.bold(args.filename)} from ${tui.bold(bucketName)}`);
113
+ }
114
+ return {
115
+ success: true,
116
+ name: args.filename,
117
+ };
118
+ }
119
+ // Otherwise, delete the bucket
120
+ // Handle dry-run mode
121
+ if (isDryRunMode(options)) {
122
+ outputDryRun(`Would delete storage bucket: ${bucketName}`, options);
123
+ if (!options.json) {
124
+ tui.newline();
125
+ tui.info('[DRY RUN] Storage bucket deletion skipped');
126
+ }
127
+ return {
128
+ success: false,
129
+ name: bucketName,
130
+ };
131
+ }
132
+ if (!opts.confirm) {
133
+ tui.warning(`You are about to delete storage bucket: ${tui.bold(bucketName)}`);
134
+ const confirm = await enquirer.prompt({
135
+ type: 'confirm',
136
+ name: 'confirm',
137
+ message: 'Are you sure you want to delete this storage bucket?',
138
+ initial: false,
139
+ });
140
+ if (!confirm.confirm) {
141
+ tui.info('Deletion cancelled');
142
+ return { success: false, name: bucketName };
143
+ }
144
+ }
145
+ const deleted = await tui.spinner({
146
+ message: `Deleting storage bucket ${bucketName}`,
147
+ clearOnSuccess: true,
148
+ callback: async () => {
149
+ return deleteResources(catalystClient, orgId, region, [
150
+ { type: 's3', name: bucketName },
151
+ ]);
152
+ },
153
+ });
154
+ if (deleted.length > 0) {
155
+ tui.success(`Deleted storage bucket: ${tui.bold(deleted[0])}`);
156
+ return {
157
+ success: true,
158
+ name: deleted[0],
159
+ };
160
+ }
161
+ else {
162
+ tui.error('Failed to delete storage bucket');
163
+ return { success: false, name: bucketName };
164
+ }
165
+ },
166
+ });
167
+ //# sourceMappingURL=delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../../src/cmd/cloud/storage/delete.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const downloadSubcommand: import("../../..").SubcommandDefinition;
2
+ //# sourceMappingURL=download.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../../../src/cmd/cloud/storage/download.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,kBAAkB,yCAgJ7B,CAAC"}
@@ -0,0 +1,131 @@
1
+ import { z } from 'zod';
2
+ import { listResources } from '@agentuity/server';
3
+ import { createSubcommand } from '../../../types';
4
+ import * as tui from '../../../tui';
5
+ import { getCatalystAPIClient } from '../../../config';
6
+ import { getCommand } from '../../../command-prefix';
7
+ import { ErrorCode } from '../../../errors';
8
+ import { createS3Client } from './utils';
9
+ export const downloadSubcommand = createSubcommand({
10
+ name: 'download',
11
+ description: 'Download a file from storage bucket',
12
+ tags: ['read-only', 'requires-auth'],
13
+ requires: { auth: true, org: true, region: true },
14
+ idempotent: true,
15
+ examples: [
16
+ `${getCommand('cloud storage download')} my-bucket file.txt`,
17
+ `${getCommand('cloud storage download')} my-bucket file.txt output.txt`,
18
+ `${getCommand('cloud storage download')} my-bucket file.txt - > output.txt`,
19
+ `${getCommand('cloud storage download')} my-bucket file.txt --metadata`,
20
+ ],
21
+ schema: {
22
+ args: z.object({
23
+ name: z.string().describe('Bucket name'),
24
+ filename: z.string().describe('File path to download'),
25
+ output: z.string().optional().describe('Output file path or "-" for STDOUT'),
26
+ }),
27
+ options: z.object({
28
+ metadata: z.boolean().optional().describe('Download metadata only (not file contents)'),
29
+ }),
30
+ response: z.object({
31
+ success: z.boolean().describe('Whether download succeeded'),
32
+ bucket: z.string().describe('Bucket name'),
33
+ filename: z.string().describe('Downloaded filename'),
34
+ size: z.number().optional().describe('File size in bytes'),
35
+ contentType: z.string().optional().describe('Content type'),
36
+ lastModified: z.string().optional().describe('Last modified timestamp'),
37
+ }),
38
+ },
39
+ async handler(ctx) {
40
+ const { logger, args, opts, options, orgId, region, config, auth } = ctx;
41
+ const catalystClient = getCatalystAPIClient(config, logger, auth);
42
+ // Fetch bucket credentials
43
+ const resources = await tui.spinner({
44
+ message: `Fetching credentials for ${args.name}`,
45
+ clearOnSuccess: true,
46
+ callback: async () => {
47
+ return listResources(catalystClient, orgId, region);
48
+ },
49
+ });
50
+ const bucket = resources.s3.find((s3) => s3.bucket_name === args.name);
51
+ if (!bucket) {
52
+ tui.fatal(`Storage bucket '${args.name}' not found`, ErrorCode.RESOURCE_NOT_FOUND);
53
+ }
54
+ if (!bucket.access_key || !bucket.secret_key || !bucket.endpoint) {
55
+ tui.fatal(`Storage bucket '${args.name}' is missing credentials`, ErrorCode.CONFIG_INVALID);
56
+ }
57
+ // Initialize S3 client
58
+ const s3Client = createS3Client({
59
+ endpoint: bucket.endpoint,
60
+ access_key: bucket.access_key,
61
+ secret_key: bucket.secret_key,
62
+ region: bucket.region,
63
+ });
64
+ if (opts.metadata) {
65
+ // Download metadata only
66
+ const metadata = await tui.spinner({
67
+ message: `Fetching metadata for ${args.filename}`,
68
+ clearOnSuccess: true,
69
+ callback: async () => {
70
+ return s3Client.stat(args.filename);
71
+ },
72
+ });
73
+ if (!options.json) {
74
+ console.log(tui.bold('File: ') + args.filename);
75
+ console.log(tui.bold('Bucket: ') + args.name);
76
+ if (metadata.size) {
77
+ console.log(tui.bold('Size: ') + metadata.size + ' bytes');
78
+ }
79
+ if (metadata.type) {
80
+ console.log(tui.bold('Content Type: ') + metadata.type);
81
+ }
82
+ if (metadata.lastModified) {
83
+ console.log(tui.bold('Last Modified: ') + metadata.lastModified);
84
+ }
85
+ }
86
+ return {
87
+ success: true,
88
+ bucket: args.name,
89
+ filename: args.filename,
90
+ size: metadata.size,
91
+ contentType: metadata.type,
92
+ lastModified: metadata.lastModified?.toISOString(),
93
+ };
94
+ }
95
+ // Download file content
96
+ const s3File = s3Client.file(args.filename);
97
+ const fileContent = await tui.spinner({
98
+ message: `Downloading ${args.filename} from ${args.name}`,
99
+ clearOnSuccess: true,
100
+ callback: async () => {
101
+ return Buffer.from(await s3File.arrayBuffer());
102
+ },
103
+ });
104
+ // Write to output or STDOUT
105
+ const outputPath = args.output || '-';
106
+ if (outputPath === '-') {
107
+ // Write to STDOUT
108
+ // When outputting to STDOUT in JSON mode, we can't mix file content with JSON
109
+ if (options.json) {
110
+ tui.fatal('Cannot use --json with STDOUT output. Use --metadata to get JSON metadata, or specify an output file.', ErrorCode.INVALID_ARGUMENT);
111
+ }
112
+ process.stdout.write(fileContent);
113
+ }
114
+ else {
115
+ // Write to file
116
+ await Bun.write(outputPath, fileContent);
117
+ if (!options.json) {
118
+ tui.success(`Downloaded ${tui.bold(args.filename)} to ${tui.bold(outputPath)} (${fileContent.length} bytes)`);
119
+ }
120
+ }
121
+ return {
122
+ success: true,
123
+ bucket: args.name,
124
+ filename: args.filename,
125
+ size: fileContent.length,
126
+ contentType: s3File.type,
127
+ lastModified: undefined,
128
+ };
129
+ },
130
+ });
131
+ //# sourceMappingURL=download.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download.js","sourceRoot":"","sources":["../../../../src/cmd/cloud/storage/download.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const getSubcommand: import("../../..").SubcommandDefinition;
2
+ //# sourceMappingURL=get.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.d.ts","sourceRoot":"","sources":["../../../../src/cmd/cloud/storage/get.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,aAAa,yCAgFxB,CAAC"}
@@ -0,0 +1,86 @@
1
+ import { z } from 'zod';
2
+ import { listResources } from '@agentuity/server';
3
+ import { createSubcommand } from '../../../types';
4
+ import * as tui from '../../../tui';
5
+ import { getCatalystAPIClient } from '../../../config';
6
+ import { getCommand } from '../../../command-prefix';
7
+ import { ErrorCode } from '../../../errors';
8
+ const StorageGetResponseSchema = z.object({
9
+ bucket_name: z.string().describe('Storage bucket name'),
10
+ access_key: z.string().optional().describe('S3 access key'),
11
+ secret_key: z.string().optional().describe('S3 secret key'),
12
+ region: z.string().optional().describe('S3 region'),
13
+ endpoint: z.string().optional().describe('S3 endpoint URL'),
14
+ });
15
+ export const getSubcommand = createSubcommand({
16
+ name: 'get',
17
+ aliases: ['show'],
18
+ description: 'Show details about a specific storage bucket',
19
+ tags: ['read-only', 'fast', 'requires-auth'],
20
+ requires: { auth: true, org: true, region: true },
21
+ idempotent: true,
22
+ examples: [
23
+ `${getCommand('cloud storage get')} my-bucket`,
24
+ `${getCommand('cloud storage show')} my-bucket`,
25
+ `${getCommand('cloud storage get')} my-bucket --show-credentials`,
26
+ ],
27
+ schema: {
28
+ args: z.object({
29
+ name: z.string().describe('Bucket name'),
30
+ }),
31
+ options: z.object({
32
+ showCredentials: z
33
+ .boolean()
34
+ .optional()
35
+ .describe('Show credentials in plain text (default: masked in terminal, unmasked in JSON)'),
36
+ }),
37
+ response: StorageGetResponseSchema,
38
+ },
39
+ async handler(ctx) {
40
+ const { logger, args, opts, options, orgId, region, config, auth } = ctx;
41
+ const catalystClient = getCatalystAPIClient(config, logger, auth);
42
+ const resources = await tui.spinner({
43
+ message: `Fetching storage bucket ${args.name}`,
44
+ clearOnSuccess: true,
45
+ callback: async () => {
46
+ return listResources(catalystClient, orgId, region);
47
+ },
48
+ });
49
+ const bucket = resources.s3.find((s3) => s3.bucket_name === args.name);
50
+ if (!bucket) {
51
+ tui.fatal(`Storage bucket '${args.name}' not found`, ErrorCode.RESOURCE_NOT_FOUND);
52
+ }
53
+ // Mask credentials in terminal output by default, unless --show-credentials is passed
54
+ const shouldShowCredentials = opts.showCredentials === true;
55
+ const shouldMask = !options.json && !shouldShowCredentials;
56
+ if (!options.json) {
57
+ console.log(tui.bold('Bucket Name: ') + bucket.bucket_name);
58
+ if (bucket.access_key) {
59
+ const displayAccessKey = shouldMask
60
+ ? tui.maskSecret(bucket.access_key)
61
+ : bucket.access_key;
62
+ console.log(tui.bold('Access Key: ') + displayAccessKey);
63
+ }
64
+ if (bucket.secret_key) {
65
+ const displaySecretKey = shouldMask
66
+ ? tui.maskSecret(bucket.secret_key)
67
+ : bucket.secret_key;
68
+ console.log(tui.bold('Secret Key: ') + displaySecretKey);
69
+ }
70
+ if (bucket.region) {
71
+ console.log(tui.bold('Region: ') + bucket.region);
72
+ }
73
+ if (bucket.endpoint) {
74
+ console.log(tui.bold('Endpoint: ') + bucket.endpoint);
75
+ }
76
+ }
77
+ return {
78
+ bucket_name: bucket.bucket_name,
79
+ access_key: bucket.access_key ?? undefined,
80
+ secret_key: bucket.secret_key ?? undefined,
81
+ region: bucket.region ?? undefined,
82
+ endpoint: bucket.endpoint ?? undefined,
83
+ };
84
+ },
85
+ });
86
+ //# sourceMappingURL=get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get.js","sourceRoot":"","sources":["../../../../src/cmd/cloud/storage/get.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;IACvD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;IAC3D,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;IAC3D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;IACnD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;CAC3D,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,gBAAgB,CAAC;IAC7C,IAAI,EAAE,KAAK;IACX,OAAO,EAAE,CAAC,MAAM,CAAC;IACjB,WAAW,EAAE,8CAA8C;IAC3D,IAAI,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,eAAe,CAAC;IAC5C,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IACjD,UAAU,EAAE,IAAI;IAChB,QAAQ,EAAE;QACT,GAAG,UAAU,CAAC,mBAAmB,CAAC,YAAY;QAC9C,GAAG,UAAU,CAAC,oBAAoB,CAAC,YAAY;QAC/C,GAAG,UAAU,CAAC,mBAAmB,CAAC,+BAA+B;KACjE;IACD,MAAM,EAAE;QACP,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;SACxC,CAAC;QACF,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;YACjB,eAAe,EAAE,CAAC;iBAChB,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,QAAQ,CACR,gFAAgF,CAChF;SACF,CAAC;QACF,QAAQ,EAAE,wBAAwB;KAClC;IAED,KAAK,CAAC,OAAO,CAAC,GAAG;QAChB,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC;QAEzE,MAAM,cAAc,GAAG,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QAElE,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC;YACnC,OAAO,EAAE,2BAA2B,IAAI,CAAC,IAAI,EAAE;YAC/C,cAAc,EAAE,IAAI;YACpB,QAAQ,EAAE,KAAK,IAAI,EAAE;gBACpB,OAAO,aAAa,CAAC,cAAc,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YACrD,CAAC;SACD,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,WAAW,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC;QAEvE,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,GAAG,CAAC,KAAK,CAAC,mBAAmB,IAAI,CAAC,IAAI,aAAa,EAAE,SAAS,CAAC,kBAAkB,CAAC,CAAC;QACpF,CAAC;QAED,sFAAsF;QACtF,MAAM,qBAAqB,GAAG,IAAI,CAAC,eAAe,KAAK,IAAI,CAAC;QAC5D,MAAM,UAAU,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,qBAAqB,CAAC;QAE3D,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;YAC5D,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gBACvB,MAAM,gBAAgB,GAAG,UAAU;oBAClC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC;oBACnC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;gBACrB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,gBAAgB,CAAC,CAAC;YAC3D,CAAC;YACD,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gBACvB,MAAM,gBAAgB,GAAG,UAAU;oBAClC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC;oBACnC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;gBACrB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,gBAAgB,CAAC,CAAC;YAC3D,CAAC;YACD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;YACxD,CAAC;YACD,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACrB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC1D,CAAC;QACF,CAAC;QAED,OAAO;YACN,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,SAAS;YAC1C,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,SAAS;YAC1C,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,SAAS;YAClC,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,SAAS;SACtC,CAAC;IACH,CAAC;CACD,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const storageCommand: import("../../..").CommandDefinition;
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cmd/cloud/storage/index.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,cAAc,sCAazB,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { createCommand } from '../../../types';
2
+ import { createSubcommand } from './create';
3
+ import { listSubcommand } from './list';
4
+ import { deleteSubcommand } from './delete';
5
+ import { getSubcommand } from './get';
6
+ import { uploadSubcommand } from './upload';
7
+ import { downloadSubcommand } from './download';
8
+ export const storageCommand = createCommand({
9
+ name: 'storage',
10
+ aliases: ['s3'],
11
+ description: 'Manage storage resources',
12
+ tags: ['slow', 'requires-auth', 'requires-deployment'],
13
+ subcommands: [
14
+ createSubcommand,
15
+ listSubcommand,
16
+ getSubcommand,
17
+ uploadSubcommand,
18
+ downloadSubcommand,
19
+ deleteSubcommand,
20
+ ],
21
+ });
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cmd/cloud/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAC;IAC3C,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,CAAC,IAAI,CAAC;IACf,WAAW,EAAE,0BAA0B;IACvC,IAAI,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,qBAAqB,CAAC;IACtD,WAAW,EAAE;QACZ,gBAAgB;QAChB,cAAc;QACd,aAAa;QACb,gBAAgB;QAChB,kBAAkB;QAClB,gBAAgB;KAChB;CACD,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const listSubcommand: import("../../..").SubcommandDefinition;
2
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../../src/cmd/cloud/storage/list.ts"],"names":[],"mappings":"AAkCA,eAAO,MAAM,cAAc,yCAkKzB,CAAC"}
@@ -0,0 +1,170 @@
1
+ import { z } from 'zod';
2
+ import { listResources } from '@agentuity/server';
3
+ import { createSubcommand } from '../../../types';
4
+ import * as tui from '../../../tui';
5
+ import { getCatalystAPIClient } from '../../../config';
6
+ import { getCommand } from '../../../command-prefix';
7
+ import { ErrorCode } from '../../../errors';
8
+ import { createS3Client } from './utils';
9
+ const StorageListResponseSchema = z.object({
10
+ buckets: z
11
+ .array(z.object({
12
+ bucket_name: z.string().describe('Storage bucket name'),
13
+ access_key: z.string().optional().describe('S3 access key'),
14
+ secret_key: z.string().optional().describe('S3 secret key'),
15
+ region: z.string().optional().describe('S3 region'),
16
+ endpoint: z.string().optional().describe('S3 endpoint URL'),
17
+ }))
18
+ .optional()
19
+ .describe('List of storage resources'),
20
+ files: z
21
+ .array(z.object({
22
+ key: z.string().describe('File key/path'),
23
+ size: z.number().describe('File size in bytes'),
24
+ lastModified: z.string().describe('Last modified timestamp'),
25
+ }))
26
+ .optional()
27
+ .describe('List of files in bucket'),
28
+ });
29
+ export const listSubcommand = createSubcommand({
30
+ name: 'list',
31
+ aliases: ['ls'],
32
+ description: 'List storage resources or files in a bucket',
33
+ tags: ['read-only', 'fast', 'requires-auth'],
34
+ requires: { auth: true, org: true, region: true },
35
+ idempotent: true,
36
+ examples: [
37
+ getCommand('cloud storage list'),
38
+ getCommand('cloud storage list my-bucket'),
39
+ getCommand('cloud storage list my-bucket path/prefix'),
40
+ getCommand('--json cloud storage list'),
41
+ getCommand('cloud storage ls'),
42
+ getCommand('cloud storage list --show-credentials'),
43
+ ],
44
+ schema: {
45
+ args: z.object({
46
+ name: z.string().optional().describe('Bucket name to list files from'),
47
+ prefix: z.string().optional().describe('Path prefix to filter files'),
48
+ }),
49
+ options: z.object({
50
+ showCredentials: z
51
+ .boolean()
52
+ .optional()
53
+ .describe('Show credentials in plain text (default: masked in terminal, unmasked in JSON)'),
54
+ }),
55
+ response: StorageListResponseSchema,
56
+ },
57
+ async handler(ctx) {
58
+ const { logger, args, opts, options, orgId, region, config, auth } = ctx;
59
+ const catalystClient = getCatalystAPIClient(config, logger, auth);
60
+ const resources = await tui.spinner({
61
+ message: `Fetching storage for ${orgId} in ${region}`,
62
+ clearOnSuccess: true,
63
+ callback: async () => {
64
+ return listResources(catalystClient, orgId, region);
65
+ },
66
+ });
67
+ // If bucket name is provided, list files in the bucket
68
+ if (args.name) {
69
+ const bucket = resources.s3.find((s3) => s3.bucket_name === args.name);
70
+ if (!bucket) {
71
+ tui.fatal(`Storage bucket '${args.name}' not found`, ErrorCode.RESOURCE_NOT_FOUND);
72
+ }
73
+ if (!bucket.access_key || !bucket.secret_key || !bucket.endpoint) {
74
+ tui.fatal(`Storage bucket '${args.name}' is missing credentials`, ErrorCode.CONFIG_INVALID);
75
+ }
76
+ const s3Client = createS3Client({
77
+ endpoint: bucket.endpoint,
78
+ access_key: bucket.access_key,
79
+ secret_key: bucket.secret_key,
80
+ region: bucket.region,
81
+ });
82
+ const result = await tui.spinner({
83
+ message: `Listing files in ${args.name}${args.prefix ? ` with prefix ${args.prefix}` : ''}`,
84
+ clearOnSuccess: true,
85
+ callback: async () => {
86
+ return s3Client.list(args.prefix
87
+ ? {
88
+ prefix: args.prefix,
89
+ }
90
+ : null);
91
+ },
92
+ });
93
+ const objects = result.contents || [];
94
+ if (!options.json) {
95
+ if (objects.length === 0) {
96
+ tui.info('No files found');
97
+ }
98
+ else {
99
+ tui.info(tui.bold(`Files in ${args.name}${args.prefix ? ` (prefix: ${args.prefix})` : ''}`));
100
+ tui.newline();
101
+ for (const obj of objects) {
102
+ console.log(`${obj.key} ${tui.muted(`(${obj.size} bytes, ${obj.lastModified})`)}`);
103
+ }
104
+ }
105
+ }
106
+ return {
107
+ files: objects.map((obj) => {
108
+ const lastModified = obj.lastModified;
109
+ let lastModifiedStr = '';
110
+ if (typeof lastModified === 'string') {
111
+ lastModifiedStr = lastModified;
112
+ }
113
+ else if (lastModified &&
114
+ typeof lastModified === 'object' &&
115
+ 'toISOString' in lastModified) {
116
+ lastModifiedStr = lastModified.toISOString();
117
+ }
118
+ return {
119
+ key: obj.key,
120
+ size: obj.size ?? 0,
121
+ lastModified: lastModifiedStr,
122
+ };
123
+ }),
124
+ };
125
+ }
126
+ // Otherwise, list buckets
127
+ // Mask credentials in terminal output by default, unless --show-credentials is passed
128
+ const shouldShowCredentials = opts.showCredentials === true;
129
+ const shouldMask = !options.json && !shouldShowCredentials;
130
+ if (!options.json) {
131
+ if (resources.s3.length === 0) {
132
+ tui.info('No storage buckets found');
133
+ }
134
+ else {
135
+ tui.info(tui.bold('Storage'));
136
+ tui.newline();
137
+ for (const s3 of resources.s3) {
138
+ console.log(tui.bold(s3.bucket_name));
139
+ if (s3.access_key) {
140
+ const displayAccessKey = shouldMask
141
+ ? tui.maskSecret(s3.access_key)
142
+ : s3.access_key;
143
+ console.log(` Access Key: ${tui.muted(displayAccessKey)}`);
144
+ }
145
+ if (s3.secret_key) {
146
+ const displaySecretKey = shouldMask
147
+ ? tui.maskSecret(s3.secret_key)
148
+ : s3.secret_key;
149
+ console.log(` Secret Key: ${tui.muted(displaySecretKey)}`);
150
+ }
151
+ if (s3.region)
152
+ console.log(` Region: ${tui.muted(s3.region)}`);
153
+ if (s3.endpoint)
154
+ console.log(` Endpoint: ${tui.muted(s3.endpoint)}`);
155
+ tui.newline();
156
+ }
157
+ }
158
+ }
159
+ return {
160
+ buckets: resources.s3.map((s3) => ({
161
+ bucket_name: s3.bucket_name,
162
+ access_key: s3.access_key ?? undefined,
163
+ secret_key: s3.secret_key ?? undefined,
164
+ region: s3.region ?? undefined,
165
+ endpoint: s3.endpoint ?? undefined,
166
+ })),
167
+ };
168
+ },
169
+ });
170
+ //# sourceMappingURL=list.js.map