@hot-updater/console 1.0.0-rc.9 → 1.0.0

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 (341) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/ConsoleFeatureUnavailable-jB4Loglh.js +1 -0
  3. package/.output/public/assets/EventDetails-B6yUsyNA.js +1 -0
  4. package/.output/public/assets/HashValueDisplay-BFX_kY3-.js +1 -0
  5. package/.output/public/assets/InsightsInfo-BNO0WznZ.js +1 -0
  6. package/.output/public/assets/InsightsPageHeader-B892oVml.js +1 -0
  7. package/.output/public/assets/NotFoundPage-DIqCpWa3.js +1 -0
  8. package/.output/public/assets/alert-dialog-Bbk_4-WJ.js +1 -0
  9. package/.output/public/assets/api-DCM0wr6O.js +1 -0
  10. package/.output/public/assets/api-keys-CIO9L_wu.js +1 -0
  11. package/.output/public/assets/api-keys-DVTL_--f.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-BH5m_PtQ.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-6o51GkFe.js +11 -0
  22. package/.output/public/assets/input-group-ja_30qaF.js +1 -0
  23. package/.output/public/assets/insights-CmraDzQh.js +1 -0
  24. package/.output/public/assets/insights-CxZ2GCYV.js +2 -0
  25. package/.output/public/assets/insights-api-BigAU9sZ.js +1 -0
  26. package/.output/public/assets/insights-usage-rpc-DYEhsCKT.js +1 -0
  27. package/.output/public/assets/insights-vNRCrfnS.js +42 -0
  28. package/.output/public/assets/insights_.distribution-ChOerfJt.js +1 -0
  29. package/.output/public/assets/insights_.distribution-D-e4iga8.js +1 -0
  30. package/.output/public/assets/insights_.distribution-DZtkibX1.js +2 -0
  31. package/.output/public/assets/installations-BazSJXE0.js +2 -0
  32. package/.output/public/assets/installations-ClHTqdAO.js +1 -0
  33. package/.output/public/assets/installations-DpKsBuHi.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-BWwHOkCK.js +1 -0
  38. package/.output/public/assets/remote-config-Br56BODb.js +6 -0
  39. package/.output/public/assets/remote-config-CXOi0LRu.js +1 -0
  40. package/.output/public/assets/routes-B88Erkpk.js +2 -0
  41. package/.output/public/assets/routes-CfzsAleC.js +1 -0
  42. package/.output/public/assets/search-DaTDPW25.js +1 -0
  43. package/.output/public/assets/select-BZZBXMkr.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-DTGEAJFv.css +2 -0
  47. package/.output/public/assets/switch-DZ1TPwx-.js +1 -0
  48. package/.output/public/assets/table-Gm4qRWwE.js +1 -0
  49. package/.output/public/assets/tabs-C7FOEjFC.js +1 -0
  50. package/.output/public/assets/undo-2-CmrHjwFc.js +1 -0
  51. package/.output/public/assets/useCompositeListItem-9E4pj_CH.js +1 -0
  52. package/.output/public/assets/valueToPercent-CH8GCHaL.js +1 -0
  53. package/.output/server/__23tanstack-start-server-fn-resolver-BpRlos5Q.mjs +170 -0
  54. package/.output/server/_libs/@base-ui/react+[...].mjs +4389 -4207
  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 +221 -9
  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-x94o9rlU.mjs +13 -0
  67. package/.output/server/_ssr/ConsoleFeatureUnavailable-ldW8v8-q.mjs +58 -0
  68. package/.output/server/_ssr/EventDetails-Q8kfj9Nr.mjs +344 -0
  69. package/.output/server/_ssr/{HashValueDisplay-CyMmr0O9.mjs → HashValueDisplay-n1GholGS.mjs} +3 -3
  70. package/.output/server/_ssr/InsightsInfo-DuJFatQO.mjs +75 -0
  71. package/.output/server/_ssr/InsightsPageHeader-BSUX3Ye9.mjs +145 -0
  72. package/.output/server/_ssr/NotFoundPage-DZzOOzS3.mjs +37 -0
  73. package/.output/server/_ssr/{dialog-CKvQ4VIE.mjs → alert-dialog-C43Doa0I.mjs} +6 -83
  74. package/.output/server/_ssr/{api-keys-CzZ7Ont4.mjs → api-keys-B4sYm8dM.mjs} +48 -9
  75. package/.output/server/_ssr/api-keys-CEnM9fqG.mjs +5 -0
  76. package/.output/server/_ssr/api-keys-rpc-BIFuUgMt.mjs +52 -0
  77. package/.output/server/_ssr/api-oZjRn9tP.mjs +186 -0
  78. package/.output/server/_ssr/api-rpc-BNiFRRK8.mjs +240 -0
  79. package/.output/server/_ssr/{auth-BF8mbAgF.mjs → auth-UP0wXs4i.mjs} +1 -1
  80. package/.output/server/_ssr/{auth-rpc-DH6Bhwcz.mjs → auth-rpc-DnZqYxyq.mjs} +6 -6
  81. package/.output/server/_ssr/auth.server-DFpyxRDd.mjs +5374 -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-DskXCAyI.mjs +35 -0
  85. package/.output/server/_ssr/console-access-BJfAXknd.mjs +17 -0
  86. package/.output/server/_ssr/console-features-Oz0q20jJ.mjs +61 -0
  87. package/.output/server/_ssr/console-features-api-C9kiKvaV.mjs +43 -0
  88. package/.output/server/_ssr/console-features-rpc-P0GL7Z-R.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-CPphvbag.mjs +73 -0
  94. package/.output/server/_ssr/dialog-BbYDMjdC.mjs +84 -0
  95. package/.output/server/_ssr/{dist-CyzPaI5v.mjs → dist-CbQbBIw-.mjs} +140 -7
  96. package/.output/server/_ssr/{downloadBundle-CI7JUKvC.mjs → downloadBundle-CZysjmNW.mjs} +10 -10
  97. package/.output/server/_ssr/empty-CVLGfxuu.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-asw83X0v.mjs +189 -0
  101. package/.output/server/_ssr/getBundleChildren-Cv9iz1As.mjs +22 -0
  102. package/.output/server/_ssr/{input-group-BrGSjz4S.mjs → input-group-CuYJHosb.mjs} +2 -2
  103. package/.output/server/_ssr/insights-B55FG5fm.mjs +14 -0
  104. package/.output/server/_ssr/insights-CWnHIFUV.mjs +5 -0
  105. package/.output/server/_ssr/insights-CpLpedFZ.mjs +2315 -0
  106. package/.output/server/_ssr/insights-api-sjws23WF.mjs +122 -0
  107. package/.output/server/_ssr/insights-errors-BjnFUyZj.mjs +34 -0
  108. package/.output/server/_ssr/insights-failures-rpc-BvbWvqNf.mjs +36 -0
  109. package/.output/server/_ssr/insights-failures-xaa41Buf.mjs +46 -0
  110. package/.output/server/_ssr/insights-recovery-BWQhiZaF.mjs +28 -0
  111. package/.output/server/_ssr/insights-recovery-rpc-GiYXdkaY.mjs +32 -0
  112. package/.output/server/_ssr/{insights-rpc-DDKmIrpV.mjs → insights-rpc-DP_8Rmz4.mjs} +22 -14
  113. package/.output/server/_ssr/insights-usage-BpBM0U0c.mjs +29 -0
  114. package/.output/server/_ssr/insights-usage-rpc-BiolgB8e.mjs +29 -0
  115. package/.output/server/_ssr/insights-usage-rpc-KStL0zOx.mjs +41 -0
  116. package/.output/server/_ssr/insightsUsage-CzhVjsc8.mjs +56 -0
  117. package/.output/server/_ssr/insights_.distribution-CVrnbP3R.mjs +7 -0
  118. package/.output/server/_ssr/insights_.distribution-D2HaNTAA.mjs +16 -0
  119. package/.output/server/_ssr/{insights_.distribution-cIsU-kHG.mjs → insights_.distribution-DN9pR422.mjs} +50 -22
  120. package/.output/server/_ssr/installations-BHmbbnH8.mjs +5 -0
  121. package/.output/server/_ssr/{installations-C5anhyP0.mjs → installations-BSCmFq8Q.mjs} +279 -367
  122. package/.output/server/_ssr/installations-DD1g__Nc.mjs +69 -0
  123. package/.output/server/_ssr/listReleases-BfUBlCHo.mjs +79 -0
  124. package/.output/server/_ssr/plugins-BaD1slHx.mjs +2086 -0
  125. package/.output/server/_ssr/release-adoption-005tQRpo.mjs +55 -0
  126. package/.output/server/_ssr/release-adoption-rpc-BsstqxUp.mjs +41 -0
  127. package/.output/server/_ssr/releaseAdoption-CtOFkwli.mjs +114 -0
  128. package/.output/server/_ssr/releaseManagement-DFMUnDF5.mjs +11 -0
  129. package/.output/server/_ssr/remote-config-C2Ee8lXO.mjs +5 -0
  130. package/.output/server/_ssr/remote-config-Dv1ccMo-.mjs +17 -0
  131. package/.output/server/_ssr/remote-config-of0lGQH8.mjs +2648 -0
  132. package/.output/server/_ssr/remote-config-rpc-BzX31mUS.mjs +115 -0
  133. package/.output/server/_ssr/rolldown-runtime-rSIU-vHC.mjs +13 -0
  134. package/.output/server/_ssr/{router-BuanSsRI.mjs → router-D8NuoJ_I.mjs} +107 -134
  135. package/.output/server/_ssr/{routes-DY-vqU6R.mjs → routes-DgvnFqDy.mjs} +195 -429
  136. package/.output/server/_ssr/routes-V8sDybGf.mjs +409 -0
  137. package/.output/server/_ssr/runtime.server-De0QVWc9.mjs +104 -0
  138. package/.output/server/_ssr/schema-BiAVyEj2.mjs +361 -0
  139. package/.output/server/_ssr/{select-DD2szs3Y.mjs → select-t3iXRwc9.mjs} +3 -3
  140. package/.output/server/_ssr/server-h4VxnExB.mjs +8325 -0
  141. package/.output/server/_ssr/{createSsrRpc-CdlfejmI.mjs → sidebar-DJcErBMo.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-E-btwMGt.mjs +43 -0
  145. package/.output/server/_ssr/{table-CTj6n-4F.mjs → table-37Dd23TN.mjs} +2 -2
  146. package/.output/server/_ssr/tabs-DEFnTm95.mjs +45 -0
  147. package/.output/server/_ssr/updateFailures-H6pnnYK4.mjs +40 -0
  148. package/.output/server/_ssr/{uuidv7-D0QFkPL_.mjs → uuidv7-C88s9jWF.mjs} +2 -2
  149. package/.output/server/_tanstack-start-manifest_v-55AGsehh.mjs +139 -0
  150. package/.output/server/index.mjs +309 -211
  151. package/LICENSE +13 -14
  152. package/README.md +80 -71
  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 +69 -74
  158. package/src/components/ConsoleFeatureUnavailable.tsx +80 -0
  159. package/src/components/NotFoundPage.tsx +7 -7
  160. package/src/components/features/FeatureSlots.tsx +103 -0
  161. package/src/components/features/api-keys/apiKeysFeatureUi.tsx +15 -0
  162. package/src/components/features/bundles/BundleMetadata.tsx +8 -5
  163. package/src/components/features/bundles/RolloutCohortsDialog.tsx +1 -1
  164. package/src/components/features/channels/ChannelManagementDialog.tsx +8 -6
  165. package/src/components/features/insights/AppUsage.tsx +41 -14
  166. package/src/components/features/insights/BuiltinBundle.tsx +36 -0
  167. package/src/components/features/insights/ComparedBundlesChart.tsx +310 -0
  168. package/src/components/features/insights/EstimatedCount.tsx +18 -0
  169. package/src/components/features/insights/EventDetails.tsx +390 -26
  170. package/src/components/features/insights/EventHistoryCard.tsx +111 -25
  171. package/src/components/features/insights/EventHistoryList.tsx +1 -1
  172. package/src/components/features/insights/FailureReports.tsx +407 -0
  173. package/src/components/features/insights/InsightsControls.tsx +240 -142
  174. package/src/components/features/insights/InsightsErrorAlert.tsx +14 -1
  175. package/src/components/features/insights/InsightsOverview.tsx +601 -403
  176. package/src/components/features/insights/InsightsPageHeader.tsx +19 -14
  177. package/src/components/features/insights/InsightsPeriodSelector.tsx +67 -12
  178. package/src/components/features/insights/InstallationHistoryCard.tsx +65 -10
  179. package/src/components/features/insights/InstallationMatchesCard.tsx +1 -1
  180. package/src/components/features/insights/ReleaseActivity.tsx +308 -0
  181. package/src/components/features/insights/ReportingDevicesSummary.tsx +13 -13
  182. package/src/components/features/insights/RollbackButton.tsx +118 -0
  183. package/src/components/features/insights/UpdateFailures.tsx +382 -0
  184. package/src/components/features/insights/insightsFeatureUi.tsx +35 -0
  185. package/src/components/features/releases/ReleaseEditorSheet.tsx +27 -13
  186. package/src/components/features/remote-config/ConditionDialog.tsx +592 -0
  187. package/src/components/features/remote-config/ConditionsCard.tsx +247 -0
  188. package/src/components/features/remote-config/ParameterDialog.tsx +426 -0
  189. package/src/components/features/remote-config/ParametersCard.tsx +254 -0
  190. package/src/components/features/remote-config/PreviewCard.tsx +284 -0
  191. package/src/components/features/remote-config/PublishDialog.tsx +325 -0
  192. package/src/components/features/remote-config/RemoteConfigPage.tsx +353 -0
  193. package/src/components/features/remote-config/RuleSummary.tsx +21 -0
  194. package/src/components/features/remote-config/ValueInput.tsx +151 -0
  195. package/src/components/features/remote-config/VersionsCard.tsx +384 -0
  196. package/src/components/features/remote-config/remoteConfigFeatureUi.tsx +15 -0
  197. package/src/components/features/remote-config/useDateTimeText.ts +16 -0
  198. package/src/components/ui/sidebar.tsx +22 -29
  199. package/src/index.ts +26 -19
  200. package/src/lib/api-keys-api.ts +0 -28
  201. package/src/lib/api-keys-rpc.ts +27 -38
  202. package/src/lib/api-rpc.ts +125 -288
  203. package/src/lib/api.ts +15 -134
  204. package/src/lib/bundle-activity.ts +24 -4
  205. package/src/lib/console-access.ts +20 -0
  206. package/src/lib/console-features-api.ts +68 -0
  207. package/src/lib/console-features-rpc.ts +13 -0
  208. package/src/lib/console-features.ts +98 -0
  209. package/src/lib/insights-api.ts +56 -2
  210. package/src/lib/insights-errors.ts +64 -0
  211. package/src/lib/insights-failures-rpc.ts +36 -0
  212. package/src/lib/insights-failures.ts +130 -0
  213. package/src/lib/insights-recovery-rpc.ts +13 -17
  214. package/src/lib/insights-recovery.ts +12 -36
  215. package/src/lib/insights-retention.ts +21 -0
  216. package/src/lib/insights-rpc.ts +30 -12
  217. package/src/lib/insights-search.ts +50 -4
  218. package/src/lib/insights-usage-rpc.ts +15 -9
  219. package/src/lib/insights-usage.ts +41 -3
  220. package/src/lib/insights-view.ts +34 -5
  221. package/src/lib/release-adoption-api.ts +214 -0
  222. package/src/lib/release-adoption-rpc.ts +49 -0
  223. package/src/lib/release-adoption.ts +164 -0
  224. package/src/lib/remote-config-api.ts +119 -0
  225. package/src/lib/remote-config-draft.ts +666 -0
  226. package/src/lib/remote-config-rpc.ts +196 -0
  227. package/src/lib/scroll-restoration.ts +21 -0
  228. package/src/lib/server/auth.server.ts +13 -5
  229. package/src/lib/server/bundleActivity.ts +27 -28
  230. package/src/lib/server/config.server.ts +21 -76
  231. package/src/lib/server/console-feature-apis.ts +70 -0
  232. package/src/lib/server/console-runtime.server.ts +82 -38
  233. package/src/lib/server/downloadBundle.ts +14 -15
  234. package/src/lib/server/failureReports.ts +50 -0
  235. package/src/lib/server/getBundleChildren.ts +31 -122
  236. package/src/lib/server/insightsUsage.ts +52 -113
  237. package/src/lib/server/listReleases.ts +109 -44
  238. package/src/lib/server/releaseAdoption.ts +151 -0
  239. package/src/lib/server/releaseReachability.ts +8 -8
  240. package/src/lib/server/remoteConfig.ts +75 -0
  241. package/src/lib/server/runtime.server.ts +120 -31
  242. package/src/lib/server/updateFailures.ts +66 -0
  243. package/src/lib/use-dialog-target.ts +27 -0
  244. package/src/routeTree.gen.ts +44 -44
  245. package/src/router.tsx +3 -2
  246. package/src/routes/-installations-search.ts +32 -8
  247. package/src/routes/-releases-search.ts +76 -29
  248. package/src/routes/__root.tsx +7 -1
  249. package/src/routes/api/bundles/$bundleId/download.ts +2 -5
  250. package/src/routes/api-keys.tsx +5 -2
  251. package/src/routes/index.tsx +210 -152
  252. package/src/routes/insights.tsx +91 -23
  253. package/src/routes/insights_.distribution.tsx +50 -9
  254. package/src/routes/installations.tsx +97 -40
  255. package/src/routes/remote-config.tsx +42 -0
  256. package/src/styles.css +9 -0
  257. package/src/vite-internal.ts +15 -3
  258. package/src/vite.ts +2 -0
  259. package/.output/public/assets/HashValueDisplay-BpTc3Oyg.js +0 -1
  260. package/.output/public/assets/InsightsPageHeader-DC2eEst8.js +0 -1
  261. package/.output/public/assets/api-CdUyUqzR.js +0 -42
  262. package/.output/public/assets/api-keys-64PM9PwW.js +0 -1
  263. package/.output/public/assets/api-keys-api-BeaJnvY5.js +0 -1
  264. package/.output/public/assets/arrow-left-04Rh8Zgp.js +0 -1
  265. package/.output/public/assets/card-CYHs5FZv.js +0 -1
  266. package/.output/public/assets/chart-no-axes-combined-DwyMsVFW.js +0 -1
  267. package/.output/public/assets/createServerFn-DU71xucx.js +0 -3
  268. package/.output/public/assets/dialog-IVMkBRCq.js +0 -1
  269. package/.output/public/assets/dist-BR4GzeEu.js +0 -1
  270. package/.output/public/assets/field-B3CYDpjg.js +0 -1
  271. package/.output/public/assets/index-Cb_D1D6N.js +0 -10
  272. package/.output/public/assets/info-C3y9HNoU.js +0 -1
  273. package/.output/public/assets/input-group-nLZylhWF.js +0 -1
  274. package/.output/public/assets/insights-Bm9v8uO3.js +0 -2
  275. package/.output/public/assets/insights-DS3iO7Up.js +0 -1
  276. package/.output/public/assets/insights-search-Byj3g3Mp.js +0 -1
  277. package/.output/public/assets/insights-usage-rpc-BaGR3lgq.js +0 -1
  278. package/.output/public/assets/insights_.distribution-B1i6cjlQ.js +0 -1
  279. package/.output/public/assets/insights_.distribution-C1Wf27eB.js +0 -2
  280. package/.output/public/assets/installations-CkFW4fV9.js +0 -2
  281. package/.output/public/assets/installations-DxTaIcHD.js +0 -1
  282. package/.output/public/assets/lazyRouteComponent-BapzjYnb.js +0 -1
  283. package/.output/public/assets/list-Dqt53fWZ.js +0 -1
  284. package/.output/public/assets/loader-circle-CUKfUqow.js +0 -1
  285. package/.output/public/assets/preload-helper-ClBMtM1g.js +0 -1
  286. package/.output/public/assets/refresh-cw-CNE_2PnD.js +0 -1
  287. package/.output/public/assets/routes-Cgtvspjg.js +0 -2
  288. package/.output/public/assets/routes-O2r2UUN8.js +0 -1
  289. package/.output/public/assets/shield-check-BFcJ46kz.js +0 -1
  290. package/.output/public/assets/signing-BgspC-xP.js +0 -1
  291. package/.output/public/assets/styles-DnrWuBwd.css +0 -2
  292. package/.output/public/assets/table-BuWQgxJJ.js +0 -1
  293. package/.output/public/assets/useMutation-CSV9NCUl.js +0 -1
  294. package/.output/public/assets/useOpenInteractionType-D5kduCTD.js +0 -1
  295. package/.output/public/assets/valueToPercent-BAtcbSLk.js +0 -1
  296. package/.output/server/__23tanstack-start-server-fn-resolver-DBRojHaG.mjs +0 -150
  297. package/.output/server/_ssr/InsightsPageHeader-mtxVuZKK.mjs +0 -64
  298. package/.output/server/_ssr/api-BfCgYlj5.mjs +0 -332
  299. package/.output/server/_ssr/api-keys-api-C3oeq01R.mjs +0 -60
  300. package/.output/server/_ssr/api-keys-rpc-CdPFdGOx.mjs +0 -136
  301. package/.output/server/_ssr/api-rpc-B2E1ZIG5.mjs +0 -1399
  302. package/.output/server/_ssr/auth.server-CmicHh0J.mjs +0 -47
  303. package/.output/server/_ssr/bundle-signing-rpc-Di7-I6fE.mjs +0 -16
  304. package/.output/server/_ssr/bundle-signing.server-Uqt1OF49.mjs +0 -12
  305. package/.output/server/_ssr/bundleActivity-pBrPSG01.mjs +0 -28
  306. package/.output/server/_ssr/card-Bemj0dpY.mjs +0 -108
  307. package/.output/server/_ssr/config-Dv8qLDZ0.mjs +0 -13
  308. package/.output/server/_ssr/config.server-B8WsT3s0.mjs +0 -368
  309. package/.output/server/_ssr/databaseRows-5bCRTxm-.mjs +0 -126
  310. package/.output/server/_ssr/deleteBundle-8X-jq7Z7.mjs +0 -66
  311. package/.output/server/_ssr/field-BrQ2u0fT.mjs +0 -74
  312. package/.output/server/_ssr/getBundleChildren-DoL8l_AS.mjs +0 -50
  313. package/.output/server/_ssr/insights-BwQ-wF2a.mjs +0 -10
  314. package/.output/server/_ssr/insights-gr1I_dJU.mjs +0 -938
  315. package/.output/server/_ssr/insights-recovery-Cv6RSyeR.mjs +0 -21
  316. package/.output/server/_ssr/insights-recovery-rpc-DOzxfYfv.mjs +0 -37
  317. package/.output/server/_ssr/insights-search-1czJMZgk.mjs +0 -21
  318. package/.output/server/_ssr/insights-usage-rpc-4ImOq_0p.mjs +0 -184
  319. package/.output/server/_ssr/insights-usage-rpc-BUruODjE.mjs +0 -24
  320. package/.output/server/_ssr/insightsContract-B09K_Px1.mjs +0 -303
  321. package/.output/server/_ssr/insightsHistory-Ci4rYAgl.mjs +0 -41
  322. package/.output/server/_ssr/insightsRecovery-CaghWL2t.mjs +0 -113
  323. package/.output/server/_ssr/insightsUsage-DNIj6jxF.mjs +0 -71
  324. package/.output/server/_ssr/insights_.distribution-VmHuikRE.mjs +0 -10
  325. package/.output/server/_ssr/installations-HXMF_kKf.mjs +0 -29
  326. package/.output/server/_ssr/routes-Dru3IRj0.mjs +0 -37
  327. package/.output/server/_ssr/runtime.server-CsiKFp_Z.mjs +0 -436
  328. package/.output/server/_ssr/server-DJm72Kj-.mjs +0 -7468
  329. package/.output/server/_ssr/signing-H8Lg4lPe.mjs +0 -133
  330. package/.output/server/_ssr/start-DpViQGnt.mjs +0 -4
  331. package/.output/server/_tanstack-start-manifest_v-DsFcTLw_.mjs +0 -125
  332. package/src/components/features/bundles/BundleActivityChart.tsx +0 -97
  333. package/src/components/features/bundles/BundleInsightsSummary.tsx +0 -126
  334. package/src/components/features/signing/BundleSigningPage.tsx +0 -139
  335. package/src/lib/bundle-signing-api.ts +0 -14
  336. package/src/lib/bundle-signing-rpc.ts +0 -16
  337. package/src/lib/server/bundle-signing.server.ts +0 -23
  338. package/src/lib/server/deleteBundle.ts +0 -145
  339. package/src/lib/server/insightsHistory.ts +0 -52
  340. package/src/lib/server/insightsRecovery.ts +0 -187
  341. package/src/routes/signing.tsx +0 -37
@@ -1,133 +0,0 @@
1
- import { c as createServerFn } from "./createServerFn-B2hcXoPM.mjs";
2
- import { mt 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-CdlfejmI.mjs";
5
- import { n as useQuery } from "../_libs/tanstack__react-query.mjs";
6
- import { a as Badge, c as CardDescription, d as CardTitle, i as AlertTitle, n as AlertAction, o as Card, r as AlertDescription, s as CardContent, t as Alert, u as CardHeader } from "./card-Bemj0dpY.mjs";
7
- //#region node_modules/.nitro/vite/services/ssr/assets/signing-H8Lg4lPe.js
8
- var import_jsx_runtime = require_jsx_runtime();
9
- var getBundleSigningInspectionRpc = createServerFn({ method: "GET" }).handler(createSsrRpc("662034966679a6d29db2b55e7ba665e26e6c9a58a5529f33aa857a2049616233"));
10
- var bundleSigningQueryKey = ["bundle-signing"];
11
- var getBundleSigningInspectionQueryOptions = () => ({
12
- queryFn: () => getBundleSigningInspectionRpc(),
13
- queryKey: bundleSigningQueryKey,
14
- staleTime: 3e4
15
- });
16
- var useBundleSigningInspectionQuery = () => useQuery(getBundleSigningInspectionQueryOptions());
17
- function InspectionLoading() {
18
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
19
- "aria-label": "Loading bundle signing",
20
- className: "flex flex-col gap-6",
21
- 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, {
22
- className: "flex flex-col gap-4",
23
- 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" })]
24
- })] }), /* @__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" }) })] })]
25
- });
26
- }
27
- function InspectionError({ refetch }) {
28
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Alert, {
29
- variant: "destructive",
30
- children: [
31
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TriangleAlert, { "aria-hidden": "true" }),
32
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AlertTitle, { children: "Bundle signing couldn't be loaded" }),
33
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AlertDescription, { children: "Check the Console connection and try again." }),
34
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AlertAction, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Button$1, {
35
- onClick: refetch,
36
- size: "xs",
37
- variant: "outline",
38
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(RefreshCw, { "data-icon": "inline-start" }), "Retry"]
39
- }) })
40
- ]
41
- });
42
- }
43
- function SigningStatusCard({ inspection }) {
44
- const enabled = inspection.status === "enabled";
45
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Card, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(CardHeader, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
46
- className: "flex flex-wrap items-center justify-between gap-2",
47
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(CardTitle, {
48
- className: "text-sm font-medium",
49
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { children: "Signing status" })
50
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Badge, {
51
- variant: enabled ? "default" : "outline",
52
- children: enabled ? "Enabled" : "Disabled"
53
- })]
54
- }), /* @__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, {
55
- className: "flex flex-col gap-5",
56
- children: inspection.status === "disabled" ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Alert, { children: [
57
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Info, { "aria-hidden": "true" }),
58
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AlertTitle, { children: "Configure signing outside the Console" }),
59
- /* @__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." })
60
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("dl", {
61
- className: "grid gap-4 sm:grid-cols-2",
62
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
63
- className: "flex min-w-0 flex-col gap-1",
64
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("dt", {
65
- className: "text-xs text-muted-foreground",
66
- children: "Provider"
67
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("dd", {
68
- className: "truncate text-sm font-medium",
69
- children: inspection.provider
70
- })]
71
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
72
- className: "flex min-w-0 flex-col gap-1",
73
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("dt", {
74
- className: "text-xs text-muted-foreground",
75
- children: "Algorithm"
76
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("dd", {
77
- className: "text-sm font-medium",
78
- children: inspection.algorithm
79
- })]
80
- })]
81
- })
82
- })] });
83
- }
84
- function BundleSigningPage() {
85
- const inspection = useBundleSigningInspectionQuery();
86
- if (inspection.isLoading) return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(InspectionLoading, {});
87
- if (inspection.isError || !inspection.data) return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(InspectionError, { refetch: () => void inspection.refetch() });
88
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
89
- className: "flex flex-col gap-6",
90
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(SigningStatusCard, { inspection: inspection.data }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Alert, { children: [
91
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CircleCheck, { "aria-hidden": "true" }),
92
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AlertTitle, { children: "Read-only inspection" }),
93
- /* @__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." })
94
- ] })]
95
- });
96
- }
97
- function BundleSigningRoute() {
98
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
99
- className: "flex h-svh min-h-0 flex-col",
100
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("header", {
101
- 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",
102
- children: [
103
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SidebarTrigger, { className: "-ml-1" }),
104
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
105
- className: "flex items-center gap-1.5",
106
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(ShieldCheck, {
107
- "aria-hidden": "true",
108
- className: "size-3.5 text-muted-foreground"
109
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h1", {
110
- className: "text-sm font-medium",
111
- children: "Bundle signing"
112
- })]
113
- }),
114
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Badge, {
115
- variant: "outline",
116
- children: "Read-only"
117
- }),
118
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
119
- className: "basis-full pl-9 text-xs text-muted-foreground sm:basis-auto sm:pl-0",
120
- children: "Inspect the public key used to verify signed updates."
121
- })
122
- ]
123
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
124
- className: "min-h-0 min-w-0 flex-1 overflow-y-auto bg-muted/5 p-3 sm:p-6",
125
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
126
- className: "mx-auto w-full max-w-5xl",
127
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(BundleSigningPage, {})
128
- })
129
- })]
130
- });
131
- }
132
- //#endregion
133
- 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,125 +0,0 @@
1
- //#region node_modules/.nitro/vite/services/ssr/assets/_tanstack-start-manifest_v-DsFcTLw_.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
- "/insights_/distribution",
12
- "/api/auth/$",
13
- "/api/bundles/$bundleId/download"
14
- ],
15
- preloads: [
16
- "/assets/index-Cb_D1D6N.js",
17
- "/assets/createServerFn-DU71xucx.js",
18
- "/assets/preload-helper-ClBMtM1g.js",
19
- "/assets/installations-CkFW4fV9.js",
20
- "/assets/useMutation-CSV9NCUl.js",
21
- "/assets/lazyRouteComponent-BapzjYnb.js",
22
- "/assets/chart-no-axes-combined-DwyMsVFW.js",
23
- "/assets/shield-check-BFcJ46kz.js",
24
- "/assets/info-C3y9HNoU.js",
25
- "/assets/api-keys-api-BeaJnvY5.js",
26
- "/assets/loader-circle-CUKfUqow.js",
27
- "/assets/routes-Cgtvspjg.js",
28
- "/assets/dist-BR4GzeEu.js",
29
- "/assets/insights-Bm9v8uO3.js",
30
- "/assets/insights_.distribution-C1Wf27eB.js"
31
- ],
32
- scripts: [{ attrs: {
33
- type: "module",
34
- async: !0,
35
- src: "/assets/index-Cb_D1D6N.js"
36
- } }]
37
- },
38
- "/": {
39
- filePath: "/home/runner/work/hot-updater/hot-updater/packages/console/src/routes/index.tsx",
40
- children: void 0,
41
- preloads: [
42
- "/assets/routes-O2r2UUN8.js",
43
- "/assets/dialog-IVMkBRCq.js",
44
- "/assets/valueToPercent-BAtcbSLk.js",
45
- "/assets/useOpenInteractionType-D5kduCTD.js",
46
- "/assets/api-CdUyUqzR.js",
47
- "/assets/field-B3CYDpjg.js",
48
- "/assets/list-Dqt53fWZ.js",
49
- "/assets/HashValueDisplay-BpTc3Oyg.js",
50
- "/assets/table-BuWQgxJJ.js",
51
- "/assets/card-CYHs5FZv.js",
52
- "/assets/input-group-nLZylhWF.js"
53
- ]
54
- },
55
- "/api-keys": {
56
- filePath: "/home/runner/work/hot-updater/hot-updater/packages/console/src/routes/api-keys.tsx",
57
- children: void 0,
58
- preloads: [
59
- "/assets/api-keys-64PM9PwW.js",
60
- "/assets/dialog-IVMkBRCq.js",
61
- "/assets/field-B3CYDpjg.js",
62
- "/assets/refresh-cw-CNE_2PnD.js",
63
- "/assets/table-BuWQgxJJ.js",
64
- "/assets/card-CYHs5FZv.js"
65
- ]
66
- },
67
- "/insights": {
68
- filePath: "/home/runner/work/hot-updater/hot-updater/packages/console/src/routes/insights.tsx",
69
- children: void 0,
70
- preloads: [
71
- "/assets/insights-DS3iO7Up.js",
72
- "/assets/valueToPercent-BAtcbSLk.js",
73
- "/assets/useOpenInteractionType-D5kduCTD.js",
74
- "/assets/insights-usage-rpc-BaGR3lgq.js",
75
- "/assets/api-CdUyUqzR.js",
76
- "/assets/InsightsPageHeader-DC2eEst8.js",
77
- "/assets/field-B3CYDpjg.js",
78
- "/assets/list-Dqt53fWZ.js",
79
- "/assets/table-BuWQgxJJ.js",
80
- "/assets/card-CYHs5FZv.js",
81
- "/assets/input-group-nLZylhWF.js"
82
- ]
83
- },
84
- "/installations": {
85
- filePath: "/home/runner/work/hot-updater/hot-updater/packages/console/src/routes/installations.tsx",
86
- children: void 0,
87
- preloads: [
88
- "/assets/installations-DxTaIcHD.js",
89
- "/assets/arrow-left-04Rh8Zgp.js",
90
- "/assets/InsightsPageHeader-DC2eEst8.js",
91
- "/assets/field-B3CYDpjg.js",
92
- "/assets/list-Dqt53fWZ.js",
93
- "/assets/refresh-cw-CNE_2PnD.js",
94
- "/assets/HashValueDisplay-BpTc3Oyg.js",
95
- "/assets/table-BuWQgxJJ.js",
96
- "/assets/card-CYHs5FZv.js",
97
- "/assets/input-group-nLZylhWF.js"
98
- ]
99
- },
100
- "/signing": {
101
- filePath: "/home/runner/work/hot-updater/hot-updater/packages/console/src/routes/signing.tsx",
102
- children: void 0,
103
- preloads: [
104
- "/assets/signing-BgspC-xP.js",
105
- "/assets/refresh-cw-CNE_2PnD.js",
106
- "/assets/card-CYHs5FZv.js"
107
- ]
108
- },
109
- "/insights_/distribution": {
110
- filePath: "/home/runner/work/hot-updater/hot-updater/packages/console/src/routes/insights_.distribution.tsx",
111
- children: void 0,
112
- preloads: [
113
- "/assets/insights_.distribution-B1i6cjlQ.js",
114
- "/assets/valueToPercent-BAtcbSLk.js",
115
- "/assets/insights-usage-rpc-BaGR3lgq.js",
116
- "/assets/arrow-left-04Rh8Zgp.js",
117
- "/assets/InsightsPageHeader-DC2eEst8.js",
118
- "/assets/field-B3CYDpjg.js",
119
- "/assets/card-CYHs5FZv.js",
120
- "/assets/insights-search-Byj3g3Mp.js"
121
- ]
122
- }
123
- } });
124
- //#endregion
125
- export { tsrStartManifest };
@@ -1,97 +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
- hour: "numeric",
24
- timeZone: "UTC",
25
- }).format(ms);
26
-
27
- export function BundleActivityChart({
28
- series,
29
- }: {
30
- readonly series?: RecoverySeries;
31
- }) {
32
- if (!series)
33
- return (
34
- <p className="flex h-16 items-center justify-center border-t text-xs text-muted-foreground sm:h-20">
35
- No reports in 24 hours. Check again after the app reports activity.
36
- </p>
37
- );
38
- return (
39
- <div className="border-t pt-3">
40
- <ChartContainer
41
- aria-label="Bundle activity over 24 hours, UTC"
42
- className="h-32 w-full aspect-auto sm:h-40"
43
- config={config}
44
- >
45
- <AreaChart
46
- accessibilityLayer
47
- data={series.points}
48
- margin={{ left: -16, right: 4, top: 4 }}
49
- >
50
- <CartesianGrid vertical={false} />
51
- <XAxis
52
- axisLine={false}
53
- dataKey="startMs"
54
- minTickGap={28}
55
- tickFormatter={formatDate}
56
- tickLine={false}
57
- />
58
- <YAxis
59
- allowDecimals={false}
60
- axisLine={false}
61
- tickLine={false}
62
- width={40}
63
- />
64
- <ChartLegend content={<ChartLegendContent />} />
65
- <ChartTooltip
66
- content={
67
- <ChartTooltipContent
68
- labelFormatter={(_, payload) =>
69
- `${formatDate(payload[0]?.payload.startMs)} · UTC`
70
- }
71
- />
72
- }
73
- />
74
- <Area
75
- dataKey="active"
76
- dot={{ r: 2 }}
77
- fill="var(--color-active)"
78
- fillOpacity={0.12}
79
- isAnimationActive={false}
80
- stroke="var(--color-active)"
81
- strokeWidth={2}
82
- type="linear"
83
- />
84
- <Area
85
- dataKey="recoveredInstallations"
86
- fill="var(--color-recoveredInstallations)"
87
- fillOpacity={0.04}
88
- isAnimationActive={false}
89
- stroke="var(--color-recoveredInstallations)"
90
- strokeWidth={1.5}
91
- type="linear"
92
- />
93
- </AreaChart>
94
- </ChartContainer>
95
- </div>
96
- );
97
- }
@@ -1,126 +0,0 @@
1
- import { useQuery } from "@tanstack/react-query";
2
-
3
- import { Button } from "@/components/ui/button";
4
- import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
5
- import { Skeleton } from "@/components/ui/skeleton";
6
- import type { BundleActivityInput } from "@/lib/bundle-activity";
7
- import type { RecoveryReport } from "@/lib/insights-recovery";
8
- import { getRecoveryReportRpc } from "@/lib/insights-recovery-rpc";
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 activityInput = { ...input, window: "24h" } as const;
67
- const query = useQuery({
68
- queryKey: ["rollout-activity", activityInput],
69
- queryFn: () => getRecoveryReportRpc({ data: activityInput }),
70
- staleTime: 30_000,
71
- });
72
- const report = query.data;
73
- const series = report?.series[0];
74
- return (
75
- <Card>
76
- <CardHeader className="px-4 pt-4 pb-3">
77
- <CardTitle className="text-sm font-medium">
78
- Activity · 24 hours
79
- </CardTitle>
80
- </CardHeader>
81
- <CardContent className="flex flex-col gap-3 px-4 pb-4">
82
- {query.isPending ? (
83
- <Skeleton
84
- aria-label="Loading bundle activity"
85
- className="h-32 w-full"
86
- />
87
- ) : query.error ? (
88
- <div className="flex items-center justify-between gap-3 text-sm text-muted-foreground">
89
- Insights unavailable
90
- <Button
91
- variant="outline"
92
- size="sm"
93
- onClick={() => void query.refetch()}
94
- >
95
- Retry
96
- </Button>
97
- </div>
98
- ) : (
99
- <>
100
- <dl className="grid grid-cols-2 divide-x divide-border/70">
101
- <div className="pr-4">
102
- <dt className="text-xs text-muted-foreground">Active</dt>
103
- <dd className="mt-1 text-xl font-semibold tabular-nums">
104
- {series?.activeInstallations ?? 0}
105
- </dd>
106
- </div>
107
- <div className="pl-4">
108
- <dt className="text-xs text-muted-foreground">
109
- Rollback · 24h
110
- </dt>
111
- <dd className="mt-1 text-xl font-semibold tabular-nums">
112
- {series?.recoveredInstallations ?? 0}
113
- </dd>
114
- </div>
115
- </dl>
116
- <BundleActivityChart series={series} />
117
- <p className="text-xs text-muted-foreground">
118
- Last observed active installations · hourly rollbacks
119
- {report?.truncated ? " · Partial history" : ""}
120
- </p>
121
- </>
122
- )}
123
- </CardContent>
124
- </Card>
125
- );
126
- }
@@ -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);