@assistant-ui/react 0.4.2 → 0.4.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/index.js +23 -13
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +30 -20
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
package/dist/index.mjs
CHANGED
@@ -1179,7 +1179,7 @@ import { Primitive as Primitive4 } from "@radix-ui/react-primitive";
|
|
1179
1179
|
import { forwardRef as forwardRef7 } from "react";
|
1180
1180
|
|
1181
1181
|
// src/utils/hooks/useSmooth.tsx
|
1182
|
-
import { useEffect as useEffect8, useState as useState5 } from "react";
|
1182
|
+
import { useEffect as useEffect8, useRef as useRef4, useState as useState5 } from "react";
|
1183
1183
|
var TextStreamAnimator = class {
|
1184
1184
|
constructor(currentText, setText) {
|
1185
1185
|
this.currentText = currentText;
|
@@ -1225,6 +1225,9 @@ var TextStreamAnimator = class {
|
|
1225
1225
|
};
|
1226
1226
|
};
|
1227
1227
|
var useSmooth = (text, smooth = false) => {
|
1228
|
+
const { useMessage } = useMessageContext();
|
1229
|
+
const id = useMessage((m) => m.message.id);
|
1230
|
+
const idRef = useRef4(id);
|
1228
1231
|
const [displayedText, setDisplayedText] = useState5(text);
|
1229
1232
|
const [animatorRef] = useState5(
|
1230
1233
|
new TextStreamAnimator(text, setDisplayedText)
|
@@ -1234,7 +1237,8 @@ var useSmooth = (text, smooth = false) => {
|
|
1234
1237
|
animatorRef.stop();
|
1235
1238
|
return;
|
1236
1239
|
}
|
1237
|
-
if (!text.startsWith(animatorRef.targetText)) {
|
1240
|
+
if (idRef.current !== id || !text.startsWith(animatorRef.targetText)) {
|
1241
|
+
idRef.current = id;
|
1238
1242
|
setDisplayedText(text);
|
1239
1243
|
animatorRef.currentText = text;
|
1240
1244
|
animatorRef.targetText = text;
|
@@ -1243,7 +1247,7 @@ var useSmooth = (text, smooth = false) => {
|
|
1243
1247
|
}
|
1244
1248
|
animatorRef.targetText = text;
|
1245
1249
|
animatorRef.start();
|
1246
|
-
}, [animatorRef, smooth, text]);
|
1250
|
+
}, [animatorRef, id, smooth, text]);
|
1247
1251
|
useEffect8(() => {
|
1248
1252
|
return () => {
|
1249
1253
|
animatorRef.stop();
|
@@ -1431,7 +1435,7 @@ import {
|
|
1431
1435
|
forwardRef as forwardRef11,
|
1432
1436
|
useCallback as useCallback15,
|
1433
1437
|
useEffect as useEffect9,
|
1434
|
-
useRef as
|
1438
|
+
useRef as useRef5
|
1435
1439
|
} from "react";
|
1436
1440
|
import TextareaAutosize from "react-textarea-autosize";
|
1437
1441
|
import { useEscapeKeydown } from "@radix-ui/react-use-escape-keydown";
|
@@ -1445,7 +1449,7 @@ var ComposerPrimitiveInput = forwardRef11(
|
|
1445
1449
|
return c.value;
|
1446
1450
|
});
|
1447
1451
|
const Component = asChild ? Slot : TextareaAutosize;
|
1448
|
-
const textareaRef =
|
1452
|
+
const textareaRef = useRef5(null);
|
1449
1453
|
const ref = useComposedRefs2(forwardedRef, textareaRef);
|
1450
1454
|
useEscapeKeydown((e) => {
|
1451
1455
|
const composer = useComposer.getState();
|
@@ -1591,7 +1595,7 @@ import { forwardRef as forwardRef14 } from "react";
|
|
1591
1595
|
|
1592
1596
|
// src/primitive-hooks/thread/useThreadViewportAutoScroll.tsx
|
1593
1597
|
import { useComposedRefs as useComposedRefs3 } from "@radix-ui/react-compose-refs";
|
1594
|
-
import { useRef as
|
1598
|
+
import { useRef as useRef6 } from "react";
|
1595
1599
|
|
1596
1600
|
// src/utils/hooks/useOnResizeContent.tsx
|
1597
1601
|
import { useCallbackRef as useCallbackRef2 } from "@radix-ui/react-use-callback-ref";
|
@@ -1650,16 +1654,13 @@ var useOnScrollToBottom = (callback) => {
|
|
1650
1654
|
var useThreadViewportAutoScroll = ({
|
1651
1655
|
autoScroll = true
|
1652
1656
|
}) => {
|
1653
|
-
const divRef =
|
1657
|
+
const divRef = useRef6(null);
|
1654
1658
|
const { useViewport } = useThreadContext();
|
1655
|
-
const
|
1656
|
-
const
|
1657
|
-
const
|
1658
|
-
const scrollToBottom = () => {
|
1659
|
+
const lastScrollTop = useRef6(0);
|
1660
|
+
const isScrollingToBottomRef = useRef6(false);
|
1661
|
+
const scrollToBottom = (behavior) => {
|
1659
1662
|
const div = divRef.current;
|
1660
1663
|
if (!div || !autoScroll) return;
|
1661
|
-
const behavior = firstRenderRef.current ? "instant" : "auto";
|
1662
|
-
firstRenderRef.current = false;
|
1663
1664
|
isScrollingToBottomRef.current = true;
|
1664
1665
|
div.scrollTo({ top: div.scrollHeight, behavior });
|
1665
1666
|
};
|
@@ -1670,7 +1671,9 @@ var useThreadViewportAutoScroll = ({
|
|
1670
1671
|
const newIsAtBottom = div.scrollHeight - div.scrollTop <= div.clientHeight;
|
1671
1672
|
if (!newIsAtBottom && lastScrollTop.current < div.scrollTop) {
|
1672
1673
|
} else {
|
1673
|
-
|
1674
|
+
if (newIsAtBottom) {
|
1675
|
+
isScrollingToBottomRef.current = false;
|
1676
|
+
}
|
1674
1677
|
if (newIsAtBottom !== isAtBottom) {
|
1675
1678
|
useViewport.setState({
|
1676
1679
|
isAtBottom: newIsAtBottom
|
@@ -1680,11 +1683,10 @@ var useThreadViewportAutoScroll = ({
|
|
1680
1683
|
lastScrollTop.current = div.scrollTop;
|
1681
1684
|
};
|
1682
1685
|
const resizeRef = useOnResizeContent(() => {
|
1683
|
-
if (
|
1684
|
-
|
1685
|
-
} else {
|
1686
|
-
scrollToBottom();
|
1686
|
+
if (isScrollingToBottomRef.current || useViewport.getState().isAtBottom) {
|
1687
|
+
scrollToBottom("instant");
|
1687
1688
|
}
|
1689
|
+
handleScroll();
|
1688
1690
|
});
|
1689
1691
|
const scrollRef = useManagedRef((el) => {
|
1690
1692
|
el.addEventListener("scroll", handleScroll);
|
@@ -1694,7 +1696,7 @@ var useThreadViewportAutoScroll = ({
|
|
1694
1696
|
});
|
1695
1697
|
const autoScrollRef = useComposedRefs3(resizeRef, scrollRef, divRef);
|
1696
1698
|
useOnScrollToBottom(() => {
|
1697
|
-
scrollToBottom();
|
1699
|
+
scrollToBottom("auto");
|
1698
1700
|
});
|
1699
1701
|
return autoScrollRef;
|
1700
1702
|
};
|
@@ -2289,7 +2291,7 @@ function assistantDecoderStream() {
|
|
2289
2291
|
let currentToolCall;
|
2290
2292
|
return new TransformStream({
|
2291
2293
|
transform(chunk, controller) {
|
2292
|
-
const [code, valueJson] = chunk
|
2294
|
+
const [code, valueJson] = parseStreamPart(chunk);
|
2293
2295
|
const value = JSON.parse(valueJson);
|
2294
2296
|
if (currentToolCall && code !== "2" /* ToolCallArgsTextDelta */ && code !== "E" /* Error */) {
|
2295
2297
|
controller.enqueue({
|
@@ -2348,6 +2350,14 @@ function assistantDecoderStream() {
|
|
2348
2350
|
}
|
2349
2351
|
});
|
2350
2352
|
}
|
2353
|
+
var parseStreamPart = (part) => {
|
2354
|
+
const index = part.indexOf(":");
|
2355
|
+
if (index === -1) throw new Error("Invalid stream part");
|
2356
|
+
return [
|
2357
|
+
part.slice(0, index),
|
2358
|
+
part.slice(index + 1)
|
2359
|
+
];
|
2360
|
+
};
|
2351
2361
|
|
2352
2362
|
// src/runtimes/edge/streams/chunkByLineStream.ts
|
2353
2363
|
function chunkByLineStream() {
|