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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (330) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/ConsoleFeatureUnavailable-DRzeMGRM.js +1 -0
  3. package/.output/public/assets/EventDetails-SB5ygJzS.js +1 -0
  4. package/.output/public/assets/HashValueDisplay-BFX_kY3-.js +1 -0
  5. package/.output/public/assets/InsightsInfo-btYppp0B.js +1 -0
  6. package/.output/public/assets/InsightsPageHeader-Ba8psD8t.js +1 -0
  7. package/.output/public/assets/NotFoundPage-CyRG2eca.js +1 -0
  8. package/.output/public/assets/alert-dialog-Bbk_4-WJ.js +1 -0
  9. package/.output/public/assets/api-DUgI6yOI.js +1 -0
  10. package/.output/public/assets/api-keys-CIO9L_wu.js +1 -0
  11. package/.output/public/assets/api-keys-CmkNKOhS.js +1 -0
  12. package/.output/public/assets/arrow-left-CnMYpqB7.js +1 -0
  13. package/.output/public/assets/arrow-up-right-BtffZA6e.js +1 -0
  14. package/.output/public/assets/chevron-right-BqD5wtFb.js +1 -0
  15. package/.output/public/assets/clipboard-DS9ucUQL.js +1 -0
  16. package/.output/public/assets/console-features-api-BMsI3Bj8.js +1 -0
  17. package/.output/public/assets/dialog-Bqbb7B0N.js +1 -0
  18. package/.output/public/assets/dist-LxKJB-Vu.js +1 -0
  19. package/.output/public/assets/empty-CuT2UhFp.js +1 -0
  20. package/.output/public/assets/field-BBDpjIqu.js +1 -0
  21. package/.output/public/assets/index-BEfQ2_7f.js +11 -0
  22. package/.output/public/assets/input-group-ja_30qaF.js +1 -0
  23. package/.output/public/assets/insights-B0ib9qOE.js +2 -0
  24. package/.output/public/assets/insights-BIMJx-0p.js +1 -0
  25. package/.output/public/assets/insights-CndqcWEj.js +42 -0
  26. package/.output/public/assets/insights-api-B6Ewc-OG.js +1 -0
  27. package/.output/public/assets/insights-usage-rpc-DYEhsCKT.js +1 -0
  28. package/.output/public/assets/insights_.distribution-B26PMy4k.js +2 -0
  29. package/.output/public/assets/insights_.distribution-BBDtqqYS.js +1 -0
  30. package/.output/public/assets/insights_.distribution-DhHmYS8k.js +1 -0
  31. package/.output/public/assets/installations-C3cMuwRx.js +1 -0
  32. package/.output/public/assets/installations-C3yrjwDh.js +2 -0
  33. package/.output/public/assets/installations-D3edlN75.js +1 -0
  34. package/.output/public/assets/key-round-wS_SIZ6b.js +1 -0
  35. package/.output/public/assets/list-CgrYiadM.js +1 -0
  36. package/.output/public/assets/refresh-cw-BYgoNCco.js +1 -0
  37. package/.output/public/assets/remote-config-0i-gDkeU.js +1 -0
  38. package/.output/public/assets/remote-config-An1ROIOQ.js +6 -0
  39. package/.output/public/assets/remote-config-CoeWgA9i.js +1 -0
  40. package/.output/public/assets/routes-DNoaJIQV.js +2 -0
  41. package/.output/public/assets/routes-cWBDtghZ.js +1 -0
  42. package/.output/public/assets/search-DaTDPW25.js +1 -0
  43. package/.output/public/assets/select-CZMQKT7F.js +1 -0
  44. package/.output/public/assets/sidebar-DNVyJPfX.js +3 -0
  45. package/.output/public/assets/smartphone-DpTFgtKf.js +1 -0
  46. package/.output/public/assets/styles-D8mxMvCB.css +2 -0
  47. package/.output/public/assets/switch-CU4-fupc.js +1 -0
  48. package/.output/public/assets/table-Gm4qRWwE.js +1 -0
  49. package/.output/public/assets/tabs-R1I8CRjR.js +1 -0
  50. package/.output/public/assets/undo-2-CmrHjwFc.js +1 -0
  51. package/.output/public/assets/useCompositeListItem-BaPeC9ZO.js +1 -0
  52. package/.output/public/assets/valueToPercent-CH8GCHaL.js +1 -0
  53. package/.output/server/__23tanstack-start-server-fn-resolver-DTAqlLRd.mjs +178 -0
  54. package/.output/server/_libs/@base-ui/react+[...].mjs +6450 -2741
  55. package/.output/server/_libs/@tanstack/react-router+[...].mjs +3802 -4022
  56. package/.output/server/_libs/@tanstack/react-router-ssr-query+[...].mjs +140 -97
  57. package/.output/server/_libs/lucide-react.mjs +235 -31
  58. package/.output/server/_libs/next-themes.mjs +1 -1
  59. package/.output/server/_libs/react-redux+[...].mjs +1 -1
  60. package/.output/server/_libs/recharts+[...].mjs +483 -901
  61. package/.output/server/_libs/sonner.mjs +1 -1
  62. package/.output/server/_libs/tanstack__history.mjs +68 -41
  63. package/.output/server/_libs/tanstack__query-core.mjs +2010 -309
  64. package/.output/server/_libs/tanstack__react-query.mjs +448 -21
  65. package/.output/server/_libs/verkit.mjs +102 -1
  66. package/.output/server/_ssr/BundleIdDisplay-BNoVW3Dv.mjs +13 -0
  67. package/.output/server/_ssr/ConsoleFeatureUnavailable-BPFa-cmJ.mjs +58 -0
  68. package/.output/server/_ssr/EventDetails-9CeshfdR.mjs +344 -0
  69. package/.output/server/_ssr/HashValueDisplay-DXZlkcps.mjs +55 -0
  70. package/.output/server/_ssr/InsightsInfo-DLNdJQ0m.mjs +75 -0
  71. package/.output/server/_ssr/InsightsPageHeader-DZGVDgvv.mjs +145 -0
  72. package/.output/server/_ssr/NotFoundPage-mYHHg-2s.mjs +37 -0
  73. package/.output/server/_ssr/{dialog-DUaIgpgd.mjs → alert-dialog-Chkim7vZ.mjs} +6 -83
  74. package/.output/server/_ssr/api-C-Il5-sa.mjs +203 -0
  75. package/.output/server/_ssr/api-keys-01FGqj4d.mjs +5 -0
  76. package/.output/server/_ssr/{api-keys-DJml_XoK.mjs → api-keys-B_f9h7ln.mjs} +48 -10
  77. package/.output/server/_ssr/api-keys-rpc-Cf4YCyFc.mjs +52 -0
  78. package/.output/server/_ssr/api-rpc-DRqwxxT_.mjs +296 -0
  79. package/.output/server/_ssr/{auth-BF8mbAgF.mjs → auth-UP0wXs4i.mjs} +1 -1
  80. package/.output/server/_ssr/{auth-rpc-D_hv52-J.mjs → auth-rpc-D8nFpU9C.mjs} +6 -6
  81. package/.output/server/_ssr/auth.server-COZoXu4i.mjs +5425 -0
  82. package/.output/server/_ssr/bundleActivity-M5gzBFNg.mjs +18 -0
  83. package/.output/server/_ssr/config-WVX4IxSR.mjs +15 -0
  84. package/.output/server/_ssr/config.server-Dm2l7w0O.mjs +36 -0
  85. package/.output/server/_ssr/console-access--o9FXikU.mjs +17 -0
  86. package/.output/server/_ssr/console-features-BftSkf3f.mjs +60 -0
  87. package/.output/server/_ssr/console-features-api-CYclUQ4h.mjs +43 -0
  88. package/.output/server/_ssr/console-features-rpc-1WaAkPM_.mjs +19 -0
  89. package/.output/server/_ssr/{createServerFn-B2hcXoPM.mjs → createMiddleware-Cm6Tn0_Y.mjs} +67 -56
  90. package/.output/server/_ssr/{createServerRpc-DB29C_5p.mjs → createServerRpc-RLR4H-Fn.mjs} +2 -2
  91. package/.output/server/_ssr/databaseConfig-C5SkAyUy.mjs +5 -0
  92. package/.output/server/_ssr/{databaseJsonValue-d6I3nAS4.mjs → databaseJsonValue-Csbuzc9Q.mjs} +28 -5
  93. package/.output/server/_ssr/databaseRows-BUuNU-qt.mjs +74 -0
  94. package/.output/server/_ssr/dialog-mfSANqjC.mjs +84 -0
  95. package/.output/server/_ssr/{dist-CyzPaI5v.mjs → dist-wmnTk7w6.mjs} +140 -6
  96. package/.output/server/_ssr/{downloadBundle-B3ert-pY.mjs → downloadBundle-DViuIa9U.mjs} +10 -10
  97. package/.output/server/_ssr/empty-BPayFad3.mjs +60 -0
  98. package/.output/server/_ssr/{empty-plugin-adapters-B5QvGpEl.mjs → empty-plugin-adapters-CPtwX8a7.mjs} +1 -1
  99. package/.output/server/_ssr/failureReports-DKDhVsXA.mjs +33 -0
  100. package/.output/server/_ssr/field-DjZ5t7rH.mjs +189 -0
  101. package/.output/server/_ssr/getBundleChildren-CmjDg6Re.mjs +22 -0
  102. package/.output/server/_ssr/{input-group-Bb8ueylQ.mjs → input-group-Dx-MEkNM.mjs} +3 -52
  103. package/.output/server/_ssr/insights-BopxyJjk.mjs +14 -0
  104. package/.output/server/_ssr/insights-Bvm03d61.mjs +5 -0
  105. package/.output/server/_ssr/insights-CrLAHSDy.mjs +2315 -0
  106. package/.output/server/_ssr/insights-api-Bg8ZV_h_.mjs +122 -0
  107. package/.output/server/_ssr/insights-errors-BjnFUyZj.mjs +34 -0
  108. package/.output/server/_ssr/insights-failures-rpc-tyy5m9Cc.mjs +36 -0
  109. package/.output/server/_ssr/insights-failures-xaa41Buf.mjs +46 -0
  110. package/.output/server/_ssr/{insights-recovery-DSFM-YTL.mjs → insights-recovery-BWQhiZaF.mjs} +9 -2
  111. package/.output/server/_ssr/insights-recovery-rpc-CPJOiJAV.mjs +32 -0
  112. package/.output/server/_ssr/{insights-rpc-DrIQCjpD.mjs → insights-rpc-DoC3hla9.mjs} +22 -14
  113. package/.output/server/_ssr/insights-usage-BpBM0U0c.mjs +29 -0
  114. package/.output/server/_ssr/insights-usage-rpc-CFuTYp3T.mjs +29 -0
  115. package/.output/server/_ssr/insights-usage-rpc-O2ruP4iE.mjs +41 -0
  116. package/.output/server/_ssr/insightsUsage-CzhVjsc8.mjs +56 -0
  117. package/.output/server/_ssr/insights_.distribution-B3BVPD00.mjs +16 -0
  118. package/.output/server/_ssr/insights_.distribution-BMoisxRG.mjs +347 -0
  119. package/.output/server/_ssr/insights_.distribution-BiCcFyrG.mjs +7 -0
  120. package/.output/server/_ssr/{installations-YumqpNpa.mjs → installations-Cx3jIrwl.mjs} +280 -364
  121. package/.output/server/_ssr/installations-DTGPaKXx.mjs +69 -0
  122. package/.output/server/_ssr/installations-osiAuNKr.mjs +5 -0
  123. package/.output/server/_ssr/listReleases-BfUBlCHo.mjs +79 -0
  124. package/.output/server/_ssr/release-adoption-005tQRpo.mjs +55 -0
  125. package/.output/server/_ssr/release-adoption-rpc-BVySDR0L.mjs +41 -0
  126. package/.output/server/_ssr/releaseAdoption-2PJPA09N.mjs +114 -0
  127. package/.output/server/_ssr/releaseManagement-BTCWEY8-.mjs +11 -0
  128. package/.output/server/_ssr/remote-config-CUoAxUMy.mjs +430 -0
  129. package/.output/server/_ssr/remote-config-Cc5P4J-r.mjs +17 -0
  130. package/.output/server/_ssr/remote-config-CjdxcZ9B.mjs +5 -0
  131. package/.output/server/_ssr/remote-config-D2GmbGwI.mjs +2594 -0
  132. package/.output/server/_ssr/remote-config-rpc-kjoZ9PRS.mjs +115 -0
  133. package/.output/server/_ssr/rolldown-runtime-rSIU-vHC.mjs +13 -0
  134. package/.output/server/_ssr/{router-iP95Vqi2.mjs → router-DwGVewL-.mjs} +141 -139
  135. package/.output/server/_ssr/{routes-ivsV2TDu.mjs → routes-C4yxv3JU.mjs} +192 -685
  136. package/.output/server/_ssr/routes-D3_aegLY.mjs +409 -0
  137. package/.output/server/_ssr/runtime.server-BoWf4QhU.mjs +1716 -0
  138. package/.output/server/_ssr/schema-DrOtkRVD.mjs +361 -0
  139. package/.output/server/_ssr/select-DkzM2miy.mjs +107 -0
  140. package/.output/server/_ssr/server-BW0gzB0p.mjs +8325 -0
  141. package/.output/server/_ssr/{createSsrRpc-NHF2PxuK.mjs → sidebar-DPcOijvL.mjs} +107 -47
  142. package/.output/server/_ssr/ssr.mjs +1 -1
  143. package/.output/server/_ssr/start-BfFbHKMK.mjs +4 -0
  144. package/.output/server/_ssr/switch-BqJ2mAwC.mjs +17 -0
  145. package/.output/server/_ssr/{table-D1mL8fJu.mjs → table-R7RY92q9.mjs} +2 -2
  146. package/.output/server/_ssr/tabs-trDcbRkT.mjs +45 -0
  147. package/.output/server/_ssr/updateFailures-H6pnnYK4.mjs +40 -0
  148. package/.output/server/_ssr/{uuidv7-D0QFkPL_.mjs → uuidv7-ctA_XVZA.mjs} +2 -2
  149. package/.output/server/_tanstack-start-manifest_v-BwInaUTw.mjs +139 -0
  150. package/.output/server/index.mjs +315 -154
  151. package/LICENSE +13 -14
  152. package/README.md +82 -72
  153. package/lib/index.d.mts +23 -11
  154. package/lib/vite-internal.mjs +13 -3
  155. package/lib/vite.d.mts +2 -0
  156. package/package.json +14 -14
  157. package/src/components/AppSidebar.tsx +100 -71
  158. package/src/components/ConsoleAccessPage.tsx +5 -1
  159. package/src/components/ConsoleFeatureUnavailable.tsx +80 -0
  160. package/src/components/NotFoundPage.tsx +7 -7
  161. package/src/components/features/FeatureSlots.tsx +103 -0
  162. package/src/components/features/api-keys/apiKeysFeatureUi.tsx +15 -0
  163. package/src/components/features/bundles/BundleMetadata.tsx +8 -5
  164. package/src/components/features/bundles/RolloutCohortsDialog.tsx +1 -1
  165. package/src/components/features/channels/ChannelManagementDialog.tsx +2 -5
  166. package/src/components/features/insights/AppUsage.tsx +366 -0
  167. package/src/components/features/insights/BuiltinBundle.tsx +36 -0
  168. package/src/components/features/insights/ComparedBundlesChart.tsx +310 -0
  169. package/src/components/features/insights/EstimatedCount.tsx +18 -0
  170. package/src/components/features/insights/EventDetails.tsx +400 -39
  171. package/src/components/features/insights/EventHistoryCard.tsx +112 -26
  172. package/src/components/features/insights/EventHistoryList.tsx +2 -2
  173. package/src/components/features/insights/FailureReports.tsx +407 -0
  174. package/src/components/features/insights/InsightsControls.tsx +265 -88
  175. package/src/components/features/insights/InsightsErrorAlert.tsx +14 -1
  176. package/src/components/features/insights/InsightsInfo.tsx +48 -0
  177. package/src/components/features/insights/InsightsOverview.tsx +604 -355
  178. package/src/components/features/insights/InsightsPageHeader.tsx +35 -20
  179. package/src/components/features/insights/InsightsPeriodSelector.tsx +89 -0
  180. package/src/components/features/insights/InstallationHistoryCard.tsx +66 -11
  181. package/src/components/features/insights/InstallationMatchesCard.tsx +1 -1
  182. package/src/components/features/insights/ReleaseActivity.tsx +308 -0
  183. package/src/components/features/insights/ReportingDevicesSummary.tsx +48 -0
  184. package/src/components/features/insights/RollbackButton.tsx +118 -0
  185. package/src/components/features/insights/UpdateFailures.tsx +382 -0
  186. package/src/components/features/insights/insightsFeatureUi.tsx +35 -0
  187. package/src/components/features/releases/ReleaseEditorSheet.tsx +26 -12
  188. package/src/components/features/remote-config/ConditionDialog.tsx +581 -0
  189. package/src/components/features/remote-config/ConditionsCard.tsx +244 -0
  190. package/src/components/features/remote-config/ParameterDialog.tsx +407 -0
  191. package/src/components/features/remote-config/ParametersCard.tsx +244 -0
  192. package/src/components/features/remote-config/PreviewCard.tsx +284 -0
  193. package/src/components/features/remote-config/PublishDialog.tsx +319 -0
  194. package/src/components/features/remote-config/RemoteConfigPage.tsx +353 -0
  195. package/src/components/features/remote-config/RuleSummary.tsx +21 -0
  196. package/src/components/features/remote-config/ValueInput.tsx +148 -0
  197. package/src/components/features/remote-config/VersionsCard.tsx +361 -0
  198. package/src/components/features/remote-config/remoteConfigFeatureUi.tsx +15 -0
  199. package/src/components/features/remote-config/useDateTimeText.ts +16 -0
  200. package/src/components/ui/card.tsx +1 -1
  201. package/src/components/ui/scroll-area.tsx +52 -0
  202. package/src/components/ui/sidebar.tsx +22 -29
  203. package/src/components/ui/tabs.tsx +81 -0
  204. package/src/index.ts +26 -19
  205. package/src/lib/api-keys-api.ts +0 -28
  206. package/src/lib/api-keys-rpc.ts +27 -38
  207. package/src/lib/api-rpc.ts +189 -266
  208. package/src/lib/api.ts +19 -102
  209. package/src/lib/bundle-activity.ts +24 -4
  210. package/src/lib/console-access.ts +20 -0
  211. package/src/lib/console-features-api.ts +68 -0
  212. package/src/lib/console-features-rpc.ts +13 -0
  213. package/src/lib/console-features.ts +97 -0
  214. package/src/lib/insights-api.ts +56 -2
  215. package/src/lib/insights-errors.ts +64 -0
  216. package/src/lib/insights-failures-rpc.ts +36 -0
  217. package/src/lib/insights-failures.ts +130 -0
  218. package/src/lib/insights-recovery-rpc.ts +13 -17
  219. package/src/lib/insights-recovery.ts +10 -27
  220. package/src/lib/insights-retention.ts +21 -0
  221. package/src/lib/insights-rpc.ts +30 -12
  222. package/src/lib/insights-search.ts +93 -0
  223. package/src/lib/insights-usage-rpc.ts +29 -0
  224. package/src/lib/insights-usage.ts +76 -0
  225. package/src/lib/insights-view.ts +34 -5
  226. package/src/lib/release-adoption-api.ts +214 -0
  227. package/src/lib/release-adoption-rpc.ts +49 -0
  228. package/src/lib/release-adoption.ts +164 -0
  229. package/src/lib/remote-config-api.ts +119 -0
  230. package/src/lib/remote-config-draft.ts +652 -0
  231. package/src/lib/remote-config-rpc.ts +196 -0
  232. package/src/lib/scroll-restoration.ts +21 -0
  233. package/src/lib/server/adminInsights.ts +124 -0
  234. package/src/lib/server/auth.server.ts +13 -5
  235. package/src/lib/server/bundleActivity.ts +27 -28
  236. package/src/lib/server/config.server.ts +21 -74
  237. package/src/lib/server/console-feature-apis.ts +70 -0
  238. package/src/lib/server/console-runtime.server.ts +82 -38
  239. package/src/lib/server/downloadBundle.ts +16 -15
  240. package/src/lib/server/failureReports.ts +49 -0
  241. package/src/lib/server/getBundleChildren.ts +31 -122
  242. package/src/lib/server/insightsUsage.ts +63 -0
  243. package/src/lib/server/listReleases.ts +109 -44
  244. package/src/lib/server/releaseAdoption.ts +154 -0
  245. package/src/lib/server/releaseReachability.ts +8 -7
  246. package/src/lib/server/remoteConfig.ts +191 -0
  247. package/src/lib/server/runtime.server.ts +120 -31
  248. package/src/lib/server/updateFailures.ts +65 -0
  249. package/src/routeTree.gen.ts +65 -44
  250. package/src/router.tsx +3 -2
  251. package/src/routes/-installations-search.ts +32 -8
  252. package/src/routes/-releases-search.ts +76 -29
  253. package/src/routes/__root.tsx +10 -4
  254. package/src/routes/api/bundles/$bundleId/download.ts +2 -5
  255. package/src/routes/api-keys.tsx +5 -2
  256. package/src/routes/index.tsx +210 -152
  257. package/src/routes/insights.tsx +133 -18
  258. package/src/routes/insights_.distribution.tsx +422 -0
  259. package/src/routes/installations.tsx +98 -41
  260. package/src/routes/remote-config.tsx +42 -0
  261. package/src/styles.css +9 -0
  262. package/src/vite-internal.ts +15 -3
  263. package/src/vite.ts +2 -0
  264. package/.output/public/assets/InsightsPageHeader-C-Xc2MB9.js +0 -1
  265. package/.output/public/assets/api-keys-C1sgC6ko.js +0 -1
  266. package/.output/public/assets/api-keys-api-LchP65vQ.js +0 -1
  267. package/.output/public/assets/badge-BuMDU0Rf.js +0 -1
  268. package/.output/public/assets/card-BEvx_QKh.js +0 -1
  269. package/.output/public/assets/chart-no-axes-combined-C0G0fQ3J.js +0 -1
  270. package/.output/public/assets/composite-CHTH1Xhh.js +0 -1
  271. package/.output/public/assets/createServerFn-DHc2erub.js +0 -3
  272. package/.output/public/assets/dialog-dyZ1SphZ.js +0 -1
  273. package/.output/public/assets/dist-Bh1gaDfB.js +0 -1
  274. package/.output/public/assets/field-79SVH26s.js +0 -1
  275. package/.output/public/assets/index-BNkxg4jz.js +0 -10
  276. package/.output/public/assets/input-group-BbHfaBzQ.js +0 -1
  277. package/.output/public/assets/insights-D_7uSKfc.js +0 -1
  278. package/.output/public/assets/installations-BzoHWuXw.js +0 -1
  279. package/.output/public/assets/installations-DvjbUqd1.js +0 -2
  280. package/.output/public/assets/lazyRouteComponent-BN0MS05o.js +0 -1
  281. package/.output/public/assets/link-BG06whwB.js +0 -1
  282. package/.output/public/assets/loader-circle-Bbp8LGVC.js +0 -1
  283. package/.output/public/assets/preload-helper-uTix4PVD.js +0 -1
  284. package/.output/public/assets/refresh-cw-DZgiAOMk.js +0 -1
  285. package/.output/public/assets/routes-BFE-oRIT.js +0 -1
  286. package/.output/public/assets/routes-DaPMY31P.js +0 -2
  287. package/.output/public/assets/shield-check-DoIiaaXU.js +0 -1
  288. package/.output/public/assets/signing-BTRhaF5D.js +0 -1
  289. package/.output/public/assets/styles-C7U0oVke.css +0 -2
  290. package/.output/public/assets/table-BBEzJ7Xl.js +0 -1
  291. package/.output/public/assets/useCompositeListItem-BkPDaqyj.js +0 -42
  292. package/.output/server/__23tanstack-start-server-fn-resolver-Dr2ixDgQ.mjs +0 -146
  293. package/.output/server/_ssr/InsightsPageHeader-C5Has8Ry.mjs +0 -60
  294. package/.output/server/_ssr/api-keys-api-CrCZyvnl.mjs +0 -60
  295. package/.output/server/_ssr/api-keys-rpc-CFaNf-q0.mjs +0 -136
  296. package/.output/server/_ssr/api-rpc-B61KL3Eo.mjs +0 -1399
  297. package/.output/server/_ssr/auth.server-DF_shCeq.mjs +0 -47
  298. package/.output/server/_ssr/badge-BgsCP9Dp.mjs +0 -28
  299. package/.output/server/_ssr/bundle-signing-rpc-BBipZnFs.mjs +0 -16
  300. package/.output/server/_ssr/bundle-signing.server-Co_zHdJx.mjs +0 -12
  301. package/.output/server/_ssr/bundleActivity-D3_fIda2.mjs +0 -27
  302. package/.output/server/_ssr/card-DrbxCPtG.mjs +0 -86
  303. package/.output/server/_ssr/chart-qxa-_30a.mjs +0 -162
  304. package/.output/server/_ssr/config-Dv8qLDZ0.mjs +0 -13
  305. package/.output/server/_ssr/config.server-CBr6PDj5.mjs +0 -368
  306. package/.output/server/_ssr/databaseRows-5bCRTxm-.mjs +0 -126
  307. package/.output/server/_ssr/deleteBundle-BAq3JuGr.mjs +0 -66
  308. package/.output/server/_ssr/field-CqNUlqUq.mjs +0 -74
  309. package/.output/server/_ssr/getBundleChildren-COMt16m_.mjs +0 -50
  310. package/.output/server/_ssr/insights-B-DUbksX.mjs +0 -502
  311. package/.output/server/_ssr/insights-recovery-rpc-P71FH66n.mjs +0 -37
  312. package/.output/server/_ssr/insightsContract-fjJDBeEE.mjs +0 -303
  313. package/.output/server/_ssr/insightsRecovery-CqcosG7B.mjs +0 -149
  314. package/.output/server/_ssr/installations-BQrppti7.mjs +0 -29
  315. package/.output/server/_ssr/routes-BDabsmc7.mjs +0 -37
  316. package/.output/server/_ssr/runtime.server-jmZOKIQM.mjs +0 -438
  317. package/.output/server/_ssr/server-p7yrVBfD.mjs +0 -7468
  318. package/.output/server/_ssr/signing-CxCbnFCt.mjs +0 -134
  319. package/.output/server/_ssr/start-DpViQGnt.mjs +0 -4
  320. package/.output/server/_tanstack-start-manifest_v-Cwpu0C9Q.mjs +0 -100
  321. package/src/components/features/bundles/BundleActivityChart.tsx +0 -95
  322. package/src/components/features/bundles/BundleInsightsSummary.tsx +0 -121
  323. package/src/components/features/signing/BundleSigningPage.tsx +0 -139
  324. package/src/lib/bundle-signing-api.ts +0 -14
  325. package/src/lib/bundle-signing-rpc.ts +0 -16
  326. package/src/lib/server/bundle-signing.server.ts +0 -23
  327. package/src/lib/server/deleteBundle.ts +0 -145
  328. package/src/lib/server/insightsHistory.ts +0 -52
  329. package/src/lib/server/insightsRecovery.ts +0 -186
  330. package/src/routes/signing.tsx +0 -37
@@ -0,0 +1,366 @@
1
+ import type { UseQueryResult } from "@tanstack/react-query";
2
+ import { Link } from "@tanstack/react-router";
3
+ import { ArrowRight, ChevronRight } from "lucide-react";
4
+ import { CartesianGrid, Line, LineChart, XAxis, YAxis } from "recharts";
5
+
6
+ import { PlatformIcon } from "@/components/PlatformIcon";
7
+ import { Badge } from "@/components/ui/badge";
8
+ import { Button, buttonVariants } from "@/components/ui/button";
9
+ import {
10
+ Card,
11
+ CardContent,
12
+ CardFooter,
13
+ CardHeader,
14
+ CardTitle,
15
+ } from "@/components/ui/card";
16
+ import {
17
+ ChartContainer,
18
+ ChartTooltip,
19
+ ChartTooltipContent,
20
+ } from "@/components/ui/chart";
21
+ import {
22
+ Empty,
23
+ EmptyDescription,
24
+ EmptyHeader,
25
+ EmptyTitle,
26
+ } from "@/components/ui/empty";
27
+ import { Progress } from "@/components/ui/progress";
28
+ import { ScrollArea } from "@/components/ui/scroll-area";
29
+ import { Separator } from "@/components/ui/separator";
30
+ import { Skeleton } from "@/components/ui/skeleton";
31
+ import {
32
+ Table,
33
+ TableBody,
34
+ TableCell,
35
+ TableHead,
36
+ TableHeader,
37
+ TableRow,
38
+ } from "@/components/ui/table";
39
+ import {
40
+ DEFAULT_INSIGHTS_RETENTION,
41
+ type InsightsRetentionDays,
42
+ keepsTwelveMonths,
43
+ } from "@/lib/insights-retention";
44
+ import type { InsightsSearch } from "@/lib/insights-search";
45
+ import type { AppUsageReport, UsageWindow } from "@/lib/insights-usage";
46
+
47
+ import { EstimatedCount } from "./EstimatedCount";
48
+ import { InsightsErrorAlert } from "./InsightsErrorAlert";
49
+ import { InsightsInfo } from "./InsightsInfo";
50
+ import { UsagePeriodSelector } from "./InsightsPeriodSelector";
51
+ import { ReportingDevicesSummary } from "./ReportingDevicesSummary";
52
+
53
+ const dates = new Intl.DateTimeFormat("en", {
54
+ month: "short",
55
+ day: "numeric",
56
+ timeZone: "UTC",
57
+ });
58
+ const times = new Intl.DateTimeFormat("en", {
59
+ month: "short",
60
+ day: "numeric",
61
+ hour: "numeric",
62
+ timeZone: "UTC",
63
+ });
64
+
65
+ export function AppUsage({
66
+ query,
67
+ search,
68
+ window,
69
+ onWindowChange,
70
+ retention = DEFAULT_INSIGHTS_RETENTION,
71
+ }: {
72
+ readonly query: UseQueryResult<AppUsageReport>;
73
+ /** How long the server keeps Insights rows. */
74
+ readonly retention?: InsightsRetentionDays;
75
+ readonly search: InsightsSearch;
76
+ readonly window: UsageWindow;
77
+ readonly onWindowChange: (window: UsageWindow) => void;
78
+ }) {
79
+ const report = query.error ? undefined : query.data;
80
+ const formatTime = (ms: number) =>
81
+ (window === "30d" || window === "12m" ? dates : times).format(ms);
82
+ const distributionPeriod = report
83
+ ? `since ${dates.format(report.distributionSinceMs)}, 00:00 UTC`
84
+ : "in the selected period";
85
+ const distributionTotals = report
86
+ ? {
87
+ versions: report.versions.reduce(
88
+ (sum, row) => sum + row.installations,
89
+ 0,
90
+ ),
91
+ platforms: report.platforms.reduce(
92
+ (sum, row) => sum + row.installations,
93
+ 0,
94
+ ),
95
+ }
96
+ : undefined;
97
+ return (
98
+ <div className="grid min-w-0 gap-6 xl:grid-cols-[minmax(0,2fr)_minmax(16rem,1fr)]">
99
+ <Card aria-label="App usage" role="region" className="min-w-0 shadow-sm">
100
+ <CardHeader className="flex-row flex-wrap items-center justify-between gap-4">
101
+ <CardTitle>App usage</CardTitle>
102
+ <UsagePeriodSelector
103
+ window={window}
104
+ onWindowChange={onWindowChange}
105
+ twelveMonths={keepsTwelveMonths(retention)}
106
+ />
107
+ </CardHeader>
108
+ <CardContent className="flex flex-col gap-4">
109
+ <ReportingDevicesSummary
110
+ window={window}
111
+ count={report?.activeInstallations}
112
+ isPending={query.isPending}
113
+ partial={report?.truncated ?? false}
114
+ />
115
+ {query.isPending ? (
116
+ <Skeleton aria-label="Loading app usage" className="h-48" />
117
+ ) : query.error ? (
118
+ <div className="flex flex-col items-start gap-4">
119
+ <InsightsErrorAlert
120
+ error={query.error}
121
+ fallbackTitle="App usage unavailable"
122
+ />
123
+ <Button variant="outline" onClick={() => void query.refetch()}>
124
+ Retry app usage
125
+ </Button>
126
+ </div>
127
+ ) : report?.activeInstallations === 0 ? (
128
+ <Empty className="h-48">
129
+ <EmptyHeader>
130
+ <EmptyTitle>No activity reported</EmptyTitle>
131
+ <EmptyDescription>
132
+ Try another period, platform, channel, or app version.
133
+ </EmptyDescription>
134
+ </EmptyHeader>
135
+ </Empty>
136
+ ) : report ? (
137
+ <>
138
+ <div>
139
+ <p className="mb-2 text-right text-xs text-muted-foreground">
140
+ Reporting installations · UTC
141
+ </p>
142
+ <ChartContainer
143
+ aria-label="Active users per interval"
144
+ className="h-48 w-full aspect-auto"
145
+ config={{
146
+ installations: {
147
+ label: "Active users",
148
+ color: "var(--chart-2)",
149
+ },
150
+ }}
151
+ >
152
+ <LineChart
153
+ accessibilityLayer
154
+ data={report.points}
155
+ margin={{ right: 8, top: 8 }}
156
+ >
157
+ <CartesianGrid vertical={false} />
158
+ <XAxis
159
+ dataKey="startMs"
160
+ tick={{ fill: "var(--muted-foreground)" }}
161
+ tickFormatter={formatTime}
162
+ axisLine={false}
163
+ tickLine={false}
164
+ minTickGap={45}
165
+ />
166
+ <YAxis
167
+ tick={{ fill: "var(--muted-foreground)" }}
168
+ allowDecimals={false}
169
+ axisLine={false}
170
+ tickLine={false}
171
+ width="auto"
172
+ />
173
+ <ChartTooltip
174
+ content={
175
+ <ChartTooltipContent
176
+ labelFormatter={(_, payload) =>
177
+ `${times.format(payload[0]?.payload.startMs)} · UTC`
178
+ }
179
+ />
180
+ }
181
+ />
182
+ <Line
183
+ dataKey="installations"
184
+ type="linear"
185
+ stroke="var(--color-installations)"
186
+ strokeWidth={2}
187
+ dot={{ r: 2 }}
188
+ activeDot={{ r: 4 }}
189
+ isAnimationActive={false}
190
+ />
191
+ </LineChart>
192
+ </ChartContainer>
193
+ </div>
194
+ <details className="text-xs text-muted-foreground">
195
+ <summary className="cursor-pointer py-2">
196
+ View usage data
197
+ </summary>
198
+ <Table aria-label="App usage by interval">
199
+ <TableHeader>
200
+ <TableRow>
201
+ <TableHead>Interval · UTC</TableHead>
202
+ <TableHead className="text-right">Active users</TableHead>
203
+ </TableRow>
204
+ </TableHeader>
205
+ <TableBody>
206
+ {report.points.map((point) => (
207
+ <TableRow key={point.startMs}>
208
+ <TableCell>{times.format(point.startMs)}</TableCell>
209
+ <TableCell className="text-right tabular-nums">
210
+ {point.installations === null ? (
211
+ "Unknown"
212
+ ) : (
213
+ <EstimatedCount value={point.installations} />
214
+ )}
215
+ </TableCell>
216
+ </TableRow>
217
+ ))}
218
+ </TableBody>
219
+ </Table>
220
+ </details>
221
+ </>
222
+ ) : null}
223
+ </CardContent>
224
+ </Card>
225
+ <Card
226
+ aria-label="Usage distribution"
227
+ role="region"
228
+ className="flex min-w-0 flex-col shadow-sm"
229
+ >
230
+ <CardHeader className="flex-row items-center justify-between gap-3">
231
+ <CardTitle className="flex min-h-9 items-center">
232
+ Distribution
233
+ </CardTitle>
234
+ <InsightsInfo label="How distribution is counted">
235
+ Each installation counts once, by its latest report{" "}
236
+ {distributionPeriod}.
237
+ {report?.truncated ? " Some history is missing." : ""}
238
+ </InsightsInfo>
239
+ </CardHeader>
240
+ <CardContent className="flex-1">
241
+ {query.isPending ? (
242
+ <Skeleton aria-label="Loading distribution" className="h-48" />
243
+ ) : query.error ? (
244
+ <InsightsErrorAlert
245
+ error={query.error}
246
+ fallbackTitle="Distribution unavailable"
247
+ />
248
+ ) : !report?.activeInstallations ? (
249
+ <Empty className="h-40">
250
+ <EmptyHeader>
251
+ <EmptyTitle>No reporting installations</EmptyTitle>
252
+ <EmptyDescription>
253
+ Try a different filter or period.
254
+ </EmptyDescription>
255
+ </EmptyHeader>
256
+ </Empty>
257
+ ) : (
258
+ <div className="flex flex-col gap-6">
259
+ {(["versions", "platforms"] as const).map((dimension) => (
260
+ <section
261
+ key={dimension}
262
+ aria-label={
263
+ dimension === "versions"
264
+ ? "App version distribution"
265
+ : "Platform distribution"
266
+ }
267
+ className="flex flex-col gap-4"
268
+ >
269
+ {dimension === "platforms" ? <Separator /> : null}
270
+ <h3 className="flex items-center gap-2 text-sm font-medium text-muted-foreground">
271
+ {dimension === "versions" ? "App versions" : "Platforms"}
272
+ {dimension === "versions" ? (
273
+ <Badge variant="secondary">
274
+ {report.versions.length}
275
+ </Badge>
276
+ ) : null}
277
+ </h3>
278
+ <ScrollArea className="min-w-0 [&_[data-slot=scroll-area-viewport]]:max-h-40">
279
+ <dl className="flex flex-col gap-4 pr-4">
280
+ {report[dimension].map((row) => {
281
+ const name =
282
+ dimension === "platforms"
283
+ ? row.name === "ios"
284
+ ? "iOS"
285
+ : "Android"
286
+ : row.name;
287
+ const share =
288
+ (row.installations /
289
+ (distributionTotals?.[dimension] ?? 1)) *
290
+ 100;
291
+ return (
292
+ <div
293
+ key={row.name}
294
+ className="group relative flex min-h-11 flex-col gap-2 rounded-sm focus-within:ring-2 focus-within:ring-ring sm:min-h-0"
295
+ >
296
+ <div className="flex min-w-0 items-baseline justify-between gap-3">
297
+ <dt
298
+ className="flex min-w-0 items-center gap-2 text-sm"
299
+ title={name}
300
+ >
301
+ {dimension === "platforms" &&
302
+ (row.name === "ios" ||
303
+ row.name === "android") ? (
304
+ <PlatformIcon
305
+ platform={row.name}
306
+ className="size-4 shrink-0"
307
+ />
308
+ ) : null}
309
+ {dimension === "versions" ? (
310
+ <Link
311
+ to="/insights/distribution"
312
+ search={{ ...search, version: row.name }}
313
+ aria-label={`View bundles for app version ${row.name}`}
314
+ className="flex min-w-0 items-center gap-1 after:absolute after:inset-0 group-hover:underline"
315
+ >
316
+ <span className="truncate">{name}</span>
317
+ <ChevronRight
318
+ aria-hidden="true"
319
+ className="size-3 shrink-0 text-muted-foreground"
320
+ />
321
+ </Link>
322
+ ) : (
323
+ <span className="truncate">{name}</span>
324
+ )}
325
+ </dt>
326
+ <dd className="flex shrink-0 gap-3 text-sm tabular-nums">
327
+ <span>
328
+ {row.installations.toLocaleString()}
329
+ </span>
330
+ <span className="min-w-10 text-right text-muted-foreground">
331
+ {share.toFixed(1)}%
332
+ </span>
333
+ </dd>
334
+ </div>
335
+ <Progress
336
+ aria-label={`${name} share`}
337
+ aria-valuetext={`${row.installations} installations, ${share.toFixed(1)}%`}
338
+ value={share}
339
+ />
340
+ </div>
341
+ );
342
+ })}
343
+ </dl>
344
+ </ScrollArea>
345
+ </section>
346
+ ))}
347
+ </div>
348
+ )}
349
+ </CardContent>
350
+ <CardFooter className="border-t pt-4">
351
+ <Link
352
+ to="/insights/distribution"
353
+ search={search}
354
+ className={buttonVariants({
355
+ variant: "outline",
356
+ className: "h-11 w-full sm:h-9",
357
+ })}
358
+ >
359
+ View distribution
360
+ <ArrowRight aria-hidden="true" data-icon="inline-end" />
361
+ </Link>
362
+ </CardFooter>
363
+ </Card>
364
+ </div>
365
+ );
366
+ }
@@ -0,0 +1,36 @@
1
+ import { Badge } from "@/components/ui/badge";
2
+
3
+ /**
4
+ * A built-in bundle's ID: every native build makes it from its build time with
5
+ * the random bits zeroed (the CLI's `generateMinBundleId`, and the iOS and
6
+ * Android fallbacks), or the nil UUID when iOS can't read its build time. A
7
+ * deployed bundle's ID is a random UUIDv7, so it never has this shape.
8
+ */
9
+ const BUILTIN_BUNDLE_ID =
10
+ /^(?:[0-9a-f]{8}-[0-9a-f]{4}-7000-8000-000000000000|00000000-0000-0000-0000-000000000000)$/iu;
11
+
12
+ /**
13
+ * Whether a reported bundle is one a native build shipped: the report's
14
+ * `minBundleId`, or, from an SDK that reports none, an ID in the built-in
15
+ * shape.
16
+ */
17
+ export const isBuiltinBundle = (
18
+ bundleId: string | null | undefined,
19
+ minBundleId: string | undefined,
20
+ ): boolean =>
21
+ bundleId !== null &&
22
+ bundleId !== undefined &&
23
+ (bundleId === minBundleId || BUILTIN_BUNDLE_ID.test(bundleId));
24
+
25
+ /** Marks a bundle ID as the bundle its native build shipped. */
26
+ export function BuiltinBundleBadge() {
27
+ return (
28
+ <Badge
29
+ className="shrink-0 font-sans font-normal"
30
+ title="The bundle the native build shipped"
31
+ variant="secondary"
32
+ >
33
+ Built-in bundle
34
+ </Badge>
35
+ );
36
+ }