@dylanpiercey/work 0.0.115 → 0.0.117

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 (251) hide show
  1. package/bin/work.mjs +7 -29
  2. package/dist/{_8-LIGykR.js → _4-M1FiLt.js} +80 -80
  3. package/dist/{_CzngR9Hn.js → _BBnpIqz1.js} +39 -39
  4. package/dist/_DHnrMF7e.js +2 -0
  5. package/dist/{_CmheBYWi.js → _b8Fct3kh.js} +15 -16
  6. package/dist/index.mjs +462 -489
  7. package/dist/public/assets/{_BxMSfS55.js → _-Z8UOkRe.js} +1 -1
  8. package/dist/public/assets/_-Z8UOkRe.js.br +0 -0
  9. package/dist/public/assets/{_Cg22zLVo.js → _18MJzEZM.js} +1 -1
  10. package/dist/public/assets/_18MJzEZM.js.br +0 -0
  11. package/dist/public/assets/{_BJjHxccu2.js → _6WLgQe1U2.js} +1 -1
  12. package/dist/public/assets/_6WLgQe1U2.js.br +0 -0
  13. package/dist/public/assets/{_LWvTfycL.js → _7MvaMNIr.js} +1 -1
  14. package/dist/public/assets/_7MvaMNIr.js.br +0 -0
  15. package/dist/public/assets/{_DreKZ6Rw.js → _9m5DBxeF.js} +1 -1
  16. package/dist/public/assets/_9m5DBxeF.js.br +0 -0
  17. package/dist/public/assets/{_DrnCFDue2.js → _B9EjUGkg2.js} +1 -1
  18. package/dist/public/assets/_B9EjUGkg2.js.br +0 -0
  19. package/dist/public/assets/{_CgeKq2-o.js → _BBji3Y6b.js} +1 -1
  20. package/dist/public/assets/{_CgeKq2-o.js.br → _BBji3Y6b.js.br} +0 -0
  21. package/dist/public/assets/{_CTTuxe3N2.js → _BD7DcChF2.js} +1 -1
  22. package/dist/public/assets/_BD7DcChF2.js.br +0 -0
  23. package/dist/public/assets/{_Ddh9AEPH2.js → _BK807sss2.js} +1 -1
  24. package/dist/public/assets/_BK807sss2.js.br +0 -0
  25. package/dist/public/assets/{_l8LgTz7i.js → _BRsp-Ky6.js} +1 -1
  26. package/dist/public/assets/_BRsp-Ky6.js.br +0 -0
  27. package/dist/public/assets/{_BVFO0MQN.js → _BSES323S.js} +1 -1
  28. package/dist/public/assets/_BSES323S.js.br +0 -0
  29. package/dist/public/assets/{_ROrfh8pq2.js → _BTgPFRhu2.js} +1 -1
  30. package/dist/public/assets/_BTgPFRhu2.js.br +0 -0
  31. package/dist/public/assets/{_4uzDltDB.js → _BUfH9de1.js} +1 -1
  32. package/dist/public/assets/_BUfH9de1.js.br +0 -0
  33. package/dist/public/assets/{_TlJdhc872.js → _BWPyMgyP2.js} +1 -1
  34. package/dist/public/assets/_BWPyMgyP2.js.br +0 -0
  35. package/dist/public/assets/{_Bn4Yxbs-.js → _BZO0Y-8B.js} +1 -1
  36. package/dist/public/assets/_BZO0Y-8B.js.br +0 -0
  37. package/dist/public/assets/{_D_TU1ccH2.js → _B_vKus4A2.js} +1 -1
  38. package/dist/public/assets/_B_vKus4A2.js.br +0 -0
  39. package/dist/public/assets/{_Cv-_61om2.js → _BdCj3x0L2.js} +1 -1
  40. package/dist/public/assets/_BdCj3x0L2.js.br +0 -0
  41. package/dist/public/assets/{_CmCNOS1s.js → _BdVI9Fdo.js} +1 -1
  42. package/dist/public/assets/_BdVI9Fdo.js.br +0 -0
  43. package/dist/public/assets/{_Dlu2lNNv.js → _BmgHXWoi.js} +1 -1
  44. package/dist/public/assets/_BmgHXWoi.js.br +0 -0
  45. package/dist/public/assets/{_DMXr53s0.js → _BqGtsnPj.js} +1 -1
  46. package/dist/public/assets/_BqGtsnPj.js.br +0 -0
  47. package/dist/public/assets/{_mz4IwXGu.js → _BrtordPT.js} +21 -21
  48. package/dist/public/assets/_BrtordPT.js.br +0 -0
  49. package/dist/public/assets/{_BjBLGYpT.js → _BybHWkEd.js} +1 -1
  50. package/dist/public/assets/_BybHWkEd.js.br +0 -0
  51. package/dist/public/assets/{_CMcC5NfO.js → _BzVV11vP.js} +1 -1
  52. package/dist/public/assets/_BzVV11vP.js.br +0 -0
  53. package/dist/public/assets/{_Bc_oQQms2.js → _C52Kc8e02.js} +1 -1
  54. package/dist/public/assets/_C52Kc8e02.js.br +0 -0
  55. package/dist/public/assets/{_e-09CJmy.js → _C8S11_GE.js} +1 -1
  56. package/dist/public/assets/_C8S11_GE.js.br +0 -0
  57. package/dist/public/assets/{_D2GYbNVm2.js → _C8tBcmDQ2.js} +1 -1
  58. package/dist/public/assets/_C8tBcmDQ2.js.br +0 -0
  59. package/dist/public/assets/{_lsWhs50P.js → _C9uj0n8L.js} +1 -1
  60. package/dist/public/assets/_C9uj0n8L.js.br +0 -0
  61. package/dist/public/assets/{_BoroURD8.js → _CBhJbYqJ.js} +1 -1
  62. package/dist/public/assets/_CBhJbYqJ.js.br +0 -0
  63. package/dist/public/assets/{_2RqhVli_.js → _CD2VZxgc.js} +1 -1
  64. package/dist/public/assets/_CD2VZxgc.js.br +0 -0
  65. package/dist/public/assets/{_uJxmn4g-.js → _CD9LUiA1.js} +1 -1
  66. package/dist/public/assets/_CD9LUiA1.js.br +0 -0
  67. package/dist/public/assets/{_FsBjJqid.js → _CGfW8lhA.js} +1 -1
  68. package/dist/public/assets/_CGfW8lhA.js.br +0 -0
  69. package/dist/public/assets/{_OLZq7u5Z.js → _CH6beBRd.js} +1 -1
  70. package/dist/public/assets/_CH6beBRd.js.br +0 -0
  71. package/dist/public/assets/{_DNzBnKww.js → _CK_oq_Zy.js} +1 -1
  72. package/dist/public/assets/_CK_oq_Zy.js.br +0 -0
  73. package/dist/public/assets/{_ohVSZIH5.js → _CKsCeryF.js} +1 -1
  74. package/dist/public/assets/_CKsCeryF.js.br +0 -0
  75. package/dist/public/assets/{_CYWQWhM3.js → _CN6zO7Nx.js} +1 -1
  76. package/dist/public/assets/_CN6zO7Nx.js.br +0 -0
  77. package/dist/public/assets/{_JWLm_-Hw.js → _CT_4aU9v.js} +1 -1
  78. package/dist/public/assets/_CT_4aU9v.js.br +0 -0
  79. package/dist/public/assets/{_B15VVecH.js → _Cc0zTPig.js} +1 -1
  80. package/dist/public/assets/_Cc0zTPig.js.br +0 -0
  81. package/dist/public/assets/{_U-L3COPT.js → _CkvKurj3.js} +1 -1
  82. package/dist/public/assets/_CkvKurj3.js.br +0 -0
  83. package/dist/public/assets/{_BRNT6Euu2.js → _CqCBTa4i2.js} +1 -1
  84. package/dist/public/assets/_CqCBTa4i2.js.br +0 -0
  85. package/dist/public/assets/{_CGJwkY1t.js → _CxAIftOa.js} +1 -1
  86. package/dist/public/assets/_CxAIftOa.js.br +0 -0
  87. package/dist/public/assets/{_DwDOs-hG2.js → _Cxc4x3kp2.js} +1 -1
  88. package/dist/public/assets/_Cxc4x3kp2.js.br +0 -0
  89. package/dist/public/assets/{_43PRStcn.js → _D-lWfj_d.js} +1 -1
  90. package/dist/public/assets/_D-lWfj_d.js.br +0 -0
  91. package/dist/public/assets/{_Cusx8CXY.js → _D1v40D0_.js} +1 -1
  92. package/dist/public/assets/_D1v40D0_.js.br +0 -0
  93. package/dist/public/assets/{_BC0J2_-32.js → _D2CBcmy92.js} +1 -1
  94. package/dist/public/assets/_D2CBcmy92.js.br +0 -0
  95. package/dist/public/assets/{_B0dJ1TmV.js → _DANBCOm8.js} +1 -1
  96. package/dist/public/assets/_DANBCOm8.js.br +0 -0
  97. package/dist/public/assets/{_DgoDrOg9.js → _DFxITRGV.js} +6 -6
  98. package/dist/public/assets/_DFxITRGV.js.br +0 -0
  99. package/dist/public/assets/{_g_g39Z4x2.js → _DIcIfpSi2.js} +1 -1
  100. package/dist/public/assets/_DIcIfpSi2.js.br +0 -0
  101. package/dist/public/assets/{_pg0OwSj92.js → _DIiQj1WK2.js} +1 -1
  102. package/dist/public/assets/_DIiQj1WK2.js.br +0 -0
  103. package/dist/public/assets/{_QY-Ytpyj.js → _DJF1Yq0V.js} +1 -1
  104. package/dist/public/assets/_DJF1Yq0V.js.br +0 -0
  105. package/dist/public/assets/{_DyTDTRq1.js → _DMyeY0fg.js} +1 -1
  106. package/dist/public/assets/_DMyeY0fg.js.br +0 -0
  107. package/dist/public/assets/{_DeAHixdN.js → _DPYxtc2v.js} +1 -1
  108. package/dist/public/assets/_DPYxtc2v.js.br +0 -0
  109. package/dist/public/assets/{_CmBrLhAh2.js → _DY5rDZr62.js} +1 -1
  110. package/dist/public/assets/_DY5rDZr62.js.br +0 -0
  111. package/dist/public/assets/{_C7yNzPiC.js → _DZBUwVb4.js} +1 -1
  112. package/dist/public/assets/_DZBUwVb4.js.br +0 -0
  113. package/dist/public/assets/{_Dq1yfpqy.js → _DcQSDUkF.js} +1 -1
  114. package/dist/public/assets/_DcQSDUkF.js.br +0 -0
  115. package/dist/public/assets/{_Buq2_Wff2.js → _Ddhg8pUf2.js} +1 -1
  116. package/dist/public/assets/_Ddhg8pUf2.js.br +0 -0
  117. package/dist/public/assets/{_C9iASNNr.js → _Dev6jrQa.js} +1 -1
  118. package/dist/public/assets/_Dev6jrQa.js.br +0 -0
  119. package/dist/public/assets/{_DK4Yj0y5.js → _DmOEoBSj.js} +1 -1
  120. package/dist/public/assets/{_Cc2ZvwOU2.js → _DoJIySsK2.js} +1 -1
  121. package/dist/public/assets/_DoJIySsK2.js.br +0 -0
  122. package/dist/public/assets/{_BUgyA17v.js → _Ds-nHHU4.js} +1 -1
  123. package/dist/public/assets/_Ds-nHHU4.js.br +0 -0
  124. package/dist/public/assets/{_u1NutSwu2.js → _Dza3l03i2.js} +1 -1
  125. package/dist/public/assets/_Dza3l03i2.js.br +0 -0
  126. package/dist/public/assets/{_CdNQc4Og.js → _E92w3rhc.js} +1 -1
  127. package/dist/public/assets/_E92w3rhc.js.br +0 -0
  128. package/dist/public/assets/{_DyII464-.js → _KIdOm5wV.js} +1 -1
  129. package/dist/public/assets/_KIdOm5wV.js.br +0 -0
  130. package/dist/public/assets/{_Czrr5AFc.js → _KkA9wgSQ.js} +1 -1
  131. package/dist/public/assets/_KkA9wgSQ.js.br +0 -0
  132. package/dist/public/assets/{_CsgdD5I-.js → _Qnv2YVI1.js} +1 -1
  133. package/dist/public/assets/_Qnv2YVI1.js.br +0 -0
  134. package/dist/public/assets/{_DcgLE27V.js → _RD4UJVHf.js} +1 -1
  135. package/dist/public/assets/_RD4UJVHf.js.br +0 -0
  136. package/dist/public/assets/{_lhL7OV7_.js → _Rw9EiWl4.js} +1 -1
  137. package/dist/public/assets/_Rw9EiWl4.js.br +0 -0
  138. package/dist/public/assets/{_49DiKr5L.js → _VPFo3zSh.js} +1 -1
  139. package/dist/public/assets/_VPFo3zSh.js.br +0 -0
  140. package/dist/public/assets/{_CZwfKSM-.js → _Yb5xKwv4.js} +1 -1
  141. package/dist/public/assets/_Yb5xKwv4.js.br +0 -0
  142. package/dist/public/assets/{_39wVE9tP.js → _bwdm3qFa.js} +1 -1
  143. package/dist/public/assets/_bwdm3qFa.js.br +0 -0
  144. package/dist/public/assets/{_BMBt7ACI2.js → _ghie1-zD2.js} +1 -1
  145. package/dist/public/assets/{_Cj4eWcbw2.js → _nKN2u-0c2.js} +1 -1
  146. package/dist/public/assets/_nKN2u-0c2.js.br +0 -0
  147. package/dist/public/assets/{_HsinODJ3.js → _qR1knnaE.js} +1 -1
  148. package/dist/public/assets/_qR1knnaE.js.br +0 -0
  149. package/dist/public/assets/{_DuSXkcpH2.js → _snEbm2Ar2.js} +1 -1
  150. package/dist/public/assets/_snEbm2Ar2.js.br +0 -0
  151. package/dist/public/assets/{_Ci2u2uah2.js → _tGNZxau42.js} +1 -1
  152. package/dist/public/assets/{_Boyh70Ee2.js → _tejT-pAf2.js} +1 -1
  153. package/dist/public/assets/_tejT-pAf2.js.br +0 -0
  154. package/dist/public/assets/{_nG_P_baQ.js → _ulYs8wvn.js} +1 -1
  155. package/dist/public/assets/_ulYs8wvn.js.br +0 -0
  156. package/dist/public/assets/app-page-DuEXAcnI.css +1 -0
  157. package/dist/public/assets/app-page-DuEXAcnI.css.br +0 -0
  158. package/dist/public/assets/diff-view-BK4TD-oL.css +1 -0
  159. package/dist/public/assets/diff-view-BK4TD-oL.css.br +0 -0
  160. package/dist/public/assets/new-gddPZdgU.js +1 -0
  161. package/dist/public/assets/settings-gddPZdgU.js +1 -0
  162. package/dist/public/assets/w-gddPZdgU.js +1 -0
  163. package/dist/public/assets/w._-E2EHSRw5.js +1 -0
  164. package/dist/public/assets/w._-gddPZdgU.js +1 -0
  165. package/lib/setup/doctor.d.mts +0 -2
  166. package/lib/setup/doctor.mjs +2 -2
  167. package/lib/usage/format.d.mts +2 -0
  168. package/lib/usage/format.mjs +22 -0
  169. package/package.json +1 -1
  170. package/dist/_BBEL67Rf.js +0 -2
  171. package/dist/public/assets/_2RqhVli_.js.br +0 -0
  172. package/dist/public/assets/_39wVE9tP.js.br +0 -0
  173. package/dist/public/assets/_43PRStcn.js.br +0 -0
  174. package/dist/public/assets/_49DiKr5L.js.br +0 -0
  175. package/dist/public/assets/_4uzDltDB.js.br +0 -0
  176. package/dist/public/assets/_B0dJ1TmV.js.br +0 -0
  177. package/dist/public/assets/_B15VVecH.js.br +0 -0
  178. package/dist/public/assets/_BC0J2_-32.js.br +0 -0
  179. package/dist/public/assets/_BJjHxccu2.js.br +0 -0
  180. package/dist/public/assets/_BRNT6Euu2.js.br +0 -0
  181. package/dist/public/assets/_BUgyA17v.js.br +0 -0
  182. package/dist/public/assets/_BVFO0MQN.js.br +0 -0
  183. package/dist/public/assets/_Bc_oQQms2.js.br +0 -0
  184. package/dist/public/assets/_BjBLGYpT.js.br +0 -0
  185. package/dist/public/assets/_Bn4Yxbs-.js.br +0 -0
  186. package/dist/public/assets/_BoroURD8.js.br +0 -0
  187. package/dist/public/assets/_Boyh70Ee2.js.br +0 -0
  188. package/dist/public/assets/_Buq2_Wff2.js.br +0 -0
  189. package/dist/public/assets/_BxMSfS55.js.br +0 -0
  190. package/dist/public/assets/_C7yNzPiC.js.br +0 -0
  191. package/dist/public/assets/_C9iASNNr.js.br +0 -0
  192. package/dist/public/assets/_CGJwkY1t.js.br +0 -0
  193. package/dist/public/assets/_CMcC5NfO.js.br +0 -0
  194. package/dist/public/assets/_CTTuxe3N2.js.br +0 -0
  195. package/dist/public/assets/_CYWQWhM3.js.br +0 -0
  196. package/dist/public/assets/_CZwfKSM-.js.br +0 -0
  197. package/dist/public/assets/_Cc2ZvwOU2.js.br +0 -0
  198. package/dist/public/assets/_CdNQc4Og.js.br +0 -0
  199. package/dist/public/assets/_Cg22zLVo.js.br +0 -0
  200. package/dist/public/assets/_Cj4eWcbw2.js.br +0 -0
  201. package/dist/public/assets/_CmBrLhAh2.js.br +0 -0
  202. package/dist/public/assets/_CmCNOS1s.js.br +0 -0
  203. package/dist/public/assets/_CsgdD5I-.js.br +0 -0
  204. package/dist/public/assets/_Cusx8CXY.js.br +0 -0
  205. package/dist/public/assets/_Cv-_61om2.js.br +0 -0
  206. package/dist/public/assets/_Czrr5AFc.js.br +0 -0
  207. package/dist/public/assets/_D2GYbNVm2.js.br +0 -0
  208. package/dist/public/assets/_DMXr53s0.js.br +0 -0
  209. package/dist/public/assets/_DNzBnKww.js.br +0 -0
  210. package/dist/public/assets/_D_TU1ccH2.js.br +0 -0
  211. package/dist/public/assets/_DcgLE27V.js.br +0 -0
  212. package/dist/public/assets/_Ddh9AEPH2.js.br +0 -0
  213. package/dist/public/assets/_DeAHixdN.js.br +0 -0
  214. package/dist/public/assets/_DgoDrOg9.js.br +0 -0
  215. package/dist/public/assets/_Dlu2lNNv.js.br +0 -0
  216. package/dist/public/assets/_Dq1yfpqy.js.br +0 -0
  217. package/dist/public/assets/_DreKZ6Rw.js.br +0 -0
  218. package/dist/public/assets/_DrnCFDue2.js.br +0 -0
  219. package/dist/public/assets/_DuSXkcpH2.js.br +0 -0
  220. package/dist/public/assets/_DwDOs-hG2.js.br +0 -0
  221. package/dist/public/assets/_DyII464-.js.br +0 -0
  222. package/dist/public/assets/_DyTDTRq1.js.br +0 -0
  223. package/dist/public/assets/_FsBjJqid.js.br +0 -0
  224. package/dist/public/assets/_HsinODJ3.js.br +0 -0
  225. package/dist/public/assets/_JWLm_-Hw.js.br +0 -0
  226. package/dist/public/assets/_LWvTfycL.js.br +0 -0
  227. package/dist/public/assets/_OLZq7u5Z.js.br +0 -0
  228. package/dist/public/assets/_QY-Ytpyj.js.br +0 -0
  229. package/dist/public/assets/_ROrfh8pq2.js.br +0 -0
  230. package/dist/public/assets/_TlJdhc872.js.br +0 -0
  231. package/dist/public/assets/_U-L3COPT.js.br +0 -0
  232. package/dist/public/assets/_e-09CJmy.js.br +0 -0
  233. package/dist/public/assets/_g_g39Z4x2.js.br +0 -0
  234. package/dist/public/assets/_l8LgTz7i.js.br +0 -0
  235. package/dist/public/assets/_lhL7OV7_.js.br +0 -0
  236. package/dist/public/assets/_lsWhs50P.js.br +0 -0
  237. package/dist/public/assets/_mz4IwXGu.js.br +0 -0
  238. package/dist/public/assets/_nG_P_baQ.js.br +0 -0
  239. package/dist/public/assets/_ohVSZIH5.js.br +0 -0
  240. package/dist/public/assets/_pg0OwSj92.js.br +0 -0
  241. package/dist/public/assets/_u1NutSwu2.js.br +0 -0
  242. package/dist/public/assets/_uJxmn4g-.js.br +0 -0
  243. package/dist/public/assets/app-page-BbtnI6Ar.css +0 -1
  244. package/dist/public/assets/app-page-BbtnI6Ar.css.br +0 -0
  245. package/dist/public/assets/diff-view-BZuzHKWL.css +0 -1
  246. package/dist/public/assets/diff-view-BZuzHKWL.css.br +0 -0
  247. package/dist/public/assets/new-N_jFKGt0.js +0 -1
  248. package/dist/public/assets/settings-N_jFKGt0.js +0 -1
  249. package/dist/public/assets/w-N_jFKGt0.js +0 -1
  250. package/dist/public/assets/w._-BO2RF7K9.js +0 -1
  251. package/dist/public/assets/w._-N_jFKGt0.js +0 -1
package/bin/work.mjs CHANGED
@@ -25,6 +25,7 @@ import { createRequire } from "node:module";
25
25
  import { doctor, formatDoctor, setupPath } from "../lib/setup/doctor.mjs";
26
26
  import { installTool } from "../lib/setup/install.mjs";
27
27
  import { commentMarkdown } from "../lib/review/markdown.mjs";
28
+ import { duration, pctText } from "../lib/usage/format.mjs";
28
29
 
29
30
  const pkgRoot = path.dirname(path.dirname(fileURLToPath(import.meta.url)));
30
31
  const pkg = JSON.parse(fs.readFileSync(path.join(pkgRoot, "package.json"), "utf8"));
@@ -104,17 +105,10 @@ async function start() {
104
105
  * this table can never disagree, which is also why this asks over HTTP instead
105
106
  * of re-reading every provider's credentials itself. */
106
107
  async function usage() {
107
- const port = serviceEnv().PORT;
108
- const url = `http://127.0.0.1:${port}/api/usage${args.includes("--refresh") ? "?refresh" : ""}`;
109
- let data;
110
- try {
111
- const res = await fetch(url, { signal: AbortSignal.timeout(30_000) });
112
- if (!res.ok) die(`server answered ${res.status} for /api/usage`);
113
- data = await res.json();
114
- } catch {
115
- die(`no work server on port ${port}. Start one with: work start`);
116
- }
117
- if (args.includes("--json")) {
108
+ const data = await apiGet(
109
+ `/api/usage${args.includes("--refresh") ? "?refresh" : ""}`,
110
+ );
111
+ if (jsonOut) {
118
112
  console.log(JSON.stringify(data, null, 2));
119
113
  return;
120
114
  }
@@ -139,7 +133,7 @@ async function usage() {
139
133
  // enough to read as a warning rather than another window.
140
134
  if (agent.note) console.log(` ⚠ ${agent.note}`);
141
135
  if (agent.stale_seconds != null) {
142
- console.log(` ⚠ ${short(agent.stale_seconds * 1000)} old`);
136
+ console.log(` ⚠ ${duration(agent.stale_seconds * 1000)} old`);
143
137
  }
144
138
  }
145
139
  }
@@ -285,23 +279,7 @@ async function reviewCmd() {
285
279
  function until(iso) {
286
280
  if (!iso) return null;
287
281
  const ms = new Date(iso).getTime() - Date.now();
288
- return ms > 0 ? short(ms) : null;
289
- }
290
-
291
- /** Percent, with a decimal only where rounding would lie: 99.6% must not
292
- * read as a spent 100%, and 0.4% must not read as an untouched 0%. */
293
- function pctText(pct) {
294
- const rounded = Math.round(pct);
295
- return rounded !== pct && (rounded === 100 || rounded === 0)
296
- ? `${pct.toFixed(1)}%`
297
- : `${rounded}%`;
298
- }
299
-
300
- function short(ms) {
301
- const m = Math.round(ms / 60_000);
302
- if (m < 60) return `${m}m`;
303
- const h = Math.round(m / 60);
304
- return h < 48 ? `${h}h` : `${Math.round(h / 24)}d`;
282
+ return ms > 0 ? duration(ms) : null;
305
283
  }
306
284
 
307
285
  async function setup() {