@hot-updater/console 1.0.0-rc.2 → 1.0.0-rc.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 (126) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/InsightsPageHeader-C-Xc2MB9.js +1 -0
  3. package/.output/public/assets/api-keys-C1sgC6ko.js +1 -0
  4. package/.output/public/assets/{api-keys-api-BHcODB7q.js → api-keys-api-LchP65vQ.js} +1 -1
  5. package/.output/public/assets/badge-BuMDU0Rf.js +1 -0
  6. package/.output/public/assets/card-BEvx_QKh.js +1 -0
  7. package/.output/public/assets/{chart-no-axes-combined-Dy4WJv2U.js → chart-no-axes-combined-C0G0fQ3J.js} +1 -1
  8. package/.output/public/assets/{composite-Bp98A0Ld.js → composite-CHTH1Xhh.js} +1 -1
  9. package/.output/public/assets/createServerFn-DHc2erub.js +3 -0
  10. package/.output/public/assets/dialog-dyZ1SphZ.js +1 -0
  11. package/.output/public/assets/{dist-C_NydL0e.js → dist-Bh1gaDfB.js} +1 -1
  12. package/.output/public/assets/field-79SVH26s.js +1 -0
  13. package/.output/public/assets/index-BNkxg4jz.js +10 -0
  14. package/.output/public/assets/input-group-BbHfaBzQ.js +1 -0
  15. package/.output/public/assets/insights-D_7uSKfc.js +1 -0
  16. package/.output/public/assets/installations-BzoHWuXw.js +1 -0
  17. package/.output/public/assets/{installations-CE33wgbY.js → installations-DvjbUqd1.js} +2 -2
  18. package/.output/public/assets/{lazyRouteComponent-Ccp3bwBY.js → lazyRouteComponent-BN0MS05o.js} +1 -1
  19. package/.output/public/assets/{link-CI8idAUi.js → link-BG06whwB.js} +1 -1
  20. package/.output/public/assets/{loader-circle-BoxLrsOu.js → loader-circle-Bbp8LGVC.js} +1 -1
  21. package/.output/public/assets/{refresh-cw-Bqc72UZG.js → refresh-cw-DZgiAOMk.js} +1 -1
  22. package/.output/public/assets/routes-BFE-oRIT.js +1 -0
  23. package/.output/public/assets/{routes-DGVXdzpw.js → routes-DaPMY31P.js} +2 -2
  24. package/.output/public/assets/{shield-check-uK3MHWJZ.js → shield-check-DoIiaaXU.js} +1 -1
  25. package/.output/public/assets/signing-BTRhaF5D.js +1 -0
  26. package/.output/public/assets/styles-C7U0oVke.css +2 -0
  27. package/.output/public/assets/table-BBEzJ7Xl.js +1 -0
  28. package/.output/public/assets/useCompositeListItem-BkPDaqyj.js +42 -0
  29. package/.output/server/{__23tanstack-start-server-fn-resolver-B7ioJhtE.mjs → __23tanstack-start-server-fn-resolver-Dr2ixDgQ.mjs} +40 -32
  30. package/.output/server/_libs/@base-ui/react+[...].mjs +1 -1
  31. package/.output/server/_libs/@reduxjs/toolkit+[...].mjs +1554 -0
  32. package/.output/server/_libs/@tanstack/react-router+[...].mjs +1 -1
  33. package/.output/server/_libs/@tanstack/react-router-ssr-query+[...].mjs +1 -1
  34. package/.output/server/_libs/d3-array.mjs +231 -0
  35. package/.output/server/_libs/d3-color.mjs +330 -0
  36. package/.output/server/_libs/d3-format.mjs +252 -0
  37. package/.output/server/_libs/d3-interpolate.mjs +207 -0
  38. package/.output/server/_libs/d3-path.mjs +77 -0
  39. package/.output/server/_libs/d3-scale+[...].mjs +1907 -0
  40. package/.output/server/_libs/d3-shape.mjs +818 -0
  41. package/.output/server/_libs/decimal.js-light.mjs +884 -0
  42. package/.output/server/_libs/es-toolkit.mjs +1159 -0
  43. package/.output/server/_libs/eventemitter3.mjs +236 -0
  44. package/.output/server/_libs/immer.mjs +532 -0
  45. package/.output/server/_libs/lucide-react.mjs +9 -2
  46. package/.output/server/_libs/next-themes.mjs +1 -1
  47. package/.output/server/_libs/react-redux+[...].mjs +205 -0
  48. package/.output/server/_libs/recharts+[...].mjs +15054 -0
  49. package/.output/server/_libs/sonner.mjs +1 -1
  50. package/.output/server/_libs/tanstack__react-query.mjs +1 -1
  51. package/.output/server/_runtime.mjs +10 -1
  52. package/.output/server/_ssr/InsightsPageHeader-C5Has8Ry.mjs +60 -0
  53. package/.output/server/_ssr/{api-keys-CZeTPQys.mjs → api-keys-DJml_XoK.mjs} +10 -8
  54. package/.output/server/_ssr/{api-keys-api-BUPQVSpk.mjs → api-keys-api-CrCZyvnl.mjs} +2 -2
  55. package/.output/server/_ssr/{api-keys-rpc-Cs7tS5_j.mjs → api-keys-rpc-CFaNf-q0.mjs} +3 -3
  56. package/.output/server/_ssr/{api-rpc-tAupfGQm.mjs → api-rpc-B61KL3Eo.mjs} +25 -25
  57. package/.output/server/_ssr/{auth-rpc-DUaeOWKK.mjs → auth-rpc-D_hv52-J.mjs} +4 -4
  58. package/.output/server/_ssr/{auth.server-DW71WzsD.mjs → auth.server-DF_shCeq.mjs} +1 -1
  59. package/.output/server/_ssr/badge-BgsCP9Dp.mjs +28 -0
  60. package/.output/server/_ssr/{bundle-signing-rpc-BhnBw0-d.mjs → bundle-signing-rpc-BBipZnFs.mjs} +2 -2
  61. package/.output/server/_ssr/{bundle-signing.server-C4NW5mWx.mjs → bundle-signing.server-Co_zHdJx.mjs} +1 -1
  62. package/.output/server/_ssr/bundleActivity-D3_fIda2.mjs +27 -0
  63. package/.output/server/_ssr/{card-BRiPmi0C.mjs → card-DrbxCPtG.mjs} +3 -25
  64. package/.output/server/_ssr/chart-qxa-_30a.mjs +162 -0
  65. package/.output/server/_ssr/{config.server-afDuAwaG.mjs → config.server-CBr6PDj5.mjs} +5 -5
  66. package/.output/server/_ssr/{createSsrRpc-DjWNJ0uc.mjs → createSsrRpc-NHF2PxuK.mjs} +4 -4
  67. package/.output/server/_ssr/{deleteBundle-BTGwBgzx.mjs → deleteBundle-BAq3JuGr.mjs} +1 -1
  68. package/.output/server/_ssr/{dialog-DS-nw-pA.mjs → dialog-DUaIgpgd.mjs} +1 -1
  69. package/.output/server/_ssr/{downloadBundle-CNnYxYO2.mjs → downloadBundle-B3ert-pY.mjs} +1 -1
  70. package/.output/server/_ssr/{table-CnZmon_Z.mjs → field-CqNUlqUq.mjs} +4 -50
  71. package/.output/server/_ssr/{getBundleChildren-C0vh4ZvE.mjs → getBundleChildren-COMt16m_.mjs} +1 -1
  72. package/.output/server/_ssr/{input-group-BpsnmvZw.mjs → input-group-Bb8ueylQ.mjs} +51 -2
  73. package/.output/server/_ssr/insights-B-DUbksX.mjs +502 -0
  74. package/.output/server/_ssr/insights-recovery-DSFM-YTL.mjs +21 -0
  75. package/.output/server/_ssr/insights-recovery-rpc-P71FH66n.mjs +37 -0
  76. package/.output/server/_ssr/{insights-rpc-38DujK0G.mjs → insights-rpc-DrIQCjpD.mjs} +2 -2
  77. package/.output/server/_ssr/insightsRecovery-CqcosG7B.mjs +149 -0
  78. package/.output/server/_ssr/{installations-CtA59MQG.mjs → installations-BQrppti7.mjs} +2 -2
  79. package/.output/server/_ssr/{installations-DiVKEF5T.mjs → installations-YumqpNpa.mjs} +426 -11
  80. package/.output/server/_ssr/{router-B9wG_9f8.mjs → router-iP95Vqi2.mjs} +14 -14
  81. package/.output/server/_ssr/{routes-CKrrS2q2.mjs → routes-BDabsmc7.mjs} +2 -2
  82. package/.output/server/_ssr/{routes-D7Yh_jfj.mjs → routes-ivsV2TDu.mjs} +224 -13
  83. package/.output/server/_ssr/{runtime.server-DacU1TBV.mjs → runtime.server-jmZOKIQM.mjs} +1 -1
  84. package/.output/server/_ssr/{server-D_C2rMzf.mjs → server-p7yrVBfD.mjs} +3 -3
  85. package/.output/server/_ssr/{signing-Dz1WkZOf.mjs → signing-CxCbnFCt.mjs} +5 -4
  86. package/.output/server/_ssr/ssr.mjs +1 -1
  87. package/.output/server/_ssr/table-D1mL8fJu.mjs +53 -0
  88. package/.output/server/_tanstack-start-manifest_v-Cwpu0C9Q.mjs +100 -0
  89. package/.output/server/index.mjs +154 -154
  90. package/package.json +3 -3
  91. package/src/components/features/bundles/BundleActivityChart.tsx +95 -0
  92. package/src/components/features/bundles/BundleInsightsSummary.tsx +121 -0
  93. package/src/components/features/insights/InsightsControls.tsx +1 -15
  94. package/src/components/features/insights/InsightsOverview.tsx +368 -179
  95. package/src/components/features/releases/ReleaseEditorSheet.tsx +10 -0
  96. package/src/components/ui/empty.tsx +101 -0
  97. package/src/lib/bundle-activity.ts +21 -0
  98. package/src/lib/insights-recovery-rpc.ts +38 -0
  99. package/src/lib/insights-recovery.ts +59 -0
  100. package/src/lib/server/bundleActivity.ts +37 -0
  101. package/src/lib/server/insightsHistory.ts +52 -0
  102. package/src/lib/server/insightsRecovery.ts +186 -0
  103. package/src/routes/index.tsx +33 -3
  104. package/src/routes/insights.tsx +1 -42
  105. package/.output/public/assets/HashValueDisplay-CB0Eskit.js +0 -1
  106. package/.output/public/assets/InsightsPageHeader-Car5LNiZ.js +0 -1
  107. package/.output/public/assets/api-keys-BzKocqRy.js +0 -1
  108. package/.output/public/assets/card-Dhr_eFYj.js +0 -1
  109. package/.output/public/assets/createServerFn-CA8fs7QD.js +0 -3
  110. package/.output/public/assets/dialog-CUTrcPlB.js +0 -1
  111. package/.output/public/assets/index-DdAz-CXv.js +0 -10
  112. package/.output/public/assets/input-group-cSOG4wh_.js +0 -1
  113. package/.output/public/assets/insights-C0PBSZ-n.js +0 -1
  114. package/.output/public/assets/installations-CStZja8x.js +0 -1
  115. package/.output/public/assets/routes-DTlwOr8I.js +0 -1
  116. package/.output/public/assets/signing-CMf4aqDO.js +0 -1
  117. package/.output/public/assets/styles-BCvbtKsm.css +0 -2
  118. package/.output/public/assets/table-2vcV89QB.js +0 -1
  119. package/.output/public/assets/useCompositeListItem-CHLITE_4.js +0 -1
  120. package/.output/public/assets/x-DCd0j8c6.js +0 -1
  121. package/.output/server/_ssr/HashValueDisplay-DwpGLfrl.mjs +0 -55
  122. package/.output/server/_ssr/InsightsPageHeader-Df4Brj8u.mjs +0 -484
  123. package/.output/server/_ssr/insights-BdS364Xu.mjs +0 -460
  124. package/.output/server/_tanstack-start-manifest_v-2MjTyxil.mjs +0 -97
  125. package/src/components/features/insights/InsightsBundleReports.tsx +0 -51
  126. /package/.output/public/assets/{preload-helper-CQ36nxok.js → preload-helper-uTix4PVD.js} +0 -0
@@ -0,0 +1,121 @@
1
+ import { Button } from "@/components/ui/button";
2
+ import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
3
+ import { Skeleton } from "@/components/ui/skeleton";
4
+ import {
5
+ useBundleActivityQuery,
6
+ type BundleActivityInput,
7
+ } from "@/lib/bundle-activity";
8
+ import type { RecoveryReport } from "@/lib/insights-recovery";
9
+
10
+ import { BundleActivityChart } from "./BundleActivityChart";
11
+
12
+ export function BundleMovementSummary({
13
+ report,
14
+ loading = false,
15
+ }: {
16
+ readonly report?: RecoveryReport;
17
+ readonly loading?: boolean;
18
+ }) {
19
+ if (!report)
20
+ return loading ? (
21
+ <Skeleton aria-label="Loading bundle activity" className="h-4 w-32" />
22
+ ) : (
23
+ <span
24
+ aria-label="30-day bundle activity unavailable"
25
+ className="text-sm text-muted-foreground"
26
+ >
27
+ —
28
+ </span>
29
+ );
30
+ const series = report.series[0];
31
+ return (
32
+ <div
33
+ role="group"
34
+ aria-label="Bundle activity over 30 days"
35
+ title={
36
+ report.truncated
37
+ ? "Partial history. Counts include only the available reports."
38
+ : "Active: last observed ID per installation. Rollbacks: distinct installations recovered from this ID in 30 days."
39
+ }
40
+ className="flex min-w-[140px] items-baseline gap-3 whitespace-nowrap"
41
+ >
42
+ <span className="flex items-baseline gap-1.5">
43
+ <span className="text-xs text-muted-foreground">Active</span>
44
+ <span className="text-sm font-medium tabular-nums">
45
+ {series?.activeInstallations ?? 0}
46
+ </span>
47
+ </span>
48
+ <span className="flex items-baseline gap-1.5">
49
+ <span className="text-xs text-muted-foreground">Rollback</span>
50
+ <span className="text-sm font-medium tabular-nums">
51
+ {series?.recoveredInstallations ?? 0}
52
+ </span>
53
+ </span>
54
+ {report.truncated ? (
55
+ <span className="text-xs text-muted-foreground">Partial</span>
56
+ ) : null}
57
+ </div>
58
+ );
59
+ }
60
+
61
+ export function BundleInsightsSummary({
62
+ input,
63
+ }: {
64
+ readonly input: BundleActivityInput;
65
+ }) {
66
+ const query = useBundleActivityQuery([input]);
67
+ const report = query.data?.[input.releaseId];
68
+ const series = report?.series[0];
69
+ return (
70
+ <Card>
71
+ <CardHeader className="px-4 pt-4 pb-3">
72
+ <CardTitle className="text-sm font-medium">
73
+ Activity · 30 days
74
+ </CardTitle>
75
+ </CardHeader>
76
+ <CardContent className="flex flex-col gap-3 px-4 pb-4">
77
+ {query.isPending ? (
78
+ <Skeleton
79
+ aria-label="Loading bundle activity"
80
+ className="h-32 w-full"
81
+ />
82
+ ) : query.error ? (
83
+ <div className="flex items-center justify-between gap-3 text-sm text-muted-foreground">
84
+ Insights unavailable
85
+ <Button
86
+ variant="outline"
87
+ size="sm"
88
+ onClick={() => void query.refetch()}
89
+ >
90
+ Retry
91
+ </Button>
92
+ </div>
93
+ ) : (
94
+ <>
95
+ <dl className="grid grid-cols-2 divide-x divide-border/70">
96
+ <div className="pr-4">
97
+ <dt className="text-xs text-muted-foreground">Active</dt>
98
+ <dd className="mt-1 text-xl font-semibold tabular-nums">
99
+ {series?.activeInstallations ?? 0}
100
+ </dd>
101
+ </div>
102
+ <div className="pl-4">
103
+ <dt className="text-xs text-muted-foreground">
104
+ Rollback · 30d
105
+ </dt>
106
+ <dd className="mt-1 text-xl font-semibold tabular-nums">
107
+ {series?.recoveredInstallations ?? 0}
108
+ </dd>
109
+ </div>
110
+ </dl>
111
+ <BundleActivityChart series={series} />
112
+ <p className="text-xs text-muted-foreground">
113
+ Last observed active installations · daily rollbacks
114
+ {report?.truncated ? " · Partial history" : ""}
115
+ </p>
116
+ </>
117
+ )}
118
+ </CardContent>
119
+ </Card>
120
+ );
121
+ }
@@ -27,14 +27,13 @@ export function InsightsControls({
27
27
  }) {
28
28
  const [platform, setPlatform] = useState(scope.platform);
29
29
  const [channel, setChannel] = useState(scope.channel);
30
- const [bundleId, setBundleId] = useState(scope.bundleId ?? "");
31
30
 
32
31
  return (
33
32
  <section aria-label="Insights controls" className="flex flex-col gap-4">
34
33
  <form
35
34
  onSubmit={(event) => {
36
35
  event.preventDefault();
37
- onScopeChange({ platform, channel, bundleId: bundleId || undefined });
36
+ onScopeChange({ platform, channel });
38
37
  }}
39
38
  >
40
39
  <FieldGroup className="items-end sm:flex-row">
@@ -69,19 +68,6 @@ export function InsightsControls({
69
68
  maxLength={1024}
70
69
  />
71
70
  </Field>
72
- <Field>
73
- <FieldLabel htmlFor="insights-bundle">
74
- Bundle ID (optional)
75
- </FieldLabel>
76
- <Input
77
- className="h-11 lg:h-8"
78
- id="insights-bundle"
79
- placeholder="Select a bundle by ID"
80
- value={bundleId}
81
- onChange={(event) => setBundleId(event.target.value)}
82
- maxLength={1024}
83
- />
84
- </Field>
85
71
  <Button
86
72
  className="h-11 w-full sm:w-auto lg:h-8"
87
73
  type="submit"