@burdenoff/fe-libs 2026.1021.1 → 2026.1021.3

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.
@@ -0,0 +1,45 @@
1
+ import { ReactNode } from 'react';
2
+ /** What the `/` route renders. */
3
+ export type LandingGateDecision = 'loading' | 'home' | 'native-welcome' | 'landing';
4
+ export interface LandingGateInput {
5
+ /** The auth provider is still settling (bridge handshake, hydration). */
6
+ isLoading: boolean;
7
+ /** A usable session exists (in-memory or persisted for the active profile). */
8
+ hasSession: boolean;
9
+ /** The shell runs as an installed app (see `shouldShowNativeWelcome`). */
10
+ isInstalledApp: boolean;
11
+ /** Whether the shell supplied a native welcome page. */
12
+ hasNativeWelcome: boolean;
13
+ }
14
+ /**
15
+ * Pure decision for the `/` route. There is intentionally no "sso" outcome:
16
+ * the landing gate never relays an anonymous visitor to the auth bridge.
17
+ */
18
+ export declare function resolveLandingGate(input: LandingGateInput): LandingGateDecision;
19
+ /**
20
+ * Whether the active profile has an unexpired access token persisted in
21
+ * storage — the profile token slot first, then microfe-auth's per-profile
22
+ * persisted store. Covers the window right after sign-in, before the
23
+ * AuthProvider has picked the new tokens up. Never throws.
24
+ */
25
+ export declare function hasStoredValidSession(now?: number): boolean;
26
+ export interface LandingGateViewProps {
27
+ decision: LandingGateDecision;
28
+ /** Product home for signed-in visitors, e.g. `/dashboard` or `/vibecontrols`. */
29
+ homePath: string;
30
+ /** Public marketing landing for anonymous browser visitors. */
31
+ landing: ReactNode;
32
+ /** Installed-app welcome; when omitted installed apps get `landing`. */
33
+ nativeWelcome?: ReactNode;
34
+ /** Rendered while auth settles. Defaults to the branded splash. */
35
+ loadingFallback?: ReactNode;
36
+ /** Suspense message while a lazy landing / welcome page loads. */
37
+ loadingMessage?: string;
38
+ }
39
+ /** Renders a `LandingGateDecision`. Exported for shells and tests. */
40
+ export declare function LandingGateView({ decision, homePath, landing, nativeWelcome, loadingFallback, loadingMessage, }: LandingGateViewProps): import('react/jsx-runtime').JSX.Element;
41
+ export type LandingOrDashboardRedirectProps = Omit<LandingGateViewProps, 'decision'>;
42
+ /**
43
+ * The `/` route element. Must render inside `AuthProvider` and a router.
44
+ */
45
+ export declare function LandingOrDashboardRedirect(props: LandingOrDashboardRedirectProps): import('react/jsx-runtime').JSX.Element;
@@ -0,0 +1,63 @@
1
+ import { getProfileTokens as e, resolveActiveProfileId as t } from "../providers/shell/ProfileStorageManager.js";
2
+ import { BrandedSplash as n } from "../../ui/branded-splash.js";
3
+ import { getJwtExpiry as r } from "../providers/shell/authProvider/jwt.js";
4
+ import { useAuth as i } from "../providers/shell/AuthProvider.js";
5
+ import { MicrofrontendErrorBoundary as a } from "./MicrofrontendErrorBoundary.js";
6
+ import { shouldShowNativeWelcome as o } from "../native/entry.js";
7
+ import { Fragment as s, jsx as c } from "react/jsx-runtime";
8
+ import { Navigate as l } from "react-router";
9
+ //#region src/shared/components/LandingOrDashboardRedirect.tsx
10
+ function u(e) {
11
+ return e.isLoading ? "loading" : e.hasSession ? "home" : e.isInstalledApp && e.hasNativeWelcome ? "native-welcome" : "landing";
12
+ }
13
+ function d(e, t) {
14
+ if (!e) return !1;
15
+ let n = r(e);
16
+ return n !== null && n > t;
17
+ }
18
+ function f(e) {
19
+ let t = localStorage.getItem(e ? `bf-p-${e}-auth-storage` : "auth-storage");
20
+ if (!t) return null;
21
+ let n = JSON.parse(t)?.state?.accessToken;
22
+ return typeof n == "string" && n ? n : null;
23
+ }
24
+ function p(n = Date.now()) {
25
+ if (typeof window > "u") return !1;
26
+ try {
27
+ let r = t();
28
+ return d(r ? e(r)?.accessToken : null, n) ? !0 : d(f(r), n);
29
+ } catch {
30
+ return !1;
31
+ }
32
+ }
33
+ function m({ decision: e, homePath: t, landing: r, nativeWelcome: i, loadingFallback: o, loadingMessage: u }) {
34
+ switch (e) {
35
+ case "loading": return /* @__PURE__ */ c(s, { children: o ?? /* @__PURE__ */ c(n, {}) });
36
+ case "home": return /* @__PURE__ */ c(l, {
37
+ to: t,
38
+ replace: !0
39
+ });
40
+ case "native-welcome": return /* @__PURE__ */ c(a, {
41
+ loadingMessage: u,
42
+ children: i
43
+ });
44
+ case "landing": return /* @__PURE__ */ c(a, {
45
+ loadingMessage: u,
46
+ children: r
47
+ });
48
+ }
49
+ }
50
+ function h(e) {
51
+ let t = i();
52
+ return /* @__PURE__ */ c(m, {
53
+ decision: u({
54
+ isLoading: t.isLoading,
55
+ hasSession: !t.isLoading && (!!t.tokens?.accessToken || p()),
56
+ isInstalledApp: o(),
57
+ hasNativeWelcome: e.nativeWelcome !== void 0
58
+ }),
59
+ ...e
60
+ });
61
+ }
62
+ //#endregion
63
+ export { m as LandingGateView, h as LandingOrDashboardRedirect, p as hasStoredValidSession, u as resolveLandingGate };
@@ -2,8 +2,12 @@
2
2
  * SSORedirectGuard — Checks for SSO cookie and redirects to login origin
3
3
  * for token relay if the current origin doesn't have local tokens.
4
4
  *
5
- * This component should be rendered in route guards (ProtectedRoute,
6
- * LandingOrDashboardRedirect) to enable cross-domain SSO.
5
+ * SSO discovery belongs ONLY where a session is genuinely required: a
6
+ * ProtectedRoute guard, and explicit "Sign in" CTAs. Never call it from the
7
+ * public landing gate (`/`): bouncing an anonymous visitor into the relay means
8
+ * nobody ever sees the landing page, and when no central session exists the
9
+ * bridge sends them back to `/?sso_failed=1` (BOFF-6457 / 6482 / 6494). Use
10
+ * `LandingOrDashboardRedirect` from this package for the `/` route instead.
7
11
  *
8
12
  * Works in all environments (local dev, alpha, production):
9
13
  * - Local dev: cookie on .local.burdenoff.com shared domain
@@ -19,8 +23,13 @@ export declare function markSSORedirectAttempt(relayOrigin: string, returnTo: st
19
23
  * Check if an SSO redirect should be initiated.
20
24
  * Returns the redirect URL if SSO should happen, null otherwise.
21
25
  *
22
- * Call this from ProtectedRoute or LandingOrDashboardRedirect
23
- * before showing login page.
26
+ * Call this from ProtectedRoute (before falling back to the login page) or
27
+ * from an explicit sign-in CTA — never from the public landing gate. Prefer
28
+ * `redirectToSSO()`, which also performs the allowlisted navigation.
29
+ *
30
+ * The returned URL always passes `isAllowedRedirectUrl`; a relay target that
31
+ * would not (a misconfigured bridge, say) yields `null` and leaves no relay
32
+ * attempt marker behind.
24
33
  *
25
34
  * Cross-eTLD+1 product shells always start at the central bridge
26
35
  * (alphaapp/app.burdenoff.com): product cookies are first-party only and must
@@ -31,6 +40,17 @@ export declare function markSSORedirectAttempt(relayOrigin: string, returnTo: st
31
40
  * `isAutoSSOSuppressed` keeps the user on the login screen.
32
41
  */
33
42
  export declare function getSSORedirectUrl(returnPath?: string): string | null;
43
+ /**
44
+ * Start SSO discovery: resolve the relay URL with `getSSORedirectUrl()` and
45
+ * navigate to it through the cross-origin allowlist.
46
+ *
47
+ * Returns `true` when the navigation was started (render
48
+ * `<SSORedirectSpinner />` meanwhile) and `false` when there is nothing to
49
+ * relay to, so the caller can fall back to the in-app login route.
50
+ *
51
+ * For ProtectedRoute and sign-in CTAs only — never the public landing gate.
52
+ */
53
+ export declare function redirectToSSO(returnPath?: string): boolean;
34
54
  /**
35
55
  * Check if Single Logout (SLO) has occurred on another shell.
36
56
  *
@@ -59,6 +79,6 @@ export declare function checkRemoteSLO(gatewayUrl: string, accessToken: string):
59
79
  export declare function clearLocalAuthState(): void;
60
80
  /**
61
81
  * React component that renders a spinner while redirecting.
62
- * Use this as the return value when getSSORedirectUrl() returns a URL.
82
+ * Use this as the return value when `redirectToSSO()` returns true.
63
83
  */
64
84
  export declare function SSORedirectSpinner(): import('react/jsx-runtime').JSX.Element;
@@ -3,14 +3,15 @@ import { clearActiveContextStorage as t } from "../providers/shell/ActiveContext
3
3
  import { clearShellSsoCookies as n, isLocalDevSsoHost as r, isSharedSsoCookieDomain as i, isTrustedSsoOrigin as a, readShellSsoCookie as o } from "../utils/authCookie.js";
4
4
  import { isRealNativeOrDesktopShell as s } from "../native/platform.js";
5
5
  import { BrandedSplash as c } from "../../ui/branded-splash.js";
6
- import { jsx as l } from "react/jsx-runtime";
6
+ import { isAllowedRedirectUrl as l, replaceLocationWithAllowlist as u } from "../utils/redirectAllowlist.js";
7
+ import { jsx as d } from "react/jsx-runtime";
7
8
  //#region src/shared/components/SSORedirectGuard.tsx
8
- var u = "bf-sso-relay-attempt", d = 120 * 1e3, f = [
9
+ var f = "bf-sso-relay-attempt", p = 120 * 1e3, m = [
9
10
  "sso_failed",
10
11
  "sso-failed",
11
12
  "sso-attempted"
12
13
  ];
13
- function p(e) {
14
+ function h(e) {
14
15
  if (typeof window > "u") return null;
15
16
  try {
16
17
  let t = `${window.location.pathname}${window.location.search}${window.location.hash}`, n = new URL(e ?? t, window.location.origin);
@@ -19,70 +20,74 @@ function p(e) {
19
20
  return null;
20
21
  }
21
22
  }
22
- function m(e) {
23
+ function g(e) {
23
24
  return e === "/auth" || e.startsWith("/auth/");
24
25
  }
25
- function h(e) {
26
- return f.some((t) => e.searchParams.has(t));
26
+ function _(e) {
27
+ return m.some((t) => e.searchParams.has(t));
27
28
  }
28
- function g(e) {
29
- if (h(e)) return n(), !0;
30
- if (m(e.pathname)) return !0;
29
+ function v(e) {
30
+ if (_(e)) return n(), !0;
31
+ if (g(e.pathname)) return !0;
31
32
  let t = e.searchParams.get("reason");
32
33
  return t === "session-expired" || t === "logout";
33
34
  }
34
- function _() {
35
+ function y() {
35
36
  try {
36
- sessionStorage.removeItem(u);
37
+ sessionStorage.removeItem(f);
37
38
  } catch {}
38
39
  }
39
- function v() {
40
+ function b() {
40
41
  if (typeof window > "u") return null;
41
42
  try {
42
- let e = sessionStorage.getItem(u);
43
+ let e = sessionStorage.getItem(f);
43
44
  if (!e) return null;
44
45
  let t = JSON.parse(e);
45
- return typeof t.relayOrigin != "string" || typeof t.returnTo != "string" || typeof t.startedAt != "number" || Date.now() - t.startedAt > d ? (_(), null) : {
46
+ return typeof t.relayOrigin != "string" || typeof t.returnTo != "string" || typeof t.startedAt != "number" || Date.now() - t.startedAt > p ? (y(), null) : {
46
47
  relayOrigin: t.relayOrigin,
47
48
  returnTo: t.returnTo,
48
49
  startedAt: t.startedAt
49
50
  };
50
51
  } catch {
51
- return _(), null;
52
+ return y(), null;
52
53
  }
53
54
  }
54
- function y(e) {
55
+ function x(e) {
55
56
  try {
56
57
  return new URL(e).origin;
57
58
  } catch {
58
59
  return null;
59
60
  }
60
61
  }
61
- function b(e) {
62
- let t = p(e);
63
- return !t || g(t);
62
+ function S(e) {
63
+ let t = h(e);
64
+ return !t || v(t);
64
65
  }
65
- function x(e, t) {
66
- let n = y(e), r = p(t), i = v();
66
+ function C(e, t) {
67
+ let n = x(e), r = h(t), i = b();
67
68
  return !!(n && r && i?.returnTo === r.href);
68
69
  }
69
- function S(e, t) {
70
+ function w(e, t) {
70
71
  if (typeof window > "u") return;
71
- let n = y(e), r = p(t);
72
+ let n = x(e), r = h(t);
72
73
  if (!(!n || !r)) try {
73
74
  let e = {
74
75
  relayOrigin: n,
75
76
  returnTo: r.href,
76
77
  startedAt: Date.now()
77
78
  };
78
- sessionStorage.setItem(u, JSON.stringify(e));
79
+ sessionStorage.setItem(f, JSON.stringify(e));
79
80
  } catch {}
80
81
  }
81
- function C(t) {
82
+ function T(e, t) {
83
+ let n = `${e}/auth/sso-relay?returnTo=${encodeURIComponent(t.href)}`;
84
+ return l(n) ? n : null;
85
+ }
86
+ function E(t) {
82
87
  if (s()) return null;
83
88
  try {
84
- let n = p(t);
85
- if (!n || g(n) || r()) return null;
89
+ let n = h(t);
90
+ if (!n || v(n) || r()) return null;
86
91
  let i = window.location.origin, s = null;
87
92
  try {
88
93
  s = new URL(e().url).origin;
@@ -90,23 +95,34 @@ function C(t) {
90
95
  let c = o();
91
96
  if (s === i && c?.origin && a(c.origin)) {
92
97
  let e = new URL(c.origin).origin;
93
- if (e && e !== i && !x(e, n.href)) return S(e, n.href), `${e}/auth/sso-relay?returnTo=${encodeURIComponent(n.href)}`;
98
+ if (e && e !== i) {
99
+ let t = T(e, n);
100
+ if (t && !C(e, n.href)) return w(e, n.href), t;
101
+ }
102
+ }
103
+ if (s && s !== i) {
104
+ let e = T(s, n);
105
+ if (e && !C(s, n.href)) return w(s, n.href), e;
94
106
  }
95
- return s && s !== i && !x(s, n.href) ? (S(s, n.href), `${s}/auth/sso-relay?returnTo=${encodeURIComponent(n.href)}`) : null;
107
+ return null;
96
108
  } catch {
97
109
  return null;
98
110
  }
99
111
  }
100
- function w() {
112
+ function D(e) {
113
+ let t = E(e);
114
+ return t ? u(t) : !1;
115
+ }
116
+ function O() {
101
117
  try {
102
118
  if (o()) return !1;
103
119
  let e = sessionStorage.getItem("bf-active-profile");
104
- return !e || !localStorage.getItem(`bf-p-${e}-tokens`) || !i() ? !1 : (E(), !0);
120
+ return !e || !localStorage.getItem(`bf-p-${e}-tokens`) || !i() ? !1 : (A(), !0);
105
121
  } catch {
106
122
  return !1;
107
123
  }
108
124
  }
109
- async function T(e, t) {
125
+ async function k(e, t) {
110
126
  try {
111
127
  let n = await fetch(e, {
112
128
  method: "POST",
@@ -123,7 +139,7 @@ async function T(e, t) {
123
139
  return !1;
124
140
  }
125
141
  }
126
- function E() {
142
+ function A() {
127
143
  try {
128
144
  let e = localStorage.getItem("bf-profiles");
129
145
  if (e) {
@@ -134,8 +150,8 @@ function E() {
134
150
  localStorage.removeItem("bf-profiles"), localStorage.removeItem("auth-storage"), sessionStorage.removeItem("bf-active-profile"), t(), n(), window.dispatchEvent(new Event("bf-auth-state-cleared")), window.dispatchEvent(new Event("bf-profile-storage-change"));
135
151
  } catch {}
136
152
  }
137
- function D() {
138
- return /* @__PURE__ */ l(c, { label: "Signing you in…" });
153
+ function j() {
154
+ return /* @__PURE__ */ d(c, { label: "Signing you in…" });
139
155
  }
140
156
  //#endregion
141
- export { D as SSORedirectSpinner, T as checkRemoteSLO, w as checkSLO, E as clearLocalAuthState, _ as clearSSORelayAttempt, C as getSSORedirectUrl, x as hasRecentSSORedirectAttempt, S as markSSORedirectAttempt, b as shouldSkipSSORedirect };
157
+ export { j as SSORedirectSpinner, k as checkRemoteSLO, O as checkSLO, A as clearLocalAuthState, y as clearSSORelayAttempt, E as getSSORedirectUrl, C as hasRecentSSORedirectAttempt, w as markSSORedirectAttempt, D as redirectToSSO, S as shouldSkipSSORedirect };
@@ -25,7 +25,9 @@ export { UpgradePromptModal, dispatchUpgradePrompt, UPGRADE_PROMPT_EVENT, } from
25
25
  export type { UpgradePromptModalProps, UpgradePromptDetail } from './UpgradePromptModal';
26
26
  export { UpgradeInlineBanner } from './UpgradeInlineBanner';
27
27
  export type { UpgradeInlineBannerProps } from './UpgradeInlineBanner';
28
- export { getSSORedirectUrl, SSORedirectSpinner, checkSLO, checkRemoteSLO, clearLocalAuthState, } from './SSORedirectGuard';
28
+ export { getSSORedirectUrl, redirectToSSO, SSORedirectSpinner, checkSLO, checkRemoteSLO, clearLocalAuthState, } from './SSORedirectGuard';
29
+ export { LandingOrDashboardRedirect, LandingGateView, resolveLandingGate, hasStoredValidSession, } from './LandingOrDashboardRedirect';
30
+ export type { LandingOrDashboardRedirectProps, LandingGateViewProps, LandingGateDecision, LandingGateInput, } from './LandingOrDashboardRedirect';
29
31
  export { AssistantWidget, ASSISTANT_WIDGET_TOGGLE_EVENT } from './assistantWidget/AssistantWidget';
30
32
  export type { AssistantWidgetProps, AssistantModeOption } from './assistantWidget/AssistantWidget';
31
33
  export { useVoiceInput } from './assistantWidget/useVoiceInput';
@@ -22,6 +22,8 @@ export { initializeLogger, setUserContext, clearUserContext, } from './loggerIni
22
22
  export type { InitLoggerOptions } from './loggerInit';
23
23
  export { setSSoCookie, getSSoCookie, clearSSoCookie, setShellSsoCookies, readShellSsoCookie, clearShellSsoCookies, isSharedSsoCookieDomain, isTrustedSsoOrigin, } from './authCookie';
24
24
  export type { ShellSsoCookieData } from './authCookie';
25
+ export { isAllowedRedirectUrl, replaceLocationWithAllowlist, assignLocationWithAllowlist, openUrlInNewTabWithAllowlist, } from './redirectAllowlist';
26
+ export type { RedirectAllowlistOptions } from './redirectAllowlist';
25
27
  export { SSO_DEPOSITED_PARAM, beginSsoNavigation, isSsoNavigationPending, clearSsoNavigation, readSsoDepositState, markSsoDepositPending, markSsoDepositDone, clearSsoDepositState, shouldAttemptSsoDeposit, mintSsoSessionTokens, buildSsoDepositUrl, consumeSsoDepositMarker, } from './ssoDeposit';
26
28
  export type { MintedSsoTokens, MintSsoSessionResult, SsoDepositPayload, SsoDepositState, } from './ssoDeposit';
27
29
  export { createProfileScopedStorage, getProfileScopedKey, } from './profileScopedStorage';
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Hostname allowlist for full-page navigations that may leave the current
3
+ * origin: the cross-eTLD+1 SSO relay, product-switcher hops between product
4
+ * shells, and similar first-party links.
5
+ *
6
+ * `isSafeRedirectTarget` / `redirectToSafeLocation` in `../graphql/security`
7
+ * are deliberately same-origin only, so they cannot carry a visitor to the
8
+ * central auth bridge (app.burdenoff.com) from a product shell. This module is
9
+ * the cross-origin counterpart: a target is allowed when it stays on the
10
+ * current hostname, or when its hostname is (a subdomain of) one of the
11
+ * Burdenoff product domains in `ALL_PRODUCT_DOMAINS` — the same single list
12
+ * that already drives the bridge host resolution and `isTrustedSsoOrigin`, so
13
+ * a new product never needs another hardcoded copy here.
14
+ *
15
+ * Ported from fluidgrids-app `src/utils/security.ts` (`isAllowedRedirectUrl`
16
+ * and friends), which shipped this check first.
17
+ *
18
+ * @module @burdenoff/fe-libs/shared/utils/redirectAllowlist
19
+ */
20
+ export interface RedirectAllowlistOptions {
21
+ /**
22
+ * Origin the target is resolved against and compared with. Defaults to
23
+ * `window.location.origin`.
24
+ */
25
+ baseOrigin?: string;
26
+ /**
27
+ * Additional host suffixes to trust on top of the Burdenoff product
28
+ * domains (for example a shell's `VITE_ALLOWED_REDIRECT_HOSTS`, split on
29
+ * commas). Each entry matches the host itself and any subdomain of it.
30
+ */
31
+ extraHostSuffixes?: readonly string[];
32
+ }
33
+ /**
34
+ * Whether `target` may be navigated to from `baseOrigin`.
35
+ *
36
+ * Allowed:
37
+ * - relative paths and absolute URLs on the current hostname;
38
+ * - `https:` URLs whose hostname is a Burdenoff product domain or one of its
39
+ * subdomains (`app.`, `alphaapp.`, `www.`, `docs.` …), or an
40
+ * `extraHostSuffixes` entry;
41
+ * - local development hosts (`localhost`, `127.0.0.1` …, over `http:` or
42
+ * `https:`) only when the current origin is itself local development.
43
+ *
44
+ * Everything else — other schemes (`javascript:`, `data:` …), unparsable
45
+ * input, protocol-relative or absolute URLs to any other host — is refused.
46
+ */
47
+ export declare function isAllowedRedirectUrl(target: string, options?: RedirectAllowlistOptions): boolean;
48
+ /**
49
+ * `window.location.replace(target)` when the target passes the allowlist.
50
+ * Returns whether the navigation was started, so callers can fall back
51
+ * (e.g. to the in-app login route) when it was refused.
52
+ */
53
+ export declare function replaceLocationWithAllowlist(target: string, options?: RedirectAllowlistOptions): boolean;
54
+ /** `window.location.assign(target)` when the target passes the allowlist. */
55
+ export declare function assignLocationWithAllowlist(target: string, options?: RedirectAllowlistOptions): boolean;
56
+ /**
57
+ * Open the target in a new tab (`noopener,noreferrer`) when it passes the
58
+ * allowlist.
59
+ */
60
+ export declare function openUrlInNewTabWithAllowlist(target: string, options?: RedirectAllowlistOptions): boolean;
@@ -0,0 +1,47 @@
1
+ import { ALL_PRODUCT_DOMAINS as e } from "../config/gatewayUrls.js";
2
+ //#region src/shared/utils/redirectAllowlist.ts
3
+ var t = new Set([
4
+ "localhost",
5
+ "127.0.0.1",
6
+ "::1",
7
+ "[::1]",
8
+ "host.docker.internal"
9
+ ]);
10
+ function n(e) {
11
+ return e.trim().toLowerCase();
12
+ }
13
+ function r(e, t) {
14
+ let r = n(t);
15
+ return r ? e === r || e.endsWith(`.${r}`) : !1;
16
+ }
17
+ function i(e) {
18
+ return t.has(e) || r(e, "local.burdenoff.com");
19
+ }
20
+ function a(e) {
21
+ return e || (typeof window > "u" ? null : window.location.origin);
22
+ }
23
+ function o(o, s = {}) {
24
+ if (!o.trim()) return !1;
25
+ let c = a(s.baseOrigin);
26
+ if (!c) return !1;
27
+ let l, u;
28
+ try {
29
+ u = new URL(c), l = new URL(o, c);
30
+ } catch {
31
+ return !1;
32
+ }
33
+ if (l.protocol !== "https:" && l.protocol !== "http:") return !1;
34
+ let d = n(l.hostname), f = n(u.hostname);
35
+ return d === f ? !0 : t.has(d) ? i(f) : l.protocol === "http:" ? !1 : [...e, ...s.extraHostSuffixes ?? []].some((e) => r(d, e));
36
+ }
37
+ function s(e, t) {
38
+ return typeof window > "u" || !o(e, t) ? !1 : (window.location.replace(e), !0);
39
+ }
40
+ function c(e, t) {
41
+ return typeof window > "u" || !o(e, t) ? !1 : (window.location.assign(e), !0);
42
+ }
43
+ function l(e, t) {
44
+ return typeof window > "u" || !o(e, t) ? !1 : (window.open(e, "_blank", "noopener,noreferrer"), !0);
45
+ }
46
+ //#endregion
47
+ export { c as assignLocationWithAllowlist, o as isAllowedRedirectUrl, l as openUrlInNewTabWithAllowlist, s as replaceLocationWithAllowlist };
@@ -1,21 +1,22 @@
1
- import { SSORedirectSpinner as e, checkRemoteSLO as t, checkSLO as n, clearLocalAuthState as r, getSSORedirectUrl as i } from "./shared/components/SSORedirectGuard.js";
2
- import { ErrorBoundary as a } from "./shared/components/ErrorBoundary.js";
3
- import { RequireAuth as o, RequireGuest as s } from "./shared/components/RequireAuth.js";
4
- import { PermissionButton as c, PermissionGate as l, PermissionLink as u } from "./shared/components/PermissionGate.js";
5
- import { AccessDenied as d, PermissionDenied as f } from "./shared/components/AccessDenied.js";
6
- import { ErrorFallback as p } from "./shared/components/ErrorFallback.js";
7
- import { LoadingFallback as m, PageLoadingFallback as h, SectionLoadingFallback as g } from "./shared/components/LoadingFallback.js";
8
- import { MicrofrontendErrorBoundary as _ } from "./shared/components/MicrofrontendErrorBoundary.js";
9
- import { ConditionalShell as v } from "./shared/components/ConditionalShell.js";
10
- import { PWAInstallBanner as y } from "./shared/components/PWAInstallBanner.js";
11
- import { ErrorBoundary as b } from "./shared/components/AppErrorBoundary.js";
12
- import { ContextConversationWidget as x } from "./shared/components/ContextConversationWidget.js";
13
- import { KeyboardHelpDialogWrapper as S } from "./shared/components/KeyboardHelpDialogWrapper.js";
14
- import { QuotaMeter as C } from "./shared/components/QuotaMeter.js";
15
- import { UPGRADE_PROMPT_EVENT as w, UpgradePromptModal as T, dispatchUpgradePrompt as E } from "./shared/components/UpgradePromptModal.js";
16
- import { UpgradeInlineBanner as D } from "./shared/components/UpgradeInlineBanner.js";
17
- import { useVoiceInput as O } from "./shared/components/assistantWidget/useVoiceInput.js";
18
- import { ASSISTANT_WIDGET_TOGGLE_EVENT as k, AssistantWidget as A } from "./shared/components/assistantWidget/AssistantWidget.js";
19
- import { Markdown as j } from "./shared/components/Markdown.js";
20
- import { DesktopUpdateToast as M } from "./shared/components/DesktopUpdateToast.js";
21
- export { k as ASSISTANT_WIDGET_TOGGLE_EVENT, d as AccessDenied, b as AppErrorBoundary, A as AssistantWidget, v as ConditionalShell, x as ContextConversationWidget, M as DesktopUpdateToast, a as ErrorBoundary, p as ErrorFallback, S as KeyboardHelpDialogWrapper, m as LoadingFallback, j as Markdown, _ as MicrofrontendErrorBoundary, y as PWAInstallBanner, h as PageLoadingFallback, c as PermissionButton, f as PermissionDenied, l as PermissionGate, u as PermissionLink, C as QuotaMeter, o as RequireAuth, s as RequireGuest, e as SSORedirectSpinner, g as SectionLoadingFallback, w as UPGRADE_PROMPT_EVENT, D as UpgradeInlineBanner, T as UpgradePromptModal, t as checkRemoteSLO, n as checkSLO, r as clearLocalAuthState, E as dispatchUpgradePrompt, i as getSSORedirectUrl, O as useVoiceInput };
1
+ import { SSORedirectSpinner as e, checkRemoteSLO as t, checkSLO as n, clearLocalAuthState as r, getSSORedirectUrl as i, redirectToSSO as a } from "./shared/components/SSORedirectGuard.js";
2
+ import { ErrorBoundary as o } from "./shared/components/ErrorBoundary.js";
3
+ import { RequireAuth as s, RequireGuest as c } from "./shared/components/RequireAuth.js";
4
+ import { PermissionButton as l, PermissionGate as u, PermissionLink as d } from "./shared/components/PermissionGate.js";
5
+ import { AccessDenied as f, PermissionDenied as p } from "./shared/components/AccessDenied.js";
6
+ import { ErrorFallback as m } from "./shared/components/ErrorFallback.js";
7
+ import { LoadingFallback as h, PageLoadingFallback as g, SectionLoadingFallback as _ } from "./shared/components/LoadingFallback.js";
8
+ import { MicrofrontendErrorBoundary as v } from "./shared/components/MicrofrontendErrorBoundary.js";
9
+ import { ConditionalShell as y } from "./shared/components/ConditionalShell.js";
10
+ import { PWAInstallBanner as b } from "./shared/components/PWAInstallBanner.js";
11
+ import { ErrorBoundary as x } from "./shared/components/AppErrorBoundary.js";
12
+ import { ContextConversationWidget as S } from "./shared/components/ContextConversationWidget.js";
13
+ import { KeyboardHelpDialogWrapper as C } from "./shared/components/KeyboardHelpDialogWrapper.js";
14
+ import { QuotaMeter as w } from "./shared/components/QuotaMeter.js";
15
+ import { UPGRADE_PROMPT_EVENT as T, UpgradePromptModal as E, dispatchUpgradePrompt as D } from "./shared/components/UpgradePromptModal.js";
16
+ import { UpgradeInlineBanner as O } from "./shared/components/UpgradeInlineBanner.js";
17
+ import { LandingGateView as k, LandingOrDashboardRedirect as A, hasStoredValidSession as j, resolveLandingGate as M } from "./shared/components/LandingOrDashboardRedirect.js";
18
+ import { useVoiceInput as N } from "./shared/components/assistantWidget/useVoiceInput.js";
19
+ import { ASSISTANT_WIDGET_TOGGLE_EVENT as P, AssistantWidget as F } from "./shared/components/assistantWidget/AssistantWidget.js";
20
+ import { Markdown as I } from "./shared/components/Markdown.js";
21
+ import { DesktopUpdateToast as L } from "./shared/components/DesktopUpdateToast.js";
22
+ export { P as ASSISTANT_WIDGET_TOGGLE_EVENT, f as AccessDenied, x as AppErrorBoundary, F as AssistantWidget, y as ConditionalShell, S as ContextConversationWidget, L as DesktopUpdateToast, o as ErrorBoundary, m as ErrorFallback, C as KeyboardHelpDialogWrapper, k as LandingGateView, A as LandingOrDashboardRedirect, h as LoadingFallback, I as Markdown, v as MicrofrontendErrorBoundary, b as PWAInstallBanner, g as PageLoadingFallback, l as PermissionButton, p as PermissionDenied, u as PermissionGate, d as PermissionLink, w as QuotaMeter, s as RequireAuth, c as RequireGuest, e as SSORedirectSpinner, _ as SectionLoadingFallback, T as UPGRADE_PROMPT_EVENT, O as UpgradeInlineBanner, E as UpgradePromptModal, t as checkRemoteSLO, n as checkSLO, r as clearLocalAuthState, D as dispatchUpgradePrompt, i as getSSORedirectUrl, j as hasStoredValidSession, a as redirectToSSO, M as resolveLandingGate, N as useVoiceInput };
@@ -6,19 +6,19 @@ import { nativeActionSheet as R, nativeConfirm as z, nativeCopyText as B, native
6
6
  import { SafeAreaView as q } from "./shared/native/SafeAreaView.js";
7
7
  import { readInitialNetworkStatus as J, reduceNetworkStatus as Y, useNetworkStatus as X } from "./shared/native/hooks/useNetworkStatus.js";
8
8
  import { PULL_TO_REFRESH_THRESHOLD as Z, computePullOffset as Q, computePullProgress as $, usePullToRefresh as ee } from "./shared/native/hooks/usePullToRefresh.js";
9
- import { useNativePlatform as te } from "./shared/native/hooks/useNativePlatform.js";
10
- import { useSafeArea as ne } from "./shared/native/hooks/useSafeArea.js";
11
- import { useNativeKeyboard as re } from "./shared/native/hooks/useNativeKeyboard.js";
12
- import { useAppState as ie } from "./shared/native/hooks/useAppState.js";
13
- import { useDeviceInfo as ae } from "./shared/native/hooks/useDeviceInfo.js";
14
- import { useHaptics as oe } from "./shared/native/hooks/useHaptics.js";
15
- import { useStatusBar as se } from "./shared/native/hooks/useStatusBar.js";
16
- import { resolveActionSheetOutcome as ce, useActionSheet as le } from "./shared/native/hooks/useActionSheet.js";
17
- import { useDesktop as ue } from "./shared/native/hooks/useDesktop.js";
18
- import { useDesktopUpdateState as de } from "./shared/native/hooks/useDesktopUpdateState.js";
19
- import { useDesktopWindowState as fe } from "./shared/native/hooks/useDesktopWindowState.js";
9
+ import { getNativeEntryRoutes as te, shouldShowNativeWelcome as ne } from "./shared/native/entry.js";
10
+ import { useNativePlatform as re } from "./shared/native/hooks/useNativePlatform.js";
11
+ import { useSafeArea as ie } from "./shared/native/hooks/useSafeArea.js";
12
+ import { useNativeKeyboard as ae } from "./shared/native/hooks/useNativeKeyboard.js";
13
+ import { useAppState as oe } from "./shared/native/hooks/useAppState.js";
14
+ import { useDeviceInfo as se } from "./shared/native/hooks/useDeviceInfo.js";
15
+ import { useHaptics as ce } from "./shared/native/hooks/useHaptics.js";
16
+ import { useStatusBar as le } from "./shared/native/hooks/useStatusBar.js";
17
+ import { resolveActionSheetOutcome as ue, useActionSheet as de } from "./shared/native/hooks/useActionSheet.js";
18
+ import { useDesktop as fe } from "./shared/native/hooks/useDesktop.js";
19
+ import { useDesktopUpdateState as pe } from "./shared/native/hooks/useDesktopUpdateState.js";
20
+ import { useDesktopWindowState as me } from "./shared/native/hooks/useDesktopWindowState.js";
20
21
  import "./shared/native/hooks/index.js";
21
- import { acknowledgeNativePurchase as pe, getNativeProducts as me, getNativePurchases as he, installNativeIAP as ge, isNativeIAPAvailable as _e, purchaseNativeProduct as ve, restoreNativePurchases as ye } from "./shared/native/purchases.js";
22
- import { getNativeEntryRoutes as be, shouldShowNativeWelcome as xe } from "./shared/native/entry.js";
22
+ import { acknowledgeNativePurchase as he, getNativeProducts as ge, getNativePurchases as _e, installNativeIAP as ve, isNativeIAPAvailable as ye, purchaseNativeProduct as be, restoreNativePurchases as xe } from "./shared/native/purchases.js";
23
23
  import { getPushOptInController as Se, recordPushPermissionPromptDismissed as Ce, registerPushOptInController as we, shouldPromptForPushPermission as Te } from "./shared/native/push-optin.js";
24
- export { n as DESKTOP_UPDATE_UNSUPPORTED, r as DESKTOP_WINDOW_STATE_DEFAULT, Z as PULL_TO_REFRESH_THRESHOLD, q as SafeAreaView, pe as acknowledgeNativePurchase, i as bootDesktopShell, Q as computePullOffset, $ as computePullProgress, a as desktopCheckForUpdates, o as desktopDeepLinkToPath, s as desktopInstallUpdate, c as desktopNotify, l as desktopOpenExternal, u as desktopSetBadgeCount, d as desktopSetLocale, f as desktopSetTheme, p as desktopSetTrayQuickActions, e as getCapacitorPlatform, m as getDesktopAuthBridgeConfig, h as getDesktopBridge, g as getDesktopGatewayBases, _ as getDesktopGatewayUrls, v as getDesktopRuntimeConfig, y as getDesktopUpdateState, b as getDesktopWindowState, x as getLegacyDesktopRuntime, O as getNativeBridge, be as getNativeEntryRoutes, me as getNativeProducts, he as getNativePurchases, k as getPlatform, Se as getPushOptInController, S as installDesktopDeepLinkHandler, C as installDesktopNavigateHandler, ge as installNativeIAP, A as isAndroid, t as isCapacitorNative, w as isDesktop, j as isElectron, M as isIOS, N as isInstalledApp, P as isNative, _e as isNativeIAPAvailable, F as isStandalonePWA, I as isWeb, L as isWebBrowser, R as nativeActionSheet, z as nativeConfirm, B as nativeCopyText, V as nativeImpact, H as nativeNotify, U as nativeOpenUrl, W as nativeSelection, G as nativeShare, K as nativeToast, T as onDesktopUpdateState, E as onDesktopWindowState, ve as purchaseNativeProduct, J as readInitialNetworkStatus, Ce as recordPushPermissionPromptDismissed, Y as reduceNetworkStatus, D as registerDesktopNavigator, we as registerPushOptInController, ce as resolveActionSheetOutcome, ye as restoreNativePurchases, Te as shouldPromptForPushPermission, xe as shouldShowNativeWelcome, le as useActionSheet, ie as useAppState, ue as useDesktop, de as useDesktopUpdateState, fe as useDesktopWindowState, ae as useDeviceInfo, oe as useHaptics, re as useNativeKeyboard, te as useNativePlatform, X as useNetworkStatus, ee as usePullToRefresh, ne as useSafeArea, se as useStatusBar };
24
+ export { n as DESKTOP_UPDATE_UNSUPPORTED, r as DESKTOP_WINDOW_STATE_DEFAULT, Z as PULL_TO_REFRESH_THRESHOLD, q as SafeAreaView, he as acknowledgeNativePurchase, i as bootDesktopShell, Q as computePullOffset, $ as computePullProgress, a as desktopCheckForUpdates, o as desktopDeepLinkToPath, s as desktopInstallUpdate, c as desktopNotify, l as desktopOpenExternal, u as desktopSetBadgeCount, d as desktopSetLocale, f as desktopSetTheme, p as desktopSetTrayQuickActions, e as getCapacitorPlatform, m as getDesktopAuthBridgeConfig, h as getDesktopBridge, g as getDesktopGatewayBases, _ as getDesktopGatewayUrls, v as getDesktopRuntimeConfig, y as getDesktopUpdateState, b as getDesktopWindowState, x as getLegacyDesktopRuntime, O as getNativeBridge, te as getNativeEntryRoutes, ge as getNativeProducts, _e as getNativePurchases, k as getPlatform, Se as getPushOptInController, S as installDesktopDeepLinkHandler, C as installDesktopNavigateHandler, ve as installNativeIAP, A as isAndroid, t as isCapacitorNative, w as isDesktop, j as isElectron, M as isIOS, N as isInstalledApp, P as isNative, ye as isNativeIAPAvailable, F as isStandalonePWA, I as isWeb, L as isWebBrowser, R as nativeActionSheet, z as nativeConfirm, B as nativeCopyText, V as nativeImpact, H as nativeNotify, U as nativeOpenUrl, W as nativeSelection, G as nativeShare, K as nativeToast, T as onDesktopUpdateState, E as onDesktopWindowState, be as purchaseNativeProduct, J as readInitialNetworkStatus, Ce as recordPushPermissionPromptDismissed, Y as reduceNetworkStatus, D as registerDesktopNavigator, we as registerPushOptInController, ue as resolveActionSheetOutcome, xe as restoreNativePurchases, Te as shouldPromptForPushPermission, ne as shouldShowNativeWelcome, de as useActionSheet, oe as useAppState, fe as useDesktop, pe as useDesktopUpdateState, me as useDesktopWindowState, se as useDeviceInfo, ce as useHaptics, ae as useNativeKeyboard, re as useNativePlatform, X as useNetworkStatus, ee as usePullToRefresh, ie as useSafeArea, le as useStatusBar };
@@ -6,17 +6,18 @@ import { installGatewayFetchRewrite as P, resolveGatewayBases as F, suppressCons
6
6
  import { BACKEND_ERROR_EVENT as L, CONNECTION_STATUS_EVENT as R, dispatchBackendErrorEvent as z, extractBackendError as B, isAbortError as V, isBackendErrorDisplay as H, isTransportError as U, markConnectionHealthy as W, shouldToastBackendError as G } from "./shared/utils/backendErrors.js";
7
7
  import { attemptTokenRefresh as K, clearAuthSessionStorage as q, hasAuthGraphQLErrors as J, isAuthGraphQLError as Y, isAuthNetworkError as X, redirectToLogin as Z } from "./shared/utils/authErrorHandling.js";
8
8
  import { clearSSoCookie as Q, clearShellSsoCookies as $, getSSoCookie as ee, isSharedSsoCookieDomain as te, isTrustedSsoOrigin as ne, readShellSsoCookie as re, setSSoCookie as ie, setShellSsoCookies as ae } from "./shared/utils/authCookie.js";
9
- import { SSO_DEPOSITED_PARAM as oe, beginSsoNavigation as se, buildSsoDepositUrl as ce, clearSsoDepositState as le, clearSsoNavigation as ue, consumeSsoDepositMarker as de, isSsoNavigationPending as fe, markSsoDepositDone as pe, markSsoDepositPending as me, mintSsoSessionTokens as he, readSsoDepositState as ge, shouldAttemptSsoDeposit as _e } from "./shared/utils/ssoDeposit.js";
10
- import { AppInitializer as ve, useRegistryHelpers as ye, useShellNavigate as be } from "./shared/utils/appHelpers.js";
11
- import { clearUserContext as xe, initializeLogger as Se, setUserContext as Ce } from "./shared/utils/loggerInit.js";
12
- import { createProfileScopedStorage as we, getProfileScopedKey as Te } from "./shared/utils/profileScopedStorage.js";
13
- import { QUOTA_EXHAUSTED_CODE as Ee, RESOURCE_CAP_EXCEEDED_CODE as De, STORAGE_QUOTA_EXCEEDED_CODE as Oe, UPGRADE_ERROR_CODES as ke, buildQuotaExhaustedMessage as Ae, extractQuotaExhaustedExtensions as je, extractUpgradeErrorExtensions as Me, isQuotaExhaustedError as Ne, isUpgradeError as Pe } from "./shared/utils/quotaErrors.js";
14
- import { INLINE_ENCODE as Fe, downscaleImage as Ie, selectInlineBase64 as Le } from "./shared/utils/imageDownscale.js";
15
- import { clsx as Re } from "clsx";
16
- import { twMerge as ze } from "tailwind-merge";
9
+ import { assignLocationWithAllowlist as oe, isAllowedRedirectUrl as se, openUrlInNewTabWithAllowlist as ce, replaceLocationWithAllowlist as le } from "./shared/utils/redirectAllowlist.js";
10
+ import { SSO_DEPOSITED_PARAM as ue, beginSsoNavigation as de, buildSsoDepositUrl as fe, clearSsoDepositState as pe, clearSsoNavigation as me, consumeSsoDepositMarker as he, isSsoNavigationPending as ge, markSsoDepositDone as _e, markSsoDepositPending as ve, mintSsoSessionTokens as ye, readSsoDepositState as be, shouldAttemptSsoDeposit as xe } from "./shared/utils/ssoDeposit.js";
11
+ import { AppInitializer as Se, useRegistryHelpers as Ce, useShellNavigate as we } from "./shared/utils/appHelpers.js";
12
+ import { clearUserContext as Te, initializeLogger as Ee, setUserContext as De } from "./shared/utils/loggerInit.js";
13
+ import { createProfileScopedStorage as Oe, getProfileScopedKey as ke } from "./shared/utils/profileScopedStorage.js";
14
+ import { QUOTA_EXHAUSTED_CODE as Ae, RESOURCE_CAP_EXCEEDED_CODE as je, STORAGE_QUOTA_EXCEEDED_CODE as Me, UPGRADE_ERROR_CODES as Ne, buildQuotaExhaustedMessage as Pe, extractQuotaExhaustedExtensions as Fe, extractUpgradeErrorExtensions as Ie, isQuotaExhaustedError as Le, isUpgradeError as Re } from "./shared/utils/quotaErrors.js";
15
+ import { INLINE_ENCODE as ze, downscaleImage as Be, selectInlineBase64 as Ve } from "./shared/utils/imageDownscale.js";
16
+ import { clsx as He } from "clsx";
17
+ import { twMerge as Ue } from "tailwind-merge";
17
18
  //#region src/shared/utils/index.ts
18
- function Be(...e) {
19
- return ze(Re(e));
19
+ function We(...e) {
20
+ return Ue(He(e));
20
21
  }
21
22
  //#endregion
22
- export { ve as AppInitializer, L as BACKEND_ERROR_EVENT, R as CONNECTION_STATUS_EVENT, Fe as INLINE_ENCODE, Ee as QUOTA_EXHAUSTED_CODE, De as RESOURCE_CAP_EXCEEDED_CODE, oe as SSO_DEPOSITED_PARAM, Oe as STORAGE_QUOTA_EXCEEDED_CODE, ke as UPGRADE_ERROR_CODES, t as alertTokens, K as attemptTokenRefresh, se as beginSsoNavigation, Ae as buildQuotaExhaustedMessage, ce as buildSsoDepositUrl, f as capitalizeFirst, p as capitalizeWords, n as categoryTokens, q as clearAuthSessionStorage, Q as clearSSoCookie, $ as clearShellSsoCookies, le as clearSsoDepositState, ue as clearSsoNavigation, xe as clearUserContext, Be as cn, de as consumeSsoDepositMarker, e as createApolloClient, we as createProfileScopedStorage, z as dispatchBackendErrorEvent, Ie as downscaleImage, B as extractBackendError, je as extractQuotaExhaustedExtensions, Me as extractUpgradeErrorExtensions, m as formatBytes, h as formatCompactNumber, g as formatCurrency, _ as formatCurrencyCompact, v as formatDate, y as formatDateTime, b as formatDuration, x as formatList, S as formatNumber, C as formatOrdinal, w as formatPercentage, T as formatRelativeTime, E as formatTime, r as getAlertTokens, i as getCategoryTokens, Te as getProfileScopedKey, a as getProgressTokens, ee as getSSoCookie, o as getStatusBadgeTokens, s as getStatusTokens, c as getTrendTokens, J as hasAuthGraphQLErrors, Se as initializeLogger, P as installGatewayFetchRewrite, V as isAbortError, Y as isAuthGraphQLError, X as isAuthNetworkError, H as isBackendErrorDisplay, M as isChunkLoadError, Ne as isQuotaExhaustedError, te as isSharedSsoCookieDomain, fe as isSsoNavigationPending, U as isTransportError, ne as isTrustedSsoOrigin, Pe as isUpgradeError, N as lazyWithRetry, W as markConnectionHealthy, pe as markSsoDepositDone, me as markSsoDepositPending, he as mintSsoSessionTokens, D as pluralize, l as progressTokens, re as readShellSsoCookie, ge as readSsoDepositState, Z as redirectToLogin, F as resolveGatewayBases, Le as selectInlineBase64, ie as setSSoCookie, ae as setShellSsoCookies, Ce as setUserContext, _e as shouldAttemptSsoDeposit, G as shouldToastBackendError, O as slugify, u as statusTokens, I as suppressConsole, k as toCamelCase, A as toPascalCase, d as trendTokens, j as truncateText, ye as useRegistryHelpers, be as useShellNavigate };
23
+ export { Se as AppInitializer, L as BACKEND_ERROR_EVENT, R as CONNECTION_STATUS_EVENT, ze as INLINE_ENCODE, Ae as QUOTA_EXHAUSTED_CODE, je as RESOURCE_CAP_EXCEEDED_CODE, ue as SSO_DEPOSITED_PARAM, Me as STORAGE_QUOTA_EXCEEDED_CODE, Ne as UPGRADE_ERROR_CODES, t as alertTokens, oe as assignLocationWithAllowlist, K as attemptTokenRefresh, de as beginSsoNavigation, Pe as buildQuotaExhaustedMessage, fe as buildSsoDepositUrl, f as capitalizeFirst, p as capitalizeWords, n as categoryTokens, q as clearAuthSessionStorage, Q as clearSSoCookie, $ as clearShellSsoCookies, pe as clearSsoDepositState, me as clearSsoNavigation, Te as clearUserContext, We as cn, he as consumeSsoDepositMarker, e as createApolloClient, Oe as createProfileScopedStorage, z as dispatchBackendErrorEvent, Be as downscaleImage, B as extractBackendError, Fe as extractQuotaExhaustedExtensions, Ie as extractUpgradeErrorExtensions, m as formatBytes, h as formatCompactNumber, g as formatCurrency, _ as formatCurrencyCompact, v as formatDate, y as formatDateTime, b as formatDuration, x as formatList, S as formatNumber, C as formatOrdinal, w as formatPercentage, T as formatRelativeTime, E as formatTime, r as getAlertTokens, i as getCategoryTokens, ke as getProfileScopedKey, a as getProgressTokens, ee as getSSoCookie, o as getStatusBadgeTokens, s as getStatusTokens, c as getTrendTokens, J as hasAuthGraphQLErrors, Ee as initializeLogger, P as installGatewayFetchRewrite, V as isAbortError, se as isAllowedRedirectUrl, Y as isAuthGraphQLError, X as isAuthNetworkError, H as isBackendErrorDisplay, M as isChunkLoadError, Le as isQuotaExhaustedError, te as isSharedSsoCookieDomain, ge as isSsoNavigationPending, U as isTransportError, ne as isTrustedSsoOrigin, Re as isUpgradeError, N as lazyWithRetry, W as markConnectionHealthy, _e as markSsoDepositDone, ve as markSsoDepositPending, ye as mintSsoSessionTokens, ce as openUrlInNewTabWithAllowlist, D as pluralize, l as progressTokens, re as readShellSsoCookie, be as readSsoDepositState, Z as redirectToLogin, le as replaceLocationWithAllowlist, F as resolveGatewayBases, Ve as selectInlineBase64, ie as setSSoCookie, ae as setShellSsoCookies, De as setUserContext, xe as shouldAttemptSsoDeposit, G as shouldToastBackendError, O as slugify, u as statusTokens, I as suppressConsole, k as toCamelCase, A as toPascalCase, d as trendTokens, j as truncateText, Ce as useRegistryHelpers, we as useShellNavigate };