@hot-updater/console 1.0.0-rc.4 → 1.0.0-rc.41
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/ConsoleFeatureUnavailable-DRzeMGRM.js +1 -0
- package/.output/public/assets/EventDetails-SB5ygJzS.js +1 -0
- package/.output/public/assets/HashValueDisplay-BFX_kY3-.js +1 -0
- package/.output/public/assets/InsightsInfo-btYppp0B.js +1 -0
- package/.output/public/assets/InsightsPageHeader-Ba8psD8t.js +1 -0
- package/.output/public/assets/NotFoundPage-CyRG2eca.js +1 -0
- package/.output/public/assets/alert-dialog-Bbk_4-WJ.js +1 -0
- package/.output/public/assets/api-DUgI6yOI.js +1 -0
- package/.output/public/assets/api-keys-CIO9L_wu.js +1 -0
- package/.output/public/assets/api-keys-CmkNKOhS.js +1 -0
- package/.output/public/assets/arrow-left-CnMYpqB7.js +1 -0
- package/.output/public/assets/arrow-up-right-BtffZA6e.js +1 -0
- package/.output/public/assets/chevron-right-BqD5wtFb.js +1 -0
- package/.output/public/assets/clipboard-DS9ucUQL.js +1 -0
- package/.output/public/assets/console-features-api-BMsI3Bj8.js +1 -0
- package/.output/public/assets/dialog-Bqbb7B0N.js +1 -0
- package/.output/public/assets/dist-LxKJB-Vu.js +1 -0
- package/.output/public/assets/empty-CuT2UhFp.js +1 -0
- package/.output/public/assets/field-BBDpjIqu.js +1 -0
- package/.output/public/assets/index-BEfQ2_7f.js +11 -0
- package/.output/public/assets/input-group-ja_30qaF.js +1 -0
- package/.output/public/assets/insights-B0ib9qOE.js +2 -0
- package/.output/public/assets/insights-BIMJx-0p.js +1 -0
- package/.output/public/assets/insights-CndqcWEj.js +42 -0
- package/.output/public/assets/insights-api-B6Ewc-OG.js +1 -0
- package/.output/public/assets/insights-usage-rpc-DYEhsCKT.js +1 -0
- package/.output/public/assets/insights_.distribution-B26PMy4k.js +2 -0
- package/.output/public/assets/insights_.distribution-BBDtqqYS.js +1 -0
- package/.output/public/assets/insights_.distribution-DhHmYS8k.js +1 -0
- package/.output/public/assets/installations-C3cMuwRx.js +1 -0
- package/.output/public/assets/installations-C3yrjwDh.js +2 -0
- package/.output/public/assets/installations-D3edlN75.js +1 -0
- package/.output/public/assets/key-round-wS_SIZ6b.js +1 -0
- package/.output/public/assets/list-CgrYiadM.js +1 -0
- package/.output/public/assets/refresh-cw-BYgoNCco.js +1 -0
- package/.output/public/assets/remote-config-0i-gDkeU.js +1 -0
- package/.output/public/assets/remote-config-An1ROIOQ.js +6 -0
- package/.output/public/assets/remote-config-CoeWgA9i.js +1 -0
- package/.output/public/assets/routes-DNoaJIQV.js +2 -0
- package/.output/public/assets/routes-cWBDtghZ.js +1 -0
- package/.output/public/assets/search-DaTDPW25.js +1 -0
- package/.output/public/assets/select-CZMQKT7F.js +1 -0
- package/.output/public/assets/sidebar-DNVyJPfX.js +3 -0
- package/.output/public/assets/smartphone-DpTFgtKf.js +1 -0
- package/.output/public/assets/styles-D8mxMvCB.css +2 -0
- package/.output/public/assets/switch-CU4-fupc.js +1 -0
- package/.output/public/assets/table-Gm4qRWwE.js +1 -0
- package/.output/public/assets/tabs-R1I8CRjR.js +1 -0
- package/.output/public/assets/undo-2-CmrHjwFc.js +1 -0
- package/.output/public/assets/useCompositeListItem-BaPeC9ZO.js +1 -0
- package/.output/public/assets/valueToPercent-CH8GCHaL.js +1 -0
- package/.output/server/__23tanstack-start-server-fn-resolver-DTAqlLRd.mjs +178 -0
- package/.output/server/_libs/@base-ui/react+[...].mjs +6450 -2741
- package/.output/server/_libs/@tanstack/react-router+[...].mjs +3802 -4022
- package/.output/server/_libs/@tanstack/react-router-ssr-query+[...].mjs +140 -97
- package/.output/server/_libs/lucide-react.mjs +235 -31
- package/.output/server/_libs/next-themes.mjs +1 -1
- package/.output/server/_libs/react-redux+[...].mjs +1 -1
- package/.output/server/_libs/recharts+[...].mjs +483 -901
- package/.output/server/_libs/sonner.mjs +1 -1
- package/.output/server/_libs/tanstack__history.mjs +68 -41
- package/.output/server/_libs/tanstack__query-core.mjs +2010 -309
- package/.output/server/_libs/tanstack__react-query.mjs +448 -21
- package/.output/server/_libs/verkit.mjs +102 -1
- package/.output/server/_ssr/BundleIdDisplay-BNoVW3Dv.mjs +13 -0
- package/.output/server/_ssr/ConsoleFeatureUnavailable-BPFa-cmJ.mjs +58 -0
- package/.output/server/_ssr/EventDetails-9CeshfdR.mjs +344 -0
- package/.output/server/_ssr/HashValueDisplay-DXZlkcps.mjs +55 -0
- package/.output/server/_ssr/InsightsInfo-DLNdJQ0m.mjs +75 -0
- package/.output/server/_ssr/InsightsPageHeader-DZGVDgvv.mjs +145 -0
- package/.output/server/_ssr/NotFoundPage-mYHHg-2s.mjs +37 -0
- package/.output/server/_ssr/{dialog-DUaIgpgd.mjs → alert-dialog-Chkim7vZ.mjs} +6 -83
- package/.output/server/_ssr/api-C-Il5-sa.mjs +203 -0
- package/.output/server/_ssr/api-keys-01FGqj4d.mjs +5 -0
- package/.output/server/_ssr/{api-keys-DJml_XoK.mjs → api-keys-B_f9h7ln.mjs} +48 -10
- package/.output/server/_ssr/api-keys-rpc-Cf4YCyFc.mjs +52 -0
- package/.output/server/_ssr/api-rpc-DRqwxxT_.mjs +296 -0
- package/.output/server/_ssr/{auth-BF8mbAgF.mjs → auth-UP0wXs4i.mjs} +1 -1
- package/.output/server/_ssr/{auth-rpc-D_hv52-J.mjs → auth-rpc-D8nFpU9C.mjs} +6 -6
- package/.output/server/_ssr/auth.server-COZoXu4i.mjs +5425 -0
- package/.output/server/_ssr/bundleActivity-M5gzBFNg.mjs +18 -0
- package/.output/server/_ssr/config-WVX4IxSR.mjs +15 -0
- package/.output/server/_ssr/config.server-Dm2l7w0O.mjs +36 -0
- package/.output/server/_ssr/console-access--o9FXikU.mjs +17 -0
- package/.output/server/_ssr/console-features-BftSkf3f.mjs +60 -0
- package/.output/server/_ssr/console-features-api-CYclUQ4h.mjs +43 -0
- package/.output/server/_ssr/console-features-rpc-1WaAkPM_.mjs +19 -0
- package/.output/server/_ssr/{createServerFn-B2hcXoPM.mjs → createMiddleware-Cm6Tn0_Y.mjs} +67 -56
- package/.output/server/_ssr/{createServerRpc-DB29C_5p.mjs → createServerRpc-RLR4H-Fn.mjs} +2 -2
- package/.output/server/_ssr/databaseConfig-C5SkAyUy.mjs +5 -0
- package/.output/server/_ssr/{databaseJsonValue-d6I3nAS4.mjs → databaseJsonValue-Csbuzc9Q.mjs} +28 -5
- package/.output/server/_ssr/databaseRows-BUuNU-qt.mjs +74 -0
- package/.output/server/_ssr/dialog-mfSANqjC.mjs +84 -0
- package/.output/server/_ssr/{dist-CyzPaI5v.mjs → dist-wmnTk7w6.mjs} +140 -6
- package/.output/server/_ssr/{downloadBundle-B3ert-pY.mjs → downloadBundle-DViuIa9U.mjs} +10 -10
- package/.output/server/_ssr/empty-BPayFad3.mjs +60 -0
- package/.output/server/_ssr/{empty-plugin-adapters-B5QvGpEl.mjs → empty-plugin-adapters-CPtwX8a7.mjs} +1 -1
- package/.output/server/_ssr/failureReports-DKDhVsXA.mjs +33 -0
- package/.output/server/_ssr/field-DjZ5t7rH.mjs +189 -0
- package/.output/server/_ssr/getBundleChildren-CmjDg6Re.mjs +22 -0
- package/.output/server/_ssr/{input-group-Bb8ueylQ.mjs → input-group-Dx-MEkNM.mjs} +3 -52
- package/.output/server/_ssr/insights-BopxyJjk.mjs +14 -0
- package/.output/server/_ssr/insights-Bvm03d61.mjs +5 -0
- package/.output/server/_ssr/insights-CrLAHSDy.mjs +2315 -0
- package/.output/server/_ssr/insights-api-Bg8ZV_h_.mjs +122 -0
- package/.output/server/_ssr/insights-errors-BjnFUyZj.mjs +34 -0
- package/.output/server/_ssr/insights-failures-rpc-tyy5m9Cc.mjs +36 -0
- package/.output/server/_ssr/insights-failures-xaa41Buf.mjs +46 -0
- package/.output/server/_ssr/{insights-recovery-DSFM-YTL.mjs → insights-recovery-BWQhiZaF.mjs} +9 -2
- package/.output/server/_ssr/insights-recovery-rpc-CPJOiJAV.mjs +32 -0
- package/.output/server/_ssr/{insights-rpc-DrIQCjpD.mjs → insights-rpc-DoC3hla9.mjs} +22 -14
- package/.output/server/_ssr/insights-usage-BpBM0U0c.mjs +29 -0
- package/.output/server/_ssr/insights-usage-rpc-CFuTYp3T.mjs +29 -0
- package/.output/server/_ssr/insights-usage-rpc-O2ruP4iE.mjs +41 -0
- package/.output/server/_ssr/insightsUsage-CzhVjsc8.mjs +56 -0
- package/.output/server/_ssr/insights_.distribution-B3BVPD00.mjs +16 -0
- package/.output/server/_ssr/insights_.distribution-BMoisxRG.mjs +347 -0
- package/.output/server/_ssr/insights_.distribution-BiCcFyrG.mjs +7 -0
- package/.output/server/_ssr/{installations-YumqpNpa.mjs → installations-Cx3jIrwl.mjs} +280 -364
- package/.output/server/_ssr/installations-DTGPaKXx.mjs +69 -0
- package/.output/server/_ssr/installations-osiAuNKr.mjs +5 -0
- package/.output/server/_ssr/listReleases-BfUBlCHo.mjs +79 -0
- package/.output/server/_ssr/release-adoption-005tQRpo.mjs +55 -0
- package/.output/server/_ssr/release-adoption-rpc-BVySDR0L.mjs +41 -0
- package/.output/server/_ssr/releaseAdoption-2PJPA09N.mjs +114 -0
- package/.output/server/_ssr/releaseManagement-BTCWEY8-.mjs +11 -0
- package/.output/server/_ssr/remote-config-CUoAxUMy.mjs +430 -0
- package/.output/server/_ssr/remote-config-Cc5P4J-r.mjs +17 -0
- package/.output/server/_ssr/remote-config-CjdxcZ9B.mjs +5 -0
- package/.output/server/_ssr/remote-config-D2GmbGwI.mjs +2594 -0
- package/.output/server/_ssr/remote-config-rpc-kjoZ9PRS.mjs +115 -0
- package/.output/server/_ssr/rolldown-runtime-rSIU-vHC.mjs +13 -0
- package/.output/server/_ssr/{router-iP95Vqi2.mjs → router-DwGVewL-.mjs} +141 -139
- package/.output/server/_ssr/{routes-ivsV2TDu.mjs → routes-C4yxv3JU.mjs} +192 -685
- package/.output/server/_ssr/routes-D3_aegLY.mjs +409 -0
- package/.output/server/_ssr/runtime.server-BoWf4QhU.mjs +1716 -0
- package/.output/server/_ssr/schema-DrOtkRVD.mjs +361 -0
- package/.output/server/_ssr/select-DkzM2miy.mjs +107 -0
- package/.output/server/_ssr/server-BW0gzB0p.mjs +8325 -0
- package/.output/server/_ssr/{createSsrRpc-NHF2PxuK.mjs → sidebar-DPcOijvL.mjs} +107 -47
- package/.output/server/_ssr/ssr.mjs +1 -1
- package/.output/server/_ssr/start-BfFbHKMK.mjs +4 -0
- package/.output/server/_ssr/switch-BqJ2mAwC.mjs +17 -0
- package/.output/server/_ssr/{table-D1mL8fJu.mjs → table-R7RY92q9.mjs} +2 -2
- package/.output/server/_ssr/tabs-trDcbRkT.mjs +45 -0
- package/.output/server/_ssr/updateFailures-H6pnnYK4.mjs +40 -0
- package/.output/server/_ssr/{uuidv7-D0QFkPL_.mjs → uuidv7-ctA_XVZA.mjs} +2 -2
- package/.output/server/_tanstack-start-manifest_v-BwInaUTw.mjs +139 -0
- package/.output/server/index.mjs +315 -154
- package/LICENSE +13 -14
- package/README.md +82 -72
- package/lib/index.d.mts +23 -11
- package/lib/vite-internal.mjs +13 -3
- package/lib/vite.d.mts +2 -0
- package/package.json +14 -14
- package/src/components/AppSidebar.tsx +100 -71
- package/src/components/ConsoleAccessPage.tsx +5 -1
- package/src/components/ConsoleFeatureUnavailable.tsx +80 -0
- package/src/components/NotFoundPage.tsx +7 -7
- package/src/components/features/FeatureSlots.tsx +103 -0
- package/src/components/features/api-keys/apiKeysFeatureUi.tsx +15 -0
- package/src/components/features/bundles/BundleMetadata.tsx +8 -5
- package/src/components/features/bundles/RolloutCohortsDialog.tsx +1 -1
- package/src/components/features/channels/ChannelManagementDialog.tsx +2 -5
- package/src/components/features/insights/AppUsage.tsx +366 -0
- package/src/components/features/insights/BuiltinBundle.tsx +36 -0
- package/src/components/features/insights/ComparedBundlesChart.tsx +310 -0
- package/src/components/features/insights/EstimatedCount.tsx +18 -0
- package/src/components/features/insights/EventDetails.tsx +400 -39
- package/src/components/features/insights/EventHistoryCard.tsx +112 -26
- package/src/components/features/insights/EventHistoryList.tsx +2 -2
- package/src/components/features/insights/FailureReports.tsx +407 -0
- package/src/components/features/insights/InsightsControls.tsx +265 -88
- package/src/components/features/insights/InsightsErrorAlert.tsx +14 -1
- package/src/components/features/insights/InsightsInfo.tsx +48 -0
- package/src/components/features/insights/InsightsOverview.tsx +604 -355
- package/src/components/features/insights/InsightsPageHeader.tsx +35 -20
- package/src/components/features/insights/InsightsPeriodSelector.tsx +89 -0
- package/src/components/features/insights/InstallationHistoryCard.tsx +66 -11
- package/src/components/features/insights/InstallationMatchesCard.tsx +1 -1
- package/src/components/features/insights/ReleaseActivity.tsx +308 -0
- package/src/components/features/insights/ReportingDevicesSummary.tsx +48 -0
- package/src/components/features/insights/RollbackButton.tsx +118 -0
- package/src/components/features/insights/UpdateFailures.tsx +382 -0
- package/src/components/features/insights/insightsFeatureUi.tsx +35 -0
- package/src/components/features/releases/ReleaseEditorSheet.tsx +26 -12
- package/src/components/features/remote-config/ConditionDialog.tsx +581 -0
- package/src/components/features/remote-config/ConditionsCard.tsx +244 -0
- package/src/components/features/remote-config/ParameterDialog.tsx +407 -0
- package/src/components/features/remote-config/ParametersCard.tsx +244 -0
- package/src/components/features/remote-config/PreviewCard.tsx +284 -0
- package/src/components/features/remote-config/PublishDialog.tsx +319 -0
- package/src/components/features/remote-config/RemoteConfigPage.tsx +353 -0
- package/src/components/features/remote-config/RuleSummary.tsx +21 -0
- package/src/components/features/remote-config/ValueInput.tsx +148 -0
- package/src/components/features/remote-config/VersionsCard.tsx +361 -0
- package/src/components/features/remote-config/remoteConfigFeatureUi.tsx +15 -0
- package/src/components/features/remote-config/useDateTimeText.ts +16 -0
- package/src/components/ui/card.tsx +1 -1
- package/src/components/ui/scroll-area.tsx +52 -0
- package/src/components/ui/sidebar.tsx +22 -29
- package/src/components/ui/tabs.tsx +81 -0
- package/src/index.ts +26 -19
- package/src/lib/api-keys-api.ts +0 -28
- package/src/lib/api-keys-rpc.ts +27 -38
- package/src/lib/api-rpc.ts +189 -266
- package/src/lib/api.ts +19 -102
- package/src/lib/bundle-activity.ts +24 -4
- package/src/lib/console-access.ts +20 -0
- package/src/lib/console-features-api.ts +68 -0
- package/src/lib/console-features-rpc.ts +13 -0
- package/src/lib/console-features.ts +97 -0
- package/src/lib/insights-api.ts +56 -2
- package/src/lib/insights-errors.ts +64 -0
- package/src/lib/insights-failures-rpc.ts +36 -0
- package/src/lib/insights-failures.ts +130 -0
- package/src/lib/insights-recovery-rpc.ts +13 -17
- package/src/lib/insights-recovery.ts +10 -27
- package/src/lib/insights-retention.ts +21 -0
- package/src/lib/insights-rpc.ts +30 -12
- package/src/lib/insights-search.ts +93 -0
- package/src/lib/insights-usage-rpc.ts +29 -0
- package/src/lib/insights-usage.ts +76 -0
- package/src/lib/insights-view.ts +34 -5
- package/src/lib/release-adoption-api.ts +214 -0
- package/src/lib/release-adoption-rpc.ts +49 -0
- package/src/lib/release-adoption.ts +164 -0
- package/src/lib/remote-config-api.ts +119 -0
- package/src/lib/remote-config-draft.ts +652 -0
- package/src/lib/remote-config-rpc.ts +196 -0
- package/src/lib/scroll-restoration.ts +21 -0
- package/src/lib/server/adminInsights.ts +124 -0
- package/src/lib/server/auth.server.ts +13 -5
- package/src/lib/server/bundleActivity.ts +27 -28
- package/src/lib/server/config.server.ts +21 -74
- package/src/lib/server/console-feature-apis.ts +70 -0
- package/src/lib/server/console-runtime.server.ts +82 -38
- package/src/lib/server/downloadBundle.ts +16 -15
- package/src/lib/server/failureReports.ts +49 -0
- package/src/lib/server/getBundleChildren.ts +31 -122
- package/src/lib/server/insightsUsage.ts +63 -0
- package/src/lib/server/listReleases.ts +109 -44
- package/src/lib/server/releaseAdoption.ts +154 -0
- package/src/lib/server/releaseReachability.ts +8 -7
- package/src/lib/server/remoteConfig.ts +191 -0
- package/src/lib/server/runtime.server.ts +120 -31
- package/src/lib/server/updateFailures.ts +65 -0
- package/src/routeTree.gen.ts +65 -44
- package/src/router.tsx +3 -2
- package/src/routes/-installations-search.ts +32 -8
- package/src/routes/-releases-search.ts +76 -29
- package/src/routes/__root.tsx +10 -4
- package/src/routes/api/bundles/$bundleId/download.ts +2 -5
- package/src/routes/api-keys.tsx +5 -2
- package/src/routes/index.tsx +210 -152
- package/src/routes/insights.tsx +133 -18
- package/src/routes/insights_.distribution.tsx +422 -0
- package/src/routes/installations.tsx +98 -41
- package/src/routes/remote-config.tsx +42 -0
- package/src/styles.css +9 -0
- package/src/vite-internal.ts +15 -3
- package/src/vite.ts +2 -0
- package/.output/public/assets/InsightsPageHeader-C-Xc2MB9.js +0 -1
- package/.output/public/assets/api-keys-C1sgC6ko.js +0 -1
- package/.output/public/assets/api-keys-api-LchP65vQ.js +0 -1
- package/.output/public/assets/badge-BuMDU0Rf.js +0 -1
- package/.output/public/assets/card-BEvx_QKh.js +0 -1
- package/.output/public/assets/chart-no-axes-combined-C0G0fQ3J.js +0 -1
- package/.output/public/assets/composite-CHTH1Xhh.js +0 -1
- package/.output/public/assets/createServerFn-DHc2erub.js +0 -3
- package/.output/public/assets/dialog-dyZ1SphZ.js +0 -1
- package/.output/public/assets/dist-Bh1gaDfB.js +0 -1
- package/.output/public/assets/field-79SVH26s.js +0 -1
- package/.output/public/assets/index-BNkxg4jz.js +0 -10
- package/.output/public/assets/input-group-BbHfaBzQ.js +0 -1
- package/.output/public/assets/insights-D_7uSKfc.js +0 -1
- package/.output/public/assets/installations-BzoHWuXw.js +0 -1
- package/.output/public/assets/installations-DvjbUqd1.js +0 -2
- package/.output/public/assets/lazyRouteComponent-BN0MS05o.js +0 -1
- package/.output/public/assets/link-BG06whwB.js +0 -1
- package/.output/public/assets/loader-circle-Bbp8LGVC.js +0 -1
- package/.output/public/assets/preload-helper-uTix4PVD.js +0 -1
- package/.output/public/assets/refresh-cw-DZgiAOMk.js +0 -1
- package/.output/public/assets/routes-BFE-oRIT.js +0 -1
- package/.output/public/assets/routes-DaPMY31P.js +0 -2
- package/.output/public/assets/shield-check-DoIiaaXU.js +0 -1
- package/.output/public/assets/signing-BTRhaF5D.js +0 -1
- package/.output/public/assets/styles-C7U0oVke.css +0 -2
- package/.output/public/assets/table-BBEzJ7Xl.js +0 -1
- package/.output/public/assets/useCompositeListItem-BkPDaqyj.js +0 -42
- package/.output/server/__23tanstack-start-server-fn-resolver-Dr2ixDgQ.mjs +0 -146
- package/.output/server/_ssr/InsightsPageHeader-C5Has8Ry.mjs +0 -60
- package/.output/server/_ssr/api-keys-api-CrCZyvnl.mjs +0 -60
- package/.output/server/_ssr/api-keys-rpc-CFaNf-q0.mjs +0 -136
- package/.output/server/_ssr/api-rpc-B61KL3Eo.mjs +0 -1399
- package/.output/server/_ssr/auth.server-DF_shCeq.mjs +0 -47
- package/.output/server/_ssr/badge-BgsCP9Dp.mjs +0 -28
- package/.output/server/_ssr/bundle-signing-rpc-BBipZnFs.mjs +0 -16
- package/.output/server/_ssr/bundle-signing.server-Co_zHdJx.mjs +0 -12
- package/.output/server/_ssr/bundleActivity-D3_fIda2.mjs +0 -27
- package/.output/server/_ssr/card-DrbxCPtG.mjs +0 -86
- package/.output/server/_ssr/chart-qxa-_30a.mjs +0 -162
- package/.output/server/_ssr/config-Dv8qLDZ0.mjs +0 -13
- package/.output/server/_ssr/config.server-CBr6PDj5.mjs +0 -368
- package/.output/server/_ssr/databaseRows-5bCRTxm-.mjs +0 -126
- package/.output/server/_ssr/deleteBundle-BAq3JuGr.mjs +0 -66
- package/.output/server/_ssr/field-CqNUlqUq.mjs +0 -74
- package/.output/server/_ssr/getBundleChildren-COMt16m_.mjs +0 -50
- package/.output/server/_ssr/insights-B-DUbksX.mjs +0 -502
- package/.output/server/_ssr/insights-recovery-rpc-P71FH66n.mjs +0 -37
- package/.output/server/_ssr/insightsContract-fjJDBeEE.mjs +0 -303
- package/.output/server/_ssr/insightsRecovery-CqcosG7B.mjs +0 -149
- package/.output/server/_ssr/installations-BQrppti7.mjs +0 -29
- package/.output/server/_ssr/routes-BDabsmc7.mjs +0 -37
- package/.output/server/_ssr/runtime.server-jmZOKIQM.mjs +0 -438
- package/.output/server/_ssr/server-p7yrVBfD.mjs +0 -7468
- package/.output/server/_ssr/signing-CxCbnFCt.mjs +0 -134
- package/.output/server/_ssr/start-DpViQGnt.mjs +0 -4
- package/.output/server/_tanstack-start-manifest_v-Cwpu0C9Q.mjs +0 -100
- package/src/components/features/bundles/BundleActivityChart.tsx +0 -95
- package/src/components/features/bundles/BundleInsightsSummary.tsx +0 -121
- package/src/components/features/signing/BundleSigningPage.tsx +0 -139
- package/src/lib/bundle-signing-api.ts +0 -14
- package/src/lib/bundle-signing-rpc.ts +0 -16
- package/src/lib/server/bundle-signing.server.ts +0 -23
- package/src/lib/server/deleteBundle.ts +0 -145
- package/src/lib/server/insightsHistory.ts +0 -52
- package/src/lib/server/insightsRecovery.ts +0 -186
- package/src/routes/signing.tsx +0 -37
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createFileRoute,
|
|
3
3
|
useElementScrollRestoration,
|
|
4
|
+
useLocation,
|
|
4
5
|
} from "@tanstack/react-router";
|
|
5
6
|
import { ArrowLeft } from "lucide-react";
|
|
6
7
|
import { useEffect, useLayoutEffect, useRef, useState } from "react";
|
|
7
8
|
|
|
9
|
+
import { ConsoleFeatureUnavailable } from "@/components/ConsoleFeatureUnavailable";
|
|
8
10
|
import { EventHistoryCard } from "@/components/features/insights/EventHistoryCard";
|
|
9
11
|
import { InsightsPageHeader } from "@/components/features/insights/InsightsPageHeader";
|
|
10
12
|
import { InstallationHistoryCard } from "@/components/features/insights/InstallationHistoryCard";
|
|
@@ -15,15 +17,20 @@ import {
|
|
|
15
17
|
} from "@/components/features/insights/InstallationPageHeader";
|
|
16
18
|
import { Button } from "@/components/ui/button";
|
|
17
19
|
import { Card, CardContent } from "@/components/ui/card";
|
|
20
|
+
import { requireConsoleFeature } from "@/lib/console-features-api";
|
|
18
21
|
import {
|
|
19
22
|
useInsightsEventsQuery,
|
|
20
23
|
useInsightsInstallationEventsQuery,
|
|
21
24
|
useInsightsInstallationQuery,
|
|
22
25
|
useInsightsInstallationsQuery,
|
|
26
|
+
useInsightsRetention,
|
|
23
27
|
} from "@/lib/insights-api";
|
|
28
|
+
import { formatDays } from "@/lib/insights-retention";
|
|
29
|
+
import { DEFAULT_EVENT_RANGE, eventRangeBounds } from "@/lib/insights-view";
|
|
24
30
|
|
|
25
31
|
import {
|
|
26
|
-
|
|
32
|
+
type InsightsPaginationState,
|
|
33
|
+
installationsScrollRestorationKey,
|
|
27
34
|
validateInstallationsSearch,
|
|
28
35
|
} from "./-installations-search";
|
|
29
36
|
|
|
@@ -40,30 +47,50 @@ const popCursor = (stack: readonly string[]) => ({
|
|
|
40
47
|
});
|
|
41
48
|
|
|
42
49
|
export const Route = createFileRoute("/installations")({
|
|
50
|
+
beforeLoad: ({ context }) =>
|
|
51
|
+
requireConsoleFeature(context.queryClient, "insights"),
|
|
52
|
+
notFoundComponent: ConsoleFeatureUnavailable,
|
|
43
53
|
component: InstallationsPage,
|
|
54
|
+
staticData: { scrollRestorationKey: installationsScrollRestorationKey },
|
|
44
55
|
validateSearch: validateInstallationsSearch,
|
|
45
56
|
});
|
|
46
57
|
|
|
47
58
|
function InstallationsPage() {
|
|
48
59
|
const search = Route.useSearch();
|
|
49
60
|
const navigate = Route.useNavigate();
|
|
61
|
+
const retention = useInsightsRetention();
|
|
50
62
|
const [draftQuery, setDraftQuery] = useState(search.query ?? "");
|
|
51
63
|
const [initialEventsBefore] = useState(freshBefore);
|
|
52
64
|
const [initialHistoryBefore] = useState(freshBefore);
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
|
|
65
|
+
const pagination = useLocation({
|
|
66
|
+
select: (location) => location.state.insightsPagination,
|
|
67
|
+
});
|
|
68
|
+
const eventsBack = pagination?.eventsBack ?? [];
|
|
69
|
+
const searchBack = pagination?.searchBack ?? [];
|
|
70
|
+
const historyBack = pagination?.historyBack ?? [];
|
|
56
71
|
const query = search.query?.trim() ?? "";
|
|
57
72
|
const hasSearchQuery = query.length > 0;
|
|
58
73
|
const hasSelection = search.installId !== undefined;
|
|
59
74
|
const hasLookup = hasSearchQuery || hasSelection;
|
|
60
75
|
const eventsBefore = search.eventsBefore ?? initialEventsBefore;
|
|
76
|
+
const eventsRange = search.eventsRange ?? DEFAULT_EVENT_RANGE;
|
|
61
77
|
const historyBefore = search.historyBefore ?? initialHistoryBefore;
|
|
62
78
|
|
|
63
|
-
const updateSearch = (
|
|
79
|
+
const updateSearch = (
|
|
80
|
+
next: Partial<typeof search>,
|
|
81
|
+
replace = false,
|
|
82
|
+
nextPagination: InsightsPaginationState = {},
|
|
83
|
+
) => {
|
|
64
84
|
void navigate({
|
|
65
85
|
to: "/installations",
|
|
66
86
|
search: { ...search, ...next },
|
|
87
|
+
state: (previous) => ({
|
|
88
|
+
...previous,
|
|
89
|
+
insightsPagination: {
|
|
90
|
+
...previous.insightsPagination,
|
|
91
|
+
...nextPagination,
|
|
92
|
+
},
|
|
93
|
+
}),
|
|
67
94
|
replace,
|
|
68
95
|
});
|
|
69
96
|
};
|
|
@@ -86,9 +113,9 @@ function InstallationsPage() {
|
|
|
86
113
|
|
|
87
114
|
const events = useInsightsEventsQuery(
|
|
88
115
|
{
|
|
89
|
-
|
|
116
|
+
...eventRangeBounds(eventsRange, eventsBefore),
|
|
90
117
|
cursor: search.eventsCursor,
|
|
91
|
-
limit:
|
|
118
|
+
limit: 20,
|
|
92
119
|
},
|
|
93
120
|
!hasLookup,
|
|
94
121
|
);
|
|
@@ -104,7 +131,6 @@ function InstallationsPage() {
|
|
|
104
131
|
useEffect(() => {
|
|
105
132
|
const firstInstallId = matches.data?.data[0]?.installId;
|
|
106
133
|
if (!hasSearchQuery || hasSelection || firstInstallId === undefined) return;
|
|
107
|
-
setHistoryBack([]);
|
|
108
134
|
updateSearch(
|
|
109
135
|
{
|
|
110
136
|
historyBefore: freshBefore(),
|
|
@@ -112,6 +138,7 @@ function InstallationsPage() {
|
|
|
112
138
|
installId: firstInstallId,
|
|
113
139
|
},
|
|
114
140
|
true,
|
|
141
|
+
{ historyBack: [] },
|
|
115
142
|
);
|
|
116
143
|
}, [hasSearchQuery, hasSelection, matches.data?.data]);
|
|
117
144
|
|
|
@@ -141,7 +168,7 @@ function InstallationsPage() {
|
|
|
141
168
|
const scrollRef = useRef<HTMLDivElement>(null);
|
|
142
169
|
const scrollEntry = useElementScrollRestoration({
|
|
143
170
|
id: scrollRestorationId,
|
|
144
|
-
getKey:
|
|
171
|
+
getKey: installationsScrollRestorationKey,
|
|
145
172
|
});
|
|
146
173
|
useLayoutEffect(() => {
|
|
147
174
|
if (!hasLookup && !events.isLoading && scrollRef.current) {
|
|
@@ -151,15 +178,17 @@ function InstallationsPage() {
|
|
|
151
178
|
|
|
152
179
|
const clearLookup = () => {
|
|
153
180
|
setDraftQuery("");
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
181
|
+
updateSearch(
|
|
182
|
+
{
|
|
183
|
+
historyBefore: undefined,
|
|
184
|
+
historyCursor: undefined,
|
|
185
|
+
installId: undefined,
|
|
186
|
+
query: undefined,
|
|
187
|
+
searchCursor: undefined,
|
|
188
|
+
},
|
|
189
|
+
false,
|
|
190
|
+
{ historyBack: [], searchBack: [] },
|
|
191
|
+
);
|
|
163
192
|
};
|
|
164
193
|
const installationLookup = (
|
|
165
194
|
<InstallationSearchPanel
|
|
@@ -172,15 +201,17 @@ function InstallationsPage() {
|
|
|
172
201
|
clearLookup();
|
|
173
202
|
return;
|
|
174
203
|
}
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
204
|
+
updateSearch(
|
|
205
|
+
{
|
|
206
|
+
historyBefore: undefined,
|
|
207
|
+
historyCursor: undefined,
|
|
208
|
+
installId: undefined,
|
|
209
|
+
query: nextQuery,
|
|
210
|
+
searchCursor: undefined,
|
|
211
|
+
},
|
|
212
|
+
false,
|
|
213
|
+
{ historyBack: [], searchBack: [] },
|
|
214
|
+
);
|
|
184
215
|
}}
|
|
185
216
|
/>
|
|
186
217
|
);
|
|
@@ -213,45 +244,60 @@ function InstallationsPage() {
|
|
|
213
244
|
) : null}
|
|
214
245
|
{!hasLookup ? (
|
|
215
246
|
<EventHistoryCard
|
|
247
|
+
description={`Downloads, launches, crashes, update failures, and other changes to what an installation runs, newest first, kept for ${formatDays(retention.rawDays)}. Launches that change nothing aren't listed.`}
|
|
216
248
|
error={events.error}
|
|
217
249
|
eventsLocation={{
|
|
218
250
|
eventsBefore,
|
|
219
251
|
eventsCursor: search.eventsCursor,
|
|
252
|
+
eventsRange: search.eventsRange,
|
|
220
253
|
}}
|
|
221
254
|
history={events.data}
|
|
222
255
|
isFetching={events.isFetching}
|
|
223
256
|
isLoading={events.isLoading}
|
|
224
257
|
onNext={() => {
|
|
225
258
|
if (!events.data?.nextCursor) return;
|
|
226
|
-
setEventsBack(pushCursor(eventsBack, search.eventsCursor));
|
|
227
259
|
updateSearch(
|
|
228
260
|
{
|
|
229
261
|
eventsCursor: events.data.nextCursor,
|
|
230
262
|
},
|
|
231
263
|
true,
|
|
264
|
+
{ eventsBack: pushCursor(eventsBack, search.eventsCursor) },
|
|
232
265
|
);
|
|
233
266
|
}}
|
|
234
267
|
onPrevious={() => {
|
|
235
268
|
const previous = popCursor(eventsBack);
|
|
236
|
-
setEventsBack(previous.stack);
|
|
237
269
|
updateSearch(
|
|
238
270
|
{
|
|
239
271
|
eventsCursor: previous.cursor,
|
|
240
272
|
},
|
|
241
273
|
true,
|
|
274
|
+
{ eventsBack: previous.stack },
|
|
275
|
+
);
|
|
276
|
+
}}
|
|
277
|
+
onRangeChange={(range) => {
|
|
278
|
+
updateSearch(
|
|
279
|
+
{
|
|
280
|
+
eventsBefore: freshBefore(),
|
|
281
|
+
eventsCursor: undefined,
|
|
282
|
+
eventsRange: range,
|
|
283
|
+
},
|
|
284
|
+
false,
|
|
285
|
+
{ eventsBack: [] },
|
|
242
286
|
);
|
|
243
287
|
}}
|
|
244
288
|
onRefresh={() => {
|
|
245
|
-
setEventsBack([]);
|
|
246
289
|
updateSearch(
|
|
247
290
|
{
|
|
248
291
|
eventsBefore: freshBefore(),
|
|
249
292
|
eventsCursor: undefined,
|
|
250
293
|
},
|
|
251
294
|
true,
|
|
295
|
+
{ eventsBack: [] },
|
|
252
296
|
);
|
|
253
297
|
}}
|
|
254
298
|
pageNumber={eventsBack.length + 1}
|
|
299
|
+
range={eventsRange}
|
|
300
|
+
rawDays={retention.rawDays}
|
|
255
301
|
>
|
|
256
302
|
{installationLookup}
|
|
257
303
|
</EventHistoryCard>
|
|
@@ -266,33 +312,38 @@ function InstallationsPage() {
|
|
|
266
312
|
error={matches.error}
|
|
267
313
|
onNext={() => {
|
|
268
314
|
if (!matches.data?.nextCursor) return;
|
|
269
|
-
setSearchBack(pushCursor(searchBack, search.searchCursor));
|
|
270
315
|
updateSearch(
|
|
271
316
|
{
|
|
272
317
|
installId: undefined,
|
|
273
318
|
searchCursor: matches.data.nextCursor,
|
|
274
319
|
},
|
|
275
320
|
true,
|
|
321
|
+
{
|
|
322
|
+
searchBack: pushCursor(searchBack, search.searchCursor),
|
|
323
|
+
},
|
|
276
324
|
);
|
|
277
325
|
}}
|
|
278
326
|
onPrevious={() => {
|
|
279
327
|
const previous = popCursor(searchBack);
|
|
280
|
-
setSearchBack(previous.stack);
|
|
281
328
|
updateSearch(
|
|
282
329
|
{
|
|
283
330
|
installId: undefined,
|
|
284
331
|
searchCursor: previous.cursor,
|
|
285
332
|
},
|
|
286
333
|
true,
|
|
334
|
+
{ searchBack: previous.stack },
|
|
287
335
|
);
|
|
288
336
|
}}
|
|
289
337
|
onSelect={(installId) => {
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
338
|
+
updateSearch(
|
|
339
|
+
{
|
|
340
|
+
historyBefore: freshBefore(),
|
|
341
|
+
historyCursor: undefined,
|
|
342
|
+
installId,
|
|
343
|
+
},
|
|
344
|
+
false,
|
|
345
|
+
{ historyBack: [] },
|
|
346
|
+
);
|
|
296
347
|
}}
|
|
297
348
|
pageNumber={searchBack.length + 1}
|
|
298
349
|
results={matches.data}
|
|
@@ -305,35 +356,41 @@ function InstallationsPage() {
|
|
|
305
356
|
isLoading={history.isLoading || selectedInstallation.isLoading}
|
|
306
357
|
onNext={() => {
|
|
307
358
|
if (!history.data?.nextCursor) return;
|
|
308
|
-
setHistoryBack(pushCursor(historyBack, search.historyCursor));
|
|
309
359
|
updateSearch(
|
|
310
360
|
{
|
|
311
361
|
historyCursor: history.data.nextCursor,
|
|
312
362
|
},
|
|
313
363
|
true,
|
|
364
|
+
{
|
|
365
|
+
historyBack: pushCursor(
|
|
366
|
+
historyBack,
|
|
367
|
+
search.historyCursor,
|
|
368
|
+
),
|
|
369
|
+
},
|
|
314
370
|
);
|
|
315
371
|
}}
|
|
316
372
|
onPrevious={() => {
|
|
317
373
|
const previous = popCursor(historyBack);
|
|
318
|
-
setHistoryBack(previous.stack);
|
|
319
374
|
updateSearch(
|
|
320
375
|
{
|
|
321
376
|
historyCursor: previous.cursor,
|
|
322
377
|
},
|
|
323
378
|
true,
|
|
379
|
+
{ historyBack: previous.stack },
|
|
324
380
|
);
|
|
325
381
|
}}
|
|
326
382
|
onRefresh={() => {
|
|
327
|
-
setHistoryBack([]);
|
|
328
383
|
updateSearch(
|
|
329
384
|
{
|
|
330
385
|
historyBefore: freshBefore(),
|
|
331
386
|
historyCursor: undefined,
|
|
332
387
|
},
|
|
333
388
|
true,
|
|
389
|
+
{ historyBack: [] },
|
|
334
390
|
);
|
|
335
391
|
}}
|
|
336
392
|
pageNumber={historyBack.length + 1}
|
|
393
|
+
retention={retention}
|
|
337
394
|
selectedEvent={selectedEvent}
|
|
338
395
|
selectedInstallId={search.installId}
|
|
339
396
|
/>
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { createFileRoute } from "@tanstack/react-router";
|
|
2
|
+
|
|
3
|
+
import { ConsoleFeatureUnavailable } from "@/components/ConsoleFeatureUnavailable";
|
|
4
|
+
import {
|
|
5
|
+
REMOTE_CONFIG_TABS,
|
|
6
|
+
RemoteConfigPage,
|
|
7
|
+
type RemoteConfigTab,
|
|
8
|
+
} from "@/components/features/remote-config/RemoteConfigPage";
|
|
9
|
+
import { requireConsoleFeature } from "@/lib/console-features-api";
|
|
10
|
+
|
|
11
|
+
interface RemoteConfigSearch {
|
|
12
|
+
/** The open view; Parameters when absent. */
|
|
13
|
+
readonly tab?: RemoteConfigTab;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export const Route = createFileRoute("/remote-config")({
|
|
17
|
+
beforeLoad: ({ context }) =>
|
|
18
|
+
requireConsoleFeature(context.queryClient, "remoteConfig"),
|
|
19
|
+
notFoundComponent: ConsoleFeatureUnavailable,
|
|
20
|
+
component: RemoteConfigRoute,
|
|
21
|
+
validateSearch: (search: Record<string, unknown>): RemoteConfigSearch =>
|
|
22
|
+
REMOTE_CONFIG_TABS.includes(search.tab as RemoteConfigTab) &&
|
|
23
|
+
search.tab !== "parameters"
|
|
24
|
+
? { tab: search.tab as RemoteConfigTab }
|
|
25
|
+
: {},
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
function RemoteConfigRoute() {
|
|
29
|
+
const { tab = "parameters" } = Route.useSearch();
|
|
30
|
+
const navigate = Route.useNavigate();
|
|
31
|
+
return (
|
|
32
|
+
<RemoteConfigPage
|
|
33
|
+
onTabChange={(next) =>
|
|
34
|
+
void navigate({
|
|
35
|
+
search: next === "parameters" ? {} : { tab: next },
|
|
36
|
+
replace: true,
|
|
37
|
+
})
|
|
38
|
+
}
|
|
39
|
+
tab={tab}
|
|
40
|
+
/>
|
|
41
|
+
);
|
|
42
|
+
}
|
package/src/styles.css
CHANGED
|
@@ -48,6 +48,11 @@ code {
|
|
|
48
48
|
--chart-3: oklch(0.646 0.222 41.116);
|
|
49
49
|
--chart-4: oklch(0.553 0.195 38.402);
|
|
50
50
|
--chart-5: oklch(0.47 0.157 37.304);
|
|
51
|
+
/* One hue per compared bundle; validated as a categorical set on the card. */
|
|
52
|
+
--series-1: #2a78d6;
|
|
53
|
+
--series-2: #eb6834;
|
|
54
|
+
--series-3: #1baf7a;
|
|
55
|
+
--series-4: #eda100;
|
|
51
56
|
--radius: 0.45rem;
|
|
52
57
|
--sidebar: oklch(0.985 0.001 106.423);
|
|
53
58
|
--sidebar-foreground: oklch(0.147 0.004 49.25);
|
|
@@ -86,6 +91,10 @@ code {
|
|
|
86
91
|
--chart-3: oklch(0.646 0.222 41.116);
|
|
87
92
|
--chart-4: oklch(0.553 0.195 38.402);
|
|
88
93
|
--chart-5: oklch(0.47 0.157 37.304);
|
|
94
|
+
--series-1: #3987e5;
|
|
95
|
+
--series-2: #d95926;
|
|
96
|
+
--series-3: #199e70;
|
|
97
|
+
--series-4: #c98500;
|
|
89
98
|
--sidebar: oklch(0.216 0.006 56.043);
|
|
90
99
|
--sidebar-foreground: oklch(0.985 0.001 106.423);
|
|
91
100
|
--sidebar-primary: oklch(0.705 0.213 47.604);
|
package/src/vite-internal.ts
CHANGED
|
@@ -70,7 +70,7 @@ const createConsoleModulesPlugin = (mode: ConsoleModuleMode): Plugin => {
|
|
|
70
70
|
);
|
|
71
71
|
configFile = resolveFromRoot(
|
|
72
72
|
root,
|
|
73
|
-
mode.options.config ?? "
|
|
73
|
+
mode.options.config ?? "console.config.ts",
|
|
74
74
|
);
|
|
75
75
|
|
|
76
76
|
writeFileIfChanged(
|
|
@@ -128,15 +128,27 @@ const createConsoleModulesPlugin = (mode: ConsoleModuleMode): Plugin => {
|
|
|
128
128
|
|
|
129
129
|
if (id === resolvedVirtualConfigModuleId) {
|
|
130
130
|
if (mode.type === "local") {
|
|
131
|
+
// hot-updater.config.ts's database, storage, and plugins, as the
|
|
132
|
+
// CLI loads them.
|
|
131
133
|
return [
|
|
132
134
|
'import { loadConfig } from "@hot-updater/cli-tools";',
|
|
133
135
|
"export default async () => {",
|
|
134
136
|
" const config = await loadConfig(null);",
|
|
137
|
+
" if (config.database === undefined) {",
|
|
138
|
+
" throw new Error(",
|
|
139
|
+
' "Set database in hot-updater.config.ts: the database your server runs on, such as d1Database(...), or standaloneRepository({ baseUrl }) to reach a self-hosted server through its admin API.",',
|
|
140
|
+
" );",
|
|
141
|
+
" }",
|
|
142
|
+
" if (config.storage === undefined) {",
|
|
143
|
+
" throw new Error(",
|
|
144
|
+
' "Set storage in hot-updater.config.ts: where your server stores bundles, which the console reads, such as r2Storage(...).",',
|
|
145
|
+
" );",
|
|
146
|
+
" }",
|
|
135
147
|
" return {",
|
|
136
|
-
" console: { gitUrl: config.console.gitUrl },",
|
|
137
148
|
" database: config.database,",
|
|
138
|
-
" signing: config.signing,",
|
|
139
149
|
" storage: config.storage,",
|
|
150
|
+
" plugins: config.plugins,",
|
|
151
|
+
" console: { gitUrl: config.console.gitUrl },",
|
|
140
152
|
" };",
|
|
141
153
|
"};",
|
|
142
154
|
].join("\n");
|
package/src/vite.ts
CHANGED
|
@@ -3,7 +3,9 @@ import type { PluginOption } from "vite";
|
|
|
3
3
|
import { createHostedConsolePlugins } from "./vite-internal";
|
|
4
4
|
|
|
5
5
|
export interface HotUpdaterConsolePluginOptions {
|
|
6
|
+
/** The console's auth module, `console.auth.ts` by default. */
|
|
6
7
|
readonly auth?: string;
|
|
8
|
+
/** The module whose default export is `defineConsoleConfig(...)`, `console.config.ts` by default. */
|
|
7
9
|
readonly config?: string;
|
|
8
10
|
}
|
|
9
11
|
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Gn as e,Kn as t,Qn as n,bn as r,m as i}from"./createServerFn-DHc2erub.js";import{t as a}from"./link-BG06whwB.js";import{t as o}from"./chart-no-axes-combined-C0G0fQ3J.js";import{l as s,s as c,u as l}from"./card-BEvx_QKh.js";var u=t(`arrow-up-right`,[[`path`,{d:`M7 7h10v10`,key:`1tivn9`}],[`path`,{d:`M7 17 17 7`,key:`1vkiza`}]]),d=n();function f({fallbackTitle:t}){return(0,d.jsxs)(c,{variant:`destructive`,children:[(0,d.jsx)(e,{"aria-hidden":`true`}),(0,d.jsx)(l,{children:t}),(0,d.jsx)(s,{children:`Refresh to try again. If this keeps happening, check your Insights provider connection.`})]})}function p({view:e}){return(0,d.jsxs)(`header`,{className:`sticky top-0 z-10 flex shrink-0 flex-wrap items-center gap-3 border-b bg-background px-3 py-3 sm:bg-card/70 sm:px-4 sm:backdrop-blur-sm`,children:[(0,d.jsx)(i,{className:`-ml-1 size-11 lg:size-7`}),(0,d.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,d.jsx)(o,{"aria-hidden":`true`,className:`size-3.5 text-muted-foreground`}),(0,d.jsx)(`h1`,{className:`text-sm font-medium`,children:`Insights`})]}),(0,d.jsxs)(`nav`,{"aria-label":`Insights views`,className:`ml-auto flex gap-1`,children:[(0,d.jsx)(a,{"aria-current":e===`overview`?`page`:void 0,className:r({className:`h-11 px-3 lg:h-8 lg:px-2.5`,size:`lg`,variant:e===`overview`?`secondary`:`ghost`}),to:`/insights`,children:`Overview`}),(0,d.jsx)(a,{"aria-current":e===`events`?`page`:void 0,className:r({className:`h-11 px-3 lg:h-8 lg:px-2.5`,size:`lg`,variant:e===`events`?`secondary`:`ghost`}),to:`/installations`,children:`Events`})]})]})}export{f as n,u as r,p as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Gn as e,Kn as t,Or as n,Qn as r,gn as i,jr as a,m as o,vn as s,yn as c}from"./createServerFn-DHc2erub.js";import{t as l}from"./loader-circle-Bbp8LGVC.js";import{a as u,c as ee,i as d,n as f,o as p,r as m,t as te}from"./table-BBEzJ7Xl.js";import{a as h,i as g,o as _,r as v}from"./api-keys-api-LchP65vQ.js";import{N as y,_ as b,a as x,d as ne,f as S,g as C,h as w,i as T,l as E,m as D,n as O,o as k,p as A,r as j,t as M,u as N,v as P}from"./dialog-dyZ1SphZ.js";import{t as F}from"./refresh-cw-DZgiAOMk.js";import{n as I}from"./dist-Bh1gaDfB.js";import{a as re,c as L,l as R,n as z,o as B,s as V,t as H,u as U}from"./card-BEvx_QKh.js";import{t as W}from"./badge-BuMDU0Rf.js";import{a as G,i as K,n as q,r as J,t as Y}from"./field-79SVH26s.js";var X=t(`clipboard`,[[`rect`,{width:`8`,height:`4`,x:`8`,y:`2`,rx:`1`,ry:`1`,key:`tgr4d6`}],[`path`,{d:`M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2`,key:`116196`}]]),Z=t(`shield-off`,[[`path`,{d:`m2 2 20 20`,key:`1ooewy`}],[`path`,{d:`M5 5a1 1 0 0 0-1 1v7c0 5 3.5 7.5 7.67 8.94a1 1 0 0 0 .67.01c2.35-.82 4.48-1.97 5.9-3.71`,key:`1jlk70`}],[`path`,{d:`M9.309 3.652A12.252 12.252 0 0 0 11.24 2.28a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1v7a9.784 9.784 0 0 1-.08 1.264`,key:`18rp1v`}]]),Q=a(n(),1),$=r(),ie=e=>new Date(e).toISOString().slice(0,10);function ae(){let[e,t]=(0,Q.useState)(!1),[n,r]=(0,Q.useState)(``),[i,a]=(0,Q.useState)(null),o=g(),u=n.trim(),d=u.length>64?`Name must be 64 characters or fewer.`:null,f=()=>{r(``),a(null),o.reset()},p=e=>{t(e),e||f()};return(0,$.jsxs)($.Fragment,{children:[(0,$.jsxs)(c,{onClick:()=>t(!0),children:[(0,$.jsx)(y,{"data-icon":`inline-start`}),`Create API key`]}),(0,$.jsx)(M,{open:e,onOpenChange:p,children:(0,$.jsxs)(O,{showCloseButton:i===null,children:[(0,$.jsxs)(x,{children:[(0,$.jsx)(k,{children:i===null?`Create API key`:`Save your API key`}),(0,$.jsx)(j,{children:i===null?`Name the app or environment that will use this key.`:`This key is shown once. Store it securely before closing.`})]}),i===null?(0,$.jsxs)(`form`,{onSubmit:async e=>{if(e.preventDefault(),!(u.length===0||d!==null))try{a((await o.mutateAsync(u)).apiKey),I.success(`API key created`)}catch(e){I.error(e instanceof Error?e.message:`Unable to create API key`)}},children:[(0,$.jsx)(K,{children:(0,$.jsxs)(Y,{"data-invalid":d!==null||void 0,children:[(0,$.jsx)(G,{htmlFor:`api-key-name`,children:`Name`}),(0,$.jsx)(s,{id:`api-key-name`,autoComplete:`off`,maxLength:65,onChange:e=>r(e.target.value),placeholder:`Production app`,value:n}),(0,$.jsx)(q,{children:`Use a name you can identify before revoking the key.`}),(0,$.jsx)(J,{children:d})]})}),(0,$.jsx)(T,{className:`mt-4`,children:(0,$.jsxs)(c,{disabled:o.isPending||u.length===0||d!==null,type:`submit`,children:[o.isPending?(0,$.jsx)(l,{"data-icon":`inline-start`,className:`animate-spin`}):(0,$.jsx)(_,{"data-icon":`inline-start`}),`Create API key`]})})]}):(0,$.jsxs)(K,{children:[(0,$.jsxs)(Y,{children:[(0,$.jsx)(G,{htmlFor:`created-api-key`,children:`API key`}),(0,$.jsxs)(`div`,{className:`flex gap-2`,children:[(0,$.jsx)(s,{id:`created-api-key`,className:`font-mono`,readOnly:!0,value:i}),(0,$.jsxs)(c,{onClick:async()=>{if(i!==null)try{await navigator.clipboard.writeText(i),I.success(`API key copied`)}catch{I.error(`Unable to copy API key`)}},type:`button`,variant:`outline`,children:[(0,$.jsx)(X,{"data-icon":`inline-start`}),`Copy`]})]})]}),(0,$.jsx)(T,{children:(0,$.jsxs)(c,{onClick:()=>p(!1),children:[(0,$.jsx)(ee,{"data-icon":`inline-start`}),`Done`]})})]})]})})]})}function oe({record:e}){let[t,n]=(0,Q.useState)(!1),r=h(),i=async t=>{t.preventDefault();try{await r.mutateAsync(e.id),n(!1),I.success(`API key revoked`)}catch(e){I.error(e instanceof Error?e.message:`Unable to revoke API key`)}};return(0,$.jsxs)(E,{open:t,onOpenChange:e=>{r.isPending||n(e)},children:[(0,$.jsxs)(P,{render:(0,$.jsx)(c,{size:`sm`,variant:`ghost`}),children:[(0,$.jsx)(Z,{"data-icon":`inline-start`}),`Revoke`]}),(0,$.jsxs)(S,{children:[(0,$.jsxs)(w,{children:[(0,$.jsx)(C,{children:(0,$.jsx)(Z,{})}),(0,$.jsxs)(b,{children:[`Revoke `,e.name,`?`]}),(0,$.jsxs)(A,{children:[`Apps using `,e.prefix,`… will immediately lose OTA update and insights access. This action cannot be undone.`]})]}),(0,$.jsxs)(D,{children:[(0,$.jsx)(ne,{disabled:r.isPending,children:`Cancel`}),(0,$.jsx)(N,{disabled:r.isPending,onClick:e=>void i(e),variant:`destructive`,children:`Revoke API key`})]})]})]})}function se(){let t=v();return(0,$.jsxs)(H,{className:`overflow-hidden shadow-sm`,children:[(0,$.jsxs)(re,{className:`flex-row items-center justify-between space-y-0 border-b px-4 py-3`,children:[(0,$.jsx)(B,{className:`text-sm`,children:(0,$.jsx)(`h2`,{children:`API keys`})}),(0,$.jsx)(ae,{})]}),(0,$.jsx)(z,{className:`p-0`,children:t.isError?(0,$.jsx)(`div`,{className:`p-4`,children:(0,$.jsxs)(V,{variant:`destructive`,children:[(0,$.jsx)(e,{}),(0,$.jsx)(U,{children:`API keys couldn't be loaded`}),(0,$.jsx)(R,{children:`Check your connection and try again.`}),(0,$.jsx)(L,{children:(0,$.jsxs)(c,{onClick:()=>void t.refetch(),size:`xs`,variant:`outline`,children:[(0,$.jsx)(F,{"data-icon":`inline-start`}),`Retry`]})})]})}):(0,$.jsxs)(te,{"aria-label":`API keys`,className:`table-fixed`,children:[(0,$.jsx)(u,{children:(0,$.jsxs)(p,{children:[(0,$.jsx)(d,{children:`Key`}),(0,$.jsx)(d,{className:`w-32`,children:`Created`}),(0,$.jsx)(d,{className:`w-24 text-right`,children:(0,$.jsx)(`span`,{className:`sr-only`,children:`Actions`})})]})}),(0,$.jsx)(f,{children:t.isLoading?Array.from({length:3},(e,t)=>(0,$.jsxs)(p,{children:[(0,$.jsxs)(m,{className:`space-y-2 py-3`,children:[t===0?(0,$.jsx)(`span`,{className:`sr-only`,children:`Loading API keys`}):null,(0,$.jsx)(i,{className:`h-3.5 w-32`}),(0,$.jsx)(i,{className:`h-3 w-20`})]}),(0,$.jsx)(m,{children:(0,$.jsx)(i,{className:`h-3.5 w-20`})}),(0,$.jsx)(m,{children:(0,$.jsx)(i,{className:`ml-auto h-6 w-16`})})]},t)):t.data?.length===0?(0,$.jsx)(p,{children:(0,$.jsx)(m,{colSpan:3,className:`h-40 text-center text-muted-foreground`,children:(0,$.jsxs)(`div`,{className:`mx-auto flex max-w-xs flex-col items-center gap-2`,children:[(0,$.jsx)(_,{className:`size-5`}),(0,$.jsx)(`p`,{className:`font-medium text-foreground`,children:`No API keys`}),(0,$.jsx)(`p`,{children:`Create an API key to connect an app.`})]})})}):t.data?.map(e=>(0,$.jsxs)(p,{className:e.revoked_at_ms===null?void 0:`text-muted-foreground`,children:[(0,$.jsx)(m,{className:`whitespace-normal py-3`,children:(0,$.jsxs)(`div`,{className:`min-w-0 space-y-1`,children:[(0,$.jsx)(`p`,{className:`break-words font-medium text-foreground`,children:e.name}),(0,$.jsxs)(`p`,{className:`font-mono text-xs text-muted-foreground`,children:[e.prefix,`…`]})]})}),(0,$.jsx)(m,{className:`text-xs text-muted-foreground`,children:(0,$.jsx)(`time`,{dateTime:new Date(e.created_at_ms).toISOString(),children:ie(e.created_at_ms)})}),(0,$.jsx)(m,{className:`text-right`,children:e.revoked_at_ms===null?(0,$.jsx)(oe,{record:e}):(0,$.jsx)(W,{variant:`outline`,children:`Revoked`})})]},e.id))})]})})]})}function ce(){return(0,$.jsxs)(`div`,{className:`flex h-svh min-h-0 flex-col`,children:[(0,$.jsxs)(`header`,{className:`sticky top-0 z-10 flex shrink-0 flex-wrap items-center gap-x-3 gap-y-1 border-b bg-background px-3 py-3 sm:min-h-12 sm:flex-nowrap sm:bg-card/70 sm:px-4 sm:backdrop-blur-sm`,children:[(0,$.jsx)(o,{className:`-ml-1`}),(0,$.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,$.jsx)(_,{"aria-hidden":`true`,className:`size-3.5 text-muted-foreground`}),(0,$.jsx)(`h1`,{className:`text-sm font-medium`,children:`API keys`})]}),(0,$.jsx)(`p`,{className:`basis-full pl-9 text-xs text-muted-foreground sm:basis-auto sm:pl-0`,children:`API keys can download OTA updates and submit insights only.`})]}),(0,$.jsx)(`div`,{className:`min-h-0 min-w-0 flex-1 overflow-y-auto bg-muted/5 p-3 sm:p-6`,children:(0,$.jsx)(`div`,{className:`mx-auto w-full max-w-5xl`,children:(0,$.jsx)(se,{})})})]})}export{ce as component};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Kn as e,Yn as t,Zn as n,t as r,vr as i,xr as a}from"./createServerFn-DHc2erub.js";import{n as o}from"./loader-circle-Bbp8LGVC.js";var s=e(`key-round`,[[`path`,{d:`M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z`,key:`1s6t7t`}],[`circle`,{cx:`16.5`,cy:`7.5`,r:`.5`,fill:`currentColor`,key:`w0ekpg`}]]),c=r({method:`GET`}).handler(i(`29665ce3a33cde2eb2ee082694288db269438f62f3a4d0a005dec3256e0f15c1`)),l=r({method:`GET`}).handler(i(`2c7f3cdb9bd3cab2c026a48abdc84c362db0362924a08679052a325640aec56b`)),u=r({method:`POST`}).handler(i(`68a2d94ee016be64936401f5eba60ab08a47ff373e1cf9de48e4413336e6034b`)),d=r({method:`POST`}).handler(i(`a1cb80b19ca72a64fb631ca28ebb9b6941db245983de082d5dd3203ec2eef795`)),f={capability:[`api-keys`,`capability`],list:[`api-keys`,`list`]},p=()=>({queryKey:f.capability,queryFn:()=>c(),staleTime:1/0}),m=()=>t(p()),h=async e=>{if(!(await e.ensureQueryData(p())).apiKeys)throw a({to:`/`,search:{},replace:!0})},g=()=>t({queryKey:f.list,queryFn:()=>l()}),_=()=>{let e=n();return o({mutationFn:e=>u({data:{name:e}}),onSuccess:async()=>{await e.invalidateQueries({queryKey:f.list})}})},v=()=>{let e=n();return o({mutationFn:e=>d({data:{id:e}}),onSuccess:async()=>{await e.invalidateQueries({queryKey:f.list})}})};export{v as a,_ as i,m as n,s as o,g as r,h as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Fn as e,Nn as t,Wn as n,xn as r}from"./createServerFn-DHc2erub.js";var i=t(`inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2`,{variants:{variant:{default:`border-transparent bg-primary text-primary-foreground shadow hover:bg-primary/80`,secondary:`border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80`,success:`border-success/20 bg-success/10 text-success`,warning:`border-warning/20 bg-warning/10 text-warning`,destructive:`border-transparent bg-destructive text-destructive-foreground shadow hover:bg-destructive/80`,outline:`text-foreground`}},defaultVariants:{variant:`default`}});function a({className:t,variant:a=`default`,render:o,...s}){return e({defaultTagName:`span`,props:n({className:r(i({variant:a}),t)},s),render:o,state:{slot:`badge`,variant:a}})}export{a as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Nn as e,Or as t,Qn as n,xn as r}from"./createServerFn-DHc2erub.js";t();var i=n(),a=e(`group/alert relative grid w-full gap-0.5 rounded-lg border px-2 py-1.5 text-left text-xs/relaxed has-data-[slot=alert-action]:relative has-data-[slot=alert-action]:pr-18 has-[>svg]:grid-cols-[auto_1fr] has-[>svg]:gap-x-1.5 *:[svg]:row-span-2 *:[svg]:translate-y-0.5 *:[svg]:text-current *:[svg:not([class*='size-'])]:size-3.5`,{variants:{variant:{default:`bg-card text-card-foreground`,destructive:`bg-card text-destructive *:data-[slot=alert-description]:text-destructive/90 *:[svg]:text-current`}},defaultVariants:{variant:`default`}});function o({className:e,variant:t,...n}){return(0,i.jsx)(`div`,{"data-slot":`alert`,role:`alert`,className:r(a({variant:t}),e),...n})}function s({className:e,...t}){return(0,i.jsx)(`div`,{"data-slot":`alert-title`,className:r(`font-medium group-has-[>svg]/alert:col-start-2 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground`,e),...t})}function c({className:e,...t}){return(0,i.jsx)(`div`,{"data-slot":`alert-description`,className:r(`text-xs/relaxed text-balance text-muted-foreground md:text-pretty [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4`,e),...t})}function l({className:e,...t}){return(0,i.jsx)(`div`,{"data-slot":`alert-action`,className:r(`absolute top-1.5 right-2`,e),...t})}function u({className:e,...t}){return(0,i.jsx)(`div`,{"data-slot":`card`,className:r(`rounded-xl border bg-card text-card-foreground shadow`,e),...t})}function d({className:e,...t}){return(0,i.jsx)(`div`,{"data-slot":`card-header`,className:r(`flex flex-col space-y-1.5 p-6`,e),...t})}function f({className:e,...t}){return(0,i.jsx)(`div`,{"data-slot":`card-title`,className:r(`font-semibold leading-none tracking-tight`,e),...t})}function p({className:e,...t}){return(0,i.jsx)(`div`,{"data-slot":`card-description`,className:r(`text-sm text-muted-foreground`,e),...t})}function m({className:e,...t}){return(0,i.jsx)(`div`,{"data-slot":`card-content`,className:r(`p-6 pt-0`,e),...t})}function h({className:e,...t}){return(0,i.jsx)(`div`,{"data-slot":`card-footer`,className:r(`flex items-center p-6 pt-0`,e),...t})}export{d as a,l as c,h as i,c as l,m as n,f as o,p as r,o as s,u as t,s as u};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Kn as e}from"./createServerFn-DHc2erub.js";var t=e(`chart-no-axes-combined`,[[`path`,{d:`M12 16v5`,key:`zza2cw`}],[`path`,{d:`M16 14v7`,key:`1g90b9`}],[`path`,{d:`M20 10v11`,key:`1iqoj0`}],[`path`,{d:`m22 3-8.646 8.646a.5.5 0 0 1-.708 0L9.354 8.354a.5.5 0 0 0-.707 0L2 15`,key:`1fw8x9`}],[`path`,{d:`M4 18v3`,key:`1yp0dc`}],[`path`,{d:`M8 14v7`,key:`n3cwzv`}]]);export{t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{An as e}from"./createServerFn-DHc2erub.js";var t=`ArrowUp`,n=`ArrowDown`,r=`ArrowLeft`,i=`ArrowRight`,a=`Home`,o=`PageUp`,s=`PageDown`,c=new Set([r,i]),l=new Set([r,i,a,`End`]),u=new Set([t,n]),d=new Set([t,n,a,`End`]),f=new Set([...c,...u]),p=new Set([...f,a,`End`]),m=new Set([`Shift`,`Control`,`Alt`,`Meta`]);function h(t){return e(t)&&t.tagName===`INPUT`}function g(t){return!!(h(t)&&t.selectionStart!=null||e(t)&&t.tagName===`TEXTAREA`)}function _(e,t,n,r){if(!e||!t||!t.scrollTo)return;let i=e.scrollLeft,a=e.scrollTop,o=e.clientWidth<e.scrollWidth,s=e.clientHeight<e.scrollHeight;if(o&&r!==`vertical`){let r=v(e,t,`left`),a=y(e),o=y(t);n===`ltr`&&(r+t.offsetWidth+o.scrollMarginRight>e.scrollLeft+e.clientWidth-a.scrollPaddingRight?i=r+t.offsetWidth+o.scrollMarginRight-e.clientWidth+a.scrollPaddingRight:r-o.scrollMarginLeft<e.scrollLeft+a.scrollPaddingLeft&&(i=r-o.scrollMarginLeft-a.scrollPaddingLeft)),n===`rtl`&&(r-o.scrollMarginRight<e.scrollLeft+a.scrollPaddingLeft?i=r-o.scrollMarginLeft-a.scrollPaddingLeft:r+t.offsetWidth+o.scrollMarginRight>e.scrollLeft+e.clientWidth-a.scrollPaddingRight&&(i=r+t.offsetWidth+o.scrollMarginRight-e.clientWidth+a.scrollPaddingRight))}if(s&&r!==`horizontal`){let n=v(e,t,`top`),r=y(e),i=y(t);n-i.scrollMarginTop<e.scrollTop+r.scrollPaddingTop?a=n-i.scrollMarginTop-r.scrollPaddingTop:n+t.offsetHeight+i.scrollMarginBottom>e.scrollTop+e.clientHeight-r.scrollPaddingBottom&&(a=n+t.offsetHeight+i.scrollMarginBottom-e.clientHeight+r.scrollPaddingBottom)}e.scrollTo({left:i,top:a,behavior:`auto`})}function v(e,t,n){let r=n===`left`?`offsetLeft`:`offsetTop`,i=0;for(;t.offsetParent&&(i+=t[r],t.offsetParent!==e);)t=t.offsetParent;return i}function y(e){let t=getComputedStyle(e);return{scrollMarginTop:parseFloat(t.scrollMarginTop)||0,scrollMarginRight:parseFloat(t.scrollMarginRight)||0,scrollMarginBottom:parseFloat(t.scrollMarginBottom)||0,scrollMarginLeft:parseFloat(t.scrollMarginLeft)||0,scrollPaddingTop:parseFloat(t.scrollPaddingTop)||0,scrollPaddingRight:parseFloat(t.scrollPaddingRight)||0,scrollPaddingBottom:parseFloat(t.scrollPaddingBottom)||0,scrollPaddingLeft:parseFloat(t.scrollPaddingLeft)||0}}export{t as a,c,s as d,o as f,_ as g,g as h,i,l,d as m,f as n,p as o,u as p,r,a as s,n as t,m as u};
|