@agentuity/cli 2.0.0-beta.0 → 2.0.0-beta.1

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 (427) hide show
  1. package/bin/cli.ts +5 -0
  2. package/dist/auth.d.ts +1 -1
  3. package/dist/auth.d.ts.map +1 -1
  4. package/dist/auth.js +12 -1
  5. package/dist/auth.js.map +1 -1
  6. package/dist/cli.d.ts.map +1 -1
  7. package/dist/cli.js +29 -1
  8. package/dist/cli.js.map +1 -1
  9. package/dist/cmd/auth/ssh/delete.js +1 -1
  10. package/dist/cmd/auth/ssh/delete.js.map +1 -1
  11. package/dist/cmd/build/app-config-extractor.d.ts +27 -0
  12. package/dist/cmd/build/app-config-extractor.d.ts.map +1 -0
  13. package/dist/cmd/build/app-config-extractor.js +152 -0
  14. package/dist/cmd/build/app-config-extractor.js.map +1 -0
  15. package/dist/cmd/build/ci.d.ts +18 -0
  16. package/dist/cmd/build/ci.d.ts.map +1 -0
  17. package/dist/cmd/build/ci.js +181 -0
  18. package/dist/cmd/build/ci.js.map +1 -0
  19. package/dist/cmd/build/index.d.ts.map +1 -1
  20. package/dist/cmd/build/index.js +53 -14
  21. package/dist/cmd/build/index.js.map +1 -1
  22. package/dist/cmd/build/vite/bun-dev-server.d.ts +35 -0
  23. package/dist/cmd/build/vite/bun-dev-server.d.ts.map +1 -1
  24. package/dist/cmd/build/vite/bun-dev-server.js +232 -4
  25. package/dist/cmd/build/vite/bun-dev-server.js.map +1 -1
  26. package/dist/cmd/build/vite/config-loader.d.ts +15 -20
  27. package/dist/cmd/build/vite/config-loader.d.ts.map +1 -1
  28. package/dist/cmd/build/vite/config-loader.js +41 -74
  29. package/dist/cmd/build/vite/config-loader.js.map +1 -1
  30. package/dist/cmd/build/vite/static-renderer.d.ts +0 -2
  31. package/dist/cmd/build/vite/static-renderer.d.ts.map +1 -1
  32. package/dist/cmd/build/vite/static-renderer.js +28 -14
  33. package/dist/cmd/build/vite/static-renderer.js.map +1 -1
  34. package/dist/cmd/build/vite/tailwind-source-plugin.d.ts +15 -0
  35. package/dist/cmd/build/vite/tailwind-source-plugin.d.ts.map +1 -0
  36. package/dist/cmd/build/vite/tailwind-source-plugin.js +61 -0
  37. package/dist/cmd/build/vite/tailwind-source-plugin.js.map +1 -0
  38. package/dist/cmd/build/vite/vite-asset-server-config.d.ts.map +1 -1
  39. package/dist/cmd/build/vite/vite-asset-server-config.js +4 -48
  40. package/dist/cmd/build/vite/vite-asset-server-config.js.map +1 -1
  41. package/dist/cmd/build/vite/vite-builder.d.ts.map +1 -1
  42. package/dist/cmd/build/vite/vite-builder.js +38 -156
  43. package/dist/cmd/build/vite/vite-builder.js.map +1 -1
  44. package/dist/cmd/cloud/agent/get.d.ts.map +1 -1
  45. package/dist/cmd/cloud/agent/get.js +1 -0
  46. package/dist/cmd/cloud/agent/get.js.map +1 -1
  47. package/dist/cmd/cloud/apikey/delete.js +1 -1
  48. package/dist/cmd/cloud/apikey/delete.js.map +1 -1
  49. package/dist/cmd/cloud/apikey/get.d.ts.map +1 -1
  50. package/dist/cmd/cloud/apikey/get.js +1 -0
  51. package/dist/cmd/cloud/apikey/get.js.map +1 -1
  52. package/dist/cmd/cloud/apikey/index.d.ts.map +1 -1
  53. package/dist/cmd/cloud/apikey/index.js +1 -0
  54. package/dist/cmd/cloud/apikey/index.js.map +1 -1
  55. package/dist/cmd/cloud/db/delete.js +1 -1
  56. package/dist/cmd/cloud/db/delete.js.map +1 -1
  57. package/dist/cmd/cloud/deploy.js +1 -1
  58. package/dist/cmd/cloud/deploy.js.map +1 -1
  59. package/dist/cmd/cloud/deployment/remove.js +17 -17
  60. package/dist/cmd/cloud/deployment/remove.js.map +1 -1
  61. package/dist/cmd/cloud/deployment/show.js +1 -1
  62. package/dist/cmd/cloud/deployment/show.js.map +1 -1
  63. package/dist/cmd/cloud/email/create.js +1 -1
  64. package/dist/cmd/cloud/email/create.js.map +1 -1
  65. package/dist/cmd/cloud/email/delete.js +1 -1
  66. package/dist/cmd/cloud/email/delete.js.map +1 -1
  67. package/dist/cmd/cloud/email/destination/delete.js +1 -1
  68. package/dist/cmd/cloud/email/destination/delete.js.map +1 -1
  69. package/dist/cmd/cloud/email/get.d.ts.map +1 -1
  70. package/dist/cmd/cloud/email/get.js +1 -0
  71. package/dist/cmd/cloud/email/get.js.map +1 -1
  72. package/dist/cmd/cloud/email/inbound/get.d.ts.map +1 -1
  73. package/dist/cmd/cloud/email/inbound/get.js +1 -0
  74. package/dist/cmd/cloud/email/inbound/get.js.map +1 -1
  75. package/dist/cmd/cloud/email/outbound/get.d.ts.map +1 -1
  76. package/dist/cmd/cloud/email/outbound/get.js +1 -0
  77. package/dist/cmd/cloud/email/outbound/get.js.map +1 -1
  78. package/dist/cmd/cloud/env/delete.js +1 -1
  79. package/dist/cmd/cloud/env/delete.js.map +1 -1
  80. package/dist/cmd/cloud/env/get.d.ts.map +1 -1
  81. package/dist/cmd/cloud/env/get.js +1 -0
  82. package/dist/cmd/cloud/env/get.js.map +1 -1
  83. package/dist/cmd/cloud/eval/get.d.ts.map +1 -1
  84. package/dist/cmd/cloud/eval/get.js +1 -0
  85. package/dist/cmd/cloud/eval/get.js.map +1 -1
  86. package/dist/cmd/cloud/eval/index.d.ts.map +1 -1
  87. package/dist/cmd/cloud/eval/index.js +1 -0
  88. package/dist/cmd/cloud/eval/index.js.map +1 -1
  89. package/dist/cmd/cloud/eval/list.js +1 -1
  90. package/dist/cmd/cloud/eval/list.js.map +1 -1
  91. package/dist/cmd/cloud/eval-run/get.d.ts.map +1 -1
  92. package/dist/cmd/cloud/eval-run/get.js +1 -0
  93. package/dist/cmd/cloud/eval-run/get.js.map +1 -1
  94. package/dist/cmd/cloud/eval-run/index.d.ts.map +1 -1
  95. package/dist/cmd/cloud/eval-run/index.js +1 -0
  96. package/dist/cmd/cloud/eval-run/index.js.map +1 -1
  97. package/dist/cmd/cloud/eval-run/list.js +1 -1
  98. package/dist/cmd/cloud/eval-run/list.js.map +1 -1
  99. package/dist/cmd/cloud/keyvalue/delete-namespace.js +1 -1
  100. package/dist/cmd/cloud/keyvalue/delete-namespace.js.map +1 -1
  101. package/dist/cmd/cloud/keyvalue/delete.js +1 -1
  102. package/dist/cmd/cloud/keyvalue/delete.js.map +1 -1
  103. package/dist/cmd/cloud/keyvalue/get.d.ts.map +1 -1
  104. package/dist/cmd/cloud/keyvalue/get.js +1 -0
  105. package/dist/cmd/cloud/keyvalue/get.js.map +1 -1
  106. package/dist/cmd/cloud/keyvalue/index.js +1 -1
  107. package/dist/cmd/cloud/keyvalue/index.js.map +1 -1
  108. package/dist/cmd/cloud/machine/delete.js +1 -1
  109. package/dist/cmd/cloud/machine/delete.js.map +1 -1
  110. package/dist/cmd/cloud/oidc/delete.js +1 -1
  111. package/dist/cmd/cloud/oidc/delete.js.map +1 -1
  112. package/dist/cmd/cloud/oidc/get.d.ts.map +1 -1
  113. package/dist/cmd/cloud/oidc/get.js +1 -0
  114. package/dist/cmd/cloud/oidc/get.js.map +1 -1
  115. package/dist/cmd/cloud/queue/create.d.ts.map +1 -1
  116. package/dist/cmd/cloud/queue/create.js +1 -0
  117. package/dist/cmd/cloud/queue/create.js.map +1 -1
  118. package/dist/cmd/cloud/queue/delete.js +1 -1
  119. package/dist/cmd/cloud/queue/delete.js.map +1 -1
  120. package/dist/cmd/cloud/queue/get.d.ts.map +1 -1
  121. package/dist/cmd/cloud/queue/get.js +1 -0
  122. package/dist/cmd/cloud/queue/get.js.map +1 -1
  123. package/dist/cmd/cloud/redis/get.js +1 -1
  124. package/dist/cmd/cloud/redis/get.js.map +1 -1
  125. package/dist/cmd/cloud/sandbox/checkpoint/create.d.ts.map +1 -1
  126. package/dist/cmd/cloud/sandbox/checkpoint/create.js +1 -0
  127. package/dist/cmd/cloud/sandbox/checkpoint/create.js.map +1 -1
  128. package/dist/cmd/cloud/sandbox/checkpoint/delete.js +1 -1
  129. package/dist/cmd/cloud/sandbox/checkpoint/delete.js.map +1 -1
  130. package/dist/cmd/cloud/sandbox/checkpoint/index.js +1 -1
  131. package/dist/cmd/cloud/sandbox/checkpoint/index.js.map +1 -1
  132. package/dist/cmd/cloud/sandbox/create.d.ts.map +1 -1
  133. package/dist/cmd/cloud/sandbox/create.js +9 -0
  134. package/dist/cmd/cloud/sandbox/create.js.map +1 -1
  135. package/dist/cmd/cloud/sandbox/delete.js +1 -1
  136. package/dist/cmd/cloud/sandbox/delete.js.map +1 -1
  137. package/dist/cmd/cloud/sandbox/execution/index.js +1 -1
  138. package/dist/cmd/cloud/sandbox/execution/index.js.map +1 -1
  139. package/dist/cmd/cloud/sandbox/execution/list.js +2 -2
  140. package/dist/cmd/cloud/sandbox/execution/list.js.map +1 -1
  141. package/dist/cmd/cloud/sandbox/fs/cp.d.ts +3 -0
  142. package/dist/cmd/cloud/sandbox/fs/cp.d.ts.map +1 -0
  143. package/dist/cmd/cloud/sandbox/{cp.js → fs/cp.js} +13 -13
  144. package/dist/cmd/cloud/sandbox/fs/cp.js.map +1 -0
  145. package/dist/cmd/cloud/sandbox/fs/download.d.ts +3 -0
  146. package/dist/cmd/cloud/sandbox/fs/download.d.ts.map +1 -0
  147. package/dist/cmd/cloud/sandbox/{download.js → fs/download.js} +7 -7
  148. package/dist/cmd/cloud/sandbox/fs/download.js.map +1 -0
  149. package/dist/cmd/cloud/sandbox/fs/index.d.ts +2 -0
  150. package/dist/cmd/cloud/sandbox/fs/index.d.ts.map +1 -0
  151. package/dist/cmd/cloud/sandbox/fs/index.js +36 -0
  152. package/dist/cmd/cloud/sandbox/fs/index.js.map +1 -0
  153. package/dist/cmd/cloud/sandbox/fs/ls.d.ts +3 -0
  154. package/dist/cmd/cloud/sandbox/fs/ls.d.ts.map +1 -0
  155. package/dist/cmd/cloud/sandbox/{ls.js → fs/ls.js} +10 -10
  156. package/dist/cmd/cloud/sandbox/fs/ls.js.map +1 -0
  157. package/dist/cmd/cloud/sandbox/fs/mkdir.d.ts +3 -0
  158. package/dist/cmd/cloud/sandbox/fs/mkdir.d.ts.map +1 -0
  159. package/dist/cmd/cloud/sandbox/{mkdir.js → fs/mkdir.js} +6 -6
  160. package/dist/cmd/cloud/sandbox/fs/mkdir.js.map +1 -0
  161. package/dist/cmd/cloud/sandbox/fs/rm.d.ts +3 -0
  162. package/dist/cmd/cloud/sandbox/fs/rm.d.ts.map +1 -0
  163. package/dist/cmd/cloud/sandbox/{rm.js → fs/rm.js} +6 -5
  164. package/dist/cmd/cloud/sandbox/fs/rm.js.map +1 -0
  165. package/dist/cmd/cloud/sandbox/fs/rmdir.d.ts +3 -0
  166. package/dist/cmd/cloud/sandbox/fs/rmdir.d.ts.map +1 -0
  167. package/dist/cmd/cloud/sandbox/{rmdir.js → fs/rmdir.js} +6 -6
  168. package/dist/cmd/cloud/sandbox/fs/rmdir.js.map +1 -0
  169. package/dist/cmd/cloud/sandbox/fs/upload.d.ts +3 -0
  170. package/dist/cmd/cloud/sandbox/fs/upload.d.ts.map +1 -0
  171. package/dist/cmd/cloud/sandbox/{upload.js → fs/upload.js} +7 -7
  172. package/dist/cmd/cloud/sandbox/fs/upload.js.map +1 -0
  173. package/dist/cmd/cloud/sandbox/index.d.ts.map +1 -1
  174. package/dist/cmd/cloud/sandbox/index.js +4 -14
  175. package/dist/cmd/cloud/sandbox/index.js.map +1 -1
  176. package/dist/cmd/cloud/sandbox/job/create.d.ts +3 -0
  177. package/dist/cmd/cloud/sandbox/job/create.d.ts.map +1 -0
  178. package/dist/cmd/cloud/sandbox/job/create.js +52 -0
  179. package/dist/cmd/cloud/sandbox/job/create.js.map +1 -0
  180. package/dist/cmd/cloud/sandbox/job/destroy.d.ts +3 -0
  181. package/dist/cmd/cloud/sandbox/job/destroy.d.ts.map +1 -0
  182. package/dist/cmd/cloud/sandbox/job/destroy.js +59 -0
  183. package/dist/cmd/cloud/sandbox/job/destroy.js.map +1 -0
  184. package/dist/cmd/cloud/sandbox/job/get.d.ts +3 -0
  185. package/dist/cmd/cloud/sandbox/job/get.d.ts.map +1 -0
  186. package/dist/cmd/cloud/sandbox/job/get.js +66 -0
  187. package/dist/cmd/cloud/sandbox/job/get.js.map +1 -0
  188. package/dist/cmd/cloud/sandbox/job/index.d.ts +3 -0
  189. package/dist/cmd/cloud/sandbox/job/index.d.ts.map +1 -0
  190. package/dist/cmd/cloud/sandbox/job/index.js +30 -0
  191. package/dist/cmd/cloud/sandbox/job/index.js.map +1 -0
  192. package/dist/cmd/cloud/sandbox/job/list.d.ts +3 -0
  193. package/dist/cmd/cloud/sandbox/job/list.d.ts.map +1 -0
  194. package/dist/cmd/cloud/sandbox/job/list.js +67 -0
  195. package/dist/cmd/cloud/sandbox/job/list.js.map +1 -0
  196. package/dist/cmd/cloud/sandbox/runtime/index.js +1 -1
  197. package/dist/cmd/cloud/sandbox/runtime/index.js.map +1 -1
  198. package/dist/cmd/cloud/sandbox/snapshot/create.d.ts.map +1 -1
  199. package/dist/cmd/cloud/sandbox/snapshot/create.js +1 -0
  200. package/dist/cmd/cloud/sandbox/snapshot/create.js.map +1 -1
  201. package/dist/cmd/cloud/sandbox/snapshot/delete.js +1 -1
  202. package/dist/cmd/cloud/sandbox/snapshot/delete.js.map +1 -1
  203. package/dist/cmd/cloud/sandbox/snapshot/index.js +1 -1
  204. package/dist/cmd/cloud/sandbox/snapshot/index.js.map +1 -1
  205. package/dist/cmd/cloud/schedule/create.d.ts.map +1 -1
  206. package/dist/cmd/cloud/schedule/create.js +1 -0
  207. package/dist/cmd/cloud/schedule/create.js.map +1 -1
  208. package/dist/cmd/cloud/schedule/delete.js +1 -1
  209. package/dist/cmd/cloud/schedule/delete.js.map +1 -1
  210. package/dist/cmd/cloud/schedule/delivery/get.d.ts.map +1 -1
  211. package/dist/cmd/cloud/schedule/delivery/get.js +1 -0
  212. package/dist/cmd/cloud/schedule/delivery/get.js.map +1 -1
  213. package/dist/cmd/cloud/schedule/destination/create.d.ts.map +1 -1
  214. package/dist/cmd/cloud/schedule/destination/create.js +1 -0
  215. package/dist/cmd/cloud/schedule/destination/create.js.map +1 -1
  216. package/dist/cmd/cloud/schedule/destination/delete.js +1 -1
  217. package/dist/cmd/cloud/schedule/destination/delete.js.map +1 -1
  218. package/dist/cmd/cloud/schedule/destination/get.d.ts.map +1 -1
  219. package/dist/cmd/cloud/schedule/destination/get.js +1 -0
  220. package/dist/cmd/cloud/schedule/destination/get.js.map +1 -1
  221. package/dist/cmd/cloud/schedule/get.d.ts.map +1 -1
  222. package/dist/cmd/cloud/schedule/get.js +1 -0
  223. package/dist/cmd/cloud/schedule/get.js.map +1 -1
  224. package/dist/cmd/cloud/session/get.d.ts.map +1 -1
  225. package/dist/cmd/cloud/session/get.js +1 -0
  226. package/dist/cmd/cloud/session/get.js.map +1 -1
  227. package/dist/cmd/cloud/session/index.d.ts.map +1 -1
  228. package/dist/cmd/cloud/session/index.js +1 -0
  229. package/dist/cmd/cloud/session/index.js.map +1 -1
  230. package/dist/cmd/cloud/session/list.js +1 -1
  231. package/dist/cmd/cloud/session/list.js.map +1 -1
  232. package/dist/cmd/cloud/storage/delete.js +1 -1
  233. package/dist/cmd/cloud/storage/delete.js.map +1 -1
  234. package/dist/cmd/cloud/stream/delete.js +1 -1
  235. package/dist/cmd/cloud/stream/delete.js.map +1 -1
  236. package/dist/cmd/cloud/stream/get.d.ts.map +1 -1
  237. package/dist/cmd/cloud/stream/get.js +1 -0
  238. package/dist/cmd/cloud/stream/get.js.map +1 -1
  239. package/dist/cmd/cloud/task/delete.js +1 -1
  240. package/dist/cmd/cloud/task/delete.js.map +1 -1
  241. package/dist/cmd/cloud/task/index.d.ts.map +1 -1
  242. package/dist/cmd/cloud/task/index.js +1 -0
  243. package/dist/cmd/cloud/task/index.js.map +1 -1
  244. package/dist/cmd/cloud/thread/delete.js +1 -1
  245. package/dist/cmd/cloud/thread/delete.js.map +1 -1
  246. package/dist/cmd/cloud/thread/get.d.ts.map +1 -1
  247. package/dist/cmd/cloud/thread/get.js +1 -0
  248. package/dist/cmd/cloud/thread/get.js.map +1 -1
  249. package/dist/cmd/cloud/thread/index.d.ts.map +1 -1
  250. package/dist/cmd/cloud/thread/index.js +1 -0
  251. package/dist/cmd/cloud/thread/index.js.map +1 -1
  252. package/dist/cmd/cloud/thread/list.js +1 -1
  253. package/dist/cmd/cloud/thread/list.js.map +1 -1
  254. package/dist/cmd/cloud/vector/delete-namespace.js +1 -1
  255. package/dist/cmd/cloud/vector/delete-namespace.js.map +1 -1
  256. package/dist/cmd/cloud/vector/delete.js +1 -1
  257. package/dist/cmd/cloud/vector/delete.js.map +1 -1
  258. package/dist/cmd/cloud/vector/get.d.ts.map +1 -1
  259. package/dist/cmd/cloud/vector/get.js +1 -0
  260. package/dist/cmd/cloud/vector/get.js.map +1 -1
  261. package/dist/cmd/cloud/vector/index.js +1 -1
  262. package/dist/cmd/cloud/vector/index.js.map +1 -1
  263. package/dist/cmd/cloud/webhook/create.d.ts.map +1 -1
  264. package/dist/cmd/cloud/webhook/create.js +1 -0
  265. package/dist/cmd/cloud/webhook/create.js.map +1 -1
  266. package/dist/cmd/cloud/webhook/delete.js +1 -1
  267. package/dist/cmd/cloud/webhook/delete.js.map +1 -1
  268. package/dist/cmd/cloud/webhook/get.d.ts.map +1 -1
  269. package/dist/cmd/cloud/webhook/get.js +1 -0
  270. package/dist/cmd/cloud/webhook/get.js.map +1 -1
  271. package/dist/cmd/dev/index.d.ts.map +1 -1
  272. package/dist/cmd/dev/index.js +161 -130
  273. package/dist/cmd/dev/index.js.map +1 -1
  274. package/dist/cmd/dev/process-manager.d.ts +104 -0
  275. package/dist/cmd/dev/process-manager.d.ts.map +1 -0
  276. package/dist/cmd/dev/process-manager.js +204 -0
  277. package/dist/cmd/dev/process-manager.js.map +1 -0
  278. package/dist/cmd/git/account/remove.d.ts.map +1 -1
  279. package/dist/cmd/git/account/remove.js +1 -0
  280. package/dist/cmd/git/account/remove.js.map +1 -1
  281. package/dist/cmd/profile/delete.js +1 -1
  282. package/dist/cmd/profile/delete.js.map +1 -1
  283. package/dist/cmd/project/delete.js +1 -1
  284. package/dist/cmd/project/delete.js.map +1 -1
  285. package/dist/cmd/project/hostname/get.d.ts.map +1 -1
  286. package/dist/cmd/project/hostname/get.js +1 -0
  287. package/dist/cmd/project/hostname/get.js.map +1 -1
  288. package/dist/cmd/upgrade/index.d.ts.map +1 -1
  289. package/dist/cmd/upgrade/index.js +3 -16
  290. package/dist/cmd/upgrade/index.js.map +1 -1
  291. package/dist/schema-generator.js +1 -1
  292. package/dist/schema-generator.js.map +1 -1
  293. package/dist/schema-parser.d.ts.map +1 -1
  294. package/dist/schema-parser.js +8 -0
  295. package/dist/schema-parser.js.map +1 -1
  296. package/dist/utils/version-mismatch.d.ts +39 -0
  297. package/dist/utils/version-mismatch.d.ts.map +1 -0
  298. package/dist/utils/version-mismatch.js +161 -0
  299. package/dist/utils/version-mismatch.js.map +1 -0
  300. package/package.json +8 -6
  301. package/src/auth.ts +12 -2
  302. package/src/cli.ts +33 -1
  303. package/src/cmd/auth/ssh/delete.ts +1 -1
  304. package/src/cmd/build/app-config-extractor.ts +186 -0
  305. package/src/cmd/build/ci.ts +223 -0
  306. package/src/cmd/build/index.ts +65 -14
  307. package/src/cmd/build/vite/bun-dev-server.ts +319 -6
  308. package/src/cmd/build/vite/config-loader.ts +45 -77
  309. package/src/cmd/build/vite/static-renderer.ts +34 -16
  310. package/src/cmd/build/vite/tailwind-source-plugin.ts +73 -0
  311. package/src/cmd/build/vite/vite-asset-server-config.ts +4 -47
  312. package/src/cmd/build/vite/vite-builder.ts +45 -169
  313. package/src/cmd/cloud/agent/get.ts +1 -0
  314. package/src/cmd/cloud/apikey/delete.ts +1 -1
  315. package/src/cmd/cloud/apikey/get.ts +1 -0
  316. package/src/cmd/cloud/apikey/index.ts +1 -0
  317. package/src/cmd/cloud/db/delete.ts +1 -1
  318. package/src/cmd/cloud/deploy.ts +1 -1
  319. package/src/cmd/cloud/deployment/remove.ts +17 -17
  320. package/src/cmd/cloud/deployment/show.ts +1 -1
  321. package/src/cmd/cloud/email/create.ts +1 -1
  322. package/src/cmd/cloud/email/delete.ts +1 -1
  323. package/src/cmd/cloud/email/destination/delete.ts +1 -1
  324. package/src/cmd/cloud/email/get.ts +1 -0
  325. package/src/cmd/cloud/email/inbound/get.ts +1 -0
  326. package/src/cmd/cloud/email/outbound/get.ts +1 -0
  327. package/src/cmd/cloud/env/delete.ts +1 -1
  328. package/src/cmd/cloud/env/get.ts +1 -0
  329. package/src/cmd/cloud/eval/get.ts +1 -0
  330. package/src/cmd/cloud/eval/index.ts +1 -0
  331. package/src/cmd/cloud/eval/list.ts +1 -1
  332. package/src/cmd/cloud/eval-run/get.ts +1 -0
  333. package/src/cmd/cloud/eval-run/index.ts +1 -0
  334. package/src/cmd/cloud/eval-run/list.ts +1 -1
  335. package/src/cmd/cloud/keyvalue/delete-namespace.ts +1 -1
  336. package/src/cmd/cloud/keyvalue/delete.ts +1 -1
  337. package/src/cmd/cloud/keyvalue/get.ts +1 -0
  338. package/src/cmd/cloud/keyvalue/index.ts +1 -1
  339. package/src/cmd/cloud/machine/delete.ts +1 -1
  340. package/src/cmd/cloud/oidc/delete.ts +1 -1
  341. package/src/cmd/cloud/oidc/get.ts +1 -0
  342. package/src/cmd/cloud/queue/create.ts +1 -0
  343. package/src/cmd/cloud/queue/delete.ts +1 -1
  344. package/src/cmd/cloud/queue/get.ts +1 -0
  345. package/src/cmd/cloud/redis/get.ts +1 -1
  346. package/src/cmd/cloud/sandbox/checkpoint/create.ts +1 -0
  347. package/src/cmd/cloud/sandbox/checkpoint/delete.ts +1 -1
  348. package/src/cmd/cloud/sandbox/checkpoint/index.ts +1 -1
  349. package/src/cmd/cloud/sandbox/create.ts +9 -0
  350. package/src/cmd/cloud/sandbox/delete.ts +1 -1
  351. package/src/cmd/cloud/sandbox/execution/index.ts +1 -1
  352. package/src/cmd/cloud/sandbox/execution/list.ts +2 -2
  353. package/src/cmd/cloud/sandbox/{cp.ts → fs/cp.ts} +13 -13
  354. package/src/cmd/cloud/sandbox/{download.ts → fs/download.ts} +7 -7
  355. package/src/cmd/cloud/sandbox/fs/index.ts +36 -0
  356. package/src/cmd/cloud/sandbox/{ls.ts → fs/ls.ts} +10 -10
  357. package/src/cmd/cloud/sandbox/{mkdir.ts → fs/mkdir.ts} +6 -6
  358. package/src/cmd/cloud/sandbox/{rm.ts → fs/rm.ts} +6 -5
  359. package/src/cmd/cloud/sandbox/{rmdir.ts → fs/rmdir.ts} +6 -6
  360. package/src/cmd/cloud/sandbox/{upload.ts → fs/upload.ts} +7 -7
  361. package/src/cmd/cloud/sandbox/index.ts +4 -14
  362. package/src/cmd/cloud/sandbox/job/create.ts +63 -0
  363. package/src/cmd/cloud/sandbox/job/destroy.ts +67 -0
  364. package/src/cmd/cloud/sandbox/job/get.ts +78 -0
  365. package/src/cmd/cloud/sandbox/job/index.ts +31 -0
  366. package/src/cmd/cloud/sandbox/job/list.ts +81 -0
  367. package/src/cmd/cloud/sandbox/runtime/index.ts +1 -1
  368. package/src/cmd/cloud/sandbox/snapshot/create.ts +1 -0
  369. package/src/cmd/cloud/sandbox/snapshot/delete.ts +1 -1
  370. package/src/cmd/cloud/sandbox/snapshot/index.ts +1 -1
  371. package/src/cmd/cloud/schedule/create.ts +1 -0
  372. package/src/cmd/cloud/schedule/delete.ts +1 -1
  373. package/src/cmd/cloud/schedule/delivery/get.ts +1 -0
  374. package/src/cmd/cloud/schedule/destination/create.ts +1 -0
  375. package/src/cmd/cloud/schedule/destination/delete.ts +1 -1
  376. package/src/cmd/cloud/schedule/destination/get.ts +1 -0
  377. package/src/cmd/cloud/schedule/get.ts +1 -0
  378. package/src/cmd/cloud/session/get.ts +1 -0
  379. package/src/cmd/cloud/session/index.ts +1 -0
  380. package/src/cmd/cloud/session/list.ts +1 -1
  381. package/src/cmd/cloud/storage/delete.ts +1 -1
  382. package/src/cmd/cloud/stream/delete.ts +1 -1
  383. package/src/cmd/cloud/stream/get.ts +1 -0
  384. package/src/cmd/cloud/task/delete.ts +1 -1
  385. package/src/cmd/cloud/task/index.ts +1 -0
  386. package/src/cmd/cloud/thread/delete.ts +1 -1
  387. package/src/cmd/cloud/thread/get.ts +1 -0
  388. package/src/cmd/cloud/thread/index.ts +1 -0
  389. package/src/cmd/cloud/thread/list.ts +1 -1
  390. package/src/cmd/cloud/vector/delete-namespace.ts +1 -1
  391. package/src/cmd/cloud/vector/delete.ts +1 -1
  392. package/src/cmd/cloud/vector/get.ts +1 -0
  393. package/src/cmd/cloud/vector/index.ts +1 -1
  394. package/src/cmd/cloud/webhook/create.ts +1 -0
  395. package/src/cmd/cloud/webhook/delete.ts +1 -1
  396. package/src/cmd/cloud/webhook/get.ts +1 -0
  397. package/src/cmd/dev/index.ts +171 -131
  398. package/src/cmd/dev/process-manager.ts +261 -0
  399. package/src/cmd/git/account/remove.ts +1 -0
  400. package/src/cmd/profile/delete.ts +1 -1
  401. package/src/cmd/project/delete.ts +1 -1
  402. package/src/cmd/project/hostname/get.ts +1 -0
  403. package/src/cmd/upgrade/index.ts +3 -18
  404. package/src/schema-generator.ts +1 -1
  405. package/src/schema-parser.ts +11 -0
  406. package/src/utils/version-mismatch.ts +204 -0
  407. package/dist/cmd/cloud/sandbox/cp.d.ts +0 -3
  408. package/dist/cmd/cloud/sandbox/cp.d.ts.map +0 -1
  409. package/dist/cmd/cloud/sandbox/cp.js.map +0 -1
  410. package/dist/cmd/cloud/sandbox/download.d.ts +0 -3
  411. package/dist/cmd/cloud/sandbox/download.d.ts.map +0 -1
  412. package/dist/cmd/cloud/sandbox/download.js.map +0 -1
  413. package/dist/cmd/cloud/sandbox/ls.d.ts +0 -3
  414. package/dist/cmd/cloud/sandbox/ls.d.ts.map +0 -1
  415. package/dist/cmd/cloud/sandbox/ls.js.map +0 -1
  416. package/dist/cmd/cloud/sandbox/mkdir.d.ts +0 -3
  417. package/dist/cmd/cloud/sandbox/mkdir.d.ts.map +0 -1
  418. package/dist/cmd/cloud/sandbox/mkdir.js.map +0 -1
  419. package/dist/cmd/cloud/sandbox/rm.d.ts +0 -3
  420. package/dist/cmd/cloud/sandbox/rm.d.ts.map +0 -1
  421. package/dist/cmd/cloud/sandbox/rm.js.map +0 -1
  422. package/dist/cmd/cloud/sandbox/rmdir.d.ts +0 -3
  423. package/dist/cmd/cloud/sandbox/rmdir.d.ts.map +0 -1
  424. package/dist/cmd/cloud/sandbox/rmdir.js.map +0 -1
  425. package/dist/cmd/cloud/sandbox/upload.d.ts +0 -3
  426. package/dist/cmd/cloud/sandbox/upload.d.ts.map +0 -1
  427. package/dist/cmd/cloud/sandbox/upload.js.map +0 -1
@@ -20,6 +20,8 @@ import { isTTY, hasLoggedInBefore } from '../../auth';
20
20
 
21
21
  import { prepareDevLock, releaseLockSync } from './dev-lock';
22
22
  import { checkAndUpgradeDependencies } from '../../utils/dependency-checker';
23
+ import { initProcessManager } from './process-manager';
24
+ import { detectVersionMismatch, formatVersionMismatchWarning } from '../../utils/version-mismatch';
23
25
 
24
26
  import { ErrorCode } from '../../errors';
25
27
 
@@ -31,12 +33,13 @@ const MAX_PORT = 65535;
31
33
  interface ProcessLike {
32
34
  kill: (signal?: number | NodeJS.Signals) => void;
33
35
  exitCode: number | null;
36
+ pid?: number;
34
37
  stdout?: AsyncIterable<Uint8Array>;
35
38
  stderr?: AsyncIterable<Uint8Array>;
36
39
  }
37
40
 
38
41
  interface ServerLike {
39
- close: () => void;
42
+ close: () => void | Promise<void>;
40
43
  }
41
44
 
42
45
  /**
@@ -337,6 +340,14 @@ export const command = createCommand({
337
340
  );
338
341
  }
339
342
 
343
+ // Check for version mismatches (v1 vs v2 SDK packages)
344
+ const versionMismatch = detectVersionMismatch(rootDir, logger);
345
+ if (versionMismatch.hasV1Packages || versionMismatch.hasMajorMismatches) {
346
+ tui.newline();
347
+ tui.warning(formatVersionMismatchWarning(versionMismatch));
348
+ tui.newline();
349
+ }
350
+
340
351
  try {
341
352
  // Setup devmode and gravity (if using public URL)
342
353
  const useMockService = process.env.DEVMODE_SYNC_SERVICE_MOCK === 'true';
@@ -428,12 +439,12 @@ export const command = createCommand({
428
439
  }
429
440
  }
430
441
 
431
- // Get workbench info from config (new Vite approach)
432
- const { loadAgentuityConfig, getWorkbenchConfig } = await import(
442
+ // Get workbench info from createApp() in app.ts (v2 approach)
443
+ const { getWorkbenchConfig, loadRuntimeConfig } = await import(
433
444
  '../build/vite/config-loader'
434
445
  );
435
- const agentuityConfig = await loadAgentuityConfig(rootDir, ctx.logger);
436
- const workbenchConfigData = getWorkbenchConfig(agentuityConfig, true); // dev mode
446
+ const runtimeConfig = await loadRuntimeConfig(rootDir, logger);
447
+ const workbenchConfigData = getWorkbenchConfig(true, runtimeConfig); // dev mode
437
448
  const workbench = {
438
449
  hasWorkbench: workbenchConfigData.enabled,
439
450
  config: workbenchConfigData.enabled
@@ -529,6 +540,9 @@ export const command = createCommand({
529
540
  let viteServer: ServerLike | null = null;
530
541
  let vitePort: number;
531
542
 
543
+ // Initialize process manager to track all servers/processes
544
+ const procManager = initProcessManager(logger);
545
+
532
546
  try {
533
547
  logger.debug('Starting Vite dev server (internal port %d)...', viteInternalPort);
534
548
  const viteResult = await startViteAssetServer({
@@ -542,6 +556,14 @@ export const command = createCommand({
542
556
  viteServer = viteResult.server;
543
557
  vitePort = viteResult.port;
544
558
 
559
+ // Register Vite server with process manager
560
+ procManager.registerServer({
561
+ id: 'vite',
562
+ server: viteServer,
563
+ description: 'Vite dev server (frontend assets)',
564
+ port: vitePort,
565
+ });
566
+
545
567
  // Update dev lock with actual Vite port
546
568
  await devLock.updatePorts({ vite: vitePort });
547
569
 
@@ -550,6 +572,7 @@ export const command = createCommand({
550
572
  );
551
573
  } catch (error) {
552
574
  tui.error(`Failed to start Vite dev server: ${error}`);
575
+ await procManager.cleanup('vite startup failure');
553
576
  await devLock.release();
554
577
  originalExit(1);
555
578
  return;
@@ -569,11 +592,25 @@ export const command = createCommand({
569
592
  routePaths,
570
593
  logger,
571
594
  });
595
+
596
+ // Register front-door proxy with process manager
597
+ procManager.registerServer({
598
+ id: 'front-door-proxy',
599
+ server: {
600
+ close: () => {
601
+ frontDoorServer?.close();
602
+ },
603
+ },
604
+ description: 'Front-door TCP proxy (WS routing)',
605
+ port: opts.port,
606
+ });
607
+
572
608
  logger.debug(
573
609
  `Front-door proxy on port ${opts.port} (Vite:${vitePort}, Bun:${bunBackendPort})`
574
610
  );
575
611
  } catch (error) {
576
612
  tui.error(`Failed to start front-door proxy: ${error}`);
613
+ await procManager.cleanup('front-door proxy startup failure');
577
614
  await devLock.release();
578
615
  originalExit(1);
579
616
  return;
@@ -585,63 +622,29 @@ export const command = createCommand({
585
622
  let stdinListenerRegistered = false;
586
623
  let stdinDataHandler: ((data: Buffer | string) => void) | null = null;
587
624
  let shutdownRequested = false;
588
- let cleaningUp = false;
589
625
 
590
626
  /**
591
627
  * Centralized cleanup function for all resources.
628
+ * Uses the process manager for tracked servers/processes.
592
629
  */
593
630
  const cleanup = async (exitAfter = false, exitCode = 0, silent = false) => {
594
- if (cleaningUp) return;
595
- cleaningUp = true;
631
+ if (shutdownRequested) return;
632
+ shutdownRequested = true;
596
633
 
597
634
  if (!silent) {
598
635
  tui.info('Shutting down...');
599
636
  }
600
637
 
601
- // Stop front-door proxy
602
- try {
603
- frontDoorServer?.close();
604
- } catch (err) {
605
- logger.debug('Error stopping front-door proxy: %s', err);
606
- }
607
-
608
- // Kill Bun subprocess
609
- killBunSubprocess(logger);
610
-
611
- // Stop gravity heartbeat interval
638
+ // Stop gravity heartbeat interval first
612
639
  if (gravityHeartbeatInterval) {
613
640
  clearInterval(gravityHeartbeatInterval);
614
641
  gravityHeartbeatInterval = null;
615
642
  }
616
643
 
617
- // Kill gravity client
618
- if (gravityProcess) {
619
- try {
620
- gravityProcess.kill('SIGTERM');
621
- await new Promise((resolve) => setTimeout(resolve, 150));
622
- if (gravityProcess.exitCode === null) {
623
- gravityProcess.kill('SIGKILL');
624
- }
625
- } catch (err) {
626
- logger.debug('Error killing gravity: %s', err);
627
- } finally {
628
- gravityProcess = null;
629
- }
630
- }
631
-
632
- // Close Vite
633
- if (viteServer) {
634
- try {
635
- const closePromise = viteServer.close();
636
- const timeoutPromise = new Promise<void>((resolve) => setTimeout(resolve, 2000));
637
- await Promise.race([closePromise, timeoutPromise]);
638
- } catch (err) {
639
- logger.debug('Error closing Vite: %s', err);
640
- } finally {
641
- viteServer = null;
642
- }
643
- }
644
+ // Use process manager for tracked cleanup
645
+ await procManager.cleanup('shutdown');
644
646
 
647
+ // Additional cleanup for non-tracked resources
645
648
  await devLock.release();
646
649
  await killLingeringGravityProcesses(logger);
647
650
 
@@ -848,15 +851,35 @@ export const command = createCommand({
848
851
  // Step 3: Start Bun backend with --hot (handles its own HMR)
849
852
  // ================================================================
850
853
 
851
- await startBunDevServer({
852
- rootDir,
853
- port: bunBackendPort,
854
- logger,
855
- vitePort,
856
- inspect: opts.inspect,
857
- inspectWait: opts.inspectWait,
858
- inspectBrk: opts.inspectBrk,
859
- });
854
+ try {
855
+ await startBunDevServer({
856
+ rootDir,
857
+ port: bunBackendPort,
858
+ logger,
859
+ vitePort,
860
+ inspect: opts.inspect,
861
+ inspectWait: opts.inspectWait,
862
+ inspectBrk: opts.inspectBrk,
863
+ });
864
+
865
+ // Register Bun subprocess with process manager
866
+ // The subprocess is stored in globalThis.__AGENTUITY_BUN_SUBPROCESS__
867
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
868
+ const bunSubprocess = (globalThis as any).__AGENTUITY_BUN_SUBPROCESS__ as ProcessLike;
869
+ if (bunSubprocess) {
870
+ procManager.registerProcess({
871
+ id: 'bun-backend',
872
+ process: bunSubprocess,
873
+ description: 'Bun backend server (--hot)',
874
+ port: bunBackendPort,
875
+ critical: true,
876
+ });
877
+ }
878
+ } catch (error) {
879
+ tui.error(`Failed to start Bun backend server: ${error}`);
880
+ await cleanup(true, 1, true);
881
+ return;
882
+ }
860
883
 
861
884
  // ================================================================
862
885
  // Step 4: Start gravity tunnel (if public URL enabled)
@@ -865,94 +888,111 @@ export const command = createCommand({
865
888
  if (gravityBin && gravityURL && devmode && project) {
866
889
  const privateKeyPEM = devmode.privateKey ?? savedPrivateKey;
867
890
  if (!privateKeyPEM) {
868
- throw new Error(
891
+ tui.error(
869
892
  'No private key available for gravity connection. Please re-run to generate a new key.'
870
893
  );
894
+ await cleanup(true, 1, true);
895
+ return;
871
896
  }
872
- gravityProcess = Bun.spawn(
873
- [
874
- gravityBin,
875
- '--endpoint-id',
876
- devmode.id,
877
- '--port',
878
- vitePort.toString(),
879
- '--url',
880
- gravityURL,
881
- '--log-level',
882
- process.env.AGENTUITY_GRAVITY_LOG_LEVEL ?? 'error',
883
- '--org-id',
884
- project.orgId,
885
- '--project-id',
886
- project.projectId,
887
- '--private-key',
888
- Buffer.from(privateKeyPEM).toString('base64'),
889
- '--health-check',
890
- ],
891
- {
892
- cwd: rootDir,
893
- stdout: 'pipe',
894
- stderr: 'pipe',
895
- detached: false,
896
- }
897
- );
898
897
 
899
- const gravityPid = (gravityProcess as { pid?: number }).pid;
900
- if (gravityPid) {
901
- await devLock.registerChild({
902
- pid: gravityPid,
903
- type: 'gravity',
904
- description: 'Gravity public URL tunnel',
905
- });
906
- }
898
+ try {
899
+ gravityProcess = Bun.spawn(
900
+ [
901
+ gravityBin,
902
+ '--endpoint-id',
903
+ devmode.id,
904
+ '--port',
905
+ vitePort.toString(),
906
+ '--url',
907
+ gravityURL,
908
+ '--log-level',
909
+ process.env.AGENTUITY_GRAVITY_LOG_LEVEL ?? 'error',
910
+ '--org-id',
911
+ project.orgId,
912
+ '--project-id',
913
+ project.projectId,
914
+ '--private-key',
915
+ Buffer.from(privateKeyPEM).toString('base64'),
916
+ '--health-check',
917
+ ],
918
+ {
919
+ cwd: rootDir,
920
+ stdout: 'pipe',
921
+ stderr: 'pipe',
922
+ detached: false,
923
+ }
924
+ );
907
925
 
908
- // Log gravity output and detect heartbeat port
909
- (async () => {
910
- try {
911
- if (gravityProcess?.stdout) {
912
- for await (const chunk of gravityProcess.stdout) {
913
- const text = new TextDecoder().decode(chunk);
914
- const trimmed = text.trim();
915
-
916
- const match = trimmed.match(/^HEARTBEAT_PORT=(\d+)$/m);
917
- if (match?.[1]) {
918
- const heartbeatPort = parseInt(match[1], 10);
919
- logger.debug('Gravity heartbeat port: %d', heartbeatPort);
920
-
921
- if (!gravityHeartbeatInterval) {
922
- const sendHeartbeat = async () => {
923
- try {
924
- await fetch(`http://127.0.0.1:${heartbeatPort}/heartbeat`, {
925
- method: 'POST',
926
- signal: AbortSignal.timeout(2000),
927
- });
928
- } catch {
929
- // Ignore heartbeat failures
930
- }
931
- };
932
- sendHeartbeat();
933
- gravityHeartbeatInterval = setInterval(sendHeartbeat, 5000);
926
+ const gravityPid = (gravityProcess as { pid?: number }).pid;
927
+ if (gravityPid) {
928
+ await devLock.registerChild({
929
+ pid: gravityPid,
930
+ type: 'gravity',
931
+ description: 'Gravity public URL tunnel',
932
+ });
933
+
934
+ // Register with process manager
935
+ procManager.registerProcess({
936
+ id: 'gravity',
937
+ process: gravityProcess,
938
+ description: 'Gravity public URL tunnel',
939
+ critical: false,
940
+ });
941
+ }
942
+
943
+ // Log gravity output and detect heartbeat port
944
+ (async () => {
945
+ try {
946
+ if (gravityProcess?.stdout) {
947
+ for await (const chunk of gravityProcess.stdout) {
948
+ const text = new TextDecoder().decode(chunk);
949
+ const trimmed = text.trim();
950
+
951
+ const match = trimmed.match(/^HEARTBEAT_PORT=(\d+)$/m);
952
+ if (match?.[1]) {
953
+ const heartbeatPort = parseInt(match[1], 10);
954
+ logger.debug('Gravity heartbeat port: %d', heartbeatPort);
955
+
956
+ if (!gravityHeartbeatInterval) {
957
+ const sendHeartbeat = async () => {
958
+ try {
959
+ await fetch(`http://127.0.0.1:${heartbeatPort}/heartbeat`, {
960
+ method: 'POST',
961
+ signal: AbortSignal.timeout(2000),
962
+ });
963
+ } catch {
964
+ // Ignore heartbeat failures
965
+ }
966
+ };
967
+ sendHeartbeat();
968
+ gravityHeartbeatInterval = setInterval(sendHeartbeat, 5000);
969
+ }
970
+ } else if (trimmed) {
971
+ logger.debug('[gravity] %s', trimmed);
934
972
  }
935
- } else if (trimmed) {
936
- logger.debug('[gravity] %s', trimmed);
937
973
  }
938
974
  }
975
+ } catch (err) {
976
+ logger.error('Error reading gravity stdout: %s', err);
939
977
  }
940
- } catch (err) {
941
- logger.error('Error reading gravity stdout: %s', err);
942
- }
943
- })();
978
+ })();
944
979
 
945
- (async () => {
946
- try {
947
- if (gravityProcess?.stderr) {
948
- for await (const chunk of gravityProcess.stderr) {
949
- logger.warn('[gravity] %s', new TextDecoder().decode(chunk).trim());
980
+ (async () => {
981
+ try {
982
+ if (gravityProcess?.stderr) {
983
+ for await (const chunk of gravityProcess.stderr) {
984
+ logger.warn('[gravity] %s', new TextDecoder().decode(chunk).trim());
985
+ }
950
986
  }
987
+ } catch (err) {
988
+ logger.error('Error reading gravity stderr: %s', err);
951
989
  }
952
- } catch (err) {
953
- logger.error('Error reading gravity stderr: %s', err);
954
- }
955
- })();
990
+ })();
991
+ } catch (error) {
992
+ tui.error(`Failed to start gravity tunnel: ${error}`);
993
+ await cleanup(true, 1, true);
994
+ return;
995
+ }
956
996
  }
957
997
 
958
998
  // ================================================================
@@ -0,0 +1,261 @@
1
+ /**
2
+ * Process Manager for Dev Mode
3
+ *
4
+ * Tracks all spawned processes and ensures they're cleaned up on:
5
+ * - Startup failure (any server fails to start)
6
+ * - Runtime crash (uncaught exception)
7
+ * - Graceful shutdown (SIGINT/SIGTERM)
8
+ *
9
+ * This prevents orphan processes and port conflicts between dev sessions.
10
+ */
11
+
12
+ import type { Logger } from '../../types';
13
+
14
+ export interface ManagedProcess {
15
+ /** Process identifier for logging */
16
+ id: string;
17
+ /** The process handle */
18
+ process: {
19
+ kill: (signal?: number | NodeJS.Signals) => void;
20
+ exitCode: number | null;
21
+ pid?: number;
22
+ };
23
+ /** Human-readable description */
24
+ description: string;
25
+ /** The port this process uses (if any) */
26
+ port?: number;
27
+ /** Whether this process is critical (startup fails if it dies) */
28
+ critical?: boolean;
29
+ }
30
+
31
+ export interface ManagedServer {
32
+ /** Server identifier */
33
+ id: string;
34
+ /** The server handle */
35
+ server: {
36
+ close: () => void | Promise<void>;
37
+ };
38
+ /** Human-readable description */
39
+ description: string;
40
+ /** The port this server uses */
41
+ port?: number;
42
+ }
43
+
44
+ /**
45
+ * Process Manager
46
+ *
47
+ * Tracks all processes and servers started during dev mode and provides
48
+ * centralized cleanup on failure or shutdown.
49
+ */
50
+ export class ProcessManager {
51
+ private processes: ManagedProcess[] = [];
52
+ private servers: ManagedServer[] = [];
53
+ private logger: Logger;
54
+ private cleaningUp = false;
55
+
56
+ constructor(logger: Logger) {
57
+ this.logger = logger;
58
+ }
59
+
60
+ /**
61
+ * Register a spawned process for tracking.
62
+ */
63
+ registerProcess(proc: ManagedProcess): void {
64
+ this.processes.push(proc);
65
+ this.logger.debug(
66
+ 'Registered process: %s (pid=%s, port=%s)',
67
+ proc.id,
68
+ proc.process.pid ?? 'unknown',
69
+ proc.port ?? 'n/a'
70
+ );
71
+ }
72
+
73
+ /**
74
+ * Register a server for tracking.
75
+ */
76
+ registerServer(server: ManagedServer): void {
77
+ this.servers.push(server);
78
+ this.logger.debug('Registered server: %s (port=%s)', server.id, server.port ?? 'n/a');
79
+ }
80
+
81
+ /**
82
+ * Unregister a process (e.g., after it exits normally).
83
+ */
84
+ unregisterProcess(id: string): void {
85
+ const idx = this.processes.findIndex((p) => p.id === id);
86
+ if (idx !== -1) {
87
+ this.processes.splice(idx, 1);
88
+ this.logger.debug('Unregistered process: %s', id);
89
+ }
90
+ }
91
+
92
+ /**
93
+ * Unregister a server.
94
+ */
95
+ unregisterServer(id: string): void {
96
+ const idx = this.servers.findIndex((s) => s.id === id);
97
+ if (idx !== -1) {
98
+ this.servers.splice(idx, 1);
99
+ this.logger.debug('Unregistered server: %s', id);
100
+ }
101
+ }
102
+
103
+ /**
104
+ * Get all registered ports (for cleanup verification).
105
+ */
106
+ getPorts(): number[] {
107
+ const ports: number[] = [];
108
+ for (const proc of this.processes) {
109
+ if (proc.port) ports.push(proc.port);
110
+ }
111
+ for (const server of this.servers) {
112
+ if (server.port) ports.push(server.port);
113
+ }
114
+ return ports;
115
+ }
116
+
117
+ /**
118
+ * Clean up all tracked processes and servers.
119
+ *
120
+ * @param reason - Why cleanup is happening (for logging)
121
+ * @param timeout - Max time to wait for graceful shutdown (ms)
122
+ */
123
+ async cleanup(reason: string, timeout = 3000): Promise<void> {
124
+ if (this.cleaningUp) {
125
+ this.logger.debug('Cleanup already in progress, skipping');
126
+ return;
127
+ }
128
+ this.cleaningUp = true;
129
+
130
+ this.logger.debug('Starting cleanup (reason: %s)', reason);
131
+
132
+ // Kill processes in reverse order (LIFO)
133
+ for (let i = this.processes.length - 1; i >= 0; i--) {
134
+ const proc = this.processes[i];
135
+ if (!proc) continue;
136
+
137
+ try {
138
+ if (proc.process.exitCode === null) {
139
+ this.logger.debug(
140
+ 'Killing process %s (pid=%s)',
141
+ proc.id,
142
+ proc.process.pid ?? 'unknown'
143
+ );
144
+ proc.process.kill('SIGTERM');
145
+ }
146
+ } catch (err) {
147
+ this.logger.debug('Error killing process %s: %s', proc.id, err);
148
+ }
149
+ }
150
+
151
+ // Close servers
152
+ for (let i = this.servers.length - 1; i >= 0; i--) {
153
+ const server = this.servers[i];
154
+ if (!server) continue;
155
+
156
+ try {
157
+ this.logger.debug('Closing server %s', server.id);
158
+ const closePromise = server.server.close();
159
+ if (closePromise instanceof Promise) {
160
+ await Promise.race([
161
+ closePromise,
162
+ new Promise<void>((resolve) => setTimeout(resolve, 1000)),
163
+ ]);
164
+ }
165
+ } catch (err) {
166
+ this.logger.debug('Error closing server %s: %s', server.id, err);
167
+ }
168
+ }
169
+
170
+ // Wait for processes to exit, then force-kill if needed
171
+ const startTime = Date.now();
172
+ while (Date.now() - startTime < timeout) {
173
+ const allExited = this.processes.every((p) => p.process.exitCode !== null);
174
+ if (allExited) break;
175
+ await new Promise((resolve) => setTimeout(resolve, 100));
176
+ }
177
+
178
+ // Force kill any remaining
179
+ for (const proc of this.processes) {
180
+ if (proc.process.exitCode === null) {
181
+ try {
182
+ this.logger.debug('Force killing process %s', proc.id);
183
+ proc.process.kill('SIGKILL');
184
+ } catch (err) {
185
+ this.logger.debug('Error force killing process %s: %s', proc.id, err);
186
+ }
187
+ }
188
+ }
189
+
190
+ this.logger.debug('Cleanup complete');
191
+ this.processes = [];
192
+ this.servers = [];
193
+ }
194
+
195
+ /**
196
+ * Verify that all ports used by tracked processes are released.
197
+ * Used after cleanup to ensure no orphan processes remain.
198
+ */
199
+ async verifyPortsReleased(): Promise<{ port: number; released: boolean }[]> {
200
+ const results: { port: number; released: boolean }[] = [];
201
+ const ports = this.getPorts();
202
+
203
+ for (const port of ports) {
204
+ const released = await this.isPortAvailable(port);
205
+ results.push({ port, released });
206
+
207
+ if (!released) {
208
+ this.logger.warn('Port %d is still in use after cleanup', port);
209
+ }
210
+ }
211
+
212
+ return results;
213
+ }
214
+
215
+ /**
216
+ * Check if a port is available.
217
+ */
218
+ private isPortAvailable(port: number, host = '127.0.0.1'): Promise<boolean> {
219
+ return new Promise((resolve) => {
220
+ const net = require('node:net');
221
+ const server = net.createServer();
222
+ server.once('error', () => resolve(false));
223
+ server.listen(port, host, () => {
224
+ server.close(() => resolve(true));
225
+ });
226
+ });
227
+ }
228
+ }
229
+
230
+ /**
231
+ * Global process manager instance for dev mode.
232
+ * Set in dev/index.ts during startup.
233
+ */
234
+ let globalProcessManager: ProcessManager | null = null;
235
+
236
+ /**
237
+ * Get the global process manager (throws if not initialized).
238
+ */
239
+ export function getProcessManager(): ProcessManager {
240
+ if (!globalProcessManager) {
241
+ throw new Error('ProcessManager not initialized. Call initProcessManager first.');
242
+ }
243
+ return globalProcessManager;
244
+ }
245
+
246
+ /**
247
+ * Initialize the global process manager.
248
+ */
249
+ export function initProcessManager(logger: Logger): ProcessManager {
250
+ globalProcessManager = new ProcessManager(logger);
251
+ return globalProcessManager;
252
+ }
253
+
254
+ /**
255
+ * Cleanup helper that can be called from signal handlers or error handlers.
256
+ */
257
+ export async function cleanupAll(reason: string): Promise<void> {
258
+ if (globalProcessManager) {
259
+ await globalProcessManager.cleanup(reason);
260
+ }
261
+ }
@@ -22,6 +22,7 @@ const RemoveResponseSchema = z.object({
22
22
 
23
23
  export const removeSubcommand = createSubcommand({
24
24
  name: 'remove',
25
+ aliases: ['rm', 'del', 'delete', 'terminate'],
25
26
  description: 'Remove a GitHub App installation',
26
27
  tags: ['mutating', 'destructive', 'slow'],
27
28
  idempotent: false,
@@ -11,7 +11,7 @@ export const deleteCommand = createSubcommand({
11
11
  description: 'Delete a configuration profile',
12
12
  tags: ['destructive', 'deletes-resource', 'fast'],
13
13
  idempotent: false,
14
- aliases: ['remove', 'rm', 'del'],
14
+ aliases: ['rm', 'del', 'remove', 'terminate'],
15
15
  examples: [
16
16
  { command: getCommand('profile delete staging'), description: 'Delete item' },
17
17
  {