@burdenoff/fe-libs 2026.616.2 → 2026.618.1

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,20 @@
1
+ import { FC } from 'react';
2
+ import { AssistantTransport } from './types';
3
+ export interface AssistantWidgetProps {
4
+ /** Backend adapter supplied by the host product. */
5
+ transport: AssistantTransport;
6
+ /** Window header title. */
7
+ title?: string;
8
+ /** Short helper line shown above the first message. */
9
+ subtitle?: string;
10
+ /** Input placeholder. */
11
+ placeholder?: string;
12
+ /** Extra classes for the launcher button (e.g. to reposition). */
13
+ launcherClassName?: string;
14
+ /** Speech-recognition language tag. */
15
+ voiceLang?: string;
16
+ }
17
+ /** External toggle hook so command palettes / plugins can open the widget. */
18
+ export declare const ASSISTANT_WIDGET_TOGGLE_EVENT = "bf:toggle-assistant-widget";
19
+ export declare const AssistantWidget: FC<AssistantWidgetProps>;
20
+ //# sourceMappingURL=AssistantWidget.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AssistantWidget.d.ts","sourceRoot":"","sources":["../../../../src/shared/components/assistantWidget/AssistantWidget.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAML,KAAK,EAAE,EAER,MAAM,OAAO,CAAC;AAIf,OAAO,KAAK,EAAE,kBAAkB,EAA0B,MAAM,SAAS,CAAC;AAE1E,MAAM,WAAW,oBAAoB;IACnC,oDAAoD;IACpD,SAAS,EAAE,kBAAkB,CAAC;IAC9B,2BAA2B;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yBAAyB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,8EAA8E;AAC9E,eAAO,MAAM,6BAA6B,+BAA+B,CAAC;AAyB1E,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC,oBAAoB,CA6RpD,CAAC"}
@@ -0,0 +1,211 @@
1
+ import { cn as e } from "../../utils/cn.js";
2
+ import { useVoiceInput as t } from "./useVoiceInput.js";
3
+ import { useCallback as n, useEffect as r, useMemo as i, useRef as a, useState as o } from "react";
4
+ import { Loader2 as s, MessageCircle as c, Mic as l, Send as u, Sparkles as d, X as f } from "lucide-react";
5
+ import { Fragment as p, jsx as m, jsxs as h } from "react/jsx-runtime";
6
+ //#region src/shared/components/assistantWidget/AssistantWidget.tsx
7
+ var g = "bf:toggle-assistant-widget", _ = "bf:assistant-widget:isOpen";
8
+ function v() {
9
+ if (typeof window > "u") return !1;
10
+ try {
11
+ return window.sessionStorage.getItem(_) === "1";
12
+ } catch {
13
+ return !1;
14
+ }
15
+ }
16
+ function y(e) {
17
+ if (!(typeof window > "u")) try {
18
+ window.sessionStorage.setItem(_, e ? "1" : "0");
19
+ } catch {}
20
+ }
21
+ function b() {
22
+ return `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
23
+ }
24
+ var x = ({ transport: _, title: x = "AI Assistant", subtitle: S = "Ask me to do things on this screen — I can run them for you.", placeholder: C = "Ask anything, or describe what to create…", launcherClassName: w, voiceLang: T = "en-US" }) => {
25
+ let [E, D] = o(() => v()), [O, k] = o([]), [A, j] = o(""), [M, N] = o(!1), P = a(null), F = a(null), I = a(null), L = t(T), R = n(() => {
26
+ y(!0), D(!0);
27
+ }, []), z = n(() => {
28
+ y(!1), D(!1);
29
+ }, []), B = n(() => {
30
+ D((e) => {
31
+ let t = !e;
32
+ return y(t), t;
33
+ });
34
+ }, []);
35
+ r(() => {
36
+ let e = (e) => {
37
+ let t = e.detail;
38
+ t?.open === !0 ? R() : t?.open === !1 ? z() : B();
39
+ };
40
+ return window.addEventListener(g, e), () => window.removeEventListener(g, e);
41
+ }, [
42
+ R,
43
+ z,
44
+ B
45
+ ]), r(() => {
46
+ L.isListening && L.transcript && j(L.transcript);
47
+ }, [L.transcript, L.isListening]), r(() => {
48
+ E && F.current && (F.current.scrollTop = F.current.scrollHeight);
49
+ }, [O, E]);
50
+ let V = n((e, t) => {
51
+ k((n) => n.map((n) => n.id === e ? {
52
+ ...n,
53
+ ...t
54
+ } : n));
55
+ }, []), H = n(async () => {
56
+ let e = A.trim();
57
+ if (!e || M) return;
58
+ L.isListening && L.stop(), L.reset(), j(""), P.current && (P.current.style.height = "auto");
59
+ let t = {
60
+ id: b(),
61
+ role: "user",
62
+ content: e
63
+ }, n = b();
64
+ k((e) => [
65
+ ...e,
66
+ t,
67
+ {
68
+ id: n,
69
+ role: "assistant",
70
+ content: "",
71
+ pending: !0
72
+ }
73
+ ]), N(!0);
74
+ let r = new AbortController();
75
+ I.current = r;
76
+ try {
77
+ let { text: t } = await _.sendPrompt({
78
+ prompt: e,
79
+ signal: r.signal,
80
+ onProgress: (e) => V(n, { content: e })
81
+ });
82
+ V(n, {
83
+ content: t,
84
+ pending: !1
85
+ });
86
+ } catch (e) {
87
+ V(n, {
88
+ content: `Sorry, I couldn't complete that: ${e instanceof Error ? e.message : "Something went wrong. Please try again."}`,
89
+ pending: !1,
90
+ error: !0
91
+ });
92
+ } finally {
93
+ N(!1), I.current = null;
94
+ }
95
+ }, [
96
+ A,
97
+ M,
98
+ V,
99
+ _,
100
+ L
101
+ ]), U = n((e) => {
102
+ e.key === "Enter" && !e.shiftKey && (e.preventDefault(), H());
103
+ }, [H]), W = n(() => {
104
+ let e = P.current;
105
+ e && (e.style.height = "auto", e.style.height = `${Math.min(e.scrollHeight, 120)}px`);
106
+ }, []), G = n(() => {
107
+ L.isListening ? L.stop() : L.start();
108
+ }, [L]);
109
+ return /* @__PURE__ */ h(p, { children: [i(() => /* @__PURE__ */ m("button", {
110
+ type: "button",
111
+ onClick: B,
112
+ "aria-label": E ? "Close AI assistant" : "Open AI assistant",
113
+ "aria-expanded": E,
114
+ "data-testid": "assistant-widget-launcher",
115
+ className: e("fixed bottom-6 right-6 z-[100] inline-flex size-14 items-center justify-center rounded-full", "bg-action-primary-bg text-action-primary-text shadow-xl transition-transform duration-200", "hover:scale-105 hover:bg-action-primary-bg-hover focus:outline-none focus-visible:ring-2 focus-visible:ring-border-strong cursor-pointer", w),
116
+ children: m(E ? f : d, { className: "size-6" })
117
+ }), [
118
+ E,
119
+ B,
120
+ w
121
+ ]), E ? /* @__PURE__ */ h("div", {
122
+ role: "dialog",
123
+ "aria-label": x,
124
+ "data-testid": "assistant-widget-window",
125
+ className: e("fixed z-[100] flex flex-col overflow-hidden rounded-xl border border-border-default bg-bg-surface shadow-2xl", "bottom-24 right-6 h-[560px] max-h-[calc(100vh-7rem)] w-[calc(100vw-3rem)] sm:w-[400px]", "animate-in slide-in-from-bottom-2 fade-in duration-200"),
126
+ children: [
127
+ /* @__PURE__ */ h("div", {
128
+ className: "flex items-center justify-between gap-2 border-b border-border-subtle bg-bg-surface px-4 py-3",
129
+ children: [/* @__PURE__ */ h("div", {
130
+ className: "flex min-w-0 items-center gap-2",
131
+ children: [/* @__PURE__ */ m("span", {
132
+ className: "inline-flex size-7 shrink-0 items-center justify-center rounded-full bg-action-primary-bg/10 text-action-primary-bg",
133
+ children: /* @__PURE__ */ m(d, { className: "size-4" })
134
+ }), /* @__PURE__ */ m("h2", {
135
+ className: "truncate text-sm font-semibold text-text-primary",
136
+ children: x
137
+ })]
138
+ }), /* @__PURE__ */ m("button", {
139
+ type: "button",
140
+ onClick: z,
141
+ "aria-label": "Close AI assistant",
142
+ "data-testid": "assistant-widget-close",
143
+ className: "inline-flex size-8 shrink-0 items-center justify-center rounded-md text-text-secondary transition-colors hover:bg-bg-sunken hover:text-text-primary focus:outline-none focus-visible:ring-2 focus-visible:ring-border-strong cursor-pointer",
144
+ children: /* @__PURE__ */ m(f, { className: "size-4" })
145
+ })]
146
+ }),
147
+ /* @__PURE__ */ m("div", {
148
+ ref: F,
149
+ className: "flex-1 space-y-3 overflow-y-auto px-4 py-4",
150
+ "data-testid": "assistant-widget-messages",
151
+ children: O.length === 0 ? /* @__PURE__ */ h("div", {
152
+ className: "flex h-full flex-col items-center justify-center gap-3 text-center",
153
+ children: [/* @__PURE__ */ m("span", {
154
+ className: "inline-flex size-12 items-center justify-center rounded-full bg-bg-sunken text-action-primary-bg",
155
+ children: /* @__PURE__ */ m(c, { className: "size-6" })
156
+ }), /* @__PURE__ */ m("p", {
157
+ className: "max-w-[16rem] text-xs leading-relaxed text-text-secondary",
158
+ children: S
159
+ })]
160
+ }) : O.map((t) => /* @__PURE__ */ m("div", {
161
+ className: e("flex", t.role === "user" ? "justify-end" : "justify-start"),
162
+ children: /* @__PURE__ */ h("div", {
163
+ "data-testid": `assistant-widget-message-${t.role}`,
164
+ className: e("max-w-[85%] whitespace-pre-wrap break-words rounded-lg px-3 py-2 text-xs leading-relaxed", t.role === "user" ? "bg-action-primary-bg text-action-primary-text" : t.error ? "bg-status-error-bg/10 text-status-error-bg" : "bg-bg-sunken text-text-primary"),
165
+ children: [t.content || (t.pending, ""), t.pending ? /* @__PURE__ */ h("span", {
166
+ className: "mt-1 inline-flex items-center gap-1 text-text-secondary",
167
+ children: [/* @__PURE__ */ m(s, { className: "size-3 animate-spin" }), /* @__PURE__ */ m("span", { children: "Thinking…" })]
168
+ }) : null]
169
+ })
170
+ }, t.id))
171
+ }),
172
+ /* @__PURE__ */ h("div", {
173
+ className: "flex items-end gap-2 border-t border-border-default bg-bg-surface px-3 py-2.5",
174
+ children: [
175
+ L.isSupported ? /* @__PURE__ */ m("button", {
176
+ type: "button",
177
+ onClick: G,
178
+ "aria-label": L.isListening ? "Stop voice input" : "Start voice input",
179
+ "aria-pressed": L.isListening,
180
+ "data-testid": "assistant-widget-mic",
181
+ className: e("flex size-9 shrink-0 items-center justify-center rounded-lg transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-border-strong cursor-pointer", L.isListening ? "animate-pulse bg-status-error-bg text-action-primary-text" : "bg-bg-sunken text-text-secondary hover:text-text-primary"),
182
+ children: /* @__PURE__ */ m(l, { className: "size-4" })
183
+ }) : null,
184
+ /* @__PURE__ */ m("textarea", {
185
+ ref: P,
186
+ value: A,
187
+ onChange: (e) => j(e.target.value),
188
+ onKeyDown: U,
189
+ onInput: W,
190
+ rows: 1,
191
+ placeholder: C,
192
+ "aria-label": "Message the assistant",
193
+ "data-testid": "assistant-widget-input",
194
+ className: "flex-1 resize-none rounded-lg border border-border-default bg-bg-sunken px-3 py-2 text-xs leading-relaxed text-text-primary placeholder:text-text-muted focus:border-action-primary-bg focus:outline-none"
195
+ }),
196
+ /* @__PURE__ */ m("button", {
197
+ type: "button",
198
+ onClick: () => void H(),
199
+ disabled: M || A.trim().length === 0,
200
+ "aria-label": "Send message",
201
+ "data-testid": "assistant-widget-send",
202
+ className: "flex size-9 shrink-0 items-center justify-center rounded-lg bg-action-primary-bg text-action-primary-text transition-colors hover:bg-action-primary-bg-hover focus:outline-none focus-visible:ring-2 focus-visible:ring-border-strong disabled:opacity-50 cursor-pointer",
203
+ children: M ? /* @__PURE__ */ m(s, { className: "size-4 animate-spin" }) : /* @__PURE__ */ m(u, { className: "size-4" })
204
+ })
205
+ ]
206
+ })
207
+ ]
208
+ }) : null] });
209
+ };
210
+ //#endregion
211
+ export { g as ASSISTANT_WIDGET_TOGGLE_EVENT, x as AssistantWidget };
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Shared, product-agnostic types for the floating AssistantWidget.
3
+ *
4
+ * The widget itself (fe-libs, Layer 1) knows nothing about how prompts are
5
+ * fulfilled — each host product injects an `AssistantTransport` that performs
6
+ * the actual backend work (e.g. VibeControls wraps its sandbox `api-calls`
7
+ * agent). This keeps the UI reusable across every product shell while the
8
+ * backend wiring lives in the product layer that is allowed to depend on it.
9
+ */
10
+ export type AssistantWidgetRole = 'user' | 'assistant';
11
+ export interface AssistantWidgetMessage {
12
+ id: string;
13
+ role: AssistantWidgetRole;
14
+ /** Rendered as plain text / lightweight markdown. */
15
+ content: string;
16
+ /** Marks an assistant message that is still streaming. */
17
+ pending?: boolean;
18
+ /** Marks an assistant message that ended in an error. */
19
+ error?: boolean;
20
+ }
21
+ export interface AssistantSendArgs {
22
+ /** The user's prompt text. */
23
+ prompt: string;
24
+ /**
25
+ * Called repeatedly with the latest partial assistant text while the turn
26
+ * streams. The widget renders this live so users see progress.
27
+ */
28
+ onProgress: (partialText: string) => void;
29
+ /** Aborts the in-flight turn when the user closes/cancels. */
30
+ signal: AbortSignal;
31
+ }
32
+ /**
33
+ * Backend adapter the host product supplies. A single transport instance is
34
+ * reused across turns so it can keep a warm session/sandbox between sends.
35
+ */
36
+ export interface AssistantTransport {
37
+ sendPrompt: (args: AssistantSendArgs) => Promise<{
38
+ text: string;
39
+ }>;
40
+ }
41
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/shared/components/assistantWidget/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,WAAW,CAAC;AAEvD,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,mBAAmB,CAAC;IAC1B,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yDAAyD;IACzD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,8BAA8B;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,UAAU,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,8DAA8D;IAC9D,MAAM,EAAE,WAAW,CAAC;CACrB;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpE"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Speech-to-text hook for the AssistantWidget (browser Web Speech API).
3
+ *
4
+ * Input-only: it transcribes microphone speech into text. There is no
5
+ * text-to-speech here by design (the widget does not read replies aloud).
6
+ * Gracefully degrades — `isSupported` is false on browsers without
7
+ * SpeechRecognition, and the mic button is hidden in that case.
8
+ */
9
+ export interface UseVoiceInputReturn {
10
+ isSupported: boolean;
11
+ isListening: boolean;
12
+ /** Final transcript accumulated since the last `reset()`. */
13
+ transcript: string;
14
+ start: () => void;
15
+ stop: () => void;
16
+ reset: () => void;
17
+ }
18
+ export declare function useVoiceInput(lang?: string): UseVoiceInputReturn;
19
+ //# sourceMappingURL=useVoiceInput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useVoiceInput.d.ts","sourceRoot":"","sources":["../../../../src/shared/components/assistantWidget/useVoiceInput.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAsCH,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,6DAA6D;IAC7D,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,wBAAgB,aAAa,CAAC,IAAI,SAAU,GAAG,mBAAmB,CAkEjE"}
@@ -0,0 +1,41 @@
1
+ import { useCallback as e, useEffect as t, useRef as n, useState as r } from "react";
2
+ //#region src/shared/components/assistantWidget/useVoiceInput.ts
3
+ function i() {
4
+ if (typeof window > "u") return null;
5
+ let e = window;
6
+ return e.SpeechRecognition ?? e.webkitSpeechRecognition ?? null;
7
+ }
8
+ function a(a = "en-US") {
9
+ let [o, s] = r(!1), [c, l] = r(""), u = n(null), d = i(), f = d !== null;
10
+ return t(() => () => {
11
+ u.current &&= (u.current.abort(), null);
12
+ }, []), {
13
+ isSupported: f,
14
+ isListening: o,
15
+ transcript: c,
16
+ start: e(() => {
17
+ if (!d || u.current) return;
18
+ let e = new d();
19
+ e.continuous = !0, e.interimResults = !0, e.lang = a, e.onresult = (e) => {
20
+ let t = "";
21
+ for (let n = e.resultIndex; n < e.results.length; n++) {
22
+ let r = e.results[n];
23
+ r.isFinal && (t += r[0].transcript);
24
+ }
25
+ t && l((e) => e ? `${e} ${t}` : t);
26
+ }, e.onerror = () => {
27
+ s(!1), u.current = null;
28
+ }, e.onend = () => {
29
+ s(!1), u.current = null;
30
+ }, u.current = e, e.start(), s(!0);
31
+ }, [d, a]),
32
+ stop: e(() => {
33
+ u.current &&= (u.current.stop(), null), s(!1);
34
+ }, []),
35
+ reset: e(() => {
36
+ l("");
37
+ }, [])
38
+ };
39
+ }
40
+ //#endregion
41
+ export { a as useVoiceInput };
@@ -26,4 +26,9 @@ export type { UpgradePromptModalProps, UpgradePromptDetail } from './UpgradeProm
26
26
  export { UpgradeInlineBanner } from './UpgradeInlineBanner';
27
27
  export type { UpgradeInlineBannerProps } from './UpgradeInlineBanner';
28
28
  export { getSSORedirectUrl, SSORedirectSpinner, checkSLO, checkRemoteSLO, clearLocalAuthState, } from './SSORedirectGuard';
29
+ export { AssistantWidget, ASSISTANT_WIDGET_TOGGLE_EVENT } from './assistantWidget/AssistantWidget';
30
+ export type { AssistantWidgetProps } from './assistantWidget/AssistantWidget';
31
+ export { useVoiceInput } from './assistantWidget/useVoiceInput';
32
+ export type { UseVoiceInputReturn } from './assistantWidget/useVoiceInput';
33
+ export type { AssistantTransport, AssistantSendArgs, AssistantWidgetMessage, AssistantWidgetRole, } from './assistantWidget/types';
29
34
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/components/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC1D,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGzE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACpF,YAAY,EACV,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAChE,YAAY,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAI/E,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,YAAY,EAAE,+BAA+B,EAAE,MAAM,8BAA8B,CAAC;AAEpF,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AACjG,YAAY,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAE9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE,OAAO,EAAE,aAAa,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEvE,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,YAAY,EAAE,8BAA8B,EAAE,MAAM,6BAA6B,CAAC;AAGlF,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAGxE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGpD,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEzF,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAGtE,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,QAAQ,EACR,cAAc,EACd,mBAAmB,GACpB,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/components/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC1D,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGzE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACpF,YAAY,EACV,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAChE,YAAY,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAI/E,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,YAAY,EAAE,+BAA+B,EAAE,MAAM,8BAA8B,CAAC;AAEpF,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AACjG,YAAY,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAE9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE,OAAO,EAAE,aAAa,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEvE,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,YAAY,EAAE,8BAA8B,EAAE,MAAM,6BAA6B,CAAC;AAGlF,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAGxE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGpD,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEzF,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAGtE,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,QAAQ,EACR,cAAc,EACd,mBAAmB,GACpB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,eAAe,EAAE,6BAA6B,EAAE,MAAM,mCAAmC,CAAC;AACnG,YAAY,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,YAAY,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,YAAY,EACV,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { clsx as e } from "clsx";
2
+ import { twMerge as t } from "tailwind-merge";
3
+ //#region src/shared/utils/cn.ts
4
+ function n(...n) {
5
+ return t(e(n));
6
+ }
7
+ //#endregion
8
+ export { n as cn };
@@ -14,4 +14,6 @@ import { KeyboardHelpDialogWrapper as S } from "./shared/components/KeyboardHelp
14
14
  import { QuotaMeter as C } from "./shared/components/QuotaMeter.js";
15
15
  import { UPGRADE_PROMPT_EVENT as w, UpgradePromptModal as T, dispatchUpgradePrompt as E } from "./shared/components/UpgradePromptModal.js";
16
16
  import { UpgradeInlineBanner as D } from "./shared/components/UpgradeInlineBanner.js";
17
- export { d as AccessDenied, b as AppErrorBoundary, v as ConditionalShell, x as ContextConversationWidget, a as ErrorBoundary, p as ErrorFallback, S as KeyboardHelpDialogWrapper, m as LoadingFallback, _ 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 };
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
+ export { k as ASSISTANT_WIDGET_TOGGLE_EVENT, d as AccessDenied, b as AppErrorBoundary, A as AssistantWidget, v as ConditionalShell, x as ContextConversationWidget, a as ErrorBoundary, p as ErrorFallback, S as KeyboardHelpDialogWrapper, m as LoadingFallback, _ 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 };
package/dist/shared.js CHANGED
@@ -52,65 +52,67 @@ import { KeyboardHelpDialogWrapper as gn } from "./shared/components/KeyboardHel
52
52
  import { QuotaMeter as _n } from "./shared/components/QuotaMeter.js";
53
53
  import { UPGRADE_PROMPT_EVENT as vn, UpgradePromptModal as yn, dispatchUpgradePrompt as bn } from "./shared/components/UpgradePromptModal.js";
54
54
  import { UpgradeInlineBanner as xn } from "./shared/components/UpgradeInlineBanner.js";
55
+ import { useVoiceInput as Sn } from "./shared/components/assistantWidget/useVoiceInput.js";
56
+ import { ASSISTANT_WIDGET_TOGGLE_EVENT as Cn, AssistantWidget as wn } from "./shared/components/assistantWidget/AssistantWidget.js";
55
57
  import "./shared-components.js";
56
- import { DevtoolsSink as Sn } from "./shared/events/sinks/DevtoolsSink.js";
57
- import { BroadcastChannelSink as Cn } from "./shared/events/sinks/BroadcastChannelSink.js";
58
- import { BackendAuditSink as wn } from "./shared/events/sinks/BackendAuditSink.js";
59
- import { RybbitSink as Tn } from "./shared/events/sinks/RybbitSink.js";
60
- import { OtelBrowserSink as En } from "./shared/events/sinks/OtelBrowserSink.js";
61
- import { EventBusProvider as Dn, createEventBus as On, useEvent as kn, useEventBus as An, useEventEmitter as jn } from "./shared-events.js";
62
- import { useDebounce as Mn } from "./shared/hooks/useDebounce.js";
63
- import { useThrottle as Nn } from "./shared/hooks/useThrottle.js";
64
- import { BREAKPOINTS as Pn, useBreakpoint as Fn, useMobileBreakpoint as In } from "./shared/hooks/useBreakpoint.js";
65
- import { useOnClickOutside as Ln, useOnClickOutsideWithRef as Rn } from "./shared/hooks/useOnClickOutside.js";
66
- import { useKeyPress as zn, useKeyboardShortcut as Bn } from "./shared/hooks/useKeyPress.js";
67
- import { useCopyToClipboard as Vn } from "./shared/hooks/useCopyToClipboard.js";
68
- import { useLocalStorage as Hn } from "./shared/hooks/useLocalStorage.js";
69
- import { useSessionStorage as Un } from "./shared/hooks/useSessionStorage.js";
70
- import { usePrevious as Wn, usePreviousDistinct as Gn, usePreviousHistory as Kn } from "./shared/hooks/usePrevious.js";
71
- import { useConditionalToggle as qn, useToggle as Jn, useToggleObject as Yn } from "./shared/hooks/useToggle.js";
72
- import { useAsync as Xn, useAsyncImmediate as Zn } from "./shared/hooks/useAsync.js";
73
- import { MODIFIER_KEYS as Qn, PLATFORM_TYPES as $n } from "./shared/keyboard/types.js";
74
- import { useKeyboardShortcuts as er } from "./shared/keyboard/useKeyboardShortcuts.js";
75
- import { useHotkeys as tr } from "./shared/keyboard/useHotkeys.js";
76
- import { useShortcutHelp as nr } from "./shared/keyboard/useShortcutHelp.js";
77
- import { GLOBAL_SHORTCUT_CATEGORIES as rr, createGlobalShortcuts as ir, getGlobalShortcutsByCategory as ar, mergeShortcuts as or } from "./shared/keyboard/globalShortcuts.js";
78
- import { useLogger as sr } from "./shared/logger/useLogger.js";
79
- import { useHasAnimated as cr } from "./shared/hooks/useHasAnimated.js";
80
- import { useReferralAttribution as lr } from "./shared/hooks/useReferralAttribution.js";
81
- import { useRecordProductVisit as ur } from "./shared/hooks/useRecordProductVisit.js";
82
- import { QUOTA_EXHAUSTED_EVENT as dr, dispatchQuotaExhausted as fr, useQuotaErrorToast as pr } from "./shared/hooks/useQuotaErrorToast.js";
83
- import { PLAN_USAGE_SNAPSHOT_EVENT as mr, publishPlanUsageSnapshot as hr, useUpgradePrompt as gr } from "./shared/hooks/useUpgradePrompt.js";
84
- import { appendContextToPath as _r, useCurrentContextSearchParams as vr } from "./shared/hooks/useCurrentContextSearchParams.js";
85
- import { MicrofrontendContext as yr, useMicrofrontendContext as br } from "./shared-hooks.js";
86
- import { detectDeviceType as xr, getResponsiveSelector as Sr } from "./shared/tours/types.js";
87
- import { useTourPlayer as Cr } from "./shared/tours/useTourPlayer.js";
88
- import { TourSpotlight as wr } from "./shared/tours/TourSpotlight.js";
89
- import { TourTooltip as Tr } from "./shared/tours/TourTooltip.js";
90
- import { TourPlayerProvider as Er, useIsTourPlaying as Dr, useStartTour as Or, useStopTour as kr, useTourPlayerContext as Ar } from "./shared/tours/TourPlayerProvider.js";
91
- import { TourPlayer as jr, TourTriggerButton as Mr, usePlayTour as Nr } from "./shared/tours/TourPlayer.js";
92
- import { getTourContextRank as Pr, getTourRouteCatalog as Fr, getTourRouteModules as Ir, getTourRoutePages as Lr, isTourVisibleForContext as Rr, normalizeTourPath as zr, registerTourRouteCatalog as Br, resolveTourTargetPath as Vr } from "./shared/tours/routeCatalog.js";
93
- import { withTourProgressStatus as Hr } from "./shared/tours/progress.js";
94
- import { ToursProvider as Ur, useAutoStartTour as Wr, useSafeToursContext as Gr, useTours as Kr, useToursContext as qr } from "./shared/tours/ToursContext.js";
95
- import { TourInitializer as Jr } from "./shared/tours/TourInitializer.js";
96
- import { AppShellProvider as Yr, resolveAppShellObservabilityConfig as Xr } from "./shared/providers/AppShellProvider.js";
97
- import { MicrofrontendProvider as Zr } from "./shared-providers.js";
98
- import { TourTrigger as Qr } from "./shared/tours/TourTrigger.js";
58
+ import { DevtoolsSink as Tn } from "./shared/events/sinks/DevtoolsSink.js";
59
+ import { BroadcastChannelSink as En } from "./shared/events/sinks/BroadcastChannelSink.js";
60
+ import { BackendAuditSink as Dn } from "./shared/events/sinks/BackendAuditSink.js";
61
+ import { RybbitSink as On } from "./shared/events/sinks/RybbitSink.js";
62
+ import { OtelBrowserSink as kn } from "./shared/events/sinks/OtelBrowserSink.js";
63
+ import { EventBusProvider as An, createEventBus as jn, useEvent as Mn, useEventBus as Nn, useEventEmitter as Pn } from "./shared-events.js";
64
+ import { useDebounce as Fn } from "./shared/hooks/useDebounce.js";
65
+ import { useThrottle as In } from "./shared/hooks/useThrottle.js";
66
+ import { BREAKPOINTS as Ln, useBreakpoint as Rn, useMobileBreakpoint as zn } from "./shared/hooks/useBreakpoint.js";
67
+ import { useOnClickOutside as Bn, useOnClickOutsideWithRef as Vn } from "./shared/hooks/useOnClickOutside.js";
68
+ import { useKeyPress as Hn, useKeyboardShortcut as Un } from "./shared/hooks/useKeyPress.js";
69
+ import { useCopyToClipboard as Wn } from "./shared/hooks/useCopyToClipboard.js";
70
+ import { useLocalStorage as Gn } from "./shared/hooks/useLocalStorage.js";
71
+ import { useSessionStorage as Kn } from "./shared/hooks/useSessionStorage.js";
72
+ import { usePrevious as qn, usePreviousDistinct as Jn, usePreviousHistory as Yn } from "./shared/hooks/usePrevious.js";
73
+ import { useConditionalToggle as Xn, useToggle as Zn, useToggleObject as Qn } from "./shared/hooks/useToggle.js";
74
+ import { useAsync as $n, useAsyncImmediate as er } from "./shared/hooks/useAsync.js";
75
+ import { MODIFIER_KEYS as tr, PLATFORM_TYPES as nr } from "./shared/keyboard/types.js";
76
+ import { useKeyboardShortcuts as rr } from "./shared/keyboard/useKeyboardShortcuts.js";
77
+ import { useHotkeys as ir } from "./shared/keyboard/useHotkeys.js";
78
+ import { useShortcutHelp as ar } from "./shared/keyboard/useShortcutHelp.js";
79
+ import { GLOBAL_SHORTCUT_CATEGORIES as or, createGlobalShortcuts as sr, getGlobalShortcutsByCategory as cr, mergeShortcuts as lr } from "./shared/keyboard/globalShortcuts.js";
80
+ import { useLogger as ur } from "./shared/logger/useLogger.js";
81
+ import { useHasAnimated as dr } from "./shared/hooks/useHasAnimated.js";
82
+ import { useReferralAttribution as fr } from "./shared/hooks/useReferralAttribution.js";
83
+ import { useRecordProductVisit as pr } from "./shared/hooks/useRecordProductVisit.js";
84
+ import { QUOTA_EXHAUSTED_EVENT as mr, dispatchQuotaExhausted as hr, useQuotaErrorToast as gr } from "./shared/hooks/useQuotaErrorToast.js";
85
+ import { PLAN_USAGE_SNAPSHOT_EVENT as _r, publishPlanUsageSnapshot as vr, useUpgradePrompt as yr } from "./shared/hooks/useUpgradePrompt.js";
86
+ import { appendContextToPath as br, useCurrentContextSearchParams as xr } from "./shared/hooks/useCurrentContextSearchParams.js";
87
+ import { MicrofrontendContext as Sr, useMicrofrontendContext as Cr } from "./shared-hooks.js";
88
+ import { detectDeviceType as wr, getResponsiveSelector as Tr } from "./shared/tours/types.js";
89
+ import { useTourPlayer as Er } from "./shared/tours/useTourPlayer.js";
90
+ import { TourSpotlight as Dr } from "./shared/tours/TourSpotlight.js";
91
+ import { TourTooltip as Or } from "./shared/tours/TourTooltip.js";
92
+ import { TourPlayerProvider as kr, useIsTourPlaying as Ar, useStartTour as jr, useStopTour as Mr, useTourPlayerContext as Nr } from "./shared/tours/TourPlayerProvider.js";
93
+ import { TourPlayer as Pr, TourTriggerButton as Fr, usePlayTour as Ir } from "./shared/tours/TourPlayer.js";
94
+ import { getTourContextRank as Lr, getTourRouteCatalog as Rr, getTourRouteModules as zr, getTourRoutePages as Br, isTourVisibleForContext as Vr, normalizeTourPath as Hr, registerTourRouteCatalog as Ur, resolveTourTargetPath as Wr } from "./shared/tours/routeCatalog.js";
95
+ import { withTourProgressStatus as Gr } from "./shared/tours/progress.js";
96
+ import { ToursProvider as Kr, useAutoStartTour as qr, useSafeToursContext as Jr, useTours as Yr, useToursContext as Xr } from "./shared/tours/ToursContext.js";
97
+ import { TourInitializer as Zr } from "./shared/tours/TourInitializer.js";
98
+ import { AppShellProvider as Qr, resolveAppShellObservabilityConfig as $r } from "./shared/providers/AppShellProvider.js";
99
+ import { MicrofrontendProvider as ei } from "./shared-providers.js";
100
+ import { TourTrigger as ti } from "./shared/tours/TourTrigger.js";
99
101
  import "./shared-tours.js";
100
- import { getNativeBridge as $r } from "./shared/native/bridge.js";
101
- import { getPlatform as ei, isAndroid as ti, isIOS as ni, isNative as ri, isWeb as ii } from "./shared/native/platform.js";
102
- import { nativeConfirm as ai, nativeCopyText as oi, nativeImpact as si, nativeNotify as ci, nativeOpenUrl as li, nativeShare as ui, nativeToast as di } from "./shared/native/consumers.js";
103
- import { SafeAreaView as fi } from "./shared/native/SafeAreaView.js";
104
- import { useNativePlatform as pi } from "./shared/native/hooks/useNativePlatform.js";
105
- import { useSafeArea as mi } from "./shared/native/hooks/useSafeArea.js";
106
- import { useNativeKeyboard as hi } from "./shared/native/hooks/useNativeKeyboard.js";
107
- import { useAppState as gi } from "./shared/native/hooks/useAppState.js";
108
- import { useDeviceInfo as _i } from "./shared/native/hooks/useDeviceInfo.js";
109
- import { useHaptics as vi } from "./shared/native/hooks/useHaptics.js";
110
- import { useStatusBar as yi } from "./shared/native/hooks/useStatusBar.js";
102
+ import { getNativeBridge as ni } from "./shared/native/bridge.js";
103
+ import { getPlatform as ri, isAndroid as ii, isIOS as ai, isNative as oi, isWeb as si } from "./shared/native/platform.js";
104
+ import { nativeConfirm as ci, nativeCopyText as li, nativeImpact as ui, nativeNotify as di, nativeOpenUrl as fi, nativeShare as pi, nativeToast as mi } from "./shared/native/consumers.js";
105
+ import { SafeAreaView as hi } from "./shared/native/SafeAreaView.js";
106
+ import { useNativePlatform as gi } from "./shared/native/hooks/useNativePlatform.js";
107
+ import { useSafeArea as _i } from "./shared/native/hooks/useSafeArea.js";
108
+ import { useNativeKeyboard as vi } from "./shared/native/hooks/useNativeKeyboard.js";
109
+ import { useAppState as yi } from "./shared/native/hooks/useAppState.js";
110
+ import { useDeviceInfo as bi } from "./shared/native/hooks/useDeviceInfo.js";
111
+ import { useHaptics as xi } from "./shared/native/hooks/useHaptics.js";
112
+ import { useStatusBar as Si } from "./shared/native/hooks/useStatusBar.js";
111
113
  import "./shared-native.js";
112
114
  import "./shared/actors/index.js";
113
115
  //#region src/shared/index.ts
114
- var bi = "1.0.0";
116
+ var Ci = "1.0.0";
115
117
  //#endregion
116
- export { Rt as AccessDenied, kt as ActorIdentity, Me as ApolloClient, Ne as ApolloProvider, Jt as AppErrorBoundary, ot as AppInitializer, Yr as AppShellProvider, re as BACKEND_ERROR_EVENT, Pn as BREAKPOINTS, wn as BackendAuditSink, Cn as BroadcastChannelSink, W as COMMON_SHELL_LESS_ROUTES, ie as CONNECTION_STATUS_EVENT, Gt as ConditionalShell, pt as ConsoleTransport, tn as ContextConversationWidget, X as DEFAULT_PAGE_SIZE, G as DEFAULT_SHELL_CONFIG, Sn as DevtoolsSink, Mt as ErrorBoundary, Bt as ErrorFallback, Dn as EventBusProvider, bi as FE_SHARED_VERSION, Yt as FeatureFlagProvider, en as FeatureGate, Z as GATEWAYS, rr as GLOBAL_SHORTCUT_CATEGORIES, Ee as GatewayProvider, Pe as InMemoryCache, gn as KeyboardHelpDialogWrapper, Vt as LoadingFallback, lt as LogLevel, dt as LogManager, ut as Logger, Qn as MODIFIER_KEYS, yr as MicrofrontendContext, Wt as MicrofrontendErrorBoundary, Zr as MicrofrontendProvider, En as OtelBrowserSink, mr as PLAN_USAGE_SNAPSHOT_EVENT, $n as PLATFORM_TYPES, B as PRODUCTS, V as PRODUCT_URLS, qt as PWAInstallBanner, Ht as PageLoadingFallback, Ft as PermissionButton, zt as PermissionDenied, It as PermissionGate, Lt as PermissionLink, yt as QUOTA_EXHAUSTED_CODE, dr as QUOTA_EXHAUSTED_EVENT, _n as QuotaMeter, bt as RESOURCE_CAP_EXCEEDED_CODE, Nt as RequireAuth, Pt as RequireGuest, Tn as RybbitSink, be as SSELink, tt as SSORedirectSpinner, xt as STORAGE_QUOTA_EXCEEDED_CODE, fi as SafeAreaView, Ut as SectionLoadingFallback, Jr as TourInitializer, jr as TourPlayer, Er as TourPlayerProvider, wr as TourSpotlight, Tr as TourTooltip, Qr as TourTrigger, Mr as TourTriggerButton, Ur as ToursProvider, St as UPGRADE_ERROR_CODES, vn as UPGRADE_PROMPT_EVENT, xn as UpgradeInlineBanner, yn as UpgradePromptModal, je as WsLink, n as alertTokens, _r as appendContextToPath, Ve as attemptTokenRefresh, At as buildActorFallback, Ct as buildQuotaExhaustedMessage, p as capitalizeFirst, m as capitalizeWords, r as categoryTokens, nt as checkRemoteSLO, rt as checkSLO, He as clearAuthSessionStorage, it as clearLocalAuthState, qe as clearSSoCookie, Je as clearShellSsoCookies, mt as clearUserContext, Ot as cn, t as createApolloClient, On as createEventBus, ir as createGlobalShortcuts, xe as createGraphQLClient, _t as createProfileScopedStorage, xr as detectDeviceType, nn as detectPlatform, ae as dispatchBackendErrorEvent, fr as dispatchQuotaExhausted, bn as dispatchUpgradePrompt, oe as extractBackendError, wt as extractQuotaExhaustedExtensions, Tt as extractUpgradeErrorExtensions, h as formatBytes, g as formatCompactNumber, _ as formatCurrency, v as formatCurrencyCompact, y as formatDate, b as formatDateTime, x as formatDuration, rn as formatKeyCombo, S as formatList, C as formatNumber, w as formatOrdinal, T as formatPercentage, E as formatRelativeTime, D as formatTime, i as getAlertTokens, a as getCategoryTokens, an as getDisplayKeysForPlatform, Q as getGatewayConfig, $ as getGatewayUrl, Se as getGlobalClient, ar as getGlobalShortcutsByCategory, ee as getGraphQLEndpoint, $r as getNativeBridge, ei as getPlatform, H as getProductUrl, U as getProductsWithUrls, vt as getProfileScopedKey, o as getProgressTokens, Sr as getResponsiveSelector, at as getSSORedirectUrl, Ye as getSSoCookie, K as getShellConfig, on as getShortcutLabel, s as getStatusBadgeTokens, c as getStatusTokens, fe as getStoredAuthToken, pe as getStoredLocale, me as getStoredOrganizationId, he as getStoredProjectId, ge as getStoredWorkspaceId, _e as getStoredWorkspaceToken, Pr as getTourContextRank, Fr as getTourRouteCatalog, Ir as getTourRouteModules, Lr as getTourRoutePages, l as getTrendTokens, Ce as getWorkspaceClient, te as getWorkspaceTokenPayload, Fe as gql, ve as graphqlFetch, Ue as hasAuthGraphQLErrors, we as initializeAppClients, ht as initializeLogger, I as installGatewayFetchRewrite, se as isAbortError, ti as isAndroid, We as isAuthGraphQLError, Ge as isAuthNetworkError, ce as isBackendErrorDisplay, N as isChunkLoadError, ni as isIOS, sn as isMac, cn as isMobileDevice, ri as isNative, Et as isQuotaExhaustedError, Xe as isSharedSsoCookieDomain, q as isShellLessRoute, ln as isTabletDevice, Rr as isTourVisibleForContext, le as isTransportError, Ze as isTrustedSsoOrigin, Dt as isUpgradeError, ii as isWeb, ne as isWorkspaceTokenValidForContext, P as lazyWithRetry, ft as logManager, ue as markConnectionHealthy, un as matchesKeyCombo, or as mergeShortcuts, ai as nativeConfirm, oi as nativeCopyText, si as nativeImpact, ci as nativeNotify, li as nativeOpenUrl, ui as nativeShare, di as nativeToast, dn as normalizeKey, fn as normalizePlatformCombo, zr as normalizeTourPath, pn as parseKeyCombo, O as pluralize, u as progressTokens, hr as publishPlanUsageSnapshot, Qe as readShellSsoCookie, Ke as redirectToLogin, Br as registerTourRouteCatalog, Te as resetAppClients, Xr as resolveAppShellObservabilityConfig, z as resolveAuthBridgeConfig, L as resolveGatewayBases, ye as resolveGatewayUrl, F as resolveGatewayUrls, Vr as resolveTourTargetPath, $e as setSSoCookie, et as setShellSsoCookies, gt as setUserContext, mn as shouldEnableKeyboardShortcuts, hn as shouldIgnoreShortcut, J as shouldShowBreadcrumb, Y as shouldShowSidebar, de as shouldToastBackendError, k as slugify, d as statusTokens, R as suppressConsole, A as toCamelCase, j as toPascalCase, f as trendTokens, M as truncateText, jt as useActorProfiles, Ie as useApolloClient, gi as useAppState, Xn as useAsync, Zn as useAsyncImmediate, Wr as useAutoStartTour, Fn as useBreakpoint, qn as useConditionalToggle, Vn as useCopyToClipboard, vr as useCurrentContextSearchParams, Mn as useDebounce, _i as useDeviceInfo, kn as useEvent, An as useEventBus, jn as useEventEmitter, Zt as useFeatureFlag, Qt as useFeatureFlagDetails, $t as useFeatureFlagValue, Xt as useFeatureFlags, De as useGateway, Oe as useGatewayClient, vi as useHaptics, cr as useHasAnimated, tr as useHotkeys, Dr as useIsTourPlaying, zn as useKeyPress, Bn as useKeyboardShortcut, er as useKeyboardShortcuts, Le as useLazyQuery, Hn as useLocalStorage, sr as useLogger, e as useMediaQuery, br as useMicrofrontendContext, In as useMobileBreakpoint, Re as useMutation, hi as useNativeKeyboard, pi as useNativePlatform, Ln as useOnClickOutside, Rn as useOnClickOutsideWithRef, Kt as usePWA, Nr as usePlayTour, Wn as usePrevious, Gn as usePreviousDistinct, Kn as usePreviousHistory, ze as useQuery, pr as useQuotaErrorToast, ur as useRecordProductVisit, lr as useReferralAttribution, st as useRegistryHelpers, mi as useSafeArea, ke as useSafeGateway, Ae as useSafeGatewayClient, Gr as useSafeToursContext, Un as useSessionStorage, ct as useShellNavigate, nr as useShortcutHelp, Or as useStartTour, yi as useStatusBar, kr as useStopTour, Be as useSubscription, Nn as useThrottle, Jn as useToggle, Yn as useToggleObject, Cr as useTourPlayer, Ar as useTourPlayerContext, Kr as useTours, qr as useToursContext, gr as useUpgradePrompt, Hr as withTourProgressStatus };
118
+ export { Cn as ASSISTANT_WIDGET_TOGGLE_EVENT, Rt as AccessDenied, kt as ActorIdentity, Me as ApolloClient, Ne as ApolloProvider, Jt as AppErrorBoundary, ot as AppInitializer, Qr as AppShellProvider, wn as AssistantWidget, re as BACKEND_ERROR_EVENT, Ln as BREAKPOINTS, Dn as BackendAuditSink, En as BroadcastChannelSink, W as COMMON_SHELL_LESS_ROUTES, ie as CONNECTION_STATUS_EVENT, Gt as ConditionalShell, pt as ConsoleTransport, tn as ContextConversationWidget, X as DEFAULT_PAGE_SIZE, G as DEFAULT_SHELL_CONFIG, Tn as DevtoolsSink, Mt as ErrorBoundary, Bt as ErrorFallback, An as EventBusProvider, Ci as FE_SHARED_VERSION, Yt as FeatureFlagProvider, en as FeatureGate, Z as GATEWAYS, or as GLOBAL_SHORTCUT_CATEGORIES, Ee as GatewayProvider, Pe as InMemoryCache, gn as KeyboardHelpDialogWrapper, Vt as LoadingFallback, lt as LogLevel, dt as LogManager, ut as Logger, tr as MODIFIER_KEYS, Sr as MicrofrontendContext, Wt as MicrofrontendErrorBoundary, ei as MicrofrontendProvider, kn as OtelBrowserSink, _r as PLAN_USAGE_SNAPSHOT_EVENT, nr as PLATFORM_TYPES, B as PRODUCTS, V as PRODUCT_URLS, qt as PWAInstallBanner, Ht as PageLoadingFallback, Ft as PermissionButton, zt as PermissionDenied, It as PermissionGate, Lt as PermissionLink, yt as QUOTA_EXHAUSTED_CODE, mr as QUOTA_EXHAUSTED_EVENT, _n as QuotaMeter, bt as RESOURCE_CAP_EXCEEDED_CODE, Nt as RequireAuth, Pt as RequireGuest, On as RybbitSink, be as SSELink, tt as SSORedirectSpinner, xt as STORAGE_QUOTA_EXCEEDED_CODE, hi as SafeAreaView, Ut as SectionLoadingFallback, Zr as TourInitializer, Pr as TourPlayer, kr as TourPlayerProvider, Dr as TourSpotlight, Or as TourTooltip, ti as TourTrigger, Fr as TourTriggerButton, Kr as ToursProvider, St as UPGRADE_ERROR_CODES, vn as UPGRADE_PROMPT_EVENT, xn as UpgradeInlineBanner, yn as UpgradePromptModal, je as WsLink, n as alertTokens, br as appendContextToPath, Ve as attemptTokenRefresh, At as buildActorFallback, Ct as buildQuotaExhaustedMessage, p as capitalizeFirst, m as capitalizeWords, r as categoryTokens, nt as checkRemoteSLO, rt as checkSLO, He as clearAuthSessionStorage, it as clearLocalAuthState, qe as clearSSoCookie, Je as clearShellSsoCookies, mt as clearUserContext, Ot as cn, t as createApolloClient, jn as createEventBus, sr as createGlobalShortcuts, xe as createGraphQLClient, _t as createProfileScopedStorage, wr as detectDeviceType, nn as detectPlatform, ae as dispatchBackendErrorEvent, hr as dispatchQuotaExhausted, bn as dispatchUpgradePrompt, oe as extractBackendError, wt as extractQuotaExhaustedExtensions, Tt as extractUpgradeErrorExtensions, h as formatBytes, g as formatCompactNumber, _ as formatCurrency, v as formatCurrencyCompact, y as formatDate, b as formatDateTime, x as formatDuration, rn as formatKeyCombo, S as formatList, C as formatNumber, w as formatOrdinal, T as formatPercentage, E as formatRelativeTime, D as formatTime, i as getAlertTokens, a as getCategoryTokens, an as getDisplayKeysForPlatform, Q as getGatewayConfig, $ as getGatewayUrl, Se as getGlobalClient, cr as getGlobalShortcutsByCategory, ee as getGraphQLEndpoint, ni as getNativeBridge, ri as getPlatform, H as getProductUrl, U as getProductsWithUrls, vt as getProfileScopedKey, o as getProgressTokens, Tr as getResponsiveSelector, at as getSSORedirectUrl, Ye as getSSoCookie, K as getShellConfig, on as getShortcutLabel, s as getStatusBadgeTokens, c as getStatusTokens, fe as getStoredAuthToken, pe as getStoredLocale, me as getStoredOrganizationId, he as getStoredProjectId, ge as getStoredWorkspaceId, _e as getStoredWorkspaceToken, Lr as getTourContextRank, Rr as getTourRouteCatalog, zr as getTourRouteModules, Br as getTourRoutePages, l as getTrendTokens, Ce as getWorkspaceClient, te as getWorkspaceTokenPayload, Fe as gql, ve as graphqlFetch, Ue as hasAuthGraphQLErrors, we as initializeAppClients, ht as initializeLogger, I as installGatewayFetchRewrite, se as isAbortError, ii as isAndroid, We as isAuthGraphQLError, Ge as isAuthNetworkError, ce as isBackendErrorDisplay, N as isChunkLoadError, ai as isIOS, sn as isMac, cn as isMobileDevice, oi as isNative, Et as isQuotaExhaustedError, Xe as isSharedSsoCookieDomain, q as isShellLessRoute, ln as isTabletDevice, Vr as isTourVisibleForContext, le as isTransportError, Ze as isTrustedSsoOrigin, Dt as isUpgradeError, si as isWeb, ne as isWorkspaceTokenValidForContext, P as lazyWithRetry, ft as logManager, ue as markConnectionHealthy, un as matchesKeyCombo, lr as mergeShortcuts, ci as nativeConfirm, li as nativeCopyText, ui as nativeImpact, di as nativeNotify, fi as nativeOpenUrl, pi as nativeShare, mi as nativeToast, dn as normalizeKey, fn as normalizePlatformCombo, Hr as normalizeTourPath, pn as parseKeyCombo, O as pluralize, u as progressTokens, vr as publishPlanUsageSnapshot, Qe as readShellSsoCookie, Ke as redirectToLogin, Ur as registerTourRouteCatalog, Te as resetAppClients, $r as resolveAppShellObservabilityConfig, z as resolveAuthBridgeConfig, L as resolveGatewayBases, ye as resolveGatewayUrl, F as resolveGatewayUrls, Wr as resolveTourTargetPath, $e as setSSoCookie, et as setShellSsoCookies, gt as setUserContext, mn as shouldEnableKeyboardShortcuts, hn as shouldIgnoreShortcut, J as shouldShowBreadcrumb, Y as shouldShowSidebar, de as shouldToastBackendError, k as slugify, d as statusTokens, R as suppressConsole, A as toCamelCase, j as toPascalCase, f as trendTokens, M as truncateText, jt as useActorProfiles, Ie as useApolloClient, yi as useAppState, $n as useAsync, er as useAsyncImmediate, qr as useAutoStartTour, Rn as useBreakpoint, Xn as useConditionalToggle, Wn as useCopyToClipboard, xr as useCurrentContextSearchParams, Fn as useDebounce, bi as useDeviceInfo, Mn as useEvent, Nn as useEventBus, Pn as useEventEmitter, Zt as useFeatureFlag, Qt as useFeatureFlagDetails, $t as useFeatureFlagValue, Xt as useFeatureFlags, De as useGateway, Oe as useGatewayClient, xi as useHaptics, dr as useHasAnimated, ir as useHotkeys, Ar as useIsTourPlaying, Hn as useKeyPress, Un as useKeyboardShortcut, rr as useKeyboardShortcuts, Le as useLazyQuery, Gn as useLocalStorage, ur as useLogger, e as useMediaQuery, Cr as useMicrofrontendContext, zn as useMobileBreakpoint, Re as useMutation, vi as useNativeKeyboard, gi as useNativePlatform, Bn as useOnClickOutside, Vn as useOnClickOutsideWithRef, Kt as usePWA, Ir as usePlayTour, qn as usePrevious, Jn as usePreviousDistinct, Yn as usePreviousHistory, ze as useQuery, gr as useQuotaErrorToast, pr as useRecordProductVisit, fr as useReferralAttribution, st as useRegistryHelpers, _i as useSafeArea, ke as useSafeGateway, Ae as useSafeGatewayClient, Jr as useSafeToursContext, Kn as useSessionStorage, ct as useShellNavigate, ar as useShortcutHelp, jr as useStartTour, Si as useStatusBar, Mr as useStopTour, Be as useSubscription, In as useThrottle, Zn as useToggle, Qn as useToggleObject, Er as useTourPlayer, Nr as useTourPlayerContext, Yr as useTours, Xr as useToursContext, yr as useUpgradePrompt, Sn as useVoiceInput, Gr as withTourProgressStatus };
@@ -1 +1 @@
1
- {"version":3,"file":"uploadBlob.d.ts","sourceRoot":"","sources":["../../src/storage/uploadBlob.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAyBxD;;;GAGG;AACH,eAAO,MAAM,wBAAwB,UAKpC,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,CAoEvF"}
1
+ {"version":3,"file":"uploadBlob.d.ts","sourceRoot":"","sources":["../../src/storage/uploadBlob.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAyBxD;;;GAGG;AACH,eAAO,MAAM,wBAAwB,UAKpC,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,YAAY,CAAC;IACrB,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAoBD,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,CAiFvF"}
@@ -25,41 +25,53 @@ var t = e`
25
25
  "GetFilesRecentPage",
26
26
  "GetFiles"
27
27
  ];
28
- async function i(e) {
29
- let { client: i, blob: a, filename: o, mimeType: s, folderId: c, onProgress: l } = e, u = o.includes(".") ? o.substring(o.lastIndexOf(".") + 1) : "";
30
- l?.(0);
31
- let d = await i.mutate({
28
+ function i(e) {
29
+ if (!e || typeof e != "object") return !1;
30
+ let t = e;
31
+ return t.networkError ? !0 : (t.graphQLErrors ?? []).some((e) => e?.extensions?.code === "INTERNAL_SERVER_ERROR");
32
+ }
33
+ async function a(e) {
34
+ let { client: a, blob: o, filename: s, mimeType: c, folderId: l, onProgress: u } = e, d = s.includes(".") ? s.substring(s.lastIndexOf(".") + 1) : "";
35
+ u?.(0);
36
+ let f = await a.mutate({
32
37
  mutation: t,
33
38
  variables: { input: {
34
- fileName: o,
35
- fileSize: String(a.size),
36
- mimeType: s,
37
- extension: u,
38
- folderId: c
39
+ fileName: s,
40
+ fileSize: String(o.size),
41
+ mimeType: c,
42
+ extension: d,
43
+ folderId: l
39
44
  } }
40
- }), f = d.data?.initiateUpload?.session, p = d.data?.initiateUpload?.uploadUrl;
41
- if (!f || !p) throw Error("initiateUpload did not return a presigned URL");
42
- l?.(10), await new Promise((e, t) => {
45
+ }), p = f.data?.initiateUpload?.session, m = f.data?.initiateUpload?.uploadUrl;
46
+ if (!p || !m) throw Error("initiateUpload did not return a presigned URL");
47
+ u?.(10), await new Promise((e, t) => {
43
48
  let n = new XMLHttpRequest();
44
49
  n.upload.addEventListener("progress", (e) => {
45
50
  if (e.lengthComputable) {
46
51
  let t = 10 + Math.round(e.loaded / e.total * 80);
47
- l?.(t);
52
+ u?.(t);
48
53
  }
49
54
  }), n.addEventListener("load", () => {
50
- n.status >= 200 && n.status < 300 ? (l?.(90), e()) : t(/* @__PURE__ */ Error(`Upload PUT failed with status ${n.status}`));
51
- }), n.addEventListener("error", () => t(/* @__PURE__ */ Error("Upload PUT network error"))), n.addEventListener("abort", () => t(/* @__PURE__ */ Error("Upload PUT aborted"))), n.open("PUT", p), n.setRequestHeader("Content-Type", s), n.send(a);
55
+ n.status >= 200 && n.status < 300 ? (u?.(90), e()) : t(/* @__PURE__ */ Error(`Upload PUT failed with status ${n.status}`));
56
+ }), n.addEventListener("error", () => t(/* @__PURE__ */ Error("Upload PUT network error"))), n.addEventListener("abort", () => t(/* @__PURE__ */ Error("Upload PUT aborted"))), n.open("PUT", m), n.setRequestHeader("Content-Type", c), n.send(o);
52
57
  });
53
- let m = (await i.mutate({
54
- mutation: n,
55
- variables: { input: {
56
- sessionId: f.id,
57
- folderId: c
58
- } },
59
- refetchQueries: r
60
- })).data?.completeUpload?.file;
61
- if (!m) throw Error("completeUpload did not return a file");
62
- return l?.(100), m;
58
+ let h;
59
+ for (let e = 0;; e++) try {
60
+ h = (await a.mutate({
61
+ mutation: n,
62
+ variables: { input: {
63
+ sessionId: p.id,
64
+ folderId: l
65
+ } },
66
+ refetchQueries: r
67
+ })).data?.completeUpload?.file;
68
+ break;
69
+ } catch (t) {
70
+ if (e >= 2 || !i(t)) throw t;
71
+ await new Promise((t) => setTimeout(t, 400 * (e + 1)));
72
+ }
73
+ if (!h) throw Error("completeUpload did not return a file");
74
+ return u?.(100), h;
63
75
  }
64
76
  //#endregion
65
- export { r as FILES_AFTER_SAVE_REFETCH, i as uploadBlobToFiles };
77
+ export { r as FILES_AFTER_SAVE_REFETCH, a as uploadBlobToFiles };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/fe-libs",
3
- "version": "2026.616.2",
3
+ "version": "2026.618.1",
4
4
  "description": "Burdenoff frontend primitives and domain libraries",
5
5
  "type": "module",
6
6
  "imports": {