@agentuity/cli 1.0.59 → 2.0.0-beta.1

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 (189) hide show
  1. package/bin/cli.ts +2 -3
  2. package/dist/cmd/build/app-config-extractor.d.ts +27 -0
  3. package/dist/cmd/build/app-config-extractor.d.ts.map +1 -0
  4. package/dist/cmd/build/app-config-extractor.js +152 -0
  5. package/dist/cmd/build/app-config-extractor.js.map +1 -0
  6. package/dist/cmd/build/app-router-detector.d.ts +2 -5
  7. package/dist/cmd/build/app-router-detector.d.ts.map +1 -1
  8. package/dist/cmd/build/app-router-detector.js +130 -154
  9. package/dist/cmd/build/app-router-detector.js.map +1 -1
  10. package/dist/cmd/build/ci.d.ts.map +1 -1
  11. package/dist/cmd/build/ci.js +5 -21
  12. package/dist/cmd/build/ci.js.map +1 -1
  13. package/dist/cmd/build/ids.d.ts +11 -0
  14. package/dist/cmd/build/ids.d.ts.map +1 -0
  15. package/dist/cmd/build/ids.js +18 -0
  16. package/dist/cmd/build/ids.js.map +1 -0
  17. package/dist/cmd/build/index.d.ts.map +1 -1
  18. package/dist/cmd/build/index.js +8 -0
  19. package/dist/cmd/build/index.js.map +1 -1
  20. package/dist/cmd/build/vite/agent-discovery.d.ts +8 -4
  21. package/dist/cmd/build/vite/agent-discovery.d.ts.map +1 -1
  22. package/dist/cmd/build/vite/agent-discovery.js +166 -487
  23. package/dist/cmd/build/vite/agent-discovery.js.map +1 -1
  24. package/dist/cmd/build/vite/bun-dev-server.d.ts +43 -14
  25. package/dist/cmd/build/vite/bun-dev-server.d.ts.map +1 -1
  26. package/dist/cmd/build/vite/bun-dev-server.js +290 -129
  27. package/dist/cmd/build/vite/bun-dev-server.js.map +1 -1
  28. package/dist/cmd/build/vite/config-loader.d.ts +15 -20
  29. package/dist/cmd/build/vite/config-loader.d.ts.map +1 -1
  30. package/dist/cmd/build/vite/config-loader.js +41 -74
  31. package/dist/cmd/build/vite/config-loader.js.map +1 -1
  32. package/dist/cmd/build/vite/docs-generator.d.ts.map +1 -1
  33. package/dist/cmd/build/vite/docs-generator.js +0 -2
  34. package/dist/cmd/build/vite/docs-generator.js.map +1 -1
  35. package/dist/cmd/build/vite/index.d.ts.map +1 -1
  36. package/dist/cmd/build/vite/index.js +0 -36
  37. package/dist/cmd/build/vite/index.js.map +1 -1
  38. package/dist/cmd/build/vite/lifecycle-generator.d.ts +10 -2
  39. package/dist/cmd/build/vite/lifecycle-generator.d.ts.map +1 -1
  40. package/dist/cmd/build/vite/lifecycle-generator.js +302 -23
  41. package/dist/cmd/build/vite/lifecycle-generator.js.map +1 -1
  42. package/dist/cmd/build/vite/route-discovery.d.ts +11 -38
  43. package/dist/cmd/build/vite/route-discovery.d.ts.map +1 -1
  44. package/dist/cmd/build/vite/route-discovery.js +97 -177
  45. package/dist/cmd/build/vite/route-discovery.js.map +1 -1
  46. package/dist/cmd/build/vite/server-bundler.js +1 -1
  47. package/dist/cmd/build/vite/server-bundler.js.map +1 -1
  48. package/dist/cmd/build/vite/static-renderer.d.ts +0 -2
  49. package/dist/cmd/build/vite/static-renderer.d.ts.map +1 -1
  50. package/dist/cmd/build/vite/static-renderer.js +19 -13
  51. package/dist/cmd/build/vite/static-renderer.js.map +1 -1
  52. package/dist/cmd/build/vite/vite-asset-server-config.d.ts +6 -3
  53. package/dist/cmd/build/vite/vite-asset-server-config.d.ts.map +1 -1
  54. package/dist/cmd/build/vite/vite-asset-server-config.js +175 -69
  55. package/dist/cmd/build/vite/vite-asset-server-config.js.map +1 -1
  56. package/dist/cmd/build/vite/vite-asset-server.d.ts +8 -3
  57. package/dist/cmd/build/vite/vite-asset-server.d.ts.map +1 -1
  58. package/dist/cmd/build/vite/vite-asset-server.js +14 -13
  59. package/dist/cmd/build/vite/vite-asset-server.js.map +1 -1
  60. package/dist/cmd/build/vite/vite-builder.d.ts.map +1 -1
  61. package/dist/cmd/build/vite/vite-builder.js +42 -190
  62. package/dist/cmd/build/vite/vite-builder.js.map +1 -1
  63. package/dist/cmd/build/vite/ws-proxy.d.ts +53 -0
  64. package/dist/cmd/build/vite/ws-proxy.d.ts.map +1 -0
  65. package/dist/cmd/build/vite/ws-proxy.js +95 -0
  66. package/dist/cmd/build/vite/ws-proxy.js.map +1 -0
  67. package/dist/cmd/build/vite-bundler.d.ts.map +1 -1
  68. package/dist/cmd/build/vite-bundler.js +0 -3
  69. package/dist/cmd/build/vite-bundler.js.map +1 -1
  70. package/dist/cmd/cloud/deploy-fork.d.ts.map +1 -1
  71. package/dist/cmd/cloud/deploy-fork.js +15 -36
  72. package/dist/cmd/cloud/deploy-fork.js.map +1 -1
  73. package/dist/cmd/cloud/sandbox/exec.d.ts.map +1 -1
  74. package/dist/cmd/cloud/sandbox/exec.js +28 -86
  75. package/dist/cmd/cloud/sandbox/exec.js.map +1 -1
  76. package/dist/cmd/cloud/sandbox/run.d.ts.map +1 -1
  77. package/dist/cmd/cloud/sandbox/run.js +2 -9
  78. package/dist/cmd/cloud/sandbox/run.js.map +1 -1
  79. package/dist/cmd/cloud/sandbox/snapshot/build.js +2 -2
  80. package/dist/cmd/cloud/sandbox/snapshot/build.js.map +1 -1
  81. package/dist/cmd/coder/hub-url.d.ts.map +1 -1
  82. package/dist/cmd/coder/hub-url.js +1 -3
  83. package/dist/cmd/coder/hub-url.js.map +1 -1
  84. package/dist/cmd/coder/start.js +6 -6
  85. package/dist/cmd/coder/start.js.map +1 -1
  86. package/dist/cmd/coder/tui-init.d.ts +2 -2
  87. package/dist/cmd/coder/tui-init.js +2 -2
  88. package/dist/cmd/coder/tui-init.js.map +1 -1
  89. package/dist/cmd/dev/file-watcher.d.ts.map +1 -1
  90. package/dist/cmd/dev/file-watcher.js +2 -8
  91. package/dist/cmd/dev/file-watcher.js.map +1 -1
  92. package/dist/cmd/dev/index.d.ts.map +1 -1
  93. package/dist/cmd/dev/index.js +432 -752
  94. package/dist/cmd/dev/index.js.map +1 -1
  95. package/dist/cmd/dev/process-manager.d.ts +104 -0
  96. package/dist/cmd/dev/process-manager.d.ts.map +1 -0
  97. package/dist/cmd/dev/process-manager.js +204 -0
  98. package/dist/cmd/dev/process-manager.js.map +1 -0
  99. package/dist/errors.d.ts +10 -24
  100. package/dist/errors.d.ts.map +1 -1
  101. package/dist/errors.js +12 -42
  102. package/dist/errors.js.map +1 -1
  103. package/dist/schema-generator.d.ts.map +1 -1
  104. package/dist/schema-generator.js +12 -2
  105. package/dist/schema-generator.js.map +1 -1
  106. package/dist/tui.d.ts.map +1 -1
  107. package/dist/tui.js +5 -19
  108. package/dist/tui.js.map +1 -1
  109. package/dist/utils/version-mismatch.d.ts +39 -0
  110. package/dist/utils/version-mismatch.d.ts.map +1 -0
  111. package/dist/utils/version-mismatch.js +161 -0
  112. package/dist/utils/version-mismatch.js.map +1 -0
  113. package/package.json +6 -6
  114. package/src/cmd/ai/prompt/agent.md +0 -1
  115. package/src/cmd/ai/prompt/api.md +0 -7
  116. package/src/cmd/ai/prompt/web.md +51 -213
  117. package/src/cmd/build/app-config-extractor.ts +186 -0
  118. package/src/cmd/build/app-router-detector.ts +152 -182
  119. package/src/cmd/build/ci.ts +5 -21
  120. package/src/cmd/build/ids.ts +19 -0
  121. package/src/cmd/build/index.ts +10 -0
  122. package/src/cmd/build/vite/agent-discovery.ts +208 -679
  123. package/src/cmd/build/vite/bun-dev-server.ts +383 -146
  124. package/src/cmd/build/vite/config-loader.ts +45 -77
  125. package/src/cmd/build/vite/docs-generator.ts +0 -2
  126. package/src/cmd/build/vite/index.ts +1 -42
  127. package/src/cmd/build/vite/lifecycle-generator.ts +345 -21
  128. package/src/cmd/build/vite/route-discovery.ts +116 -274
  129. package/src/cmd/build/vite/server-bundler.ts +1 -1
  130. package/src/cmd/build/vite/static-renderer.ts +23 -15
  131. package/src/cmd/build/vite/vite-asset-server-config.ts +200 -70
  132. package/src/cmd/build/vite/vite-asset-server.ts +25 -15
  133. package/src/cmd/build/vite/vite-builder.ts +49 -220
  134. package/src/cmd/build/vite/ws-proxy.ts +126 -0
  135. package/src/cmd/build/vite-bundler.ts +0 -4
  136. package/src/cmd/cloud/deploy-fork.ts +16 -39
  137. package/src/cmd/cloud/sandbox/exec.ts +23 -130
  138. package/src/cmd/cloud/sandbox/run.ts +2 -9
  139. package/src/cmd/cloud/sandbox/snapshot/build.ts +2 -2
  140. package/src/cmd/coder/hub-url.ts +1 -3
  141. package/src/cmd/coder/start.ts +6 -6
  142. package/src/cmd/coder/tui-init.ts +4 -4
  143. package/src/cmd/dev/file-watcher.ts +2 -9
  144. package/src/cmd/dev/index.ts +476 -859
  145. package/src/cmd/dev/process-manager.ts +261 -0
  146. package/src/errors.ts +12 -44
  147. package/src/schema-generator.ts +12 -2
  148. package/src/tui.ts +5 -18
  149. package/src/utils/version-mismatch.ts +204 -0
  150. package/dist/cmd/build/ast.d.ts +0 -78
  151. package/dist/cmd/build/ast.d.ts.map +0 -1
  152. package/dist/cmd/build/ast.js +0 -2703
  153. package/dist/cmd/build/ast.js.map +0 -1
  154. package/dist/cmd/build/entry-generator.d.ts +0 -25
  155. package/dist/cmd/build/entry-generator.d.ts.map +0 -1
  156. package/dist/cmd/build/entry-generator.js +0 -695
  157. package/dist/cmd/build/entry-generator.js.map +0 -1
  158. package/dist/cmd/build/vite/api-mount-path.d.ts +0 -61
  159. package/dist/cmd/build/vite/api-mount-path.d.ts.map +0 -1
  160. package/dist/cmd/build/vite/api-mount-path.js +0 -83
  161. package/dist/cmd/build/vite/api-mount-path.js.map +0 -1
  162. package/dist/cmd/build/vite/registry-generator.d.ts +0 -19
  163. package/dist/cmd/build/vite/registry-generator.d.ts.map +0 -1
  164. package/dist/cmd/build/vite/registry-generator.js +0 -1108
  165. package/dist/cmd/build/vite/registry-generator.js.map +0 -1
  166. package/dist/cmd/build/webanalytics-generator.d.ts +0 -16
  167. package/dist/cmd/build/webanalytics-generator.d.ts.map +0 -1
  168. package/dist/cmd/build/webanalytics-generator.js +0 -178
  169. package/dist/cmd/build/webanalytics-generator.js.map +0 -1
  170. package/dist/cmd/build/workbench.d.ts +0 -7
  171. package/dist/cmd/build/workbench.d.ts.map +0 -1
  172. package/dist/cmd/build/workbench.js +0 -55
  173. package/dist/cmd/build/workbench.js.map +0 -1
  174. package/dist/utils/route-migration.d.ts +0 -62
  175. package/dist/utils/route-migration.d.ts.map +0 -1
  176. package/dist/utils/route-migration.js +0 -630
  177. package/dist/utils/route-migration.js.map +0 -1
  178. package/dist/utils/stream-capture.d.ts +0 -9
  179. package/dist/utils/stream-capture.d.ts.map +0 -1
  180. package/dist/utils/stream-capture.js +0 -34
  181. package/dist/utils/stream-capture.js.map +0 -1
  182. package/src/cmd/build/ast.ts +0 -3529
  183. package/src/cmd/build/entry-generator.ts +0 -760
  184. package/src/cmd/build/vite/api-mount-path.ts +0 -87
  185. package/src/cmd/build/vite/registry-generator.ts +0 -1267
  186. package/src/cmd/build/webanalytics-generator.ts +0 -197
  187. package/src/cmd/build/workbench.ts +0 -58
  188. package/src/utils/route-migration.ts +0 -757
  189. package/src/utils/stream-capture.ts +0 -39
@@ -1,20 +1,162 @@
1
1
  /**
2
- * Vite Asset Server Configuration
2
+ * Vite Dev Server Configuration
3
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.
4
+ * Vite is the primary dev server — serves frontend assets natively and proxies
5
+ * API/WebSocket requests to the Bun backend server.
6
6
  */
7
7
 
8
8
  import { join } from 'node:path';
9
- import { createRequire } from 'node:module';
10
- import type { InlineConfig } from 'vite';
9
+ import { existsSync } from 'node:fs';
10
+ import type { InlineConfig, Plugin } from 'vite';
11
11
  import type { Logger } from '../../../types';
12
12
 
13
13
  export interface GenerateAssetServerConfigOptions {
14
14
  rootDir: string;
15
15
  logger: Logger;
16
16
  workbenchPath?: string;
17
- port: number; // The port Vite will run on (for HMR client configuration)
17
+ port: number; // The port Vite will listen on (user-facing)
18
+ backendPort: number; // The port Bun backend is running on (internal)
19
+ /** User-defined route mount paths from createApp({ router }) (e.g., ['/api', '/v1']) */
20
+ routePaths?: string[];
21
+ }
22
+
23
+ /**
24
+ * Vite plugin that injects analytics scripts in dev mode.
25
+ *
26
+ * In production the beacon plugin handles this at build time. In dev mode
27
+ * the analytics config + session + beacon scripts are served by the Bun
28
+ * backend at /_agentuity/webanalytics/* routes, but we need to inject the
29
+ * `<script>` tags into the HTML so the browser loads them.
30
+ */
31
+ function devAnalyticsPlugin(): Plugin {
32
+ return {
33
+ name: 'agentuity:dev-analytics',
34
+ transformIndexHtml: {
35
+ order: 'pre',
36
+ handler(html) {
37
+ // Default analytics config — matches resolveAnalyticsConfig(undefined) in runtime
38
+ const config = {
39
+ enabled: true,
40
+ trackClicks: true,
41
+ trackScroll: true,
42
+ trackOutboundLinks: true,
43
+ trackForms: false,
44
+ trackWebVitals: true,
45
+ trackErrors: true,
46
+ trackSPANavigation: true,
47
+ isDevmode: true,
48
+ };
49
+
50
+ const injection =
51
+ `<script>window.__AGENTUITY_ANALYTICS__=${JSON.stringify(config)};</script>` +
52
+ '<script src="/_agentuity/webanalytics/session.js" async></script>' +
53
+ '<script src="/_agentuity/webanalytics/analytics.js"></script>';
54
+
55
+ if (html.includes('</head>')) {
56
+ return html.replace('</head>', `${injection}</head>`);
57
+ }
58
+ return html;
59
+ },
60
+ },
61
+ };
62
+ }
63
+
64
+ /**
65
+ * Vite plugin that serves src/web/index.html as the SPA fallback.
66
+ *
67
+ * Vite's built-in SPA fallback only serves index.html from the project root.
68
+ * Since Agentuity apps keep their HTML entry at src/web/index.html, we need
69
+ * this plugin to rewrite the URL so Vite's built-in transform pipeline
70
+ * (including React Fast Refresh injection) processes it correctly.
71
+ */
72
+ function spaFallbackPlugin(rootDir: string, routePaths: string[], workbenchPath?: string): Plugin {
73
+ const htmlPath = join(rootDir, 'src', 'web', 'index.html');
74
+ const hasHtml = existsSync(htmlPath);
75
+
76
+ return {
77
+ name: 'agentuity:spa-fallback',
78
+ configureServer(server) {
79
+ if (!hasHtml) return;
80
+
81
+ server.middlewares.use(async (req, res, next) => {
82
+ // Only handle GET/HEAD navigation requests
83
+ if (req.method !== 'GET' && req.method !== 'HEAD') return next();
84
+
85
+ const url = req.url || '/';
86
+ const pathname = url.split('?')[0] || '/';
87
+ const accept = req.headers.accept || '';
88
+ const secFetchDest = req.headers['sec-fetch-dest'] || '';
89
+
90
+ // For robustness, treat unknown GET/HEAD routes as potential SPA navigations.
91
+ // We still avoid intercepting assets/backend paths via the filters below.
92
+ // (This also makes non-browser readiness probes like fetch('/streams') work.)
93
+ const isDocumentRequest = secFetchDest === 'document' || accept.includes('text/html');
94
+
95
+ // Skip file requests (have an extension)
96
+ if (pathname !== '/' && /\.[a-zA-Z0-9]+$/.test(pathname)) return next();
97
+
98
+ // For non-document requests, only allow root path fallback.
99
+ // (e.g. don't turn module/script fetches into HTML accidentally)
100
+ if (!isDocumentRequest && pathname === '/') {
101
+ // allow root fallback for simple probes
102
+ }
103
+
104
+ // Skip Vite/module/internal asset paths
105
+ if (
106
+ pathname.startsWith('/@vite') ||
107
+ pathname.startsWith('/@react-refresh') ||
108
+ pathname.startsWith('/@id/') ||
109
+ pathname.startsWith('/@fs/') ||
110
+ pathname.startsWith('/node_modules/') ||
111
+ pathname.startsWith('/src/') ||
112
+ (pathname.startsWith('/@') && !pathname.startsWith('/_agentuity'))
113
+ ) {
114
+ return next();
115
+ }
116
+
117
+ // Skip paths that are proxied to the Bun backend
118
+ if (
119
+ pathname.startsWith('/_agentuity') ||
120
+ pathname.startsWith('/_health') ||
121
+ pathname.startsWith('/_idle')
122
+ ) {
123
+ return next();
124
+ }
125
+ // Skip workbench path (served by Bun)
126
+ if (
127
+ workbenchPath &&
128
+ (pathname === workbenchPath || pathname.startsWith(workbenchPath + '/'))
129
+ ) {
130
+ return next();
131
+ }
132
+ for (const rp of routePaths) {
133
+ if (pathname === rp || pathname.startsWith(rp + '/')) return next();
134
+ }
135
+
136
+ // If this isn't clearly a document navigation, still allow SPA fallback
137
+ // for extensionless client-side routes like /streams, /rpc, /webrtc.
138
+ // We already excluded backend paths and asset/module paths above.
139
+
140
+ try {
141
+ let html = await Bun.file(htmlPath).text();
142
+ // Match old devHtmlHandler behavior from the generated Bun entry:
143
+ // rewrite relative paths so the app works from / and client-side routes.
144
+ html = html
145
+ .replace(/src="\.\//g, 'src="/src/web/')
146
+ .replace(/href="\.\//g, 'href="/src/web/');
147
+
148
+ // Let Vite inject HMR client, React refresh preamble, etc.
149
+ html = await server.transformIndexHtml(url, html, req.originalUrl);
150
+
151
+ res.statusCode = 200;
152
+ res.setHeader('Content-Type', 'text/html; charset=utf-8');
153
+ res.end(html);
154
+ } catch (error) {
155
+ next(error as Error);
156
+ }
157
+ });
158
+ },
159
+ };
18
160
  }
19
161
 
20
162
  /**
@@ -23,23 +165,7 @@ export interface GenerateAssetServerConfigOptions {
23
165
  export async function generateAssetServerConfig(
24
166
  options: GenerateAssetServerConfigOptions
25
167
  ): Promise<InlineConfig> {
26
- const { rootDir, logger, workbenchPath, port } = options;
27
-
28
- // Load custom user config for define values and plugins
29
- const { loadAgentuityConfig } = await import('./config-loader');
30
- const userConfig = await loadAgentuityConfig(rootDir, logger);
31
- const userDefine = userConfig?.define || {};
32
- const userPlugins = userConfig?.plugins || [];
33
-
34
- if (Object.keys(userDefine).length > 0) {
35
- logger.debug(
36
- 'Loaded %d custom define(s) from agentuity.config.ts',
37
- Object.keys(userDefine).length
38
- );
39
- }
40
- if (userPlugins.length > 0) {
41
- logger.debug('Loaded %d custom plugin(s) from agentuity.config.ts', userPlugins.length);
42
- }
168
+ const { rootDir, logger, workbenchPath, port, backendPort, routePaths = ['/api'] } = options;
43
169
 
44
170
  // Load path aliases from tsconfig.json if available
45
171
  const tsconfigPath = join(rootDir, 'tsconfig.json');
@@ -74,51 +200,75 @@ export async function generateAssetServerConfig(
74
200
 
75
201
  resolve: {
76
202
  alias,
77
- // Deduplicate React to prevent multiple instances
203
+ // Deduplicate React to prevent multiple instances (if used)
78
204
  dedupe: ['react', 'react-dom', 'react/jsx-runtime', 'react/jsx-dev-runtime'],
79
205
  },
80
206
 
81
- // Pre-bundle dependencies to avoid React preamble issues with pre-built JSX
207
+ // Pre-bundle dependencies to avoid issues with pre-built packages
82
208
  // Only include @agentuity/workbench if workbench is enabled
83
209
  optimizeDeps: {
84
- include: workbenchPath
85
- ? ['@agentuity/workbench', '@agentuity/core', '@agentuity/react']
86
- : ['@agentuity/core', '@agentuity/react'],
210
+ include: workbenchPath ? ['@agentuity/workbench', '@agentuity/core'] : ['@agentuity/core'],
87
211
  },
88
212
 
89
213
  // Only allow frontend env vars (server uses process.env)
90
214
  envPrefix: ['VITE_', 'AGENTUITY_PUBLIC_', 'PUBLIC_'],
91
215
 
92
216
  server: {
93
- // Use the port we selected
217
+ // Vite is the primary dev server — listens on the user-facing port
94
218
  port,
95
219
  strictPort: true, // Port is pre-verified as available by findAvailablePort()
96
220
  host: '127.0.0.1',
97
221
 
98
- // CORS headers to allow Bun server on port 3500 to proxy requests
99
- cors: {
100
- origin: 'http://127.0.0.1:3500',
101
- credentials: true,
222
+ // Proxy backend routes to Bun server (HTTP only).
223
+ // WebSocket upgrades are handled by the front-door TCP proxy (ws-proxy.ts)
224
+ // which routes them directly to the Bun backend, bypassing Vite entirely.
225
+ // This avoids Bun's broken node:http upgrade socket implementation.
226
+ proxy: {
227
+ // User-defined route mounts (from createApp({ router }))
228
+ ...Object.fromEntries(
229
+ routePaths.map((routePath) => [
230
+ routePath,
231
+ {
232
+ target: `http://127.0.0.1:${backendPort}`,
233
+ changeOrigin: true,
234
+ },
235
+ ])
236
+ ),
237
+ // Agentuity system routes (workbench API, health, analytics, etc.)
238
+ '/_agentuity': {
239
+ target: `http://127.0.0.1:${backendPort}`,
240
+ changeOrigin: true,
241
+ },
242
+ // Workbench UI route (served by Bun, references /@fs/* paths handled by Vite)
243
+ ...(workbenchPath
244
+ ? {
245
+ [workbenchPath]: {
246
+ target: `http://127.0.0.1:${backendPort}`,
247
+ changeOrigin: true,
248
+ },
249
+ }
250
+ : {}),
251
+ // Legacy health check routes
252
+ '/_health': {
253
+ target: `http://127.0.0.1:${backendPort}`,
254
+ changeOrigin: true,
255
+ },
256
+ '/_idle': {
257
+ target: `http://127.0.0.1:${backendPort}`,
258
+ changeOrigin: true,
259
+ },
102
260
  },
103
261
 
104
- // HMR configuration for development with tunnel support (*.agentuity.live)
105
- // Do NOT set host/protocol - let Vite auto-detect from page origin
106
- // This allows HMR to work both locally and through the Gravity tunnel
107
- // The Bun server proxies /__vite_hmr WebSocket connections to Vite
108
- hmr: {
109
- // Use a dedicated path for HMR WebSocket to enable proxying
110
- path: '/__vite_hmr',
111
- },
262
+ // HMR works natively Vite is the primary server, no proxy needed
263
+ // Auto-detect host/protocol from page origin for tunnel support
264
+ hmr: true,
112
265
 
113
- // Don't open browser - Bun server will be the entry point
266
+ // Don't open browser automatically
114
267
  open: false,
115
268
  },
116
269
 
117
270
  // Define environment variables for browser
118
271
  define: {
119
- // Merge user-defined constants first
120
- ...userDefine,
121
- // Then add default defines (these will override any user-defined protected keys)
122
272
  ...(workbenchPath
123
273
  ? { 'import.meta.env.AGENTUITY_PUBLIC_WORKBENCH_PATH': JSON.stringify(workbenchPath) }
124
274
  : {}),
@@ -128,40 +278,20 @@ export async function generateAssetServerConfig(
128
278
  'process.env.NODE_ENV': JSON.stringify('development'),
129
279
  },
130
280
 
131
- // Plugins: User plugins first (includes framework plugin like React/Svelte/Vue), then browser env
132
- // Try project's node_modules first, fall back to CLI's bundled version
281
+ // Agentuity-specific plugins (Vite loads user plugins from vite.config.ts automatically)
133
282
  plugins: await (async () => {
134
283
  const { browserEnvPlugin } = await import('./browser-env-plugin');
135
- const { tailwindSourcePlugin } = await import('./tailwind-source-plugin');
136
284
  const { publicAssetPathPlugin } = await import('./public-asset-path-plugin');
137
- const { hasFrameworkPlugin } = await import('./config-loader');
138
-
139
- // Auto-add React plugin if no framework plugin is present (backwards compatibility)
140
- const resolvedUserPlugins = [...userPlugins];
141
- if (resolvedUserPlugins.length === 0 || !hasFrameworkPlugin(resolvedUserPlugins)) {
142
- logger.debug(
143
- 'No framework plugin found in agentuity.config.ts plugins, adding React automatically for dev server'
144
- );
145
- const projectRequire = createRequire(join(rootDir, 'package.json'));
146
- let reactPluginPath = '@vitejs/plugin-react';
147
- try {
148
- reactPluginPath = projectRequire.resolve('@vitejs/plugin-react');
149
- } catch {
150
- // Project doesn't have @vitejs/plugin-react, use CLI's bundled version
151
- }
152
- const reactModule = await import(reactPluginPath);
153
- resolvedUserPlugins.unshift(reactModule.default());
154
- }
155
285
 
156
286
  return [
157
- // Fix Tailwind oxide scanner hang in containers
158
- tailwindSourcePlugin(),
159
- // User-defined plugins from agentuity.config.ts (framework plugin + extras)
160
- ...resolvedUserPlugins,
161
287
  // Browser env plugin to map process.env to import.meta.env
162
288
  browserEnvPlugin(),
163
289
  // Warn about incorrect public asset paths in dev mode
164
290
  publicAssetPathPlugin({ warnInDev: true }),
291
+ // Inject analytics scripts in dev HTML
292
+ devAnalyticsPlugin(),
293
+ // SPA fallback: serve src/web/index.html for navigation requests
294
+ spaFallbackPlugin(rootDir, routePaths, workbenchPath),
165
295
  ];
166
296
  })(),
167
297
 
@@ -1,8 +1,9 @@
1
1
  /**
2
- * Vite Asset Server
2
+ * Vite Dev Server (Primary)
3
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.
4
+ * Starts Vite as the primary dev server on the user-facing port.
5
+ * Serves frontend assets natively and proxies API/WebSocket requests
6
+ * to the Bun backend server.
6
7
  */
7
8
 
8
9
  import { join } from 'node:path';
@@ -21,6 +22,10 @@ export interface StartViteAssetServerOptions {
21
22
  rootDir: string;
22
23
  logger: Logger;
23
24
  workbenchPath?: string;
25
+ port?: number; // Preferred user-facing port (default: 3500)
26
+ backendPort: number; // Port of the Bun backend server
27
+ /** User-defined route mount paths from createApp({ router }) */
28
+ routePaths?: string[];
24
29
  }
25
30
 
26
31
  /**
@@ -68,27 +73,34 @@ async function findAvailablePort(
68
73
  export async function startViteAssetServer(
69
74
  options: StartViteAssetServerOptions
70
75
  ): Promise<ViteAssetServerResult> {
71
- const { rootDir, logger, workbenchPath } = options;
76
+ const {
77
+ rootDir,
78
+ logger,
79
+ workbenchPath,
80
+ port: preferredPort = 3500,
81
+ backendPort,
82
+ routePaths,
83
+ } = options;
72
84
 
73
- logger.debug('Starting Vite asset server (HMR only)...');
85
+ logger.debug('Starting Vite dev server (primary, proxying backend on port %d)...', backendPort);
74
86
 
75
- // Find an available port before starting Vite
76
- // This avoids relying on Vite's strictPort:false fallback which can fail
77
- const preferredPort = 5173;
87
+ // Find an available port for the user-facing Vite server
78
88
  const availablePort = await findAvailablePort(preferredPort, '127.0.0.1');
79
89
 
80
90
  if (availablePort !== preferredPort) {
81
91
  logger.info(
82
- `Port ${preferredPort} is in use, using port ${availablePort} for Vite asset server`
92
+ `Port ${preferredPort} is in use, using port ${availablePort} for Vite dev server`
83
93
  );
84
94
  }
85
95
 
86
- // Generate minimal config with the available port
96
+ // Generate config with proxy to Bun backend
87
97
  const config = await generateAssetServerConfig({
88
98
  rootDir,
89
99
  logger,
90
100
  workbenchPath,
91
101
  port: availablePort,
102
+ backendPort,
103
+ routePaths,
92
104
  });
93
105
 
94
106
  // Dynamically import vite from the project's node_modules
@@ -130,11 +142,9 @@ export async function startViteAssetServer(
130
142
  // Port was pre-verified and strictPort:true ensures Vite uses exactly this port
131
143
  const actualPort = availablePort;
132
144
 
133
- logger.info(`Vite asset server running on port ${actualPort}`);
134
- logger.debug(`Asset server will handle: HMR, React transformation, source maps`);
135
- logger.debug(
136
- `HMR WebSocket configured at /__vite_hmr (proxied through Bun server for tunnel support)`
137
- );
145
+ logger.debug(`Vite dev server running on port ${actualPort} (primary)`);
146
+ logger.debug(`Frontend: HMR, React transformation, source maps (native)`);
147
+ logger.debug(`Backend: proxying to Bun on port ${backendPort}`);
138
148
 
139
149
  return { server, port: actualPort };
140
150
  }