@agentuity/cli 0.0.94 → 0.0.96

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 (277) hide show
  1. package/AGENTS.md +54 -0
  2. package/dist/auth.d.ts +1 -1
  3. package/dist/auth.d.ts.map +1 -1
  4. package/dist/auth.js +8 -5
  5. package/dist/auth.js.map +1 -1
  6. package/dist/banner.js +1 -1
  7. package/dist/banner.js.map +1 -1
  8. package/dist/cli.d.ts.map +1 -1
  9. package/dist/cli.js +190 -27
  10. package/dist/cli.js.map +1 -1
  11. package/dist/cmd/auth/signup.js +1 -1
  12. package/dist/cmd/auth/signup.js.map +1 -1
  13. package/dist/cmd/build/ast.d.ts.map +1 -1
  14. package/dist/cmd/build/ast.js +7 -0
  15. package/dist/cmd/build/ast.js.map +1 -1
  16. package/dist/cmd/build/entry-generator.d.ts +20 -0
  17. package/dist/cmd/build/entry-generator.d.ts.map +1 -0
  18. package/dist/cmd/build/entry-generator.js +366 -0
  19. package/dist/cmd/build/entry-generator.js.map +1 -0
  20. package/dist/cmd/build/index.d.ts.map +1 -1
  21. package/dist/cmd/build/index.js +5 -23
  22. package/dist/cmd/build/index.js.map +1 -1
  23. package/dist/cmd/build/vite/agent-discovery.d.ts +33 -0
  24. package/dist/cmd/build/vite/agent-discovery.d.ts.map +1 -0
  25. package/dist/cmd/build/vite/agent-discovery.js +297 -0
  26. package/dist/cmd/build/vite/agent-discovery.js.map +1 -0
  27. package/dist/cmd/build/vite/browser-env-plugin.d.ts +9 -0
  28. package/dist/cmd/build/vite/browser-env-plugin.d.ts.map +1 -0
  29. package/dist/cmd/build/vite/browser-env-plugin.js +28 -0
  30. package/dist/cmd/build/vite/browser-env-plugin.js.map +1 -0
  31. package/dist/cmd/build/vite/bun-dev-server.d.ts +29 -0
  32. package/dist/cmd/build/vite/bun-dev-server.d.ts.map +1 -0
  33. package/dist/cmd/build/vite/bun-dev-server.js +54 -0
  34. package/dist/cmd/build/vite/bun-dev-server.js.map +1 -0
  35. package/dist/cmd/build/vite/config-loader.d.ts +23 -0
  36. package/dist/cmd/build/vite/config-loader.d.ts.map +1 -0
  37. package/dist/cmd/build/vite/config-loader.js +50 -0
  38. package/dist/cmd/build/vite/config-loader.js.map +1 -0
  39. package/dist/cmd/build/vite/index.d.ts +26 -0
  40. package/dist/cmd/build/vite/index.d.ts.map +1 -0
  41. package/dist/cmd/build/vite/index.js +127 -0
  42. package/dist/cmd/build/vite/index.js.map +1 -0
  43. package/dist/cmd/build/vite/lifecycle-generator.d.ts +11 -0
  44. package/dist/cmd/build/vite/lifecycle-generator.d.ts.map +1 -0
  45. package/dist/cmd/build/vite/lifecycle-generator.js +35 -0
  46. package/dist/cmd/build/vite/lifecycle-generator.js.map +1 -0
  47. package/dist/cmd/build/vite/metadata-generator.d.ts +32 -0
  48. package/dist/cmd/build/vite/metadata-generator.d.ts.map +1 -0
  49. package/dist/cmd/build/vite/metadata-generator.js +489 -0
  50. package/dist/cmd/build/vite/metadata-generator.js.map +1 -0
  51. package/dist/cmd/build/vite/patch-plugin.d.ts +21 -0
  52. package/dist/cmd/build/vite/patch-plugin.d.ts.map +1 -0
  53. package/dist/cmd/build/vite/patch-plugin.js +70 -0
  54. package/dist/cmd/build/vite/patch-plugin.js.map +1 -0
  55. package/dist/cmd/build/vite/registry-generator.d.ts +19 -0
  56. package/dist/cmd/build/vite/registry-generator.d.ts.map +1 -0
  57. package/dist/cmd/build/{route-registry.js → vite/registry-generator.js} +126 -48
  58. package/dist/cmd/build/vite/registry-generator.js.map +1 -0
  59. package/dist/cmd/build/vite/route-discovery.d.ts +58 -0
  60. package/dist/cmd/build/vite/route-discovery.d.ts.map +1 -0
  61. package/dist/cmd/build/vite/route-discovery.js +125 -0
  62. package/dist/cmd/build/vite/route-discovery.js.map +1 -0
  63. package/dist/cmd/build/vite/server-bundler.d.ts +16 -0
  64. package/dist/cmd/build/vite/server-bundler.d.ts.map +1 -0
  65. package/dist/cmd/build/vite/server-bundler.js +194 -0
  66. package/dist/cmd/build/vite/server-bundler.js.map +1 -0
  67. package/dist/cmd/build/vite/vite-asset-server-config.d.ts +19 -0
  68. package/dist/cmd/build/vite/vite-asset-server-config.d.ts.map +1 -0
  69. package/dist/cmd/build/vite/vite-asset-server-config.js +105 -0
  70. package/dist/cmd/build/vite/vite-asset-server-config.js.map +1 -0
  71. package/dist/cmd/build/vite/vite-asset-server.d.ts +23 -0
  72. package/dist/cmd/build/vite/vite-asset-server.d.ts.map +1 -0
  73. package/dist/cmd/build/vite/vite-asset-server.js +40 -0
  74. package/dist/cmd/build/vite/vite-asset-server.js.map +1 -0
  75. package/dist/cmd/build/vite/vite-builder.d.ts +44 -0
  76. package/dist/cmd/build/vite/vite-builder.d.ts.map +1 -0
  77. package/dist/cmd/build/vite/vite-builder.js +232 -0
  78. package/dist/cmd/build/vite/vite-builder.js.map +1 -0
  79. package/dist/cmd/build/vite/workbench-generator.d.ts +10 -0
  80. package/dist/cmd/build/vite/workbench-generator.d.ts.map +1 -0
  81. package/dist/cmd/build/vite/workbench-generator.js +135 -0
  82. package/dist/cmd/build/vite/workbench-generator.js.map +1 -0
  83. package/dist/cmd/build/vite-bundler.d.ts +23 -0
  84. package/dist/cmd/build/vite-bundler.d.ts.map +1 -0
  85. package/dist/cmd/build/vite-bundler.js +79 -0
  86. package/dist/cmd/build/vite-bundler.js.map +1 -0
  87. package/dist/cmd/cloud/agent/get.d.ts.map +1 -1
  88. package/dist/cmd/cloud/agent/get.js +1 -0
  89. package/dist/cmd/cloud/agent/get.js.map +1 -1
  90. package/dist/cmd/cloud/agent/list.d.ts.map +1 -1
  91. package/dist/cmd/cloud/agent/list.js +1 -0
  92. package/dist/cmd/cloud/agent/list.js.map +1 -1
  93. package/dist/cmd/cloud/db/get.d.ts.map +1 -1
  94. package/dist/cmd/cloud/db/get.js +1 -0
  95. package/dist/cmd/cloud/db/get.js.map +1 -1
  96. package/dist/cmd/cloud/db/list.d.ts.map +1 -1
  97. package/dist/cmd/cloud/db/list.js +1 -0
  98. package/dist/cmd/cloud/db/list.js.map +1 -1
  99. package/dist/cmd/cloud/deploy.d.ts.map +1 -1
  100. package/dist/cmd/cloud/deploy.js +152 -128
  101. package/dist/cmd/cloud/deploy.js.map +1 -1
  102. package/dist/cmd/cloud/deployment/list.d.ts.map +1 -1
  103. package/dist/cmd/cloud/deployment/list.js +4 -0
  104. package/dist/cmd/cloud/deployment/list.js.map +1 -1
  105. package/dist/cmd/cloud/env/list.d.ts.map +1 -1
  106. package/dist/cmd/cloud/env/list.js +1 -0
  107. package/dist/cmd/cloud/env/list.js.map +1 -1
  108. package/dist/cmd/cloud/keyvalue/get.d.ts.map +1 -1
  109. package/dist/cmd/cloud/keyvalue/get.js +1 -0
  110. package/dist/cmd/cloud/keyvalue/get.js.map +1 -1
  111. package/dist/cmd/cloud/keyvalue/keys.d.ts.map +1 -1
  112. package/dist/cmd/cloud/keyvalue/keys.js +1 -0
  113. package/dist/cmd/cloud/keyvalue/keys.js.map +1 -1
  114. package/dist/cmd/cloud/keyvalue/list-namespaces.d.ts.map +1 -1
  115. package/dist/cmd/cloud/keyvalue/list-namespaces.js +1 -0
  116. package/dist/cmd/cloud/keyvalue/list-namespaces.js.map +1 -1
  117. package/dist/cmd/cloud/keyvalue/stats.d.ts.map +1 -1
  118. package/dist/cmd/cloud/keyvalue/stats.js +1 -0
  119. package/dist/cmd/cloud/keyvalue/stats.js.map +1 -1
  120. package/dist/cmd/cloud/secret/list.d.ts.map +1 -1
  121. package/dist/cmd/cloud/secret/list.js +1 -0
  122. package/dist/cmd/cloud/secret/list.js.map +1 -1
  123. package/dist/cmd/cloud/session/list.d.ts.map +1 -1
  124. package/dist/cmd/cloud/session/list.js +4 -0
  125. package/dist/cmd/cloud/session/list.js.map +1 -1
  126. package/dist/cmd/cloud/storage/get.d.ts.map +1 -1
  127. package/dist/cmd/cloud/storage/get.js +1 -0
  128. package/dist/cmd/cloud/storage/get.js.map +1 -1
  129. package/dist/cmd/cloud/storage/list.d.ts.map +1 -1
  130. package/dist/cmd/cloud/storage/list.js +3 -0
  131. package/dist/cmd/cloud/storage/list.js.map +1 -1
  132. package/dist/cmd/cloud/stream/get.d.ts.map +1 -1
  133. package/dist/cmd/cloud/stream/get.js +1 -0
  134. package/dist/cmd/cloud/stream/get.js.map +1 -1
  135. package/dist/cmd/cloud/stream/list.d.ts.map +1 -1
  136. package/dist/cmd/cloud/stream/list.js +1 -0
  137. package/dist/cmd/cloud/stream/list.js.map +1 -1
  138. package/dist/cmd/cloud/vector/get.d.ts.map +1 -1
  139. package/dist/cmd/cloud/vector/get.js +1 -0
  140. package/dist/cmd/cloud/vector/get.js.map +1 -1
  141. package/dist/cmd/cloud/vector/search.d.ts.map +1 -1
  142. package/dist/cmd/cloud/vector/search.js +1 -0
  143. package/dist/cmd/cloud/vector/search.js.map +1 -1
  144. package/dist/cmd/dev/index.d.ts.map +1 -1
  145. package/dist/cmd/dev/index.js +291 -751
  146. package/dist/cmd/dev/index.js.map +1 -1
  147. package/dist/cmd/dev/sync.d.ts +1 -1
  148. package/dist/cmd/dev/sync.d.ts.map +1 -1
  149. package/dist/cmd/dev/sync.js +3 -0
  150. package/dist/cmd/dev/sync.js.map +1 -1
  151. package/dist/cmd/profile/show.d.ts.map +1 -1
  152. package/dist/cmd/profile/show.js +3 -4
  153. package/dist/cmd/profile/show.js.map +1 -1
  154. package/dist/cmd/project/create.d.ts.map +1 -1
  155. package/dist/cmd/project/create.js +3 -4
  156. package/dist/cmd/project/create.js.map +1 -1
  157. package/dist/cmd/project/list.d.ts.map +1 -1
  158. package/dist/cmd/project/list.js +1 -0
  159. package/dist/cmd/project/list.js.map +1 -1
  160. package/dist/cmd/project/show.d.ts.map +1 -1
  161. package/dist/cmd/project/show.js +1 -0
  162. package/dist/cmd/project/show.js.map +1 -1
  163. package/dist/cmd/upgrade/index.d.ts.map +1 -1
  164. package/dist/cmd/upgrade/index.js +5 -3
  165. package/dist/cmd/upgrade/index.js.map +1 -1
  166. package/dist/config.d.ts +1 -1
  167. package/dist/config.d.ts.map +1 -1
  168. package/dist/config.js +29 -11
  169. package/dist/config.js.map +1 -1
  170. package/dist/index.d.ts +1 -1
  171. package/dist/index.d.ts.map +1 -1
  172. package/dist/index.js.map +1 -1
  173. package/dist/runtime-bootstrap.d.ts +3 -2
  174. package/dist/runtime-bootstrap.d.ts.map +1 -1
  175. package/dist/runtime-bootstrap.js +7 -2
  176. package/dist/runtime-bootstrap.js.map +1 -1
  177. package/dist/schemas/deploy.d.ts +1 -1
  178. package/dist/types.d.ts +40 -1
  179. package/dist/types.d.ts.map +1 -1
  180. package/dist/types.js.map +1 -1
  181. package/dist/utils/bun-version-checker.d.ts +11 -0
  182. package/dist/utils/bun-version-checker.d.ts.map +1 -0
  183. package/dist/utils/bun-version-checker.js +56 -0
  184. package/dist/utils/bun-version-checker.js.map +1 -0
  185. package/dist/version-check.d.ts.map +1 -1
  186. package/dist/version-check.js +5 -2
  187. package/dist/version-check.js.map +1 -1
  188. package/package.json +10 -3
  189. package/src/auth.ts +9 -5
  190. package/src/banner.ts +1 -1
  191. package/src/cli.ts +228 -29
  192. package/src/cmd/auth/signup.ts +1 -1
  193. package/src/cmd/build/ast.ts +7 -0
  194. package/src/cmd/build/entry-generator.ts +404 -0
  195. package/src/cmd/build/index.ts +7 -28
  196. package/src/cmd/build/vite/agent-discovery.ts +467 -0
  197. package/src/cmd/build/vite/browser-env-plugin.ts +34 -0
  198. package/src/cmd/build/vite/bun-dev-server.ts +78 -0
  199. package/src/cmd/build/vite/config-loader.ts +70 -0
  200. package/src/cmd/build/vite/index.ts +166 -0
  201. package/src/cmd/build/vite/lifecycle-generator.ts +43 -0
  202. package/src/cmd/build/vite/metadata-generator.ts +602 -0
  203. package/src/cmd/build/vite/patch-plugin.ts +88 -0
  204. package/src/cmd/build/vite/registry-generator.ts +288 -0
  205. package/src/cmd/build/vite/route-discovery.ts +186 -0
  206. package/src/cmd/build/vite/server-bundler.ts +258 -0
  207. package/src/cmd/build/vite/vite-asset-server-config.ts +134 -0
  208. package/src/cmd/build/vite/vite-asset-server.ts +63 -0
  209. package/src/cmd/build/vite/vite-builder.ts +284 -0
  210. package/src/cmd/build/vite/workbench-generator.ts +152 -0
  211. package/src/cmd/build/vite-bundler.ts +110 -0
  212. package/src/cmd/cloud/agent/get.ts +2 -0
  213. package/src/cmd/cloud/agent/list.ts +1 -0
  214. package/src/cmd/cloud/db/get.ts +1 -0
  215. package/src/cmd/cloud/db/list.ts +1 -0
  216. package/src/cmd/cloud/deploy.ts +175 -144
  217. package/src/cmd/cloud/deployment/list.ts +4 -0
  218. package/src/cmd/cloud/env/list.ts +1 -0
  219. package/src/cmd/cloud/keyvalue/get.ts +1 -0
  220. package/src/cmd/cloud/keyvalue/keys.ts +1 -0
  221. package/src/cmd/cloud/keyvalue/list-namespaces.ts +1 -0
  222. package/src/cmd/cloud/keyvalue/stats.ts +2 -0
  223. package/src/cmd/cloud/secret/list.ts +1 -0
  224. package/src/cmd/cloud/session/list.ts +4 -0
  225. package/src/cmd/cloud/storage/get.ts +1 -0
  226. package/src/cmd/cloud/storage/list.ts +4 -0
  227. package/src/cmd/cloud/stream/get.ts +1 -0
  228. package/src/cmd/cloud/stream/list.ts +1 -0
  229. package/src/cmd/cloud/vector/get.ts +1 -0
  230. package/src/cmd/cloud/vector/search.ts +1 -0
  231. package/src/cmd/dev/index.ts +323 -914
  232. package/src/cmd/dev/sync.ts +5 -1
  233. package/src/cmd/profile/show.ts +3 -4
  234. package/src/cmd/project/create.ts +3 -4
  235. package/src/cmd/project/list.ts +1 -0
  236. package/src/cmd/project/show.ts +1 -0
  237. package/src/cmd/upgrade/index.ts +6 -3
  238. package/src/config.ts +31 -11
  239. package/src/index.ts +2 -0
  240. package/src/runtime-bootstrap.ts +8 -2
  241. package/src/types.ts +48 -1
  242. package/src/utils/bun-version-checker.ts +70 -0
  243. package/src/version-check.ts +6 -2
  244. package/dist/cmd/build/bundler.d.ts +0 -22
  245. package/dist/cmd/build/bundler.d.ts.map +0 -1
  246. package/dist/cmd/build/bundler.js +0 -766
  247. package/dist/cmd/build/bundler.js.map +0 -1
  248. package/dist/cmd/build/config-loader.d.ts +0 -16
  249. package/dist/cmd/build/config-loader.d.ts.map +0 -1
  250. package/dist/cmd/build/config-loader.js +0 -227
  251. package/dist/cmd/build/config-loader.js.map +0 -1
  252. package/dist/cmd/build/file.d.ts +0 -2
  253. package/dist/cmd/build/file.d.ts.map +0 -1
  254. package/dist/cmd/build/file.js +0 -10
  255. package/dist/cmd/build/file.js.map +0 -1
  256. package/dist/cmd/build/fix-duplicate-exports.d.ts +0 -2
  257. package/dist/cmd/build/fix-duplicate-exports.d.ts.map +0 -1
  258. package/dist/cmd/build/fix-duplicate-exports.js +0 -170
  259. package/dist/cmd/build/fix-duplicate-exports.js.map +0 -1
  260. package/dist/cmd/build/plugin.d.ts +0 -6
  261. package/dist/cmd/build/plugin.d.ts.map +0 -1
  262. package/dist/cmd/build/plugin.js +0 -645
  263. package/dist/cmd/build/plugin.js.map +0 -1
  264. package/dist/cmd/build/route-discovery.d.ts +0 -54
  265. package/dist/cmd/build/route-discovery.d.ts.map +0 -1
  266. package/dist/cmd/build/route-discovery.js +0 -148
  267. package/dist/cmd/build/route-discovery.js.map +0 -1
  268. package/dist/cmd/build/route-registry.d.ts +0 -38
  269. package/dist/cmd/build/route-registry.d.ts.map +0 -1
  270. package/dist/cmd/build/route-registry.js.map +0 -1
  271. package/src/cmd/build/bundler.ts +0 -927
  272. package/src/cmd/build/config-loader.ts +0 -268
  273. package/src/cmd/build/file.ts +0 -10
  274. package/src/cmd/build/fix-duplicate-exports.ts +0 -207
  275. package/src/cmd/build/plugin.ts +0 -782
  276. package/src/cmd/build/route-discovery.ts +0 -202
  277. package/src/cmd/build/route-registry.ts +0 -222
@@ -0,0 +1,284 @@
1
+ /**
2
+ * Vite Builder
3
+ *
4
+ * Utilities for running Vite builds (client, server, workbench)
5
+ */
6
+
7
+ import { build as viteBuild, type InlineConfig } from 'vite';
8
+ import { join } from 'node:path';
9
+ import react from '@vitejs/plugin-react';
10
+ import type { Logger } from '../../../types';
11
+ import { patchPlugin } from './patch-plugin';
12
+ import { browserEnvPlugin } from './browser-env-plugin';
13
+
14
+ export interface ViteBuildOptions {
15
+ rootDir: string;
16
+ mode: 'client' | 'server' | 'workbench';
17
+ dev?: boolean;
18
+ port?: number;
19
+ projectId?: string;
20
+ orgId?: string;
21
+ region?: string;
22
+ deploymentId?: string;
23
+ workbenchRoute?: string;
24
+ workbenchEnabled?: boolean;
25
+ logger: Logger;
26
+ }
27
+
28
+ /**
29
+ * Run a Vite build for the specified mode
30
+ * Generates vite config in .agentuity/.vite/ and uses it
31
+ */
32
+ export async function runViteBuild(options: ViteBuildOptions): Promise<void> {
33
+ const { rootDir, mode, dev = false, projectId = '', deploymentId = '', logger } = options;
34
+
35
+ logger.debug(`Running Vite build for mode: ${mode}`);
36
+
37
+ // For server mode, use Bun.build (preserves process.env at runtime)
38
+ if (mode === 'server') {
39
+ try {
40
+ // First, generate the entry file
41
+ const { generateEntryFile } = await import('../entry-generator');
42
+ await generateEntryFile({
43
+ rootDir,
44
+ projectId,
45
+ deploymentId: deploymentId || '',
46
+ logger,
47
+ mode: dev ? 'dev' : 'prod',
48
+ });
49
+
50
+ // Then, build with Bun.build
51
+ const { installExternalsAndBuild } = await import('./server-bundler');
52
+ await installExternalsAndBuild({
53
+ rootDir,
54
+ dev,
55
+ logger,
56
+ });
57
+ } catch (error) {
58
+ logger.error('server-bundler import or execution failed:', error);
59
+ throw error;
60
+ }
61
+ return;
62
+ }
63
+
64
+ // For client/workbench, use inline config (no agentuity plugin needed)
65
+ let viteConfig: InlineConfig;
66
+
67
+ if (mode === 'client') {
68
+ // Vite needs index.html as entry point for web apps
69
+ const htmlPath = join(rootDir, 'src', 'web', 'index.html');
70
+
71
+ // Use workbench config passed from runAllBuilds
72
+ const { workbenchEnabled = false, workbenchRoute = '/workbench' } = options;
73
+
74
+ // Load custom user plugins from agentuity.config.ts if it exists
75
+ const plugins = [react(), browserEnvPlugin(), patchPlugin({ logger, dev })];
76
+ const { loadAgentuityConfig } = await import('./config-loader');
77
+ const userConfig = await loadAgentuityConfig(rootDir, logger);
78
+ const userPlugins = userConfig?.plugins || [];
79
+ plugins.push(...userPlugins);
80
+ if (userPlugins.length > 0) {
81
+ logger.debug('Loaded %d custom plugin(s) from agentuity.config.ts', userPlugins.length);
82
+ }
83
+
84
+ // Determine CDN base URL for production builds
85
+ const isLocalRegion = options.region === 'local';
86
+ const cdnBaseUrl =
87
+ !dev && deploymentId && !isLocalRegion
88
+ ? `https://static.agentuity.com/${deploymentId}/`
89
+ : undefined;
90
+
91
+ viteConfig = {
92
+ root: join(rootDir, 'src', 'web'), // Set web dir as root
93
+ plugins,
94
+ envPrefix: ['VITE_', 'AGENTUITY_PUBLIC_', 'PUBLIC_'],
95
+ publicDir: join(rootDir, 'src', 'web', 'public'),
96
+ base: cdnBaseUrl, // CDN URL for production assets
97
+ define: {
98
+ // Set workbench path if enabled (use import.meta.env for client code)
99
+ 'import.meta.env.AGENTUITY_PUBLIC_WORKBENCH_PATH': workbenchEnabled
100
+ ? JSON.stringify(workbenchRoute)
101
+ : 'undefined',
102
+ },
103
+ build: {
104
+ outDir: join(rootDir, '.agentuity/client'),
105
+ rollupOptions: {
106
+ input: htmlPath,
107
+ },
108
+ manifest: true,
109
+ emptyOutDir: true,
110
+ // Disable copying public files - Vite already includes them in assets with hashing
111
+ copyPublicDir: false,
112
+ },
113
+ logLevel: 'warn',
114
+ };
115
+ } else if (mode === 'workbench') {
116
+ const { workbenchRoute = '/workbench' } = options;
117
+ // Ensure route ends with / for Vite base
118
+ const base = workbenchRoute.endsWith('/') ? workbenchRoute : `${workbenchRoute}/`;
119
+
120
+ viteConfig = {
121
+ root: join(rootDir, '.agentuity/workbench-src'), // Use generated workbench source
122
+ base, // All workbench assets are under the configured route
123
+ plugins: [react(), patchPlugin({ logger, dev })],
124
+ envPrefix: ['VITE_', 'AGENTUITY_PUBLIC_', 'PUBLIC_'],
125
+ build: {
126
+ outDir: join(rootDir, '.agentuity/workbench'),
127
+ rollupOptions: {
128
+ input: join(rootDir, '.agentuity/workbench-src/index.html'),
129
+ },
130
+ manifest: true,
131
+ emptyOutDir: true,
132
+ },
133
+ logLevel: 'warn',
134
+ };
135
+ } else {
136
+ throw new Error(`Unknown build mode: ${mode}`);
137
+ }
138
+
139
+ // Build with Vite
140
+ try {
141
+ // Force the build to use the correct mode
142
+ const buildMode = dev ? 'development' : 'production';
143
+
144
+ await viteBuild({
145
+ ...viteConfig,
146
+ mode: buildMode,
147
+ });
148
+
149
+ logger.debug(`Vite build complete for mode: ${mode}`);
150
+ } catch (error) {
151
+ logger.error(`Vite build failed for mode ${mode}:`, error);
152
+ throw error;
153
+ }
154
+ }
155
+
156
+ interface BuildResult {
157
+ workbench: { included: boolean; duration: number };
158
+ client: { included: boolean; duration: number };
159
+ server: { included: boolean; duration: number };
160
+ }
161
+
162
+ /**
163
+ * Run all builds in sequence: client -> workbench (if enabled) -> server
164
+ */
165
+ export async function runAllBuilds(options: Omit<ViteBuildOptions, 'mode'>): Promise<BuildResult> {
166
+ const { rootDir, projectId = '', dev = false, logger } = options;
167
+
168
+ const result: BuildResult = {
169
+ workbench: { included: false, duration: 0 },
170
+ client: { included: false, duration: 0 },
171
+ server: { included: false, duration: 0 },
172
+ };
173
+
174
+ // Load config to check if workbench is enabled (dev mode only)
175
+ const { loadAgentuityConfig, getWorkbenchConfig } = await import('./config-loader');
176
+ const config = await loadAgentuityConfig(rootDir, logger);
177
+ const workbenchConfig = getWorkbenchConfig(config, dev);
178
+
179
+ // Generate workbench files BEFORE any builds if enabled (dev mode only)
180
+ if (workbenchConfig.enabled) {
181
+ logger.debug('Workbench enabled (dev mode), generating files before build...');
182
+ const { generateWorkbenchFiles } = await import('./workbench-generator');
183
+ await generateWorkbenchFiles(rootDir, projectId, workbenchConfig, logger);
184
+ }
185
+
186
+ // Check if web frontend exists
187
+ const hasWebFrontend = await Bun.file(join(rootDir, 'src', 'web', 'index.html')).exists();
188
+
189
+ // 1. Build client (only if web frontend exists)
190
+ if (hasWebFrontend) {
191
+ logger.debug('Building client assets...');
192
+ try {
193
+ const started = Date.now();
194
+ await runViteBuild({
195
+ ...options,
196
+ mode: 'client',
197
+ workbenchEnabled: workbenchConfig.enabled,
198
+ workbenchRoute: workbenchConfig.route,
199
+ });
200
+ result.client.included = true;
201
+ result.client.duration = Date.now() - started;
202
+ } catch (error) {
203
+ logger.error('Client build failed:', error);
204
+ throw error;
205
+ }
206
+ } else {
207
+ logger.debug('Skipping client build - no src/web/index.html found');
208
+ }
209
+
210
+ // 2. Build workbench (if enabled in config)
211
+ if (workbenchConfig.enabled) {
212
+ logger.debug('Building workbench assets...');
213
+ try {
214
+ const started = Date.now();
215
+ await runViteBuild({
216
+ ...options,
217
+ mode: 'workbench',
218
+ workbenchRoute: workbenchConfig.route,
219
+ workbenchEnabled: true,
220
+ });
221
+ result.workbench.included = true;
222
+ result.workbench.duration = Date.now() - started;
223
+ } catch (error) {
224
+ logger.error('Workbench build failed:', error);
225
+ throw error;
226
+ }
227
+ }
228
+
229
+ // 3. Build server
230
+ logger.debug('Building server...');
231
+ try {
232
+ const started = Date.now();
233
+ await runViteBuild({ ...options, mode: 'server' });
234
+ result.server.included = true;
235
+ result.server.duration = Date.now() - started;
236
+ } catch (error) {
237
+ logger.error('Server build failed:', error);
238
+ throw error;
239
+ }
240
+
241
+ // 4. Generate registry and metadata (after all builds complete)
242
+ logger.debug('Generating agent registry and metadata...');
243
+ const { generateMetadata, writeMetadataFile } = await import('./metadata-generator');
244
+ const { generateAgentRegistry, generateRouteRegistry } = await import('./registry-generator');
245
+ const { discoverAgents } = await import('./agent-discovery');
246
+ const { discoverRoutes } = await import('./route-discovery');
247
+
248
+ const srcDir = join(rootDir, 'src');
249
+ const agentMetadata = await discoverAgents(
250
+ srcDir,
251
+ projectId,
252
+ options.deploymentId || '',
253
+ logger
254
+ );
255
+ const { routes, routeInfoList } = await discoverRoutes(
256
+ srcDir,
257
+ projectId,
258
+ options.deploymentId || '',
259
+ logger
260
+ );
261
+
262
+ // Generate agent and route registries for type augmentation
263
+ generateAgentRegistry(srcDir, agentMetadata);
264
+ generateRouteRegistry(srcDir, routeInfoList);
265
+ logger.debug('Agent and route registries generated');
266
+
267
+ // Generate metadata
268
+ const metadata = await generateMetadata({
269
+ rootDir,
270
+ projectId,
271
+ orgId: options.orgId,
272
+ deploymentId: options.deploymentId,
273
+ agents: agentMetadata,
274
+ routes,
275
+ logger,
276
+ dev,
277
+ });
278
+
279
+ writeMetadataFile(rootDir, metadata, dev, logger);
280
+ logger.debug('Registry and metadata generation complete');
281
+
282
+ logger.debug('All builds complete');
283
+ return result;
284
+ }
@@ -0,0 +1,152 @@
1
+ /**
2
+ * Workbench file generator for Vite builds
3
+ */
4
+
5
+ import { join } from 'node:path';
6
+ import { mkdirSync, existsSync, cpSync } from 'node:fs';
7
+ import {
8
+ encodeWorkbenchConfig,
9
+ type WorkbenchConfig as CoreWorkbenchConfig,
10
+ } from '@agentuity/core';
11
+ import type { Logger, WorkbenchConfig } from '../../../types';
12
+
13
+ /**
14
+ * Find the @agentuity/workbench package path
15
+ */
16
+ async function findWorkbenchPackage(rootDir: string, logger: Logger): Promise<string | null> {
17
+ // Try app-level node_modules first
18
+ const appLevel = join(rootDir, 'node_modules', '@agentuity', 'workbench');
19
+ if (existsSync(appLevel)) {
20
+ return appLevel;
21
+ }
22
+
23
+ // Try workspace root (walk up looking for workspace)
24
+ let current = rootDir;
25
+ while (true) {
26
+ const pkgPath = join(current, 'package.json');
27
+ if (existsSync(pkgPath)) {
28
+ try {
29
+ const pkg = JSON.parse(await Bun.file(pkgPath).text());
30
+ if (pkg.workspaces) {
31
+ // Found workspace root
32
+ const workspaceWorkbench = join(current, 'node_modules', '@agentuity', 'workbench');
33
+ if (existsSync(workspaceWorkbench)) {
34
+ return workspaceWorkbench;
35
+ }
36
+ // Try workspace packages directory
37
+ const packagesWorkbench = join(current, 'packages', 'workbench');
38
+ if (existsSync(packagesWorkbench)) {
39
+ return packagesWorkbench;
40
+ }
41
+ }
42
+ } catch {
43
+ // Ignore parse errors
44
+ }
45
+ }
46
+ const parent = join(current, '..');
47
+ if (parent === current) break;
48
+ current = parent;
49
+ }
50
+
51
+ logger.warn('Could not find @agentuity/workbench package');
52
+ return null;
53
+ }
54
+
55
+ /**
56
+ * Generate workbench main.tsx file
57
+ */
58
+ function generateMainTsx(config: CoreWorkbenchConfig): string {
59
+ const encodedConfig = encodeWorkbenchConfig(config);
60
+ return `// Generated workbench entry point
61
+ import React from 'react';
62
+ import { createRoot } from 'react-dom/client';
63
+ import { App } from '@agentuity/workbench';
64
+ import './styles.css'; // Import CSS for Vite HMR
65
+
66
+ // Root element
67
+ const rootElement = document.getElementById('root');
68
+ if (!rootElement) {
69
+ throw new Error('Root element not found');
70
+ }
71
+
72
+ // Render the app
73
+ const root = createRoot(rootElement);
74
+ root.render(<App configBase64="${encodedConfig}" />);
75
+ `;
76
+ }
77
+
78
+ /**
79
+ * Generate workbench index.html file
80
+ */
81
+ function generateIndexHtml(): string {
82
+ return `<!DOCTYPE html>
83
+ <html lang="en">
84
+ <head>
85
+ <meta charset="UTF-8">
86
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
87
+ <title>Agentuity Workbench</title>
88
+ </head>
89
+ <body>
90
+ <div id="root"></div>
91
+ <script type="module" src="./main.tsx"></script>
92
+ </body>
93
+ </html>`;
94
+ }
95
+
96
+ /**
97
+ * Generate workbench files in .agentuity/workbench-src/
98
+ * This keeps them separate from user's source code
99
+ */
100
+ export async function generateWorkbenchFiles(
101
+ rootDir: string,
102
+ projectId: string,
103
+ config: WorkbenchConfig,
104
+ logger: Logger
105
+ ): Promise<void> {
106
+ const workbenchDir = join(rootDir, '.agentuity', 'workbench-src');
107
+
108
+ // Create directory if it doesn't exist
109
+ if (!existsSync(workbenchDir)) {
110
+ mkdirSync(workbenchDir, { recursive: true });
111
+ logger.debug('Created workbench directory: %s', workbenchDir);
112
+ }
113
+
114
+ // Create core workbench config
115
+ const coreConfig: CoreWorkbenchConfig = {
116
+ route: config.route ?? '/workbench',
117
+ headers: config.headers ?? {},
118
+ };
119
+
120
+ // Generate main.tsx
121
+ const mainTsxPath = join(workbenchDir, 'main.tsx');
122
+ await Bun.write(mainTsxPath, generateMainTsx(coreConfig));
123
+ logger.debug('Generated workbench main.tsx');
124
+
125
+ // Generate index.html
126
+ const indexHtmlPath = join(workbenchDir, 'index.html');
127
+ await Bun.write(indexHtmlPath, generateIndexHtml());
128
+ logger.debug('Generated workbench index.html');
129
+
130
+ // Copy standalone CSS from @agentuity/workbench package
131
+ const workbenchPackage = await findWorkbenchPackage(rootDir, logger);
132
+ if (workbenchPackage) {
133
+ const distCss = join(workbenchPackage, 'dist', 'standalone.css');
134
+ const srcCss = join(workbenchPackage, 'src', 'standalone.css');
135
+ const destCss = join(workbenchDir, 'styles.css');
136
+
137
+ if (existsSync(distCss)) {
138
+ cpSync(distCss, destCss);
139
+ logger.debug('Copied workbench standalone.css from dist');
140
+ } else if (existsSync(srcCss)) {
141
+ cpSync(srcCss, destCss);
142
+ logger.warn('Using source standalone.css (ensure @agentuity/workbench is built)');
143
+ } else {
144
+ logger.error('Workbench styles not found in package: %s', workbenchPackage);
145
+ throw new Error('Workbench styles not found. Ensure @agentuity/workbench is installed.');
146
+ }
147
+ } else {
148
+ throw new Error('Could not find @agentuity/workbench package. Ensure it is installed.');
149
+ }
150
+
151
+ logger.trace('Workbench files generated successfully');
152
+ }
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Vite-based bundler
3
+ *
4
+ * Replaces the Bun bundler with Vite for client and server builds
5
+ */
6
+
7
+ import { join } from 'node:path';
8
+ import { stat } from 'node:fs/promises';
9
+ import { StructuredError } from '@agentuity/core';
10
+ import type { Logger } from '../../types';
11
+ import { runAllBuilds } from './vite/vite-builder';
12
+ import { checkAndUpgradeDependencies } from '../../utils/dependency-checker';
13
+ import { checkBunVersion } from '../../utils/bun-version-checker';
14
+ import * as tui from '../../tui';
15
+
16
+ const AppFileNotFoundError = StructuredError('AppFileNotFoundError');
17
+ const BuildFailedError = StructuredError('BuildFailedError');
18
+
19
+ export interface ViteBundleOptions {
20
+ rootDir: string;
21
+ dev?: boolean;
22
+ projectId?: string;
23
+ orgId?: string;
24
+ region?: string;
25
+ deploymentId?: string;
26
+ port?: number;
27
+ logger: Logger;
28
+ }
29
+
30
+ /**
31
+ * Bundle the project using Vite
32
+ */
33
+ export async function viteBundle(options: ViteBundleOptions): Promise<{ output: string[] }> {
34
+ const {
35
+ rootDir,
36
+ projectId = '',
37
+ orgId = '',
38
+ region = 'local',
39
+ deploymentId = '',
40
+ port = 3500,
41
+ logger,
42
+ } = options;
43
+
44
+ const output: string[] = [];
45
+
46
+ // Check Bun version meets minimum requirements
47
+ const versionOutput = await checkBunVersion();
48
+ output.push(...versionOutput);
49
+
50
+ // Verify app.ts exists
51
+ const appFile = join(rootDir, 'app.ts');
52
+ if (!(await Bun.file(appFile).exists())) {
53
+ throw new AppFileNotFoundError({
54
+ message: `App file not found at expected location: ${appFile}`,
55
+ });
56
+ }
57
+
58
+ // Verify src directory exists
59
+ const srcDir = join(rootDir, 'src');
60
+ const srcDirExists = await stat(srcDir)
61
+ .then((s) => s.isDirectory())
62
+ .catch(() => false);
63
+ if (!srcDirExists) {
64
+ throw new BuildFailedError({
65
+ message: `Source directory not found: ${srcDir}`,
66
+ });
67
+ }
68
+
69
+ // Check and upgrade @agentuity/* dependencies if needed
70
+ const upgradeResult = await checkAndUpgradeDependencies(rootDir, logger);
71
+ if (upgradeResult.failed.length > 0 && process.stdin.isTTY) {
72
+ throw new BuildFailedError({
73
+ message: `Failed to upgrade dependencies: ${upgradeResult.failed.join(', ')}`,
74
+ });
75
+ }
76
+
77
+ try {
78
+ // Run all Vite builds (client -> workbench -> server)
79
+ logger.debug('Starting Vite builds...');
80
+
81
+ const result = await runAllBuilds({
82
+ rootDir,
83
+ dev: options.dev || false, // Pass through dev flag for development builds
84
+ port,
85
+ projectId,
86
+ orgId,
87
+ region,
88
+ deploymentId,
89
+ logger,
90
+ });
91
+
92
+ if (result.client.included) {
93
+ output.push(tui.muted(`✓ Client Built in ${result.client.duration}ms`));
94
+ }
95
+ if (result.workbench.included) {
96
+ output.push(tui.muted(`✓ Workbench Built in ${result.workbench.duration}ms`));
97
+ }
98
+ if (result.server.included) {
99
+ output.push(tui.muted(`✓ Server Built in ${result.server.duration}ms`));
100
+ }
101
+
102
+ logger.debug('Vite builds complete');
103
+
104
+ return { output };
105
+ } catch (error) {
106
+ throw new BuildFailedError({
107
+ message: `Build failed: ${error instanceof Error ? error.message : String(error)}`,
108
+ });
109
+ }
110
+ }
@@ -23,6 +23,8 @@ export const getSubcommand = createSubcommand({
23
23
  }),
24
24
  response: AgentSchema,
25
25
  },
26
+ webUrl: (ctx) =>
27
+ `/projects/${encodeURIComponent(ctx.project.projectId)}/agents/${encodeURIComponent(ctx.args.agent_id)}`,
26
28
  async handler(ctx) {
27
29
  const { args, apiClient, project, options } = ctx;
28
30
  const agentId = args.agent_id;
@@ -24,6 +24,7 @@ export const listSubcommand = createSubcommand({
24
24
  }),
25
25
  response: z.array(AgentSchema),
26
26
  },
27
+ webUrl: (ctx) => `/projects/${encodeURIComponent(ctx.project.projectId)}/agents`,
27
28
  async handler(ctx) {
28
29
  const { opts, apiClient, project, options } = ctx;
29
30
  const projectId = project.projectId;
@@ -63,6 +63,7 @@ export const getSubcommand = createSubcommand({
63
63
  }),
64
64
  response: DBGetResponseSchema,
65
65
  },
66
+ webUrl: (ctx) => `/services/database/${encodeURIComponent(ctx.args.name)}`,
66
67
 
67
68
  async handler(ctx) {
68
69
  const { logger, args, opts, options, orgId, region, auth } = ctx;
@@ -44,6 +44,7 @@ export const listSubcommand = createSubcommand({
44
44
  }),
45
45
  response: DBListResponseSchema,
46
46
  },
47
+ webUrl: '/services/database',
47
48
 
48
49
  async handler(ctx) {
49
50
  const { logger, opts, options, orgId, region, auth } = ctx;