@hot-updater/console 1.2.0-rc.0 → 1.2.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 (83) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/StoreSubmission-ViTkW4eJ.js +1 -0
  3. package/.output/public/assets/{index-PQ3UCeQV.js → index-CqP5HPV6.js} +2 -2
  4. package/.output/public/assets/{native-builds-c4BpOLAe.js → native-builds-D6rldpSh.js} +2 -2
  5. package/.output/public/assets/native-builds-DAy2678K.js +1 -0
  6. package/.output/public/assets/native-builds_._buildId-DD58_Phd.js +1 -0
  7. package/.output/public/assets/{native-builds_._buildId-9p4FFpa4.js → native-builds_._buildId-DvQDKnUQ.js} +2 -2
  8. package/.output/public/assets/{styles-Ccxthuz1.css → styles-uK-0vUMk.css} +1 -1
  9. package/.output/server/{__23tanstack-start-server-fn-resolver-nWkGzoo3.mjs → __23tanstack-start-server-fn-resolver-BcDgi7Q7.mjs} +46 -46
  10. package/.output/server/_libs/@tanstack/react-router-ssr-query+[...].mjs +1 -1
  11. package/.output/server/_ssr/{BundleIdDisplay-C2YJNpHa.mjs → BundleIdDisplay-ys5eRBiX.mjs} +2 -2
  12. package/.output/server/_ssr/{ConsoleFeatureUnavailable-Co4rDns4.mjs → ConsoleFeatureUnavailable-DFrogDwc.mjs} +6 -6
  13. package/.output/server/_ssr/{EventDetails-CTvni55k.mjs → EventDetails-BOJR7vO-.mjs} +6 -6
  14. package/.output/server/_ssr/{HashValueDisplay-BBswr65a.mjs → HashValueDisplay-d4OxpYG1.mjs} +2 -2
  15. package/.output/server/_ssr/{InsightsPageHeader-ueG4Pkov.mjs → InsightsPageHeader-D_ON_oXO.mjs} +6 -6
  16. package/.output/server/_ssr/{NotFoundPage-BES4AfvN.mjs → NotFoundPage-BJKqYxfO.mjs} +2 -2
  17. package/.output/server/_ssr/{RolloutPercentageBadge-Bkl0uDbV.mjs → RolloutPercentageBadge-BpI_iTsm.mjs} +3 -3
  18. package/.output/server/_ssr/{StoreSubmission-0TLWxjym.mjs → StoreSubmission-CXMFpHyp.mjs} +5 -5
  19. package/.output/server/_ssr/{alert-dialog-Cn0L__fU.mjs → alert-dialog-BU7QeAL9.mjs} +1 -1
  20. package/.output/server/_ssr/{api-qUMT9H2M.mjs → api-Dn2NwWiq.mjs} +3 -3
  21. package/.output/server/_ssr/{api-keys-Dt6_6uWi.mjs → api-keys-Ckoc4av7.mjs} +8 -8
  22. package/.output/server/_ssr/{api-keys-DgiwJvLW.mjs → api-keys-D5rW-eAH.mjs} +2 -2
  23. package/.output/server/_ssr/{api-keys-rpc-BqbL9Iyl.mjs → api-keys-rpc-Bf2x7mQb.mjs} +3 -3
  24. package/.output/server/_ssr/{api-rpc-CzZPviuV.mjs → api-rpc-Bg7CTu5A.mjs} +3 -3
  25. package/.output/server/_ssr/{auth-rpc-CPZyE2Rz.mjs → auth-rpc-C41fl9Q5.mjs} +4 -4
  26. package/.output/server/_ssr/{auth.server-C2hyK1tQ.mjs → auth.server-Dfa8DroN.mjs} +2 -2
  27. package/.output/server/_ssr/{badge-C4HK6j63.mjs → badge-B-YGm4ng.mjs} +1 -1
  28. package/.output/server/_ssr/{config.server-CwjEf3S5.mjs → config.server-DBX318ww.mjs} +3 -3
  29. package/.output/server/_ssr/{console-access-B2mUKj3_.mjs → console-access-CwSkUsOn.mjs} +2 -2
  30. package/.output/server/_ssr/{console-features-api-X8ItTwxM.mjs → console-features-api-BbojT91g.mjs} +5 -5
  31. package/.output/server/_ssr/{console-features-rpc-BRTvGLBV.mjs → console-features-rpc-3bq2wS5U.mjs} +3 -3
  32. package/.output/server/_ssr/{dialog-L9IrT3sY.mjs → dialog-RPz_4IaA.mjs} +1 -1
  33. package/.output/server/_ssr/{empty-CkTC2uZd.mjs → empty-BE1Gn6IB.mjs} +2 -2
  34. package/.output/server/_ssr/{field-W7Ikmzjb.mjs → field-DUwSBic5.mjs} +2 -2
  35. package/.output/server/_ssr/{input-group-BFnD9l_p.mjs → input-group-BHI0ziHT.mjs} +1 -1
  36. package/.output/server/_ssr/{insights-CtPYme4Q.mjs → insights-BGzKbtLf.mjs} +19 -19
  37. package/.output/server/_ssr/{insights-Dz42GlcZ.mjs → insights-DF0SkYDy.mjs} +2 -2
  38. package/.output/server/_ssr/{insights-C9KDOFcN.mjs → insights-DVvFyEOH.mjs} +5 -5
  39. package/.output/server/_ssr/{insights-api-Cuz8lmZx.mjs → insights-api-Bw_ZEDUY.mjs} +3 -3
  40. package/.output/server/_ssr/{insights-failures-rpc-CxI071Ew.mjs → insights-failures-rpc-BuRU2I5g.mjs} +4 -4
  41. package/.output/server/_ssr/{insights-recovery-rpc-B-9bs9Gz.mjs → insights-recovery-rpc-CsWe72mW.mjs} +3 -3
  42. package/.output/server/_ssr/{insights-rpc-5NfC16-Q.mjs → insights-rpc-CD5VaLy2.mjs} +3 -3
  43. package/.output/server/_ssr/{insights-search-CtQj0m7f.mjs → insights-search-C3R6mzW-.mjs} +2 -2
  44. package/.output/server/_ssr/{insights-usage-rpc-CFWx4_pK.mjs → insights-usage-rpc-Bbg14JFS.mjs} +3 -3
  45. package/.output/server/_ssr/{insights-usage-rpc-Qnyviyah.mjs → insights-usage-rpc-Duqu3q-H.mjs} +3 -3
  46. package/.output/server/_ssr/{insights_.distribution-CXItWbX1.mjs → insights_.distribution-DH_9B5XU.mjs} +13 -13
  47. package/.output/server/_ssr/{insights_.distribution-Czd0Jtle.mjs → insights_.distribution-DIA0Gi7f.mjs} +2 -2
  48. package/.output/server/_ssr/{insights_.distribution-BamrEztu.mjs → insights_.distribution-HZrwJteU.mjs} +5 -5
  49. package/.output/server/_ssr/{installations-Dy8zAJI_.mjs → installations-Ct7njvit.mjs} +4 -4
  50. package/.output/server/_ssr/{installations-BaHA_zCp.mjs → installations-D-O92-Nr.mjs} +2 -2
  51. package/.output/server/_ssr/{installations-Q6t6CEZ8.mjs → installations-SuuoQ-xH.mjs} +11 -11
  52. package/.output/server/_ssr/{native-builds-BWTUWJUF.mjs → native-builds-DhVG-4du.mjs} +2 -2
  53. package/.output/server/_ssr/{native-builds-Cuw87Y51.mjs → native-builds-bTSKsvYp.mjs} +23 -82
  54. package/.output/server/_ssr/{native-builds_._buildId-CbhHK93c.mjs → native-builds_._buildId-D20tGR3l.mjs} +50 -26
  55. package/.output/server/_ssr/{native-builds_._buildId-Dr3Mc32p.mjs → native-builds_._buildId-dDLkfNFZ.mjs} +2 -2
  56. package/.output/server/_ssr/{release-adoption-rpc-BHxQWHWw.mjs → release-adoption-rpc-Cc2AJ-yS.mjs} +5 -5
  57. package/.output/server/_ssr/{remote-config-CrVQfJ9y.mjs → remote-config-BYyQFBG8.mjs} +2 -2
  58. package/.output/server/_ssr/{remote-config-Bmh0t1FQ.mjs → remote-config-CTZ_zxNg.mjs} +17 -17
  59. package/.output/server/_ssr/{remote-config-DWlhe-Nu.mjs → remote-config-DvMHWxja.mjs} +2 -2
  60. package/.output/server/_ssr/{remote-config-rpc-BYJbiG9k.mjs → remote-config-rpc-DibiGuw7.mjs} +3 -3
  61. package/.output/server/_ssr/{router-Bg_TI2qP.mjs → router-Da0sMVN2.mjs} +54 -32
  62. package/.output/server/_ssr/{routes-Do9CHvbC.mjs → routes-CHl0_VK3.mjs} +17 -17
  63. package/.output/server/_ssr/{routes-fs827NQ-.mjs → routes-FE2SJgBr.mjs} +10 -10
  64. package/.output/server/_ssr/{schema-migration-rpc-vH6ZlJgo.mjs → schema-migration-rpc-Bh7oEZEG.mjs} +3 -3
  65. package/.output/server/_ssr/{select-BoRQ8ytA.mjs → select-BhPCNdHx.mjs} +1 -1
  66. package/.output/server/_ssr/{server-DtM4lJ0t.mjs → server-BjkQXKZR.mjs} +3 -3
  67. package/.output/server/_ssr/{sidebar-D1AgCVIN.mjs → sidebar-B7OTpt-8.mjs} +2 -2
  68. package/.output/server/_ssr/ssr.mjs +1 -1
  69. package/.output/server/_ssr/{switch-CY0ZEeD2.mjs → switch-CIkMfFrN.mjs} +2 -2
  70. package/.output/server/_ssr/{table-ClsVe-Mz.mjs → table-BIzH49v-.mjs} +1 -1
  71. package/.output/server/_ssr/{tabs-BJacHKeX.mjs → tabs-WDYlrXEm.mjs} +2 -2
  72. package/.output/server/{_tanstack-start-manifest_v-CF4kCd6q.mjs → _tanstack-start-manifest_v-B5nsO5L4.mjs} +9 -9
  73. package/.output/server/index.mjs +142 -142
  74. package/package.json +7 -7
  75. package/src/components/ConsoleAccessPage.tsx +36 -6
  76. package/src/components/features/native-builds/CopyableText.tsx +5 -2
  77. package/src/components/features/native-builds/ImportBuild.tsx +7 -31
  78. package/src/components/features/native-builds/InstallCard.tsx +47 -24
  79. package/src/components/features/native-builds/NativeBuildsTable.tsx +3 -5
  80. package/src/routes/api/native-builds/$buildId/download.ts +9 -4
  81. package/.output/public/assets/StoreSubmission-JpngSvHS.js +0 -1
  82. package/.output/public/assets/native-builds-BswZazmc.js +0 -1
  83. package/.output/public/assets/native-builds_._buildId-BRiNTN3j.js +0 -1
@@ -1,21 +1,21 @@
1
1
  import { i as __toESM } from "../_runtime.mjs";
2
2
  import { bt as require_react, yt as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
3
3
  import { B as Download, J as ChevronLeft, M as HardDrive, P as GitBranch, S as PackageOpen, W as CircleCheck, _ as RefreshCw, i as TriangleAlert, j as History, q as ChevronRight, tt as ArrowUpRight } from "../_libs/lucide-react.mjs";
4
- import { C as Skeleton, O as buttonVariants, S as SidebarTrigger, k as cn, t as Button$1 } from "./sidebar-D1AgCVIN.mjs";
4
+ import { C as Skeleton, O as buttonVariants, S as SidebarTrigger, k as cn, t as Button$1 } from "./sidebar-B7OTpt-8.mjs";
5
+ import { a as Badge, d as CardTitle, i as AlertTitle, n as AlertAction, o as Card, r as AlertDescription, s as CardContent, t as Alert, u as CardHeader } from "./badge-B-YGm4ng.mjs";
6
+ import { a as TableHeader, i as TableHead, n as TableBody, o as TableRow, r as TableCell, t as Table } from "./table-BIzH49v-.mjs";
5
7
  import { h as Link } from "../_libs/@tanstack/react-router+[...].mjs";
6
- import { a as EmptyMedia, i as EmptyHeader, n as EmptyContent, o as EmptyTitle, r as EmptyDescription, t as Empty } from "./empty-CkTC2uZd.mjs";
7
- import { a as Badge, d as CardTitle, i as AlertTitle, n as AlertAction, o as Card, r as AlertDescription, s as CardContent, t as Alert, u as CardHeader } from "./badge-C4HK6j63.mjs";
8
- import { a as TableHeader, i as TableHead, n as TableBody, o as TableRow, r as TableCell, t as Table } from "./table-ClsVe-Mz.mjs";
8
+ import { a as EmptyMedia, i as EmptyHeader, n as EmptyContent, o as EmptyTitle, r as EmptyDescription, t as Empty } from "./empty-BE1Gn6IB.mjs";
9
9
  import { i as NUMERIC_COHORT_SIZE } from "./dist-TEpM_UAD.mjs";
10
10
  import { c as nativeBuildFileName, d as platformLabel, i as nativeBuildArtifacts, p as simulatorInstallCommand, r as formatByteSize, s as nativeBuildDownloadPath, t as apkInstallCommand, u as nativeBuildTarget } from "./native-builds-DhXL5zf_.mjs";
11
11
  import { t as PlatformIcon } from "./PlatformIcon-CFLiTjh1.mjs";
12
- import { d as useNativeBuildPatchesQuery, l as useNativeBuildDetailQuery, u as useNativeBuildDownloadUrlQuery } from "./api-qUMT9H2M.mjs";
12
+ import { d as useNativeBuildPatchesQuery, l as useNativeBuildDetailQuery, u as useNativeBuildDownloadUrlQuery } from "./api-Dn2NwWiq.mjs";
13
13
  import { t as TimestampDisplay } from "./git-CTA8Aqr0.mjs";
14
- import { a as isSubmitted, i as StoreSubmissionBadge, n as CopyableText, r as ShortHash, t as CommitLink } from "./StoreSubmission-0TLWxjym.mjs";
14
+ import { a as isSubmitted, i as StoreSubmissionBadge, n as CopyableText, r as ShortHash, t as CommitLink } from "./StoreSubmission-CXMFpHyp.mjs";
15
15
  import { t as qrCodePath } from "./qr-code-C7kNRIDX.mjs";
16
- import { t as Route } from "./native-builds_._buildId-Dr3Mc32p.mjs";
17
- import { t as RolloutPercentageBadge } from "./RolloutPercentageBadge-Bkl0uDbV.mjs";
18
- //#region node_modules/.nitro/vite/services/ssr/assets/native-builds_._buildId-CbhHK93c.js
16
+ import { t as Route } from "./native-builds_._buildId-dDLkfNFZ.mjs";
17
+ import { t as RolloutPercentageBadge } from "./RolloutPercentageBadge-BpI_iTsm.mjs";
18
+ //#region node_modules/.nitro/vite/services/ssr/assets/native-builds_._buildId-D20tGR3l.js
19
19
  var import_react = /* @__PURE__ */ __toESM(require_react());
20
20
  var import_jsx_runtime = require_jsx_runtime();
21
21
  function Row({ label, children }) {
@@ -209,12 +209,23 @@ function QrCode({ value, label, className }) {
209
209
  })]
210
210
  });
211
211
  }
212
- /** What scanning a build's QR code gets, by its artifact. */
212
+ /**
213
+ * What an artifact installs on, where the file alone isn't enough: the card
214
+ * says it once, under the QR code, or without one, in its place.
215
+ */
216
+ var INSTALL_LIMITS = {
217
+ ipa: "The .ipa installs only on devices its signing profile allows (development or ad hoc); an App Store export reaches testers through TestFlight.",
218
+ aab: "The .aab installs through Google Play or bundletool, not from the file."
219
+ };
220
+ /**
221
+ * What scanning a build's QR code gets, by its artifact. The install steps
222
+ * beside it add only what this doesn't say, so the card says each thing once.
223
+ */
213
224
  var QR_CAPTIONS = {
214
225
  apk: "Scan with an Android phone's camera, then open the APK to install it.",
215
- ipa: "Scan to download the .ipa. It installs only on devices its signing profile allows (development or ad hoc); an App Store export reaches testers through TestFlight.",
216
- aab: "Scan to download the .aab. It installs through Google Play or bundletool, not from the file.",
217
- app: "Scan to download the .app.zip on a Mac, then install it on a simulator."
226
+ ipa: `Scan to download. ${INSTALL_LIMITS.ipa}`,
227
+ aab: `Scan to download. ${INSTALL_LIMITS.aab}`,
228
+ app: "Scan to download the .app.zip on a Mac."
218
229
  };
219
230
  /**
220
231
  * The QR code of the build's download: the storage's URL, which a phone
@@ -223,10 +234,13 @@ var QR_CAPTIONS = {
223
234
  function DownloadQrCode({ build }) {
224
235
  const downloadUrl = useNativeBuildDownloadUrlQuery(build.id, true);
225
236
  const url = downloadUrl.data?.url;
226
- if (url === null) return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
227
- className: "text-xs text-muted-foreground",
228
- children: "This storage gives no download link a phone can open without signing in, so there is no QR code. Download the build here, or open this page on the phone signed in to the console."
229
- });
237
+ if (url === null) {
238
+ const limits = INSTALL_LIMITS[build.artifact_kind];
239
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
240
+ className: "flex flex-col gap-2 text-xs text-muted-foreground",
241
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { children: "This storage gives no download link a phone can open without signing in, so there is no QR code. Download the build here, or open this page on the phone signed in to the console." }), limits ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { children: limits }) : null]
242
+ });
243
+ }
230
244
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
231
245
  className: "flex flex-col items-center gap-2",
232
246
  children: [url === void 0 ? downloadUrl.isError ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Alert, {
@@ -254,7 +268,10 @@ function SubmittedVersion({ build }) {
254
268
  children: build.submitted_version ?? "this build"
255
269
  });
256
270
  }
257
- /** How the artifact installs, beside its download. */
271
+ /**
272
+ * How else the artifact installs, beside its QR code's caption and its
273
+ * download: none of it repeats the caption.
274
+ */
258
275
  function InstallSteps({ build }) {
259
276
  switch (build.artifact_kind) {
260
277
  case "apk": return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
@@ -271,7 +288,7 @@ function InstallSteps({ build }) {
271
288
  className: "flex min-w-0 flex-col gap-2",
272
289
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
273
290
  className: "text-xs text-muted-foreground",
274
- children: "A simulator build runs only in the iOS Simulator. Download the archive, then install it on the booted simulator:"
291
+ children: "It runs only in the iOS Simulator. Install it on the booted one:"
275
292
  }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CopyableText, {
276
293
  label: "the install command",
277
294
  value: simulatorInstallCommand(build)
@@ -283,24 +300,30 @@ function InstallSteps({ build }) {
283
300
  "Submitted to Google Play internal testing as",
284
301
  " ",
285
302
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SubmittedVersion, { build }),
286
- ". Testers install it from Google Play once its release is rolled out; on an app Play Console hasn't published, the release is a draft you roll out in Play Console."
303
+ ". Testers get it once its release is rolled out; on an app Play Console hasn't published, the release is a draft you roll out in Play Console."
287
304
  ]
288
- }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
289
- className: "text-xs text-muted-foreground",
290
- children: "An AAB installs through Google Play or bundletool, not from a download."
305
+ }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
306
+ className: "flex min-w-0 flex-col gap-2",
307
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
308
+ className: "text-xs text-muted-foreground",
309
+ children: "For testers, build and release to internal testing:"
310
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CopyableText, {
311
+ label: "the Google Play command",
312
+ value: "npx hot-updater google-play upload"
313
+ })]
291
314
  });
292
315
  case "ipa": return isSubmitted(build) ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", {
293
316
  className: "text-xs text-muted-foreground",
294
317
  children: [
295
318
  "On TestFlight as ",
296
319
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SubmittedVersion, { build }),
297
- ": testers install it from TestFlight."
320
+ "."
298
321
  ]
299
322
  }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
300
323
  className: "flex min-w-0 flex-col gap-2",
301
324
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
302
325
  className: "text-xs text-muted-foreground",
303
- children: "An IPA installs on registered devices through Xcode or Apple Configurator. For testers, upload it to TestFlight:"
326
+ children: "Over USB, Xcode or Apple Configurator installs it. For testers:"
304
327
  }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CopyableText, {
305
328
  label: "the TestFlight command",
306
329
  value: "npx hot-updater testflight"
@@ -311,7 +334,8 @@ function InstallSteps({ build }) {
311
334
  /**
312
335
  * Installs one native build: every artifact by a QR code of its download,
313
336
  * which a phone scans, and by download here; an APK also with `adb`, a
314
- * simulator app with `xcrun simctl`, and an IPA's testers with TestFlight.
337
+ * simulator app with `xcrun simctl`, and an IPA's or an AAB's testers through
338
+ * its store.
315
339
  */
316
340
  function InstallCard({ build }) {
317
341
  const fileName = nativeBuildFileName(build);
@@ -1,7 +1,7 @@
1
1
  import { f as lazyRouteComponent, p as createFileRoute } from "../_libs/@tanstack/react-router+[...].mjs";
2
2
  import { t as validateNativeBuildDetailSearch } from "./-native-builds-search-CwNcoXf4.mjs";
3
- //#region node_modules/.nitro/vite/services/ssr/assets/native-builds_._buildId-Dr3Mc32p.js
4
- var $$splitComponentImporter = () => import("./native-builds_._buildId-CbhHK93c.mjs");
3
+ //#region node_modules/.nitro/vite/services/ssr/assets/native-builds_._buildId-dDLkfNFZ.js
4
+ var $$splitComponentImporter = () => import("./native-builds_._buildId-D20tGR3l.mjs");
5
5
  var Route = createFileRoute("/native-builds_/$buildId")({
6
6
  component: lazyRouteComponent($$splitComponentImporter, "component"),
7
7
  validateSearch: validateNativeBuildDetailSearch
@@ -1,15 +1,15 @@
1
1
  import { l as createServerFn } from "./createServerFn-AQvBMBjJ.mjs";
2
- import { t as consoleAccess } from "./console-access-B2mUKj3_.mjs";
2
+ import { t as consoleAccess } from "./console-access-CwSkUsOn.mjs";
3
3
  import { t as createServerRpc } from "./createServerRpc-BVvRVOz5.mjs";
4
4
  import { a as readAdoptionReleasesInput, i as readAdoptionReleaseInput, o as readBundleEventsInput } from "./release-adoption-DoAtNPED.mjs";
5
- //#region node_modules/.nitro/vite/services/ssr/assets/release-adoption-rpc-BHxQWHWw.js
5
+ //#region node_modules/.nitro/vite/services/ssr/assets/release-adoption-rpc-Cc2AJ-yS.js
6
6
  var listAdoptionReleasesRpc_createServerFn_handler = createServerRpc({
7
7
  id: "d11a48f7251928b7819e2376aed4902fa66277bf6d30312d87ca53468332f256",
8
8
  name: "listAdoptionReleasesRpc",
9
9
  filename: "src/lib/release-adoption-rpc.ts"
10
10
  }, (opts) => listAdoptionReleasesRpc.__executeServer(opts));
11
11
  var listAdoptionReleasesRpc = createServerFn({ method: "GET" }).middleware([consoleAccess]).validator(readAdoptionReleasesInput).handler(listAdoptionReleasesRpc_createServerFn_handler, async ({ data }) => {
12
- const [{ prepareConfig }, { listAdoptionReleases }] = await Promise.all([import("./config.server-CwjEf3S5.mjs"), import("./releaseAdoption-a2byXMfz.mjs")]);
12
+ const [{ prepareConfig }, { listAdoptionReleases }] = await Promise.all([import("./config.server-DBX318ww.mjs"), import("./releaseAdoption-a2byXMfz.mjs")]);
13
13
  const { core } = await prepareConfig();
14
14
  return listAdoptionReleases(core, data);
15
15
  });
@@ -19,7 +19,7 @@ var getAdoptionReleaseRpc_createServerFn_handler = createServerRpc({
19
19
  filename: "src/lib/release-adoption-rpc.ts"
20
20
  }, (opts) => getAdoptionReleaseRpc.__executeServer(opts));
21
21
  var getAdoptionReleaseRpc = createServerFn({ method: "GET" }).middleware([consoleAccess]).validator(readAdoptionReleaseInput).handler(getAdoptionReleaseRpc_createServerFn_handler, async ({ data }) => {
22
- const [{ prepareConfig }, { getAdoptionRelease }] = await Promise.all([import("./config.server-CwjEf3S5.mjs"), import("./releaseAdoption-a2byXMfz.mjs")]);
22
+ const [{ prepareConfig }, { getAdoptionRelease }] = await Promise.all([import("./config.server-DBX318ww.mjs"), import("./releaseAdoption-a2byXMfz.mjs")]);
23
23
  const { core } = await prepareConfig();
24
24
  return getAdoptionRelease(core, data);
25
25
  });
@@ -30,7 +30,7 @@ var getBundleEventsRpc_createServerFn_handler = createServerRpc({
30
30
  }, (opts) => getBundleEventsRpc.__executeServer(opts));
31
31
  var getBundleEventsRpc = createServerFn({ method: "GET" }).middleware([consoleAccess]).validator(readBundleEventsInput).handler(getBundleEventsRpc_createServerFn_handler, async ({ data }) => {
32
32
  const [{ prepareConfig }, { getBundleEvents }, { requireFeature }] = await Promise.all([
33
- import("./config.server-CwjEf3S5.mjs"),
33
+ import("./config.server-DBX318ww.mjs"),
34
34
  import("./releaseAdoption-a2byXMfz.mjs"),
35
35
  import("./runtime.server-BdMY1blX.mjs")
36
36
  ]);
@@ -1,6 +1,6 @@
1
1
  import { yt as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
2
- import { n as Route, t as RemoteConfigPage } from "./remote-config-Bmh0t1FQ.mjs";
3
- //#region node_modules/.nitro/vite/services/ssr/assets/remote-config-CrVQfJ9y.js
2
+ import { n as Route, t as RemoteConfigPage } from "./remote-config-CTZ_zxNg.mjs";
3
+ //#region node_modules/.nitro/vite/services/ssr/assets/remote-config-BYyQFBG8.js
4
4
  var import_jsx_runtime = require_jsx_runtime();
5
5
  function RemoteConfigRoute() {
6
6
  const { tab = "parameters" } = Route.useSearch();
@@ -1,28 +1,28 @@
1
1
  import { i as __toESM } from "../_runtime.mjs";
2
2
  import { l as createServerFn } from "./createServerFn-AQvBMBjJ.mjs";
3
+ import { t as consoleAccess } from "./console-access-CwSkUsOn.mjs";
3
4
  import { bt as require_react, n as Toggle, t as ToggleGroup, yt as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
4
5
  import { $ as Braces, D as LoaderCircle, H as Clipboard, P as GitBranch, R as Eye, _ as RefreshCw, a as Trash2, at as ArrowDown, d as SlidersHorizontal, et as ArrowUp, g as RotateCcw, i as TriangleAlert, j as History, m as Search, n as Upload, nt as ArrowRight, r as Undo2, t as X, u as Smartphone, v as Plus, y as Pencil } from "../_libs/lucide-react.mjs";
5
6
  import { t as cva } from "../_libs/class-variance-authority+clsx.mjs";
6
- import { A as createSsrRpc, C as Skeleton, S as SidebarTrigger, k as cn, n as Input, t as Button$1 } from "./sidebar-D1AgCVIN.mjs";
7
- import { t as consoleAccess } from "./console-access-B2mUKj3_.mjs";
8
- import { f as lazyRouteComponent, p as createFileRoute } from "../_libs/@tanstack/react-router+[...].mjs";
7
+ import { A as createSsrRpc, C as Skeleton, S as SidebarTrigger, k as cn, n as Input, t as Button$1 } from "./sidebar-B7OTpt-8.mjs";
8
+ import { a as Badge, c as CardDescription, d as CardTitle, i as AlertTitle, n as AlertAction, o as Card, r as AlertDescription, s as CardContent, t as Alert, u as CardHeader } from "./badge-B-YGm4ng.mjs";
9
+ import { a as AlertDialogDescription, i as AlertDialogContent, l as AlertDialogTitle, n as AlertDialogAction, o as AlertDialogFooter, r as AlertDialogCancel, s as AlertDialogHeader, t as AlertDialog$1 } from "./alert-dialog-BU7QeAL9.mjs";
10
+ import { a as DialogHeader, i as DialogFooter, n as DialogContent, o as DialogTitle, r as DialogDescription, t as Dialog$1 } from "./dialog-RPz_4IaA.mjs";
11
+ import { a as FieldLabel, i as FieldGroup, n as FieldDescription, o as FieldLegend, r as FieldError, s as FieldSet, t as Field } from "./field-DUwSBic5.mjs";
9
12
  import { i as useQuery, n as useMutation, s as useQueryClient, t as useInfiniteQuery } from "../_libs/tanstack__react-query.mjs";
10
13
  import { l as keepPreviousData } from "../_libs/tanstack__query-core.mjs";
11
- import { r as requireConsoleFeature } from "./console-features-api-X8ItTwxM.mjs";
12
- import { a as EmptyMedia, i as EmptyHeader, n as EmptyContent, o as EmptyTitle, r as EmptyDescription, t as Empty } from "./empty-CkTC2uZd.mjs";
13
- import { a as Badge, c as CardDescription, d as CardTitle, i as AlertTitle, n as AlertAction, o as Card, r as AlertDescription, s as CardContent, t as Alert, u as CardHeader } from "./badge-C4HK6j63.mjs";
14
- import { a as AlertDialogDescription, i as AlertDialogContent, l as AlertDialogTitle, n as AlertDialogAction, o as AlertDialogFooter, r as AlertDialogCancel, s as AlertDialogHeader, t as AlertDialog$1 } from "./alert-dialog-Cn0L__fU.mjs";
15
- import { a as DialogHeader, i as DialogFooter, n as DialogContent, o as DialogTitle, r as DialogDescription, t as Dialog$1 } from "./dialog-L9IrT3sY.mjs";
16
- import { a as FieldLabel, i as FieldGroup, n as FieldDescription, o as FieldLegend, r as FieldError, s as FieldSet, t as Field } from "./field-W7Ikmzjb.mjs";
17
14
  import { n as toast } from "../_libs/sonner.mjs";
18
- import { i as TabsTrigger, n as TabsContent, r as TabsList, t as Tabs$1 } from "./tabs-BJacHKeX.mjs";
15
+ import { f as lazyRouteComponent, p as createFileRoute } from "../_libs/@tanstack/react-router+[...].mjs";
16
+ import { r as requireConsoleFeature } from "./console-features-api-BbojT91g.mjs";
17
+ import { a as EmptyMedia, i as EmptyHeader, n as EmptyContent, o as EmptyTitle, r as EmptyDescription, t as Empty } from "./empty-BE1Gn6IB.mjs";
18
+ import { i as TabsTrigger, n as TabsContent, r as TabsList, t as Tabs$1 } from "./tabs-WDYlrXEm.mjs";
19
19
  import { t as PlatformIcon } from "./PlatformIcon-CFLiTjh1.mjs";
20
- import { i as InputGroupInput, n as InputGroupAddon, o as Textarea, r as InputGroupButton, t as InputGroup } from "./input-group-BFnD9l_p.mjs";
21
- import { a as SelectTrigger, i as SelectItem, n as SelectContent, o as SelectValue, r as SelectGroup, t as Select$1 } from "./select-BoRQ8ytA.mjs";
22
- import { i as useChannelsQuery } from "./api-qUMT9H2M.mjs";
20
+ import { i as InputGroupInput, n as InputGroupAddon, o as Textarea, r as InputGroupButton, t as InputGroup } from "./input-group-BHI0ziHT.mjs";
21
+ import { a as SelectTrigger, i as SelectItem, n as SelectContent, o as SelectValue, r as SelectGroup, t as Select$1 } from "./select-BhPCNdHx.mjs";
22
+ import { i as useChannelsQuery } from "./api-Dn2NwWiq.mjs";
23
23
  import { n as require_dayjs_min, t as require_relativeTime } from "../_libs/dayjs.mjs";
24
- import { n as useDialogTarget, r as useOpenSession, t as Switch$1 } from "./switch-CY0ZEeD2.mjs";
25
- //#region node_modules/.nitro/vite/services/ssr/assets/remote-config-Bmh0t1FQ.js
24
+ import { n as useDialogTarget, r as useOpenSession, t as Switch$1 } from "./switch-CIkMfFrN.mjs";
25
+ //#region node_modules/.nitro/vite/services/ssr/assets/remote-config-CTZ_zxNg.js
26
26
  var import_react = /* @__PURE__ */ __toESM(require_react());
27
27
  var import_jsx_runtime = require_jsx_runtime();
28
28
  var import_dayjs_min = /* @__PURE__ */ __toESM(require_dayjs_min());
@@ -2638,8 +2638,8 @@ function RemoteConfigPage({ tab, onTabChange }) {
2638
2638
  ]
2639
2639
  });
2640
2640
  }
2641
- var $$splitComponentImporter = () => import("./remote-config-CrVQfJ9y.mjs");
2642
- var $$splitNotFoundComponentImporter = () => import("./remote-config-DWlhe-Nu.mjs");
2641
+ var $$splitComponentImporter = () => import("./remote-config-BYyQFBG8.mjs");
2642
+ var $$splitNotFoundComponentImporter = () => import("./remote-config-DvMHWxja.mjs");
2643
2643
  var Route = createFileRoute("/remote-config")({
2644
2644
  beforeLoad: ({ context }) => requireConsoleFeature(context.queryClient, "remoteConfig"),
2645
2645
  notFoundComponent: lazyRouteComponent($$splitNotFoundComponentImporter, "notFoundComponent"),
@@ -1,5 +1,5 @@
1
- import { t as ConsoleFeatureUnavailable } from "./ConsoleFeatureUnavailable-Co4rDns4.mjs";
2
- //#region node_modules/.nitro/vite/services/ssr/assets/remote-config-DWlhe-Nu.js
1
+ import { t as ConsoleFeatureUnavailable } from "./ConsoleFeatureUnavailable-DFrogDwc.mjs";
2
+ //#region node_modules/.nitro/vite/services/ssr/assets/remote-config-DvMHWxja.js
3
3
  var SplitNotFoundComponent = ConsoleFeatureUnavailable;
4
4
  //#endregion
5
5
  export { SplitNotFoundComponent as notFoundComponent };
@@ -1,10 +1,10 @@
1
1
  import { l as createServerFn } from "./createServerFn-AQvBMBjJ.mjs";
2
- import { t as consoleAccess } from "./console-access-B2mUKj3_.mjs";
2
+ import { t as consoleAccess } from "./console-access-CwSkUsOn.mjs";
3
3
  import { t as createServerRpc } from "./createServerRpc-BVvRVOz5.mjs";
4
- //#region node_modules/.nitro/vite/services/ssr/assets/remote-config-rpc-BYJbiG9k.js
4
+ //#region node_modules/.nitro/vite/services/ssr/assets/remote-config-rpc-DibiGuw7.js
5
5
  /** Remote Config, once the console's access check and the feature guard pass. */
6
6
  var remoteConfig = async () => {
7
- const [{ prepareConfig }, { requireFeature }] = await Promise.all([import("./config.server-CwjEf3S5.mjs"), import("./runtime.server-BdMY1blX.mjs")]);
7
+ const [{ prepareConfig }, { requireFeature }] = await Promise.all([import("./config.server-DBX318ww.mjs"), import("./runtime.server-BdMY1blX.mjs")]);
8
8
  const { runtime } = await prepareConfig();
9
9
  return requireFeature(runtime, "remoteConfig");
10
10
  };
@@ -1,26 +1,26 @@
1
1
  import { i as __toESM } from "../_runtime.mjs";
2
2
  import { l as createServerFn } from "./createServerFn-AQvBMBjJ.mjs";
3
+ import { t as consoleAccess } from "./console-access-CwSkUsOn.mjs";
3
4
  import { bt as require_react, yt as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
4
5
  import { A as Info, C as OctagonX, D as LoaderCircle, E as LogOut, M as HardDrive, V as Copy, W as CircleCheck, c as Sun, h as RotateCw, i as TriangleAlert, tt as ArrowUpRight, w as Moon, x as Package } from "../_libs/lucide-react.mjs";
5
- import { A as createSsrRpc, E as TooltipProvider, M as useSidebar, O as buttonVariants, S as SidebarTrigger, _ as SidebarInset, b as SidebarMenuItem, d as SidebarContent, f as SidebarFooter, g as SidebarHeader, h as SidebarGroupLabel, m as SidebarGroupContent, p as SidebarGroup, t as Button$1, u as Sidebar, v as SidebarMenu, x as SidebarProvider, y as SidebarMenuButton } from "./sidebar-D1AgCVIN.mjs";
6
- import { t as consoleAccess } from "./console-access-B2mUKj3_.mjs";
7
- import { a as HeadContent, d as Outlet, f as lazyRouteComponent, h as Link, i as Scripts, m as createRootRouteWithContext, p as createFileRoute, s as useRouterState, u as createRouter } from "../_libs/@tanstack/react-router+[...].mjs";
6
+ import { A as createSsrRpc, E as TooltipProvider, M as useSidebar, O as buttonVariants, S as SidebarTrigger, _ as SidebarInset, b as SidebarMenuItem, d as SidebarContent, f as SidebarFooter, g as SidebarHeader, h as SidebarGroupLabel, m as SidebarGroupContent, p as SidebarGroup, t as Button$1, u as Sidebar, v as SidebarMenu, x as SidebarProvider, y as SidebarMenuButton } from "./sidebar-B7OTpt-8.mjs";
8
7
  import { i as useQuery, r as queryOptions, s as useQueryClient } from "../_libs/tanstack__react-query.mjs";
9
8
  import { t as QueryClient } from "../_libs/tanstack__query-core.mjs";
10
- import { r as requireConsoleFeature, t as consoleFeaturesQueryOptions } from "./console-features-api-X8ItTwxM.mjs";
11
- import { t as NotFoundPage } from "./NotFoundPage-BES4AfvN.mjs";
12
- import { i as EmptyHeader, n as EmptyContent, o as EmptyTitle, r as EmptyDescription, t as Empty } from "./empty-CkTC2uZd.mjs";
13
9
  import { n as toast, t as Toaster } from "../_libs/sonner.mjs";
14
- import { t as Route$6 } from "./insights-C9KDOFcN.mjs";
15
- import { t as Route$7 } from "./insights_.distribution-BamrEztu.mjs";
16
- import { n as Route$8 } from "./installations-Dy8zAJI_.mjs";
17
- import { t as Route$9 } from "./native-builds-BWTUWJUF.mjs";
18
- import { t as Route$10 } from "./native-builds_._buildId-Dr3Mc32p.mjs";
19
- import { n as Route$11 } from "./remote-config-Bmh0t1FQ.mjs";
20
- import { n as Route$12, o as useFeatureUi } from "./routes-fs827NQ-.mjs";
10
+ import { a as HeadContent, d as Outlet, f as lazyRouteComponent, h as Link, i as Scripts, m as createRootRouteWithContext, p as createFileRoute, s as useRouterState, u as createRouter } from "../_libs/@tanstack/react-router+[...].mjs";
11
+ import { r as requireConsoleFeature, t as consoleFeaturesQueryOptions } from "./console-features-api-BbojT91g.mjs";
12
+ import { t as NotFoundPage } from "./NotFoundPage-BJKqYxfO.mjs";
13
+ import { i as EmptyHeader, n as EmptyContent, o as EmptyTitle, r as EmptyDescription, t as Empty } from "./empty-BE1Gn6IB.mjs";
14
+ import { t as Route$6 } from "./insights-DVvFyEOH.mjs";
15
+ import { t as Route$7 } from "./insights_.distribution-HZrwJteU.mjs";
16
+ import { n as Route$8 } from "./installations-Ct7njvit.mjs";
17
+ import { t as Route$9 } from "./native-builds-DhVG-4du.mjs";
18
+ import { t as Route$10 } from "./native-builds_._buildId-dDLkfNFZ.mjs";
19
+ import { n as Route$11 } from "./remote-config-CTZ_zxNg.mjs";
20
+ import { n as Route$12, o as useFeatureUi } from "./routes-FE2SJgBr.mjs";
21
21
  import { t as setupRouterSsrQueryIntegration } from "../_libs/@tanstack/react-router-ssr-query+[...].mjs";
22
22
  import { t as z } from "../_libs/next-themes.mjs";
23
- //#region node_modules/.nitro/vite/services/ssr/assets/router-Bg_TI2qP.js
23
+ //#region node_modules/.nitro/vite/services/ssr/assets/router-Da0sMVN2.js
24
24
  var import_react = /* @__PURE__ */ __toESM(require_react());
25
25
  var import_jsx_runtime = require_jsx_runtime();
26
26
  function HotUpdaterLogo({ className }) {
@@ -238,18 +238,36 @@ var providerLabel = {
238
238
  github: "GitHub",
239
239
  google: "Google"
240
240
  };
241
+ /** A path on this console, or the root for anything that could leave it. */
242
+ var consolePath = (target) => target.startsWith("/") && !/^\/[/\\]/.test(target) ? target : "/";
241
243
  /**
242
244
  * Where sign-in returns to: the page that asked for it, as a path on this
243
- * console, so a link to a build lands on that build. Anything that could
244
- * leave the console, such as `//host` or `/\host`, returns to the root.
245
+ * console, so a link to a build lands on that build. A page a route sent
246
+ * here names its own target in `returnTo`, relative to the page, as the
247
+ * native build download does: sign-in returns there instead, when it is on
248
+ * this console's origin. Anything that could leave the console, such as
249
+ * `//host` or `/\host`, returns to the page, or to the root.
245
250
  */
246
251
  var signInCallbackURL = (location) => {
247
- const target = `${location.pathname}${location.search}`;
248
- return target.startsWith("/") && !/^\/[/\\]/.test(target) ? target : "/";
252
+ const page = consolePath(`${location.pathname}${location.search}`);
253
+ const returnTo = new URLSearchParams(location.search).get("returnTo");
254
+ if (returnTo === null) return page;
255
+ try {
256
+ const target = new URL(returnTo, location.href);
257
+ return target.origin === new URL(location.href).origin ? consolePath(`${target.pathname}${target.search}`) : page;
258
+ } catch {
259
+ return page;
260
+ }
249
261
  };
262
+ /** Whether sign-in returns to a native build's download. */
263
+ var returnsToDownload = (callbackURL) => /\/api\/native-builds\/[^/]+\/download$/.test(callbackURL);
250
264
  function ConsoleAccessPage({ access, providers }) {
251
265
  const [pendingProvider, setPendingProvider] = (0, import_react.useState)(null);
252
266
  const [signingOut, setSigningOut] = (0, import_react.useState)(false);
267
+ const [downloadAfterSignIn, setDownloadAfterSignIn] = (0, import_react.useState)(false);
268
+ (0, import_react.useEffect)(() => {
269
+ setDownloadAfterSignIn(returnsToDownload(signInCallbackURL(window.location)));
270
+ }, []);
253
271
  const [error, setError] = (0, import_react.useState)(null);
254
272
  const signIn = async (provider) => {
255
273
  setPendingProvider(provider);
@@ -298,7 +316,7 @@ function ConsoleAccessPage({ access, providers }) {
298
316
  children: "Hot Updater Console"
299
317
  }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
300
318
  className: "text-muted-foreground text-sm",
301
- children: "Sign in to manage OTA bundles."
319
+ children: downloadAfterSignIn ? "Sign in to download the build. It starts once you're in." : "Sign in to manage OTA bundles."
302
320
  })] })]
303
321
  }),
304
322
  access.status === "forbidden" ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
@@ -513,7 +531,7 @@ var useSchemaMigration = () => {
513
531
  retry
514
532
  };
515
533
  };
516
- var styles_default = "/assets/styles-Ccxthuz1.css";
534
+ var styles_default = "/assets/styles-uK-0vUMk.css";
517
535
  var Route$5 = createRootRouteWithContext()({
518
536
  head: () => ({
519
537
  meta: [
@@ -590,8 +608,8 @@ function AuthorizedConsole({ canSignOut }) {
590
608
  }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Outlet, {})
591
609
  })] });
592
610
  }
593
- var $$splitComponentImporter = () => import("./api-keys-Dt6_6uWi.mjs");
594
- var $$splitNotFoundComponentImporter = () => import("./api-keys-DgiwJvLW.mjs");
611
+ var $$splitComponentImporter = () => import("./api-keys-Ckoc4av7.mjs");
612
+ var $$splitNotFoundComponentImporter = () => import("./api-keys-D5rW-eAH.mjs");
595
613
  var Route$4 = createFileRoute("/api-keys")({
596
614
  beforeLoad: ({ context }) => requireConsoleFeature(context.queryClient, "apiKeys"),
597
615
  notFoundComponent: lazyRouteComponent($$splitNotFoundComponentImporter, "notFoundComponent"),
@@ -603,7 +621,7 @@ var handle = async ({ request }) => {
603
621
  };
604
622
  var Route$3 = createFileRoute("/_hot-updater/native-builds/qr")({ server: { handlers: { ANY: handle } } });
605
623
  var handleAuthRequest = async ({ request }) => {
606
- const { handleConsoleAuth } = await import("./auth.server-C2hyK1tQ.mjs");
624
+ const { handleConsoleAuth } = await import("./auth.server-Dfa8DroN.mjs");
607
625
  return handleConsoleAuth(request);
608
626
  };
609
627
  var Route$2 = createFileRoute("/api/auth/$")({ server: { handlers: {
@@ -611,7 +629,7 @@ var Route$2 = createFileRoute("/api/auth/$")({ server: { handlers: {
611
629
  POST: handleAuthRequest
612
630
  } } });
613
631
  var Route$1 = createFileRoute("/api/bundles/$bundleId/download")({ server: { handlers: { GET: async ({ params, request }) => {
614
- const { prepareConfig } = await import("./config.server-CwjEf3S5.mjs");
632
+ const { prepareConfig } = await import("./config.server-DBX318ww.mjs");
615
633
  const { downloadBundle } = await import("./downloadBundle-DCmr7vsj.mjs");
616
634
  const { core, storage } = await prepareConfig(request);
617
635
  return downloadBundle(params.bundleId, {
@@ -625,19 +643,23 @@ var Route$1 = createFileRoute("/api/bundles/$bundleId/download")({ server: { han
625
643
  */
626
644
  var isNavigation = (request) => request.headers.get("sec-fetch-mode") === "navigate" || (request.headers.get("accept") ?? "").includes("text/html");
627
645
  var Route = createFileRoute("/api/native-builds/$buildId/download")({ server: { handlers: { GET: async ({ params, request }) => {
628
- const { prepareConfig } = await import("./config.server-CwjEf3S5.mjs");
646
+ const { prepareConfig } = await import("./config.server-DBX318ww.mjs");
629
647
  const { downloadNativeBuild } = await import("./nativeBuilds-B_7BPjt_.mjs");
630
648
  let deps;
631
649
  try {
632
650
  deps = await prepareConfig(request);
633
651
  } catch (error) {
634
- if (error instanceof Response && error.status === 401 && isNavigation(request)) return new Response(null, {
635
- headers: {
636
- "cache-control": "no-store",
637
- location: `../../../native-builds/${encodeURIComponent(params.buildId)}`
638
- },
639
- status: 302
640
- });
652
+ if (error instanceof Response && error.status === 401 && isNavigation(request)) {
653
+ const buildId = encodeURIComponent(params.buildId);
654
+ const returnTo = encodeURIComponent(`../api/native-builds/${buildId}/download`);
655
+ return new Response(null, {
656
+ headers: {
657
+ "cache-control": "no-store",
658
+ location: `../../../native-builds/${buildId}?returnTo=${returnTo}`
659
+ },
660
+ status: 302
661
+ });
662
+ }
641
663
  throw error;
642
664
  }
643
665
  return downloadNativeBuild(params.buildId, deps);
@@ -1,29 +1,29 @@
1
1
  import { i as __toESM } from "../_runtime.mjs";
2
2
  import { a as SliderIndicator, bt as require_react, c as SliderControl, l as SliderRoot, o as SliderThumb, s as SliderTrack, yt as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
3
3
  import { B as Download, D as LoaderCircle, F as Funnel, I as FingerprintPattern, J as ChevronLeft, O as List, T as Minus, U as CircleOff, X as Check, Y as ChevronDown, a as Trash2, g as RotateCcw, i as TriangleAlert, nt as ArrowRight, o as Tags, q as ChevronRight, s as Tag, t as X, tt as ArrowUpRight, v as Plus, x as Package, z as ExternalLink } from "../_libs/lucide-react.mjs";
4
- import { C as Skeleton, O as buttonVariants, S as SidebarTrigger, a as SheetContent, c as SheetTitle, i as Sheet, j as useIsMobile, k as cn, n as Input, o as SheetDescription, r as Separator$1, s as SheetHeader, t as Button$1 } from "./sidebar-D1AgCVIN.mjs";
5
- import { h as Link } from "../_libs/@tanstack/react-router+[...].mjs";
6
- import { a as Badge, c as CardDescription, d as CardTitle, i as AlertTitle, o as Card, r as AlertDescription, s as CardContent, t as Alert, u as CardHeader } from "./badge-C4HK6j63.mjs";
7
- import { a as AlertDialogDescription, i as AlertDialogContent, l as AlertDialogTitle, n as AlertDialogAction, o as AlertDialogFooter, r as AlertDialogCancel, s as AlertDialogHeader, t as AlertDialog$1 } from "./alert-dialog-Cn0L__fU.mjs";
8
- import { a as DialogHeader, i as DialogFooter, n as DialogContent, o as DialogTitle, r as DialogDescription, s as DialogTrigger, t as Dialog$1 } from "./dialog-L9IrT3sY.mjs";
9
- import { a as FieldLabel, c as Label, i as FieldGroup, n as FieldDescription, r as FieldError, t as Field } from "./field-W7Ikmzjb.mjs";
10
- import { a as TableHeader, i as TableHead, n as TableBody, o as TableRow, r as TableCell, t as Table } from "./table-ClsVe-Mz.mjs";
4
+ import { C as Skeleton, O as buttonVariants, S as SidebarTrigger, a as SheetContent, c as SheetTitle, i as Sheet, j as useIsMobile, k as cn, n as Input, o as SheetDescription, r as Separator$1, s as SheetHeader, t as Button$1 } from "./sidebar-B7OTpt-8.mjs";
5
+ import { a as Badge, c as CardDescription, d as CardTitle, i as AlertTitle, o as Card, r as AlertDescription, s as CardContent, t as Alert, u as CardHeader } from "./badge-B-YGm4ng.mjs";
6
+ import { a as AlertDialogDescription, i as AlertDialogContent, l as AlertDialogTitle, n as AlertDialogAction, o as AlertDialogFooter, r as AlertDialogCancel, s as AlertDialogHeader, t as AlertDialog$1 } from "./alert-dialog-BU7QeAL9.mjs";
7
+ import { a as DialogHeader, i as DialogFooter, n as DialogContent, o as DialogTitle, r as DialogDescription, s as DialogTrigger, t as Dialog$1 } from "./dialog-RPz_4IaA.mjs";
8
+ import { a as FieldLabel, c as Label, i as FieldGroup, n as FieldDescription, r as FieldError, t as Field } from "./field-DUwSBic5.mjs";
9
+ import { a as TableHeader, i as TableHead, n as TableBody, o as TableRow, r as TableCell, t as Table } from "./table-BIzH49v-.mjs";
11
10
  import { n as toast } from "../_libs/sonner.mjs";
11
+ import { h as Link } from "../_libs/@tanstack/react-router+[...].mjs";
12
12
  import { D as normalizeRolloutCohortCount, E as normalizeCohortValue, T as isValidCohort, b as getPatchFileHash, g as getNumericCohortRolloutPosition, i as NUMERIC_COHORT_SIZE, t as INVALID_COHORT_ERROR_MESSAGE, v as getPatchBaseBundleId, y as getPatchBaseFileHash } from "./dist-TEpM_UAD.mjs";
13
13
  import { d as platformLabel, f as releaseNativeBuildScope, i as nativeBuildArtifacts } from "./native-builds-DhXL5zf_.mjs";
14
14
  import { n as normalizeRange } from "../_libs/verkit.mjs";
15
- import { n as InfoTooltip } from "./insights-search-CtQj0m7f.mjs";
15
+ import { n as InfoTooltip } from "./insights-search-C3R6mzW-.mjs";
16
16
  import { t as PlatformIcon } from "./PlatformIcon-CFLiTjh1.mjs";
17
- import { a as InputGroupText, i as InputGroupInput, n as InputGroupAddon, o as Textarea, t as InputGroup } from "./input-group-BFnD9l_p.mjs";
18
- import { a as SelectTrigger, i as SelectItem, n as SelectContent, o as SelectValue, r as SelectGroup, t as Select$1 } from "./select-BoRQ8ytA.mjs";
19
- import { _ as useReleaseQuery, a as useConfigQuery, c as useDeleteReleaseMutation, g as useReleaseNativeBuildQuery, h as useReleaseCatalogDiagnosticsQuery, i as useChannelsQuery, m as usePromoteReleaseMutation, n as useBundleChildrenQuery, o as useCreateChannelMutation, p as usePreflightReleaseMutation, r as useBundleQuery, s as useDeleteChannelMutation, t as useBundleChildCountsQuery, v as useReleasesQuery, y as useUpdateReleaseMutation } from "./api-qUMT9H2M.mjs";
20
- import { t as BundleIdDisplay } from "./BundleIdDisplay-C2YJNpHa.mjs";
21
- import { t as HashValueDisplay } from "./HashValueDisplay-BBswr65a.mjs";
17
+ import { a as InputGroupText, i as InputGroupInput, n as InputGroupAddon, o as Textarea, t as InputGroup } from "./input-group-BHI0ziHT.mjs";
18
+ import { a as SelectTrigger, i as SelectItem, n as SelectContent, o as SelectValue, r as SelectGroup, t as Select$1 } from "./select-BhPCNdHx.mjs";
19
+ import { _ as useReleaseQuery, a as useConfigQuery, c as useDeleteReleaseMutation, g as useReleaseNativeBuildQuery, h as useReleaseCatalogDiagnosticsQuery, i as useChannelsQuery, m as usePromoteReleaseMutation, n as useBundleChildrenQuery, o as useCreateChannelMutation, p as usePreflightReleaseMutation, r as useBundleQuery, s as useDeleteChannelMutation, t as useBundleChildCountsQuery, v as useReleasesQuery, y as useUpdateReleaseMutation } from "./api-Dn2NwWiq.mjs";
20
+ import { t as BundleIdDisplay } from "./BundleIdDisplay-ys5eRBiX.mjs";
21
+ import { t as HashValueDisplay } from "./HashValueDisplay-d4OxpYG1.mjs";
22
22
  import { n as getCommitUrl, t as TimestampDisplay } from "./git-CTA8Aqr0.mjs";
23
- import { t as RolloutPercentageBadge } from "./RolloutPercentageBadge-Bkl0uDbV.mjs";
24
- import { n as useDialogTarget, t as Switch$1 } from "./switch-CY0ZEeD2.mjs";
25
- import { a as updateReleaseFilters, i as releaseFilterOf, n as Route, r as hasReleaseFilters, s as useReleaseColumns, t as ReleaseSections } from "./routes-fs827NQ-.mjs";
26
- //#region node_modules/.nitro/vite/services/ssr/assets/routes-Do9CHvbC.js
23
+ import { t as RolloutPercentageBadge } from "./RolloutPercentageBadge-BpI_iTsm.mjs";
24
+ import { n as useDialogTarget, t as Switch$1 } from "./switch-CIkMfFrN.mjs";
25
+ import { a as updateReleaseFilters, i as releaseFilterOf, n as Route, r as hasReleaseFilters, s as useReleaseColumns, t as ReleaseSections } from "./routes-FE2SJgBr.mjs";
26
+ //#region node_modules/.nitro/vite/services/ssr/assets/routes-CHl0_VK3.js
27
27
  var import_react = /* @__PURE__ */ __toESM(require_react());
28
28
  var import_jsx_runtime = require_jsx_runtime();
29
29
  var channelColors = {
@@ -1,18 +1,18 @@
1
- import { n as consoleFeatures } from "./console-features-BTV-XuhQ.mjs";
2
1
  import { l as createServerFn } from "./createServerFn-AQvBMBjJ.mjs";
2
+ import { t as consoleAccess } from "./console-access-CwSkUsOn.mjs";
3
3
  import { yt as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
4
4
  import { Q as ChartLine, Z as ChartNoAxesCombined, d as SlidersHorizontal, k as KeyRound } from "../_libs/lucide-react.mjs";
5
- import { A as createSsrRpc, C as Skeleton, O as buttonVariants, k as cn, r as Separator$1 } from "./sidebar-D1AgCVIN.mjs";
6
- import { t as consoleAccess } from "./console-access-B2mUKj3_.mjs";
7
- import { f as lazyRouteComponent, h as Link, p as createFileRoute } from "../_libs/@tanstack/react-router+[...].mjs";
5
+ import { A as createSsrRpc, C as Skeleton, O as buttonVariants, k as cn, r as Separator$1 } from "./sidebar-B7OTpt-8.mjs";
6
+ import { d as CardTitle, l as CardFooter, o as Card, s as CardContent, u as CardHeader } from "./badge-B-YGm4ng.mjs";
8
7
  import { i as useQuery } from "../_libs/tanstack__react-query.mjs";
9
- import { a as useConsoleFeatures, i as useConsoleFeature } from "./console-features-api-X8ItTwxM.mjs";
10
- import { d as CardTitle, l as CardFooter, o as Card, s as CardContent, u as CardHeader } from "./badge-C4HK6j63.mjs";
8
+ import { n as consoleFeatures } from "./console-features-BTV-XuhQ.mjs";
9
+ import { f as lazyRouteComponent, h as Link, p as createFileRoute } from "../_libs/@tanstack/react-router+[...].mjs";
10
+ import { a as useConsoleFeatures, i as useConsoleFeature } from "./console-features-api-BbojT91g.mjs";
11
11
  import { n as readRecoveryInput } from "./insights-recovery-BtXVU3ro.mjs";
12
12
  import { i as failureRate, s as formatRate } from "./insights-failures-B9VPkzZE.mjs";
13
- import { n as InfoTooltip, r as adoptionWindow } from "./insights-search-CtQj0m7f.mjs";
14
- import { u as useUpdateFailuresQuery } from "./insights-api-Cuz8lmZx.mjs";
15
- //#region node_modules/.nitro/vite/services/ssr/assets/routes-fs827NQ-.js
13
+ import { n as InfoTooltip, r as adoptionWindow } from "./insights-search-C3R6mzW-.mjs";
14
+ import { u as useUpdateFailuresQuery } from "./insights-api-Bw_ZEDUY.mjs";
15
+ //#region node_modules/.nitro/vite/services/ssr/assets/routes-FE2SJgBr.js
16
16
  var import_jsx_runtime = require_jsx_runtime();
17
17
  /** What API key management adds: its navigation item. */
18
18
  var apiKeysFeatureUi = { apiKeys: { navigation: {
@@ -396,7 +396,7 @@ function updateReleaseFilters(current, filters) {
396
396
  scopeKey: next.scopeKey
397
397
  });
398
398
  }
399
- var $$splitComponentImporter = () => import("./routes-Do9CHvbC.mjs");
399
+ var $$splitComponentImporter = () => import("./routes-CHl0_VK3.mjs");
400
400
  /**
401
401
  * Opens a bundle from a click anywhere on its row or card, except on a
402
402
  * control inside it, which keeps its own action.
@@ -1,7 +1,7 @@
1
1
  import { l as createServerFn } from "./createServerFn-AQvBMBjJ.mjs";
2
- import { t as consoleAccess } from "./console-access-B2mUKj3_.mjs";
2
+ import { t as consoleAccess } from "./console-access-CwSkUsOn.mjs";
3
3
  import { t as createServerRpc } from "./createServerRpc-BVvRVOz5.mjs";
4
- //#region node_modules/.nitro/vite/services/ssr/assets/schema-migration-rpc-vH6ZlJgo.js
4
+ //#region node_modules/.nitro/vite/services/ssr/assets/schema-migration-rpc-Bh7oEZEG.js
5
5
  /** Compares dotted numeric versions, such as "1" and "1.2.0"; NaN when either is not one. */
6
6
  var compareVersions = (left, right) => {
7
7
  const parse = (version) => version.split(".").map(Number);
@@ -52,7 +52,7 @@ var getSchemaMigrationRpc_createServerFn_handler = createServerRpc({
52
52
  filename: "src/lib/schema-migration-rpc.ts"
53
53
  }, (opts) => getSchemaMigrationRpc.__executeServer(opts));
54
54
  var getSchemaMigrationRpc = createServerFn({ method: "GET" }).middleware([consoleAccess]).handler(getSchemaMigrationRpc_createServerFn_handler, async () => {
55
- const { prepareConfig } = await import("./config.server-CwjEf3S5.mjs");
55
+ const { prepareConfig } = await import("./config.server-DBX318ww.mjs");
56
56
  const { config, core } = await prepareConfig();
57
57
  try {
58
58
  await core.listChannels();
@@ -1,7 +1,7 @@
1
1
  import "../_runtime.mjs";
2
2
  import { B as SelectPositioner, F as SelectItemText, G as SelectRoot, H as SelectIcon, I as SelectItemIndicator, L as SelectItem$1, M as SelectGroup$1, N as SelectScrollUpArrow, P as SelectScrollDownArrow, R as SelectList, U as SelectValue$1, V as SelectPortal, W as SelectTrigger$1, bt as require_react, yt as require_jsx_runtime, z as SelectPopup } from "../_libs/@base-ui/react+[...].mjs";
3
3
  import { K as ChevronUp, X as Check, Y as ChevronDown } from "../_libs/lucide-react.mjs";
4
- import { k as cn } from "./sidebar-D1AgCVIN.mjs";
4
+ import { k as cn } from "./sidebar-B7OTpt-8.mjs";
5
5
  require_react();
6
6
  var import_jsx_runtime = require_jsx_runtime();
7
7
  var Select$1 = SelectRoot;
@@ -1,6 +1,6 @@
1
1
  import "../_runtime.mjs";
2
2
  import { _ as runWithStartContext, a as TSS_SERVER_FUNCTION, b as splitSetCookieString, c as createNullProtoObject, d as getStartContext, f as getStartOptions, g as parseSetCookie, h as parse, i as TSS_FORMDATA_CONTEXT, m as mergeHeaders, n as MAX_FRAME_PAYLOAD_SIZE, o as X_TSS_RAW_RESPONSE, p as isRedirect, r as TSS_CONTENT_TYPE_FRAMED_VERSIONED, s as X_TSS_SERIALIZED, t as MAX_FRAMED_STREAMS, u as flattenMiddlewares, v as safeObjectMerge, y as serialize } from "./createServerFn-AQvBMBjJ.mjs";
3
- import { t as getServerFnById } from "../__23tanstack-start-server-fn-resolver-nWkGzoo3.mjs";
3
+ import { t as getServerFnById } from "../__23tanstack-start-server-fn-resolver-BcDgi7Q7.mjs";
4
4
  import { bt as require_react, yt as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
5
5
  import { l as RouterProvider, n as renderRouterToString, r as defineHandlerCallback, t as renderRouterToStream } from "../_libs/@tanstack/react-router+[...].mjs";
6
6
  import { t as __exportAll } from "./rolldown-runtime-rSIU-vHC.mjs";
@@ -3879,7 +3879,7 @@ var HEADERS = { TSS_SHELL: "X-TSS_SHELL" };
3879
3879
  * the dev styles URL for route-scoped CSS collection.
3880
3880
  */
3881
3881
  async function getStartManifest(matchedRoutes) {
3882
- const { tsrStartManifest } = await import("../_tanstack-start-manifest_v-CF4kCd6q.mjs");
3882
+ const { tsrStartManifest } = await import("../_tanstack-start-manifest_v-B5nsO5L4.mjs");
3883
3883
  const startManifest = tsrStartManifest();
3884
3884
  let routes = startManifest.routes;
3885
3885
  routes[rootRouteId];
@@ -6834,7 +6834,7 @@ var getBaseManifest = getProdBaseManifest;
6834
6834
  var createEarlyHintsForRequest = createEarlyHintsCollector;
6835
6835
  async function loadEntries() {
6836
6836
  const [routerEntry, startEntry, pluginAdapters] = await Promise.all([
6837
- import("./router-Bg_TI2qP.mjs"),
6837
+ import("./router-Da0sMVN2.mjs"),
6838
6838
  import("./start-BvDsQehg.mjs"),
6839
6839
  import("./empty-plugin-adapters-zrZ0xs6n.mjs")
6840
6840
  ]);