@agentuity/cli 0.0.95 → 0.0.97

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 (267) hide show
  1. package/AGENTS.md +84 -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/cli.d.ts.map +1 -1
  7. package/dist/cli.js +190 -27
  8. package/dist/cli.js.map +1 -1
  9. package/dist/cmd/build/entry-generator.d.ts +20 -0
  10. package/dist/cmd/build/entry-generator.d.ts.map +1 -0
  11. package/dist/cmd/build/entry-generator.js +366 -0
  12. package/dist/cmd/build/entry-generator.js.map +1 -0
  13. package/dist/cmd/build/index.d.ts.map +1 -1
  14. package/dist/cmd/build/index.js +5 -23
  15. package/dist/cmd/build/index.js.map +1 -1
  16. package/dist/cmd/build/vite/agent-discovery.d.ts +33 -0
  17. package/dist/cmd/build/vite/agent-discovery.d.ts.map +1 -0
  18. package/dist/cmd/build/vite/agent-discovery.js +297 -0
  19. package/dist/cmd/build/vite/agent-discovery.js.map +1 -0
  20. package/dist/cmd/build/vite/browser-env-plugin.d.ts +9 -0
  21. package/dist/cmd/build/vite/browser-env-plugin.d.ts.map +1 -0
  22. package/dist/cmd/build/vite/browser-env-plugin.js +28 -0
  23. package/dist/cmd/build/vite/browser-env-plugin.js.map +1 -0
  24. package/dist/cmd/build/vite/bun-dev-server.d.ts +29 -0
  25. package/dist/cmd/build/vite/bun-dev-server.d.ts.map +1 -0
  26. package/dist/cmd/build/vite/bun-dev-server.js +54 -0
  27. package/dist/cmd/build/vite/bun-dev-server.js.map +1 -0
  28. package/dist/cmd/build/vite/config-loader.d.ts +23 -0
  29. package/dist/cmd/build/vite/config-loader.d.ts.map +1 -0
  30. package/dist/cmd/build/vite/config-loader.js +50 -0
  31. package/dist/cmd/build/vite/config-loader.js.map +1 -0
  32. package/dist/cmd/build/vite/index.d.ts +26 -0
  33. package/dist/cmd/build/vite/index.d.ts.map +1 -0
  34. package/dist/cmd/build/vite/index.js +127 -0
  35. package/dist/cmd/build/vite/index.js.map +1 -0
  36. package/dist/cmd/build/vite/lifecycle-generator.d.ts +11 -0
  37. package/dist/cmd/build/vite/lifecycle-generator.d.ts.map +1 -0
  38. package/dist/cmd/build/vite/lifecycle-generator.js +35 -0
  39. package/dist/cmd/build/vite/lifecycle-generator.js.map +1 -0
  40. package/dist/cmd/build/vite/metadata-generator.d.ts +32 -0
  41. package/dist/cmd/build/vite/metadata-generator.d.ts.map +1 -0
  42. package/dist/cmd/build/vite/metadata-generator.js +489 -0
  43. package/dist/cmd/build/vite/metadata-generator.js.map +1 -0
  44. package/dist/cmd/build/vite/patch-plugin.d.ts +21 -0
  45. package/dist/cmd/build/vite/patch-plugin.d.ts.map +1 -0
  46. package/dist/cmd/build/vite/patch-plugin.js +70 -0
  47. package/dist/cmd/build/vite/patch-plugin.js.map +1 -0
  48. package/dist/cmd/build/vite/registry-generator.d.ts +19 -0
  49. package/dist/cmd/build/vite/registry-generator.d.ts.map +1 -0
  50. package/dist/cmd/build/{route-registry.js → vite/registry-generator.js} +126 -48
  51. package/dist/cmd/build/vite/registry-generator.js.map +1 -0
  52. package/dist/cmd/build/vite/route-discovery.d.ts +58 -0
  53. package/dist/cmd/build/vite/route-discovery.d.ts.map +1 -0
  54. package/dist/cmd/build/vite/route-discovery.js +125 -0
  55. package/dist/cmd/build/vite/route-discovery.js.map +1 -0
  56. package/dist/cmd/build/vite/server-bundler.d.ts +16 -0
  57. package/dist/cmd/build/vite/server-bundler.d.ts.map +1 -0
  58. package/dist/cmd/build/vite/server-bundler.js +194 -0
  59. package/dist/cmd/build/vite/server-bundler.js.map +1 -0
  60. package/dist/cmd/build/vite/vite-asset-server-config.d.ts +19 -0
  61. package/dist/cmd/build/vite/vite-asset-server-config.d.ts.map +1 -0
  62. package/dist/cmd/build/vite/vite-asset-server-config.js +105 -0
  63. package/dist/cmd/build/vite/vite-asset-server-config.js.map +1 -0
  64. package/dist/cmd/build/vite/vite-asset-server.d.ts +23 -0
  65. package/dist/cmd/build/vite/vite-asset-server.d.ts.map +1 -0
  66. package/dist/cmd/build/vite/vite-asset-server.js +41 -0
  67. package/dist/cmd/build/vite/vite-asset-server.js.map +1 -0
  68. package/dist/cmd/build/vite/vite-builder.d.ts +44 -0
  69. package/dist/cmd/build/vite/vite-builder.d.ts.map +1 -0
  70. package/dist/cmd/build/vite/vite-builder.js +234 -0
  71. package/dist/cmd/build/vite/vite-builder.js.map +1 -0
  72. package/dist/cmd/build/vite/workbench-generator.d.ts +10 -0
  73. package/dist/cmd/build/vite/workbench-generator.d.ts.map +1 -0
  74. package/dist/cmd/build/vite/workbench-generator.js +135 -0
  75. package/dist/cmd/build/vite/workbench-generator.js.map +1 -0
  76. package/dist/cmd/build/vite-bundler.d.ts +23 -0
  77. package/dist/cmd/build/vite-bundler.d.ts.map +1 -0
  78. package/dist/cmd/build/vite-bundler.js +79 -0
  79. package/dist/cmd/build/vite-bundler.js.map +1 -0
  80. package/dist/cmd/cloud/agent/get.d.ts.map +1 -1
  81. package/dist/cmd/cloud/agent/get.js +1 -0
  82. package/dist/cmd/cloud/agent/get.js.map +1 -1
  83. package/dist/cmd/cloud/agent/list.d.ts.map +1 -1
  84. package/dist/cmd/cloud/agent/list.js +1 -0
  85. package/dist/cmd/cloud/agent/list.js.map +1 -1
  86. package/dist/cmd/cloud/db/get.d.ts.map +1 -1
  87. package/dist/cmd/cloud/db/get.js +1 -0
  88. package/dist/cmd/cloud/db/get.js.map +1 -1
  89. package/dist/cmd/cloud/db/list.d.ts.map +1 -1
  90. package/dist/cmd/cloud/db/list.js +1 -0
  91. package/dist/cmd/cloud/db/list.js.map +1 -1
  92. package/dist/cmd/cloud/deploy.d.ts.map +1 -1
  93. package/dist/cmd/cloud/deploy.js +152 -128
  94. package/dist/cmd/cloud/deploy.js.map +1 -1
  95. package/dist/cmd/cloud/deployment/list.d.ts.map +1 -1
  96. package/dist/cmd/cloud/deployment/list.js +4 -0
  97. package/dist/cmd/cloud/deployment/list.js.map +1 -1
  98. package/dist/cmd/cloud/env/list.d.ts.map +1 -1
  99. package/dist/cmd/cloud/env/list.js +1 -0
  100. package/dist/cmd/cloud/env/list.js.map +1 -1
  101. package/dist/cmd/cloud/keyvalue/get.d.ts.map +1 -1
  102. package/dist/cmd/cloud/keyvalue/get.js +1 -0
  103. package/dist/cmd/cloud/keyvalue/get.js.map +1 -1
  104. package/dist/cmd/cloud/keyvalue/keys.d.ts.map +1 -1
  105. package/dist/cmd/cloud/keyvalue/keys.js +1 -0
  106. package/dist/cmd/cloud/keyvalue/keys.js.map +1 -1
  107. package/dist/cmd/cloud/keyvalue/list-namespaces.d.ts.map +1 -1
  108. package/dist/cmd/cloud/keyvalue/list-namespaces.js +1 -0
  109. package/dist/cmd/cloud/keyvalue/list-namespaces.js.map +1 -1
  110. package/dist/cmd/cloud/keyvalue/stats.d.ts.map +1 -1
  111. package/dist/cmd/cloud/keyvalue/stats.js +1 -0
  112. package/dist/cmd/cloud/keyvalue/stats.js.map +1 -1
  113. package/dist/cmd/cloud/secret/list.d.ts.map +1 -1
  114. package/dist/cmd/cloud/secret/list.js +1 -0
  115. package/dist/cmd/cloud/secret/list.js.map +1 -1
  116. package/dist/cmd/cloud/session/list.d.ts.map +1 -1
  117. package/dist/cmd/cloud/session/list.js +4 -0
  118. package/dist/cmd/cloud/session/list.js.map +1 -1
  119. package/dist/cmd/cloud/storage/get.d.ts.map +1 -1
  120. package/dist/cmd/cloud/storage/get.js +1 -0
  121. package/dist/cmd/cloud/storage/get.js.map +1 -1
  122. package/dist/cmd/cloud/storage/list.d.ts.map +1 -1
  123. package/dist/cmd/cloud/storage/list.js +3 -0
  124. package/dist/cmd/cloud/storage/list.js.map +1 -1
  125. package/dist/cmd/cloud/stream/get.d.ts.map +1 -1
  126. package/dist/cmd/cloud/stream/get.js +1 -0
  127. package/dist/cmd/cloud/stream/get.js.map +1 -1
  128. package/dist/cmd/cloud/stream/list.d.ts.map +1 -1
  129. package/dist/cmd/cloud/stream/list.js +1 -0
  130. package/dist/cmd/cloud/stream/list.js.map +1 -1
  131. package/dist/cmd/cloud/vector/get.d.ts.map +1 -1
  132. package/dist/cmd/cloud/vector/get.js +1 -0
  133. package/dist/cmd/cloud/vector/get.js.map +1 -1
  134. package/dist/cmd/cloud/vector/search.d.ts.map +1 -1
  135. package/dist/cmd/cloud/vector/search.js +1 -0
  136. package/dist/cmd/cloud/vector/search.js.map +1 -1
  137. package/dist/cmd/dev/index.d.ts.map +1 -1
  138. package/dist/cmd/dev/index.js +289 -758
  139. package/dist/cmd/dev/index.js.map +1 -1
  140. package/dist/cmd/dev/sync.d.ts +1 -1
  141. package/dist/cmd/dev/sync.d.ts.map +1 -1
  142. package/dist/cmd/dev/sync.js +3 -0
  143. package/dist/cmd/dev/sync.js.map +1 -1
  144. package/dist/cmd/profile/show.d.ts.map +1 -1
  145. package/dist/cmd/profile/show.js +3 -4
  146. package/dist/cmd/profile/show.js.map +1 -1
  147. package/dist/cmd/project/create.d.ts.map +1 -1
  148. package/dist/cmd/project/create.js +3 -4
  149. package/dist/cmd/project/create.js.map +1 -1
  150. package/dist/cmd/project/list.d.ts.map +1 -1
  151. package/dist/cmd/project/list.js +1 -0
  152. package/dist/cmd/project/list.js.map +1 -1
  153. package/dist/cmd/project/show.d.ts.map +1 -1
  154. package/dist/cmd/project/show.js +1 -0
  155. package/dist/cmd/project/show.js.map +1 -1
  156. package/dist/cmd/upgrade/index.d.ts.map +1 -1
  157. package/dist/cmd/upgrade/index.js +43 -7
  158. package/dist/cmd/upgrade/index.js.map +1 -1
  159. package/dist/config.d.ts +1 -1
  160. package/dist/config.d.ts.map +1 -1
  161. package/dist/config.js +29 -11
  162. package/dist/config.js.map +1 -1
  163. package/dist/index.d.ts +1 -1
  164. package/dist/index.d.ts.map +1 -1
  165. package/dist/index.js.map +1 -1
  166. package/dist/runtime-bootstrap.d.ts +3 -2
  167. package/dist/runtime-bootstrap.d.ts.map +1 -1
  168. package/dist/runtime-bootstrap.js +7 -2
  169. package/dist/runtime-bootstrap.js.map +1 -1
  170. package/dist/schemas/deploy.d.ts +1 -1
  171. package/dist/types.d.ts +40 -1
  172. package/dist/types.d.ts.map +1 -1
  173. package/dist/types.js.map +1 -1
  174. package/dist/utils/bun-version-checker.d.ts +11 -0
  175. package/dist/utils/bun-version-checker.d.ts.map +1 -0
  176. package/dist/utils/bun-version-checker.js +56 -0
  177. package/dist/utils/bun-version-checker.js.map +1 -0
  178. package/dist/version-check.d.ts.map +1 -1
  179. package/dist/version-check.js +5 -2
  180. package/dist/version-check.js.map +1 -1
  181. package/package.json +11 -3
  182. package/src/auth.ts +9 -5
  183. package/src/cli.ts +228 -29
  184. package/src/cmd/build/entry-generator.ts +404 -0
  185. package/src/cmd/build/index.ts +7 -28
  186. package/src/cmd/build/vite/agent-discovery.ts +467 -0
  187. package/src/cmd/build/vite/browser-env-plugin.ts +34 -0
  188. package/src/cmd/build/vite/bun-dev-server.ts +78 -0
  189. package/src/cmd/build/vite/config-loader.ts +70 -0
  190. package/src/cmd/build/vite/index.ts +166 -0
  191. package/src/cmd/build/vite/lifecycle-generator.ts +43 -0
  192. package/src/cmd/build/vite/metadata-generator.ts +602 -0
  193. package/src/cmd/build/vite/patch-plugin.ts +88 -0
  194. package/src/cmd/build/vite/registry-generator.ts +288 -0
  195. package/src/cmd/build/vite/route-discovery.ts +186 -0
  196. package/src/cmd/build/vite/server-bundler.ts +258 -0
  197. package/src/cmd/build/vite/vite-asset-server-config.ts +134 -0
  198. package/src/cmd/build/vite/vite-asset-server.ts +66 -0
  199. package/src/cmd/build/vite/vite-builder.ts +288 -0
  200. package/src/cmd/build/vite/workbench-generator.ts +152 -0
  201. package/src/cmd/build/vite-bundler.ts +110 -0
  202. package/src/cmd/cloud/agent/get.ts +2 -0
  203. package/src/cmd/cloud/agent/list.ts +1 -0
  204. package/src/cmd/cloud/db/get.ts +1 -0
  205. package/src/cmd/cloud/db/list.ts +1 -0
  206. package/src/cmd/cloud/deploy.ts +175 -144
  207. package/src/cmd/cloud/deployment/list.ts +4 -0
  208. package/src/cmd/cloud/env/list.ts +1 -0
  209. package/src/cmd/cloud/keyvalue/get.ts +1 -0
  210. package/src/cmd/cloud/keyvalue/keys.ts +1 -0
  211. package/src/cmd/cloud/keyvalue/list-namespaces.ts +1 -0
  212. package/src/cmd/cloud/keyvalue/stats.ts +2 -0
  213. package/src/cmd/cloud/secret/list.ts +1 -0
  214. package/src/cmd/cloud/session/list.ts +4 -0
  215. package/src/cmd/cloud/storage/get.ts +1 -0
  216. package/src/cmd/cloud/storage/list.ts +4 -0
  217. package/src/cmd/cloud/stream/get.ts +1 -0
  218. package/src/cmd/cloud/stream/list.ts +1 -0
  219. package/src/cmd/cloud/vector/get.ts +1 -0
  220. package/src/cmd/cloud/vector/search.ts +1 -0
  221. package/src/cmd/dev/index.ts +319 -921
  222. package/src/cmd/dev/sync.ts +5 -1
  223. package/src/cmd/profile/show.ts +3 -4
  224. package/src/cmd/project/create.ts +3 -4
  225. package/src/cmd/project/list.ts +1 -0
  226. package/src/cmd/project/show.ts +1 -0
  227. package/src/cmd/upgrade/index.ts +52 -8
  228. package/src/config.ts +31 -11
  229. package/src/index.ts +2 -0
  230. package/src/runtime-bootstrap.ts +8 -2
  231. package/src/types.ts +48 -1
  232. package/src/utils/bun-version-checker.ts +70 -0
  233. package/src/version-check.ts +6 -2
  234. package/dist/cmd/build/bundler.d.ts +0 -28
  235. package/dist/cmd/build/bundler.d.ts.map +0 -1
  236. package/dist/cmd/build/bundler.js +0 -800
  237. package/dist/cmd/build/bundler.js.map +0 -1
  238. package/dist/cmd/build/config-loader.d.ts +0 -16
  239. package/dist/cmd/build/config-loader.d.ts.map +0 -1
  240. package/dist/cmd/build/config-loader.js +0 -227
  241. package/dist/cmd/build/config-loader.js.map +0 -1
  242. package/dist/cmd/build/file.d.ts +0 -2
  243. package/dist/cmd/build/file.d.ts.map +0 -1
  244. package/dist/cmd/build/file.js +0 -10
  245. package/dist/cmd/build/file.js.map +0 -1
  246. package/dist/cmd/build/fix-duplicate-exports.d.ts +0 -2
  247. package/dist/cmd/build/fix-duplicate-exports.d.ts.map +0 -1
  248. package/dist/cmd/build/fix-duplicate-exports.js +0 -170
  249. package/dist/cmd/build/fix-duplicate-exports.js.map +0 -1
  250. package/dist/cmd/build/plugin.d.ts +0 -6
  251. package/dist/cmd/build/plugin.d.ts.map +0 -1
  252. package/dist/cmd/build/plugin.js +0 -645
  253. package/dist/cmd/build/plugin.js.map +0 -1
  254. package/dist/cmd/build/route-discovery.d.ts +0 -54
  255. package/dist/cmd/build/route-discovery.d.ts.map +0 -1
  256. package/dist/cmd/build/route-discovery.js +0 -148
  257. package/dist/cmd/build/route-discovery.js.map +0 -1
  258. package/dist/cmd/build/route-registry.d.ts +0 -38
  259. package/dist/cmd/build/route-registry.d.ts.map +0 -1
  260. package/dist/cmd/build/route-registry.js.map +0 -1
  261. package/src/cmd/build/bundler.ts +0 -965
  262. package/src/cmd/build/config-loader.ts +0 -268
  263. package/src/cmd/build/file.ts +0 -10
  264. package/src/cmd/build/fix-duplicate-exports.ts +0 -207
  265. package/src/cmd/build/plugin.ts +0 -782
  266. package/src/cmd/build/route-discovery.ts +0 -202
  267. package/src/cmd/build/route-registry.ts +0 -222
@@ -0,0 +1,288 @@
1
+ /**
2
+ * Vite Builder
3
+ *
4
+ * Utilities for running Vite builds (client, server, workbench)
5
+ */
6
+
7
+ import { join } from 'node:path';
8
+ import type { InlineConfig } from 'vite';
9
+ import type { Logger } from '../../../types';
10
+ import { patchPlugin } from './patch-plugin';
11
+ import { browserEnvPlugin } from './browser-env-plugin';
12
+
13
+ export interface ViteBuildOptions {
14
+ rootDir: string;
15
+ mode: 'client' | 'server' | 'workbench';
16
+ dev?: boolean;
17
+ port?: number;
18
+ projectId?: string;
19
+ orgId?: string;
20
+ region?: string;
21
+ deploymentId?: string;
22
+ workbenchRoute?: string;
23
+ workbenchEnabled?: boolean;
24
+ logger: Logger;
25
+ }
26
+
27
+ /**
28
+ * Run a Vite build for the specified mode
29
+ * Generates vite config in .agentuity/.vite/ and uses it
30
+ */
31
+ export async function runViteBuild(options: ViteBuildOptions): Promise<void> {
32
+ const { rootDir, mode, dev = false, projectId = '', deploymentId = '', logger } = options;
33
+
34
+ logger.debug(`Running Vite build for mode: ${mode}`);
35
+
36
+ // For server mode, use Bun.build (preserves process.env at runtime)
37
+ if (mode === 'server') {
38
+ try {
39
+ // First, generate the entry file
40
+ const { generateEntryFile } = await import('../entry-generator');
41
+ await generateEntryFile({
42
+ rootDir,
43
+ projectId,
44
+ deploymentId: deploymentId || '',
45
+ logger,
46
+ mode: dev ? 'dev' : 'prod',
47
+ });
48
+
49
+ // Then, build with Bun.build
50
+ const { installExternalsAndBuild } = await import('./server-bundler');
51
+ await installExternalsAndBuild({
52
+ rootDir,
53
+ dev,
54
+ logger,
55
+ });
56
+ } catch (error) {
57
+ logger.error('server-bundler import or execution failed:', error);
58
+ throw error;
59
+ }
60
+ return;
61
+ }
62
+
63
+ // Dynamically import vite and react plugin
64
+ const { build: viteBuild } = await import('vite');
65
+ const reactModule = await import('@vitejs/plugin-react');
66
+ const react = reactModule.default;
67
+
68
+ // For client/workbench, use inline config (no agentuity plugin needed)
69
+ let viteConfig: InlineConfig;
70
+
71
+ if (mode === 'client') {
72
+ // Vite needs index.html as entry point for web apps
73
+ const htmlPath = join(rootDir, 'src', 'web', 'index.html');
74
+
75
+ // Use workbench config passed from runAllBuilds
76
+ const { workbenchEnabled = false, workbenchRoute = '/workbench' } = options;
77
+
78
+ // Load custom user plugins from agentuity.config.ts if it exists
79
+ const plugins = [react(), browserEnvPlugin(), patchPlugin({ logger, dev })];
80
+ const { loadAgentuityConfig } = await import('./config-loader');
81
+ const userConfig = await loadAgentuityConfig(rootDir, logger);
82
+ const userPlugins = userConfig?.plugins || [];
83
+ plugins.push(...userPlugins);
84
+ if (userPlugins.length > 0) {
85
+ logger.debug('Loaded %d custom plugin(s) from agentuity.config.ts', userPlugins.length);
86
+ }
87
+
88
+ // Determine CDN base URL for production builds
89
+ const isLocalRegion = options.region === 'local';
90
+ const cdnBaseUrl =
91
+ !dev && deploymentId && !isLocalRegion
92
+ ? `https://static.agentuity.com/${deploymentId}/`
93
+ : undefined;
94
+
95
+ viteConfig = {
96
+ root: join(rootDir, 'src', 'web'), // Set web dir as root
97
+ plugins,
98
+ envPrefix: ['VITE_', 'AGENTUITY_PUBLIC_', 'PUBLIC_'],
99
+ publicDir: join(rootDir, 'src', 'web', 'public'),
100
+ base: cdnBaseUrl, // CDN URL for production assets
101
+ define: {
102
+ // Set workbench path if enabled (use import.meta.env for client code)
103
+ 'import.meta.env.AGENTUITY_PUBLIC_WORKBENCH_PATH': workbenchEnabled
104
+ ? JSON.stringify(workbenchRoute)
105
+ : 'undefined',
106
+ },
107
+ build: {
108
+ outDir: join(rootDir, '.agentuity/client'),
109
+ rollupOptions: {
110
+ input: htmlPath,
111
+ },
112
+ manifest: true,
113
+ emptyOutDir: true,
114
+ // Disable copying public files - Vite already includes them in assets with hashing
115
+ copyPublicDir: false,
116
+ },
117
+ logLevel: 'warn',
118
+ };
119
+ } else if (mode === 'workbench') {
120
+ const { workbenchRoute = '/workbench' } = options;
121
+ // Ensure route ends with / for Vite base
122
+ const base = workbenchRoute.endsWith('/') ? workbenchRoute : `${workbenchRoute}/`;
123
+
124
+ viteConfig = {
125
+ root: join(rootDir, '.agentuity/workbench-src'), // Use generated workbench source
126
+ base, // All workbench assets are under the configured route
127
+ plugins: [react(), patchPlugin({ logger, dev })],
128
+ envPrefix: ['VITE_', 'AGENTUITY_PUBLIC_', 'PUBLIC_'],
129
+ build: {
130
+ outDir: join(rootDir, '.agentuity/workbench'),
131
+ rollupOptions: {
132
+ input: join(rootDir, '.agentuity/workbench-src/index.html'),
133
+ },
134
+ manifest: true,
135
+ emptyOutDir: true,
136
+ },
137
+ logLevel: 'warn',
138
+ };
139
+ } else {
140
+ throw new Error(`Unknown build mode: ${mode}`);
141
+ }
142
+
143
+ // Build with Vite
144
+ try {
145
+ // Force the build to use the correct mode
146
+ const buildMode = dev ? 'development' : 'production';
147
+
148
+ await viteBuild({
149
+ ...viteConfig,
150
+ mode: buildMode,
151
+ });
152
+
153
+ logger.debug(`Vite build complete for mode: ${mode}`);
154
+ } catch (error) {
155
+ logger.error(`Vite build failed for mode ${mode}:`, error);
156
+ throw error;
157
+ }
158
+ }
159
+
160
+ interface BuildResult {
161
+ workbench: { included: boolean; duration: number };
162
+ client: { included: boolean; duration: number };
163
+ server: { included: boolean; duration: number };
164
+ }
165
+
166
+ /**
167
+ * Run all builds in sequence: client -> workbench (if enabled) -> server
168
+ */
169
+ export async function runAllBuilds(options: Omit<ViteBuildOptions, 'mode'>): Promise<BuildResult> {
170
+ const { rootDir, projectId = '', dev = false, logger } = options;
171
+
172
+ const result: BuildResult = {
173
+ workbench: { included: false, duration: 0 },
174
+ client: { included: false, duration: 0 },
175
+ server: { included: false, duration: 0 },
176
+ };
177
+
178
+ // Load config to check if workbench is enabled (dev mode only)
179
+ const { loadAgentuityConfig, getWorkbenchConfig } = await import('./config-loader');
180
+ const config = await loadAgentuityConfig(rootDir, logger);
181
+ const workbenchConfig = getWorkbenchConfig(config, dev);
182
+
183
+ // Generate workbench files BEFORE any builds if enabled (dev mode only)
184
+ if (workbenchConfig.enabled) {
185
+ logger.debug('Workbench enabled (dev mode), generating files before build...');
186
+ const { generateWorkbenchFiles } = await import('./workbench-generator');
187
+ await generateWorkbenchFiles(rootDir, projectId, workbenchConfig, logger);
188
+ }
189
+
190
+ // Check if web frontend exists
191
+ const hasWebFrontend = await Bun.file(join(rootDir, 'src', 'web', 'index.html')).exists();
192
+
193
+ // 1. Build client (only if web frontend exists)
194
+ if (hasWebFrontend) {
195
+ logger.debug('Building client assets...');
196
+ try {
197
+ const started = Date.now();
198
+ await runViteBuild({
199
+ ...options,
200
+ mode: 'client',
201
+ workbenchEnabled: workbenchConfig.enabled,
202
+ workbenchRoute: workbenchConfig.route,
203
+ });
204
+ result.client.included = true;
205
+ result.client.duration = Date.now() - started;
206
+ } catch (error) {
207
+ logger.error('Client build failed:', error);
208
+ throw error;
209
+ }
210
+ } else {
211
+ logger.debug('Skipping client build - no src/web/index.html found');
212
+ }
213
+
214
+ // 2. Build workbench (if enabled in config)
215
+ if (workbenchConfig.enabled) {
216
+ logger.debug('Building workbench assets...');
217
+ try {
218
+ const started = Date.now();
219
+ await runViteBuild({
220
+ ...options,
221
+ mode: 'workbench',
222
+ workbenchRoute: workbenchConfig.route,
223
+ workbenchEnabled: true,
224
+ });
225
+ result.workbench.included = true;
226
+ result.workbench.duration = Date.now() - started;
227
+ } catch (error) {
228
+ logger.error('Workbench build failed:', error);
229
+ throw error;
230
+ }
231
+ }
232
+
233
+ // 3. Build server
234
+ logger.debug('Building server...');
235
+ try {
236
+ const started = Date.now();
237
+ await runViteBuild({ ...options, mode: 'server' });
238
+ result.server.included = true;
239
+ result.server.duration = Date.now() - started;
240
+ } catch (error) {
241
+ logger.error('Server build failed:', error);
242
+ throw error;
243
+ }
244
+
245
+ // 4. Generate registry and metadata (after all builds complete)
246
+ logger.debug('Generating agent registry and metadata...');
247
+ const { generateMetadata, writeMetadataFile } = await import('./metadata-generator');
248
+ const { generateAgentRegistry, generateRouteRegistry } = await import('./registry-generator');
249
+ const { discoverAgents } = await import('./agent-discovery');
250
+ const { discoverRoutes } = await import('./route-discovery');
251
+
252
+ const srcDir = join(rootDir, 'src');
253
+ const agentMetadata = await discoverAgents(
254
+ srcDir,
255
+ projectId,
256
+ options.deploymentId || '',
257
+ logger
258
+ );
259
+ const { routes, routeInfoList } = await discoverRoutes(
260
+ srcDir,
261
+ projectId,
262
+ options.deploymentId || '',
263
+ logger
264
+ );
265
+
266
+ // Generate agent and route registries for type augmentation
267
+ generateAgentRegistry(srcDir, agentMetadata);
268
+ generateRouteRegistry(srcDir, routeInfoList);
269
+ logger.debug('Agent and route registries generated');
270
+
271
+ // Generate metadata
272
+ const metadata = await generateMetadata({
273
+ rootDir,
274
+ projectId,
275
+ orgId: options.orgId,
276
+ deploymentId: options.deploymentId,
277
+ agents: agentMetadata,
278
+ routes,
279
+ logger,
280
+ dev,
281
+ });
282
+
283
+ writeMetadataFile(rootDir, metadata, dev, logger);
284
+ logger.debug('Registry and metadata generation complete');
285
+
286
+ logger.debug('All builds complete');
287
+ return result;
288
+ }
@@ -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;