@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,258 @@
1
+ /**
2
+ * Server bundler using Bun.build with external dependency management
3
+ * Handles installing externals into .agentuity/node_modules for production
4
+ */
5
+
6
+ import { join } from 'node:path';
7
+ import { readdir, stat } from 'node:fs/promises';
8
+ import type { Logger } from '../../../types';
9
+
10
+ export interface ServerBundleOptions {
11
+ rootDir: string;
12
+ dev: boolean;
13
+ logger: Logger;
14
+ }
15
+
16
+ /**
17
+ * Install external dependencies and build server bundle
18
+ * For production: installs externals into .agentuity/node_modules BEFORE bundling
19
+ */
20
+ export async function installExternalsAndBuild(options: ServerBundleOptions): Promise<void> {
21
+ const { rootDir, dev, logger } = options;
22
+
23
+ logger.debug('[server-bundler] Starting server bundle process');
24
+
25
+ const entryPath = join(rootDir, '.agentuity/app.generated.ts');
26
+ const outDir = join(rootDir, '.agentuity');
27
+
28
+ logger.debug(`[server-bundler] Entry: ${entryPath}, OutDir: ${outDir}`);
29
+
30
+ // Runtime externals: native modules and packages that need to be external
31
+ // These WILL be installed into .agentuity/node_modules for production
32
+ const runtimeExternals = ['bun', 'fsevents', 'chromium-bidi', 'sharp', 'ws'];
33
+
34
+ // Build tool externals: packages that should be external but NOT installed
35
+ // These are devDependencies that may exist in node_modules but aren't needed at runtime
36
+ const buildToolExternals = ['@babel/*', 'lightningcss', '@vitejs/*', 'vite', 'esbuild'];
37
+
38
+ // Load custom externals from agentuity.config.ts if it exists
39
+ const customExternals: string[] = [];
40
+ const configPath = join(rootDir, 'agentuity.config.ts');
41
+ if (await Bun.file(configPath).exists()) {
42
+ try {
43
+ const config = await import(configPath);
44
+ const userConfig = config.default;
45
+ if (userConfig?.build?.external && Array.isArray(userConfig.build.external)) {
46
+ customExternals.push(
47
+ ...userConfig.build.external.filter((e: unknown) => typeof e === 'string')
48
+ );
49
+ }
50
+ } catch (error) {
51
+ logger.info('Failed to load agentuity.config.ts for externals:', error);
52
+ }
53
+ }
54
+
55
+ // Combine runtime externals with custom externals for installation
56
+ const installPatterns = [...runtimeExternals, ...customExternals];
57
+
58
+ // All external patterns (runtime + build tools + custom) for Bun.build
59
+ const allExternalPatterns = [...runtimeExternals, ...buildToolExternals, ...customExternals];
60
+ let external = allExternalPatterns;
61
+
62
+ // For production builds: install ONLY runtime externals, then discover full dependency tree
63
+ if (!dev) {
64
+ logger.debug('Installing externalized packages to discover full dependency tree...');
65
+
66
+ // Step 1: Collect packages matching RUNTIME external patterns (skip build tools)
67
+ const externalInstalls: string[] = [];
68
+ for (const pattern of installPatterns) {
69
+ if (pattern.endsWith('/*')) {
70
+ // Pattern like @org/* - install all packages under that scope
71
+ const prefix = pattern.slice(0, -2);
72
+ const nmDir = join(rootDir, 'node_modules', prefix);
73
+ const nmDirExists = await stat(nmDir)
74
+ .then((s) => s.isDirectory())
75
+ .catch(() => false);
76
+ if (nmDirExists) {
77
+ const entries = await readdir(nmDir);
78
+ for (const entry of entries) {
79
+ const pkgName = `${prefix}/${entry}`;
80
+ const pkgJsonExists = await Bun.file(
81
+ join(rootDir, 'node_modules', pkgName, 'package.json')
82
+ ).exists();
83
+ if (pkgJsonExists) {
84
+ externalInstalls.push(pkgName);
85
+ }
86
+ }
87
+ }
88
+ } else {
89
+ // Exact package name
90
+ const pkgJsonExists = await Bun.file(
91
+ join(rootDir, 'node_modules', pattern, 'package.json')
92
+ ).exists();
93
+ if (pkgJsonExists) {
94
+ externalInstalls.push(pattern);
95
+ }
96
+ }
97
+ }
98
+
99
+ // Step 2: Write minimal package.json and install externals
100
+ if (externalInstalls.length > 0) {
101
+ const pkgPath = join(rootDir, 'package.json');
102
+ const pkgContents = await Bun.file(pkgPath).json();
103
+
104
+ await Bun.write(
105
+ join(outDir, 'package.json'),
106
+ JSON.stringify({ name: pkgContents.name, version: pkgContents.version }, null, 2)
107
+ );
108
+
109
+ logger.debug(
110
+ 'Installing %d packages: %s',
111
+ externalInstalls.length,
112
+ externalInstalls.join(', ')
113
+ );
114
+
115
+ // Install with Bun (production mode, no scripts, linux target for deployment)
116
+ const proc = Bun.spawn(
117
+ [
118
+ 'bun',
119
+ 'install',
120
+ '--no-save',
121
+ '--ignore-scripts',
122
+ '--target=bun-linux-x64',
123
+ ...externalInstalls,
124
+ ],
125
+ {
126
+ cwd: outDir,
127
+ stdout: 'pipe',
128
+ stderr: 'pipe',
129
+ }
130
+ );
131
+
132
+ const exitCode = await proc.exited;
133
+
134
+ if (exitCode !== 0) {
135
+ const stderr = await new Response(proc.stderr).text();
136
+ throw new Error(
137
+ `Failed to install external dependencies (exit code ${exitCode}):\n${stderr}`
138
+ );
139
+ }
140
+
141
+ // Step 3: Scan what actually got installed (includes transitive dependencies)
142
+ const installedNmDir = join(outDir, 'node_modules');
143
+ const installedNmDirExists = await stat(installedNmDir)
144
+ .then((s) => s.isDirectory())
145
+ .catch(() => false);
146
+ if (installedNmDirExists) {
147
+ const allInstalled: string[] = [];
148
+
149
+ // Recursively find all installed packages
150
+ const scanDir = async (dir: string, prefix = '') => {
151
+ const entries = await readdir(dir, { withFileTypes: true });
152
+ for (const entry of entries) {
153
+ if (entry.isDirectory()) {
154
+ const pkgName = prefix ? `${prefix}/${entry.name}` : entry.name;
155
+
156
+ // Check if this is a package (has package.json)
157
+ const pkgJsonExists = await Bun.file(
158
+ join(dir, entry.name, 'package.json')
159
+ ).exists();
160
+ if (pkgJsonExists) {
161
+ allInstalled.push(pkgName);
162
+ }
163
+
164
+ // Recurse into scoped packages (@org/package)
165
+ if (entry.name.startsWith('@')) {
166
+ await scanDir(join(dir, entry.name), entry.name);
167
+ }
168
+ }
169
+ }
170
+ };
171
+
172
+ await scanDir(installedNmDir);
173
+ logger.debug(
174
+ 'Discovered %d total packages (including transitive deps)',
175
+ allInstalled.length
176
+ );
177
+
178
+ // Step 4: Use ALL installed packages + build tool externals for bundling
179
+ external = [...allInstalled, ...buildToolExternals];
180
+ }
181
+ }
182
+ } else {
183
+ // Dev mode: just use all external patterns as-is
184
+ external = allExternalPatterns;
185
+ }
186
+
187
+ // Build server bundle
188
+ logger.debug('Building server with Bun.build...');
189
+ logger.debug(`External packages (${external.length}): ${external.join(', ')}`);
190
+
191
+ const buildConfig = {
192
+ entrypoints: [entryPath],
193
+ outdir: outDir, // Output to .agentuity/ directly (not .agentuity/server/)
194
+ target: 'bun' as const,
195
+ format: 'esm' as const,
196
+ splitting: false, // Disable splitting - causes issues with externalized CommonJS packages
197
+ minify: !dev,
198
+ sourcemap: (dev ? 'inline' : 'external') as 'inline' | 'external',
199
+ external,
200
+ naming: {
201
+ entry: 'app.js', // Output as app.js (not app.generated.js)
202
+ },
203
+ };
204
+
205
+ logger.debug(
206
+ `Bun.build config: ${JSON.stringify({ ...buildConfig, external: `[${external.length} packages]` }, null, 2)}`
207
+ );
208
+
209
+ // Verify entry point exists before building
210
+ if (!(await Bun.file(entryPath).exists())) {
211
+ throw new Error(`Entry point not found: ${entryPath}`);
212
+ }
213
+
214
+ logger.debug(`Entry point verified: ${entryPath}`);
215
+
216
+ let result;
217
+ try {
218
+ result = await Bun.build(buildConfig);
219
+ } catch (error: unknown) {
220
+ logger.error('Bun.build threw an exception');
221
+
222
+ // Handle AggregateError with build/resolve messages
223
+ if (error instanceof AggregateError && error.errors) {
224
+ for (const err of error.errors) {
225
+ const parts = [err.message || err.text || 'Unknown error'];
226
+ if (err.position) {
227
+ parts.push(` at ${err.position.file}:${err.position.line}:${err.position.column}`);
228
+ }
229
+ logger.error(parts.join('\n'));
230
+ }
231
+ } else {
232
+ logger.error(` ${error instanceof Error ? error.message : String(error)}`);
233
+ }
234
+
235
+ throw error;
236
+ }
237
+
238
+ if (!result.success) {
239
+ logger.error('Bun.build failed for server');
240
+ logger.error(
241
+ `Build result: success=${result.success}, outputs=${result.outputs.length}, logs=${result.logs.length}`
242
+ );
243
+
244
+ const errorMessages = result.logs
245
+ .map((log) => {
246
+ const parts = [log.message];
247
+ if (log.position) {
248
+ parts.push(` at ${log.position.file}:${log.position.line}:${log.position.column}`);
249
+ }
250
+ return parts.join('\n');
251
+ })
252
+ .join('\n');
253
+
254
+ throw new Error(errorMessages || 'Build failed with no error messages');
255
+ }
256
+
257
+ logger.debug(`Server build complete: ${result.outputs.length} files`);
258
+ }
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Vite Asset Server Configuration
3
+ *
4
+ * Minimal Vite config for serving frontend assets with HMR only.
5
+ * Does NOT handle API routes, workbench, or WebSocket - that's the Bun server's job.
6
+ */
7
+
8
+ import { join } from 'node:path';
9
+ import type { Logger } from '../../../types';
10
+ import type { InlineConfig } from 'vite';
11
+
12
+ export interface GenerateAssetServerConfigOptions {
13
+ rootDir: string;
14
+ logger: Logger;
15
+ workbenchPath?: string;
16
+ port: number; // The port Vite will run on (for HMR client configuration)
17
+ }
18
+
19
+ /**
20
+ * Generate Vite config for asset-only server (HMR + React transformation)
21
+ */
22
+ export async function generateAssetServerConfig(
23
+ options: GenerateAssetServerConfigOptions
24
+ ): Promise<InlineConfig> {
25
+ const { rootDir, logger, workbenchPath, port } = options;
26
+
27
+ // Load path aliases from tsconfig.json if available
28
+ const tsconfigPath = join(rootDir, 'tsconfig.json');
29
+ let alias = {};
30
+
31
+ try {
32
+ const tsconfig = JSON.parse(await Bun.file(tsconfigPath).text());
33
+ const paths = tsconfig?.compilerOptions?.paths || {};
34
+ alias = Object.fromEntries(
35
+ Object.entries(paths).map(([key, value]) => {
36
+ const pathArray = value as string[];
37
+ return [key.replace('/*', ''), join(rootDir, pathArray[0].replace('/*', ''))];
38
+ })
39
+ );
40
+ } catch {
41
+ // No tsconfig or no paths - that's fine
42
+ }
43
+
44
+ return {
45
+ root: rootDir,
46
+ base: '/',
47
+ clearScreen: false,
48
+ publicDir: false, // Don't serve public dir - Bun server handles that
49
+
50
+ resolve: {
51
+ alias,
52
+ // Deduplicate React to prevent multiple instances
53
+ dedupe: ['react', 'react-dom', 'react/jsx-runtime', 'react/jsx-dev-runtime'],
54
+ },
55
+
56
+ // Only allow frontend env vars (server uses process.env)
57
+ envPrefix: ['VITE_', 'AGENTUITY_PUBLIC_', 'PUBLIC_'],
58
+
59
+ server: {
60
+ // Use the port we selected
61
+ port,
62
+ strictPort: false, // Allow fallback if port is taken
63
+ host: '127.0.0.1',
64
+
65
+ // CORS headers to allow Bun server on port 3500 to proxy requests
66
+ cors: {
67
+ origin: 'http://127.0.0.1:3500',
68
+ credentials: true,
69
+ },
70
+
71
+ // HMR configuration - client must connect to Vite asset server directly
72
+ hmr: {
73
+ protocol: 'ws',
74
+ host: '127.0.0.1',
75
+ port, // HMR WebSocket on same port as HTTP
76
+ clientPort: port, // Tell client to connect to this port (not origin 3500)
77
+ },
78
+
79
+ // Don't open browser - Bun server will be the entry point
80
+ open: false,
81
+ },
82
+
83
+ // Define environment variables for browser
84
+ define: {
85
+ ...(workbenchPath
86
+ ? { 'import.meta.env.AGENTUITY_PUBLIC_WORKBENCH_PATH': JSON.stringify(workbenchPath) }
87
+ : {}),
88
+ 'import.meta.env.AGENTUITY_PUBLIC_HAS_SDK_KEY': JSON.stringify(
89
+ process.env.AGENTUITY_SDK_KEY ? 'true' : 'false'
90
+ ),
91
+ 'process.env.NODE_ENV': JSON.stringify('development'),
92
+ },
93
+
94
+ // Minimal plugins - just React and HMR
95
+ plugins: [
96
+ // React plugin for JSX/TSX transformation and Fast Refresh
97
+ (await import('@vitejs/plugin-react')).default(),
98
+ // Browser env plugin to map process.env to import.meta.env
99
+ (await import('./browser-env-plugin')).browserEnvPlugin(),
100
+ ],
101
+
102
+ // Suppress build-related options (this is dev-only)
103
+ build: {
104
+ rollupOptions: {
105
+ external: ['vite', '@agentuity/cli'],
106
+ },
107
+ },
108
+
109
+ // Custom logger to integrate with our logger
110
+ customLogger: {
111
+ info(msg: string) {
112
+ if (!msg.includes('[vite]')) {
113
+ logger.debug(`[Vite Asset] ${msg}`);
114
+ }
115
+ },
116
+ warn(msg: string) {
117
+ logger.warn(`[Vite Asset] ${msg}`);
118
+ },
119
+ warnOnce(msg: string) {
120
+ logger.warn(`[Vite Asset] ${msg}`);
121
+ },
122
+ error(msg: string) {
123
+ logger.error(`[Vite Asset] ${msg}`);
124
+ },
125
+ clearScreen() {
126
+ // No-op
127
+ },
128
+ hasErrorLogged: () => false,
129
+ hasWarned: false,
130
+ },
131
+
132
+ logLevel: 'info',
133
+ };
134
+ }
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Vite Asset Server
3
+ *
4
+ * Starts a minimal Vite dev server for frontend asset transformation and HMR only.
5
+ * Does NOT handle API routes or WebSocket - the Bun server proxies to this.
6
+ */
7
+
8
+ import { createServer, type ViteDevServer } from 'vite';
9
+ import type { Logger } from '../../../types';
10
+ import { generateAssetServerConfig } from './vite-asset-server-config';
11
+
12
+ export interface ViteAssetServerResult {
13
+ server: ViteDevServer;
14
+ port: number;
15
+ }
16
+
17
+ export interface StartViteAssetServerOptions {
18
+ rootDir: string;
19
+ logger: Logger;
20
+ workbenchPath?: string;
21
+ }
22
+
23
+ /**
24
+ * Start Vite asset server on a dynamically-chosen port
25
+ * Returns the server instance and the actual port number
26
+ */
27
+ export async function startViteAssetServer(
28
+ options: StartViteAssetServerOptions
29
+ ): Promise<ViteAssetServerResult> {
30
+ const { rootDir, logger, workbenchPath } = options;
31
+
32
+ logger.debug('Starting Vite asset server (HMR only)...');
33
+
34
+ // Pick a port for Vite asset server (try 5173 first, Vite default)
35
+ // strictPort: false allows Vite to choose alternate if 5173 is taken
36
+ const preferredPort = 5173;
37
+
38
+ // Generate minimal config with preferred port
39
+ const config = await generateAssetServerConfig({
40
+ rootDir,
41
+ logger,
42
+ workbenchPath,
43
+ port: preferredPort,
44
+ });
45
+
46
+ // Create Vite server with config
47
+ const server = await createServer(config);
48
+
49
+ // Start listening - Vite will choose alternate port if preferred is taken
50
+ await server.listen();
51
+
52
+ // Get the actual port Vite is using (may differ from preferred if port was taken)
53
+ const actualPort = server.config.server.port || preferredPort;
54
+
55
+ logger.info(`✅ Vite asset server started on port ${actualPort}`);
56
+ if (actualPort !== preferredPort) {
57
+ logger.debug(`Port ${preferredPort} was taken, using ${actualPort} instead`);
58
+ }
59
+ logger.debug(`Asset server will handle: HMR, React transformation, source maps`);
60
+ logger.debug(`HMR WebSocket configured to connect to ws://127.0.0.1:${actualPort}`);
61
+
62
+ return { server, port: actualPort };
63
+ }