@hot-updater/console 1.1.3 → 1.1.4

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 (154) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/EventDetails-gbD_fCqc.js +1 -0
  3. package/.output/public/assets/{InsightsPageHeader-SYEOMClX.js → InsightsPageHeader-BRw8XkJW.js} +1 -1
  4. package/.output/public/assets/api-keys-D81VHHNM.js +1 -0
  5. package/.output/public/assets/api-keys-Dia6i8K1.js +1 -0
  6. package/.output/public/assets/badge-Bqf3UDee.js +1 -0
  7. package/.output/public/assets/circle-off-BsbZQtsF.js +1 -0
  8. package/.output/public/assets/field-GxF9SyUo.js +1 -0
  9. package/.output/public/assets/{index-C5S4DrO2.js → index-DrkdiRIn.js} +3 -3
  10. package/.output/public/assets/insights-C-5t8wh2.js +2 -0
  11. package/.output/public/assets/insights-D_ngQdiz.js +1 -0
  12. package/.output/public/assets/insights-KigRBDgC.js +42 -0
  13. package/.output/public/assets/insights-api-1ZjVu3Sb.js +1 -0
  14. package/.output/public/assets/insights-search-aT8BVCci.js +1 -0
  15. package/.output/public/assets/{insights-usage-rpc-DTL0_Rp8.js → insights-usage-rpc-DqTiXI1_.js} +1 -1
  16. package/.output/public/assets/insights_.distribution-Bzl6RFBR.js +2 -0
  17. package/.output/public/assets/insights_.distribution-Cthgttqb.js +1 -0
  18. package/.output/public/assets/insights_.distribution-D2c2v1bu.js +1 -0
  19. package/.output/public/assets/installations-2Nx8Htf-.js +1 -0
  20. package/.output/public/assets/{installations-we1IV0xp.js → installations-BskJ1xQr.js} +2 -2
  21. package/.output/public/assets/installations-K2iJ_r0h.js +1 -0
  22. package/.output/public/assets/{remote-config-uBgCaI-p.js → remote-config-D9X3NiwV.js} +4 -4
  23. package/.output/public/assets/{remote-config-DyTLPRKh.js → remote-config-DzOOiBIO.js} +1 -1
  24. package/.output/public/assets/remote-config-ikg7kak0.js +1 -0
  25. package/.output/public/assets/routes-9rb9P5Y7.js +2 -0
  26. package/.output/public/assets/routes-P7683vKQ.js +1 -0
  27. package/.output/public/assets/{select-CV8nkfsf.js → select-M3H2gxCc.js} +1 -1
  28. package/.output/public/assets/styles-CpiW_YdW.css +2 -0
  29. package/.output/public/assets/{switch-C8ycp9AH.js → switch-By_vfm8I.js} +1 -1
  30. package/.output/server/{__23tanstack-start-server-fn-resolver-Gb7cVpng.mjs → __23tanstack-start-server-fn-resolver-KpQ5Z_24.mjs} +40 -40
  31. package/.output/server/_libs/@base-ui/react+[...].mjs +77 -1
  32. package/.output/server/_libs/@tanstack/react-router+[...].mjs +1 -1
  33. package/.output/server/_libs/@tanstack/react-router-ssr-query+[...].mjs +2 -2
  34. package/.output/server/_libs/lucide-react.mjs +1 -1
  35. package/.output/server/_libs/next-themes.mjs +1 -1
  36. package/.output/server/_libs/react-redux+[...].mjs +1 -1
  37. package/.output/server/_libs/recharts+[...].mjs +1 -1
  38. package/.output/server/_libs/sonner.mjs +1 -1
  39. package/.output/server/_libs/tanstack__react-query.mjs +1 -1
  40. package/.output/server/_ssr/{BundleIdDisplay-DDiNTVT3.mjs → BundleIdDisplay-CjSnY65J.mjs} +3 -3
  41. package/.output/server/_ssr/{ConsoleFeatureUnavailable-DE65d293.mjs → ConsoleFeatureUnavailable-CHxn9f-w.mjs} +7 -7
  42. package/.output/server/_ssr/{EventDetails-Bg1V3JsJ.mjs → EventDetails-l6dF54zp.mjs} +8 -8
  43. package/.output/server/_ssr/{HashValueDisplay-BDHvSsxT.mjs → HashValueDisplay-Zs7ABoOi.mjs} +3 -3
  44. package/.output/server/_ssr/{InsightsPageHeader-Db-y_PRS.mjs → InsightsPageHeader-ZlAlDxQy.mjs} +8 -8
  45. package/.output/server/_ssr/{NotFoundPage-DHgL7Uzm.mjs → NotFoundPage-u28ndvp1.mjs} +3 -3
  46. package/.output/server/_ssr/{alert-dialog-MbJW0K9H.mjs → alert-dialog-B8AqlJwo.mjs} +2 -2
  47. package/.output/server/_ssr/{api-XOdKU3tw.mjs → api-C_0B7NXM.mjs} +3 -3
  48. package/.output/server/_ssr/{api-keys-v7wa2_rX.mjs → api-keys-CLH38u9B.mjs} +2 -2
  49. package/.output/server/_ssr/{api-keys-BHJdcnez.mjs → api-keys-pRNvn2-9.mjs} +9 -8
  50. package/.output/server/_ssr/{api-keys-rpc-B389z2LY.mjs → api-keys-rpc-wecWs0nA.mjs} +3 -3
  51. package/.output/server/_ssr/{api-rpc-T6dVPhPr.mjs → api-rpc-DWN8eOHS.mjs} +6 -41
  52. package/.output/server/_ssr/{auth-rpc-CzPT9U2N.mjs → auth-rpc-CLRArbIl.mjs} +4 -4
  53. package/.output/server/_ssr/{auth.server-LmCV7BTA.mjs → auth.server-DR9zc0EU.mjs} +2 -2
  54. package/.output/server/_ssr/badge-BpT7r-ng.mjs +108 -0
  55. package/.output/server/_ssr/{bundleActivity-M5gzBFNg.mjs → bundleActivity-0qFIcvqt.mjs} +1 -1
  56. package/.output/server/_ssr/{config.server-COvZCTA4.mjs → config.server-DTdsG47T.mjs} +4 -4
  57. package/.output/server/_ssr/{console-access-CRAcskRF.mjs → console-access-aUpQs49I.mjs} +2 -2
  58. package/.output/server/_ssr/{console-features-Oz0q20jJ.mjs → console-features-4xAGfZHw.mjs} +1 -1
  59. package/.output/server/_ssr/{console-features-api-qihYDNRo.mjs → console-features-api-DSSgCV3v.mjs} +5 -5
  60. package/.output/server/_ssr/{console-features-rpc-r1KcSohP.mjs → console-features-rpc-D6kMlR2A.mjs} +3 -3
  61. package/.output/server/_ssr/{dialog-CPbM7GQc.mjs → dialog-B4ALf7NJ.mjs} +2 -2
  62. package/.output/server/_ssr/{downloadBundle-CZysjmNW.mjs → downloadBundle-94jPBGSO.mjs} +1 -1
  63. package/.output/server/_ssr/{empty-8scgvztU.mjs → empty-Bh1FEeYF.mjs} +3 -3
  64. package/.output/server/_ssr/{failureReports-DKDhVsXA.mjs → failureReports-Bh22wois.mjs} +4 -4
  65. package/.output/server/_ssr/field-HKCaPH3e.mjs +89 -0
  66. package/.output/server/_ssr/{getBundleChildren-Cv9iz1As.mjs → getBundleChildren-DfxB2K8D.mjs} +1 -1
  67. package/.output/server/_ssr/{input-group-BTB34g3v.mjs → input-group-xm3LzDuq.mjs} +2 -2
  68. package/.output/server/_ssr/{insights-CGpn8W5V.mjs → insights-BKZpJ_K4.mjs} +590 -360
  69. package/.output/server/_ssr/{insights-BulsRVnt.mjs → insights-CCyTACIw.mjs} +5 -5
  70. package/.output/server/_ssr/{insights-Btnkt5-Y.mjs → insights-CNqWQLJR.mjs} +2 -2
  71. package/.output/server/_ssr/{insights-api-Dg3D7Vkg.mjs → insights-api-DtRFz5X3.mjs} +5 -5
  72. package/.output/server/_ssr/{insights-errors-BjnFUyZj.mjs → insights-errors-Iy-lBaM7.mjs} +2 -2
  73. package/.output/server/_ssr/{insights-failures-xaa41Buf.mjs → insights-failures-BJN3RfLu.mjs} +3 -3
  74. package/.output/server/_ssr/{insights-failures-rpc-DdK55wRd.mjs → insights-failures-rpc-DLZ91uOG.mjs} +12 -12
  75. package/.output/server/_ssr/{insights-recovery-BWQhiZaF.mjs → insights-recovery-BUuQdlA3.mjs} +1 -1
  76. package/.output/server/_ssr/{insights-recovery-rpc-D-dwlIPT.mjs → insights-recovery-rpc-BQHUhPi7.mjs} +6 -6
  77. package/.output/server/_ssr/{insights-rpc-Dn-jdkQK.mjs → insights-rpc-C6Vukyn7.mjs} +3 -3
  78. package/.output/server/_ssr/{insights-search-C8EWA0hu.mjs → insights-search-CBYoxT7v.mjs} +8 -7
  79. package/.output/server/_ssr/{insights-usage-BpBM0U0c.mjs → insights-usage-CHqvtehH.mjs} +1 -1
  80. package/.output/server/_ssr/{insights-usage-rpc-DIa-5vUO.mjs → insights-usage-rpc-BJ7a-xco.mjs} +6 -6
  81. package/.output/server/_ssr/{insights-usage-rpc-BCulD17c.mjs → insights-usage-rpc-C-lNUIsD.mjs} +5 -5
  82. package/.output/server/_ssr/{insightsUsage-CzhVjsc8.mjs → insightsUsage-COUG-_-U.mjs} +3 -3
  83. package/.output/server/_ssr/{insights_.distribution-CKe3T4k1.mjs → insights_.distribution-CTwilMPm.mjs} +5 -5
  84. package/.output/server/_ssr/{insights_.distribution-D7ZzykQb.mjs → insights_.distribution-DmLW8I8a.mjs} +2 -2
  85. package/.output/server/_ssr/{insights_.distribution-CE0ve_Rx.mjs → insights_.distribution-DztDyrBj.mjs} +14 -13
  86. package/.output/server/_ssr/{installations-CJHIYH0u.mjs → installations-B6MK5iA8.mjs} +2 -2
  87. package/.output/server/_ssr/{installations-Bu4Sk4W6.mjs → installations-Bct7ag5y.mjs} +4 -4
  88. package/.output/server/_ssr/{installations-CGMSRurj.mjs → installations-_N4PtYFl.mjs} +12 -11
  89. package/.output/server/_ssr/{release-adoption-005tQRpo.mjs → release-adoption-DuYJTGuX.mjs} +17 -7
  90. package/.output/server/_ssr/{release-adoption-rpc-DPMYNIlM.mjs → release-adoption-rpc-CHl7G_Zy.mjs} +8 -8
  91. package/.output/server/_ssr/{releaseAdoption-CtOFkwli.mjs → releaseAdoption-B39cpvfo.mjs} +42 -26
  92. package/.output/server/_ssr/releaseReachability-bFsuElSS.mjs +39 -0
  93. package/.output/server/_ssr/{remote-config-BCW6vPOD.mjs → remote-config-10-obSZ0.mjs} +3 -3
  94. package/.output/server/_ssr/{remote-config-DrC_3H7K.mjs → remote-config-Dj1eTYi4.mjs} +2 -2
  95. package/.output/server/_ssr/{remote-config-Ca-Wv5sF.mjs → remote-config-Mj05qVYZ.mjs} +18 -17
  96. package/.output/server/_ssr/{remote-config-rpc-CcGmTmvS.mjs → remote-config-rpc-lteqDSLn.mjs} +3 -3
  97. package/.output/server/_ssr/{router-C5eI7aq7.mjs → router-Dr4jjjhx.mjs} +17 -17
  98. package/.output/server/_ssr/{routes-Bd3qlRny.mjs → routes-B5KrCDwk.mjs} +17 -16
  99. package/.output/server/_ssr/{routes-DZoij0js.mjs → routes-BZbrY_qw.mjs} +17 -17
  100. package/.output/server/_ssr/{runtime.server-De0QVWc9.mjs → runtime.server-DsHqVqTr.mjs} +2 -2
  101. package/.output/server/_ssr/{select-usyW0pcU.mjs → select-BtdGNSmp.mjs} +2 -2
  102. package/.output/server/_ssr/{server-Bp9nEe3Z.mjs → server-BxaHSwHh.mjs} +4 -4
  103. package/.output/server/_ssr/{sidebar-Bqu4emj1.mjs → sidebar-CVsgosaD.mjs} +3 -3
  104. package/.output/server/_ssr/ssr.mjs +1 -1
  105. package/.output/server/_ssr/{switch-DJPcwvwD.mjs → switch-BmARgkUP.mjs} +3 -3
  106. package/.output/server/_ssr/{table-DEzdHi1t.mjs → table-M5P3YUfY.mjs} +2 -2
  107. package/.output/server/_ssr/{tabs-HzTSngsE.mjs → tabs-CrmfOlJj.mjs} +3 -3
  108. package/.output/server/_ssr/updateFailures-z1IQy_4q.mjs +103 -0
  109. package/.output/server/{_tanstack-start-manifest_v-DTOQk1l4.mjs → _tanstack-start-manifest_v-_BY9hYTm.mjs} +51 -50
  110. package/.output/server/index.mjs +198 -191
  111. package/package.json +7 -7
  112. package/src/components/features/insights/AppUsage.tsx +15 -2
  113. package/src/components/features/insights/InsightsControls.tsx +264 -246
  114. package/src/components/features/insights/InsightsOverview.tsx +90 -68
  115. package/src/components/features/insights/InsightsScope.tsx +39 -0
  116. package/src/components/features/insights/ReleaseActivity.tsx +4 -4
  117. package/src/components/features/insights/ReleaseCombobox.tsx +196 -0
  118. package/src/components/features/insights/RollbackButton.tsx +4 -0
  119. package/src/components/features/insights/UpdateFailures.tsx +7 -1
  120. package/src/lib/insights-failures-rpc.ts +3 -1
  121. package/src/lib/insights-failures.ts +5 -2
  122. package/src/lib/insights-recovery.ts +5 -0
  123. package/src/lib/insights-search.ts +10 -14
  124. package/src/lib/release-adoption-api.ts +24 -32
  125. package/src/lib/release-adoption.ts +45 -8
  126. package/src/lib/server/failureReports.ts +1 -1
  127. package/src/lib/server/releaseAdoption.ts +75 -26
  128. package/src/lib/server/updateFailures.ts +131 -10
  129. package/src/routes/insights.tsx +56 -24
  130. package/src/routes/insights_.distribution.tsx +2 -1
  131. package/.output/public/assets/EventDetails-CSX2ayg9.js +0 -1
  132. package/.output/public/assets/api-keys-BEdLKiib.js +0 -1
  133. package/.output/public/assets/api-keys-TdTtKm2b.js +0 -1
  134. package/.output/public/assets/chevron-right-BnvHIJdZ.js +0 -1
  135. package/.output/public/assets/field-DBMkBfkD.js +0 -1
  136. package/.output/public/assets/insights-BMKRCIg1.js +0 -2
  137. package/.output/public/assets/insights-CPyViuyC.js +0 -42
  138. package/.output/public/assets/insights-D0PbX-Rm.js +0 -1
  139. package/.output/public/assets/insights-api-Dmd_LgT3.js +0 -1
  140. package/.output/public/assets/insights-search-DAa0f7Dr.js +0 -1
  141. package/.output/public/assets/insights_.distribution-BaOQlBV9.js +0 -1
  142. package/.output/public/assets/insights_.distribution-CxXMIEb5.js +0 -2
  143. package/.output/public/assets/insights_.distribution-EE5OqxyL.js +0 -1
  144. package/.output/public/assets/installations-BgISglUQ.js +0 -1
  145. package/.output/public/assets/installations-DQbgRkSi.js +0 -1
  146. package/.output/public/assets/remote-config-AQmdmbT8.js +0 -1
  147. package/.output/public/assets/routes-Br26jzt9.js +0 -1
  148. package/.output/public/assets/routes-CyirpG2O.js +0 -2
  149. package/.output/public/assets/styles-DTGEAJFv.css +0 -2
  150. package/.output/server/_ssr/field-DHrweW4l.mjs +0 -189
  151. package/.output/server/_ssr/updateFailures-H6pnnYK4.mjs +0 -40
  152. /package/.output/public/assets/{ConsoleFeatureUnavailable-B-iNWpuE.js → ConsoleFeatureUnavailable-C0KfsKWL.js} +0 -0
  153. /package/.output/public/assets/{table-DgGD67Fx.js → table-ek1DmRHq.js} +0 -0
  154. /package/.output/public/assets/{valueToPercent-C4C1WZVn.js → valueToPercent-B44vDssN.js} +0 -0
@@ -0,0 +1,39 @@
1
+ import { S as isReleaseEligibleForCohort, i as NUMERIC_COHORT_SIZE } from "./dist-CbQbBIw-.mjs";
2
+ //#region node_modules/.nitro/vite/services/ssr/assets/releaseReachability-bFsuElSS.js
3
+ var NON_TARGETED_COHORT = "release-catalog-non-targeted-cohort";
4
+ function collectReachableFromIndexes(catalog, indexes, reachableReleaseIds) {
5
+ const descriptors = indexes.flatMap((index) => {
6
+ const descriptor = catalog.releaseDescriptors[index];
7
+ return descriptor === void 0 ? [] : [descriptor];
8
+ });
9
+ const cohorts = new Set([
10
+ void 0,
11
+ ...Array.from({ length: NUMERIC_COHORT_SIZE }, (_, index) => String(index + 1)),
12
+ ...descriptors.flatMap(({ targetCohorts }) => targetCohorts),
13
+ NON_TARGETED_COHORT
14
+ ]);
15
+ for (const cohort of cohorts) {
16
+ const selected = descriptors.find((descriptor) => descriptor.bundleId !== null && isReleaseEligibleForCohort(descriptor, cohort));
17
+ if (selected !== void 0) reachableReleaseIds.add(selected.releaseId);
18
+ }
19
+ }
20
+ function collectCurrentlyReachableReleaseIds(catalog) {
21
+ const reachableReleaseIds = /* @__PURE__ */ new Set();
22
+ const indexGroups = catalog.strategy === "APP_VERSION" ? catalog.segments.map(({ releaseIndexes }) => releaseIndexes) : [catalog.releaseIndexes];
23
+ for (const indexes of indexGroups) collectReachableFromIndexes(catalog, indexes, reachableReleaseIds);
24
+ return reachableReleaseIds;
25
+ }
26
+ /** Marks each release its scope's compiled catalog no longer serves: one catalog read per scope. */
27
+ async function addReleaseReachability(core, releases) {
28
+ const scopeKeys = [...new Set(releases.map(({ scope_key }) => scope_key))];
29
+ const reachableByScope = new Map(await Promise.all(scopeKeys.map(async (scopeKey) => {
30
+ const row = await core.getReleaseCatalogRow(scopeKey);
31
+ return [scopeKey, row === null ? /* @__PURE__ */ new Set() : collectCurrentlyReachableReleaseIds(JSON.parse(row.payload))];
32
+ })));
33
+ return releases.map((release) => ({
34
+ ...release,
35
+ currentlyUnreachable: !reachableByScope.get(release.scope_key)?.has(release.id)
36
+ }));
37
+ }
38
+ //#endregion
39
+ export { addReleaseReachability as t };
@@ -1,6 +1,6 @@
1
- import { gt as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
2
- import { n as Route, t as RemoteConfigPage } from "./remote-config-Ca-Wv5sF.mjs";
3
- //#region node_modules/.nitro/vite/services/ssr/assets/remote-config-BCW6vPOD.js
1
+ import { yt as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
2
+ import { n as Route, t as RemoteConfigPage } from "./remote-config-Mj05qVYZ.mjs";
3
+ //#region node_modules/.nitro/vite/services/ssr/assets/remote-config-10-obSZ0.js
4
4
  var import_jsx_runtime = require_jsx_runtime();
5
5
  function RemoteConfigRoute() {
6
6
  const { tab = "parameters" } = Route.useSearch();
@@ -1,5 +1,5 @@
1
- import { t as ConsoleFeatureUnavailable } from "./ConsoleFeatureUnavailable-DE65d293.mjs";
2
- //#region node_modules/.nitro/vite/services/ssr/assets/remote-config-DrC_3H7K.js
1
+ import { t as ConsoleFeatureUnavailable } from "./ConsoleFeatureUnavailable-CHxn9f-w.mjs";
2
+ //#region node_modules/.nitro/vite/services/ssr/assets/remote-config-Dj1eTYi4.js
3
3
  var SplitNotFoundComponent = ConsoleFeatureUnavailable;
4
4
  //#endregion
5
5
  export { SplitNotFoundComponent as notFoundComponent };
@@ -1,26 +1,27 @@
1
1
  import { i as __toESM } from "../_runtime.mjs";
2
2
  import { u as createServerFn } from "./createMiddleware-B1iPez7u.mjs";
3
- import { t as consoleAccess } from "./console-access-CRAcskRF.mjs";
4
- import { _t as require_react, gt as require_jsx_runtime, n as Toggle, t as ToggleGroup } from "../_libs/@base-ui/react+[...].mjs";
3
+ import { bt as require_react, n as Toggle, t as ToggleGroup, yt as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
5
4
  import { A as GitBranch, J as Braces, L as Clipboard, N as Eye, T as LoaderCircle, Y as ArrowUp, Z as ArrowRight, _ as Plus, a as Trash2, d as SlidersHorizontal, et as ArrowDown, g as RefreshCw, h as RotateCcw, i as TriangleAlert, k as History, n as Upload, p as Search, r as Undo2, t as X, u as Smartphone, v as Pencil } from "../_libs/lucide-react.mjs";
6
5
  import { t as cva } from "../_libs/class-variance-authority+clsx.mjs";
7
- import { A as createSsrRpc, C as Skeleton, S as SidebarTrigger, k as cn, n as Input, t as Button$1 } from "./sidebar-Bqu4emj1.mjs";
8
- import { _ as FieldLegend, a as Badge, c as CardDescription, d as CardTitle, f as Field, g as FieldLabel, h as FieldGroup, i as AlertTitle, m as FieldError, n as AlertAction, o as Card, p as FieldDescription, r as AlertDescription, s as CardContent, t as Alert, u as CardHeader, v as FieldSet } from "./field-DHrweW4l.mjs";
9
- import { a as AlertDialogDescription, i as AlertDialogContent, l as AlertDialogTitle, n as AlertDialogAction, o as AlertDialogFooter, r as AlertDialogCancel, s as AlertDialogHeader, t as AlertDialog$1 } from "./alert-dialog-MbJW0K9H.mjs";
10
- import { a as DialogHeader, i as DialogFooter, n as DialogContent, o as DialogTitle, r as DialogDescription, t as Dialog$1 } from "./dialog-CPbM7GQc.mjs";
6
+ import { A as createSsrRpc, C as Skeleton, S as SidebarTrigger, k as cn, n as Input, t as Button$1 } from "./sidebar-CVsgosaD.mjs";
7
+ import { t as consoleAccess } from "./console-access-aUpQs49I.mjs";
8
+ import { f as lazyRouteComponent, p as createFileRoute } from "../_libs/@tanstack/react-router+[...].mjs";
11
9
  import { i as useQuery, n as useMutation, s as useQueryClient, t as useInfiniteQuery } from "../_libs/tanstack__react-query.mjs";
12
10
  import { l as keepPreviousData } from "../_libs/tanstack__query-core.mjs";
11
+ import { r as requireConsoleFeature } from "./console-features-api-DSSgCV3v.mjs";
12
+ import { a as EmptyMedia, i as EmptyHeader, n as EmptyContent, o as EmptyTitle, r as EmptyDescription, t as Empty } from "./empty-Bh1FEeYF.mjs";
13
+ import { a as Badge, c as CardDescription, d as CardTitle, i as AlertTitle, n as AlertAction, o as Card, r as AlertDescription, s as CardContent, t as Alert, u as CardHeader } from "./badge-BpT7r-ng.mjs";
14
+ import { a as AlertDialogDescription, i as AlertDialogContent, l as AlertDialogTitle, n as AlertDialogAction, o as AlertDialogFooter, r as AlertDialogCancel, s as AlertDialogHeader, t as AlertDialog$1 } from "./alert-dialog-B8AqlJwo.mjs";
15
+ import { a as DialogHeader, i as DialogFooter, n as DialogContent, o as DialogTitle, r as DialogDescription, t as Dialog$1 } from "./dialog-B4ALf7NJ.mjs";
16
+ import { a as FieldLabel, i as FieldGroup, n as FieldDescription, o as FieldLegend, r as FieldError, s as FieldSet, t as Field } from "./field-HKCaPH3e.mjs";
13
17
  import { n as toast } from "../_libs/sonner.mjs";
14
- import { f as lazyRouteComponent, p as createFileRoute } from "../_libs/@tanstack/react-router+[...].mjs";
15
- import { r as requireConsoleFeature } from "./console-features-api-qihYDNRo.mjs";
16
- import { a as EmptyMedia, i as EmptyHeader, n as EmptyContent, o as EmptyTitle, r as EmptyDescription, t as Empty } from "./empty-8scgvztU.mjs";
17
- import { i as TabsTrigger, n as TabsContent, r as TabsList, t as Tabs$1 } from "./tabs-HzTSngsE.mjs";
18
- import { a as SelectItem, i as SelectGroup, n as Select$1, o as SelectTrigger, r as SelectContent, s as SelectValue, t as PlatformIcon } from "./select-usyW0pcU.mjs";
19
- import { i as InputGroupInput, n as InputGroupAddon, o as Textarea, r as InputGroupButton, t as InputGroup } from "./input-group-BTB34g3v.mjs";
20
- import { i as useChannelsQuery } from "./api-XOdKU3tw.mjs";
21
- import { n as useDialogTarget, r as useOpenSession, t as Switch$1 } from "./switch-DJPcwvwD.mjs";
18
+ import { i as TabsTrigger, n as TabsContent, r as TabsList, t as Tabs$1 } from "./tabs-CrmfOlJj.mjs";
19
+ import { a as SelectItem, i as SelectGroup, n as Select$1, o as SelectTrigger, r as SelectContent, s as SelectValue, t as PlatformIcon } from "./select-BtdGNSmp.mjs";
20
+ import { i as InputGroupInput, n as InputGroupAddon, o as Textarea, r as InputGroupButton, t as InputGroup } from "./input-group-xm3LzDuq.mjs";
21
+ import { i as useChannelsQuery } from "./api-C_0B7NXM.mjs";
22
+ import { n as useDialogTarget, r as useOpenSession, t as Switch$1 } from "./switch-BmARgkUP.mjs";
22
23
  import { n as require_dayjs_min, t as require_relativeTime } from "../_libs/dayjs.mjs";
23
- //#region node_modules/.nitro/vite/services/ssr/assets/remote-config-Ca-Wv5sF.js
24
+ //#region node_modules/.nitro/vite/services/ssr/assets/remote-config-Mj05qVYZ.js
24
25
  var import_react = /* @__PURE__ */ __toESM(require_react());
25
26
  var import_jsx_runtime = require_jsx_runtime();
26
27
  var import_dayjs_min = /* @__PURE__ */ __toESM(require_dayjs_min());
@@ -2636,8 +2637,8 @@ function RemoteConfigPage({ tab, onTabChange }) {
2636
2637
  ]
2637
2638
  });
2638
2639
  }
2639
- var $$splitComponentImporter = () => import("./remote-config-BCW6vPOD.mjs");
2640
- var $$splitNotFoundComponentImporter = () => import("./remote-config-DrC_3H7K.mjs");
2640
+ var $$splitComponentImporter = () => import("./remote-config-10-obSZ0.mjs");
2641
+ var $$splitNotFoundComponentImporter = () => import("./remote-config-Dj1eTYi4.mjs");
2641
2642
  var Route = createFileRoute("/remote-config")({
2642
2643
  beforeLoad: ({ context }) => requireConsoleFeature(context.queryClient, "remoteConfig"),
2643
2644
  notFoundComponent: lazyRouteComponent($$splitNotFoundComponentImporter, "notFoundComponent"),
@@ -1,10 +1,10 @@
1
1
  import { u as createServerFn } from "./createMiddleware-B1iPez7u.mjs";
2
- import { t as consoleAccess } from "./console-access-CRAcskRF.mjs";
2
+ import { t as consoleAccess } from "./console-access-aUpQs49I.mjs";
3
3
  import { t as createServerRpc } from "./createServerRpc-BaDJLGBx.mjs";
4
- //#region node_modules/.nitro/vite/services/ssr/assets/remote-config-rpc-CcGmTmvS.js
4
+ //#region node_modules/.nitro/vite/services/ssr/assets/remote-config-rpc-lteqDSLn.js
5
5
  /** Remote Config, once the console's access check and the feature guard pass. */
6
6
  var remoteConfig = async () => {
7
- const [{ prepareConfig }, { requireFeature }] = await Promise.all([import("./config.server-COvZCTA4.mjs"), import("./runtime.server-De0QVWc9.mjs")]);
7
+ const [{ prepareConfig }, { requireFeature }] = await Promise.all([import("./config.server-DTdsG47T.mjs"), import("./runtime.server-DsHqVqTr.mjs")]);
8
8
  const { runtime } = await prepareConfig();
9
9
  return requireFeature(runtime, "remoteConfig");
10
10
  };
@@ -1,21 +1,21 @@
1
1
  import { i as __toESM } from "../_runtime.mjs";
2
2
  import { u as createServerFn } from "./createMiddleware-B1iPez7u.mjs";
3
- import { _t as require_react, gt as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
3
+ import { bt as require_react, yt as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
4
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-Bqu4emj1.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";
6
7
  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";
7
10
  import { n as toast, t as Toaster } from "../_libs/sonner.mjs";
8
- 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";
9
- import { r as requireConsoleFeature, t as consoleFeaturesQueryOptions } from "./console-features-api-qihYDNRo.mjs";
10
- import { t as NotFoundPage } from "./NotFoundPage-DHgL7Uzm.mjs";
11
- import { t as Route$4 } from "./insights-BulsRVnt.mjs";
12
- import { t as Route$5 } from "./insights_.distribution-CKe3T4k1.mjs";
13
- import { n as Route$6 } from "./installations-Bu4Sk4W6.mjs";
14
- import { n as Route$7 } from "./remote-config-Ca-Wv5sF.mjs";
15
- import { n as Route$8, o as useFeatureUi } from "./routes-DZoij0js.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";
16
16
  import { t as setupRouterSsrQueryIntegration } from "../_libs/@tanstack/react-router-ssr-query+[...].mjs";
17
17
  import { t as z } from "../_libs/next-themes.mjs";
18
- //#region node_modules/.nitro/vite/services/ssr/assets/router-C5eI7aq7.js
18
+ //#region node_modules/.nitro/vite/services/ssr/assets/router-Dr4jjjhx.js
19
19
  var import_react = /* @__PURE__ */ __toESM(require_react());
20
20
  var import_jsx_runtime = require_jsx_runtime();
21
21
  function HotUpdaterLogo({ className }) {
@@ -341,7 +341,7 @@ var Toaster$1 = ({ ...props }) => {
341
341
  };
342
342
  var getConsoleAccessRpc = createServerFn({ method: "GET" }).handler(createSsrRpc("c504696e68ba764b48c48aa8a40275938640941e473cf9cfdd7b2322d99f9d13"));
343
343
  var getConsoleAuthProvidersRpc = createServerFn({ method: "GET" }).handler(createSsrRpc("fa8c48f0489d97c62b9b68fd0caf0a61b15bad25a42b3866ec36264b4b30bb74"));
344
- var styles_default = "/assets/styles-DTGEAJFv.css";
344
+ var styles_default = "/assets/styles-CpiW_YdW.css";
345
345
  var Route$3 = createRootRouteWithContext()({
346
346
  head: () => ({
347
347
  meta: [
@@ -414,15 +414,15 @@ function AuthorizedConsole({ canSignOut }) {
414
414
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Outlet, {})
415
415
  })] });
416
416
  }
417
- var $$splitComponentImporter = () => import("./api-keys-BHJdcnez.mjs");
418
- var $$splitNotFoundComponentImporter = () => import("./api-keys-v7wa2_rX.mjs");
417
+ var $$splitComponentImporter = () => import("./api-keys-pRNvn2-9.mjs");
418
+ var $$splitNotFoundComponentImporter = () => import("./api-keys-CLH38u9B.mjs");
419
419
  var Route$2 = createFileRoute("/api-keys")({
420
420
  beforeLoad: ({ context }) => requireConsoleFeature(context.queryClient, "apiKeys"),
421
421
  notFoundComponent: lazyRouteComponent($$splitNotFoundComponentImporter, "notFoundComponent"),
422
422
  component: lazyRouteComponent($$splitComponentImporter, "component")
423
423
  });
424
424
  var handleAuthRequest = async ({ request }) => {
425
- const { handleConsoleAuth } = await import("./auth.server-LmCV7BTA.mjs");
425
+ const { handleConsoleAuth } = await import("./auth.server-DR9zc0EU.mjs");
426
426
  return handleConsoleAuth(request);
427
427
  };
428
428
  var Route$1 = createFileRoute("/api/auth/$")({ server: { handlers: {
@@ -430,8 +430,8 @@ var Route$1 = createFileRoute("/api/auth/$")({ server: { handlers: {
430
430
  POST: handleAuthRequest
431
431
  } } });
432
432
  var Route = createFileRoute("/api/bundles/$bundleId/download")({ server: { handlers: { GET: async ({ params, request }) => {
433
- const { prepareConfig } = await import("./config.server-COvZCTA4.mjs");
434
- const { downloadBundle } = await import("./downloadBundle-CZysjmNW.mjs");
433
+ const { prepareConfig } = await import("./config.server-DTdsG47T.mjs");
434
+ const { downloadBundle } = await import("./downloadBundle-94jPBGSO.mjs");
435
435
  const { core, storage } = await prepareConfig(request);
436
436
  return downloadBundle(params.bundleId, {
437
437
  core,
@@ -1,26 +1,27 @@
1
1
  import { i as __toESM } from "../_runtime.mjs";
2
- import { _t as require_react, a as SliderIndicator, c as SliderControl, gt as require_jsx_runtime, l as SliderRoot, o as SliderThumb, s as SliderTrack } from "../_libs/@base-ui/react+[...].mjs";
2
+ import { a as SliderIndicator, bt as require_react, c as SliderControl, l as SliderRoot, o as SliderThumb, s as SliderTrack, yt as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
3
3
  import { C as Minus, E as List, F as Download, G as Check, H as ChevronRight, M as FingerprintPattern, P as ExternalLink, R as CircleOff, T as LoaderCircle, U as ChevronLeft, W as ChevronDown, Z as ArrowRight, _ as Plus, a as Trash2, b as Package, h as RotateCcw, i as TriangleAlert, j as Funnel, o as Tags, s as Tag, t as X } from "../_libs/lucide-react.mjs";
4
- import { C as Skeleton, O as buttonVariants, S as SidebarTrigger, a as SheetContent, c as SheetTitle, i as Sheet, j as useIsMobile, k as cn, n as Input, o as SheetDescription, r as Separator$1, s as SheetHeader, t as Button$1 } from "./sidebar-Bqu4emj1.mjs";
5
- import { a as Badge, c as CardDescription, d as CardTitle, f as Field, g as FieldLabel, h as FieldGroup, i as AlertTitle, m as FieldError, o as Card, p as FieldDescription, r as AlertDescription, s as CardContent, t as Alert, u as CardHeader, y as Label } from "./field-DHrweW4l.mjs";
6
- import { a as AlertDialogDescription, i as AlertDialogContent, l as AlertDialogTitle, n as AlertDialogAction, o as AlertDialogFooter, r as AlertDialogCancel, s as AlertDialogHeader, t as AlertDialog$1 } from "./alert-dialog-MbJW0K9H.mjs";
7
- import { a as DialogHeader, i as DialogFooter, n as DialogContent, o as DialogTitle, r as DialogDescription, s as DialogTrigger, t as Dialog$1 } from "./dialog-CPbM7GQc.mjs";
8
- import { a as TableHeader, i as TableHead, n as TableBody, o as TableRow, r as TableCell, t as Table } from "./table-DEzdHi1t.mjs";
9
- import { n as toast } from "../_libs/sonner.mjs";
4
+ import { C as Skeleton, O as buttonVariants, S as SidebarTrigger, a as SheetContent, c as SheetTitle, i as Sheet, j as useIsMobile, k as cn, n as Input, o as SheetDescription, r as Separator$1, s as SheetHeader, t as Button$1 } from "./sidebar-CVsgosaD.mjs";
10
5
  import { h as Link } from "../_libs/@tanstack/react-router+[...].mjs";
6
+ import { a as Badge, c as CardDescription, d as CardTitle, i as AlertTitle, o as Card, r as AlertDescription, s as CardContent, t as Alert, u as CardHeader } from "./badge-BpT7r-ng.mjs";
7
+ import { a as AlertDialogDescription, i as AlertDialogContent, l as AlertDialogTitle, n as AlertDialogAction, o as AlertDialogFooter, r as AlertDialogCancel, s as AlertDialogHeader, t as AlertDialog$1 } from "./alert-dialog-B8AqlJwo.mjs";
8
+ import { a as DialogHeader, i as DialogFooter, n as DialogContent, o as DialogTitle, r as DialogDescription, s as DialogTrigger, t as Dialog$1 } from "./dialog-B4ALf7NJ.mjs";
9
+ import { a as FieldLabel, c as Label, i as FieldGroup, n as FieldDescription, r as FieldError, t as Field } from "./field-HKCaPH3e.mjs";
10
+ import { a as TableHeader, i as TableHead, n as TableBody, o as TableRow, r as TableCell, t as Table } from "./table-M5P3YUfY.mjs";
11
+ import { n as toast } from "../_libs/sonner.mjs";
11
12
  import { E as normalizeRolloutCohortCount, T as normalizeCohortValue, _ as getPatchBaseBundleId, h as getNumericCohortRolloutPosition, i as NUMERIC_COHORT_SIZE, t as INVALID_COHORT_ERROR_MESSAGE, v as getPatchBaseFileHash, w as isValidCohort, y as getPatchFileHash } from "./dist-CbQbBIw-.mjs";
12
13
  import { r as extractTimestampFromUUIDv7 } from "./uuidv7-C88s9jWF.mjs";
13
14
  import { n as normalizeRange } from "../_libs/verkit.mjs";
14
- import { t as InfoTooltip } from "./insights-search-C8EWA0hu.mjs";
15
- import { a as SelectItem, i as SelectGroup, n as Select$1, o as SelectTrigger, r as SelectContent, s as SelectValue, t as PlatformIcon } from "./select-usyW0pcU.mjs";
16
- import { a as InputGroupText, i as InputGroupInput, n as InputGroupAddon, o as Textarea, t as InputGroup } from "./input-group-BTB34g3v.mjs";
17
- import { a as useConfigQuery, c as useDeleteReleaseMutation, d as useReleaseCatalogDiagnosticsQuery, f as useReleaseQuery, i as useChannelsQuery, l as usePreflightReleaseMutation, m as useUpdateReleaseMutation, n as useBundleChildrenQuery, o as useCreateChannelMutation, p as useReleasesQuery, r as useBundleQuery, s as useDeleteChannelMutation, t as useBundleChildCountsQuery, u as usePromoteReleaseMutation } from "./api-XOdKU3tw.mjs";
18
- import { t as BundleIdDisplay } from "./BundleIdDisplay-DDiNTVT3.mjs";
19
- import { t as HashValueDisplay } from "./HashValueDisplay-BDHvSsxT.mjs";
20
- import { n as useDialogTarget, t as Switch$1 } from "./switch-DJPcwvwD.mjs";
15
+ import { n as InfoTooltip } from "./insights-search-CBYoxT7v.mjs";
16
+ import { a as SelectItem, i as SelectGroup, n as Select$1, o as SelectTrigger, r as SelectContent, s as SelectValue, t as PlatformIcon } from "./select-BtdGNSmp.mjs";
17
+ import { a as InputGroupText, i as InputGroupInput, n as InputGroupAddon, o as Textarea, t as InputGroup } from "./input-group-xm3LzDuq.mjs";
18
+ import { a as useConfigQuery, c as useDeleteReleaseMutation, d as useReleaseCatalogDiagnosticsQuery, f as useReleaseQuery, i as useChannelsQuery, l as usePreflightReleaseMutation, m as useUpdateReleaseMutation, n as useBundleChildrenQuery, o as useCreateChannelMutation, p as useReleasesQuery, r as useBundleQuery, s as useDeleteChannelMutation, t as useBundleChildCountsQuery, u as usePromoteReleaseMutation } from "./api-C_0B7NXM.mjs";
19
+ import { t as BundleIdDisplay } from "./BundleIdDisplay-CjSnY65J.mjs";
20
+ import { t as HashValueDisplay } from "./HashValueDisplay-Zs7ABoOi.mjs";
21
+ import { n as useDialogTarget, t as Switch$1 } from "./switch-BmARgkUP.mjs";
21
22
  import { n as require_dayjs_min, t as require_relativeTime } from "../_libs/dayjs.mjs";
22
- import { a as updateReleaseFilters, i as releaseFilterOf, n as Route, r as hasReleaseFilters, s as useReleaseColumns, t as ReleaseSections } from "./routes-DZoij0js.mjs";
23
- //#region node_modules/.nitro/vite/services/ssr/assets/routes-Bd3qlRny.js
23
+ import { a as updateReleaseFilters, i as releaseFilterOf, n as Route, r as hasReleaseFilters, s as useReleaseColumns, t as ReleaseSections } from "./routes-BZbrY_qw.mjs";
24
+ //#region node_modules/.nitro/vite/services/ssr/assets/routes-B5KrCDwk.js
24
25
  var import_react = /* @__PURE__ */ __toESM(require_react());
25
26
  var import_jsx_runtime = require_jsx_runtime();
26
27
  var import_dayjs_min = /* @__PURE__ */ __toESM(require_dayjs_min());
@@ -1,18 +1,18 @@
1
+ import { n as consoleFeatures } from "./console-features-4xAGfZHw.mjs";
1
2
  import { u as createServerFn } from "./createMiddleware-B1iPez7u.mjs";
2
- import { t as consoleAccess } from "./console-access-CRAcskRF.mjs";
3
- import { gt as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
3
+ import { yt as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
4
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-Bqu4emj1.mjs";
6
- import { d as CardTitle, l as CardFooter, o as Card, s as CardContent, u as CardHeader } from "./field-DHrweW4l.mjs";
7
- import { i as useQuery } from "../_libs/tanstack__react-query.mjs";
8
- import { n as consoleFeatures } from "./console-features-Oz0q20jJ.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";
9
7
  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-qihYDNRo.mjs";
11
- import { n as readRecoveryInput } from "./insights-recovery-BWQhiZaF.mjs";
12
- import { i as failureRate, s as formatRate } from "./insights-failures-xaa41Buf.mjs";
13
- import { n as adoptionWindow, t as InfoTooltip } from "./insights-search-C8EWA0hu.mjs";
14
- import { u as useUpdateFailuresQuery } from "./insights-api-Dg3D7Vkg.mjs";
15
- //#region node_modules/.nitro/vite/services/ssr/assets/routes-DZoij0js.js
8
+ 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
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: {
@@ -119,8 +119,8 @@ function BundleMovementSummary({ report, loading = false, input, variant = "inli
119
119
  className: "min-w-0 rounded-sm hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
120
120
  to: "/insights",
121
121
  search: {
122
- healthPlatform: input.platform,
123
- healthChannel: input.channel,
122
+ platform: input.platform,
123
+ channel: input.channel,
124
124
  releaseId: input.releaseId,
125
125
  bundleWindow: adoptionWindow(input.releaseId)
126
126
  },
@@ -206,8 +206,8 @@ function BundleInsightsSummary({ input }) {
206
206
  }),
207
207
  to: "/insights",
208
208
  search: {
209
- healthPlatform: input.platform,
210
- healthChannel: input.channel,
209
+ platform: input.platform,
210
+ channel: input.channel,
211
211
  releaseId: input.releaseId,
212
212
  bundleWindow: adoptionWindow(input.releaseId),
213
213
  healthChart: "adoption"
@@ -396,7 +396,7 @@ function updateReleaseFilters(current, filters) {
396
396
  scopeKey: next.scopeKey
397
397
  });
398
398
  }
399
- var $$splitComponentImporter = () => import("./routes-Bd3qlRny.mjs");
399
+ var $$splitComponentImporter = () => import("./routes-B5KrCDwk.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.
@@ -1,7 +1,7 @@
1
- import { i as resolveConsoleFeatures, n as consoleFeatures, t as ConsoleFeatureUnavailableError } from "./console-features-Oz0q20jJ.mjs";
1
+ import { i as resolveConsoleFeatures, n as consoleFeatures, t as ConsoleFeatureUnavailableError } from "./console-features-4xAGfZHw.mjs";
2
2
  import { t as isRemoteDatabase } from "./databaseConfig-C5SkAyUy.mjs";
3
3
  import { a as createInsightsReads, i as createInsightsAdminReads, n as createRemoteConfigAdminApi, o as createInsightsModel, r as RemoteConfigValidationError } from "./plugins-BaD1slHx.mjs";
4
- //#region node_modules/.nitro/vite/services/ssr/assets/runtime.server-De0QVWc9.js
4
+ //#region node_modules/.nitro/vite/services/ssr/assets/runtime.server-DsHqVqTr.js
5
5
  var invalidOf = (error) => {
6
6
  if (error instanceof RemoteConfigValidationError) return {
7
7
  status: "invalid",
@@ -1,7 +1,7 @@
1
1
  import "../_runtime.mjs";
2
- import { A as SelectScrollUpArrow, B as SelectValue$1, F as SelectList, H as SelectRoot, I as SelectPopup, L as SelectPositioner, M as SelectItemText, N as SelectItemIndicator, P as SelectItem$1, R as SelectPortal, V as SelectTrigger$1, _t as require_react, gt as require_jsx_runtime, j as SelectScrollDownArrow, k as SelectGroup$1, z as SelectIcon } from "../_libs/@base-ui/react+[...].mjs";
2
+ import { B as SelectPositioner, F as SelectItemText, G as SelectRoot, H as SelectIcon, I as SelectItemIndicator, L as SelectItem$1, M as SelectGroup$1, N as SelectScrollUpArrow, P as SelectScrollDownArrow, R as SelectList, U as SelectValue$1, V as SelectPortal, W as SelectTrigger$1, bt as require_react, yt as require_jsx_runtime, z as SelectPopup } from "../_libs/@base-ui/react+[...].mjs";
3
3
  import { G as Check, V as ChevronUp, W as ChevronDown } from "../_libs/lucide-react.mjs";
4
- import { k as cn } from "./sidebar-Bqu4emj1.mjs";
4
+ import { k as cn } from "./sidebar-CVsgosaD.mjs";
5
5
  require_react();
6
6
  var import_jsx_runtime = require_jsx_runtime();
7
7
  function AppleIcon({ className }) {
@@ -1,7 +1,7 @@
1
1
  import "../_runtime.mjs";
2
2
  import { _ as parseSetCookie, a as TSS_SERVER_FUNCTION, b as serialize, c as createMiddleware, d as flattenMiddlewares, f as getStartContext, g as parse, h as mergeHeaders, i as TSS_FORMDATA_CONTEXT, l as createNullProtoObject, m as isRedirect, n as MAX_FRAME_PAYLOAD_SIZE, o as X_TSS_RAW_RESPONSE, p as getStartOptions, r as TSS_CONTENT_TYPE_FRAMED_VERSIONED, s as X_TSS_SERIALIZED, t as MAX_FRAMED_STREAMS, v as runWithStartContext, x as splitSetCookieString, y as safeObjectMerge } from "./createMiddleware-B1iPez7u.mjs";
3
- import { t as getServerFnById } from "../__23tanstack-start-server-fn-resolver-Gb7cVpng.mjs";
4
- import { _t as require_react, gt as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
3
+ import { t as getServerFnById } from "../__23tanstack-start-server-fn-resolver-KpQ5Z_24.mjs";
4
+ import { bt as require_react, yt as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
5
5
  import { l as RouterProvider, n as renderRouterToString, r as defineHandlerCallback, t as renderRouterToStream } from "../_libs/@tanstack/react-router+[...].mjs";
6
6
  import { t as __exportAll } from "./rolldown-runtime-rSIU-vHC.mjs";
7
7
  import { Readable } from "node:stream";
@@ -3966,7 +3966,7 @@ var HEADERS = { TSS_SHELL: "X-TSS_SHELL" };
3966
3966
  * the dev styles URL for route-scoped CSS collection.
3967
3967
  */
3968
3968
  async function getStartManifest(matchedRoutes) {
3969
- const { tsrStartManifest } = await import("../_tanstack-start-manifest_v-DTOQk1l4.mjs");
3969
+ const { tsrStartManifest } = await import("../_tanstack-start-manifest_v-_BY9hYTm.mjs");
3970
3970
  const startManifest = tsrStartManifest();
3971
3971
  let routes = startManifest.routes;
3972
3972
  routes[rootRouteId];
@@ -6988,7 +6988,7 @@ var getBaseManifest = getProdBaseManifest;
6988
6988
  var createEarlyHintsForRequest = createEarlyHintsCollector;
6989
6989
  async function loadEntries() {
6990
6990
  const [routerEntry, startEntry, pluginAdapters] = await Promise.all([
6991
- import("./router-C5eI7aq7.mjs"),
6991
+ import("./router-Dr4jjjhx.mjs"),
6992
6992
  import("./start-B6ECIE_7.mjs"),
6993
6993
  import("./empty-plugin-adapters-CpCHi1TV.mjs")
6994
6994
  ]);
@@ -1,11 +1,11 @@
1
1
  import { i as __toESM } from "../_runtime.mjs";
2
2
  import { a as TSS_SERVER_FUNCTION } from "./createMiddleware-B1iPez7u.mjs";
3
- import { t as getServerFnById } from "../__23tanstack-start-server-fn-resolver-Gb7cVpng.mjs";
4
- import { $ as DialogPopup, Q as DialogPortal, X as DialogTitle, Y as DialogTrigger, Z as DialogRoot, _t as require_react, at as TooltipProvider$1, ct as TooltipPositioner, dt as TooltipRoot, et as DialogDescription, gt as require_jsx_runtime, ht as mergeProps, it as Separator, lt as TooltipPortal, mt as Button, nt as DialogBackdrop, ot as TooltipArrow, rt as useRender, st as TooltipPopup, tt as DialogClose, ut as TooltipTrigger$1 } from "../_libs/@base-ui/react+[...].mjs";
3
+ import { t as getServerFnById } from "../__23tanstack-start-server-fn-resolver-KpQ5Z_24.mjs";
4
+ import { $ as DialogTitle, Q as DialogTrigger, _t as Button, at as DialogBackdrop, bt as require_react, ct as TooltipProvider$1, dt as TooltipPositioner, et as DialogRoot, ft as TooltipPortal, it as DialogClose, lt as TooltipArrow, mt as TooltipRoot, nt as DialogPopup, ot as useRender, pt as TooltipTrigger$1, rt as DialogDescription, st as Separator, tt as DialogPortal, ut as TooltipPopup, vt as mergeProps, yt as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
5
5
  import { t as X, y as PanelLeft } from "../_libs/lucide-react.mjs";
6
6
  import { n as clsx, t as cva } from "../_libs/class-variance-authority+clsx.mjs";
7
7
  import { t as twMerge } from "../_libs/tailwind-merge.mjs";
8
- //#region node_modules/.nitro/vite/services/ssr/assets/sidebar-Bqu4emj1.js
8
+ //#region node_modules/.nitro/vite/services/ssr/assets/sidebar-CVsgosaD.js
9
9
  var import_react = /* @__PURE__ */ __toESM(require_react());
10
10
  var import_jsx_runtime = require_jsx_runtime();
11
11
  var createSsrRpc = (functionId) => {
@@ -1,4 +1,4 @@
1
- import { a as defaultStreamHandler, n as createStartHandler, r as createServerEntry$1 } from "./server-Bp9nEe3Z.mjs";
1
+ import { a as defaultStreamHandler, n as createStartHandler, r as createServerEntry$1 } from "./server-BxaHSwHh.mjs";
2
2
  //#region node_modules/.nitro/vite/services/ssr/index.js
3
3
  var fetch = createStartHandler(defaultStreamHandler);
4
4
  var createServerEntry = createServerEntry$1;
@@ -1,7 +1,7 @@
1
1
  import { i as __toESM } from "../_runtime.mjs";
2
- import { _t as require_react, gt as require_jsx_runtime, i as SwitchRoot, r as SwitchThumb } from "../_libs/@base-ui/react+[...].mjs";
3
- import { k as cn } from "./sidebar-Bqu4emj1.mjs";
4
- //#region node_modules/.nitro/vite/services/ssr/assets/switch-DJPcwvwD.js
2
+ import { bt as require_react, i as SwitchRoot, r as SwitchThumb, yt as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
3
+ import { k as cn } from "./sidebar-CVsgosaD.mjs";
4
+ //#region node_modules/.nitro/vite/services/ssr/assets/switch-BmARgkUP.js
5
5
  var import_react = /* @__PURE__ */ __toESM(require_react());
6
6
  var import_jsx_runtime = require_jsx_runtime();
7
7
  /**
@@ -1,6 +1,6 @@
1
1
  import "../_runtime.mjs";
2
- import { _t as require_react, gt as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
3
- import { k as cn } from "./sidebar-Bqu4emj1.mjs";
2
+ import { bt as require_react, yt as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
3
+ import { k as cn } from "./sidebar-CVsgosaD.mjs";
4
4
  require_react();
5
5
  var import_jsx_runtime = require_jsx_runtime();
6
6
  function Table({ className, ...props }) {
@@ -1,7 +1,7 @@
1
- import { G as TabsTab, K as TabsRoot, U as TabsList$1, W as TabsPanel, gt as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
1
+ import { J as TabsTab, K as TabsList$1, Y as TabsRoot, q as TabsPanel, yt as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
2
2
  import { t as cva } from "../_libs/class-variance-authority+clsx.mjs";
3
- import { k as cn } from "./sidebar-Bqu4emj1.mjs";
4
- //#region node_modules/.nitro/vite/services/ssr/assets/tabs-HzTSngsE.js
3
+ import { k as cn } from "./sidebar-CVsgosaD.mjs";
4
+ //#region node_modules/.nitro/vite/services/ssr/assets/tabs-CrmfOlJj.js
5
5
  var import_jsx_runtime = require_jsx_runtime();
6
6
  function Tabs$1({ className, orientation = "horizontal", ...props }) {
7
7
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TabsRoot, {
@@ -0,0 +1,103 @@
1
+ import { r as recoveryWindows, t as insightsPeriodEnd } from "./insights-recovery-BUuQdlA3.mjs";
2
+ import { c as readUpdateFailuresInput, i as failureRate, t as checkFailureRate } from "./insights-failures-BJN3RfLu.mjs";
3
+ //#region node_modules/.nitro/vite/services/ssr/assets/updateFailures-z1IQy_4q.js
4
+ var total = (reports, count) => reports.reduce((sum, report) => sum + count(report), 0);
5
+ /** Counts summed by key, most first, then in key order. */
6
+ var summed = (rows, keyOf, merge) => {
7
+ const groups = /* @__PURE__ */ new Map();
8
+ for (const row of rows) {
9
+ const key = keyOf(row);
10
+ groups.set(key, [...groups.get(key) ?? [], row]);
11
+ }
12
+ return [...groups].map(([key, group]) => ({
13
+ key,
14
+ row: merge(group[0], group)
15
+ })).sort((left, right) => right.row.events - left.row.events || (left.key < right.key ? -1 : left.key > right.key ? 1 : 0)).map(({ row }) => row);
16
+ };
17
+ /**
18
+ * Both platforms' failures as one report. An installation runs on one
19
+ * platform, so its counts and installation estimates add up; the period is
20
+ * complete only where both are.
21
+ */
22
+ function mergeUpdateFailures(reports) {
23
+ if (reports.length === 1) return reports[0];
24
+ const sinceMs = reports.map(({ coverage }) => coverage.sinceMs);
25
+ const latestSince = sinceMs.includes(null) ? null : Math.max(...sinceMs);
26
+ const checks = reports.flatMap((report) => report.checks ? [report.checks] : []);
27
+ const breakdowns = reports.flatMap((report) => report.breakdown ?? []);
28
+ return {
29
+ coverage: latestSince !== null && reports.every(({ coverage }) => coverage.kind === "complete") ? {
30
+ kind: "complete",
31
+ sinceMs: latestSince
32
+ } : {
33
+ kind: "partial",
34
+ sinceMs: latestSince
35
+ },
36
+ measuredAtMs: Math.min(...reports.map((report) => report.measuredAtMs)),
37
+ failedUpdates: total(reports, (report) => report.failedUpdates),
38
+ failedInstallations: total(reports, (report) => report.failedInstallations),
39
+ downloads: total(reports, (report) => report.downloads),
40
+ patchDownloads: total(reports, (report) => report.patchDownloads),
41
+ patchFallbacks: total(reports, (report) => report.patchFallbacks),
42
+ ...checks.length === 0 ? {} : { checks: {
43
+ failures: checks.reduce((sum, row) => sum + row.failures, 0),
44
+ failedInstallations: checks.reduce((sum, row) => sum + row.failedInstallations, 0),
45
+ activeInstallations: checks.reduce((sum, row) => sum + row.activeInstallations, 0)
46
+ } },
47
+ ...reports.some((report) => report.breakdown) ? { breakdown: summed(breakdowns, ({ stage, reason }) => JSON.stringify([stage, reason]), (first, group) => ({
48
+ stage: first.stage,
49
+ reason: first.reason,
50
+ events: group.reduce((sum, row) => sum + row.events, 0),
51
+ details: summed(group.flatMap((row) => row.details), ({ resource, httpStatus, originCode, transport }) => JSON.stringify([
52
+ resource,
53
+ httpStatus,
54
+ originCode,
55
+ transport
56
+ ]), (detail, details) => ({
57
+ ...detail,
58
+ events: details.reduce((sum, row) => sum + row.events, 0)
59
+ }))
60
+ })) } : {}
61
+ };
62
+ }
63
+ /**
64
+ * A release's or a channel's update failures over a period that ends with
65
+ * the current hour. Both platforms read each and merge, except a release's,
66
+ * which reads only the platform it was deployed to.
67
+ */
68
+ async function getUpdateFailuresReport(reads, input, now = Date.now(), releases) {
69
+ readUpdateFailuresInput(input);
70
+ const end = insightsPeriodEnd(now);
71
+ const timeRange = input.window === void 0 ? void 0 : {
72
+ start: Math.max(0, end - recoveryWindows[input.window].durationMs),
73
+ end
74
+ };
75
+ const scope = {
76
+ channel: input.channel,
77
+ ...input.releaseId === void 0 ? {} : { releaseId: input.releaseId }
78
+ };
79
+ const release = input.platform === "all" && input.releaseId !== void 0 && releases ? await releases.getRelease(input.releaseId) : null;
80
+ const platforms = input.platform !== "all" ? [input.platform] : release ? [release.platform] : ["ios", "android"];
81
+ const read = async (range) => mergeUpdateFailures(await Promise.all(platforms.map((platform) => reads.getUpdateFailures({
82
+ ...scope,
83
+ platform,
84
+ ...range === void 0 ? {} : { timeRange: range }
85
+ }))));
86
+ const previousRange = timeRange && timeRange.start >= timeRange.end - timeRange.start ? {
87
+ start: timeRange.start - (timeRange.end - timeRange.start),
88
+ end: timeRange.start
89
+ } : void 0;
90
+ const [failures, previous] = await Promise.all([read(timeRange), previousRange === void 0 ? void 0 : read(previousRange)]);
91
+ return {
92
+ ...failures,
93
+ startMs: timeRange?.start ?? null,
94
+ endMs: end,
95
+ ...previous === void 0 ? {} : { previous: {
96
+ attemptRate: failureRate(previous),
97
+ checkRate: previous.checks ? checkFailureRate(previous.checks) : null,
98
+ complete: previous.coverage.kind === "complete" && failures.coverage.kind === "complete"
99
+ } }
100
+ };
101
+ }
102
+ //#endregion
103
+ export { getUpdateFailuresReport, mergeUpdateFailures };