@hot-updater/console 1.0.0-rc.8 → 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 (342) 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-C5tS4oGo.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-WiIAKl4L.mjs → alert-dialog-C43Doa0I.mjs} +6 -83
  74. package/.output/server/_ssr/{api-keys-aXriWrv7.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-B7w3AdRr.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-Coj6SwVP.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-l2-oBYth.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-INw6QxbU.mjs → insights_.distribution-DN9pR422.mjs} +50 -22
  120. package/.output/server/_ssr/installations-BHmbbnH8.mjs +5 -0
  121. package/.output/server/_ssr/{installations-DH-tQuRo.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-DfFyAp5p.mjs → router-D8NuoJ_I.mjs} +117 -136
  135. package/.output/server/_ssr/{routes-BtsfVx-p.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-CyvLaMza.mjs → select-t3iXRwc9.mjs} +3 -3
  140. package/.output/server/_ssr/server-h4VxnExB.mjs +8325 -0
  141. package/.output/server/_ssr/{createSsrRpc-C-dLcQuy.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-CkVhsNpe.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 +303 -205
  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 +74 -75
  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 +8 -6
  166. package/src/components/features/insights/AppUsage.tsx +41 -14
  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 +390 -26
  171. package/src/components/features/insights/EventHistoryCard.tsx +111 -25
  172. package/src/components/features/insights/EventHistoryList.tsx +1 -1
  173. package/src/components/features/insights/FailureReports.tsx +407 -0
  174. package/src/components/features/insights/InsightsControls.tsx +240 -142
  175. package/src/components/features/insights/InsightsErrorAlert.tsx +14 -1
  176. package/src/components/features/insights/InsightsOverview.tsx +601 -403
  177. package/src/components/features/insights/InsightsPageHeader.tsx +19 -14
  178. package/src/components/features/insights/InsightsPeriodSelector.tsx +67 -12
  179. package/src/components/features/insights/InstallationHistoryCard.tsx +65 -10
  180. package/src/components/features/insights/InstallationMatchesCard.tsx +1 -1
  181. package/src/components/features/insights/ReleaseActivity.tsx +308 -0
  182. package/src/components/features/insights/ReportingDevicesSummary.tsx +13 -13
  183. package/src/components/features/insights/RollbackButton.tsx +118 -0
  184. package/src/components/features/insights/UpdateFailures.tsx +382 -0
  185. package/src/components/features/insights/insightsFeatureUi.tsx +35 -0
  186. package/src/components/features/releases/ReleaseEditorSheet.tsx +27 -13
  187. package/src/components/features/remote-config/ConditionDialog.tsx +592 -0
  188. package/src/components/features/remote-config/ConditionsCard.tsx +247 -0
  189. package/src/components/features/remote-config/ParameterDialog.tsx +426 -0
  190. package/src/components/features/remote-config/ParametersCard.tsx +254 -0
  191. package/src/components/features/remote-config/PreviewCard.tsx +284 -0
  192. package/src/components/features/remote-config/PublishDialog.tsx +325 -0
  193. package/src/components/features/remote-config/RemoteConfigPage.tsx +353 -0
  194. package/src/components/features/remote-config/RuleSummary.tsx +21 -0
  195. package/src/components/features/remote-config/ValueInput.tsx +151 -0
  196. package/src/components/features/remote-config/VersionsCard.tsx +384 -0
  197. package/src/components/features/remote-config/remoteConfigFeatureUi.tsx +15 -0
  198. package/src/components/features/remote-config/useDateTimeText.ts +16 -0
  199. package/src/components/ui/sidebar.tsx +22 -29
  200. package/src/index.ts +26 -19
  201. package/src/lib/api-keys-api.ts +0 -28
  202. package/src/lib/api-keys-rpc.ts +27 -38
  203. package/src/lib/api-rpc.ts +125 -288
  204. package/src/lib/api.ts +15 -134
  205. package/src/lib/bundle-activity.ts +24 -4
  206. package/src/lib/console-access.ts +20 -0
  207. package/src/lib/console-features-api.ts +68 -0
  208. package/src/lib/console-features-rpc.ts +13 -0
  209. package/src/lib/console-features.ts +98 -0
  210. package/src/lib/insights-api.ts +56 -2
  211. package/src/lib/insights-errors.ts +64 -0
  212. package/src/lib/insights-failures-rpc.ts +36 -0
  213. package/src/lib/insights-failures.ts +130 -0
  214. package/src/lib/insights-recovery-rpc.ts +13 -17
  215. package/src/lib/insights-recovery.ts +12 -36
  216. package/src/lib/insights-retention.ts +21 -0
  217. package/src/lib/insights-rpc.ts +30 -12
  218. package/src/lib/insights-search.ts +50 -4
  219. package/src/lib/insights-usage-rpc.ts +15 -9
  220. package/src/lib/insights-usage.ts +41 -3
  221. package/src/lib/insights-view.ts +34 -5
  222. package/src/lib/release-adoption-api.ts +214 -0
  223. package/src/lib/release-adoption-rpc.ts +49 -0
  224. package/src/lib/release-adoption.ts +164 -0
  225. package/src/lib/remote-config-api.ts +119 -0
  226. package/src/lib/remote-config-draft.ts +666 -0
  227. package/src/lib/remote-config-rpc.ts +196 -0
  228. package/src/lib/scroll-restoration.ts +21 -0
  229. package/src/lib/server/auth.server.ts +13 -5
  230. package/src/lib/server/bundleActivity.ts +27 -28
  231. package/src/lib/server/config.server.ts +21 -76
  232. package/src/lib/server/console-feature-apis.ts +70 -0
  233. package/src/lib/server/console-runtime.server.ts +82 -38
  234. package/src/lib/server/downloadBundle.ts +14 -15
  235. package/src/lib/server/failureReports.ts +50 -0
  236. package/src/lib/server/getBundleChildren.ts +31 -122
  237. package/src/lib/server/insightsUsage.ts +52 -113
  238. package/src/lib/server/listReleases.ts +109 -44
  239. package/src/lib/server/releaseAdoption.ts +151 -0
  240. package/src/lib/server/releaseReachability.ts +8 -8
  241. package/src/lib/server/remoteConfig.ts +75 -0
  242. package/src/lib/server/runtime.server.ts +120 -31
  243. package/src/lib/server/updateFailures.ts +66 -0
  244. package/src/lib/use-dialog-target.ts +27 -0
  245. package/src/routeTree.gen.ts +44 -44
  246. package/src/router.tsx +3 -2
  247. package/src/routes/-installations-search.ts +32 -8
  248. package/src/routes/-releases-search.ts +76 -29
  249. package/src/routes/__root.tsx +7 -1
  250. package/src/routes/api/bundles/$bundleId/download.ts +2 -5
  251. package/src/routes/api-keys.tsx +5 -2
  252. package/src/routes/index.tsx +210 -152
  253. package/src/routes/insights.tsx +91 -23
  254. package/src/routes/insights_.distribution.tsx +50 -9
  255. package/src/routes/installations.tsx +97 -40
  256. package/src/routes/remote-config.tsx +42 -0
  257. package/src/styles.css +9 -0
  258. package/src/vite-internal.ts +15 -3
  259. package/src/vite.ts +2 -0
  260. package/.output/public/assets/HashValueDisplay-BpTc3Oyg.js +0 -1
  261. package/.output/public/assets/InsightsPageHeader-DC2eEst8.js +0 -1
  262. package/.output/public/assets/api-CdUyUqzR.js +0 -42
  263. package/.output/public/assets/api-keys-64PM9PwW.js +0 -1
  264. package/.output/public/assets/api-keys-api-BeaJnvY5.js +0 -1
  265. package/.output/public/assets/arrow-left-04Rh8Zgp.js +0 -1
  266. package/.output/public/assets/card-CYHs5FZv.js +0 -1
  267. package/.output/public/assets/chart-no-axes-combined-DwyMsVFW.js +0 -1
  268. package/.output/public/assets/createServerFn-DU71xucx.js +0 -3
  269. package/.output/public/assets/dialog-IVMkBRCq.js +0 -1
  270. package/.output/public/assets/dist-BR4GzeEu.js +0 -1
  271. package/.output/public/assets/field-B3CYDpjg.js +0 -1
  272. package/.output/public/assets/index-C39o7rJH.js +0 -10
  273. package/.output/public/assets/info-C3y9HNoU.js +0 -1
  274. package/.output/public/assets/input-group-nLZylhWF.js +0 -1
  275. package/.output/public/assets/insights-Bm9v8uO3.js +0 -2
  276. package/.output/public/assets/insights-DS3iO7Up.js +0 -1
  277. package/.output/public/assets/insights-search-Byj3g3Mp.js +0 -1
  278. package/.output/public/assets/insights-usage-rpc-BaGR3lgq.js +0 -1
  279. package/.output/public/assets/insights_.distribution-B1i6cjlQ.js +0 -1
  280. package/.output/public/assets/insights_.distribution-C1Wf27eB.js +0 -2
  281. package/.output/public/assets/installations-CkFW4fV9.js +0 -2
  282. package/.output/public/assets/installations-DxTaIcHD.js +0 -1
  283. package/.output/public/assets/lazyRouteComponent-BapzjYnb.js +0 -1
  284. package/.output/public/assets/list-Dqt53fWZ.js +0 -1
  285. package/.output/public/assets/loader-circle-CUKfUqow.js +0 -1
  286. package/.output/public/assets/preload-helper-ClBMtM1g.js +0 -1
  287. package/.output/public/assets/refresh-cw-CNE_2PnD.js +0 -1
  288. package/.output/public/assets/routes-Cgtvspjg.js +0 -2
  289. package/.output/public/assets/routes-O2r2UUN8.js +0 -1
  290. package/.output/public/assets/shield-check-BFcJ46kz.js +0 -1
  291. package/.output/public/assets/signing-BgspC-xP.js +0 -1
  292. package/.output/public/assets/styles-DnrWuBwd.css +0 -2
  293. package/.output/public/assets/table-BuWQgxJJ.js +0 -1
  294. package/.output/public/assets/useMutation-CSV9NCUl.js +0 -1
  295. package/.output/public/assets/useOpenInteractionType-D5kduCTD.js +0 -1
  296. package/.output/public/assets/valueToPercent-BAtcbSLk.js +0 -1
  297. package/.output/server/__23tanstack-start-server-fn-resolver-CmYkol9D.mjs +0 -150
  298. package/.output/server/_ssr/InsightsPageHeader-Dma3dVj1.mjs +0 -64
  299. package/.output/server/_ssr/api-C3bGmgY0.mjs +0 -332
  300. package/.output/server/_ssr/api-keys-api-BRF6rbRC.mjs +0 -60
  301. package/.output/server/_ssr/api-keys-rpc-BMa1ZM6N.mjs +0 -136
  302. package/.output/server/_ssr/api-rpc-BYQ2e0z6.mjs +0 -1399
  303. package/.output/server/_ssr/auth.server-CmicHh0J.mjs +0 -47
  304. package/.output/server/_ssr/bundle-signing-rpc-DbQ4pFAX.mjs +0 -16
  305. package/.output/server/_ssr/bundle-signing.server-Uqt1OF49.mjs +0 -12
  306. package/.output/server/_ssr/bundleActivity-pBrPSG01.mjs +0 -28
  307. package/.output/server/_ssr/card-B7KSO_25.mjs +0 -108
  308. package/.output/server/_ssr/config-Dv8qLDZ0.mjs +0 -13
  309. package/.output/server/_ssr/config.server-C-d1QaBU.mjs +0 -368
  310. package/.output/server/_ssr/databaseRows-5bCRTxm-.mjs +0 -126
  311. package/.output/server/_ssr/deleteBundle-8X-jq7Z7.mjs +0 -66
  312. package/.output/server/_ssr/field-BDwuU8RE.mjs +0 -74
  313. package/.output/server/_ssr/getBundleChildren-DoL8l_AS.mjs +0 -50
  314. package/.output/server/_ssr/insights-BDJjaDLp.mjs +0 -938
  315. package/.output/server/_ssr/insights-D0FWpfOS.mjs +0 -10
  316. package/.output/server/_ssr/insights-recovery-Cv6RSyeR.mjs +0 -21
  317. package/.output/server/_ssr/insights-recovery-rpc-BE9YsK_T.mjs +0 -37
  318. package/.output/server/_ssr/insights-search-1czJMZgk.mjs +0 -21
  319. package/.output/server/_ssr/insights-usage-rpc-BE_aCnea.mjs +0 -184
  320. package/.output/server/_ssr/insights-usage-rpc-CtAolz-t.mjs +0 -24
  321. package/.output/server/_ssr/insightsContract-B09K_Px1.mjs +0 -303
  322. package/.output/server/_ssr/insightsHistory-Ci4rYAgl.mjs +0 -41
  323. package/.output/server/_ssr/insightsRecovery-CaghWL2t.mjs +0 -113
  324. package/.output/server/_ssr/insightsUsage-DNIj6jxF.mjs +0 -71
  325. package/.output/server/_ssr/insights_.distribution-Cp0kf1vW.mjs +0 -10
  326. package/.output/server/_ssr/installations-Bhyiwx8G.mjs +0 -29
  327. package/.output/server/_ssr/routes-xBkI2Fmt.mjs +0 -37
  328. package/.output/server/_ssr/runtime.server-CsiKFp_Z.mjs +0 -436
  329. package/.output/server/_ssr/server-BdkuOWe8.mjs +0 -7468
  330. package/.output/server/_ssr/signing-CQ70saFm.mjs +0 -133
  331. package/.output/server/_ssr/start-DpViQGnt.mjs +0 -4
  332. package/.output/server/_tanstack-start-manifest_v-CrBsoKQQ.mjs +0 -125
  333. package/src/components/features/bundles/BundleActivityChart.tsx +0 -97
  334. package/src/components/features/bundles/BundleInsightsSummary.tsx +0 -126
  335. package/src/components/features/signing/BundleSigningPage.tsx +0 -139
  336. package/src/lib/bundle-signing-api.ts +0 -14
  337. package/src/lib/bundle-signing-rpc.ts +0 -16
  338. package/src/lib/server/bundle-signing.server.ts +0 -23
  339. package/src/lib/server/deleteBundle.ts +0 -145
  340. package/src/lib/server/insightsHistory.ts +0 -52
  341. package/src/lib/server/insightsRecovery.ts +0 -187
  342. 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-C-dLcQuy.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-B7KSO_25.mjs";
7
- //#region node_modules/.nitro/vite/services/ssr/assets/signing-CQ70saFm.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-CrBsoKQQ.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-C39o7rJH.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-C39o7rJH.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);