@synteq/cli 0.2.0 → 1.1.2

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 (433) hide show
  1. package/dist/api/client.d.ts +362 -5
  2. package/dist/api/client.js +559 -44
  3. package/dist/api/client.js.map +1 -1
  4. package/dist/api/factory.js +5 -2
  5. package/dist/api/factory.js.map +1 -1
  6. package/dist/api/types.d.ts +892 -3
  7. package/dist/apps-support/deploy.d.ts +197 -0
  8. package/dist/apps-support/deploy.js +639 -0
  9. package/dist/apps-support/deploy.js.map +1 -0
  10. package/dist/apps-support/dotenv.d.ts +67 -0
  11. package/dist/apps-support/dotenv.js +136 -0
  12. package/dist/apps-support/dotenv.js.map +1 -0
  13. package/dist/apps-support/env-rollout.d.ts +18 -0
  14. package/dist/apps-support/env-rollout.js +52 -0
  15. package/dist/apps-support/env-rollout.js.map +1 -0
  16. package/dist/apps-support/git.d.ts +14 -0
  17. package/dist/apps-support/git.js +25 -0
  18. package/dist/apps-support/git.js.map +1 -0
  19. package/dist/apps-support/link.d.ts +25 -0
  20. package/dist/apps-support/link.js +39 -0
  21. package/dist/apps-support/link.js.map +1 -0
  22. package/dist/apps-support/log-stream.d.ts +25 -0
  23. package/dist/apps-support/log-stream.js +85 -0
  24. package/dist/apps-support/log-stream.js.map +1 -0
  25. package/dist/apps-support/paid-app.d.ts +64 -0
  26. package/dist/apps-support/paid-app.js +195 -0
  27. package/dist/apps-support/paid-app.js.map +1 -0
  28. package/dist/apps-support/plans.d.ts +44 -0
  29. package/dist/apps-support/plans.js +43 -0
  30. package/dist/apps-support/plans.js.map +1 -0
  31. package/dist/apps-support/resolve.d.ts +10 -0
  32. package/dist/apps-support/resolve.js +53 -0
  33. package/dist/apps-support/resolve.js.map +1 -0
  34. package/dist/apps-support/time.d.ts +20 -0
  35. package/dist/apps-support/time.js +82 -0
  36. package/dist/apps-support/time.js.map +1 -0
  37. package/dist/auth/scope.js +4 -0
  38. package/dist/auth/scope.js.map +1 -1
  39. package/dist/auth/tokens.d.ts +3 -0
  40. package/dist/auth/tokens.js +6 -4
  41. package/dist/auth/tokens.js.map +1 -1
  42. package/dist/base/command.d.ts +35 -0
  43. package/dist/base/command.js +87 -4
  44. package/dist/base/command.js.map +1 -1
  45. package/dist/commands/agents.d.ts +10 -0
  46. package/dist/commands/agents.js +53 -0
  47. package/dist/commands/agents.js.map +1 -0
  48. package/dist/commands/api.d.ts +0 -1
  49. package/dist/commands/api.js +6 -5
  50. package/dist/commands/api.js.map +1 -1
  51. package/dist/commands/app/deployment/list.d.ts +14 -0
  52. package/dist/commands/app/deployment/list.js +45 -0
  53. package/dist/commands/app/deployment/list.js.map +1 -0
  54. package/dist/commands/app/deployment/rollback.d.ts +18 -0
  55. package/dist/commands/app/deployment/rollback.js +57 -0
  56. package/dist/commands/app/deployment/rollback.js.map +1 -0
  57. package/dist/commands/app/deployment/show.d.ts +26 -0
  58. package/dist/commands/app/deployment/show.js +98 -0
  59. package/dist/commands/app/deployment/show.js.map +1 -0
  60. package/dist/commands/app/domain/add.d.ts +17 -0
  61. package/dist/commands/app/domain/add.js +59 -0
  62. package/dist/commands/app/domain/add.js.map +1 -0
  63. package/dist/commands/app/domain/list.d.ts +14 -0
  64. package/dist/commands/app/domain/list.js +42 -0
  65. package/dist/commands/app/domain/list.js.map +1 -0
  66. package/dist/commands/app/domain/remove.d.ts +16 -0
  67. package/dist/commands/app/domain/remove.js +51 -0
  68. package/dist/commands/app/domain/remove.js.map +1 -0
  69. package/dist/commands/app/domain/verify.d.ts +15 -0
  70. package/dist/commands/app/domain/verify.js +39 -0
  71. package/dist/commands/app/domain/verify.js.map +1 -0
  72. package/dist/commands/app/env/add.d.ts +22 -0
  73. package/dist/commands/app/env/add.js +103 -0
  74. package/dist/commands/app/env/add.js.map +1 -0
  75. package/dist/commands/app/env/list.d.ts +17 -0
  76. package/dist/commands/app/env/list.js +40 -0
  77. package/dist/commands/app/env/list.js.map +1 -0
  78. package/dist/commands/app/env/reveal.d.ts +17 -0
  79. package/dist/commands/app/env/reveal.js +40 -0
  80. package/dist/commands/app/env/reveal.js.map +1 -0
  81. package/dist/commands/app/env/rm.d.ts +16 -0
  82. package/dist/commands/app/env/rm.js +48 -0
  83. package/dist/commands/app/env/rm.js.map +1 -0
  84. package/dist/commands/app/health.d.ts +14 -0
  85. package/dist/commands/app/health.js +40 -0
  86. package/dist/commands/app/health.js.map +1 -0
  87. package/dist/commands/app/index.d.ts +6 -0
  88. package/dist/commands/app/index.js +7 -0
  89. package/dist/commands/app/index.js.map +1 -0
  90. package/dist/commands/app/link.d.ts +22 -0
  91. package/dist/commands/app/link.js +31 -0
  92. package/dist/commands/app/link.js.map +1 -0
  93. package/dist/commands/app/logs.d.ts +25 -0
  94. package/dist/commands/app/logs.js +121 -0
  95. package/dist/commands/app/logs.js.map +1 -0
  96. package/dist/commands/app/metrics.d.ts +21 -0
  97. package/dist/commands/app/metrics.js +123 -0
  98. package/dist/commands/app/metrics.js.map +1 -0
  99. package/dist/commands/app/plan/change.d.ts +18 -0
  100. package/dist/commands/app/plan/change.js +79 -0
  101. package/dist/commands/app/plan/change.js.map +1 -0
  102. package/dist/commands/app/plan/show.d.ts +14 -0
  103. package/dist/commands/app/plan/show.js +40 -0
  104. package/dist/commands/app/plan/show.js.map +1 -0
  105. package/dist/commands/app/settings/set.d.ts +25 -0
  106. package/dist/commands/app/settings/set.js +96 -0
  107. package/dist/commands/app/settings/set.js.map +1 -0
  108. package/dist/commands/app/settings/show.d.ts +14 -0
  109. package/dist/commands/app/settings/show.js +48 -0
  110. package/dist/commands/app/settings/show.js.map +1 -0
  111. package/dist/commands/app/unlink.d.ts +8 -0
  112. package/dist/commands/app/unlink.js +25 -0
  113. package/dist/commands/app/unlink.js.map +1 -0
  114. package/dist/commands/apps/create.d.ts +26 -0
  115. package/dist/commands/apps/create.js +91 -0
  116. package/dist/commands/apps/create.js.map +1 -0
  117. package/dist/commands/apps/list.d.ts +17 -0
  118. package/dist/commands/apps/list.js +56 -0
  119. package/dist/commands/apps/list.js.map +1 -0
  120. package/dist/commands/baremetal/activity.d.ts +14 -0
  121. package/dist/commands/baremetal/activity.js +53 -0
  122. package/dist/commands/baremetal/activity.js.map +1 -0
  123. package/dist/commands/baremetal/bandwidth.d.ts +10 -0
  124. package/dist/commands/baremetal/bandwidth.js +86 -0
  125. package/dist/commands/baremetal/bandwidth.js.map +1 -0
  126. package/dist/commands/baremetal/console.d.ts +20 -0
  127. package/dist/commands/baremetal/console.js +72 -0
  128. package/dist/commands/baremetal/console.js.map +1 -0
  129. package/dist/commands/baremetal/details.d.ts +11 -0
  130. package/dist/commands/baremetal/details.js +116 -0
  131. package/dist/commands/baremetal/details.js.map +1 -0
  132. package/dist/commands/baremetal/index.d.ts +5 -0
  133. package/dist/commands/baremetal/index.js +6 -0
  134. package/dist/commands/baremetal/index.js.map +1 -0
  135. package/dist/commands/baremetal/install-password.d.ts +14 -0
  136. package/dist/commands/baremetal/install-password.js +80 -0
  137. package/dist/commands/baremetal/install-password.js.map +1 -0
  138. package/dist/commands/baremetal/list.d.ts +11 -0
  139. package/dist/commands/baremetal/list.js +59 -0
  140. package/dist/commands/baremetal/list.js.map +1 -0
  141. package/dist/commands/baremetal/order.d.ts +34 -0
  142. package/dist/commands/baremetal/order.js +394 -0
  143. package/dist/commands/baremetal/order.js.map +1 -0
  144. package/dist/commands/baremetal/power.d.ts +18 -0
  145. package/dist/commands/baremetal/power.js +168 -0
  146. package/dist/commands/baremetal/power.js.map +1 -0
  147. package/dist/commands/baremetal/reinstall.d.ts +21 -0
  148. package/dist/commands/baremetal/reinstall.js +168 -0
  149. package/dist/commands/baremetal/reinstall.js.map +1 -0
  150. package/dist/commands/config/profile/add.d.ts +11 -0
  151. package/dist/commands/config/profile/add.js +51 -0
  152. package/dist/commands/config/profile/add.js.map +1 -0
  153. package/dist/commands/config/profile/list.d.ts +7 -0
  154. package/dist/commands/config/profile/list.js +29 -0
  155. package/dist/commands/config/profile/list.js.map +1 -0
  156. package/dist/commands/config/profile/remove.d.ts +11 -0
  157. package/dist/commands/config/profile/remove.js +35 -0
  158. package/dist/commands/config/profile/remove.js.map +1 -0
  159. package/dist/commands/config/profile/use.d.ts +10 -0
  160. package/dist/commands/config/profile/use.js +44 -0
  161. package/dist/commands/config/profile/use.js.map +1 -0
  162. package/dist/commands/config/show.js +4 -1
  163. package/dist/commands/config/show.js.map +1 -1
  164. package/dist/commands/credits/add.js +2 -2
  165. package/dist/commands/credits/add.js.map +1 -1
  166. package/dist/commands/credits/index.js +5 -1
  167. package/dist/commands/credits/index.js.map +1 -1
  168. package/dist/commands/deploy.d.ts +51 -0
  169. package/dist/commands/deploy.js +515 -0
  170. package/dist/commands/deploy.js.map +1 -0
  171. package/dist/commands/function/create.d.ts +29 -0
  172. package/dist/commands/function/create.js +113 -0
  173. package/dist/commands/function/create.js.map +1 -0
  174. package/dist/commands/function/credits/add.d.ts +29 -0
  175. package/dist/commands/function/credits/add.js +209 -0
  176. package/dist/commands/function/credits/add.js.map +1 -0
  177. package/dist/commands/function/credits/auto-reload.d.ts +27 -0
  178. package/dist/commands/function/credits/auto-reload.js +107 -0
  179. package/dist/commands/function/credits/auto-reload.js.map +1 -0
  180. package/dist/commands/function/credits/index.d.ts +22 -0
  181. package/dist/commands/function/credits/index.js +80 -0
  182. package/dist/commands/function/credits/index.js.map +1 -0
  183. package/dist/commands/function/cron/add.d.ts +19 -0
  184. package/dist/commands/function/cron/add.js +74 -0
  185. package/dist/commands/function/cron/add.js.map +1 -0
  186. package/dist/commands/function/cron/list.d.ts +12 -0
  187. package/dist/commands/function/cron/list.js +55 -0
  188. package/dist/commands/function/cron/list.js.map +1 -0
  189. package/dist/commands/function/cron/rm.d.ts +17 -0
  190. package/dist/commands/function/cron/rm.js +73 -0
  191. package/dist/commands/function/cron/rm.js.map +1 -0
  192. package/dist/commands/function/cron/run.d.ts +16 -0
  193. package/dist/commands/function/cron/run.js +59 -0
  194. package/dist/commands/function/cron/run.js.map +1 -0
  195. package/dist/commands/function/cron/update.d.ts +21 -0
  196. package/dist/commands/function/cron/update.js +87 -0
  197. package/dist/commands/function/cron/update.js.map +1 -0
  198. package/dist/commands/function/delete.d.ts +23 -0
  199. package/dist/commands/function/delete.js +90 -0
  200. package/dist/commands/function/delete.js.map +1 -0
  201. package/dist/commands/function/deploy.d.ts +64 -0
  202. package/dist/commands/function/deploy.js +616 -0
  203. package/dist/commands/function/deploy.js.map +1 -0
  204. package/dist/commands/function/env/list.d.ts +12 -0
  205. package/dist/commands/function/env/list.js +46 -0
  206. package/dist/commands/function/env/list.js.map +1 -0
  207. package/dist/commands/function/env/reveal.d.ts +21 -0
  208. package/dist/commands/function/env/reveal.js +54 -0
  209. package/dist/commands/function/env/reveal.js.map +1 -0
  210. package/dist/commands/function/env/rm.d.ts +17 -0
  211. package/dist/commands/function/env/rm.js +62 -0
  212. package/dist/commands/function/env/rm.js.map +1 -0
  213. package/dist/commands/function/env/set.d.ts +28 -0
  214. package/dist/commands/function/env/set.js +124 -0
  215. package/dist/commands/function/env/set.js.map +1 -0
  216. package/dist/commands/function/index.d.ts +14 -0
  217. package/dist/commands/function/index.js +11 -0
  218. package/dist/commands/function/index.js.map +1 -0
  219. package/dist/commands/function/init.d.ts +48 -0
  220. package/dist/commands/function/init.js +277 -0
  221. package/dist/commands/function/init.js.map +1 -0
  222. package/dist/commands/function/invoke.d.ts +29 -0
  223. package/dist/commands/function/invoke.js +138 -0
  224. package/dist/commands/function/invoke.js.map +1 -0
  225. package/dist/commands/function/link.d.ts +23 -0
  226. package/dist/commands/function/link.js +80 -0
  227. package/dist/commands/function/link.js.map +1 -0
  228. package/dist/commands/function/list.d.ts +16 -0
  229. package/dist/commands/function/list.js +55 -0
  230. package/dist/commands/function/list.js.map +1 -0
  231. package/dist/commands/function/logs.d.ts +29 -0
  232. package/dist/commands/function/logs.js +171 -0
  233. package/dist/commands/function/logs.js.map +1 -0
  234. package/dist/commands/function/pause.d.ts +19 -0
  235. package/dist/commands/function/pause.js +50 -0
  236. package/dist/commands/function/pause.js.map +1 -0
  237. package/dist/commands/function/releases.d.ts +15 -0
  238. package/dist/commands/function/releases.js +62 -0
  239. package/dist/commands/function/releases.js.map +1 -0
  240. package/dist/commands/function/resume.d.ts +16 -0
  241. package/dist/commands/function/resume.js +47 -0
  242. package/dist/commands/function/resume.js.map +1 -0
  243. package/dist/commands/function/rollback.d.ts +18 -0
  244. package/dist/commands/function/rollback.js +69 -0
  245. package/dist/commands/function/rollback.js.map +1 -0
  246. package/dist/commands/function/settings/set.d.ts +23 -0
  247. package/dist/commands/function/settings/set.js +119 -0
  248. package/dist/commands/function/settings/set.js.map +1 -0
  249. package/dist/commands/function/show.d.ts +15 -0
  250. package/dist/commands/function/show.js +80 -0
  251. package/dist/commands/function/show.js.map +1 -0
  252. package/dist/commands/function/unlink.d.ts +9 -0
  253. package/dist/commands/function/unlink.js +34 -0
  254. package/dist/commands/function/unlink.js.map +1 -0
  255. package/dist/commands/link.d.ts +82 -0
  256. package/dist/commands/link.js +532 -0
  257. package/dist/commands/link.js.map +1 -0
  258. package/dist/commands/login.js +9 -0
  259. package/dist/commands/login.js.map +1 -1
  260. package/dist/commands/order.js +3 -1
  261. package/dist/commands/order.js.map +1 -1
  262. package/dist/commands/payments/methods/delete.js +2 -2
  263. package/dist/commands/payments/methods/delete.js.map +1 -1
  264. package/dist/commands/resources.js +50 -7
  265. package/dist/commands/resources.js.map +1 -1
  266. package/dist/commands/status.d.ts +12 -0
  267. package/dist/commands/status.js +71 -0
  268. package/dist/commands/status.js.map +1 -0
  269. package/dist/commands/storage/detach.js +1 -1
  270. package/dist/commands/storage/detach.js.map +1 -1
  271. package/dist/commands/storage/list.js +6 -2
  272. package/dist/commands/storage/list.js.map +1 -1
  273. package/dist/commands/storage/order.d.ts +2 -0
  274. package/dist/commands/storage/order.js +100 -18
  275. package/dist/commands/storage/order.js.map +1 -1
  276. package/dist/commands/storage/resize.js +19 -6
  277. package/dist/commands/storage/resize.js.map +1 -1
  278. package/dist/commands/tickets/create.d.ts +2 -0
  279. package/dist/commands/tickets/create.js +40 -1
  280. package/dist/commands/tickets/create.js.map +1 -1
  281. package/dist/commands/tickets/download.d.ts +18 -0
  282. package/dist/commands/tickets/download.js +138 -0
  283. package/dist/commands/tickets/download.js.map +1 -0
  284. package/dist/commands/tickets/list.js +13 -7
  285. package/dist/commands/tickets/list.js.map +1 -1
  286. package/dist/commands/tickets/reply.d.ts +2 -0
  287. package/dist/commands/tickets/reply.js +33 -4
  288. package/dist/commands/tickets/reply.js.map +1 -1
  289. package/dist/commands/vds/order.js +72 -7
  290. package/dist/commands/vds/order.js.map +1 -1
  291. package/dist/commands/vps/console.js +14 -6
  292. package/dist/commands/vps/console.js.map +1 -1
  293. package/dist/commands/vps/details.js +7 -1
  294. package/dist/commands/vps/details.js.map +1 -1
  295. package/dist/commands/vps/ip/add.js +76 -9
  296. package/dist/commands/vps/ip/add.js.map +1 -1
  297. package/dist/commands/vps/list.js +13 -4
  298. package/dist/commands/vps/list.js.map +1 -1
  299. package/dist/commands/vps/order.d.ts +19 -0
  300. package/dist/commands/vps/order.js +179 -23
  301. package/dist/commands/vps/order.js.map +1 -1
  302. package/dist/commands/vps/power.js +2 -2
  303. package/dist/commands/vps/power.js.map +1 -1
  304. package/dist/commands/vps/reinstall.js +2 -2
  305. package/dist/commands/vps/reinstall.js.map +1 -1
  306. package/dist/commands/vps/resize.js +36 -13
  307. package/dist/commands/vps/resize.js.map +1 -1
  308. package/dist/commands/whoami.d.ts +5 -0
  309. package/dist/commands/whoami.js +8 -3
  310. package/dist/commands/whoami.js.map +1 -1
  311. package/dist/config/paths.d.ts +1 -1
  312. package/dist/config/paths.js +6 -1
  313. package/dist/config/paths.js.map +1 -1
  314. package/dist/config/store.d.ts +58 -0
  315. package/dist/config/store.js +84 -2
  316. package/dist/config/store.js.map +1 -1
  317. package/dist/functions-support/credits.d.ts +64 -0
  318. package/dist/functions-support/credits.js +181 -0
  319. package/dist/functions-support/credits.js.map +1 -0
  320. package/dist/functions-support/cron.d.ts +17 -0
  321. package/dist/functions-support/cron.js +99 -0
  322. package/dist/functions-support/cron.js.map +1 -0
  323. package/dist/functions-support/env.d.ts +23 -0
  324. package/dist/functions-support/env.js +44 -0
  325. package/dist/functions-support/env.js.map +1 -0
  326. package/dist/functions-support/link.d.ts +25 -0
  327. package/dist/functions-support/link.js +51 -0
  328. package/dist/functions-support/link.js.map +1 -0
  329. package/dist/functions-support/poll.d.ts +40 -0
  330. package/dist/functions-support/poll.js +109 -0
  331. package/dist/functions-support/poll.js.map +1 -0
  332. package/dist/functions-support/resolve.d.ts +3 -0
  333. package/dist/functions-support/resolve.js +31 -0
  334. package/dist/functions-support/resolve.js.map +1 -0
  335. package/dist/functions-support/runtime.d.ts +30 -0
  336. package/dist/functions-support/runtime.js +52 -0
  337. package/dist/functions-support/runtime.js.map +1 -0
  338. package/dist/functions-support/source.d.ts +92 -0
  339. package/dist/functions-support/source.js +343 -0
  340. package/dist/functions-support/source.js.map +1 -0
  341. package/dist/help/scope-aware-help.js +10 -1
  342. package/dist/help/scope-aware-help.js.map +1 -1
  343. package/dist/tui/App.js +10 -25
  344. package/dist/tui/App.js.map +1 -1
  345. package/dist/tui/components/Menu.d.ts +3 -1
  346. package/dist/tui/components/Menu.js +7 -3
  347. package/dist/tui/components/Menu.js.map +1 -1
  348. package/dist/tui/router.d.ts +1 -1
  349. package/dist/tui/router.js.map +1 -1
  350. package/dist/tui/screens/Billing.js +56 -4
  351. package/dist/tui/screens/Billing.js.map +1 -1
  352. package/dist/tui/screens/Dashboard.js +8 -7
  353. package/dist/tui/screens/Dashboard.js.map +1 -1
  354. package/dist/tui/screens/Deploy.d.ts +2 -0
  355. package/dist/tui/screens/Deploy.js +912 -0
  356. package/dist/tui/screens/Deploy.js.map +1 -0
  357. package/dist/tui/screens/Order.js +359 -26
  358. package/dist/tui/screens/Order.js.map +1 -1
  359. package/dist/tui/screens/Resources.js +273 -31
  360. package/dist/tui/screens/Resources.js.map +1 -1
  361. package/dist/tui/screens/Tickets.js +18 -6
  362. package/dist/tui/screens/Tickets.js.map +1 -1
  363. package/dist/tui/screens/deployPreset.d.ts +20 -0
  364. package/dist/tui/screens/deployPreset.js +11 -0
  365. package/dist/tui/screens/deployPreset.js.map +1 -0
  366. package/dist/tui/screens/resources/AppDetail.d.ts +7 -0
  367. package/dist/tui/screens/resources/AppDetail.js +810 -0
  368. package/dist/tui/screens/resources/AppDetail.js.map +1 -0
  369. package/dist/tui/screens/resources/FunctionDetail.d.ts +7 -0
  370. package/dist/tui/screens/resources/FunctionDetail.js +751 -0
  371. package/dist/tui/screens/resources/FunctionDetail.js.map +1 -0
  372. package/dist/ui/attach.d.ts +15 -0
  373. package/dist/ui/attach.js +63 -0
  374. package/dist/ui/attach.js.map +1 -0
  375. package/dist/ui/baremetal-resolve.d.ts +10 -0
  376. package/dist/ui/baremetal-resolve.js +50 -0
  377. package/dist/ui/baremetal-resolve.js.map +1 -0
  378. package/dist/ui/confirm.js +1 -1
  379. package/dist/ui/confirm.js.map +1 -1
  380. package/dist/ui/cycle.d.ts +66 -0
  381. package/dist/ui/cycle.js +96 -0
  382. package/dist/ui/cycle.js.map +1 -0
  383. package/dist/ui/deploy-ui.d.ts +75 -0
  384. package/dist/ui/deploy-ui.js +243 -0
  385. package/dist/ui/deploy-ui.js.map +1 -0
  386. package/dist/ui/order-result.d.ts +4 -0
  387. package/dist/ui/order-result.js +32 -0
  388. package/dist/ui/order-result.js.map +1 -0
  389. package/dist/ui/payment-gate.d.ts +26 -0
  390. package/dist/ui/payment-gate.js +70 -0
  391. package/dist/ui/payment-gate.js.map +1 -0
  392. package/dist/ui/payment.js +10 -3
  393. package/dist/ui/payment.js.map +1 -1
  394. package/dist/ui/portal.d.ts +1 -1
  395. package/dist/ui/portal.js +7 -2
  396. package/dist/ui/portal.js.map +1 -1
  397. package/dist/ui/project-resolve.d.ts +25 -0
  398. package/dist/ui/project-resolve.js +31 -0
  399. package/dist/ui/project-resolve.js.map +1 -0
  400. package/dist/ui/render-mode.d.ts +5 -0
  401. package/dist/ui/render-mode.js +1 -1
  402. package/dist/ui/render-mode.js.map +1 -1
  403. package/dist/ui/resource-detail.js +0 -3
  404. package/dist/ui/resource-detail.js.map +1 -1
  405. package/dist/ui/resource-resolve.d.ts +9 -2
  406. package/dist/ui/resource-resolve.js +11 -4
  407. package/dist/ui/resource-resolve.js.map +1 -1
  408. package/dist/ui/spinner.d.ts +10 -1
  409. package/dist/ui/spinner.js +12 -3
  410. package/dist/ui/spinner.js.map +1 -1
  411. package/dist/ui/table.d.ts +7 -0
  412. package/dist/ui/table.js +11 -0
  413. package/dist/ui/table.js.map +1 -1
  414. package/dist/ui/tax.d.ts +10 -0
  415. package/dist/ui/tax.js +31 -0
  416. package/dist/ui/tax.js.map +1 -0
  417. package/dist/ui/ticket-resolve.d.ts +9 -1
  418. package/dist/ui/ticket-resolve.js +13 -2
  419. package/dist/ui/ticket-resolve.js.map +1 -1
  420. package/dist/ui/volume-resolve.js +4 -1
  421. package/dist/ui/volume-resolve.js.map +1 -1
  422. package/dist/ui/wait.d.ts +4 -0
  423. package/dist/ui/wait.js +7 -2
  424. package/dist/ui/wait.js.map +1 -1
  425. package/dist/ui/wizard.d.ts +2 -1
  426. package/dist/ui/wizard.js +1 -1
  427. package/dist/ui/wizard.js.map +1 -1
  428. package/dist/version-check-bin.js +2 -2
  429. package/dist/version-check-bin.js.map +1 -1
  430. package/dist/version-check.d.ts +5 -0
  431. package/dist/version-check.js +6 -1
  432. package/dist/version-check.js.map +1 -1
  433. package/package.json +53 -6
@@ -0,0 +1,40 @@
1
+ import { Flags } from "@oclif/core";
2
+ import { BaseCommand, appTargetArg } from "../../base/command.js";
3
+ import { withSpinner } from "../../ui/spinner.js";
4
+ import { ok, dim } from "../../ui/glyphs.js";
5
+ import { panel } from "../../ui/wizard.js";
6
+ /** `synteq app health` — probe the running app's health endpoint. */
7
+ export default class AppHealth extends BaseCommand {
8
+ static apiKeyScope = "none";
9
+ static description = "Check a running app's health (probes its health endpoint through the cluster).";
10
+ static examples = [
11
+ "<%= config.bin %> app health # bare: uses this directory's `synteq link`",
12
+ "<%= config.bin %> app health --app my-api",
13
+ "<%= config.bin %> app health --app my-api -o json",
14
+ ];
15
+ static args = { ...appTargetArg };
16
+ static flags = {
17
+ app: Flags.string({ description: "App slug (or uuid) (default: the directory's linked app)." }),
18
+ };
19
+ async run() {
20
+ await this.initClients();
21
+ const { args, flags } = await this.parse(AppHealth);
22
+ try {
23
+ const app = await this.resolveLinkedApp(flags, args.target);
24
+ const h = await withSpinner("Probing health", () => this.clients.api.apps.health(app.id));
25
+ this.emit(h, () => {
26
+ this.log(panel(h.ok ? "Healthy" : "Unhealthy", [
27
+ ["App", app.slug],
28
+ ["OK", h.ok ? ok("yes") : "no"],
29
+ ["Status", h.status != null ? String(h.status) : dim("—")],
30
+ ["Latency", h.latencyMs != null ? `${h.latencyMs} ms` : dim("—")],
31
+ ["Detail", h.detail ?? dim("—")],
32
+ ]));
33
+ });
34
+ }
35
+ catch (err) {
36
+ this.fail(err);
37
+ }
38
+ }
39
+ }
40
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../../src/commands/app/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,qEAAqE;AACrE,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,WAAW;IAChD,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC;IAC5B,MAAM,CAAC,WAAW,GAAG,gFAAgF,CAAC;IACtG,MAAM,CAAC,QAAQ,GAAG;QAChB,0FAA0F;QAC1F,2CAA2C;QAC3C,mDAAmD;KACpD,CAAC;IACF,MAAM,CAAC,IAAI,GAAG,EAAE,GAAG,YAAY,EAAE,CAAC;IAClC,MAAM,CAAC,KAAK,GAAG;QACb,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,2DAA2D,EAAE,CAAC;KAChG,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC5D,MAAM,CAAC,GAAG,MAAM,WAAW,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1F,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE;gBAChB,IAAI,CAAC,GAAG,CACN,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,EAAE;oBACpC,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC;oBACjB,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;oBAC/B,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBAC1D,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBACjE,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;iBACjC,CAAC,CACH,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjB,CAAC;IACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ import Status from "../status.js";
2
+ /** Bare `synteq app` in a linked directory shows that app (same as `synteq status`). */
3
+ export default class AppDefault extends Status {
4
+ static description: string;
5
+ static examples: string[];
6
+ }
@@ -0,0 +1,7 @@
1
+ import Status from "../status.js";
2
+ /** Bare `synteq app` in a linked directory shows that app (same as `synteq status`). */
3
+ export default class AppDefault extends Status {
4
+ static description = "Show the app linked to the current directory and its latest deploy (same as `synteq status`).";
5
+ static examples = ["<%= config.bin %> app", "<%= config.bin %> app -o json"];
6
+ }
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/app/index.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,cAAc,CAAC;AAElC,wFAAwF;AACxF,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,MAAM;IAC5C,MAAM,CAAC,WAAW,GAAG,+FAA+F,CAAC;IACrH,MAAM,CAAC,QAAQ,GAAG,CAAC,uBAAuB,EAAE,+BAA+B,CAAC,CAAC"}
@@ -0,0 +1,22 @@
1
+ import Link from "../link.js";
2
+ /** `synteq app link [app]` — `synteq link` under the app topic, with the
3
+ * slug as a positional so it reads like `function link <name>`. */
4
+ export default class AppLink extends Link {
5
+ static description: string;
6
+ static apiKeyScope: string;
7
+ static examples: string[];
8
+ static args: {
9
+ app: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
10
+ };
11
+ static flags: {
12
+ app: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
+ project: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
+ remove: import("@oclif/core/interfaces").BooleanFlag<boolean>;
15
+ "no-interactive": import("@oclif/core/interfaces").BooleanFlag<boolean>;
16
+ };
17
+ static baseFlags: {
18
+ output: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
19
+ insecure: import("@oclif/core/interfaces").BooleanFlag<boolean>;
20
+ };
21
+ run(): Promise<void>;
22
+ }
@@ -0,0 +1,31 @@
1
+ import { Args } from "@oclif/core";
2
+ import Link from "../link.js";
3
+ /** `synteq app link [app]` — `synteq link` under the app topic, with the
4
+ * slug as a positional so it reads like `function link <name>`. */
5
+ export default class AppLink extends Link {
6
+ static description = [
7
+ "Link the current directory to an app: name one by slug or id, or pick one on a TTY.",
8
+ "Same as `synteq link`; a linked directory deploys with a bare `synteq deploy`.",
9
+ ].join("\n");
10
+ static apiKeyScope = "none";
11
+ static examples = [
12
+ "<%= config.bin %> app link # interactive: pick a team, project and app (or create one)",
13
+ "<%= config.bin %> app link my-api # straight to an existing app by slug",
14
+ "<%= config.bin %> app link 01931234-... # or by id",
15
+ "<%= config.bin %> app link my-api --project 01931234-... -o json",
16
+ ];
17
+ static args = {
18
+ app: Args.string({
19
+ description: "App slug (or uuid) to link to. Omit on a TTY for the interactive walkthrough.",
20
+ }),
21
+ };
22
+ static flags = Link.flags;
23
+ static baseFlags = Link.baseFlags;
24
+ async run() {
25
+ const { args, flags } = await this.parse(AppLink);
26
+ if (args.app && !flags.app)
27
+ this.argv.push("--app", args.app);
28
+ await super.run();
29
+ }
30
+ }
31
+ //# sourceMappingURL=link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.js","sourceRoot":"","sources":["../../../src/commands/app/link.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,IAAI,MAAM,YAAY,CAAC;AAE9B;oEACoE;AACpE,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,IAAI;IACvC,MAAM,CAAC,WAAW,GAAG;QACnB,qFAAqF;QACrF,gFAAgF;KACjF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC;IAC5B,MAAM,CAAC,QAAQ,GAAG;QAChB,yGAAyG;QACzG,mFAAmF;QACnF,wDAAwD;QACxD,kEAAkE;KACnE,CAAC;IACF,MAAM,CAAC,IAAI,GAAG;QACZ,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC;YACf,WAAW,EAAE,+EAA+E;SAC7F,CAAC;KACH,CAAC;IACF,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IAC1B,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IAElC,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9D,MAAM,KAAK,CAAC,GAAG,EAAE,CAAC;IACpB,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { BaseCommand } from "../../base/command.js";
2
+ /** `synteq app logs` — bounded log history for a time window, or with
3
+ * `--follow` the live container tail. Backend: GET
4
+ * /apps/{id}/logs/history?since=|from=&until=, or the log WS. */
5
+ export default class AppLogs extends BaseCommand {
6
+ static apiKeyScope: string;
7
+ /** `synteq logs` lived at the root until 2026-10-06; kept as a hidden alias. */
8
+ static hiddenAliases: string[];
9
+ static description: string;
10
+ static examples: string[];
11
+ static args: {
12
+ target: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
13
+ };
14
+ static flags: {
15
+ app: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
16
+ follow: import("@oclif/core/interfaces").BooleanFlag<boolean>;
17
+ since: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
18
+ from: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
19
+ until: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
20
+ search: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
21
+ container: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
22
+ limit: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
23
+ };
24
+ run(): Promise<void>;
25
+ }
@@ -0,0 +1,121 @@
1
+ import { Flags } from "@oclif/core";
2
+ import { BaseCommand, appTargetArg } from "../../base/command.js";
3
+ import { buildLogWsUrl, streamLogs } from "../../apps-support/log-stream.js";
4
+ import { withSpinner } from "../../ui/spinner.js";
5
+ import { dim } from "../../ui/glyphs.js";
6
+ import { parseTimeframe, fmtClock } from "../../apps-support/time.js";
7
+ const SINCE = ["15m", "1h", "6h", "24h", "72h", "168h", "336h", "720h", "4320h"];
8
+ /** `synteq app logs` — bounded log history for a time window, or with
9
+ * `--follow` the live container tail. Backend: GET
10
+ * /apps/{id}/logs/history?since=|from=&until=, or the log WS. */
11
+ export default class AppLogs extends BaseCommand {
12
+ static apiKeyScope = "none";
13
+ /** `synteq logs` lived at the root until 2026-10-06; kept as a hidden alias. */
14
+ static hiddenAliases = ["logs"];
15
+ static description = [
16
+ "Query an app's log history over a time window, or tail its live container logs with --follow.",
17
+ "",
18
+ "`--follow` / `-f` opens a WebSocket to the app's log proxy (single-use",
19
+ "ws-ticket) and streams until Ctrl-C. Without it the history route answers:",
20
+ "Pick the window either relatively (`--since 6h`) or as an absolute timeframe:",
21
+ "`--from` / `--until` take an ISO-8601 instant (2026-09-12T16:00:00Z, a date",
22
+ "alone is midnight UTC) or an age (90m, 2h, 3d = that long ago). `--from`",
23
+ "replaces `--since`; `--until` defaults to now. Timestamps print in your",
24
+ "local zone; pass `-o json` for the raw ISO instants.",
25
+ ].join("\n");
26
+ static examples = [
27
+ "<%= config.bin %> app logs --since 1h # bare: linked app",
28
+ "<%= config.bin %> app logs my-api -f # live tail (Ctrl-C to stop)",
29
+ "<%= config.bin %> app logs my-api --follow > app.log # redirect the stream",
30
+ "<%= config.bin %> app logs --app my-api --since 24h --search error",
31
+ "<%= config.bin %> app logs --app my-api --from 2026-09-12T16:00:00Z --until 2026-09-12T16:30:00Z",
32
+ "<%= config.bin %> app logs --app my-api --from 3h --until 2h # the hour that ended two hours ago",
33
+ "<%= config.bin %> app logs --app my-api --since 6h --limit 2000 -o json",
34
+ ];
35
+ static args = { ...appTargetArg };
36
+ static flags = {
37
+ app: Flags.string({ description: "App slug (or uuid) (default: the directory's linked app)." }),
38
+ follow: Flags.boolean({
39
+ char: "f",
40
+ description: "Tail the live container logs until Ctrl-C instead of querying history.",
41
+ exclusive: ["since", "from", "until", "search", "container", "limit"],
42
+ }),
43
+ since: Flags.string({
44
+ options: SINCE,
45
+ default: "1h",
46
+ description: `Relative window (one of ${SINCE.join(", ")}; default 1h). Ignored when --from is given.`,
47
+ }),
48
+ from: Flags.string({
49
+ description: "Start of an absolute timeframe: ISO-8601 instant or an age like 2h / 3d. Replaces --since.",
50
+ }),
51
+ until: Flags.string({
52
+ description: "End of the timeframe: ISO-8601 instant or an age like 30m (default: now).",
53
+ }),
54
+ search: Flags.string({ description: "Substring filter over log lines (case-insensitive)." }),
55
+ container: Flags.string({ description: "Restrict to one container/pod." }),
56
+ limit: Flags.integer({
57
+ default: 500,
58
+ description: "Maximum lines to return, newest wins (1..5000; default 500).",
59
+ }),
60
+ };
61
+ async run() {
62
+ await this.initClients();
63
+ const { args, flags } = await this.parse(AppLogs);
64
+ try {
65
+ if (flags.follow) {
66
+ const app = await this.resolveLinkedApp(flags, args.target);
67
+ const { ticket } = await this.clients.api.auth.wsTicket();
68
+ await streamLogs({
69
+ url: buildLogWsUrl(this.clients.config.get().api_base_url, app.id, ticket, true),
70
+ slug: app.slug,
71
+ follow: true,
72
+ log: (l) => this.log(l),
73
+ unsupported: () => this.error("This Node build has no global WebSocket (need Node 20+). Upgrade Node to stream logs.", { exit: 3 }),
74
+ });
75
+ return;
76
+ }
77
+ let timeframe;
78
+ try {
79
+ timeframe = parseTimeframe(flags.from, flags.until);
80
+ }
81
+ catch (e) {
82
+ this.error(e instanceof Error ? e.message : String(e), { exit: 1 });
83
+ }
84
+ if (flags.limit < 1 || flags.limit > 5000)
85
+ this.error("--limit must be 1..5000.", { exit: 1 });
86
+ const app = await this.resolveLinkedApp(flags, args.target);
87
+ const windowLabel = timeframe.from
88
+ ? `${timeframe.from} → ${timeframe.until ?? "now"}`
89
+ : flags.since;
90
+ const res = await withSpinner(`Fetching logs (${windowLabel})`, () => this.clients.api.apps.logHistory(app.id, {
91
+ since: flags.since,
92
+ from: timeframe.from,
93
+ until: timeframe.until,
94
+ container: flags.container,
95
+ limit: flags.limit,
96
+ }));
97
+ // The history route has no server-side text search; filter here so
98
+ // `--search` means the same thing on every portal version.
99
+ const needle = flags.search?.toLowerCase();
100
+ const all = res.lines ?? res.entries ?? [];
101
+ const lines = needle ? all.filter((l) => (l.message ?? "").toLowerCase().includes(needle)) : all;
102
+ this.emit(needle ? { ...res, lines } : res, () => {
103
+ if (lines.length === 0) {
104
+ this.log(dim(timeframe.from ? `No log lines in ${windowLabel}.` : `No log lines in the last ${flags.since}.`));
105
+ return;
106
+ }
107
+ for (const l of lines) {
108
+ const ts = l.ts ? dim(`${fmtClock(l.ts)} `) : "";
109
+ const ctr = l.container && l.container !== "app" ? dim(`[${l.container}] `) : "";
110
+ const build = l.build ? dim(`${l.build} `) : "";
111
+ this.log(`${ts}${build}${ctr}${l.message ?? ""}`);
112
+ }
113
+ this.log(dim(`${lines.length} line${lines.length === 1 ? "" : "s"} · ${windowLabel}`));
114
+ });
115
+ }
116
+ catch (err) {
117
+ this.fail(err);
118
+ }
119
+ }
120
+ }
121
+ //# sourceMappingURL=logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../../src/commands/app/logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAEtE,MAAM,KAAK,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAEjF;;kEAEkE;AAClE,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,WAAW;IAC9C,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC;IAC5B,gFAAgF;IAChF,MAAM,CAAC,aAAa,GAAG,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,CAAC,WAAW,GAAG;QACnB,+FAA+F;QAC/F,EAAE;QACF,wEAAwE;QACxE,4EAA4E;QAC5E,+EAA+E;QAC/E,6EAA6E;QAC7E,0EAA0E;QAC1E,yEAAyE;QACzE,sDAAsD;KACvD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,MAAM,CAAC,QAAQ,GAAG;QAChB,6EAA6E;QAC7E,wFAAwF;QACxF,iFAAiF;QACjF,oEAAoE;QACpE,kGAAkG;QAClG,uGAAuG;QACvG,yEAAyE;KAC1E,CAAC;IACF,MAAM,CAAC,IAAI,GAAG,EAAE,GAAG,YAAY,EAAE,CAAC;IAClC,MAAM,CAAC,KAAK,GAAG;QACb,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,2DAA2D,EAAE,CAAC;QAC/F,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC;YACpB,IAAI,EAAE,GAAG;YACT,WAAW,EAAE,wEAAwE;YACrF,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,CAAC;SACtE,CAAC;QACF,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC;YAClB,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,IAAI;YACb,WAAW,EAAE,2BAA2B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,8CAA8C;SACvG,CAAC;QACF,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC;YACjB,WAAW,EAAE,4FAA4F;SAC1G,CAAC;QACF,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC;YAClB,WAAW,EAAE,2EAA2E;SACzF,CAAC;QACF,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,qDAAqD,EAAE,CAAC;QAC5F,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,gCAAgC,EAAE,CAAC;QAC1E,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC;YACnB,OAAO,EAAE,GAAG;YACZ,WAAW,EAAE,8DAA8D;SAC5E,CAAC;KACH,CAAC;IACF,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC;YACH,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBACjB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC5D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC1D,MAAM,UAAU,CAAC;oBACf,GAAG,EAAE,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,YAAY,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC;oBAChF,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,MAAM,EAAE,IAAI;oBACZ,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;oBACvB,WAAW,EAAE,GAAG,EAAE,CAChB,IAAI,CAAC,KAAK,CAAC,uFAAuF,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;iBACnH,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YACD,IAAI,SAA4C,CAAC;YACjD,IAAI,CAAC;gBACH,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YACtD,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,CAAC,KAAK,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;YACtE,CAAC;YACD,IAAI,KAAK,CAAC,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,GAAG,IAAI;gBAAE,IAAI,CAAC,KAAK,CAAC,0BAA0B,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;YAC/F,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC5D,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI;gBAChC,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,MAAM,SAAS,CAAC,KAAK,IAAI,KAAK,EAAE;gBACnD,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;YAChB,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,kBAAkB,WAAW,GAAG,EAAE,GAAG,EAAE,CACnE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE;gBACvC,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,IAAI,EAAE,SAAS,CAAC,IAAI;gBACpB,KAAK,EAAE,SAAS,CAAC,KAAK;gBACtB,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,KAAK,EAAE,KAAK,CAAC,KAAK;aACnB,CAAC,CACH,CAAC;YACF,mEAAmE;YACnE,2DAA2D;YAC3D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;YAC3C,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;YAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YACjG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE;gBAC/C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACvB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,WAAW,GAAG,CAAC,CAAC,CAAC,4BAA4B,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;oBAC/G,OAAO;gBACT,CAAC;gBACD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;oBACtB,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBACjD,MAAM,GAAG,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBACjF,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAChD,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC,CAAC;gBACpD,CAAC;gBACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,QAAQ,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,WAAW,EAAE,CAAC,CAAC,CAAC;YACzF,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjB,CAAC;IACH,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { BaseCommand } from "../../base/command.js";
2
+ import type { AppUsage } from "../../api/types.js";
3
+ /** `synteq app metrics` — CPU / memory / network usage against the plan
4
+ * envelope, live plus the window's series. Backend: GET /apps/{id}/usage. */
5
+ export default class AppMetrics extends BaseCommand {
6
+ static apiKeyScope: string;
7
+ static description: string;
8
+ static examples: string[];
9
+ static args: {
10
+ target: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
11
+ };
12
+ static flags: {
13
+ app: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
+ range: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
15
+ from: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
16
+ until: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
17
+ };
18
+ run(): Promise<void>;
19
+ }
20
+ /** Table rows: one per axis with a value, formatted in that axis's unit. */
21
+ export declare function summarize(usage: AppUsage): string[][];
@@ -0,0 +1,123 @@
1
+ import { Flags } from "@oclif/core";
2
+ import { BaseCommand, appTargetArg } from "../../base/command.js";
3
+ import { withSpinner } from "../../ui/spinner.js";
4
+ import { dim } from "../../ui/glyphs.js";
5
+ import { renderTable } from "../../ui/table.js";
6
+ import { parseTimeframe } from "../../apps-support/time.js";
7
+ const RANGES = ["15m", "1h", "6h", "24h", "72h", "168h"];
8
+ /** `synteq app metrics` — CPU / memory / network usage against the plan
9
+ * envelope, live plus the window's series. Backend: GET /apps/{id}/usage. */
10
+ export default class AppMetrics extends BaseCommand {
11
+ static apiKeyScope = "none";
12
+ static description = [
13
+ "Show an app's resource usage: live CPU, memory and network against its plan, plus the window's peak and average.",
14
+ "",
15
+ "`--range` picks a relative window; `--from` / `--until` (ISO instants or ages",
16
+ "like 2h / 3d, given together) pick an explicit one. `-o json` returns the",
17
+ "raw series for plotting.",
18
+ ].join("\n");
19
+ static examples = [
20
+ "<%= config.bin %> app metrics # bare: linked app, last hour",
21
+ "<%= config.bin %> app metrics --app my-api --range 24h",
22
+ "<%= config.bin %> app metrics --app my-api --from 2026-09-12T00:00:00Z --until 2026-09-12T12:00:00Z",
23
+ "<%= config.bin %> app metrics --app my-api --range 6h -o json",
24
+ ];
25
+ static args = { ...appTargetArg };
26
+ static flags = {
27
+ app: Flags.string({ description: "App slug (or uuid) (default: the directory's linked app)." }),
28
+ range: Flags.string({
29
+ options: RANGES,
30
+ default: "1h",
31
+ description: `Relative window (one of ${RANGES.join(", ")}; default 1h). Ignored when --from is given.`,
32
+ }),
33
+ from: Flags.string({ description: "Start of an explicit window (ISO-8601 or an age like 6h). Requires --until." }),
34
+ until: Flags.string({ description: "End of the explicit window (ISO-8601 or an age like 1h). Requires --from." }),
35
+ };
36
+ async run() {
37
+ await this.initClients();
38
+ const { args, flags } = await this.parse(AppMetrics);
39
+ try {
40
+ if ((flags.from === undefined) !== (flags.until === undefined)) {
41
+ this.error("--from and --until must be given together.", { exit: 1 });
42
+ }
43
+ let timeframe;
44
+ try {
45
+ timeframe = parseTimeframe(flags.from, flags.until);
46
+ }
47
+ catch (e) {
48
+ this.error(e instanceof Error ? e.message : String(e), { exit: 1 });
49
+ }
50
+ const app = await this.resolveLinkedApp(flags, args.target);
51
+ const usage = await withSpinner("Fetching usage", () => this.clients.api.apps.usage(app.id, {
52
+ range: flags.range,
53
+ since: timeframe.from,
54
+ until: timeframe.until,
55
+ }));
56
+ this.emit(usage, () => {
57
+ const rows = summarize(usage);
58
+ if (rows.length === 0) {
59
+ this.log(dim(`No usage recorded for ${app.slug} in this window.`));
60
+ return;
61
+ }
62
+ this.log(renderTable(["Axis", "Now", "Peak", "Average", "Plan"], rows));
63
+ const env = usage.envelope;
64
+ if (env?.bandwidthGbMonth != null || env?.bandwidthUsedGb != null) {
65
+ const used = env.bandwidthUsedGb ?? 0;
66
+ const cap = env.bandwidthGbMonth;
67
+ this.log(dim(`Bandwidth this period: ${used.toFixed(2)} GB${cap != null ? ` of ${cap} GB` : " (unmetered)"}`));
68
+ }
69
+ this.log(dim(usage.current ? "Now = live from the orchestrator." : "Now = latest snapshot (orchestrator unreachable)."));
70
+ });
71
+ }
72
+ catch (err) {
73
+ this.fail(err);
74
+ }
75
+ }
76
+ }
77
+ /** Table rows: one per axis with a value, formatted in that axis's unit. */
78
+ export function summarize(usage) {
79
+ const env = usage.envelope;
80
+ const axes = [
81
+ { key: "cpu", label: "CPU", fmt: (v) => `${(v / 1000).toFixed(2)} cores`, plan: env ? `${(env.cpuMillicores / 1000).toFixed(2)} cores` : undefined },
82
+ { key: "memory", label: "Memory", fmt: (v) => `${Math.round(v / (1024 * 1024))} MB`, plan: env ? `${env.memoryMib} MB` : undefined },
83
+ { key: "networkRx", label: "Net in", fmt: (v) => `${fmtRate(v)}` },
84
+ { key: "networkTx", label: "Net out", fmt: (v) => `${fmtRate(v)}` },
85
+ ];
86
+ const out = [];
87
+ for (const axis of axes) {
88
+ const live = usage.current?.[axis.key];
89
+ const points = collectPoints(usage, axis.key, live);
90
+ if (!live && points.length === 0)
91
+ continue;
92
+ const peak = points.length ? Math.max(...points) : null;
93
+ const avg = points.length ? points.reduce((a, b) => a + b, 0) / points.length : null;
94
+ out.push([
95
+ axis.label,
96
+ live ? axis.fmt(live.current) : "—",
97
+ peak !== null ? axis.fmt(peak) : "—",
98
+ avg !== null ? axis.fmt(avg) : "—",
99
+ axis.plan ?? "—",
100
+ ]);
101
+ }
102
+ return out;
103
+ }
104
+ function collectPoints(usage, key, live) {
105
+ const fromLive = live?.series?.map((p) => p.value) ?? [];
106
+ if (fromLive.length)
107
+ return fromLive;
108
+ const fromSnapshots = [];
109
+ for (const s of usage.series ?? []) {
110
+ const axis = s.payload?.[key];
111
+ if (axis && typeof axis.current === "number")
112
+ fromSnapshots.push(axis.current);
113
+ }
114
+ return fromSnapshots;
115
+ }
116
+ function fmtRate(bytesPerSec) {
117
+ if (bytesPerSec < 1024)
118
+ return `${bytesPerSec.toFixed(0)} B/s`;
119
+ if (bytesPerSec < 1024 * 1024)
120
+ return `${(bytesPerSec / 1024).toFixed(1)} KB/s`;
121
+ return `${(bytesPerSec / (1024 * 1024)).toFixed(2)} MB/s`;
122
+ }
123
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../../src/commands/app/metrics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { BaseCommand } from "../../../base/command.js";
2
+ /** `synteq app plan change <tier>` — move an app to another plan (previews the
3
+ * proration first, then confirms). */
4
+ export default class PlanChange extends BaseCommand {
5
+ static apiKeyScope: string;
6
+ static description: string;
7
+ static examples: string[];
8
+ static args: {
9
+ target: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
10
+ tier: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
11
+ };
12
+ static flags: {
13
+ app: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
+ at: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
15
+ yes: import("@oclif/core/interfaces").BooleanFlag<boolean>;
16
+ };
17
+ run(): Promise<void>;
18
+ }
@@ -0,0 +1,79 @@
1
+ import { Args, Flags } from "@oclif/core";
2
+ import { BaseCommand } from "../../../base/command.js";
3
+ import { withSpinner } from "../../../ui/spinner.js";
4
+ import { panel, isInteractive, confirmAction } from "../../../ui/wizard.js";
5
+ import { ok, dim, yellow } from "../../../ui/glyphs.js";
6
+ /** `synteq app plan change <tier>` — move an app to another plan (previews the
7
+ * proration first, then confirms). */
8
+ export default class PlanChange extends BaseCommand {
9
+ static apiKeyScope = "none";
10
+ static description = "Change an app's plan; previews the prorated charge and downgrade warnings before applying.";
11
+ static examples = [
12
+ "<%= config.bin %> app plan change pro # upgrade linked app",
13
+ "<%= config.bin %> app plan change hobby --app my-api --at cycle_end",
14
+ "<%= config.bin %> app plan change pro --app my-api --yes -o json",
15
+ ];
16
+ static args = {
17
+ target: Args.string({ required: false, description: "App slug or id (optional; default: the directory's linked app or --app)." }),
18
+ tier: Args.string({ required: false, description: "Target plan tier (free | hobby | starter | pro)." }),
19
+ };
20
+ static flags = {
21
+ app: Flags.string({ description: "App slug (or uuid) (default: the directory's linked app)." }),
22
+ at: Flags.string({
23
+ options: ["now", "cycle_end"],
24
+ default: "now",
25
+ description: "When to apply the change (now: prorated immediately; cycle_end: at the next renewal). Default now.",
26
+ }),
27
+ yes: Flags.boolean({ char: "y", description: "Skip the confirmation prompt." }),
28
+ };
29
+ async run() {
30
+ await this.initClients();
31
+ const { args, flags } = await this.parse(PlanChange);
32
+ const [target, tier] = this.positional(args.target, args.tier, "tier");
33
+ try {
34
+ const app = await this.resolveLinkedApp(flags, target);
35
+ const preview = await withSpinner("Previewing change", () => this.clients.api.apps.planPreview(app.id, tier, flags.at));
36
+ const interactive = isInteractive() && this.outputFormat === "table";
37
+ if (interactive || !flags.yes) {
38
+ this.log(panel(`Change ${app.slug} → ${tier}`, [
39
+ ["Action", preview.action],
40
+ ["Prorated now", `$${preview.proratedCharge}`],
41
+ ["Tax", `$${preview.tax}`],
42
+ ["New monthly", `$${preview.newMonthly}`],
43
+ ]));
44
+ if (preview.belowUsage) {
45
+ this.log(yellow(`\n⚠ This plan is below recent p95 usage` +
46
+ `${preview.p95Cpu != null ? ` (cpu ${preview.p95Cpu})` : ""}` +
47
+ `${preview.p95Mem != null ? ` (mem ${preview.p95Mem})` : ""}` +
48
+ ` — the app may be throttled or restarted.`));
49
+ }
50
+ }
51
+ if (!flags.yes) {
52
+ if (!interactive) {
53
+ this.error("Refusing to change plan without --yes in non-interactive mode.", { exit: 1 });
54
+ }
55
+ const go = await confirmAction(`Apply this plan change?`, false);
56
+ if (!go) {
57
+ this.log("Aborted.");
58
+ return;
59
+ }
60
+ }
61
+ const result = await withSpinner("Changing plan", () => this.clients.api.apps.changePlan(app.id, { planTier: tier, schedule: flags.at }));
62
+ this.emit(result, () => {
63
+ if (result.pendingPlanTier) {
64
+ this.log(ok(`Scheduled: ${app.slug} → ${result.pendingPlanTier} at ${result.pendingPlanTierAt ?? "next renewal"}.`));
65
+ }
66
+ else {
67
+ this.log(ok(`${app.slug} is now on ${result.planTier} ($${result.newMonthly}/mo).`));
68
+ if (result.proratedCharge && result.proratedCharge !== "0.00") {
69
+ this.log(dim(`Charged $${result.proratedCharge} (+ $${result.tax} tax) prorated now.`));
70
+ }
71
+ }
72
+ });
73
+ }
74
+ catch (err) {
75
+ this.fail(err);
76
+ }
77
+ }
78
+ }
79
+ //# sourceMappingURL=change.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change.js","sourceRoot":"","sources":["../../../../src/commands/app/plan/change.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { BaseCommand } from "../../../base/command.js";
2
+ /** `synteq app plan show` — the app's current plan + the plans it can move to. */
3
+ export default class PlanShow extends BaseCommand {
4
+ static apiKeyScope: string;
5
+ static description: string;
6
+ static examples: string[];
7
+ static args: {
8
+ target: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
9
+ };
10
+ static flags: {
11
+ app: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ };
13
+ run(): Promise<void>;
14
+ }
@@ -0,0 +1,40 @@
1
+ import { Flags } from "@oclif/core";
2
+ import { BaseCommand, appTargetArg } from "../../../base/command.js";
3
+ import { withSpinner } from "../../../ui/spinner.js";
4
+ import { panel } from "../../../ui/wizard.js";
5
+ import { dim } from "../../../ui/glyphs.js";
6
+ /** `synteq app plan show` — the app's current plan + the plans it can move to. */
7
+ export default class PlanShow extends BaseCommand {
8
+ static apiKeyScope = "none";
9
+ static description = "Show an app's current plan and the plans available to switch to.";
10
+ static examples = [
11
+ "<%= config.bin %> app plan show # bare: linked app",
12
+ "<%= config.bin %> app plan show --app my-api -o json",
13
+ ];
14
+ static args = { ...appTargetArg };
15
+ static flags = {
16
+ app: Flags.string({ description: "App slug (or uuid) (default: the directory's linked app)." }),
17
+ };
18
+ async run() {
19
+ await this.initClients();
20
+ const { args, flags } = await this.parse(PlanShow);
21
+ try {
22
+ const app = await this.resolveLinkedApp(flags, args.target);
23
+ const [detail, plans] = await withSpinner("Loading plan", () => Promise.all([this.clients.api.apps.get(app.id), this.clients.api.apps.plans()]));
24
+ this.emit({ current: detail.planTier, plans }, () => {
25
+ this.log(panel(app.slug, [["Current plan", detail.planTier ?? dim("—")]]));
26
+ this.log(dim("\nAvailable plans:"));
27
+ for (const p of plans) {
28
+ const mark = p.name === detail.planTier ? "•" : " ";
29
+ const price = p.isFree ? "free" : `$${p.monthlyAnchorUsd ?? "?"}/mo`;
30
+ this.log(` ${mark} ${p.name.padEnd(10)} ${(p.displayName ?? "").padEnd(18)} ${dim(price)}`);
31
+ }
32
+ this.log(dim("\nChange with: synteq app plan change <tier> --app " + app.slug));
33
+ });
34
+ }
35
+ catch (err) {
36
+ this.fail(err);
37
+ }
38
+ }
39
+ }
40
+ //# sourceMappingURL=show.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show.js","sourceRoot":"","sources":["../../../../src/commands/app/plan/show.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAE5C,kFAAkF;AAClF,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,WAAW;IAC/C,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC;IAC5B,MAAM,CAAC,WAAW,GAAG,kEAAkE,CAAC;IACxF,MAAM,CAAC,QAAQ,GAAG;QAChB,mEAAmE;QACnE,sDAAsD;KACvD,CAAC;IACF,MAAM,CAAC,IAAI,GAAG,EAAE,GAAG,YAAY,EAAE,CAAC;IAClC,MAAM,CAAC,KAAK,GAAG;QACb,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,2DAA2D,EAAE,CAAC;KAChG,CAAC;IACF,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACnD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC5D,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,WAAW,CAAC,cAAc,EAAE,GAAG,EAAE,CAC7D,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAChF,CAAC;YACF,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE;gBAClD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,cAAc,EAAE,MAAM,CAAC,QAAQ,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3E,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC;gBACpC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;oBACtB,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;oBACpD,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,gBAAgB,IAAI,GAAG,KAAK,CAAC;oBACrE,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAC/F,CAAC;gBACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,qDAAqD,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YAClF,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjB,CAAC;IACH,CAAC"}