@burdenoff/fe-libs 2026.920.1 → 2026.920.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.
- package/dist/shared/assistant/api.d.ts +17 -0
- package/dist/shared/assistant/api.d.ts.map +1 -1
- package/dist/shared/assistant/api.js +88 -66
- package/dist/shared/assistant/attachmentTurn.d.ts +21 -0
- package/dist/shared/assistant/attachmentTurn.d.ts.map +1 -0
- package/dist/shared/assistant/attachmentTurn.js +48 -0
- package/dist/shared/assistant/attachments.d.ts +85 -6
- package/dist/shared/assistant/attachments.d.ts.map +1 -1
- package/dist/shared/assistant/attachments.js +165 -112
- package/dist/shared/assistant/conversation.d.ts +21 -0
- package/dist/shared/assistant/conversation.d.ts.map +1 -1
- package/dist/shared/assistant/documentExtract.d.ts +11 -2
- package/dist/shared/assistant/documentExtract.d.ts.map +1 -1
- package/dist/shared/assistant/documentExtract.js +39 -37
- package/dist/shared/assistant/gatewayLimits.d.ts +10 -0
- package/dist/shared/assistant/gatewayLimits.d.ts.map +1 -1
- package/dist/shared/assistant/gatewayLimits.js +2 -2
- package/dist/shared/assistant/index.d.ts +3 -0
- package/dist/shared/assistant/index.d.ts.map +1 -1
- package/dist/shared/assistant/preview/bridgeHost.d.ts +26 -0
- package/dist/shared/assistant/preview/bridgeHost.d.ts.map +1 -0
- package/dist/shared/assistant/preview/bridgeHost.js +16 -0
- package/dist/shared/assistant/preview/bridgeHostContext.d.ts +17 -0
- package/dist/shared/assistant/preview/bridgeHostContext.d.ts.map +1 -0
- package/dist/shared/assistant/preview/bridgeHostContext.js +11 -0
- package/dist/shared/assistant/preview/useAssistantPreviewBridge.d.ts.map +1 -1
- package/dist/shared/assistant/ui/AIAssistantPanel.d.ts +4 -0
- package/dist/shared/assistant/ui/AIAssistantPanel.d.ts.map +1 -1
- package/dist/shared/assistant/ui/AIAssistantPanel.js +63 -62
- package/dist/shared/assistant/ui/AssistantChatArea.d.ts.map +1 -1
- package/dist/shared/assistant/ui/AssistantChatArea.js +342 -325
- package/dist/shared/assistant/ui/AssistantOverlay.d.ts +6 -0
- package/dist/shared/assistant/ui/AssistantOverlay.d.ts.map +1 -1
- package/dist/shared/assistant/ui/AssistantOverlay.js +93 -89
- package/dist/shared/assistant/ui/composer/AssistantComposer.d.ts +12 -0
- package/dist/shared/assistant/ui/composer/AssistantComposer.d.ts.map +1 -1
- package/dist/shared/assistant/ui/composer/AssistantComposer.js +57 -57
- package/dist/shared/assistant/useAssistantAttachments.d.ts +12 -1
- package/dist/shared/assistant/useAssistantAttachments.d.ts.map +1 -1
- package/dist/shared/assistant/useAssistantAttachments.js +98 -98
- package/dist/shared-assistant.js +118 -115
- package/package.json +1 -1
|
@@ -80,6 +80,12 @@ export interface AssistantOverlayProps {
|
|
|
80
80
|
/**
|
|
81
81
|
* Extra props for the default `AIAssistantPanel` — `writeAccess`,
|
|
82
82
|
* `connectSourceHref`, `preview`. The overlay's own props always win.
|
|
83
|
+
*
|
|
84
|
+
* ★★ `preview` is bridged HERE, by the overlay, not by the panel — so a
|
|
85
|
+
* product surface outside the panel keeps following a run after the assistant
|
|
86
|
+
* is closed (BOFF-7367). A `renderPanel` wrapper that hands its panel the
|
|
87
|
+
* same controller should pass it here too; one it passes only to its panel is
|
|
88
|
+
* bridged by that panel, for that panel's lifetime.
|
|
83
89
|
*/
|
|
84
90
|
panelProps?: Omit<AIAssistantPanelProps, keyof AssistantOverlayPanelProps>;
|
|
85
91
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssistantOverlay.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/ui/AssistantOverlay.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAUL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"AssistantOverlay.d.ts","sourceRoot":"","sources":["../../../../src/shared/assistant/ui/AssistantOverlay.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAUL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAGf,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAI1C,OAAO,EAAoB,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAClF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE,OAAO,EAmBL,KAAK,oBAAoB,EAC1B,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,+EAA+E;IAC/E,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,oBAAoB,CAAC;CAC5B;AAID,uEAAuE;AACvE,wBAAgB,yBAAyB,IAAI,4BAA4B,GAAG,IAAI,CAE/E;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AA6BD;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,WAAW,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,GACnD,IAAI,CAaN;AAID,MAAM,WAAW,6BAA6B;IAC5C;;;;OAIG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,KAAK,CAAC,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;KACtD,CAAC;IACF,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,CAAC,EACvC,SAAS,EACT,KAAK,EACL,QAAQ,GACT,EAAE,6BAA6B,2CAkE/B;AAED,mDAAmD;AACnD,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,iBAAiB,CAAC;CAChC;AAED,MAAM,WAAW,qBAAqB;IACpC,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,IAAI,CAAC,qBAAqB,EAAE,MAAM,0BAA0B,CAAC,CAAC;IAC3E;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,SAAS,CAAC;IAC/D;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,kFAAkF;IAClF,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC9C,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gDAAgD;IAChD,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,kEAAkE;IAClE,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kFAAkF;IAClF,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAOD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,kDAI5D"}
|
|
@@ -1,99 +1,100 @@
|
|
|
1
1
|
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
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
4
|
+
import { AssistantPreviewBridgeHost as r } from "../preview/bridgeHost.js";
|
|
5
|
+
import { AIAssistantPanel as i } from "./AIAssistantPanel.js";
|
|
6
|
+
import { ASSISTANT_DOCK_WIDTH_VAR as a, ASSISTANT_OVERLAY_DESKTOP_QUERY as o, ASSISTANT_OVERLAY_TOP_VAR as s, aboveAssistantBottomChrome as c, assistantOverlayClassName as l, assistantOverlayEscapeAction as u, assistantOverlayKeys as d, assistantQuotaKindOf as f, createAssistantNavigate as p, isAssistantToggleShortcut as m, nextAssistantOpenState as h, publishedAssistantDockWidth as g, readAssistantOverlayFlag as _, requestedAssistantOpenState as v, writeAssistantOverlayFlag as y } from "./assistantOverlayState.js";
|
|
7
|
+
import { createContext as b, useCallback as x, useContext as S, useEffect as C, useMemo as w, useRef as T, useState as E, useSyncExternalStore as D } from "react";
|
|
8
|
+
import { Sparkles as O } from "lucide-react";
|
|
9
|
+
import { jsx as k, jsxs as A } from "react/jsx-runtime";
|
|
9
10
|
//#region src/shared/assistant/ui/AssistantOverlay.tsx
|
|
10
|
-
var j =
|
|
11
|
+
var j = b(null);
|
|
11
12
|
function M() {
|
|
12
|
-
return
|
|
13
|
+
return S(j);
|
|
13
14
|
}
|
|
14
15
|
function N() {
|
|
15
|
-
return
|
|
16
|
+
return S(j)?.dockWidthPx ?? 0;
|
|
16
17
|
}
|
|
17
18
|
var P = () => typeof window > "u" ? void 0 : window.sessionStorage, F = () => typeof window > "u" ? void 0 : window.localStorage;
|
|
18
19
|
function I(e) {
|
|
19
20
|
if (typeof window > "u" || typeof window.matchMedia != "function") return () => {};
|
|
20
|
-
let t = window.matchMedia(
|
|
21
|
+
let t = window.matchMedia(o);
|
|
21
22
|
return t.addEventListener("change", e), () => t.removeEventListener("change", e);
|
|
22
23
|
}
|
|
23
24
|
function L() {
|
|
24
25
|
return typeof window < "u" && typeof window.matchMedia == "function" && window.matchMedia("(min-width: 640px)").matches;
|
|
25
26
|
}
|
|
26
27
|
function R() {
|
|
27
|
-
return
|
|
28
|
+
return D(I, L, () => !1);
|
|
28
29
|
}
|
|
29
30
|
function z(e, n) {
|
|
30
|
-
let r =
|
|
31
|
-
|
|
31
|
+
let r = T(n);
|
|
32
|
+
C(() => {
|
|
32
33
|
r.current = n;
|
|
33
|
-
}, [n]),
|
|
34
|
+
}, [n]), C(() => {
|
|
34
35
|
if (!e || typeof window > "u") return;
|
|
35
|
-
let n = t(e), i = (e) => r.current(
|
|
36
|
+
let n = t(e), i = (e) => r.current(f(e), e);
|
|
36
37
|
return window.addEventListener(n, i), () => window.removeEventListener(n, i);
|
|
37
38
|
}, [e]);
|
|
38
39
|
}
|
|
39
40
|
var B = () => {};
|
|
40
41
|
function V({ keyPrefix: e, quota: t, children: n }) {
|
|
41
|
-
let r =
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
}, [r.openStorageKey,
|
|
45
|
-
|
|
46
|
-
}, [r.dockStorageKey, s]),
|
|
42
|
+
let r = w(() => d(e), [e]), [i, o] = E(() => _(P, r.openStorageKey)), [s, c] = E(() => _(F, r.dockStorageKey)), l = x(() => o(!0), []), u = x(() => o(!1), []), f = x(() => o((e) => !e), []), p = x(() => c((e) => !e), []);
|
|
43
|
+
C(() => {
|
|
44
|
+
y(P, r.openStorageKey, i);
|
|
45
|
+
}, [r.openStorageKey, i]), C(() => {
|
|
46
|
+
y(F, r.dockStorageKey, s);
|
|
47
|
+
}, [r.dockStorageKey, s]), C(() => {
|
|
47
48
|
if (typeof window > "u") return;
|
|
48
49
|
let e = (e) => {
|
|
49
|
-
let t =
|
|
50
|
-
o((e) =>
|
|
50
|
+
let t = v(e);
|
|
51
|
+
o((e) => h(e, t));
|
|
51
52
|
};
|
|
52
53
|
return window.addEventListener(r.toggleEvent, e), () => window.removeEventListener(r.toggleEvent, e);
|
|
53
|
-
}, [r.toggleEvent]),
|
|
54
|
+
}, [r.toggleEvent]), C(() => {
|
|
54
55
|
if (typeof document > "u") return;
|
|
55
56
|
let e = (e) => {
|
|
56
|
-
|
|
57
|
+
m(e) && (e.preventDefault(), o((e) => !e));
|
|
57
58
|
};
|
|
58
59
|
return document.addEventListener("keydown", e), () => document.removeEventListener("keydown", e);
|
|
59
60
|
}, []), z(t?.product ?? null, t?.onExhausted ?? B);
|
|
60
|
-
let
|
|
61
|
-
isOpen:
|
|
61
|
+
let b = g({
|
|
62
|
+
isOpen: i,
|
|
62
63
|
docked: s,
|
|
63
64
|
isDesktop: R()
|
|
64
65
|
});
|
|
65
|
-
|
|
66
|
+
C(() => {
|
|
66
67
|
if (typeof document > "u") return;
|
|
67
68
|
let e = document.documentElement.style;
|
|
68
|
-
return e.setProperty(
|
|
69
|
-
e.removeProperty(
|
|
69
|
+
return e.setProperty(a, `${b}px`), () => {
|
|
70
|
+
e.removeProperty(a);
|
|
70
71
|
};
|
|
71
|
-
}, [
|
|
72
|
-
let
|
|
73
|
-
isOpen:
|
|
72
|
+
}, [b]);
|
|
73
|
+
let S = w(() => ({
|
|
74
|
+
isOpen: i,
|
|
74
75
|
open: l,
|
|
75
|
-
close:
|
|
76
|
+
close: u,
|
|
76
77
|
toggle: f,
|
|
77
78
|
docked: s,
|
|
78
|
-
toggleDock:
|
|
79
|
-
dockWidthPx:
|
|
79
|
+
toggleDock: p,
|
|
80
|
+
dockWidthPx: b,
|
|
80
81
|
keys: r
|
|
81
82
|
}), [
|
|
82
|
-
|
|
83
|
+
i,
|
|
83
84
|
l,
|
|
84
|
-
|
|
85
|
+
u,
|
|
85
86
|
f,
|
|
86
87
|
s,
|
|
87
|
-
|
|
88
|
-
|
|
88
|
+
p,
|
|
89
|
+
b,
|
|
89
90
|
r
|
|
90
91
|
]);
|
|
91
92
|
return /* @__PURE__ */ k(j.Provider, {
|
|
92
|
-
value:
|
|
93
|
+
value: S,
|
|
93
94
|
children: n
|
|
94
95
|
});
|
|
95
96
|
}
|
|
96
|
-
var H = (e, t) => /* @__PURE__ */ k(
|
|
97
|
+
var H = (e, t) => /* @__PURE__ */ k(i, {
|
|
97
98
|
...e,
|
|
98
99
|
...t
|
|
99
100
|
});
|
|
@@ -104,68 +105,71 @@ function U(e) {
|
|
|
104
105
|
...e
|
|
105
106
|
}) : null;
|
|
106
107
|
}
|
|
107
|
-
function W({ state: t, panelId:
|
|
108
|
-
let { isOpen:
|
|
109
|
-
navigate:
|
|
110
|
-
isShellLessTarget:
|
|
108
|
+
function W({ state: t, panelId: i = "ai-assistant", panelProps: a, renderPanel: o, navigate: d, isShellLessTarget: f, topOffsetPx: m = 56, launcherIcon: h, launcherBottomInset: g = "1.5rem", showLauncher: _ = !0 }) {
|
|
109
|
+
let { isOpen: v, close: y, toggle: b, docked: x, toggleDock: S } = t, T = e(), [D, j] = E(!1), M = w(() => d ? p({
|
|
110
|
+
navigate: d,
|
|
111
|
+
isShellLessTarget: f,
|
|
111
112
|
isDesktop: L,
|
|
112
113
|
collapseSheet: () => j(!1),
|
|
113
114
|
openInNewTab: (e) => window.open(e, "_blank", "noopener,noreferrer")
|
|
114
|
-
}) : void 0, [
|
|
115
|
-
|
|
116
|
-
if (!
|
|
115
|
+
}) : void 0, [d, f]);
|
|
116
|
+
C(() => {
|
|
117
|
+
if (!v) return;
|
|
117
118
|
let e = (e) => {
|
|
118
|
-
|
|
119
|
+
u({
|
|
119
120
|
key: e.key,
|
|
120
|
-
isOpen:
|
|
121
|
+
isOpen: v,
|
|
121
122
|
dialogOpen: document.querySelector("[role=\"dialog\"],[role=\"alertdialog\"],dialog[open]") !== null,
|
|
122
123
|
panelOwnsEscape: n()
|
|
123
|
-
}) === "close" && (e.preventDefault(),
|
|
124
|
+
}) === "close" && (e.preventDefault(), y());
|
|
124
125
|
};
|
|
125
126
|
return document.addEventListener("keydown", e), () => document.removeEventListener("keydown", e);
|
|
126
|
-
}, [
|
|
127
|
+
}, [v, y]);
|
|
127
128
|
let N = {
|
|
128
|
-
panelId:
|
|
129
|
+
panelId: i,
|
|
129
130
|
visible: !0,
|
|
130
|
-
onClose:
|
|
131
|
-
docked:
|
|
132
|
-
onToggleDock:
|
|
131
|
+
onClose: y,
|
|
132
|
+
docked: x,
|
|
133
|
+
onToggleDock: S,
|
|
133
134
|
onNavigate: M
|
|
134
|
-
}, P =
|
|
135
|
-
return /* @__PURE__ */ A(
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
135
|
+
}, P = T("overlay.launcher", "AI Assistant"), F = { [s]: `${m}px` };
|
|
136
|
+
return /* @__PURE__ */ A(r, {
|
|
137
|
+
preview: a?.preview,
|
|
138
|
+
children: [v && /* @__PURE__ */ A("div", {
|
|
139
|
+
className: l({
|
|
140
|
+
expanded: D,
|
|
141
|
+
docked: x
|
|
142
|
+
}),
|
|
143
|
+
style: F,
|
|
144
|
+
"data-testid": "assistant-overlay",
|
|
145
|
+
children: [/* @__PURE__ */ k("button", {
|
|
146
|
+
type: "button",
|
|
147
|
+
onClick: () => j((e) => !e),
|
|
148
|
+
className: "flex w-full shrink-0 justify-center pt-2 pb-1 sm:hidden",
|
|
149
|
+
"aria-label": D ? T("sheet.collapse", "Shrink the assistant") : T("sheet.expand", "Expand the assistant"),
|
|
150
|
+
"aria-expanded": D,
|
|
151
|
+
"data-testid": "assistant-sheet-handle",
|
|
152
|
+
children: /* @__PURE__ */ k("span", { className: "h-1.5 w-10 rounded-full bg-border-strong" })
|
|
153
|
+
}), /* @__PURE__ */ k("div", {
|
|
154
|
+
className: "flex min-h-0 flex-1 flex-col",
|
|
155
|
+
children: o ? o(N) : H(a, N)
|
|
156
|
+
})]
|
|
157
|
+
}), _ && /* @__PURE__ */ k("button", {
|
|
143
158
|
type: "button",
|
|
144
|
-
onClick:
|
|
145
|
-
|
|
146
|
-
"aria-label":
|
|
147
|
-
"aria-
|
|
148
|
-
"
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
className: "
|
|
152
|
-
children:
|
|
159
|
+
onClick: b,
|
|
160
|
+
title: T("overlay.launcherTitle", "AI Assistant ({{shortcut}})", { shortcut: "Ctrl+Shift+A" }),
|
|
161
|
+
"aria-label": P,
|
|
162
|
+
"aria-haspopup": "dialog",
|
|
163
|
+
"aria-expanded": v,
|
|
164
|
+
"data-testid": "assistant-fab",
|
|
165
|
+
style: { bottom: c(g) },
|
|
166
|
+
className: "fixed right-6 z-30 size-14 items-center justify-center rounded-full border border-border-strong bg-[var(--color-accent-soft)] text-action-primary-bg shadow-float transition-colors duration-200 hover:border-action-primary-bg focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)] cursor-pointer " + (v ? "hidden sm:inline-flex" : "inline-flex"),
|
|
167
|
+
children: h ?? /* @__PURE__ */ k(O, {
|
|
168
|
+
className: "size-6",
|
|
169
|
+
"aria-hidden": "true"
|
|
170
|
+
})
|
|
153
171
|
})]
|
|
154
|
-
})
|
|
155
|
-
type: "button",
|
|
156
|
-
onClick: y,
|
|
157
|
-
title: w("overlay.launcherTitle", "AI Assistant ({{shortcut}})", { shortcut: "Ctrl+Shift+A" }),
|
|
158
|
-
"aria-label": P,
|
|
159
|
-
"aria-haspopup": "dialog",
|
|
160
|
-
"aria-expanded": _,
|
|
161
|
-
"data-testid": "assistant-fab",
|
|
162
|
-
style: { bottom: s(h) },
|
|
163
|
-
className: "fixed right-6 z-30 size-14 items-center justify-center rounded-full border border-border-strong bg-[var(--color-accent-soft)] text-action-primary-bg shadow-float transition-colors duration-200 hover:border-action-primary-bg focus:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)] cursor-pointer " + (_ ? "hidden sm:inline-flex" : "inline-flex"),
|
|
164
|
-
children: m ?? /* @__PURE__ */ k(D, {
|
|
165
|
-
className: "size-6",
|
|
166
|
-
"aria-hidden": "true"
|
|
167
|
-
})
|
|
168
|
-
})] });
|
|
172
|
+
});
|
|
169
173
|
}
|
|
170
174
|
//#endregion
|
|
171
175
|
export { U as AssistantOverlay, V as AssistantOverlayProvider, N as useAssistantDockWidth, M as useAssistantOverlayOrNull, z as useAssistantQuotaExhausted };
|
|
@@ -20,6 +20,18 @@ interface Props {
|
|
|
20
20
|
mode: AssistantMode;
|
|
21
21
|
/** Role-filtered list of modes the user may pick. */
|
|
22
22
|
availableModes: AssistantModeConfig[];
|
|
23
|
+
/**
|
|
24
|
+
* How many characters of an attached text or document file to KEEP — the
|
|
25
|
+
* largest per-file limit among ALL the product's modes (BOFF-7334). The send
|
|
26
|
+
* cuts each file to the sending mode's own limit.
|
|
27
|
+
*
|
|
28
|
+
* ★ All modes, not `availableModes`. That list is role-filtered, and while the
|
|
29
|
+
* role check loads it omits an admin-only mode — so a file attached in that
|
|
30
|
+
* window was cut to 8,000 characters for good, and the Build mode the admin
|
|
31
|
+
* switched to a moment later received 8,000 of the 100,000 it asks for.
|
|
32
|
+
* Absent: the shared default, `MAX_INLINE_CHARS_PER_FILE`.
|
|
33
|
+
*/
|
|
34
|
+
attachmentCharsPerFile?: number;
|
|
23
35
|
onModeChange: (mode: AssistantMode) => void;
|
|
24
36
|
/**
|
|
25
37
|
* Opens the hands-free voice conversation. Omitted where a voice session
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssistantComposer.d.ts","sourceRoot":"","sources":["../../../../../src/shared/assistant/ui/composer/AssistantComposer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,EAAE,EAER,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAG9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAQjD,OAAO,EAGL,KAAK,mBAAmB,EAEzB,MAAM,mBAAmB,CAAC;AAO3B,UAAU,KAAK;IACb;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;OAGG;IACH,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,mBAAmB,EAAE,KAAK,IAAI,CAAC;IACtE,2FAA2F;IAC3F,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,aAAa,CAAC;IACpB,qDAAqD;IACrD,cAAc,EAAE,mBAAmB,EAAE,CAAC;IACtC,YAAY,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;IAC5C;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAC;CAClC;AAID;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,iBAAiB,EAAE,EAAE,CAAC,KAAK,
|
|
1
|
+
{"version":3,"file":"AssistantComposer.d.ts","sourceRoot":"","sources":["../../../../../src/shared/assistant/ui/composer/AssistantComposer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,EAAE,EAER,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAG9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAQjD,OAAO,EAGL,KAAK,mBAAmB,EAEzB,MAAM,mBAAmB,CAAC;AAO3B,UAAU,KAAK;IACb;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;OAGG;IACH,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,mBAAmB,EAAE,KAAK,IAAI,CAAC;IACtE,2FAA2F;IAC3F,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,aAAa,CAAC;IACpB,qDAAqD;IACrD,cAAc,EAAE,mBAAmB,EAAE,CAAC;IACtC;;;;;;;;;;OAUG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,YAAY,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;IAC5C;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAC;CAClC;AAID;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,iBAAiB,EAAE,EAAE,CAAC,KAAK,CA6ZvC,CAAC"}
|
|
@@ -11,44 +11,44 @@ import { AssistantModeSelector as c } from "./AssistantModeSelector.js";
|
|
|
11
11
|
import { AssistantVoiceButton as te } from "./AssistantVoiceButton.js";
|
|
12
12
|
import { AssistantVoiceSessionButton as ne } from "../voice/AssistantVoiceSessionButton.js";
|
|
13
13
|
import { useAssistantAttachments as re } from "../../useAssistantAttachments.js";
|
|
14
|
-
import { useCallback as l, useLayoutEffect as
|
|
15
|
-
import { ArrowUp as
|
|
16
|
-
import { jsx as
|
|
14
|
+
import { useCallback as l, useLayoutEffect as u, useMemo as d, useRef as f, useState as p } from "react";
|
|
15
|
+
import { ArrowUp as m, Loader2 as h } from "lucide-react";
|
|
16
|
+
import { jsx as g, jsxs as _ } from "react/jsx-runtime";
|
|
17
17
|
//#region src/shared/assistant/ui/composer/AssistantComposer.tsx
|
|
18
|
-
var
|
|
19
|
-
let T = ee(), { locale: E } = e(), D =
|
|
18
|
+
var v = 200, y = ({ writeAccessDenied: y = !1, onSend: b, disabled: x = !1, placeholder: S, mode: ie, availableModes: C, attachmentCharsPerFile: ae, onModeChange: oe, onStartVoiceSession: w }) => {
|
|
19
|
+
let T = ee(), { locale: E } = e(), D = f(null), [O, k] = p(""), [A, j] = p(!1), M = f(0), { attachments: N, isBusy: P, preparingCount: F, sendBlocker: I, rejection: L, addFiles: R, remove: z, retry: B, clear: V, clearRejection: H, canAddMore: se } = re({ perFileChars: ae }), U = l((e) => {
|
|
20
20
|
k((t) => t ? `${t.replace(/\s+$/, "")} ${e}` : e);
|
|
21
21
|
}, []), W = a((e) => e.assistantLanguage), G = t({
|
|
22
|
-
onFinalize:
|
|
23
|
-
language:
|
|
24
|
-
}), K =
|
|
25
|
-
|
|
22
|
+
onFinalize: U,
|
|
23
|
+
language: d(() => r(W, E), [W, E]).tag
|
|
24
|
+
}), K = S ?? T("composer.placeholder", "Ask me anything…"), q = O.trim(), J = i(N), Y = N.filter((e) => e.status === "error"), X = (q.length > 0 || J.length > 0) && !x && I === null;
|
|
25
|
+
u(() => {
|
|
26
26
|
let e = D.current;
|
|
27
|
-
e && (e.style.height = "auto", e.style.height = `${Math.min(e.scrollHeight,
|
|
27
|
+
e && (e.style.height = "auto", e.style.height = `${Math.min(e.scrollHeight, v)}px`);
|
|
28
28
|
}, [O]);
|
|
29
29
|
let Z = l(() => {
|
|
30
|
-
X && (G.isActive && G.stop(),
|
|
30
|
+
X && (G.isActive && G.stop(), b(O.trim(), J), k(""), V());
|
|
31
31
|
}, [
|
|
32
32
|
X,
|
|
33
|
-
|
|
33
|
+
b,
|
|
34
34
|
O,
|
|
35
35
|
J,
|
|
36
36
|
V,
|
|
37
37
|
G
|
|
38
|
-
]),
|
|
38
|
+
]), ce = l((e) => {
|
|
39
39
|
e.key === "Enter" && !e.shiftKey && (e.preventDefault(), Z());
|
|
40
|
-
}, [Z]),
|
|
40
|
+
}, [Z]), le = l((e) => {
|
|
41
41
|
let t = Array.from(e.clipboardData?.files ?? []);
|
|
42
42
|
t.length !== 0 && (e.preventDefault(), R(t));
|
|
43
|
-
}, [R]),
|
|
43
|
+
}, [R]), ue = l((e) => {
|
|
44
44
|
Array.from(e.dataTransfer?.types ?? []).includes("Files") && (M.current += 1, j(!0));
|
|
45
|
-
}, []),
|
|
45
|
+
}, []), Q = l(() => {
|
|
46
46
|
M.current = Math.max(0, M.current - 1), M.current === 0 && j(!1);
|
|
47
|
-
}, []), Q = l((e) => {
|
|
48
|
-
Array.from(e.dataTransfer?.types ?? []).includes("Files") && e.preventDefault();
|
|
49
47
|
}, []), de = l((e) => {
|
|
48
|
+
Array.from(e.dataTransfer?.types ?? []).includes("Files") && e.preventDefault();
|
|
49
|
+
}, []), fe = l((e) => {
|
|
50
50
|
e.preventDefault(), M.current = 0, j(!1), R(e.dataTransfer?.files ?? null);
|
|
51
|
-
}, [R]),
|
|
51
|
+
}, [R]), pe = (e) => {
|
|
52
52
|
switch (e) {
|
|
53
53
|
case "too-many": return T("attachments.tooMany", "You can attach up to {{max}} files per message.", { max: 5 });
|
|
54
54
|
case "too-large": return T("attachments.tooLarge", "That file is larger than 10 MB.");
|
|
@@ -66,107 +66,107 @@ var _ = 200, v = ({ writeAccessDenied: v = !1, onSend: y, disabled: b = !1, plac
|
|
|
66
66
|
default: return null;
|
|
67
67
|
}
|
|
68
68
|
})();
|
|
69
|
-
return /* @__PURE__ */
|
|
69
|
+
return /* @__PURE__ */ _("div", {
|
|
70
70
|
className: "flex-shrink-0 px-3 pb-3 pt-1.5",
|
|
71
71
|
children: [
|
|
72
|
-
/* @__PURE__ */
|
|
73
|
-
onDragEnter:
|
|
74
|
-
onDragLeave:
|
|
75
|
-
onDragOver:
|
|
76
|
-
onDrop:
|
|
72
|
+
/* @__PURE__ */ _("div", {
|
|
73
|
+
onDragEnter: ue,
|
|
74
|
+
onDragLeave: Q,
|
|
75
|
+
onDragOver: de,
|
|
76
|
+
onDrop: fe,
|
|
77
77
|
className: `rounded-2xl border p-2 shadow-sm transition-colors focus-within:border-action-primary-bg focus-within:ring-2 focus-within:ring-action-primary-bg/15 ${A ? "border-action-primary-bg border-dashed bg-action-primary-bg/5" : "border-border-default bg-bg-sunken"}`,
|
|
78
78
|
"data-testid": "assistant-composer",
|
|
79
79
|
children: [
|
|
80
|
-
/* @__PURE__ */
|
|
80
|
+
/* @__PURE__ */ g(s, {
|
|
81
81
|
attachments: N,
|
|
82
82
|
onRemove: z,
|
|
83
83
|
onRetry: B,
|
|
84
|
-
disabled:
|
|
84
|
+
disabled: x,
|
|
85
85
|
preparingCount: F
|
|
86
86
|
}),
|
|
87
|
-
/* @__PURE__ */
|
|
87
|
+
/* @__PURE__ */ _("div", {
|
|
88
88
|
className: "flex items-end gap-2",
|
|
89
89
|
children: [
|
|
90
|
-
/* @__PURE__ */
|
|
90
|
+
/* @__PURE__ */ g(o, {
|
|
91
91
|
onFiles: R,
|
|
92
|
-
canAddMore:
|
|
93
|
-
disabled:
|
|
92
|
+
canAddMore: se,
|
|
93
|
+
disabled: x
|
|
94
94
|
}),
|
|
95
|
-
/* @__PURE__ */
|
|
95
|
+
/* @__PURE__ */ g("textarea", {
|
|
96
96
|
ref: D,
|
|
97
97
|
value: O,
|
|
98
98
|
onChange: (e) => k(e.target.value),
|
|
99
|
-
onKeyDown:
|
|
100
|
-
onPaste:
|
|
101
|
-
disabled:
|
|
99
|
+
onKeyDown: ce,
|
|
100
|
+
onPaste: le,
|
|
101
|
+
disabled: x,
|
|
102
102
|
placeholder: A ? T("composer.dropHere", "Drop files to attach") : K,
|
|
103
103
|
rows: 1,
|
|
104
104
|
className: "min-h-[36px] flex-1 resize-none self-center bg-transparent px-1 py-2 text-[15px] leading-relaxed text-text-primary placeholder:text-text-muted focus:outline-none disabled:opacity-50",
|
|
105
105
|
"aria-label": T("chatInput.ariaLabel", "Message input"),
|
|
106
106
|
"data-testid": "assistant-input"
|
|
107
107
|
}),
|
|
108
|
-
G.isSupported && /* @__PURE__ */
|
|
108
|
+
G.isSupported && /* @__PURE__ */ g(te, {
|
|
109
109
|
isListening: G.isListening,
|
|
110
110
|
isStarting: G.isStarting,
|
|
111
111
|
onToggle: G.toggle,
|
|
112
|
-
disabled:
|
|
112
|
+
disabled: x
|
|
113
113
|
}),
|
|
114
|
-
w && q.length === 0 && N.length === 0 && !G.isActive ? /* @__PURE__ */
|
|
114
|
+
w && q.length === 0 && N.length === 0 && !G.isActive ? /* @__PURE__ */ g(ne, {
|
|
115
115
|
onStart: w,
|
|
116
|
-
disabled:
|
|
117
|
-
}) : /* @__PURE__ */
|
|
116
|
+
disabled: x
|
|
117
|
+
}) : /* @__PURE__ */ g("button", {
|
|
118
118
|
type: "button",
|
|
119
119
|
onClick: Z,
|
|
120
120
|
disabled: !X,
|
|
121
121
|
className: `flex size-9 flex-shrink-0 items-center justify-center rounded-full shadow-sm transition-all focus:outline-none focus-visible:ring-2 focus-visible:ring-border-strong ${X ? "bg-action-primary-bg text-action-primary-text hover:scale-105 hover:bg-action-primary-bg-hover" : "bg-bg-elevated text-text-muted"}`,
|
|
122
122
|
"aria-label": T("chatInput.send", "Send message"),
|
|
123
123
|
"data-testid": "assistant-send",
|
|
124
|
-
children:
|
|
124
|
+
children: x || P ? /* @__PURE__ */ g(h, { className: "size-4 motion-safe:animate-spin" }) : /* @__PURE__ */ g(m, { className: "size-4" })
|
|
125
125
|
})
|
|
126
126
|
]
|
|
127
127
|
}),
|
|
128
|
-
C.length > 1 && /* @__PURE__ */
|
|
128
|
+
C.length > 1 && /* @__PURE__ */ g("div", {
|
|
129
129
|
className: "mt-2 px-0.5",
|
|
130
|
-
children: /* @__PURE__ */
|
|
131
|
-
mode:
|
|
130
|
+
children: /* @__PURE__ */ g(c, {
|
|
131
|
+
mode: ie,
|
|
132
132
|
availableModes: C,
|
|
133
|
-
onModeChange:
|
|
134
|
-
disabled:
|
|
133
|
+
onModeChange: oe,
|
|
134
|
+
disabled: x
|
|
135
135
|
})
|
|
136
136
|
})
|
|
137
137
|
]
|
|
138
138
|
}),
|
|
139
|
-
|
|
139
|
+
y ? /* @__PURE__ */ g("p", {
|
|
140
140
|
className: "mt-1.5 px-1 text-center text-[11px] text-status-warning",
|
|
141
141
|
"data-testid": "assistant-write-access-warning",
|
|
142
142
|
children: T("composer.writeAccessDenied", "Changes may not save — your role in this workspace does not currently allow edits. You can still plan and review an action.")
|
|
143
143
|
}) : null,
|
|
144
|
-
/* @__PURE__ */
|
|
144
|
+
/* @__PURE__ */ g("div", {
|
|
145
145
|
className: "mt-1.5 px-1 text-center text-[11px]",
|
|
146
146
|
"aria-live": "polite",
|
|
147
|
-
children: G.isStarting && !G.isListening ? /* @__PURE__ */
|
|
147
|
+
children: G.isStarting && !G.isListening ? /* @__PURE__ */ g("p", {
|
|
148
148
|
className: "text-text-muted",
|
|
149
149
|
"data-testid": "assistant-voice-starting",
|
|
150
150
|
children: T("voice.starting", "Starting the microphone…")
|
|
151
|
-
}) : G.isListening ? /* @__PURE__ */
|
|
151
|
+
}) : G.isListening ? /* @__PURE__ */ _("p", {
|
|
152
152
|
className: "text-status-error-text",
|
|
153
153
|
"data-testid": "assistant-voice-status",
|
|
154
|
-
children: [/* @__PURE__ */
|
|
155
|
-
}) : $ ? /* @__PURE__ */
|
|
154
|
+
children: [/* @__PURE__ */ g("span", { className: "mr-1 inline-block size-1.5 rounded-full bg-status-error-text align-middle motion-safe:animate-pulse" }), G.interim || T("voice.listening", "Listening… speak now, tap the square to stop")]
|
|
155
|
+
}) : $ ? /* @__PURE__ */ g("p", {
|
|
156
156
|
className: "text-status-error-text",
|
|
157
157
|
"data-testid": "assistant-voice-error",
|
|
158
158
|
children: $
|
|
159
|
-
}) : L ? /* @__PURE__ */
|
|
159
|
+
}) : L ? /* @__PURE__ */ g("button", {
|
|
160
160
|
type: "button",
|
|
161
161
|
onClick: H,
|
|
162
162
|
className: "text-status-error-text underline-offset-2 hover:underline",
|
|
163
163
|
"data-testid": "assistant-attachment-rejection",
|
|
164
|
-
children:
|
|
165
|
-
}) : I === "failed" ? /* @__PURE__ */
|
|
164
|
+
children: pe(L)
|
|
165
|
+
}) : I === "failed" ? /* @__PURE__ */ g("p", {
|
|
166
166
|
className: "text-status-error-text",
|
|
167
167
|
"data-testid": "assistant-attachment-blocked",
|
|
168
168
|
children: Y.length === 1 ? T("attachments.blockedOne", "{{name}} didn't upload. Retry or remove it before sending.", { name: Y[0].filename }) : T("attachments.blockedMany", "{{count}} attachments didn't upload. Retry or remove them before sending.", { count: Y.length })
|
|
169
|
-
}) : /* @__PURE__ */
|
|
169
|
+
}) : /* @__PURE__ */ g("p", {
|
|
170
170
|
className: "text-text-muted",
|
|
171
171
|
children: T("composer.hint", "Enter to send · Shift+Enter for newline · drag or paste files to attach")
|
|
172
172
|
})
|
|
@@ -175,4 +175,4 @@ var _ = 200, v = ({ writeAccessDenied: v = !1, onSend: y, disabled: b = !1, plac
|
|
|
175
175
|
});
|
|
176
176
|
};
|
|
177
177
|
//#endregion
|
|
178
|
-
export {
|
|
178
|
+
export { y as AssistantComposer };
|
|
@@ -22,5 +22,16 @@ export interface UseAssistantAttachmentsResult {
|
|
|
22
22
|
clearRejection: () => void;
|
|
23
23
|
canAddMore: boolean;
|
|
24
24
|
}
|
|
25
|
-
export
|
|
25
|
+
export interface UseAssistantAttachmentsOptions {
|
|
26
|
+
/**
|
|
27
|
+
* How many characters of a text or document file to keep when it is attached
|
|
28
|
+
* (BOFF-7334). Pass `largestInlineCharsPerFile(availableModes)`: the send cuts
|
|
29
|
+
* each file again to the SENDING mode's limit, so keeping the largest is what
|
|
30
|
+
* lets a file attached in one mode be sent in another without having been cut
|
|
31
|
+
* to the smaller limit first. Absent: the shared default,
|
|
32
|
+
* `MAX_INLINE_CHARS_PER_FILE`. Bounded like a mode's own limit.
|
|
33
|
+
*/
|
|
34
|
+
perFileChars?: number;
|
|
35
|
+
}
|
|
36
|
+
export declare function useAssistantAttachments(options?: UseAssistantAttachmentsOptions): UseAssistantAttachmentsResult;
|
|
26
37
|
//# sourceMappingURL=useAssistantAttachments.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAssistantAttachments.d.ts","sourceRoot":"","sources":["../../../src/shared/assistant/useAssistantAttachments.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAOH,OAAO,EAYL,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC3B,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"useAssistantAttachments.d.ts","sourceRoot":"","sources":["../../../src/shared/assistant/useAssistantAttachments.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAOH,OAAO,EAYL,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC3B,MAAM,eAAe,CAAC;AAsJvB,MAAM,WAAW,6BAA6B;IAC5C,yEAAyE;IACzE,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,mBAAmB,EAAE,CAAC;IACnC,qEAAqE;IACrE,MAAM,EAAE,OAAO,CAAC;IAChB;;;;;OAKG;IACH,WAAW,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAC1C,6DAA6D;IAC7D,SAAS,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACtC,QAAQ,EAAE,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,EAAE,GAAG,IAAI,GAAG,SAAS,KAAK,IAAI,CAAC;IAChE,MAAM,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,gFAAgF;IAChF,KAAK,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,8BAA8B;IAC7C;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,8BAAmC,GAC3C,6BAA6B,CAyQ/B"}
|