@agentuity/cli 0.0.100 → 0.0.102

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 (264) hide show
  1. package/AGENTS.md +19 -188
  2. package/bin/cli.ts +13 -6
  3. package/dist/api.d.ts +1 -0
  4. package/dist/api.d.ts.map +1 -1
  5. package/dist/api.js +1 -1
  6. package/dist/api.js.map +1 -1
  7. package/dist/cli.d.ts.map +1 -1
  8. package/dist/cli.js +41 -12
  9. package/dist/cli.js.map +1 -1
  10. package/dist/cmd/ai/index.d.ts.map +1 -1
  11. package/dist/cmd/ai/index.js +6 -1
  12. package/dist/cmd/ai/index.js.map +1 -1
  13. package/dist/cmd/ai/prompt/agent.d.ts +7 -0
  14. package/dist/cmd/ai/prompt/agent.d.ts.map +1 -1
  15. package/dist/cmd/ai/prompt/agent.js +12 -323
  16. package/dist/cmd/ai/prompt/agent.js.map +1 -1
  17. package/dist/cmd/ai/prompt/api.d.ts +7 -0
  18. package/dist/cmd/ai/prompt/api.d.ts.map +1 -1
  19. package/dist/cmd/ai/prompt/api.js +12 -260
  20. package/dist/cmd/ai/prompt/api.js.map +1 -1
  21. package/dist/cmd/ai/prompt/version.d.ts +35 -0
  22. package/dist/cmd/ai/prompt/version.d.ts.map +1 -0
  23. package/dist/cmd/ai/prompt/version.js +55 -0
  24. package/dist/cmd/ai/prompt/version.js.map +1 -0
  25. package/dist/cmd/ai/prompt/web.d.ts +7 -0
  26. package/dist/cmd/ai/prompt/web.d.ts.map +1 -1
  27. package/dist/cmd/ai/prompt/web.js +12 -283
  28. package/dist/cmd/ai/prompt/web.js.map +1 -1
  29. package/dist/cmd/ai/skills/generate.d.ts +3 -0
  30. package/dist/cmd/ai/skills/generate.d.ts.map +1 -0
  31. package/dist/cmd/ai/skills/generate.js +65 -0
  32. package/dist/cmd/ai/skills/generate.js.map +1 -0
  33. package/dist/cmd/ai/skills/generator.d.ts +4 -0
  34. package/dist/cmd/ai/skills/generator.d.ts.map +1 -0
  35. package/dist/cmd/ai/skills/generator.js +402 -0
  36. package/dist/cmd/ai/skills/generator.js.map +1 -0
  37. package/dist/cmd/ai/skills/index.d.ts +4 -0
  38. package/dist/cmd/ai/skills/index.d.ts.map +1 -0
  39. package/dist/cmd/ai/skills/index.js +21 -0
  40. package/dist/cmd/ai/skills/index.js.map +1 -0
  41. package/dist/cmd/auth/signup.d.ts.map +1 -1
  42. package/dist/cmd/auth/signup.js +1 -0
  43. package/dist/cmd/auth/signup.js.map +1 -1
  44. package/dist/cmd/build/ast.d.ts +2 -1
  45. package/dist/cmd/build/ast.d.ts.map +1 -1
  46. package/dist/cmd/build/ast.js +135 -47
  47. package/dist/cmd/build/ast.js.map +1 -1
  48. package/dist/cmd/build/entry-generator.d.ts.map +1 -1
  49. package/dist/cmd/build/entry-generator.js +255 -188
  50. package/dist/cmd/build/entry-generator.js.map +1 -1
  51. package/dist/cmd/build/vite/agent-discovery.d.ts.map +1 -1
  52. package/dist/cmd/build/vite/agent-discovery.js +103 -45
  53. package/dist/cmd/build/vite/agent-discovery.js.map +1 -1
  54. package/dist/cmd/build/vite/bun-dev-server.d.ts +7 -1
  55. package/dist/cmd/build/vite/bun-dev-server.d.ts.map +1 -1
  56. package/dist/cmd/build/vite/bun-dev-server.js +52 -26
  57. package/dist/cmd/build/vite/bun-dev-server.js.map +1 -1
  58. package/dist/cmd/build/vite/docs-generator.d.ts +13 -0
  59. package/dist/cmd/build/vite/docs-generator.d.ts.map +1 -0
  60. package/dist/cmd/build/vite/docs-generator.js +81 -0
  61. package/dist/cmd/build/vite/docs-generator.js.map +1 -0
  62. package/dist/cmd/build/vite/index.d.ts +3 -3
  63. package/dist/cmd/build/vite/index.d.ts.map +1 -1
  64. package/dist/cmd/build/vite/index.js +9 -7
  65. package/dist/cmd/build/vite/index.js.map +1 -1
  66. package/dist/cmd/build/vite/lifecycle-generator.d.ts +1 -1
  67. package/dist/cmd/build/vite/lifecycle-generator.d.ts.map +1 -1
  68. package/dist/cmd/build/vite/lifecycle-generator.js +19 -5
  69. package/dist/cmd/build/vite/lifecycle-generator.js.map +1 -1
  70. package/dist/cmd/build/vite/metadata-generator.d.ts.map +1 -1
  71. package/dist/cmd/build/vite/metadata-generator.js +203 -7
  72. package/dist/cmd/build/vite/metadata-generator.js.map +1 -1
  73. package/dist/cmd/build/vite/prompt-generator.d.ts +23 -0
  74. package/dist/cmd/build/vite/prompt-generator.d.ts.map +1 -0
  75. package/dist/cmd/build/vite/prompt-generator.js +123 -0
  76. package/dist/cmd/build/vite/prompt-generator.js.map +1 -0
  77. package/dist/cmd/build/vite/registry-generator.d.ts +3 -3
  78. package/dist/cmd/build/vite/registry-generator.d.ts.map +1 -1
  79. package/dist/cmd/build/vite/registry-generator.js +644 -103
  80. package/dist/cmd/build/vite/registry-generator.js.map +1 -1
  81. package/dist/cmd/build/vite/route-discovery.d.ts +4 -0
  82. package/dist/cmd/build/vite/route-discovery.d.ts.map +1 -1
  83. package/dist/cmd/build/vite/route-discovery.js.map +1 -1
  84. package/dist/cmd/build/vite/server-bundler.d.ts +4 -0
  85. package/dist/cmd/build/vite/server-bundler.d.ts.map +1 -1
  86. package/dist/cmd/build/vite/server-bundler.js +63 -17
  87. package/dist/cmd/build/vite/server-bundler.js.map +1 -1
  88. package/dist/cmd/build/vite/vite-asset-server-config.d.ts.map +1 -1
  89. package/dist/cmd/build/vite/vite-asset-server-config.js +4 -0
  90. package/dist/cmd/build/vite/vite-asset-server-config.js.map +1 -1
  91. package/dist/cmd/build/vite/vite-builder.d.ts +1 -1
  92. package/dist/cmd/build/vite/vite-builder.d.ts.map +1 -1
  93. package/dist/cmd/build/vite/vite-builder.js +118 -96
  94. package/dist/cmd/build/vite/vite-builder.js.map +1 -1
  95. package/dist/cmd/build/vite-bundler.js +6 -6
  96. package/dist/cmd/build/vite-bundler.js.map +1 -1
  97. package/dist/cmd/cloud/deploy.d.ts.map +1 -1
  98. package/dist/cmd/cloud/deploy.js +89 -32
  99. package/dist/cmd/cloud/deploy.js.map +1 -1
  100. package/dist/cmd/cloud/keyvalue/create-namespace.d.ts.map +1 -1
  101. package/dist/cmd/cloud/keyvalue/create-namespace.js +3 -1
  102. package/dist/cmd/cloud/keyvalue/create-namespace.js.map +1 -1
  103. package/dist/cmd/cloud/keyvalue/delete-namespace.d.ts.map +1 -1
  104. package/dist/cmd/cloud/keyvalue/delete-namespace.js +3 -1
  105. package/dist/cmd/cloud/keyvalue/delete-namespace.js.map +1 -1
  106. package/dist/cmd/cloud/keyvalue/delete.d.ts.map +1 -1
  107. package/dist/cmd/cloud/keyvalue/delete.js +3 -1
  108. package/dist/cmd/cloud/keyvalue/delete.js.map +1 -1
  109. package/dist/cmd/cloud/keyvalue/set.d.ts.map +1 -1
  110. package/dist/cmd/cloud/keyvalue/set.js +4 -2
  111. package/dist/cmd/cloud/keyvalue/set.js.map +1 -1
  112. package/dist/cmd/cloud/stream/get.d.ts.map +1 -1
  113. package/dist/cmd/cloud/stream/get.js +2 -13
  114. package/dist/cmd/cloud/stream/get.js.map +1 -1
  115. package/dist/cmd/cloud/vector/delete-namespace.d.ts +3 -0
  116. package/dist/cmd/cloud/vector/delete-namespace.d.ts.map +1 -0
  117. package/dist/cmd/cloud/vector/delete-namespace.js +77 -0
  118. package/dist/cmd/cloud/vector/delete-namespace.js.map +1 -0
  119. package/dist/cmd/cloud/vector/index.d.ts.map +1 -1
  120. package/dist/cmd/cloud/vector/index.js +21 -4
  121. package/dist/cmd/cloud/vector/index.js.map +1 -1
  122. package/dist/cmd/cloud/vector/list-namespaces.d.ts +3 -0
  123. package/dist/cmd/cloud/vector/list-namespaces.d.ts.map +1 -0
  124. package/dist/cmd/cloud/vector/list-namespaces.js +42 -0
  125. package/dist/cmd/cloud/vector/list-namespaces.js.map +1 -0
  126. package/dist/cmd/cloud/vector/stats.d.ts +3 -0
  127. package/dist/cmd/cloud/vector/stats.d.ts.map +1 -0
  128. package/dist/cmd/cloud/vector/stats.js +142 -0
  129. package/dist/cmd/cloud/vector/stats.js.map +1 -0
  130. package/dist/cmd/cloud/vector/upsert.d.ts +3 -0
  131. package/dist/cmd/cloud/vector/upsert.d.ts.map +1 -0
  132. package/dist/cmd/cloud/vector/upsert.js +192 -0
  133. package/dist/cmd/cloud/vector/upsert.js.map +1 -0
  134. package/dist/cmd/dev/file-watcher.d.ts.map +1 -1
  135. package/dist/cmd/dev/file-watcher.js +94 -33
  136. package/dist/cmd/dev/file-watcher.js.map +1 -1
  137. package/dist/cmd/dev/index.d.ts.map +1 -1
  138. package/dist/cmd/dev/index.js +298 -61
  139. package/dist/cmd/dev/index.js.map +1 -1
  140. package/dist/cmd/dev/skills.d.ts +10 -0
  141. package/dist/cmd/dev/skills.d.ts.map +1 -0
  142. package/dist/cmd/dev/skills.js +57 -0
  143. package/dist/cmd/dev/skills.js.map +1 -0
  144. package/dist/cmd/dev/sync.d.ts.map +1 -1
  145. package/dist/cmd/dev/sync.js +19 -3
  146. package/dist/cmd/dev/sync.js.map +1 -1
  147. package/dist/cmd/index.d.ts.map +1 -1
  148. package/dist/cmd/index.js +1 -0
  149. package/dist/cmd/index.js.map +1 -1
  150. package/dist/cmd/project/create.d.ts.map +1 -1
  151. package/dist/cmd/project/create.js +3 -0
  152. package/dist/cmd/project/create.js.map +1 -1
  153. package/dist/cmd/project/template-flow.d.ts +1 -0
  154. package/dist/cmd/project/template-flow.d.ts.map +1 -1
  155. package/dist/cmd/project/template-flow.js +30 -5
  156. package/dist/cmd/project/template-flow.js.map +1 -1
  157. package/dist/cmd/setup/index.d.ts.map +1 -1
  158. package/dist/cmd/setup/index.js +1 -0
  159. package/dist/cmd/setup/index.js.map +1 -1
  160. package/dist/cmd/upgrade/index.d.ts +15 -0
  161. package/dist/cmd/upgrade/index.d.ts.map +1 -1
  162. package/dist/cmd/upgrade/index.js +59 -4
  163. package/dist/cmd/upgrade/index.js.map +1 -1
  164. package/dist/config.d.ts.map +1 -1
  165. package/dist/config.js +8 -0
  166. package/dist/config.js.map +1 -1
  167. package/dist/domain.d.ts +45 -0
  168. package/dist/domain.d.ts.map +1 -0
  169. package/dist/domain.js +200 -0
  170. package/dist/domain.js.map +1 -0
  171. package/dist/index.d.ts +0 -1
  172. package/dist/index.d.ts.map +1 -1
  173. package/dist/index.js +0 -1
  174. package/dist/index.js.map +1 -1
  175. package/dist/schema-generator.d.ts +2 -0
  176. package/dist/schema-generator.d.ts.map +1 -1
  177. package/dist/schema-generator.js +18 -0
  178. package/dist/schema-generator.js.map +1 -1
  179. package/dist/steps.d.ts +1 -1
  180. package/dist/steps.d.ts.map +1 -1
  181. package/dist/steps.js +16 -5
  182. package/dist/steps.js.map +1 -1
  183. package/dist/tui/prompt.d.ts +1 -2
  184. package/dist/tui/prompt.d.ts.map +1 -1
  185. package/dist/tui/prompt.js +8 -4
  186. package/dist/tui/prompt.js.map +1 -1
  187. package/dist/tui.d.ts +16 -0
  188. package/dist/tui.d.ts.map +1 -1
  189. package/dist/tui.js +23 -2
  190. package/dist/tui.js.map +1 -1
  191. package/dist/types.d.ts +9 -2
  192. package/dist/types.d.ts.map +1 -1
  193. package/dist/types.js +3 -3
  194. package/dist/types.js.map +1 -1
  195. package/package.json +5 -8
  196. package/src/api.ts +1 -1
  197. package/src/cli.ts +47 -12
  198. package/src/cmd/ai/index.ts +6 -1
  199. package/src/cmd/ai/prompt/agent.md +306 -0
  200. package/src/cmd/ai/prompt/agent.ts +12 -322
  201. package/src/cmd/ai/prompt/api.md +360 -0
  202. package/src/cmd/ai/prompt/api.ts +13 -260
  203. package/src/cmd/ai/prompt/version.ts +61 -0
  204. package/src/cmd/ai/prompt/web.md +509 -0
  205. package/src/cmd/ai/prompt/web.ts +12 -282
  206. package/src/cmd/ai/skills/generate.ts +75 -0
  207. package/src/cmd/ai/skills/generator.ts +519 -0
  208. package/src/cmd/ai/skills/index.ts +23 -0
  209. package/src/cmd/auth/signup.ts +1 -0
  210. package/src/cmd/build/ast.ts +161 -48
  211. package/src/cmd/build/entry-generator.ts +258 -187
  212. package/src/cmd/build/vite/agent-discovery.ts +151 -58
  213. package/src/cmd/build/vite/bun-dev-server.ts +57 -27
  214. package/src/cmd/build/vite/docs-generator.ts +87 -0
  215. package/src/cmd/build/vite/index.ts +9 -7
  216. package/src/cmd/build/vite/lifecycle-generator.ts +19 -5
  217. package/src/cmd/build/vite/metadata-generator.ts +251 -7
  218. package/src/cmd/build/vite/prompt-generator.ts +169 -0
  219. package/src/cmd/build/vite/registry-generator.ts +750 -108
  220. package/src/cmd/build/vite/route-discovery.ts +4 -0
  221. package/src/cmd/build/vite/server-bundler.ts +73 -23
  222. package/src/cmd/build/vite/vite-asset-server-config.ts +5 -0
  223. package/src/cmd/build/vite/vite-builder.ts +134 -100
  224. package/src/cmd/build/vite-bundler.ts +6 -6
  225. package/src/cmd/cloud/deploy.ts +114 -36
  226. package/src/cmd/cloud/keyvalue/create-namespace.ts +3 -1
  227. package/src/cmd/cloud/keyvalue/delete-namespace.ts +3 -1
  228. package/src/cmd/cloud/keyvalue/delete.ts +3 -1
  229. package/src/cmd/cloud/keyvalue/set.ts +4 -2
  230. package/src/cmd/cloud/stream/get.ts +2 -9
  231. package/src/cmd/cloud/vector/delete-namespace.ts +89 -0
  232. package/src/cmd/cloud/vector/index.ts +21 -4
  233. package/src/cmd/cloud/vector/list-namespaces.ts +46 -0
  234. package/src/cmd/cloud/vector/stats.ts +160 -0
  235. package/src/cmd/cloud/vector/upsert.ts +216 -0
  236. package/src/cmd/dev/file-watcher.ts +109 -34
  237. package/src/cmd/dev/index.ts +364 -60
  238. package/src/cmd/dev/skills.ts +82 -0
  239. package/src/cmd/dev/sync.ts +41 -6
  240. package/src/cmd/index.ts +1 -0
  241. package/src/cmd/project/create.ts +3 -0
  242. package/src/cmd/project/template-flow.ts +37 -5
  243. package/src/cmd/setup/index.ts +1 -0
  244. package/src/cmd/upgrade/index.ts +68 -4
  245. package/src/config.ts +9 -0
  246. package/src/domain.ts +273 -0
  247. package/src/index.ts +0 -5
  248. package/src/runtime-bootstrap.md +1 -1
  249. package/src/schema-generator.ts +23 -0
  250. package/src/steps.ts +16 -5
  251. package/src/tui/prompt.ts +11 -5
  252. package/src/tui.ts +21 -2
  253. package/src/types/md.d.ts +8 -0
  254. package/src/types.ts +12 -3
  255. package/dist/cmd/cloud/domain.d.ts +0 -17
  256. package/dist/cmd/cloud/domain.d.ts.map +0 -1
  257. package/dist/cmd/cloud/domain.js +0 -79
  258. package/dist/cmd/cloud/domain.js.map +0 -1
  259. package/dist/runtime-bootstrap.d.ts +0 -56
  260. package/dist/runtime-bootstrap.d.ts.map +0 -1
  261. package/dist/runtime-bootstrap.js +0 -95
  262. package/dist/runtime-bootstrap.js.map +0 -1
  263. package/src/cmd/cloud/domain.ts +0 -100
  264. package/src/runtime-bootstrap.ts +0 -131
@@ -33,8 +33,12 @@ export interface RouteInfo {
33
33
  routeType: 'api' | 'sms' | 'email' | 'cron' | 'websocket' | 'sse' | 'stream';
34
34
  agentVariable?: string;
35
35
  agentImportPath?: string;
36
+ agentName?: string;
37
+ agentDescription?: string;
36
38
  inputSchemaVariable?: string;
37
39
  outputSchemaVariable?: string;
40
+ inputSchemaCode?: string;
41
+ outputSchemaCode?: string;
38
42
  stream?: boolean;
39
43
  }
40
44
 
@@ -9,6 +9,37 @@ import type { Logger } from '../../../types';
9
9
  import type { BunPlugin } from 'bun';
10
10
  import { generatePatches, applyPatch } from '../patch';
11
11
 
12
+ /**
13
+ * Format a Bun build log (BuildMessage or ResolveMessage) into a readable string
14
+ */
15
+ export function formatBuildLog(log: BuildMessage | ResolveMessage): string {
16
+ const parts: string[] = [];
17
+
18
+ // For ResolveMessage, format with specifier info
19
+ if (log.name === 'ResolveMessage') {
20
+ const resolveLog = log as ResolveMessage;
21
+ if (resolveLog.specifier) {
22
+ parts.push(`Could not resolve "${resolveLog.specifier}"`);
23
+ // Use referrer if available, otherwise fall back to position.file
24
+ const referrer = resolveLog.referrer || resolveLog.position?.file;
25
+ if (referrer) {
26
+ parts.push(` imported from: ${referrer}`);
27
+ }
28
+ } else if (resolveLog.message) {
29
+ parts.push(resolveLog.message);
30
+ }
31
+ } else if (log.message) {
32
+ parts.push(log.message);
33
+ }
34
+
35
+ // Add position info if available (only if we haven't already shown referrer from position)
36
+ if (log.position && log.name !== 'ResolveMessage') {
37
+ parts.push(` at ${log.position.file}:${log.position.line}:${log.position.column}`);
38
+ }
39
+
40
+ return parts.join('\n');
41
+ }
42
+
12
43
  export interface ServerBundleOptions {
13
44
  rootDir: string;
14
45
  dev: boolean;
@@ -24,7 +55,7 @@ export async function installExternalsAndBuild(options: ServerBundleOptions): Pr
24
55
 
25
56
  logger.debug('[server-bundler] Starting server bundle process');
26
57
 
27
- const entryPath = join(rootDir, '.agentuity/app.generated.ts');
58
+ const entryPath = join(rootDir, 'src/generated/app.ts');
28
59
  const outDir = join(rootDir, '.agentuity');
29
60
 
30
61
  logger.debug(`[server-bundler] Entry: ${entryPath}, OutDir: ${outDir}`);
@@ -246,6 +277,10 @@ export async function installExternalsAndBuild(options: ServerBundleOptions): Pr
246
277
  minify: !dev,
247
278
  sourcemap: (dev ? 'inline' : 'external') as 'inline' | 'external',
248
279
  external,
280
+ // CRITICAL: Disable environment variable inlining for server builds
281
+ // Server code must read process.env at RUNTIME, not have values baked in at build time
282
+ // Without this, NODE_ENV and other env vars get inlined as string literals
283
+ env: 'disable' as const,
249
284
  define: userDefine, // Include custom define values from agentuity.config.ts
250
285
  plugins: [patchPlugin],
251
286
  naming: {
@@ -257,6 +292,12 @@ export async function installExternalsAndBuild(options: ServerBundleOptions): Pr
257
292
  `Bun.build config: ${JSON.stringify({ ...buildConfig, external: `[${external.length} packages]` }, null, 2)}`
258
293
  );
259
294
 
295
+ // WORKAROUND: Temporarily delete NODE_ENV to prevent Bun.build from inlining it
296
+ // See: https://github.com/oven-sh/bun/issues/20183
297
+ // Even with env: 'disable', Bun.build still inlines NODE_ENV at build time
298
+ const originalNodeEnv = process.env.NODE_ENV;
299
+ delete process.env.NODE_ENV;
300
+
260
301
  // Verify entry point exists before building
261
302
  if (!(await Bun.file(entryPath).exists())) {
262
303
  throw new Error(`Entry point not found: ${entryPath}`);
@@ -268,38 +309,47 @@ export async function installExternalsAndBuild(options: ServerBundleOptions): Pr
268
309
  try {
269
310
  result = await Bun.build(buildConfig);
270
311
  } catch (error: unknown) {
271
- logger.error('Bun.build threw an exception');
312
+ // Restore NODE_ENV after build attempt
313
+ if (originalNodeEnv !== undefined) {
314
+ process.env.NODE_ENV = originalNodeEnv;
315
+ }
272
316
 
273
317
  // Handle AggregateError with build/resolve messages
274
318
  if (error instanceof AggregateError && error.errors) {
275
- for (const err of error.errors) {
276
- const parts = [err.message || err.text || 'Unknown error'];
277
- if (err.position) {
278
- parts.push(` at ${err.position.file}:${err.position.line}:${err.position.column}`);
279
- }
280
- logger.error(parts.join('\n'));
281
- }
282
- } else {
283
- logger.error(` ${error instanceof Error ? error.message : String(error)}`);
319
+ const formattedErrors = error.errors
320
+ .map((err) => {
321
+ // Try to use formatBuildLog if it looks like a BuildMessage/ResolveMessage
322
+ if (err && typeof err === 'object' && 'name' in err) {
323
+ const formatted = formatBuildLog(err as BuildMessage | ResolveMessage);
324
+ if (formatted) return formatted;
325
+ }
326
+ // Fallback for other error types
327
+ const parts = [err.message || err.text || 'Unknown error'];
328
+ if (err.position) {
329
+ parts.push(
330
+ ` at ${err.position.file}:${err.position.line}:${err.position.column}`
331
+ );
332
+ }
333
+ return parts.join('\n');
334
+ })
335
+ .filter(Boolean)
336
+ .join('\n');
337
+
338
+ throw new Error(formattedErrors || 'Build failed');
284
339
  }
285
340
 
286
341
  throw error;
287
342
  }
288
343
 
289
- if (!result.success) {
290
- logger.error('Bun.build failed for server');
291
- logger.error(
292
- `Build result: success=${result.success}, outputs=${result.outputs.length}, logs=${result.logs.length}`
293
- );
344
+ // Restore NODE_ENV after successful build
345
+ if (originalNodeEnv !== undefined) {
346
+ process.env.NODE_ENV = originalNodeEnv;
347
+ }
294
348
 
349
+ if (!result.success) {
295
350
  const errorMessages = result.logs
296
- .map((log) => {
297
- const parts = [log.message];
298
- if (log.position) {
299
- parts.push(` at ${log.position.file}:${log.position.line}:${log.position.column}`);
300
- }
301
- return parts.join('\n');
302
- })
351
+ .map((log) => formatBuildLog(log))
352
+ .filter(Boolean)
303
353
  .join('\n');
304
354
 
305
355
  throw new Error(errorMessages || 'Build failed with no error messages');
@@ -69,6 +69,11 @@ export async function generateAssetServerConfig(
69
69
  dedupe: ['react', 'react-dom', 'react/jsx-runtime', 'react/jsx-dev-runtime'],
70
70
  },
71
71
 
72
+ // Pre-bundle @agentuity/workbench to avoid React preamble issues with pre-built JSX
73
+ optimizeDeps: {
74
+ include: ['@agentuity/workbench', '@agentuity/core', '@agentuity/react'],
75
+ },
76
+
72
77
  // Only allow frontend env vars (server uses process.env)
73
78
  envPrefix: ['VITE_', 'AGENTUITY_PUBLIC_', 'PUBLIC_'],
74
79
 
@@ -5,10 +5,43 @@
5
5
  */
6
6
 
7
7
  import { join } from 'node:path';
8
- import type { InlineConfig } from 'vite';
8
+ import { existsSync, renameSync, rmSync } from 'node:fs';
9
+ import type { InlineConfig, Plugin } from 'vite';
9
10
  import type { Logger } from '../../../types';
10
11
  import { browserEnvPlugin } from './browser-env-plugin';
11
12
 
13
+ /**
14
+ * Vite plugin to flatten the output structure for index.html
15
+ *
16
+ * When root is set to the project root (for TanStack Router compatibility),
17
+ * Vite outputs index.html to .agentuity/client/src/web/index.html instead of
18
+ * .agentuity/client/index.html. This plugin moves it to the expected location.
19
+ */
20
+ function flattenHtmlOutputPlugin(outDir: string): Plugin {
21
+ return {
22
+ name: 'agentuity:flatten-html-output',
23
+ apply: 'build',
24
+ closeBundle() {
25
+ const nestedHtmlPath = join(outDir, 'src', 'web', 'index.html');
26
+ const targetHtmlPath = join(outDir, 'index.html');
27
+
28
+ if (existsSync(nestedHtmlPath)) {
29
+ renameSync(nestedHtmlPath, targetHtmlPath);
30
+
31
+ // Clean up empty src/web directory structure
32
+ const srcWebDir = join(outDir, 'src', 'web');
33
+ const srcDir = join(outDir, 'src');
34
+ try {
35
+ rmSync(srcWebDir, { recursive: true, force: true });
36
+ rmSync(srcDir, { recursive: true, force: true });
37
+ } catch {
38
+ // Ignore cleanup errors
39
+ }
40
+ }
41
+ },
42
+ };
43
+ }
44
+
12
45
  export interface ViteBuildOptions {
13
46
  rootDir: string;
14
47
  mode: 'client' | 'server' | 'workbench';
@@ -25,7 +58,7 @@ export interface ViteBuildOptions {
25
58
 
26
59
  /**
27
60
  * Run a Vite build for the specified mode
28
- * Generates vite config in .agentuity/.vite/ and uses it
61
+ * Uses inline Vite config (customizable via agentuity.config.ts)
29
62
  */
30
63
  export async function runViteBuild(options: ViteBuildOptions): Promise<void> {
31
64
  const { rootDir, mode, dev = false, projectId = '', deploymentId = '', logger } = options;
@@ -34,28 +67,40 @@ export async function runViteBuild(options: ViteBuildOptions): Promise<void> {
34
67
 
35
68
  // For server mode, use Bun.build (preserves process.env at runtime)
36
69
  if (mode === 'server') {
37
- try {
38
- // First, generate the entry file
39
- const { generateEntryFile } = await import('../entry-generator');
40
- await generateEntryFile({
41
- rootDir,
42
- projectId,
43
- deploymentId: deploymentId || '',
44
- logger,
45
- mode: dev ? 'dev' : 'prod',
46
- });
47
-
48
- // Then, build with Bun.build
49
- const { installExternalsAndBuild } = await import('./server-bundler');
50
- await installExternalsAndBuild({
51
- rootDir,
52
- dev,
53
- logger,
54
- });
55
- } catch (error) {
56
- logger.error('server-bundler import or execution failed: %s', error);
57
- throw error;
70
+ const srcDir = join(rootDir, 'src');
71
+
72
+ // Generate documentation files (if they don't exist)
73
+ const { generateDocumentation } = await import('./docs-generator');
74
+ await generateDocumentation(srcDir, logger);
75
+
76
+ // Generate/update prompt files in dev mode only (non-blocking)
77
+ if (dev) {
78
+ import('./prompt-generator')
79
+ .then(({ generatePromptFiles }) => generatePromptFiles(srcDir, logger))
80
+ .catch((err) => logger.warn('Failed to generate prompt files: %s', err.message));
58
81
  }
82
+
83
+ // Generate lifecycle types (if setup() exists)
84
+ const { generateLifecycleTypes } = await import('./lifecycle-generator');
85
+ await generateLifecycleTypes(rootDir, srcDir, logger);
86
+
87
+ // Then, generate the entry file
88
+ const { generateEntryFile } = await import('../entry-generator');
89
+ await generateEntryFile({
90
+ rootDir,
91
+ projectId,
92
+ deploymentId: deploymentId || '',
93
+ logger,
94
+ mode: dev ? 'dev' : 'prod',
95
+ });
96
+
97
+ // Finally, build with Bun.build
98
+ const { installExternalsAndBuild } = await import('./server-bundler');
99
+ await installExternalsAndBuild({
100
+ rootDir,
101
+ dev,
102
+ logger,
103
+ });
59
104
  return;
60
105
  }
61
106
 
@@ -75,7 +120,8 @@ export async function runViteBuild(options: ViteBuildOptions): Promise<void> {
75
120
  const { workbenchEnabled = false, workbenchRoute = '/workbench' } = options;
76
121
 
77
122
  // Load custom user plugins from agentuity.config.ts if it exists
78
- const plugins = [react(), browserEnvPlugin()];
123
+ const clientOutDir = join(rootDir, '.agentuity/client');
124
+ const plugins = [react(), browserEnvPlugin(), flattenHtmlOutputPlugin(clientOutDir)];
79
125
  const { loadAgentuityConfig } = await import('./config-loader');
80
126
  const userConfig = await loadAgentuityConfig(rootDir, logger);
81
127
  const userPlugins = userConfig?.plugins || [];
@@ -94,14 +140,18 @@ export async function runViteBuild(options: ViteBuildOptions): Promise<void> {
94
140
  }
95
141
 
96
142
  // Determine CDN base URL for production builds
143
+ // Use CDN for all non-dev builds with a deploymentId (including local region)
97
144
  const isLocalRegion = options.region === 'local';
145
+ const cdnDomain = isLocalRegion
146
+ ? 'localstack-static-assets.t3.storage.dev'
147
+ : 'static.agentuity.com';
98
148
  const cdnBaseUrl =
99
- !dev && deploymentId && !isLocalRegion
100
- ? `https://static.agentuity.com/${deploymentId}/client/`
101
- : undefined;
149
+ !dev && deploymentId ? `https://${cdnDomain}/${deploymentId}/client/` : undefined;
102
150
 
103
151
  viteConfig = {
104
- root: join(rootDir, 'src', 'web'), // Set web dir as root
152
+ // Use project root as Vite root so plugins (e.g., TanStack Router) resolve paths
153
+ // from the repo root, matching where agentuity.config.ts is located
154
+ root: rootDir,
105
155
  plugins,
106
156
  envPrefix: ['VITE_', 'AGENTUITY_PUBLIC_', 'PUBLIC_'],
107
157
  publicDir: join(rootDir, 'src', 'web', 'public'),
@@ -116,7 +166,7 @@ export async function runViteBuild(options: ViteBuildOptions): Promise<void> {
116
166
  : 'undefined',
117
167
  },
118
168
  build: {
119
- outDir: join(rootDir, '.agentuity/client'),
169
+ outDir: clientOutDir,
120
170
  rollupOptions: {
121
171
  input: htmlPath,
122
172
  },
@@ -167,20 +217,15 @@ export async function runViteBuild(options: ViteBuildOptions): Promise<void> {
167
217
  }
168
218
 
169
219
  // Build with Vite
170
- try {
171
- // Force the build to use the correct mode
172
- const buildMode = dev ? 'development' : 'production';
220
+ // Force the build to use the correct mode
221
+ const buildMode = dev ? 'development' : 'production';
173
222
 
174
- await viteBuild({
175
- ...viteConfig,
176
- mode: buildMode,
177
- });
223
+ await viteBuild({
224
+ ...viteConfig,
225
+ mode: buildMode,
226
+ });
178
227
 
179
- logger.debug(`Vite build complete for mode: ${mode}`);
180
- } catch (error) {
181
- logger.error(`Vite build failed for mode ${mode}:`, error);
182
- throw error;
183
- }
228
+ logger.debug(`Vite build complete for mode: ${mode}`);
184
229
  }
185
230
 
186
231
  interface BuildResult {
@@ -213,64 +258,8 @@ export async function runAllBuilds(options: Omit<ViteBuildOptions, 'mode'>): Pro
213
258
  await generateWorkbenchFiles(rootDir, projectId, workbenchConfig, logger);
214
259
  }
215
260
 
216
- // Check if web frontend exists
217
- const hasWebFrontend = await Bun.file(join(rootDir, 'src', 'web', 'index.html')).exists();
218
-
219
- // 1. Build client (only if web frontend exists)
220
- if (hasWebFrontend) {
221
- logger.debug('Building client assets...');
222
- try {
223
- const started = Date.now();
224
- await runViteBuild({
225
- ...options,
226
- mode: 'client',
227
- workbenchEnabled: workbenchConfig.enabled,
228
- workbenchRoute: workbenchConfig.route,
229
- });
230
- result.client.included = true;
231
- result.client.duration = Date.now() - started;
232
- } catch (error) {
233
- logger.error('Client build failed:', error);
234
- throw error;
235
- }
236
- } else {
237
- logger.debug('Skipping client build - no src/web/index.html found');
238
- }
239
-
240
- // 2. Build workbench (if enabled in config)
241
- if (workbenchConfig.enabled) {
242
- logger.debug('Building workbench assets...');
243
- try {
244
- const started = Date.now();
245
- await runViteBuild({
246
- ...options,
247
- mode: 'workbench',
248
- workbenchRoute: workbenchConfig.route,
249
- workbenchEnabled: true,
250
- });
251
- result.workbench.included = true;
252
- result.workbench.duration = Date.now() - started;
253
- } catch (error) {
254
- logger.error('Workbench build failed:', error);
255
- throw error;
256
- }
257
- }
258
-
259
- // 3. Build server
260
- logger.debug('Building server...');
261
- try {
262
- const started = Date.now();
263
- await runViteBuild({ ...options, mode: 'server' });
264
- result.server.included = true;
265
- result.server.duration = Date.now() - started;
266
- } catch (error) {
267
- logger.error('Server build failed:', error);
268
- throw error;
269
- }
270
-
271
- // 4. Generate registry and metadata (after all builds complete)
272
- logger.debug('Generating agent registry and metadata...');
273
- const { generateMetadata, writeMetadataFile } = await import('./metadata-generator');
261
+ // 1. Discover agents and routes BEFORE builds
262
+ logger.debug('Discovering agents and routes...');
274
263
  const { generateAgentRegistry, generateRouteRegistry } = await import('./registry-generator');
275
264
  const { discoverAgents } = await import('./agent-discovery');
276
265
  const { discoverRoutes } = await import('./route-discovery');
@@ -289,11 +278,56 @@ export async function runAllBuilds(options: Omit<ViteBuildOptions, 'mode'>): Pro
289
278
  logger
290
279
  );
291
280
 
292
- // Generate agent and route registries for type augmentation
281
+ // Generate agent and route registries for type augmentation BEFORE builds
282
+ // (TypeScript needs these files to exist during type checking)
293
283
  generateAgentRegistry(srcDir, agentMetadata);
294
284
  generateRouteRegistry(srcDir, routeInfoList);
295
285
  logger.debug('Agent and route registries generated');
296
286
 
287
+ // Check if web frontend exists
288
+ const hasWebFrontend = await Bun.file(join(rootDir, 'src', 'web', 'index.html')).exists();
289
+
290
+ // 2. Build client (only if web frontend exists)
291
+ if (hasWebFrontend) {
292
+ logger.debug('Building client assets...');
293
+ const started = Date.now();
294
+ await runViteBuild({
295
+ ...options,
296
+ mode: 'client',
297
+ workbenchEnabled: workbenchConfig.enabled,
298
+ workbenchRoute: workbenchConfig.route,
299
+ });
300
+ result.client.included = true;
301
+ result.client.duration = Date.now() - started;
302
+ } else {
303
+ logger.debug('Skipping client build - no src/web/index.html found');
304
+ }
305
+
306
+ // 3. Build workbench (if enabled in config)
307
+ if (workbenchConfig.enabled) {
308
+ logger.debug('Building workbench assets...');
309
+ const started = Date.now();
310
+ await runViteBuild({
311
+ ...options,
312
+ mode: 'workbench',
313
+ workbenchRoute: workbenchConfig.route,
314
+ workbenchEnabled: true,
315
+ });
316
+ result.workbench.included = true;
317
+ result.workbench.duration = Date.now() - started;
318
+ }
319
+
320
+ // 4. Build server
321
+ logger.debug('Building server...');
322
+ const serverStarted = Date.now();
323
+ await runViteBuild({ ...options, mode: 'server' });
324
+ result.server.included = true;
325
+ result.server.duration = Date.now() - serverStarted;
326
+
327
+ // 5. Generate metadata (after all builds complete)
328
+ logger.debug('Generating metadata...');
329
+ const { generateMetadata, writeMetadataFile } = await import('./metadata-generator');
330
+
297
331
  // Generate metadata
298
332
  const metadata = await generateMetadata({
299
333
  rootDir,
@@ -75,8 +75,8 @@ export async function viteBundle(options: ViteBundleOptions): Promise<{ output:
75
75
  }
76
76
 
77
77
  try {
78
- // Run all Vite builds (client -> workbench -> server)
79
- logger.debug('Starting Vite builds...');
78
+ // Run all builds (client -> workbench -> server)
79
+ logger.debug('Starting builds...');
80
80
 
81
81
  const result = await runAllBuilds({
82
82
  rootDir,
@@ -90,16 +90,16 @@ export async function viteBundle(options: ViteBundleOptions): Promise<{ output:
90
90
  });
91
91
 
92
92
  if (result.client.included) {
93
- output.push(tui.muted(`✓ Client Built in ${result.client.duration}ms`));
93
+ output.push(tui.muted(`✓ Client built in ${result.client.duration}ms`));
94
94
  }
95
95
  if (result.workbench.included) {
96
- output.push(tui.muted(`✓ Workbench Built in ${result.workbench.duration}ms`));
96
+ output.push(tui.muted(`✓ Workbench built in ${result.workbench.duration}ms`));
97
97
  }
98
98
  if (result.server.included) {
99
- output.push(tui.muted(`✓ Server Built in ${result.server.duration}ms`));
99
+ output.push(tui.muted(`✓ Server built in ${result.server.duration}ms`));
100
100
  }
101
101
 
102
- logger.debug('Vite builds complete');
102
+ logger.debug('All builds complete');
103
103
 
104
104
  return { output };
105
105
  } catch (error) {