@synteq/cli 0.2.0 → 1.1.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 (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 +16 -0
  118. package/dist/commands/apps/list.js +54 -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 +608 -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 +47 -0
  220. package/dist/commands/function/init.js +269 -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 +77 -0
  256. package/dist/commands/link.js +530 -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,751 @@
1
+ import React, { useCallback, useEffect, useState } from "react";
2
+ import { Box, Text, useInput } from "ink";
3
+ import { Spinner } from "../../components/Spinner.js";
4
+ import { InputBar } from "../../components/InputBar.js";
5
+ import { ConfirmModal } from "../../components/ConfirmModal.js";
6
+ import { useApi } from "../../hooks/useApi.js";
7
+ import { colors, statusColor } from "../../theme/colors.js";
8
+ import { glyphs } from "../../theme/glyphs.js";
9
+ import { fmtClock, fmtWhen } from "../../../apps-support/time.js";
10
+ const TABS = [
11
+ { key: "overview", label: "Overview", hotkey: "1" },
12
+ { key: "deployments", label: "Deployments", hotkey: "2" },
13
+ { key: "env", label: "Env", hotkey: "3" },
14
+ { key: "settings", label: "Settings", hotkey: "4" },
15
+ { key: "logs", label: "Logs", hotkey: "5" },
16
+ { key: "cron", label: "Cron", hotkey: "6" },
17
+ ];
18
+ export function FunctionDetailView({ fn: initial, onClose, onLock, }) {
19
+ const [tab, setTab] = useState("overview");
20
+ const [fn, setFn] = useState(initial);
21
+ const [busy, setBusy] = useState(false);
22
+ useEffect(() => {
23
+ onLock(true);
24
+ return () => onLock(false);
25
+ }, [onLock]);
26
+ useInput((input, key) => {
27
+ if (busy)
28
+ return;
29
+ if (key.escape) {
30
+ onClose();
31
+ return;
32
+ }
33
+ const hit = TABS.find((t) => t.hotkey === input);
34
+ if (hit) {
35
+ setTab(hit.key);
36
+ return;
37
+ }
38
+ if (input === "]" || key.rightArrow) {
39
+ setTab((t) => TABS[(TABS.findIndex((x) => x.key === t) + 1) % TABS.length].key);
40
+ }
41
+ else if (input === "[" || key.leftArrow) {
42
+ setTab((t) => TABS[(TABS.findIndex((x) => x.key === t) - 1 + TABS.length) % TABS.length].key);
43
+ }
44
+ }, { isActive: true });
45
+ return (React.createElement(Box, { flexDirection: "column", width: "100%" },
46
+ React.createElement(Box, { marginBottom: 1 }, TABS.map((t, i) => (React.createElement(Box, { key: t.key, marginRight: i === TABS.length - 1 ? 0 : 2 },
47
+ React.createElement(Text, { color: t.key === tab ? colors.accent : colors.dim, bold: t.key === tab },
48
+ t.hotkey,
49
+ " ",
50
+ t.label))))),
51
+ tab === "overview" && React.createElement(OverviewTab, { fn: fn, onFn: setFn }),
52
+ tab === "deployments" && React.createElement(DeploymentsTab, { fn: fn, onBusy: setBusy }),
53
+ tab === "env" && React.createElement(EnvTab, { fn: fn, onBusy: setBusy }),
54
+ tab === "settings" && React.createElement(SettingsTab, { fn: fn, onFn: setFn, onBusy: setBusy }),
55
+ tab === "logs" && React.createElement(LogsTab, { fn: fn, onBusy: setBusy }),
56
+ tab === "cron" && React.createElement(CronTab, { fn: fn, onBusy: setBusy })));
57
+ }
58
+ // ─── Overview ────────────────────────────────────────────────────────────────
59
+ function OverviewTab({ fn, onFn }) {
60
+ const api = useApi();
61
+ const [tick, setTick] = useState(0);
62
+ useEffect(() => {
63
+ let cancelled = false;
64
+ api.functions.get(fn.id).then((f) => !cancelled && onFn(f)).catch(() => { });
65
+ return () => {
66
+ cancelled = true;
67
+ };
68
+ // eslint-disable-next-line react-hooks/exhaustive-deps
69
+ }, [api, fn.id, tick]);
70
+ useInput((input) => {
71
+ if (input === "r")
72
+ setTick((t) => t + 1);
73
+ });
74
+ return (React.createElement(Box, { flexDirection: "column" },
75
+ React.createElement(DetailRow, { label: "Id", value: fn.id }),
76
+ React.createElement(DetailRow, { label: "Status", value: React.createElement(Text, { color: statusColor(fn.status) ?? colors.text }, fn.status) }),
77
+ React.createElement(DetailRow, { label: "URL", value: `https://${fn.hostname}` }),
78
+ React.createElement(DetailRow, { label: "Plan", value: fn.planTier }),
79
+ React.createElement(DetailRow, { label: "Region", value: fn.region }),
80
+ React.createElement(DetailRow, { label: "Runtime", value: `${fn.runtime} · ${fn.memoryMib} MiB` }),
81
+ React.createElement(DetailRow, { label: "Concurrency", value: `${fn.concurrency} · timeout ${fn.timeoutSeconds}s` }),
82
+ React.createElement(DetailRow, { label: "Instances", value: `${fn.minInstances}–${fn.maxInstances}` }),
83
+ React.createElement(DetailRow, { label: "Release", value: fn.currentReleaseNumber != null ? `#${fn.currentReleaseNumber}${fn.currentReleaseDeployedAt ? ` · ${fmtWhen(fn.currentReleaseDeployedAt)}` : ""}` : "none yet" }),
84
+ fn.healthStatus ? React.createElement(DetailRow, { label: "Health", value: React.createElement(Text, { color: statusColor(fn.healthStatus) ?? colors.text }, fn.healthStatus) }) : null,
85
+ React.createElement(DetailRow, { label: "Budget", value: `${fn.budgetState}${fn.monthlyBudgetUsd != null ? ` · $${fn.monthlyBudgetUsd}/mo` : ""}` }),
86
+ fn.pausedReason ? React.createElement(DetailRow, { label: "Paused", value: React.createElement(Text, { color: colors.warning }, fn.pausedReason) }) : null,
87
+ React.createElement(DetailRow, { label: "Created", value: fmtWhen(fn.createdAt) }),
88
+ React.createElement(Box, { marginTop: 1 },
89
+ React.createElement(Text, { color: colors.dim }, "r refresh \u00B7 1-6 or [ ] switch tabs \u00B7 Esc back"))));
90
+ }
91
+ // ─── Deployments ─────────────────────────────────────────────────────────────
92
+ function DeploymentsTab({ fn, onBusy }) {
93
+ const api = useApi();
94
+ const [releases, setReleases] = useState(null);
95
+ const [error, setError] = useState(null);
96
+ const [cursor, setCursor] = useState(0);
97
+ const [open, setOpen] = useState(null);
98
+ const [confirm, setConfirm] = useState(null);
99
+ const [notice, setNotice] = useState(null);
100
+ const [tick, setTick] = useState(0);
101
+ useEffect(() => {
102
+ onBusy(confirm !== null);
103
+ }, [confirm, onBusy]);
104
+ useEffect(() => {
105
+ let cancelled = false;
106
+ api.functions
107
+ .releases(fn.id)
108
+ .then((rs) => {
109
+ if (cancelled)
110
+ return;
111
+ setReleases([...rs].sort((a, b) => b.number - a.number));
112
+ setError(null);
113
+ })
114
+ .catch((e) => !cancelled && setError(e instanceof Error ? e.message : String(e)));
115
+ return () => {
116
+ cancelled = true;
117
+ };
118
+ }, [api, fn.id, tick]);
119
+ const rows = releases ?? [];
120
+ const selected = rows[cursor];
121
+ useInput((input, key) => {
122
+ if (confirm)
123
+ return;
124
+ if (open) {
125
+ if (key.escape || key.leftArrow)
126
+ setOpen(null);
127
+ else if (input === "b" && !open.isCurrent)
128
+ setConfirm(open);
129
+ return;
130
+ }
131
+ if (key.upArrow || input === "k")
132
+ setCursor((c) => Math.max(0, c - 1));
133
+ else if (key.downArrow || input === "j")
134
+ setCursor((c) => Math.min(rows.length - 1, c + 1));
135
+ else if (key.return && selected)
136
+ setOpen(selected);
137
+ else if (input === "b" && selected && !selected.isCurrent)
138
+ setConfirm(selected);
139
+ else if (input === "r")
140
+ setTick((t) => t + 1);
141
+ }, { isActive: true });
142
+ const rollback = useCallback(async (r) => {
143
+ setNotice({ text: `Rolling back to #${r.number}…`, color: colors.warning });
144
+ try {
145
+ const out = await api.functions.rollback(fn.id, r.number);
146
+ setNotice({ text: `Rollback started — release #${out.release} re-deploys #${out.rolledBackTo}'s bundle.`, color: colors.success });
147
+ setOpen(null);
148
+ setTick((t) => t + 1);
149
+ }
150
+ catch (e) {
151
+ setNotice({ text: e instanceof Error ? e.message : String(e), color: colors.error });
152
+ }
153
+ }, [api, fn.id]);
154
+ if (confirm) {
155
+ return (React.createElement(ConfirmModal, { title: `Roll ${fn.slug} back to release #${confirm.number}?`, hint: "Re-deploys that release's bundle as a new release. The current release stays in history.", onConfirm: () => {
156
+ const r = confirm;
157
+ setConfirm(null);
158
+ void rollback(r);
159
+ }, onCancel: () => setConfirm(null) }));
160
+ }
161
+ if (open) {
162
+ return (React.createElement(Box, { flexDirection: "column" },
163
+ React.createElement(DetailRow, { label: "Release", value: `#${open.number}${open.isCurrent ? " (current)" : ""}` }),
164
+ React.createElement(DetailRow, { label: "Status", value: React.createElement(Text, { color: statusColor(open.status) ?? colors.text }, open.status) }),
165
+ React.createElement(DetailRow, { label: "Deployed", value: fmtWhen(open.deployedAt) }),
166
+ React.createElement(DetailRow, { label: "Image", value: open.imageDigest.slice(0, 24) }),
167
+ open.bundleDigest ? React.createElement(DetailRow, { label: "Bundle", value: open.bundleDigest.slice(0, 24) }) : null,
168
+ open.commitSha ? React.createElement(DetailRow, { label: "Commit", value: `${open.commitSha.slice(0, 7)}${open.commitMessage ? ` ${open.commitMessage}` : ""}` }) : null,
169
+ !open.buildId ? (React.createElement(Box, { marginTop: 1 },
170
+ React.createElement(Text, { color: colors.dim }, "No source build (image deploy or rollback)."))) : null,
171
+ notice ? (React.createElement(Box, { marginTop: 1 },
172
+ React.createElement(Text, { color: notice.color }, notice.text))) : null,
173
+ React.createElement(Box, { marginTop: 1 },
174
+ React.createElement(Text, { color: colors.dim }, open.isCurrent ? "Esc back" : "b roll back to this release · Esc back"))));
175
+ }
176
+ return (React.createElement(Box, { flexDirection: "column" },
177
+ releases === null ? (React.createElement(Spinner, { label: "Loading deployments\u2026" })) : error ? (React.createElement(Text, { color: colors.error },
178
+ "Error: ",
179
+ error)) : rows.length === 0 ? (React.createElement(Text, { color: colors.dim }, "No deployments yet \u2014 `synteq function deploy` from the function's directory.")) : (rows.slice(0, Math.max(5, (process.stdout.rows ?? 24) - 14)).map((r, i) => {
180
+ const focused = i === cursor;
181
+ return (React.createElement(Box, { key: r.id },
182
+ React.createElement(Text, { color: focused ? colors.accent : colors.dim }, focused ? `${glyphs.chevronRight} ` : " "),
183
+ React.createElement(Box, { width: 7 },
184
+ React.createElement(Text, { color: focused ? colors.accent : colors.text, bold: focused }, `#${r.number}`)),
185
+ React.createElement(Box, { width: 16 },
186
+ React.createElement(Text, { color: statusColor(r.status) ?? colors.dim }, r.status)),
187
+ React.createElement(Box, { width: 14 },
188
+ React.createElement(Text, { color: colors.dim }, fmtWhen(r.deployedAt))),
189
+ React.createElement(Text, { color: colors.dim, wrap: "truncate-end" },
190
+ r.isCurrent ? "current " : "",
191
+ r.commitSha ? `${r.commitSha.slice(0, 7)} ` : "",
192
+ r.commitMessage ?? "")));
193
+ })),
194
+ notice ? (React.createElement(Box, { marginTop: 1 },
195
+ React.createElement(Text, { color: notice.color }, notice.text))) : null,
196
+ React.createElement(Box, { marginTop: 1 },
197
+ React.createElement(Text, { color: colors.dim }, "\u2191\u2193 select \u00B7 Enter details \u00B7 b roll back to selected \u00B7 r refresh"))));
198
+ }
199
+ // ─── Env ─────────────────────────────────────────────────────────────────────
200
+ function EnvTab({ fn, onBusy }) {
201
+ const api = useApi();
202
+ const [vars, setVars] = useState(null);
203
+ const [error, setError] = useState(null);
204
+ const [cursor, setCursor] = useState(0);
205
+ const [editing, setEditing] = useState(null);
206
+ const [draft, setDraft] = useState("");
207
+ const [promptError, setPromptError] = useState(null);
208
+ const [revealed, setRevealed] = useState({});
209
+ const [confirmDelete, setConfirmDelete] = useState(null);
210
+ const [notice, setNotice] = useState(null);
211
+ const [tick, setTick] = useState(0);
212
+ useEffect(() => {
213
+ onBusy(editing !== null || confirmDelete !== null);
214
+ }, [editing, confirmDelete, onBusy]);
215
+ useEffect(() => {
216
+ let cancelled = false;
217
+ api.functions
218
+ .env(fn.id)
219
+ .then((vs) => {
220
+ if (cancelled)
221
+ return;
222
+ setVars([...vs].sort((a, b) => a.key.localeCompare(b.key)));
223
+ setError(null);
224
+ })
225
+ .catch((e) => !cancelled && setError(e instanceof Error ? e.message : String(e)));
226
+ return () => {
227
+ cancelled = true;
228
+ };
229
+ }, [api, fn.id, tick]);
230
+ const rows = vars ?? [];
231
+ const selected = rows[cursor];
232
+ useInput((input, key) => {
233
+ if (editing || confirmDelete)
234
+ return;
235
+ if (key.upArrow || input === "k")
236
+ setCursor((c) => Math.max(0, c - 1));
237
+ else if (key.downArrow || input === "j")
238
+ setCursor((c) => Math.min(rows.length - 1, c + 1));
239
+ else if (input === "a") {
240
+ setDraft("");
241
+ setPromptError(null);
242
+ setEditing("add");
243
+ }
244
+ else if ((input === "e" || key.return) && selected) {
245
+ setDraft("");
246
+ setPromptError(null);
247
+ setEditing("edit");
248
+ }
249
+ else if (input === "v" && selected) {
250
+ void reveal(selected);
251
+ }
252
+ else if (input === "x" && selected)
253
+ setConfirmDelete(selected);
254
+ else if (input === "r")
255
+ setTick((t) => t + 1);
256
+ }, { isActive: true });
257
+ const reveal = async (v) => {
258
+ if (revealed[v.key] !== undefined) {
259
+ setRevealed((r) => {
260
+ const next = { ...r };
261
+ delete next[v.key];
262
+ return next;
263
+ });
264
+ return;
265
+ }
266
+ try {
267
+ // A secret arrives already masked (last 4 only); config in full.
268
+ const out = await api.functions.revealEnv(fn.id, v.key);
269
+ setRevealed((r) => ({ ...r, [v.key]: out.value }));
270
+ }
271
+ catch (e) {
272
+ setNotice({ text: e instanceof Error ? e.message : String(e), color: colors.error });
273
+ }
274
+ };
275
+ const submit = async (raw) => {
276
+ let key;
277
+ let value;
278
+ if (editing === "add") {
279
+ const eq = raw.indexOf("=");
280
+ if (eq <= 0) {
281
+ setPromptError("Type KEY=VALUE.");
282
+ return;
283
+ }
284
+ key = raw.slice(0, eq).trim();
285
+ value = raw.slice(eq + 1);
286
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) {
287
+ setPromptError("Keys are letters, digits and underscores, not starting with a digit.");
288
+ return;
289
+ }
290
+ }
291
+ else {
292
+ if (!selected)
293
+ return;
294
+ key = selected.key;
295
+ value = raw;
296
+ }
297
+ setEditing(null);
298
+ setNotice({ text: `Saving ${key}…`, color: colors.warning });
299
+ try {
300
+ await api.functions.setEnv(fn.id, {
301
+ key,
302
+ value,
303
+ scope: editing === "edit" ? selected?.scope : undefined,
304
+ kind: editing === "edit" ? selected?.kind : undefined,
305
+ });
306
+ setNotice({ text: `Saved ${key}. The next release picks it up.`, color: colors.success });
307
+ setRevealed((r) => {
308
+ const next = { ...r };
309
+ delete next[key];
310
+ return next;
311
+ });
312
+ setTick((t) => t + 1);
313
+ }
314
+ catch (e) {
315
+ setNotice({ text: e instanceof Error ? e.message : String(e), color: colors.error });
316
+ }
317
+ };
318
+ const remove = async (v) => {
319
+ setNotice({ text: `Removing ${v.key}…`, color: colors.warning });
320
+ try {
321
+ await api.functions.deleteEnv(fn.id, v.key);
322
+ setNotice({ text: `Removed ${v.key}.`, color: colors.success });
323
+ setCursor((c) => Math.max(0, c - 1));
324
+ setTick((t) => t + 1);
325
+ }
326
+ catch (e) {
327
+ setNotice({ text: e instanceof Error ? e.message : String(e), color: colors.error });
328
+ }
329
+ };
330
+ if (confirmDelete) {
331
+ return (React.createElement(ConfirmModal, { title: `Remove ${confirmDelete.key} from ${fn.slug}?`, hint: "The value is gone for good; the next release no longer sees it.", onConfirm: () => {
332
+ const v = confirmDelete;
333
+ setConfirmDelete(null);
334
+ void remove(v);
335
+ }, onCancel: () => setConfirmDelete(null) }));
336
+ }
337
+ return (React.createElement(Box, { flexDirection: "column" },
338
+ vars === null ? (React.createElement(Spinner, { label: "Loading env\u2026" })) : error ? (React.createElement(Text, { color: colors.error },
339
+ "Error: ",
340
+ error)) : rows.length === 0 ? (React.createElement(Text, { color: colors.dim }, "No environment variables. Press a to add one.")) : (rows.map((v, i) => {
341
+ const focused = i === cursor;
342
+ const shown = revealed[v.key];
343
+ return (React.createElement(Box, { key: v.id },
344
+ React.createElement(Text, { color: focused ? colors.accent : colors.dim }, focused ? `${glyphs.chevronRight} ` : " "),
345
+ React.createElement(Box, { width: 28 },
346
+ React.createElement(Text, { color: focused ? colors.accent : colors.text, bold: focused, wrap: "truncate-end" }, v.key)),
347
+ React.createElement(Box, { width: 9 },
348
+ React.createElement(Text, { color: colors.dim }, v.scope)),
349
+ React.createElement(Box, { width: 8 },
350
+ React.createElement(Text, { color: colors.dim }, v.kind ?? "secret")),
351
+ React.createElement(Text, { color: colors.dim }, shown !== undefined ? `= ${shown}` : "••••••"),
352
+ React.createElement(Text, { color: colors.dim }, ` ${fmtWhen(v.updatedAt)}`)));
353
+ })),
354
+ notice ? (React.createElement(Box, { marginTop: 1 },
355
+ React.createElement(Text, { color: notice.color }, notice.text))) : null,
356
+ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, editing ? (React.createElement(Box, { flexDirection: "column" },
357
+ React.createElement(Text, { color: colors.dim }, editing === "add"
358
+ ? "New variable as KEY=VALUE (stored as a secret; set kind config with `synteq function env set`)."
359
+ : `New value for ${selected?.key}.`),
360
+ promptError ? React.createElement(Text, { color: colors.error }, promptError) : null,
361
+ React.createElement(InputBar, { value: draft, onChange: setDraft, onSubmit: (v) => void submit(v), focused: true, placeholder: editing === "add" ? "API_KEY=sk-…" : "" }),
362
+ React.createElement(Text, { color: colors.dim }, "Enter to save \u00B7 Esc to cancel"))) : (React.createElement(Text, { color: colors.dim }, "a add \u00B7 e / Enter edit \u00B7 v reveal / hide \u00B7 x remove \u00B7 r refresh"))),
363
+ React.createElement(EscListener, { active: editing !== null, onEscape: () => setEditing(null) })));
364
+ }
365
+ const SETTING_FIELDS = [
366
+ { key: "runtime", label: "Runtime", hint: "node22 or python312; applies from the next deploy.", kind: "choice" },
367
+ { key: "concurrency", label: "Concurrency", hint: "Requests one instance handles at once (1..100).", kind: "int" },
368
+ { key: "timeoutSeconds", label: "Timeout (s)", hint: "Per-invocation wall-clock limit (1..900).", kind: "int" },
369
+ { key: "minInstances", label: "Min instances", hint: "Kept warm (0 = scale to zero; keep-warm is metered).", kind: "int" },
370
+ { key: "maxInstances", label: "Max instances", hint: "Scale-out ceiling for a burst.", kind: "int" },
371
+ { key: "paused", label: "Paused", hint: "A paused function refuses invocations and bills nothing.", kind: "toggle" },
372
+ ];
373
+ const RUNTIMES = ["node22", "python312"];
374
+ function SettingsTab({ fn, onFn, onBusy }) {
375
+ const api = useApi();
376
+ const [cursor, setCursor] = useState(0);
377
+ const [editing, setEditing] = useState(false);
378
+ const [draft, setDraft] = useState("");
379
+ const [promptError, setPromptError] = useState(null);
380
+ const [notice, setNotice] = useState(null);
381
+ useEffect(() => {
382
+ onBusy(editing);
383
+ }, [editing, onBusy]);
384
+ const field = SETTING_FIELDS[cursor];
385
+ const paused = fn.status === "paused";
386
+ const currentText = (key) => {
387
+ if (key === "paused")
388
+ return paused ? "yes" : "no";
389
+ const v = fn[key];
390
+ return v == null ? "" : String(v);
391
+ };
392
+ const save = useCallback(async (patch, label) => {
393
+ setNotice({ text: `Saving ${label}…`, color: colors.warning });
394
+ try {
395
+ const f = await api.functions.update(fn.id, patch);
396
+ onFn(f);
397
+ setNotice({ text: `Saved ${label}.`, color: colors.success });
398
+ }
399
+ catch (e) {
400
+ setNotice({ text: e instanceof Error ? e.message : String(e), color: colors.error });
401
+ }
402
+ }, [api, fn.id, onFn]);
403
+ useInput((input, key) => {
404
+ if (editing)
405
+ return;
406
+ if (key.upArrow || input === "k")
407
+ setCursor((c) => Math.max(0, c - 1));
408
+ else if (key.downArrow || input === "j")
409
+ setCursor((c) => Math.min(SETTING_FIELDS.length - 1, c + 1));
410
+ else if (key.return || input === "e") {
411
+ if (field.kind === "toggle") {
412
+ void save({ paused: !paused }, `${field.label} → ${paused ? "no" : "yes"}`);
413
+ return;
414
+ }
415
+ if (field.kind === "choice") {
416
+ const next = RUNTIMES[(RUNTIMES.indexOf(fn.runtime) + 1) % RUNTIMES.length];
417
+ void save({ runtime: next }, `${field.label} → ${next}`);
418
+ return;
419
+ }
420
+ setDraft(currentText(field.key));
421
+ setPromptError(null);
422
+ setEditing(true);
423
+ }
424
+ }, { isActive: true });
425
+ const submit = (raw) => {
426
+ const n = Number(raw.trim());
427
+ if (!Number.isInteger(n) || n < 0) {
428
+ setPromptError("A whole number.");
429
+ return;
430
+ }
431
+ if (field.key === "concurrency" && (n < 1 || n > 100)) {
432
+ setPromptError("Concurrency is 1..100.");
433
+ return;
434
+ }
435
+ if (field.key === "timeoutSeconds" && (n < 1 || n > 900)) {
436
+ setPromptError("Timeout is 1..900 seconds.");
437
+ return;
438
+ }
439
+ if (field.key === "minInstances" && n > fn.maxInstances) {
440
+ setPromptError(`Min instances can't exceed max (${fn.maxInstances}).`);
441
+ return;
442
+ }
443
+ if (field.key === "maxInstances" && n < Math.max(1, fn.minInstances)) {
444
+ setPromptError(`Max instances must be at least ${Math.max(1, fn.minInstances)}.`);
445
+ return;
446
+ }
447
+ setEditing(false);
448
+ void save({ [field.key]: n }, field.label);
449
+ };
450
+ return (React.createElement(Box, { flexDirection: "column" },
451
+ SETTING_FIELDS.map((f, i) => {
452
+ const focused = i === cursor;
453
+ const text = currentText(f.key);
454
+ return (React.createElement(Box, { key: f.key },
455
+ React.createElement(Text, { color: focused ? colors.accent : colors.dim }, focused ? `${glyphs.chevronRight} ` : " "),
456
+ React.createElement(Box, { width: 24 },
457
+ React.createElement(Text, { color: focused ? colors.accent : colors.text, bold: focused }, f.label)),
458
+ React.createElement(Text, { color: text ? colors.text : colors.dim, wrap: "truncate-end" }, text || "—")));
459
+ }),
460
+ React.createElement(Box, { marginTop: 1 },
461
+ React.createElement(Text, { color: colors.dim }, `Plan ${fn.planTier} · ${fn.memoryMib} MiB · budget ${fn.budgetState}${fn.monthlyBudgetUsd != null ? ` ($${fn.monthlyBudgetUsd}/mo)` : ""} — plan and budget change in the portal.`)),
462
+ notice ? (React.createElement(Box, { marginTop: 1 },
463
+ React.createElement(Text, { color: notice.color }, notice.text))) : null,
464
+ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, editing ? (React.createElement(Box, { flexDirection: "column" },
465
+ React.createElement(Text, { color: colors.dim },
466
+ field.label,
467
+ " \u2014 ",
468
+ field.hint),
469
+ promptError ? React.createElement(Text, { color: colors.error }, promptError) : null,
470
+ React.createElement(InputBar, { value: draft, onChange: setDraft, onSubmit: submit, focused: true }),
471
+ React.createElement(Text, { color: colors.dim }, "Enter to save \u00B7 Esc to cancel"))) : (React.createElement(Text, { color: colors.dim },
472
+ field.hint,
473
+ " · ",
474
+ field.kind === "int" ? "Enter / e edits" : "Enter toggles"))),
475
+ React.createElement(EscListener, { active: editing, onEscape: () => setEditing(false) })));
476
+ }
477
+ // ─── Logs (runs) ─────────────────────────────────────────────────────────────
478
+ const FOLLOW_INTERVAL_MS = 3000;
479
+ const STATUSES = ["", "success", "error", "timeout"];
480
+ function LogsTab({ fn, onBusy }) {
481
+ const api = useApi();
482
+ const [runs, setRuns] = useState(null);
483
+ const [error, setError] = useState(null);
484
+ const [cursor, setCursor] = useState(0);
485
+ const [expanded, setExpanded] = useState(false);
486
+ const [follow, setFollow] = useState(false);
487
+ const [statusIdx, setStatusIdx] = useState(0);
488
+ const [search, setSearch] = useState("");
489
+ const [editing, setEditing] = useState(false);
490
+ const [draft, setDraft] = useState("");
491
+ const [tick, setTick] = useState(0);
492
+ useEffect(() => {
493
+ onBusy(editing);
494
+ }, [editing, onBusy]);
495
+ useEffect(() => {
496
+ let cancelled = false;
497
+ const load = () => api.functions
498
+ .runs(fn.id, { limit: 100, status: STATUSES[statusIdx] || undefined, q: search || undefined })
499
+ .then((page) => {
500
+ if (cancelled)
501
+ return;
502
+ setRuns(page.items);
503
+ setError(null);
504
+ })
505
+ .catch((e) => !cancelled && setError(e instanceof Error ? e.message : String(e)));
506
+ void load();
507
+ const id = follow ? setInterval(load, FOLLOW_INTERVAL_MS) : null;
508
+ return () => {
509
+ cancelled = true;
510
+ if (id)
511
+ clearInterval(id);
512
+ };
513
+ }, [api, fn.id, statusIdx, search, follow, tick]);
514
+ const rows = runs ?? [];
515
+ const selected = rows[cursor];
516
+ const height = Math.max(6, (process.stdout.rows ?? 24) - 14);
517
+ useInput((input, key) => {
518
+ if (editing)
519
+ return;
520
+ if (key.upArrow || input === "k")
521
+ setCursor((c) => Math.max(0, c - 1));
522
+ else if (key.downArrow || input === "j")
523
+ setCursor((c) => Math.min(rows.length - 1, c + 1));
524
+ else if (key.return || input === "l")
525
+ setExpanded((v) => !v);
526
+ else if (input === "f")
527
+ setFollow((v) => !v);
528
+ else if (input === "s")
529
+ setStatusIdx((i) => (i + 1) % STATUSES.length);
530
+ else if (input === "/") {
531
+ setDraft(search);
532
+ setEditing(true);
533
+ }
534
+ else if (input === "c") {
535
+ setSearch("");
536
+ setStatusIdx(0);
537
+ }
538
+ else if (input === "r")
539
+ setTick((t) => t + 1);
540
+ }, { isActive: true });
541
+ return (React.createElement(Box, { flexDirection: "column" },
542
+ React.createElement(Box, null,
543
+ React.createElement(Text, { color: colors.dim }, "Runs "),
544
+ React.createElement(Text, { color: colors.text }, follow ? "following" : "newest first"),
545
+ STATUSES[statusIdx] ? (React.createElement(Text, { color: colors.dim },
546
+ " · status ",
547
+ React.createElement(Text, { color: colors.text }, STATUSES[statusIdx]))) : null,
548
+ search ? (React.createElement(Text, { color: colors.dim },
549
+ " · filter ",
550
+ React.createElement(Text, { color: colors.text }, search))) : null,
551
+ React.createElement(Text, { color: colors.dim }, ` · ${rows.length} run${rows.length === 1 ? "" : "s"}`)),
552
+ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, runs === null ? (React.createElement(Spinner, { label: "Loading runs\u2026" })) : error ? (React.createElement(Text, { color: colors.error },
553
+ "Error: ",
554
+ error)) : rows.length === 0 ? (React.createElement(Text, { color: colors.dim }, "No runs yet.")) : (rows.slice(0, height).map((run, i) => {
555
+ const focused = i === cursor;
556
+ return (React.createElement(Box, { key: run.id, flexDirection: "column" },
557
+ React.createElement(Box, null,
558
+ React.createElement(Text, { color: focused ? colors.accent : colors.dim }, focused ? `${glyphs.chevronRight} ` : " "),
559
+ React.createElement(Text, { color: colors.dim }, fmtClock(run.startedAt).padEnd(9)),
560
+ React.createElement(Box, { width: 9 },
561
+ React.createElement(Text, { color: statusColor(run.status) ?? colors.text }, run.status)),
562
+ React.createElement(Box, { width: 6 },
563
+ React.createElement(Text, { color: colors.dim }, run.statusCode != null ? String(run.statusCode) : "")),
564
+ React.createElement(Box, { width: 9 },
565
+ React.createElement(Text, { color: colors.dim }, run.durationMs != null ? `${run.durationMs} ms` : "")),
566
+ React.createElement(Text, { color: colors.dim, wrap: "truncate-end" },
567
+ run.releaseNumber != null ? `#${run.releaseNumber} ` : "",
568
+ run.error ?? "")),
569
+ focused && expanded ? React.createElement(RunOutput, { run: run }) : null));
570
+ }))),
571
+ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, editing ? (React.createElement(Box, { flexDirection: "column" },
572
+ React.createElement(Text, { color: colors.dim }, "Filter \u2014 the server matches it over the run's path and captured output. Empty clears it."),
573
+ React.createElement(InputBar, { value: draft, onChange: setDraft, onSubmit: (v) => {
574
+ setSearch(v.trim());
575
+ setEditing(false);
576
+ }, focused: true, placeholder: "error" }),
577
+ React.createElement(Text, { color: colors.dim }, "Enter to apply \u00B7 Esc to cancel"))) : (React.createElement(Text, { color: colors.dim }, "\u2191\u2193 select \u00B7 Enter / l output \u00B7 f follow on/off \u00B7 s status \u00B7 / filter \u00B7 c clear \u00B7 r refresh"))),
578
+ React.createElement(EscListener, { active: editing, onEscape: () => setEditing(false) })));
579
+ }
580
+ /** A run's captured output and outbound calls, indented under its row —
581
+ * the `function logs --lines` shape. */
582
+ function RunOutput({ run }) {
583
+ const lines = run.logLines;
584
+ return (React.createElement(Box, { flexDirection: "column", paddingLeft: 4 },
585
+ lines === null || lines === undefined ? (React.createElement(Text, { color: colors.dim }, "(no output captured)")) : lines.length === 0 ? (React.createElement(Text, { color: colors.dim }, "(printed nothing)")) : (lines.slice(-40).map((l, i) => (React.createElement(Text, { key: i, color: colors.text, wrap: "truncate-end" }, l)))),
586
+ run.logTruncated ? React.createElement(Text, { color: colors.dim }, "\u2026 output truncated") : null,
587
+ (run.outbound ?? []).map((c, i) => (React.createElement(Text, { key: `o${i}`, color: colors.dim, wrap: "truncate-end" }, `→ ${c.method ?? "GET"} ${c.url} ${c.status != null ? c.status : c.error ?? "…"}${c.durationMs != null ? ` ${c.durationMs} ms` : ""}`))),
588
+ run.outboundTruncated ? React.createElement(Text, { color: colors.dim }, "\u2026 outbound calls truncated") : null));
589
+ }
590
+ // ─── Cron ────────────────────────────────────────────────────────────────────
591
+ const CRON_RE = /^(\S+\s+){4}\S+$/;
592
+ function CronTab({ fn, onBusy }) {
593
+ const api = useApi();
594
+ const [triggers, setTriggers] = useState(null);
595
+ const [error, setError] = useState(null);
596
+ const [cursor, setCursor] = useState(0);
597
+ const [editing, setEditing] = useState(null);
598
+ const [draft, setDraft] = useState("");
599
+ const [promptError, setPromptError] = useState(null);
600
+ const [confirmDelete, setConfirmDelete] = useState(null);
601
+ const [notice, setNotice] = useState(null);
602
+ const [tick, setTick] = useState(0);
603
+ useEffect(() => {
604
+ onBusy(editing !== null || confirmDelete !== null);
605
+ }, [editing, confirmDelete, onBusy]);
606
+ useEffect(() => {
607
+ let cancelled = false;
608
+ api.functions
609
+ .cronTriggers(fn.id)
610
+ .then((ts) => {
611
+ if (cancelled)
612
+ return;
613
+ setTriggers([...ts].sort((a, b) => a.createdAt.localeCompare(b.createdAt)));
614
+ setError(null);
615
+ })
616
+ .catch((e) => !cancelled && setError(e instanceof Error ? e.message : String(e)));
617
+ return () => {
618
+ cancelled = true;
619
+ };
620
+ }, [api, fn.id, tick]);
621
+ const rows = triggers ?? [];
622
+ const selected = rows[cursor];
623
+ const act = useCallback(async (label, work, done) => {
624
+ setNotice({ text: `${label}…`, color: colors.warning });
625
+ try {
626
+ await work();
627
+ setNotice({ text: done, color: colors.success });
628
+ setTick((t) => t + 1);
629
+ }
630
+ catch (e) {
631
+ setNotice({ text: e instanceof Error ? e.message : String(e), color: colors.error });
632
+ }
633
+ }, []);
634
+ useInput((input, key) => {
635
+ if (editing || confirmDelete)
636
+ return;
637
+ if (key.upArrow || input === "k")
638
+ setCursor((c) => Math.max(0, c - 1));
639
+ else if (key.downArrow || input === "j")
640
+ setCursor((c) => Math.min(rows.length - 1, c + 1));
641
+ else if (input === "a") {
642
+ setDraft("");
643
+ setPromptError(null);
644
+ setEditing("add");
645
+ }
646
+ else if ((input === "e" || key.return) && selected) {
647
+ setDraft(selected.schedule);
648
+ setPromptError(null);
649
+ setEditing("schedule");
650
+ }
651
+ else if (input === "d" && selected) {
652
+ setDraft(selected.description ?? "");
653
+ setPromptError(null);
654
+ setEditing("description");
655
+ }
656
+ else if (input === "t" && selected) {
657
+ const t = selected;
658
+ void act(t.enabled ? `Disabling ${t.schedule}` : `Enabling ${t.schedule}`, () => api.functions.updateCronTrigger(fn.id, t.id, { enabled: !t.enabled }), `${t.enabled ? "Disabled" : "Enabled"} ${t.schedule}.`);
659
+ }
660
+ else if (input === "n" && selected) {
661
+ const t = selected;
662
+ void act(`Running ${t.schedule} now`, () => api.functions.runCronTrigger(fn.id, t.id), `Fired ${t.schedule}; the run shows under Logs.`);
663
+ }
664
+ else if (input === "x" && selected)
665
+ setConfirmDelete(selected);
666
+ else if (input === "r")
667
+ setTick((t) => t + 1);
668
+ }, { isActive: true });
669
+ const submit = (raw) => {
670
+ const text = raw.trim();
671
+ if (editing === "description") {
672
+ if (!selected)
673
+ return;
674
+ const t = selected;
675
+ setEditing(null);
676
+ void act(`Saving note`, () => api.functions.updateCronTrigger(fn.id, t.id, { description: text || null }), `Saved note on ${t.schedule}.`);
677
+ return;
678
+ }
679
+ if (!CRON_RE.test(text)) {
680
+ setPromptError("A 5-field cron expression (minute hour day month weekday), UTC.");
681
+ return;
682
+ }
683
+ if (editing === "add") {
684
+ setEditing(null);
685
+ void act(`Adding ${text}`, () => api.functions.createCronTrigger(fn.id, { schedule: text }), `Added ${text} (UTC).`);
686
+ return;
687
+ }
688
+ if (!selected)
689
+ return;
690
+ const t = selected;
691
+ setEditing(null);
692
+ void act(`Rescheduling`, () => api.functions.updateCronTrigger(fn.id, t.id, { schedule: text }), `Rescheduled to ${text}.`);
693
+ };
694
+ if (confirmDelete) {
695
+ return (React.createElement(ConfirmModal, { title: `Remove the ${confirmDelete.schedule} trigger from ${fn.slug}?`, hint: "It stops firing immediately; runs it already made stay in the log.", onConfirm: () => {
696
+ const t = confirmDelete;
697
+ setConfirmDelete(null);
698
+ void act(`Removing ${t.schedule}`, () => api.functions.deleteCronTrigger(fn.id, t.id), `Removed ${t.schedule}.`);
699
+ setCursor((c) => Math.max(0, c - 1));
700
+ }, onCancel: () => setConfirmDelete(null) }));
701
+ }
702
+ return (React.createElement(Box, { flexDirection: "column" },
703
+ triggers === null ? (React.createElement(Spinner, { label: "Loading cron triggers\u2026" })) : error ? (React.createElement(Text, { color: colors.error },
704
+ "Error: ",
705
+ error)) : rows.length === 0 ? (React.createElement(Text, { color: colors.dim }, "No cron triggers. Press a to add one (5-field cron, UTC).")) : (rows.map((t, i) => {
706
+ const focused = i === cursor;
707
+ return (React.createElement(Box, { key: t.id },
708
+ React.createElement(Text, { color: focused ? colors.accent : colors.dim }, focused ? `${glyphs.chevronRight} ` : " "),
709
+ React.createElement(Box, { width: 18 },
710
+ React.createElement(Text, { color: focused ? colors.accent : colors.text, bold: focused }, t.schedule)),
711
+ React.createElement(Box, { width: 10 },
712
+ React.createElement(Text, { color: t.enabled ? colors.success : colors.dim }, t.enabled ? "enabled" : "disabled")),
713
+ React.createElement(Box, { width: 22 },
714
+ React.createElement(Text, { color: colors.dim },
715
+ t.lastRunAt ? `${fmtWhen(t.lastRunAt)}` : "never ran",
716
+ t.lastStatus ? ` ` : "",
717
+ t.lastStatus ? React.createElement(Text, { color: statusColor(t.lastStatus) ?? colors.dim }, t.lastStatus) : null)),
718
+ React.createElement(Text, { color: colors.dim, wrap: "truncate-end" },
719
+ t.retries ? `retries ${t.retries} ` : "",
720
+ t.description ?? "")));
721
+ })),
722
+ notice ? (React.createElement(Box, { marginTop: 1 },
723
+ React.createElement(Text, { color: notice.color }, notice.text))) : null,
724
+ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, editing ? (React.createElement(Box, { flexDirection: "column" },
725
+ React.createElement(Text, { color: colors.dim }, editing === "add"
726
+ ? "New trigger — a 5-field cron expression in UTC (0 9 * * * = 09:00 daily)."
727
+ : editing === "schedule"
728
+ ? `New schedule for ${selected?.schedule} (UTC).`
729
+ : `Note on ${selected?.schedule}. Empty clears it.`),
730
+ promptError ? React.createElement(Text, { color: colors.error }, promptError) : null,
731
+ React.createElement(InputBar, { value: draft, onChange: setDraft, onSubmit: submit, focused: true, placeholder: editing === "description" ? "nightly report" : "*/15 * * * *" }),
732
+ React.createElement(Text, { color: colors.dim }, "Enter to save \u00B7 Esc to cancel"))) : (React.createElement(Text, { color: colors.dim }, "a add \u00B7 e / Enter reschedule \u00B7 d note \u00B7 t enable / disable \u00B7 n run now \u00B7 x remove \u00B7 r refresh"))),
733
+ React.createElement(EscListener, { active: editing !== null, onEscape: () => setEditing(null) })));
734
+ }
735
+ // ─── shared bits ─────────────────────────────────────────────────────────────
736
+ /** Esc inside a text prompt: ink-text-input does not consume it, so the
737
+ * owning tab listens while a prompt is open. */
738
+ function EscListener({ active, onEscape }) {
739
+ useInput((_input, key) => {
740
+ if (key.escape)
741
+ onEscape();
742
+ }, { isActive: active });
743
+ return null;
744
+ }
745
+ function DetailRow({ label, value }) {
746
+ return (React.createElement(Box, null,
747
+ React.createElement(Box, { width: 16 },
748
+ React.createElement(Text, { color: colors.dim }, label)),
749
+ typeof value === "string" ? React.createElement(Text, { color: colors.text }, value) : value));
750
+ }
751
+ //# sourceMappingURL=FunctionDetail.js.map