@hot-updater/console 1.0.0-rc.0 → 1.0.0-rc.2

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 (203) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/HashValueDisplay-CB0Eskit.js +1 -0
  3. package/.output/public/assets/InsightsPageHeader-Car5LNiZ.js +1 -0
  4. package/.output/public/assets/api-keys-BzKocqRy.js +1 -0
  5. package/.output/public/assets/api-keys-api-BHcODB7q.js +1 -0
  6. package/.output/public/assets/card-Dhr_eFYj.js +1 -0
  7. package/.output/public/assets/{chart-no-axes-combined-FaYMGmQS.js → chart-no-axes-combined-Dy4WJv2U.js} +1 -1
  8. package/.output/public/assets/composite-Bp98A0Ld.js +1 -0
  9. package/.output/public/assets/createServerFn-CA8fs7QD.js +3 -0
  10. package/.output/public/assets/dialog-CUTrcPlB.js +1 -0
  11. package/.output/public/assets/{dist-DspNKfMj.js → dist-C_NydL0e.js} +1 -1
  12. package/.output/public/assets/index-DdAz-CXv.js +10 -0
  13. package/.output/public/assets/input-group-cSOG4wh_.js +1 -0
  14. package/.output/public/assets/insights-C0PBSZ-n.js +1 -0
  15. package/.output/public/assets/installations-CE33wgbY.js +2 -0
  16. package/.output/public/assets/installations-CStZja8x.js +1 -0
  17. package/.output/public/assets/lazyRouteComponent-Ccp3bwBY.js +1 -0
  18. package/.output/public/assets/link-CI8idAUi.js +1 -0
  19. package/.output/public/assets/loader-circle-BoxLrsOu.js +1 -0
  20. package/.output/public/assets/refresh-cw-Bqc72UZG.js +1 -0
  21. package/.output/public/assets/{routes-DcQnVajO.js → routes-DGVXdzpw.js} +2 -2
  22. package/.output/public/assets/routes-DTlwOr8I.js +1 -0
  23. package/.output/public/assets/{shield-check-DE_hVuHu.js → shield-check-uK3MHWJZ.js} +1 -1
  24. package/.output/public/assets/signing-CMf4aqDO.js +1 -0
  25. package/.output/public/assets/styles-BCvbtKsm.css +2 -0
  26. package/.output/public/assets/table-2vcV89QB.js +1 -0
  27. package/.output/public/assets/useCompositeListItem-CHLITE_4.js +1 -0
  28. package/.output/public/assets/x-DCd0j8c6.js +1 -0
  29. package/.output/server/{__23tanstack-start-server-fn-resolver-DBP9TQ7K.mjs → __23tanstack-start-server-fn-resolver-B7ioJhtE.mjs} +44 -52
  30. package/.output/server/_libs/@base-ui/react+[...].mjs +1906 -4040
  31. package/.output/server/_libs/@tanstack/react-router+[...].mjs +52 -4
  32. package/.output/server/_libs/@tanstack/react-router-ssr-query+[...].mjs +2 -2
  33. package/.output/server/_libs/lucide-react.mjs +36 -3
  34. package/.output/server/_libs/next-themes.mjs +2 -2
  35. package/.output/server/_libs/sonner.mjs +2 -2
  36. package/.output/server/_libs/tanstack__react-query.mjs +2 -2
  37. package/.output/server/_libs/verkit.mjs +20 -15
  38. package/.output/server/_runtime.mjs +1 -10
  39. package/.output/server/_ssr/HashValueDisplay-DwpGLfrl.mjs +55 -0
  40. package/.output/server/_ssr/InsightsPageHeader-Df4Brj8u.mjs +484 -0
  41. package/.output/server/_ssr/{api-keys-BnM_o2nS.mjs → api-keys-CZeTPQys.mjs} +11 -13
  42. package/.output/server/_ssr/{api-keys-api-CIywsSF5.mjs → api-keys-api-BUPQVSpk.mjs} +2 -2
  43. package/.output/server/_ssr/{api-keys-rpc-BSp1wkIV.mjs → api-keys-rpc-Cs7tS5_j.mjs} +5 -5
  44. package/.output/server/_ssr/{api-rpc-cG5wd_tO.mjs → api-rpc-tAupfGQm.mjs} +73 -142
  45. package/.output/server/_ssr/{auth-rpc-BrJ6obHJ.mjs → auth-rpc-DUaeOWKK.mjs} +4 -4
  46. package/.output/server/_ssr/{auth.server-DwKoZoQM.mjs → auth.server-DW71WzsD.mjs} +2 -5
  47. package/.output/server/_ssr/{bundle-signing-rpc-COoQhW8E.mjs → bundle-signing-rpc-BhnBw0-d.mjs} +2 -2
  48. package/.output/server/_ssr/bundle-signing.server-C4NW5mWx.mjs +12 -0
  49. package/.output/server/_ssr/{alert-Dim3MGY5.mjs → card-BRiPmi0C.mjs} +61 -39
  50. package/.output/server/_ssr/{config.server-DEiLhKmy.mjs → config.server-afDuAwaG.mjs} +15 -8
  51. package/.output/server/_ssr/{createSsrRpc-9P0S0lJ3.mjs → createSsrRpc-DjWNJ0uc.mjs} +6 -6
  52. package/.output/server/_ssr/databaseJsonValue-d6I3nAS4.mjs +45 -0
  53. package/.output/server/_ssr/{databaseRows-CwbNwYSl.mjs → databaseRows-5bCRTxm-.mjs} +4 -44
  54. package/.output/server/_ssr/{deleteBundle-Cu_XOMt0.mjs → deleteBundle-BTGwBgzx.mjs} +2 -2
  55. package/.output/server/_ssr/{dialog-CQuRMNZ4.mjs → dialog-DS-nw-pA.mjs} +2 -2
  56. package/.output/server/_ssr/{dist-BVSLTpoP.mjs → dist-CyzPaI5v.mjs} +2 -2
  57. package/.output/server/_ssr/{getBundleChildren-BcRMFoDF.mjs → getBundleChildren-C0vh4ZvE.mjs} +2 -2
  58. package/.output/server/_ssr/input-group-BpsnmvZw.mjs +70 -0
  59. package/.output/server/_ssr/insights-BdS364Xu.mjs +460 -0
  60. package/.output/server/_ssr/insights-rpc-38DujK0G.mjs +57 -0
  61. package/.output/server/_ssr/insightsContract-fjJDBeEE.mjs +303 -0
  62. package/.output/server/_ssr/installations-CtA59MQG.mjs +29 -0
  63. package/.output/server/_ssr/installations-DiVKEF5T.mjs +627 -0
  64. package/.output/server/_ssr/{router-C-KUBfOi.mjs → router-B9wG_9f8.mjs} +37 -46
  65. package/.output/server/_ssr/{routes-Z7TwC6nC.mjs → routes-CKrrS2q2.mjs} +3 -3
  66. package/.output/server/_ssr/{routes-BM4ht9jb.mjs → routes-D7Yh_jfj.mjs} +402 -390
  67. package/.output/server/_ssr/runtime.server-DacU1TBV.mjs +438 -0
  68. package/.output/server/_ssr/{server-BjzmvXnO.mjs → server-D_C2rMzf.mjs} +5 -5
  69. package/.output/server/_ssr/{signing-k8GxyBDF.mjs → signing-Dz1WkZOf.mjs} +16 -85
  70. package/.output/server/_ssr/ssr.mjs +1 -1
  71. package/.output/server/_ssr/{field-DRIXKjZG.mjs → table-CnZmon_Z.mjs} +51 -5
  72. package/.output/server/_ssr/{uuidv7-BbJ-9D_I.mjs → uuidv7-D0QFkPL_.mjs} +3 -3
  73. package/.output/server/_tanstack-start-manifest_v-2MjTyxil.mjs +97 -0
  74. package/.output/server/index.mjs +168 -203
  75. package/lib/index.d.mts +4 -4
  76. package/lib/vite-internal.mjs +1 -1
  77. package/lib/vite.d.mts +0 -1
  78. package/package.json +8 -8
  79. package/src/components/AppSidebar.tsx +12 -16
  80. package/src/components/ConsoleAccessPage.tsx +1 -1
  81. package/src/components/HashValueDisplay.tsx +11 -2
  82. package/src/components/features/api-keys/ApiKeysPage.tsx +1 -1
  83. package/src/components/features/bundles/BundleChildrenPanel.tsx +7 -6
  84. package/src/components/features/bundles/BundleMetadata.tsx +1 -20
  85. package/src/components/features/channels/ChannelManagementDialog.tsx +1 -1
  86. package/src/components/features/insights/EventDetails.tsx +151 -0
  87. package/src/components/features/insights/EventHistoryCard.tsx +245 -0
  88. package/src/components/features/insights/EventHistoryList.tsx +63 -0
  89. package/src/components/features/insights/InsightsBundleReports.tsx +51 -0
  90. package/src/components/features/insights/InsightsControls.tsx +121 -0
  91. package/src/components/features/{analytics/AnalyticsErrorAlert.tsx → insights/InsightsErrorAlert.tsx} +6 -6
  92. package/src/components/features/insights/InsightsOverview.tsx +203 -0
  93. package/src/components/features/insights/InsightsPageHeader.tsx +48 -0
  94. package/src/components/features/insights/InsightsPagination.tsx +52 -0
  95. package/src/components/features/insights/InstallationHistoryCard.tsx +250 -0
  96. package/src/components/features/insights/InstallationMatchesCard.tsx +178 -0
  97. package/src/components/features/insights/InstallationPageHeader.tsx +90 -0
  98. package/src/components/features/releases/ReleaseEditorSheet.tsx +24 -24
  99. package/src/components/features/signing/BundleSigningPage.tsx +18 -126
  100. package/src/components/ui/badge.tsx +2 -0
  101. package/src/components/ui/combobox.tsx +1 -0
  102. package/src/components/ui/skeleton.tsx +4 -1
  103. package/src/components/ui/tooltip.tsx +1 -1
  104. package/src/index.ts +7 -3
  105. package/src/lib/api-rpc.ts +19 -90
  106. package/src/lib/api.ts +0 -99
  107. package/src/lib/insights-api.ts +100 -0
  108. package/src/lib/insights-rpc.ts +88 -0
  109. package/src/lib/insights-view.ts +15 -0
  110. package/src/lib/public-bundle-error.ts +19 -0
  111. package/src/lib/server/bundle-signing.server.ts +5 -82
  112. package/src/lib/server/console-runtime.server.ts +0 -9
  113. package/src/lib/server/releaseReachability.ts +1 -4
  114. package/src/lib/server/runtime.server.ts +6 -142
  115. package/src/routeTree.gen.ts +21 -21
  116. package/src/router.tsx +3 -0
  117. package/src/routes/-installations-search.ts +25 -12
  118. package/src/routes/__root.tsx +6 -16
  119. package/src/routes/api-keys.tsx +1 -1
  120. package/src/routes/index.tsx +21 -81
  121. package/src/routes/insights.tsx +84 -0
  122. package/src/routes/installations.tsx +294 -142
  123. package/src/styles.css +6 -0
  124. package/.output/public/assets/AnalyticsCapabilityContext-BCke57-7.js +0 -1
  125. package/.output/public/assets/BundleActivityChart-CnsBe_1J.js +0 -42
  126. package/.output/public/assets/BundleIdDisplay-Dky75zLU.js +0 -1
  127. package/.output/public/assets/alert-C-1KvDW8.js +0 -1
  128. package/.output/public/assets/analytics-Bqz0c-BT.js +0 -1
  129. package/.output/public/assets/analytics-api-CJdrTLLO.js +0 -1
  130. package/.output/public/assets/api-B_Rh-uzC.js +0 -1
  131. package/.output/public/assets/api-keys-BurCFhzH.js +0 -1
  132. package/.output/public/assets/api-keys-api-BEDJdQg3.js +0 -1
  133. package/.output/public/assets/badge-Bf0fZ-Gx.js +0 -1
  134. package/.output/public/assets/createServerFn-gM2-LFBy.js +0 -3
  135. package/.output/public/assets/dialog-BS60BRr2.js +0 -1
  136. package/.output/public/assets/download-O-yNBc9H.js +0 -1
  137. package/.output/public/assets/field-Buq148-A.js +0 -1
  138. package/.output/public/assets/index-kFhd2S78.js +0 -10
  139. package/.output/public/assets/installations-BrQ-od41.js +0 -2
  140. package/.output/public/assets/installations-CGlZ3ROz.js +0 -1
  141. package/.output/public/assets/lazyRouteComponent-rPzgA7S-.js +0 -1
  142. package/.output/public/assets/loader-circle-DCYF-wJl.js +0 -1
  143. package/.output/public/assets/refresh-cw-n8XYbPPj.js +0 -1
  144. package/.output/public/assets/routes-CrdokJ80.js +0 -1
  145. package/.output/public/assets/search-DLhbWw3W.js +0 -1
  146. package/.output/public/assets/signing-HRexfjsH.js +0 -1
  147. package/.output/public/assets/styles-eB4EtvFS.css +0 -2
  148. package/.output/public/assets/table-D8CLieHX.js +0 -1
  149. package/.output/public/assets/textarea-YJLTVAoq.js +0 -1
  150. package/.output/public/assets/useMutation-JsGVjQMY.js +0 -1
  151. package/.output/public/assets/useOpenInteractionType-4cRD5xO0.js +0 -1
  152. package/.output/server/_libs/@reduxjs/toolkit+[...].mjs +0 -1554
  153. package/.output/server/_libs/d3-array.mjs +0 -231
  154. package/.output/server/_libs/d3-color.mjs +0 -330
  155. package/.output/server/_libs/d3-format.mjs +0 -252
  156. package/.output/server/_libs/d3-interpolate.mjs +0 -207
  157. package/.output/server/_libs/d3-path.mjs +0 -77
  158. package/.output/server/_libs/d3-scale+[...].mjs +0 -1907
  159. package/.output/server/_libs/d3-shape.mjs +0 -818
  160. package/.output/server/_libs/decimal.js-light.mjs +0 -884
  161. package/.output/server/_libs/es-toolkit.mjs +0 -1134
  162. package/.output/server/_libs/eventemitter3.mjs +0 -236
  163. package/.output/server/_libs/immer.mjs +0 -532
  164. package/.output/server/_libs/react-redux+[...].mjs +0 -205
  165. package/.output/server/_libs/recharts+[...].mjs +0 -14117
  166. package/.output/server/_ssr/AnalyticsCapabilityContext-ui4DX8GO.mjs +0 -15
  167. package/.output/server/_ssr/BundleActivityChart-BiB9ZORH.mjs +0 -288
  168. package/.output/server/_ssr/BundleIdDisplay-Czk6iR6p.mjs +0 -13
  169. package/.output/server/_ssr/analytics-DtMTn8fn.mjs +0 -858
  170. package/.output/server/_ssr/analytics-api-Cg1M5v_H.mjs +0 -71
  171. package/.output/server/_ssr/analytics-input-fRRRn0uA.mjs +0 -96
  172. package/.output/server/_ssr/analytics-rpc-DY5uXvHT.mjs +0 -155
  173. package/.output/server/_ssr/api-BTSv1tZb.mjs +0 -282
  174. package/.output/server/_ssr/badge-DCxbEeof.mjs +0 -26
  175. package/.output/server/_ssr/bundle-signing.server-D5u8KkMp.mjs +0 -51
  176. package/.output/server/_ssr/installations-B-azgAvX.mjs +0 -19
  177. package/.output/server/_ssr/installations-Ctvzp2JH.mjs +0 -535
  178. package/.output/server/_ssr/runtime.server-awTLiiXW.mjs +0 -527
  179. package/.output/server/_ssr/table-v1yCvYo7.mjs +0 -53
  180. package/.output/server/_ssr/textarea-DYHnskhb.mjs +0 -14
  181. package/.output/server/_tanstack-start-manifest_v-CH4StzJu.mjs +0 -108
  182. package/src/components/features/analytics/ActivityChart.tsx +0 -150
  183. package/src/components/features/analytics/AnalyticsCapabilityContext.tsx +0 -24
  184. package/src/components/features/analytics/AnalyticsControls.tsx +0 -115
  185. package/src/components/features/analytics/AnalyticsOverview.tsx +0 -208
  186. package/src/components/features/analytics/BundleDistribution.tsx +0 -133
  187. package/src/components/features/analytics/BundleSelector.tsx +0 -114
  188. package/src/components/features/analytics/InstallationHistoryCard.tsx +0 -248
  189. package/src/components/features/analytics/InstallationMatchesCard.tsx +0 -132
  190. package/src/components/features/analytics/InstallationPageHeader.tsx +0 -138
  191. package/src/components/features/analytics/InstallationPagination.tsx +0 -48
  192. package/src/components/features/analytics/InstallationSearch.tsx +0 -230
  193. package/src/components/features/analytics/UpdateOutcomes.tsx +0 -147
  194. package/src/components/features/bundles/BundleActivityChart.tsx +0 -193
  195. package/src/components/features/bundles/BundleAnalyticsSummary.tsx +0 -123
  196. package/src/lib/analytics-api.ts +0 -145
  197. package/src/lib/analytics-error.ts +0 -19
  198. package/src/lib/analytics-input.ts +0 -187
  199. package/src/lib/analytics-overview.ts +0 -170
  200. package/src/lib/analytics-rpc.ts +0 -218
  201. package/src/lib/server/releaseActivity.ts +0 -27
  202. package/src/routes/analytics.tsx +0 -139
  203. /package/.output/public/assets/{preload-helper-TKOBYGYD.js → preload-helper-CQ36nxok.js} +0 -0
@@ -1,29 +1,33 @@
1
- import { i as __toESM } from "../_runtime.mjs";
2
- import { B as DialogClose, I as DialogTitle, L as DialogPortal, R as DialogPopup, S as DialogRoot, V as DialogBackdrop, _ as SelectPortal, a as SliderTrack, at as require_react, b as SelectTrigger$1, c as SelectGroup$1, d as SelectItemText, f as SelectItemIndicator, g as SelectPositioner, h as SelectPopup, i as SliderThumb, it as require_jsx_runtime, l as SelectScrollUpArrow, m as SelectList, n as SwitchRoot, o as SliderControl, p as SelectItem$1, r as SliderIndicator, s as SliderRoot, t as SwitchThumb, u as SelectScrollDownArrow, v as SelectIcon, x as SelectRoot, y as SelectValue$1, z as DialogDescription } from "../_libs/@base-ui/react+[...].mjs";
3
- import { n as useAnalyticsCapability } from "./AnalyticsCapabilityContext-ui4DX8GO.mjs";
4
- import { A as ChevronRight, C as FingerprintPattern, D as CircleOff, F as ArrowRight, M as ChevronDown, N as Check, S as Funnel, T as Download, _ as Minus, a as Tag, f as Plus, i as Tags, j as ChevronLeft, k as ChevronUp, m as Package, n as TriangleAlert, r as Trash2, t as X, u as RotateCcw, v as LoaderCircle, w as ExternalLink, y as List } from "../_libs/lucide-react.mjs";
5
- import { C as cn, S as buttonVariants, T as useIsMobile, _ as Skeleton, g as SidebarTrigger, n as Input, r as Separator$1, t as Button$1, v as Tooltip$1, x as TooltipTrigger, y as TooltipContent } from "./createSsrRpc-9P0S0lJ3.mjs";
6
- import { p as Link } from "../_libs/@tanstack/react-router+[...].mjs";
7
- import { a as FieldLabel, i as FieldGroup, n as FieldDescription, o as Label, r as FieldError, t as Field } from "./field-DRIXKjZG.mjs";
8
- import { t as Textarea } from "./textarea-DYHnskhb.mjs";
9
- import { S as useUpdateReleaseMutation, _ as usePreflightReleaseMutation, a as InputGroupText, b as useReleaseQuery, c as useBundleEventAnalyticsQuery, d as useConfigQuery, f as useCreateChannelMutation, i as InputGroupInput, l as useBundleQuery, m as useDeleteReleaseMutation, n as InputGroupAddon, o as useBundleChildCountsQuery, p as useDeleteChannelMutation, s as useBundleChildrenQuery, t as InputGroup, u as useChannelsQuery, v as usePromoteReleaseMutation, x as useReleasesQuery, y as useReleaseCatalogDiagnosticsQuery } from "./api-BTSv1tZb.mjs";
10
- import { a as Card, i as AlertTitle, l as CardHeader, o as CardContent, r as AlertDescription, s as CardDescription, t as Alert, u as CardTitle } from "./alert-Dim3MGY5.mjs";
11
- import { n as BundleActivityChart, t as AnalyticsErrorAlert } from "./BundleActivityChart-BiB9ZORH.mjs";
12
- import { C as normalizeCohortValue, S as isValidCohort, f as getNumericCohortRolloutPosition, g as getPatchFileHash, h as getPatchBaseFileHash, m as getPatchBaseBundleId, r as NUMERIC_COHORT_SIZE, t as INVALID_COHORT_ERROR_MESSAGE, w as normalizeRolloutCohortCount } from "./dist-BVSLTpoP.mjs";
13
- import { _ as DialogTrigger, a as AlertDialogDescription, d as Dialog$1, f as DialogContent, g as DialogTitle$1, h as DialogHeader, i as AlertDialogContent, l as AlertDialogTitle, m as DialogFooter, n as AlertDialogAction, o as AlertDialogFooter, p as DialogDescription$1, r as AlertDialogCancel, s as AlertDialogHeader, t as AlertDialog$1 } from "./dialog-CQuRMNZ4.mjs";
14
- import { t as Badge } from "./badge-DCxbEeof.mjs";
15
- import { a as TableHeader, i as TableHead, n as TableBody, o as TableRow, r as TableCell, t as Table } from "./table-v1yCvYo7.mjs";
1
+ import { r as __toESM } from "../_runtime.mjs";
2
+ import { c as createServerFn } from "./createServerFn-B2hcXoPM.mjs";
3
+ import { A as DialogDescription, D as DialogTitle, J as require_react, M as DialogBackdrop, O as DialogPortal, _ as SelectPortal, a as SliderTrack, b as SelectTrigger$1, c as SelectGroup$1, d as SelectItemText, f as SelectItemIndicator, g as SelectPositioner, h as SelectPopup, i as SliderThumb, j as DialogClose, k as DialogPopup, l as SelectScrollUpArrow, m as SelectList, n as SwitchRoot, o as SliderControl, p as SelectItem$1, q as require_jsx_runtime, r as SliderIndicator, s as SliderRoot, t as SwitchThumb, u as SelectScrollDownArrow, v as SelectIcon, w as DialogRoot, x as SelectRoot, y as SelectValue$1 } from "../_libs/@base-ui/react+[...].mjs";
4
+ import { A as ChevronUp, C as Funnel, E as Download, L as ArrowRight, M as ChevronLeft, N as ChevronDown, O as CircleOff, P as Check, T as ExternalLink, a as Tag, b as List, f as Plus, i as Tags, j as ChevronRight, m as Package, n as TriangleAlert, r as Trash2, t as X, u as RotateCcw, v as Minus, w as FingerprintPattern, y as LoaderCircle } from "../_libs/lucide-react.mjs";
5
+ import { C as cn, S as buttonVariants, T as useIsMobile, _ as Skeleton, g as SidebarTrigger, n as Input, r as Separator$1, t as Button$1, w as createSsrRpc } from "./createSsrRpc-DjWNJ0uc.mjs";
6
+ import { m as Link } from "../_libs/@tanstack/react-router+[...].mjs";
7
+ import { i as useQueryClient, n as useQuery, t as useMutation } from "../_libs/tanstack__react-query.mjs";
8
+ 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 "./card-BRiPmi0C.mjs";
9
+ import { _ as DialogTrigger, a as AlertDialogDescription, d as Dialog$1, f as DialogContent, g as DialogTitle$1, h as DialogHeader, i as AlertDialogContent, l as AlertDialogTitle, m as DialogFooter, n as AlertDialogAction, o as AlertDialogFooter, p as DialogDescription$1, r as AlertDialogCancel, s as AlertDialogHeader, t as AlertDialog$1 } from "./dialog-DS-nw-pA.mjs";
10
+ import { a as FieldLabel, c as TableBody, d as TableHeader, f as TableRow, i as FieldGroup, l as TableCell, n as FieldDescription, o as Label, r as FieldError, s as Table, t as Field, u as TableHead } from "./table-CnZmon_Z.mjs";
16
11
  import { n as toast } from "../_libs/sonner.mjs";
17
- import { r as extractTimestampFromUUIDv7, t as createUUIDv7 } from "./uuidv7-BbJ-9D_I.mjs";
18
- import { t as BundleIdDisplay } from "./BundleIdDisplay-Czk6iR6p.mjs";
19
- import { n as updateReleaseFilters, t as Route } from "./routes-Z7TwC6nC.mjs";
12
+ import { C as normalizeCohortValue, S as isValidCohort, f as getNumericCohortRolloutPosition, g as getPatchFileHash, h as getPatchBaseFileHash, m as getPatchBaseBundleId, r as NUMERIC_COHORT_SIZE, t as INVALID_COHORT_ERROR_MESSAGE, w as normalizeRolloutCohortCount } from "./dist-CyzPaI5v.mjs";
13
+ import { r as extractTimestampFromUUIDv7, t as createUUIDv7 } from "./uuidv7-D0QFkPL_.mjs";
14
+ import { t as HashValueDisplay } from "./HashValueDisplay-DwpGLfrl.mjs";
15
+ import { a as InputGroupText, i as InputGroupInput, n as InputGroupAddon, o as Textarea, t as InputGroup } from "./input-group-BpsnmvZw.mjs";
16
+ import { n as updateReleaseFilters, t as Route } from "./routes-CKrrS2q2.mjs";
20
17
  import { n as require_dayjs_min, t as require_relativeTime } from "../_libs/dayjs.mjs";
21
18
  import { t as normalizeRange } from "../_libs/verkit.mjs";
22
- //#region node_modules/.nitro/vite/services/ssr/assets/routes-BM4ht9jb.js
19
+ //#region node_modules/.nitro/vite/services/ssr/assets/routes-D7Yh_jfj.js
23
20
  var import_react = /* @__PURE__ */ __toESM(require_react());
24
21
  var import_jsx_runtime = require_jsx_runtime();
25
22
  var import_dayjs_min = /* @__PURE__ */ __toESM(require_dayjs_min());
26
23
  var import_relativeTime = /* @__PURE__ */ __toESM(require_relativeTime());
24
+ function BundleIdDisplay({ bundleId, className }) {
25
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
26
+ translate: "no",
27
+ className: cn("break-all font-mono text-xs tabular-nums", className),
28
+ children: bundleId
29
+ });
30
+ }
27
31
  var channelColors = {
28
32
  production: "bg-green-500/10 text-green-700 dark:text-green-400 border-green-500/20",
29
33
  dev: "bg-blue-500/10 text-blue-700 dark:text-blue-400 border-blue-500/20",
@@ -72,179 +76,355 @@ function BundleChildrenPanel({ panelId, bundle, bundles, loading, onDetailClick
72
76
  id: panelId,
73
77
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
74
78
  className: "flex flex-col gap-4",
75
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
76
- className: "flex flex-wrap items-center justify-between gap-3",
77
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
78
- className: "flex min-w-0 items-start gap-2 text-sm sm:items-center",
79
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
80
- className: "text-muted-foreground",
81
- children: "Base bundle"
82
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(BundleIdDisplay, {
83
- bundleId: bundle.id,
84
- fullOnMobile: true,
85
- maxLength: 18
79
+ children: [
80
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h3", {
81
+ className: "text-sm font-medium",
82
+ children: "Advanced artifact diagnostics"
83
+ }),
84
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
85
+ className: "flex flex-wrap items-center justify-between gap-3",
86
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
87
+ className: "flex min-w-0 items-start gap-2 text-sm sm:items-center",
88
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
89
+ className: "text-muted-foreground",
90
+ children: "Base artifact ID"
91
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(BundleIdDisplay, {
92
+ bundleId: bundle.id,
93
+ fullOnMobile: true,
94
+ maxLength: 18
95
+ })]
96
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Badge, {
97
+ variant: "outline",
98
+ children: [
99
+ bundles.length,
100
+ " ",
101
+ bundles.length === 1 ? "patch" : "patches"
102
+ ]
86
103
  })]
87
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Badge, {
88
- variant: "outline",
89
- children: [
90
- bundles.length,
91
- " ",
92
- bundles.length === 1 ? "patch" : "patches"
93
- ]
94
- })]
95
- }), loading ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
96
- className: "flex flex-col gap-2",
97
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Skeleton, { className: "h-10 w-full" }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Skeleton, { className: "h-10 w-full" })]
98
- }) : bundles.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
99
- className: "flex flex-col gap-2",
100
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
101
- className: "text-xs font-semibold uppercase text-muted-foreground/70",
102
- children: "Patch bundles from this base"
103
- }), isMobile ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
104
+ }),
105
+ loading ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
104
106
  className: "flex flex-col gap-2",
105
- children: bundles.map((childBundle) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
106
- className: "rounded-md border bg-background p-3",
107
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
108
- className: "flex flex-col gap-3",
109
- children: [
110
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
111
- className: "space-y-1",
112
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
113
- className: "text-[11px] font-medium uppercase text-muted-foreground/70",
114
- children: "Patch Bundle"
115
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(BundleIdDisplay, {
116
- bundleId: childBundle.id,
117
- fullOnMobile: true,
118
- maxLength: 18
119
- })]
120
- }),
121
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
122
- className: "space-y-1",
123
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
124
- className: "text-[11px] font-medium uppercase text-muted-foreground/70",
125
- children: "Relation"
126
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
127
- className: "flex flex-col items-start gap-1 text-sm",
128
- children: [
129
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(BundleIdDisplay, {
130
- bundleId: bundle.id,
131
- fullOnMobile: true,
132
- maxLength: 12
133
- }),
134
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ArrowRight, { className: "size-4 rotate-90 text-muted-foreground" }),
135
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(BundleIdDisplay, {
136
- bundleId: childBundle.id,
137
- fullOnMobile: true,
138
- maxLength: 12
139
- })
140
- ]
141
- })]
142
- }),
143
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
144
- className: "flex items-center justify-between gap-3",
145
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
107
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Skeleton, { className: "h-10 w-full" }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Skeleton, { className: "h-10 w-full" })]
108
+ }) : bundles.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
109
+ className: "flex flex-col gap-2",
110
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
111
+ className: "text-xs font-semibold uppercase text-muted-foreground/70",
112
+ children: "Patch artifacts from this base"
113
+ }), isMobile ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
114
+ className: "flex flex-col gap-2",
115
+ children: bundles.map((childBundle) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
116
+ className: "rounded-md border bg-background p-3",
117
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
118
+ className: "flex flex-col gap-3",
119
+ children: [
120
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
146
121
  className: "space-y-1",
147
122
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
148
123
  className: "text-[11px] font-medium uppercase text-muted-foreground/70",
149
- children: "Artifact"
150
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Badge, {
151
- variant: "secondary",
152
- children: "bsdiff"
124
+ children: "Target artifact ID"
125
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(BundleIdDisplay, {
126
+ bundleId: childBundle.id,
127
+ fullOnMobile: true,
128
+ maxLength: 18
153
129
  })]
154
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
155
- className: "space-y-1 text-right",
130
+ }),
131
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
132
+ className: "space-y-1",
156
133
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
157
134
  className: "text-[11px] font-medium uppercase text-muted-foreground/70",
158
- children: "Created"
159
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
160
- className: "text-xs tabular-nums text-foreground",
161
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TimestampDisplay, { uuid: childBundle.id })
135
+ children: "Relation"
136
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
137
+ className: "flex flex-col items-start gap-1 text-sm",
138
+ children: [
139
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(BundleIdDisplay, {
140
+ bundleId: bundle.id,
141
+ fullOnMobile: true,
142
+ maxLength: 12
143
+ }),
144
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ArrowRight, { className: "size-4 rotate-90 text-muted-foreground" }),
145
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(BundleIdDisplay, {
146
+ bundleId: childBundle.id,
147
+ fullOnMobile: true,
148
+ maxLength: 12
149
+ })
150
+ ]
162
151
  })]
163
- })]
164
- }),
165
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Button$1, {
166
- className: "w-full",
167
- onClick: () => onDetailClick(childBundle),
168
- size: "sm",
169
- type: "button",
170
- variant: "outline",
171
- children: "Detail"
172
- })
173
- ]
174
- })
175
- }, childBundle.id))
176
- }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
177
- className: "overflow-x-auto rounded-md border bg-background",
178
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Table, {
179
- className: "min-w-max",
180
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableHeader, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(TableRow, {
181
- className: "hover:bg-transparent",
182
- children: [
183
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableHead, { children: "Patch Bundle" }),
184
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableHead, { children: "Relation" }),
185
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableHead, { children: "Artifact" }),
186
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableHead, { children: "Created" }),
187
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableHead, {
188
- className: "w-24 text-right",
189
- children: "Detail"
190
- })
191
- ]
192
- }) }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableBody, { children: bundles.map((childBundle) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(TableRow, { children: [
193
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableCell, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(BundleIdDisplay, {
194
- bundleId: childBundle.id,
195
- fullOnMobile: true,
196
- maxLength: 18
197
- }) }),
198
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableCell, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
199
- className: "flex min-w-[280px] flex-col items-start gap-1 sm:flex-row sm:items-center sm:gap-2",
200
- children: [
201
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(BundleIdDisplay, {
202
- bundleId: bundle.id,
203
- fullOnMobile: true,
204
- maxLength: 12
205
152
  }),
206
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ArrowRight, { className: "size-4 shrink-0 rotate-90 text-muted-foreground sm:rotate-0" }),
207
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(BundleIdDisplay, {
208
- bundleId: childBundle.id,
209
- fullOnMobile: true,
210
- maxLength: 12
153
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
154
+ className: "flex items-center justify-between gap-3",
155
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
156
+ className: "space-y-1",
157
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
158
+ className: "text-[11px] font-medium uppercase text-muted-foreground/70",
159
+ children: "Artifact"
160
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Badge, {
161
+ variant: "secondary",
162
+ children: "bsdiff"
163
+ })]
164
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
165
+ className: "space-y-1 text-right",
166
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
167
+ className: "text-[11px] font-medium uppercase text-muted-foreground/70",
168
+ children: "Created"
169
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
170
+ className: "text-xs tabular-nums text-foreground",
171
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TimestampDisplay, { uuid: childBundle.id })
172
+ })]
173
+ })]
174
+ }),
175
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Button$1, {
176
+ className: "w-full",
177
+ onClick: () => onDetailClick(childBundle),
178
+ size: "sm",
179
+ type: "button",
180
+ variant: "outline",
181
+ children: "Detail"
211
182
  })
212
183
  ]
213
- }) }),
214
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableCell, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Badge, {
215
- variant: "secondary",
216
- children: "bsdiff"
217
- }) }),
218
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableCell, {
219
- className: "tabular-nums",
220
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TimestampDisplay, { uuid: childBundle.id })
221
- }),
222
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableCell, {
223
- className: "text-right",
224
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Button$1, {
225
- onClick: () => onDetailClick(childBundle),
226
- size: "sm",
227
- type: "button",
228
- variant: "outline",
229
- children: "Detail"
230
- })
231
184
  })
232
- ] }, childBundle.id)) })]
233
- })
234
- })]
235
- }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
236
- className: "flex flex-col gap-2",
237
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
238
- className: "text-xs font-semibold uppercase text-muted-foreground/70",
239
- children: "Patch bundles from this base"
240
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
241
- className: "rounded-md border bg-background p-3 text-sm text-muted-foreground",
242
- children: "No direct patch bundles."
243
- })]
244
- })]
185
+ }, childBundle.id))
186
+ }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
187
+ className: "overflow-x-auto rounded-md border bg-background",
188
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Table, {
189
+ className: "min-w-max",
190
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableHeader, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(TableRow, {
191
+ className: "hover:bg-transparent",
192
+ children: [
193
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableHead, { children: "Target artifact ID" }),
194
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableHead, { children: "Relation" }),
195
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableHead, { children: "Artifact" }),
196
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableHead, { children: "Created" }),
197
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableHead, {
198
+ className: "w-24 text-right",
199
+ children: "Detail"
200
+ })
201
+ ]
202
+ }) }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableBody, { children: bundles.map((childBundle) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(TableRow, { children: [
203
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableCell, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(BundleIdDisplay, {
204
+ bundleId: childBundle.id,
205
+ fullOnMobile: true,
206
+ maxLength: 18
207
+ }) }),
208
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableCell, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
209
+ className: "flex min-w-[280px] flex-col items-start gap-1 sm:flex-row sm:items-center sm:gap-2",
210
+ children: [
211
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(BundleIdDisplay, {
212
+ bundleId: bundle.id,
213
+ fullOnMobile: true,
214
+ maxLength: 12
215
+ }),
216
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ArrowRight, { className: "size-4 shrink-0 rotate-90 text-muted-foreground sm:rotate-0" }),
217
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(BundleIdDisplay, {
218
+ bundleId: childBundle.id,
219
+ fullOnMobile: true,
220
+ maxLength: 12
221
+ })
222
+ ]
223
+ }) }),
224
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableCell, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Badge, {
225
+ variant: "secondary",
226
+ children: "bsdiff"
227
+ }) }),
228
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableCell, {
229
+ className: "tabular-nums",
230
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TimestampDisplay, { uuid: childBundle.id })
231
+ }),
232
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableCell, {
233
+ className: "text-right",
234
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Button$1, {
235
+ onClick: () => onDetailClick(childBundle),
236
+ size: "sm",
237
+ type: "button",
238
+ variant: "outline",
239
+ children: "Detail"
240
+ })
241
+ })
242
+ ] }, childBundle.id)) })]
243
+ })
244
+ })]
245
+ }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
246
+ className: "flex flex-col gap-2",
247
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
248
+ className: "text-xs font-semibold uppercase text-muted-foreground/70",
249
+ children: "Patch artifacts from this base"
250
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
251
+ className: "rounded-md border bg-background p-3 text-sm text-muted-foreground",
252
+ children: "No direct patch artifacts."
253
+ })]
254
+ })
255
+ ]
245
256
  })
246
257
  });
247
258
  }
259
+ var getReleases = createServerFn({ method: "GET" }).inputValidator((input) => input).handler(createSsrRpc("206547cb1526f961070a989818ca7b9e34f6b2b0e4ab851698c3807fe9fb5e0c"));
260
+ var getRelease = createServerFn({ method: "GET" }).inputValidator((input) => input).handler(createSsrRpc("a6f23116eeaf76166d405e28a95213123025613c6603030894e519015bf48032"));
261
+ var updateRelease = createServerFn({ method: "POST" }).inputValidator((input) => input).handler(createSsrRpc("7ea0186f19f9f2bc2ca4b26e3c59636891cf046957f84287b6783f8d88bd8cb7"));
262
+ var preflightRelease = createServerFn({ method: "POST" }).inputValidator((input) => input).handler(createSsrRpc("b46c95dba95a6a3e8fa5c9d100e3622fa5ae7af4f38e10fb1ed2fa48289a3a8f"));
263
+ var deleteRelease = createServerFn({ method: "POST" }).inputValidator((input) => input).handler(createSsrRpc("d5b58722ce514e3b63a377f736b4823c2011782495442ae4870ed547e392c70b"));
264
+ var promoteRelease = createServerFn({ method: "POST" }).inputValidator((input) => input).handler(createSsrRpc("956539a300d79a7efa191c1cc2d529d62fc4bfd940442548fdbc1404e0d53078"));
265
+ var getReleaseCatalogDiagnostics = createServerFn({ method: "GET" }).inputValidator((input) => input).handler(createSsrRpc("e8c24b7247936f045a145ffd5c177fd0e3df3b52769d67dfbd8d1de491d66396"));
266
+ var getConfig = createServerFn().handler(createSsrRpc("51a34c05479a893c7d320bd4cd1604427289d667698c48b9f30a01aabf8a5e68"));
267
+ var getChannels = createServerFn().handler(createSsrRpc("79ada05964de8f2123bfcd62b10097d59bf8fd689ef5c7161031e5871d8396c5"));
268
+ var createChannel = createServerFn({ method: "POST" }).inputValidator((input) => input).handler(createSsrRpc("2b9b8d1f49f79a511589617d8d4bfc6094a3acf5264f33651b9569ba66d3f321"));
269
+ var deleteChannel = createServerFn({ method: "POST" }).inputValidator((input) => input).handler(createSsrRpc("52756dde414919a906bfe83d1ab6d29910c63bcafdb47653d6f1df562d958920"));
270
+ createServerFn().handler(createSsrRpc("f8bdca3d0579adb812d6404f55d9261a89cdb025e920b1fcad82883646a5fe9e"));
271
+ createServerFn({ method: "GET" }).inputValidator((input) => input).handler(createSsrRpc("00ccacb4a0212c83ec29f4d11719046ad91ea8291cfc557d514dbf00d3bd7f5f"));
272
+ var getBundle = createServerFn({ method: "GET" }).inputValidator((input) => input).handler(createSsrRpc("1bd85c2a50e24785cb6abb023a247a9f048f37ddfa85cbb1c57e579563bad013"));
273
+ var getBundleChildren = createServerFn({ method: "GET" }).inputValidator((input) => input).handler(createSsrRpc("4370f1bf70b91f1168d85379d3008449a1bedb915e9878ca4ef89d5f3a80fa7f"));
274
+ var getBundleChildCounts = createServerFn({ method: "GET" }).inputValidator((input) => input).handler(createSsrRpc("4ca367070b00f58179a572f0bb8196a4ccdd3881e9b1dbfe33deee0cb6e1f549"));
275
+ createServerFn({ method: "POST" }).inputValidator((input) => input).handler(createSsrRpc("16cc7c2f080ea5b73e0c6bba815b110dbd7727796036d248ba0d8ae819ddef08"));
276
+ createServerFn({ method: "POST" }).inputValidator((input) => input).handler(createSsrRpc("3a27ff5679228b86a346b3fe42142e7a5bf0264f73173c0dbe5f07fb37c43cf7"));
277
+ createServerFn({ method: "POST" }).inputValidator((input) => input).handler(createSsrRpc("61de3b69779c5ce2a5f5d3c27e2cfaca8fba8f14c8803559b9cd733c456494fa"));
278
+ var bundleListQueryKey = ["bundles"];
279
+ var releaseListQueryKey = ["releases"];
280
+ var queryKeys = {
281
+ config: ["config"],
282
+ channels: ["channels"],
283
+ configLoaded: ["config-loaded"],
284
+ bundles: {
285
+ all: bundleListQueryKey,
286
+ list: (filters) => [...bundleListQueryKey, filters ?? {}]
287
+ },
288
+ releases: {
289
+ all: releaseListQueryKey,
290
+ list: (filters) => [...releaseListQueryKey, filters ?? {}]
291
+ },
292
+ release: (releaseId) => ["release", releaseId],
293
+ releaseCatalog: (scopeKey) => ["release-catalog", scopeKey],
294
+ bundleChildren: {
295
+ all: ["bundle-children"],
296
+ list: (baseBundleId) => ["bundle-children", baseBundleId],
297
+ counts: (bundleIds) => [
298
+ "bundle-children",
299
+ "counts",
300
+ ...bundleIds
301
+ ]
302
+ },
303
+ bundle: (bundleId) => ["bundle", bundleId]
304
+ };
305
+ function useConfigQuery() {
306
+ return useQuery({
307
+ queryKey: queryKeys.config,
308
+ queryFn: () => getConfig(),
309
+ staleTime: Infinity
310
+ });
311
+ }
312
+ function useChannelsQuery() {
313
+ return useQuery({
314
+ queryKey: queryKeys.channels,
315
+ queryFn: () => getChannels(),
316
+ staleTime: Infinity
317
+ });
318
+ }
319
+ function useReleasesQuery(filters) {
320
+ return useQuery({
321
+ queryKey: queryKeys.releases.list(filters),
322
+ queryFn: () => getReleases({ data: filters }),
323
+ placeholderData: (previousData) => previousData
324
+ });
325
+ }
326
+ function useReleaseQuery(releaseId) {
327
+ return useQuery({
328
+ enabled: releaseId.length > 0,
329
+ queryFn: () => getRelease({ data: { releaseId } }),
330
+ queryKey: queryKeys.release(releaseId)
331
+ });
332
+ }
333
+ function useReleaseCatalogDiagnosticsQuery(scopeKey) {
334
+ return useQuery({
335
+ enabled: scopeKey.length > 0,
336
+ queryFn: () => getReleaseCatalogDiagnostics({ data: { scopeKey } }),
337
+ queryKey: queryKeys.releaseCatalog(scopeKey)
338
+ });
339
+ }
340
+ function useBundleQuery(bundleId) {
341
+ return useQuery({
342
+ queryKey: queryKeys.bundle(bundleId),
343
+ queryFn: () => getBundle({ data: { bundleId } }),
344
+ staleTime: Infinity,
345
+ enabled: !!bundleId
346
+ });
347
+ }
348
+ function useBundleChildrenQuery(baseBundleId) {
349
+ return useQuery({
350
+ queryKey: queryKeys.bundleChildren.list(baseBundleId),
351
+ queryFn: () => getBundleChildren({ data: { baseBundleId } }),
352
+ staleTime: Infinity,
353
+ enabled: !!baseBundleId
354
+ });
355
+ }
356
+ function useBundleChildCountsQuery(bundleIds) {
357
+ const normalizedBundleIds = [...bundleIds].sort((left, right) => left.localeCompare(right));
358
+ return useQuery({
359
+ queryKey: queryKeys.bundleChildren.counts(normalizedBundleIds),
360
+ queryFn: () => getBundleChildCounts({ data: { bundleIds: normalizedBundleIds } }),
361
+ staleTime: Infinity,
362
+ enabled: normalizedBundleIds.length > 0
363
+ });
364
+ }
365
+ function useCreateChannelMutation() {
366
+ const queryClient = useQueryClient();
367
+ return useMutation({
368
+ mutationFn: (input) => createChannel({ data: input }).then((response) => response.data),
369
+ onSuccess: async () => {
370
+ await queryClient.invalidateQueries({ queryKey: queryKeys.channels });
371
+ }
372
+ });
373
+ }
374
+ function useDeleteChannelMutation() {
375
+ const queryClient = useQueryClient();
376
+ return useMutation({
377
+ mutationFn: (input) => deleteChannel({ data: input }).then((response) => response.data),
378
+ onSettled: async () => {
379
+ await queryClient.invalidateQueries({ queryKey: queryKeys.channels });
380
+ }
381
+ });
382
+ }
383
+ function useUpdateReleaseMutation() {
384
+ const queryClient = useQueryClient();
385
+ return useMutation({
386
+ mutationFn: (input) => updateRelease({ data: input }),
387
+ onSuccess: async (_, input) => {
388
+ await Promise.all([
389
+ queryClient.invalidateQueries({ queryKey: queryKeys.releases.all }),
390
+ queryClient.invalidateQueries({ queryKey: queryKeys.release(input.releaseId) }),
391
+ queryClient.invalidateQueries({ queryKey: ["release-catalog"] }),
392
+ queryClient.invalidateQueries({ queryKey: queryKeys.channels })
393
+ ]);
394
+ }
395
+ });
396
+ }
397
+ function usePreflightReleaseMutation() {
398
+ return useMutation({ mutationFn: (input) => preflightRelease({ data: input }) });
399
+ }
400
+ function useDeleteReleaseMutation() {
401
+ const queryClient = useQueryClient();
402
+ return useMutation({
403
+ mutationFn: (input) => deleteRelease({ data: input }),
404
+ onSuccess: async (_, input) => {
405
+ queryClient.removeQueries({ queryKey: queryKeys.release(input.releaseId) });
406
+ await Promise.all([
407
+ queryClient.invalidateQueries({ queryKey: queryKeys.releases.all }),
408
+ queryClient.invalidateQueries({ queryKey: ["release-catalog"] }),
409
+ queryClient.invalidateQueries({ queryKey: queryKeys.channels })
410
+ ]);
411
+ }
412
+ });
413
+ }
414
+ function usePromoteReleaseMutation() {
415
+ const queryClient = useQueryClient();
416
+ return useMutation({
417
+ mutationFn: (input) => promoteRelease({ data: input }),
418
+ onSuccess: async () => {
419
+ await Promise.all([
420
+ queryClient.invalidateQueries({ queryKey: queryKeys.releases.all }),
421
+ queryClient.invalidateQueries({ queryKey: ["release"] }),
422
+ queryClient.invalidateQueries({ queryKey: ["release-catalog"] }),
423
+ queryClient.invalidateQueries({ queryKey: queryKeys.channels })
424
+ ]);
425
+ }
426
+ });
427
+ }
248
428
  function ChannelManagementDialog({ open, onOpenChange }) {
249
429
  const [channelName, setChannelName] = (0, import_react.useState)("");
250
430
  const [channelToDelete, setChannelToDelete] = (0, import_react.useState)(null);
@@ -293,7 +473,7 @@ function ChannelManagementDialog({ open, onOpenChange }) {
293
473
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(DialogHeader, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(DialogTitle$1, {
294
474
  className: "flex items-center gap-2",
295
475
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Tag, { className: "size-4 text-muted-foreground" }), "Channels"]
296
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DialogDescription$1, { children: "Create deployment channels and remove them when no Release uses them. Empty channels remain available until you delete them." })] }),
476
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(DialogDescription$1, { children: "Create deployment channels and remove them when no bundle uses them. Empty channels remain available until you delete them." })] }),
297
477
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("form", {
298
478
  onSubmit: handleCreate,
299
479
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(FieldGroup, {
@@ -386,120 +566,6 @@ function ChannelManagementDialog({ open, onOpenChange }) {
386
566
  })] })] })
387
567
  })] });
388
568
  }
389
- function Metric({ label, tone, value }) {
390
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
391
- className: "flex flex-col gap-1",
392
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("dt", {
393
- className: "flex items-center gap-2 text-xs text-muted-foreground",
394
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
395
- "aria-hidden": "true",
396
- className: tone === "applied" ? "size-2 rounded-full bg-chart-2" : "size-2 rounded-full bg-muted-foreground"
397
- }), label]
398
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("dd", {
399
- className: "text-xl font-semibold tracking-tight tabular-nums",
400
- children: value
401
- })]
402
- });
403
- }
404
- function SupportedBundleAnalyticsSummary({ bundleId }) {
405
- const { data, error, isLoading } = useBundleEventAnalyticsQuery({
406
- bundleId,
407
- window: "30d",
408
- limit: 1,
409
- offset: 0
410
- }, true);
411
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Card, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(CardHeader, {
412
- className: "p-4 pb-3",
413
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CardTitle, {
414
- className: "text-sm font-medium",
415
- children: "Activity · 30 days"
416
- })
417
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CardContent, {
418
- className: "flex flex-col gap-3 px-4 pb-4",
419
- children: isLoading ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
420
- "aria-label": "Loading reported bundle outcomes",
421
- className: "flex flex-col gap-3",
422
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
423
- className: "grid grid-cols-2 gap-4",
424
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Skeleton, { className: "h-10 w-full" }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Skeleton, { className: "h-10 w-full" })]
425
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Skeleton, { className: "h-24 w-full sm:h-32" })]
426
- }) : error ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AnalyticsErrorAlert, {
427
- error: error instanceof Error ? error : /* @__PURE__ */ new Error("Failed to load bundle analytics."),
428
- fallbackTitle: "Analytics unavailable"
429
- }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("dl", {
430
- className: "grid grid-cols-2 divide-x divide-border/70",
431
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
432
- className: "pr-4",
433
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Metric, {
434
- label: "Applied",
435
- tone: "applied",
436
- value: data?.summary.installed ?? 0
437
- })
438
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
439
- className: "pl-4",
440
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Metric, {
441
- label: "Recovered",
442
- tone: "recovered",
443
- value: data?.summary.recovered ?? 0
444
- })
445
- })]
446
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(BundleActivityChart, {
447
- installed: data?.series.installed ?? [],
448
- recovered: data?.series.recovered ?? [],
449
- window: "30d"
450
- })] })
451
- })] });
452
- }
453
- function BundleAnalyticsSummary({ bundleId }) {
454
- if (useAnalyticsCapability().status !== "supported") return null;
455
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SupportedBundleAnalyticsSummary, { bundleId });
456
- }
457
- function HashValueDisplay({ value, maxLength = 12, className }) {
458
- const isTruncated = value.length > maxLength;
459
- const truncated = isTruncated ? value.slice(0, maxLength) : value;
460
- const copyValue = async () => {
461
- try {
462
- await navigator.clipboard.writeText(value);
463
- toast.success("Copied to clipboard", { description: value });
464
- } catch {
465
- toast.error("Failed to copy value");
466
- }
467
- };
468
- const handleClick = (event) => {
469
- event.preventDefault();
470
- event.stopPropagation();
471
- copyValue();
472
- };
473
- const handleKeyDown = (event) => {
474
- if (event.key === "Enter" || event.key === " ") {
475
- event.preventDefault();
476
- event.stopPropagation();
477
- copyValue();
478
- }
479
- };
480
- const content = /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
481
- translate: "no",
482
- className: cn("font-mono text-xs tabular-nums whitespace-nowrap", className),
483
- children: truncated
484
- });
485
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Tooltip$1, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(TooltipTrigger, {
486
- render: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
487
- type: "button",
488
- translate: "no",
489
- className: cn("ring-ring/30 bg-muted/40 border-border/70 inline-flex min-w-0 max-w-full cursor-pointer items-center rounded-md border px-1.5 py-0.5 align-top shadow-xs outline-none transition-[background-color,border-color,transform,box-shadow]", "hover:bg-muted/70 active:scale-[0.98] active:bg-muted/85 focus-visible:ring-[2px]", "touch-manipulation select-none", !isTruncated && "cursor-copy"),
490
- onClick: handleClick,
491
- onKeyDown: handleKeyDown
492
- }),
493
- children: content
494
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TooltipContent, {
495
- hidden: !isTruncated,
496
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
497
- translate: "no",
498
- className: "break-all font-mono text-xs tabular-nums",
499
- children: value
500
- })
501
- })] });
502
- }
503
569
  var normalizeGitUrl = (gitUrl) => {
504
570
  const trimmedGitUrl = gitUrl.trim();
505
571
  if (trimmedGitUrl.startsWith("git@")) {
@@ -538,12 +604,11 @@ function Row({ label, value }) {
538
604
  }
539
605
  function BundleMetadata({ bundle, release }) {
540
606
  const { data: configData, isFetched } = useConfigQuery();
541
- const patchBaseBundleId = bundle ? getPatchBaseBundleId(bundle) : null;
542
607
  const hbcPatchFileHash = bundle ? getPatchFileHash(bundle) : null;
543
608
  const hbcPatchBaseFileHash = bundle ? getPatchBaseFileHash(bundle) : null;
544
609
  const gitCommitUrl = bundle?.gitCommitHash && isFetched ? getCommitUrl(configData?.console.gitUrl, bundle.gitCommitHash) : null;
545
610
  const target = release.strategy === "APP_VERSION" ? release.target_app_version : release.fingerprint_hash;
546
- if (!(target || bundle?.gitCommitHash || bundle?.fileHash || patchBaseBundleId || hbcPatchBaseFileHash || hbcPatchFileHash)) return null;
611
+ if (!(target || bundle?.gitCommitHash || bundle?.fileHash || hbcPatchBaseFileHash || hbcPatchFileHash)) return null;
547
612
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Card, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(CardHeader, {
548
613
  className: "p-4 pb-3",
549
614
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CardTitle, {
@@ -588,14 +653,6 @@ function BundleMetadata({ bundle, release }) {
588
653
  value: bundle.fileHash
589
654
  })
590
655
  }) : null,
591
- patchBaseBundleId ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Row, {
592
- label: "Patch base",
593
- value: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(BundleIdDisplay, {
594
- bundleId: patchBaseBundleId,
595
- fullOnMobile: true,
596
- maxLength: 18
597
- })
598
- }) : null,
599
656
  hbcPatchBaseFileHash ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Row, {
600
657
  label: "Base hash",
601
658
  value: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(HashValueDisplay, {
@@ -1027,6 +1084,7 @@ function ReleaseEditorSheet({ channels, onOpenChange, open, releaseId }) {
1027
1084
  const release = releaseQuery.data;
1028
1085
  const bundleQuery = useBundleQuery(release?.bundle_id ?? "");
1029
1086
  const bundle = bundleQuery.data;
1087
+ const patchBaseBundleId = bundle ? getPatchBaseBundleId(bundle) : null;
1030
1088
  const diagnostics = useReleaseCatalogDiagnosticsQuery(release?.scope_key ?? "");
1031
1089
  const update = useUpdateReleaseMutation();
1032
1090
  const preflight = usePreflightReleaseMutation();
@@ -1093,6 +1151,7 @@ function ReleaseEditorSheet({ channels, onOpenChange, open, releaseId }) {
1093
1151
  await preflight.mutateAsync(input);
1094
1152
  await update.mutateAsync(input);
1095
1153
  toast.success("Bundle settings saved");
1154
+ onOpenChange(false);
1096
1155
  } catch (caught) {
1097
1156
  setError(caught instanceof Error ? caught.message : "Bundle settings could not be saved.");
1098
1157
  }
@@ -1149,17 +1208,17 @@ function ReleaseEditorSheet({ channels, onOpenChange, open, releaseId }) {
1149
1208
  className: "flex flex-wrap items-start gap-2",
1150
1209
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
1151
1210
  className: "font-medium text-muted-foreground",
1152
- children: "Bundle"
1153
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
1211
+ children: "ID"
1212
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
1154
1213
  className: "min-w-0 basis-full sm:basis-auto",
1155
- children: release.bundle_id ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(BundleIdDisplay, {
1156
- bundleId: release.bundle_id,
1214
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(BundleIdDisplay, {
1215
+ bundleId: release.id,
1157
1216
  fullOnMobile: true,
1158
1217
  maxLength: 18
1159
- }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
1218
+ }), !release.bundle_id ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
1160
1219
  className: "text-xs text-foreground",
1161
1220
  children: "Built-in app"
1162
- })
1221
+ }) : null]
1163
1222
  })]
1164
1223
  }),
1165
1224
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
@@ -1199,7 +1258,6 @@ function ReleaseEditorSheet({ channels, onOpenChange, open, releaseId }) {
1199
1258
  }) : null, release && draft ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
1200
1259
  className: "flex flex-col gap-6 px-4 pb-4 sm:px-6 sm:pb-6",
1201
1260
  children: [
1202
- release.bundle_id ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(BundleAnalyticsSummary, { bundleId: release.bundle_id }) : null,
1203
1261
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", {
1204
1262
  "aria-labelledby": "delivery-settings-heading",
1205
1263
  className: "flex flex-col gap-4",
@@ -1258,7 +1316,7 @@ function ReleaseEditorSheet({ channels, onOpenChange, open, releaseId }) {
1258
1316
  enabled
1259
1317
  })
1260
1318
  })]
1261
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(FieldDescription, { children: "Disabling rolls devices back to the previous enabled Release on their next check, or to the built-in app when none remains." })] }),
1319
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(FieldDescription, { children: "Disabling rolls devices back to the previous enabled bundle on their next check, or to the built-in app when none remains." })] }),
1262
1320
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Field, {
1263
1321
  orientation: "horizontal",
1264
1322
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(FieldLabel, {
@@ -1415,15 +1473,22 @@ function ReleaseEditorSheet({ channels, onOpenChange, open, releaseId }) {
1415
1473
  children: [
1416
1474
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
1417
1475
  className: "sm:col-span-2",
1418
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("dt", { children: "Release ID" }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("dd", {
1476
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("dt", { children: "Artifact ID" }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("dd", {
1419
1477
  className: "mt-1 break-all font-mono text-foreground",
1420
- children: release.id
1478
+ children: release.bundle_id ?? "Built-in app"
1421
1479
  })]
1422
1480
  }),
1423
1481
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("dt", { children: "Revision" }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("dd", {
1424
1482
  className: "mt-1 font-mono text-foreground",
1425
1483
  children: release.revision
1426
1484
  })] }),
1485
+ patchBaseBundleId ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
1486
+ className: "sm:col-span-2",
1487
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("dt", { children: "Patch base artifact ID" }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("dd", {
1488
+ className: "mt-1 break-all font-mono text-foreground",
1489
+ children: patchBaseBundleId
1490
+ })]
1491
+ }) : null,
1427
1492
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("dt", { children: "Catalog generation" }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("dd", {
1428
1493
  className: "mt-1 font-mono text-foreground",
1429
1494
  children: diagnostics.data?.generation ?? "—"
@@ -1471,7 +1536,7 @@ function ReleaseEditorSheet({ channels, onOpenChange, open, releaseId }) {
1471
1536
  "Remove this Bundle from ",
1472
1537
  channelName ?? "the channel",
1473
1538
  "?"
1474
- ] }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AlertDialogDescription, { children: "The Bundle file stays available. This only removes it from the channel." })] }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(AlertDialogFooter, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(AlertDialogCancel, { children: "Cancel" }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AlertDialogAction, {
1539
+ ] }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AlertDialogDescription, { children: "The uploaded artifact stays available. This only removes the Bundle from the channel." })] }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(AlertDialogFooter, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(AlertDialogCancel, { children: "Cancel" }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AlertDialogAction, {
1475
1540
  onClick: async () => {
1476
1541
  if (!release) return;
1477
1542
  try {
@@ -1569,7 +1634,7 @@ function ReleaseEditorSheet({ channels, onOpenChange, open, releaseId }) {
1569
1634
  targetChannel: normalizedTargetChannel
1570
1635
  });
1571
1636
  handlePromoteOpenChange(false);
1572
- toast.success(isCopyPromotion ? `Bundle copied to ${normalizedTargetChannel}` : `Bundle moved to ${normalizedTargetChannel}`, release.bundle_id ? { description: `bundleId: ${release.bundle_id}` } : void 0);
1637
+ toast.success(isCopyPromotion ? `Bundle copied to ${normalizedTargetChannel}` : `Bundle moved to ${normalizedTargetChannel}`);
1573
1638
  } catch (caught) {
1574
1639
  toast.error(caught instanceof Error ? caught.message : "Bundle could not be promoted.");
1575
1640
  }
@@ -1621,40 +1686,6 @@ var dateFormatter = new Intl.DateTimeFormat(void 0, {
1621
1686
  timeStyle: "short"
1622
1687
  });
1623
1688
  var tableDateFormatter = new Intl.DateTimeFormat(void 0, { dateStyle: "medium" });
1624
- var shortId = (id) => id.length > 18 ? `${id.slice(0, 8)}…${id.slice(-4)}` : id;
1625
- function BundleMovementSummary({ summary }) {
1626
- if (summary === null) return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
1627
- "aria-label": "30-day Bundle activity unavailable",
1628
- className: "text-sm text-muted-foreground",
1629
- title: "Analytics are unavailable for this Bundle.",
1630
- children: "—"
1631
- });
1632
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
1633
- "aria-label": "Bundle movement over 30 days, distinct installations",
1634
- className: "flex min-w-[140px] items-baseline gap-3 whitespace-nowrap",
1635
- role: "group",
1636
- title: "Distinct installations over the last 30 days.",
1637
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
1638
- className: "flex items-baseline gap-1.5",
1639
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
1640
- className: "text-xs text-muted-foreground",
1641
- children: "Applied"
1642
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
1643
- className: "text-sm font-medium tabular-nums",
1644
- children: summary.installed
1645
- })]
1646
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
1647
- className: "flex items-baseline gap-1.5",
1648
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
1649
- className: "text-xs text-muted-foreground",
1650
- children: "Recovered"
1651
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
1652
- className: "text-sm font-medium tabular-nums",
1653
- children: summary.recovered
1654
- })]
1655
- })]
1656
- });
1657
- }
1658
1689
  function BundleFilterToolbar({ channels, onChange, onClear, onManageChannels, search }) {
1659
1690
  const [targetAppVersion, setTargetAppVersion] = (0, import_react.useState)(search.targetAppVersion ?? "");
1660
1691
  const hasFilters = Boolean(search.bundleId || search.channelId || search.enabled !== void 0 || search.platform || search.targetAppVersion);
@@ -1747,17 +1778,13 @@ function BundleFilterToolbar({ channels, onChange, onClear, onManageChannels, se
1747
1778
  search.bundleId ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Badge, {
1748
1779
  className: "max-w-48 gap-1",
1749
1780
  variant: "secondary",
1750
- children: [
1751
- "Bundle ",
1752
- shortId(search.bundleId),
1753
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
1754
- "aria-label": "Clear Bundle filter",
1755
- className: "rounded-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
1756
- onClick: () => onChange({ bundleId: void 0 }),
1757
- type: "button",
1758
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(X, { className: "size-3" })
1759
- })
1760
- ]
1781
+ children: ["Artifact filter", /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
1782
+ "aria-label": "Clear artifact filter",
1783
+ className: "rounded-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
1784
+ onClick: () => onChange({ bundleId: void 0 }),
1785
+ type: "button",
1786
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(X, { className: "size-3" })
1787
+ })]
1761
1788
  }) : null,
1762
1789
  hasFilters ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Button$1, {
1763
1790
  className: "h-8 px-2 text-xs text-muted-foreground hover:text-foreground sm:ml-auto",
@@ -1770,7 +1797,6 @@ function BundleFilterToolbar({ channels, onChange, onClear, onManageChannels, se
1770
1797
  });
1771
1798
  }
1772
1799
  function BundleEntry({ expanded, onOpen, onToggleExpand, release }) {
1773
- const bundleLabel = release.bundle_id ? `bundle ${release.bundle_id}` : "the built-in app deployment";
1774
1800
  const operationLabel = release.operation === "PROMOTE" ? "Promoted" : release.operation === "ROLLBACK" ? "Rollback" : null;
1775
1801
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
1776
1802
  className: "flex min-w-[240px] items-center gap-3",
@@ -1778,7 +1804,8 @@ function BundleEntry({ expanded, onOpen, onToggleExpand, release }) {
1778
1804
  release.bundle_id ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Button$1, {
1779
1805
  "aria-controls": `bundle-lineage-panel-${release.id}`,
1780
1806
  "aria-expanded": expanded,
1781
- "aria-label": expanded ? "Hide Lineage" : "Show Lineage",
1807
+ "aria-label": expanded ? "Hide advanced artifact diagnostics" : "Show advanced artifact diagnostics",
1808
+ title: "Advanced artifact diagnostics",
1782
1809
  className: "size-8 shrink-0 touch-manipulation",
1783
1810
  onClick: onToggleExpand,
1784
1811
  size: "icon",
@@ -1789,19 +1816,19 @@ function BundleEntry({ expanded, onOpen, onToggleExpand, release }) {
1789
1816
  "aria-hidden": "true",
1790
1817
  className: "size-8 shrink-0"
1791
1818
  }),
1792
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("button", {
1793
- "aria-label": `Open details for ${bundleLabel}`,
1819
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("button", {
1820
+ "aria-label": `Open details for ID ${release.id}`,
1794
1821
  className: "min-w-0 rounded-sm text-left text-foreground transition-colors underline-offset-4 hover:text-primary hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
1795
1822
  onClick: onOpen,
1796
- title: release.bundle_id ?? release.id,
1823
+ title: release.id,
1797
1824
  type: "button",
1798
- children: release.bundle_id ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(BundleIdDisplay, {
1799
- bundleId: release.bundle_id,
1825
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(BundleIdDisplay, {
1826
+ bundleId: release.id,
1800
1827
  fullOnMobile: true
1801
- }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
1828
+ }), !release.bundle_id ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
1802
1829
  className: "inline-flex items-center gap-1.5 text-sm",
1803
1830
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(RotateCcw, { className: "size-3.5" }), " Built-in app"]
1804
- })
1831
+ }) : null]
1805
1832
  }),
1806
1833
  operationLabel ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Badge, {
1807
1834
  className: "shrink-0 font-normal",
@@ -1809,9 +1836,9 @@ function BundleEntry({ expanded, onOpen, onToggleExpand, release }) {
1809
1836
  children: operationLabel
1810
1837
  }) : null,
1811
1838
  release.currentlyUnreachable ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
1812
- "aria-label": "Currently unreachable. No catalog segment or cohort selects this release first.",
1839
+ "aria-label": "Currently unreachable. No catalog segment or cohort selects this bundle first.",
1813
1840
  className: "inline-flex shrink-0 items-center gap-1 text-xs text-muted-foreground",
1814
- title: "No catalog segment or cohort selects this release first with the current delivery settings.",
1841
+ title: "No catalog segment or cohort selects this bundle first with the current delivery settings.",
1815
1842
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(CircleOff, { className: "size-3.5" }), "Unreachable"]
1816
1843
  }) : null
1817
1844
  ]
@@ -2003,16 +2030,6 @@ function BundlesPage() {
2003
2030
  children: patchCount === void 0 ? "Checking" : patchCount > 0 ? `${patchCount} ${patchCount === 1 ? "patch" : "patches"}` : "—"
2004
2031
  })]
2005
2032
  }),
2006
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
2007
- className: "col-span-2 rounded-md bg-muted/40 p-3",
2008
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("dt", {
2009
- className: "text-muted-foreground",
2010
- children: "Activity · 30d"
2011
- }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("dd", {
2012
- className: "mt-1",
2013
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(BundleMovementSummary, { summary: release.activity30d })
2014
- })]
2015
- }),
2016
2033
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
2017
2034
  className: "col-span-2 flex flex-wrap items-center gap-2 rounded-md bg-muted/40 p-3",
2018
2035
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(ReleaseStateBadge, { release }), release.should_force_update ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Badge, {
@@ -2051,7 +2068,7 @@ function BundlesPage() {
2051
2068
  }) : null] }, release.id);
2052
2069
  }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
2053
2070
  className: "p-8 text-center text-sm text-muted-foreground",
2054
- children: search.bundleId || search.channelId || search.enabled !== void 0 || search.platform || search.targetAppVersion ? "No bundles match these filters." : "No bundles yet. Deploy a bundle to see it here."
2071
+ children: search.bundleId || search.channelId || search.enabled !== void 0 || search.platform || search.targetAppVersion ? "No bundles match these filters." : "No bundles yet. Deploy an update to see it here."
2055
2072
  })
2056
2073
  }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Table, {
2057
2074
  className: "min-w-max",
@@ -2060,7 +2077,7 @@ function BundlesPage() {
2060
2077
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(TableRow, {
2061
2078
  className: "border-b border-border/60 hover:bg-transparent [&>th]:h-10 [&>th]:text-xs [&>th]:font-semibold [&>th]:uppercase [&>th]:text-muted-foreground/70",
2062
2079
  children: [
2063
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableHead, { children: "Bundle ID" }),
2080
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableHead, { children: "ID" }),
2064
2081
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableHead, { children: "Channel" }),
2065
2082
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableHead, { children: "Platform" }),
2066
2083
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableHead, { children: "Patches" }),
@@ -2068,22 +2085,18 @@ function BundlesPage() {
2068
2085
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableHead, { children: "Enabled" }),
2069
2086
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableHead, { children: "Force update" }),
2070
2087
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableHead, { children: "Rollout" }),
2071
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableHead, {
2072
- title: "Distinct installations over the last 30 days.",
2073
- children: "Activity · 30d"
2074
- }),
2075
2088
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableHead, { children: "Message" }),
2076
2089
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableHead, { children: "Created" })
2077
2090
  ]
2078
2091
  })
2079
2092
  }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(TableBody, { children: [releasesQuery.isPending ? Array.from({ length: 7 }, (_, index) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableRow, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableCell, {
2080
- colSpan: 11,
2093
+ colSpan: 10,
2081
2094
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Skeleton, { className: "h-8 w-full" })
2082
2095
  }) }, index)) : releases.map((release) => {
2083
2096
  const isExpanded = expandedReleaseId === release.id;
2084
2097
  const panelId = `bundle-lineage-panel-${release.id}`;
2085
2098
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_react.Fragment, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(TableRow, {
2086
- "aria-label": `Open bundle ${release.bundle_id ?? release.id}`,
2099
+ "aria-label": `Open bundle ${release.id}`,
2087
2100
  className: cn("cursor-pointer transition-[background-color,filter] hover:bg-muted/10 focus-within:bg-muted/15 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring motion-reduce:transition-none data-[state=selected]:bg-muted/15 [&>td]:py-3", release.currentlyUnreachable && "bg-muted/35 saturate-50 hover:bg-muted/50 hover:saturate-100 focus-within:saturate-100", isExpanded && "bg-primary/5"),
2088
2101
  "data-state": search.releaseId === release.id ? "selected" : void 0,
2089
2102
  onClick: (event) => {
@@ -2171,7 +2184,6 @@ function BundlesPage() {
2171
2184
  })]
2172
2185
  }) }),
2173
2186
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableCell, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(RolloutPercentageBadge, { percentage: release.rollout_cohort_count / 10 }) }),
2174
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableCell, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(BundleMovementSummary, { summary: release.activity30d }) }),
2175
2187
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableCell, {
2176
2188
  className: "text-sm text-muted-foreground",
2177
2189
  title: release.message ?? void 0,
@@ -2187,7 +2199,7 @@ function BundlesPage() {
2187
2199
  className: "hover:bg-transparent",
2188
2200
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableCell, {
2189
2201
  className: "border-t-0 p-0",
2190
- colSpan: 11,
2202
+ colSpan: 10,
2191
2203
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ReleaseBundleChildrenPanel, {
2192
2204
  onDetailClick: openChildBundle,
2193
2205
  panelId,
@@ -2198,7 +2210,7 @@ function BundlesPage() {
2198
2210
  }), !releasesQuery.isPending && releases.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableRow, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableCell, {
2199
2211
  className: "h-40 text-center text-muted-foreground",
2200
2212
  colSpan: 10,
2201
- children: search.bundleId || search.channelId || search.enabled !== void 0 || search.platform || search.targetAppVersion ? "No bundles match these filters." : "No bundles yet. Deploy a bundle to see it here."
2213
+ children: search.bundleId || search.channelId || search.enabled !== void 0 || search.platform || search.targetAppVersion ? "No bundles match these filters." : "No bundles yet. Deploy an update to see it here."
2202
2214
  }) }) : null] })]
2203
2215
  })
2204
2216
  }), !releasesQuery.isError && !releasesQuery.isPending ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("nav", {