@burdenoff/fe-libs 2026.1014.1 → 2026.1014.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.
@@ -3,29 +3,33 @@ import { SHELL_OVERLAY_LAYER_CLASS as t } from "../shellOverlayLayer.js";
3
3
  import { jsx as n, jsxs as r } from "react/jsx-runtime";
4
4
  import { createPortal as i } from "react-dom";
5
5
  //#region src/chrome/notificationCenter/NotificationPanel.tsx
6
- var a = ({ isMobile: a, onClose: o, children: s }) => a ? typeof document > "u" ? null : i(/* @__PURE__ */ n(e, {
7
- onDismiss: o,
6
+ var a = "calc(max(var(--safe-top, 0px), env(safe-area-inset-top, 0px)) + var(--native-topbar-height, 0px))", o = {
7
+ top: a,
8
+ maxHeight: `calc(100dvh - ${a} - max(var(--mobile-tabbar-height, 0px), var(--safe-bottom, 0px), env(safe-area-inset-bottom, 0px)))`
9
+ }, s = ({ isMobile: a, onClose: s, children: c }) => a ? typeof document > "u" ? null : i(/* @__PURE__ */ n(e, {
10
+ onDismiss: s,
8
11
  children: /* @__PURE__ */ r("div", {
9
12
  className: `fixed inset-0 ${t}`,
10
13
  role: "dialog",
11
14
  "aria-label": "Notifications panel",
12
15
  children: [/* @__PURE__ */ n("div", {
13
16
  className: "absolute inset-0 bg-bg-overlay backdrop-blur-sm",
14
- onClick: o,
17
+ onClick: s,
15
18
  "aria-hidden": "true"
16
19
  }), /* @__PURE__ */ n("div", {
17
- className: "absolute inset-0 bg-bg-elevated flex flex-col",
18
- children: s
20
+ className: "absolute inset-x-0 flex flex-col overflow-hidden bg-bg-elevated rounded-b-2xl shadow-[var(--shadow-elevation-4)]",
21
+ style: o,
22
+ children: c
19
23
  })]
20
24
  })
21
25
  }), document.body) : /* @__PURE__ */ n(e, {
22
- onDismiss: o,
26
+ onDismiss: s,
23
27
  children: /* @__PURE__ */ n("div", {
24
28
  className: "absolute right-0 top-full mt-2 w-[calc(100vw-1.5rem)] sm:w-[420px] max-h-[600px] bg-bg-elevated border border-border-subtle rounded-card shadow-[var(--shadow-elevation-4)] z-50 overflow-hidden flex flex-col",
25
29
  role: "dialog",
26
30
  "aria-label": "Notifications panel",
27
- children: s
31
+ children: c
28
32
  })
29
33
  });
30
34
  //#endregion
31
- export { a as NotificationPanel };
35
+ export { s as NotificationPanel };
@@ -308,6 +308,7 @@ export * from './ui/AssistantApiCallsConsentDialog';
308
308
  export * from './ui/AssistantChatArea';
309
309
  export * from './ui/AIAssistantPanel';
310
310
  export * from './ui/assistantOverlayState';
311
+ export * from './ui/useAssistantLauncherLift';
311
312
  export * from './ui/AssistantOverlay';
312
313
  export * from './workflowApi';
313
314
  export * from './ui/WorkflowAssistantPanel';
@@ -2,7 +2,7 @@ import { useAssistantTr as e } from "../i18n.js";
2
2
  import { quotaExhaustedEventName as t } from "../quota.js";
3
3
  import { assistantPanelOwnsEscape as n } from "./panelOverlays.js";
4
4
  import { AssistantPreviewBridgeHost as r } from "../preview/bridgeHost.js";
5
- import { ASSISTANT_DOCK_WIDTH_VAR as i, ASSISTANT_OVERLAY_DESKTOP_QUERY as a, ASSISTANT_OVERLAY_TOP_VAR as o, ASSISTANT_PANEL_INSET_VAR as s, ASSISTANT_SHEET_BOTTOM_VAR as c, aboveAssistantBottomChrome as l, assistantOverlayClassName as u, assistantOverlayEscapeAction as d, assistantOverlayKeys as f, assistantQuotaKindOf as p, closestAround as m, createAssistantNavigate as h, isAssistantToggleShortcut as g, nextAssistantOpenState as _, publishedAssistantDockWidth as v, publishedAssistantPanelInset as y, readAssistantOverlayFlag as b, requestedAssistantOpenState as x, writeAssistantOverlayFlag as S } from "./assistantOverlayState.js";
5
+ import { ASSISTANT_DOCK_WIDTH_VAR as i, ASSISTANT_OVERLAY_DESKTOP_QUERY as a, ASSISTANT_OVERLAY_TOP_VAR as o, ASSISTANT_PANEL_INSET_VAR as s, ASSISTANT_SHEET_BOTTOM_VAR as c, assistantLauncherBottom as l, assistantOverlayClassName as u, assistantOverlayEscapeAction as d, assistantOverlayKeys as f, assistantQuotaKindOf as p, closestAround as m, createAssistantNavigate as h, isAssistantToggleShortcut as g, nextAssistantOpenState as _, publishedAssistantDockWidth as v, publishedAssistantPanelInset as y, readAssistantOverlayFlag as b, requestedAssistantOpenState as x, writeAssistantOverlayFlag as S } from "./assistantOverlayState.js";
6
6
  import { useAssistantServerHistory as C } from "../history/useAssistantServerHistory.js";
7
7
  import { AIAssistantPanel as w } from "./AIAssistantPanel.js";
8
8
  import { createContext as T, useCallback as E, useContext as D, useEffect as O, useMemo as k, useRef as A, useState as j, useSyncExternalStore as M } from "react";
@@ -114,6 +114,16 @@ export declare const ASSISTANT_BOTTOM_CHROME_CLEARANCE = "max(var(--mobile-tabba
114
114
  * whatever sat above it.
115
115
  */
116
116
  export declare function aboveAssistantBottomChrome(inset: string): string;
117
+ /**
118
+ * Extra lift a PAGE asks of the launcher. The launcher is a fixed bottom-right
119
+ * button, so on a phone it paints over whatever the page keeps in that corner —
120
+ * a chat composer's send button, for one. A page that owns a bottom composer
121
+ * sets this var on <html> (see `useAssistantLauncherLift`) and the launcher
122
+ * rests above it. Unset = 0px, so every other page is untouched.
123
+ */
124
+ export declare const ASSISTANT_LAUNCHER_LIFT_VAR = "--assistant-launcher-lift";
125
+ /** The launcher's CSS `bottom`: clears the chrome, then the page's own lift. */
126
+ export declare function assistantLauncherBottom(inset: string): string;
117
127
  /** Width of the docked side panel. Must match `sm:w-[440px]` below. */
118
128
  export declare const ASSISTANT_DOCK_WIDTH_PX = 440;
119
129
  /**
@@ -33,23 +33,27 @@ var u = "max(var(--mobile-tabbar-height, 0px), var(--safe-bottom, 0px), env(safe
33
33
  function d(e) {
34
34
  return `calc(${e} + ${u})`;
35
35
  }
36
- var f = 440, p = "--assistant-dock-width", m = "--assistant-sheet-bottom", h = "--assistant-overlay-top", g = 56, _ = "(min-width: 640px)";
37
- function v(e) {
36
+ var f = "--assistant-launcher-lift";
37
+ function p(e) {
38
+ return `calc(var(${f}, 0px) + ${d(e)})`;
39
+ }
40
+ var m = 440, h = "--assistant-dock-width", g = "--assistant-sheet-bottom", _ = "--assistant-overlay-top", v = 56, y = "(min-width: 640px)";
41
+ function b(e) {
38
42
  return e.isOpen && e.docked && e.isDesktop ? 440 : 0;
39
43
  }
40
- var y = 520, b = 24, x = "--assistant-panel-inset";
41
- function S(e) {
44
+ var x = 520, S = 24, C = "--assistant-panel-inset";
45
+ function w(e) {
42
46
  return !e.isOpen || !e.isDesktop ? 0 : e.docked ? 440 : 544;
43
47
  }
44
- var C = "fixed z-50 flex flex-col overflow-hidden border border-border-default bg-bg-surface shadow-2xl inset-x-0 bottom-[var(--assistant-sheet-bottom,0px)] top-auto rounded-t-2xl animate-in slide-in-from-bottom-4 fade-in duration-200", w = "h-[60vh] max-h-[60vh]", T = "h-[88vh] max-h-[88vh]", E = "sm:inset-auto sm:top-auto sm:bottom-24 sm:right-6 sm:rounded-2xl sm:h-[680px] sm:max-h-[calc(100vh-6rem-var(--assistant-overlay-top,56px)-0.5rem)] sm:w-[520px] sm:max-w-[calc(100vw-2rem)]", D = "sm:left-auto sm:right-0 sm:top-[var(--assistant-overlay-top)] sm:bottom-0 sm:rounded-none sm:h-auto sm:max-h-none sm:w-[440px] sm:max-w-[calc(100vw-2rem)]";
45
- function O(e) {
48
+ var T = "fixed z-50 flex flex-col overflow-hidden border border-border-default bg-bg-surface shadow-2xl inset-x-0 bottom-[var(--assistant-sheet-bottom,0px)] top-auto rounded-t-2xl animate-in slide-in-from-bottom-4 fade-in duration-200", E = "h-[60vh] max-h-[60vh]", D = "h-[88vh] max-h-[88vh]", O = "sm:inset-auto sm:top-auto sm:bottom-24 sm:right-6 sm:rounded-2xl sm:h-[680px] sm:max-h-[calc(100vh-6rem-var(--assistant-overlay-top,56px)-0.5rem)] sm:w-[520px] sm:max-w-[calc(100vw-2rem)]", k = "sm:left-auto sm:right-0 sm:top-[var(--assistant-overlay-top)] sm:bottom-0 sm:rounded-none sm:h-auto sm:max-h-none sm:w-[440px] sm:max-w-[calc(100vw-2rem)]";
49
+ function A(e) {
46
50
  return [
47
- C,
48
- e.expanded ? T : w,
49
- e.docked ? D : E
51
+ T,
52
+ e.expanded ? D : E,
53
+ e.docked ? k : O
50
54
  ].join(" ");
51
55
  }
52
- function k(t) {
56
+ function j(t) {
53
57
  return (n, r) => {
54
58
  if (t.isShellLessTarget?.(n)) return t.openInNewTab(n), { kind: "new-tab" };
55
59
  let i = e(r);
@@ -60,22 +64,22 @@ function k(t) {
60
64
  } : (t.navigate(n), t.isDesktop() || t.collapseSheet(), { kind: "routed" });
61
65
  };
62
66
  }
63
- function A(e) {
67
+ function M(e) {
64
68
  if (typeof CustomEvent > "u" || !(e instanceof CustomEvent)) return "generic";
65
69
  let t = e.detail;
66
70
  return typeof t != "object" || !t || !("kind" in t) ? "generic" : t.kind === "sandbox" || t.kind === "ai-credits" ? t.kind : "generic";
67
71
  }
68
- function j(e, t) {
72
+ function N(e, t) {
69
73
  try {
70
74
  return e()?.getItem(t) === "1";
71
75
  } catch {
72
76
  return !1;
73
77
  }
74
78
  }
75
- function M(e, t, n) {
79
+ function P(e, t, n) {
76
80
  try {
77
81
  e()?.setItem(t, n ? "1" : "0");
78
82
  } catch {}
79
83
  }
80
84
  //#endregion
81
- export { u as ASSISTANT_BOTTOM_CHROME_CLEARANCE, o as ASSISTANT_DIALOG_SELECTOR, D as ASSISTANT_DOCKED_DESKTOP_CLASS, f as ASSISTANT_DOCK_WIDTH_PX, p as ASSISTANT_DOCK_WIDTH_VAR, E as ASSISTANT_FLOATING_DESKTOP_CLASS, b as ASSISTANT_FLOATING_RIGHT_PX, y as ASSISTANT_FLOATING_WIDTH_PX, g as ASSISTANT_OVERLAY_DEFAULT_TOP_PX, _ as ASSISTANT_OVERLAY_DESKTOP_QUERY, h as ASSISTANT_OVERLAY_TOP_VAR, x as ASSISTANT_PANEL_INSET_VAR, C as ASSISTANT_SHEET_BASE_CLASS, m as ASSISTANT_SHEET_BOTTOM_VAR, w as ASSISTANT_SHEET_COMPACT_CLASS, T as ASSISTANT_SHEET_EXPANDED_CLASS, i as ASSISTANT_TOGGLE_SHORTCUT_LABEL, d as aboveAssistantBottomChrome, O as assistantOverlayClassName, l as assistantOverlayEscapeAction, t as assistantOverlayKeys, A as assistantQuotaKindOf, s as closestAround, k as createAssistantNavigate, a as isAssistantToggleShortcut, r as nextAssistantOpenState, v as publishedAssistantDockWidth, S as publishedAssistantPanelInset, j as readAssistantOverlayFlag, n as requestedAssistantOpenState, M as writeAssistantOverlayFlag };
85
+ export { u as ASSISTANT_BOTTOM_CHROME_CLEARANCE, o as ASSISTANT_DIALOG_SELECTOR, k as ASSISTANT_DOCKED_DESKTOP_CLASS, m as ASSISTANT_DOCK_WIDTH_PX, h as ASSISTANT_DOCK_WIDTH_VAR, O as ASSISTANT_FLOATING_DESKTOP_CLASS, S as ASSISTANT_FLOATING_RIGHT_PX, x as ASSISTANT_FLOATING_WIDTH_PX, f as ASSISTANT_LAUNCHER_LIFT_VAR, v as ASSISTANT_OVERLAY_DEFAULT_TOP_PX, y as ASSISTANT_OVERLAY_DESKTOP_QUERY, _ as ASSISTANT_OVERLAY_TOP_VAR, C as ASSISTANT_PANEL_INSET_VAR, T as ASSISTANT_SHEET_BASE_CLASS, g as ASSISTANT_SHEET_BOTTOM_VAR, E as ASSISTANT_SHEET_COMPACT_CLASS, D as ASSISTANT_SHEET_EXPANDED_CLASS, i as ASSISTANT_TOGGLE_SHORTCUT_LABEL, d as aboveAssistantBottomChrome, p as assistantLauncherBottom, A as assistantOverlayClassName, l as assistantOverlayEscapeAction, t as assistantOverlayKeys, M as assistantQuotaKindOf, s as closestAround, j as createAssistantNavigate, a as isAssistantToggleShortcut, r as nextAssistantOpenState, b as publishedAssistantDockWidth, w as publishedAssistantPanelInset, N as readAssistantOverlayFlag, n as requestedAssistantOpenState, P as writeAssistantOverlayFlag };
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Lift the assistant launcher above a page's own bottom-right control (a chat
3
+ * composer's send button) while the page is mounted, on phones only. `lift` is
4
+ * any CSS length. Restores the previous value on unmount.
5
+ */
6
+ export declare function useAssistantLauncherLift(lift: string): void;
@@ -0,0 +1,17 @@
1
+ import { ASSISTANT_LAUNCHER_LIFT_VAR as e } from "./assistantOverlayState.js";
2
+ import { useEffect as t } from "react";
3
+ //#region src/shared/assistant/ui/useAssistantLauncherLift.ts
4
+ var n = "(max-width: 639px)";
5
+ function r(r) {
6
+ t(() => {
7
+ if (typeof window > "u" || typeof window.matchMedia != "function") return;
8
+ let t = document.documentElement, i = window.matchMedia(n), a = t.style.getPropertyValue(e), o = () => {
9
+ i.matches ? t.style.setProperty(e, r) : t.style.removeProperty(e);
10
+ };
11
+ return o(), i.addEventListener("change", o), () => {
12
+ i.removeEventListener("change", o), a ? t.style.setProperty(e, a) : t.style.removeProperty(e);
13
+ };
14
+ }, [r]);
15
+ }
16
+ //#endregion
17
+ export { r as useAssistantLauncherLift };
@@ -1,152 +1,147 @@
1
- import { getActiveProfileId as e, getProfileTokens as t, getProfileUser as n, getProfileWorkspaceToken as r, getProfiles as i, resolveActiveProfileId as a } from "./ProfileStorageManager.js";
2
- import { readShellSsoCookie as o } from "../../utils/authCookie.js";
3
- import { useBridgeInitialization as ee } from "./authProvider/useBridgeInitialization.js";
4
- import { useTokenExpiryTimer as te } from "./authProvider/useTokenExpiryTimer.js";
5
- import { useStorageSync as s } from "./authProvider/useStorageSync.js";
6
- import { useRemoteSLO as c } from "./authProvider/useRemoteSLO.js";
7
- import { useAuthActions as l } from "./authProvider/useAuthActions.js";
8
- import { useSsoDepositBootGuard as u } from "./authProvider/useSsoDepositBootGuard.js";
9
- import { createContext as d, use as f, useCallback as p, useMemo as m, useRef as h, useState as g } from "react";
10
- import { jsx as _ } from "react/jsx-runtime";
1
+ import { getActiveProfileId as e, getProfileTokens as t, getProfileUser as n, getProfileWorkspaceToken as ee, getSwitchableProfiles as r, resolveActiveProfileId as te } from "./ProfileStorageManager.js";
2
+ import { readShellSsoCookie as i } from "../../utils/authCookie.js";
3
+ import { useBridgeInitialization as a } from "./authProvider/useBridgeInitialization.js";
4
+ import { useTokenExpiryTimer as o } from "./authProvider/useTokenExpiryTimer.js";
5
+ import { useStorageSync as ne } from "./authProvider/useStorageSync.js";
6
+ import { useRemoteSLO as s } from "./authProvider/useRemoteSLO.js";
7
+ import { useAuthActions as c } from "./authProvider/useAuthActions.js";
8
+ import { useSsoDepositBootGuard as l } from "./authProvider/useSsoDepositBootGuard.js";
9
+ import { createContext as u, use as d, useCallback as f, useMemo as p, useRef as m, useState as h } from "react";
10
+ import { jsx as g } from "react/jsx-runtime";
11
11
  //#region src/shared/providers/shell/AuthProvider.tsx
12
- var v = d(null);
13
- function y({ children: d, onTokenExpired: f, onSessionExpiringSoon: y, onRefreshToken: b, bridgeUrl: x, bridgeAllowedOrigins: S, bridgeDebug: C, onBridgeReady: w }) {
14
- let T = h(!1), [E, D] = g(() => a()), [O, k] = g(() => E ? n(E) : null), [A, j] = g(() => E ? t(E) : null), [M, N] = g(() => E ? r(E) : null), [P, F] = g(() => {
15
- if (E && n(E)) return !1;
16
- if (x) try {
17
- let e = o()?.id ?? null;
12
+ var _ = u(null);
13
+ function v(e) {
14
+ return r(e).map((t) => ({
15
+ id: t.id,
16
+ email: t.email,
17
+ name: t.name,
18
+ avatar: t.avatar,
19
+ isActive: t.id === e,
20
+ lastLogin: t.lastLogin
21
+ }));
22
+ }
23
+ function y({ children: r, onTokenExpired: u, onSessionExpiringSoon: d, onRefreshToken: y, bridgeUrl: b, bridgeAllowedOrigins: x, bridgeDebug: S, onBridgeReady: C }) {
24
+ let w = m(!1), [T, E] = h(() => te()), [D, O] = h(() => T ? n(T) : null), [k, A] = h(() => T ? t(T) : null), [j, M] = h(() => T ? ee(T) : null), [N, P] = h(() => {
25
+ if (T && n(T)) return !1;
26
+ if (b) try {
27
+ let e = i()?.id ?? null;
18
28
  if (e && localStorage.getItem(`bf-p-${e}-tokens`)) return !1;
19
29
  } catch {}
20
- return !!x;
21
- }), [I, ne] = g(!1), [L, re] = g(null), [R, z] = g(() => i().map((e) => ({
22
- id: e.id,
23
- email: e.email,
24
- name: e.name,
25
- avatar: e.avatar,
26
- isActive: e.id === E,
27
- lastLogin: e.lastLogin
28
- }))), B = p(() => {
30
+ return !!b;
31
+ }), [F, I] = h(!1), [L, re] = h(null), [R, z] = h(() => v(T)), B = f(() => {
29
32
  z([]);
30
- }, []), V = p(() => {
31
- let t = e();
32
- z(i().map((e) => ({
33
- id: e.id,
34
- email: e.email,
35
- name: e.name,
36
- avatar: e.avatar,
37
- isActive: e.id === t,
38
- lastLogin: e.lastLogin
39
- })));
33
+ }, []), V = f(() => {
34
+ z(v(e()));
40
35
  }, []);
41
- ee({
42
- bridgeUrl: x,
43
- bridgeAllowedOrigins: S,
44
- bridgeDebug: C,
45
- onBridgeReady: w,
46
- bridgeSyncInProgress: T,
47
- setIsLoading: F,
48
- setActiveId: D,
49
- setUser: k,
50
- setTokens: j,
51
- setWorkspaceTokenLocal: N,
36
+ a({
37
+ bridgeUrl: b,
38
+ bridgeAllowedOrigins: x,
39
+ bridgeDebug: S,
40
+ onBridgeReady: C,
41
+ bridgeSyncInProgress: w,
42
+ setIsLoading: P,
43
+ setActiveId: E,
44
+ setUser: O,
45
+ setTokens: A,
46
+ setWorkspaceTokenLocal: M,
52
47
  clearAccounts: B,
53
48
  refreshAccounts: V
54
49
  });
55
- let { login: H, logout: U, logoutAll: W, updateUser: G, refreshAccessToken: K, hasPermission: q, setWorkspaceToken: J, setMfaState: Y, switchAccount: X, addAccount: Z, removeAccount: Q } = l({
56
- user: O,
57
- tokens: A,
58
- activeId: E,
59
- bridgeSyncInProgress: T,
60
- onRefreshToken: b,
61
- onTokenExpired: f,
62
- setActiveId: D,
63
- setUser: k,
64
- setTokens: j,
65
- setWorkspaceTokenLocal: N,
66
- setMfaRequiredState: ne,
50
+ let { login: H, logout: U, logoutAll: W, updateUser: G, refreshAccessToken: K, hasPermission: q, setWorkspaceToken: J, setMfaState: Y, switchAccount: X, addAccount: Z, removeAccount: Q } = c({
51
+ user: D,
52
+ tokens: k,
53
+ activeId: T,
54
+ bridgeSyncInProgress: w,
55
+ onRefreshToken: y,
56
+ onTokenExpired: u,
57
+ setActiveId: E,
58
+ setUser: O,
59
+ setTokens: A,
60
+ setWorkspaceTokenLocal: M,
61
+ setMfaRequiredState: I,
67
62
  setMfaChallengeIdState: re,
68
- setIsLoading: F,
63
+ setIsLoading: P,
69
64
  clearAccounts: B,
70
65
  refreshAccounts: V
71
66
  });
72
- te({
73
- tokens: A,
74
- onRefreshToken: b,
75
- onTokenExpired: f,
76
- onSessionExpiringSoon: y,
67
+ o({
68
+ tokens: k,
69
+ onRefreshToken: y,
70
+ onTokenExpired: u,
71
+ onSessionExpiringSoon: d,
77
72
  refreshAccessToken: K
78
- }), s({
79
- user: O,
80
- tokens: A,
81
- workspaceToken: M,
82
- activeId: E,
83
- setUser: k,
84
- setTokens: j,
85
- setWorkspaceTokenLocal: N,
86
- setActiveId: D,
73
+ }), ne({
74
+ user: D,
75
+ tokens: k,
76
+ workspaceToken: j,
77
+ activeId: T,
78
+ setUser: O,
79
+ setTokens: A,
80
+ setWorkspaceTokenLocal: M,
81
+ setActiveId: E,
87
82
  clearAccounts: B,
88
83
  refreshAccounts: V
89
- }), u(), c({
90
- tokens: A,
91
- bridgeUrl: x,
84
+ }), l(), s({
85
+ tokens: k,
86
+ bridgeUrl: b,
92
87
  logout: U,
93
- setActiveId: D,
94
- setUser: k,
95
- setTokens: j,
96
- setWorkspaceTokenLocal: N,
88
+ setActiveId: E,
89
+ setUser: O,
90
+ setTokens: A,
91
+ setWorkspaceTokenLocal: M,
97
92
  clearAccounts: B
98
93
  });
99
- let $ = m(() => !!O && !!A, [O, A]), ie = m(() => ({
100
- user: O,
101
- tokens: A,
94
+ let $ = p(() => !!D && !!k, [D, k]), ie = p(() => ({
95
+ user: D,
96
+ tokens: k,
102
97
  isAuthenticated: $,
103
- isLoading: P,
98
+ isLoading: N,
104
99
  login: H,
105
100
  logout: U,
106
101
  updateUser: G,
107
102
  refreshAccessToken: K,
108
103
  hasPermission: q,
109
104
  setWorkspaceToken: J,
110
- workspaceToken: M,
111
- mfaRequired: I,
105
+ workspaceToken: j,
106
+ mfaRequired: F,
112
107
  mfaChallengeId: L,
113
108
  setMfaState: Y,
114
- activeProfileId: E,
109
+ activeProfileId: T,
115
110
  accounts: R,
116
111
  switchAccount: X,
117
112
  addAccount: Z,
118
113
  removeAccount: Q,
119
114
  logoutAll: W,
120
- currentUser: O
115
+ currentUser: D
121
116
  }), [
122
- O,
123
- A,
117
+ D,
118
+ k,
124
119
  $,
125
- P,
120
+ N,
126
121
  H,
127
122
  U,
128
123
  G,
129
124
  K,
130
125
  q,
131
126
  J,
132
- M,
133
- I,
127
+ j,
128
+ F,
134
129
  L,
135
130
  Y,
136
- E,
131
+ T,
137
132
  R,
138
133
  X,
139
134
  Z,
140
135
  Q,
141
136
  W
142
137
  ]);
143
- return /* @__PURE__ */ _(v.Provider, {
138
+ return /* @__PURE__ */ g(_.Provider, {
144
139
  value: ie,
145
- children: d
140
+ children: r
146
141
  });
147
142
  }
148
143
  function b() {
149
- let e = f(v);
144
+ let e = d(_);
150
145
  if (!e) throw Error("useAuth must be used within an AuthProvider");
151
146
  return e;
152
147
  }
@@ -58,6 +58,26 @@ export interface ProfileUser {
58
58
  */
59
59
  export declare const PROFILE_STORAGE_CHANGE_EVENT = "bf-profile-storage-change";
60
60
  export declare function getProfiles(): ProfileMeta[];
61
+ /**
62
+ * True when the stored user for a profile is an account whose email was never
63
+ * verified. Such an account can't sign in (the backend rejects it with
64
+ * EMAIL_NOT_VERIFIED), so it is never a valid active or switchable profile —
65
+ * older auth builds wrote one to the list on signup alone (BOFF-7215).
66
+ */
67
+ export declare function isPendingVerificationProfile(profileId: string): boolean;
68
+ /** True when a profile holds credentials from a completed sign-in. */
69
+ export declare function hasProfileCredentials(profileId: string): boolean;
70
+ /**
71
+ * Profiles that may become the active profile. Excludes pending-verification
72
+ * accounts only: a verified profile may briefly lack tokens mid-sign-in (user
73
+ * is written before tokens), and must still resolve as active then.
74
+ */
75
+ export declare function getSelectableProfiles(): ProfileMeta[];
76
+ /**
77
+ * Profiles to list in the account switcher: selectable profiles that hold
78
+ * credentials, plus the active profile (whose tokens may be mid-write).
79
+ */
80
+ export declare function getSwitchableProfiles(activeProfileId: string | null): ProfileMeta[];
61
81
  export declare function setProfiles(profiles: ProfileMeta[]): void;
62
82
  export declare function addProfile(meta: ProfileMeta): void;
63
83
  export declare function removeProfile(profileId: string): void;