@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,404 @@
1
+ /**
2
+ * Vite-native entry file generator (v2 - clean architecture)
3
+ * Single source for both dev and prod with minimal differences
4
+ */
5
+
6
+ import { join } from 'node:path';
7
+ import type { Logger, WorkbenchConfig } from '../../types';
8
+ import { discoverRoutes } from './vite/route-discovery';
9
+
10
+ interface GenerateEntryOptions {
11
+ rootDir: string;
12
+ projectId: string;
13
+ deploymentId: string;
14
+ logger: Logger;
15
+ mode: 'dev' | 'prod';
16
+ workbench?: WorkbenchConfig;
17
+ vitePort?: number; // Port of Vite asset server (dev mode only)
18
+ }
19
+
20
+ /**
21
+ * Generate entry file with clean Vite-native architecture
22
+ */
23
+ export async function generateEntryFile(options: GenerateEntryOptions): Promise<void> {
24
+ const { rootDir, projectId, deploymentId, logger, mode, workbench, vitePort } = options;
25
+ const isDev = mode === 'dev';
26
+
27
+ const srcDir = join(rootDir, 'src');
28
+ const agentuityDir = join(rootDir, '.agentuity');
29
+ const entryPath = join(agentuityDir, 'app.generated.ts');
30
+
31
+ logger.trace(`Generating ${mode} mode entry file...`);
32
+
33
+ // Discover routes to determine which files need to be imported
34
+ const { routeInfoList } = await discoverRoutes(srcDir, projectId, deploymentId, logger);
35
+
36
+ // Check for web and workbench
37
+ const hasWebFrontend =
38
+ (await Bun.file(join(srcDir, 'web', 'index.html')).exists()) ||
39
+ (await Bun.file(join(srcDir, 'web', 'frontend.tsx')).exists());
40
+ const hasWorkbench = !!workbench;
41
+
42
+ // Get unique route files that need to be imported (relative to src/)
43
+ const routeFiles = new Set<string>();
44
+ for (const route of routeInfoList) {
45
+ if (route.filename) {
46
+ routeFiles.add(route.filename);
47
+ }
48
+ }
49
+
50
+ // Generate imports
51
+ const runtimeImports = [
52
+ ` createRouter,`,
53
+ ` createBaseMiddleware,`,
54
+ ` createCorsMiddleware,`,
55
+ ` createOtelMiddleware,`,
56
+ ` createAgentMiddleware,`,
57
+ ` getAppState,`,
58
+ ` getAppConfig,`,
59
+ ` register,`,
60
+ ` createServices,`,
61
+ ` runAgentSetups,`,
62
+ ` getThreadProvider,`,
63
+ ` getSessionProvider,`,
64
+ ` setGlobalLogger,`,
65
+ ` setGlobalTracer,`,
66
+ ` setGlobalRouter,`,
67
+ ` enableProcessExitProtection,`,
68
+ ` hasWaitUntilPending,`,
69
+ ];
70
+
71
+ if (hasWorkbench) {
72
+ runtimeImports.push(` createWorkbenchRouter,`);
73
+ }
74
+
75
+ const imports = [
76
+ `import { `,
77
+ ...runtimeImports,
78
+ `} from '@agentuity/runtime';`,
79
+ `import { websocket } from 'hono/bun';`, // Always use Bun WebSocket (dev and prod)
80
+ !isDev && hasWebFrontend ? `import { serveStatic } from 'hono/bun';` : '',
81
+ ].filter(Boolean);
82
+
83
+ imports.push(`import { type LogLevel } from '@agentuity/core';`);
84
+
85
+ // HMR setup (dev only)
86
+ const hmrSetup = isDev
87
+ ? `
88
+ // HMR restart handler
89
+ if (typeof (globalThis as any).__AGENTUITY_RESTART__ === 'undefined') {
90
+ (globalThis as any).__AGENTUITY_RESTART__ = () => {
91
+ console.log('[HMR] Restart triggered but handler not ready yet');
92
+ };
93
+ }
94
+ `
95
+ : '';
96
+
97
+ // Generate route mounting code for all discovered routes
98
+ const routeImportsAndMounts: string[] = [];
99
+ let routeIndex = 0;
100
+
101
+ for (const routeFile of routeFiles) {
102
+ // Convert src/api/auth/route.ts -> auth/route
103
+ const relativePath = routeFile.replace(/^src\/api\//, '').replace(/\.tsx?$/, '');
104
+
105
+ // Determine the mount path
106
+ // src/api/index.ts -> /api
107
+ // src/api/auth/route.ts -> /api/auth
108
+ // src/api/users/profile/route.ts -> /api/users/profile
109
+ let mountPath = '/api';
110
+ if (relativePath !== 'index') {
111
+ // Remove 'route' or 'index' from the end
112
+ const cleanPath = relativePath.replace(/\/(route|index)$/, '');
113
+ if (cleanPath) {
114
+ mountPath = `/api/${cleanPath}`;
115
+ }
116
+ }
117
+
118
+ const importName = `router_${routeIndex++}`;
119
+ routeImportsAndMounts.push(
120
+ `const { default: ${importName} } = await import('../src/api/${relativePath}.js');`
121
+ );
122
+ routeImportsAndMounts.push(`app.route('${mountPath}', ${importName});`);
123
+ }
124
+
125
+ const apiMount =
126
+ routeImportsAndMounts.length > 0
127
+ ? `
128
+ // Mount API routes
129
+ ${routeImportsAndMounts.join('\n')}
130
+ `
131
+ : '';
132
+
133
+ // Workbench API routes mounting (if enabled)
134
+ const workbenchApiMount = hasWorkbench
135
+ ? `
136
+ // Mount workbench API routes (/_agentuity/workbench/*)
137
+ const workbenchRouter = createWorkbenchRouter();
138
+ app.route('/', workbenchRouter);
139
+ `
140
+ : '';
141
+
142
+ // Asset proxy routes (dev mode only - proxy to Vite asset server)
143
+ const assetProxyRoutes =
144
+ isDev && vitePort
145
+ ? `
146
+ // Asset proxy routes - Forward Vite-specific requests to asset server
147
+ const VITE_ASSET_PORT = ${vitePort};
148
+
149
+ const proxyToVite = async (c) => {
150
+ const viteUrl = \`http://127.0.0.1:\${VITE_ASSET_PORT}\${c.req.path}\`;
151
+ const controller = new AbortController();
152
+ const timeout = setTimeout(() => controller.abort(), 10000); // 10s timeout
153
+ try {
154
+ otel.logger.debug(\`[Proxy] \${c.req.method} \${c.req.path} -> Vite:\${VITE_ASSET_PORT}\`);
155
+ const res = await fetch(viteUrl, { signal: controller.signal });
156
+ clearTimeout(timeout);
157
+ otel.logger.debug(\`[Proxy] \${c.req.path} -> \${res.status} (\${res.headers.get('content-type')})\`);
158
+ return new Response(res.body, {
159
+ status: res.status,
160
+ headers: res.headers,
161
+ });
162
+ } catch (err) {
163
+ clearTimeout(timeout);
164
+ if (err instanceof Error && err.name === 'AbortError') {
165
+ otel.logger.error(\`Vite proxy timeout: \${c.req.path}\`);
166
+ return c.text('Vite asset server timeout', 504);
167
+ }
168
+ otel.logger.error(\`Failed to proxy to Vite: \${c.req.path} - \${err instanceof Error ? err.message : String(err)}\`);
169
+ return c.text('Vite asset server error', 500);
170
+ }
171
+ };
172
+
173
+ // Vite client scripts and HMR
174
+ app.get('/@vite/*', proxyToVite);
175
+ app.get('/@react-refresh', proxyToVite);
176
+
177
+ // Source files for HMR
178
+ app.get('/src/web/*', proxyToVite);
179
+ app.get('/src/*', proxyToVite); // Catch-all for other source files
180
+
181
+ // Workbench source files (in .agentuity/workbench-src/)
182
+ app.get('/.agentuity/workbench-src/*', proxyToVite);
183
+
184
+ // Node modules (Vite transforms these)
185
+ app.get('/node_modules/*', proxyToVite);
186
+
187
+ // Scoped packages (e.g., @agentuity/*, @types/*)
188
+ app.get('/@*', proxyToVite);
189
+
190
+ // File system access (for Vite's @fs protocol)
191
+ app.get('/@fs/*', proxyToVite);
192
+
193
+ // Module resolution (for Vite's @id protocol)
194
+ app.get('/@id/*', proxyToVite);
195
+
196
+ // Any .js, .jsx, .ts, .tsx files (catch remaining modules)
197
+ app.get('/*.js', proxyToVite);
198
+ app.get('/*.jsx', proxyToVite);
199
+ app.get('/*.ts', proxyToVite);
200
+ app.get('/*.tsx', proxyToVite);
201
+ app.get('/*.css', proxyToVite);
202
+ `
203
+ : '';
204
+
205
+ // Web routes (different for dev/prod)
206
+ let webRoutes = '';
207
+ if (hasWebFrontend) {
208
+ if (isDev) {
209
+ const htmlPath = join(srcDir, 'web', 'index.html');
210
+ webRoutes = `
211
+ // Web routes (dev mode with Vite HMR via proxy)
212
+ const devHtmlHandler = async (c) => {
213
+ const html = await Bun.file('${htmlPath}').text();
214
+ const withHmr = html
215
+ // Fix relative paths to use proxy routes (with or without ./)
216
+ .replace(/src=["'](?:\\.\\/)?([^"'\\/]+\\.tsx?)["']/g, 'src="/src/web/$1"')
217
+ // Inject Vite HMR scripts - point directly to Vite asset server for WebSocket
218
+ .replace(
219
+ '</head>',
220
+ \`<script type="module">
221
+ import RefreshRuntime from '/@react-refresh'
222
+ RefreshRuntime.injectIntoGlobalHook(window)
223
+ window.$RefreshReg$ = () => {}
224
+ window.$RefreshSig$ = () => (type) => type
225
+ </script>
226
+ <script type="module">
227
+ // Configure Vite client to connect to asset server for HMR WebSocket
228
+ window.__VITE_HMR_BASE_URL__ = 'http://127.0.0.1:${vitePort}';
229
+ </script>
230
+ <script type="module" src="http://127.0.0.1:${vitePort}/@vite/client"></script>
231
+ </head>\`
232
+ );
233
+ return c.html(withHmr);
234
+ };
235
+ app.get('/', devHtmlHandler);
236
+ // 404 for unmatched API/system routes
237
+ app.all('/_agentuity/*', (c) => c.notFound());
238
+ app.all('/api/*', (c) => c.notFound());
239
+ ${hasWorkbench ? '' : `app.all('/workbench/*', (c) => c.notFound());`}
240
+ // SPA fallback - serve index.html for all other GET requests
241
+ // This is last so user routes, API routes, and workbench routes match first
242
+ app.get('*', devHtmlHandler);
243
+ `;
244
+ } else {
245
+ webRoutes = `
246
+ // Web routes (production - static files)
247
+ import { readFileSync } from 'node:fs';
248
+ const indexHtml = readFileSync(import.meta.dir + '/client/index.html', 'utf-8');
249
+ app.use('/assets/*', serveStatic({ root: import.meta.dir + '/client' }));
250
+ app.get('/', (c) => c.html(indexHtml));
251
+ // 404 for unmatched API/system routes
252
+ app.all('/_agentuity/*', (c) => c.notFound());
253
+ app.all('/api/*', (c) => c.notFound());
254
+ ${hasWorkbench ? '' : `app.all('/workbench/*', (c) => c.notFound());`}
255
+ // SPA fallback - serve index.html for all other GET requests
256
+ app.get('*', (c) => c.html(indexHtml));
257
+ `;
258
+ }
259
+ }
260
+
261
+ // Workbench routes (if enabled)
262
+ const workbenchRoute = workbench?.route ?? '/workbench';
263
+ const workbenchSrcDir = join(agentuityDir, 'workbench-src');
264
+ const workbenchRoutes = hasWorkbench
265
+ ? isDev
266
+ ? `
267
+ // Workbench route (dev mode - let Vite serve source files with HMR)
268
+ app.get('${workbenchRoute}', async (c) => {
269
+ const html = await Bun.file('${workbenchSrcDir}/index.html').text();
270
+ // Rewrite script/css paths to use Vite's @fs protocol
271
+ const withVite = html
272
+ .replace('src="./main.tsx"', 'src="/@fs${workbenchSrcDir}/main.tsx"')
273
+ .replace('href="./styles.css"', 'href="/@fs${workbenchSrcDir}/styles.css"');
274
+ return c.html(withVite);
275
+ });
276
+ `
277
+ : `
278
+ // Workbench routes (production - serve pre-built assets)
279
+ // Use import.meta.dir for absolute paths (app.js runs from .agentuity/)
280
+ import { readFileSync, existsSync } from 'node:fs';
281
+ const workbenchIndexPath = import.meta.dir + '/workbench/index.html';
282
+ if (existsSync(workbenchIndexPath)) {
283
+ const workbenchIndex = readFileSync(workbenchIndexPath, 'utf-8');
284
+ app.get('${workbenchRoute}', (c) => c.html(workbenchIndex));
285
+ app.get('${workbenchRoute}/*', serveStatic({ root: import.meta.dir + '/workbench' }));
286
+ }
287
+ `
288
+ : '';
289
+
290
+ // Server startup (same for dev and prod - Bun.serve with native WebSocket)
291
+ const serverStartup = `
292
+ // Start Bun server${isDev ? ' (dev mode with Vite asset proxy)' : ''}
293
+ if (typeof Bun !== 'undefined' && !import.meta.main) {
294
+ // Not the main module, skip server startup (this is being imported/analyzed)
295
+ } else if (typeof Bun !== 'undefined') {
296
+ // Enable process exit protection now that we're starting the server
297
+ enableProcessExitProtection();
298
+
299
+ const port = parseInt(process.env.PORT || '3500', 10);
300
+ const server = Bun.serve({
301
+ fetch: app.fetch,
302
+ websocket,
303
+ port,
304
+ hostname: '127.0.0.1',
305
+ });
306
+
307
+ // Make server available globally for health checks
308
+ (globalThis as any).__AGENTUITY_SERVER__ = server;
309
+
310
+ otel.logger.info(\`Server listening on http://127.0.0.1:\${port}\`);${isDev && vitePort ? `\n\totel.logger.debug(\`Proxying Vite assets from port ${vitePort}\`);` : ''}
311
+ }
312
+ `;
313
+
314
+ const code = `// Auto-generated by Agentuity for ${mode} mode
315
+ // DO NOT EDIT - This file is regenerated on every build
316
+ // NOTE: Bun auto-loads .env files from CWD before executing JavaScript
317
+
318
+ ${imports.join('\n')}
319
+
320
+ ${hmrSetup}
321
+
322
+ // Step 1: Initialize telemetry and services
323
+ const serverUrl = \`http://127.0.0.1:\${process.env.PORT || '3500'}\`;
324
+ const otel = register({ processors: [], logLevel: (process.env.AGENTUITY_LOG_LEVEL || 'info') as LogLevel });
325
+ const servicesResult = createServices(otel.logger, undefined, serverUrl);
326
+
327
+ // Make logger and tracer globally available for user's app.ts
328
+ setGlobalLogger(otel.logger);
329
+ setGlobalTracer(otel.tracer);
330
+
331
+ // Step 2: Create router and set as global
332
+ const app = createRouter();
333
+ setGlobalRouter(app);
334
+
335
+ // Step 3: Apply middleware in correct order (BEFORE mounting routes)
336
+ app.use('*', createBaseMiddleware({
337
+ logger: otel.logger,
338
+ tracer: otel.tracer,
339
+ meter: otel.meter,
340
+ }));
341
+
342
+ app.use('/_agentuity/*', createCorsMiddleware());
343
+ app.use('/api/*', createCorsMiddleware());
344
+
345
+ // Critical: otelMiddleware creates session/thread/waitUntilHandler
346
+ app.use('/_agentuity/*', createOtelMiddleware());
347
+ app.use('/api/*', createOtelMiddleware());
348
+
349
+ // Critical: agentMiddleware sets up agent context
350
+ app.use('/api/*', createAgentMiddleware(''));
351
+
352
+ // Step 4: Import user's app.ts (runs createApp, gets state/config)
353
+ await import('../app.ts');
354
+
355
+ // Get app state and config for use below
356
+ const appState = getAppState();
357
+ const appConfig = getAppConfig();
358
+
359
+ // Step 5: Initialize providers
360
+ const threadProvider = getThreadProvider();
361
+ const sessionProvider = getSessionProvider();
362
+
363
+ await threadProvider.initialize(appState);
364
+ await sessionProvider.initialize(appState);
365
+
366
+ // Step 6: Mount routes (AFTER middleware is applied)
367
+
368
+ // System health/idle endpoints
369
+ const healthHandler = (c: any) => c.text('OK');
370
+ const idleHandler = (c: any) => {
371
+ // Check if server is idle (no pending requests/connections)
372
+ const server = (globalThis as any).__AGENTUITY_SERVER__;
373
+ if (!server) return c.text('NO', { status: 200 });
374
+
375
+ // Check for pending background tasks
376
+ if (hasWaitUntilPending()) return c.text('NO', { status: 200 });
377
+
378
+ if (server.pendingRequests > 1) return c.text('NO', { status: 200 });
379
+ if (server.pendingWebSockets > 0) return c.text('NO', { status: 200 });
380
+
381
+ return c.text('OK', { status: 200 });
382
+ };
383
+
384
+ // Mount on both /_agentuity/* and /* for backwards compatibility
385
+ app.get('/_agentuity/health', healthHandler);
386
+ app.get('/_health', healthHandler);
387
+ app.get('/_agentuity/idle', idleHandler);
388
+ app.get('/_idle', idleHandler);
389
+
390
+ ${assetProxyRoutes}
391
+ ${apiMount}
392
+ ${workbenchApiMount}
393
+ ${workbenchRoutes}
394
+ ${webRoutes}
395
+
396
+ // Step 7: Run agent setup to signal completion
397
+ await runAgentSetups(appState);
398
+
399
+ ${serverStartup}
400
+ `;
401
+
402
+ await Bun.write(entryPath, code);
403
+ logger.trace(`Generated ${mode} mode entry file at %s`, entryPath);
404
+ }
@@ -1,8 +1,7 @@
1
1
  import { z } from 'zod';
2
2
  import { resolve, join, relative } from 'node:path';
3
- import { getServiceUrls } from '@agentuity/server';
4
3
  import { createCommand } from '../../types';
5
- import { bundle } from './bundler';
4
+ import { viteBundle } from './vite-bundler';
6
5
  import * as tui from '../../tui';
7
6
  import { getCommand } from '../../command-prefix';
8
7
  import { ErrorCode } from '../../errors';
@@ -50,32 +49,13 @@ export const command = createCommand({
50
49
  const rel = outDir.startsWith(absoluteProjectDir)
51
50
  ? relative(absoluteProjectDir, outDir)
52
51
  : outDir;
53
- tui.info(`Bundling project at ${absoluteProjectDir} to ${rel}`);
52
+ tui.info(`Building project with Vite at ${absoluteProjectDir} to ${rel}`);
54
53
 
55
- const env: Map<string, string> = new Map();
56
-
57
- if (project) {
58
- const serviceUrls = getServiceUrls(project.region);
59
- env.set('AGENTUITY_TRANSPORT_URL', serviceUrls.catalyst);
60
- env.set('AGENTUITY_CATALYST_URL', serviceUrls.catalyst);
61
- env.set('AGENTUITY_VECTOR_URL', serviceUrls.vector);
62
- env.set('AGENTUITY_KEYVALUE_URL', serviceUrls.keyvalue);
63
- env.set('AGENTUITY_STREAM_URL', serviceUrls.stream);
64
- env.set('AGENTUITY_CLOUD_ORG_ID', project.orgId);
65
- env.set('AGENTUITY_CLOUD_PROJECT_ID', project.projectId);
66
- env.set('AGENTUITY_REGION', project.region);
67
- }
68
-
69
- ctx.logger.trace('setting env to %s', env);
70
-
71
- await bundle({
54
+ await viteBundle({
72
55
  rootDir: absoluteProjectDir,
73
56
  dev: opts.dev || false,
74
- outDir,
75
- project,
76
- orgId: project?.orgId,
77
57
  projectId: project?.projectId,
78
- env,
58
+ orgId: project?.orgId,
79
59
  region: project?.region ?? 'local',
80
60
  logger: ctx.logger,
81
61
  });
@@ -98,7 +78,6 @@ export const command = createCommand({
98
78
  if (!opts.dev && !opts.skipTypeCheck) {
99
79
  try {
100
80
  tui.info('Running type check...');
101
- const absoluteProjectDir = resolve(projectDir);
102
81
  const result = await Bun.$`bunx tsc --noEmit --skipLibCheck`
103
82
  .cwd(absoluteProjectDir)
104
83
  .nothrow();
@@ -110,7 +89,7 @@ export const command = createCommand({
110
89
  console.error(result.stderr.toString());
111
90
  tui.fatal('Fix type errors before building');
112
91
  }
113
- } catch (error) {
92
+ } catch (error: unknown) {
114
93
  // If tsc fails to run, show error and fail
115
94
  const errorMsg = error instanceof Error ? error.message : String(error);
116
95
  tui.error(`Type check failed to run: ${errorMsg}`);
@@ -118,7 +97,7 @@ export const command = createCommand({
118
97
  }
119
98
  }
120
99
 
121
- tui.success('Bundle complete');
100
+ tui.success('Build complete');
122
101
 
123
102
  return {
124
103
  success: true,
@@ -126,7 +105,7 @@ export const command = createCommand({
126
105
  projectName: project?.projectId || 'unknown',
127
106
  dev: opts.dev || false,
128
107
  };
129
- } catch (error) {
108
+ } catch (error: unknown) {
130
109
  if (error instanceof AggregateError) {
131
110
  const ae = error as AggregateError;
132
111
  for (const e of ae.errors) {