@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.
- package/.output/nitro.json +1 -1
- package/.output/public/assets/InsightsPageHeader-C-Xc2MB9.js +1 -0
- package/.output/public/assets/api-keys-C1sgC6ko.js +1 -0
- package/.output/public/assets/{api-keys-api-BHcODB7q.js → api-keys-api-LchP65vQ.js} +1 -1
- package/.output/public/assets/badge-BuMDU0Rf.js +1 -0
- package/.output/public/assets/card-BEvx_QKh.js +1 -0
- package/.output/public/assets/{chart-no-axes-combined-Dy4WJv2U.js → chart-no-axes-combined-C0G0fQ3J.js} +1 -1
- package/.output/public/assets/{composite-Bp98A0Ld.js → composite-CHTH1Xhh.js} +1 -1
- package/.output/public/assets/createServerFn-DHc2erub.js +3 -0
- package/.output/public/assets/dialog-dyZ1SphZ.js +1 -0
- package/.output/public/assets/{dist-C_NydL0e.js → dist-Bh1gaDfB.js} +1 -1
- package/.output/public/assets/field-79SVH26s.js +1 -0
- package/.output/public/assets/index-BNkxg4jz.js +10 -0
- package/.output/public/assets/input-group-BbHfaBzQ.js +1 -0
- package/.output/public/assets/insights-D_7uSKfc.js +1 -0
- package/.output/public/assets/installations-BzoHWuXw.js +1 -0
- package/.output/public/assets/{installations-CE33wgbY.js → installations-DvjbUqd1.js} +2 -2
- package/.output/public/assets/{lazyRouteComponent-Ccp3bwBY.js → lazyRouteComponent-BN0MS05o.js} +1 -1
- package/.output/public/assets/{link-CI8idAUi.js → link-BG06whwB.js} +1 -1
- package/.output/public/assets/{loader-circle-BoxLrsOu.js → loader-circle-Bbp8LGVC.js} +1 -1
- package/.output/public/assets/{refresh-cw-Bqc72UZG.js → refresh-cw-DZgiAOMk.js} +1 -1
- package/.output/public/assets/routes-BFE-oRIT.js +1 -0
- package/.output/public/assets/{routes-DGVXdzpw.js → routes-DaPMY31P.js} +2 -2
- package/.output/public/assets/{shield-check-uK3MHWJZ.js → shield-check-DoIiaaXU.js} +1 -1
- package/.output/public/assets/signing-BTRhaF5D.js +1 -0
- package/.output/public/assets/styles-C7U0oVke.css +2 -0
- package/.output/public/assets/table-BBEzJ7Xl.js +1 -0
- package/.output/public/assets/useCompositeListItem-BkPDaqyj.js +42 -0
- package/.output/server/{__23tanstack-start-server-fn-resolver-B7ioJhtE.mjs → __23tanstack-start-server-fn-resolver-Dr2ixDgQ.mjs} +40 -32
- package/.output/server/_libs/@base-ui/react+[...].mjs +1 -1
- package/.output/server/_libs/@reduxjs/toolkit+[...].mjs +1554 -0
- package/.output/server/_libs/@tanstack/react-router+[...].mjs +1 -1
- package/.output/server/_libs/@tanstack/react-router-ssr-query+[...].mjs +1 -1
- package/.output/server/_libs/d3-array.mjs +231 -0
- package/.output/server/_libs/d3-color.mjs +330 -0
- package/.output/server/_libs/d3-format.mjs +252 -0
- package/.output/server/_libs/d3-interpolate.mjs +207 -0
- package/.output/server/_libs/d3-path.mjs +77 -0
- package/.output/server/_libs/d3-scale+[...].mjs +1907 -0
- package/.output/server/_libs/d3-shape.mjs +818 -0
- package/.output/server/_libs/decimal.js-light.mjs +884 -0
- package/.output/server/_libs/es-toolkit.mjs +1159 -0
- package/.output/server/_libs/eventemitter3.mjs +236 -0
- package/.output/server/_libs/immer.mjs +532 -0
- package/.output/server/_libs/lucide-react.mjs +9 -2
- package/.output/server/_libs/next-themes.mjs +1 -1
- package/.output/server/_libs/react-redux+[...].mjs +205 -0
- package/.output/server/_libs/recharts+[...].mjs +15054 -0
- package/.output/server/_libs/sonner.mjs +1 -1
- package/.output/server/_libs/tanstack__react-query.mjs +1 -1
- package/.output/server/_runtime.mjs +10 -1
- package/.output/server/_ssr/InsightsPageHeader-C5Has8Ry.mjs +60 -0
- package/.output/server/_ssr/{api-keys-CZeTPQys.mjs → api-keys-DJml_XoK.mjs} +10 -8
- package/.output/server/_ssr/{api-keys-api-BUPQVSpk.mjs → api-keys-api-CrCZyvnl.mjs} +2 -2
- package/.output/server/_ssr/{api-keys-rpc-Cs7tS5_j.mjs → api-keys-rpc-CFaNf-q0.mjs} +3 -3
- package/.output/server/_ssr/{api-rpc-tAupfGQm.mjs → api-rpc-B61KL3Eo.mjs} +25 -25
- package/.output/server/_ssr/{auth-rpc-DUaeOWKK.mjs → auth-rpc-D_hv52-J.mjs} +4 -4
- package/.output/server/_ssr/{auth.server-DW71WzsD.mjs → auth.server-DF_shCeq.mjs} +1 -1
- package/.output/server/_ssr/badge-BgsCP9Dp.mjs +28 -0
- package/.output/server/_ssr/{bundle-signing-rpc-BhnBw0-d.mjs → bundle-signing-rpc-BBipZnFs.mjs} +2 -2
- package/.output/server/_ssr/{bundle-signing.server-C4NW5mWx.mjs → bundle-signing.server-Co_zHdJx.mjs} +1 -1
- package/.output/server/_ssr/bundleActivity-D3_fIda2.mjs +27 -0
- package/.output/server/_ssr/{card-BRiPmi0C.mjs → card-DrbxCPtG.mjs} +3 -25
- package/.output/server/_ssr/chart-qxa-_30a.mjs +162 -0
- package/.output/server/_ssr/{config.server-afDuAwaG.mjs → config.server-CBr6PDj5.mjs} +5 -5
- package/.output/server/_ssr/{createSsrRpc-DjWNJ0uc.mjs → createSsrRpc-NHF2PxuK.mjs} +4 -4
- package/.output/server/_ssr/{deleteBundle-BTGwBgzx.mjs → deleteBundle-BAq3JuGr.mjs} +1 -1
- package/.output/server/_ssr/{dialog-DS-nw-pA.mjs → dialog-DUaIgpgd.mjs} +1 -1
- package/.output/server/_ssr/{downloadBundle-CNnYxYO2.mjs → downloadBundle-B3ert-pY.mjs} +1 -1
- package/.output/server/_ssr/{table-CnZmon_Z.mjs → field-CqNUlqUq.mjs} +4 -50
- package/.output/server/_ssr/{getBundleChildren-C0vh4ZvE.mjs → getBundleChildren-COMt16m_.mjs} +1 -1
- package/.output/server/_ssr/{input-group-BpsnmvZw.mjs → input-group-Bb8ueylQ.mjs} +51 -2
- package/.output/server/_ssr/insights-B-DUbksX.mjs +502 -0
- package/.output/server/_ssr/insights-recovery-DSFM-YTL.mjs +21 -0
- package/.output/server/_ssr/insights-recovery-rpc-P71FH66n.mjs +37 -0
- package/.output/server/_ssr/{insights-rpc-38DujK0G.mjs → insights-rpc-DrIQCjpD.mjs} +2 -2
- package/.output/server/_ssr/insightsRecovery-CqcosG7B.mjs +149 -0
- package/.output/server/_ssr/{installations-CtA59MQG.mjs → installations-BQrppti7.mjs} +2 -2
- package/.output/server/_ssr/{installations-DiVKEF5T.mjs → installations-YumqpNpa.mjs} +426 -11
- package/.output/server/_ssr/{router-B9wG_9f8.mjs → router-iP95Vqi2.mjs} +14 -14
- package/.output/server/_ssr/{routes-CKrrS2q2.mjs → routes-BDabsmc7.mjs} +2 -2
- package/.output/server/_ssr/{routes-D7Yh_jfj.mjs → routes-ivsV2TDu.mjs} +224 -13
- package/.output/server/_ssr/{runtime.server-DacU1TBV.mjs → runtime.server-jmZOKIQM.mjs} +1 -1
- package/.output/server/_ssr/{server-D_C2rMzf.mjs → server-p7yrVBfD.mjs} +3 -3
- package/.output/server/_ssr/{signing-Dz1WkZOf.mjs → signing-CxCbnFCt.mjs} +5 -4
- package/.output/server/_ssr/ssr.mjs +1 -1
- package/.output/server/_ssr/table-D1mL8fJu.mjs +53 -0
- package/.output/server/_tanstack-start-manifest_v-Cwpu0C9Q.mjs +100 -0
- package/.output/server/index.mjs +154 -154
- package/package.json +3 -3
- package/src/components/features/bundles/BundleActivityChart.tsx +95 -0
- package/src/components/features/bundles/BundleInsightsSummary.tsx +121 -0
- package/src/components/features/insights/InsightsControls.tsx +1 -15
- package/src/components/features/insights/InsightsOverview.tsx +368 -179
- package/src/components/features/releases/ReleaseEditorSheet.tsx +10 -0
- package/src/components/ui/empty.tsx +101 -0
- package/src/lib/bundle-activity.ts +21 -0
- package/src/lib/insights-recovery-rpc.ts +38 -0
- package/src/lib/insights-recovery.ts +59 -0
- package/src/lib/server/bundleActivity.ts +37 -0
- package/src/lib/server/insightsHistory.ts +52 -0
- package/src/lib/server/insightsRecovery.ts +186 -0
- package/src/routes/index.tsx +33 -3
- package/src/routes/insights.tsx +1 -42
- package/.output/public/assets/HashValueDisplay-CB0Eskit.js +0 -1
- package/.output/public/assets/InsightsPageHeader-Car5LNiZ.js +0 -1
- package/.output/public/assets/api-keys-BzKocqRy.js +0 -1
- package/.output/public/assets/card-Dhr_eFYj.js +0 -1
- package/.output/public/assets/createServerFn-CA8fs7QD.js +0 -3
- package/.output/public/assets/dialog-CUTrcPlB.js +0 -1
- package/.output/public/assets/index-DdAz-CXv.js +0 -10
- package/.output/public/assets/input-group-cSOG4wh_.js +0 -1
- package/.output/public/assets/insights-C0PBSZ-n.js +0 -1
- package/.output/public/assets/installations-CStZja8x.js +0 -1
- package/.output/public/assets/routes-DTlwOr8I.js +0 -1
- package/.output/public/assets/signing-CMf4aqDO.js +0 -1
- package/.output/public/assets/styles-BCvbtKsm.css +0 -2
- package/.output/public/assets/table-2vcV89QB.js +0 -1
- package/.output/public/assets/useCompositeListItem-CHLITE_4.js +0 -1
- package/.output/public/assets/x-DCd0j8c6.js +0 -1
- package/.output/server/_ssr/HashValueDisplay-DwpGLfrl.mjs +0 -55
- package/.output/server/_ssr/InsightsPageHeader-Df4Brj8u.mjs +0 -484
- package/.output/server/_ssr/insights-BdS364Xu.mjs +0 -460
- package/.output/server/_tanstack-start-manifest_v-2MjTyxil.mjs +0 -97
- package/src/components/features/insights/InsightsBundleReports.tsx +0 -51
- /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
|
|
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"
|