@burdenoff/fe-libs 2026.1021.13 → 2026.1021.15

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 (56) hide show
  1. package/dist/admin-overview/AdminOverviewActionsContext.d.ts +11 -0
  2. package/dist/admin-overview/AdminOverviewActionsContext.js +17 -0
  3. package/dist/admin-overview/AdminOverviewPage.d.ts +4 -0
  4. package/dist/admin-overview/AdminOverviewPage.js +524 -0
  5. package/dist/admin-overview/buildHierarchyGraph.d.ts +36 -0
  6. package/dist/admin-overview/buildHierarchyGraph.js +172 -0
  7. package/dist/admin-overview/index.d.ts +10 -0
  8. package/dist/admin-overview/nodes/OrganizationNode.d.ts +9 -0
  9. package/dist/admin-overview/nodes/OrganizationNode.js +85 -0
  10. package/dist/admin-overview/nodes/ProjectNode.d.ts +9 -0
  11. package/dist/admin-overview/nodes/ProjectNode.js +69 -0
  12. package/dist/admin-overview/nodes/TenantNode.d.ts +9 -0
  13. package/dist/admin-overview/nodes/TenantNode.js +78 -0
  14. package/dist/admin-overview/nodes/WorkspaceNode.d.ts +9 -0
  15. package/dist/admin-overview/nodes/WorkspaceNode.js +136 -0
  16. package/dist/admin-overview/nodes/nodeStyles.d.ts +7 -0
  17. package/dist/admin-overview/nodes/nodeStyles.js +10 -0
  18. package/dist/admin-overview/operations.d.ts +45 -0
  19. package/dist/admin-overview/operations.js +42 -0
  20. package/dist/admin-overview.d.ts +2 -0
  21. package/dist/admin-overview.js +3 -0
  22. package/dist/chrome/GlobalSearch.js +9 -9
  23. package/dist/chrome/HeaderThemeSwitcher.js +7 -7
  24. package/dist/chrome.js +44 -44
  25. package/dist/platform-pages/AcceptShareRoute.d.ts +33 -0
  26. package/dist/platform-pages/AcceptShareRoute.js +72 -0
  27. package/dist/platform-pages/AffiliatesPage.d.ts +16 -0
  28. package/dist/platform-pages/AffiliatesPage.js +583 -0
  29. package/dist/platform-pages/AppearanceSettingsPage.d.ts +14 -0
  30. package/dist/platform-pages/AppearanceSettingsPage.js +14 -0
  31. package/dist/platform-pages/index.d.ts +20 -0
  32. package/dist/platform-pages.d.ts +2 -0
  33. package/dist/platform-pages.js +4 -0
  34. package/dist/shared/components/DocsLink.d.ts +56 -0
  35. package/dist/shared/components/DocsLink.js +97 -0
  36. package/dist/shared/components/index.d.ts +2 -0
  37. package/dist/shared/config/docsUrls.d.ts +91 -0
  38. package/dist/shared/config/docsUrls.js +70 -0
  39. package/dist/shared/config/index.d.ts +2 -0
  40. package/dist/shared/config/shellRoutes.js +7 -0
  41. package/dist/shared/feature-flags/FeatureFlagProvider.d.ts +10 -0
  42. package/dist/shared/feature-flags/FeatureFlagProvider.js +4 -1
  43. package/dist/shared/feature-flags/index.d.ts +2 -2
  44. package/dist/shared/feature-flags/useFeatureFlag.d.ts +26 -1
  45. package/dist/shared/feature-flags/useFeatureFlag.js +25 -12
  46. package/dist/shared/hooks/usePushDeviceRegistration.js +1 -1
  47. package/dist/shared/providers/AppShellProvider.js +6 -6
  48. package/dist/shared-components.js +7 -6
  49. package/dist/shared-config.js +10 -9
  50. package/dist/shared-feature-flags.js +4 -4
  51. package/dist/shared-hooks.js +25 -25
  52. package/dist/shared-native.js +15 -15
  53. package/dist/shared-providers-shell.js +12 -12
  54. package/dist/shared.js +132 -130
  55. package/dist/shell-native/push-optin.js +4 -4
  56. package/package.json +16 -3
@@ -0,0 +1,97 @@
1
+ import { normalizeProductSlug as e } from "../config/productSlug.js";
2
+ import { buildProductDocsUrl as t, resolveProductDocsOrigin as n, toTrustedDocsOrigin as r } from "../config/docsUrls.js";
3
+ import { useSafeGateway as i } from "../graphql/GatewayContext.js";
4
+ import { useAppShell as a } from "../providers/shell/AppShellContext.js";
5
+ import { useEffect as o, useState as s } from "react";
6
+ import { Fragment as c, jsx as l } from "react/jsx-runtime";
7
+ import { gql as u } from "@apollo/client/core";
8
+ //#region src/shared/components/DocsLink.tsx
9
+ var d = u`
10
+ query PublicProductDocsUrl($slug: String!) {
11
+ publicProduct(slug: $slug) {
12
+ docsUrl
13
+ }
14
+ }
15
+ `, f = /* @__PURE__ */ new Map(), p = /* @__PURE__ */ new Map();
16
+ function m(e) {
17
+ if (!e || typeof e != "object") return null;
18
+ let t = e.publicProduct;
19
+ if (!t || typeof t != "object") return null;
20
+ let n = t.docsUrl;
21
+ return typeof n == "string" && r(n) ? n : null;
22
+ }
23
+ function h(t) {
24
+ return f.get(e(t));
25
+ }
26
+ function g(t, n) {
27
+ let r = e(n), i = f.get(r);
28
+ if (i !== void 0) return Promise.resolve(i);
29
+ let a = p.get(r);
30
+ if (a) return a;
31
+ let o = t.query({
32
+ query: d,
33
+ variables: { slug: r },
34
+ fetchPolicy: "cache-first"
35
+ }).then((e) => {
36
+ let t = m(e.data);
37
+ return f.set(r, t), t;
38
+ }).catch(() => null).finally(() => {
39
+ p.delete(r);
40
+ });
41
+ return p.set(r, o), o;
42
+ }
43
+ function _(e, t) {
44
+ let n = i(), [r, a] = s(() => h(e) ?? null);
45
+ return o(() => {
46
+ if (!t || !n) return;
47
+ let r = h(e);
48
+ if (r !== void 0) {
49
+ a(r);
50
+ return;
51
+ }
52
+ a(null);
53
+ let i = !0;
54
+ return g(n.getClient("global"), e).then((e) => {
55
+ i && a(e);
56
+ }), () => {
57
+ i = !1;
58
+ };
59
+ }, [
60
+ t,
61
+ n,
62
+ e
63
+ ]), t ? r : null;
64
+ }
65
+ function v(e = {}) {
66
+ let t = a(), r = e.productSlug ?? t.productSlug;
67
+ return n(r, {
68
+ registryDocsUrl: _(r, e.registry !== !1),
69
+ domain: e.productSlug ? void 0 : t.domain,
70
+ environment: e.environment
71
+ });
72
+ }
73
+ function y(e, n = {}) {
74
+ let r = a(), i = n.productSlug ?? r.productSlug;
75
+ return t(i, e, {
76
+ registryDocsUrl: _(i, n.registry !== !1),
77
+ domain: n.productSlug ? void 0 : r.domain,
78
+ environment: n.environment
79
+ });
80
+ }
81
+ function b({ path: e, productSlug: t, registry: n, environment: r, children: i, ...a }) {
82
+ let o = y(e, {
83
+ productSlug: t,
84
+ registry: n,
85
+ environment: r
86
+ });
87
+ return o ? /* @__PURE__ */ l("a", {
88
+ ...a,
89
+ href: o,
90
+ target: "_blank",
91
+ rel: "noopener noreferrer",
92
+ "data-docs-link": "",
93
+ children: i
94
+ }) : /* @__PURE__ */ l(c, { children: i });
95
+ }
96
+ //#endregion
97
+ export { b as DocsLink, d as PUBLIC_PRODUCT_DOCS_URL_QUERY, g as fetchRegistryDocsUrl, m as readRegistryDocsUrl, v as useProductDocsOrigin, y as useProductDocsUrl };
@@ -30,6 +30,8 @@ export type { QuotaUpgradeBridgeProps, QuotaUpgradeBridgeOptions, QuotaUpgradeCo
30
30
  export { getSSORedirectUrl, redirectToSSO, SSORedirectSpinner, checkSLO, checkRemoteSLO, clearLocalAuthState, } from './SSORedirectGuard';
31
31
  export { MAIN_CONTENT_ID, MainLandmark, PublicLayout, SkipToContentLink, focusSkipTarget, useInsideMainLandmark, } from './SkipToContent';
32
32
  export type { MainLandmarkProps, PublicLayoutProps, SkipTarget, SkipToContentLinkProps, } from './SkipToContent';
33
+ export { DocsLink, useProductDocsOrigin, useProductDocsUrl, fetchRegistryDocsUrl, readRegistryDocsUrl, PUBLIC_PRODUCT_DOCS_URL_QUERY, } from './DocsLink';
34
+ export type { DocsLinkProps, DocsRegistryClient, UseProductDocsOptions } from './DocsLink';
33
35
  export { LandingOrDashboardRedirect, LandingGateView, resolveLandingGate, hasStoredValidSession, } from './LandingOrDashboardRedirect';
34
36
  export type { LandingOrDashboardRedirectProps, LandingGateViewProps, LandingGateDecision, LandingGateInput, } from './LandingOrDashboardRedirect';
35
37
  export { AssistantWidget, ASSISTANT_WIDGET_TOGGLE_EVENT } from './assistantWidget/AssistantWidget';
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Environment-aware product documentation URLs (G91).
3
+ *
4
+ * Every product publishes its docs at `docs.<product-domain>` in production
5
+ * and `alphadocs.<product-domain>` in alpha (behind Cloudflare Access, like
6
+ * every other alpha host). In-app "Learn more" and Help links must follow the
7
+ * environment the shell is running in: an alpha shell that links to the prod
8
+ * docs shows readers documentation for a build they are not using.
9
+ *
10
+ * Resolution, highest precedence first:
11
+ * 1. The product registry `docsUrl` (`publicProduct(slug).docsUrl`), when it
12
+ * is an https URL on a trusted product domain.
13
+ * 2. The static catalog: the product's production app host with `app.`
14
+ * swapped for `docs.`.
15
+ * 3. `docs.<domain>` from the shell's own `domain`, for a product the static
16
+ * catalog does not know yet.
17
+ *
18
+ * The chosen origin is then canonicalised (legacy docs hosts are mapped to
19
+ * their canonical twin — FluidGrids' canonical domain is fluidgrids.ai) and
20
+ * converted to the current environment (`docs.` ↔ `alphadocs.`).
21
+ *
22
+ * @module @burdenoff/fe-libs/shared/config/docsUrls
23
+ */
24
+ /** The docs estate a link should point at. Local dev servers read the prod docs. */
25
+ export type DocsEnvironment = 'prod' | 'alpha';
26
+ /**
27
+ * Legacy docs hosts and the canonical host each one 301s to. A registry row or
28
+ * shell config that still carries the legacy host resolves straight to the
29
+ * canonical one, so a link never relies on the redirect.
30
+ */
31
+ export declare const CANONICAL_DOCS_HOSTS: Readonly<Record<string, string>>;
32
+ /**
33
+ * Parse a docs base URL and return its `https://host` origin, or null when it
34
+ * is not a usable docs origin: not https, not on a known product domain,
35
+ * or not parseable. Registry values are user-editable admin data, so an
36
+ * arbitrary host must never become an in-app link.
37
+ */
38
+ export declare function toTrustedDocsOrigin(url: string | null | undefined): string | null;
39
+ /** Map a legacy docs origin to its canonical twin; other origins are returned unchanged. */
40
+ export declare function canonicalizeDocsOrigin(origin: string): string;
41
+ /**
42
+ * Convert a docs origin to the given environment: `docs.x` ↔ `alphadocs.x`.
43
+ * An origin that follows neither convention is returned unchanged, because
44
+ * guessing an alpha twin for it could produce a host that does not exist.
45
+ */
46
+ export declare function toEnvironmentDocsOrigin(origin: string, environment: DocsEnvironment): string;
47
+ /**
48
+ * The default prod docs origin for a product from the static catalog
49
+ * (`app.<domain>` → `docs.<domain>`), canonicalised. Undefined when the
50
+ * catalog does not know the product.
51
+ */
52
+ export declare function getCatalogDocsOrigin(productSlug: string): string | undefined;
53
+ /**
54
+ * Which docs estate the running shell belongs to.
55
+ *
56
+ * - Desktop (Electron): the baked runtime config's `environment`.
57
+ * - Capacitor: the build's deploy target (the WebView origin is always localhost).
58
+ * - Web: `alphaapp.*` / `alphaadmin.*` hosts are alpha; everything else is prod.
59
+ * A localhost dev server built for alpha (`VITE_DEPLOY_ENV=alpha` or
60
+ * `VITE_GATEWAY_TARGET=alpha`) reads the alpha docs; otherwise prod, because
61
+ * docs are not served by the local stack.
62
+ */
63
+ export declare function resolveDocsEnvironment(hostname?: string): DocsEnvironment;
64
+ export interface ResolveDocsOriginOptions {
65
+ /** The registry's `docsUrl` for the product, when the shell has it. */
66
+ registryDocsUrl?: string | null;
67
+ /** The shell's own domain (AppShellConfig `domain`), for products missing from the catalog. */
68
+ domain?: string;
69
+ /** Override the detected environment (tests, previews). */
70
+ environment?: DocsEnvironment;
71
+ }
72
+ /**
73
+ * The environment-correct docs origin for a product, e.g.
74
+ * `https://alphadocs.vibecontrols.com` on alphaapp.vibecontrols.com.
75
+ * Undefined only when no source names a trusted docs host.
76
+ */
77
+ export declare function resolveProductDocsOrigin(productSlug: string, options?: ResolveDocsOriginOptions): string | undefined;
78
+ /**
79
+ * Normalise a docs path: must be site-relative. Absolute URLs and
80
+ * protocol-relative `//host` paths are rejected (they would let a caller turn
81
+ * a "docs" link into an arbitrary external link). Query and hash are kept.
82
+ */
83
+ export declare function normalizeDocsPath(path: string | undefined): string | null;
84
+ /**
85
+ * Full docs URL for a product page, e.g.
86
+ * `buildProductDocsUrl('fluidgrids', '/users/workflows')` →
87
+ * `https://docs.fluidgrids.ai/users/workflows` in prod and
88
+ * `https://alphadocs.fluidgrids.ai/users/workflows` in alpha.
89
+ * Undefined when there is no trusted docs origin or the path is not site-relative.
90
+ */
91
+ export declare function buildProductDocsUrl(productSlug: string, path?: string, options?: ResolveDocsOriginOptions): string | undefined;
@@ -0,0 +1,70 @@
1
+ import { isCapacitorNative as e } from "../native/capacitor.js";
2
+ import { getDesktopRuntimeConfig as t } from "../native/desktop.js";
3
+ import { ALL_PRODUCT_DOMAINS as n, ALPHA_HOSTS as r, getCurrentHostname as i, resolveNativeDeployTarget as a } from "./gatewayUrls.js";
4
+ import { legacyProductSlug as o, normalizeProductSlug as s } from "./productSlug.js";
5
+ import { PRODUCT_URLS as c } from "./products.js";
6
+ //#region src/shared/config/docsUrls.ts
7
+ var l = "docs.", u = "alphadocs.", d = {
8
+ "docs.fluidgrids.com": "docs.fluidgrids.ai",
9
+ "alphadocs.fluidgrids.com": "alphadocs.fluidgrids.ai"
10
+ }, f = new Set(n);
11
+ function p(e) {
12
+ let t = e.toLowerCase();
13
+ for (let e of f) if (t === e || t.endsWith(`.${e}`)) return !0;
14
+ return !1;
15
+ }
16
+ function m(e) {
17
+ if (typeof e != "string" || e.trim() === "") return null;
18
+ let t;
19
+ try {
20
+ t = new URL(e.trim());
21
+ } catch {
22
+ return null;
23
+ }
24
+ return t.protocol !== "https:" || t.username || t.password || t.port || !p(t.hostname) ? null : `https://${t.hostname.toLowerCase()}`;
25
+ }
26
+ function h(e) {
27
+ let t = d[e.replace(/^https:\/\//, "")];
28
+ return t ? `https://${t}` : e;
29
+ }
30
+ function g(e, t) {
31
+ let n = e.replace(/^https:\/\//, ""), r = null;
32
+ return n.startsWith(u) ? r = n.slice(10) : n.startsWith(l) && (r = n.slice(5)), r ? `https://${t === "alpha" ? u : l}${r}` : e;
33
+ }
34
+ function _(e) {
35
+ let t = c.production, n = s(e), r = t[n] ?? t[o(n)];
36
+ if (!r) return;
37
+ let i;
38
+ try {
39
+ i = new URL(r).hostname;
40
+ } catch {
41
+ return;
42
+ }
43
+ return h(`https://${l}${i.startsWith("app.") ? i.slice(4) : i}`);
44
+ }
45
+ function v(n = i()) {
46
+ let o = t()?.environment;
47
+ if (o) return o === "alpha" ? "alpha" : "prod";
48
+ if (e()) return a() === "alpha" ? "alpha" : "prod";
49
+ let s = n.toLowerCase(), c = () => a() === "alpha" ? "alpha" : "prod";
50
+ return r.has(s) ? "alpha" : s.endsWith(".local.burdenoff.com") ? c() : s.startsWith("alpha") && p(s) ? "alpha" : p(s) ? "prod" : c();
51
+ }
52
+ function y(e, t = {}) {
53
+ let n = t.domain ? m(`https://${l}${t.domain.replace(/^www\./, "")}`) : null, r = m(t.registryDocsUrl) ?? _(e) ?? n ?? void 0;
54
+ if (!r) return;
55
+ let i = t.environment ?? v();
56
+ return g(h(r), i);
57
+ }
58
+ function b(e) {
59
+ if (e === void 0 || e === "") return "";
60
+ let t = e.trim();
61
+ return /^[a-z][a-z0-9+.-]*:/i.test(t) || t.startsWith("//") || t.includes("\\") ? null : t.startsWith("/") || t.startsWith("#") || t.startsWith("?") ? t : `/${t}`;
62
+ }
63
+ function x(e, t, n = {}) {
64
+ let r = y(e, n);
65
+ if (!r) return;
66
+ let i = b(t);
67
+ if (i !== null) return `${r}${i}`;
68
+ }
69
+ //#endregion
70
+ export { d as CANONICAL_DOCS_HOSTS, x as buildProductDocsUrl, h as canonicalizeDocsOrigin, _ as getCatalogDocsOrigin, b as normalizeDocsPath, v as resolveDocsEnvironment, y as resolveProductDocsOrigin, g as toEnvironmentDocsOrigin, m as toTrustedDocsOrigin };
@@ -68,6 +68,8 @@ export { resolveGatewayUrls } from './gatewayUrls';
68
68
  export type { RuntimeGatewayUrls } from './gatewayUrls';
69
69
  export { resolveAuthBridgeConfig, resolveShellAuthBridgeConfig } from './authBridgeUrls';
70
70
  export type { RuntimeAuthBridgeConfig } from './authBridgeUrls';
71
+ export { CANONICAL_DOCS_HOSTS, buildProductDocsUrl, canonicalizeDocsOrigin, getCatalogDocsOrigin, normalizeDocsPath, resolveDocsEnvironment, resolveProductDocsOrigin, toEnvironmentDocsOrigin, toTrustedDocsOrigin, } from './docsUrls';
72
+ export type { DocsEnvironment, ResolveDocsOriginOptions } from './docsUrls';
71
73
  export { PRODUCTS, PRODUCT_URLS, BOTMANOR_PRODUCT_SLUG, getProductUrl, getProductsWithUrls, findProductConfig, } from './products';
72
74
  export type { ProductConfig } from './products';
73
75
  export { PRODUCT_SLUG_RENAMES, PRODUCT_SLUG_EMIT, normalizeProductSlug, legacyProductSlug, isSameProductSlug, emitProductSlug, } from './productSlug';
@@ -152,6 +152,13 @@ var e = {
152
152
  showFooter: !1,
153
153
  showBreadcrumb: !1
154
154
  },
155
+ {
156
+ pattern: /^\/vault\/share\//,
157
+ showHeader: !1,
158
+ showSidebar: !1,
159
+ showFooter: !1,
160
+ showBreadcrumb: !1
161
+ },
155
162
  {
156
163
  pattern: /^\/share\/accept\//,
157
164
  showHeader: !1,
@@ -44,3 +44,13 @@ debug, defaultEnabled, }: FeatureFlagProviderProps): import('react/jsx-runtime')
44
44
  * ```
45
45
  */
46
46
  export declare function useFeatureFlags(): FeatureFlagContextValue;
47
+ /**
48
+ * Like `useFeatureFlags`, but returns `null` instead of throwing when no
49
+ * `FeatureFlagProvider` is mounted above the caller.
50
+ *
51
+ * For code that runs in hosts it does not control — a microfrontend or SDK
52
+ * component mounted by many app shells, only some of which mount the provider.
53
+ * Shell code should keep using `useFeatureFlags`, whose throw surfaces a missing
54
+ * provider at once.
55
+ */
56
+ export declare function useOptionalFeatureFlags(): FeatureFlagContextValue | null;
@@ -107,5 +107,8 @@ function f() {
107
107
  if (!e) throw Error("useFeatureFlags must be used within a FeatureFlagProvider");
108
108
  return e;
109
109
  }
110
+ function p() {
111
+ return n(u);
112
+ }
110
113
  //#endregion
111
- export { d as FeatureFlagProvider, f as useFeatureFlags };
114
+ export { d as FeatureFlagProvider, f as useFeatureFlags, p as useOptionalFeatureFlags };
@@ -29,9 +29,9 @@
29
29
  * </FeatureGate>
30
30
  * ```
31
31
  */
32
- export { FeatureFlagProvider, useFeatureFlags } from './FeatureFlagProvider';
32
+ export { FeatureFlagProvider, useFeatureFlags, useOptionalFeatureFlags, } from './FeatureFlagProvider';
33
33
  export type { FeatureFlagProviderProps } from './FeatureFlagProvider';
34
- export { useFeatureFlag, useFeatureFlagValue, useFeatureFlagDetails } from './useFeatureFlag';
34
+ export { useFeatureFlag, useOptionalFeatureFlag, useFeatureFlagValue, useFeatureFlagDetails, } from './useFeatureFlag';
35
35
  export { FeatureGate } from './FeatureGate';
36
36
  export type { FeatureGateProps } from './FeatureGate';
37
37
  export type { FlagValue, FlagType, FlagStatus, FlagEvaluation, BulkEvaluationResponse, FeatureFlagProviderConfig, FeatureFlagContextValue, } from './types';
@@ -1,4 +1,4 @@
1
- import { FlagValue, FlagEvaluation } from './types';
1
+ import { FlagValue, FlagEvaluation, FeatureFlagContextValue } from './types';
2
2
  /**
3
3
  * Check if a single feature flag is enabled.
4
4
  *
@@ -7,6 +7,31 @@ import { FlagValue, FlagEvaluation } from './types';
7
7
  * @returns Whether the flag is enabled
8
8
  */
9
9
  export declare function useFeatureFlag(flagKey: string, defaultValue?: boolean): boolean;
10
+ /**
11
+ * Check a single feature flag without requiring a `FeatureFlagProvider`.
12
+ *
13
+ * Same default-allow semantics as `useFeatureFlag`, and it returns
14
+ * `defaultValue` while flags load, when the flag is absent, and when the host
15
+ * mounts no provider at all. Use it in microfrontends and SDK components that
16
+ * several app shells mount (not every shell mounts the provider); shell code
17
+ * keeps `useFeatureFlag`.
18
+ *
19
+ * @param flagKey - The feature flag key to check
20
+ * @param defaultValue - Value when the flag cannot be evaluated (default: true)
21
+ * @returns Whether the flag is enabled
22
+ *
23
+ * @example
24
+ * ```tsx
25
+ * // A kill switch: on unless an admin turns it off for this workspace.
26
+ * const logStreams = useOptionalFeatureFlag('fluidgrids.log-streams');
27
+ * ```
28
+ */
29
+ export declare function useOptionalFeatureFlag(flagKey: string, defaultValue?: boolean): boolean;
30
+ /**
31
+ * Pure resolution behind `useOptionalFeatureFlag` (exported for tests): the
32
+ * default when there is no provider, while loading, or when the flag is absent.
33
+ */
34
+ export declare function resolveFlagEnabled(context: Pick<FeatureFlagContextValue, 'getEvaluation' | 'isLoading'> | null, flagKey: string, defaultValue: boolean): boolean;
10
35
  /**
11
36
  * Get the resolved value of a single feature flag.
12
37
  *
@@ -1,31 +1,44 @@
1
- import { useFeatureFlags as e } from "./FeatureFlagProvider.js";
2
- import { useMemo as t } from "react";
1
+ import { useFeatureFlags as e, useOptionalFeatureFlags as t } from "./FeatureFlagProvider.js";
2
+ import { useMemo as n } from "react";
3
3
  //#region src/shared/feature-flags/useFeatureFlag.ts
4
- function n(n, r = !0) {
4
+ function r(t, r = !0) {
5
5
  let { getEvaluation: i, isLoading: a } = e();
6
- return t(() => {
6
+ return n(() => {
7
7
  if (a) return r;
8
- let e = i(n);
8
+ let e = i(t);
9
9
  return e ? !!e.value : r;
10
10
  }, [
11
11
  i,
12
12
  a,
13
- n,
13
+ t,
14
14
  r
15
15
  ]);
16
16
  }
17
- function r(n, r) {
17
+ function i(e, r = !0) {
18
+ let i = t();
19
+ return n(() => a(i, e, r), [
20
+ i,
21
+ e,
22
+ r
23
+ ]);
24
+ }
25
+ function a(e, t, n) {
26
+ if (!e || e.isLoading) return n;
27
+ let r = e.getEvaluation(t);
28
+ return r ? !!r.value : n;
29
+ }
30
+ function o(t, r) {
18
31
  let { getValue: i, isLoading: a } = e();
19
- return t(() => a ? r : i(n, r), [
32
+ return n(() => a ? r : i(t, r), [
20
33
  i,
21
34
  a,
22
- n,
35
+ t,
23
36
  r
24
37
  ]);
25
38
  }
26
- function i(n) {
39
+ function s(t) {
27
40
  let { getEvaluation: r } = e();
28
- return t(() => r(n), [r, n]);
41
+ return n(() => r(t), [r, t]);
29
42
  }
30
43
  //#endregion
31
- export { n as useFeatureFlag, i as useFeatureFlagDetails, r as useFeatureFlagValue };
44
+ export { r as useFeatureFlag, s as useFeatureFlagDetails, o as useFeatureFlagValue, i as useOptionalFeatureFlag };
@@ -1,8 +1,8 @@
1
1
  import { useAppShell as e } from "../providers/shell/AppShellContext.js";
2
2
  import { useAuth as t } from "../providers/shell/AuthProvider.js";
3
3
  import { logManager as n } from "../logger/LogManager.js";
4
- import "../../shared-logger.js";
5
4
  import { installPushDeviceRegistration as r, unregisterPushDevice as i } from "../native/push-registration.js";
5
+ import "../../shared-logger.js";
6
6
  import { useEffect as a, useRef as o } from "react";
7
7
  //#region src/shared/hooks/usePushDeviceRegistration.ts
8
8
  var s = n.getLogger("usePushDeviceRegistration");
@@ -10,15 +10,15 @@ import { ActiveContextProvider as m } from "./shell/ActiveContextProvider.js";
10
10
  import { LogManager as h } from "../logger/LogManager.js";
11
11
  import { ConsoleTransport as ne } from "../logger/ConsoleTransport.js";
12
12
  import { ThemeProvider as g } from "./shell/ThemeProvider.js";
13
- import { ErrorFallback as re } from "../components/ErrorFallback.js";
13
+ import { AuthTokenProvider as re } from "./shell/AuthTokenProvider.js";
14
+ import { ErrorFallback as ie } from "../components/ErrorFallback.js";
14
15
  import { m as _ } from "../../node_modules/react-error-boundary/dist/react-error-boundary.js";
15
16
  import { PWAInstallBanner as v } from "../components/PWAInstallBanner.js";
16
17
  import { FeatureFlagsProvider as y } from "./shell/FeatureFlagsProvider.js";
17
18
  import { FeatureFlagProvider as b } from "../feature-flags/FeatureFlagProvider.js";
18
19
  import { GlobalUiProvider as x } from "./shell/GlobalUiProvider.js";
19
20
  import { ShellUiProvider as S } from "./shell/ShellUiProvider.js";
20
- import { ContextManagerProvider as ie } from "./shell/ContextManagerProvider.js";
21
- import { AuthTokenProvider as ae } from "./shell/AuthTokenProvider.js";
21
+ import { ContextManagerProvider as ae } from "./shell/ContextManagerProvider.js";
22
22
  import { MultiGatewayProvider as oe } from "./shell/MultiGatewayProvider.js";
23
23
  import { G as C, Q as se, j as ce, w as le } from "../../node_modules/web-vitals/dist/web-vitals.js";
24
24
  import { ProfileI18nBridge as ue } from "./shell/ProfileI18nBridge.js";
@@ -777,7 +777,7 @@ function Be({ config: e, children: r, clearAuthStore: i }) {
777
777
  appEnv: B.appEnv,
778
778
  sourceMfe: s,
779
779
  children: /* @__PURE__ */ q(_, {
780
- FallbackComponent: re,
780
+ FallbackComponent: ie,
781
781
  children: /* @__PURE__ */ J(ge, { children: [/* @__PURE__ */ q(ze, {
782
782
  config: B,
783
783
  productSlug: s,
@@ -786,7 +786,7 @@ function Be({ config: e, children: r, clearAuthStore: i }) {
786
786
  rybbitSkipRoutes: F
787
787
  }), /* @__PURE__ */ q(be, {
788
788
  client: Te,
789
- children: /* @__PURE__ */ q(ae, { children: /* @__PURE__ */ q(oe, {
789
+ children: /* @__PURE__ */ q(re, { children: /* @__PURE__ */ q(oe, {
790
790
  workspaceBaseUrl: S.workspaceBaseUrl,
791
791
  globalBaseUrl: S.globalBaseUrl,
792
792
  organizationId: we,
@@ -812,7 +812,7 @@ function Be({ config: e, children: r, clearAuthStore: i }) {
812
812
  },
813
813
  children: /* @__PURE__ */ q(m, {
814
814
  syncToUrl: !0,
815
- children: /* @__PURE__ */ q(ie, { children: /* @__PURE__ */ q(Fe, {
815
+ children: /* @__PURE__ */ q(ae, { children: /* @__PURE__ */ q(Fe, {
816
816
  i18nProductId: y,
817
817
  platformI18nProductId: b,
818
818
  directionMode: z,
@@ -16,9 +16,10 @@ import { QuotaMeter as A } from "./shared/components/QuotaMeter.js";
16
16
  import { UPGRADE_PROMPT_EVENT as j, UpgradePromptModal as M, dispatchUpgradePrompt as N } from "./shared/components/UpgradePromptModal.js";
17
17
  import { UpgradeInlineBanner as P } from "./shared/components/UpgradeInlineBanner.js";
18
18
  import { DEFAULT_QUOTA_UPGRADE_COPY as F, QuotaUpgradeBridge as I, captureQuotaDialogOwners as L, claimQuotaDialog as R, dispatchProductQuotaExhausted as z, quotaEventKind as B, resolveQuotaUpgradeCopy as V, useQuotaDialogOwnership as H, useQuotaUpgradeBridge as U, withQuotaDialogOwnership as W } from "./shared/components/QuotaUpgradeBridge.js";
19
- import { LandingGateView as G, LandingOrDashboardRedirect as K, hasStoredValidSession as q, resolveLandingGate as J } from "./shared/components/LandingOrDashboardRedirect.js";
20
- import { useVoiceInput as Y } from "./shared/components/assistantWidget/useVoiceInput.js";
21
- import { ASSISTANT_WIDGET_TOGGLE_EVENT as X, AssistantWidget as Z } from "./shared/components/assistantWidget/AssistantWidget.js";
22
- import { Markdown as Q } from "./shared/components/Markdown.js";
23
- import { DesktopUpdateToast as $ } from "./shared/components/DesktopUpdateToast.js";
24
- export { X as ASSISTANT_WIDGET_TOGGLE_EVENT, v as AccessDenied, D as AppErrorBoundary, Z as AssistantWidget, T as ConditionalShell, O as ContextConversationWidget, F as DEFAULT_QUOTA_UPGRADE_COPY, $ as DesktopUpdateToast, f as ErrorBoundary, b as ErrorFallback, k as KeyboardHelpDialogWrapper, G as LandingGateView, K as LandingOrDashboardRedirect, x as LoadingFallback, o as MAIN_CONTENT_ID, s as MainLandmark, Q as Markdown, w as MicrofrontendErrorBoundary, E as PWAInstallBanner, S as PageLoadingFallback, h as PermissionButton, y as PermissionDenied, g as PermissionGate, _ as PermissionLink, c as PublicLayout, A as QuotaMeter, I as QuotaUpgradeBridge, p as RequireAuth, m as RequireGuest, e as SSORedirectSpinner, C as SectionLoadingFallback, l as SkipToContentLink, j as UPGRADE_PROMPT_EVENT, P as UpgradeInlineBanner, M as UpgradePromptModal, L as captureQuotaDialogOwners, t as checkRemoteSLO, n as checkSLO, R as claimQuotaDialog, r as clearLocalAuthState, z as dispatchProductQuotaExhausted, N as dispatchUpgradePrompt, u as focusSkipTarget, i as getSSORedirectUrl, q as hasStoredValidSession, B as quotaEventKind, a as redirectToSSO, J as resolveLandingGate, V as resolveQuotaUpgradeCopy, d as useInsideMainLandmark, H as useQuotaDialogOwnership, U as useQuotaUpgradeBridge, Y as useVoiceInput, W as withQuotaDialogOwnership };
19
+ import { DocsLink as G, PUBLIC_PRODUCT_DOCS_URL_QUERY as K, fetchRegistryDocsUrl as q, readRegistryDocsUrl as J, useProductDocsOrigin as Y, useProductDocsUrl as X } from "./shared/components/DocsLink.js";
20
+ import { LandingGateView as Z, LandingOrDashboardRedirect as Q, hasStoredValidSession as $, resolveLandingGate as ee } from "./shared/components/LandingOrDashboardRedirect.js";
21
+ import { useVoiceInput as te } from "./shared/components/assistantWidget/useVoiceInput.js";
22
+ import { ASSISTANT_WIDGET_TOGGLE_EVENT as ne, AssistantWidget as re } from "./shared/components/assistantWidget/AssistantWidget.js";
23
+ import { Markdown as ie } from "./shared/components/Markdown.js";
24
+ import { DesktopUpdateToast as ae } from "./shared/components/DesktopUpdateToast.js";
25
+ export { ne as ASSISTANT_WIDGET_TOGGLE_EVENT, v as AccessDenied, D as AppErrorBoundary, re as AssistantWidget, T as ConditionalShell, O as ContextConversationWidget, F as DEFAULT_QUOTA_UPGRADE_COPY, ae as DesktopUpdateToast, G as DocsLink, f as ErrorBoundary, b as ErrorFallback, k as KeyboardHelpDialogWrapper, Z as LandingGateView, Q as LandingOrDashboardRedirect, x as LoadingFallback, o as MAIN_CONTENT_ID, s as MainLandmark, ie as Markdown, w as MicrofrontendErrorBoundary, K as PUBLIC_PRODUCT_DOCS_URL_QUERY, E as PWAInstallBanner, S as PageLoadingFallback, h as PermissionButton, y as PermissionDenied, g as PermissionGate, _ as PermissionLink, c as PublicLayout, A as QuotaMeter, I as QuotaUpgradeBridge, p as RequireAuth, m as RequireGuest, e as SSORedirectSpinner, C as SectionLoadingFallback, l as SkipToContentLink, j as UPGRADE_PROMPT_EVENT, P as UpgradeInlineBanner, M as UpgradePromptModal, L as captureQuotaDialogOwners, t as checkRemoteSLO, n as checkSLO, R as claimQuotaDialog, r as clearLocalAuthState, z as dispatchProductQuotaExhausted, N as dispatchUpgradePrompt, q as fetchRegistryDocsUrl, u as focusSkipTarget, i as getSSORedirectUrl, $ as hasStoredValidSession, B as quotaEventKind, J as readRegistryDocsUrl, a as redirectToSSO, ee as resolveLandingGate, V as resolveQuotaUpgradeCopy, d as useInsideMainLandmark, Y as useProductDocsOrigin, X as useProductDocsUrl, H as useQuotaDialogOwnership, U as useQuotaUpgradeBridge, te as useVoiceInput, W as withQuotaDialogOwnership };
@@ -2,9 +2,10 @@ import { resolveGatewayUrls as e } from "./shared/config/gatewayUrls.js";
2
2
  import { resolveAuthBridgeConfig as t, resolveShellAuthBridgeConfig as n } from "./shared/config/authBridgeUrls.js";
3
3
  import { PRODUCT_SLUG_EMIT as r, PRODUCT_SLUG_RENAMES as i, emitProductSlug as a, isSameProductSlug as o, legacyProductSlug as s, normalizeProductSlug as c } from "./shared/config/productSlug.js";
4
4
  import { BOTMANOR_PRODUCT_SLUG as l, PRODUCTS as u, PRODUCT_URLS as d, findProductConfig as f, getProductUrl as p, getProductsWithUrls as m } from "./shared/config/products.js";
5
- import { COMMON_SHELL_LESS_ROUTES as h, DEFAULT_SHELL_CONFIG as g, getShellConfig as _, isShellLessRoute as v, shouldShowBreadcrumb as y, shouldShowSidebar as b } from "./shared/config/shellRoutes.js";
5
+ import { CANONICAL_DOCS_HOSTS as h, buildProductDocsUrl as g, canonicalizeDocsOrigin as _, getCatalogDocsOrigin as v, normalizeDocsPath as y, resolveDocsEnvironment as b, resolveProductDocsOrigin as x, toEnvironmentDocsOrigin as S, toTrustedDocsOrigin as C } from "./shared/config/docsUrls.js";
6
+ import { COMMON_SHELL_LESS_ROUTES as w, DEFAULT_SHELL_CONFIG as T, getShellConfig as E, isShellLessRoute as D, shouldShowBreadcrumb as O, shouldShowSidebar as k } from "./shared/config/shellRoutes.js";
6
7
  //#region src/shared/config/index.ts
7
- var x = 20, S = {
8
+ var A = 20, j = {
8
9
  workspace: {
9
10
  defaultBaseUrl: "https://gw-wspace.local.burdenoff.com",
10
11
  graphql: "/workspaces/graphql",
@@ -17,18 +18,18 @@ var x = 20, S = {
17
18
  ws: "/global/graphql/ws"
18
19
  }
19
20
  };
20
- function C(e, t) {
21
+ function M(e, t) {
21
22
  let n = e.endsWith("/") ? e.slice(0, -1) : e;
22
23
  return t === "workspaces" ? `${n}/workspaces/graphql` : `${n}/global/graphql`;
23
24
  }
24
- function w(e) {
25
- return S[e];
25
+ function N(e) {
26
+ return j[e];
26
27
  }
27
- function T(e, t) {
28
- let n = S[t], r = e || E(t) || n.defaultBaseUrl;
28
+ function P(e, t) {
29
+ let n = j[t], r = e || F(t) || n.defaultBaseUrl;
29
30
  return `${r.endsWith("/") ? r.slice(0, -1) : r}${n.graphql}`;
30
31
  }
31
- function E(t) {
32
+ function F(t) {
32
33
  try {
33
34
  let n = e();
34
35
  return t === "workspace" ? n.workspaceBaseUrl : n.globalBaseUrl;
@@ -37,4 +38,4 @@ function E(t) {
37
38
  }
38
39
  }
39
40
  //#endregion
40
- export { l as BOTMANOR_PRODUCT_SLUG, h as COMMON_SHELL_LESS_ROUTES, x as DEFAULT_PAGE_SIZE, g as DEFAULT_SHELL_CONFIG, S as GATEWAYS, u as PRODUCTS, r as PRODUCT_SLUG_EMIT, i as PRODUCT_SLUG_RENAMES, d as PRODUCT_URLS, a as emitProductSlug, f as findProductConfig, w as getGatewayConfig, T as getGatewayUrl, C as getGraphQLEndpoint, p as getProductUrl, m as getProductsWithUrls, _ as getShellConfig, o as isSameProductSlug, v as isShellLessRoute, s as legacyProductSlug, c as normalizeProductSlug, t as resolveAuthBridgeConfig, e as resolveGatewayUrls, n as resolveShellAuthBridgeConfig, y as shouldShowBreadcrumb, b as shouldShowSidebar };
41
+ export { l as BOTMANOR_PRODUCT_SLUG, h as CANONICAL_DOCS_HOSTS, w as COMMON_SHELL_LESS_ROUTES, A as DEFAULT_PAGE_SIZE, T as DEFAULT_SHELL_CONFIG, j as GATEWAYS, u as PRODUCTS, r as PRODUCT_SLUG_EMIT, i as PRODUCT_SLUG_RENAMES, d as PRODUCT_URLS, g as buildProductDocsUrl, _ as canonicalizeDocsOrigin, a as emitProductSlug, f as findProductConfig, v as getCatalogDocsOrigin, N as getGatewayConfig, P as getGatewayUrl, M as getGraphQLEndpoint, p as getProductUrl, m as getProductsWithUrls, E as getShellConfig, o as isSameProductSlug, D as isShellLessRoute, s as legacyProductSlug, y as normalizeDocsPath, c as normalizeProductSlug, t as resolveAuthBridgeConfig, b as resolveDocsEnvironment, e as resolveGatewayUrls, x as resolveProductDocsOrigin, n as resolveShellAuthBridgeConfig, O as shouldShowBreadcrumb, k as shouldShowSidebar, S as toEnvironmentDocsOrigin, C as toTrustedDocsOrigin };
@@ -1,4 +1,4 @@
1
- import { FeatureFlagProvider as e, useFeatureFlags as t } from "./shared/feature-flags/FeatureFlagProvider.js";
2
- import { useFeatureFlag as n, useFeatureFlagDetails as r, useFeatureFlagValue as i } from "./shared/feature-flags/useFeatureFlag.js";
3
- import { FeatureGate as a } from "./shared/feature-flags/FeatureGate.js";
4
- export { e as FeatureFlagProvider, a as FeatureGate, n as useFeatureFlag, r as useFeatureFlagDetails, i as useFeatureFlagValue, t as useFeatureFlags };
1
+ import { FeatureFlagProvider as e, useFeatureFlags as t, useOptionalFeatureFlags as n } from "./shared/feature-flags/FeatureFlagProvider.js";
2
+ import { useFeatureFlag as r, useFeatureFlagDetails as i, useFeatureFlagValue as a, useOptionalFeatureFlag as o } from "./shared/feature-flags/useFeatureFlag.js";
3
+ import { FeatureGate as s } from "./shared/feature-flags/FeatureGate.js";
4
+ export { e as FeatureFlagProvider, s as FeatureGate, r as useFeatureFlag, i as useFeatureFlagDetails, a as useFeatureFlagValue, t as useFeatureFlags, o as useOptionalFeatureFlag, n as useOptionalFeatureFlags };