@agentuity/cli 0.0.51 → 0.0.52
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/dist/api.js +68 -0
- package/dist/api.js.map +1 -0
- package/dist/auth.js +225 -0
- package/dist/auth.js.map +1 -0
- package/dist/banner.js +35 -0
- package/dist/banner.js.map +1 -0
- package/dist/cli-logger.js +72 -0
- package/dist/cli-logger.js.map +1 -0
- package/dist/cli.js +822 -0
- package/dist/cli.js.map +1 -0
- package/dist/cmd/ai/capabilities/index.js +10 -0
- package/dist/cmd/ai/capabilities/index.js.map +1 -0
- package/dist/cmd/ai/capabilities/show.js +221 -0
- package/dist/cmd/ai/capabilities/show.js.map +1 -0
- package/dist/cmd/ai/index.js +11 -0
- package/dist/cmd/ai/index.js.map +1 -0
- package/dist/cmd/ai/prompt/index.js +10 -0
- package/dist/cmd/ai/prompt/index.js.map +1 -0
- package/dist/cmd/ai/prompt/llm.js +365 -0
- package/dist/cmd/ai/prompt/llm.js.map +1 -0
- package/dist/cmd/ai/schema/index.js +10 -0
- package/dist/cmd/ai/schema/index.js.map +1 -0
- package/dist/cmd/ai/schema/show.js +23 -0
- package/dist/cmd/ai/schema/show.js.map +1 -0
- package/dist/cmd/auth/api.js +85 -0
- package/dist/cmd/auth/api.js.map +1 -0
- package/dist/cmd/auth/index.js +13 -0
- package/dist/cmd/auth/index.js.map +1 -0
- package/dist/cmd/auth/login.js +84 -0
- package/dist/cmd/auth/login.js.map +1 -0
- package/dist/cmd/auth/logout.js +17 -0
- package/dist/cmd/auth/logout.js.map +1 -0
- package/dist/cmd/auth/signup.js +55 -0
- package/dist/cmd/auth/signup.js.map +1 -0
- package/dist/cmd/auth/ssh/add.js +239 -0
- package/dist/cmd/auth/ssh/add.js.map +1 -0
- package/dist/cmd/auth/ssh/api.js +53 -0
- package/dist/cmd/auth/ssh/api.js.map +1 -0
- package/dist/cmd/auth/ssh/delete.js +126 -0
- package/dist/cmd/auth/ssh/delete.js.map +1 -0
- package/dist/cmd/auth/ssh/index.js +11 -0
- package/dist/cmd/auth/ssh/index.js.map +1 -0
- package/dist/cmd/auth/ssh/list.js +70 -0
- package/dist/cmd/auth/ssh/list.js.map +1 -0
- package/dist/cmd/auth/whoami.js +68 -0
- package/dist/cmd/auth/whoami.js.map +1 -0
- package/dist/cmd/build/ast.js +608 -0
- package/dist/cmd/build/ast.js.map +1 -0
- package/dist/cmd/build/ast.test.js +389 -0
- package/dist/cmd/build/ast.test.js.map +1 -0
- package/dist/cmd/build/bundler.js +304 -0
- package/dist/cmd/build/bundler.js.map +1 -0
- package/dist/cmd/build/file.js +10 -0
- package/dist/cmd/build/file.js.map +1 -0
- package/dist/cmd/build/fix-duplicate-exports.js +167 -0
- package/dist/cmd/build/fix-duplicate-exports.js.map +1 -0
- package/dist/cmd/build/fix-duplicate-exports.test.js +300 -0
- package/dist/cmd/build/fix-duplicate-exports.test.js.map +1 -0
- package/dist/cmd/build/index.d.ts.map +1 -1
- package/dist/cmd/build/index.js +79 -0
- package/dist/cmd/build/index.js.map +1 -0
- package/dist/cmd/build/patch/_util.js +42 -0
- package/dist/cmd/build/patch/_util.js.map +1 -0
- package/dist/cmd/build/patch/aisdk.js +65 -0
- package/dist/cmd/build/patch/aisdk.js.map +1 -0
- package/dist/cmd/build/patch/index.js +97 -0
- package/dist/cmd/build/patch/index.js.map +1 -0
- package/dist/cmd/build/patch/llm.js +18 -0
- package/dist/cmd/build/patch/llm.js.map +1 -0
- package/dist/cmd/build/plugin.d.ts.map +1 -1
- package/dist/cmd/build/plugin.js +556 -0
- package/dist/cmd/build/plugin.js.map +1 -0
- package/dist/cmd/cloud/agents/index.js +133 -0
- package/dist/cmd/cloud/agents/index.js.map +1 -0
- package/dist/cmd/cloud/deploy.js +341 -0
- package/dist/cmd/cloud/deploy.js.map +1 -0
- package/dist/cmd/cloud/deployment/index.js +20 -0
- package/dist/cmd/cloud/deployment/index.js.map +1 -0
- package/dist/cmd/cloud/deployment/list.js +89 -0
- package/dist/cmd/cloud/deployment/list.js.map +1 -0
- package/dist/cmd/cloud/deployment/remove.js +60 -0
- package/dist/cmd/cloud/deployment/remove.js.map +1 -0
- package/dist/cmd/cloud/deployment/rollback.js +80 -0
- package/dist/cmd/cloud/deployment/rollback.js.map +1 -0
- package/dist/cmd/cloud/deployment/show.js +106 -0
- package/dist/cmd/cloud/deployment/show.js.map +1 -0
- package/dist/cmd/cloud/deployment/undeploy.js +45 -0
- package/dist/cmd/cloud/deployment/undeploy.js.map +1 -0
- package/dist/cmd/cloud/deployment/utils.js +10 -0
- package/dist/cmd/cloud/deployment/utils.js.map +1 -0
- package/dist/cmd/cloud/domain.js +77 -0
- package/dist/cmd/cloud/domain.js.map +1 -0
- package/dist/cmd/cloud/env/delete.js +50 -0
- package/dist/cmd/cloud/env/delete.js.map +1 -0
- package/dist/cmd/cloud/env/get.js +65 -0
- package/dist/cmd/cloud/env/get.js.map +1 -0
- package/dist/cmd/cloud/env/import.js +113 -0
- package/dist/cmd/cloud/env/import.js.map +1 -0
- package/dist/cmd/cloud/env/index.js +24 -0
- package/dist/cmd/cloud/env/index.js.map +1 -0
- package/dist/cmd/cloud/env/list.js +58 -0
- package/dist/cmd/cloud/env/list.js.map +1 -0
- package/dist/cmd/cloud/env/pull.js +81 -0
- package/dist/cmd/cloud/env/pull.js.map +1 -0
- package/dist/cmd/cloud/env/push.js +61 -0
- package/dist/cmd/cloud/env/push.js.map +1 -0
- package/dist/cmd/cloud/env/set.js +73 -0
- package/dist/cmd/cloud/env/set.js.map +1 -0
- package/dist/cmd/cloud/index.js +31 -0
- package/dist/cmd/cloud/index.js.map +1 -0
- package/dist/cmd/cloud/keyvalue/create-namespace.js +41 -0
- package/dist/cmd/cloud/keyvalue/create-namespace.js.map +1 -0
- package/dist/cmd/cloud/keyvalue/delete-namespace.js +64 -0
- package/dist/cmd/cloud/keyvalue/delete-namespace.js.map +1 -0
- package/dist/cmd/cloud/keyvalue/delete.js +47 -0
- package/dist/cmd/cloud/keyvalue/delete.js.map +1 -0
- package/dist/cmd/cloud/keyvalue/get.js +65 -0
- package/dist/cmd/cloud/keyvalue/get.js.map +1 -0
- package/dist/cmd/cloud/keyvalue/index.js +32 -0
- package/dist/cmd/cloud/keyvalue/index.js.map +1 -0
- package/dist/cmd/cloud/keyvalue/keys.js +50 -0
- package/dist/cmd/cloud/keyvalue/keys.js.map +1 -0
- package/dist/cmd/cloud/keyvalue/list-namespaces.js +37 -0
- package/dist/cmd/cloud/keyvalue/list-namespaces.js.map +1 -0
- package/dist/cmd/cloud/keyvalue/repl.js +277 -0
- package/dist/cmd/cloud/keyvalue/repl.js.map +1 -0
- package/dist/cmd/cloud/keyvalue/search.js +72 -0
- package/dist/cmd/cloud/keyvalue/search.js.map +1 -0
- package/dist/cmd/cloud/keyvalue/set.js +59 -0
- package/dist/cmd/cloud/keyvalue/set.js.map +1 -0
- package/dist/cmd/cloud/keyvalue/stats.js +82 -0
- package/dist/cmd/cloud/keyvalue/stats.js.map +1 -0
- package/dist/cmd/cloud/keyvalue/util.js +19 -0
- package/dist/cmd/cloud/keyvalue/util.js.map +1 -0
- package/dist/cmd/cloud/objectstore/delete-bucket.js +66 -0
- package/dist/cmd/cloud/objectstore/delete-bucket.js.map +1 -0
- package/dist/cmd/cloud/objectstore/delete.js +56 -0
- package/dist/cmd/cloud/objectstore/delete.js.map +1 -0
- package/dist/cmd/cloud/objectstore/get.js +64 -0
- package/dist/cmd/cloud/objectstore/get.js.map +1 -0
- package/dist/cmd/cloud/objectstore/index.js +28 -0
- package/dist/cmd/cloud/objectstore/index.js.map +1 -0
- package/dist/cmd/cloud/objectstore/list-buckets.js +37 -0
- package/dist/cmd/cloud/objectstore/list-buckets.js.map +1 -0
- package/dist/cmd/cloud/objectstore/list-keys.js +52 -0
- package/dist/cmd/cloud/objectstore/list-keys.js.map +1 -0
- package/dist/cmd/cloud/objectstore/put.js +57 -0
- package/dist/cmd/cloud/objectstore/put.js.map +1 -0
- package/dist/cmd/cloud/objectstore/repl.js +219 -0
- package/dist/cmd/cloud/objectstore/repl.js.map +1 -0
- package/dist/cmd/cloud/objectstore/url.js +55 -0
- package/dist/cmd/cloud/objectstore/url.js.map +1 -0
- package/dist/cmd/cloud/objectstore/util.js +18 -0
- package/dist/cmd/cloud/objectstore/util.js.map +1 -0
- package/dist/cmd/cloud/resource/add.js +70 -0
- package/dist/cmd/cloud/resource/add.js.map +1 -0
- package/dist/cmd/cloud/resource/delete.js +126 -0
- package/dist/cmd/cloud/resource/delete.js.map +1 -0
- package/dist/cmd/cloud/resource/index.js +12 -0
- package/dist/cmd/cloud/resource/index.js.map +1 -0
- package/dist/cmd/cloud/resource/list.js +89 -0
- package/dist/cmd/cloud/resource/list.js.map +1 -0
- package/dist/cmd/cloud/scp/download.js +72 -0
- package/dist/cmd/cloud/scp/download.js.map +1 -0
- package/dist/cmd/cloud/scp/index.js +10 -0
- package/dist/cmd/cloud/scp/index.js.map +1 -0
- package/dist/cmd/cloud/scp/upload.js +75 -0
- package/dist/cmd/cloud/scp/upload.js.map +1 -0
- package/dist/cmd/cloud/secret/delete.js +50 -0
- package/dist/cmd/cloud/secret/delete.js.map +1 -0
- package/dist/cmd/cloud/secret/get.js +69 -0
- package/dist/cmd/cloud/secret/get.js.map +1 -0
- package/dist/cmd/cloud/secret/import.js +88 -0
- package/dist/cmd/cloud/secret/import.js.map +1 -0
- package/dist/cmd/cloud/secret/index.js +24 -0
- package/dist/cmd/cloud/secret/index.js.map +1 -0
- package/dist/cmd/cloud/secret/list.js +58 -0
- package/dist/cmd/cloud/secret/list.js.map +1 -0
- package/dist/cmd/cloud/secret/pull.js +81 -0
- package/dist/cmd/cloud/secret/pull.js.map +1 -0
- package/dist/cmd/cloud/secret/push.js +61 -0
- package/dist/cmd/cloud/secret/push.js.map +1 -0
- package/dist/cmd/cloud/secret/set.js +57 -0
- package/dist/cmd/cloud/secret/set.js.map +1 -0
- package/dist/cmd/cloud/session/get.d.ts.map +1 -1
- package/dist/cmd/cloud/session/get.js +155 -0
- package/dist/cmd/cloud/session/get.js.map +1 -0
- package/dist/cmd/cloud/session/index.js +11 -0
- package/dist/cmd/cloud/session/index.js.map +1 -0
- package/dist/cmd/cloud/session/list.js +132 -0
- package/dist/cmd/cloud/session/list.js.map +1 -0
- package/dist/cmd/cloud/session/logs.js +56 -0
- package/dist/cmd/cloud/session/logs.js.map +1 -0
- package/dist/cmd/cloud/ssh.js +67 -0
- package/dist/cmd/cloud/ssh.js.map +1 -0
- package/dist/cmd/dev/agents.js +103 -0
- package/dist/cmd/dev/agents.js.map +1 -0
- package/dist/cmd/dev/api.js +26 -0
- package/dist/cmd/dev/api.js.map +1 -0
- package/dist/cmd/dev/download.js +77 -0
- package/dist/cmd/dev/download.js.map +1 -0
- package/dist/cmd/dev/index.js +745 -0
- package/dist/cmd/dev/index.js.map +1 -0
- package/dist/cmd/dev/sync.js +229 -0
- package/dist/cmd/dev/sync.js.map +1 -0
- package/dist/cmd/dev/templates.js +75 -0
- package/dist/cmd/dev/templates.js.map +1 -0
- package/dist/cmd/index.js +49 -0
- package/dist/cmd/index.js.map +1 -0
- package/dist/cmd/profile/create.js +89 -0
- package/dist/cmd/profile/create.js.map +1 -0
- package/dist/cmd/profile/delete.js +63 -0
- package/dist/cmd/profile/delete.js.map +1 -0
- package/dist/cmd/profile/index.js +14 -0
- package/dist/cmd/profile/index.js.map +1 -0
- package/dist/cmd/profile/list.js +28 -0
- package/dist/cmd/profile/list.js.map +1 -0
- package/dist/cmd/profile/show.js +68 -0
- package/dist/cmd/profile/show.js.map +1 -0
- package/dist/cmd/profile/use.js +37 -0
- package/dist/cmd/profile/use.js.map +1 -0
- package/dist/cmd/project/create.js +92 -0
- package/dist/cmd/project/create.js.map +1 -0
- package/dist/cmd/project/delete.js +117 -0
- package/dist/cmd/project/delete.js.map +1 -0
- package/dist/cmd/project/download.js +217 -0
- package/dist/cmd/project/download.js.map +1 -0
- package/dist/cmd/project/index.js +12 -0
- package/dist/cmd/project/index.js.map +1 -0
- package/dist/cmd/project/list.js +51 -0
- package/dist/cmd/project/list.js.map +1 -0
- package/dist/cmd/project/show.js +54 -0
- package/dist/cmd/project/show.js.map +1 -0
- package/dist/cmd/project/template-flow.js +315 -0
- package/dist/cmd/project/template-flow.js.map +1 -0
- package/dist/cmd/project/templates.js +31 -0
- package/dist/cmd/project/templates.js.map +1 -0
- package/dist/cmd/repl/index.js +444 -0
- package/dist/cmd/repl/index.js.map +1 -0
- package/dist/cmd/version/index.js +29 -0
- package/dist/cmd/version/index.js.map +1 -0
- package/dist/command-prefix.js +37 -0
- package/dist/command-prefix.js.map +1 -0
- package/dist/config.js +536 -0
- package/dist/config.js.map +1 -0
- package/dist/crypto/box.js +382 -0
- package/dist/crypto/box.js.map +1 -0
- package/dist/crypto/box.test.js +317 -0
- package/dist/crypto/box.test.js.map +1 -0
- package/dist/download.js +64 -0
- package/dist/download.js.map +1 -0
- package/dist/env-util.js +219 -0
- package/dist/env-util.js.map +1 -0
- package/dist/env-util.test.js +146 -0
- package/dist/env-util.test.js.map +1 -0
- package/dist/errors.js +177 -0
- package/dist/errors.js.map +1 -0
- package/dist/explain.js +90 -0
- package/dist/explain.js.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/json.js +29 -0
- package/dist/json.js.map +1 -0
- package/dist/legacy-check.js +104 -0
- package/dist/legacy-check.js.map +1 -0
- package/dist/output.js +207 -0
- package/dist/output.js.map +1 -0
- package/dist/repl.js +1176 -0
- package/dist/repl.js.map +1 -0
- package/dist/runtime.js +19 -0
- package/dist/runtime.js.map +1 -0
- package/dist/schema-generator.js +289 -0
- package/dist/schema-generator.js.map +1 -0
- package/dist/schema-parser.js +145 -0
- package/dist/schema-parser.js.map +1 -0
- package/dist/sound.js +44 -0
- package/dist/sound.js.map +1 -0
- package/dist/steps.js +293 -0
- package/dist/steps.js.map +1 -0
- package/dist/terminal.js +130 -0
- package/dist/terminal.js.map +1 -0
- package/dist/tui.js +1124 -0
- package/dist/tui.js.map +1 -0
- package/dist/types.js +163 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/detectSubagent.js +25 -0
- package/dist/utils/detectSubagent.js.map +1 -0
- package/dist/utils/format.js +21 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/zip.js +33 -0
- package/dist/utils/zip.js.map +1 -0
- package/dist/version.js +24 -0
- package/dist/version.js.map +1 -0
- package/package.json +6 -6
- package/src/banner.ts +1 -1
- package/src/cmd/build/index.ts +15 -21
- package/src/cmd/build/plugin.ts +2 -1
- package/src/cmd/cloud/session/get.ts +20 -14
- package/src/cmd/cloud/session/list.ts +1 -1
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { createSubcommand } from '../../types';
|
|
2
|
+
import * as tui from '../../tui';
|
|
3
|
+
import { whoami } from '@agentuity/server';
|
|
4
|
+
import { getCommand } from '../../command-prefix';
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
const WhoamiResponseSchema = z.object({
|
|
7
|
+
userId: z.string().describe('Unique user identifier'),
|
|
8
|
+
firstName: z.string().describe('User first name'),
|
|
9
|
+
lastName: z.string().describe('User last name'),
|
|
10
|
+
organizations: z
|
|
11
|
+
.array(z.object({
|
|
12
|
+
id: z.string().describe('Organization ID'),
|
|
13
|
+
name: z.string().describe('Organization name'),
|
|
14
|
+
}))
|
|
15
|
+
.describe('Organizations the user belongs to'),
|
|
16
|
+
});
|
|
17
|
+
export const whoamiCommand = createSubcommand({
|
|
18
|
+
name: 'whoami',
|
|
19
|
+
description: 'Display information about the currently authenticated user',
|
|
20
|
+
tags: ['read-only', 'fast', 'requires-auth'],
|
|
21
|
+
requires: { auth: true, apiClient: true },
|
|
22
|
+
idempotent: true,
|
|
23
|
+
schema: {
|
|
24
|
+
response: WhoamiResponseSchema,
|
|
25
|
+
},
|
|
26
|
+
examples: [getCommand('auth whoami'), getCommand('--json auth whoami')],
|
|
27
|
+
async handler(ctx) {
|
|
28
|
+
const { apiClient, auth, options } = ctx;
|
|
29
|
+
if (!apiClient) {
|
|
30
|
+
throw new Error('API client is not available. This is likely a configuration or initialization issue.');
|
|
31
|
+
}
|
|
32
|
+
const user = await tui.spinner({
|
|
33
|
+
message: 'Fetching user information',
|
|
34
|
+
clearOnSuccess: true,
|
|
35
|
+
callback: () => {
|
|
36
|
+
return whoami(apiClient);
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
const result = {
|
|
40
|
+
userId: auth?.userId || '',
|
|
41
|
+
firstName: user.firstName,
|
|
42
|
+
lastName: user.lastName,
|
|
43
|
+
organizations: user.organizations,
|
|
44
|
+
};
|
|
45
|
+
if (options.json) {
|
|
46
|
+
console.log(JSON.stringify(result, null, 2));
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
const fullName = `${user.firstName} ${user.lastName}`;
|
|
50
|
+
tui.newline();
|
|
51
|
+
console.log(tui.bold('Currently logged in as:'));
|
|
52
|
+
tui.newline();
|
|
53
|
+
console.log(` ${tui.padRight('Name:', 15, ' ')} ${tui.bold(fullName)}`);
|
|
54
|
+
console.log(` ${tui.padRight('User ID:', 15, ' ')} ${tui.muted(auth?.userId || '')}`);
|
|
55
|
+
tui.newline();
|
|
56
|
+
if (user.organizations.length > 0) {
|
|
57
|
+
console.log(tui.bold('Organizations:'));
|
|
58
|
+
tui.newline();
|
|
59
|
+
for (const org of user.organizations) {
|
|
60
|
+
console.log(` ${tui.padRight(org.name, 30, ' ')} ${tui.muted(org.id)}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
tui.newline();
|
|
64
|
+
}
|
|
65
|
+
return result;
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
//# sourceMappingURL=whoami.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../../src/cmd/auth/whoami.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,608 @@
|
|
|
1
|
+
import * as acornLoose from 'acorn-loose';
|
|
2
|
+
import { basename, dirname, relative } from 'node:path';
|
|
3
|
+
import { generate } from 'astring';
|
|
4
|
+
import { createLogger } from '@agentuity/server';
|
|
5
|
+
function parseObjectExpressionToMap(expr) {
|
|
6
|
+
const result = new Map();
|
|
7
|
+
for (const prop of expr.properties) {
|
|
8
|
+
switch (prop.value.type) {
|
|
9
|
+
case 'Literal': {
|
|
10
|
+
const value = prop.value;
|
|
11
|
+
result.set(prop.key.name, value.value);
|
|
12
|
+
break;
|
|
13
|
+
}
|
|
14
|
+
default: {
|
|
15
|
+
console.warn('AST value type %s of metadata key: %s not supported', prop.value.type, prop.key.name);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return result;
|
|
20
|
+
}
|
|
21
|
+
function createObjectPropertyNode(key, value) {
|
|
22
|
+
return {
|
|
23
|
+
type: 'Property',
|
|
24
|
+
kind: 'init',
|
|
25
|
+
key: {
|
|
26
|
+
type: 'Identifier',
|
|
27
|
+
name: key,
|
|
28
|
+
},
|
|
29
|
+
value: {
|
|
30
|
+
type: 'Literal',
|
|
31
|
+
value,
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function createNewMetadataNode() {
|
|
36
|
+
return {
|
|
37
|
+
type: 'Property',
|
|
38
|
+
kind: 'init',
|
|
39
|
+
key: {
|
|
40
|
+
type: 'Identifier',
|
|
41
|
+
name: 'metadata',
|
|
42
|
+
},
|
|
43
|
+
value: {
|
|
44
|
+
type: 'ObjectExpression',
|
|
45
|
+
properties: [],
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function hash(...val) {
|
|
50
|
+
const hasher = new Bun.CryptoHasher('sha256');
|
|
51
|
+
val.map((val) => hasher.update(val));
|
|
52
|
+
return hasher.digest().toHex();
|
|
53
|
+
}
|
|
54
|
+
function hashSHA1(...val) {
|
|
55
|
+
const hasher = new Bun.CryptoHasher('sha1');
|
|
56
|
+
val.map((val) => hasher.update(val));
|
|
57
|
+
return hasher.digest().toHex();
|
|
58
|
+
}
|
|
59
|
+
export function getDevmodeDeploymentId(projectId, endpointId) {
|
|
60
|
+
return `devmode_${hashSHA1(projectId, endpointId)}`;
|
|
61
|
+
}
|
|
62
|
+
function getAgentId(projectId, deploymentId, filename, version) {
|
|
63
|
+
return `agent_${hashSHA1(projectId, deploymentId, filename, version)}`;
|
|
64
|
+
}
|
|
65
|
+
function getEvalId(projectId, deploymentId, filename, name, version) {
|
|
66
|
+
return `eval_${hashSHA1(projectId, deploymentId, filename, name, version)}`;
|
|
67
|
+
}
|
|
68
|
+
function generateRouteId(projectId, deploymentId, type, method, filename, path, version) {
|
|
69
|
+
return `route_${hashSHA1(projectId, deploymentId, type, method, filename, path, version)}`;
|
|
70
|
+
}
|
|
71
|
+
function generateStableAgentId(projectId, name) {
|
|
72
|
+
return `agentid_${hashSHA1(projectId, name)}`.substring(0, 64);
|
|
73
|
+
}
|
|
74
|
+
function generateStableEvalId(projectId, agentId, name) {
|
|
75
|
+
return `evalid_${hashSHA1(projectId, agentId, name)}`.substring(0, 64);
|
|
76
|
+
}
|
|
77
|
+
function augmentAgentMetadataNode(projectId, id, name, rel, version, ast, propvalue, filename) {
|
|
78
|
+
const metadata = parseObjectExpressionToMap(propvalue);
|
|
79
|
+
if (!metadata.has('name')) {
|
|
80
|
+
const location = ast.loc?.start ? ` on line ${ast.loc.start}` : '';
|
|
81
|
+
throw new Error(`missing required metadata.name in ${filename}${location}. This Agent should have a unique and human readable name for this project.`);
|
|
82
|
+
}
|
|
83
|
+
if (metadata.has('identifier') && name !== metadata.get('identifier')) {
|
|
84
|
+
const location = ast.loc?.start ? ` on line ${ast.loc.start}` : '';
|
|
85
|
+
throw new Error(`metadata.identifier (${metadata.get('identifier')}) in ${filename}${location} is mismatched (${name}). This is an internal error.`);
|
|
86
|
+
}
|
|
87
|
+
const descriptionNode = propvalue.properties.find((x) => x.key.name === 'description')?.value;
|
|
88
|
+
const description = descriptionNode ? descriptionNode.value : '';
|
|
89
|
+
const agentId = generateStableAgentId(projectId, name);
|
|
90
|
+
metadata.set('version', version);
|
|
91
|
+
metadata.set('identifier', name);
|
|
92
|
+
metadata.set('filename', rel);
|
|
93
|
+
metadata.set('id', id);
|
|
94
|
+
metadata.set('agentId', agentId);
|
|
95
|
+
metadata.set('description', description);
|
|
96
|
+
propvalue.properties.push(createObjectPropertyNode('id', id), createObjectPropertyNode('agentId', agentId), createObjectPropertyNode('version', version), createObjectPropertyNode('identifier', name), createObjectPropertyNode('filename', rel), createObjectPropertyNode('description', description));
|
|
97
|
+
const newsource = generate(ast);
|
|
98
|
+
// Evals imports are now handled in registry.generated.ts
|
|
99
|
+
return [newsource, metadata];
|
|
100
|
+
}
|
|
101
|
+
function createAgentMetadataNode(id, name, rel, version, ast, callargexp, _filename) {
|
|
102
|
+
const newmetadata = createNewMetadataNode();
|
|
103
|
+
const md = new Map();
|
|
104
|
+
md.set('id', id);
|
|
105
|
+
md.set('version', version);
|
|
106
|
+
md.set('name', name);
|
|
107
|
+
md.set('identifier', name);
|
|
108
|
+
md.set('filename', rel);
|
|
109
|
+
for (const [key, value] of md) {
|
|
110
|
+
newmetadata.value.properties.push(createObjectPropertyNode(key, value));
|
|
111
|
+
}
|
|
112
|
+
callargexp.properties.push(newmetadata);
|
|
113
|
+
const newsource = generate(ast);
|
|
114
|
+
// Evals imports are now handled in registry.generated.ts
|
|
115
|
+
return [newsource, md];
|
|
116
|
+
}
|
|
117
|
+
function camelToKebab(str) {
|
|
118
|
+
return str
|
|
119
|
+
.replace(/([a-z0-9])([A-Z])/g, '$1-$2')
|
|
120
|
+
.replace(/([A-Z])([A-Z][a-z])/g, '$1-$2')
|
|
121
|
+
.toLowerCase();
|
|
122
|
+
}
|
|
123
|
+
function setLiteralValue(literal, value) {
|
|
124
|
+
literal.value = value;
|
|
125
|
+
if (literal.raw !== undefined) {
|
|
126
|
+
literal.raw = JSON.stringify(value);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function augmentEvalMetadataNode(projectId, agentId, id, name, rel, version, _ast, metadataObj, _filename) {
|
|
130
|
+
const metadata = parseObjectExpressionToMap(metadataObj);
|
|
131
|
+
// Name can come from metadata.name or variable name (already resolved in caller)
|
|
132
|
+
// If metadata doesn't have name, we'll add it from the resolved name
|
|
133
|
+
if (!metadata.has('name')) {
|
|
134
|
+
metadataObj.properties.push(createObjectPropertyNode('name', name));
|
|
135
|
+
}
|
|
136
|
+
const descriptionNode = metadataObj.properties.find((x) => x.key.name === 'description')?.value;
|
|
137
|
+
const description = descriptionNode ? descriptionNode.value : '';
|
|
138
|
+
const effectiveAgentId = agentId || '';
|
|
139
|
+
const _evalId = getEvalId(projectId, effectiveAgentId, rel, name, version); // Deployment-specific ID (not used, kept for potential future use)
|
|
140
|
+
const stableEvalId = generateStableEvalId(projectId, effectiveAgentId, name);
|
|
141
|
+
// Check if id, version, identifier, filename, evalId already exist
|
|
142
|
+
const existingKeys = new Set();
|
|
143
|
+
for (const prop of metadataObj.properties) {
|
|
144
|
+
if (prop.key.type === 'Identifier') {
|
|
145
|
+
existingKeys.add(prop.key.name);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// Add or update metadata properties
|
|
149
|
+
if (!existingKeys.has('id')) {
|
|
150
|
+
metadataObj.properties.push(createObjectPropertyNode('id', id));
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
// Update existing id
|
|
154
|
+
for (const prop of metadataObj.properties) {
|
|
155
|
+
if (prop.key.type === 'Identifier' && prop.key.name === 'id') {
|
|
156
|
+
if (prop.value.type === 'Literal') {
|
|
157
|
+
setLiteralValue(prop.value, id);
|
|
158
|
+
}
|
|
159
|
+
break;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (!existingKeys.has('version')) {
|
|
164
|
+
metadataObj.properties.push(createObjectPropertyNode('version', version));
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
for (const prop of metadataObj.properties) {
|
|
168
|
+
if (prop.key.type === 'Identifier' && prop.key.name === 'version') {
|
|
169
|
+
if (prop.value.type === 'Literal') {
|
|
170
|
+
setLiteralValue(prop.value, version);
|
|
171
|
+
}
|
|
172
|
+
break;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
if (!existingKeys.has('identifier')) {
|
|
177
|
+
metadataObj.properties.push(createObjectPropertyNode('identifier', name));
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
for (const prop of metadataObj.properties) {
|
|
181
|
+
if (prop.key.type === 'Identifier' && prop.key.name === 'identifier') {
|
|
182
|
+
if (prop.value.type === 'Literal') {
|
|
183
|
+
setLiteralValue(prop.value, name);
|
|
184
|
+
}
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
if (!existingKeys.has('filename')) {
|
|
190
|
+
metadataObj.properties.push(createObjectPropertyNode('filename', rel));
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
for (const prop of metadataObj.properties) {
|
|
194
|
+
if (prop.key.type === 'Identifier' && prop.key.name === 'filename') {
|
|
195
|
+
if (prop.value.type === 'Literal') {
|
|
196
|
+
setLiteralValue(prop.value, rel);
|
|
197
|
+
}
|
|
198
|
+
break;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
if (!existingKeys.has('evalId')) {
|
|
203
|
+
metadataObj.properties.push(createObjectPropertyNode('evalId', stableEvalId));
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
for (const prop of metadataObj.properties) {
|
|
207
|
+
if (prop.key.type === 'Identifier' && prop.key.name === 'evalId') {
|
|
208
|
+
if (prop.value.type === 'Literal') {
|
|
209
|
+
setLiteralValue(prop.value, stableEvalId);
|
|
210
|
+
}
|
|
211
|
+
break;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
if (!existingKeys.has('description')) {
|
|
216
|
+
metadataObj.properties.push(createObjectPropertyNode('description', description));
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
for (const prop of metadataObj.properties) {
|
|
220
|
+
if (prop.key.type === 'Identifier' && prop.key.name === 'description') {
|
|
221
|
+
if (prop.value.type === 'Literal') {
|
|
222
|
+
setLiteralValue(prop.value, description);
|
|
223
|
+
}
|
|
224
|
+
break;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
export function parseEvalMetadata(rootDir, filename, contents, projectId, deploymentId, agentId) {
|
|
230
|
+
const logLevel = (process.env.AGENTUITY_LOG_LEVEL || 'info');
|
|
231
|
+
const logger = createLogger(logLevel);
|
|
232
|
+
logger.trace(`Parsing evals from ${filename}`);
|
|
233
|
+
const ast = acornLoose.parse(contents, { ecmaVersion: 'latest', sourceType: 'module' });
|
|
234
|
+
const rel = relative(rootDir, filename);
|
|
235
|
+
const version = hash(contents);
|
|
236
|
+
const evals = [];
|
|
237
|
+
// Find all exported agent.createEval() calls
|
|
238
|
+
for (const body of ast.body) {
|
|
239
|
+
let variableDeclaration;
|
|
240
|
+
// Only process exported VariableDeclarations
|
|
241
|
+
if (body.type === 'ExportNamedDeclaration') {
|
|
242
|
+
const exportDecl = body;
|
|
243
|
+
if (exportDecl.declaration?.type === 'VariableDeclaration') {
|
|
244
|
+
variableDeclaration = exportDecl.declaration;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
if (variableDeclaration) {
|
|
248
|
+
for (const vardecl of variableDeclaration.declarations) {
|
|
249
|
+
if (vardecl.type === 'VariableDeclarator' && vardecl.init?.type === 'CallExpression') {
|
|
250
|
+
const call = vardecl.init;
|
|
251
|
+
if (call.callee.type === 'MemberExpression') {
|
|
252
|
+
const memberExpr = call.callee;
|
|
253
|
+
const object = memberExpr.object;
|
|
254
|
+
const property = memberExpr.property;
|
|
255
|
+
if (object.type === 'Identifier' &&
|
|
256
|
+
object.name === 'agent' &&
|
|
257
|
+
property.type === 'Identifier' &&
|
|
258
|
+
property.name === 'createEval') {
|
|
259
|
+
// Found agent.createEval() call
|
|
260
|
+
if (call.arguments.length > 0) {
|
|
261
|
+
const firstArg = call.arguments[0];
|
|
262
|
+
if (firstArg.type === 'ObjectExpression') {
|
|
263
|
+
const evalConfig = firstArg;
|
|
264
|
+
let evalName;
|
|
265
|
+
let evalDescription;
|
|
266
|
+
let variableName;
|
|
267
|
+
let metadataObj;
|
|
268
|
+
// Capture variable name if available
|
|
269
|
+
if (vardecl.id.type === 'Identifier') {
|
|
270
|
+
variableName = vardecl.id.name;
|
|
271
|
+
}
|
|
272
|
+
// Extract metadata from the eval config
|
|
273
|
+
for (const prop of evalConfig.properties) {
|
|
274
|
+
if (prop.key.type === 'Identifier' && prop.key.name === 'metadata') {
|
|
275
|
+
if (prop.value.type === 'ObjectExpression') {
|
|
276
|
+
metadataObj = prop.value;
|
|
277
|
+
for (const metaProp of metadataObj.properties) {
|
|
278
|
+
if (metaProp.key.type === 'Identifier') {
|
|
279
|
+
if (metaProp.key.name === 'name' &&
|
|
280
|
+
metaProp.value.type === 'Literal') {
|
|
281
|
+
evalName = metaProp.value.value;
|
|
282
|
+
}
|
|
283
|
+
else if (metaProp.key.name === 'description' &&
|
|
284
|
+
metaProp.value.type === 'Literal') {
|
|
285
|
+
evalDescription = metaProp.value.value;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
// Use metadata.name if provided, otherwise use variable name
|
|
293
|
+
// Throw error if neither is available (should never happen)
|
|
294
|
+
let finalName;
|
|
295
|
+
if (evalName) {
|
|
296
|
+
finalName = evalName;
|
|
297
|
+
}
|
|
298
|
+
else if (variableName) {
|
|
299
|
+
finalName = camelToKebab(variableName);
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
throw new Error('Eval is missing a name. Please provide metadata.name or use a named export.');
|
|
303
|
+
}
|
|
304
|
+
logger.trace(`Found eval: ${finalName}${evalDescription ? ` - ${evalDescription}` : ''}`);
|
|
305
|
+
const evalId = getEvalId(projectId, deploymentId, rel, finalName, version);
|
|
306
|
+
// Inject metadata into AST if metadata object exists
|
|
307
|
+
let stableEvalId;
|
|
308
|
+
const effectiveAgentId = agentId || '';
|
|
309
|
+
if (metadataObj) {
|
|
310
|
+
augmentEvalMetadataNode(projectId, effectiveAgentId, evalId, finalName, rel, version, ast, metadataObj, filename);
|
|
311
|
+
// Extract evalId from metadata after augmentation
|
|
312
|
+
const metadata = parseObjectExpressionToMap(metadataObj);
|
|
313
|
+
stableEvalId =
|
|
314
|
+
metadata.get('evalId') ||
|
|
315
|
+
generateStableEvalId(projectId, effectiveAgentId, finalName);
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
// If no metadata object, generate stable evalId
|
|
319
|
+
stableEvalId = generateStableEvalId(projectId, effectiveAgentId, finalName);
|
|
320
|
+
}
|
|
321
|
+
evals.push({
|
|
322
|
+
filename: rel,
|
|
323
|
+
id: evalId,
|
|
324
|
+
version,
|
|
325
|
+
identifier: finalName,
|
|
326
|
+
name: finalName,
|
|
327
|
+
evalId: stableEvalId,
|
|
328
|
+
description: evalDescription,
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
// Check for duplicate eval names in the same file
|
|
339
|
+
// This prevents hash collisions when projectId/deploymentId are empty
|
|
340
|
+
const seenNames = new Map();
|
|
341
|
+
for (const evalItem of evals) {
|
|
342
|
+
const count = seenNames.get(evalItem.name) || 0;
|
|
343
|
+
seenNames.set(evalItem.name, count + 1);
|
|
344
|
+
}
|
|
345
|
+
const duplicates = [];
|
|
346
|
+
for (const [name, count] of seenNames.entries()) {
|
|
347
|
+
if (count > 1) {
|
|
348
|
+
duplicates.push(name);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
if (duplicates.length > 0) {
|
|
352
|
+
throw new Error(`Duplicate eval names found in ${rel}: ${duplicates.join(', ')}. ` +
|
|
353
|
+
'Eval names must be unique within the same file to prevent ID collisions.');
|
|
354
|
+
}
|
|
355
|
+
const newsource = generate(ast);
|
|
356
|
+
logger.trace(`Parsed ${evals.length} eval(s) from ${filename}`);
|
|
357
|
+
return [newsource, evals];
|
|
358
|
+
}
|
|
359
|
+
export async function parseAgentMetadata(rootDir, filename, contents, projectId, deploymentId) {
|
|
360
|
+
const ast = acornLoose.parse(contents, { ecmaVersion: 'latest', sourceType: 'module' });
|
|
361
|
+
let exportName;
|
|
362
|
+
const rel = relative(rootDir, filename);
|
|
363
|
+
const name = basename(dirname(filename));
|
|
364
|
+
const version = hash(contents);
|
|
365
|
+
const id = getAgentId(projectId, deploymentId, rel, version);
|
|
366
|
+
let result;
|
|
367
|
+
for (const body of ast.body) {
|
|
368
|
+
if (body.type === 'ExportDefaultDeclaration') {
|
|
369
|
+
if (body.declaration?.type === 'CallExpression') {
|
|
370
|
+
const call = body.declaration;
|
|
371
|
+
if (call.callee.name === 'createAgent') {
|
|
372
|
+
for (const callarg of call.arguments) {
|
|
373
|
+
const callargexp = callarg;
|
|
374
|
+
for (const prop of callargexp.properties) {
|
|
375
|
+
if (prop.key.type === 'Identifier' && prop.key.name === 'metadata') {
|
|
376
|
+
result = augmentAgentMetadataNode(projectId, id, name, rel, version, ast, prop.value, filename);
|
|
377
|
+
break;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
if (!result) {
|
|
381
|
+
result = createAgentMetadataNode(id, name, rel, version, ast, callargexp, filename);
|
|
382
|
+
}
|
|
383
|
+
break;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
if (!result) {
|
|
388
|
+
const identifier = body.declaration;
|
|
389
|
+
exportName = identifier.name;
|
|
390
|
+
break;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
if (!result && !exportName) {
|
|
395
|
+
throw new Error(`could not find default export for ${filename} using ${rootDir}`);
|
|
396
|
+
}
|
|
397
|
+
if (!result) {
|
|
398
|
+
for (const body of ast.body) {
|
|
399
|
+
if (body.type === 'VariableDeclaration') {
|
|
400
|
+
for (const vardecl of body.declarations) {
|
|
401
|
+
if (vardecl.type === 'VariableDeclarator' && vardecl.id.type === 'Identifier') {
|
|
402
|
+
const identifier = vardecl.id;
|
|
403
|
+
if (identifier.name === exportName) {
|
|
404
|
+
if (vardecl.init?.type === 'CallExpression') {
|
|
405
|
+
const call = vardecl.init;
|
|
406
|
+
if (call.callee.name === 'createAgent') {
|
|
407
|
+
for (const callarg of call.arguments) {
|
|
408
|
+
const callargexp = callarg;
|
|
409
|
+
for (const prop of callargexp.properties) {
|
|
410
|
+
if (prop.key.type === 'Identifier' &&
|
|
411
|
+
prop.key.name === 'metadata') {
|
|
412
|
+
result = augmentAgentMetadataNode(projectId, id, name, rel, version, ast, prop.value, filename);
|
|
413
|
+
break;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
if (!result) {
|
|
417
|
+
result = createAgentMetadataNode(id, name, rel, version, ast, callargexp, filename);
|
|
418
|
+
}
|
|
419
|
+
break;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
if (!result) {
|
|
430
|
+
throw new Error(`error parsing: ${filename}. could not find an proper createAgent defined in this file`);
|
|
431
|
+
}
|
|
432
|
+
// Parse evals from eval.ts file in the same directory
|
|
433
|
+
const logLevel = (process.env.AGENTUITY_LOG_LEVEL || 'info');
|
|
434
|
+
const logger = createLogger(logLevel);
|
|
435
|
+
const agentDir = dirname(filename);
|
|
436
|
+
const evalsPath = `${agentDir}/eval.ts`;
|
|
437
|
+
logger.trace(`Checking for evals file at ${evalsPath}`);
|
|
438
|
+
const evalsFile = Bun.file(evalsPath);
|
|
439
|
+
if (await evalsFile.exists()) {
|
|
440
|
+
logger.trace(`Found evals file at ${evalsPath}, parsing...`);
|
|
441
|
+
const evalsSource = await evalsFile.text();
|
|
442
|
+
const transpiler = new Bun.Transpiler({ loader: 'ts', target: 'bun' });
|
|
443
|
+
const evalsContents = transpiler.transformSync(evalsSource);
|
|
444
|
+
const agentId = result[1].get('agentId') || '';
|
|
445
|
+
const [, evals] = parseEvalMetadata(rootDir, evalsPath, evalsContents, projectId, deploymentId, agentId);
|
|
446
|
+
if (evals.length > 0) {
|
|
447
|
+
logger.trace(`Adding ${evals.length} eval(s) to agent metadata for ${name}`);
|
|
448
|
+
result[1].set('evals', JSON.stringify(evals));
|
|
449
|
+
}
|
|
450
|
+
else {
|
|
451
|
+
logger.trace(`No evals found in ${evalsPath}`);
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
else {
|
|
455
|
+
logger.trace(`No evals file found at ${evalsPath}`);
|
|
456
|
+
}
|
|
457
|
+
return result;
|
|
458
|
+
}
|
|
459
|
+
export async function parseRoute(rootDir, filename, projectId, deploymentId) {
|
|
460
|
+
const contents = await Bun.file(filename).text();
|
|
461
|
+
const version = hash(contents);
|
|
462
|
+
const ast = acornLoose.parse(contents, { ecmaVersion: 'latest', sourceType: 'module' });
|
|
463
|
+
let exportName;
|
|
464
|
+
let variableName;
|
|
465
|
+
for (const body of ast.body) {
|
|
466
|
+
if (body.type === 'ExportDefaultDeclaration') {
|
|
467
|
+
const identifier = body.declaration;
|
|
468
|
+
exportName = identifier.name;
|
|
469
|
+
break;
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
if (!exportName) {
|
|
473
|
+
throw new Error(`could not find default export for ${filename} using ${rootDir}`);
|
|
474
|
+
}
|
|
475
|
+
for (const body of ast.body) {
|
|
476
|
+
if (body.type === 'VariableDeclaration') {
|
|
477
|
+
for (const vardecl of body.declarations) {
|
|
478
|
+
if (vardecl.type === 'VariableDeclarator' && vardecl.id.type === 'Identifier') {
|
|
479
|
+
const identifier = vardecl.id;
|
|
480
|
+
if (identifier.name === exportName) {
|
|
481
|
+
if (vardecl.init?.type === 'CallExpression') {
|
|
482
|
+
const call = vardecl.init;
|
|
483
|
+
if (call.callee.name === 'createRouter') {
|
|
484
|
+
variableName = identifier.name;
|
|
485
|
+
break;
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
if (!variableName) {
|
|
494
|
+
throw new Error(`error parsing: ${filename}. could not find an proper createRouter defined in this file`);
|
|
495
|
+
}
|
|
496
|
+
const rel = relative(rootDir, filename);
|
|
497
|
+
const dir = dirname(filename);
|
|
498
|
+
const name = basename(dir);
|
|
499
|
+
// Detect if this is a subagent route and build proper path
|
|
500
|
+
const relativePath = relative(rootDir, dir)
|
|
501
|
+
.replace(/^src\/agents\//, '')
|
|
502
|
+
.replace(/^src\/apis\//, '');
|
|
503
|
+
const pathParts = relativePath.split('/').filter(Boolean);
|
|
504
|
+
const isSubagent = pathParts.length === 2 && filename.includes('src/agents');
|
|
505
|
+
const routeName = isSubagent ? pathParts.join('/') : name;
|
|
506
|
+
const routes = [];
|
|
507
|
+
const routePrefix = filename.includes('src/agents') ? '/agent' : '/api';
|
|
508
|
+
for (const body of ast.body) {
|
|
509
|
+
if (body.type === 'ExpressionStatement') {
|
|
510
|
+
const statement = body;
|
|
511
|
+
const callee = statement.expression.callee;
|
|
512
|
+
if (callee.object.type === 'Identifier') {
|
|
513
|
+
const identifier = callee.object;
|
|
514
|
+
if (identifier.name === variableName) {
|
|
515
|
+
let method = callee.property.name;
|
|
516
|
+
let type = 'api';
|
|
517
|
+
const action = statement.expression.arguments[0];
|
|
518
|
+
let suffix = '';
|
|
519
|
+
let config;
|
|
520
|
+
switch (method) {
|
|
521
|
+
case 'get':
|
|
522
|
+
case 'put':
|
|
523
|
+
case 'post':
|
|
524
|
+
case 'patch':
|
|
525
|
+
case 'delete': {
|
|
526
|
+
const theaction = action;
|
|
527
|
+
if (theaction.type === 'Literal') {
|
|
528
|
+
suffix = theaction.value;
|
|
529
|
+
break;
|
|
530
|
+
}
|
|
531
|
+
break;
|
|
532
|
+
}
|
|
533
|
+
case 'stream':
|
|
534
|
+
case 'sse':
|
|
535
|
+
case 'websocket': {
|
|
536
|
+
type = method;
|
|
537
|
+
method = 'post';
|
|
538
|
+
const theaction = action;
|
|
539
|
+
if (theaction.type === 'Literal') {
|
|
540
|
+
suffix = theaction.value;
|
|
541
|
+
break;
|
|
542
|
+
}
|
|
543
|
+
break;
|
|
544
|
+
}
|
|
545
|
+
case 'sms': {
|
|
546
|
+
type = method;
|
|
547
|
+
method = 'post';
|
|
548
|
+
const theaction = action;
|
|
549
|
+
if (theaction.type === 'ObjectExpression') {
|
|
550
|
+
config = {};
|
|
551
|
+
theaction.properties.forEach((p) => {
|
|
552
|
+
if (p.value.type === 'Literal') {
|
|
553
|
+
const literal = p.value;
|
|
554
|
+
config[p.key.name] = literal.value;
|
|
555
|
+
}
|
|
556
|
+
});
|
|
557
|
+
const number = theaction.properties.find((p) => p.key.name === 'number');
|
|
558
|
+
if (number && number.value.type === 'Literal') {
|
|
559
|
+
const phoneNumber = number.value;
|
|
560
|
+
suffix = hash(phoneNumber.value);
|
|
561
|
+
break;
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
break;
|
|
565
|
+
}
|
|
566
|
+
case 'email': {
|
|
567
|
+
type = method;
|
|
568
|
+
method = 'post';
|
|
569
|
+
const theaction = action;
|
|
570
|
+
if (theaction.type === 'Literal') {
|
|
571
|
+
const email = theaction.value;
|
|
572
|
+
suffix = hash(email);
|
|
573
|
+
break;
|
|
574
|
+
}
|
|
575
|
+
break;
|
|
576
|
+
}
|
|
577
|
+
case 'cron': {
|
|
578
|
+
type = method;
|
|
579
|
+
method = 'post';
|
|
580
|
+
const theaction = action;
|
|
581
|
+
if (theaction.type === 'Literal') {
|
|
582
|
+
const number = theaction.value;
|
|
583
|
+
suffix = hash(number);
|
|
584
|
+
break;
|
|
585
|
+
}
|
|
586
|
+
break;
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
const thepath = `${routePrefix}/${routeName}/${suffix}`
|
|
590
|
+
.replaceAll(/\/{2,}/g, '/')
|
|
591
|
+
.replaceAll(/\/$/g, '');
|
|
592
|
+
const id = generateRouteId(projectId, deploymentId, type, method, rel, thepath, version);
|
|
593
|
+
routes.push({
|
|
594
|
+
id,
|
|
595
|
+
method: method,
|
|
596
|
+
type: type,
|
|
597
|
+
filename: rel,
|
|
598
|
+
path: thepath,
|
|
599
|
+
version,
|
|
600
|
+
config,
|
|
601
|
+
});
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
return routes;
|
|
607
|
+
}
|
|
608
|
+
//# sourceMappingURL=ast.js.map
|