@agentuity/cli 0.0.110 → 0.0.111

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 (193) hide show
  1. package/dist/cli.d.ts.map +1 -1
  2. package/dist/cli.js +19 -4
  3. package/dist/cli.js.map +1 -1
  4. package/dist/cmd/build/vite/agent-discovery.d.ts +1 -1
  5. package/dist/cmd/build/vite/agent-discovery.d.ts.map +1 -1
  6. package/dist/cmd/build/vite/agent-discovery.js +3 -3
  7. package/dist/cmd/build/vite/agent-discovery.js.map +1 -1
  8. package/dist/cmd/build/vite/index.js +1 -1
  9. package/dist/cmd/build/vite/index.js.map +1 -1
  10. package/dist/cmd/build/vite/metadata-generator.js +1 -1
  11. package/dist/cmd/build/vite/metadata-generator.js.map +1 -1
  12. package/dist/cmd/build/vite/registry-generator.d.ts +1 -1
  13. package/dist/cmd/build/vite/registry-generator.d.ts.map +1 -1
  14. package/dist/cmd/build/vite/registry-generator.js +70 -23
  15. package/dist/cmd/build/vite/registry-generator.js.map +1 -1
  16. package/dist/cmd/build/vite/route-discovery.d.ts +6 -0
  17. package/dist/cmd/build/vite/route-discovery.d.ts.map +1 -1
  18. package/dist/cmd/build/vite/route-discovery.js +19 -0
  19. package/dist/cmd/build/vite/route-discovery.js.map +1 -1
  20. package/dist/cmd/build/vite/vite-builder.js +1 -1
  21. package/dist/cmd/build/vite/vite-builder.js.map +1 -1
  22. package/dist/cmd/cloud/deploy.d.ts.map +1 -1
  23. package/dist/cmd/cloud/deploy.js +63 -1
  24. package/dist/cmd/cloud/deploy.js.map +1 -1
  25. package/dist/cmd/cloud/sandbox/create.d.ts.map +1 -1
  26. package/dist/cmd/cloud/sandbox/create.js +18 -0
  27. package/dist/cmd/cloud/sandbox/create.js.map +1 -1
  28. package/dist/cmd/cloud/sandbox/delete.d.ts.map +1 -1
  29. package/dist/cmd/cloud/sandbox/delete.js +2 -6
  30. package/dist/cmd/cloud/sandbox/delete.js.map +1 -1
  31. package/dist/cmd/cloud/sandbox/download.d.ts +3 -0
  32. package/dist/cmd/cloud/sandbox/download.d.ts.map +1 -0
  33. package/dist/cmd/cloud/sandbox/download.js +89 -0
  34. package/dist/cmd/cloud/sandbox/download.js.map +1 -0
  35. package/dist/cmd/cloud/sandbox/env.d.ts +3 -0
  36. package/dist/cmd/cloud/sandbox/env.d.ts.map +1 -0
  37. package/dist/cmd/cloud/sandbox/env.js +90 -0
  38. package/dist/cmd/cloud/sandbox/env.js.map +1 -0
  39. package/dist/cmd/cloud/sandbox/get.d.ts.map +1 -1
  40. package/dist/cmd/cloud/sandbox/get.js +5 -0
  41. package/dist/cmd/cloud/sandbox/get.js.map +1 -1
  42. package/dist/cmd/cloud/sandbox/index.d.ts.map +1 -1
  43. package/dist/cmd/cloud/sandbox/index.js +14 -0
  44. package/dist/cmd/cloud/sandbox/index.js.map +1 -1
  45. package/dist/cmd/cloud/sandbox/ls.d.ts +3 -0
  46. package/dist/cmd/cloud/sandbox/ls.d.ts.map +1 -0
  47. package/dist/cmd/cloud/sandbox/ls.js +119 -0
  48. package/dist/cmd/cloud/sandbox/ls.js.map +1 -0
  49. package/dist/cmd/cloud/sandbox/mkdir.d.ts +3 -0
  50. package/dist/cmd/cloud/sandbox/mkdir.d.ts.map +1 -0
  51. package/dist/cmd/cloud/sandbox/mkdir.js +59 -0
  52. package/dist/cmd/cloud/sandbox/mkdir.js.map +1 -0
  53. package/dist/cmd/cloud/sandbox/rm.d.ts +3 -0
  54. package/dist/cmd/cloud/sandbox/rm.d.ts.map +1 -0
  55. package/dist/cmd/cloud/sandbox/rm.js +45 -0
  56. package/dist/cmd/cloud/sandbox/rm.js.map +1 -0
  57. package/dist/cmd/cloud/sandbox/rmdir.d.ts +3 -0
  58. package/dist/cmd/cloud/sandbox/rmdir.d.ts.map +1 -0
  59. package/dist/cmd/cloud/sandbox/rmdir.js +59 -0
  60. package/dist/cmd/cloud/sandbox/rmdir.js.map +1 -0
  61. package/dist/cmd/cloud/sandbox/snapshot/create.d.ts.map +1 -1
  62. package/dist/cmd/cloud/sandbox/snapshot/create.js +0 -2
  63. package/dist/cmd/cloud/sandbox/snapshot/create.js.map +1 -1
  64. package/dist/cmd/cloud/sandbox/snapshot/get.d.ts.map +1 -1
  65. package/dist/cmd/cloud/sandbox/snapshot/get.js +0 -2
  66. package/dist/cmd/cloud/sandbox/snapshot/get.js.map +1 -1
  67. package/dist/cmd/cloud/sandbox/snapshot/list.d.ts.map +1 -1
  68. package/dist/cmd/cloud/sandbox/snapshot/list.js +0 -3
  69. package/dist/cmd/cloud/sandbox/snapshot/list.js.map +1 -1
  70. package/dist/cmd/cloud/sandbox/upload.d.ts +3 -0
  71. package/dist/cmd/cloud/sandbox/upload.d.ts.map +1 -0
  72. package/dist/cmd/cloud/sandbox/upload.js +77 -0
  73. package/dist/cmd/cloud/sandbox/upload.js.map +1 -0
  74. package/dist/cmd/dev/index.d.ts.map +1 -1
  75. package/dist/cmd/dev/index.js +17 -8
  76. package/dist/cmd/dev/index.js.map +1 -1
  77. package/dist/cmd/dev/sync.d.ts.map +1 -1
  78. package/dist/cmd/dev/sync.js +8 -14
  79. package/dist/cmd/dev/sync.js.map +1 -1
  80. package/dist/cmd/git/account/add.d.ts +17 -0
  81. package/dist/cmd/git/account/add.d.ts.map +1 -0
  82. package/dist/cmd/git/account/add.js +244 -0
  83. package/dist/cmd/git/account/add.js.map +1 -0
  84. package/dist/cmd/git/account/index.d.ts +3 -0
  85. package/dist/cmd/git/account/index.d.ts.map +1 -0
  86. package/dist/cmd/git/account/index.js +11 -0
  87. package/dist/cmd/git/account/index.js.map +1 -0
  88. package/dist/cmd/git/account/list.d.ts +2 -0
  89. package/dist/cmd/git/account/list.d.ts.map +1 -0
  90. package/dist/cmd/git/account/list.js +111 -0
  91. package/dist/cmd/git/account/list.js.map +1 -0
  92. package/dist/cmd/git/account/remove.d.ts +2 -0
  93. package/dist/cmd/git/account/remove.d.ts.map +1 -0
  94. package/dist/cmd/git/account/remove.js +171 -0
  95. package/dist/cmd/git/account/remove.js.map +1 -0
  96. package/dist/cmd/git/index.d.ts +3 -0
  97. package/dist/cmd/git/index.d.ts.map +1 -0
  98. package/dist/cmd/git/index.js +19 -0
  99. package/dist/cmd/git/index.js.map +1 -0
  100. package/dist/cmd/git/link.d.ts +32 -0
  101. package/dist/cmd/git/link.d.ts.map +1 -0
  102. package/dist/cmd/git/link.js +357 -0
  103. package/dist/cmd/git/link.js.map +1 -0
  104. package/dist/cmd/git/list.d.ts +2 -0
  105. package/dist/cmd/git/list.d.ts.map +1 -0
  106. package/dist/cmd/git/list.js +137 -0
  107. package/dist/cmd/git/list.js.map +1 -0
  108. package/dist/cmd/git/status.d.ts +2 -0
  109. package/dist/cmd/git/status.d.ts.map +1 -0
  110. package/dist/cmd/git/status.js +119 -0
  111. package/dist/cmd/git/status.js.map +1 -0
  112. package/dist/cmd/git/unlink.d.ts +2 -0
  113. package/dist/cmd/git/unlink.d.ts.map +1 -0
  114. package/dist/cmd/git/unlink.js +98 -0
  115. package/dist/cmd/git/unlink.js.map +1 -0
  116. package/dist/cmd/index.d.ts.map +1 -1
  117. package/dist/cmd/index.js +2 -0
  118. package/dist/cmd/index.js.map +1 -1
  119. package/dist/cmd/integration/api.d.ts +61 -0
  120. package/dist/cmd/integration/api.d.ts.map +1 -0
  121. package/dist/cmd/integration/api.js +176 -0
  122. package/dist/cmd/integration/api.js.map +1 -0
  123. package/dist/cmd/integration/github/connect.d.ts +2 -0
  124. package/dist/cmd/integration/github/connect.d.ts.map +1 -0
  125. package/dist/cmd/integration/github/connect.js +197 -0
  126. package/dist/cmd/integration/github/connect.js.map +1 -0
  127. package/dist/cmd/integration/github/disconnect.d.ts +2 -0
  128. package/dist/cmd/integration/github/disconnect.d.ts.map +1 -0
  129. package/dist/cmd/integration/github/disconnect.js +121 -0
  130. package/dist/cmd/integration/github/disconnect.js.map +1 -0
  131. package/dist/cmd/integration/github/index.d.ts +2 -0
  132. package/dist/cmd/integration/github/index.d.ts.map +1 -0
  133. package/dist/cmd/integration/github/index.js +21 -0
  134. package/dist/cmd/integration/github/index.js.map +1 -0
  135. package/dist/cmd/integration/index.d.ts +2 -0
  136. package/dist/cmd/integration/index.d.ts.map +1 -0
  137. package/dist/cmd/integration/index.js +16 -0
  138. package/dist/cmd/integration/index.js.map +1 -0
  139. package/dist/config.d.ts +2 -0
  140. package/dist/config.d.ts.map +1 -1
  141. package/dist/config.js +24 -0
  142. package/dist/config.js.map +1 -1
  143. package/dist/errors.d.ts +2 -1
  144. package/dist/errors.d.ts.map +1 -1
  145. package/dist/errors.js +5 -0
  146. package/dist/errors.js.map +1 -1
  147. package/dist/types.d.ts +2 -1
  148. package/dist/types.d.ts.map +1 -1
  149. package/dist/types.js +4 -0
  150. package/dist/types.js.map +1 -1
  151. package/package.json +6 -6
  152. package/src/cli.ts +20 -4
  153. package/src/cmd/build/vite/agent-discovery.ts +4 -4
  154. package/src/cmd/build/vite/index.ts +1 -1
  155. package/src/cmd/build/vite/metadata-generator.ts +1 -1
  156. package/src/cmd/build/vite/registry-generator.ts +78 -24
  157. package/src/cmd/build/vite/route-discovery.ts +20 -0
  158. package/src/cmd/build/vite/vite-builder.ts +1 -1
  159. package/src/cmd/cloud/deploy.ts +78 -1
  160. package/src/cmd/cloud/sandbox/create.ts +22 -0
  161. package/src/cmd/cloud/sandbox/delete.ts +2 -6
  162. package/src/cmd/cloud/sandbox/download.ts +96 -0
  163. package/src/cmd/cloud/sandbox/env.ts +104 -0
  164. package/src/cmd/cloud/sandbox/get.ts +5 -0
  165. package/src/cmd/cloud/sandbox/index.ts +14 -0
  166. package/src/cmd/cloud/sandbox/ls.ts +126 -0
  167. package/src/cmd/cloud/sandbox/mkdir.ts +65 -0
  168. package/src/cmd/cloud/sandbox/rm.ts +51 -0
  169. package/src/cmd/cloud/sandbox/rmdir.ts +65 -0
  170. package/src/cmd/cloud/sandbox/snapshot/create.ts +0 -2
  171. package/src/cmd/cloud/sandbox/snapshot/get.ts +0 -2
  172. package/src/cmd/cloud/sandbox/snapshot/list.ts +0 -3
  173. package/src/cmd/cloud/sandbox/upload.ts +83 -0
  174. package/src/cmd/dev/index.ts +32 -19
  175. package/src/cmd/dev/sync.ts +26 -30
  176. package/src/cmd/git/account/add.ts +317 -0
  177. package/src/cmd/git/account/index.ts +12 -0
  178. package/src/cmd/git/account/list.ts +139 -0
  179. package/src/cmd/git/account/remove.ts +212 -0
  180. package/src/cmd/git/index.ts +20 -0
  181. package/src/cmd/git/link.ts +468 -0
  182. package/src/cmd/git/list.ts +161 -0
  183. package/src/cmd/git/status.ts +144 -0
  184. package/src/cmd/git/unlink.ts +117 -0
  185. package/src/cmd/index.ts +2 -0
  186. package/src/cmd/integration/api.ts +379 -0
  187. package/src/cmd/integration/github/connect.ts +242 -0
  188. package/src/cmd/integration/github/disconnect.ts +149 -0
  189. package/src/cmd/integration/github/index.ts +21 -0
  190. package/src/cmd/integration/index.ts +16 -0
  191. package/src/config.ts +34 -0
  192. package/src/errors.ts +7 -0
  193. package/src/types.ts +4 -0
@@ -0,0 +1,104 @@
1
+ import { z } from 'zod';
2
+ import { createCommand } from '../../../types';
3
+ import * as tui from '../../../tui';
4
+ import { createSandboxClient } from './util';
5
+ import { getCommand } from '../../../command-prefix';
6
+ import { sandboxSetEnv } from '@agentuity/server';
7
+
8
+ export const envSubcommand = createCommand({
9
+ name: 'env',
10
+ description: 'Set or delete environment variables on a sandbox',
11
+ tags: ['slow', 'requires-auth'],
12
+ requires: { auth: true, region: true, org: true },
13
+ examples: [
14
+ {
15
+ command: getCommand('cloud sandbox env sbx_abc123 MY_VAR=value'),
16
+ description: 'Set an environment variable',
17
+ },
18
+ {
19
+ command: getCommand('cloud sandbox env sbx_abc123 VAR1=value1 VAR2=value2'),
20
+ description: 'Set multiple environment variables',
21
+ },
22
+ {
23
+ command: getCommand('cloud sandbox env sbx_abc123 --delete MY_VAR'),
24
+ description: 'Delete an environment variable',
25
+ },
26
+ ],
27
+ schema: {
28
+ args: z.object({
29
+ sandboxId: z.string().describe('The sandbox ID'),
30
+ vars: z.array(z.string()).optional().describe('Environment variables (KEY=VALUE format)'),
31
+ }),
32
+ options: z.object({
33
+ delete: z.array(z.string()).optional().describe('Environment variable names to delete'),
34
+ }),
35
+ aliases: {
36
+ delete: ['d'],
37
+ },
38
+ response: z.object({
39
+ success: z.boolean(),
40
+ env: z.record(z.string(), z.string()),
41
+ }),
42
+ },
43
+
44
+ async handler(ctx) {
45
+ const { args, opts, options, auth, region, logger, orgId } = ctx;
46
+
47
+ const client = createSandboxClient(logger, auth, region);
48
+
49
+ const envMap: Record<string, string | null> = {};
50
+
51
+ if (args.vars) {
52
+ for (const varSpec of args.vars) {
53
+ const eqIndex = varSpec.indexOf('=');
54
+ if (eqIndex === -1) {
55
+ logger.fatal(
56
+ `Invalid environment variable format: ${varSpec}. Use KEY=VALUE format.`
57
+ );
58
+ }
59
+ const key = varSpec.slice(0, eqIndex);
60
+ const value = varSpec.slice(eqIndex + 1);
61
+ envMap[key] = value;
62
+ }
63
+ }
64
+
65
+ if (opts.delete) {
66
+ for (const key of opts.delete) {
67
+ envMap[key] = null;
68
+ }
69
+ }
70
+
71
+ if (Object.keys(envMap).length === 0) {
72
+ logger.fatal('No environment variables specified. Use KEY=VALUE or --delete KEY');
73
+ }
74
+
75
+ const result = await sandboxSetEnv(client, {
76
+ sandboxId: args.sandboxId,
77
+ env: envMap,
78
+ orgId,
79
+ });
80
+
81
+ if (!options.json) {
82
+ const setVars = Object.entries(envMap).filter(([_, v]) => v !== null);
83
+ const deletedVars = Object.entries(envMap).filter(([_, v]) => v === null);
84
+
85
+ if (setVars.length > 0) {
86
+ tui.success(`Set ${setVars.length} environment variable(s)`);
87
+ }
88
+ if (deletedVars.length > 0) {
89
+ tui.success(`Deleted ${deletedVars.length} environment variable(s)`);
90
+ }
91
+
92
+ if (Object.keys(result.env).length > 0) {
93
+ console.log('\nCurrent environment:');
94
+ for (const [key, value] of Object.entries(result.env)) {
95
+ console.log(` ${key}=${value}`);
96
+ }
97
+ }
98
+ }
99
+
100
+ return { success: true, env: result.env };
101
+ },
102
+ });
103
+
104
+ export default envSubcommand;
@@ -16,6 +16,7 @@ const SandboxGetResponseSchema = z.object({
16
16
  stdoutStreamUrl: z.string().optional().describe('URL to stdout output stream'),
17
17
  stderrStreamUrl: z.string().optional().describe('URL to stderr output stream'),
18
18
  dependencies: z.array(z.string()).optional().describe('Apt packages installed'),
19
+ metadata: z.record(z.string(), z.unknown()).optional().describe('User-defined metadata'),
19
20
  });
20
21
 
21
22
  export const getSubcommand = createCommand({
@@ -84,6 +85,9 @@ export const getSubcommand = createCommand({
84
85
  if (result.dependencies && result.dependencies.length > 0) {
85
86
  console.log(`${tui.muted('Dependencies:')} ${result.dependencies.join(', ')}`);
86
87
  }
88
+ if (result.metadata && Object.keys(result.metadata).length > 0) {
89
+ console.log(`${tui.muted('Metadata:')} ${JSON.stringify(result.metadata)}`);
90
+ }
87
91
  }
88
92
 
89
93
  return {
@@ -97,6 +101,7 @@ export const getSubcommand = createCommand({
97
101
  stdoutStreamUrl: result.stdoutStreamUrl,
98
102
  stderrStreamUrl: result.stderrStreamUrl,
99
103
  dependencies: result.dependencies,
104
+ metadata: result.metadata,
100
105
  };
101
106
  },
102
107
  });
@@ -8,6 +8,13 @@ import { deleteSubcommand } from './delete';
8
8
  import { snapshotCommand } from './snapshot';
9
9
  import { cpSubcommand } from './cp';
10
10
  import { command as executionCommand } from './execution';
11
+ import { mkdirSubcommand } from './mkdir';
12
+ import { rmdirSubcommand } from './rmdir';
13
+ import { rmSubcommand } from './rm';
14
+ import { lsSubcommand } from './ls';
15
+ import { downloadSubcommand } from './download';
16
+ import { uploadSubcommand } from './upload';
17
+ import { envSubcommand } from './env';
11
18
  import { getCommand } from '../../../command-prefix';
12
19
 
13
20
  export const command = createCommand({
@@ -39,6 +46,13 @@ export const command = createCommand({
39
46
  snapshotCommand,
40
47
  cpSubcommand,
41
48
  executionCommand,
49
+ mkdirSubcommand,
50
+ rmdirSubcommand,
51
+ rmSubcommand,
52
+ lsSubcommand,
53
+ downloadSubcommand,
54
+ uploadSubcommand,
55
+ envSubcommand,
42
56
  ],
43
57
  requires: { auth: true, region: true, org: true },
44
58
  });
@@ -0,0 +1,126 @@
1
+ import { z } from 'zod';
2
+ import { createCommand } from '../../../types';
3
+ import * as tui from '../../../tui';
4
+ import { createSandboxClient } from './util';
5
+ import { getCommand } from '../../../command-prefix';
6
+ import { sandboxListFiles } from '@agentuity/server';
7
+
8
+ const FileInfoSchema = z.object({
9
+ path: z.string(),
10
+ size: z.number(),
11
+ isDir: z.boolean(),
12
+ mode: z.string(),
13
+ modTime: z.string(),
14
+ });
15
+
16
+ const LsResponseSchema = z.object({
17
+ files: z.array(FileInfoSchema),
18
+ total: z.number(),
19
+ });
20
+
21
+ export const lsSubcommand = createCommand({
22
+ name: 'files',
23
+ aliases: ['lsf'],
24
+ description: 'List files in a sandbox directory',
25
+ tags: ['slow', 'requires-auth'],
26
+ requires: { auth: true, region: true, org: true },
27
+ examples: [
28
+ {
29
+ command: getCommand('cloud sandbox files sbx_abc123'),
30
+ description: 'List files in the sandbox root directory',
31
+ },
32
+ {
33
+ command: getCommand('cloud sandbox files sbx_abc123 /path/to/dir'),
34
+ description: 'List files in a specific directory',
35
+ },
36
+ {
37
+ command: getCommand('cloud sandbox files sbx_abc123 -l'),
38
+ description: 'List files with permissions and modification time',
39
+ },
40
+ {
41
+ command: getCommand('cloud sandbox files sbx_abc123 --json'),
42
+ description: 'List files with JSON output',
43
+ },
44
+ ],
45
+ schema: {
46
+ args: z.object({
47
+ sandboxId: z.string().describe('The sandbox ID'),
48
+ path: z.string().optional().describe('Path to list (defaults to root)'),
49
+ }),
50
+ options: z.object({
51
+ long: z
52
+ .boolean()
53
+ .default(false)
54
+ .optional()
55
+ .describe('Use long listing format with permissions and timestamps'),
56
+ }),
57
+ aliases: {
58
+ long: ['l'],
59
+ },
60
+ response: LsResponseSchema,
61
+ },
62
+
63
+ async handler(ctx) {
64
+ const { args, opts, options, auth, region, logger, orgId } = ctx;
65
+ const client = createSandboxClient(logger, auth, region);
66
+
67
+ const result = await sandboxListFiles(client, {
68
+ sandboxId: args.sandboxId,
69
+ path: args.path || '.',
70
+ orgId,
71
+ });
72
+
73
+ if (!options.json) {
74
+ if (result.files.length === 0) {
75
+ console.log(tui.muted('Directory is empty'));
76
+ } else {
77
+ for (const file of result.files) {
78
+ const typeIndicator = file.isDir ? tui.colorInfo('d') : tui.muted('-');
79
+ const sizeStr = file.isDir ? tui.muted('-') : formatSize(file.size);
80
+
81
+ if (opts.long) {
82
+ const modTimeStr = formatModTime(file.modTime);
83
+ console.log(
84
+ `${typeIndicator}${file.mode.padEnd(5)} ${sizeStr.padStart(10)} ${modTimeStr} ${file.path}`
85
+ );
86
+ } else {
87
+ console.log(`${typeIndicator} ${sizeStr.padStart(10)} ${file.path}`);
88
+ }
89
+ }
90
+ console.log(tui.muted(`\nTotal: ${result.files.length} items`));
91
+ }
92
+ }
93
+
94
+ return { files: result.files, total: result.files.length };
95
+ },
96
+ });
97
+
98
+ function formatSize(bytes: number): string {
99
+ if (bytes < 1024) return `${bytes} B`;
100
+ if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
101
+ if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
102
+ return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;
103
+ }
104
+
105
+ function formatModTime(isoString: string): string {
106
+ try {
107
+ const date = new Date(isoString);
108
+ const now = new Date();
109
+ const isThisYear = date.getFullYear() === now.getFullYear();
110
+
111
+ const month = date.toLocaleString('en-US', { month: 'short' });
112
+ const day = date.getDate().toString().padStart(2, ' ');
113
+
114
+ if (isThisYear) {
115
+ const hours = date.getHours().toString().padStart(2, '0');
116
+ const minutes = date.getMinutes().toString().padStart(2, '0');
117
+ return `${month} ${day} ${hours}:${minutes}`;
118
+ } else {
119
+ return `${month} ${day} ${date.getFullYear()}`;
120
+ }
121
+ } catch {
122
+ return isoString.slice(0, 16);
123
+ }
124
+ }
125
+
126
+ export default lsSubcommand;
@@ -0,0 +1,65 @@
1
+ import { z } from 'zod';
2
+ import { createCommand } from '../../../types';
3
+ import * as tui from '../../../tui';
4
+ import { createSandboxClient } from './util';
5
+ import { getCommand } from '../../../command-prefix';
6
+ import { sandboxMkDir } from '@agentuity/server';
7
+
8
+ const MkDirResponseSchema = z.object({
9
+ success: z.boolean(),
10
+ path: z.string(),
11
+ });
12
+
13
+ export const mkdirSubcommand = createCommand({
14
+ name: 'mkdir',
15
+ description: 'Create a directory in a sandbox',
16
+ tags: ['slow', 'requires-auth'],
17
+ requires: { auth: true, region: true, org: true },
18
+ examples: [
19
+ {
20
+ command: getCommand('cloud sandbox mkdir sbx_abc123 /path/to/dir'),
21
+ description: 'Create a directory in the sandbox',
22
+ },
23
+ {
24
+ command: getCommand('cloud sandbox mkdir sbx_abc123 /path/to/nested/dir -p'),
25
+ description: 'Create nested directories recursively',
26
+ },
27
+ ],
28
+ schema: {
29
+ args: z.object({
30
+ sandboxId: z.string().describe('The sandbox ID'),
31
+ path: z.string().describe('Path to the directory to create'),
32
+ }),
33
+ options: z.object({
34
+ parents: z
35
+ .boolean()
36
+ .default(false)
37
+ .optional()
38
+ .describe('Create parent directories as needed'),
39
+ }),
40
+ aliases: {
41
+ parents: ['p'],
42
+ },
43
+ response: MkDirResponseSchema,
44
+ },
45
+
46
+ async handler(ctx) {
47
+ const { args, opts, options, auth, region, logger, orgId } = ctx;
48
+ const client = createSandboxClient(logger, auth, region);
49
+
50
+ await sandboxMkDir(client, {
51
+ sandboxId: args.sandboxId,
52
+ path: args.path,
53
+ recursive: opts.parents,
54
+ orgId,
55
+ });
56
+
57
+ if (!options.json) {
58
+ tui.success(`Created directory: ${args.path}`);
59
+ }
60
+
61
+ return { success: true, path: args.path };
62
+ },
63
+ });
64
+
65
+ export default mkdirSubcommand;
@@ -0,0 +1,51 @@
1
+ import { z } from 'zod';
2
+ import { createCommand } from '../../../types';
3
+ import * as tui from '../../../tui';
4
+ import { createSandboxClient } from './util';
5
+ import { getCommand } from '../../../command-prefix';
6
+ import { sandboxRmFile } from '@agentuity/server';
7
+
8
+ const RmFileResponseSchema = z.object({
9
+ success: z.boolean(),
10
+ path: z.string(),
11
+ });
12
+
13
+ export const rmSubcommand = createCommand({
14
+ name: 'rm',
15
+ description: 'Remove a file from a sandbox',
16
+ tags: ['slow', 'requires-auth'],
17
+ requires: { auth: true, region: true, org: true },
18
+ examples: [
19
+ {
20
+ command: getCommand('cloud sandbox rm sbx_abc123 /path/to/file.txt'),
21
+ description: 'Remove a file from the sandbox',
22
+ },
23
+ ],
24
+ schema: {
25
+ args: z.object({
26
+ sandboxId: z.string().describe('The sandbox ID'),
27
+ path: z.string().describe('Path to the file to remove'),
28
+ }),
29
+ options: z.object({}),
30
+ response: RmFileResponseSchema,
31
+ },
32
+
33
+ async handler(ctx) {
34
+ const { args, options, auth, region, logger, orgId } = ctx;
35
+ const client = createSandboxClient(logger, auth, region);
36
+
37
+ await sandboxRmFile(client, {
38
+ sandboxId: args.sandboxId,
39
+ path: args.path,
40
+ orgId,
41
+ });
42
+
43
+ if (!options.json) {
44
+ tui.success(`Removed file: ${args.path}`);
45
+ }
46
+
47
+ return { success: true, path: args.path };
48
+ },
49
+ });
50
+
51
+ export default rmSubcommand;
@@ -0,0 +1,65 @@
1
+ import { z } from 'zod';
2
+ import { createCommand } from '../../../types';
3
+ import * as tui from '../../../tui';
4
+ import { createSandboxClient } from './util';
5
+ import { getCommand } from '../../../command-prefix';
6
+ import { sandboxRmDir } from '@agentuity/server';
7
+
8
+ const RmDirResponseSchema = z.object({
9
+ success: z.boolean(),
10
+ path: z.string(),
11
+ });
12
+
13
+ export const rmdirSubcommand = createCommand({
14
+ name: 'rmdir',
15
+ description: 'Remove a directory from a sandbox',
16
+ tags: ['slow', 'requires-auth'],
17
+ requires: { auth: true, region: true, org: true },
18
+ examples: [
19
+ {
20
+ command: getCommand('cloud sandbox rmdir sbx_abc123 /path/to/dir'),
21
+ description: 'Remove an empty directory from the sandbox',
22
+ },
23
+ {
24
+ command: getCommand('cloud sandbox rmdir sbx_abc123 /path/to/dir -r'),
25
+ description: 'Remove a directory and all its contents recursively',
26
+ },
27
+ ],
28
+ schema: {
29
+ args: z.object({
30
+ sandboxId: z.string().describe('The sandbox ID'),
31
+ path: z.string().describe('Path to the directory to remove'),
32
+ }),
33
+ options: z.object({
34
+ recursive: z
35
+ .boolean()
36
+ .default(false)
37
+ .optional()
38
+ .describe('Remove directory and all contents'),
39
+ }),
40
+ aliases: {
41
+ recursive: ['r'],
42
+ },
43
+ response: RmDirResponseSchema,
44
+ },
45
+
46
+ async handler(ctx) {
47
+ const { args, opts, options, auth, region, logger, orgId } = ctx;
48
+ const client = createSandboxClient(logger, auth, region);
49
+
50
+ await sandboxRmDir(client, {
51
+ sandboxId: args.sandboxId,
52
+ path: args.path,
53
+ recursive: opts.recursive,
54
+ orgId,
55
+ });
56
+
57
+ if (!options.json) {
58
+ tui.success(`Removed directory: ${args.path}`);
59
+ }
60
+
61
+ return { success: true, path: args.path };
62
+ },
63
+ });
64
+
65
+ export default rmdirSubcommand;
@@ -7,7 +7,6 @@ import { snapshotCreate } from '@agentuity/server';
7
7
 
8
8
  const SnapshotCreateResponseSchema = z.object({
9
9
  snapshotId: z.string().describe('Snapshot ID'),
10
- sandboxId: z.string().describe('Source sandbox ID'),
11
10
  tag: z.string().optional().nullable().describe('Snapshot tag'),
12
11
  sizeBytes: z.number().describe('Snapshot size in bytes'),
13
12
  fileCount: z.number().describe('Number of files in snapshot'),
@@ -59,7 +58,6 @@ export const createSubcommand = createCommand({
59
58
 
60
59
  return {
61
60
  snapshotId: snapshot.snapshotId,
62
- sandboxId: snapshot.sandboxId,
63
61
  tag: snapshot.tag ?? undefined,
64
62
  sizeBytes: snapshot.sizeBytes,
65
63
  fileCount: snapshot.fileCount,
@@ -21,7 +21,6 @@ const SandboxInfoSchema = z.object({
21
21
 
22
22
  const SnapshotGetResponseSchema = z.object({
23
23
  snapshotId: z.string().describe('Snapshot ID'),
24
- sandboxId: z.string().describe('Source sandbox ID'),
25
24
  tag: z.string().nullable().optional().describe('Snapshot tag'),
26
25
  sizeBytes: z.number().describe('Snapshot size in bytes'),
27
26
  fileCount: z.number().describe('Number of files'),
@@ -74,7 +73,6 @@ export const getSubcommand = createCommand({
74
73
 
75
74
  if (!options.json) {
76
75
  tui.info(`Snapshot: ${tui.bold(snapshot.snapshotId)}`);
77
- console.log(` ${tui.muted('Sandbox:')} ${snapshot.sandboxId}`);
78
76
  if (snapshot.tag) {
79
77
  console.log(` ${tui.muted('Tag:')} ${snapshot.tag}`);
80
78
  }
@@ -7,7 +7,6 @@ import { snapshotList } from '@agentuity/server';
7
7
 
8
8
  const SnapshotInfoSchema = z.object({
9
9
  snapshotId: z.string(),
10
- sandboxId: z.string(),
11
10
  tag: z.string().nullable().optional(),
12
11
  sizeBytes: z.number(),
13
12
  fileCount: z.number(),
@@ -64,7 +63,6 @@ export const listSubcommand = createCommand({
64
63
  return {
65
64
  ID: snap.snapshotId,
66
65
  Tag: snap.tag ?? '-',
67
- Sandbox: snap.sandboxId,
68
66
  Size: tui.formatBytes(snap.sizeBytes),
69
67
  Files: snap.fileCount,
70
68
  'Created At': snap.createdAt,
@@ -73,7 +71,6 @@ export const listSubcommand = createCommand({
73
71
  tui.table(tableData, [
74
72
  { name: 'ID', alignment: 'left' },
75
73
  { name: 'Tag', alignment: 'left' },
76
- { name: 'Sandbox', alignment: 'left' },
77
74
  { name: 'Size', alignment: 'right' },
78
75
  { name: 'Files', alignment: 'right' },
79
76
  { name: 'Created At', alignment: 'left' },
@@ -0,0 +1,83 @@
1
+ import { z } from 'zod';
2
+ import { readFileSync, statSync } from 'node:fs';
3
+ import { createCommand } from '../../../types';
4
+ import * as tui from '../../../tui';
5
+ import { createSandboxClient } from './util';
6
+ import { getCommand } from '../../../command-prefix';
7
+ import { sandboxUploadArchive } from '@agentuity/server';
8
+
9
+ export const uploadSubcommand = createCommand({
10
+ name: 'upload',
11
+ aliases: ['ul'],
12
+ description: 'Upload a compressed archive to a sandbox and extract it',
13
+ tags: ['slow', 'requires-auth'],
14
+ requires: { auth: true, region: true, org: true },
15
+ examples: [
16
+ {
17
+ command: getCommand('cloud sandbox upload sbx_abc123 ./archive.tar.gz'),
18
+ description: 'Upload and extract a tar.gz archive to sandbox root',
19
+ },
20
+ {
21
+ command: getCommand('cloud sandbox upload sbx_abc123 ./archive.zip --path /subdir'),
22
+ description: 'Upload and extract a zip archive to a specific directory',
23
+ },
24
+ {
25
+ command: getCommand('cloud sandbox upload sbx_abc123 ./archive.bin --format tar.gz'),
26
+ description: 'Upload with explicit format specification',
27
+ },
28
+ ],
29
+ schema: {
30
+ args: z.object({
31
+ sandboxId: z.string().describe('The sandbox ID'),
32
+ archive: z.string().describe('Path to the archive file to upload'),
33
+ }),
34
+ options: z.object({
35
+ path: z.string().optional().describe('Destination path in sandbox (defaults to root)'),
36
+ format: z
37
+ .enum(['zip', 'tar.gz'])
38
+ .optional()
39
+ .describe('Archive format (auto-detected if not specified)'),
40
+ }),
41
+ response: z.object({
42
+ success: z.boolean(),
43
+ bytes: z.number(),
44
+ }),
45
+ },
46
+
47
+ async handler(ctx) {
48
+ const { args, opts, options, auth, region, logger, orgId } = ctx;
49
+
50
+ const client = createSandboxClient(logger, auth, region);
51
+
52
+ const stat = statSync(args.archive);
53
+ if (!stat.isFile()) {
54
+ logger.fatal(`${args.archive} is not a file`);
55
+ }
56
+
57
+ const content = readFileSync(args.archive);
58
+ const bytes = content.length;
59
+
60
+ await sandboxUploadArchive(client, {
61
+ sandboxId: args.sandboxId,
62
+ archive: content,
63
+ path: opts.path || '.',
64
+ format: opts.format || '',
65
+ orgId,
66
+ });
67
+
68
+ if (!options.json) {
69
+ tui.success(`Uploaded and extracted ${formatSize(bytes)} to sandbox`);
70
+ }
71
+
72
+ return { success: true, bytes };
73
+ },
74
+ });
75
+
76
+ function formatSize(bytes: number): string {
77
+ if (bytes < 1024) return `${bytes} bytes`;
78
+ if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
79
+ if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
80
+ return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`;
81
+ }
82
+
83
+ export default uploadSubcommand;