@agentuity/cli 1.0.15 → 1.0.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/cmd/build/entry-generator.d.ts.map +1 -1
  2. package/dist/cmd/build/entry-generator.js +5 -2
  3. package/dist/cmd/build/entry-generator.js.map +1 -1
  4. package/dist/cmd/build/vite/metadata-generator.d.ts.map +1 -1
  5. package/dist/cmd/build/vite/metadata-generator.js +1 -37
  6. package/dist/cmd/build/vite/metadata-generator.js.map +1 -1
  7. package/dist/cmd/build/vite/registry-generator.d.ts.map +1 -1
  8. package/dist/cmd/build/vite/registry-generator.js +15 -2
  9. package/dist/cmd/build/vite/registry-generator.js.map +1 -1
  10. package/dist/cmd/build/vite/vite-asset-server-config.js +1 -1
  11. package/dist/cmd/build/vite/vite-asset-server-config.js.map +1 -1
  12. package/dist/cmd/build/vite/vite-asset-server.d.ts.map +1 -1
  13. package/dist/cmd/build/vite/vite-asset-server.js +42 -39
  14. package/dist/cmd/build/vite/vite-asset-server.js.map +1 -1
  15. package/dist/cmd/cloud/sandbox/get.d.ts.map +1 -1
  16. package/dist/cmd/cloud/sandbox/get.js +5 -0
  17. package/dist/cmd/cloud/sandbox/get.js.map +1 -1
  18. package/dist/cmd/cloud/sandbox/list.js +1 -1
  19. package/dist/cmd/cloud/sandbox/list.js.map +1 -1
  20. package/dist/cmd/cloud/sandbox/snapshot/build.d.ts.map +1 -1
  21. package/dist/cmd/cloud/sandbox/snapshot/build.js +32 -1
  22. package/dist/cmd/cloud/sandbox/snapshot/build.js.map +1 -1
  23. package/dist/cmd/cloud/sandbox/snapshot/generate.d.ts.map +1 -1
  24. package/dist/cmd/cloud/sandbox/snapshot/generate.js +7 -0
  25. package/dist/cmd/cloud/sandbox/snapshot/generate.js.map +1 -1
  26. package/dist/cmd/cloud/storage/create.d.ts.map +1 -1
  27. package/dist/cmd/cloud/storage/create.js +58 -26
  28. package/dist/cmd/cloud/storage/create.js.map +1 -1
  29. package/dist/cmd/cloud/storage/delete.d.ts.map +1 -1
  30. package/dist/cmd/cloud/storage/delete.js +108 -16
  31. package/dist/cmd/cloud/storage/delete.js.map +1 -1
  32. package/package.json +6 -6
  33. package/src/cmd/build/entry-generator.ts +6 -2
  34. package/src/cmd/build/vite/metadata-generator.ts +1 -39
  35. package/src/cmd/build/vite/registry-generator.ts +17 -2
  36. package/src/cmd/build/vite/vite-asset-server-config.ts +1 -1
  37. package/src/cmd/build/vite/vite-asset-server.ts +53 -40
  38. package/src/cmd/cloud/sandbox/get.ts +5 -0
  39. package/src/cmd/cloud/sandbox/list.ts +1 -1
  40. package/src/cmd/cloud/sandbox/snapshot/build.ts +41 -0
  41. package/src/cmd/cloud/sandbox/snapshot/generate.ts +7 -0
  42. package/src/cmd/cloud/storage/create.ts +62 -27
  43. package/src/cmd/cloud/storage/delete.ts +136 -17
@@ -13,7 +13,7 @@ import { getResourceInfo, setResourceInfo, deleteResourceRegion } from '../../..
13
13
  export const deleteSubcommand = createSubcommand({
14
14
  name: 'delete',
15
15
  aliases: ['rm', 'del', 'remove'],
16
- description: 'Delete a storage resource or file',
16
+ description: 'Delete a storage resource, file, or folder',
17
17
  tags: ['destructive', 'deletes-resource', 'slow', 'requires-auth', 'requires-deployment'],
18
18
  idempotent: false,
19
19
  requires: { auth: true },
@@ -31,6 +31,10 @@ export const deleteSubcommand = createSubcommand({
31
31
  command: getCommand('cloud storage delete'),
32
32
  description: 'Interactive selection to delete a bucket',
33
33
  },
34
+ {
35
+ command: getCommand('cloud storage delete my-bucket path/to/folder'),
36
+ description: 'Delete a folder and all its contents from a bucket',
37
+ },
34
38
  {
35
39
  command: getCommand('--dry-run cloud storage delete my-bucket'),
36
40
  description: 'Dry-run: show what would be deleted without making changes',
@@ -47,6 +51,7 @@ export const deleteSubcommand = createSubcommand({
47
51
  response: z.object({
48
52
  success: z.boolean().describe('Whether deletion succeeded'),
49
53
  name: z.string().describe('Deleted bucket or file name'),
54
+ count: z.number().optional().describe('Number of files deleted (for folder deletion)'),
50
55
  }),
51
56
  },
52
57
  async handler(ctx) {
@@ -97,7 +102,7 @@ export const deleteSubcommand = createSubcommand({
97
102
  });
98
103
  bucketName = response.bucket;
99
104
  }
100
- // If filename is provided, delete the file from the bucket
105
+ // If filename is provided, delete the file or folder from the bucket
101
106
  if (args.filename) {
102
107
  const bucket = resources.s3.find((s3) => s3.bucket_name === bucketName);
103
108
  if (!bucket) {
@@ -106,20 +111,113 @@ export const deleteSubcommand = createSubcommand({
106
111
  if (!bucket.access_key || !bucket.secret_key || !bucket.endpoint) {
107
112
  tui.fatal(`Storage bucket '${bucketName}' is missing credentials`, ErrorCode.CONFIG_INVALID);
108
113
  }
114
+ const s3Client = createS3Client({
115
+ endpoint: bucket.endpoint,
116
+ access_key: bucket.access_key,
117
+ secret_key: bucket.secret_key,
118
+ region: bucket.region,
119
+ });
120
+ const filePath = args.filename;
121
+ // Check if path represents a folder by listing objects under it
122
+ const folderPrefix = filePath.endsWith('/') ? filePath : filePath + '/';
123
+ const folderContents = [];
124
+ let continuationToken;
125
+ let isTruncated = false;
126
+ do {
127
+ const folderResult = await s3Client.list({
128
+ prefix: folderPrefix,
129
+ ...(continuationToken ? { continuationToken } : {}),
130
+ });
131
+ if (folderResult.contents) {
132
+ folderContents.push(...folderResult.contents);
133
+ }
134
+ continuationToken = folderResult.nextContinuationToken;
135
+ isTruncated = folderResult.isTruncated ?? false;
136
+ } while (isTruncated);
137
+ if (folderContents.length > 0) {
138
+ // Path is a folder — recursive delete
139
+ const keysToDelete = folderContents.map((obj) => obj.key);
140
+ // Handle dry-run mode
141
+ if (isDryRunMode(options)) {
142
+ outputDryRun(`Would delete ${keysToDelete.length} file${keysToDelete.length === 1 ? '' : 's'} under ${folderPrefix} from bucket ${bucketName}`, options);
143
+ if (!options.json) {
144
+ tui.newline();
145
+ tui.info('[DRY RUN] Folder deletion skipped');
146
+ }
147
+ return { success: false, name: filePath, count: keysToDelete.length };
148
+ }
149
+ // Confirm
150
+ if (!opts.confirm) {
151
+ tui.warning(`You are about to delete ${tui.bold(String(keysToDelete.length))} file${keysToDelete.length === 1 ? '' : 's'} under folder: ${tui.bold(folderPrefix)} from bucket: ${tui.bold(bucketName)}`);
152
+ const confirm = await enquirer.prompt({
153
+ type: 'confirm',
154
+ name: 'confirm',
155
+ message: 'Are you sure you want to delete this folder and all its contents?',
156
+ initial: false,
157
+ });
158
+ if (!confirm.confirm) {
159
+ tui.info('Deletion cancelled');
160
+ return { success: false, name: filePath };
161
+ }
162
+ }
163
+ // Delete all files
164
+ await tui.spinner({
165
+ message: `Deleting ${keysToDelete.length} file${keysToDelete.length === 1 ? '' : 's'} under ${folderPrefix} from ${bucketName}`,
166
+ clearOnSuccess: true,
167
+ callback: async () => {
168
+ const errors = [];
169
+ for (const key of keysToDelete) {
170
+ try {
171
+ await s3Client.delete(key);
172
+ }
173
+ catch (err) {
174
+ errors.push({
175
+ key,
176
+ error: err instanceof Error ? err.message : String(err),
177
+ });
178
+ }
179
+ }
180
+ if (errors.length > 0) {
181
+ const failedKeys = errors.map((e) => e.key).join(', ');
182
+ throw new Error(`Failed to delete ${errors.length} file${errors.length === 1 ? '' : 's'}: ${failedKeys}`);
183
+ }
184
+ },
185
+ });
186
+ // Also delete the exact file if it exists (handles file+folder name conflicts)
187
+ // Skip if filePath was already deleted as part of folder contents (e.g., trailing-slash folder markers)
188
+ if (!keysToDelete.includes(filePath)) {
189
+ const exactFileCheck = await s3Client.list({ prefix: filePath });
190
+ const exactFile = (exactFileCheck.contents || []).find((obj) => obj.key === filePath);
191
+ if (exactFile) {
192
+ await s3Client.delete(filePath);
193
+ keysToDelete.push(filePath);
194
+ }
195
+ }
196
+ if (!options.json) {
197
+ tui.success(`Deleted ${tui.bold(String(keysToDelete.length))} file${keysToDelete.length === 1 ? '' : 's'} under ${tui.bold(folderPrefix)} from ${tui.bold(bucketName)}`);
198
+ }
199
+ return { success: true, name: filePath, count: keysToDelete.length };
200
+ }
201
+ // Not a folder — check if exact file exists
202
+ const fileResult = await s3Client.list({ prefix: filePath });
203
+ const exactMatch = (fileResult.contents || []).find((obj) => obj.key === filePath);
204
+ if (!exactMatch) {
205
+ tui.fatal(`No file or folder found at '${filePath}' in bucket '${bucketName}'`, ErrorCode.RESOURCE_NOT_FOUND);
206
+ }
109
207
  // Handle dry-run mode
110
208
  if (isDryRunMode(options)) {
111
- outputDryRun(`Would delete file ${args.filename} from bucket ${bucketName}`, options);
209
+ outputDryRun(`Would delete file ${filePath} from bucket ${bucketName}`, options);
112
210
  if (!options.json) {
113
211
  tui.newline();
114
212
  tui.info('[DRY RUN] File deletion skipped');
115
213
  }
116
214
  return {
117
215
  success: false,
118
- name: args.filename,
216
+ name: filePath,
119
217
  };
120
218
  }
121
219
  if (!opts.confirm) {
122
- tui.warning(`You are about to delete file: ${tui.bold(args.filename)} from bucket: ${tui.bold(bucketName)}`);
220
+ tui.warning(`You are about to delete file: ${tui.bold(filePath)} from bucket: ${tui.bold(bucketName)}`);
123
221
  const confirm = await enquirer.prompt({
124
222
  type: 'confirm',
125
223
  name: 'confirm',
@@ -128,28 +226,22 @@ export const deleteSubcommand = createSubcommand({
128
226
  });
129
227
  if (!confirm.confirm) {
130
228
  tui.info('Deletion cancelled');
131
- return { success: false, name: args.filename };
229
+ return { success: false, name: filePath };
132
230
  }
133
231
  }
134
- const s3Client = createS3Client({
135
- endpoint: bucket.endpoint,
136
- access_key: bucket.access_key,
137
- secret_key: bucket.secret_key,
138
- region: bucket.region,
139
- });
140
232
  await tui.spinner({
141
- message: `Deleting ${args.filename} from ${bucketName}`,
233
+ message: `Deleting ${filePath} from ${bucketName}`,
142
234
  clearOnSuccess: true,
143
235
  callback: async () => {
144
- await s3Client.delete(args.filename);
236
+ await s3Client.delete(filePath);
145
237
  },
146
238
  });
147
239
  if (!options.json) {
148
- tui.success(`Deleted file: ${tui.bold(args.filename)} from ${tui.bold(bucketName)}`);
240
+ tui.success(`Deleted file: ${tui.bold(filePath)} from ${tui.bold(bucketName)}`);
149
241
  }
150
242
  return {
151
243
  success: true,
152
- name: args.filename,
244
+ name: filePath,
153
245
  };
154
246
  }
155
247
  // Otherwise, delete the bucket
@@ -1 +1 @@
1
- {"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../../src/cmd/cloud/storage/delete.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"delete.js","sourceRoot":"","sources":["../../../../src/cmd/cloud/storage/delete.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentuity/cli",
3
- "version": "1.0.15",
3
+ "version": "1.0.17",
4
4
  "license": "Apache-2.0",
5
5
  "author": "Agentuity employees and contributors",
6
6
  "type": "module",
@@ -41,9 +41,9 @@
41
41
  "prepublishOnly": "bun run clean && bun run build"
42
42
  },
43
43
  "dependencies": {
44
- "@agentuity/auth": "1.0.15",
45
- "@agentuity/core": "1.0.15",
46
- "@agentuity/server": "1.0.15",
44
+ "@agentuity/auth": "1.0.17",
45
+ "@agentuity/core": "1.0.17",
46
+ "@agentuity/server": "1.0.17",
47
47
  "@datasert/cronjs-parser": "^1.4.0",
48
48
  "@vitejs/plugin-react": "^5.1.2",
49
49
  "acorn-loose": "^8.5.2",
@@ -60,10 +60,10 @@
60
60
  "typescript": "^5.9.0",
61
61
  "vite": "^7.2.7",
62
62
  "zod": "^4.3.5",
63
- "@agentuity/frontend": "1.0.15"
63
+ "@agentuity/frontend": "1.0.17"
64
64
  },
65
65
  "devDependencies": {
66
- "@agentuity/test-utils": "1.0.15",
66
+ "@agentuity/test-utils": "1.0.17",
67
67
  "@types/adm-zip": "^0.5.7",
68
68
  "@types/bun": "latest",
69
69
  "@types/tar-fs": "^2.0.4",
@@ -87,6 +87,10 @@ export async function generateEntryFile(options: GenerateEntryOptions): Promise<
87
87
  ` runShutdown,`,
88
88
  ];
89
89
 
90
+ if (hasWebFrontend) {
91
+ runtimeImports.push(` mimeTypes,`);
92
+ }
93
+
90
94
  const imports = [
91
95
  `import { `,
92
96
  ...runtimeImports,
@@ -408,10 +412,10 @@ ${
408
412
  app.get('/', prodHtmlHandler);
409
413
 
410
414
  // Serve static assets from /assets/* (Vite bundled output)
411
- app.use('/assets/*', serveStatic({ root: import.meta.dir + '/client' }));
415
+ app.use('/assets/*', serveStatic({ root: import.meta.dir + '/client', mimes: mimeTypes }));
412
416
 
413
417
  // Serve static public assets (favicon.ico, robots.txt, etc.)
414
- app.use('/*', serveStatic({ root: import.meta.dir + '/client', rewriteRequestPath: (path) => path }));
418
+ app.use('/*', serveStatic({ root: import.meta.dir + '/client', rewriteRequestPath: (path) => path, mimes: mimeTypes }));
415
419
 
416
420
  // 404 for unmatched API/system routes (IMPORTANT: comes before SPA fallback)
417
421
  app.all('/_agentuity/*', (c: Context) => c.notFound());
@@ -6,7 +6,7 @@
6
6
 
7
7
  import { join } from 'node:path';
8
8
  import { writeFileSync, mkdirSync, existsSync, readFileSync, statSync, readdirSync } from 'node:fs';
9
- import { type BuildMetadata, DeploymentConfig } from '@agentuity/server';
9
+ import { type BuildMetadata, DeploymentConfig, getContentType } from '@agentuity/server';
10
10
  import type { z } from 'zod';
11
11
  import type { AgentMetadata } from './agent-discovery';
12
12
  import type { RouteMetadata } from './route-discovery';
@@ -31,44 +31,6 @@ interface AssetInfo {
31
31
  contentEncoding?: string;
32
32
  }
33
33
 
34
- function getContentType(filename: string): string {
35
- const ext = filename.split('.').pop()?.toLowerCase();
36
- switch (ext) {
37
- case 'js':
38
- case 'mjs':
39
- return 'application/javascript';
40
- case 'css':
41
- return 'text/css';
42
- case 'html':
43
- return 'text/html';
44
- case 'json':
45
- return 'application/json';
46
- case 'png':
47
- return 'image/png';
48
- case 'jpg':
49
- case 'jpeg':
50
- return 'image/jpeg';
51
- case 'gif':
52
- return 'image/gif';
53
- case 'svg':
54
- return 'image/svg+xml';
55
- case 'webp':
56
- return 'image/webp';
57
- case 'ico':
58
- return 'image/x-icon';
59
- case 'woff':
60
- return 'font/woff';
61
- case 'woff2':
62
- return 'font/woff2';
63
- case 'ttf':
64
- return 'font/ttf';
65
- case 'eot':
66
- return 'application/vnd.ms-fontobject';
67
- default:
68
- return 'application/octet-stream';
69
- }
70
- }
71
-
72
34
  /**
73
35
  * Determine if an asset should be compressed with gzip.
74
36
  * The result is included in asset metadata so the API can generate
@@ -70,6 +70,21 @@ function sanitizePathSegment(segment: string): string {
70
70
  return toCamelCase(segment.replace(ROUTE_PARAM_CHARS, ''));
71
71
  }
72
72
 
73
+ /**
74
+ * Valid unquoted TypeScript/JavaScript property name pattern.
75
+ * A property name can be unquoted if it starts with a letter, underscore, or dollar sign,
76
+ * and contains only letters, digits, underscores, or dollar signs.
77
+ */
78
+ const VALID_UNQUOTED_PROPERTY = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;
79
+
80
+ /**
81
+ * Quote a property name for TypeScript object type definitions if it contains
82
+ * characters that require quoting (e.g., dots, hyphens, spaces).
83
+ */
84
+ function quotePropertyName(name: string): string {
85
+ return VALID_UNQUOTED_PROPERTY.test(name) ? name : JSON.stringify(name);
86
+ }
87
+
73
88
  /**
74
89
  * Generate TypeScript type for path parameters.
75
90
  * Returns 'never' if no path params, or '{ param1: string; param2: string }' format.
@@ -479,11 +494,11 @@ function generateRPCRegistryType(
479
494
  const pathParamsType = generatePathParamsType(routeInfo.pathParams);
480
495
  const pathParamsTupleType = generatePathParamsTupleType(routeInfo.pathParams);
481
496
  lines.push(
482
- `${indent}${key}: { input: ${value.input}; output: ${value.output}; type: ${value.type}; params: ${pathParamsType}; paramsTuple: ${pathParamsTupleType} };`
497
+ `${indent}${quotePropertyName(key)}: { input: ${value.input}; output: ${value.output}; type: ${value.type}; params: ${pathParamsType}; paramsTuple: ${pathParamsTupleType} };`
483
498
  );
484
499
  } else {
485
500
  // Nested node
486
- lines.push(`${indent}${key}: {`);
501
+ lines.push(`${indent}${quotePropertyName(key)}: {`);
487
502
  lines.push(treeToTypeString(value as NestedNode, indent + '\t'));
488
503
  lines.push(`${indent}};`);
489
504
  }
@@ -92,7 +92,7 @@ export async function generateAssetServerConfig(
92
92
  server: {
93
93
  // Use the port we selected
94
94
  port,
95
- strictPort: false, // Allow fallback if port is taken
95
+ strictPort: true, // Port is pre-verified as available by findAvailablePort()
96
96
  host: '127.0.0.1',
97
97
 
98
98
  // CORS headers to allow Bun server on port 3500 to proxy requests
@@ -7,6 +7,7 @@
7
7
 
8
8
  import { join } from 'node:path';
9
9
  import { createRequire } from 'node:module';
10
+ import { createServer as createNetServer } from 'node:net';
10
11
  import type { ViteDevServer } from 'vite';
11
12
  import type { Logger } from '../../../types';
12
13
  import { generateAssetServerConfig } from './vite-asset-server-config';
@@ -22,6 +23,44 @@ export interface StartViteAssetServerOptions {
22
23
  workbenchPath?: string;
23
24
  }
24
25
 
26
+ /**
27
+ * Check if a specific port is available on the given host.
28
+ */
29
+ function isPortAvailable(port: number, host: string): Promise<boolean> {
30
+ return new Promise((resolve) => {
31
+ const server = createNetServer();
32
+ server.once('error', () => {
33
+ resolve(false);
34
+ });
35
+ server.listen(port, host, () => {
36
+ server.close(() => {
37
+ resolve(true);
38
+ });
39
+ });
40
+ });
41
+ }
42
+
43
+ /**
44
+ * Find an available port starting from the preferred port.
45
+ * Tries incrementing ports up to maxAttempts times.
46
+ */
47
+ async function findAvailablePort(
48
+ preferredPort: number,
49
+ host: string = '127.0.0.1',
50
+ maxAttempts: number = 20
51
+ ): Promise<number> {
52
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
53
+ const port = preferredPort + attempt;
54
+ const available = await isPortAvailable(port, host);
55
+ if (available) {
56
+ return port;
57
+ }
58
+ }
59
+ throw new Error(
60
+ `Could not find an available port after ${maxAttempts} attempts starting from ${preferredPort}`
61
+ );
62
+ }
63
+
25
64
  /**
26
65
  * Start Vite asset server on a dynamically-chosen port
27
66
  * Returns the server instance and the actual port number
@@ -33,16 +72,23 @@ export async function startViteAssetServer(
33
72
 
34
73
  logger.debug('Starting Vite asset server (HMR only)...');
35
74
 
36
- // Pick a port for Vite asset server (try 5173 first, Vite default)
37
- // strictPort: false allows Vite to choose alternate if 5173 is taken
75
+ // Find an available port before starting Vite
76
+ // This avoids relying on Vite's strictPort:false fallback which can fail
38
77
  const preferredPort = 5173;
78
+ const availablePort = await findAvailablePort(preferredPort, '127.0.0.1');
39
79
 
40
- // Generate minimal config with preferred port
80
+ if (availablePort !== preferredPort) {
81
+ logger.info(
82
+ `Port ${preferredPort} is in use, using port ${availablePort} for Vite asset server`
83
+ );
84
+ }
85
+
86
+ // Generate minimal config with the available port
41
87
  const config = await generateAssetServerConfig({
42
88
  rootDir,
43
89
  logger,
44
90
  workbenchPath,
45
- port: preferredPort,
91
+ port: availablePort,
46
92
  });
47
93
 
48
94
  // Dynamically import vite from the project's node_modules
@@ -54,7 +100,6 @@ export async function startViteAssetServer(
54
100
  const server = await createServer(config);
55
101
 
56
102
  // Start listening with timeout to prevent hangs
57
- // Vite will choose alternate port if preferred is taken
58
103
  const STARTUP_TIMEOUT_MS = 30000; // 30 seconds
59
104
 
60
105
  try {
@@ -82,42 +127,10 @@ export async function startViteAssetServer(
82
127
  throw error;
83
128
  }
84
129
 
85
- // Helper to get port from httpServer
86
- const getPortFromHttpServer = (): number | null => {
87
- const httpServer = server.httpServer;
88
- if (httpServer) {
89
- const address = httpServer.address();
90
- if (address && typeof address === 'object' && 'port' in address) {
91
- return address.port;
92
- }
93
- }
94
- return null;
95
- };
96
-
97
- // Get the actual port Vite is using from the httpServer
98
- // server.config.server.port is the requested port, not the actual one
99
- let actualPort = preferredPort;
100
-
101
- // The resolved URL contains the actual port being used
102
- const resolvedUrls = server.resolvedUrls;
103
- if (resolvedUrls?.local && resolvedUrls.local.length > 0) {
104
- try {
105
- const url = new URL(resolvedUrls.local[0]);
106
- actualPort = parseInt(url.port, 10) || preferredPort;
107
- } catch {
108
- actualPort = getPortFromHttpServer() ?? preferredPort;
109
- }
110
- } else {
111
- actualPort = getPortFromHttpServer() ?? preferredPort;
112
- }
130
+ // Port was pre-verified and strictPort:true ensures Vite uses exactly this port
131
+ const actualPort = availablePort;
113
132
 
114
- if (actualPort === preferredPort) {
115
- logger.info(`Vite asset server running on port ${actualPort}`);
116
- } else {
117
- logger.warn(
118
- `Vite asset server running on port ${actualPort} (preferred port ${preferredPort} was in use)`
119
- );
120
- }
133
+ logger.info(`Vite asset server running on port ${actualPort}`);
121
134
  logger.debug(`Asset server will handle: HMR, React transformation, source maps`);
122
135
  logger.debug(
123
136
  `HMR WebSocket configured at /__vite_hmr (proxied through Bun server for tunnel support)`
@@ -40,6 +40,7 @@ const SandboxGetResponseSchema = z.object({
40
40
  stdoutStreamUrl: z.string().optional().describe('URL to stdout output stream'),
41
41
  stderrStreamUrl: z.string().optional().describe('URL to stderr output stream'),
42
42
  dependencies: z.array(z.string()).optional().describe('Apt packages installed'),
43
+ packages: z.array(z.string()).optional().describe('npm/bun packages installed globally'),
43
44
  metadata: z.record(z.string(), z.unknown()).optional().describe('User-defined metadata'),
44
45
  resources: SandboxResourcesSchema.optional().describe('Resource limits'),
45
46
  url: z.string().optional().describe('Public URL for the sandbox (if network port configured)'),
@@ -138,6 +139,9 @@ export const getSubcommand = createCommand({
138
139
  if (result.dependencies && result.dependencies.length > 0) {
139
140
  tableData['Dependencies'] = result.dependencies.join(', ');
140
141
  }
142
+ if (result.packages && result.packages.length > 0) {
143
+ tableData['Packages'] = result.packages.join(', ');
144
+ }
141
145
  if (resourceParts.length > 0) {
142
146
  tableData['Resources'] = resourceParts.join(', ');
143
147
  }
@@ -164,6 +168,7 @@ export const getSubcommand = createCommand({
164
168
  stdoutStreamUrl: result.stdoutStreamUrl,
165
169
  stderrStreamUrl: result.stderrStreamUrl,
166
170
  dependencies: result.dependencies,
171
+ packages: result.packages,
167
172
  metadata: result.metadata,
168
173
  resources: result.resources,
169
174
  url: result.url,
@@ -69,7 +69,7 @@ export const listSubcommand = createCommand({
69
69
  name: z.string().optional().describe('Filter by sandbox name'),
70
70
  mode: z.enum(['oneshot', 'interactive']).optional().describe('Filter by sandbox mode'),
71
71
  status: z
72
- .enum(['creating', 'idle', 'running', 'terminated', 'failed'])
72
+ .enum(['creating', 'idle', 'running', 'paused', 'stopping', 'suspended', 'terminated', 'failed'])
73
73
  .optional()
74
74
  .describe('Filter by status'),
75
75
  projectId: z.string().optional().describe('Filter by project ID'),
@@ -12,6 +12,7 @@ import {
12
12
  snapshotBuildFinalize,
13
13
  snapshotUpload,
14
14
  SnapshotBuildFileSchema,
15
+ NPM_PACKAGE_NAME_PATTERN,
15
16
  } from '@agentuity/server';
16
17
  import type { SnapshotFileInfo, SnapshotBuildGitInfo } from '@agentuity/server';
17
18
  import { getCatalystAPIClient } from '../../../../config';
@@ -297,6 +298,7 @@ async function generateContentHash(params: {
297
298
  runtime: string;
298
299
  description?: string;
299
300
  dependencies?: string[];
301
+ packages?: string[];
300
302
  files: SnapshotFileInfo[];
301
303
  fileHashes: Map<string, string>;
302
304
  env?: Record<string, string>;
@@ -315,6 +317,11 @@ async function generateContentHash(params: {
315
317
  hash.update(`dependencies:${sortedDeps.join(',')}\n`);
316
318
  }
317
319
 
320
+ if (params.packages && params.packages.length > 0) {
321
+ const sortedPkgs = [...params.packages].sort();
322
+ hash.update(`packages:${sortedPkgs.join(',')}\n`);
323
+ }
324
+
318
325
  if (params.files.length > 0) {
319
326
  const sortedFiles = [...params.files].sort((a, b) => a.path.localeCompare(b.path));
320
327
  for (const file of sortedFiles) {
@@ -575,6 +582,22 @@ export const buildSubcommand = createCommand({
575
582
  }
576
583
  }
577
584
 
585
+ if (buildConfig.packages && buildConfig.packages.length > 0) {
586
+ // Validate package specifiers using shared pattern (also enforced at schema level)
587
+ const invalidPackages = buildConfig.packages.filter(
588
+ (pkg) => !NPM_PACKAGE_NAME_PATTERN.test(pkg)
589
+ );
590
+ if (invalidPackages.length > 0) {
591
+ tui.error('Invalid package specifiers:');
592
+ for (const pkg of invalidPackages) {
593
+ tui.bullet(
594
+ `${pkg}: must not contain whitespace, semicolons, backticks, pipes, or dollar signs`
595
+ );
596
+ }
597
+ process.exit(1);
598
+ }
599
+ }
600
+
578
601
  let files = new Map<string, FileEntry>();
579
602
  if (buildConfig.files && buildConfig.files.length > 0) {
580
603
  files = await resolveFileGlobs(directory, buildConfig.files);
@@ -613,6 +636,7 @@ export const buildSubcommand = createCommand({
613
636
  runtime: buildConfig.runtime,
614
637
  description: finalDescription,
615
638
  dependencies: buildConfig.dependencies,
639
+ packages: buildConfig.packages,
616
640
  files: fileList,
617
641
  fileHashes,
618
642
  env: finalEnv,
@@ -647,6 +671,14 @@ export const buildSubcommand = createCommand({
647
671
  }
648
672
  }
649
673
 
674
+ if (buildConfig.packages && buildConfig.packages.length > 0) {
675
+ console.log('');
676
+ tui.info('Packages (npm/bun):');
677
+ for (const pkg of buildConfig.packages) {
678
+ console.log(` ${tui.muted('•')} ${pkg}`);
679
+ }
680
+ }
681
+
650
682
  if (finalEnv && Object.keys(finalEnv).length > 0) {
651
683
  console.log('');
652
684
  tui.info('Environment:');
@@ -914,6 +946,7 @@ export const buildSubcommand = createCommand({
914
946
  fileCount: fileList.length,
915
947
  files: fileList,
916
948
  dependencies: buildConfig.dependencies,
949
+ packages: buildConfig.packages,
917
950
  env: finalEnv,
918
951
  metadata: finalMetadata,
919
952
  orgId,
@@ -949,6 +982,14 @@ export const buildSubcommand = createCommand({
949
982
  }
950
983
  }
951
984
 
985
+ if (buildConfig.packages && buildConfig.packages.length > 0) {
986
+ console.log('');
987
+ tui.info('Packages (npm/bun):');
988
+ for (const pkg of buildConfig.packages) {
989
+ console.log(` ${tui.muted('•')} ${pkg}`);
990
+ }
991
+ }
992
+
952
993
  if (finalEnv && Object.keys(finalEnv).length > 0) {
953
994
  console.log('');
954
995
  tui.info('Environment:');