@agentuity/cli 0.0.60 → 0.0.62

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 (609) hide show
  1. package/bin/cli.ts +15 -4
  2. package/dist/banner.d.ts +1 -0
  3. package/dist/banner.d.ts.map +1 -1
  4. package/dist/banner.js +28 -13
  5. package/dist/banner.js.map +1 -1
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +85 -9
  8. package/dist/cli.js.map +1 -1
  9. package/dist/cmd/ai/capabilities/index.d.ts.map +1 -1
  10. package/dist/cmd/ai/capabilities/index.js +4 -0
  11. package/dist/cmd/ai/capabilities/index.js.map +1 -1
  12. package/dist/cmd/ai/capabilities/show.d.ts.map +1 -1
  13. package/dist/cmd/ai/capabilities/show.js +13 -2
  14. package/dist/cmd/ai/capabilities/show.js.map +1 -1
  15. package/dist/cmd/ai/index.d.ts.map +1 -1
  16. package/dist/cmd/ai/index.js +11 -0
  17. package/dist/cmd/ai/index.js.map +1 -1
  18. package/dist/cmd/ai/prompt/agent.d.ts +3 -0
  19. package/dist/cmd/ai/prompt/agent.d.ts.map +1 -0
  20. package/dist/cmd/ai/prompt/agent.js +340 -0
  21. package/dist/cmd/ai/prompt/agent.js.map +1 -0
  22. package/dist/cmd/ai/prompt/api.d.ts +3 -0
  23. package/dist/cmd/ai/prompt/api.d.ts.map +1 -0
  24. package/dist/cmd/ai/prompt/api.js +272 -0
  25. package/dist/cmd/ai/prompt/api.js.map +1 -0
  26. package/dist/cmd/ai/prompt/index.d.ts +1 -2
  27. package/dist/cmd/ai/prompt/index.d.ts.map +1 -1
  28. package/dist/cmd/ai/prompt/index.js +17 -1
  29. package/dist/cmd/ai/prompt/index.js.map +1 -1
  30. package/dist/cmd/ai/prompt/llm.d.ts +1 -0
  31. package/dist/cmd/ai/prompt/llm.d.ts.map +1 -1
  32. package/dist/cmd/ai/prompt/llm.js +2 -2
  33. package/dist/cmd/ai/prompt/llm.js.map +1 -1
  34. package/dist/cmd/ai/prompt/web.d.ts +3 -0
  35. package/dist/cmd/ai/prompt/web.d.ts.map +1 -0
  36. package/dist/cmd/ai/prompt/web.js +299 -0
  37. package/dist/cmd/ai/prompt/web.js.map +1 -0
  38. package/dist/cmd/ai/schema/generate.js +1 -1
  39. package/dist/cmd/ai/schema/generate.js.map +1 -1
  40. package/dist/cmd/ai/schema/index.d.ts.map +1 -1
  41. package/dist/cmd/ai/schema/index.js +2 -0
  42. package/dist/cmd/ai/schema/index.js.map +1 -1
  43. package/dist/cmd/ai/schema/show.d.ts.map +1 -1
  44. package/dist/cmd/ai/schema/show.js +4 -1
  45. package/dist/cmd/ai/schema/show.js.map +1 -1
  46. package/dist/cmd/auth/api.d.ts.map +1 -1
  47. package/dist/cmd/auth/api.js +12 -6
  48. package/dist/cmd/auth/api.js.map +1 -1
  49. package/dist/cmd/auth/index.d.ts.map +1 -1
  50. package/dist/cmd/auth/index.js +5 -0
  51. package/dist/cmd/auth/index.js.map +1 -1
  52. package/dist/cmd/auth/login.d.ts.map +1 -1
  53. package/dist/cmd/auth/login.js +5 -22
  54. package/dist/cmd/auth/login.js.map +1 -1
  55. package/dist/cmd/auth/logout.d.ts.map +1 -1
  56. package/dist/cmd/auth/logout.js +4 -1
  57. package/dist/cmd/auth/logout.js.map +1 -1
  58. package/dist/cmd/auth/signup.d.ts.map +1 -1
  59. package/dist/cmd/auth/signup.js +4 -1
  60. package/dist/cmd/auth/signup.js.map +1 -1
  61. package/dist/cmd/auth/ssh/add.d.ts.map +1 -1
  62. package/dist/cmd/auth/ssh/add.js +13 -4
  63. package/dist/cmd/auth/ssh/add.js.map +1 -1
  64. package/dist/cmd/auth/ssh/api.d.ts.map +1 -1
  65. package/dist/cmd/auth/ssh/api.js +11 -5
  66. package/dist/cmd/auth/ssh/api.js.map +1 -1
  67. package/dist/cmd/auth/ssh/delete.js +4 -4
  68. package/dist/cmd/auth/ssh/delete.js.map +1 -1
  69. package/dist/cmd/auth/ssh/index.d.ts.map +1 -1
  70. package/dist/cmd/auth/ssh/index.js +5 -0
  71. package/dist/cmd/auth/ssh/index.js.map +1 -1
  72. package/dist/cmd/auth/ssh/list.js +3 -3
  73. package/dist/cmd/auth/ssh/list.js.map +1 -1
  74. package/dist/cmd/auth/whoami.d.ts.map +1 -1
  75. package/dist/cmd/auth/whoami.js +4 -4
  76. package/dist/cmd/auth/whoami.js.map +1 -1
  77. package/dist/cmd/build/ast.d.ts +24 -1
  78. package/dist/cmd/build/ast.d.ts.map +1 -1
  79. package/dist/cmd/build/ast.js +558 -21
  80. package/dist/cmd/build/ast.js.map +1 -1
  81. package/dist/cmd/build/bundler.d.ts +3 -1
  82. package/dist/cmd/build/bundler.d.ts.map +1 -1
  83. package/dist/cmd/build/bundler.js +89 -38
  84. package/dist/cmd/build/bundler.js.map +1 -1
  85. package/dist/cmd/build/file.js +1 -1
  86. package/dist/cmd/build/file.js.map +1 -1
  87. package/dist/cmd/build/fix-duplicate-exports.d.ts.map +1 -1
  88. package/dist/cmd/build/fix-duplicate-exports.js +4 -1
  89. package/dist/cmd/build/fix-duplicate-exports.js.map +1 -1
  90. package/dist/cmd/build/index.d.ts.map +1 -1
  91. package/dist/cmd/build/index.js +55 -13
  92. package/dist/cmd/build/index.js.map +1 -1
  93. package/dist/cmd/build/plugin.d.ts.map +1 -1
  94. package/dist/cmd/build/plugin.js +183 -38
  95. package/dist/cmd/build/plugin.js.map +1 -1
  96. package/dist/cmd/cloud/agent/get.d.ts.map +1 -1
  97. package/dist/cmd/cloud/agent/get.js +5 -2
  98. package/dist/cmd/cloud/agent/get.js.map +1 -1
  99. package/dist/cmd/cloud/agent/index.d.ts.map +1 -1
  100. package/dist/cmd/cloud/agent/index.js +5 -0
  101. package/dist/cmd/cloud/agent/index.js.map +1 -1
  102. package/dist/cmd/cloud/agent/list.js +3 -3
  103. package/dist/cmd/cloud/agent/list.js.map +1 -1
  104. package/dist/cmd/cloud/apikey/create.d.ts.map +1 -1
  105. package/dist/cmd/cloud/apikey/create.js +12 -3
  106. package/dist/cmd/cloud/apikey/create.js.map +1 -1
  107. package/dist/cmd/cloud/apikey/delete.js +3 -3
  108. package/dist/cmd/cloud/apikey/delete.js.map +1 -1
  109. package/dist/cmd/cloud/apikey/get.js +1 -1
  110. package/dist/cmd/cloud/apikey/get.js.map +1 -1
  111. package/dist/cmd/cloud/apikey/index.d.ts.map +1 -1
  112. package/dist/cmd/cloud/apikey/index.js +8 -0
  113. package/dist/cmd/cloud/apikey/index.js.map +1 -1
  114. package/dist/cmd/cloud/apikey/list.d.ts.map +1 -1
  115. package/dist/cmd/cloud/apikey/list.js +4 -1
  116. package/dist/cmd/cloud/apikey/list.js.map +1 -1
  117. package/dist/cmd/cloud/db/create.d.ts.map +1 -1
  118. package/dist/cmd/cloud/db/create.js +35 -21
  119. package/dist/cmd/cloud/db/create.js.map +1 -1
  120. package/dist/cmd/cloud/db/delete.d.ts.map +1 -1
  121. package/dist/cmd/cloud/db/delete.js +34 -21
  122. package/dist/cmd/cloud/db/delete.js.map +1 -1
  123. package/dist/cmd/cloud/db/get.d.ts.map +1 -1
  124. package/dist/cmd/cloud/db/get.js +9 -3
  125. package/dist/cmd/cloud/db/get.js.map +1 -1
  126. package/dist/cmd/cloud/db/index.d.ts.map +1 -1
  127. package/dist/cmd/cloud/db/index.js +5 -0
  128. package/dist/cmd/cloud/db/index.js.map +1 -1
  129. package/dist/cmd/cloud/db/list.d.ts.map +1 -1
  130. package/dist/cmd/cloud/db/list.js +16 -6
  131. package/dist/cmd/cloud/db/list.js.map +1 -1
  132. package/dist/cmd/cloud/db/sql.d.ts.map +1 -1
  133. package/dist/cmd/cloud/db/sql.js +12 -3
  134. package/dist/cmd/cloud/db/sql.js.map +1 -1
  135. package/dist/cmd/cloud/deploy.d.ts.map +1 -1
  136. package/dist/cmd/cloud/deploy.js +9 -3
  137. package/dist/cmd/cloud/deploy.js.map +1 -1
  138. package/dist/cmd/cloud/deployment/index.d.ts.map +1 -1
  139. package/dist/cmd/cloud/deployment/index.js +5 -0
  140. package/dist/cmd/cloud/deployment/index.js.map +1 -1
  141. package/dist/cmd/cloud/deployment/list.d.ts.map +1 -1
  142. package/dist/cmd/cloud/deployment/list.js +12 -3
  143. package/dist/cmd/cloud/deployment/list.js.map +1 -1
  144. package/dist/cmd/cloud/deployment/logs.d.ts.map +1 -1
  145. package/dist/cmd/cloud/deployment/logs.js +16 -4
  146. package/dist/cmd/cloud/deployment/logs.js.map +1 -1
  147. package/dist/cmd/cloud/deployment/remove.d.ts.map +1 -1
  148. package/dist/cmd/cloud/deployment/remove.js +12 -3
  149. package/dist/cmd/cloud/deployment/remove.js.map +1 -1
  150. package/dist/cmd/cloud/deployment/rollback.d.ts.map +1 -1
  151. package/dist/cmd/cloud/deployment/rollback.js +8 -2
  152. package/dist/cmd/cloud/deployment/rollback.js.map +1 -1
  153. package/dist/cmd/cloud/deployment/show.d.ts.map +1 -1
  154. package/dist/cmd/cloud/deployment/show.js +8 -2
  155. package/dist/cmd/cloud/deployment/show.js.map +1 -1
  156. package/dist/cmd/cloud/deployment/undeploy.d.ts.map +1 -1
  157. package/dist/cmd/cloud/deployment/undeploy.js +12 -3
  158. package/dist/cmd/cloud/deployment/undeploy.js.map +1 -1
  159. package/dist/cmd/cloud/deployment/utils.d.ts.map +1 -1
  160. package/dist/cmd/cloud/deployment/utils.js +3 -1
  161. package/dist/cmd/cloud/deployment/utils.js.map +1 -1
  162. package/dist/cmd/cloud/domain.d.ts.map +1 -1
  163. package/dist/cmd/cloud/domain.js +4 -2
  164. package/dist/cmd/cloud/domain.js.map +1 -1
  165. package/dist/cmd/cloud/env/delete.d.ts.map +1 -1
  166. package/dist/cmd/cloud/env/delete.js +4 -1
  167. package/dist/cmd/cloud/env/delete.js.map +1 -1
  168. package/dist/cmd/cloud/env/get.d.ts.map +1 -1
  169. package/dist/cmd/cloud/env/get.js +4 -1
  170. package/dist/cmd/cloud/env/get.js.map +1 -1
  171. package/dist/cmd/cloud/env/import.d.ts.map +1 -1
  172. package/dist/cmd/cloud/env/import.js +10 -0
  173. package/dist/cmd/cloud/env/import.js.map +1 -1
  174. package/dist/cmd/cloud/env/index.d.ts.map +1 -1
  175. package/dist/cmd/cloud/env/index.js +8 -0
  176. package/dist/cmd/cloud/env/index.js.map +1 -1
  177. package/dist/cmd/cloud/env/list.d.ts.map +1 -1
  178. package/dist/cmd/cloud/env/list.js +4 -1
  179. package/dist/cmd/cloud/env/list.js.map +1 -1
  180. package/dist/cmd/cloud/env/pull.d.ts.map +1 -1
  181. package/dist/cmd/cloud/env/pull.js +4 -1
  182. package/dist/cmd/cloud/env/pull.js.map +1 -1
  183. package/dist/cmd/cloud/env/push.js +1 -1
  184. package/dist/cmd/cloud/env/push.js.map +1 -1
  185. package/dist/cmd/cloud/env/set.js +3 -3
  186. package/dist/cmd/cloud/env/set.js.map +1 -1
  187. package/dist/cmd/cloud/index.d.ts.map +1 -1
  188. package/dist/cmd/cloud/index.js +7 -0
  189. package/dist/cmd/cloud/index.js.map +1 -1
  190. package/dist/cmd/cloud/keyvalue/create-namespace.d.ts.map +1 -1
  191. package/dist/cmd/cloud/keyvalue/create-namespace.js +9 -3
  192. package/dist/cmd/cloud/keyvalue/create-namespace.js.map +1 -1
  193. package/dist/cmd/cloud/keyvalue/delete-namespace.d.ts.map +1 -1
  194. package/dist/cmd/cloud/keyvalue/delete-namespace.js +12 -3
  195. package/dist/cmd/cloud/keyvalue/delete-namespace.js.map +1 -1
  196. package/dist/cmd/cloud/keyvalue/delete.d.ts.map +1 -1
  197. package/dist/cmd/cloud/keyvalue/delete.js +6 -3
  198. package/dist/cmd/cloud/keyvalue/delete.js.map +1 -1
  199. package/dist/cmd/cloud/keyvalue/get.d.ts.map +1 -1
  200. package/dist/cmd/cloud/keyvalue/get.js +3 -3
  201. package/dist/cmd/cloud/keyvalue/get.js.map +1 -1
  202. package/dist/cmd/cloud/keyvalue/index.d.ts.map +1 -1
  203. package/dist/cmd/cloud/keyvalue/index.js +8 -0
  204. package/dist/cmd/cloud/keyvalue/index.js.map +1 -1
  205. package/dist/cmd/cloud/keyvalue/keys.d.ts.map +1 -1
  206. package/dist/cmd/cloud/keyvalue/keys.js +3 -3
  207. package/dist/cmd/cloud/keyvalue/keys.js.map +1 -1
  208. package/dist/cmd/cloud/keyvalue/list-namespaces.d.ts.map +1 -1
  209. package/dist/cmd/cloud/keyvalue/list-namespaces.js +3 -3
  210. package/dist/cmd/cloud/keyvalue/list-namespaces.js.map +1 -1
  211. package/dist/cmd/cloud/keyvalue/repl.d.ts.map +1 -1
  212. package/dist/cmd/cloud/keyvalue/repl.js +1 -1
  213. package/dist/cmd/cloud/keyvalue/repl.js.map +1 -1
  214. package/dist/cmd/cloud/keyvalue/search.d.ts.map +1 -1
  215. package/dist/cmd/cloud/keyvalue/search.js +9 -3
  216. package/dist/cmd/cloud/keyvalue/search.js.map +1 -1
  217. package/dist/cmd/cloud/keyvalue/set.d.ts.map +1 -1
  218. package/dist/cmd/cloud/keyvalue/set.js +12 -3
  219. package/dist/cmd/cloud/keyvalue/set.js.map +1 -1
  220. package/dist/cmd/cloud/keyvalue/stats.d.ts.map +1 -1
  221. package/dist/cmd/cloud/keyvalue/stats.js +6 -3
  222. package/dist/cmd/cloud/keyvalue/stats.js.map +1 -1
  223. package/dist/cmd/cloud/objectstore/delete-bucket.d.ts.map +1 -1
  224. package/dist/cmd/cloud/objectstore/delete-bucket.js +8 -2
  225. package/dist/cmd/cloud/objectstore/delete-bucket.js.map +1 -1
  226. package/dist/cmd/cloud/objectstore/delete.d.ts.map +1 -1
  227. package/dist/cmd/cloud/objectstore/delete.js +12 -3
  228. package/dist/cmd/cloud/objectstore/delete.js.map +1 -1
  229. package/dist/cmd/cloud/objectstore/get.d.ts.map +1 -1
  230. package/dist/cmd/cloud/objectstore/get.js +12 -3
  231. package/dist/cmd/cloud/objectstore/get.js.map +1 -1
  232. package/dist/cmd/cloud/objectstore/index.d.ts.map +1 -1
  233. package/dist/cmd/cloud/objectstore/index.js +8 -0
  234. package/dist/cmd/cloud/objectstore/index.js.map +1 -1
  235. package/dist/cmd/cloud/objectstore/list-buckets.d.ts.map +1 -1
  236. package/dist/cmd/cloud/objectstore/list-buckets.js +6 -1
  237. package/dist/cmd/cloud/objectstore/list-buckets.js.map +1 -1
  238. package/dist/cmd/cloud/objectstore/list-keys.d.ts.map +1 -1
  239. package/dist/cmd/cloud/objectstore/list-keys.js +6 -3
  240. package/dist/cmd/cloud/objectstore/list-keys.js.map +1 -1
  241. package/dist/cmd/cloud/objectstore/put.d.ts.map +1 -1
  242. package/dist/cmd/cloud/objectstore/put.js +12 -3
  243. package/dist/cmd/cloud/objectstore/put.js.map +1 -1
  244. package/dist/cmd/cloud/objectstore/repl.d.ts.map +1 -1
  245. package/dist/cmd/cloud/objectstore/repl.js +6 -1
  246. package/dist/cmd/cloud/objectstore/repl.js.map +1 -1
  247. package/dist/cmd/cloud/objectstore/url.d.ts.map +1 -1
  248. package/dist/cmd/cloud/objectstore/url.js +12 -3
  249. package/dist/cmd/cloud/objectstore/url.js.map +1 -1
  250. package/dist/cmd/cloud/scp/download.d.ts.map +1 -1
  251. package/dist/cmd/cloud/scp/download.js +16 -4
  252. package/dist/cmd/cloud/scp/download.js.map +1 -1
  253. package/dist/cmd/cloud/scp/index.d.ts.map +1 -1
  254. package/dist/cmd/cloud/scp/index.js +11 -0
  255. package/dist/cmd/cloud/scp/index.js.map +1 -1
  256. package/dist/cmd/cloud/scp/upload.d.ts.map +1 -1
  257. package/dist/cmd/cloud/scp/upload.js +16 -4
  258. package/dist/cmd/cloud/scp/upload.js.map +1 -1
  259. package/dist/cmd/cloud/secret/delete.d.ts.map +1 -1
  260. package/dist/cmd/cloud/secret/delete.js +4 -1
  261. package/dist/cmd/cloud/secret/delete.js.map +1 -1
  262. package/dist/cmd/cloud/secret/get.d.ts.map +1 -1
  263. package/dist/cmd/cloud/secret/get.js +5 -2
  264. package/dist/cmd/cloud/secret/get.js.map +1 -1
  265. package/dist/cmd/cloud/secret/import.d.ts.map +1 -1
  266. package/dist/cmd/cloud/secret/import.js +5 -2
  267. package/dist/cmd/cloud/secret/import.js.map +1 -1
  268. package/dist/cmd/cloud/secret/index.d.ts.map +1 -1
  269. package/dist/cmd/cloud/secret/index.js +8 -0
  270. package/dist/cmd/cloud/secret/index.js.map +1 -1
  271. package/dist/cmd/cloud/secret/list.d.ts.map +1 -1
  272. package/dist/cmd/cloud/secret/list.js +4 -1
  273. package/dist/cmd/cloud/secret/list.js.map +1 -1
  274. package/dist/cmd/cloud/secret/pull.d.ts.map +1 -1
  275. package/dist/cmd/cloud/secret/pull.js +4 -1
  276. package/dist/cmd/cloud/secret/pull.js.map +1 -1
  277. package/dist/cmd/cloud/secret/push.js +1 -1
  278. package/dist/cmd/cloud/secret/push.js.map +1 -1
  279. package/dist/cmd/cloud/secret/set.d.ts.map +1 -1
  280. package/dist/cmd/cloud/secret/set.js +8 -2
  281. package/dist/cmd/cloud/secret/set.js.map +1 -1
  282. package/dist/cmd/cloud/session/get.d.ts.map +1 -1
  283. package/dist/cmd/cloud/session/get.js +10 -2
  284. package/dist/cmd/cloud/session/get.js.map +1 -1
  285. package/dist/cmd/cloud/session/index.d.ts.map +1 -1
  286. package/dist/cmd/cloud/session/index.js +5 -0
  287. package/dist/cmd/cloud/session/index.js.map +1 -1
  288. package/dist/cmd/cloud/session/list.d.ts.map +1 -1
  289. package/dist/cmd/cloud/session/list.js +29 -8
  290. package/dist/cmd/cloud/session/list.js.map +1 -1
  291. package/dist/cmd/cloud/session/logs.d.ts.map +1 -1
  292. package/dist/cmd/cloud/session/logs.js +8 -2
  293. package/dist/cmd/cloud/session/logs.js.map +1 -1
  294. package/dist/cmd/cloud/ssh.d.ts.map +1 -1
  295. package/dist/cmd/cloud/ssh.js +15 -6
  296. package/dist/cmd/cloud/ssh.js.map +1 -1
  297. package/dist/cmd/cloud/storage/create.d.ts.map +1 -1
  298. package/dist/cmd/cloud/storage/create.js +12 -3
  299. package/dist/cmd/cloud/storage/create.js.map +1 -1
  300. package/dist/cmd/cloud/storage/delete.d.ts.map +1 -1
  301. package/dist/cmd/cloud/storage/delete.js +16 -4
  302. package/dist/cmd/cloud/storage/delete.js.map +1 -1
  303. package/dist/cmd/cloud/storage/download.d.ts.map +1 -1
  304. package/dist/cmd/cloud/storage/download.js +16 -4
  305. package/dist/cmd/cloud/storage/download.js.map +1 -1
  306. package/dist/cmd/cloud/storage/get.d.ts.map +1 -1
  307. package/dist/cmd/cloud/storage/get.js +12 -3
  308. package/dist/cmd/cloud/storage/get.js.map +1 -1
  309. package/dist/cmd/cloud/storage/index.d.ts.map +1 -1
  310. package/dist/cmd/cloud/storage/index.js +8 -0
  311. package/dist/cmd/cloud/storage/index.js.map +1 -1
  312. package/dist/cmd/cloud/storage/list.d.ts.map +1 -1
  313. package/dist/cmd/cloud/storage/list.js +35 -12
  314. package/dist/cmd/cloud/storage/list.js.map +1 -1
  315. package/dist/cmd/cloud/storage/upload.d.ts.map +1 -1
  316. package/dist/cmd/cloud/storage/upload.js +21 -9
  317. package/dist/cmd/cloud/storage/upload.js.map +1 -1
  318. package/dist/cmd/cloud/stream/delete.d.ts.map +1 -1
  319. package/dist/cmd/cloud/stream/delete.js +9 -3
  320. package/dist/cmd/cloud/stream/delete.js.map +1 -1
  321. package/dist/cmd/cloud/stream/get.d.ts.map +1 -1
  322. package/dist/cmd/cloud/stream/get.js +10 -4
  323. package/dist/cmd/cloud/stream/get.js.map +1 -1
  324. package/dist/cmd/cloud/stream/index.d.ts.map +1 -1
  325. package/dist/cmd/cloud/stream/index.js +5 -0
  326. package/dist/cmd/cloud/stream/index.js.map +1 -1
  327. package/dist/cmd/cloud/stream/list.d.ts.map +1 -1
  328. package/dist/cmd/cloud/stream/list.js +11 -5
  329. package/dist/cmd/cloud/stream/list.js.map +1 -1
  330. package/dist/cmd/cloud/thread/delete.d.ts +2 -0
  331. package/dist/cmd/cloud/thread/delete.d.ts.map +1 -0
  332. package/dist/cmd/cloud/thread/delete.js +41 -0
  333. package/dist/cmd/cloud/thread/delete.js.map +1 -0
  334. package/dist/cmd/cloud/thread/get.d.ts +2 -0
  335. package/dist/cmd/cloud/thread/get.d.ts.map +1 -0
  336. package/dist/cmd/cloud/thread/get.js +80 -0
  337. package/dist/cmd/cloud/thread/get.js.map +1 -0
  338. package/dist/cmd/cloud/thread/index.d.ts +2 -0
  339. package/dist/cmd/cloud/thread/index.d.ts.map +1 -0
  340. package/dist/cmd/cloud/thread/index.js +17 -0
  341. package/dist/cmd/cloud/thread/index.js.map +1 -0
  342. package/dist/cmd/cloud/thread/list.d.ts +2 -0
  343. package/dist/cmd/cloud/thread/list.d.ts.map +1 -0
  344. package/dist/cmd/cloud/thread/list.js +112 -0
  345. package/dist/cmd/cloud/thread/list.js.map +1 -0
  346. package/dist/cmd/cloud/vector/delete.d.ts.map +1 -1
  347. package/dist/cmd/cloud/vector/delete.js +12 -3
  348. package/dist/cmd/cloud/vector/delete.js.map +1 -1
  349. package/dist/cmd/cloud/vector/get.d.ts.map +1 -1
  350. package/dist/cmd/cloud/vector/get.js +12 -3
  351. package/dist/cmd/cloud/vector/get.js.map +1 -1
  352. package/dist/cmd/cloud/vector/index.d.ts.map +1 -1
  353. package/dist/cmd/cloud/vector/index.js +8 -0
  354. package/dist/cmd/cloud/vector/index.js.map +1 -1
  355. package/dist/cmd/cloud/vector/search.d.ts.map +1 -1
  356. package/dist/cmd/cloud/vector/search.js +20 -5
  357. package/dist/cmd/cloud/vector/search.js.map +1 -1
  358. package/dist/cmd/dev/agents.d.ts.map +1 -1
  359. package/dist/cmd/dev/agents.js +7 -2
  360. package/dist/cmd/dev/agents.js.map +1 -1
  361. package/dist/cmd/dev/api.d.ts.map +1 -1
  362. package/dist/cmd/dev/api.js +3 -1
  363. package/dist/cmd/dev/api.js.map +1 -1
  364. package/dist/cmd/dev/index.d.ts.map +1 -1
  365. package/dist/cmd/dev/index.js +13 -5
  366. package/dist/cmd/dev/index.js.map +1 -1
  367. package/dist/cmd/help/index.d.ts +2 -0
  368. package/dist/cmd/help/index.d.ts.map +1 -0
  369. package/dist/cmd/help/index.js +35 -0
  370. package/dist/cmd/help/index.js.map +1 -0
  371. package/dist/cmd/index.d.ts.map +1 -1
  372. package/dist/cmd/index.js +1 -0
  373. package/dist/cmd/index.js.map +1 -1
  374. package/dist/cmd/profile/create.js +3 -3
  375. package/dist/cmd/profile/create.js.map +1 -1
  376. package/dist/cmd/profile/delete.d.ts.map +1 -1
  377. package/dist/cmd/profile/delete.js +6 -3
  378. package/dist/cmd/profile/delete.js.map +1 -1
  379. package/dist/cmd/profile/index.d.ts.map +1 -1
  380. package/dist/cmd/profile/index.js +8 -0
  381. package/dist/cmd/profile/index.js.map +1 -1
  382. package/dist/cmd/profile/list.d.ts.map +1 -1
  383. package/dist/cmd/profile/list.js +4 -1
  384. package/dist/cmd/profile/list.js.map +1 -1
  385. package/dist/cmd/profile/show.d.ts.map +1 -1
  386. package/dist/cmd/profile/show.js +6 -3
  387. package/dist/cmd/profile/show.js.map +1 -1
  388. package/dist/cmd/profile/use.d.ts.map +1 -1
  389. package/dist/cmd/profile/use.js +12 -3
  390. package/dist/cmd/profile/use.js.map +1 -1
  391. package/dist/cmd/project/create.d.ts.map +1 -1
  392. package/dist/cmd/project/create.js +11 -5
  393. package/dist/cmd/project/create.js.map +1 -1
  394. package/dist/cmd/project/delete.d.ts.map +1 -1
  395. package/dist/cmd/project/delete.js +15 -6
  396. package/dist/cmd/project/delete.js.map +1 -1
  397. package/dist/cmd/project/download.d.ts +1 -1
  398. package/dist/cmd/project/download.d.ts.map +1 -1
  399. package/dist/cmd/project/download.js +37 -2
  400. package/dist/cmd/project/download.js.map +1 -1
  401. package/dist/cmd/project/index.d.ts.map +1 -1
  402. package/dist/cmd/project/index.js +5 -0
  403. package/dist/cmd/project/index.js.map +1 -1
  404. package/dist/cmd/project/list.d.ts.map +1 -1
  405. package/dist/cmd/project/list.js +6 -3
  406. package/dist/cmd/project/list.js.map +1 -1
  407. package/dist/cmd/project/show.d.ts.map +1 -1
  408. package/dist/cmd/project/show.js +6 -3
  409. package/dist/cmd/project/show.js.map +1 -1
  410. package/dist/cmd/project/templates.d.ts.map +1 -1
  411. package/dist/cmd/project/templates.js +10 -2
  412. package/dist/cmd/project/templates.js.map +1 -1
  413. package/dist/cmd/repl/index.js +1 -1
  414. package/dist/cmd/repl/index.js.map +1 -1
  415. package/dist/cmd/version/index.d.ts.map +1 -1
  416. package/dist/cmd/version/index.js +7 -1
  417. package/dist/cmd/version/index.js.map +1 -1
  418. package/dist/command-prefix.d.ts.map +1 -1
  419. package/dist/command-prefix.js +5 -3
  420. package/dist/command-prefix.js.map +1 -1
  421. package/dist/config.d.ts +1 -1
  422. package/dist/config.d.ts.map +1 -1
  423. package/dist/config.js +3 -1
  424. package/dist/config.js.map +1 -1
  425. package/dist/crypto/box.d.ts.map +1 -1
  426. package/dist/crypto/box.js +31 -17
  427. package/dist/crypto/box.js.map +1 -1
  428. package/dist/download.d.ts.map +1 -1
  429. package/dist/download.js +7 -1
  430. package/dist/download.js.map +1 -1
  431. package/dist/env-util.d.ts +3 -0
  432. package/dist/env-util.d.ts.map +1 -1
  433. package/dist/env-util.js +43 -2
  434. package/dist/env-util.js.map +1 -1
  435. package/dist/errors.d.ts +4 -2
  436. package/dist/errors.d.ts.map +1 -1
  437. package/dist/errors.js +7 -1
  438. package/dist/errors.js.map +1 -1
  439. package/dist/index.d.ts +1 -1
  440. package/dist/index.d.ts.map +1 -1
  441. package/dist/index.js +1 -1
  442. package/dist/index.js.map +1 -1
  443. package/dist/schema-generator.d.ts +5 -1
  444. package/dist/schema-generator.d.ts.map +1 -1
  445. package/dist/schema-generator.js +1 -0
  446. package/dist/schema-generator.js.map +1 -1
  447. package/dist/steps.js +17 -13
  448. package/dist/steps.js.map +1 -1
  449. package/dist/tui.d.ts +2 -1
  450. package/dist/tui.d.ts.map +1 -1
  451. package/dist/tui.js +21 -14
  452. package/dist/tui.js.map +1 -1
  453. package/dist/types.d.ts +10 -6
  454. package/dist/types.d.ts.map +1 -1
  455. package/dist/types.js.map +1 -1
  456. package/dist/utils/date.d.ts.map +1 -1
  457. package/dist/utils/date.js +7 -2
  458. package/dist/utils/date.js.map +1 -1
  459. package/package.json +4 -3
  460. package/src/banner.ts +29 -13
  461. package/src/cli.ts +109 -13
  462. package/src/cmd/ai/capabilities/index.ts +4 -0
  463. package/src/cmd/ai/capabilities/show.ts +13 -2
  464. package/src/cmd/ai/index.ts +11 -0
  465. package/src/cmd/ai/prompt/agent.ts +342 -0
  466. package/src/cmd/ai/prompt/api.ts +274 -0
  467. package/src/cmd/ai/prompt/index.ts +18 -3
  468. package/src/cmd/ai/prompt/llm.ts +2 -2
  469. package/src/cmd/ai/prompt/web.ts +301 -0
  470. package/src/cmd/ai/schema/generate.ts +1 -1
  471. package/src/cmd/ai/schema/index.ts +2 -0
  472. package/src/cmd/ai/schema/show.ts +4 -1
  473. package/src/cmd/auth/api.ts +28 -6
  474. package/src/cmd/auth/index.ts +5 -0
  475. package/src/cmd/auth/login.ts +5 -22
  476. package/src/cmd/auth/logout.ts +4 -1
  477. package/src/cmd/auth/signup.ts +4 -1
  478. package/src/cmd/auth/ssh/add.ts +13 -4
  479. package/src/cmd/auth/ssh/api.ts +21 -5
  480. package/src/cmd/auth/ssh/delete.ts +4 -4
  481. package/src/cmd/auth/ssh/index.ts +5 -0
  482. package/src/cmd/auth/ssh/list.ts +3 -3
  483. package/src/cmd/auth/whoami.ts +4 -7
  484. package/src/cmd/build/ast.ts +636 -38
  485. package/src/cmd/build/bundler.ts +110 -37
  486. package/src/cmd/build/file.ts +1 -1
  487. package/src/cmd/build/fix-duplicate-exports.ts +4 -1
  488. package/src/cmd/build/index.ts +58 -13
  489. package/src/cmd/build/plugin.ts +210 -46
  490. package/src/cmd/cloud/agent/get.ts +5 -2
  491. package/src/cmd/cloud/agent/index.ts +5 -0
  492. package/src/cmd/cloud/agent/list.ts +3 -3
  493. package/src/cmd/cloud/apikey/create.ts +14 -5
  494. package/src/cmd/cloud/apikey/delete.ts +3 -3
  495. package/src/cmd/cloud/apikey/get.ts +1 -1
  496. package/src/cmd/cloud/apikey/index.ts +8 -0
  497. package/src/cmd/cloud/apikey/list.ts +4 -1
  498. package/src/cmd/cloud/db/create.ts +37 -22
  499. package/src/cmd/cloud/db/delete.ts +36 -21
  500. package/src/cmd/cloud/db/get.ts +12 -4
  501. package/src/cmd/cloud/db/index.ts +5 -0
  502. package/src/cmd/cloud/db/list.ts +19 -7
  503. package/src/cmd/cloud/db/sql.ts +12 -3
  504. package/src/cmd/cloud/deploy.ts +9 -3
  505. package/src/cmd/cloud/deployment/index.ts +5 -0
  506. package/src/cmd/cloud/deployment/list.ts +12 -3
  507. package/src/cmd/cloud/deployment/logs.ts +16 -4
  508. package/src/cmd/cloud/deployment/remove.ts +14 -4
  509. package/src/cmd/cloud/deployment/rollback.ts +8 -3
  510. package/src/cmd/cloud/deployment/show.ts +8 -2
  511. package/src/cmd/cloud/deployment/undeploy.ts +12 -4
  512. package/src/cmd/cloud/deployment/utils.ts +7 -1
  513. package/src/cmd/cloud/domain.ts +9 -2
  514. package/src/cmd/cloud/env/delete.ts +4 -1
  515. package/src/cmd/cloud/env/get.ts +4 -1
  516. package/src/cmd/cloud/env/import.ts +10 -0
  517. package/src/cmd/cloud/env/index.ts +8 -0
  518. package/src/cmd/cloud/env/list.ts +4 -1
  519. package/src/cmd/cloud/env/pull.ts +4 -1
  520. package/src/cmd/cloud/env/push.ts +1 -1
  521. package/src/cmd/cloud/env/set.ts +3 -3
  522. package/src/cmd/cloud/index.ts +7 -1
  523. package/src/cmd/cloud/keyvalue/create-namespace.ts +9 -4
  524. package/src/cmd/cloud/keyvalue/delete-namespace.ts +12 -4
  525. package/src/cmd/cloud/keyvalue/delete.ts +6 -4
  526. package/src/cmd/cloud/keyvalue/get.ts +3 -4
  527. package/src/cmd/cloud/keyvalue/index.ts +8 -0
  528. package/src/cmd/cloud/keyvalue/keys.ts +3 -4
  529. package/src/cmd/cloud/keyvalue/list-namespaces.ts +3 -4
  530. package/src/cmd/cloud/keyvalue/repl.ts +1 -2
  531. package/src/cmd/cloud/keyvalue/search.ts +9 -4
  532. package/src/cmd/cloud/keyvalue/set.ts +14 -4
  533. package/src/cmd/cloud/keyvalue/stats.ts +6 -4
  534. package/src/cmd/cloud/objectstore/delete-bucket.ts +8 -3
  535. package/src/cmd/cloud/objectstore/delete.ts +12 -4
  536. package/src/cmd/cloud/objectstore/get.ts +12 -4
  537. package/src/cmd/cloud/objectstore/index.ts +8 -0
  538. package/src/cmd/cloud/objectstore/list-buckets.ts +6 -2
  539. package/src/cmd/cloud/objectstore/list-keys.ts +6 -4
  540. package/src/cmd/cloud/objectstore/put.ts +16 -4
  541. package/src/cmd/cloud/objectstore/repl.ts +6 -2
  542. package/src/cmd/cloud/objectstore/url.ts +12 -4
  543. package/src/cmd/cloud/scp/download.ts +16 -5
  544. package/src/cmd/cloud/scp/index.ts +11 -0
  545. package/src/cmd/cloud/scp/upload.ts +16 -5
  546. package/src/cmd/cloud/secret/delete.ts +4 -1
  547. package/src/cmd/cloud/secret/get.ts +5 -2
  548. package/src/cmd/cloud/secret/import.ts +5 -2
  549. package/src/cmd/cloud/secret/index.ts +8 -0
  550. package/src/cmd/cloud/secret/list.ts +4 -1
  551. package/src/cmd/cloud/secret/pull.ts +4 -1
  552. package/src/cmd/cloud/secret/push.ts +1 -1
  553. package/src/cmd/cloud/secret/set.ts +8 -2
  554. package/src/cmd/cloud/session/get.ts +16 -2
  555. package/src/cmd/cloud/session/index.ts +5 -0
  556. package/src/cmd/cloud/session/list.ts +29 -8
  557. package/src/cmd/cloud/session/logs.ts +8 -2
  558. package/src/cmd/cloud/ssh.ts +15 -7
  559. package/src/cmd/cloud/storage/create.ts +12 -3
  560. package/src/cmd/cloud/storage/delete.ts +16 -4
  561. package/src/cmd/cloud/storage/download.ts +16 -4
  562. package/src/cmd/cloud/storage/get.ts +12 -3
  563. package/src/cmd/cloud/storage/index.ts +8 -0
  564. package/src/cmd/cloud/storage/list.ts +39 -15
  565. package/src/cmd/cloud/storage/upload.ts +24 -9
  566. package/src/cmd/cloud/stream/delete.ts +9 -4
  567. package/src/cmd/cloud/stream/get.ts +10 -5
  568. package/src/cmd/cloud/stream/index.ts +5 -0
  569. package/src/cmd/cloud/stream/list.ts +11 -6
  570. package/src/cmd/cloud/thread/delete.ts +44 -0
  571. package/src/cmd/cloud/thread/get.ts +88 -0
  572. package/src/cmd/cloud/thread/index.ts +17 -0
  573. package/src/cmd/cloud/thread/list.ts +125 -0
  574. package/src/cmd/cloud/vector/delete.ts +17 -6
  575. package/src/cmd/cloud/vector/get.ts +12 -4
  576. package/src/cmd/cloud/vector/index.ts +8 -0
  577. package/src/cmd/cloud/vector/search.ts +20 -6
  578. package/src/cmd/dev/agents.ts +7 -2
  579. package/src/cmd/dev/api.ts +4 -1
  580. package/src/cmd/dev/index.ts +16 -5
  581. package/src/cmd/help/index.ts +40 -0
  582. package/src/cmd/index.ts +1 -0
  583. package/src/cmd/profile/create.ts +3 -3
  584. package/src/cmd/profile/delete.ts +6 -3
  585. package/src/cmd/profile/index.ts +8 -0
  586. package/src/cmd/profile/list.ts +4 -1
  587. package/src/cmd/profile/show.ts +6 -3
  588. package/src/cmd/profile/use.ts +12 -3
  589. package/src/cmd/project/create.ts +11 -5
  590. package/src/cmd/project/delete.ts +15 -6
  591. package/src/cmd/project/download.ts +44 -3
  592. package/src/cmd/project/index.ts +5 -0
  593. package/src/cmd/project/list.ts +6 -3
  594. package/src/cmd/project/show.ts +6 -3
  595. package/src/cmd/project/templates.ts +12 -2
  596. package/src/cmd/repl/index.ts +1 -1
  597. package/src/cmd/version/index.ts +7 -1
  598. package/src/command-prefix.ts +5 -3
  599. package/src/config.ts +4 -2
  600. package/src/crypto/box.ts +69 -17
  601. package/src/download.ts +7 -1
  602. package/src/env-util.ts +44 -2
  603. package/src/errors.ts +9 -1
  604. package/src/index.ts +6 -1
  605. package/src/schema-generator.ts +7 -1
  606. package/src/steps.ts +22 -13
  607. package/src/tui.ts +28 -16
  608. package/src/types.ts +11 -6
  609. package/src/utils/date.ts +9 -4
@@ -1,16 +1,26 @@
1
1
  import * as acornLoose from 'acorn-loose';
2
2
  import { basename, dirname, relative } from 'node:path';
3
+ import { parse as parseCronExpression } from '@datasert/cronjs-parser';
3
4
  import { generate } from 'astring';
4
5
  import type { BuildMetadata } from '../../types';
5
6
  import { createLogger } from '@agentuity/server';
6
7
  import * as ts from 'typescript';
7
- import type { WorkbenchConfig } from '@agentuity/core';
8
+ import { StructuredError, type WorkbenchConfig } from '@agentuity/core';
8
9
  import type { LogLevel } from '../../types';
10
+ import { join } from 'node:path';
11
+ import { existsSync, mkdirSync } from 'node:fs';
12
+ import JSON5 from 'json5';
9
13
 
10
14
  const logger = createLogger((process.env.AGENTUITY_LOG_LEVEL || 'info') as LogLevel);
11
15
 
16
+ interface ASTProgram extends ASTNode {
17
+ body: ASTNode[];
18
+ }
19
+
12
20
  interface ASTNode {
13
21
  type: string;
22
+ start?: number;
23
+ end?: number;
14
24
  }
15
25
 
16
26
  interface ASTNodeIdentifier extends ASTNode {
@@ -166,6 +176,11 @@ function generateStableEvalId(projectId: string, agentId: string, name: string):
166
176
 
167
177
  type AcornParseResultType = ReturnType<typeof acornLoose.parse>;
168
178
 
179
+ const MetadataError = StructuredError('MetatadataNameMissingError')<{
180
+ filename: string;
181
+ line?: number;
182
+ }>();
183
+
169
184
  function augmentAgentMetadataNode(
170
185
  projectId: string,
171
186
  id: string,
@@ -178,17 +193,21 @@ function augmentAgentMetadataNode(
178
193
  ): [string, Map<string, string>] {
179
194
  const metadata = parseObjectExpressionToMap(propvalue);
180
195
  if (!metadata.has('name')) {
181
- const location = ast.loc?.start ? ` on line ${ast.loc.start}` : '';
182
- throw new Error(
183
- `missing required metadata.name in ${filename}${location}. This Agent should have a unique and human readable name for this project.`
184
- );
196
+ const location = ast.loc?.start?.line ? ` on line ${ast.loc.start.line}` : '';
197
+ throw new MetadataError({
198
+ filename,
199
+ line: ast.loc?.start?.line,
200
+ message: `missing required metadata.name in ${filename}${location}. This Agent should have a unique and human readable name for this project.`,
201
+ });
185
202
  }
186
203
  const name = metadata.get('name')!;
187
204
  if (metadata.has('identifier') && identifier !== metadata.get('identifier')) {
188
- const location = ast.loc?.start ? ` on line ${ast.loc.start}` : '';
189
- throw new Error(
190
- `metadata.identifier (${metadata.get('identifier')}) in ${filename}${location} is mismatched (${name}). This is an internal error.`
191
- );
205
+ const location = ast.loc?.start?.line ? ` on line ${ast.loc.start.line}` : '';
206
+ throw new MetadataError({
207
+ filename,
208
+ line: ast.loc?.start?.line,
209
+ message: `metadata.identifier (${metadata.get('identifier')}) in ${filename}${location} is mismatched (${name}). This is an internal error.`,
210
+ });
192
211
  }
193
212
  const descriptionNode = propvalue.properties.find((x) => x.key.name === 'description')?.value;
194
213
  const description = descriptionNode ? (descriptionNode as ASTLiteral).value : '';
@@ -244,7 +263,7 @@ function createAgentMetadataNode(
244
263
  function camelToKebab(str: string): string {
245
264
  return str
246
265
  .replace(/([a-z0-9])([A-Z])/g, '$1-$2')
247
- .replace(/([A-Z])([A-Z][a-z])/g, '$1-$2')
266
+ .replace(/([A-Z]+)([A-Z][a-z])/g, '$1-$2')
248
267
  .toLowerCase();
249
268
  }
250
269
 
@@ -367,6 +386,8 @@ function augmentEvalMetadataNode(
367
386
  }
368
387
  }
369
388
 
389
+ const DuplicateNameError = StructuredError('DuplicateNameError')<{ filename: string }>();
390
+
370
391
  export function parseEvalMetadata(
371
392
  rootDir: string,
372
393
  filename: string,
@@ -394,7 +415,11 @@ export function parseEvalMetadata(
394
415
  | 'error';
395
416
  const logger = createLogger(logLevel);
396
417
  logger.trace(`Parsing evals from ${filename}`);
397
- const ast = acornLoose.parse(contents, { ecmaVersion: 'latest', sourceType: 'module' });
418
+ const ast = acornLoose.parse(contents, {
419
+ locations: true,
420
+ ecmaVersion: 'latest',
421
+ sourceType: 'module',
422
+ });
398
423
  const rel = relative(rootDir, filename);
399
424
  const version = hash(contents);
400
425
  const evals: Array<{
@@ -484,9 +509,12 @@ export function parseEvalMetadata(
484
509
  } else if (variableName) {
485
510
  finalName = camelToKebab(variableName);
486
511
  } else {
487
- throw new Error(
488
- 'Eval is missing a name. Please provide metadata.name or use a named export.'
489
- );
512
+ throw new MetadataError({
513
+ filename,
514
+ line: body.loc?.start?.line,
515
+ message:
516
+ 'Eval is missing a name. Please provide metadata.name or use a named export.',
517
+ });
490
518
  }
491
519
 
492
520
  logger.trace(
@@ -563,10 +591,12 @@ export function parseEvalMetadata(
563
591
  }
564
592
 
565
593
  if (duplicates.length > 0) {
566
- throw new Error(
567
- `Duplicate eval names found in ${rel}: ${duplicates.join(', ')}. ` +
568
- 'Eval names must be unique within the same file to prevent ID collisions.'
569
- );
594
+ throw new DuplicateNameError({
595
+ filename,
596
+ message:
597
+ `Duplicate eval names found in ${rel}: ${duplicates.join(', ')}. ` +
598
+ 'Eval names must be unique within the same file to prevent ID collisions.',
599
+ });
570
600
  }
571
601
 
572
602
  const newsource = generate(ast);
@@ -574,6 +604,9 @@ export function parseEvalMetadata(
574
604
  return [newsource, evals];
575
605
  }
576
606
 
607
+ const InvalidExportError = StructuredError('InvalidExportError')<{ filename: string }>();
608
+ const InvalidCreateAgentError = StructuredError('InvalidCreateAgentError')<{ filename: string }>();
609
+
577
610
  export async function parseAgentMetadata(
578
611
  rootDir: string,
579
612
  filename: string,
@@ -581,7 +614,11 @@ export async function parseAgentMetadata(
581
614
  projectId: string,
582
615
  deploymentId: string
583
616
  ): Promise<[string, Map<string, string>]> {
584
- const ast = acornLoose.parse(contents, { ecmaVersion: 'latest', sourceType: 'module' });
617
+ const ast = acornLoose.parse(contents, {
618
+ locations: true,
619
+ ecmaVersion: 'latest',
620
+ sourceType: 'module',
621
+ });
585
622
  let exportName: string | undefined;
586
623
  const rel = relative(rootDir, filename);
587
624
  const name = basename(dirname(filename));
@@ -635,7 +672,10 @@ export async function parseAgentMetadata(
635
672
  }
636
673
  }
637
674
  if (!result && !exportName) {
638
- throw new Error(`could not find default export for ${filename} using ${rootDir}`);
675
+ throw new InvalidExportError({
676
+ filename,
677
+ message: `could not find default export for ${filename} using ${rootDir}`,
678
+ });
639
679
  }
640
680
  if (!result) {
641
681
  for (const body of ast.body) {
@@ -689,9 +729,10 @@ export async function parseAgentMetadata(
689
729
  }
690
730
  }
691
731
  if (!result) {
692
- throw new Error(
693
- `error parsing: ${filename}. could not find an proper createAgent defined in this file`
694
- );
732
+ throw new InvalidCreateAgentError({
733
+ filename,
734
+ message: `error parsing: ${filename}. could not find an proper createAgent defined in this file`,
735
+ });
695
736
  }
696
737
 
697
738
  // Parse evals from eval.ts file in the same directory
@@ -735,6 +776,15 @@ export async function parseAgentMetadata(
735
776
 
736
777
  type RouteDefinition = BuildMetadata['routes'];
737
778
 
779
+ const InvalidCreateRouterError = StructuredError('InvalidCreateRouterError')<{
780
+ filename: string;
781
+ }>();
782
+
783
+ const InvalidRouterConfigError = StructuredError('InvalidRouterConfigError')<{
784
+ filename: string;
785
+ line?: number;
786
+ }>();
787
+
738
788
  export async function parseRoute(
739
789
  rootDir: string,
740
790
  filename: string,
@@ -743,7 +793,11 @@ export async function parseRoute(
743
793
  ): Promise<BuildMetadata['routes']> {
744
794
  const contents = await Bun.file(filename).text();
745
795
  const version = hash(contents);
746
- const ast = acornLoose.parse(contents, { ecmaVersion: 'latest', sourceType: 'module' });
796
+ const ast = acornLoose.parse(contents, {
797
+ locations: true,
798
+ ecmaVersion: 'latest',
799
+ sourceType: 'module',
800
+ });
747
801
  let exportName: string | undefined;
748
802
  let variableName: string | undefined;
749
803
  for (const body of ast.body) {
@@ -754,7 +808,10 @@ export async function parseRoute(
754
808
  }
755
809
  }
756
810
  if (!exportName) {
757
- throw new Error(`could not find default export for ${filename} using ${rootDir}`);
811
+ throw new InvalidExportError({
812
+ filename,
813
+ message: `could not find default export for ${filename} using ${rootDir}`,
814
+ });
758
815
  }
759
816
  for (const body of ast.body) {
760
817
  if (body.type === 'VariableDeclaration') {
@@ -775,9 +832,10 @@ export async function parseRoute(
775
832
  }
776
833
  }
777
834
  if (!variableName) {
778
- throw new Error(
779
- `error parsing: ${filename}. could not find an proper createRouter defined in this file`
780
- );
835
+ throw new InvalidCreateRouterError({
836
+ filename,
837
+ message: `error parsing: ${filename}. could not find an proper createRouter defined in this file`,
838
+ });
781
839
  }
782
840
 
783
841
  const rel = relative(rootDir, filename);
@@ -831,9 +889,11 @@ export async function parseRoute(
831
889
  if (action && (action as ASTLiteral).type === 'Literal') {
832
890
  suffix = (action as ASTLiteral).value;
833
891
  } else {
834
- throw new Error(
835
- `unsupported HTTP method ${method} in ${filename} at line ${body.start}`
836
- );
892
+ throw new InvalidRouterConfigError({
893
+ filename,
894
+ line: body.loc?.start?.line,
895
+ message: `unsupported HTTP method ${method} in ${filename} at line ${body.loc?.start?.line}`,
896
+ });
837
897
  }
838
898
  break;
839
899
  }
@@ -886,16 +946,29 @@ export async function parseRoute(
886
946
  method = 'post';
887
947
  const theaction = action as ASTLiteral;
888
948
  if (theaction.type === 'Literal') {
889
- const number = theaction.value;
890
- suffix = hash(number);
949
+ const expression = theaction.value;
950
+ try {
951
+ parseCronExpression(expression, { hasSeconds: false });
952
+ } catch (ex) {
953
+ throw new InvalidRouterConfigError({
954
+ filename,
955
+ cause: ex,
956
+ line: body.loc?.start?.line,
957
+ message: `invalid cron expression "${expression}" in ${filename} at line ${body.loc?.start?.line}`,
958
+ });
959
+ }
960
+ suffix = hash(expression);
961
+ config = { expression };
891
962
  break;
892
963
  }
893
964
  break;
894
965
  }
895
966
  default: {
896
- throw new Error(
897
- `unsupported router method ${method} in ${filename} at line ${body.start}`
898
- );
967
+ throw new InvalidRouterConfigError({
968
+ filename,
969
+ line: body.loc?.start?.line,
970
+ message: `unsupported router method ${method} in ${filename} at line ${body.loc?.start?.line}`,
971
+ });
899
972
  }
900
973
  }
901
974
  const thepath = `${routePrefix}/${routeName}/${suffix}`
@@ -924,8 +997,13 @@ export async function parseRoute(
924
997
  }
925
998
  }
926
999
  } catch (error) {
927
- const err = error instanceof Error ? error : new Error(String(error));
928
- throw new Error(`Failed to parse route file ${filename}: ${err.message}`);
1000
+ if (error instanceof InvalidRouterConfigError) {
1001
+ throw error;
1002
+ }
1003
+ throw new InvalidRouterConfigError({
1004
+ filename,
1005
+ cause: error,
1006
+ });
929
1007
  }
930
1008
  return routes;
931
1009
  }
@@ -1019,6 +1097,431 @@ export function checkRouteConflicts(content: string, workbenchEndpoint: string):
1019
1097
  }
1020
1098
  }
1021
1099
 
1100
+ /**
1101
+ * Extract AppState type from setup() return value in createApp call
1102
+ *
1103
+ * @param content - The TypeScript source code from app.ts
1104
+ * @returns Type definition string or null if no setup found
1105
+ */
1106
+ export function extractAppStateType(content: string): string | null {
1107
+ try {
1108
+ const sourceFile = ts.createSourceFile('app.ts', content, ts.ScriptTarget.Latest, true);
1109
+ let appStateType: string | null = null;
1110
+ let foundCreateApp = false;
1111
+ let foundSetup = false;
1112
+
1113
+ function visitNode(node: ts.Node): void {
1114
+ // Look for createApp call expression (can be on await expression)
1115
+ let callExpr: ts.CallExpression | undefined;
1116
+
1117
+ if (ts.isCallExpression(node) && ts.isIdentifier(node.expression)) {
1118
+ if (node.expression.text === 'createApp') {
1119
+ foundCreateApp = true;
1120
+ callExpr = node;
1121
+ }
1122
+ } else if (ts.isAwaitExpression(node) && ts.isCallExpression(node.expression)) {
1123
+ const call = node.expression;
1124
+ if (ts.isIdentifier(call.expression) && call.expression.text === 'createApp') {
1125
+ foundCreateApp = true;
1126
+ callExpr = call;
1127
+ }
1128
+ }
1129
+
1130
+ if (callExpr) {
1131
+ // Check if it has a config object argument
1132
+ if (callExpr.arguments.length > 0) {
1133
+ const configArg = callExpr.arguments[0];
1134
+ if (ts.isObjectLiteralExpression(configArg)) {
1135
+ // Find setup property
1136
+ for (const prop of configArg.properties) {
1137
+ if (
1138
+ ts.isPropertyAssignment(prop) &&
1139
+ ts.isIdentifier(prop.name) &&
1140
+ prop.name.text === 'setup'
1141
+ ) {
1142
+ foundSetup = true;
1143
+ // Found setup function - extract return type
1144
+ const setupFunc = prop.initializer;
1145
+ if (ts.isFunctionExpression(setupFunc) || ts.isArrowFunction(setupFunc)) {
1146
+ // Find return statement
1147
+ const returnObj = findReturnObject(setupFunc);
1148
+ if (returnObj) {
1149
+ appStateType = objectLiteralToTypeDefinition(returnObj, sourceFile);
1150
+ } else {
1151
+ logger.debug('No return object found in setup function');
1152
+ }
1153
+ } else {
1154
+ logger.debug(
1155
+ `Setup is not a function expression or arrow function, it's: ${ts.SyntaxKind[setupFunc.kind]}`
1156
+ );
1157
+ }
1158
+ }
1159
+ }
1160
+ }
1161
+ }
1162
+ }
1163
+
1164
+ ts.forEachChild(node, visitNode);
1165
+ }
1166
+
1167
+ function findReturnObject(
1168
+ func: ts.FunctionExpression | ts.ArrowFunction
1169
+ ): ts.ObjectLiteralExpression | null {
1170
+ let returnObject: ts.ObjectLiteralExpression | null = null;
1171
+
1172
+ function visitFuncNode(node: ts.Node): void {
1173
+ if (ts.isReturnStatement(node) && node.expression) {
1174
+ // Handle direct object literal
1175
+ if (ts.isObjectLiteralExpression(node.expression)) {
1176
+ returnObject = node.expression;
1177
+ }
1178
+ // Handle variable reference (const state = {...}; return state;)
1179
+ else if (ts.isIdentifier(node.expression)) {
1180
+ // Try to find the variable declaration
1181
+ const varName = node.expression.text;
1182
+ // Walk back through the function to find the declaration
1183
+ findVariableDeclaration(func.body!, varName);
1184
+ }
1185
+ }
1186
+ ts.forEachChild(node, visitFuncNode);
1187
+ }
1188
+
1189
+ function findVariableDeclaration(body: ts.Node, varName: string): void {
1190
+ function visitForVar(node: ts.Node): void {
1191
+ if (ts.isVariableStatement(node)) {
1192
+ for (const decl of node.declarationList.declarations) {
1193
+ if (ts.isIdentifier(decl.name) && decl.name.text === varName) {
1194
+ if (decl.initializer && ts.isObjectLiteralExpression(decl.initializer)) {
1195
+ returnObject = decl.initializer;
1196
+ }
1197
+ }
1198
+ }
1199
+ }
1200
+ ts.forEachChild(node, visitForVar);
1201
+ }
1202
+ visitForVar(body);
1203
+ }
1204
+
1205
+ if (func.body) {
1206
+ visitFuncNode(func.body);
1207
+ }
1208
+
1209
+ return returnObject;
1210
+ }
1211
+
1212
+ function objectLiteralToTypeDefinition(
1213
+ obj: ts.ObjectLiteralExpression,
1214
+ sourceFile: ts.SourceFile
1215
+ ): string {
1216
+ const properties: string[] = [];
1217
+
1218
+ for (const prop of obj.properties) {
1219
+ if (ts.isPropertyAssignment(prop)) {
1220
+ const name = prop.name.getText(sourceFile);
1221
+ const value = prop.initializer;
1222
+ const typeStr = inferTypeFromValue(value, sourceFile);
1223
+ properties.push(`\t${name}: ${typeStr};`);
1224
+ } else if (ts.isShorthandPropertyAssignment(prop)) {
1225
+ const name = prop.name.getText(sourceFile);
1226
+ properties.push(`\t${name}: unknown;`);
1227
+ }
1228
+ }
1229
+
1230
+ return `{\n${properties.join('\n')}\n}`;
1231
+ }
1232
+
1233
+ function inferTypeFromValue(value: ts.Expression, sourceFile: ts.SourceFile): string {
1234
+ if (ts.isStringLiteral(value)) {
1235
+ return 'string';
1236
+ }
1237
+ if (ts.isNumericLiteral(value)) {
1238
+ return 'number';
1239
+ }
1240
+ if (
1241
+ value.kind === ts.SyntaxKind.TrueKeyword ||
1242
+ value.kind === ts.SyntaxKind.FalseKeyword
1243
+ ) {
1244
+ return 'boolean';
1245
+ }
1246
+ if (ts.isNewExpression(value) && ts.isIdentifier(value.expression)) {
1247
+ if (value.expression.text === 'Date') {
1248
+ return 'Date';
1249
+ }
1250
+ }
1251
+ if (ts.isObjectLiteralExpression(value)) {
1252
+ return objectLiteralToTypeDefinition(value, sourceFile);
1253
+ }
1254
+ if (ts.isArrayLiteralExpression(value)) {
1255
+ return 'unknown[]';
1256
+ }
1257
+ return 'unknown';
1258
+ }
1259
+
1260
+ visitNode(sourceFile);
1261
+
1262
+ if (!foundCreateApp) {
1263
+ logger.debug('Did not find createApp call in app.ts');
1264
+ } else if (!foundSetup) {
1265
+ logger.debug('Found createApp but no setup property');
1266
+ } else if (!appStateType) {
1267
+ logger.debug('Found createApp and setup but could not extract type');
1268
+ }
1269
+
1270
+ return appStateType;
1271
+ } catch (error) {
1272
+ logger.warn('AppState type extraction failed:', error);
1273
+ return null;
1274
+ }
1275
+ }
1276
+
1277
+ /**
1278
+ * Update tsconfig.json to add path mapping for @agentuity/runtime
1279
+ *
1280
+ * @param rootDir - Root directory of the project
1281
+ * @param shouldAdd - If true, add the mapping; if false, remove it
1282
+ */
1283
+ async function updateTsconfigPathMapping(rootDir: string, shouldAdd: boolean): Promise<void> {
1284
+ const tsconfigPath = join(rootDir, 'tsconfig.json');
1285
+
1286
+ if (!(await Bun.file(tsconfigPath).exists())) {
1287
+ logger.debug('No tsconfig.json found, skipping path mapping update');
1288
+ return;
1289
+ }
1290
+
1291
+ try {
1292
+ const tsconfigContent = await Bun.file(tsconfigPath).text();
1293
+
1294
+ // Use JSON5 to parse tsconfig.json (handles comments in input)
1295
+ const tsconfig = JSON5.parse(tsconfigContent);
1296
+ const _before = JSON.stringify(tsconfig);
1297
+
1298
+ // Initialize compilerOptions and paths if they don't exist
1299
+ if (!tsconfig.compilerOptions) {
1300
+ tsconfig.compilerOptions = {};
1301
+ }
1302
+ if (!tsconfig.compilerOptions.paths) {
1303
+ tsconfig.compilerOptions.paths = {};
1304
+ }
1305
+
1306
+ if (shouldAdd) {
1307
+ // Add or update the path mapping
1308
+ tsconfig.compilerOptions.paths['@agentuity/runtime'] = [
1309
+ './.agentuity/.agentuity_runtime.ts',
1310
+ ];
1311
+
1312
+ // Ensure .agentuity_types.ts is included so module augmentation works
1313
+ if (!tsconfig.include) {
1314
+ tsconfig.include = [];
1315
+ }
1316
+ if (!tsconfig.include.includes('.agentuity/.agentuity_types.ts')) {
1317
+ tsconfig.include.push('.agentuity/.agentuity_types.ts');
1318
+ }
1319
+
1320
+ logger.debug('Added @agentuity/runtime path mapping to tsconfig.json');
1321
+ } else {
1322
+ // Remove the path mapping if it exists
1323
+ if (tsconfig.compilerOptions.paths['@agentuity/runtime']) {
1324
+ delete tsconfig.compilerOptions.paths['@agentuity/runtime'];
1325
+ logger.debug('Removed @agentuity/runtime path mapping from tsconfig.json');
1326
+ }
1327
+
1328
+ // Clean up empty paths object
1329
+ if (Object.keys(tsconfig.compilerOptions.paths).length === 0) {
1330
+ delete tsconfig.compilerOptions.paths;
1331
+ }
1332
+ }
1333
+
1334
+ const _after = JSON.stringify(tsconfig);
1335
+ if (_before === _after) {
1336
+ return;
1337
+ }
1338
+
1339
+ // Write back using standard JSON (TypeScript requires strict JSON format)
1340
+ await Bun.write(tsconfigPath, JSON.stringify(tsconfig, null, '\t') + '\n');
1341
+ } catch (error) {
1342
+ logger.warn('Failed to update tsconfig.json:', error);
1343
+ }
1344
+ }
1345
+
1346
+ const RuntimePackageNotFound = StructuredError('RuntimePackageNotFound');
1347
+
1348
+ /**
1349
+ * Generate lifecycle type files (.agentuity/types.ts and .agentuity/.agentuity_runtime.ts)
1350
+ *
1351
+ * @param rootDir - Root directory of the project
1352
+ * @param appFilePath - Path to app.ts file
1353
+ * @returns true if files were generated, false if no setup found
1354
+ */
1355
+ export async function generateLifecycleTypes(
1356
+ rootDir: string,
1357
+ outDir: string,
1358
+ appFilePath: string
1359
+ ): Promise<boolean> {
1360
+ const appContent = await Bun.file(appFilePath).text();
1361
+ if (typeof appContent !== 'string') {
1362
+ return false;
1363
+ }
1364
+
1365
+ const appStateType = extractAppStateType(appContent as string);
1366
+
1367
+ if (!appStateType) {
1368
+ logger.debug('No setup() function found in app.ts, skipping lifecycle type generation');
1369
+ // Remove path mapping if no setup found
1370
+ await updateTsconfigPathMapping(rootDir, false);
1371
+ return false;
1372
+ }
1373
+
1374
+ const agentuityDir = join(rootDir, '.agentuity');
1375
+
1376
+ // Ensure .agentuity directory exists
1377
+ if (!existsSync(agentuityDir)) {
1378
+ mkdirSync(agentuityDir, { recursive: true });
1379
+ }
1380
+
1381
+ // First, determine the runtime package location
1382
+ // Try multiple locations: app-level node_modules, then monorepo root
1383
+ const appLevelPath = join(rootDir, 'node_modules', '@agentuity', 'runtime');
1384
+ // From apps/testing/auth-app to monorepo root is 3 levels up (../../..)
1385
+ const rootLevelPath = join(rootDir, '..', '..', '..', 'node_modules', '@agentuity', 'runtime');
1386
+
1387
+ let runtimePkgPath: string;
1388
+ if (existsSync(appLevelPath)) {
1389
+ runtimePkgPath = appLevelPath;
1390
+ logger.debug(`Found runtime package at app level: ${appLevelPath}`);
1391
+ } else if (existsSync(rootLevelPath)) {
1392
+ runtimePkgPath = rootLevelPath;
1393
+ logger.debug(`Found runtime package at root level: ${rootLevelPath}`);
1394
+ } else {
1395
+ throw new RuntimePackageNotFound({
1396
+ message:
1397
+ `@agentuity/runtime package not found in:\n` +
1398
+ ` - ${appLevelPath}\n` +
1399
+ ` - ${rootLevelPath}\n` +
1400
+ `Make sure dependencies are installed by running 'bun install' or 'npm install'`,
1401
+ });
1402
+ }
1403
+
1404
+ let runtimeImportPath: string | null = null;
1405
+
1406
+ // Calculate relative path from .agentuity/ to the package location
1407
+ // Don't resolve symlinks - we want to use the symlink path so it works in both
1408
+ // local dev (symlinked to packages/) and CI (actual node_modules)
1409
+ if (existsSync(runtimePkgPath)) {
1410
+ // Calculate relative path from .agentuity/ to node_modules package
1411
+ const relPath = relative(agentuityDir, runtimePkgPath);
1412
+ runtimeImportPath = relPath;
1413
+ logger.debug(`Using relative path to runtime package: ${relPath}`);
1414
+ } else {
1415
+ throw new RuntimePackageNotFound({
1416
+ message:
1417
+ `Failed to access @agentuity/runtime package at ${runtimePkgPath}\n` +
1418
+ `Make sure dependencies are installed`,
1419
+ });
1420
+ }
1421
+
1422
+ if (!runtimeImportPath) {
1423
+ throw new RuntimePackageNotFound({
1424
+ message: `Failed to determine import path for @agentuity/runtime`,
1425
+ });
1426
+ }
1427
+
1428
+ // Now generate .agentuity_types.ts
1429
+ // NOTE: We can ONLY augment the package name, not relative paths
1430
+ // TypeScript resolves @agentuity/runtime through path mapping -> wrapper -> actual package
1431
+ const typesContent = `// AUTO-GENERATED from app.ts setup() return type
1432
+ // This file is auto-generated by the build tool - do not edit manually
1433
+
1434
+ /**
1435
+ * Application state type inferred from your createApp setup function.
1436
+ * This type is automatically generated and available throughout your app via ctx.app.
1437
+ *
1438
+ * @example
1439
+ * \`\`\`typescript
1440
+ * // In your agents:
1441
+ * const agent = createAgent({
1442
+ * handler: async (ctx, input) => {
1443
+ * // ctx.app is strongly typed as GeneratedAppState
1444
+ * const value = ctx.app; // All properties from your setup return value
1445
+ * return 'result';
1446
+ * }
1447
+ * });
1448
+ * \`\`\`
1449
+ */
1450
+ export type GeneratedAppState = ${appStateType};
1451
+
1452
+ // Augment the @agentuity/runtime module with AppState
1453
+ // This will be picked up when imported through the wrapper
1454
+ declare module '@agentuity/runtime' {
1455
+ interface AppState extends GeneratedAppState {}
1456
+ }
1457
+ `;
1458
+ const typesPath = join(outDir, '.agentuity_types.ts');
1459
+ await Bun.write(typesPath, typesContent);
1460
+ logger.debug(`Generated lifecycle types: ${typesPath}`);
1461
+
1462
+ const wrapperContent = `// AUTO-GENERATED runtime wrapper
1463
+ // This file is auto-generated by the build tool - do not edit manually
1464
+
1465
+ // Import augmentations file (NOT type-only) to trigger module augmentation
1466
+ import type { GeneratedAppState } from './.agentuity_types';
1467
+ import './.agentuity_types';
1468
+
1469
+ // Import from actual package location
1470
+ import { createRouter as baseCreateRouter, type Env } from '${runtimeImportPath}/src/index';
1471
+ import type { Hono } from 'hono';
1472
+
1473
+ // Type aliases to avoid repeating the generic parameter
1474
+ type AppEnv = Env<GeneratedAppState>;
1475
+ type AppRouter = Hono<AppEnv>;
1476
+
1477
+ /**
1478
+ * Creates a Hono router with extended methods for Agentuity-specific routing patterns.
1479
+ *
1480
+ * In addition to standard HTTP methods (get, post, put, delete, patch), the router includes:
1481
+ * - **stream()** - Stream responses with ReadableStream
1482
+ * - **websocket()** - WebSocket connections
1483
+ * - **sse()** - Server-Sent Events
1484
+ * - **email()** - Email handler routing
1485
+ * - **sms()** - SMS handler routing
1486
+ * - **cron()** - Scheduled task routing
1487
+ *
1488
+ * @returns Extended Hono router with custom methods and app state typing
1489
+ *
1490
+ * @example
1491
+ * \`\`\`typescript
1492
+ * const router = createRouter();
1493
+ *
1494
+ * // Standard HTTP routes
1495
+ * router.get('/hello', (c) => c.text('Hello!'));
1496
+ * router.post('/data', async (c) => {
1497
+ * const body = await c.req.json();
1498
+ * return c.json({ received: body });
1499
+ * });
1500
+ *
1501
+ * // Access app state (strongly typed!)
1502
+ * router.get('/db', (c) => {
1503
+ * const db = c.var.app; // Your app state from createApp setup
1504
+ * return c.json({ connected: true });
1505
+ * });
1506
+ * \`\`\`
1507
+ */
1508
+ export function createRouter(): AppRouter {
1509
+ return baseCreateRouter() as any;
1510
+ }
1511
+
1512
+ // Re-export everything else
1513
+ export * from '${runtimeImportPath}/src/index';
1514
+ `;
1515
+ const wrapperPath = join(outDir, '.agentuity_runtime.ts');
1516
+ await Bun.write(wrapperPath, wrapperContent);
1517
+ logger.debug(`Generated lifecycle wrapper: ${wrapperPath}`);
1518
+
1519
+ // Update tsconfig.json with path mapping
1520
+ await updateTsconfigPathMapping(rootDir, true);
1521
+
1522
+ return true;
1523
+ }
1524
+
1022
1525
  /**
1023
1526
  * Analyze workbench usage and extract configuration
1024
1527
  *
@@ -1115,3 +1618,98 @@ function parseConfigObject(node: ts.Node): WorkbenchConfig | null {
1115
1618
 
1116
1619
  return config;
1117
1620
  }
1621
+
1622
+ /**
1623
+ * Find the end position of createApp call statement in the source code
1624
+ * Uses AST parsing to reliably find the complete statement including await/const assignment
1625
+ *
1626
+ * @param content - The source code content
1627
+ * @returns The character position after the createApp statement, or -1 if not found
1628
+ */
1629
+ export function findCreateAppEndPosition(content: string): number {
1630
+ try {
1631
+ const ast = acornLoose.parse(content, {
1632
+ ecmaVersion: 'latest',
1633
+ sourceType: 'module',
1634
+ }) as ASTProgram;
1635
+
1636
+ // Walk through all top-level statements
1637
+ for (const node of ast.body) {
1638
+ let targetNode: ASTNode | undefined;
1639
+
1640
+ // Check for: const app = await createApp(...)
1641
+ if (node.type === 'VariableDeclaration') {
1642
+ const varDecl = node as unknown as { declarations: ASTVariableDeclarator[] };
1643
+ for (const declarator of varDecl.declarations) {
1644
+ if (declarator.init) {
1645
+ // Handle await createApp(...)
1646
+ if (declarator.init.type === 'AwaitExpression') {
1647
+ const awaitExpr = declarator.init as unknown as {
1648
+ argument: ASTCallExpression;
1649
+ };
1650
+ if (
1651
+ awaitExpr.argument?.type === 'CallExpression' &&
1652
+ isCreateAppCall(awaitExpr.argument)
1653
+ ) {
1654
+ targetNode = node;
1655
+ break;
1656
+ }
1657
+ }
1658
+ // Handle createApp(...) without await
1659
+ else if (declarator.init.type === 'CallExpression') {
1660
+ if (isCreateAppCall(declarator.init as ASTCallExpression)) {
1661
+ targetNode = node;
1662
+ break;
1663
+ }
1664
+ }
1665
+ }
1666
+ }
1667
+ }
1668
+ // Check for: await createApp(...)
1669
+ else if (node.type === 'ExpressionStatement') {
1670
+ const exprStmt = node as ASTExpressionStatement;
1671
+ if (exprStmt.expression.type === 'AwaitExpression') {
1672
+ const awaitExpr = exprStmt.expression as unknown as { argument: ASTCallExpression };
1673
+ if (
1674
+ awaitExpr.argument?.type === 'CallExpression' &&
1675
+ isCreateAppCall(awaitExpr.argument)
1676
+ ) {
1677
+ targetNode = node;
1678
+ }
1679
+ } else if (exprStmt.expression.type === 'CallExpression') {
1680
+ if (isCreateAppCall(exprStmt.expression as ASTCallExpression)) {
1681
+ targetNode = node;
1682
+ }
1683
+ }
1684
+ }
1685
+
1686
+ if (targetNode && targetNode.end !== undefined) {
1687
+ // Find the semicolon after the statement (if it exists)
1688
+ const afterStmt = content.slice(targetNode.end);
1689
+ const semiMatch = afterStmt.match(/^\s*;/);
1690
+ if (semiMatch) {
1691
+ return targetNode.end + semiMatch[0].length;
1692
+ }
1693
+ // No semicolon, return end of statement
1694
+ return targetNode.end;
1695
+ }
1696
+ }
1697
+
1698
+ return -1;
1699
+ } catch (error) {
1700
+ logger.warn('Failed to parse AST for createApp detection:', error);
1701
+ return -1;
1702
+ }
1703
+ }
1704
+
1705
+ /**
1706
+ * Check if a CallExpression is a call to createApp
1707
+ */
1708
+ function isCreateAppCall(node: ASTCallExpression): boolean {
1709
+ const callee = node.callee;
1710
+ if (callee.type === 'Identifier') {
1711
+ const id = callee as ASTNodeIdentifier;
1712
+ return id.name === 'createApp';
1713
+ }
1714
+ return false;
1715
+ }