@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.
- package/AGENTS.md +19 -188
- package/bin/cli.ts +13 -6
- package/dist/api.d.ts +1 -0
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +1 -1
- package/dist/api.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +41 -12
- package/dist/cli.js.map +1 -1
- package/dist/cmd/ai/index.d.ts.map +1 -1
- package/dist/cmd/ai/index.js +6 -1
- package/dist/cmd/ai/index.js.map +1 -1
- package/dist/cmd/ai/prompt/agent.d.ts +7 -0
- package/dist/cmd/ai/prompt/agent.d.ts.map +1 -1
- package/dist/cmd/ai/prompt/agent.js +12 -323
- package/dist/cmd/ai/prompt/agent.js.map +1 -1
- package/dist/cmd/ai/prompt/api.d.ts +7 -0
- package/dist/cmd/ai/prompt/api.d.ts.map +1 -1
- package/dist/cmd/ai/prompt/api.js +12 -260
- package/dist/cmd/ai/prompt/api.js.map +1 -1
- package/dist/cmd/ai/prompt/version.d.ts +35 -0
- package/dist/cmd/ai/prompt/version.d.ts.map +1 -0
- package/dist/cmd/ai/prompt/version.js +55 -0
- package/dist/cmd/ai/prompt/version.js.map +1 -0
- package/dist/cmd/ai/prompt/web.d.ts +7 -0
- package/dist/cmd/ai/prompt/web.d.ts.map +1 -1
- package/dist/cmd/ai/prompt/web.js +12 -283
- package/dist/cmd/ai/prompt/web.js.map +1 -1
- package/dist/cmd/ai/skills/generate.d.ts +3 -0
- package/dist/cmd/ai/skills/generate.d.ts.map +1 -0
- package/dist/cmd/ai/skills/generate.js +65 -0
- package/dist/cmd/ai/skills/generate.js.map +1 -0
- package/dist/cmd/ai/skills/generator.d.ts +4 -0
- package/dist/cmd/ai/skills/generator.d.ts.map +1 -0
- package/dist/cmd/ai/skills/generator.js +402 -0
- package/dist/cmd/ai/skills/generator.js.map +1 -0
- package/dist/cmd/ai/skills/index.d.ts +4 -0
- package/dist/cmd/ai/skills/index.d.ts.map +1 -0
- package/dist/cmd/ai/skills/index.js +21 -0
- package/dist/cmd/ai/skills/index.js.map +1 -0
- package/dist/cmd/auth/signup.d.ts.map +1 -1
- package/dist/cmd/auth/signup.js +1 -0
- package/dist/cmd/auth/signup.js.map +1 -1
- package/dist/cmd/build/ast.d.ts +2 -1
- package/dist/cmd/build/ast.d.ts.map +1 -1
- package/dist/cmd/build/ast.js +135 -47
- package/dist/cmd/build/ast.js.map +1 -1
- package/dist/cmd/build/entry-generator.d.ts.map +1 -1
- package/dist/cmd/build/entry-generator.js +255 -188
- package/dist/cmd/build/entry-generator.js.map +1 -1
- package/dist/cmd/build/vite/agent-discovery.d.ts.map +1 -1
- package/dist/cmd/build/vite/agent-discovery.js +103 -45
- package/dist/cmd/build/vite/agent-discovery.js.map +1 -1
- package/dist/cmd/build/vite/bun-dev-server.d.ts +7 -1
- package/dist/cmd/build/vite/bun-dev-server.d.ts.map +1 -1
- package/dist/cmd/build/vite/bun-dev-server.js +52 -26
- package/dist/cmd/build/vite/bun-dev-server.js.map +1 -1
- package/dist/cmd/build/vite/docs-generator.d.ts +13 -0
- package/dist/cmd/build/vite/docs-generator.d.ts.map +1 -0
- package/dist/cmd/build/vite/docs-generator.js +81 -0
- package/dist/cmd/build/vite/docs-generator.js.map +1 -0
- package/dist/cmd/build/vite/index.d.ts +3 -3
- package/dist/cmd/build/vite/index.d.ts.map +1 -1
- package/dist/cmd/build/vite/index.js +9 -7
- package/dist/cmd/build/vite/index.js.map +1 -1
- package/dist/cmd/build/vite/lifecycle-generator.d.ts +1 -1
- package/dist/cmd/build/vite/lifecycle-generator.d.ts.map +1 -1
- package/dist/cmd/build/vite/lifecycle-generator.js +19 -5
- package/dist/cmd/build/vite/lifecycle-generator.js.map +1 -1
- package/dist/cmd/build/vite/metadata-generator.d.ts.map +1 -1
- package/dist/cmd/build/vite/metadata-generator.js +203 -7
- package/dist/cmd/build/vite/metadata-generator.js.map +1 -1
- package/dist/cmd/build/vite/prompt-generator.d.ts +23 -0
- package/dist/cmd/build/vite/prompt-generator.d.ts.map +1 -0
- package/dist/cmd/build/vite/prompt-generator.js +123 -0
- package/dist/cmd/build/vite/prompt-generator.js.map +1 -0
- package/dist/cmd/build/vite/registry-generator.d.ts +3 -3
- package/dist/cmd/build/vite/registry-generator.d.ts.map +1 -1
- package/dist/cmd/build/vite/registry-generator.js +644 -103
- package/dist/cmd/build/vite/registry-generator.js.map +1 -1
- package/dist/cmd/build/vite/route-discovery.d.ts +4 -0
- package/dist/cmd/build/vite/route-discovery.d.ts.map +1 -1
- package/dist/cmd/build/vite/route-discovery.js.map +1 -1
- package/dist/cmd/build/vite/server-bundler.d.ts +4 -0
- package/dist/cmd/build/vite/server-bundler.d.ts.map +1 -1
- package/dist/cmd/build/vite/server-bundler.js +63 -17
- package/dist/cmd/build/vite/server-bundler.js.map +1 -1
- package/dist/cmd/build/vite/vite-asset-server-config.d.ts.map +1 -1
- package/dist/cmd/build/vite/vite-asset-server-config.js +4 -0
- package/dist/cmd/build/vite/vite-asset-server-config.js.map +1 -1
- package/dist/cmd/build/vite/vite-builder.d.ts +1 -1
- package/dist/cmd/build/vite/vite-builder.d.ts.map +1 -1
- package/dist/cmd/build/vite/vite-builder.js +118 -96
- package/dist/cmd/build/vite/vite-builder.js.map +1 -1
- package/dist/cmd/build/vite-bundler.js +6 -6
- package/dist/cmd/build/vite-bundler.js.map +1 -1
- package/dist/cmd/cloud/deploy.d.ts.map +1 -1
- package/dist/cmd/cloud/deploy.js +89 -32
- package/dist/cmd/cloud/deploy.js.map +1 -1
- package/dist/cmd/cloud/keyvalue/create-namespace.d.ts.map +1 -1
- package/dist/cmd/cloud/keyvalue/create-namespace.js +3 -1
- package/dist/cmd/cloud/keyvalue/create-namespace.js.map +1 -1
- package/dist/cmd/cloud/keyvalue/delete-namespace.d.ts.map +1 -1
- package/dist/cmd/cloud/keyvalue/delete-namespace.js +3 -1
- package/dist/cmd/cloud/keyvalue/delete-namespace.js.map +1 -1
- package/dist/cmd/cloud/keyvalue/delete.d.ts.map +1 -1
- package/dist/cmd/cloud/keyvalue/delete.js +3 -1
- package/dist/cmd/cloud/keyvalue/delete.js.map +1 -1
- package/dist/cmd/cloud/keyvalue/set.d.ts.map +1 -1
- package/dist/cmd/cloud/keyvalue/set.js +4 -2
- package/dist/cmd/cloud/keyvalue/set.js.map +1 -1
- package/dist/cmd/cloud/stream/get.d.ts.map +1 -1
- package/dist/cmd/cloud/stream/get.js +2 -13
- package/dist/cmd/cloud/stream/get.js.map +1 -1
- package/dist/cmd/cloud/vector/delete-namespace.d.ts +3 -0
- package/dist/cmd/cloud/vector/delete-namespace.d.ts.map +1 -0
- package/dist/cmd/cloud/vector/delete-namespace.js +77 -0
- package/dist/cmd/cloud/vector/delete-namespace.js.map +1 -0
- package/dist/cmd/cloud/vector/index.d.ts.map +1 -1
- package/dist/cmd/cloud/vector/index.js +21 -4
- package/dist/cmd/cloud/vector/index.js.map +1 -1
- package/dist/cmd/cloud/vector/list-namespaces.d.ts +3 -0
- package/dist/cmd/cloud/vector/list-namespaces.d.ts.map +1 -0
- package/dist/cmd/cloud/vector/list-namespaces.js +42 -0
- package/dist/cmd/cloud/vector/list-namespaces.js.map +1 -0
- package/dist/cmd/cloud/vector/stats.d.ts +3 -0
- package/dist/cmd/cloud/vector/stats.d.ts.map +1 -0
- package/dist/cmd/cloud/vector/stats.js +142 -0
- package/dist/cmd/cloud/vector/stats.js.map +1 -0
- package/dist/cmd/cloud/vector/upsert.d.ts +3 -0
- package/dist/cmd/cloud/vector/upsert.d.ts.map +1 -0
- package/dist/cmd/cloud/vector/upsert.js +192 -0
- package/dist/cmd/cloud/vector/upsert.js.map +1 -0
- package/dist/cmd/dev/file-watcher.d.ts.map +1 -1
- package/dist/cmd/dev/file-watcher.js +94 -33
- package/dist/cmd/dev/file-watcher.js.map +1 -1
- package/dist/cmd/dev/index.d.ts.map +1 -1
- package/dist/cmd/dev/index.js +298 -61
- package/dist/cmd/dev/index.js.map +1 -1
- package/dist/cmd/dev/skills.d.ts +10 -0
- package/dist/cmd/dev/skills.d.ts.map +1 -0
- package/dist/cmd/dev/skills.js +57 -0
- package/dist/cmd/dev/skills.js.map +1 -0
- package/dist/cmd/dev/sync.d.ts.map +1 -1
- package/dist/cmd/dev/sync.js +19 -3
- package/dist/cmd/dev/sync.js.map +1 -1
- package/dist/cmd/index.d.ts.map +1 -1
- package/dist/cmd/index.js +1 -0
- package/dist/cmd/index.js.map +1 -1
- package/dist/cmd/project/create.d.ts.map +1 -1
- package/dist/cmd/project/create.js +3 -0
- package/dist/cmd/project/create.js.map +1 -1
- package/dist/cmd/project/template-flow.d.ts +1 -0
- package/dist/cmd/project/template-flow.d.ts.map +1 -1
- package/dist/cmd/project/template-flow.js +30 -5
- package/dist/cmd/project/template-flow.js.map +1 -1
- package/dist/cmd/setup/index.d.ts.map +1 -1
- package/dist/cmd/setup/index.js +1 -0
- package/dist/cmd/setup/index.js.map +1 -1
- package/dist/cmd/upgrade/index.d.ts +15 -0
- package/dist/cmd/upgrade/index.d.ts.map +1 -1
- package/dist/cmd/upgrade/index.js +59 -4
- package/dist/cmd/upgrade/index.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +8 -0
- package/dist/config.js.map +1 -1
- package/dist/domain.d.ts +45 -0
- package/dist/domain.d.ts.map +1 -0
- package/dist/domain.js +200 -0
- package/dist/domain.js.map +1 -0
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/schema-generator.d.ts +2 -0
- package/dist/schema-generator.d.ts.map +1 -1
- package/dist/schema-generator.js +18 -0
- package/dist/schema-generator.js.map +1 -1
- package/dist/steps.d.ts +1 -1
- package/dist/steps.d.ts.map +1 -1
- package/dist/steps.js +16 -5
- package/dist/steps.js.map +1 -1
- package/dist/tui/prompt.d.ts +1 -2
- package/dist/tui/prompt.d.ts.map +1 -1
- package/dist/tui/prompt.js +8 -4
- package/dist/tui/prompt.js.map +1 -1
- package/dist/tui.d.ts +16 -0
- package/dist/tui.d.ts.map +1 -1
- package/dist/tui.js +23 -2
- package/dist/tui.js.map +1 -1
- package/dist/types.d.ts +9 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +3 -3
- package/dist/types.js.map +1 -1
- package/package.json +5 -8
- package/src/api.ts +1 -1
- package/src/cli.ts +47 -12
- package/src/cmd/ai/index.ts +6 -1
- package/src/cmd/ai/prompt/agent.md +306 -0
- package/src/cmd/ai/prompt/agent.ts +12 -322
- package/src/cmd/ai/prompt/api.md +360 -0
- package/src/cmd/ai/prompt/api.ts +13 -260
- package/src/cmd/ai/prompt/version.ts +61 -0
- package/src/cmd/ai/prompt/web.md +509 -0
- package/src/cmd/ai/prompt/web.ts +12 -282
- package/src/cmd/ai/skills/generate.ts +75 -0
- package/src/cmd/ai/skills/generator.ts +519 -0
- package/src/cmd/ai/skills/index.ts +23 -0
- package/src/cmd/auth/signup.ts +1 -0
- package/src/cmd/build/ast.ts +161 -48
- package/src/cmd/build/entry-generator.ts +258 -187
- package/src/cmd/build/vite/agent-discovery.ts +151 -58
- package/src/cmd/build/vite/bun-dev-server.ts +57 -27
- package/src/cmd/build/vite/docs-generator.ts +87 -0
- package/src/cmd/build/vite/index.ts +9 -7
- package/src/cmd/build/vite/lifecycle-generator.ts +19 -5
- package/src/cmd/build/vite/metadata-generator.ts +251 -7
- package/src/cmd/build/vite/prompt-generator.ts +169 -0
- package/src/cmd/build/vite/registry-generator.ts +750 -108
- package/src/cmd/build/vite/route-discovery.ts +4 -0
- package/src/cmd/build/vite/server-bundler.ts +73 -23
- package/src/cmd/build/vite/vite-asset-server-config.ts +5 -0
- package/src/cmd/build/vite/vite-builder.ts +134 -100
- package/src/cmd/build/vite-bundler.ts +6 -6
- package/src/cmd/cloud/deploy.ts +114 -36
- package/src/cmd/cloud/keyvalue/create-namespace.ts +3 -1
- package/src/cmd/cloud/keyvalue/delete-namespace.ts +3 -1
- package/src/cmd/cloud/keyvalue/delete.ts +3 -1
- package/src/cmd/cloud/keyvalue/set.ts +4 -2
- package/src/cmd/cloud/stream/get.ts +2 -9
- package/src/cmd/cloud/vector/delete-namespace.ts +89 -0
- package/src/cmd/cloud/vector/index.ts +21 -4
- package/src/cmd/cloud/vector/list-namespaces.ts +46 -0
- package/src/cmd/cloud/vector/stats.ts +160 -0
- package/src/cmd/cloud/vector/upsert.ts +216 -0
- package/src/cmd/dev/file-watcher.ts +109 -34
- package/src/cmd/dev/index.ts +364 -60
- package/src/cmd/dev/skills.ts +82 -0
- package/src/cmd/dev/sync.ts +41 -6
- package/src/cmd/index.ts +1 -0
- package/src/cmd/project/create.ts +3 -0
- package/src/cmd/project/template-flow.ts +37 -5
- package/src/cmd/setup/index.ts +1 -0
- package/src/cmd/upgrade/index.ts +68 -4
- package/src/config.ts +9 -0
- package/src/domain.ts +273 -0
- package/src/index.ts +0 -5
- package/src/runtime-bootstrap.md +1 -1
- package/src/schema-generator.ts +23 -0
- package/src/steps.ts +16 -5
- package/src/tui/prompt.ts +11 -5
- package/src/tui.ts +21 -2
- package/src/types/md.d.ts +8 -0
- package/src/types.ts +12 -3
- package/dist/cmd/cloud/domain.d.ts +0 -17
- package/dist/cmd/cloud/domain.d.ts.map +0 -1
- package/dist/cmd/cloud/domain.js +0 -79
- package/dist/cmd/cloud/domain.js.map +0 -1
- package/dist/runtime-bootstrap.d.ts +0 -56
- package/dist/runtime-bootstrap.d.ts.map +0 -1
- package/dist/runtime-bootstrap.js +0 -95
- package/dist/runtime-bootstrap.js.map +0 -1
- package/src/cmd/cloud/domain.ts +0 -100
- package/src/runtime-bootstrap.ts +0 -131
|
@@ -306,7 +306,8 @@ function extractAgentMetadata(
|
|
|
306
306
|
}
|
|
307
307
|
|
|
308
308
|
/**
|
|
309
|
-
* Extract evals from
|
|
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
|
|
327
|
-
const version = hash(
|
|
359
|
+
const contents = transpiler.transformSync(source);
|
|
360
|
+
const version = hash(contents);
|
|
328
361
|
|
|
329
|
-
const ast = acornLoose.parse(
|
|
362
|
+
const ast = acornLoose.parse(contents, { ecmaVersion: 'latest', sourceType: 'module' });
|
|
330
363
|
const evals: EvalMetadata[] = [];
|
|
331
364
|
|
|
332
|
-
//
|
|
333
|
-
|
|
334
|
-
if (node
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
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
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
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 ${
|
|
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
|
-
//
|
|
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
|
|
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 (
|
|
454
|
-
agentMetadata.evals =
|
|
455
|
-
logger.trace('
|
|
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
|
-
*
|
|
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,
|
|
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
|
-
//
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
-
//
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
-
|
|
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 (
|
|
32
|
-
* - Lifecycle types generation (
|
|
33
|
-
* - Entry file generation (
|
|
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
|
-
|
|
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 '
|
|
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 '
|
|
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
|
|
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
|
-
|
|
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.
|
|
40
|
+
logger.debug('[lifecycle] No app.ts found for lifecycle types generation');
|
|
34
41
|
return false;
|
|
35
42
|
}
|
|
36
43
|
|
|
37
44
|
try {
|
|
38
|
-
|
|
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
|
}
|