@assistant-ui/react 0.4.1 → 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 +42 -21
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +49 -28
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
package/dist/index.mjs
CHANGED
@@ -831,21 +831,30 @@ var ActionBarPrimitiveRoot = forwardRef(({ hideWhenRunning, autohide, autohideFl
|
|
831
831
|
ActionBarPrimitiveRoot.displayName = "ActionBarPrimitive.Root";
|
832
832
|
|
833
833
|
// src/utils/createActionButton.tsx
|
834
|
-
import { composeEventHandlers } from "@radix-ui/primitive";
|
835
|
-
import { Primitive as Primitive2 } from "@radix-ui/react-primitive";
|
836
834
|
import { forwardRef as forwardRef2 } from "react";
|
835
|
+
import { Primitive as Primitive2 } from "@radix-ui/react-primitive";
|
836
|
+
import { composeEventHandlers } from "@radix-ui/primitive";
|
837
837
|
import { jsx as jsx5 } from "react/jsx-runtime";
|
838
|
-
var createActionButton = (displayName, useActionButton) => {
|
838
|
+
var createActionButton = (displayName, useActionButton, forwardProps = []) => {
|
839
839
|
const ActionButton = forwardRef2((props, forwardedRef) => {
|
840
|
-
const
|
840
|
+
const forwardedProps = {};
|
841
|
+
const primitiveProps = {};
|
842
|
+
Object.keys(props).forEach((key) => {
|
843
|
+
if (forwardProps.includes(key)) {
|
844
|
+
forwardedProps[key] = props[key];
|
845
|
+
} else {
|
846
|
+
primitiveProps[key] = props[key];
|
847
|
+
}
|
848
|
+
});
|
849
|
+
const callback = useActionButton(forwardedProps);
|
841
850
|
return /* @__PURE__ */ jsx5(
|
842
851
|
Primitive2.button,
|
843
852
|
{
|
844
853
|
type: "button",
|
845
854
|
disabled: !callback,
|
846
|
-
...
|
855
|
+
...primitiveProps,
|
847
856
|
ref: forwardedRef,
|
848
|
-
onClick: composeEventHandlers(
|
857
|
+
onClick: composeEventHandlers(primitiveProps.onClick, () => {
|
849
858
|
callback?.();
|
850
859
|
})
|
851
860
|
}
|
@@ -858,7 +867,8 @@ var createActionButton = (displayName, useActionButton) => {
|
|
858
867
|
// src/primitives/actionBar/ActionBarCopy.tsx
|
859
868
|
var ActionBarPrimitiveCopy = createActionButton(
|
860
869
|
"ActionBarPrimitive.Copy",
|
861
|
-
useActionBarCopy
|
870
|
+
useActionBarCopy,
|
871
|
+
["copiedDuration"]
|
862
872
|
);
|
863
873
|
|
864
874
|
// src/primitives/actionBar/ActionBarReload.tsx
|
@@ -1169,7 +1179,7 @@ import { Primitive as Primitive4 } from "@radix-ui/react-primitive";
|
|
1169
1179
|
import { forwardRef as forwardRef7 } from "react";
|
1170
1180
|
|
1171
1181
|
// src/utils/hooks/useSmooth.tsx
|
1172
|
-
import { useEffect as useEffect8, useState as useState5 } from "react";
|
1182
|
+
import { useEffect as useEffect8, useRef as useRef4, useState as useState5 } from "react";
|
1173
1183
|
var TextStreamAnimator = class {
|
1174
1184
|
constructor(currentText, setText) {
|
1175
1185
|
this.currentText = currentText;
|
@@ -1215,6 +1225,9 @@ var TextStreamAnimator = class {
|
|
1215
1225
|
};
|
1216
1226
|
};
|
1217
1227
|
var useSmooth = (text, smooth = false) => {
|
1228
|
+
const { useMessage } = useMessageContext();
|
1229
|
+
const id = useMessage((m) => m.message.id);
|
1230
|
+
const idRef = useRef4(id);
|
1218
1231
|
const [displayedText, setDisplayedText] = useState5(text);
|
1219
1232
|
const [animatorRef] = useState5(
|
1220
1233
|
new TextStreamAnimator(text, setDisplayedText)
|
@@ -1224,7 +1237,8 @@ var useSmooth = (text, smooth = false) => {
|
|
1224
1237
|
animatorRef.stop();
|
1225
1238
|
return;
|
1226
1239
|
}
|
1227
|
-
if (!text.startsWith(animatorRef.targetText)) {
|
1240
|
+
if (idRef.current !== id || !text.startsWith(animatorRef.targetText)) {
|
1241
|
+
idRef.current = id;
|
1228
1242
|
setDisplayedText(text);
|
1229
1243
|
animatorRef.currentText = text;
|
1230
1244
|
animatorRef.targetText = text;
|
@@ -1233,7 +1247,7 @@ var useSmooth = (text, smooth = false) => {
|
|
1233
1247
|
}
|
1234
1248
|
animatorRef.targetText = text;
|
1235
1249
|
animatorRef.start();
|
1236
|
-
}, [animatorRef, smooth, text]);
|
1250
|
+
}, [animatorRef, id, smooth, text]);
|
1237
1251
|
useEffect8(() => {
|
1238
1252
|
return () => {
|
1239
1253
|
animatorRef.stop();
|
@@ -1421,7 +1435,7 @@ import {
|
|
1421
1435
|
forwardRef as forwardRef11,
|
1422
1436
|
useCallback as useCallback15,
|
1423
1437
|
useEffect as useEffect9,
|
1424
|
-
useRef as
|
1438
|
+
useRef as useRef5
|
1425
1439
|
} from "react";
|
1426
1440
|
import TextareaAutosize from "react-textarea-autosize";
|
1427
1441
|
import { useEscapeKeydown } from "@radix-ui/react-use-escape-keydown";
|
@@ -1435,7 +1449,7 @@ var ComposerPrimitiveInput = forwardRef11(
|
|
1435
1449
|
return c.value;
|
1436
1450
|
});
|
1437
1451
|
const Component = asChild ? Slot : TextareaAutosize;
|
1438
|
-
const textareaRef =
|
1452
|
+
const textareaRef = useRef5(null);
|
1439
1453
|
const ref = useComposedRefs2(forwardedRef, textareaRef);
|
1440
1454
|
useEscapeKeydown((e) => {
|
1441
1455
|
const composer = useComposer.getState();
|
@@ -1581,7 +1595,7 @@ import { forwardRef as forwardRef14 } from "react";
|
|
1581
1595
|
|
1582
1596
|
// src/primitive-hooks/thread/useThreadViewportAutoScroll.tsx
|
1583
1597
|
import { useComposedRefs as useComposedRefs3 } from "@radix-ui/react-compose-refs";
|
1584
|
-
import { useRef as
|
1598
|
+
import { useRef as useRef6 } from "react";
|
1585
1599
|
|
1586
1600
|
// src/utils/hooks/useOnResizeContent.tsx
|
1587
1601
|
import { useCallbackRef as useCallbackRef2 } from "@radix-ui/react-use-callback-ref";
|
@@ -1640,16 +1654,13 @@ var useOnScrollToBottom = (callback) => {
|
|
1640
1654
|
var useThreadViewportAutoScroll = ({
|
1641
1655
|
autoScroll = true
|
1642
1656
|
}) => {
|
1643
|
-
const divRef =
|
1657
|
+
const divRef = useRef6(null);
|
1644
1658
|
const { useViewport } = useThreadContext();
|
1645
|
-
const
|
1646
|
-
const
|
1647
|
-
const
|
1648
|
-
const scrollToBottom = () => {
|
1659
|
+
const lastScrollTop = useRef6(0);
|
1660
|
+
const isScrollingToBottomRef = useRef6(false);
|
1661
|
+
const scrollToBottom = (behavior) => {
|
1649
1662
|
const div = divRef.current;
|
1650
1663
|
if (!div || !autoScroll) return;
|
1651
|
-
const behavior = firstRenderRef.current ? "instant" : "auto";
|
1652
|
-
firstRenderRef.current = false;
|
1653
1664
|
isScrollingToBottomRef.current = true;
|
1654
1665
|
div.scrollTo({ top: div.scrollHeight, behavior });
|
1655
1666
|
};
|
@@ -1660,7 +1671,9 @@ var useThreadViewportAutoScroll = ({
|
|
1660
1671
|
const newIsAtBottom = div.scrollHeight - div.scrollTop <= div.clientHeight;
|
1661
1672
|
if (!newIsAtBottom && lastScrollTop.current < div.scrollTop) {
|
1662
1673
|
} else {
|
1663
|
-
|
1674
|
+
if (newIsAtBottom) {
|
1675
|
+
isScrollingToBottomRef.current = false;
|
1676
|
+
}
|
1664
1677
|
if (newIsAtBottom !== isAtBottom) {
|
1665
1678
|
useViewport.setState({
|
1666
1679
|
isAtBottom: newIsAtBottom
|
@@ -1670,11 +1683,10 @@ var useThreadViewportAutoScroll = ({
|
|
1670
1683
|
lastScrollTop.current = div.scrollTop;
|
1671
1684
|
};
|
1672
1685
|
const resizeRef = useOnResizeContent(() => {
|
1673
|
-
if (
|
1674
|
-
|
1675
|
-
} else {
|
1676
|
-
scrollToBottom();
|
1686
|
+
if (isScrollingToBottomRef.current || useViewport.getState().isAtBottom) {
|
1687
|
+
scrollToBottom("instant");
|
1677
1688
|
}
|
1689
|
+
handleScroll();
|
1678
1690
|
});
|
1679
1691
|
const scrollRef = useManagedRef((el) => {
|
1680
1692
|
el.addEventListener("scroll", handleScroll);
|
@@ -1684,7 +1696,7 @@ var useThreadViewportAutoScroll = ({
|
|
1684
1696
|
});
|
1685
1697
|
const autoScrollRef = useComposedRefs3(resizeRef, scrollRef, divRef);
|
1686
1698
|
useOnScrollToBottom(() => {
|
1687
|
-
scrollToBottom();
|
1699
|
+
scrollToBottom("auto");
|
1688
1700
|
});
|
1689
1701
|
return autoScrollRef;
|
1690
1702
|
};
|
@@ -1885,7 +1897,8 @@ var ThreadPrimitiveScrollToBottom = createActionButton(
|
|
1885
1897
|
// src/primitives/thread/ThreadSuggestion.tsx
|
1886
1898
|
var ThreadPrimitiveSuggestion = createActionButton(
|
1887
1899
|
"ThreadPrimitive.Suggestion",
|
1888
|
-
useThreadSuggestion
|
1900
|
+
useThreadSuggestion,
|
1901
|
+
["prompt", "autoSend", "method"]
|
1889
1902
|
);
|
1890
1903
|
|
1891
1904
|
// src/runtimes/local/useLocalRuntime.tsx
|
@@ -2278,7 +2291,7 @@ function assistantDecoderStream() {
|
|
2278
2291
|
let currentToolCall;
|
2279
2292
|
return new TransformStream({
|
2280
2293
|
transform(chunk, controller) {
|
2281
|
-
const [code, valueJson] = chunk
|
2294
|
+
const [code, valueJson] = parseStreamPart(chunk);
|
2282
2295
|
const value = JSON.parse(valueJson);
|
2283
2296
|
if (currentToolCall && code !== "2" /* ToolCallArgsTextDelta */ && code !== "E" /* Error */) {
|
2284
2297
|
controller.enqueue({
|
@@ -2337,6 +2350,14 @@ function assistantDecoderStream() {
|
|
2337
2350
|
}
|
2338
2351
|
});
|
2339
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
|
+
};
|
2340
2361
|
|
2341
2362
|
// src/runtimes/edge/streams/chunkByLineStream.ts
|
2342
2363
|
function chunkByLineStream() {
|