langgraph-ui-components 0.0.17 → 0.0.18
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/index.es100.js +20 -354
- package/dist/index.es100.js.map +1 -1
- package/dist/index.es101.js +172 -127
- package/dist/index.es101.js.map +1 -1
- package/dist/index.es102.js +231 -60
- package/dist/index.es102.js.map +1 -1
- package/dist/index.es103.js +352 -34
- package/dist/index.es103.js.map +1 -1
- package/dist/index.es104.js +134 -34
- package/dist/index.es104.js.map +1 -1
- package/dist/index.es105.js +65 -161
- package/dist/index.es105.js.map +1 -1
- package/dist/index.es106.js +30 -196
- package/dist/index.es106.js.map +1 -1
- package/dist/index.es107.js +36 -13
- package/dist/index.es107.js.map +1 -1
- package/dist/index.es108.js +162 -26
- package/dist/index.es108.js.map +1 -1
- package/dist/index.es109.js +196 -27
- package/dist/index.es109.js.map +1 -1
- package/dist/index.es110.js +13 -3156
- package/dist/index.es110.js.map +1 -1
- package/dist/index.es111.js +27 -34
- package/dist/index.es111.js.map +1 -1
- package/dist/index.es112.js +34 -5
- package/dist/index.es112.js.map +1 -1
- package/dist/index.es113.js +3145 -61
- package/dist/index.es113.js.map +1 -1
- package/dist/index.es114.js +33 -33
- package/dist/index.es114.js.map +1 -1
- package/dist/index.es115.js +5 -21
- package/dist/index.es115.js.map +1 -1
- package/dist/index.es116.js +69 -64
- package/dist/index.es116.js.map +1 -1
- package/dist/index.es117.js +37 -3
- package/dist/index.es117.js.map +1 -1
- package/dist/index.es12.js +1 -1
- package/dist/index.es121.js +9 -9
- package/dist/index.es122.js +1 -1
- package/dist/index.es126.js +1 -1
- package/dist/index.es128.js +2 -2
- package/dist/index.es13.js +9 -3
- package/dist/index.es13.js.map +1 -1
- package/dist/index.es136.js +1 -1
- package/dist/index.es137.js +6 -6
- package/dist/index.es139.js +1 -1
- package/dist/index.es14.js +6 -6
- package/dist/index.es140.js +1 -1
- package/dist/index.es143.js +1 -1
- package/dist/index.es144.js +1 -1
- package/dist/index.es145.js +1 -1
- package/dist/index.es146.js +1 -1
- package/dist/index.es147.js +1 -1
- package/dist/index.es148.js +1 -1
- package/dist/index.es149.js +1 -1
- package/dist/index.es150.js +1 -1
- package/dist/index.es151.js +1 -1
- package/dist/index.es152.js +1 -1
- package/dist/index.es153.js +1 -1
- package/dist/index.es154.js +1 -1
- package/dist/index.es155.js +1 -1
- package/dist/index.es156.js +1 -1
- package/dist/index.es157.js +1 -1
- package/dist/index.es158.js +1 -1
- package/dist/index.es159.js +1 -1
- package/dist/index.es16.js +10 -5
- package/dist/index.es16.js.map +1 -1
- package/dist/index.es160.js +1 -1
- package/dist/index.es161.js +1 -1
- package/dist/index.es162.js +1 -1
- package/dist/index.es163.js +1 -1
- package/dist/index.es164.js +1 -1
- package/dist/index.es165.js +1 -1
- package/dist/index.es166.js +1 -1
- package/dist/index.es167.js +1 -1
- package/dist/index.es168.js +1 -1
- package/dist/index.es169.js +1 -1
- package/dist/index.es170.js +1 -1
- package/dist/index.es171.js +1 -1
- package/dist/index.es172.js +1 -1
- package/dist/index.es173.js +1 -1
- package/dist/index.es174.js +1 -1
- package/dist/index.es175.js +1 -1
- package/dist/index.es176.js +1 -1
- package/dist/index.es177.js +1 -1
- package/dist/index.es178.js +1 -1
- package/dist/index.es179.js +1 -1
- package/dist/index.es18.js +7 -7
- package/dist/index.es180.js +1 -1
- package/dist/index.es181.js +1 -1
- package/dist/index.es182.js +1 -1
- package/dist/index.es183.js +1 -1
- package/dist/index.es184.js +1 -1
- package/dist/index.es185.js +1 -1
- package/dist/index.es186.js +1 -1
- package/dist/index.es187.js +1 -1
- package/dist/index.es191.js +2 -56
- package/dist/index.es191.js.map +1 -1
- package/dist/index.es192.js +2 -100
- package/dist/index.es192.js.map +1 -1
- package/dist/index.es193.js +2 -191
- package/dist/index.es193.js.map +1 -1
- package/dist/index.es194.js +2 -110
- package/dist/index.es194.js.map +1 -1
- package/dist/index.es195.js +2 -35
- package/dist/index.es195.js.map +1 -1
- package/dist/index.es196.js +2 -10
- package/dist/index.es196.js.map +1 -1
- package/dist/index.es197.js +2 -11
- package/dist/index.es197.js.map +1 -1
- package/dist/index.es198.js +2 -12
- package/dist/index.es198.js.map +1 -1
- package/dist/index.es199.js +2 -91
- package/dist/index.es199.js.map +1 -1
- package/dist/index.es2.js +96 -11
- package/dist/index.es2.js.map +1 -1
- package/dist/index.es20.js +2 -2
- package/dist/index.es200.js +2 -275
- package/dist/index.es200.js.map +1 -1
- package/dist/index.es201.js +2 -2
- package/dist/index.es202.js +2 -164
- package/dist/index.es202.js.map +1 -1
- package/dist/index.es203.js +2 -51
- package/dist/index.es203.js.map +1 -1
- package/dist/index.es204.js +2 -40
- package/dist/index.es204.js.map +1 -1
- package/dist/index.es205.js +2 -35
- package/dist/index.es205.js.map +1 -1
- package/dist/index.es206.js +2 -40
- package/dist/index.es206.js.map +1 -1
- package/dist/index.es207.js +2 -24
- package/dist/index.es207.js.map +1 -1
- package/dist/index.es208.js +2 -591
- package/dist/index.es208.js.map +1 -1
- package/dist/index.es209.js +2 -125
- package/dist/index.es209.js.map +1 -1
- package/dist/index.es210.js +2 -164
- package/dist/index.es210.js.map +1 -1
- package/dist/index.es211.js +2 -2
- package/dist/index.es212.js +2 -2
- package/dist/index.es213.js +2 -2
- package/dist/index.es214.js +2 -2
- package/dist/index.es215.js +2 -2
- package/dist/index.es216.js +2 -2
- package/dist/index.es217.js +2 -2
- package/dist/index.es218.js +2 -2
- package/dist/index.es219.js +2 -2
- package/dist/index.es22.js +35 -119
- package/dist/index.es22.js.map +1 -1
- package/dist/index.es220.js +2 -2
- package/dist/index.es221.js +2 -2
- package/dist/index.es222.js +2 -2
- package/dist/index.es223.js +2 -2
- package/dist/index.es224.js +2 -2
- package/dist/index.es225.js +2 -2
- package/dist/index.es226.js +2 -2
- package/dist/index.es227.js +2 -2
- package/dist/index.es228.js +2 -2
- package/dist/index.es229.js +2 -2
- package/dist/index.es23.js +66 -36
- package/dist/index.es23.js.map +1 -1
- package/dist/index.es230.js +2 -2
- package/dist/index.es231.js +2 -2
- package/dist/index.es232.js +2 -2
- package/dist/index.es233.js +2 -2
- package/dist/index.es234.js +2 -2
- package/dist/index.es235.js +2 -2
- package/dist/index.es236.js +56 -2
- package/dist/index.es236.js.map +1 -1
- package/dist/index.es237.js +100 -2
- package/dist/index.es237.js.map +1 -1
- package/dist/index.es238.js +191 -2
- package/dist/index.es238.js.map +1 -1
- package/dist/index.es239.js +110 -2
- package/dist/index.es239.js.map +1 -1
- package/dist/index.es24.js +30 -64
- package/dist/index.es24.js.map +1 -1
- package/dist/index.es240.js +35 -2
- package/dist/index.es240.js.map +1 -1
- package/dist/index.es241.js +10 -2
- package/dist/index.es241.js.map +1 -1
- package/dist/index.es242.js +11 -2
- package/dist/index.es242.js.map +1 -1
- package/dist/index.es243.js +12 -2
- package/dist/index.es243.js.map +1 -1
- package/dist/index.es244.js +91 -2
- package/dist/index.es244.js.map +1 -1
- package/dist/index.es245.js +275 -2
- package/dist/index.es245.js.map +1 -1
- package/dist/index.es246.js +2 -2
- package/dist/index.es247.js +164 -2
- package/dist/index.es247.js.map +1 -1
- package/dist/index.es248.js +51 -2
- package/dist/index.es248.js.map +1 -1
- package/dist/index.es249.js +40 -2
- package/dist/index.es249.js.map +1 -1
- package/dist/index.es25.js +120 -29
- package/dist/index.es25.js.map +1 -1
- package/dist/index.es250.js +35 -2
- package/dist/index.es250.js.map +1 -1
- package/dist/index.es251.js +40 -2
- package/dist/index.es251.js.map +1 -1
- package/dist/index.es252.js +24 -2
- package/dist/index.es252.js.map +1 -1
- package/dist/index.es253.js +591 -2
- package/dist/index.es253.js.map +1 -1
- package/dist/index.es254.js +125 -2
- package/dist/index.es254.js.map +1 -1
- package/dist/index.es255.js +164 -2
- package/dist/index.es255.js.map +1 -1
- package/dist/index.es256.js +2 -2
- package/dist/index.es26.js +102 -123
- package/dist/index.es26.js.map +1 -1
- package/dist/index.es267.js +1 -1
- package/dist/index.es27.js +66 -101
- package/dist/index.es27.js.map +1 -1
- package/dist/index.es28.js +139 -66
- package/dist/index.es28.js.map +1 -1
- package/dist/index.es29.js +295 -131
- package/dist/index.es29.js.map +1 -1
- package/dist/index.es30.js +114 -298
- package/dist/index.es30.js.map +1 -1
- package/dist/index.es305.js +1 -1
- package/dist/index.es307.js +1 -1
- package/dist/index.es319.js +1 -1
- package/dist/index.es32.js +7 -7
- package/dist/index.es33.js +1 -1
- package/dist/index.es339.js +2 -2
- package/dist/index.es36.js +4 -4
- package/dist/index.es37.js +289 -114
- package/dist/index.es37.js.map +1 -1
- package/dist/index.es38.js +44 -70
- package/dist/index.es38.js.map +1 -1
- package/dist/index.es39.js +145 -19
- package/dist/index.es39.js.map +1 -1
- package/dist/index.es40.js +5 -261
- package/dist/index.es40.js.map +1 -1
- package/dist/index.es41.js +247 -38
- package/dist/index.es41.js.map +1 -1
- package/dist/index.es42.js +110 -207
- package/dist/index.es42.js.map +1 -1
- package/dist/index.es43.js +68 -64
- package/dist/index.es43.js.map +1 -1
- package/dist/index.es44.js +17 -141
- package/dist/index.es44.js.map +1 -1
- package/dist/index.es45.js +251 -14
- package/dist/index.es45.js.map +1 -1
- package/dist/index.es46.js +36 -223
- package/dist/index.es46.js.map +1 -1
- package/dist/index.es47.js +213 -7
- package/dist/index.es47.js.map +1 -1
- package/dist/index.es48.js +55 -1180
- package/dist/index.es48.js.map +1 -1
- package/dist/index.es49.js +141 -6
- package/dist/index.es49.js.map +1 -1
- package/dist/index.es50.js +21 -144
- package/dist/index.es50.js.map +1 -1
- package/dist/index.es51.js +230 -5
- package/dist/index.es51.js.map +1 -1
- package/dist/index.es52.js +8 -292
- package/dist/index.es52.js.map +1 -1
- package/dist/index.es53.js +1190 -43
- package/dist/index.es53.js.map +1 -1
- package/dist/index.es54.js +7 -144
- package/dist/index.es54.js.map +1 -1
- package/dist/index.es55.js +136 -241
- package/dist/index.es55.js.map +1 -1
- package/dist/index.es59.js +1 -1
- package/dist/index.es6.js +21 -8
- package/dist/index.es6.js.map +1 -1
- package/dist/index.es60.js +1 -1
- package/dist/index.es61.js +1 -1
- package/dist/index.es62.js +7 -7
- package/dist/index.es67.js +3 -3
- package/dist/index.es69.js +2 -2
- package/dist/index.es70.js +1 -1
- package/dist/index.es71.js +1 -1
- package/dist/index.es72.js +1 -1
- package/dist/index.es77.js +7 -7
- package/dist/index.es78.js +17 -17
- package/dist/index.es82.js +1 -1
- package/dist/index.es83.js +4 -4
- package/dist/index.es84.js +20 -11
- package/dist/index.es84.js.map +1 -1
- package/dist/index.es85.js +66 -38
- package/dist/index.es85.js.map +1 -1
- package/dist/index.es86.js +3 -34
- package/dist/index.es86.js.map +1 -1
- package/dist/index.es87.js +10 -230
- package/dist/index.es87.js.map +1 -1
- package/dist/index.es88.js +39 -29
- package/dist/index.es88.js.map +1 -1
- package/dist/index.es89.js +32 -73
- package/dist/index.es89.js.map +1 -1
- package/dist/index.es90.js +200 -44
- package/dist/index.es90.js.map +1 -1
- package/dist/index.es91.js +15 -37
- package/dist/index.es91.js.map +1 -1
- package/dist/index.es92.js +71 -26
- package/dist/index.es92.js.map +1 -1
- package/dist/index.es93.js +72 -39
- package/dist/index.es93.js.map +1 -1
- package/dist/index.es94.js +48 -53
- package/dist/index.es94.js.map +1 -1
- package/dist/index.es95.js +30 -13
- package/dist/index.es95.js.map +1 -1
- package/dist/index.es96.js +40 -134
- package/dist/index.es96.js.map +1 -1
- package/dist/index.es97.js +56 -20
- package/dist/index.es97.js.map +1 -1
- package/dist/index.es98.js +11 -180
- package/dist/index.es98.js.map +1 -1
- package/dist/index.es99.js +129 -233
- package/dist/index.es99.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
package/dist/index.es2.js
CHANGED
|
@@ -6,7 +6,7 @@ import { useStreamContext } from "./index.es7.js";
|
|
|
6
6
|
import { useThread } from "./index.es6.js";
|
|
7
7
|
import { AnimatePresence, motion } from "framer-motion";
|
|
8
8
|
import { EyeOff, ScanEye, PanelLeft, X } from "lucide-react";
|
|
9
|
-
import { useState, useEffect } from "react";
|
|
9
|
+
import { useState, useRef, useEffect } from "react";
|
|
10
10
|
import { v4 } from "uuid";
|
|
11
11
|
import ChatBody from "./index.es14.js";
|
|
12
12
|
import ChatButton from "./index.es15.js";
|
|
@@ -18,6 +18,50 @@ function Sidebar(props) {
|
|
|
18
18
|
const [internalLeftPanelOpen, setInternalLeftPanelOpen] = useState(false);
|
|
19
19
|
const [threadHistoryOpen, setThreadHistoryOpen] = useState(false);
|
|
20
20
|
const { fileInput, setFileInput } = useFileProvider();
|
|
21
|
+
const [leftPanelWidth, setLeftPanelWidth] = useState(30);
|
|
22
|
+
const [sidebarWidth, setSidebarWidth] = useState(30);
|
|
23
|
+
const [isResizingLeft, setIsResizingLeft] = useState(false);
|
|
24
|
+
const [isResizingSidebar, setIsResizingSidebar] = useState(false);
|
|
25
|
+
const sidebarRef = useRef(null);
|
|
26
|
+
const startXRef = useRef(0);
|
|
27
|
+
const startWidthRef = useRef(0);
|
|
28
|
+
useEffect(() => {
|
|
29
|
+
const handleMouseMove = (e) => {
|
|
30
|
+
if (isResizingLeft) {
|
|
31
|
+
const deltaX = startXRef.current - e.clientX;
|
|
32
|
+
const deltaVw = deltaX / window.innerWidth * 100;
|
|
33
|
+
const newLeftPanelWidth = startWidthRef.current + deltaVw;
|
|
34
|
+
const maxLeftPanelWidth = 40;
|
|
35
|
+
const minLeftPanelWidth = 30;
|
|
36
|
+
const clampedWidth = Math.max(minLeftPanelWidth, Math.min(maxLeftPanelWidth, newLeftPanelWidth));
|
|
37
|
+
setLeftPanelWidth(clampedWidth);
|
|
38
|
+
} else if (isResizingSidebar && sidebarRef.current) {
|
|
39
|
+
const deltaX = startXRef.current - e.clientX;
|
|
40
|
+
const deltaVw = deltaX / window.innerWidth * 100;
|
|
41
|
+
const newSidebarWidth = startWidthRef.current + deltaVw;
|
|
42
|
+
const maxSidebarWidth = 50;
|
|
43
|
+
const minSidebarWidth = 30;
|
|
44
|
+
const clampedWidth = Math.max(minSidebarWidth, Math.min(maxSidebarWidth, newSidebarWidth));
|
|
45
|
+
setSidebarWidth(clampedWidth);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
const handleMouseUp = () => {
|
|
49
|
+
setIsResizingLeft(false);
|
|
50
|
+
setIsResizingSidebar(false);
|
|
51
|
+
document.body.style.cursor = "default";
|
|
52
|
+
document.body.style.userSelect = "auto";
|
|
53
|
+
};
|
|
54
|
+
if (isResizingLeft || isResizingSidebar) {
|
|
55
|
+
document.body.style.cursor = "col-resize";
|
|
56
|
+
document.body.style.userSelect = "none";
|
|
57
|
+
document.addEventListener("mousemove", handleMouseMove);
|
|
58
|
+
document.addEventListener("mouseup", handleMouseUp);
|
|
59
|
+
return () => {
|
|
60
|
+
document.removeEventListener("mousemove", handleMouseMove);
|
|
61
|
+
document.removeEventListener("mouseup", handleMouseUp);
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}, [isResizingLeft, isResizingSidebar]);
|
|
21
65
|
const leftPanelOpen = externalLeftPanelOpen !== void 0 ? externalLeftPanelOpen : internalLeftPanelOpen;
|
|
22
66
|
const setLeftPanelOpen = externalSetLeftPanelOpen || setInternalLeftPanelOpen;
|
|
23
67
|
const stream = useStreamContext();
|
|
@@ -111,26 +155,69 @@ function Sidebar(props) {
|
|
|
111
155
|
/* @__PURE__ */ jsxs(
|
|
112
156
|
motion.aside,
|
|
113
157
|
{
|
|
114
|
-
|
|
158
|
+
ref: sidebarRef,
|
|
159
|
+
className: "fixed right-0 top-0 z-50 h-screen flex bg-[#0f0f0f] text-white/70",
|
|
160
|
+
style: { width: threadHistoryOpen ? `calc(${sidebarWidth}vw + 280px)` : `${sidebarWidth}vw` },
|
|
115
161
|
initial: { x: "100%" },
|
|
116
162
|
animate: { x: 0 },
|
|
117
163
|
exit: { x: "100%" },
|
|
118
164
|
transition: { type: "spring", stiffness: 260, damping: 30 },
|
|
119
165
|
children: [
|
|
120
|
-
/* @__PURE__ */ jsx(AnimatePresence, { children: leftPanelOpen && /* @__PURE__ */
|
|
166
|
+
/* @__PURE__ */ jsx(AnimatePresence, { children: leftPanelOpen && /* @__PURE__ */ jsxs(
|
|
121
167
|
motion.div,
|
|
122
168
|
{
|
|
123
|
-
className: "absolute right-full top-0 h-full
|
|
169
|
+
className: "absolute right-full top-0 h-full bg-[#0a0a0a] border-r border-zinc-700",
|
|
170
|
+
style: { width: `${leftPanelWidth}vw` },
|
|
124
171
|
initial: { x: "0" },
|
|
125
172
|
animate: { x: 0 },
|
|
126
173
|
exit: { x: "0%" },
|
|
127
174
|
transition: { type: "spring", stiffness: 400, damping: 40 },
|
|
128
|
-
children:
|
|
129
|
-
/* @__PURE__ */ jsx("
|
|
130
|
-
|
|
131
|
-
|
|
175
|
+
children: [
|
|
176
|
+
/* @__PURE__ */ jsx("div", { className: "h-full overflow-auto relative", children: leftPanelContent || /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
177
|
+
/* @__PURE__ */ jsx("h3", { className: "text-lg font-semibold mb-4 text-white p-4", children: "Left Panel" }),
|
|
178
|
+
/* @__PURE__ */ jsx("p", { className: "text-zinc-300 p-4", children: "This is the left extension panel. You can add any content here." })
|
|
179
|
+
] }) }),
|
|
180
|
+
/* @__PURE__ */ jsx(
|
|
181
|
+
"div",
|
|
182
|
+
{
|
|
183
|
+
onMouseDown: (e) => {
|
|
184
|
+
e.preventDefault();
|
|
185
|
+
e.stopPropagation();
|
|
186
|
+
startXRef.current = e.clientX;
|
|
187
|
+
startWidthRef.current = leftPanelWidth;
|
|
188
|
+
setIsResizingLeft(true);
|
|
189
|
+
},
|
|
190
|
+
className: "absolute left-0 top-0 w-1.5 h-full bg-zinc-700/50 cursor-col-resize transition-colors z-[60] hover:w-2 group",
|
|
191
|
+
style: { touchAction: "none" },
|
|
192
|
+
children: /* @__PURE__ */ jsxs("div", { className: "absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 flex flex-col gap-1 opacity-60 group-hover:opacity-100", children: [
|
|
193
|
+
/* @__PURE__ */ jsx("div", { className: "w-1 h-1 rounded-full bg-white" }),
|
|
194
|
+
/* @__PURE__ */ jsx("div", { className: "w-1 h-1 rounded-full bg-white" }),
|
|
195
|
+
/* @__PURE__ */ jsx("div", { className: "w-1 h-1 rounded-full bg-white" })
|
|
196
|
+
] })
|
|
197
|
+
}
|
|
198
|
+
)
|
|
199
|
+
]
|
|
132
200
|
}
|
|
133
201
|
) }),
|
|
202
|
+
/* @__PURE__ */ jsx(
|
|
203
|
+
"div",
|
|
204
|
+
{
|
|
205
|
+
onMouseDown: (e) => {
|
|
206
|
+
e.preventDefault();
|
|
207
|
+
e.stopPropagation();
|
|
208
|
+
startXRef.current = e.clientX;
|
|
209
|
+
startWidthRef.current = sidebarWidth;
|
|
210
|
+
setIsResizingSidebar(true);
|
|
211
|
+
},
|
|
212
|
+
className: "absolute left-0 top-0 w-1.5 h-full bg-zinc-700/50 cursor-col-resize transition-colors z-[60] hover:w-2 group",
|
|
213
|
+
style: { touchAction: "none" },
|
|
214
|
+
children: /* @__PURE__ */ jsxs("div", { className: "absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 flex flex-col gap-1 opacity-60 group-hover:opacity-100", children: [
|
|
215
|
+
/* @__PURE__ */ jsx("div", { className: "w-1 h-1 rounded-full bg-white" }),
|
|
216
|
+
/* @__PURE__ */ jsx("div", { className: "w-1 h-1 rounded-full bg-white" }),
|
|
217
|
+
/* @__PURE__ */ jsx("div", { className: "w-1 h-1 rounded-full bg-white" })
|
|
218
|
+
] })
|
|
219
|
+
}
|
|
220
|
+
),
|
|
134
221
|
/* @__PURE__ */ jsxs("div", { className: "flex h-full flex-col flex-1", children: [
|
|
135
222
|
/* @__PURE__ */ jsxs("div", { className: "flex py-3 px-6 justify-between items-center border-b border-zinc-700/30", children: [
|
|
136
223
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
@@ -195,7 +282,6 @@ function Sidebar(props) {
|
|
|
195
282
|
}
|
|
196
283
|
) })
|
|
197
284
|
] }),
|
|
198
|
-
" ",
|
|
199
285
|
/* @__PURE__ */ jsx(AnimatePresence, { children: threadHistoryOpen && /* @__PURE__ */ jsx(
|
|
200
286
|
motion.div,
|
|
201
287
|
{
|
|
@@ -206,8 +292,7 @@ function Sidebar(props) {
|
|
|
206
292
|
transition: { type: "spring", stiffness: 300, damping: 30 },
|
|
207
293
|
children: /* @__PURE__ */ jsx(ThreadHistory, { isSidebar: true, header: { title: "Sessions" }, onClose: () => setThreadHistoryOpen(false) })
|
|
208
294
|
}
|
|
209
|
-
) })
|
|
210
|
-
" "
|
|
295
|
+
) })
|
|
211
296
|
]
|
|
212
297
|
}
|
|
213
298
|
)
|
package/dist/index.es2.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es2.js","sources":["../src/pages/Sidebar/sidebar.tsx"],"sourcesContent":["import Suggestion from \"@/components/Suggestion\";\nimport ThreadHistory from \"@/components/threads/ThreadHistory\";\nimport { useFileProvider } from \"@/providers/FileProvider\";\nimport { useStreamContext } from \"@/providers/Stream\";\nimport { useThread } from \"@/providers/Thread\";\nimport type { ChatSidebarProps } from \"@/types/ChatProps\";\nimport type { FileInfo } from \"@/types/fileInput\";\nimport { logger } from \"@/utils/logger\";\nimport type { Message } from \"@langchain/langgraph-sdk\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { X, PanelLeft, ScanEye, EyeOff } from \"lucide-react\";\nimport { useEffect, useState, type FormEvent } from \"react\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport ChatBody from \"../../components/ChatBody\";\nimport ChatButton from \"../../components/ChatButton\";\nimport ChatInput from \"../../components/sidebar/ChatInput\";\n\n/**\n * Main sidebar chat interface component.\n * Displays a chat button that opens a sliding sidebar with full chat functionality.\n * \n * @param header - Custom header text for the chat sidebar (default: \"AI Assistant\")\n * @param handleFileSelect - Optional custom file selection handler\n * @param callThisOnSubmit - Optional callback invoked before message submission, can return updated file list\n * @param preventSubmit - Optional boolean to prevent all submit actions when true\n * @param leftPanelContent - Optional custom content for the left panel when expanded\n * @param leftPanelOpen - Optional external control for left panel open state\n * @param setLeftPanelOpen - Optional external setter for left panel open state\n * \n * @example\n * ```tsx\n * <Sidebar \n * header=\"My Custom AI\"\n * preventSubmit={true} // Disables all submit functionality\n * callThisOnSubmit={async () => {\n * // Upload files to your backend\n * return updatedFiles;\n * }}\n * leftPanelContent={<div className=\"text-white\">Custom left panel content here!</div>}\n * leftPanelOpen={isLeftPanelOpen}\n * setLeftPanelOpen={setIsLeftPanelOpen}\n * />\n * ```\n */\nexport default function Sidebar(props: ChatSidebarProps) {\n\n const { handleFileSelect, callThisOnSubmit, enableToolCallIndicator, header, inputFileAccept, filePreview, s3_upload, preventSubmit, leftPanelContent, leftPanelOpen: externalLeftPanelOpen, setLeftPanelOpen: externalSetLeftPanelOpen, chatBodyProps, supportChatHistory = false, supportSpeechToText = false } = props;\n const [open, setOpen] = useState(false);\n const [input, setInput] = useState(\"\");\n const [internalLeftPanelOpen, setInternalLeftPanelOpen] = useState(false);\n const [threadHistoryOpen, setThreadHistoryOpen] = useState(false);\n const { fileInput, setFileInput } = useFileProvider();\n\n const leftPanelOpen = externalLeftPanelOpen !== undefined ? externalLeftPanelOpen : internalLeftPanelOpen;\n const setLeftPanelOpen = externalSetLeftPanelOpen || setInternalLeftPanelOpen;\n\n const stream = useStreamContext();\n const isLoading = stream.isLoading;\n const { setMode } = useThread();\n\n // Set thread mode to single when using Sidebar\n // useEffect(() => {\n // setMode(\"single\");\n // }, [setMode]);\n\n\n useEffect(() => {\n if (supportChatHistory) {\n setMode(\"multi\");\n } else {\n setMode(\"single\");\n }\n }, [setMode, supportChatHistory]);\n\n const defaultHandleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n\n if (preventSubmit || (input.trim().length === 0 && fileInput.length === 0) || isLoading)\n return;\n\n // Call the custom upload and get the latest files\n let latestFiles: FileInfo[] = fileInput;\n let contextValues: Record<string, any> | undefined = undefined;\n if (callThisOnSubmit) {\n const result = await callThisOnSubmit();\n if (Array.isArray(result?.files) && result.files.length > 0) {\n latestFiles = result.files as FileInfo[];\n }\n if (result && result?.contextValues) contextValues = result.contextValues;\n }\n logger.debug(\"Using files for submission:\", latestFiles);\n // Create content blocks based on upload type\n let contentBlocks: any;\n if (s3_upload) {\n // For S3 uploads, send the text input (if any) as a text block\n // and include each uploaded file as a separate `document` block.\n contentBlocks = [\n ...(input.trim().length > 0 ? [{ type: \"text\", text: input.trim() }] : []),\n ...latestFiles.map((file) => ({\n type: \"document\" as const,\n source: { filename: file.fileName, filetype: file.fileType },\n })),\n ];\n } else {\n contentBlocks = [\n ...(input.trim().length > 0 ? [{ type: \"text\", text: input }] : []),\n ...latestFiles.map((file) => ({\n type: \"document\" as const,\n ...file,\n cache_control: { type: \"ephemeral\" as const },\n })),\n ];\n }\n logger.debug(\"Constructed content blocks:\", contentBlocks);\n const newHumanMessage: Message = {\n id: uuidv4(),\n type: \"human\",\n content: contentBlocks,\n };\n\n // Use the unified submitMessage function\n await stream.submitMessage(newHumanMessage, { contextValues: contextValues });\n\n setInput(\"\");\n setFileInput([]);\n };\n\n const defaultHandleFileSelect = async (\n event: React.ChangeEvent<HTMLInputElement>\n ) => {\n const files = event.target.files;\n if (!files) return;\n\n // Convert files to base64 for sending\n const fileDetails: FileInfo[] = await Promise.all(\n Array.from(files).map(async (file) => {\n const base64Data = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n const result = reader.result as string;\n resolve(result.split(\",\")[1]); // Remove data:...;base64, prefix\n };\n reader.onerror = reject;\n reader.readAsDataURL(file);\n });\n\n return {\n fileName: file.name,\n fileType: file.type,\n file: file,\n fileData: base64Data,\n };\n })\n );\n\n setFileInput((prevFile) => [...prevFile, ...fileDetails]);\n };\n\n const onFileSelect = handleFileSelect || defaultHandleFileSelect;\n return (\n <>\n <AnimatePresence>\n {open && (\n <>\n {/* Overlay */}\n <motion.div\n className=\"fixed inset-0 z-40 bg-black/30\"\n onClick={() => setOpen(false)}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n />\n\n {/* Sidebar */}\n <motion.aside\n className={`fixed right-0 top-0 z-50 h-screen flex bg-[#0f0f0f] text-white/70 ${threadHistoryOpen ? \"w-[calc(25vw+280px)]\" : \"w-[25vw]\"\n }`}\n initial={{ x: \"100%\" }}\n animate={{ x: 0 }}\n exit={{ x: \"100%\" }}\n transition={{ type: \"spring\", stiffness: 260, damping: 30 }}\n >\n <AnimatePresence>\n {leftPanelOpen && (\n <motion.div\n className=\"absolute right-full top-0 h-full w-[25vw]\"\n initial={{ x: \"0\" }}\n animate={{ x: 0 }}\n exit={{ x: \"0%\" }}\n transition={{ type: \"spring\", stiffness: 400, damping: 40 }}\n >\n {leftPanelContent || (\n <>\n <h3 className=\"text-lg font-semibold mb-4 text-white\">Left Panel</h3>\n <p className=\"text-zinc-300\">This is the left extension panel. You can add any content here.</p>\n </>\n )}\n </motion.div>\n )}\n </AnimatePresence>\n <div className=\"flex h-full flex-col flex-1\">\n <div className=\"flex py-3 px-6 justify-between items-center border-b border-zinc-700/30\">\n <div className=\"flex items-center gap-3\">\n {/* Vertically centered left panel toggle */}\n {leftPanelContent && (\n <div className=\"flex items-start gap-3\">\n {leftPanelOpen ? (\n <EyeOff\n className=\"cursor-pointer transition-transform h-5\"\n onClick={() => setLeftPanelOpen(!leftPanelOpen)}\n />\n ) : (\n <ScanEye\n className=\"cursor-pointer transition-transform h-5\"\n onClick={() => setLeftPanelOpen(!leftPanelOpen)}\n />\n )}\n </div>\n )}\n {header?.logoUrl && (\n <img\n src={header?.logoUrl}\n alt={header?.title ? `${header.title} logo` : \"AI Assistant logo\"}\n className=\"h-8 w-8 object-contain rounded-sm\"\n />\n )}\n <div className=\"text-start text-xl font-bold\">{header?.title || \"AI Assistant\"}</div>\n\n </div>\n <div className=\"flex items-end gap-3\">\n {supportChatHistory && !threadHistoryOpen && <PanelLeft\n className=\"h-5 text-zinc-400 cursor-pointer hover:text-zinc-200 transition-colors\"\n onClick={() => setThreadHistoryOpen(!threadHistoryOpen)}\n />}\n <X\n className=\"text-zinc-400 cursor-pointer\"\n onClick={() => setOpen(false)}\n />\n </div>\n </div>\n <div className=\"flex-1 relative\">\n <div className=\"absolute inset-0 overflow-auto scrollbar-none\">\n <div className=\"pb-20 p-2\">\n <ChatBody enableToolCallIndicator={enableToolCallIndicator} chatBodyProps={chatBodyProps} />\n </div>\n </div>\n <div className=\"absolute bottom-0 left-0 right-0 bg-transparent px-4 pointer-events-none z-10\">\n <div className=\"pointer-events-auto\">\n <Suggestion />\n </div>\n </div>\n </div>\n <div className=\"sticky bottom-0\">\n <ChatInput\n input={input}\n inputFileAccept={inputFileAccept}\n setInput={setInput}\n supportSpeechToText={supportSpeechToText}\n handleSubmit={defaultHandleSubmit}\n isLoading={isLoading}\n fileInput={fileInput}\n handleFileSelect={onFileSelect}\n setFileInput={setFileInput}\n onCancel={() => stream.stop?.()}\n filePreview={filePreview}\n />\n </div>\n </div> <AnimatePresence>\n {threadHistoryOpen && (\n <motion.div\n className=\"h-full w-[280px] shadow-2xl border-l border-white/10\"\n initial={{ width: 0, opacity: 0 }}\n animate={{ width: 280, opacity: 1 }}\n exit={{ width: 0, opacity: 0 }}\n transition={{ type: \"spring\", stiffness: 300, damping: 30 }}\n >\n <ThreadHistory isSidebar={true} header={{ title: \"Sessions\" }} onClose={() => setThreadHistoryOpen(false)} />\n </motion.div>\n )}\n </AnimatePresence> </motion.aside>\n </>\n )}\n </AnimatePresence>\n\n <ChatButton isVisible={!open} setOpen={setOpen} />\n </>\n );\n}\n"],"names":["uuidv4"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.es2.js","sources":["../src/pages/Sidebar/sidebar.tsx"],"sourcesContent":["import Suggestion from \"@/components/Suggestion\";\nimport ThreadHistory from \"@/components/threads/ThreadHistory\";\nimport { useFileProvider } from \"@/providers/FileProvider\";\nimport { useStreamContext } from \"@/providers/Stream\";\nimport { useThread } from \"@/providers/Thread\";\nimport type { ChatSidebarProps } from \"@/types/ChatProps\";\nimport type { FileInfo } from \"@/types/fileInput\";\nimport { logger } from \"@/utils/logger\";\nimport type { Message } from \"@langchain/langgraph-sdk\";\nimport { AnimatePresence, motion } from \"framer-motion\";\nimport { X, PanelLeft, ScanEye, EyeOff } from \"lucide-react\";\nimport { useEffect, useState, type FormEvent, useRef } from \"react\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport ChatBody from \"../../components/ChatBody\";\nimport ChatButton from \"../../components/ChatButton\";\nimport ChatInput from \"../../components/sidebar/ChatInput\";\n\n/**\n * Main sidebar chat interface component.\n * Displays a chat button that opens a sliding sidebar with full chat functionality.\n * \n * @param header - Custom header text for the chat sidebar (default: \"AI Assistant\")\n * @param handleFileSelect - Optional custom file selection handler\n * @param callThisOnSubmit - Optional callback invoked before message submission, can return updated file list\n * @param preventSubmit - Optional boolean to prevent all submit actions when true\n * @param leftPanelContent - Optional custom content for the left panel when expanded\n * @param leftPanelOpen - Optional external control for left panel open state\n * @param setLeftPanelOpen - Optional external setter for left panel open state\n * \n * @example\n * ```tsx\n * <Sidebar \n * header=\"My Custom AI\"\n * preventSubmit={true} // Disables all submit functionality\n * callThisOnSubmit={async () => {\n * // Upload files to your backend\n * return updatedFiles;\n * }}\n * leftPanelContent={<div className=\"text-white\">Custom left panel content here!</div>}\n * leftPanelOpen={isLeftPanelOpen}\n * setLeftPanelOpen={setIsLeftPanelOpen}\n * />\n * ```\n */\nexport default function Sidebar(props: ChatSidebarProps) {\n\n const { handleFileSelect, callThisOnSubmit, enableToolCallIndicator, header, inputFileAccept, filePreview, s3_upload, preventSubmit, leftPanelContent, leftPanelOpen: externalLeftPanelOpen, setLeftPanelOpen: externalSetLeftPanelOpen, chatBodyProps, supportChatHistory = false, supportSpeechToText = false } = props;\n const [open, setOpen] = useState(false);\n const [input, setInput] = useState(\"\");\n const [internalLeftPanelOpen, setInternalLeftPanelOpen] = useState(false);\n const [threadHistoryOpen, setThreadHistoryOpen] = useState(false);\n const { fileInput, setFileInput } = useFileProvider();\n \n // Resize state\n const [leftPanelWidth, setLeftPanelWidth] = useState(30); // in vw\n const [sidebarWidth, setSidebarWidth] = useState(30); // in vw\n const [isResizingLeft, setIsResizingLeft] = useState(false);\n const [isResizingSidebar, setIsResizingSidebar] = useState(false);\n const sidebarRef = useRef<HTMLDivElement>(null);\n const startXRef = useRef<number>(0);\n const startWidthRef = useRef<number>(0);\n\n // Handle left panel resize\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n if (isResizingLeft) {\n // For left panel: it extends to the left of the sidebar,\n // so dragging LEFT (decreasing clientX) should INCREASE width\n const deltaX = startXRef.current - e.clientX;\n // Convert to vw\n const deltaVw = (deltaX / window.innerWidth) * 100;\n const newLeftPanelWidth = startWidthRef.current + deltaVw;\n const maxLeftPanelWidth = 40;\n const minLeftPanelWidth = 30;\n \n // Clamp the value\n const clampedWidth = Math.max(minLeftPanelWidth, Math.min(maxLeftPanelWidth, newLeftPanelWidth));\n setLeftPanelWidth(clampedWidth);\n } else if (isResizingSidebar && sidebarRef.current) {\n // For sidebar on right: moving left increases width (handle is on left edge)\n const deltaX = startXRef.current - e.clientX;\n // Convert to vw\n const deltaVw = (deltaX / window.innerWidth) * 100;\n const newSidebarWidth = startWidthRef.current + deltaVw;\n const maxSidebarWidth = 50;\n const minSidebarWidth = 30;\n \n // Clamp the value\n const clampedWidth = Math.max(minSidebarWidth, Math.min(maxSidebarWidth, newSidebarWidth));\n setSidebarWidth(clampedWidth);\n }\n };\n\n const handleMouseUp = () => {\n setIsResizingLeft(false);\n setIsResizingSidebar(false);\n document.body.style.cursor = 'default';\n document.body.style.userSelect = 'auto';\n };\n\n if (isResizingLeft || isResizingSidebar) {\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp);\n return () => {\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }\n }, [isResizingLeft, isResizingSidebar]);\n\n const leftPanelOpen = externalLeftPanelOpen !== undefined ? externalLeftPanelOpen : internalLeftPanelOpen;\n const setLeftPanelOpen = externalSetLeftPanelOpen || setInternalLeftPanelOpen;\n\n const stream = useStreamContext();\n const isLoading = stream.isLoading;\n const { setMode } = useThread();\n\n // Set thread mode to single when using Sidebar\n // useEffect(() => {\n // setMode(\"single\");\n // }, [setMode]);\n\n\n useEffect(() => {\n if (supportChatHistory) {\n setMode(\"multi\");\n } else {\n setMode(\"single\");\n }\n }, [setMode, supportChatHistory]);\n\n const defaultHandleSubmit = async (e: FormEvent) => {\n e.preventDefault();\n\n if (preventSubmit || (input.trim().length === 0 && fileInput.length === 0) || isLoading)\n return;\n\n // Call the custom upload and get the latest files\n let latestFiles: FileInfo[] = fileInput;\n let contextValues: Record<string, any> | undefined = undefined;\n if (callThisOnSubmit) {\n const result = await callThisOnSubmit();\n if (Array.isArray(result?.files) && result.files.length > 0) {\n latestFiles = result.files as FileInfo[];\n }\n if (result && result?.contextValues) contextValues = result.contextValues;\n }\n logger.debug(\"Using files for submission:\", latestFiles);\n // Create content blocks based on upload type\n let contentBlocks: any;\n if (s3_upload) {\n // For S3 uploads, send the text input (if any) as a text block\n // and include each uploaded file as a separate `document` block.\n contentBlocks = [\n ...(input.trim().length > 0 ? [{ type: \"text\", text: input.trim() }] : []),\n ...latestFiles.map((file) => ({\n type: \"document\" as const,\n source: { filename: file.fileName, filetype: file.fileType },\n })),\n ];\n } else {\n contentBlocks = [\n ...(input.trim().length > 0 ? [{ type: \"text\", text: input }] : []),\n ...latestFiles.map((file) => ({\n type: \"document\" as const,\n ...file,\n cache_control: { type: \"ephemeral\" as const },\n })),\n ];\n }\n logger.debug(\"Constructed content blocks:\", contentBlocks);\n const newHumanMessage: Message = {\n id: uuidv4(),\n type: \"human\",\n content: contentBlocks,\n };\n\n // Use the unified submitMessage function\n await stream.submitMessage(newHumanMessage, { contextValues: contextValues });\n\n setInput(\"\");\n setFileInput([]);\n };\n\n const defaultHandleFileSelect = async (\n event: React.ChangeEvent<HTMLInputElement>\n ) => {\n const files = event.target.files;\n if (!files) return;\n\n // Convert files to base64 for sending\n const fileDetails: FileInfo[] = await Promise.all(\n Array.from(files).map(async (file) => {\n const base64Data = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n const result = reader.result as string;\n resolve(result.split(\",\")[1]); // Remove data:...;base64, prefix\n };\n reader.onerror = reject;\n reader.readAsDataURL(file);\n });\n\n return {\n fileName: file.name,\n fileType: file.type,\n file: file,\n fileData: base64Data,\n };\n })\n );\n\n setFileInput((prevFile) => [...prevFile, ...fileDetails]);\n };\n\n const onFileSelect = handleFileSelect || defaultHandleFileSelect;\n return (\n <>\n <AnimatePresence>\n {open && (\n <>\n {/* Overlay */}\n <motion.div\n className=\"fixed inset-0 z-40 bg-black/30\"\n onClick={() => setOpen(false)}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n />\n\n {/* Sidebar */}\n <motion.aside\n ref={sidebarRef}\n className=\"fixed right-0 top-0 z-50 h-screen flex bg-[#0f0f0f] text-white/70\"\n style={{ width: threadHistoryOpen ? `calc(${sidebarWidth}vw + 280px)` : `${sidebarWidth}vw` }}\n initial={{ x: \"100%\" }}\n animate={{ x: 0 }}\n exit={{ x: \"100%\" }}\n transition={{ type: \"spring\", stiffness: 260, damping: 30 }}\n >\n <AnimatePresence>\n {leftPanelOpen && (\n <motion.div\n className=\"absolute right-full top-0 h-full bg-[#0a0a0a] border-r border-zinc-700\"\n style={{ width: `${leftPanelWidth}vw` }}\n initial={{ x: \"0\" }}\n animate={{ x: 0 }}\n exit={{ x: \"0%\" }}\n transition={{ type: \"spring\", stiffness: 400, damping: 40 }}\n >\n <div className=\"h-full overflow-auto relative\">\n {leftPanelContent || (\n <>\n <h3 className=\"text-lg font-semibold mb-4 text-white p-4\">Left Panel</h3>\n <p className=\"text-zinc-300 p-4\">This is the left extension panel. You can add any content here.</p>\n </>\n )}\n </div>\n {/* Resize handle for left panel (on left edge) */}\n <div\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n startXRef.current = e.clientX;\n startWidthRef.current = leftPanelWidth;\n setIsResizingLeft(true);\n }}\n className=\"absolute left-0 top-0 w-1.5 h-full bg-zinc-700/50 cursor-col-resize transition-colors z-[60] hover:w-2 group\"\n style={{ touchAction: 'none' }}\n >\n <div className=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 flex flex-col gap-1 opacity-60 group-hover:opacity-100\">\n <div className=\"w-1 h-1 rounded-full bg-white\"></div>\n <div className=\"w-1 h-1 rounded-full bg-white\"></div>\n <div className=\"w-1 h-1 rounded-full bg-white\"></div>\n </div>\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n {/* Resize handle for sidebar */}\n <div\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n startXRef.current = e.clientX;\n startWidthRef.current = sidebarWidth;\n setIsResizingSidebar(true);\n }}\n className=\"absolute left-0 top-0 w-1.5 h-full bg-zinc-700/50 cursor-col-resize transition-colors z-[60] hover:w-2 group\"\n style={{ touchAction: 'none' }}\n >\n <div className=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 flex flex-col gap-1 opacity-60 group-hover:opacity-100\">\n <div className=\"w-1 h-1 rounded-full bg-white\"></div>\n <div className=\"w-1 h-1 rounded-full bg-white\"></div>\n <div className=\"w-1 h-1 rounded-full bg-white\"></div>\n </div>\n </div>\n <div className=\"flex h-full flex-col flex-1\">\n <div className=\"flex py-3 px-6 justify-between items-center border-b border-zinc-700/30\">\n <div className=\"flex items-center gap-3\">\n {/* Vertically centered left panel toggle */}\n {leftPanelContent && (\n <div className=\"flex items-start gap-3\">\n {leftPanelOpen ? (\n <EyeOff\n className=\"cursor-pointer transition-transform h-5\"\n onClick={() => setLeftPanelOpen(!leftPanelOpen)}\n />\n ) : (\n <ScanEye\n className=\"cursor-pointer transition-transform h-5\"\n onClick={() => setLeftPanelOpen(!leftPanelOpen)}\n />\n )}\n </div>\n )}\n {header?.logoUrl && (\n <img\n src={header?.logoUrl}\n alt={header?.title ? `${header.title} logo` : \"AI Assistant logo\"}\n className=\"h-8 w-8 object-contain rounded-sm\"\n />\n )}\n <div className=\"text-start text-xl font-bold\">{header?.title || \"AI Assistant\"}</div>\n\n </div>\n <div className=\"flex items-end gap-3\">\n {supportChatHistory && !threadHistoryOpen && <PanelLeft\n className=\"h-5 text-zinc-400 cursor-pointer hover:text-zinc-200 transition-colors\"\n onClick={() => setThreadHistoryOpen(!threadHistoryOpen)}\n />}\n <X\n className=\"text-zinc-400 cursor-pointer\"\n onClick={() => setOpen(false)}\n />\n </div>\n </div>\n <div className=\"flex-1 relative\">\n <div className=\"absolute inset-0 overflow-auto scrollbar-none\">\n <div className=\"pb-20 p-2\">\n <ChatBody enableToolCallIndicator={enableToolCallIndicator} chatBodyProps={chatBodyProps} />\n </div>\n </div>\n <div className=\"absolute bottom-0 left-0 right-0 bg-transparent px-4 pointer-events-none z-10\">\n <div className=\"pointer-events-auto\">\n <Suggestion />\n </div>\n </div>\n </div>\n <div className=\"sticky bottom-0\">\n <ChatInput\n input={input}\n inputFileAccept={inputFileAccept}\n setInput={setInput}\n supportSpeechToText={supportSpeechToText}\n handleSubmit={defaultHandleSubmit}\n isLoading={isLoading}\n fileInput={fileInput}\n handleFileSelect={onFileSelect}\n setFileInput={setFileInput}\n onCancel={() => stream.stop?.()}\n filePreview={filePreview}\n />\n </div>\n </div>\n <AnimatePresence>\n {threadHistoryOpen && (\n <motion.div\n className=\"h-full w-[280px] shadow-2xl border-l border-white/10\"\n initial={{ width: 0, opacity: 0 }}\n animate={{ width: 280, opacity: 1 }}\n exit={{ width: 0, opacity: 0 }}\n transition={{ type: \"spring\", stiffness: 300, damping: 30 }}\n >\n <ThreadHistory isSidebar={true} header={{ title: \"Sessions\" }} onClose={() => setThreadHistoryOpen(false)} />\n </motion.div>\n )}\n </AnimatePresence>\n </motion.aside>\n </>\n )}\n </AnimatePresence>\n\n <ChatButton isVisible={!open} setOpen={setOpen} />\n </>\n );\n}\n"],"names":["uuidv4"],"mappings":"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"}
|
package/dist/index.es20.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { bootstrapUiContext } from "./index.
|
|
2
|
-
import { LoadExternalComponent, useStreamContext } from "./index.
|
|
1
|
+
import { bootstrapUiContext } from "./index.es30.js";
|
|
2
|
+
import { LoadExternalComponent, useStreamContext } from "./index.es30.js";
|
|
3
3
|
bootstrapUiContext();
|
|
4
4
|
export {
|
|
5
5
|
LoadExternalComponent,
|
package/dist/index.es200.js
CHANGED
|
@@ -1,278 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
import { __require as requireEventemitter3 } from "./index.es202.js";
|
|
3
|
-
import { __require as requirePTimeout } from "./index.es203.js";
|
|
4
|
-
import { __require as requirePriorityQueue } from "./index.es204.js";
|
|
5
|
-
var hasRequiredDist;
|
|
6
|
-
function requireDist() {
|
|
7
|
-
if (hasRequiredDist) return dist;
|
|
8
|
-
hasRequiredDist = 1;
|
|
9
|
-
Object.defineProperty(dist, "__esModule", { value: true });
|
|
10
|
-
const EventEmitter = requireEventemitter3();
|
|
11
|
-
const p_timeout_1 = requirePTimeout();
|
|
12
|
-
const priority_queue_1 = requirePriorityQueue();
|
|
13
|
-
const empty = () => {
|
|
14
|
-
};
|
|
15
|
-
const timeoutError = new p_timeout_1.TimeoutError();
|
|
16
|
-
class PQueue extends EventEmitter {
|
|
17
|
-
constructor(options) {
|
|
18
|
-
var _a, _b, _c, _d;
|
|
19
|
-
super();
|
|
20
|
-
this._intervalCount = 0;
|
|
21
|
-
this._intervalEnd = 0;
|
|
22
|
-
this._pendingCount = 0;
|
|
23
|
-
this._resolveEmpty = empty;
|
|
24
|
-
this._resolveIdle = empty;
|
|
25
|
-
options = Object.assign({ carryoverConcurrencyCount: false, intervalCap: Infinity, interval: 0, concurrency: Infinity, autoStart: true, queueClass: priority_queue_1.default }, options);
|
|
26
|
-
if (!(typeof options.intervalCap === "number" && options.intervalCap >= 1)) {
|
|
27
|
-
throw new TypeError(`Expected \`intervalCap\` to be a number from 1 and up, got \`${(_b = (_a = options.intervalCap) === null || _a === void 0 ? void 0 : _a.toString()) !== null && _b !== void 0 ? _b : ""}\` (${typeof options.intervalCap})`);
|
|
28
|
-
}
|
|
29
|
-
if (options.interval === void 0 || !(Number.isFinite(options.interval) && options.interval >= 0)) {
|
|
30
|
-
throw new TypeError(`Expected \`interval\` to be a finite number >= 0, got \`${(_d = (_c = options.interval) === null || _c === void 0 ? void 0 : _c.toString()) !== null && _d !== void 0 ? _d : ""}\` (${typeof options.interval})`);
|
|
31
|
-
}
|
|
32
|
-
this._carryoverConcurrencyCount = options.carryoverConcurrencyCount;
|
|
33
|
-
this._isIntervalIgnored = options.intervalCap === Infinity || options.interval === 0;
|
|
34
|
-
this._intervalCap = options.intervalCap;
|
|
35
|
-
this._interval = options.interval;
|
|
36
|
-
this._queue = new options.queueClass();
|
|
37
|
-
this._queueClass = options.queueClass;
|
|
38
|
-
this.concurrency = options.concurrency;
|
|
39
|
-
this._timeout = options.timeout;
|
|
40
|
-
this._throwOnTimeout = options.throwOnTimeout === true;
|
|
41
|
-
this._isPaused = options.autoStart === false;
|
|
42
|
-
}
|
|
43
|
-
get _doesIntervalAllowAnother() {
|
|
44
|
-
return this._isIntervalIgnored || this._intervalCount < this._intervalCap;
|
|
45
|
-
}
|
|
46
|
-
get _doesConcurrentAllowAnother() {
|
|
47
|
-
return this._pendingCount < this._concurrency;
|
|
48
|
-
}
|
|
49
|
-
_next() {
|
|
50
|
-
this._pendingCount--;
|
|
51
|
-
this._tryToStartAnother();
|
|
52
|
-
this.emit("next");
|
|
53
|
-
}
|
|
54
|
-
_resolvePromises() {
|
|
55
|
-
this._resolveEmpty();
|
|
56
|
-
this._resolveEmpty = empty;
|
|
57
|
-
if (this._pendingCount === 0) {
|
|
58
|
-
this._resolveIdle();
|
|
59
|
-
this._resolveIdle = empty;
|
|
60
|
-
this.emit("idle");
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
_onResumeInterval() {
|
|
64
|
-
this._onInterval();
|
|
65
|
-
this._initializeIntervalIfNeeded();
|
|
66
|
-
this._timeoutId = void 0;
|
|
67
|
-
}
|
|
68
|
-
_isIntervalPaused() {
|
|
69
|
-
const now = Date.now();
|
|
70
|
-
if (this._intervalId === void 0) {
|
|
71
|
-
const delay = this._intervalEnd - now;
|
|
72
|
-
if (delay < 0) {
|
|
73
|
-
this._intervalCount = this._carryoverConcurrencyCount ? this._pendingCount : 0;
|
|
74
|
-
} else {
|
|
75
|
-
if (this._timeoutId === void 0) {
|
|
76
|
-
this._timeoutId = setTimeout(() => {
|
|
77
|
-
this._onResumeInterval();
|
|
78
|
-
}, delay);
|
|
79
|
-
}
|
|
80
|
-
return true;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
return false;
|
|
84
|
-
}
|
|
85
|
-
_tryToStartAnother() {
|
|
86
|
-
if (this._queue.size === 0) {
|
|
87
|
-
if (this._intervalId) {
|
|
88
|
-
clearInterval(this._intervalId);
|
|
89
|
-
}
|
|
90
|
-
this._intervalId = void 0;
|
|
91
|
-
this._resolvePromises();
|
|
92
|
-
return false;
|
|
93
|
-
}
|
|
94
|
-
if (!this._isPaused) {
|
|
95
|
-
const canInitializeInterval = !this._isIntervalPaused();
|
|
96
|
-
if (this._doesIntervalAllowAnother && this._doesConcurrentAllowAnother) {
|
|
97
|
-
const job = this._queue.dequeue();
|
|
98
|
-
if (!job) {
|
|
99
|
-
return false;
|
|
100
|
-
}
|
|
101
|
-
this.emit("active");
|
|
102
|
-
job();
|
|
103
|
-
if (canInitializeInterval) {
|
|
104
|
-
this._initializeIntervalIfNeeded();
|
|
105
|
-
}
|
|
106
|
-
return true;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
return false;
|
|
110
|
-
}
|
|
111
|
-
_initializeIntervalIfNeeded() {
|
|
112
|
-
if (this._isIntervalIgnored || this._intervalId !== void 0) {
|
|
113
|
-
return;
|
|
114
|
-
}
|
|
115
|
-
this._intervalId = setInterval(() => {
|
|
116
|
-
this._onInterval();
|
|
117
|
-
}, this._interval);
|
|
118
|
-
this._intervalEnd = Date.now() + this._interval;
|
|
119
|
-
}
|
|
120
|
-
_onInterval() {
|
|
121
|
-
if (this._intervalCount === 0 && this._pendingCount === 0 && this._intervalId) {
|
|
122
|
-
clearInterval(this._intervalId);
|
|
123
|
-
this._intervalId = void 0;
|
|
124
|
-
}
|
|
125
|
-
this._intervalCount = this._carryoverConcurrencyCount ? this._pendingCount : 0;
|
|
126
|
-
this._processQueue();
|
|
127
|
-
}
|
|
128
|
-
/**
|
|
129
|
-
Executes all queued functions until it reaches the limit.
|
|
130
|
-
*/
|
|
131
|
-
_processQueue() {
|
|
132
|
-
while (this._tryToStartAnother()) {
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
get concurrency() {
|
|
136
|
-
return this._concurrency;
|
|
137
|
-
}
|
|
138
|
-
set concurrency(newConcurrency) {
|
|
139
|
-
if (!(typeof newConcurrency === "number" && newConcurrency >= 1)) {
|
|
140
|
-
throw new TypeError(`Expected \`concurrency\` to be a number from 1 and up, got \`${newConcurrency}\` (${typeof newConcurrency})`);
|
|
141
|
-
}
|
|
142
|
-
this._concurrency = newConcurrency;
|
|
143
|
-
this._processQueue();
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
Adds a sync or async task to the queue. Always returns a promise.
|
|
147
|
-
*/
|
|
148
|
-
async add(fn, options = {}) {
|
|
149
|
-
return new Promise((resolve, reject) => {
|
|
150
|
-
const run = async () => {
|
|
151
|
-
this._pendingCount++;
|
|
152
|
-
this._intervalCount++;
|
|
153
|
-
try {
|
|
154
|
-
const operation = this._timeout === void 0 && options.timeout === void 0 ? fn() : p_timeout_1.default(Promise.resolve(fn()), options.timeout === void 0 ? this._timeout : options.timeout, () => {
|
|
155
|
-
if (options.throwOnTimeout === void 0 ? this._throwOnTimeout : options.throwOnTimeout) {
|
|
156
|
-
reject(timeoutError);
|
|
157
|
-
}
|
|
158
|
-
return void 0;
|
|
159
|
-
});
|
|
160
|
-
resolve(await operation);
|
|
161
|
-
} catch (error) {
|
|
162
|
-
reject(error);
|
|
163
|
-
}
|
|
164
|
-
this._next();
|
|
165
|
-
};
|
|
166
|
-
this._queue.enqueue(run, options);
|
|
167
|
-
this._tryToStartAnother();
|
|
168
|
-
this.emit("add");
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
/**
|
|
172
|
-
Same as `.add()`, but accepts an array of sync or async functions.
|
|
173
|
-
|
|
174
|
-
@returns A promise that resolves when all functions are resolved.
|
|
175
|
-
*/
|
|
176
|
-
async addAll(functions, options) {
|
|
177
|
-
return Promise.all(functions.map(async (function_) => this.add(function_, options)));
|
|
178
|
-
}
|
|
179
|
-
/**
|
|
180
|
-
Start (or resume) executing enqueued tasks within concurrency limit. No need to call this if queue is not paused (via `options.autoStart = false` or by `.pause()` method.)
|
|
181
|
-
*/
|
|
182
|
-
start() {
|
|
183
|
-
if (!this._isPaused) {
|
|
184
|
-
return this;
|
|
185
|
-
}
|
|
186
|
-
this._isPaused = false;
|
|
187
|
-
this._processQueue();
|
|
188
|
-
return this;
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
Put queue execution on hold.
|
|
192
|
-
*/
|
|
193
|
-
pause() {
|
|
194
|
-
this._isPaused = true;
|
|
195
|
-
}
|
|
196
|
-
/**
|
|
197
|
-
Clear the queue.
|
|
198
|
-
*/
|
|
199
|
-
clear() {
|
|
200
|
-
this._queue = new this._queueClass();
|
|
201
|
-
}
|
|
202
|
-
/**
|
|
203
|
-
Can be called multiple times. Useful if you for example add additional items at a later time.
|
|
204
|
-
|
|
205
|
-
@returns A promise that settles when the queue becomes empty.
|
|
206
|
-
*/
|
|
207
|
-
async onEmpty() {
|
|
208
|
-
if (this._queue.size === 0) {
|
|
209
|
-
return;
|
|
210
|
-
}
|
|
211
|
-
return new Promise((resolve) => {
|
|
212
|
-
const existingResolve = this._resolveEmpty;
|
|
213
|
-
this._resolveEmpty = () => {
|
|
214
|
-
existingResolve();
|
|
215
|
-
resolve();
|
|
216
|
-
};
|
|
217
|
-
});
|
|
218
|
-
}
|
|
219
|
-
/**
|
|
220
|
-
The difference with `.onEmpty` is that `.onIdle` guarantees that all work from the queue has finished. `.onEmpty` merely signals that the queue is empty, but it could mean that some promises haven't completed yet.
|
|
221
|
-
|
|
222
|
-
@returns A promise that settles when the queue becomes empty, and all promises have completed; `queue.size === 0 && queue.pending === 0`.
|
|
223
|
-
*/
|
|
224
|
-
async onIdle() {
|
|
225
|
-
if (this._pendingCount === 0 && this._queue.size === 0) {
|
|
226
|
-
return;
|
|
227
|
-
}
|
|
228
|
-
return new Promise((resolve) => {
|
|
229
|
-
const existingResolve = this._resolveIdle;
|
|
230
|
-
this._resolveIdle = () => {
|
|
231
|
-
existingResolve();
|
|
232
|
-
resolve();
|
|
233
|
-
};
|
|
234
|
-
});
|
|
235
|
-
}
|
|
236
|
-
/**
|
|
237
|
-
Size of the queue.
|
|
238
|
-
*/
|
|
239
|
-
get size() {
|
|
240
|
-
return this._queue.size;
|
|
241
|
-
}
|
|
242
|
-
/**
|
|
243
|
-
Size of the queue, filtered by the given options.
|
|
244
|
-
|
|
245
|
-
For example, this can be used to find the number of items remaining in the queue with a specific priority level.
|
|
246
|
-
*/
|
|
247
|
-
sizeBy(options) {
|
|
248
|
-
return this._queue.filter(options).length;
|
|
249
|
-
}
|
|
250
|
-
/**
|
|
251
|
-
Number of pending promises.
|
|
252
|
-
*/
|
|
253
|
-
get pending() {
|
|
254
|
-
return this._pendingCount;
|
|
255
|
-
}
|
|
256
|
-
/**
|
|
257
|
-
Whether the queue is currently paused.
|
|
258
|
-
*/
|
|
259
|
-
get isPaused() {
|
|
260
|
-
return this._isPaused;
|
|
261
|
-
}
|
|
262
|
-
get timeout() {
|
|
263
|
-
return this._timeout;
|
|
264
|
-
}
|
|
265
|
-
/**
|
|
266
|
-
Set the timeout for future operations.
|
|
267
|
-
*/
|
|
268
|
-
set timeout(milliseconds) {
|
|
269
|
-
this._timeout = milliseconds;
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
dist.default = PQueue;
|
|
273
|
-
return dist;
|
|
274
|
-
}
|
|
1
|
+
var a11yDark = {};
|
|
275
2
|
export {
|
|
276
|
-
|
|
3
|
+
a11yDark as __exports
|
|
277
4
|
};
|
|
278
5
|
//# sourceMappingURL=index.es200.js.map
|
package/dist/index.es200.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es200.js","sources":["../node_modules/.pnpm/p-queue@6.6.2/node_modules/p-queue/dist/index.js"],"sourcesContent":["\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nconst EventEmitter = require(\"eventemitter3\");\nconst p_timeout_1 = require(\"p-timeout\");\nconst priority_queue_1 = require(\"./priority-queue\");\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nconst empty = () => { };\nconst timeoutError = new p_timeout_1.TimeoutError();\n/**\nPromise queue with concurrency control.\n*/\nclass PQueue extends EventEmitter {\n constructor(options) {\n var _a, _b, _c, _d;\n super();\n this._intervalCount = 0;\n this._intervalEnd = 0;\n this._pendingCount = 0;\n this._resolveEmpty = empty;\n this._resolveIdle = empty;\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n options = Object.assign({ carryoverConcurrencyCount: false, intervalCap: Infinity, interval: 0, concurrency: Infinity, autoStart: true, queueClass: priority_queue_1.default }, options);\n if (!(typeof options.intervalCap === 'number' && options.intervalCap >= 1)) {\n throw new TypeError(`Expected \\`intervalCap\\` to be a number from 1 and up, got \\`${(_b = (_a = options.intervalCap) === null || _a === void 0 ? void 0 : _a.toString()) !== null && _b !== void 0 ? _b : ''}\\` (${typeof options.intervalCap})`);\n }\n if (options.interval === undefined || !(Number.isFinite(options.interval) && options.interval >= 0)) {\n throw new TypeError(`Expected \\`interval\\` to be a finite number >= 0, got \\`${(_d = (_c = options.interval) === null || _c === void 0 ? void 0 : _c.toString()) !== null && _d !== void 0 ? _d : ''}\\` (${typeof options.interval})`);\n }\n this._carryoverConcurrencyCount = options.carryoverConcurrencyCount;\n this._isIntervalIgnored = options.intervalCap === Infinity || options.interval === 0;\n this._intervalCap = options.intervalCap;\n this._interval = options.interval;\n this._queue = new options.queueClass();\n this._queueClass = options.queueClass;\n this.concurrency = options.concurrency;\n this._timeout = options.timeout;\n this._throwOnTimeout = options.throwOnTimeout === true;\n this._isPaused = options.autoStart === false;\n }\n get _doesIntervalAllowAnother() {\n return this._isIntervalIgnored || this._intervalCount < this._intervalCap;\n }\n get _doesConcurrentAllowAnother() {\n return this._pendingCount < this._concurrency;\n }\n _next() {\n this._pendingCount--;\n this._tryToStartAnother();\n this.emit('next');\n }\n _resolvePromises() {\n this._resolveEmpty();\n this._resolveEmpty = empty;\n if (this._pendingCount === 0) {\n this._resolveIdle();\n this._resolveIdle = empty;\n this.emit('idle');\n }\n }\n _onResumeInterval() {\n this._onInterval();\n this._initializeIntervalIfNeeded();\n this._timeoutId = undefined;\n }\n _isIntervalPaused() {\n const now = Date.now();\n if (this._intervalId === undefined) {\n const delay = this._intervalEnd - now;\n if (delay < 0) {\n // Act as the interval was done\n // We don't need to resume it here because it will be resumed on line 160\n this._intervalCount = (this._carryoverConcurrencyCount) ? this._pendingCount : 0;\n }\n else {\n // Act as the interval is pending\n if (this._timeoutId === undefined) {\n this._timeoutId = setTimeout(() => {\n this._onResumeInterval();\n }, delay);\n }\n return true;\n }\n }\n return false;\n }\n _tryToStartAnother() {\n if (this._queue.size === 0) {\n // We can clear the interval (\"pause\")\n // Because we can redo it later (\"resume\")\n if (this._intervalId) {\n clearInterval(this._intervalId);\n }\n this._intervalId = undefined;\n this._resolvePromises();\n return false;\n }\n if (!this._isPaused) {\n const canInitializeInterval = !this._isIntervalPaused();\n if (this._doesIntervalAllowAnother && this._doesConcurrentAllowAnother) {\n const job = this._queue.dequeue();\n if (!job) {\n return false;\n }\n this.emit('active');\n job();\n if (canInitializeInterval) {\n this._initializeIntervalIfNeeded();\n }\n return true;\n }\n }\n return false;\n }\n _initializeIntervalIfNeeded() {\n if (this._isIntervalIgnored || this._intervalId !== undefined) {\n return;\n }\n this._intervalId = setInterval(() => {\n this._onInterval();\n }, this._interval);\n this._intervalEnd = Date.now() + this._interval;\n }\n _onInterval() {\n if (this._intervalCount === 0 && this._pendingCount === 0 && this._intervalId) {\n clearInterval(this._intervalId);\n this._intervalId = undefined;\n }\n this._intervalCount = this._carryoverConcurrencyCount ? this._pendingCount : 0;\n this._processQueue();\n }\n /**\n Executes all queued functions until it reaches the limit.\n */\n _processQueue() {\n // eslint-disable-next-line no-empty\n while (this._tryToStartAnother()) { }\n }\n get concurrency() {\n return this._concurrency;\n }\n set concurrency(newConcurrency) {\n if (!(typeof newConcurrency === 'number' && newConcurrency >= 1)) {\n throw new TypeError(`Expected \\`concurrency\\` to be a number from 1 and up, got \\`${newConcurrency}\\` (${typeof newConcurrency})`);\n }\n this._concurrency = newConcurrency;\n this._processQueue();\n }\n /**\n Adds a sync or async task to the queue. Always returns a promise.\n */\n async add(fn, options = {}) {\n return new Promise((resolve, reject) => {\n const run = async () => {\n this._pendingCount++;\n this._intervalCount++;\n try {\n const operation = (this._timeout === undefined && options.timeout === undefined) ? fn() : p_timeout_1.default(Promise.resolve(fn()), (options.timeout === undefined ? this._timeout : options.timeout), () => {\n if (options.throwOnTimeout === undefined ? this._throwOnTimeout : options.throwOnTimeout) {\n reject(timeoutError);\n }\n return undefined;\n });\n resolve(await operation);\n }\n catch (error) {\n reject(error);\n }\n this._next();\n };\n this._queue.enqueue(run, options);\n this._tryToStartAnother();\n this.emit('add');\n });\n }\n /**\n Same as `.add()`, but accepts an array of sync or async functions.\n\n @returns A promise that resolves when all functions are resolved.\n */\n async addAll(functions, options) {\n return Promise.all(functions.map(async (function_) => this.add(function_, options)));\n }\n /**\n Start (or resume) executing enqueued tasks within concurrency limit. No need to call this if queue is not paused (via `options.autoStart = false` or by `.pause()` method.)\n */\n start() {\n if (!this._isPaused) {\n return this;\n }\n this._isPaused = false;\n this._processQueue();\n return this;\n }\n /**\n Put queue execution on hold.\n */\n pause() {\n this._isPaused = true;\n }\n /**\n Clear the queue.\n */\n clear() {\n this._queue = new this._queueClass();\n }\n /**\n Can be called multiple times. Useful if you for example add additional items at a later time.\n\n @returns A promise that settles when the queue becomes empty.\n */\n async onEmpty() {\n // Instantly resolve if the queue is empty\n if (this._queue.size === 0) {\n return;\n }\n return new Promise(resolve => {\n const existingResolve = this._resolveEmpty;\n this._resolveEmpty = () => {\n existingResolve();\n resolve();\n };\n });\n }\n /**\n The difference with `.onEmpty` is that `.onIdle` guarantees that all work from the queue has finished. `.onEmpty` merely signals that the queue is empty, but it could mean that some promises haven't completed yet.\n\n @returns A promise that settles when the queue becomes empty, and all promises have completed; `queue.size === 0 && queue.pending === 0`.\n */\n async onIdle() {\n // Instantly resolve if none pending and if nothing else is queued\n if (this._pendingCount === 0 && this._queue.size === 0) {\n return;\n }\n return new Promise(resolve => {\n const existingResolve = this._resolveIdle;\n this._resolveIdle = () => {\n existingResolve();\n resolve();\n };\n });\n }\n /**\n Size of the queue.\n */\n get size() {\n return this._queue.size;\n }\n /**\n Size of the queue, filtered by the given options.\n\n For example, this can be used to find the number of items remaining in the queue with a specific priority level.\n */\n sizeBy(options) {\n // eslint-disable-next-line unicorn/no-fn-reference-in-iterator\n return this._queue.filter(options).length;\n }\n /**\n Number of pending promises.\n */\n get pending() {\n return this._pendingCount;\n }\n /**\n Whether the queue is currently paused.\n */\n get isPaused() {\n return this._isPaused;\n }\n get timeout() {\n return this._timeout;\n }\n /**\n Set the timeout for future operations.\n */\n set timeout(milliseconds) {\n this._timeout = milliseconds;\n }\n}\nexports.default = PQueue;\n"],"names":["require$$0","require$$1","require$$2"],"mappings":"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","x_google_ignoreList":[0]}
|
|
1
|
+
{"version":3,"file":"index.es200.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
package/dist/index.es201.js
CHANGED