@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,33 +1,152 @@
1
- import { Activity, Check, ChevronDown, RotateCcw } from "lucide-react";
1
+ import {
2
+ Activity,
3
+ ArrowRightLeft,
4
+ Check,
5
+ ChevronDown,
6
+ CircleAlert,
7
+ Copy,
8
+ Download,
9
+ RotateCcw,
10
+ Smartphone,
11
+ Sparkles,
12
+ } from "lucide-react";
2
13
  import { useEffect, useState } from "react";
14
+ import { toast } from "sonner";
3
15
 
4
16
  import { HashValueDisplay } from "@/components/HashValueDisplay";
5
17
  import { Badge } from "@/components/ui/badge";
18
+ import { Button } from "@/components/ui/button";
19
+ import {
20
+ Empty,
21
+ EmptyDescription,
22
+ EmptyHeader,
23
+ EmptyTitle,
24
+ } from "@/components/ui/empty";
25
+ import {
26
+ Sheet,
27
+ SheetContent,
28
+ SheetDescription,
29
+ SheetHeader,
30
+ SheetTitle,
31
+ SheetTrigger,
32
+ } from "@/components/ui/sheet";
33
+ import { describeFailure } from "@/lib/insights-failures";
6
34
  import type { InsightsEventRow } from "@/lib/insights-view";
7
35
 
36
+ import { BuiltinBundleBadge, isBuiltinBundle } from "./BuiltinBundle";
37
+
8
38
  type EventHistoryRow = InsightsEventRow;
9
39
 
10
40
  const eventTypes = {
41
+ UPDATE_DOWNLOADED: {
42
+ label: "Downloaded",
43
+ description: "Downloaded. It launches when the app restarts.",
44
+ variant: "default",
45
+ icon: Download,
46
+ },
11
47
  UPDATE_APPLIED: {
12
- label: "Update applied",
13
- description: "The app started using the downloaded update.",
48
+ label: "Launched",
49
+ description: "The app restarted into the downloaded bundle.",
14
50
  variant: "success",
15
51
  icon: Check,
16
52
  },
17
53
  RECOVERED: {
18
- label: "Rolled back",
19
- description: "The app recovered to a previous working bundle.",
54
+ label: "Crashed",
55
+ description: "Crashed on the bundle and rolled back.",
20
56
  variant: "warning",
21
57
  icon: RotateCcw,
22
58
  },
59
+ UPDATE_FAILED: {
60
+ label: "Update failed",
61
+ description: "An update check, download, or install failed.",
62
+ variant: "destructive",
63
+ icon: CircleAlert,
64
+ },
23
65
  UNCHANGED: {
24
- label: "No change",
25
- description: "The app continues using the same bundle files.",
66
+ label: "Launch",
67
+ description: "The app launched; the report changed nothing.",
26
68
  variant: "secondary",
27
69
  icon: Activity,
28
70
  },
29
71
  } as const;
30
72
 
73
+ type EventType = {
74
+ readonly label: string;
75
+ readonly description: string;
76
+ readonly variant: (typeof eventTypes)[keyof typeof eventTypes]["variant"];
77
+ readonly icon: (typeof eventTypes)[keyof typeof eventTypes]["icon"];
78
+ };
79
+
80
+ /**
81
+ * A kept UNCHANGED report, named by what it changed: an installation first
82
+ * seen, an App Store update, a launch with no apply report, an adopted
83
+ * release, or a channel switch.
84
+ */
85
+ const changeTypeOf = (
86
+ event: Pick<EventHistoryRow, "change" | "appVersion" | "channel">,
87
+ ): EventType => {
88
+ const { kinds = [], previous } = event.change ?? {};
89
+ if (kinds.includes("first_seen")) {
90
+ return {
91
+ label: "First seen",
92
+ description: "The installation's first report to this server.",
93
+ variant: "secondary",
94
+ icon: Sparkles,
95
+ };
96
+ }
97
+ if (kinds.includes("app_version") || kinds.includes("native_build")) {
98
+ return {
99
+ label: "App updated",
100
+ description:
101
+ previous && previous.appVersion !== event.appVersion
102
+ ? `From app ${previous.appVersion} to ${event.appVersion}.`
103
+ : "A new build of the same app version.",
104
+ variant: "secondary",
105
+ icon: Smartphone,
106
+ };
107
+ }
108
+ if (kinds.includes("bundle")) {
109
+ return {
110
+ label: "Launched",
111
+ description:
112
+ "Seen running this bundle; the report of the restart into it never arrived.",
113
+ variant: "success",
114
+ icon: Check,
115
+ };
116
+ }
117
+ if (kinds.includes("release")) {
118
+ return {
119
+ label: "Release adopted",
120
+ description: "The bundle it runs now ships under another release.",
121
+ variant: "secondary",
122
+ icon: ArrowRightLeft,
123
+ };
124
+ }
125
+ if (kinds.includes("channel")) {
126
+ return {
127
+ label: "Channel changed",
128
+ description: previous
129
+ ? `From ${previous.channel} to ${event.channel}.`
130
+ : "It reports on another channel.",
131
+ variant: "secondary",
132
+ icon: ArrowRightLeft,
133
+ };
134
+ }
135
+ return eventTypes.UNCHANGED;
136
+ };
137
+
138
+ /** How the console names an event's type. */
139
+ const eventTypeOf = (
140
+ event: Pick<EventHistoryRow, "type"> & Partial<EventHistoryRow>,
141
+ ): EventType =>
142
+ event.type === "UNCHANGED" && event.change
143
+ ? changeTypeOf({
144
+ change: event.change,
145
+ appVersion: event.appVersion ?? "",
146
+ channel: event.channel ?? "",
147
+ })
148
+ : eventTypes[event.type];
149
+
31
150
  export function useInsightsTimeFormat() {
32
151
  const [timeZone, setTimeZone] = useState("UTC");
33
152
  useEffect(() => {
@@ -92,13 +211,198 @@ export function EventTimestamp({
92
211
  );
93
212
  }
94
213
 
95
- export function EventTypeDetails({
96
- type,
214
+ const deliveries: Readonly<Record<string, string>> = {
215
+ patch: "A patch delivered it.",
216
+ manifest: "Only the changed files were downloaded.",
217
+ archive: "The full archive was downloaded.",
218
+ };
219
+
220
+ /** What the event's report added: where an update failed, or how a bundle arrived. */
221
+ const eventNote = (
222
+ event: Pick<
223
+ EventHistoryRow,
224
+ | "type"
225
+ | "failure"
226
+ | "delivery"
227
+ | "patchFallback"
228
+ | "httpResponse"
229
+ | "late"
230
+ | "impliedDownload"
231
+ >,
232
+ ): string | null => {
233
+ if (event.late) {
234
+ return "Counted nothing: the installation had already downloaded or run this bundle.";
235
+ }
236
+ if (event.impliedDownload) {
237
+ return "Its download report never arrived; the download counted with it.";
238
+ }
239
+ if (event.type === "UPDATE_FAILED" && event.failure) {
240
+ return describeFailure(event.failure);
241
+ }
242
+ if (event.type === "UPDATE_DOWNLOADED" && event.delivery) {
243
+ const delivered = deliveries[event.delivery] ?? null;
244
+ return event.patchFallback
245
+ ? `The patch failed. ${delivered ?? ""}`.trim()
246
+ : delivered;
247
+ }
248
+ return null;
249
+ };
250
+
251
+ type EventDetail = Pick<EventHistoryRow, "type"> & Partial<EventHistoryRow>;
252
+
253
+ export function HttpResponseBody({
254
+ response,
255
+ }: {
256
+ readonly response: NonNullable<EventHistoryRow["httpResponse"]>;
257
+ }) {
258
+ const copyBody = async () => {
259
+ try {
260
+ await navigator.clipboard.writeText(response.body!);
261
+ toast.success("Response body copied");
262
+ } catch {
263
+ toast.error("Could not copy the response body");
264
+ }
265
+ };
266
+ return (
267
+ <section aria-label="Response body" className="flex min-w-0 flex-col gap-3">
268
+ <div className="flex flex-wrap items-center justify-between gap-3">
269
+ <h3 className="text-sm font-medium">Response body</h3>
270
+ <Button
271
+ variant="outline"
272
+ className="min-h-11"
273
+ disabled={response.body === null || response.body === ""}
274
+ onClick={() => void copyBody()}
275
+ >
276
+ <Copy aria-hidden="true" data-icon="inline-start" /> Copy body
277
+ </Button>
278
+ </div>
279
+ {response.bodyTruncated ? (
280
+ <p className="text-xs text-muted-foreground">
281
+ Truncated to the 4 KiB reporting limit. Copy includes only the stored
282
+ text.
283
+ </p>
284
+ ) : null}
285
+ {response.body ? (
286
+ <pre className="rounded-md border bg-muted/30 p-4 font-mono text-xs leading-relaxed whitespace-pre-wrap wrap-anywhere">
287
+ {response.body}
288
+ </pre>
289
+ ) : (
290
+ <Empty>
291
+ <EmptyHeader>
292
+ <EmptyTitle>
293
+ {response.body === null
294
+ ? "Response body unavailable"
295
+ : "Empty response body"}
296
+ </EmptyTitle>
297
+ <EmptyDescription>
298
+ {response.body === null
299
+ ? "The client received the HTTP status but could not read the body."
300
+ : response.status === 304
301
+ ? "The server returned no body. The client can reuse its cached catalog."
302
+ : "The server returned no text in this response."}
303
+ </EmptyDescription>
304
+ </EmptyHeader>
305
+ </Empty>
306
+ )}
307
+ </section>
308
+ );
309
+ }
310
+
311
+ export function HttpResponseDetails({
312
+ event,
97
313
  }: {
98
- readonly type: EventHistoryRow["type"];
314
+ readonly event: Partial<EventHistoryRow>;
99
315
  }) {
100
- const eventType = eventTypes[type];
316
+ const response = event.httpResponse!;
317
+ const formatter = useInsightsTimeFormat();
318
+ const status =
319
+ response.status === 304
320
+ ? "Not modified"
321
+ : response.status >= 500
322
+ ? "Server error"
323
+ : response.status >= 400
324
+ ? "Request error"
325
+ : response.status >= 300
326
+ ? "Redirect"
327
+ : "Success";
328
+ const resource = response.resource === "catalog" ? "Catalog" : "Artifact";
329
+ const context = [
330
+ [
331
+ "App",
332
+ event.platform &&
333
+ `${event.platform === "ios" ? "iOS" : "Android"} ${event.appVersion}`,
334
+ ],
335
+ ["Channel", event.channel],
336
+ ["SDK", event.sdkVersion],
337
+ ["Installation", event.installId],
338
+ ].filter(([, value]) => value != null);
339
+ return (
340
+ <Sheet>
341
+ <SheetTrigger
342
+ aria-label={`View ${resource.toLowerCase()} response: HTTP ${response.status}`}
343
+ render={
344
+ <Button
345
+ variant="ghost"
346
+ className="-ml-2 h-auto min-h-11 justify-start"
347
+ />
348
+ }
349
+ >
350
+ <Badge variant={response.status >= 400 ? "destructive" : "secondary"}>
351
+ HTTP {response.status}
352
+ </Badge>
353
+ <span>{resource} response</span>
354
+ </SheetTrigger>
355
+ <SheetContent className="data-[side=right]:w-full data-[side=right]:sm:max-w-2xl">
356
+ <SheetHeader className="border-b pr-14">
357
+ <SheetTitle>HTTP response</SheetTitle>
358
+ <SheetDescription>
359
+ {resource} · HTTP {response.status} · {status}. Most recent response
360
+ available when this report was created.
361
+ </SheetDescription>
362
+ </SheetHeader>
363
+ <div className="flex min-h-0 flex-1 flex-col gap-6 overflow-y-auto p-6">
364
+ <section aria-label="Request" className="flex min-w-0 flex-col gap-2">
365
+ <h3 className="text-sm font-medium">Request</h3>
366
+ <p className="font-mono text-xs leading-relaxed whitespace-pre-wrap wrap-anywhere">
367
+ GET {response.path}
368
+ </p>
369
+ {response.receivedAtMs != null ? (
370
+ <div className="text-xs text-muted-foreground">
371
+ Response received{" "}
372
+ <EventTimestamp
373
+ value={response.receivedAtMs}
374
+ formatter={formatter}
375
+ />
376
+ </div>
377
+ ) : null}
378
+ </section>
379
+ <HttpResponseBody response={response} />
380
+ {context.length ? (
381
+ <section
382
+ aria-label="Response context"
383
+ className="flex flex-col gap-3"
384
+ >
385
+ <h3 className="text-sm font-medium">Response context</h3>
386
+ <dl className="grid grid-cols-2 gap-x-6 gap-y-4">
387
+ {context.map(([label, value]) => (
388
+ <div key={label} className="min-w-0">
389
+ <dt className="text-xs text-muted-foreground">{label}</dt>
390
+ <dd className="mt-1 text-sm wrap-anywhere">{value}</dd>
391
+ </div>
392
+ ))}
393
+ </dl>
394
+ </section>
395
+ ) : null}
396
+ </div>
397
+ </SheetContent>
398
+ </Sheet>
399
+ );
400
+ }
401
+
402
+ export function EventTypeDetails({ event }: { readonly event: EventDetail }) {
403
+ const eventType = eventTypeOf(event);
101
404
  const Icon = eventType.icon;
405
+ const note = eventNote(event);
102
406
  return (
103
407
  <div className="flex min-w-0 flex-col items-start gap-2">
104
408
  <Badge
@@ -108,9 +412,25 @@ export function EventTypeDetails({
108
412
  <Icon aria-hidden="true" />
109
413
  {eventType.label}
110
414
  </Badge>
111
- <p className="max-w-56 whitespace-normal text-xs text-muted-foreground">
112
- {eventType.description}
415
+ <p className="max-w-56 whitespace-pre-wrap wrap-anywhere text-xs text-muted-foreground">
416
+ {event.type === "UPDATE_FAILED" && note ? note : eventType.description}
113
417
  </p>
418
+ {event.httpResponse ? <HttpResponseDetails event={event} /> : null}
419
+ {event.type === "UPDATE_FAILED" && event.failure?.errorStack ? (
420
+ <details className="w-full max-w-56 text-xs">
421
+ <summary className="cursor-pointer text-muted-foreground">
422
+ Stack trace
423
+ </summary>
424
+ <pre className="mt-2 max-h-64 overflow-auto whitespace-pre-wrap wrap-anywhere font-mono">
425
+ {event.failure.errorStack}
426
+ </pre>
427
+ </details>
428
+ ) : null}
429
+ {event.type !== "UPDATE_FAILED" && note ? (
430
+ <p className="max-w-56 whitespace-normal text-xs text-muted-foreground">
431
+ {note}
432
+ </p>
433
+ ) : null}
114
434
  </div>
115
435
  );
116
436
  }
@@ -119,30 +439,74 @@ export function EventBundleTransition({
119
439
  event,
120
440
  touch = false,
121
441
  }: {
122
- readonly event: Pick<EventHistoryRow, "type" | "fromBundleId" | "toBundleId">;
442
+ readonly event: Pick<
443
+ EventHistoryRow,
444
+ "type" | "fromBundleId" | "toBundleId" | "failure" | "minBundleId"
445
+ > &
446
+ Partial<Pick<EventHistoryRow, "change">>;
123
447
  readonly touch?: boolean;
124
448
  }) {
125
- const changed = event.type === "UPDATE_APPLIED" || event.type === "RECOVERED";
449
+ const downloaded = event.type === "UPDATE_DOWNLOADED";
450
+ const failed = event.type === "UPDATE_FAILED";
451
+ // A failed check targets no bundle: it names the one running.
452
+ const targeted = !failed || event.failure?.stage !== "check";
453
+ // A kept UNCHANGED report that moved bundles names the one before it.
454
+ const moved =
455
+ event.type === "UNCHANGED" &&
456
+ event.change?.kinds.includes("bundle") === true &&
457
+ event.change.previous !== undefined;
458
+ const fromBundleId = moved
459
+ ? event.change!.previous!.bundleId
460
+ : event.fromBundleId;
461
+ const changed =
462
+ downloaded ||
463
+ failed ||
464
+ moved ||
465
+ event.type === "UPDATE_APPLIED" ||
466
+ event.type === "RECOVERED";
126
467
  return (
127
468
  <dl className="grid grid-cols-[auto_minmax(0,1fr)] items-center gap-x-2 gap-y-2">
128
- {event.fromBundleId && changed ? (
469
+ {fromBundleId && changed ? (
470
+ <>
471
+ <dt className="text-muted-foreground">
472
+ {downloaded || failed ? "Running" : "From"}
473
+ </dt>
474
+ <dd className="flex min-w-0 flex-wrap items-center gap-2">
475
+ <HashValueDisplay
476
+ value={fromBundleId}
477
+ buttonClassName={touch ? "min-h-11 px-3" : undefined}
478
+ />
479
+ {isBuiltinBundle(
480
+ fromBundleId,
481
+ moved ? event.change!.previous!.minBundleId : event.minBundleId,
482
+ ) ? (
483
+ <BuiltinBundleBadge />
484
+ ) : null}
485
+ </dd>
486
+ </>
487
+ ) : null}
488
+ {targeted ? (
129
489
  <>
130
- <dt className="text-muted-foreground">From</dt>
131
- <dd>
490
+ <dt className="text-muted-foreground">
491
+ {downloaded
492
+ ? "Pending"
493
+ : failed
494
+ ? "Target"
495
+ : changed
496
+ ? "To"
497
+ : "Current"}
498
+ </dt>
499
+ <dd className="flex min-w-0 flex-wrap items-center gap-2">
132
500
  <HashValueDisplay
133
- value={event.fromBundleId}
501
+ value={event.toBundleId}
134
502
  buttonClassName={touch ? "min-h-11 px-3" : undefined}
135
503
  />
504
+ {isBuiltinBundle(event.toBundleId, event.minBundleId) ? (
505
+ <BuiltinBundleBadge />
506
+ ) : null}
136
507
  </dd>
137
508
  </>
138
509
  ) : null}
139
- <dt className="text-muted-foreground">{changed ? "To" : "Current"}</dt>
140
- <dd>
141
- <HashValueDisplay
142
- value={event.toBundleId}
143
- buttonClassName={touch ? "min-h-11 px-3" : undefined}
144
- />
145
- </dd>
146
510
  </dl>
147
511
  );
148
512
  }