@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.
Files changed (299) hide show
  1. package/dist/api.js +68 -0
  2. package/dist/api.js.map +1 -0
  3. package/dist/auth.js +225 -0
  4. package/dist/auth.js.map +1 -0
  5. package/dist/banner.js +35 -0
  6. package/dist/banner.js.map +1 -0
  7. package/dist/cli-logger.js +72 -0
  8. package/dist/cli-logger.js.map +1 -0
  9. package/dist/cli.js +822 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/cmd/ai/capabilities/index.js +10 -0
  12. package/dist/cmd/ai/capabilities/index.js.map +1 -0
  13. package/dist/cmd/ai/capabilities/show.js +221 -0
  14. package/dist/cmd/ai/capabilities/show.js.map +1 -0
  15. package/dist/cmd/ai/index.js +11 -0
  16. package/dist/cmd/ai/index.js.map +1 -0
  17. package/dist/cmd/ai/prompt/index.js +10 -0
  18. package/dist/cmd/ai/prompt/index.js.map +1 -0
  19. package/dist/cmd/ai/prompt/llm.js +365 -0
  20. package/dist/cmd/ai/prompt/llm.js.map +1 -0
  21. package/dist/cmd/ai/schema/index.js +10 -0
  22. package/dist/cmd/ai/schema/index.js.map +1 -0
  23. package/dist/cmd/ai/schema/show.js +23 -0
  24. package/dist/cmd/ai/schema/show.js.map +1 -0
  25. package/dist/cmd/auth/api.js +85 -0
  26. package/dist/cmd/auth/api.js.map +1 -0
  27. package/dist/cmd/auth/index.js +13 -0
  28. package/dist/cmd/auth/index.js.map +1 -0
  29. package/dist/cmd/auth/login.js +84 -0
  30. package/dist/cmd/auth/login.js.map +1 -0
  31. package/dist/cmd/auth/logout.js +17 -0
  32. package/dist/cmd/auth/logout.js.map +1 -0
  33. package/dist/cmd/auth/signup.js +55 -0
  34. package/dist/cmd/auth/signup.js.map +1 -0
  35. package/dist/cmd/auth/ssh/add.js +239 -0
  36. package/dist/cmd/auth/ssh/add.js.map +1 -0
  37. package/dist/cmd/auth/ssh/api.js +53 -0
  38. package/dist/cmd/auth/ssh/api.js.map +1 -0
  39. package/dist/cmd/auth/ssh/delete.js +126 -0
  40. package/dist/cmd/auth/ssh/delete.js.map +1 -0
  41. package/dist/cmd/auth/ssh/index.js +11 -0
  42. package/dist/cmd/auth/ssh/index.js.map +1 -0
  43. package/dist/cmd/auth/ssh/list.js +70 -0
  44. package/dist/cmd/auth/ssh/list.js.map +1 -0
  45. package/dist/cmd/auth/whoami.js +68 -0
  46. package/dist/cmd/auth/whoami.js.map +1 -0
  47. package/dist/cmd/build/ast.js +608 -0
  48. package/dist/cmd/build/ast.js.map +1 -0
  49. package/dist/cmd/build/ast.test.js +389 -0
  50. package/dist/cmd/build/ast.test.js.map +1 -0
  51. package/dist/cmd/build/bundler.js +304 -0
  52. package/dist/cmd/build/bundler.js.map +1 -0
  53. package/dist/cmd/build/file.js +10 -0
  54. package/dist/cmd/build/file.js.map +1 -0
  55. package/dist/cmd/build/fix-duplicate-exports.js +167 -0
  56. package/dist/cmd/build/fix-duplicate-exports.js.map +1 -0
  57. package/dist/cmd/build/fix-duplicate-exports.test.js +300 -0
  58. package/dist/cmd/build/fix-duplicate-exports.test.js.map +1 -0
  59. package/dist/cmd/build/index.d.ts.map +1 -1
  60. package/dist/cmd/build/index.js +79 -0
  61. package/dist/cmd/build/index.js.map +1 -0
  62. package/dist/cmd/build/patch/_util.js +42 -0
  63. package/dist/cmd/build/patch/_util.js.map +1 -0
  64. package/dist/cmd/build/patch/aisdk.js +65 -0
  65. package/dist/cmd/build/patch/aisdk.js.map +1 -0
  66. package/dist/cmd/build/patch/index.js +97 -0
  67. package/dist/cmd/build/patch/index.js.map +1 -0
  68. package/dist/cmd/build/patch/llm.js +18 -0
  69. package/dist/cmd/build/patch/llm.js.map +1 -0
  70. package/dist/cmd/build/plugin.d.ts.map +1 -1
  71. package/dist/cmd/build/plugin.js +556 -0
  72. package/dist/cmd/build/plugin.js.map +1 -0
  73. package/dist/cmd/cloud/agents/index.js +133 -0
  74. package/dist/cmd/cloud/agents/index.js.map +1 -0
  75. package/dist/cmd/cloud/deploy.js +341 -0
  76. package/dist/cmd/cloud/deploy.js.map +1 -0
  77. package/dist/cmd/cloud/deployment/index.js +20 -0
  78. package/dist/cmd/cloud/deployment/index.js.map +1 -0
  79. package/dist/cmd/cloud/deployment/list.js +89 -0
  80. package/dist/cmd/cloud/deployment/list.js.map +1 -0
  81. package/dist/cmd/cloud/deployment/remove.js +60 -0
  82. package/dist/cmd/cloud/deployment/remove.js.map +1 -0
  83. package/dist/cmd/cloud/deployment/rollback.js +80 -0
  84. package/dist/cmd/cloud/deployment/rollback.js.map +1 -0
  85. package/dist/cmd/cloud/deployment/show.js +106 -0
  86. package/dist/cmd/cloud/deployment/show.js.map +1 -0
  87. package/dist/cmd/cloud/deployment/undeploy.js +45 -0
  88. package/dist/cmd/cloud/deployment/undeploy.js.map +1 -0
  89. package/dist/cmd/cloud/deployment/utils.js +10 -0
  90. package/dist/cmd/cloud/deployment/utils.js.map +1 -0
  91. package/dist/cmd/cloud/domain.js +77 -0
  92. package/dist/cmd/cloud/domain.js.map +1 -0
  93. package/dist/cmd/cloud/env/delete.js +50 -0
  94. package/dist/cmd/cloud/env/delete.js.map +1 -0
  95. package/dist/cmd/cloud/env/get.js +65 -0
  96. package/dist/cmd/cloud/env/get.js.map +1 -0
  97. package/dist/cmd/cloud/env/import.js +113 -0
  98. package/dist/cmd/cloud/env/import.js.map +1 -0
  99. package/dist/cmd/cloud/env/index.js +24 -0
  100. package/dist/cmd/cloud/env/index.js.map +1 -0
  101. package/dist/cmd/cloud/env/list.js +58 -0
  102. package/dist/cmd/cloud/env/list.js.map +1 -0
  103. package/dist/cmd/cloud/env/pull.js +81 -0
  104. package/dist/cmd/cloud/env/pull.js.map +1 -0
  105. package/dist/cmd/cloud/env/push.js +61 -0
  106. package/dist/cmd/cloud/env/push.js.map +1 -0
  107. package/dist/cmd/cloud/env/set.js +73 -0
  108. package/dist/cmd/cloud/env/set.js.map +1 -0
  109. package/dist/cmd/cloud/index.js +31 -0
  110. package/dist/cmd/cloud/index.js.map +1 -0
  111. package/dist/cmd/cloud/keyvalue/create-namespace.js +41 -0
  112. package/dist/cmd/cloud/keyvalue/create-namespace.js.map +1 -0
  113. package/dist/cmd/cloud/keyvalue/delete-namespace.js +64 -0
  114. package/dist/cmd/cloud/keyvalue/delete-namespace.js.map +1 -0
  115. package/dist/cmd/cloud/keyvalue/delete.js +47 -0
  116. package/dist/cmd/cloud/keyvalue/delete.js.map +1 -0
  117. package/dist/cmd/cloud/keyvalue/get.js +65 -0
  118. package/dist/cmd/cloud/keyvalue/get.js.map +1 -0
  119. package/dist/cmd/cloud/keyvalue/index.js +32 -0
  120. package/dist/cmd/cloud/keyvalue/index.js.map +1 -0
  121. package/dist/cmd/cloud/keyvalue/keys.js +50 -0
  122. package/dist/cmd/cloud/keyvalue/keys.js.map +1 -0
  123. package/dist/cmd/cloud/keyvalue/list-namespaces.js +37 -0
  124. package/dist/cmd/cloud/keyvalue/list-namespaces.js.map +1 -0
  125. package/dist/cmd/cloud/keyvalue/repl.js +277 -0
  126. package/dist/cmd/cloud/keyvalue/repl.js.map +1 -0
  127. package/dist/cmd/cloud/keyvalue/search.js +72 -0
  128. package/dist/cmd/cloud/keyvalue/search.js.map +1 -0
  129. package/dist/cmd/cloud/keyvalue/set.js +59 -0
  130. package/dist/cmd/cloud/keyvalue/set.js.map +1 -0
  131. package/dist/cmd/cloud/keyvalue/stats.js +82 -0
  132. package/dist/cmd/cloud/keyvalue/stats.js.map +1 -0
  133. package/dist/cmd/cloud/keyvalue/util.js +19 -0
  134. package/dist/cmd/cloud/keyvalue/util.js.map +1 -0
  135. package/dist/cmd/cloud/objectstore/delete-bucket.js +66 -0
  136. package/dist/cmd/cloud/objectstore/delete-bucket.js.map +1 -0
  137. package/dist/cmd/cloud/objectstore/delete.js +56 -0
  138. package/dist/cmd/cloud/objectstore/delete.js.map +1 -0
  139. package/dist/cmd/cloud/objectstore/get.js +64 -0
  140. package/dist/cmd/cloud/objectstore/get.js.map +1 -0
  141. package/dist/cmd/cloud/objectstore/index.js +28 -0
  142. package/dist/cmd/cloud/objectstore/index.js.map +1 -0
  143. package/dist/cmd/cloud/objectstore/list-buckets.js +37 -0
  144. package/dist/cmd/cloud/objectstore/list-buckets.js.map +1 -0
  145. package/dist/cmd/cloud/objectstore/list-keys.js +52 -0
  146. package/dist/cmd/cloud/objectstore/list-keys.js.map +1 -0
  147. package/dist/cmd/cloud/objectstore/put.js +57 -0
  148. package/dist/cmd/cloud/objectstore/put.js.map +1 -0
  149. package/dist/cmd/cloud/objectstore/repl.js +219 -0
  150. package/dist/cmd/cloud/objectstore/repl.js.map +1 -0
  151. package/dist/cmd/cloud/objectstore/url.js +55 -0
  152. package/dist/cmd/cloud/objectstore/url.js.map +1 -0
  153. package/dist/cmd/cloud/objectstore/util.js +18 -0
  154. package/dist/cmd/cloud/objectstore/util.js.map +1 -0
  155. package/dist/cmd/cloud/resource/add.js +70 -0
  156. package/dist/cmd/cloud/resource/add.js.map +1 -0
  157. package/dist/cmd/cloud/resource/delete.js +126 -0
  158. package/dist/cmd/cloud/resource/delete.js.map +1 -0
  159. package/dist/cmd/cloud/resource/index.js +12 -0
  160. package/dist/cmd/cloud/resource/index.js.map +1 -0
  161. package/dist/cmd/cloud/resource/list.js +89 -0
  162. package/dist/cmd/cloud/resource/list.js.map +1 -0
  163. package/dist/cmd/cloud/scp/download.js +72 -0
  164. package/dist/cmd/cloud/scp/download.js.map +1 -0
  165. package/dist/cmd/cloud/scp/index.js +10 -0
  166. package/dist/cmd/cloud/scp/index.js.map +1 -0
  167. package/dist/cmd/cloud/scp/upload.js +75 -0
  168. package/dist/cmd/cloud/scp/upload.js.map +1 -0
  169. package/dist/cmd/cloud/secret/delete.js +50 -0
  170. package/dist/cmd/cloud/secret/delete.js.map +1 -0
  171. package/dist/cmd/cloud/secret/get.js +69 -0
  172. package/dist/cmd/cloud/secret/get.js.map +1 -0
  173. package/dist/cmd/cloud/secret/import.js +88 -0
  174. package/dist/cmd/cloud/secret/import.js.map +1 -0
  175. package/dist/cmd/cloud/secret/index.js +24 -0
  176. package/dist/cmd/cloud/secret/index.js.map +1 -0
  177. package/dist/cmd/cloud/secret/list.js +58 -0
  178. package/dist/cmd/cloud/secret/list.js.map +1 -0
  179. package/dist/cmd/cloud/secret/pull.js +81 -0
  180. package/dist/cmd/cloud/secret/pull.js.map +1 -0
  181. package/dist/cmd/cloud/secret/push.js +61 -0
  182. package/dist/cmd/cloud/secret/push.js.map +1 -0
  183. package/dist/cmd/cloud/secret/set.js +57 -0
  184. package/dist/cmd/cloud/secret/set.js.map +1 -0
  185. package/dist/cmd/cloud/session/get.d.ts.map +1 -1
  186. package/dist/cmd/cloud/session/get.js +155 -0
  187. package/dist/cmd/cloud/session/get.js.map +1 -0
  188. package/dist/cmd/cloud/session/index.js +11 -0
  189. package/dist/cmd/cloud/session/index.js.map +1 -0
  190. package/dist/cmd/cloud/session/list.js +132 -0
  191. package/dist/cmd/cloud/session/list.js.map +1 -0
  192. package/dist/cmd/cloud/session/logs.js +56 -0
  193. package/dist/cmd/cloud/session/logs.js.map +1 -0
  194. package/dist/cmd/cloud/ssh.js +67 -0
  195. package/dist/cmd/cloud/ssh.js.map +1 -0
  196. package/dist/cmd/dev/agents.js +103 -0
  197. package/dist/cmd/dev/agents.js.map +1 -0
  198. package/dist/cmd/dev/api.js +26 -0
  199. package/dist/cmd/dev/api.js.map +1 -0
  200. package/dist/cmd/dev/download.js +77 -0
  201. package/dist/cmd/dev/download.js.map +1 -0
  202. package/dist/cmd/dev/index.js +745 -0
  203. package/dist/cmd/dev/index.js.map +1 -0
  204. package/dist/cmd/dev/sync.js +229 -0
  205. package/dist/cmd/dev/sync.js.map +1 -0
  206. package/dist/cmd/dev/templates.js +75 -0
  207. package/dist/cmd/dev/templates.js.map +1 -0
  208. package/dist/cmd/index.js +49 -0
  209. package/dist/cmd/index.js.map +1 -0
  210. package/dist/cmd/profile/create.js +89 -0
  211. package/dist/cmd/profile/create.js.map +1 -0
  212. package/dist/cmd/profile/delete.js +63 -0
  213. package/dist/cmd/profile/delete.js.map +1 -0
  214. package/dist/cmd/profile/index.js +14 -0
  215. package/dist/cmd/profile/index.js.map +1 -0
  216. package/dist/cmd/profile/list.js +28 -0
  217. package/dist/cmd/profile/list.js.map +1 -0
  218. package/dist/cmd/profile/show.js +68 -0
  219. package/dist/cmd/profile/show.js.map +1 -0
  220. package/dist/cmd/profile/use.js +37 -0
  221. package/dist/cmd/profile/use.js.map +1 -0
  222. package/dist/cmd/project/create.js +92 -0
  223. package/dist/cmd/project/create.js.map +1 -0
  224. package/dist/cmd/project/delete.js +117 -0
  225. package/dist/cmd/project/delete.js.map +1 -0
  226. package/dist/cmd/project/download.js +217 -0
  227. package/dist/cmd/project/download.js.map +1 -0
  228. package/dist/cmd/project/index.js +12 -0
  229. package/dist/cmd/project/index.js.map +1 -0
  230. package/dist/cmd/project/list.js +51 -0
  231. package/dist/cmd/project/list.js.map +1 -0
  232. package/dist/cmd/project/show.js +54 -0
  233. package/dist/cmd/project/show.js.map +1 -0
  234. package/dist/cmd/project/template-flow.js +315 -0
  235. package/dist/cmd/project/template-flow.js.map +1 -0
  236. package/dist/cmd/project/templates.js +31 -0
  237. package/dist/cmd/project/templates.js.map +1 -0
  238. package/dist/cmd/repl/index.js +444 -0
  239. package/dist/cmd/repl/index.js.map +1 -0
  240. package/dist/cmd/version/index.js +29 -0
  241. package/dist/cmd/version/index.js.map +1 -0
  242. package/dist/command-prefix.js +37 -0
  243. package/dist/command-prefix.js.map +1 -0
  244. package/dist/config.js +536 -0
  245. package/dist/config.js.map +1 -0
  246. package/dist/crypto/box.js +382 -0
  247. package/dist/crypto/box.js.map +1 -0
  248. package/dist/crypto/box.test.js +317 -0
  249. package/dist/crypto/box.test.js.map +1 -0
  250. package/dist/download.js +64 -0
  251. package/dist/download.js.map +1 -0
  252. package/dist/env-util.js +219 -0
  253. package/dist/env-util.js.map +1 -0
  254. package/dist/env-util.test.js +146 -0
  255. package/dist/env-util.test.js.map +1 -0
  256. package/dist/errors.js +177 -0
  257. package/dist/errors.js.map +1 -0
  258. package/dist/explain.js +90 -0
  259. package/dist/explain.js.map +1 -0
  260. package/dist/index.js +23 -0
  261. package/dist/index.js.map +1 -0
  262. package/dist/json.js +29 -0
  263. package/dist/json.js.map +1 -0
  264. package/dist/legacy-check.js +104 -0
  265. package/dist/legacy-check.js.map +1 -0
  266. package/dist/output.js +207 -0
  267. package/dist/output.js.map +1 -0
  268. package/dist/repl.js +1176 -0
  269. package/dist/repl.js.map +1 -0
  270. package/dist/runtime.js +19 -0
  271. package/dist/runtime.js.map +1 -0
  272. package/dist/schema-generator.js +289 -0
  273. package/dist/schema-generator.js.map +1 -0
  274. package/dist/schema-parser.js +145 -0
  275. package/dist/schema-parser.js.map +1 -0
  276. package/dist/sound.js +44 -0
  277. package/dist/sound.js.map +1 -0
  278. package/dist/steps.js +293 -0
  279. package/dist/steps.js.map +1 -0
  280. package/dist/terminal.js +130 -0
  281. package/dist/terminal.js.map +1 -0
  282. package/dist/tui.js +1124 -0
  283. package/dist/tui.js.map +1 -0
  284. package/dist/types.js +163 -0
  285. package/dist/types.js.map +1 -0
  286. package/dist/utils/detectSubagent.js +25 -0
  287. package/dist/utils/detectSubagent.js.map +1 -0
  288. package/dist/utils/format.js +21 -0
  289. package/dist/utils/format.js.map +1 -0
  290. package/dist/utils/zip.js +33 -0
  291. package/dist/utils/zip.js.map +1 -0
  292. package/dist/version.js +24 -0
  293. package/dist/version.js.map +1 -0
  294. package/package.json +6 -6
  295. package/src/banner.ts +1 -1
  296. package/src/cmd/build/index.ts +15 -21
  297. package/src/cmd/build/plugin.ts +2 -1
  298. package/src/cmd/cloud/session/get.ts +20 -14
  299. 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