@agentuity/cli 0.0.49 → 0.0.51

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 (319) hide show
  1. package/AGENTS.md +17 -4
  2. package/README.md +26 -8
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cmd/{capabilities → ai/capabilities}/index.d.ts +1 -1
  5. package/dist/cmd/ai/capabilities/index.d.ts.map +1 -0
  6. package/dist/cmd/{capabilities → ai/capabilities}/show.d.ts +1 -1
  7. package/dist/cmd/ai/capabilities/show.d.ts.map +1 -0
  8. package/dist/cmd/ai/index.d.ts.map +1 -0
  9. package/dist/cmd/ai/prompt/index.d.ts +4 -0
  10. package/dist/cmd/ai/prompt/index.d.ts.map +1 -0
  11. package/dist/cmd/ai/prompt/llm.d.ts +3 -0
  12. package/dist/cmd/ai/prompt/llm.d.ts.map +1 -0
  13. package/dist/cmd/ai/schema/index.d.ts +4 -0
  14. package/dist/cmd/ai/schema/index.d.ts.map +1 -0
  15. package/dist/cmd/ai/schema/show.d.ts +3 -0
  16. package/dist/cmd/ai/schema/show.d.ts.map +1 -0
  17. package/dist/cmd/auth/ssh/list.d.ts.map +1 -1
  18. package/dist/cmd/{bundle → build}/ast.d.ts +3 -1
  19. package/dist/cmd/build/ast.d.ts.map +1 -0
  20. package/dist/cmd/{bundle → build}/ast.test.d.ts.map +1 -1
  21. package/dist/cmd/build/bundler.d.ts.map +1 -0
  22. package/dist/cmd/build/file.d.ts.map +1 -0
  23. package/dist/cmd/build/fix-duplicate-exports.d.ts.map +1 -0
  24. package/dist/cmd/build/fix-duplicate-exports.test.d.ts.map +1 -0
  25. package/dist/cmd/build/index.d.ts.map +1 -0
  26. package/dist/cmd/build/patch/_util.d.ts.map +1 -0
  27. package/dist/cmd/build/patch/aisdk.d.ts.map +1 -0
  28. package/dist/cmd/build/patch/index.d.ts.map +1 -0
  29. package/dist/cmd/build/patch/llm.d.ts.map +1 -0
  30. package/dist/cmd/build/plugin.d.ts.map +1 -0
  31. package/dist/cmd/cloud/agents/index.d.ts +3 -0
  32. package/dist/cmd/cloud/agents/index.d.ts.map +1 -0
  33. package/dist/cmd/cloud/deployment/list.d.ts.map +1 -1
  34. package/dist/cmd/cloud/env/delete.d.ts +2 -0
  35. package/dist/cmd/cloud/env/delete.d.ts.map +1 -0
  36. package/dist/cmd/cloud/env/get.d.ts +2 -0
  37. package/dist/cmd/cloud/env/get.d.ts.map +1 -0
  38. package/dist/cmd/cloud/env/import.d.ts +2 -0
  39. package/dist/cmd/cloud/env/import.d.ts.map +1 -0
  40. package/dist/cmd/cloud/env/index.d.ts +3 -0
  41. package/dist/cmd/cloud/env/index.d.ts.map +1 -0
  42. package/dist/cmd/cloud/env/list.d.ts +2 -0
  43. package/dist/cmd/cloud/env/list.d.ts.map +1 -0
  44. package/dist/cmd/cloud/env/pull.d.ts +2 -0
  45. package/dist/cmd/cloud/env/pull.d.ts.map +1 -0
  46. package/dist/cmd/cloud/env/push.d.ts +2 -0
  47. package/dist/cmd/cloud/env/push.d.ts.map +1 -0
  48. package/dist/cmd/cloud/env/set.d.ts +2 -0
  49. package/dist/cmd/cloud/env/set.d.ts.map +1 -0
  50. package/dist/cmd/cloud/index.d.ts.map +1 -1
  51. package/dist/cmd/cloud/keyvalue/create-namespace.d.ts +3 -0
  52. package/dist/cmd/cloud/keyvalue/create-namespace.d.ts.map +1 -0
  53. package/dist/cmd/cloud/keyvalue/delete-namespace.d.ts +3 -0
  54. package/dist/cmd/cloud/keyvalue/delete-namespace.d.ts.map +1 -0
  55. package/dist/cmd/cloud/keyvalue/delete.d.ts +3 -0
  56. package/dist/cmd/cloud/keyvalue/delete.d.ts.map +1 -0
  57. package/dist/cmd/cloud/keyvalue/get.d.ts +3 -0
  58. package/dist/cmd/cloud/keyvalue/get.d.ts.map +1 -0
  59. package/dist/cmd/cloud/keyvalue/index.d.ts +3 -0
  60. package/dist/cmd/cloud/keyvalue/index.d.ts.map +1 -0
  61. package/dist/cmd/cloud/keyvalue/keys.d.ts +3 -0
  62. package/dist/cmd/cloud/keyvalue/keys.d.ts.map +1 -0
  63. package/dist/cmd/cloud/keyvalue/list-namespaces.d.ts +3 -0
  64. package/dist/cmd/cloud/keyvalue/list-namespaces.d.ts.map +1 -0
  65. package/dist/cmd/cloud/keyvalue/repl.d.ts +3 -0
  66. package/dist/cmd/cloud/keyvalue/repl.d.ts.map +1 -0
  67. package/dist/cmd/cloud/keyvalue/search.d.ts +3 -0
  68. package/dist/cmd/cloud/keyvalue/search.d.ts.map +1 -0
  69. package/dist/cmd/cloud/keyvalue/set.d.ts +3 -0
  70. package/dist/cmd/cloud/keyvalue/set.d.ts.map +1 -0
  71. package/dist/cmd/cloud/keyvalue/stats.d.ts +3 -0
  72. package/dist/cmd/cloud/keyvalue/stats.d.ts.map +1 -0
  73. package/dist/cmd/{kv → cloud/keyvalue}/util.d.ts +1 -1
  74. package/dist/cmd/cloud/keyvalue/util.d.ts.map +1 -0
  75. package/dist/cmd/cloud/objectstore/delete-bucket.d.ts +3 -0
  76. package/dist/cmd/cloud/objectstore/delete-bucket.d.ts.map +1 -0
  77. package/dist/cmd/cloud/objectstore/delete.d.ts +3 -0
  78. package/dist/cmd/cloud/objectstore/delete.d.ts.map +1 -0
  79. package/dist/cmd/cloud/objectstore/get.d.ts +3 -0
  80. package/dist/cmd/cloud/objectstore/get.d.ts.map +1 -0
  81. package/dist/cmd/cloud/objectstore/index.d.ts +3 -0
  82. package/dist/cmd/cloud/objectstore/index.d.ts.map +1 -0
  83. package/dist/cmd/cloud/objectstore/list-buckets.d.ts +3 -0
  84. package/dist/cmd/cloud/objectstore/list-buckets.d.ts.map +1 -0
  85. package/dist/cmd/cloud/objectstore/list-keys.d.ts +3 -0
  86. package/dist/cmd/cloud/objectstore/list-keys.d.ts.map +1 -0
  87. package/dist/cmd/cloud/objectstore/put.d.ts +3 -0
  88. package/dist/cmd/cloud/objectstore/put.d.ts.map +1 -0
  89. package/dist/cmd/cloud/objectstore/repl.d.ts +3 -0
  90. package/dist/cmd/cloud/objectstore/repl.d.ts.map +1 -0
  91. package/dist/cmd/cloud/objectstore/url.d.ts +3 -0
  92. package/dist/cmd/cloud/objectstore/url.d.ts.map +1 -0
  93. package/dist/cmd/{objectstore → cloud/objectstore}/util.d.ts +1 -1
  94. package/dist/cmd/cloud/objectstore/util.d.ts.map +1 -0
  95. package/dist/cmd/cloud/secret/delete.d.ts +2 -0
  96. package/dist/cmd/cloud/secret/delete.d.ts.map +1 -0
  97. package/dist/cmd/cloud/secret/get.d.ts +2 -0
  98. package/dist/cmd/cloud/secret/get.d.ts.map +1 -0
  99. package/dist/cmd/cloud/secret/import.d.ts +2 -0
  100. package/dist/cmd/cloud/secret/import.d.ts.map +1 -0
  101. package/dist/cmd/cloud/secret/index.d.ts +3 -0
  102. package/dist/cmd/cloud/secret/index.d.ts.map +1 -0
  103. package/dist/cmd/cloud/secret/list.d.ts +2 -0
  104. package/dist/cmd/cloud/secret/list.d.ts.map +1 -0
  105. package/dist/cmd/cloud/secret/pull.d.ts +2 -0
  106. package/dist/cmd/cloud/secret/pull.d.ts.map +1 -0
  107. package/dist/cmd/cloud/secret/push.d.ts +2 -0
  108. package/dist/cmd/cloud/secret/push.d.ts.map +1 -0
  109. package/dist/cmd/cloud/secret/set.d.ts +2 -0
  110. package/dist/cmd/cloud/secret/set.d.ts.map +1 -0
  111. package/dist/cmd/cloud/session/get.d.ts +2 -0
  112. package/dist/cmd/cloud/session/get.d.ts.map +1 -0
  113. package/dist/cmd/cloud/session/index.d.ts +2 -0
  114. package/dist/cmd/cloud/session/index.d.ts.map +1 -0
  115. package/dist/cmd/cloud/session/list.d.ts +2 -0
  116. package/dist/cmd/cloud/session/list.d.ts.map +1 -0
  117. package/dist/cmd/cloud/session/logs.d.ts +2 -0
  118. package/dist/cmd/cloud/session/logs.d.ts.map +1 -0
  119. package/dist/cmd/dev/agents.d.ts +2 -0
  120. package/dist/cmd/dev/agents.d.ts.map +1 -0
  121. package/dist/cmd/dev/index.d.ts.map +1 -1
  122. package/dist/cmd/dev/sync.d.ts +12 -0
  123. package/dist/cmd/dev/sync.d.ts.map +1 -0
  124. package/dist/cmd/profile/index.d.ts.map +1 -1
  125. package/dist/repl.d.ts +2 -6
  126. package/dist/repl.d.ts.map +1 -1
  127. package/dist/tui.d.ts +24 -0
  128. package/dist/tui.d.ts.map +1 -1
  129. package/dist/types.d.ts +12 -0
  130. package/dist/types.d.ts.map +1 -1
  131. package/dist/utils/format.d.ts +9 -0
  132. package/dist/utils/format.d.ts.map +1 -0
  133. package/package.json +6 -3
  134. package/src/cli.ts +13 -6
  135. package/src/cmd/{capabilities → ai/capabilities}/index.ts +2 -2
  136. package/src/cmd/{capabilities → ai/capabilities}/show.ts +6 -6
  137. package/src/cmd/ai/index.ts +11 -0
  138. package/src/cmd/{prompt → ai/prompt}/index.ts +2 -2
  139. package/src/cmd/{prompt → ai/prompt}/llm.ts +6 -6
  140. package/src/cmd/{schema → ai/schema}/index.ts +2 -2
  141. package/src/cmd/{schema → ai/schema}/show.ts +3 -3
  142. package/src/cmd/auth/ssh/list.ts +10 -16
  143. package/src/cmd/{bundle → build}/ast.test.ts +2 -2
  144. package/src/cmd/{bundle → build}/ast.ts +85 -17
  145. package/src/cmd/build/index.ts +89 -0
  146. package/src/cmd/{bundle → build}/plugin.ts +24 -2
  147. package/src/cmd/cloud/agents/index.ts +148 -0
  148. package/src/cmd/cloud/deploy.ts +1 -1
  149. package/src/cmd/cloud/deployment/list.ts +16 -22
  150. package/src/cmd/{env → cloud/env}/delete.ts +4 -4
  151. package/src/cmd/{env → cloud/env}/get.ts +5 -5
  152. package/src/cmd/{env → cloud/env}/import.ts +4 -4
  153. package/src/cmd/{env → cloud/env}/index.ts +2 -1
  154. package/src/cmd/{env → cloud/env}/list.ts +4 -4
  155. package/src/cmd/{env → cloud/env}/pull.ts +4 -4
  156. package/src/cmd/{env → cloud/env}/push.ts +4 -4
  157. package/src/cmd/{env → cloud/env}/set.ts +4 -4
  158. package/src/cmd/cloud/index.ts +12 -0
  159. package/src/cmd/{kv → cloud/keyvalue}/create-namespace.ts +3 -3
  160. package/src/cmd/{kv → cloud/keyvalue}/delete-namespace.ts +4 -4
  161. package/src/cmd/{kv → cloud/keyvalue}/delete.ts +3 -3
  162. package/src/cmd/{kv → cloud/keyvalue}/get.ts +4 -4
  163. package/src/cmd/{kv → cloud/keyvalue}/index.ts +2 -1
  164. package/src/cmd/{kv → cloud/keyvalue}/keys.ts +3 -3
  165. package/src/cmd/{kv → cloud/keyvalue}/list-namespaces.ts +3 -3
  166. package/src/cmd/{kv → cloud/keyvalue}/repl.ts +6 -6
  167. package/src/cmd/{kv → cloud/keyvalue}/search.ts +3 -3
  168. package/src/cmd/{kv → cloud/keyvalue}/set.ts +4 -4
  169. package/src/cmd/{kv → cloud/keyvalue}/stats.ts +3 -3
  170. package/src/cmd/{kv → cloud/keyvalue}/util.ts +4 -4
  171. package/src/cmd/{objectstore → cloud/objectstore}/delete-bucket.ts +3 -3
  172. package/src/cmd/{objectstore → cloud/objectstore}/delete.ts +3 -3
  173. package/src/cmd/{objectstore → cloud/objectstore}/get.ts +4 -4
  174. package/src/cmd/{objectstore → cloud/objectstore}/index.ts +2 -1
  175. package/src/cmd/{objectstore → cloud/objectstore}/list-buckets.ts +3 -3
  176. package/src/cmd/{objectstore → cloud/objectstore}/list-keys.ts +3 -3
  177. package/src/cmd/{objectstore → cloud/objectstore}/put.ts +4 -4
  178. package/src/cmd/{objectstore → cloud/objectstore}/repl.ts +6 -6
  179. package/src/cmd/{objectstore → cloud/objectstore}/url.ts +3 -3
  180. package/src/cmd/{objectstore → cloud/objectstore}/util.ts +3 -3
  181. package/src/cmd/{secret → cloud/secret}/delete.ts +4 -4
  182. package/src/cmd/{secret → cloud/secret}/get.ts +5 -5
  183. package/src/cmd/{secret → cloud/secret}/import.ts +4 -4
  184. package/src/cmd/{secret → cloud/secret}/index.ts +2 -1
  185. package/src/cmd/{secret → cloud/secret}/list.ts +4 -4
  186. package/src/cmd/{secret → cloud/secret}/pull.ts +4 -4
  187. package/src/cmd/{secret → cloud/secret}/push.ts +4 -4
  188. package/src/cmd/{secret → cloud/secret}/set.ts +4 -4
  189. package/src/cmd/cloud/session/get.ts +164 -0
  190. package/src/cmd/cloud/session/index.ts +11 -0
  191. package/src/cmd/cloud/session/list.ts +145 -0
  192. package/src/cmd/cloud/session/logs.ts +68 -0
  193. package/src/cmd/dev/agents.ts +122 -0
  194. package/src/cmd/dev/index.ts +103 -9
  195. package/src/cmd/dev/sync.ts +414 -0
  196. package/src/cmd/profile/index.ts +1 -0
  197. package/src/cmd/project/create.ts +1 -1
  198. package/src/cmd/project/index.ts +1 -1
  199. package/src/cmd/project/list.ts +1 -1
  200. package/src/cmd/project/show.ts +1 -1
  201. package/src/repl.ts +2 -12
  202. package/src/tui.ts +94 -0
  203. package/src/types.ts +13 -10
  204. package/src/utils/format.ts +17 -0
  205. package/dist/cmd/bundle/ast.d.ts.map +0 -1
  206. package/dist/cmd/bundle/bundler.d.ts.map +0 -1
  207. package/dist/cmd/bundle/file.d.ts.map +0 -1
  208. package/dist/cmd/bundle/fix-duplicate-exports.d.ts.map +0 -1
  209. package/dist/cmd/bundle/fix-duplicate-exports.test.d.ts.map +0 -1
  210. package/dist/cmd/bundle/index.d.ts.map +0 -1
  211. package/dist/cmd/bundle/patch/_util.d.ts.map +0 -1
  212. package/dist/cmd/bundle/patch/aisdk.d.ts.map +0 -1
  213. package/dist/cmd/bundle/patch/index.d.ts.map +0 -1
  214. package/dist/cmd/bundle/patch/llm.d.ts.map +0 -1
  215. package/dist/cmd/bundle/plugin.d.ts.map +0 -1
  216. package/dist/cmd/capabilities/index.d.ts.map +0 -1
  217. package/dist/cmd/capabilities/show.d.ts.map +0 -1
  218. package/dist/cmd/env/delete.d.ts +0 -2
  219. package/dist/cmd/env/delete.d.ts.map +0 -1
  220. package/dist/cmd/env/get.d.ts +0 -2
  221. package/dist/cmd/env/get.d.ts.map +0 -1
  222. package/dist/cmd/env/import.d.ts +0 -2
  223. package/dist/cmd/env/import.d.ts.map +0 -1
  224. package/dist/cmd/env/index.d.ts.map +0 -1
  225. package/dist/cmd/env/list.d.ts +0 -2
  226. package/dist/cmd/env/list.d.ts.map +0 -1
  227. package/dist/cmd/env/pull.d.ts +0 -2
  228. package/dist/cmd/env/pull.d.ts.map +0 -1
  229. package/dist/cmd/env/push.d.ts +0 -2
  230. package/dist/cmd/env/push.d.ts.map +0 -1
  231. package/dist/cmd/env/set.d.ts +0 -2
  232. package/dist/cmd/env/set.d.ts.map +0 -1
  233. package/dist/cmd/kv/create-namespace.d.ts +0 -3
  234. package/dist/cmd/kv/create-namespace.d.ts.map +0 -1
  235. package/dist/cmd/kv/delete-namespace.d.ts +0 -3
  236. package/dist/cmd/kv/delete-namespace.d.ts.map +0 -1
  237. package/dist/cmd/kv/delete.d.ts +0 -3
  238. package/dist/cmd/kv/delete.d.ts.map +0 -1
  239. package/dist/cmd/kv/get.d.ts +0 -3
  240. package/dist/cmd/kv/get.d.ts.map +0 -1
  241. package/dist/cmd/kv/index.d.ts +0 -2
  242. package/dist/cmd/kv/index.d.ts.map +0 -1
  243. package/dist/cmd/kv/keys.d.ts +0 -3
  244. package/dist/cmd/kv/keys.d.ts.map +0 -1
  245. package/dist/cmd/kv/list-namespaces.d.ts +0 -3
  246. package/dist/cmd/kv/list-namespaces.d.ts.map +0 -1
  247. package/dist/cmd/kv/repl.d.ts +0 -3
  248. package/dist/cmd/kv/repl.d.ts.map +0 -1
  249. package/dist/cmd/kv/search.d.ts +0 -3
  250. package/dist/cmd/kv/search.d.ts.map +0 -1
  251. package/dist/cmd/kv/set.d.ts +0 -3
  252. package/dist/cmd/kv/set.d.ts.map +0 -1
  253. package/dist/cmd/kv/stats.d.ts +0 -3
  254. package/dist/cmd/kv/stats.d.ts.map +0 -1
  255. package/dist/cmd/kv/util.d.ts.map +0 -1
  256. package/dist/cmd/objectstore/delete-bucket.d.ts +0 -3
  257. package/dist/cmd/objectstore/delete-bucket.d.ts.map +0 -1
  258. package/dist/cmd/objectstore/delete.d.ts +0 -3
  259. package/dist/cmd/objectstore/delete.d.ts.map +0 -1
  260. package/dist/cmd/objectstore/get.d.ts +0 -3
  261. package/dist/cmd/objectstore/get.d.ts.map +0 -1
  262. package/dist/cmd/objectstore/index.d.ts +0 -2
  263. package/dist/cmd/objectstore/index.d.ts.map +0 -1
  264. package/dist/cmd/objectstore/list-buckets.d.ts +0 -3
  265. package/dist/cmd/objectstore/list-buckets.d.ts.map +0 -1
  266. package/dist/cmd/objectstore/list-keys.d.ts +0 -3
  267. package/dist/cmd/objectstore/list-keys.d.ts.map +0 -1
  268. package/dist/cmd/objectstore/put.d.ts +0 -3
  269. package/dist/cmd/objectstore/put.d.ts.map +0 -1
  270. package/dist/cmd/objectstore/repl.d.ts +0 -3
  271. package/dist/cmd/objectstore/repl.d.ts.map +0 -1
  272. package/dist/cmd/objectstore/url.d.ts +0 -3
  273. package/dist/cmd/objectstore/url.d.ts.map +0 -1
  274. package/dist/cmd/objectstore/util.d.ts.map +0 -1
  275. package/dist/cmd/prompt/index.d.ts +0 -4
  276. package/dist/cmd/prompt/index.d.ts.map +0 -1
  277. package/dist/cmd/prompt/llm.d.ts +0 -3
  278. package/dist/cmd/prompt/llm.d.ts.map +0 -1
  279. package/dist/cmd/schema/index.d.ts +0 -4
  280. package/dist/cmd/schema/index.d.ts.map +0 -1
  281. package/dist/cmd/schema/show.d.ts +0 -3
  282. package/dist/cmd/schema/show.d.ts.map +0 -1
  283. package/dist/cmd/secret/delete.d.ts +0 -2
  284. package/dist/cmd/secret/delete.d.ts.map +0 -1
  285. package/dist/cmd/secret/get.d.ts +0 -2
  286. package/dist/cmd/secret/get.d.ts.map +0 -1
  287. package/dist/cmd/secret/import.d.ts +0 -2
  288. package/dist/cmd/secret/import.d.ts.map +0 -1
  289. package/dist/cmd/secret/index.d.ts +0 -2
  290. package/dist/cmd/secret/index.d.ts.map +0 -1
  291. package/dist/cmd/secret/list.d.ts +0 -2
  292. package/dist/cmd/secret/list.d.ts.map +0 -1
  293. package/dist/cmd/secret/pull.d.ts +0 -2
  294. package/dist/cmd/secret/pull.d.ts.map +0 -1
  295. package/dist/cmd/secret/push.d.ts +0 -2
  296. package/dist/cmd/secret/push.d.ts.map +0 -1
  297. package/dist/cmd/secret/set.d.ts +0 -2
  298. package/dist/cmd/secret/set.d.ts.map +0 -1
  299. package/src/cmd/bundle/index.ts +0 -58
  300. /package/dist/cmd/{bundle → ai}/index.d.ts +0 -0
  301. /package/dist/cmd/{bundle → build}/ast.test.d.ts +0 -0
  302. /package/dist/cmd/{bundle → build}/bundler.d.ts +0 -0
  303. /package/dist/cmd/{bundle → build}/file.d.ts +0 -0
  304. /package/dist/cmd/{bundle → build}/fix-duplicate-exports.d.ts +0 -0
  305. /package/dist/cmd/{bundle → build}/fix-duplicate-exports.test.d.ts +0 -0
  306. /package/dist/cmd/{env → build}/index.d.ts +0 -0
  307. /package/dist/cmd/{bundle → build}/patch/_util.d.ts +0 -0
  308. /package/dist/cmd/{bundle → build}/patch/aisdk.d.ts +0 -0
  309. /package/dist/cmd/{bundle → build}/patch/index.d.ts +0 -0
  310. /package/dist/cmd/{bundle → build}/patch/llm.d.ts +0 -0
  311. /package/dist/cmd/{bundle → build}/plugin.d.ts +0 -0
  312. /package/src/cmd/{bundle → build}/bundler.ts +0 -0
  313. /package/src/cmd/{bundle → build}/file.ts +0 -0
  314. /package/src/cmd/{bundle → build}/fix-duplicate-exports.test.ts +0 -0
  315. /package/src/cmd/{bundle → build}/fix-duplicate-exports.ts +0 -0
  316. /package/src/cmd/{bundle → build}/patch/_util.ts +0 -0
  317. /package/src/cmd/{bundle → build}/patch/aisdk.ts +0 -0
  318. /package/src/cmd/{bundle → build}/patch/index.ts +0 -0
  319. /package/src/cmd/{bundle → build}/patch/llm.ts +0 -0
@@ -0,0 +1,164 @@
1
+ import { z } from 'zod';
2
+ import { createSubcommand } from '../../../types';
3
+ import * as tui from '../../../tui';
4
+ import { sessionGet } from '@agentuity/server';
5
+ import { getCommand } from '../../../command-prefix';
6
+ import { ErrorCode } from '../../../errors';
7
+ import { getCatalystAPIClient } from '../../../config';
8
+
9
+ const SessionGetResponseSchema = z.object({
10
+ id: z.string().describe('Session ID'),
11
+ created_at: z.string().describe('Creation timestamp'),
12
+ start_time: z.string().describe('Start time'),
13
+ end_time: z.string().nullable().describe('End time'),
14
+ duration: z.number().nullable().describe('Duration in nanoseconds'),
15
+ org_id: z.string().describe('Organization ID'),
16
+ project_id: z.string().describe('Project ID'),
17
+ deployment_id: z.string().describe('Deployment ID'),
18
+ agent_ids: z.array(z.string()).describe('Agent IDs'),
19
+ trigger: z.string().describe('Trigger type'),
20
+ env: z.string().describe('Environment'),
21
+ devmode: z.boolean().describe('Dev mode'),
22
+ pending: z.boolean().describe('Pending'),
23
+ success: z.boolean().describe('Success'),
24
+ error: z.string().nullable().describe('Error message'),
25
+ method: z.string().describe('HTTP method'),
26
+ url: z.string().describe('Request URL'),
27
+ route_id: z.string().describe('Route ID'),
28
+ thread_id: z.string().describe('Thread ID'),
29
+ agentNames: z.array(z.string()).describe('Agent names'),
30
+ evalRuns: z.array(z.object({
31
+ id: z.string(),
32
+ created_at: z.string(),
33
+ eval_id: z.string(),
34
+ pending: z.boolean(),
35
+ success: z.boolean(),
36
+ error: z.string().nullable(),
37
+ result: z.string().nullable(),
38
+ })).describe('Eval runs'),
39
+ });
40
+
41
+ export const getSubcommand = createSubcommand({
42
+ name: 'get',
43
+ description: 'Get details about a specific session',
44
+ tags: ['read-only', 'fast', 'requires-auth'],
45
+ examples: [`${getCommand('cloud session get')} sess_abc123xyz`],
46
+ requires: { auth: true },
47
+ idempotent: true,
48
+ schema: {
49
+ args: z.object({
50
+ session_id: z.string().describe('Session ID'),
51
+ }),
52
+ response: SessionGetResponseSchema,
53
+ },
54
+ async handler(ctx) {
55
+ const { config, logger, auth, args, options } = ctx;
56
+ const catalystClient = getCatalystAPIClient(config, logger, auth);
57
+
58
+ try {
59
+ const enriched = await sessionGet(catalystClient, { id: args.session_id });
60
+ const session = enriched.session;
61
+
62
+ const result = {
63
+ id: session.id,
64
+ created_at: session.created_at,
65
+ start_time: session.start_time,
66
+ end_time: session.end_time,
67
+ duration: session.duration,
68
+ org_id: session.org_id,
69
+ project_id: session.project_id,
70
+ deployment_id: session.deployment_id,
71
+ agent_ids: session.agent_ids,
72
+ trigger: session.trigger,
73
+ env: session.env,
74
+ devmode: session.devmode,
75
+ pending: session.pending,
76
+ success: session.success,
77
+ error: session.error,
78
+ method: session.method,
79
+ url: session.url,
80
+ route_id: session.route_id,
81
+ thread_id: session.thread_id,
82
+ agentNames: enriched.agentNames,
83
+ evalRuns: enriched.evalRuns.map(run => ({
84
+ id: run.id,
85
+ eval_id: run.eval_id,
86
+ created_at: run.created_at,
87
+ pending: run.pending,
88
+ success: run.success,
89
+ error: run.error,
90
+ result: run.result,
91
+ })),
92
+ };
93
+
94
+ if (options.json) {
95
+ console.log(JSON.stringify(result, null, 2));
96
+ return result;
97
+ }
98
+
99
+ tui.banner(`Session ${session.id}`, `Status: ${session.success ? 'Success' : 'Failed'}`);
100
+
101
+ console.log(tui.bold('ID: ') + session.id);
102
+ console.log(tui.bold('Project: ') + session.project_id);
103
+ console.log(tui.bold('Deployment: ') + (session.deployment_id || '-'));
104
+ console.log(tui.bold('Created: ') + new Date(session.created_at).toLocaleString());
105
+ console.log(tui.bold('Start: ') + new Date(session.start_time).toLocaleString());
106
+ if (session.end_time) {
107
+ console.log(tui.bold('End: ') + new Date(session.end_time).toLocaleString());
108
+ }
109
+ if (session.duration) {
110
+ console.log(
111
+ tui.bold('Duration: ') + `${(session.duration / 1_000_000).toFixed(0)}ms`
112
+ );
113
+ }
114
+ console.log(tui.bold('Method: ') + session.method);
115
+ console.log(tui.bold('URL: ') + tui.link(session.url, session.url));
116
+ console.log(tui.bold('Trigger: ') + session.trigger);
117
+ console.log(tui.bold('Environment: ') + session.env);
118
+ console.log(tui.bold('Dev Mode: ') + (session.devmode ? 'Yes' : 'No'));
119
+ console.log(tui.bold('Success: ') + (session.success ? '✓' : '✗'));
120
+ console.log(tui.bold('Pending: ') + (session.pending ? 'Yes' : 'No'));
121
+ if (session.error) {
122
+ console.log(tui.bold('Error: ') + tui.error(session.error));
123
+ }
124
+ if (enriched.agentNames.length > 0) {
125
+ const agentDisplay = enriched.agentNames.map((name, idx) => {
126
+ const agentId = session.agent_ids[idx];
127
+ return `${name} ${tui.muted(`(${agentId})`)}`;
128
+ }).join(', ');
129
+ console.log(tui.bold('Agents: ') + agentDisplay);
130
+ }
131
+ console.log(tui.bold('Route ID: ') + session.route_id);
132
+ console.log(tui.bold('Thread ID: ') + session.thread_id);
133
+
134
+ if (enriched.evalRuns.length > 0) {
135
+ console.log('');
136
+ console.log(tui.bold('Eval Runs:'));
137
+ const evalTableData = enriched.evalRuns.map((run) => ({
138
+ ID: run.id,
139
+ 'Eval ID': run.eval_id,
140
+ Success: run.success ? '✓' : '✗',
141
+ Pending: run.pending ? '⏳' : '✓',
142
+ Error: run.error || 'No',
143
+ Created: new Date(run.created_at).toLocaleString(),
144
+ }));
145
+
146
+ tui.table(evalTableData, [
147
+ { name: 'ID', alignment: 'left' },
148
+ { name: 'Eval ID', alignment: 'left' },
149
+ { name: 'Success', alignment: 'center' },
150
+ { name: 'Pending', alignment: 'center' },
151
+ { name: 'Error', alignment: 'left' },
152
+ { name: 'Created', alignment: 'left' },
153
+ ]);
154
+ }
155
+
156
+ return result;
157
+ } catch (ex) {
158
+ tui.fatal(
159
+ `Failed to get session: ${ex instanceof Error ? ex.message : String(ex)}`,
160
+ ErrorCode.API_ERROR
161
+ );
162
+ }
163
+ },
164
+ });
@@ -0,0 +1,11 @@
1
+ import { createCommand } from '../../../types';
2
+ import { getSubcommand } from './get';
3
+ import { listSubcommand } from './list';
4
+ import { logsSubcommand } from './logs';
5
+
6
+ export const sessionCommand = createCommand({
7
+ name: 'session',
8
+ description: 'Manage sessions',
9
+ tags: ['requires-auth'],
10
+ subcommands: [getSubcommand, listSubcommand, logsSubcommand],
11
+ });
@@ -0,0 +1,145 @@
1
+ import { z } from 'zod';
2
+ import { createSubcommand } from '../../../types';
3
+ import * as tui from '../../../tui';
4
+ import { sessionList } from '@agentuity/server';
5
+ import { getCommand } from '../../../command-prefix';
6
+ import { ErrorCode } from '../../../errors';
7
+ import { getCatalystAPIClient } from '../../../config';
8
+
9
+ const SessionListResponseSchema = z.array(
10
+ z.object({
11
+ id: z.string().describe('Session ID'),
12
+ created_at: z.string().describe('Creation timestamp'),
13
+ success: z.boolean().describe('Whether the session succeeded'),
14
+ duration: z.number().nullable().describe('Duration in nanoseconds'),
15
+ method: z.string().describe('HTTP method'),
16
+ url: z.string().describe('Request URL'),
17
+ trigger: z.string().describe('Trigger type'),
18
+ env: z.string().describe('Environment'),
19
+ })
20
+ );
21
+
22
+ export const listSubcommand = createSubcommand({
23
+ name: 'list',
24
+ description: 'List recent sessions',
25
+ tags: ['read-only', 'fast', 'requires-auth'],
26
+ examples: [
27
+ `${getCommand('cloud session list')} # List 10 most recent sessions`,
28
+ `${getCommand('cloud session list')} --count=25 # List 25 most recent sessions`,
29
+ `${getCommand('cloud session list')} --project-id=proj_* # Filter by project`,
30
+ `${getCommand('cloud session list')} --deployment-id=* # Filter by deployment`,
31
+ `${getCommand('cloud session list')} --success=true # Only successful sessions`,
32
+ `${getCommand('cloud session list')} --devmode=false # Only production sessions`,
33
+ `${getCommand('cloud session list')} --trigger=api # Only API triggered sessions`,
34
+ `${getCommand('cloud session list')} --env=production # Only production environment`,
35
+ ],
36
+ aliases: ['ls'],
37
+ requires: { auth: true },
38
+ optional: { project: true },
39
+ idempotent: true,
40
+ pagination: {
41
+ supported: true,
42
+ defaultLimit: 10,
43
+ maxLimit: 100,
44
+ parameters: {
45
+ limit: 'count',
46
+ },
47
+ },
48
+ schema: {
49
+ options: z.object({
50
+ count: z.coerce
51
+ .number()
52
+ .int()
53
+ .min(1)
54
+ .max(100)
55
+ .default(10)
56
+ .describe('Number of sessions to list (1–100)'),
57
+ projectId: z.string().optional().describe('Filter by project ID'),
58
+ deploymentId: z.string().optional().describe('Filter by deployment ID'),
59
+ trigger: z.string().optional().describe('Filter by trigger type (api, cron, webhook)'),
60
+ env: z.string().optional().describe('Filter by environment'),
61
+ threadId: z.string().optional().describe('Filter by thread ID'),
62
+ agentIdentifier: z.string().optional().describe('Filter by agent identifier'),
63
+ devmode: z.coerce.boolean().optional().describe('Filter by dev mode (true/false)'),
64
+ success: z.coerce.boolean().optional().describe('Filter by success status (true/false)'),
65
+ startAfter: z.string().optional().describe('Filter by start time after (ISO 8601)'),
66
+ startBefore: z.string().optional().describe('Filter by start time before (ISO 8601)'),
67
+ }),
68
+ response: SessionListResponseSchema,
69
+ },
70
+ async handler(ctx) {
71
+ const { config, logger, auth, project, opts, options } = ctx;
72
+ const catalystClient = getCatalystAPIClient(config, logger, auth);
73
+
74
+ const projectId = opts.projectId || project?.projectId;
75
+
76
+ try {
77
+ const sessions = await sessionList(catalystClient, {
78
+ count: opts.count,
79
+ projectId,
80
+ deploymentId: opts.deploymentId,
81
+ trigger: opts.trigger,
82
+ env: opts.env,
83
+ devmode: opts.devmode,
84
+ success: opts.success,
85
+ threadId: opts.threadId,
86
+ agentIdentifier: opts.agentIdentifier,
87
+ startAfter: opts.startAfter,
88
+ startBefore: opts.startBefore,
89
+ });
90
+
91
+ const result = sessions.map((s) => ({
92
+ id: s.id,
93
+ created_at: s.created_at,
94
+ success: s.success,
95
+ duration: s.duration,
96
+ method: s.method,
97
+ url: s.url,
98
+ trigger: s.trigger,
99
+ env: s.env,
100
+ }));
101
+
102
+ if (options.json) {
103
+ console.log(JSON.stringify(result, null, 2));
104
+ return result;
105
+ }
106
+
107
+ if (sessions.length === 0) {
108
+ tui.info('No sessions found.');
109
+ return [];
110
+ }
111
+
112
+ const tableData = sessions.map((s) => {
113
+ const urlPath = new URL(s.url).pathname;
114
+ return {
115
+ ID: s.id,
116
+ Created: new Date(s.created_at).toLocaleString(),
117
+ Success: s.success ? '✓' : '✗',
118
+ Duration: s.duration ? `${(s.duration / 1_000_000).toFixed(0)}ms` : '-',
119
+ Method: s.method,
120
+ Path: urlPath.length > 50 ? urlPath.substring(0, 47) + '...' : urlPath,
121
+ Trigger: s.trigger,
122
+ Env: s.env,
123
+ };
124
+ });
125
+
126
+ tui.table(tableData, [
127
+ { name: 'ID', alignment: 'left' },
128
+ { name: 'Created', alignment: 'left' },
129
+ { name: 'Success', alignment: 'center' },
130
+ { name: 'Duration', alignment: 'right' },
131
+ { name: 'Method', alignment: 'left' },
132
+ { name: 'Path', alignment: 'left' },
133
+ { name: 'Trigger', alignment: 'left' },
134
+ { name: 'Env', alignment: 'left' },
135
+ ]);
136
+
137
+ return result;
138
+ } catch (ex) {
139
+ tui.fatal(
140
+ `Failed to list sessions: ${ex instanceof Error ? ex.message : String(ex)}`,
141
+ ErrorCode.API_ERROR
142
+ );
143
+ }
144
+ },
145
+ });
@@ -0,0 +1,68 @@
1
+ import { z } from 'zod';
2
+ import { createSubcommand } from '../../../types';
3
+ import * as tui from '../../../tui';
4
+ import { sessionLogs } from '@agentuity/server';
5
+ import { getCommand } from '../../../command-prefix';
6
+ import { ErrorCode } from '../../../errors';
7
+
8
+ const SessionLogsResponseSchema = z.array(
9
+ z.object({
10
+ body: z.string().describe('Log body'),
11
+ severity: z.string().describe('Log severity'),
12
+ timestamp: z.string().describe('Log timestamp'),
13
+ })
14
+ );
15
+
16
+ export const logsSubcommand = createSubcommand({
17
+ name: 'logs',
18
+ description: 'Get logs for a specific session',
19
+ tags: ['read-only', 'slow', 'requires-auth'],
20
+ examples: [`${getCommand('cloud session logs')} sess_abc123xyz`],
21
+ requires: { auth: true, apiClient: true },
22
+ optional: { project: true },
23
+ idempotent: true,
24
+ schema: {
25
+ args: z.object({
26
+ session_id: z.string().describe('Session ID'),
27
+ }),
28
+ options: z.object({
29
+ projectId: z.string().optional().describe('Project ID (for display purposes)'),
30
+ deploymentId: z.string().optional().describe('Deployment ID (for display purposes)'),
31
+ }),
32
+ response: SessionLogsResponseSchema,
33
+ },
34
+ async handler(ctx) {
35
+ const { apiClient, args } = ctx;
36
+
37
+ try {
38
+ const logs = await sessionLogs(apiClient, { id: args.session_id });
39
+
40
+ if (logs.length === 0) {
41
+ tui.info('No logs found for this session.');
42
+ return [];
43
+ }
44
+
45
+ tui.banner(`Logs for Session ${args.session_id}`, `${logs.length} log entries`);
46
+
47
+ for (const log of logs) {
48
+ const timestamp = new Date(log.timestamp).toLocaleTimeString();
49
+ const severity = log.severity.padEnd(5);
50
+ const severityColor =
51
+ log.severity === 'ERROR'
52
+ ? tui.error(severity)
53
+ : log.severity === 'WARN'
54
+ ? tui.warning(severity)
55
+ : tui.muted(severity);
56
+
57
+ console.log(`${tui.muted(timestamp)} ${severityColor} ${log.body}`);
58
+ }
59
+
60
+ return logs;
61
+ } catch (ex) {
62
+ tui.fatal(
63
+ `Failed to get session logs: ${ex instanceof Error ? ex.message : String(ex)}`,
64
+ ErrorCode.API_ERROR
65
+ );
66
+ }
67
+ },
68
+ });
@@ -0,0 +1,122 @@
1
+ import { z } from 'zod';
2
+ import { createSubcommand } from '../../types';
3
+ import * as tui from '../../tui';
4
+ import { APIResponseSchema } from '@agentuity/server';
5
+ import { abbreviate, abbreviateDescription } from '../../utils/format';
6
+
7
+ const AgentSchema = z.object({
8
+ id: z.string(),
9
+ name: z.string(),
10
+ description: z.string().nullable(),
11
+ identifier: z.string(),
12
+ version: z.string().nullable(),
13
+ deploymentId: z.string().nullable(),
14
+ devmode: z.boolean(),
15
+ metadata: z.record(z.string(), z.unknown()).nullable(),
16
+ createdAt: z.string(),
17
+ updatedAt: z.string(),
18
+ evals: z.array(
19
+ z.object({
20
+ id: z.string(),
21
+ name: z.string(),
22
+ description: z.string().nullable(),
23
+ identifier: z.string().nullable(),
24
+ deploymentId: z.string().nullable(),
25
+ version: z.string().nullable(),
26
+ devmode: z.boolean(),
27
+ createdAt: z.string(),
28
+ updatedAt: z.string(),
29
+ })
30
+ ),
31
+ });
32
+
33
+ const AgentsResponseSchema = APIResponseSchema(z.array(AgentSchema));
34
+
35
+ export const agentsSubcommand = createSubcommand({
36
+ name: 'agents',
37
+ description: 'Show devmode agent results',
38
+ requires: { auth: true, apiClient: true, project: true },
39
+ schema: {
40
+ options: z.object({
41
+ deploymentId: z.string().optional().describe('Filter by deployment ID'),
42
+ format: z
43
+ .enum(['json', 'table'])
44
+ .optional()
45
+ .default('table')
46
+ .describe('Output format: json or table'),
47
+ verbose: z.boolean().optional().default(false).describe('Show full IDs and descriptions'),
48
+ }),
49
+ },
50
+ async handler(ctx) {
51
+ const { opts, apiClient, project } = ctx;
52
+ const projectId = project.projectId;
53
+ const format = opts?.format ?? 'table';
54
+ const verbose = opts?.verbose ?? false;
55
+
56
+ const deploymentId = opts?.deploymentId;
57
+ const queryParams = deploymentId ? `?deploymentId=${deploymentId}` : '';
58
+ const response = await tui.spinner('Fetching agents', async () => {
59
+ return apiClient.request(
60
+ 'GET',
61
+ `/cli/agent/${projectId}${queryParams}`,
62
+ AgentsResponseSchema
63
+ );
64
+ });
65
+
66
+ if (!response.success) {
67
+ tui.fatal(`Failed to fetch agents: ${response.message ?? 'Unknown error'}`);
68
+ }
69
+
70
+ const agents = response.data;
71
+
72
+ if (format === 'json') {
73
+ console.log(JSON.stringify(agents, null, 2));
74
+ return;
75
+ }
76
+
77
+ tui.info(`Agents (${agents.length})`);
78
+ if (agents.length === 0) {
79
+ tui.muted('No agents found');
80
+ } else {
81
+ console.table(
82
+ agents.map((agent) => ({
83
+ name: agent.name,
84
+ id: verbose ? agent.id : abbreviate(agent.id, 20),
85
+ identifier: verbose ? agent.identifier : abbreviate(agent.identifier, 20),
86
+ deployment: abbreviate(agent.deploymentId, 20),
87
+ version: verbose
88
+ ? (agent.version ?? 'N/A')
89
+ : (abbreviate(agent.version, 20) ?? 'N/A'),
90
+ evals: agent.evals.length,
91
+ createdAt: new Date(agent.createdAt).toLocaleString(),
92
+ })),
93
+ ['name', 'id', 'identifier', 'deployment', 'version', 'evals', 'createdAt']
94
+ );
95
+
96
+ // Show evals for each agent
97
+ for (const agent of agents) {
98
+ if (agent.evals.length > 0) {
99
+ console.log(`\n Evals for ${agent.name}:`);
100
+ console.table(
101
+ agent.evals.map((evalItem) => ({
102
+ name: evalItem.name,
103
+ id: verbose ? evalItem.id : abbreviate(evalItem.id, 20),
104
+ identifier: verbose
105
+ ? (evalItem.identifier ?? 'N/A')
106
+ : (abbreviate(evalItem.identifier, 20) ?? 'N/A'),
107
+ deployment: abbreviate(evalItem.deploymentId, 20),
108
+ version: verbose
109
+ ? (evalItem.version ?? 'N/A')
110
+ : (abbreviate(evalItem.version, 20) ?? 'N/A'),
111
+ description: verbose
112
+ ? (evalItem.description ?? 'N/A')
113
+ : abbreviateDescription(evalItem.description),
114
+ createdAt: new Date(evalItem.createdAt).toLocaleString(),
115
+ })),
116
+ ['name', 'id', 'identifier', 'deployment', 'version', 'description', 'createdAt']
117
+ );
118
+ }
119
+ }
120
+ }
121
+ },
122
+ });
@@ -1,17 +1,25 @@
1
1
  /** biome-ignore-all lint/style/useTemplate: its easier */
2
2
  import { z } from 'zod';
3
- import type { BuildMetadata } from '@agentuity/server';
4
3
  import { resolve, join } from 'node:path';
5
- import { bundle } from '../bundle/bundler';
6
- import { getBuildMetadata } from '../bundle/plugin';
4
+ import { bundle } from '../build/bundler';
5
+ import { getBuildMetadata } from '../build/plugin';
7
6
  import { existsSync, type FSWatcher, watch, statSync, readdirSync } from 'node:fs';
8
- import { getDefaultConfigDir, loadProjectSDKKey, saveProjectDir, saveConfig } from '../../config';
7
+ import {
8
+ getDefaultConfigDir,
9
+ loadProjectSDKKey,
10
+ saveProjectDir,
11
+ saveConfig,
12
+ loadBuildMetadata,
13
+ } from '../../config';
9
14
  import { type Config, createCommand } from '../../types';
10
15
  import * as tui from '../../tui';
11
16
  import { createAgentTemplates, createAPITemplates } from './templates';
12
17
  import { generateEndpoint, type DevmodeResponse } from './api';
13
18
  import { APIClient, getAPIBaseURL } from '../../api';
14
19
  import { download } from './download';
20
+ import { createDevmodeSyncService } from './sync';
21
+ import { getDevmodeDeploymentId } from '../build/ast';
22
+ import { BuildMetadata } from '@agentuity/server';
15
23
  import { getCommand } from '../../command-prefix';
16
24
 
17
25
  export const command = createCommand({
@@ -47,6 +55,11 @@ export const command = createCommand({
47
55
  const { opts, logger, options, project, projectDir, auth } = ctx;
48
56
  let { config } = ctx;
49
57
 
58
+ // Allow sync with mock service even without devmode endpoint
59
+ const useMockService = process.env.DEVMODE_SYNC_SERVICE_MOCK === 'true';
60
+ const apiClient = new APIClient(getAPIBaseURL(config), logger, config);
61
+ const syncService = createDevmodeSyncService({ logger, apiClient, mock: useMockService });
62
+
50
63
  const rootDir = projectDir;
51
64
  const appTs = join(rootDir, 'app.ts');
52
65
  const srcDir = join(rootDir, 'src');
@@ -73,12 +86,11 @@ export const command = createCommand({
73
86
  let gravityBin: string | undefined;
74
87
 
75
88
  if (auth && project && opts.public) {
76
- // Only create apiClient if auth is available
77
- const apiClient = new APIClient(getAPIBaseURL(config), logger, config);
89
+ // Generate devmode endpoint only when using --public
78
90
  const endpoint = await tui.spinner({
79
91
  message: 'Connecting to Gravity',
80
92
  callback: () => {
81
- return generateEndpoint(apiClient, project.projectId, config?.devmode?.hostname);
93
+ return generateEndpoint(apiClient!, project.projectId, config?.devmode?.hostname);
82
94
  },
83
95
  clearOnSuccess: true,
84
96
  });
@@ -91,6 +103,13 @@ export const command = createCommand({
91
103
  devmode = endpoint;
92
104
  }
93
105
 
106
+ logger.debug(
107
+ 'Getting devmode deployment id for projectId: %s, endpointId: %s',
108
+ project?.projectId,
109
+ devmode?.id
110
+ );
111
+ const deploymentId = getDevmodeDeploymentId(project?.projectId ?? '', devmode?.id ?? '');
112
+
94
113
  if (devmode) {
95
114
  const configDir = getDefaultConfigDir();
96
115
  const gravityDir = join(configDir, 'gravity');
@@ -183,6 +202,21 @@ export const command = createCommand({
183
202
  const agentuityDir = resolve(rootDir, '.agentuity');
184
203
  const appPath = resolve(agentuityDir, 'app.js');
185
204
 
205
+ // Load existing metadata file to use as previousMetadata for sync
206
+ // This prevents reinserting agents/evals that haven't changed
207
+ let previousMetadata: BuildMetadata | undefined;
208
+ try {
209
+ previousMetadata = await loadBuildMetadata(agentuityDir);
210
+ logger.debug(
211
+ 'Loaded previous metadata with %d agent(s)',
212
+ previousMetadata.agents?.length ?? 0
213
+ );
214
+ } catch (_error) {
215
+ // File doesn't exist yet (first run), that's okay
216
+ logger.debug('No previous metadata file found, will treat all agents/evals as new');
217
+ previousMetadata = undefined;
218
+ }
219
+
186
220
  // Watch directories instead of files to survive atomic replacements (sed -i, cp)
187
221
  const watches = [rootDir];
188
222
  const watchers: FSWatcher[] = [];
@@ -394,6 +428,8 @@ export const command = createCommand({
394
428
  await bundle({
395
429
  rootDir,
396
430
  dev: true,
431
+ projectId: project?.projectId,
432
+ deploymentId,
397
433
  });
398
434
  building = false;
399
435
  buildCompletedAt = Date.now();
@@ -423,6 +459,64 @@ export const command = createCommand({
423
459
  metadata = getBuildMetadata();
424
460
  logger.trace('Build metadata retrieved');
425
461
 
462
+ // Sync agents and evals to API if in devmode with auth
463
+ if (auth && project && apiClient) {
464
+ try {
465
+ logger.debug('Loading build metadata for sync...');
466
+ const currentMetadata = await loadBuildMetadata(agentuityDir);
467
+ logger.debug(
468
+ 'Found %d agent(s) and %d route(s) in metadata',
469
+ currentMetadata.agents?.length ?? 0,
470
+ currentMetadata.routes?.length ?? 0
471
+ );
472
+ if (currentMetadata.agents) {
473
+ for (const agent of currentMetadata.agents) {
474
+ logger.debug(
475
+ 'Agent: id=%s, name=%s, version=%s, evals=%d',
476
+ agent.id,
477
+ agent.name,
478
+ agent.version,
479
+ agent.evals?.length ?? 0
480
+ );
481
+ if (agent.evals) {
482
+ for (const evalItem of agent.evals) {
483
+ logger.debug(
484
+ ' Eval: id=%s, name=%s, version=%s',
485
+ evalItem.id,
486
+ evalItem.name,
487
+ evalItem.version
488
+ );
489
+ }
490
+ }
491
+ }
492
+ }
493
+ logger.debug('Syncing agents and evals...');
494
+
495
+ await syncService.sync(
496
+ currentMetadata,
497
+ previousMetadata,
498
+ project.projectId,
499
+ deploymentId
500
+ );
501
+ previousMetadata = currentMetadata;
502
+ logger.debug('Sync completed successfully');
503
+ } catch (error) {
504
+ logger.error('Failed to sync agents/evals: %s', error);
505
+ if (error instanceof Error) {
506
+ logger.error('Error stack: %s', error.stack);
507
+ }
508
+ // Don't fail the build, just log the error
509
+ }
510
+ } else {
511
+ logger.trace(
512
+ 'Skipping sync - auth=%s, project=%s, devmode=%s, apiClient=%s',
513
+ !!auth,
514
+ !!project,
515
+ !!devmode,
516
+ !!apiClient
517
+ );
518
+ }
519
+
426
520
  logger.trace('Starting dev server: %s', appPath);
427
521
  // Use shell to run in a process group for proper cleanup
428
522
  // The 'exec' ensures the shell is replaced by the actual process
@@ -558,12 +652,12 @@ export const command = createCommand({
558
652
 
559
653
  const showRoutes = () => {
560
654
  tui.info('API Route Detail');
561
- console.table(metadata?.routes, ['method', 'path', 'filename']);
655
+ tui.table(metadata?.routes ?? [], ['method', 'path', 'filename']);
562
656
  };
563
657
 
564
658
  const showAgents = () => {
565
659
  tui.info('Agent Detail');
566
- console.table(metadata?.agents, ['name', 'filename', 'description']);
660
+ tui.table(metadata?.agents ?? [], ['name', 'filename', 'description']);
567
661
  };
568
662
 
569
663
  process.stdin.on('data', (data) => {