@hot-updater/console 1.0.0-rc.4 → 1.0.0-rc.41

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 (330) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/ConsoleFeatureUnavailable-DRzeMGRM.js +1 -0
  3. package/.output/public/assets/EventDetails-SB5ygJzS.js +1 -0
  4. package/.output/public/assets/HashValueDisplay-BFX_kY3-.js +1 -0
  5. package/.output/public/assets/InsightsInfo-btYppp0B.js +1 -0
  6. package/.output/public/assets/InsightsPageHeader-Ba8psD8t.js +1 -0
  7. package/.output/public/assets/NotFoundPage-CyRG2eca.js +1 -0
  8. package/.output/public/assets/alert-dialog-Bbk_4-WJ.js +1 -0
  9. package/.output/public/assets/api-DUgI6yOI.js +1 -0
  10. package/.output/public/assets/api-keys-CIO9L_wu.js +1 -0
  11. package/.output/public/assets/api-keys-CmkNKOhS.js +1 -0
  12. package/.output/public/assets/arrow-left-CnMYpqB7.js +1 -0
  13. package/.output/public/assets/arrow-up-right-BtffZA6e.js +1 -0
  14. package/.output/public/assets/chevron-right-BqD5wtFb.js +1 -0
  15. package/.output/public/assets/clipboard-DS9ucUQL.js +1 -0
  16. package/.output/public/assets/console-features-api-BMsI3Bj8.js +1 -0
  17. package/.output/public/assets/dialog-Bqbb7B0N.js +1 -0
  18. package/.output/public/assets/dist-LxKJB-Vu.js +1 -0
  19. package/.output/public/assets/empty-CuT2UhFp.js +1 -0
  20. package/.output/public/assets/field-BBDpjIqu.js +1 -0
  21. package/.output/public/assets/index-BEfQ2_7f.js +11 -0
  22. package/.output/public/assets/input-group-ja_30qaF.js +1 -0
  23. package/.output/public/assets/insights-B0ib9qOE.js +2 -0
  24. package/.output/public/assets/insights-BIMJx-0p.js +1 -0
  25. package/.output/public/assets/insights-CndqcWEj.js +42 -0
  26. package/.output/public/assets/insights-api-B6Ewc-OG.js +1 -0
  27. package/.output/public/assets/insights-usage-rpc-DYEhsCKT.js +1 -0
  28. package/.output/public/assets/insights_.distribution-B26PMy4k.js +2 -0
  29. package/.output/public/assets/insights_.distribution-BBDtqqYS.js +1 -0
  30. package/.output/public/assets/insights_.distribution-DhHmYS8k.js +1 -0
  31. package/.output/public/assets/installations-C3cMuwRx.js +1 -0
  32. package/.output/public/assets/installations-C3yrjwDh.js +2 -0
  33. package/.output/public/assets/installations-D3edlN75.js +1 -0
  34. package/.output/public/assets/key-round-wS_SIZ6b.js +1 -0
  35. package/.output/public/assets/list-CgrYiadM.js +1 -0
  36. package/.output/public/assets/refresh-cw-BYgoNCco.js +1 -0
  37. package/.output/public/assets/remote-config-0i-gDkeU.js +1 -0
  38. package/.output/public/assets/remote-config-An1ROIOQ.js +6 -0
  39. package/.output/public/assets/remote-config-CoeWgA9i.js +1 -0
  40. package/.output/public/assets/routes-DNoaJIQV.js +2 -0
  41. package/.output/public/assets/routes-cWBDtghZ.js +1 -0
  42. package/.output/public/assets/search-DaTDPW25.js +1 -0
  43. package/.output/public/assets/select-CZMQKT7F.js +1 -0
  44. package/.output/public/assets/sidebar-DNVyJPfX.js +3 -0
  45. package/.output/public/assets/smartphone-DpTFgtKf.js +1 -0
  46. package/.output/public/assets/styles-D8mxMvCB.css +2 -0
  47. package/.output/public/assets/switch-CU4-fupc.js +1 -0
  48. package/.output/public/assets/table-Gm4qRWwE.js +1 -0
  49. package/.output/public/assets/tabs-R1I8CRjR.js +1 -0
  50. package/.output/public/assets/undo-2-CmrHjwFc.js +1 -0
  51. package/.output/public/assets/useCompositeListItem-BaPeC9ZO.js +1 -0
  52. package/.output/public/assets/valueToPercent-CH8GCHaL.js +1 -0
  53. package/.output/server/__23tanstack-start-server-fn-resolver-DTAqlLRd.mjs +178 -0
  54. package/.output/server/_libs/@base-ui/react+[...].mjs +6450 -2741
  55. package/.output/server/_libs/@tanstack/react-router+[...].mjs +3802 -4022
  56. package/.output/server/_libs/@tanstack/react-router-ssr-query+[...].mjs +140 -97
  57. package/.output/server/_libs/lucide-react.mjs +235 -31
  58. package/.output/server/_libs/next-themes.mjs +1 -1
  59. package/.output/server/_libs/react-redux+[...].mjs +1 -1
  60. package/.output/server/_libs/recharts+[...].mjs +483 -901
  61. package/.output/server/_libs/sonner.mjs +1 -1
  62. package/.output/server/_libs/tanstack__history.mjs +68 -41
  63. package/.output/server/_libs/tanstack__query-core.mjs +2010 -309
  64. package/.output/server/_libs/tanstack__react-query.mjs +448 -21
  65. package/.output/server/_libs/verkit.mjs +102 -1
  66. package/.output/server/_ssr/BundleIdDisplay-BNoVW3Dv.mjs +13 -0
  67. package/.output/server/_ssr/ConsoleFeatureUnavailable-BPFa-cmJ.mjs +58 -0
  68. package/.output/server/_ssr/EventDetails-9CeshfdR.mjs +344 -0
  69. package/.output/server/_ssr/HashValueDisplay-DXZlkcps.mjs +55 -0
  70. package/.output/server/_ssr/InsightsInfo-DLNdJQ0m.mjs +75 -0
  71. package/.output/server/_ssr/InsightsPageHeader-DZGVDgvv.mjs +145 -0
  72. package/.output/server/_ssr/NotFoundPage-mYHHg-2s.mjs +37 -0
  73. package/.output/server/_ssr/{dialog-DUaIgpgd.mjs → alert-dialog-Chkim7vZ.mjs} +6 -83
  74. package/.output/server/_ssr/api-C-Il5-sa.mjs +203 -0
  75. package/.output/server/_ssr/api-keys-01FGqj4d.mjs +5 -0
  76. package/.output/server/_ssr/{api-keys-DJml_XoK.mjs → api-keys-B_f9h7ln.mjs} +48 -10
  77. package/.output/server/_ssr/api-keys-rpc-Cf4YCyFc.mjs +52 -0
  78. package/.output/server/_ssr/api-rpc-DRqwxxT_.mjs +296 -0
  79. package/.output/server/_ssr/{auth-BF8mbAgF.mjs → auth-UP0wXs4i.mjs} +1 -1
  80. package/.output/server/_ssr/{auth-rpc-D_hv52-J.mjs → auth-rpc-D8nFpU9C.mjs} +6 -6
  81. package/.output/server/_ssr/auth.server-COZoXu4i.mjs +5425 -0
  82. package/.output/server/_ssr/bundleActivity-M5gzBFNg.mjs +18 -0
  83. package/.output/server/_ssr/config-WVX4IxSR.mjs +15 -0
  84. package/.output/server/_ssr/config.server-Dm2l7w0O.mjs +36 -0
  85. package/.output/server/_ssr/console-access--o9FXikU.mjs +17 -0
  86. package/.output/server/_ssr/console-features-BftSkf3f.mjs +60 -0
  87. package/.output/server/_ssr/console-features-api-CYclUQ4h.mjs +43 -0
  88. package/.output/server/_ssr/console-features-rpc-1WaAkPM_.mjs +19 -0
  89. package/.output/server/_ssr/{createServerFn-B2hcXoPM.mjs → createMiddleware-Cm6Tn0_Y.mjs} +67 -56
  90. package/.output/server/_ssr/{createServerRpc-DB29C_5p.mjs → createServerRpc-RLR4H-Fn.mjs} +2 -2
  91. package/.output/server/_ssr/databaseConfig-C5SkAyUy.mjs +5 -0
  92. package/.output/server/_ssr/{databaseJsonValue-d6I3nAS4.mjs → databaseJsonValue-Csbuzc9Q.mjs} +28 -5
  93. package/.output/server/_ssr/databaseRows-BUuNU-qt.mjs +74 -0
  94. package/.output/server/_ssr/dialog-mfSANqjC.mjs +84 -0
  95. package/.output/server/_ssr/{dist-CyzPaI5v.mjs → dist-wmnTk7w6.mjs} +140 -6
  96. package/.output/server/_ssr/{downloadBundle-B3ert-pY.mjs → downloadBundle-DViuIa9U.mjs} +10 -10
  97. package/.output/server/_ssr/empty-BPayFad3.mjs +60 -0
  98. package/.output/server/_ssr/{empty-plugin-adapters-B5QvGpEl.mjs → empty-plugin-adapters-CPtwX8a7.mjs} +1 -1
  99. package/.output/server/_ssr/failureReports-DKDhVsXA.mjs +33 -0
  100. package/.output/server/_ssr/field-DjZ5t7rH.mjs +189 -0
  101. package/.output/server/_ssr/getBundleChildren-CmjDg6Re.mjs +22 -0
  102. package/.output/server/_ssr/{input-group-Bb8ueylQ.mjs → input-group-Dx-MEkNM.mjs} +3 -52
  103. package/.output/server/_ssr/insights-BopxyJjk.mjs +14 -0
  104. package/.output/server/_ssr/insights-Bvm03d61.mjs +5 -0
  105. package/.output/server/_ssr/insights-CrLAHSDy.mjs +2315 -0
  106. package/.output/server/_ssr/insights-api-Bg8ZV_h_.mjs +122 -0
  107. package/.output/server/_ssr/insights-errors-BjnFUyZj.mjs +34 -0
  108. package/.output/server/_ssr/insights-failures-rpc-tyy5m9Cc.mjs +36 -0
  109. package/.output/server/_ssr/insights-failures-xaa41Buf.mjs +46 -0
  110. package/.output/server/_ssr/{insights-recovery-DSFM-YTL.mjs → insights-recovery-BWQhiZaF.mjs} +9 -2
  111. package/.output/server/_ssr/insights-recovery-rpc-CPJOiJAV.mjs +32 -0
  112. package/.output/server/_ssr/{insights-rpc-DrIQCjpD.mjs → insights-rpc-DoC3hla9.mjs} +22 -14
  113. package/.output/server/_ssr/insights-usage-BpBM0U0c.mjs +29 -0
  114. package/.output/server/_ssr/insights-usage-rpc-CFuTYp3T.mjs +29 -0
  115. package/.output/server/_ssr/insights-usage-rpc-O2ruP4iE.mjs +41 -0
  116. package/.output/server/_ssr/insightsUsage-CzhVjsc8.mjs +56 -0
  117. package/.output/server/_ssr/insights_.distribution-B3BVPD00.mjs +16 -0
  118. package/.output/server/_ssr/insights_.distribution-BMoisxRG.mjs +347 -0
  119. package/.output/server/_ssr/insights_.distribution-BiCcFyrG.mjs +7 -0
  120. package/.output/server/_ssr/{installations-YumqpNpa.mjs → installations-Cx3jIrwl.mjs} +280 -364
  121. package/.output/server/_ssr/installations-DTGPaKXx.mjs +69 -0
  122. package/.output/server/_ssr/installations-osiAuNKr.mjs +5 -0
  123. package/.output/server/_ssr/listReleases-BfUBlCHo.mjs +79 -0
  124. package/.output/server/_ssr/release-adoption-005tQRpo.mjs +55 -0
  125. package/.output/server/_ssr/release-adoption-rpc-BVySDR0L.mjs +41 -0
  126. package/.output/server/_ssr/releaseAdoption-2PJPA09N.mjs +114 -0
  127. package/.output/server/_ssr/releaseManagement-BTCWEY8-.mjs +11 -0
  128. package/.output/server/_ssr/remote-config-CUoAxUMy.mjs +430 -0
  129. package/.output/server/_ssr/remote-config-Cc5P4J-r.mjs +17 -0
  130. package/.output/server/_ssr/remote-config-CjdxcZ9B.mjs +5 -0
  131. package/.output/server/_ssr/remote-config-D2GmbGwI.mjs +2594 -0
  132. package/.output/server/_ssr/remote-config-rpc-kjoZ9PRS.mjs +115 -0
  133. package/.output/server/_ssr/rolldown-runtime-rSIU-vHC.mjs +13 -0
  134. package/.output/server/_ssr/{router-iP95Vqi2.mjs → router-DwGVewL-.mjs} +141 -139
  135. package/.output/server/_ssr/{routes-ivsV2TDu.mjs → routes-C4yxv3JU.mjs} +192 -685
  136. package/.output/server/_ssr/routes-D3_aegLY.mjs +409 -0
  137. package/.output/server/_ssr/runtime.server-BoWf4QhU.mjs +1716 -0
  138. package/.output/server/_ssr/schema-DrOtkRVD.mjs +361 -0
  139. package/.output/server/_ssr/select-DkzM2miy.mjs +107 -0
  140. package/.output/server/_ssr/server-BW0gzB0p.mjs +8325 -0
  141. package/.output/server/_ssr/{createSsrRpc-NHF2PxuK.mjs → sidebar-DPcOijvL.mjs} +107 -47
  142. package/.output/server/_ssr/ssr.mjs +1 -1
  143. package/.output/server/_ssr/start-BfFbHKMK.mjs +4 -0
  144. package/.output/server/_ssr/switch-BqJ2mAwC.mjs +17 -0
  145. package/.output/server/_ssr/{table-D1mL8fJu.mjs → table-R7RY92q9.mjs} +2 -2
  146. package/.output/server/_ssr/tabs-trDcbRkT.mjs +45 -0
  147. package/.output/server/_ssr/updateFailures-H6pnnYK4.mjs +40 -0
  148. package/.output/server/_ssr/{uuidv7-D0QFkPL_.mjs → uuidv7-ctA_XVZA.mjs} +2 -2
  149. package/.output/server/_tanstack-start-manifest_v-BwInaUTw.mjs +139 -0
  150. package/.output/server/index.mjs +315 -154
  151. package/LICENSE +13 -14
  152. package/README.md +82 -72
  153. package/lib/index.d.mts +23 -11
  154. package/lib/vite-internal.mjs +13 -3
  155. package/lib/vite.d.mts +2 -0
  156. package/package.json +14 -14
  157. package/src/components/AppSidebar.tsx +100 -71
  158. package/src/components/ConsoleAccessPage.tsx +5 -1
  159. package/src/components/ConsoleFeatureUnavailable.tsx +80 -0
  160. package/src/components/NotFoundPage.tsx +7 -7
  161. package/src/components/features/FeatureSlots.tsx +103 -0
  162. package/src/components/features/api-keys/apiKeysFeatureUi.tsx +15 -0
  163. package/src/components/features/bundles/BundleMetadata.tsx +8 -5
  164. package/src/components/features/bundles/RolloutCohortsDialog.tsx +1 -1
  165. package/src/components/features/channels/ChannelManagementDialog.tsx +2 -5
  166. package/src/components/features/insights/AppUsage.tsx +366 -0
  167. package/src/components/features/insights/BuiltinBundle.tsx +36 -0
  168. package/src/components/features/insights/ComparedBundlesChart.tsx +310 -0
  169. package/src/components/features/insights/EstimatedCount.tsx +18 -0
  170. package/src/components/features/insights/EventDetails.tsx +400 -39
  171. package/src/components/features/insights/EventHistoryCard.tsx +112 -26
  172. package/src/components/features/insights/EventHistoryList.tsx +2 -2
  173. package/src/components/features/insights/FailureReports.tsx +407 -0
  174. package/src/components/features/insights/InsightsControls.tsx +265 -88
  175. package/src/components/features/insights/InsightsErrorAlert.tsx +14 -1
  176. package/src/components/features/insights/InsightsInfo.tsx +48 -0
  177. package/src/components/features/insights/InsightsOverview.tsx +604 -355
  178. package/src/components/features/insights/InsightsPageHeader.tsx +35 -20
  179. package/src/components/features/insights/InsightsPeriodSelector.tsx +89 -0
  180. package/src/components/features/insights/InstallationHistoryCard.tsx +66 -11
  181. package/src/components/features/insights/InstallationMatchesCard.tsx +1 -1
  182. package/src/components/features/insights/ReleaseActivity.tsx +308 -0
  183. package/src/components/features/insights/ReportingDevicesSummary.tsx +48 -0
  184. package/src/components/features/insights/RollbackButton.tsx +118 -0
  185. package/src/components/features/insights/UpdateFailures.tsx +382 -0
  186. package/src/components/features/insights/insightsFeatureUi.tsx +35 -0
  187. package/src/components/features/releases/ReleaseEditorSheet.tsx +26 -12
  188. package/src/components/features/remote-config/ConditionDialog.tsx +581 -0
  189. package/src/components/features/remote-config/ConditionsCard.tsx +244 -0
  190. package/src/components/features/remote-config/ParameterDialog.tsx +407 -0
  191. package/src/components/features/remote-config/ParametersCard.tsx +244 -0
  192. package/src/components/features/remote-config/PreviewCard.tsx +284 -0
  193. package/src/components/features/remote-config/PublishDialog.tsx +319 -0
  194. package/src/components/features/remote-config/RemoteConfigPage.tsx +353 -0
  195. package/src/components/features/remote-config/RuleSummary.tsx +21 -0
  196. package/src/components/features/remote-config/ValueInput.tsx +148 -0
  197. package/src/components/features/remote-config/VersionsCard.tsx +361 -0
  198. package/src/components/features/remote-config/remoteConfigFeatureUi.tsx +15 -0
  199. package/src/components/features/remote-config/useDateTimeText.ts +16 -0
  200. package/src/components/ui/card.tsx +1 -1
  201. package/src/components/ui/scroll-area.tsx +52 -0
  202. package/src/components/ui/sidebar.tsx +22 -29
  203. package/src/components/ui/tabs.tsx +81 -0
  204. package/src/index.ts +26 -19
  205. package/src/lib/api-keys-api.ts +0 -28
  206. package/src/lib/api-keys-rpc.ts +27 -38
  207. package/src/lib/api-rpc.ts +189 -266
  208. package/src/lib/api.ts +19 -102
  209. package/src/lib/bundle-activity.ts +24 -4
  210. package/src/lib/console-access.ts +20 -0
  211. package/src/lib/console-features-api.ts +68 -0
  212. package/src/lib/console-features-rpc.ts +13 -0
  213. package/src/lib/console-features.ts +97 -0
  214. package/src/lib/insights-api.ts +56 -2
  215. package/src/lib/insights-errors.ts +64 -0
  216. package/src/lib/insights-failures-rpc.ts +36 -0
  217. package/src/lib/insights-failures.ts +130 -0
  218. package/src/lib/insights-recovery-rpc.ts +13 -17
  219. package/src/lib/insights-recovery.ts +10 -27
  220. package/src/lib/insights-retention.ts +21 -0
  221. package/src/lib/insights-rpc.ts +30 -12
  222. package/src/lib/insights-search.ts +93 -0
  223. package/src/lib/insights-usage-rpc.ts +29 -0
  224. package/src/lib/insights-usage.ts +76 -0
  225. package/src/lib/insights-view.ts +34 -5
  226. package/src/lib/release-adoption-api.ts +214 -0
  227. package/src/lib/release-adoption-rpc.ts +49 -0
  228. package/src/lib/release-adoption.ts +164 -0
  229. package/src/lib/remote-config-api.ts +119 -0
  230. package/src/lib/remote-config-draft.ts +652 -0
  231. package/src/lib/remote-config-rpc.ts +196 -0
  232. package/src/lib/scroll-restoration.ts +21 -0
  233. package/src/lib/server/adminInsights.ts +124 -0
  234. package/src/lib/server/auth.server.ts +13 -5
  235. package/src/lib/server/bundleActivity.ts +27 -28
  236. package/src/lib/server/config.server.ts +21 -74
  237. package/src/lib/server/console-feature-apis.ts +70 -0
  238. package/src/lib/server/console-runtime.server.ts +82 -38
  239. package/src/lib/server/downloadBundle.ts +16 -15
  240. package/src/lib/server/failureReports.ts +49 -0
  241. package/src/lib/server/getBundleChildren.ts +31 -122
  242. package/src/lib/server/insightsUsage.ts +63 -0
  243. package/src/lib/server/listReleases.ts +109 -44
  244. package/src/lib/server/releaseAdoption.ts +154 -0
  245. package/src/lib/server/releaseReachability.ts +8 -7
  246. package/src/lib/server/remoteConfig.ts +191 -0
  247. package/src/lib/server/runtime.server.ts +120 -31
  248. package/src/lib/server/updateFailures.ts +65 -0
  249. package/src/routeTree.gen.ts +65 -44
  250. package/src/router.tsx +3 -2
  251. package/src/routes/-installations-search.ts +32 -8
  252. package/src/routes/-releases-search.ts +76 -29
  253. package/src/routes/__root.tsx +10 -4
  254. package/src/routes/api/bundles/$bundleId/download.ts +2 -5
  255. package/src/routes/api-keys.tsx +5 -2
  256. package/src/routes/index.tsx +210 -152
  257. package/src/routes/insights.tsx +133 -18
  258. package/src/routes/insights_.distribution.tsx +422 -0
  259. package/src/routes/installations.tsx +98 -41
  260. package/src/routes/remote-config.tsx +42 -0
  261. package/src/styles.css +9 -0
  262. package/src/vite-internal.ts +15 -3
  263. package/src/vite.ts +2 -0
  264. package/.output/public/assets/InsightsPageHeader-C-Xc2MB9.js +0 -1
  265. package/.output/public/assets/api-keys-C1sgC6ko.js +0 -1
  266. package/.output/public/assets/api-keys-api-LchP65vQ.js +0 -1
  267. package/.output/public/assets/badge-BuMDU0Rf.js +0 -1
  268. package/.output/public/assets/card-BEvx_QKh.js +0 -1
  269. package/.output/public/assets/chart-no-axes-combined-C0G0fQ3J.js +0 -1
  270. package/.output/public/assets/composite-CHTH1Xhh.js +0 -1
  271. package/.output/public/assets/createServerFn-DHc2erub.js +0 -3
  272. package/.output/public/assets/dialog-dyZ1SphZ.js +0 -1
  273. package/.output/public/assets/dist-Bh1gaDfB.js +0 -1
  274. package/.output/public/assets/field-79SVH26s.js +0 -1
  275. package/.output/public/assets/index-BNkxg4jz.js +0 -10
  276. package/.output/public/assets/input-group-BbHfaBzQ.js +0 -1
  277. package/.output/public/assets/insights-D_7uSKfc.js +0 -1
  278. package/.output/public/assets/installations-BzoHWuXw.js +0 -1
  279. package/.output/public/assets/installations-DvjbUqd1.js +0 -2
  280. package/.output/public/assets/lazyRouteComponent-BN0MS05o.js +0 -1
  281. package/.output/public/assets/link-BG06whwB.js +0 -1
  282. package/.output/public/assets/loader-circle-Bbp8LGVC.js +0 -1
  283. package/.output/public/assets/preload-helper-uTix4PVD.js +0 -1
  284. package/.output/public/assets/refresh-cw-DZgiAOMk.js +0 -1
  285. package/.output/public/assets/routes-BFE-oRIT.js +0 -1
  286. package/.output/public/assets/routes-DaPMY31P.js +0 -2
  287. package/.output/public/assets/shield-check-DoIiaaXU.js +0 -1
  288. package/.output/public/assets/signing-BTRhaF5D.js +0 -1
  289. package/.output/public/assets/styles-C7U0oVke.css +0 -2
  290. package/.output/public/assets/table-BBEzJ7Xl.js +0 -1
  291. package/.output/public/assets/useCompositeListItem-BkPDaqyj.js +0 -42
  292. package/.output/server/__23tanstack-start-server-fn-resolver-Dr2ixDgQ.mjs +0 -146
  293. package/.output/server/_ssr/InsightsPageHeader-C5Has8Ry.mjs +0 -60
  294. package/.output/server/_ssr/api-keys-api-CrCZyvnl.mjs +0 -60
  295. package/.output/server/_ssr/api-keys-rpc-CFaNf-q0.mjs +0 -136
  296. package/.output/server/_ssr/api-rpc-B61KL3Eo.mjs +0 -1399
  297. package/.output/server/_ssr/auth.server-DF_shCeq.mjs +0 -47
  298. package/.output/server/_ssr/badge-BgsCP9Dp.mjs +0 -28
  299. package/.output/server/_ssr/bundle-signing-rpc-BBipZnFs.mjs +0 -16
  300. package/.output/server/_ssr/bundle-signing.server-Co_zHdJx.mjs +0 -12
  301. package/.output/server/_ssr/bundleActivity-D3_fIda2.mjs +0 -27
  302. package/.output/server/_ssr/card-DrbxCPtG.mjs +0 -86
  303. package/.output/server/_ssr/chart-qxa-_30a.mjs +0 -162
  304. package/.output/server/_ssr/config-Dv8qLDZ0.mjs +0 -13
  305. package/.output/server/_ssr/config.server-CBr6PDj5.mjs +0 -368
  306. package/.output/server/_ssr/databaseRows-5bCRTxm-.mjs +0 -126
  307. package/.output/server/_ssr/deleteBundle-BAq3JuGr.mjs +0 -66
  308. package/.output/server/_ssr/field-CqNUlqUq.mjs +0 -74
  309. package/.output/server/_ssr/getBundleChildren-COMt16m_.mjs +0 -50
  310. package/.output/server/_ssr/insights-B-DUbksX.mjs +0 -502
  311. package/.output/server/_ssr/insights-recovery-rpc-P71FH66n.mjs +0 -37
  312. package/.output/server/_ssr/insightsContract-fjJDBeEE.mjs +0 -303
  313. package/.output/server/_ssr/insightsRecovery-CqcosG7B.mjs +0 -149
  314. package/.output/server/_ssr/installations-BQrppti7.mjs +0 -29
  315. package/.output/server/_ssr/routes-BDabsmc7.mjs +0 -37
  316. package/.output/server/_ssr/runtime.server-jmZOKIQM.mjs +0 -438
  317. package/.output/server/_ssr/server-p7yrVBfD.mjs +0 -7468
  318. package/.output/server/_ssr/signing-CxCbnFCt.mjs +0 -134
  319. package/.output/server/_ssr/start-DpViQGnt.mjs +0 -4
  320. package/.output/server/_tanstack-start-manifest_v-Cwpu0C9Q.mjs +0 -100
  321. package/src/components/features/bundles/BundleActivityChart.tsx +0 -95
  322. package/src/components/features/bundles/BundleInsightsSummary.tsx +0 -121
  323. package/src/components/features/signing/BundleSigningPage.tsx +0 -139
  324. package/src/lib/bundle-signing-api.ts +0 -14
  325. package/src/lib/bundle-signing-rpc.ts +0 -16
  326. package/src/lib/server/bundle-signing.server.ts +0 -23
  327. package/src/lib/server/deleteBundle.ts +0 -145
  328. package/src/lib/server/insightsHistory.ts +0 -52
  329. package/src/lib/server/insightsRecovery.ts +0 -186
  330. package/src/routes/signing.tsx +0 -37
@@ -1,134 +0,0 @@
1
- import { c as createServerFn } from "./createServerFn-B2hcXoPM.mjs";
2
- import { q as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
3
- import { A as CircleCheck, C as Info, c as ShieldCheck, f as RefreshCw, n as TriangleAlert } from "../_libs/lucide-react.mjs";
4
- import { _ as Skeleton, g as SidebarTrigger, t as Button$1, w as createSsrRpc } from "./createSsrRpc-NHF2PxuK.mjs";
5
- import { n as useQuery } from "../_libs/tanstack__react-query.mjs";
6
- import { a as Card, i as AlertTitle, l as CardHeader, n as AlertAction, o as CardContent, r as AlertDescription, s as CardDescription, t as Alert, u as CardTitle } from "./card-DrbxCPtG.mjs";
7
- import { t as Badge } from "./badge-BgsCP9Dp.mjs";
8
- //#region node_modules/.nitro/vite/services/ssr/assets/signing-CxCbnFCt.js
9
- var import_jsx_runtime = require_jsx_runtime();
10
- var getBundleSigningInspectionRpc = createServerFn({ method: "GET" }).handler(createSsrRpc("662034966679a6d29db2b55e7ba665e26e6c9a58a5529f33aa857a2049616233"));
11
- var bundleSigningQueryKey = ["bundle-signing"];
12
- var getBundleSigningInspectionQueryOptions = () => ({
13
- queryFn: () => getBundleSigningInspectionRpc(),
14
- queryKey: bundleSigningQueryKey,
15
- staleTime: 3e4
16
- });
17
- var useBundleSigningInspectionQuery = () => useQuery(getBundleSigningInspectionQueryOptions());
18
- function InspectionLoading() {
19
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
20
- "aria-label": "Loading bundle signing",
21
- className: "flex flex-col gap-6",
22
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Card, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(CardHeader, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Skeleton, { className: "h-4 w-36" }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Skeleton, { className: "h-3 w-4/5" })] }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(CardContent, {
23
- className: "flex flex-col gap-4",
24
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Skeleton, { className: "h-12 w-full" }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Skeleton, { className: "h-12 w-full" })]
25
- })] }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Card, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(CardHeader, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Skeleton, { className: "h-4 w-28" }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Skeleton, { className: "h-3 w-3/5" })] }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CardContent, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Skeleton, { className: "h-56 w-full" }) })] })]
26
- });
27
- }
28
- function InspectionError({ refetch }) {
29
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Alert, {
30
- variant: "destructive",
31
- children: [
32
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TriangleAlert, { "aria-hidden": "true" }),
33
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AlertTitle, { children: "Bundle signing couldn't be loaded" }),
34
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AlertDescription, { children: "Check the Console connection and try again." }),
35
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AlertAction, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Button$1, {
36
- onClick: refetch,
37
- size: "xs",
38
- variant: "outline",
39
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(RefreshCw, { "data-icon": "inline-start" }), "Retry"]
40
- }) })
41
- ]
42
- });
43
- }
44
- function SigningStatusCard({ inspection }) {
45
- const enabled = inspection.status === "enabled";
46
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Card, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(CardHeader, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
47
- className: "flex flex-wrap items-center justify-between gap-2",
48
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(CardTitle, {
49
- className: "text-sm font-medium",
50
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { children: "Signing status" })
51
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Badge, {
52
- variant: enabled ? "default" : "outline",
53
- children: enabled ? "Enabled" : "Disabled"
54
- })]
55
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CardDescription, { children: enabled ? "Bundle signing is enabled in the current Hot Updater configuration." : "Bundle signing is disabled in the current Hot Updater configuration." })] }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CardContent, {
56
- className: "flex flex-col gap-5",
57
- children: inspection.status === "disabled" ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Alert, { children: [
58
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Info, { "aria-hidden": "true" }),
59
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AlertTitle, { children: "Configure signing outside the Console" }),
60
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AlertDescription, { children: "Use your signing provider or the Hot Updater CLI to configure a key. The Console never creates or stores private keys." })
61
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("dl", {
62
- className: "grid gap-4 sm:grid-cols-2",
63
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
64
- className: "flex min-w-0 flex-col gap-1",
65
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("dt", {
66
- className: "text-xs text-muted-foreground",
67
- children: "Provider"
68
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("dd", {
69
- className: "truncate text-sm font-medium",
70
- children: inspection.provider
71
- })]
72
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
73
- className: "flex min-w-0 flex-col gap-1",
74
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("dt", {
75
- className: "text-xs text-muted-foreground",
76
- children: "Algorithm"
77
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("dd", {
78
- className: "text-sm font-medium",
79
- children: inspection.algorithm
80
- })]
81
- })]
82
- })
83
- })] });
84
- }
85
- function BundleSigningPage() {
86
- const inspection = useBundleSigningInspectionQuery();
87
- if (inspection.isLoading) return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(InspectionLoading, {});
88
- if (inspection.isError || !inspection.data) return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(InspectionError, { refetch: () => void inspection.refetch() });
89
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
90
- className: "flex flex-col gap-6",
91
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(SigningStatusCard, { inspection: inspection.data }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Alert, { children: [
92
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CircleCheck, { "aria-hidden": "true" }),
93
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AlertTitle, { children: "Read-only inspection" }),
94
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AlertDescription, { children: "Configure or rotate signing keys through the provider or Hot Updater CLI. The Console never accesses signing credentials." })
95
- ] })]
96
- });
97
- }
98
- function BundleSigningRoute() {
99
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
100
- className: "flex h-svh min-h-0 flex-col",
101
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("header", {
102
- className: "sticky top-0 z-10 flex shrink-0 flex-wrap items-center gap-x-3 gap-y-1 border-b bg-background px-3 py-3 sm:min-h-12 sm:flex-nowrap sm:bg-card/70 sm:px-4 sm:backdrop-blur-sm",
103
- children: [
104
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SidebarTrigger, { className: "-ml-1" }),
105
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
106
- className: "flex items-center gap-1.5",
107
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(ShieldCheck, {
108
- "aria-hidden": "true",
109
- className: "size-3.5 text-muted-foreground"
110
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h1", {
111
- className: "text-sm font-medium",
112
- children: "Bundle signing"
113
- })]
114
- }),
115
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Badge, {
116
- variant: "outline",
117
- children: "Read-only"
118
- }),
119
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
120
- className: "basis-full pl-9 text-xs text-muted-foreground sm:basis-auto sm:pl-0",
121
- children: "Inspect the public key used to verify signed updates."
122
- })
123
- ]
124
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
125
- className: "min-h-0 min-w-0 flex-1 overflow-y-auto bg-muted/5 p-3 sm:p-6",
126
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
127
- className: "mx-auto w-full max-w-5xl",
128
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(BundleSigningPage, {})
129
- })
130
- })]
131
- });
132
- }
133
- //#endregion
134
- export { BundleSigningRoute as component };
@@ -1,4 +0,0 @@
1
- //#region node_modules/.nitro/vite/services/ssr/assets/start-DpViQGnt.js
2
- var startInstance = void 0;
3
- //#endregion
4
- export { startInstance };
@@ -1,100 +0,0 @@
1
- //#region node_modules/.nitro/vite/services/ssr/assets/_tanstack-start-manifest_v-Cwpu0C9Q.js
2
- var tsrStartManifest = () => ({ routes: {
3
- __root__: {
4
- filePath: "/home/runner/work/hot-updater/hot-updater/packages/console/src/routes/__root.tsx",
5
- children: [
6
- "/",
7
- "/api-keys",
8
- "/insights",
9
- "/installations",
10
- "/signing",
11
- "/api/auth/$",
12
- "/api/bundles/$bundleId/download"
13
- ],
14
- preloads: [
15
- "/assets/index-BNkxg4jz.js",
16
- "/assets/createServerFn-DHc2erub.js",
17
- "/assets/preload-helper-uTix4PVD.js",
18
- "/assets/installations-DvjbUqd1.js",
19
- "/assets/loader-circle-Bbp8LGVC.js",
20
- "/assets/link-BG06whwB.js",
21
- "/assets/lazyRouteComponent-BN0MS05o.js",
22
- "/assets/chart-no-axes-combined-C0G0fQ3J.js",
23
- "/assets/shield-check-DoIiaaXU.js",
24
- "/assets/api-keys-api-LchP65vQ.js",
25
- "/assets/routes-DaPMY31P.js",
26
- "/assets/dist-Bh1gaDfB.js"
27
- ],
28
- scripts: [{ attrs: {
29
- type: "module",
30
- async: !0,
31
- src: "/assets/index-BNkxg4jz.js"
32
- } }]
33
- },
34
- "/": {
35
- filePath: "/home/runner/work/hot-updater/hot-updater/packages/console/src/routes/index.tsx",
36
- children: void 0,
37
- preloads: [
38
- "/assets/routes-BFE-oRIT.js",
39
- "/assets/dialog-dyZ1SphZ.js",
40
- "/assets/composite-CHTH1Xhh.js",
41
- "/assets/useCompositeListItem-BkPDaqyj.js",
42
- "/assets/table-BBEzJ7Xl.js",
43
- "/assets/input-group-BbHfaBzQ.js",
44
- "/assets/card-BEvx_QKh.js",
45
- "/assets/badge-BuMDU0Rf.js",
46
- "/assets/field-79SVH26s.js"
47
- ]
48
- },
49
- "/api-keys": {
50
- filePath: "/home/runner/work/hot-updater/hot-updater/packages/console/src/routes/api-keys.tsx",
51
- children: void 0,
52
- preloads: [
53
- "/assets/api-keys-C1sgC6ko.js",
54
- "/assets/dialog-dyZ1SphZ.js",
55
- "/assets/table-BBEzJ7Xl.js",
56
- "/assets/refresh-cw-DZgiAOMk.js",
57
- "/assets/card-BEvx_QKh.js",
58
- "/assets/badge-BuMDU0Rf.js",
59
- "/assets/field-79SVH26s.js"
60
- ]
61
- },
62
- "/insights": {
63
- filePath: "/home/runner/work/hot-updater/hot-updater/packages/console/src/routes/insights.tsx",
64
- children: void 0,
65
- preloads: [
66
- "/assets/insights-D_7uSKfc.js",
67
- "/assets/composite-CHTH1Xhh.js",
68
- "/assets/useCompositeListItem-BkPDaqyj.js",
69
- "/assets/InsightsPageHeader-C-Xc2MB9.js",
70
- "/assets/card-BEvx_QKh.js",
71
- "/assets/field-79SVH26s.js"
72
- ]
73
- },
74
- "/installations": {
75
- filePath: "/home/runner/work/hot-updater/hot-updater/packages/console/src/routes/installations.tsx",
76
- children: void 0,
77
- preloads: [
78
- "/assets/installations-BzoHWuXw.js",
79
- "/assets/InsightsPageHeader-C-Xc2MB9.js",
80
- "/assets/table-BBEzJ7Xl.js",
81
- "/assets/input-group-BbHfaBzQ.js",
82
- "/assets/refresh-cw-DZgiAOMk.js",
83
- "/assets/card-BEvx_QKh.js",
84
- "/assets/badge-BuMDU0Rf.js",
85
- "/assets/field-79SVH26s.js"
86
- ]
87
- },
88
- "/signing": {
89
- filePath: "/home/runner/work/hot-updater/hot-updater/packages/console/src/routes/signing.tsx",
90
- children: void 0,
91
- preloads: [
92
- "/assets/signing-BTRhaF5D.js",
93
- "/assets/refresh-cw-DZgiAOMk.js",
94
- "/assets/card-BEvx_QKh.js",
95
- "/assets/badge-BuMDU0Rf.js"
96
- ]
97
- }
98
- } });
99
- //#endregion
100
- export { tsrStartManifest };
@@ -1,95 +0,0 @@
1
- import { Area, AreaChart, CartesianGrid, XAxis, YAxis } from "recharts";
2
-
3
- import {
4
- ChartContainer,
5
- ChartLegend,
6
- ChartLegendContent,
7
- ChartTooltip,
8
- ChartTooltipContent,
9
- } from "@/components/ui/chart";
10
- import type { RecoverySeries } from "@/lib/insights-recovery";
11
-
12
- const config = {
13
- active: { label: "Active", color: "var(--chart-2)" },
14
- recoveredInstallations: {
15
- label: "Rollback",
16
- color: "var(--muted-foreground)",
17
- },
18
- };
19
- const formatDate = (ms: number) =>
20
- new Intl.DateTimeFormat("en", {
21
- month: "short",
22
- day: "numeric",
23
- timeZone: "UTC",
24
- }).format(ms);
25
-
26
- export function BundleActivityChart({
27
- series,
28
- }: {
29
- readonly series?: RecoverySeries;
30
- }) {
31
- if (!series)
32
- return (
33
- <p className="flex h-16 items-center justify-center border-t text-xs text-muted-foreground sm:h-20">
34
- No reports in 30 days. Check again after the app reports activity.
35
- </p>
36
- );
37
- return (
38
- <div className="border-t pt-3">
39
- <ChartContainer
40
- aria-label="Bundle activity over 30 days, UTC"
41
- className="h-32 w-full aspect-auto sm:h-40"
42
- config={config}
43
- >
44
- <AreaChart
45
- accessibilityLayer
46
- data={series.points}
47
- margin={{ left: -16, right: 4, top: 4 }}
48
- >
49
- <CartesianGrid vertical={false} />
50
- <XAxis
51
- axisLine={false}
52
- dataKey="startMs"
53
- minTickGap={28}
54
- tickFormatter={formatDate}
55
- tickLine={false}
56
- />
57
- <YAxis
58
- allowDecimals={false}
59
- axisLine={false}
60
- tickLine={false}
61
- width={40}
62
- />
63
- <ChartLegend content={<ChartLegendContent />} />
64
- <ChartTooltip
65
- content={
66
- <ChartTooltipContent
67
- labelFormatter={(_, payload) =>
68
- `${formatDate(payload[0]?.payload.startMs)} · UTC`
69
- }
70
- />
71
- }
72
- />
73
- <Area
74
- dataKey="active"
75
- fill="var(--color-active)"
76
- fillOpacity={0.12}
77
- isAnimationActive={false}
78
- stroke="var(--color-active)"
79
- strokeWidth={2}
80
- type="linear"
81
- />
82
- <Area
83
- dataKey="recoveredInstallations"
84
- fill="var(--color-recoveredInstallations)"
85
- fillOpacity={0.04}
86
- isAnimationActive={false}
87
- stroke="var(--color-recoveredInstallations)"
88
- strokeWidth={1.5}
89
- type="linear"
90
- />
91
- </AreaChart>
92
- </ChartContainer>
93
- </div>
94
- );
95
- }
@@ -1,121 +0,0 @@
1
- import { Button } from "@/components/ui/button";
2
- import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
3
- import { Skeleton } from "@/components/ui/skeleton";
4
- import {
5
- useBundleActivityQuery,
6
- type BundleActivityInput,
7
- } from "@/lib/bundle-activity";
8
- import type { RecoveryReport } from "@/lib/insights-recovery";
9
-
10
- import { BundleActivityChart } from "./BundleActivityChart";
11
-
12
- export function BundleMovementSummary({
13
- report,
14
- loading = false,
15
- }: {
16
- readonly report?: RecoveryReport;
17
- readonly loading?: boolean;
18
- }) {
19
- if (!report)
20
- return loading ? (
21
- <Skeleton aria-label="Loading bundle activity" className="h-4 w-32" />
22
- ) : (
23
- <span
24
- aria-label="30-day bundle activity unavailable"
25
- className="text-sm text-muted-foreground"
26
- >
27
- —
28
- </span>
29
- );
30
- const series = report.series[0];
31
- return (
32
- <div
33
- role="group"
34
- aria-label="Bundle activity over 30 days"
35
- title={
36
- report.truncated
37
- ? "Partial history. Counts include only the available reports."
38
- : "Active: last observed ID per installation. Rollbacks: distinct installations recovered from this ID in 30 days."
39
- }
40
- className="flex min-w-[140px] items-baseline gap-3 whitespace-nowrap"
41
- >
42
- <span className="flex items-baseline gap-1.5">
43
- <span className="text-xs text-muted-foreground">Active</span>
44
- <span className="text-sm font-medium tabular-nums">
45
- {series?.activeInstallations ?? 0}
46
- </span>
47
- </span>
48
- <span className="flex items-baseline gap-1.5">
49
- <span className="text-xs text-muted-foreground">Rollback</span>
50
- <span className="text-sm font-medium tabular-nums">
51
- {series?.recoveredInstallations ?? 0}
52
- </span>
53
- </span>
54
- {report.truncated ? (
55
- <span className="text-xs text-muted-foreground">Partial</span>
56
- ) : null}
57
- </div>
58
- );
59
- }
60
-
61
- export function BundleInsightsSummary({
62
- input,
63
- }: {
64
- readonly input: BundleActivityInput;
65
- }) {
66
- const query = useBundleActivityQuery([input]);
67
- const report = query.data?.[input.releaseId];
68
- const series = report?.series[0];
69
- return (
70
- <Card>
71
- <CardHeader className="px-4 pt-4 pb-3">
72
- <CardTitle className="text-sm font-medium">
73
- Activity · 30 days
74
- </CardTitle>
75
- </CardHeader>
76
- <CardContent className="flex flex-col gap-3 px-4 pb-4">
77
- {query.isPending ? (
78
- <Skeleton
79
- aria-label="Loading bundle activity"
80
- className="h-32 w-full"
81
- />
82
- ) : query.error ? (
83
- <div className="flex items-center justify-between gap-3 text-sm text-muted-foreground">
84
- Insights unavailable
85
- <Button
86
- variant="outline"
87
- size="sm"
88
- onClick={() => void query.refetch()}
89
- >
90
- Retry
91
- </Button>
92
- </div>
93
- ) : (
94
- <>
95
- <dl className="grid grid-cols-2 divide-x divide-border/70">
96
- <div className="pr-4">
97
- <dt className="text-xs text-muted-foreground">Active</dt>
98
- <dd className="mt-1 text-xl font-semibold tabular-nums">
99
- {series?.activeInstallations ?? 0}
100
- </dd>
101
- </div>
102
- <div className="pl-4">
103
- <dt className="text-xs text-muted-foreground">
104
- Rollback · 30d
105
- </dt>
106
- <dd className="mt-1 text-xl font-semibold tabular-nums">
107
- {series?.recoveredInstallations ?? 0}
108
- </dd>
109
- </div>
110
- </dl>
111
- <BundleActivityChart series={series} />
112
- <p className="text-xs text-muted-foreground">
113
- Last observed active installations · daily rollbacks
114
- {report?.truncated ? " · Partial history" : ""}
115
- </p>
116
- </>
117
- )}
118
- </CardContent>
119
- </Card>
120
- );
121
- }
@@ -1,139 +0,0 @@
1
- import { AlertTriangle, CheckCircle2, Info, RefreshCw } from "lucide-react";
2
-
3
- import {
4
- Alert,
5
- AlertAction,
6
- AlertDescription,
7
- AlertTitle,
8
- } from "@/components/ui/alert";
9
- import { Badge } from "@/components/ui/badge";
10
- import { Button } from "@/components/ui/button";
11
- import {
12
- Card,
13
- CardContent,
14
- CardDescription,
15
- CardHeader,
16
- CardTitle,
17
- } from "@/components/ui/card";
18
- import { Skeleton } from "@/components/ui/skeleton";
19
- import { useBundleSigningInspectionQuery } from "@/lib/bundle-signing-api";
20
- import type { BundleSigningInspection } from "@/lib/bundle-signing-rpc";
21
-
22
- function InspectionLoading() {
23
- return (
24
- <div aria-label="Loading bundle signing" className="flex flex-col gap-6">
25
- <Card>
26
- <CardHeader>
27
- <Skeleton className="h-4 w-36" />
28
- <Skeleton className="h-3 w-4/5" />
29
- </CardHeader>
30
- <CardContent className="flex flex-col gap-4">
31
- <Skeleton className="h-12 w-full" />
32
- <Skeleton className="h-12 w-full" />
33
- </CardContent>
34
- </Card>
35
- <Card>
36
- <CardHeader>
37
- <Skeleton className="h-4 w-28" />
38
- <Skeleton className="h-3 w-3/5" />
39
- </CardHeader>
40
- <CardContent>
41
- <Skeleton className="h-56 w-full" />
42
- </CardContent>
43
- </Card>
44
- </div>
45
- );
46
- }
47
-
48
- function InspectionError({ refetch }: { readonly refetch: () => void }) {
49
- return (
50
- <Alert variant="destructive">
51
- <AlertTriangle aria-hidden="true" />
52
- <AlertTitle>Bundle signing couldn't be loaded</AlertTitle>
53
- <AlertDescription>
54
- Check the Console connection and try again.
55
- </AlertDescription>
56
- <AlertAction>
57
- <Button onClick={refetch} size="xs" variant="outline">
58
- <RefreshCw data-icon="inline-start" />
59
- Retry
60
- </Button>
61
- </AlertAction>
62
- </Alert>
63
- );
64
- }
65
-
66
- function SigningStatusCard({
67
- inspection,
68
- }: {
69
- readonly inspection: BundleSigningInspection;
70
- }) {
71
- const enabled = inspection.status === "enabled";
72
- const status = enabled ? "Enabled" : "Disabled";
73
-
74
- return (
75
- <Card>
76
- <CardHeader>
77
- <div className="flex flex-wrap items-center justify-between gap-2">
78
- <CardTitle className="text-sm font-medium">
79
- <h2>Signing status</h2>
80
- </CardTitle>
81
- <Badge variant={enabled ? "default" : "outline"}>{status}</Badge>
82
- </div>
83
- <CardDescription>
84
- {enabled
85
- ? "Bundle signing is enabled in the current Hot Updater configuration."
86
- : "Bundle signing is disabled in the current Hot Updater configuration."}
87
- </CardDescription>
88
- </CardHeader>
89
- <CardContent className="flex flex-col gap-5">
90
- {inspection.status === "disabled" ? (
91
- <Alert>
92
- <Info aria-hidden="true" />
93
- <AlertTitle>Configure signing outside the Console</AlertTitle>
94
- <AlertDescription>
95
- Use your signing provider or the Hot Updater CLI to configure a
96
- key. The Console never creates or stores private keys.
97
- </AlertDescription>
98
- </Alert>
99
- ) : (
100
- <dl className="grid gap-4 sm:grid-cols-2">
101
- <div className="flex min-w-0 flex-col gap-1">
102
- <dt className="text-xs text-muted-foreground">Provider</dt>
103
- <dd className="truncate text-sm font-medium">
104
- {inspection.provider}
105
- </dd>
106
- </div>
107
- <div className="flex min-w-0 flex-col gap-1">
108
- <dt className="text-xs text-muted-foreground">Algorithm</dt>
109
- <dd className="text-sm font-medium">{inspection.algorithm}</dd>
110
- </div>
111
- </dl>
112
- )}
113
- </CardContent>
114
- </Card>
115
- );
116
- }
117
-
118
- export function BundleSigningPage() {
119
- const inspection = useBundleSigningInspectionQuery();
120
-
121
- if (inspection.isLoading) return <InspectionLoading />;
122
- if (inspection.isError || !inspection.data) {
123
- return <InspectionError refetch={() => void inspection.refetch()} />;
124
- }
125
-
126
- return (
127
- <div className="flex flex-col gap-6">
128
- <SigningStatusCard inspection={inspection.data} />
129
- <Alert>
130
- <CheckCircle2 aria-hidden="true" />
131
- <AlertTitle>Read-only inspection</AlertTitle>
132
- <AlertDescription>
133
- Configure or rotate signing keys through the provider or Hot Updater
134
- CLI. The Console never accesses signing credentials.
135
- </AlertDescription>
136
- </Alert>
137
- </div>
138
- );
139
- }
@@ -1,14 +0,0 @@
1
- import { useQuery } from "@tanstack/react-query";
2
-
3
- import { getBundleSigningInspectionRpc } from "./bundle-signing-rpc";
4
-
5
- export const bundleSigningQueryKey = ["bundle-signing"] as const;
6
-
7
- export const getBundleSigningInspectionQueryOptions = () => ({
8
- queryFn: () => getBundleSigningInspectionRpc(),
9
- queryKey: bundleSigningQueryKey,
10
- staleTime: 30_000,
11
- });
12
-
13
- export const useBundleSigningInspectionQuery = () =>
14
- useQuery(getBundleSigningInspectionQueryOptions());
@@ -1,16 +0,0 @@
1
- import { createServerFn } from "@tanstack/react-start";
2
-
3
- export type { BundleSigningInspection } from "./server/bundle-signing.server";
4
-
5
- export const getBundleSigningInspection = async () => {
6
- const [{ prepareConfig }, { inspectBundleSigning }] = await Promise.all([
7
- import("./server/config.server"),
8
- import("./server/bundle-signing.server"),
9
- ]);
10
- const { config } = await prepareConfig();
11
- return inspectBundleSigning(config.signing);
12
- };
13
-
14
- export const getBundleSigningInspectionRpc = createServerFn({
15
- method: "GET",
16
- }).handler(getBundleSigningInspection);
@@ -1,23 +0,0 @@
1
- import type { ConsoleSigningConfig } from "../../index";
2
-
3
- const DEFAULT_PROVIDER = "Configured provider";
4
-
5
- export type BundleSigningInspection =
6
- | { readonly status: "disabled" }
7
- | {
8
- readonly status: "enabled";
9
- readonly provider: string;
10
- readonly algorithm: "RSA-SHA256";
11
- };
12
-
13
- export const inspectBundleSigning = async (
14
- signing: ConsoleSigningConfig | undefined,
15
- ): Promise<BundleSigningInspection> => {
16
- if (!signing?.enabled) return { status: "disabled" };
17
-
18
- return {
19
- algorithm: "RSA-SHA256",
20
- provider: signing.provider ?? DEFAULT_PROVIDER,
21
- status: "enabled",
22
- };
23
- };