@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
@@ -306,7 +306,8 @@ function extractAgentMetadata(
306
306
  }
307
307
 
308
308
  /**
309
- * Extract evals from eval.ts file (READ-ONLY)
309
+ * Extract evals from a file (READ-ONLY)
310
+ * Finds createEval calls regardless of whether they're exported or not
310
311
  */
311
312
  async function extractEvalMetadata(
312
313
  evalsPath: string,
@@ -322,72 +323,135 @@ async function extractEvalMetadata(
322
323
 
323
324
  try {
324
325
  const evalsSource = await evalsFile.text();
326
+ return extractEvalsFromSource(
327
+ evalsSource,
328
+ evalsPath,
329
+ agentId,
330
+ projectId,
331
+ deploymentId,
332
+ logger
333
+ );
334
+ } catch (error) {
335
+ logger.warn(`Failed to parse evals from ${evalsPath}: ${error}`);
336
+ return [];
337
+ }
338
+ }
339
+
340
+ /**
341
+ * Extract evals from source code (READ-ONLY)
342
+ * Finds all createEval calls in the source, exported or not
343
+ */
344
+ function extractEvalsFromSource(
345
+ source: string,
346
+ filename: string,
347
+ agentId: string,
348
+ projectId: string,
349
+ deploymentId: string,
350
+ logger: Logger
351
+ ): EvalMetadata[] {
352
+ // Quick check - skip if no createEval in source
353
+ if (!source.includes('createEval')) {
354
+ return [];
355
+ }
356
+
357
+ try {
325
358
  const transpiler = new Bun.Transpiler({ loader: 'ts', target: 'bun' });
326
- const evalsContents = transpiler.transformSync(evalsSource);
327
- const version = hash(evalsContents);
359
+ const contents = transpiler.transformSync(source);
360
+ const version = hash(contents);
328
361
 
329
- const ast = acornLoose.parse(evalsContents, { ecmaVersion: 'latest', sourceType: 'module' });
362
+ const ast = acornLoose.parse(contents, { ecmaVersion: 'latest', sourceType: 'module' });
330
363
  const evals: EvalMetadata[] = [];
331
364
 
332
- // Find createEval calls
333
- for (const node of (ast as { body: ASTNode[] }).body) {
334
- if (node.type === 'ExportNamedDeclaration') {
335
- const declaration = (
336
- node as unknown as { declaration: { declarations?: ASTVariableDeclarator[] } }
337
- ).declaration;
338
-
339
- if (declaration?.declarations) {
340
- for (const decl of declaration.declarations) {
341
- if (decl.init && decl.init.type === 'CallExpression') {
342
- const callExpr = decl.init as ASTCallExpression;
343
-
344
- if (
345
- callExpr.callee.type === 'Identifier' &&
346
- (callExpr.callee as ASTNodeIdentifier).name === 'createEval' &&
347
- callExpr.arguments.length >= 2
348
- ) {
349
- const nameArg = callExpr.arguments[0] as ASTLiteral;
350
- const evalName = String(nameArg.value);
351
-
352
- const callargexp = callExpr.arguments[1] as ASTObjectExpression;
353
- let description: string | undefined;
354
-
355
- for (const prop of callargexp.properties) {
356
- if (
357
- prop.key.name === 'metadata' &&
358
- prop.value.type === 'ObjectExpression'
359
- ) {
360
- const metadataMap = parseObjectExpressionToMap(
361
- prop.value as ASTObjectExpression
362
- );
363
- description = metadataMap.get('description');
364
- break;
365
- }
366
- }
365
+ // Recursively find all createEval calls in the AST
366
+ function findCreateEvalCalls(node: unknown): void {
367
+ if (!node || typeof node !== 'object') return;
368
+
369
+ const n = node as Record<string, unknown>;
370
+
371
+ // Check if this is a createEval call (either direct or method call)
372
+ // Direct: createEval('name', {...})
373
+ // Method: agent.createEval('name', {...})
374
+ let isCreateEvalCall = false;
375
+
376
+ if (n.type === 'CallExpression' && n.callee && typeof n.callee === 'object') {
377
+ const callee = n.callee as ASTNode & { property?: ASTNodeIdentifier };
378
+
379
+ // Direct function call: createEval(...)
380
+ if (
381
+ callee.type === 'Identifier' &&
382
+ (callee as ASTNodeIdentifier).name === 'createEval'
383
+ ) {
384
+ isCreateEvalCall = true;
385
+ }
386
+
387
+ // Method call: someAgent.createEval(...)
388
+ if (
389
+ callee.type === 'MemberExpression' &&
390
+ callee.property &&
391
+ callee.property.type === 'Identifier' &&
392
+ callee.property.name === 'createEval'
393
+ ) {
394
+ isCreateEvalCall = true;
395
+ }
396
+ }
397
+
398
+ if (isCreateEvalCall) {
399
+ const callExpr = n as unknown as ASTCallExpression;
400
+ if (callExpr.arguments.length >= 2) {
401
+ const nameArg = callExpr.arguments[0] as ASTLiteral;
402
+ const evalName = String(nameArg.value);
367
403
 
368
- const id = getEvalId(projectId, deploymentId, evalsPath, evalName, version);
369
- const evalId = generateStableEvalId(projectId, agentId, evalName);
370
-
371
- evals.push({
372
- id,
373
- evalId,
374
- name: evalName,
375
- filename: evalsPath,
376
- version,
377
- description,
378
- agentIdentifier: agentId,
379
- projectId,
380
- });
404
+ const callargexp = callExpr.arguments[1] as ASTObjectExpression;
405
+ let description: string | undefined;
406
+
407
+ if (callargexp.properties) {
408
+ for (const prop of callargexp.properties) {
409
+ if (prop.key.name === 'metadata' && prop.value.type === 'ObjectExpression') {
410
+ const metadataMap = parseObjectExpressionToMap(
411
+ prop.value as ASTObjectExpression
412
+ );
413
+ description = metadataMap.get('description');
414
+ break;
381
415
  }
382
416
  }
383
417
  }
418
+
419
+ const id = getEvalId(projectId, deploymentId, filename, evalName, version);
420
+ const evalId = generateStableEvalId(projectId, agentId, evalName);
421
+
422
+ logger.trace(`Found eval '${evalName}' in ${filename} (evalId: ${evalId})`);
423
+
424
+ evals.push({
425
+ id,
426
+ evalId,
427
+ name: evalName,
428
+ filename,
429
+ version,
430
+ description,
431
+ agentIdentifier: agentId,
432
+ projectId,
433
+ });
434
+ }
435
+ }
436
+
437
+ // Recursively search child nodes
438
+ for (const key of Object.keys(n)) {
439
+ const value = n[key];
440
+ if (Array.isArray(value)) {
441
+ for (const item of value) {
442
+ findCreateEvalCalls(item);
443
+ }
444
+ } else if (value && typeof value === 'object') {
445
+ findCreateEvalCalls(value);
384
446
  }
385
447
  }
386
448
  }
387
449
 
450
+ findCreateEvalCalls(ast);
451
+
388
452
  return evals;
389
453
  } catch (error) {
390
- logger.warn(`Failed to parse evals from ${evalsPath}: ${error}`);
454
+ logger.warn(`Failed to parse evals from ${filename}: ${error}`);
391
455
  return [];
392
456
  }
393
457
  }
@@ -439,20 +503,49 @@ export async function discoverAgents(
439
503
  if (agentMetadata) {
440
504
  logger.trace('Discovered agent: %s at %s', agentMetadata.name, relativeFilename);
441
505
 
442
- // Check for evals in same directory
506
+ // Collect evals from multiple sources
507
+ const allEvals: EvalMetadata[] = [];
508
+
509
+ // 1. Extract evals from the agent file itself (agent.createEval() pattern)
510
+ const evalsInAgentFile = extractEvalsFromSource(
511
+ source,
512
+ relativeFilename,
513
+ agentMetadata.agentId,
514
+ projectId,
515
+ deploymentId,
516
+ logger
517
+ );
518
+ if (evalsInAgentFile.length > 0) {
519
+ logger.trace(
520
+ 'Found %d eval(s) in agent file for %s',
521
+ evalsInAgentFile.length,
522
+ agentMetadata.name
523
+ );
524
+ allEvals.push(...evalsInAgentFile);
525
+ }
526
+
527
+ // 2. Check for evals in separate eval.ts file in same directory
443
528
  const agentDir = dirname(filePath);
444
529
  const evalsPath = join(agentDir, 'eval.ts');
445
- const evals = await extractEvalMetadata(
530
+ const evalsInSeparateFile = await extractEvalMetadata(
446
531
  evalsPath,
447
532
  agentMetadata.agentId,
448
533
  projectId,
449
534
  deploymentId,
450
535
  logger
451
536
  );
537
+ if (evalsInSeparateFile.length > 0) {
538
+ logger.trace(
539
+ 'Found %d eval(s) in eval.ts for agent %s',
540
+ evalsInSeparateFile.length,
541
+ agentMetadata.name
542
+ );
543
+ allEvals.push(...evalsInSeparateFile);
544
+ }
452
545
 
453
- if (evals.length > 0) {
454
- agentMetadata.evals = evals;
455
- logger.trace('Found %d eval(s) for agent %s', evals.length, agentMetadata.name);
546
+ if (allEvals.length > 0) {
547
+ agentMetadata.evals = allEvals;
548
+ logger.trace('Total %d eval(s) for agent %s', allEvals.length, agentMetadata.name);
456
549
  }
457
550
 
458
551
  agents.push(agentMetadata);
@@ -23,45 +23,75 @@ export interface BunDevServerResult {
23
23
 
24
24
  /**
25
25
  * Start Bun dev server (Vite asset server must already be running)
26
- * Generates entry file with proxy routes pointing to Vite
26
+ *
27
+ * IMPORTANT: This function assumes that the dev bundle has already been built:
28
+ * - Entry file generated at src/generated/app.ts (with workbench config if enabled)
29
+ * - Bundled to .agentuity/app.js with LLM patches applied
30
+ *
31
+ * The bundle is loaded here to ensure AI Gateway routing patches are active.
32
+ * Vite port is read from process.env.VITE_PORT at runtime.
27
33
  */
28
34
  export async function startBunDevServer(options: BunDevServerOptions): Promise<BunDevServerResult> {
29
- const { rootDir, port = 3500, projectId = '', deploymentId = '', logger, vitePort } = options;
35
+ const { rootDir, port = 3500, logger, vitePort } = options;
30
36
 
31
37
  logger.debug('Starting Bun dev server (Vite already running on port %d)...', vitePort);
32
38
 
33
- // Generate workbench source files if enabled (dev mode)
34
- const { loadAgentuityConfig, getWorkbenchConfig } = await import('./config-loader');
35
- const config = await loadAgentuityConfig(rootDir, logger);
36
- const workbenchConfig = getWorkbenchConfig(config, true); // dev mode
39
+ // Load the bundled app - this will start Bun.serve() internally
40
+ // IMPORTANT: We must import the bundled .agentuity/app.js (NOT src/generated/app.ts)
41
+ // because the bundled version has LLM provider patches applied that enable AI Gateway routing.
42
+ // Importing the source file directly would bypass these patches.
43
+ logger.debug('📦 Loading bundled app (Bun server will start)...');
44
+ const appPath = `${rootDir}/.agentuity/app.js`;
37
45
 
38
- if (workbenchConfig.enabled) {
39
- logger.debug('Workbench enabled (dev mode), generating source files...');
40
- const { generateWorkbenchFiles } = await import('./workbench-generator');
41
- await generateWorkbenchFiles(rootDir, projectId, workbenchConfig, logger);
46
+ // Verify bundle exists before attempting to load
47
+ const appFile = Bun.file(appPath);
48
+ if (!(await appFile.exists())) {
49
+ throw new Error(
50
+ `Dev bundle not found at ${appPath}. The bundle must be generated before starting the dev server.`
51
+ );
42
52
  }
43
53
 
44
- // Step 2: Generate entry file with Vite port for asset proxying
45
- logger.debug('📝 Generating entry file with asset proxy configuration...');
46
- const { generateEntryFile } = await import('../entry-generator');
47
- await generateEntryFile({
48
- rootDir,
49
- projectId: projectId || '',
50
- deploymentId: deploymentId || '',
51
- logger,
52
- mode: 'dev',
53
- workbench: workbenchConfig.enabled ? workbenchConfig : undefined,
54
- vitePort, // Pass Vite port for proxy routes
55
- });
56
-
57
- // Step 3: Load the generated app - this will start Bun.serve() internally
58
- logger.debug('📦 Loading generated app (Bun server will start)...');
59
- const appPath = `${rootDir}/.agentuity/app.generated.ts`;
54
+ // Clear Bun's module cache for the bundled app to ensure fresh code is loaded.
55
+ // This is essential for hot reload to work - otherwise Bun returns the cached module
56
+ // and the server continues serving stale code.
57
+ try {
58
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
59
+ const bunAny = Bun as any;
60
+ // Try multiple possible locations for the loader registry
61
+ const loader = bunAny.loader ?? bunAny.Loader ?? bunAny.Main;
62
+ const registry = loader?.registry ?? loader?.Registry;
63
+ if (registry?.delete) {
64
+ logger.debug('Clearing Bun module cache for: %s', appPath);
65
+ registry.delete(appPath);
66
+ } else if (typeof loader?.clearModuleCache === 'function') {
67
+ // Alternative API that may exist in some Bun versions
68
+ logger.debug('Clearing Bun module cache via clearModuleCache: %s', appPath);
69
+ loader.clearModuleCache(appPath);
70
+ } else {
71
+ logger.debug(
72
+ 'Bun module cache API not available - module may be cached. Available loader keys: %s',
73
+ loader ? Object.keys(loader).join(', ') : 'none'
74
+ );
75
+ }
76
+ } catch (err) {
77
+ logger.warn(
78
+ 'Failed to clear Bun module cache for %s: %s. Server restart may serve stale code.',
79
+ appPath,
80
+ err instanceof Error ? err.message : String(err)
81
+ );
82
+ }
60
83
 
61
84
  // Set PORT env var so the generated app uses the correct port
62
85
  process.env.PORT = String(port);
63
86
 
64
- await import(appPath);
87
+ // Import the generated app using the canonical file path
88
+ try {
89
+ await import(appPath);
90
+ } catch (err) {
91
+ const errorMessage = err instanceof Error ? err.message : String(err);
92
+ logger.error('Failed to import generated app from %s: %s', appPath, errorMessage);
93
+ throw new Error(`Failed to load generated app: ${errorMessage}`);
94
+ }
65
95
 
66
96
  // Wait for server to actually start listening
67
97
  // The generated app sets (globalThis as any).__AGENTUITY_SERVER__ when server starts
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Documentation Generator
3
+ *
4
+ * Generates README.md and AGENTS.md in src/generated/ directory
5
+ * Only writes files if they don't already exist (preserves user modifications)
6
+ */
7
+
8
+ import { join } from 'node:path';
9
+ import { mkdir } from 'node:fs/promises';
10
+ import type { Logger } from '../../../types';
11
+
12
+ const README_CONTENT = `# Generated Files - DO NOT EDIT
13
+
14
+ This directory contains auto-generated TypeScript files created by the Agentuity build system.
15
+
16
+ **These files are regenerated on every build.** Any manual changes will be overwritten.
17
+
18
+ ## Generated Files
19
+
20
+ - \`registry.ts\` - Agent registry from \`src/agent/**\`
21
+ - \`routes.ts\` - Route registry from \`src/api/**\`
22
+ - \`app.ts\` - Application entry point
23
+ - \`state.ts\` - App state types (when setup() exists)
24
+ - \`router.ts\` - Runtime wrapper (when setup() exists)
25
+
26
+ ## For Developers
27
+
28
+ Do not modify these files. Instead:
29
+ - Add/modify agents in \`src/agent/\`
30
+ - Add/modify routes in \`src/api/\`
31
+ - Configure app in \`app.ts\`
32
+
33
+ These files ARE version controlled to enable better tooling and type checking.
34
+ `;
35
+
36
+ const AGENTS_MD_CONTENT = `# AI Agent Instructions
37
+
38
+ **CRITICAL:** Files in this directory are AUTO-GENERATED by the Agentuity build system.
39
+
40
+ ## Rules for AI Agents
41
+
42
+ 1. ❌ NEVER edit files in \`src/generated/\`
43
+ 2. ❌ NEVER include \`src/generated/\` files in context when analyzing code
44
+ 3. ❌ NEVER suggest changes to generated files
45
+ 4. ✅ Ignore this directory when searching for user code
46
+ 5. ✅ Direct users to modify source files in \`src/agent/\`, \`src/api/\`, or \`app.ts\`
47
+
48
+ ## What Gets Generated
49
+
50
+ - \`registry.ts\` - Built from agent discovery in \`src/agent/\`
51
+ - \`routes.ts\` - Built from route discovery in \`src/api/\`
52
+ - \`app.ts\` - Entry point assembled from project configuration
53
+ - \`state.ts\` - App state type from \`setup()\` return value
54
+ - \`router.ts\` - Runtime wrapper with type augmentation
55
+
56
+ These files are regenerated on every \`bun run build\` or \`bun run dev\`.
57
+ `;
58
+
59
+ /**
60
+ * Generate documentation files in src/generated/ directory
61
+ * Only creates files if they don't already exist
62
+ */
63
+ export async function generateDocumentation(srcDir: string, logger: Logger): Promise<void> {
64
+ const generatedDir = join(srcDir, 'generated');
65
+
66
+ // Ensure directory exists
67
+ await mkdir(generatedDir, { recursive: true });
68
+
69
+ const readmePath = join(generatedDir, 'README.md');
70
+ const agentsMdPath = join(generatedDir, 'AGENTS.md');
71
+
72
+ // Generate README.md if it doesn't exist
73
+ if (!(await Bun.file(readmePath).exists())) {
74
+ await Bun.write(readmePath, README_CONTENT);
75
+ logger.debug('Generated src/generated/README.md');
76
+ } else {
77
+ logger.trace('Skipping README.md - file already exists');
78
+ }
79
+
80
+ // Generate AGENTS.md if it doesn't exist
81
+ if (!(await Bun.file(agentsMdPath).exists())) {
82
+ await Bun.write(agentsMdPath, AGENTS_MD_CONTENT);
83
+ logger.debug('Generated src/generated/AGENTS.md');
84
+ } else {
85
+ logger.trace('Skipping AGENTS.md - file already exists');
86
+ }
87
+ }
@@ -28,9 +28,9 @@ export interface AgentuityPluginOptions {
28
28
  * Responsibilities:
29
29
  * - Agent discovery via READ-ONLY AST analysis
30
30
  * - Route discovery via READ-ONLY AST analysis
31
- * - Registry generation (.agentuity/registry.generated.ts)
32
- * - Lifecycle types generation (.agentuity/lifecycle.generated.d.ts)
33
- * - Entry file generation (.agentuity/agentuity_app.generated.ts)
31
+ * - Registry generation (src/generated/registry.ts)
32
+ * - Lifecycle types generation (src/generated/lifecycle.d.ts)
33
+ * - Entry file generation (src/generated/app.ts)
34
34
  * - Virtual modules (virtual:agentuity/agents, virtual:agentuity/routes)
35
35
  * - Metadata generation (agentuity.metadata.json)
36
36
  */
@@ -85,12 +85,14 @@ export function agentuityPlugin(options: AgentuityPluginOptions): Plugin {
85
85
  }
86
86
 
87
87
  if (routeInfoList.length > 0) {
88
- generateRouteRegistry(srcDir, routeInfoList);
88
+ generateRouteRegistry(srcDir, routeInfoList, agents);
89
89
  logger.trace('Generated route registry with %d route(s)', routeInfoList.length);
90
90
  }
91
91
 
92
92
  // Generate lifecycle types
93
- await generateLifecycleTypes(rootDir, srcDir, logger);
93
+ logger.debug('[vite-plugin] About to call generateLifecycleTypes');
94
+ const lifecycleResult = await generateLifecycleTypes(rootDir, srcDir, logger);
95
+ logger.debug(`[vite-plugin] generateLifecycleTypes returned: ${lifecycleResult}`);
94
96
 
95
97
  // Generate entry file (pass workbench config for route mounting)
96
98
  await generateEntryFile({
@@ -126,11 +128,11 @@ export function agentuityPlugin(options: AgentuityPluginOptions): Plugin {
126
128
  load(id) {
127
129
  if (id === '\0virtual:agentuity/agents') {
128
130
  // Re-export from generated registry
129
- return `export { agentRegistry } from '../.agentuity/registry.generated.js';`;
131
+ return `export { agentRegistry } from '../src/generated/registry.js';`;
130
132
  }
131
133
  if (id === '\0virtual:agentuity/routes') {
132
134
  // Re-export from generated route registry
133
- return `export { routeRegistry } from '../.agentuity/routes.generated.js';`;
135
+ return `export { routeRegistry } from '../src/generated/routes.js';`;
134
136
  }
135
137
  return null;
136
138
  },
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Lifecycle Types Generator
3
3
  *
4
- * Generates .agentuity/lifecycle.generated.d.ts by analyzing app.ts for setup() function
4
+ * Generates src/generated/lifecycle.d.ts by analyzing app.ts for setup() function
5
5
  */
6
6
 
7
7
  import { join } from 'node:path';
@@ -16,7 +16,12 @@ export async function generateLifecycleTypes(
16
16
  srcDir: string,
17
17
  logger: Logger
18
18
  ): Promise<boolean> {
19
- const outDir = join(rootDir, '.agentuity');
19
+ logger.debug('[lifecycle] Starting lifecycle type generation...');
20
+ logger.debug(`[lifecycle] rootDir: ${rootDir}`);
21
+ logger.debug(`[lifecycle] srcDir: ${srcDir}`);
22
+
23
+ const outDir = join(srcDir, 'generated');
24
+ logger.debug(`[lifecycle] outDir: ${outDir}`);
20
25
 
21
26
  // Look for app.ts in both root and src directories
22
27
  const rootAppFile = join(rootDir, 'app.ts');
@@ -25,19 +30,28 @@ export async function generateLifecycleTypes(
25
30
  let appFile = '';
26
31
  if (await Bun.file(rootAppFile).exists()) {
27
32
  appFile = rootAppFile;
33
+ logger.debug(`[lifecycle] Found app.ts at root: ${rootAppFile}`);
28
34
  } else if (await Bun.file(srcAppFile).exists()) {
29
35
  appFile = srcAppFile;
36
+ logger.debug(`[lifecycle] Found app.ts in src: ${srcAppFile}`);
30
37
  }
31
38
 
32
39
  if (!appFile || !(await Bun.file(appFile).exists())) {
33
- logger.trace('No app.ts found for lifecycle types generation');
40
+ logger.debug('[lifecycle] No app.ts found for lifecycle types generation');
34
41
  return false;
35
42
  }
36
43
 
37
44
  try {
38
- return await generateLifecycleTypesFromAST(rootDir, outDir, appFile);
45
+ logger.debug(`[lifecycle] Calling generateLifecycleTypesFromAST...`);
46
+ const result = await generateLifecycleTypesFromAST(rootDir, outDir, appFile);
47
+ if (result) {
48
+ logger.debug(`[lifecycle] Lifecycle types generated successfully in ${outDir}`);
49
+ } else {
50
+ logger.debug('[lifecycle] generateLifecycleTypesFromAST returned false (no setup found)');
51
+ }
52
+ return result;
39
53
  } catch (error) {
40
- logger.error('Failed to generate lifecycle types:', error);
54
+ logger.error('[lifecycle] Failed to generate lifecycle types:', error);
41
55
  return false;
42
56
  }
43
57
  }