@hot-updater/console 1.1.4 → 1.2.0-rc.1

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 (273) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/-native-builds-search-C-TGpFAm.js +1 -0
  3. package/.output/public/assets/{ConsoleFeatureUnavailable-C0KfsKWL.js → ConsoleFeatureUnavailable-CUtcXuY2.js} +1 -1
  4. package/.output/public/assets/EventDetails-Dl2RvPAk.js +1 -0
  5. package/.output/public/assets/HashValueDisplay-6lNRxDJX.js +1 -0
  6. package/.output/public/assets/InsightsPageHeader-DHhqY3DT.js +1 -0
  7. package/.output/public/assets/NotFoundPage-DZ3DxyRA.js +1 -0
  8. package/.output/public/assets/PlatformIcon-BBWQlWm9.js +1 -0
  9. package/.output/public/assets/RolloutPercentageBadge-Cxogpi8F.js +1 -0
  10. package/.output/public/assets/StoreSubmission-JpngSvHS.js +1 -0
  11. package/.output/public/assets/alert-dialog-BqYScr9y.js +1 -0
  12. package/.output/public/assets/api-P2g8dCNg.js +1 -0
  13. package/.output/public/assets/api-keys-DWQC2q6y.js +1 -0
  14. package/.output/public/assets/api-keys-FueRkF9q.js +1 -0
  15. package/.output/public/assets/arrow-left-g9cKqXuC.js +1 -0
  16. package/.output/public/assets/arrow-right-CNII8TYn.js +1 -0
  17. package/.output/public/assets/arrow-up-right-DK8Zdg40.js +1 -0
  18. package/.output/public/assets/badge-DWFcDWho.js +1 -0
  19. package/.output/public/assets/check-CXVR3s3X.js +1 -0
  20. package/.output/public/assets/chevron-right-BoUXo82O.js +1 -0
  21. package/.output/public/assets/circle-off-C7Muo0ss.js +1 -0
  22. package/.output/public/assets/{clipboard-DTkrlIMn.js → clipboard-DQbOcrL7.js} +1 -1
  23. package/.output/public/assets/console-features-api-DEXSwFtc.js +1 -0
  24. package/.output/public/assets/copy-DsuLj3oj.js +1 -0
  25. package/.output/public/assets/dialog-CNUPxNxH.js +1 -0
  26. package/.output/public/assets/{dist-dDj-R6uh.js → dist-CPlO6ko9.js} +1 -1
  27. package/.output/public/assets/download-Cf24LBde.js +1 -0
  28. package/.output/public/assets/{empty-Bf4DanOL.js → empty-B3Uwdd6k.js} +1 -1
  29. package/.output/public/assets/{field-GxF9SyUo.js → field-D-2-mnNh.js} +1 -1
  30. package/.output/public/assets/history-DqHlgSuV.js +1 -0
  31. package/.output/public/assets/index-BWU6owTG.js +10 -0
  32. package/.output/public/assets/{input-group-B4nrqIh0.js → input-group-D3OUBk4n.js} +1 -1
  33. package/.output/public/assets/insights-B-0odqpt.js +42 -0
  34. package/.output/public/assets/insights-BSVGfxSL.js +1 -0
  35. package/.output/public/assets/insights-NK5B6ReS.js +2 -0
  36. package/.output/public/assets/insights-api-BVCXJsoV.js +1 -0
  37. package/.output/public/assets/insights-search-DghCbEnk.js +1 -0
  38. package/.output/public/assets/insights-usage-rpc-CKQH0pUS.js +1 -0
  39. package/.output/public/assets/insights_.distribution-CJvgwcVZ.js +2 -0
  40. package/.output/public/assets/insights_.distribution-DblZM0mO.js +1 -0
  41. package/.output/public/assets/insights_.distribution-dvk6vYDM.js +1 -0
  42. package/.output/public/assets/installations-B674P5Z5.js +2 -0
  43. package/.output/public/assets/installations-BWxczZ2t.js +1 -0
  44. package/.output/public/assets/installations-Dv4kWQYz.js +1 -0
  45. package/.output/public/assets/{key-round-B4fI1psK.js → key-round-DwNKkHhy.js} +1 -1
  46. package/.output/public/assets/link-DTEyW70e.js +2 -0
  47. package/.output/public/assets/{list-Dtj7TtzV.js → list--NIee1FZ.js} +1 -1
  48. package/.output/public/assets/native-builds-BOC71grI.js +1 -0
  49. package/.output/public/assets/native-builds-BswZazmc.js +1 -0
  50. package/.output/public/assets/native-builds-c4BpOLAe.js +2 -0
  51. package/.output/public/assets/native-builds_._buildId-D_Spjl10.js +1 -0
  52. package/.output/public/assets/native-builds_._buildId-DtoXD8rz.js +2 -0
  53. package/.output/public/assets/plus-BReVKct-.js +1 -0
  54. package/.output/public/assets/preload-helper-B44EvKhG.js +1 -0
  55. package/.output/public/assets/{refresh-cw-DjIKjmrS.js → refresh-cw-B9HHjLej.js} +1 -1
  56. package/.output/public/assets/relativeTime-YQt84dYr.js +1 -0
  57. package/.output/public/assets/remote-config-B7ujqhLa.js +6 -0
  58. package/.output/public/assets/remote-config-WjpozBG5.js +1 -0
  59. package/.output/public/assets/remote-config-gXeH6PBW.js +1 -0
  60. package/.output/public/assets/rotate-cw-Cv2aVbYr.js +1 -0
  61. package/.output/public/assets/routes-BDdBIxYS.js +1 -0
  62. package/.output/public/assets/routes-CCD33Azv.js +2 -0
  63. package/.output/public/assets/search-BCel4Oy6.js +1 -0
  64. package/.output/public/assets/select-CBIU0_M1.js +1 -0
  65. package/.output/public/assets/{sidebar-BqX460IW.js → sidebar-Di9SN47G.js} +1 -1
  66. package/.output/public/assets/smartphone-CMaSy_ir.js +1 -0
  67. package/.output/public/assets/styles-Ccxthuz1.css +2 -0
  68. package/.output/public/assets/switch-BpdiHL_t.js +1 -0
  69. package/.output/public/assets/{table-ek1DmRHq.js → table-Bpy3SvSo.js} +1 -1
  70. package/.output/public/assets/{tabs-CgEH_fMT.js → tabs-Xmt7tZeG.js} +1 -1
  71. package/.output/public/assets/{undo-2-DxXx9Zvr.js → undo-2-CUX96_BG.js} +1 -1
  72. package/.output/public/assets/useCompositeListItem-JmyDfo3-.js +1 -0
  73. package/.output/public/assets/useInfiniteQuery-DX4WpBRG.js +1 -0
  74. package/.output/public/assets/useMutation-DbYw7boA.js +1 -0
  75. package/.output/public/assets/uuidv7-zXMtwR9Q.js +1 -0
  76. package/.output/public/assets/{valueToPercent-B44vDssN.js → valueToPercent-BLwGy_xK.js} +1 -1
  77. package/.output/server/{__23tanstack-start-server-fn-resolver-KpQ5Z_24.mjs → __23tanstack-start-server-fn-resolver-CygMPYHZ.mjs} +64 -40
  78. package/.output/server/_chunks/ssr-renderer.mjs +2 -2
  79. package/.output/server/_libs/@tanstack/react-router+[...].mjs +1 -1
  80. package/.output/server/_libs/@tanstack/react-router-ssr-query+[...].mjs +1 -1
  81. package/.output/server/_libs/lucide-react.mjs +88 -1
  82. package/.output/server/_libs/uqr.mjs +858 -0
  83. package/.output/server/_ssr/-native-builds-search-CwNcoXf4.mjs +37 -0
  84. package/.output/server/_ssr/{BundleIdDisplay-CjSnY65J.mjs → BundleIdDisplay-DOPz4pUS.mjs} +2 -2
  85. package/.output/server/_ssr/{ConsoleFeatureUnavailable-CHxn9f-w.mjs → ConsoleFeatureUnavailable-Xb1JKqcc.mjs} +7 -7
  86. package/.output/server/_ssr/{EventDetails-l6dF54zp.mjs → EventDetails-D7MejFCN.mjs} +8 -8
  87. package/.output/server/_ssr/{HashValueDisplay-Zs7ABoOi.mjs → HashValueDisplay-Dd-wu5rY.mjs} +2 -2
  88. package/.output/server/_ssr/{InsightsPageHeader-ZlAlDxQy.mjs → InsightsPageHeader-CWf1n4Vt.mjs} +13 -11
  89. package/.output/server/_ssr/{NotFoundPage-u28ndvp1.mjs → NotFoundPage-C5rFdUpg.mjs} +2 -2
  90. package/.output/server/_ssr/PlatformIcon-CFLiTjh1.mjs +29 -0
  91. package/.output/server/_ssr/RolloutPercentageBadge-g0Bhfl3M.mjs +21 -0
  92. package/.output/server/_ssr/StoreSubmission-JZ2Zltak.mjs +139 -0
  93. package/.output/server/_ssr/{alert-dialog-B8AqlJwo.mjs → alert-dialog-CvNvTvIJ.mjs} +1 -1
  94. package/.output/server/_ssr/{api-C_0B7NXM.mjs → api-0vtwA5vY.mjs} +126 -7
  95. package/.output/server/_ssr/{api-keys-pRNvn2-9.mjs → api-keys-D5dyA4D1.mjs} +10 -10
  96. package/.output/server/_ssr/{api-keys-rpc-wecWs0nA.mjs → api-keys-rpc-BOIUHhDi.mjs} +5 -5
  97. package/.output/server/_ssr/{api-keys-CLH38u9B.mjs → api-keys-yFlQDwQF.mjs} +2 -2
  98. package/.output/server/_ssr/{api-rpc-DWN8eOHS.mjs → api-rpc-COeFOpYi.mjs} +79 -12
  99. package/.output/server/_ssr/{auth-UP0wXs4i.mjs → auth-Z-wLddzh.mjs} +1 -1
  100. package/.output/server/_ssr/{auth-rpc-CLRArbIl.mjs → auth-rpc-D1ss2GUI.mjs} +6 -6
  101. package/.output/server/_ssr/{auth.server-DR9zc0EU.mjs → auth.server-DYS1OJ6P.mjs} +771 -641
  102. package/.output/server/_ssr/{badge-BpT7r-ng.mjs → badge-CEdVRgyl.mjs} +1 -1
  103. package/.output/server/_ssr/{bundleActivity-0qFIcvqt.mjs → bundleActivity-MLrjNJCT.mjs} +1 -1
  104. package/.output/server/_ssr/{config-WVX4IxSR.mjs → config-CjIBFhJX.mjs} +1 -1
  105. package/.output/server/_ssr/config.server-NnMFjMFX.mjs +43 -0
  106. package/.output/server/_ssr/{console-access-aUpQs49I.mjs → console-access-33BNlH97.mjs} +3 -3
  107. package/.output/server/_ssr/{console-features-4xAGfZHw.mjs → console-features-BTV-XuhQ.mjs} +1 -1
  108. package/.output/server/_ssr/{console-features-api-DSSgCV3v.mjs → console-features-api-v1fSycue.mjs} +6 -6
  109. package/.output/server/_ssr/{console-features-rpc-D6kMlR2A.mjs → console-features-rpc-C7XNVqm0.mjs} +5 -5
  110. package/.output/server/_ssr/createCsrfMiddleware-BwHbC8n-.mjs +159 -0
  111. package/.output/server/_ssr/createMiddleware-C3ACsfuG.mjs +24 -0
  112. package/.output/server/_ssr/{createMiddleware-B1iPez7u.mjs → createServerFn-AQvBMBjJ.mjs} +2 -23
  113. package/.output/server/_ssr/{createServerRpc-BaDJLGBx.mjs → createServerRpc-BVvRVOz5.mjs} +2 -2
  114. package/.output/server/_ssr/{databaseConfig-C5SkAyUy.mjs → databaseConfig-B_Bg7qS5.mjs} +1 -1
  115. package/.output/server/_ssr/{databaseJsonValue-Csbuzc9Q.mjs → databaseJsonValue-kS7cvEtz.mjs} +1 -1
  116. package/.output/server/_ssr/{databaseRows-CPphvbag.mjs → databaseRows-B6H8Cmgq.mjs} +3 -3
  117. package/.output/server/_ssr/{dialog-B4ALf7NJ.mjs → dialog-C8CS8RMt.mjs} +1 -1
  118. package/.output/server/_ssr/{dist-CbQbBIw-.mjs → dist-TEpM_UAD.mjs} +125 -125
  119. package/.output/server/_ssr/{downloadBundle-94jPBGSO.mjs → downloadBundle-DCmr7vsj.mjs} +1 -1
  120. package/.output/server/_ssr/{empty-Bh1FEeYF.mjs → empty-CkdEAvCY.mjs} +2 -2
  121. package/.output/server/_ssr/{empty-plugin-adapters-CpCHi1TV.mjs → empty-plugin-adapters-zrZ0xs6n.mjs} +1 -1
  122. package/.output/server/_ssr/{failureReports-Bh22wois.mjs → failureReports-Cn_zU9S8.mjs} +3 -3
  123. package/.output/server/_ssr/{field-HKCaPH3e.mjs → field-CW08sZXd.mjs} +2 -2
  124. package/.output/server/_ssr/{getBundleChildren-DfxB2K8D.mjs → getBundleChildren-rtkEEJw5.mjs} +2 -2
  125. package/.output/server/_ssr/git-CTA8Aqr0.mjs +56 -0
  126. package/.output/server/_ssr/{input-group-xm3LzDuq.mjs → input-group-D-TpFPuG.mjs} +1 -1
  127. package/.output/server/_ssr/{insights-BKZpJ_K4.mjs → insights-CMyzPs8l.mjs} +28 -27
  128. package/.output/server/_ssr/{insights-CCyTACIw.mjs → insights-CYeBl8N9.mjs} +5 -5
  129. package/.output/server/_ssr/{insights-CNqWQLJR.mjs → insights-DAi9KknT.mjs} +2 -2
  130. package/.output/server/_ssr/{insights-api-DtRFz5X3.mjs → insights-api-BFARQ5ct.mjs} +6 -6
  131. package/.output/server/_ssr/{insights-errors-Iy-lBaM7.mjs → insights-errors-7BCwFybo.mjs} +2 -2
  132. package/.output/server/_ssr/{insights-failures-BJN3RfLu.mjs → insights-failures-B9VPkzZE.mjs} +2 -2
  133. package/.output/server/_ssr/{insights-failures-rpc-DLZ91uOG.mjs → insights-failures-rpc-Q4WNNJkU.mjs} +12 -12
  134. package/.output/server/_ssr/{insights-recovery-BUuQdlA3.mjs → insights-recovery-BtXVU3ro.mjs} +1 -1
  135. package/.output/server/_ssr/{insights-recovery-rpc-BQHUhPi7.mjs → insights-recovery-rpc-CY5RYJKa.mjs} +8 -8
  136. package/.output/server/_ssr/{insights-rpc-C6Vukyn7.mjs → insights-rpc-BO7_evvs.mjs} +5 -5
  137. package/.output/server/_ssr/{insights-search-CBYoxT7v.mjs → insights-search-DKfxgHD3.mjs} +5 -5
  138. package/.output/server/_ssr/{insights-usage-CHqvtehH.mjs → insights-usage-DiGnuxW8.mjs} +1 -1
  139. package/.output/server/_ssr/{insights-usage-rpc-BJ7a-xco.mjs → insights-usage-rpc-B4czku50.mjs} +8 -8
  140. package/.output/server/_ssr/{insights-usage-rpc-C-lNUIsD.mjs → insights-usage-rpc-CUCTFska.mjs} +5 -5
  141. package/.output/server/_ssr/{insightsUsage-COUG-_-U.mjs → insightsUsage-ClAmoUz8.mjs} +3 -3
  142. package/.output/server/_ssr/{insights_.distribution-DmLW8I8a.mjs → insights_.distribution-BDeUhZGj.mjs} +2 -2
  143. package/.output/server/_ssr/{insights_.distribution-CTwilMPm.mjs → insights_.distribution-BRrbZN1X.mjs} +5 -5
  144. package/.output/server/_ssr/{insights_.distribution-DztDyrBj.mjs → insights_.distribution-C2MXpzKd.mjs} +15 -14
  145. package/.output/server/_ssr/{installations-Bct7ag5y.mjs → installations-BVk7okiY.mjs} +4 -4
  146. package/.output/server/_ssr/{installations-B6MK5iA8.mjs → installations-BjLMgBoH.mjs} +2 -2
  147. package/.output/server/_ssr/{installations-_N4PtYFl.mjs → installations-DxGZEC5G.mjs} +12 -12
  148. package/.output/server/_ssr/{listReleases-BfUBlCHo.mjs → listReleases-D_GY00SQ.mjs} +1 -1
  149. package/.output/server/_ssr/native-builds-CSCgFB21.mjs +10 -0
  150. package/.output/server/_ssr/native-builds-CdlyAldW.mjs +569 -0
  151. package/.output/server/_ssr/native-builds-DhXL5zf_.mjs +137 -0
  152. package/.output/server/_ssr/native-builds_._buildId-CMp1h8dT.mjs +10 -0
  153. package/.output/server/_ssr/native-builds_._buildId-GHpGaYyE.mjs +813 -0
  154. package/.output/server/_ssr/nativeBuildQr-84cnFQPX.mjs +59 -0
  155. package/.output/server/_ssr/nativeBuilds-B_7BPjt_.mjs +133 -0
  156. package/.output/server/_ssr/{plugins-BaD1slHx.mjs → plugins-RIryUNWj.mjs} +6 -5
  157. package/.output/server/_ssr/qr-code-C7kNRIDX.mjs +22 -0
  158. package/.output/server/_ssr/{release-adoption-DuYJTGuX.mjs → release-adoption-DoAtNPED.mjs} +2 -2
  159. package/.output/server/_ssr/{release-adoption-rpc-CHl7G_Zy.mjs → release-adoption-rpc-BJXZvtoQ.mjs} +10 -10
  160. package/.output/server/_ssr/{releaseAdoption-B39cpvfo.mjs → releaseAdoption-a2byXMfz.mjs} +4 -4
  161. package/.output/server/_ssr/releaseCatalogCompiler-DLcean2k.mjs +364 -0
  162. package/.output/server/_ssr/{releaseManagement-DFMUnDF5.mjs → releaseManagement-DHUux2az.mjs} +1 -1
  163. package/.output/server/_ssr/{releaseReachability-bFsuElSS.mjs → releaseReachability-DZOK_dH-.mjs} +2 -2
  164. package/.output/server/_ssr/{remote-config-Mj05qVYZ.mjs → remote-config-DjsEl270.mjs} +20 -19
  165. package/.output/server/_ssr/{remote-config-10-obSZ0.mjs → remote-config-DlyyohL2.mjs} +2 -2
  166. package/.output/server/_ssr/{remote-config-Dj1eTYi4.mjs → remote-config-XdYuByHz.mjs} +2 -2
  167. package/.output/server/_ssr/{remote-config-rpc-lteqDSLn.mjs → remote-config-rpc-GMLPb-90.mjs} +6 -6
  168. package/.output/server/_ssr/request-guard-CPdRBuGW.mjs +108 -0
  169. package/.output/server/_ssr/{router-Dr4jjjhx.mjs → router-vpxd56RW.mjs} +317 -71
  170. package/.output/server/_ssr/{routes-BZbrY_qw.mjs → routes-DyEM4b3x.mjs} +14 -14
  171. package/.output/server/_ssr/{routes-B5KrCDwk.mjs → routes-dQe3XhiS.mjs} +99 -81
  172. package/.output/server/_ssr/{runtime.server-DsHqVqTr.mjs → runtime.server-BdMY1blX.mjs} +4 -4
  173. package/.output/server/_ssr/schema-ChlRtZIo.mjs +23 -0
  174. package/.output/server/_ssr/schema-migration-rpc-BfGzEK_o.mjs +65 -0
  175. package/.output/server/_ssr/{select-BtdGNSmp.mjs → select-DM1uwtk9.mjs} +3 -27
  176. package/.output/server/_ssr/{server-BxaHSwHh.mjs → server-BUUKNSPI.mjs} +7 -161
  177. package/.output/server/_ssr/{sidebar-CVsgosaD.mjs → sidebar-DB2YQlok.mjs} +4 -4
  178. package/.output/server/_ssr/ssr.mjs +1 -1
  179. package/.output/server/_ssr/start-BvDsQehg.mjs +49 -0
  180. package/.output/server/_ssr/{switch-BmARgkUP.mjs → switch-DLD58zLy.mjs} +2 -2
  181. package/.output/server/_ssr/{table-M5P3YUfY.mjs → table-P4TnAZhl.mjs} +1 -1
  182. package/.output/server/_ssr/{tabs-CrmfOlJj.mjs → tabs-B7ZeLicF.mjs} +2 -2
  183. package/.output/server/_ssr/{updateFailures-z1IQy_4q.mjs → updateFailures-n-tGv90S.mjs} +3 -3
  184. package/.output/server/_ssr/{uuidv7-C88s9jWF.mjs → uuidv7-BIF4nb_q.mjs} +2 -2
  185. package/.output/server/_ssr/{schema-BiAVyEj2.mjs → version-CQ98ZBpL-CWSkTT9J.mjs} +2 -22
  186. package/.output/server/_tanstack-start-manifest_v-C-KC63Zq.mjs +184 -0
  187. package/.output/server/index.mjs +432 -271
  188. package/lib/vite-internal.mjs +32 -1
  189. package/package.json +8 -7
  190. package/src/components/AppSidebar.tsx +12 -1
  191. package/src/components/ConsoleAccessPage.tsx +49 -3
  192. package/src/components/QrCode.tsx +35 -0
  193. package/src/components/SchemaMigrationRequired.tsx +139 -0
  194. package/src/components/features/insights/BuiltinBundle.tsx +5 -3
  195. package/src/components/features/native-builds/BuiltInBundleCard.tsx +163 -0
  196. package/src/components/features/native-builds/CommitLink.tsx +30 -0
  197. package/src/components/features/native-builds/CopyableText.tsx +48 -0
  198. package/src/components/features/native-builds/ImportBuild.tsx +91 -0
  199. package/src/components/features/native-builds/InstallCard.tsx +205 -0
  200. package/src/components/features/native-builds/NativeBuildDetailPage.tsx +175 -0
  201. package/src/components/features/native-builds/NativeBuildsPage.tsx +151 -0
  202. package/src/components/features/native-builds/NativeBuildsTable.tsx +426 -0
  203. package/src/components/features/native-builds/PatchesCard.tsx +222 -0
  204. package/src/components/features/native-builds/ReleaseNativeBuildLink.tsx +101 -0
  205. package/src/components/features/native-builds/ServedNowCard.tsx +214 -0
  206. package/src/components/features/native-builds/ShortHash.tsx +41 -0
  207. package/src/components/features/native-builds/StoreSubmission.tsx +73 -0
  208. package/src/components/features/releases/ReleaseEditorSheet.tsx +8 -0
  209. package/src/lib/api-rpc.ts +98 -0
  210. package/src/lib/api.ts +120 -0
  211. package/src/lib/native-builds.ts +162 -0
  212. package/src/lib/qr-code.ts +16 -0
  213. package/src/lib/schema-migration-api.ts +54 -0
  214. package/src/lib/schema-migration-rpc.ts +26 -0
  215. package/src/lib/schema-migration.ts +101 -0
  216. package/src/lib/server/config.server.ts +23 -14
  217. package/src/lib/server/console-runtime.server.ts +4 -6
  218. package/src/lib/server/local-console.ts +164 -0
  219. package/src/lib/server/nativeBuildQr.ts +73 -0
  220. package/src/lib/server/nativeBuilds.ts +288 -0
  221. package/src/lib/shell.ts +9 -0
  222. package/src/routeTree.gen.ts +88 -1
  223. package/src/router.tsx +11 -1
  224. package/src/routes/-native-builds-search.ts +51 -0
  225. package/src/routes/[_]hot-updater/native-builds/qr.ts +14 -0
  226. package/src/routes/__root.tsx +11 -1
  227. package/src/routes/api/native-builds/$buildId/download.ts +50 -0
  228. package/src/routes/native-builds.tsx +21 -0
  229. package/src/routes/native-builds_.$buildId.tsx +23 -0
  230. package/src/start.ts +33 -0
  231. package/src/virtual-modules.d.ts +18 -0
  232. package/src/vite-internal.ts +57 -1
  233. package/.output/public/assets/EventDetails-gbD_fCqc.js +0 -1
  234. package/.output/public/assets/HashValueDisplay-BGkDPaYi.js +0 -1
  235. package/.output/public/assets/InsightsPageHeader-BRw8XkJW.js +0 -1
  236. package/.output/public/assets/NotFoundPage-Cei6W2lm.js +0 -1
  237. package/.output/public/assets/alert-dialog-BtVg50WQ.js +0 -1
  238. package/.output/public/assets/api-DoicFJfd.js +0 -1
  239. package/.output/public/assets/api-keys-D81VHHNM.js +0 -1
  240. package/.output/public/assets/api-keys-Dia6i8K1.js +0 -1
  241. package/.output/public/assets/arrow-left-DsivSewE.js +0 -1
  242. package/.output/public/assets/arrow-up-right-B5aM0F7f.js +0 -1
  243. package/.output/public/assets/badge-Bqf3UDee.js +0 -1
  244. package/.output/public/assets/circle-off-BsbZQtsF.js +0 -1
  245. package/.output/public/assets/console-features-api-DPE4C06Y.js +0 -2
  246. package/.output/public/assets/dialog-CGKPxz3n.js +0 -1
  247. package/.output/public/assets/index-DrkdiRIn.js +0 -10
  248. package/.output/public/assets/insights-C-5t8wh2.js +0 -2
  249. package/.output/public/assets/insights-D_ngQdiz.js +0 -1
  250. package/.output/public/assets/insights-KigRBDgC.js +0 -42
  251. package/.output/public/assets/insights-api-1ZjVu3Sb.js +0 -1
  252. package/.output/public/assets/insights-search-aT8BVCci.js +0 -1
  253. package/.output/public/assets/insights-usage-rpc-DqTiXI1_.js +0 -1
  254. package/.output/public/assets/insights_.distribution-Bzl6RFBR.js +0 -2
  255. package/.output/public/assets/insights_.distribution-Cthgttqb.js +0 -1
  256. package/.output/public/assets/insights_.distribution-D2c2v1bu.js +0 -1
  257. package/.output/public/assets/installations-2Nx8Htf-.js +0 -1
  258. package/.output/public/assets/installations-BskJ1xQr.js +0 -2
  259. package/.output/public/assets/installations-K2iJ_r0h.js +0 -1
  260. package/.output/public/assets/remote-config-D9X3NiwV.js +0 -6
  261. package/.output/public/assets/remote-config-DzOOiBIO.js +0 -1
  262. package/.output/public/assets/remote-config-ikg7kak0.js +0 -1
  263. package/.output/public/assets/routes-9rb9P5Y7.js +0 -2
  264. package/.output/public/assets/routes-P7683vKQ.js +0 -1
  265. package/.output/public/assets/search-DuI1FBpg.js +0 -1
  266. package/.output/public/assets/select-M3H2gxCc.js +0 -1
  267. package/.output/public/assets/smartphone-CtsHuiIC.js +0 -1
  268. package/.output/public/assets/styles-CpiW_YdW.css +0 -2
  269. package/.output/public/assets/switch-By_vfm8I.js +0 -1
  270. package/.output/public/assets/useCompositeListItem-B-UkrDlu.js +0 -1
  271. package/.output/server/_ssr/config.server-DTdsG47T.mjs +0 -35
  272. package/.output/server/_ssr/start-B6ECIE_7.mjs +0 -4
  273. package/.output/server/_tanstack-start-manifest_v-_BY9hYTm.mjs +0 -136
@@ -1,21 +1,26 @@
1
1
  import { i as __toESM } from "../_runtime.mjs";
2
- import { u as createServerFn } from "./createMiddleware-B1iPez7u.mjs";
2
+ import { l as createServerFn } from "./createServerFn-AQvBMBjJ.mjs";
3
+ import { t as consoleAccess } from "./console-access-33BNlH97.mjs";
3
4
  import { bt as require_react, yt as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
4
- import { O as Info, S as Moon, T as LoaderCircle, b as Package, c as Sun, i as TriangleAlert, w as LogOut, x as OctagonX, z as CircleCheck } from "../_libs/lucide-react.mjs";
5
- import { A as createSsrRpc, E as TooltipProvider, M as useSidebar, _ as SidebarInset, b as SidebarMenuItem, d as SidebarContent, f as SidebarFooter, g as SidebarHeader, h as SidebarGroupLabel, m as SidebarGroupContent, p as SidebarGroup, t as Button$1, u as Sidebar, v as SidebarMenu, x as SidebarProvider, y as SidebarMenuButton } from "./sidebar-CVsgosaD.mjs";
6
- import { a as HeadContent, d as Outlet, f as lazyRouteComponent, h as Link, i as Scripts, m as createRootRouteWithContext, p as createFileRoute, s as useRouterState, u as createRouter } from "../_libs/@tanstack/react-router+[...].mjs";
5
+ import { A as Info, C as OctagonX, D as LoaderCircle, E as LogOut, M as HardDrive, V as Copy, W as CircleCheck, c as Sun, h as RotateCw, i as TriangleAlert, tt as ArrowUpRight, w as Moon, x as Package } from "../_libs/lucide-react.mjs";
6
+ import { A as createSsrRpc, E as TooltipProvider, M as useSidebar, O as buttonVariants, S as SidebarTrigger, _ as SidebarInset, b as SidebarMenuItem, d as SidebarContent, f as SidebarFooter, g as SidebarHeader, h as SidebarGroupLabel, m as SidebarGroupContent, p as SidebarGroup, t as Button$1, u as Sidebar, v as SidebarMenu, x as SidebarProvider, y as SidebarMenuButton } from "./sidebar-DB2YQlok.mjs";
7
+ import { i as useQuery, r as queryOptions, s as useQueryClient } from "../_libs/tanstack__react-query.mjs";
7
8
  import { t as QueryClient } from "../_libs/tanstack__query-core.mjs";
8
- import { r as requireConsoleFeature, t as consoleFeaturesQueryOptions } from "./console-features-api-DSSgCV3v.mjs";
9
- import { t as NotFoundPage } from "./NotFoundPage-u28ndvp1.mjs";
10
9
  import { n as toast, t as Toaster } from "../_libs/sonner.mjs";
11
- import { t as Route$4 } from "./insights-CCyTACIw.mjs";
12
- import { t as Route$5 } from "./insights_.distribution-CTwilMPm.mjs";
13
- import { n as Route$6 } from "./installations-Bct7ag5y.mjs";
14
- import { n as Route$7 } from "./remote-config-Mj05qVYZ.mjs";
15
- import { n as Route$8, o as useFeatureUi } from "./routes-BZbrY_qw.mjs";
10
+ import { a as HeadContent, d as Outlet, f as lazyRouteComponent, h as Link, i as Scripts, m as createRootRouteWithContext, p as createFileRoute, s as useRouterState, u as createRouter } from "../_libs/@tanstack/react-router+[...].mjs";
11
+ import { r as requireConsoleFeature, t as consoleFeaturesQueryOptions } from "./console-features-api-v1fSycue.mjs";
12
+ import { t as NotFoundPage } from "./NotFoundPage-C5rFdUpg.mjs";
13
+ import { i as EmptyHeader, n as EmptyContent, o as EmptyTitle, r as EmptyDescription, t as Empty } from "./empty-CkdEAvCY.mjs";
14
+ import { t as Route$6 } from "./insights-CYeBl8N9.mjs";
15
+ import { t as Route$7 } from "./insights_.distribution-BRrbZN1X.mjs";
16
+ import { n as Route$8 } from "./installations-BVk7okiY.mjs";
17
+ import { t as Route$9 } from "./native-builds-CSCgFB21.mjs";
18
+ import { t as Route$10 } from "./native-builds_._buildId-CMp1h8dT.mjs";
19
+ import { n as Route$11 } from "./remote-config-DjsEl270.mjs";
20
+ import { n as Route$12, o as useFeatureUi } from "./routes-DyEM4b3x.mjs";
16
21
  import { t as setupRouterSsrQueryIntegration } from "../_libs/@tanstack/react-router-ssr-query+[...].mjs";
17
22
  import { t as z } from "../_libs/next-themes.mjs";
18
- //#region node_modules/.nitro/vite/services/ssr/assets/router-Dr4jjjhx.js
23
+ //#region node_modules/.nitro/vite/services/ssr/assets/router-vpxd56RW.js
19
24
  var import_react = /* @__PURE__ */ __toESM(require_react());
20
25
  var import_jsx_runtime = require_jsx_runtime();
21
26
  function HotUpdaterLogo({ className }) {
@@ -119,33 +124,46 @@ function AppSidebar({ canSignOut = false }) {
119
124
  const featureUi = useFeatureUi();
120
125
  const { theme, setTheme } = useTheme$1();
121
126
  const currentPath = useRouterState().location.pathname;
122
- const navigation = [{
123
- label: "Bundles",
124
- icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Package, {}),
125
- active: currentPath === "/",
126
- link: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Link, {
127
- to: "/",
128
- onClick: closeMobileSidebar,
129
- search: {
130
- afterReleaseId: void 0,
131
- beforeReleaseId: void 0,
132
- channelId: void 0,
133
- enabled: void 0,
134
- releaseId: void 0,
135
- platform: void 0,
136
- bundleId: void 0,
137
- scopeKey: void 0
138
- }
139
- })
140
- }, ...featureUi.flatMap(({ features, label, navigation }) => navigation === void 0 ? [] : [{
141
- label,
142
- icon: navigation.icon,
143
- active: navigation.paths.includes(currentPath),
144
- link: navigation.link({
145
- features,
146
- onClick: closeMobileSidebar
147
- })
148
- }])];
127
+ const navigation = [
128
+ {
129
+ label: "Bundles",
130
+ icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Package, {}),
131
+ active: currentPath === "/",
132
+ link: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Link, {
133
+ to: "/",
134
+ onClick: closeMobileSidebar,
135
+ search: {
136
+ afterReleaseId: void 0,
137
+ beforeReleaseId: void 0,
138
+ channelId: void 0,
139
+ enabled: void 0,
140
+ releaseId: void 0,
141
+ platform: void 0,
142
+ bundleId: void 0,
143
+ scopeKey: void 0
144
+ }
145
+ })
146
+ },
147
+ {
148
+ label: "Native builds",
149
+ icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(HardDrive, {}),
150
+ active: currentPath === "/native-builds" || currentPath.startsWith("/native-builds/"),
151
+ link: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Link, {
152
+ to: "/native-builds",
153
+ onClick: closeMobileSidebar,
154
+ search: {}
155
+ })
156
+ },
157
+ ...featureUi.flatMap(({ features, label, navigation }) => navigation === void 0 ? [] : [{
158
+ label,
159
+ icon: navigation.icon,
160
+ active: navigation.paths.includes(currentPath),
161
+ link: navigation.link({
162
+ features,
163
+ onClick: closeMobileSidebar
164
+ })
165
+ }])
166
+ ];
149
167
  const signOut = async () => {
150
168
  setSigningOut(true);
151
169
  try {
@@ -220,9 +238,36 @@ var providerLabel = {
220
238
  github: "GitHub",
221
239
  google: "Google"
222
240
  };
241
+ /** A path on this console, or the root for anything that could leave it. */
242
+ var consolePath = (target) => target.startsWith("/") && !/^\/[/\\]/.test(target) ? target : "/";
243
+ /**
244
+ * Where sign-in returns to: the page that asked for it, as a path on this
245
+ * console, so a link to a build lands on that build. A page a route sent
246
+ * here names its own target in `returnTo`, relative to the page, as the
247
+ * native build download does: sign-in returns there instead, when it is on
248
+ * this console's origin. Anything that could leave the console, such as
249
+ * `//host` or `/\host`, returns to the page, or to the root.
250
+ */
251
+ var signInCallbackURL = (location) => {
252
+ const page = consolePath(`${location.pathname}${location.search}`);
253
+ const returnTo = new URLSearchParams(location.search).get("returnTo");
254
+ if (returnTo === null) return page;
255
+ try {
256
+ const target = new URL(returnTo, location.href);
257
+ return target.origin === new URL(location.href).origin ? consolePath(`${target.pathname}${target.search}`) : page;
258
+ } catch {
259
+ return page;
260
+ }
261
+ };
262
+ /** Whether sign-in returns to a native build's download. */
263
+ var returnsToDownload = (callbackURL) => /\/api\/native-builds\/[^/]+\/download$/.test(callbackURL);
223
264
  function ConsoleAccessPage({ access, providers }) {
224
265
  const [pendingProvider, setPendingProvider] = (0, import_react.useState)(null);
225
266
  const [signingOut, setSigningOut] = (0, import_react.useState)(false);
267
+ const [downloadAfterSignIn, setDownloadAfterSignIn] = (0, import_react.useState)(false);
268
+ (0, import_react.useEffect)(() => {
269
+ setDownloadAfterSignIn(returnsToDownload(signInCallbackURL(window.location)));
270
+ }, []);
226
271
  const [error, setError] = (0, import_react.useState)(null);
227
272
  const signIn = async (provider) => {
228
273
  setPendingProvider(provider);
@@ -230,7 +275,7 @@ function ConsoleAccessPage({ access, providers }) {
230
275
  try {
231
276
  const response = await fetch("/api/auth/sign-in/social", {
232
277
  body: JSON.stringify({
233
- callbackURL: "/",
278
+ callbackURL: signInCallbackURL(window.location),
234
279
  provider
235
280
  }),
236
281
  headers: { "content-type": "application/json" },
@@ -271,7 +316,7 @@ function ConsoleAccessPage({ access, providers }) {
271
316
  children: "Hot Updater Console"
272
317
  }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
273
318
  className: "text-muted-foreground text-sm",
274
- children: "Sign in to manage OTA bundles."
319
+ children: downloadAfterSignIn ? "Sign in to download the build. It starts once you're in." : "Sign in to manage OTA bundles."
275
320
  })] })]
276
321
  }),
277
322
  access.status === "forbidden" ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
@@ -317,6 +362,112 @@ function ConsoleAccessPage({ access, providers }) {
317
362
  })
318
363
  });
319
364
  }
365
+ var DOCTOR_COMMAND = "npx hot-updater doctor";
366
+ var DOCTOR_GUIDE_URL = "https://hot-updater.dev/docs/guides/doctor";
367
+ /**
368
+ * What the console shows instead of a page while the schema fence refuses
369
+ * its database: the settings a migration writes, and doctor, which names the
370
+ * command that runs it. Every page reads through the fence, so one notice
371
+ * stands for all.
372
+ */
373
+ function SchemaMigrationRequired({ status, onRetry }) {
374
+ const [checking, setChecking] = (0, import_react.useState)(false);
375
+ const command = DOCTOR_COMMAND;
376
+ const configFile = /* @__PURE__ */ (0, import_jsx_runtime.jsx)("code", {
377
+ className: "font-mono whitespace-nowrap",
378
+ children: "hot-updater.config.ts"
379
+ });
380
+ const copyCommand = async () => {
381
+ try {
382
+ await navigator.clipboard.writeText(command);
383
+ toast.success("Command copied");
384
+ } catch {
385
+ toast.error("Could not copy the command");
386
+ }
387
+ };
388
+ const checkAgain = async () => {
389
+ setChecking(true);
390
+ try {
391
+ await onRetry();
392
+ } finally {
393
+ setChecking(false);
394
+ }
395
+ };
396
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
397
+ className: "flex h-svh min-h-0 flex-col",
398
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("header", {
399
+ className: "sticky top-0 z-10 flex shrink-0 items-center gap-3 border-b bg-background px-3 py-3 sm:min-h-12 sm:bg-card/70 sm:px-4 sm:backdrop-blur-sm",
400
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(SidebarTrigger, { className: "-ml-1" }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h1", {
401
+ className: "text-sm font-medium",
402
+ children: "Database migration"
403
+ })]
404
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
405
+ className: "flex min-h-0 min-w-0 flex-1 overflow-y-auto bg-muted/5 p-3 sm:p-6",
406
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Empty, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(EmptyHeader, { children: status.migratable ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(EmptyTitle, { children: "The database needs a migration" }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(EmptyDescription, { children: [
407
+ "Its schema is older than this console's, so the console stops before reading it. Run this where ",
408
+ configFile,
409
+ " names the database: it names the command that migrates it. Then check again."
410
+ ] })] }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(EmptyTitle, { children: "The database's schema doesn't match" }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(EmptyDescription, { children: [
411
+ "A newer Hot Updater migrated it, or it uses a layout this console can't migrate, so the console stops before reading it. Run this where ",
412
+ configFile,
413
+ " names the database to see what it needs."
414
+ ] })] }) }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(EmptyContent, { children: [
415
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
416
+ className: "flex w-full items-center gap-2 rounded-md border bg-muted/40 py-1 pr-1 pl-3",
417
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("code", {
418
+ className: "min-w-0 flex-1 overflow-x-auto text-left font-mono text-xs whitespace-nowrap",
419
+ children: command
420
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Button$1, {
421
+ "aria-label": "Copy command",
422
+ onClick: copyCommand,
423
+ size: "icon-sm",
424
+ variant: "ghost",
425
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Copy, { "aria-hidden": "true" })
426
+ })]
427
+ }),
428
+ status.settings.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("ul", {
429
+ className: "w-full space-y-1 text-left text-xs text-muted-foreground",
430
+ children: status.settings.map(({ key, expected, found }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("li", {
431
+ className: "flex justify-between gap-3",
432
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("code", {
433
+ className: "font-mono",
434
+ children: key
435
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
436
+ className: "tabular-nums",
437
+ children: [
438
+ found ?? "missing",
439
+ " → ",
440
+ expected
441
+ ]
442
+ })]
443
+ }, key))
444
+ }) : null,
445
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
446
+ className: "flex flex-wrap justify-center gap-2",
447
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Button$1, {
448
+ disabled: checking,
449
+ onClick: checkAgain,
450
+ variant: "outline",
451
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(RotateCw, {
452
+ "aria-hidden": "true",
453
+ className: checking ? "motion-safe:animate-spin" : void 0,
454
+ "data-icon": "inline-start"
455
+ }), checking ? "Checking…" : "Check again"]
456
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("a", {
457
+ className: buttonVariants({ variant: "ghost" }),
458
+ href: DOCTOR_GUIDE_URL,
459
+ rel: "noreferrer",
460
+ target: "_blank",
461
+ children: ["Doctor guide", /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ArrowUpRight, {
462
+ "aria-hidden": "true",
463
+ "data-icon": "inline-end"
464
+ })]
465
+ })]
466
+ })
467
+ ] })] })
468
+ })]
469
+ });
470
+ }
320
471
  var Toaster$1 = ({ ...props }) => {
321
472
  const { theme = "system" } = z();
322
473
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Toaster, {
@@ -341,8 +492,47 @@ var Toaster$1 = ({ ...props }) => {
341
492
  };
342
493
  var getConsoleAccessRpc = createServerFn({ method: "GET" }).handler(createSsrRpc("c504696e68ba764b48c48aa8a40275938640941e473cf9cfdd7b2322d99f9d13"));
343
494
  var getConsoleAuthProvidersRpc = createServerFn({ method: "GET" }).handler(createSsrRpc("fa8c48f0489d97c62b9b68fd0caf0a61b15bad25a42b3866ec36264b4b30bb74"));
344
- var styles_default = "/assets/styles-CpiW_YdW.css";
345
- var Route$3 = createRootRouteWithContext()({
495
+ /**
496
+ * Whether the schema fence refuses the console's database, and what it
497
+ * found: one read through core, which the console makes only after a page's
498
+ * read failed. Null when the read passes or fails for another reason, which
499
+ * the page reports itself.
500
+ */
501
+ var getSchemaMigrationRpc = createServerFn({ method: "GET" }).middleware([consoleAccess]).handler(createSsrRpc("28ea8c9bdbeb67f80c776990bb5bcb5c990f5129520631f241faf074d90fea02"));
502
+ var schemaMigrationQueryKey = ["schema-migration"];
503
+ var schemaMigrationQueryOptions = () => queryOptions({
504
+ queryKey: schemaMigrationQueryKey,
505
+ queryFn: () => getSchemaMigrationRpc(),
506
+ retry: false
507
+ });
508
+ var isSchemaQuery = (queryKey) => queryKey[0] === schemaMigrationQueryKey[0];
509
+ /**
510
+ * The schema fence's refusal of the console's database, asked for once any
511
+ * page's read fails, so a healthy console reads nothing more. `retry` asks
512
+ * again, and once the fence passes, reads the failed pages again.
513
+ */
514
+ var useSchemaMigration = () => {
515
+ const queryClient = useQueryClient();
516
+ const cache = queryClient.getQueryCache();
517
+ const failing = (0, import_react.useSyncExternalStore)((onChange) => cache.subscribe(onChange), () => cache.getAll().some(({ queryKey, state }) => !isSchemaQuery(queryKey) && state.fetchFailureCount > 0), () => false);
518
+ const { data } = useQuery({
519
+ ...schemaMigrationQueryOptions(),
520
+ enabled: failing
521
+ });
522
+ const retry = (0, import_react.useCallback)(async () => {
523
+ if (await queryClient.fetchQuery({
524
+ ...schemaMigrationQueryOptions(),
525
+ staleTime: 0
526
+ }) !== null) return;
527
+ await queryClient.resetQueries({ predicate: ({ queryKey, state }) => !isSchemaQuery(queryKey) && (state.fetchFailureCount > 0 || state.status === "error") });
528
+ }, [queryClient]);
529
+ return {
530
+ status: data ?? null,
531
+ retry
532
+ };
533
+ };
534
+ var styles_default = "/assets/styles-Ccxthuz1.css";
535
+ var Route$5 = createRootRouteWithContext()({
346
536
  head: () => ({
347
537
  meta: [
348
538
  { charSet: "utf-8" },
@@ -400,7 +590,7 @@ function RootDocument({ children }) {
400
590
  });
401
591
  }
402
592
  function RootLayout() {
403
- const { access, providers } = Route$3.useLoaderData();
593
+ const { access, providers } = Route$5.useLoaderData();
404
594
  if (access.status !== "authorized") return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ConsoleAccessPage, {
405
595
  access,
406
596
  providers
@@ -408,79 +598,135 @@ function RootLayout() {
408
598
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AuthorizedConsole, { canSignOut: providers.length > 0 });
409
599
  }
410
600
  function AuthorizedConsole({ canSignOut }) {
601
+ const schema = useSchemaMigration();
411
602
  (0, import_react.useEffect)(() => {}, []);
412
603
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(SidebarProvider, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(AppSidebar, { canSignOut }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SidebarInset, {
413
604
  className: "min-h-0 min-w-0 overflow-hidden",
414
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Outlet, {})
605
+ children: schema.status ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SchemaMigrationRequired, {
606
+ status: schema.status,
607
+ onRetry: schema.retry
608
+ }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Outlet, {})
415
609
  })] });
416
610
  }
417
- var $$splitComponentImporter = () => import("./api-keys-pRNvn2-9.mjs");
418
- var $$splitNotFoundComponentImporter = () => import("./api-keys-CLH38u9B.mjs");
419
- var Route$2 = createFileRoute("/api-keys")({
611
+ var $$splitComponentImporter = () => import("./api-keys-D5dyA4D1.mjs");
612
+ var $$splitNotFoundComponentImporter = () => import("./api-keys-yFlQDwQF.mjs");
613
+ var Route$4 = createFileRoute("/api-keys")({
420
614
  beforeLoad: ({ context }) => requireConsoleFeature(context.queryClient, "apiKeys"),
421
615
  notFoundComponent: lazyRouteComponent($$splitNotFoundComponentImporter, "notFoundComponent"),
422
616
  component: lazyRouteComponent($$splitComponentImporter, "component")
423
617
  });
618
+ var handle = async ({ request }) => {
619
+ const { serveNativeBuildQr } = await import("./nativeBuildQr-84cnFQPX.mjs");
620
+ return serveNativeBuildQr(request);
621
+ };
622
+ var Route$3 = createFileRoute("/_hot-updater/native-builds/qr")({ server: { handlers: { ANY: handle } } });
424
623
  var handleAuthRequest = async ({ request }) => {
425
- const { handleConsoleAuth } = await import("./auth.server-DR9zc0EU.mjs");
624
+ const { handleConsoleAuth } = await import("./auth.server-DYS1OJ6P.mjs");
426
625
  return handleConsoleAuth(request);
427
626
  };
428
- var Route$1 = createFileRoute("/api/auth/$")({ server: { handlers: {
627
+ var Route$2 = createFileRoute("/api/auth/$")({ server: { handlers: {
429
628
  GET: handleAuthRequest,
430
629
  POST: handleAuthRequest
431
630
  } } });
432
- var Route = createFileRoute("/api/bundles/$bundleId/download")({ server: { handlers: { GET: async ({ params, request }) => {
433
- const { prepareConfig } = await import("./config.server-DTdsG47T.mjs");
434
- const { downloadBundle } = await import("./downloadBundle-94jPBGSO.mjs");
631
+ var Route$1 = createFileRoute("/api/bundles/$bundleId/download")({ server: { handlers: { GET: async ({ params, request }) => {
632
+ const { prepareConfig } = await import("./config.server-NnMFjMFX.mjs");
633
+ const { downloadBundle } = await import("./downloadBundle-DCmr7vsj.mjs");
435
634
  const { core, storage } = await prepareConfig(request);
436
635
  return downloadBundle(params.bundleId, {
437
636
  core,
438
637
  storage
439
638
  });
440
639
  } } } });
640
+ /**
641
+ * Whether a request is a browser opening the URL as a page, as a phone does
642
+ * after scanning a QR code, rather than a script fetching it.
643
+ */
644
+ var isNavigation = (request) => request.headers.get("sec-fetch-mode") === "navigate" || (request.headers.get("accept") ?? "").includes("text/html");
645
+ var Route = createFileRoute("/api/native-builds/$buildId/download")({ server: { handlers: { GET: async ({ params, request }) => {
646
+ const { prepareConfig } = await import("./config.server-NnMFjMFX.mjs");
647
+ const { downloadNativeBuild } = await import("./nativeBuilds-B_7BPjt_.mjs");
648
+ let deps;
649
+ try {
650
+ deps = await prepareConfig(request);
651
+ } catch (error) {
652
+ if (error instanceof Response && error.status === 401 && isNavigation(request)) {
653
+ const buildId = encodeURIComponent(params.buildId);
654
+ const returnTo = encodeURIComponent(`../api/native-builds/${buildId}/download`);
655
+ return new Response(null, {
656
+ headers: {
657
+ "cache-control": "no-store",
658
+ location: `../../../native-builds/${buildId}?returnTo=${returnTo}`
659
+ },
660
+ status: 302
661
+ });
662
+ }
663
+ throw error;
664
+ }
665
+ return downloadNativeBuild(params.buildId, deps);
666
+ } } } });
441
667
  var rootRouteChildren = {
442
- IndexRoute: Route$8.update({
668
+ IndexRoute: Route$12.update({
443
669
  id: "/",
444
670
  path: "/",
445
- getParentRoute: () => Route$3
671
+ getParentRoute: () => Route$5
446
672
  }),
447
- ApiKeysRoute: Route$2.update({
673
+ ApiKeysRoute: Route$4.update({
448
674
  id: "/api-keys",
449
675
  path: "/api-keys",
450
- getParentRoute: () => Route$3
676
+ getParentRoute: () => Route$5
451
677
  }),
452
- InsightsRoute: Route$4.update({
678
+ InsightsRoute: Route$6.update({
453
679
  id: "/insights",
454
680
  path: "/insights",
455
- getParentRoute: () => Route$3
681
+ getParentRoute: () => Route$5
456
682
  }),
457
- InstallationsRoute: Route$6.update({
683
+ InstallationsRoute: Route$8.update({
458
684
  id: "/installations",
459
685
  path: "/installations",
460
- getParentRoute: () => Route$3
686
+ getParentRoute: () => Route$5
687
+ }),
688
+ NativeBuildsRoute: Route$9.update({
689
+ id: "/native-builds",
690
+ path: "/native-builds",
691
+ getParentRoute: () => Route$5
461
692
  }),
462
- RemoteConfigRoute: Route$7.update({
693
+ RemoteConfigRoute: Route$11.update({
463
694
  id: "/remote-config",
464
695
  path: "/remote-config",
465
- getParentRoute: () => Route$3
696
+ getParentRoute: () => Route$5
466
697
  }),
467
- InsightsDistributionRoute: Route$5.update({
698
+ InsightsDistributionRoute: Route$7.update({
468
699
  id: "/insights_/distribution",
469
700
  path: "/insights/distribution",
470
- getParentRoute: () => Route$3
701
+ getParentRoute: () => Route$5
702
+ }),
703
+ NativeBuildsBuildIdRoute: Route$10.update({
704
+ id: "/native-builds_/$buildId",
705
+ path: "/native-builds/$buildId",
706
+ getParentRoute: () => Route$5
471
707
  }),
472
- ApiAuthSplatRoute: Route$1.update({
708
+ HotUpdaterNativeBuildsQrRoute: Route$3.update({
709
+ id: "/_hot-updater/native-builds/qr",
710
+ path: "/_hot-updater/native-builds/qr",
711
+ getParentRoute: () => Route$5
712
+ }),
713
+ ApiAuthSplatRoute: Route$2.update({
473
714
  id: "/api/auth/$",
474
715
  path: "/api/auth/$",
475
- getParentRoute: () => Route$3
716
+ getParentRoute: () => Route$5
476
717
  }),
477
- ApiBundlesBundleIdDownloadRoute: Route.update({
718
+ ApiBundlesBundleIdDownloadRoute: Route$1.update({
478
719
  id: "/api/bundles/$bundleId/download",
479
720
  path: "/api/bundles/$bundleId/download",
480
- getParentRoute: () => Route$3
721
+ getParentRoute: () => Route$5
722
+ }),
723
+ ApiNativeBuildsBuildIdDownloadRoute: Route.update({
724
+ id: "/api/native-builds/$buildId/download",
725
+ path: "/api/native-builds/$buildId/download",
726
+ getParentRoute: () => Route$5
481
727
  })
482
728
  };
483
- var routeTree = Route$3._addFileChildren(rootRouteChildren)._addFileTypes();
729
+ var routeTree = Route$5._addFileChildren(rootRouteChildren)._addFileTypes();
484
730
  /** A location's scroll-restoration key: its route's own, else its history entry's. */
485
731
  var routeScrollRestorationKey = (router, location) => {
486
732
  const [, , foundRoute] = router.getMatchedRoutes(location.pathname);
@@ -488,7 +734,7 @@ var routeScrollRestorationKey = (router, location) => {
488
734
  return routeKey?.(location) ?? location.state.__TSR_key;
489
735
  };
490
736
  var getRouter = () => {
491
- const queryClient = new QueryClient();
737
+ const queryClient = new QueryClient({ defaultOptions: { queries: { retry: (failures) => failures < 3 && !queryClient.getQueryData(schemaMigrationQueryKey) } } });
492
738
  const router = createRouter({
493
739
  routeTree,
494
740
  context: { queryClient },
@@ -1,18 +1,18 @@
1
- import { n as consoleFeatures } from "./console-features-4xAGfZHw.mjs";
2
- import { u as createServerFn } from "./createMiddleware-B1iPez7u.mjs";
1
+ import { l as createServerFn } from "./createServerFn-AQvBMBjJ.mjs";
2
+ import { t as consoleAccess } from "./console-access-33BNlH97.mjs";
3
3
  import { yt as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
4
- import { D as KeyRound, K as ChartNoAxesCombined, d as SlidersHorizontal, q as ChartLine } from "../_libs/lucide-react.mjs";
5
- import { A as createSsrRpc, C as Skeleton, O as buttonVariants, k as cn, r as Separator$1 } from "./sidebar-CVsgosaD.mjs";
6
- import { t as consoleAccess } from "./console-access-aUpQs49I.mjs";
7
- import { f as lazyRouteComponent, h as Link, p as createFileRoute } from "../_libs/@tanstack/react-router+[...].mjs";
4
+ import { Q as ChartLine, Z as ChartNoAxesCombined, d as SlidersHorizontal, k as KeyRound } from "../_libs/lucide-react.mjs";
5
+ import { A as createSsrRpc, C as Skeleton, O as buttonVariants, k as cn, r as Separator$1 } from "./sidebar-DB2YQlok.mjs";
6
+ import { d as CardTitle, l as CardFooter, o as Card, s as CardContent, u as CardHeader } from "./badge-CEdVRgyl.mjs";
8
7
  import { i as useQuery } from "../_libs/tanstack__react-query.mjs";
9
- import { a as useConsoleFeatures, i as useConsoleFeature } from "./console-features-api-DSSgCV3v.mjs";
10
- import { d as CardTitle, l as CardFooter, o as Card, s as CardContent, u as CardHeader } from "./badge-BpT7r-ng.mjs";
11
- import { n as readRecoveryInput } from "./insights-recovery-BUuQdlA3.mjs";
12
- import { i as failureRate, s as formatRate } from "./insights-failures-BJN3RfLu.mjs";
13
- import { n as InfoTooltip, r as adoptionWindow } from "./insights-search-CBYoxT7v.mjs";
14
- import { u as useUpdateFailuresQuery } from "./insights-api-DtRFz5X3.mjs";
15
- //#region node_modules/.nitro/vite/services/ssr/assets/routes-BZbrY_qw.js
8
+ import { n as consoleFeatures } from "./console-features-BTV-XuhQ.mjs";
9
+ import { f as lazyRouteComponent, h as Link, p as createFileRoute } from "../_libs/@tanstack/react-router+[...].mjs";
10
+ import { a as useConsoleFeatures, i as useConsoleFeature } from "./console-features-api-v1fSycue.mjs";
11
+ import { n as readRecoveryInput } from "./insights-recovery-BtXVU3ro.mjs";
12
+ import { i as failureRate, s as formatRate } from "./insights-failures-B9VPkzZE.mjs";
13
+ import { n as InfoTooltip, r as adoptionWindow } from "./insights-search-DKfxgHD3.mjs";
14
+ import { u as useUpdateFailuresQuery } from "./insights-api-BFARQ5ct.mjs";
15
+ //#region node_modules/.nitro/vite/services/ssr/assets/routes-DyEM4b3x.js
16
16
  var import_jsx_runtime = require_jsx_runtime();
17
17
  /** What API key management adds: its navigation item. */
18
18
  var apiKeysFeatureUi = { apiKeys: { navigation: {
@@ -396,7 +396,7 @@ function updateReleaseFilters(current, filters) {
396
396
  scopeKey: next.scopeKey
397
397
  });
398
398
  }
399
- var $$splitComponentImporter = () => import("./routes-B5KrCDwk.mjs");
399
+ var $$splitComponentImporter = () => import("./routes-dQe3XhiS.mjs");
400
400
  /**
401
401
  * Opens a bundle from a click anywhere on its row or card, except on a
402
402
  * control inside it, which keeps its own action.