@assistant-ui/react 0.11.39 → 0.11.43

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.
Files changed (161) hide show
  1. package/dist/client/AssistantClient.d.ts.map +1 -1
  2. package/dist/client/AssistantClient.js.map +1 -1
  3. package/dist/client/ModelContext.d.ts +1 -1
  4. package/dist/client/ModelContext.d.ts.map +1 -1
  5. package/dist/client/ModelContext.js.map +1 -1
  6. package/dist/client/ModelContextClient.d.ts +1 -1
  7. package/dist/client/ThreadMessageClient.d.ts +1 -0
  8. package/dist/client/ThreadMessageClient.d.ts.map +1 -1
  9. package/dist/client/ThreadMessageClient.js +3 -1
  10. package/dist/client/ThreadMessageClient.js.map +1 -1
  11. package/dist/client/types/Message.d.ts +2 -0
  12. package/dist/client/types/Message.d.ts.map +1 -1
  13. package/dist/client/types/ModelContext.d.ts +1 -1
  14. package/dist/client/types/ModelContext.d.ts.map +1 -1
  15. package/dist/client/types/Tools.d.ts +1 -2
  16. package/dist/client/types/Tools.d.ts.map +1 -1
  17. package/dist/context/providers/ThreadViewportProvider.d.ts +5 -1
  18. package/dist/context/providers/ThreadViewportProvider.d.ts.map +1 -1
  19. package/dist/context/providers/ThreadViewportProvider.js +17 -6
  20. package/dist/context/providers/ThreadViewportProvider.js.map +1 -1
  21. package/dist/context/react/AssistantApiContext.d.ts +1 -1
  22. package/dist/context/react/AssistantApiContext.d.ts.map +1 -1
  23. package/dist/context/react/AssistantApiContext.js +1 -2
  24. package/dist/context/react/AssistantApiContext.js.map +1 -1
  25. package/dist/context/stores/ThreadViewport.d.ts +33 -3
  26. package/dist/context/stores/ThreadViewport.d.ts.map +1 -1
  27. package/dist/context/stores/ThreadViewport.js +67 -5
  28. package/dist/context/stores/ThreadViewport.js.map +1 -1
  29. package/dist/devtools/DevToolsHooks.d.ts +1 -1
  30. package/dist/devtools/DevToolsHooks.d.ts.map +1 -1
  31. package/dist/devtools/DevToolsHooks.js.map +1 -1
  32. package/dist/legacy-runtime/AssistantRuntimeProvider.d.ts.map +1 -1
  33. package/dist/legacy-runtime/AssistantRuntimeProvider.js +2 -1
  34. package/dist/legacy-runtime/AssistantRuntimeProvider.js.map +1 -1
  35. package/dist/legacy-runtime/client/ComposerRuntimeClient.d.ts +3 -3
  36. package/dist/legacy-runtime/client/ComposerRuntimeClient.d.ts.map +1 -1
  37. package/dist/legacy-runtime/client/ComposerRuntimeClient.js.map +1 -1
  38. package/dist/legacy-runtime/client/EventManagerRuntimeClient.d.ts +1 -1
  39. package/dist/legacy-runtime/client/ThreadRuntimeClient.js.map +1 -1
  40. package/dist/legacy-runtime/runtime/MessageRuntime.d.ts +3 -0
  41. package/dist/legacy-runtime/runtime/MessageRuntime.d.ts.map +1 -1
  42. package/dist/legacy-runtime/runtime/MessageRuntime.js.map +1 -1
  43. package/dist/legacy-runtime/runtime/RuntimeBindings.d.ts +2 -0
  44. package/dist/legacy-runtime/runtime/RuntimeBindings.d.ts.map +1 -1
  45. package/dist/legacy-runtime/runtime/ThreadRuntime.d.ts +1 -0
  46. package/dist/legacy-runtime/runtime/ThreadRuntime.d.ts.map +1 -1
  47. package/dist/legacy-runtime/runtime/ThreadRuntime.js +6 -3
  48. package/dist/legacy-runtime/runtime/ThreadRuntime.js.map +1 -1
  49. package/dist/legacy-runtime/runtime-cores/assistant-transport/runManager.d.ts +1 -1
  50. package/dist/legacy-runtime/runtime-cores/assistant-transport/runManager.d.ts.map +1 -1
  51. package/dist/legacy-runtime/runtime-cores/assistant-transport/runManager.js +1 -1
  52. package/dist/legacy-runtime/runtime-cores/assistant-transport/runManager.js.map +1 -1
  53. package/dist/legacy-runtime/runtime-cores/assistant-transport/types.d.ts +8 -1
  54. package/dist/legacy-runtime/runtime-cores/assistant-transport/types.d.ts.map +1 -1
  55. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.d.ts.map +1 -1
  56. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.js +23 -11
  57. package/dist/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.js.map +1 -1
  58. package/dist/legacy-runtime/runtime-cores/assistant-transport/useToolInvocations.js +5 -5
  59. package/dist/legacy-runtime/runtime-cores/assistant-transport/useToolInvocations.js.map +1 -1
  60. package/dist/legacy-runtime/runtime-cores/core/BaseThreadRuntimeCore.d.ts +1 -0
  61. package/dist/legacy-runtime/runtime-cores/core/BaseThreadRuntimeCore.d.ts.map +1 -1
  62. package/dist/legacy-runtime/runtime-cores/core/ThreadRuntimeCore.d.ts +1 -0
  63. package/dist/legacy-runtime/runtime-cores/core/ThreadRuntimeCore.d.ts.map +1 -1
  64. package/dist/legacy-runtime/runtime-cores/remote-thread-list/RemoteThreadListHookInstanceManager.d.ts +2 -0
  65. package/dist/legacy-runtime/runtime-cores/remote-thread-list/RemoteThreadListHookInstanceManager.d.ts.map +1 -1
  66. package/dist/legacy-runtime/runtime-cores/remote-thread-list/RemoteThreadListThreadListRuntimeCore.d.ts +2 -0
  67. package/dist/legacy-runtime/runtime-cores/remote-thread-list/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  68. package/dist/legacy-runtime/runtime-cores/utils/MessageRepository.d.ts +1 -0
  69. package/dist/legacy-runtime/runtime-cores/utils/MessageRepository.d.ts.map +1 -1
  70. package/dist/legacy-runtime/runtime-cores/utils/MessageRepository.js +2 -1
  71. package/dist/legacy-runtime/runtime-cores/utils/MessageRepository.js.map +1 -1
  72. package/dist/primitives/composer/ComposerAttachmentDropzone.d.ts +2 -2
  73. package/dist/primitives/composer/ComposerAttachmentDropzone.d.ts.map +1 -1
  74. package/dist/primitives/composer/ComposerAttachmentDropzone.js +31 -11
  75. package/dist/primitives/composer/ComposerAttachmentDropzone.js.map +1 -1
  76. package/dist/primitives/composer/index.d.ts +1 -0
  77. package/dist/primitives/composer/index.d.ts.map +1 -1
  78. package/dist/primitives/composer/index.js +2 -0
  79. package/dist/primitives/composer/index.js.map +1 -1
  80. package/dist/primitives/message/MessageRoot.d.ts +3 -0
  81. package/dist/primitives/message/MessageRoot.d.ts.map +1 -1
  82. package/dist/primitives/message/MessageRoot.js +24 -2
  83. package/dist/primitives/message/MessageRoot.js.map +1 -1
  84. package/dist/primitives/messagePart/useMessagePartData.d.ts.map +1 -1
  85. package/dist/primitives/messagePart/useMessagePartData.js.map +1 -1
  86. package/dist/primitives/thread/ThreadScrollToBottom.d.ts +7 -2
  87. package/dist/primitives/thread/ThreadScrollToBottom.d.ts.map +1 -1
  88. package/dist/primitives/thread/ThreadScrollToBottom.js +7 -4
  89. package/dist/primitives/thread/ThreadScrollToBottom.js.map +1 -1
  90. package/dist/primitives/thread/ThreadViewport.d.ts +17 -3
  91. package/dist/primitives/thread/ThreadViewport.d.ts.map +1 -1
  92. package/dist/primitives/thread/ThreadViewport.js +19 -5
  93. package/dist/primitives/thread/ThreadViewport.js.map +1 -1
  94. package/dist/primitives/thread/ThreadViewportFooter.d.ts +31 -0
  95. package/dist/primitives/thread/ThreadViewportFooter.d.ts.map +1 -0
  96. package/dist/primitives/thread/ThreadViewportFooter.js +27 -0
  97. package/dist/primitives/thread/ThreadViewportFooter.js.map +1 -0
  98. package/dist/primitives/thread/ThreadViewportSlack.d.ts +20 -0
  99. package/dist/primitives/thread/ThreadViewportSlack.d.ts.map +1 -0
  100. package/dist/primitives/thread/ThreadViewportSlack.js +77 -0
  101. package/dist/primitives/thread/ThreadViewportSlack.js.map +1 -0
  102. package/dist/primitives/thread/index.d.ts +3 -0
  103. package/dist/primitives/thread/index.d.ts.map +1 -1
  104. package/dist/primitives/thread/index.js +7 -1
  105. package/dist/primitives/thread/index.js.map +1 -1
  106. package/dist/primitives/thread/useThreadViewportAutoScroll.d.ts +6 -0
  107. package/dist/primitives/thread/useThreadViewportAutoScroll.d.ts.map +1 -1
  108. package/dist/primitives/thread/useThreadViewportAutoScroll.js +17 -8
  109. package/dist/primitives/thread/useThreadViewportAutoScroll.js.map +1 -1
  110. package/dist/tests/setup.js +14 -14
  111. package/dist/tests/setup.js.map +1 -1
  112. package/dist/utils/hooks/useOnScrollToBottom.d.ts +3 -1
  113. package/dist/utils/hooks/useOnScrollToBottom.d.ts.map +1 -1
  114. package/dist/utils/hooks/useOnScrollToBottom.js.map +1 -1
  115. package/dist/utils/hooks/useSizeHandle.d.ts +11 -0
  116. package/dist/utils/hooks/useSizeHandle.d.ts.map +1 -0
  117. package/dist/utils/hooks/useSizeHandle.js +30 -0
  118. package/dist/utils/hooks/useSizeHandle.js.map +1 -0
  119. package/dist/utils/tap-store/derived-scopes.d.ts +2 -1
  120. package/dist/utils/tap-store/derived-scopes.d.ts.map +1 -1
  121. package/dist/utils/tap-store/derived-scopes.js.map +1 -1
  122. package/dist/utils/tap-store/store.d.ts +2 -1
  123. package/dist/utils/tap-store/store.d.ts.map +1 -1
  124. package/dist/utils/tap-store/store.js.map +1 -1
  125. package/package.json +6 -6
  126. package/src/client/AssistantClient.ts +1 -1
  127. package/src/client/ModelContext.ts +1 -1
  128. package/src/client/ThreadMessageClient.tsx +4 -1
  129. package/src/client/types/Message.ts +3 -0
  130. package/src/client/types/ModelContext.ts +1 -1
  131. package/src/client/types/Tools.ts +1 -2
  132. package/src/context/providers/ThreadViewportProvider.tsx +27 -5
  133. package/src/context/react/AssistantApiContext.tsx +2 -5
  134. package/src/context/stores/ThreadViewport.tsx +125 -7
  135. package/src/devtools/DevToolsHooks.ts +1 -1
  136. package/src/legacy-runtime/AssistantRuntimeProvider.tsx +6 -1
  137. package/src/legacy-runtime/client/ComposerRuntimeClient.ts +3 -3
  138. package/src/legacy-runtime/client/ThreadRuntimeClient.ts +2 -2
  139. package/src/legacy-runtime/runtime/MessageRuntime.ts +2 -0
  140. package/src/legacy-runtime/runtime/RuntimeBindings.ts +2 -0
  141. package/src/legacy-runtime/runtime/ThreadRuntime.ts +6 -3
  142. package/src/legacy-runtime/runtime-cores/assistant-transport/runManager.ts +2 -2
  143. package/src/legacy-runtime/runtime-cores/assistant-transport/types.ts +8 -1
  144. package/src/legacy-runtime/runtime-cores/assistant-transport/useAssistantTransportRuntime.tsx +26 -11
  145. package/src/legacy-runtime/runtime-cores/assistant-transport/useToolInvocations.ts +5 -5
  146. package/src/legacy-runtime/runtime-cores/core/ThreadRuntimeCore.tsx +1 -0
  147. package/src/legacy-runtime/runtime-cores/utils/MessageRepository.tsx +1 -0
  148. package/src/primitives/composer/ComposerAttachmentDropzone.tsx +35 -12
  149. package/src/primitives/composer/index.ts +1 -0
  150. package/src/primitives/message/MessageRoot.tsx +45 -2
  151. package/src/primitives/messagePart/useMessagePartData.tsx +0 -1
  152. package/src/primitives/thread/ThreadScrollToBottom.tsx +12 -3
  153. package/src/primitives/thread/ThreadViewport.tsx +35 -9
  154. package/src/primitives/thread/ThreadViewportFooter.tsx +57 -0
  155. package/src/primitives/thread/ThreadViewportSlack.tsx +109 -0
  156. package/src/primitives/thread/index.ts +3 -0
  157. package/src/primitives/thread/useThreadViewportAutoScroll.tsx +24 -12
  158. package/src/utils/hooks/useOnScrollToBottom.tsx +3 -1
  159. package/src/utils/hooks/useSizeHandle.ts +43 -0
  160. package/src/utils/tap-store/derived-scopes.ts +2 -1
  161. package/src/utils/tap-store/store.ts +1 -1
@@ -10,16 +10,19 @@ import { useManagedRef } from "../../utils/hooks/useManagedRef.js";
10
10
  import { writableStore } from "../../context/ReadonlyStore.js";
11
11
  import { useThreadViewportStore } from "../../context/react/ThreadViewportContext.js";
12
12
  var useThreadViewportAutoScroll = ({
13
- autoScroll = true
13
+ autoScroll
14
14
  }) => {
15
15
  const divRef = useRef(null);
16
16
  const threadViewportStore = useThreadViewportStore();
17
+ if (autoScroll === void 0) {
18
+ autoScroll = threadViewportStore.getState().turnAnchor !== "top";
19
+ }
17
20
  const lastScrollTop = useRef(0);
18
- const isScrollingToBottomRef = useRef(false);
21
+ const scrollingToBottomBehaviorRef = useRef(null);
19
22
  const scrollToBottom = useCallback((behavior) => {
20
23
  const div = divRef.current;
21
24
  if (!div) return;
22
- isScrollingToBottomRef.current = true;
25
+ scrollingToBottomBehaviorRef.current = behavior;
23
26
  div.scrollTo({ top: div.scrollHeight, behavior });
24
27
  }, []);
25
28
  const handleScroll = () => {
@@ -30,7 +33,7 @@ var useThreadViewportAutoScroll = ({
30
33
  if (!newIsAtBottom && lastScrollTop.current < div.scrollTop) {
31
34
  } else {
32
35
  if (newIsAtBottom) {
33
- isScrollingToBottomRef.current = false;
36
+ scrollingToBottomBehaviorRef.current = null;
34
37
  }
35
38
  if (newIsAtBottom !== isAtBottom) {
36
39
  writableStore(threadViewportStore).setState({
@@ -41,7 +44,10 @@ var useThreadViewportAutoScroll = ({
41
44
  lastScrollTop.current = div.scrollTop;
42
45
  };
43
46
  const resizeRef = useOnResizeContent(() => {
44
- if (autoScroll && (isScrollingToBottomRef.current || threadViewportStore.getState().isAtBottom)) {
47
+ const scrollBehavior = scrollingToBottomBehaviorRef.current;
48
+ if (scrollBehavior) {
49
+ scrollToBottom(scrollBehavior);
50
+ } else if (autoScroll && threadViewportStore.getState().isAtBottom) {
45
51
  scrollToBottom("instant");
46
52
  }
47
53
  handleScroll();
@@ -52,11 +58,14 @@ var useThreadViewportAutoScroll = ({
52
58
  el.removeEventListener("scroll", handleScroll);
53
59
  };
54
60
  });
55
- useOnScrollToBottom(() => {
56
- scrollToBottom("auto");
61
+ useOnScrollToBottom(({ behavior }) => {
62
+ scrollToBottom(behavior);
57
63
  });
58
64
  useAssistantEvent("thread.run-start", () => {
59
- if (autoScroll) scrollToBottom("auto");
65
+ scrollingToBottomBehaviorRef.current = "auto";
66
+ requestAnimationFrame(() => {
67
+ scrollToBottom("auto");
68
+ });
60
69
  });
61
70
  const autoScrollRef = useComposedRefs(resizeRef, scrollRef, divRef);
62
71
  return autoScrollRef;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/primitives/thread/useThreadViewportAutoScroll.tsx"],"sourcesContent":["\"use client\";\n\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { RefCallback, useCallback, useRef } from \"react\";\nimport { useAssistantEvent } from \"../../context\";\nimport { useOnResizeContent } from \"../../utils/hooks/useOnResizeContent\";\nimport { useOnScrollToBottom } from \"../../utils/hooks/useOnScrollToBottom\";\nimport { useManagedRef } from \"../../utils/hooks/useManagedRef\";\nimport { writableStore } from \"../../context/ReadonlyStore\";\nimport { useThreadViewportStore } from \"../../context/react/ThreadViewportContext\";\n\nexport namespace useThreadViewportAutoScroll {\n export type Options = {\n autoScroll?: boolean | undefined;\n };\n}\n\nexport const useThreadViewportAutoScroll = <TElement extends HTMLElement>({\n autoScroll = true,\n}: useThreadViewportAutoScroll.Options): RefCallback<TElement> => {\n const divRef = useRef<TElement>(null);\n\n const threadViewportStore = useThreadViewportStore();\n\n const lastScrollTop = useRef<number>(0);\n\n // bug: when ScrollToBottom's button changes its disabled state, the scroll stops\n // fix: delay the state change until the scroll is done\n const isScrollingToBottomRef = useRef(false);\n\n const scrollToBottom = useCallback((behavior: ScrollBehavior) => {\n const div = divRef.current;\n if (!div) return;\n\n isScrollingToBottomRef.current = true;\n div.scrollTo({ top: div.scrollHeight, behavior });\n }, []);\n\n const handleScroll = () => {\n const div = divRef.current;\n if (!div) return;\n\n const isAtBottom = threadViewportStore.getState().isAtBottom;\n const newIsAtBottom =\n Math.abs(div.scrollHeight - div.scrollTop - div.clientHeight) < 1 ||\n div.scrollHeight <= div.clientHeight;\n\n if (!newIsAtBottom && lastScrollTop.current < div.scrollTop) {\n // ignore scroll down\n } else {\n if (newIsAtBottom) {\n isScrollingToBottomRef.current = false;\n }\n\n if (newIsAtBottom !== isAtBottom) {\n writableStore(threadViewportStore).setState({\n isAtBottom: newIsAtBottom,\n });\n }\n }\n\n lastScrollTop.current = div.scrollTop;\n };\n\n const resizeRef = useOnResizeContent(() => {\n if (\n autoScroll &&\n (isScrollingToBottomRef.current ||\n threadViewportStore.getState().isAtBottom)\n ) {\n scrollToBottom(\"instant\");\n }\n\n handleScroll();\n });\n\n const scrollRef = useManagedRef<HTMLElement>((el) => {\n el.addEventListener(\"scroll\", handleScroll);\n return () => {\n el.removeEventListener(\"scroll\", handleScroll);\n };\n });\n\n useOnScrollToBottom(() => {\n scrollToBottom(\"auto\");\n });\n\n // autoscroll on run start\n useAssistantEvent(\"thread.run-start\", () => {\n if (autoScroll) scrollToBottom(\"auto\");\n });\n\n const autoScrollRef = useComposedRefs<TElement>(resizeRef, scrollRef, divRef);\n return autoScrollRef as RefCallback<TElement>;\n};\n"],"mappings":";;;AAEA,SAAS,uBAAuB;AAChC,SAAsB,aAAa,cAAc;AACjD,SAAS,yBAAyB;AAClC,SAAS,0BAA0B;AACnC,SAAS,2BAA2B;AACpC,SAAS,qBAAqB;AAC9B,SAAS,qBAAqB;AAC9B,SAAS,8BAA8B;AAQhC,IAAM,8BAA8B,CAA+B;AAAA,EACxE,aAAa;AACf,MAAkE;AAChE,QAAM,SAAS,OAAiB,IAAI;AAEpC,QAAM,sBAAsB,uBAAuB;AAEnD,QAAM,gBAAgB,OAAe,CAAC;AAItC,QAAM,yBAAyB,OAAO,KAAK;AAE3C,QAAM,iBAAiB,YAAY,CAAC,aAA6B;AAC/D,UAAM,MAAM,OAAO;AACnB,QAAI,CAAC,IAAK;AAEV,2BAAuB,UAAU;AACjC,QAAI,SAAS,EAAE,KAAK,IAAI,cAAc,SAAS,CAAC;AAAA,EAClD,GAAG,CAAC,CAAC;AAEL,QAAM,eAAe,MAAM;AACzB,UAAM,MAAM,OAAO;AACnB,QAAI,CAAC,IAAK;AAEV,UAAM,aAAa,oBAAoB,SAAS,EAAE;AAClD,UAAM,gBACJ,KAAK,IAAI,IAAI,eAAe,IAAI,YAAY,IAAI,YAAY,IAAI,KAChE,IAAI,gBAAgB,IAAI;AAE1B,QAAI,CAAC,iBAAiB,cAAc,UAAU,IAAI,WAAW;AAAA,IAE7D,OAAO;AACL,UAAI,eAAe;AACjB,+BAAuB,UAAU;AAAA,MACnC;AAEA,UAAI,kBAAkB,YAAY;AAChC,sBAAc,mBAAmB,EAAE,SAAS;AAAA,UAC1C,YAAY;AAAA,QACd,CAAC;AAAA,MACH;AAAA,IACF;AAEA,kBAAc,UAAU,IAAI;AAAA,EAC9B;AAEA,QAAM,YAAY,mBAAmB,MAAM;AACzC,QACE,eACC,uBAAuB,WACtB,oBAAoB,SAAS,EAAE,aACjC;AACA,qBAAe,SAAS;AAAA,IAC1B;AAEA,iBAAa;AAAA,EACf,CAAC;AAED,QAAM,YAAY,cAA2B,CAAC,OAAO;AACnD,OAAG,iBAAiB,UAAU,YAAY;AAC1C,WAAO,MAAM;AACX,SAAG,oBAAoB,UAAU,YAAY;AAAA,IAC/C;AAAA,EACF,CAAC;AAED,sBAAoB,MAAM;AACxB,mBAAe,MAAM;AAAA,EACvB,CAAC;AAGD,oBAAkB,oBAAoB,MAAM;AAC1C,QAAI,WAAY,gBAAe,MAAM;AAAA,EACvC,CAAC;AAED,QAAM,gBAAgB,gBAA0B,WAAW,WAAW,MAAM;AAC5E,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../../src/primitives/thread/useThreadViewportAutoScroll.tsx"],"sourcesContent":["\"use client\";\n\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { RefCallback, useCallback, useRef } from \"react\";\nimport { useAssistantEvent } from \"../../context\";\nimport { useOnResizeContent } from \"../../utils/hooks/useOnResizeContent\";\nimport { useOnScrollToBottom } from \"../../utils/hooks/useOnScrollToBottom\";\nimport { useManagedRef } from \"../../utils/hooks/useManagedRef\";\nimport { writableStore } from \"../../context/ReadonlyStore\";\nimport { useThreadViewportStore } from \"../../context/react/ThreadViewportContext\";\n\nexport namespace useThreadViewportAutoScroll {\n export type Options = {\n /**\n * Whether to automatically scroll to the bottom when new messages are added.\n * When enabled, the viewport will automatically scroll to show the latest content.\n *\n * Default false if `turnAnchor` is \"top\", otherwise defaults to true.\n */\n autoScroll?: boolean | undefined;\n };\n}\n\nexport const useThreadViewportAutoScroll = <TElement extends HTMLElement>({\n autoScroll,\n}: useThreadViewportAutoScroll.Options): RefCallback<TElement> => {\n const divRef = useRef<TElement>(null);\n\n const threadViewportStore = useThreadViewportStore();\n if (autoScroll === undefined) {\n autoScroll = threadViewportStore.getState().turnAnchor !== \"top\";\n }\n\n const lastScrollTop = useRef<number>(0);\n\n // bug: when ScrollToBottom's button changes its disabled state, the scroll stops\n // fix: delay the state change until the scroll is done\n // stores the scroll behavior to reuse during content resize, or null if not scrolling\n const scrollingToBottomBehaviorRef = useRef<ScrollBehavior | null>(null);\n\n const scrollToBottom = useCallback((behavior: ScrollBehavior) => {\n const div = divRef.current;\n if (!div) return;\n\n scrollingToBottomBehaviorRef.current = behavior;\n div.scrollTo({ top: div.scrollHeight, behavior });\n }, []);\n\n const handleScroll = () => {\n const div = divRef.current;\n if (!div) return;\n\n const isAtBottom = threadViewportStore.getState().isAtBottom;\n const newIsAtBottom =\n Math.abs(div.scrollHeight - div.scrollTop - div.clientHeight) < 1 ||\n div.scrollHeight <= div.clientHeight;\n\n if (!newIsAtBottom && lastScrollTop.current < div.scrollTop) {\n // ignore scroll down\n } else {\n if (newIsAtBottom) {\n scrollingToBottomBehaviorRef.current = null;\n }\n\n if (newIsAtBottom !== isAtBottom) {\n writableStore(threadViewportStore).setState({\n isAtBottom: newIsAtBottom,\n });\n }\n }\n\n lastScrollTop.current = div.scrollTop;\n };\n\n const resizeRef = useOnResizeContent(() => {\n const scrollBehavior = scrollingToBottomBehaviorRef.current;\n if (scrollBehavior) {\n scrollToBottom(scrollBehavior);\n } else if (autoScroll && threadViewportStore.getState().isAtBottom) {\n scrollToBottom(\"instant\");\n }\n\n handleScroll();\n });\n\n const scrollRef = useManagedRef<HTMLElement>((el) => {\n el.addEventListener(\"scroll\", handleScroll);\n return () => {\n el.removeEventListener(\"scroll\", handleScroll);\n };\n });\n\n useOnScrollToBottom(({ behavior }) => {\n scrollToBottom(behavior);\n });\n\n // autoscroll on run start\n useAssistantEvent(\"thread.run-start\", () => {\n scrollingToBottomBehaviorRef.current = \"auto\";\n requestAnimationFrame(() => {\n scrollToBottom(\"auto\");\n });\n });\n\n const autoScrollRef = useComposedRefs<TElement>(resizeRef, scrollRef, divRef);\n return autoScrollRef as RefCallback<TElement>;\n};\n"],"mappings":";;;AAEA,SAAS,uBAAuB;AAChC,SAAsB,aAAa,cAAc;AACjD,SAAS,yBAAyB;AAClC,SAAS,0BAA0B;AACnC,SAAS,2BAA2B;AACpC,SAAS,qBAAqB;AAC9B,SAAS,qBAAqB;AAC9B,SAAS,8BAA8B;AAchC,IAAM,8BAA8B,CAA+B;AAAA,EACxE;AACF,MAAkE;AAChE,QAAM,SAAS,OAAiB,IAAI;AAEpC,QAAM,sBAAsB,uBAAuB;AACnD,MAAI,eAAe,QAAW;AAC5B,iBAAa,oBAAoB,SAAS,EAAE,eAAe;AAAA,EAC7D;AAEA,QAAM,gBAAgB,OAAe,CAAC;AAKtC,QAAM,+BAA+B,OAA8B,IAAI;AAEvE,QAAM,iBAAiB,YAAY,CAAC,aAA6B;AAC/D,UAAM,MAAM,OAAO;AACnB,QAAI,CAAC,IAAK;AAEV,iCAA6B,UAAU;AACvC,QAAI,SAAS,EAAE,KAAK,IAAI,cAAc,SAAS,CAAC;AAAA,EAClD,GAAG,CAAC,CAAC;AAEL,QAAM,eAAe,MAAM;AACzB,UAAM,MAAM,OAAO;AACnB,QAAI,CAAC,IAAK;AAEV,UAAM,aAAa,oBAAoB,SAAS,EAAE;AAClD,UAAM,gBACJ,KAAK,IAAI,IAAI,eAAe,IAAI,YAAY,IAAI,YAAY,IAAI,KAChE,IAAI,gBAAgB,IAAI;AAE1B,QAAI,CAAC,iBAAiB,cAAc,UAAU,IAAI,WAAW;AAAA,IAE7D,OAAO;AACL,UAAI,eAAe;AACjB,qCAA6B,UAAU;AAAA,MACzC;AAEA,UAAI,kBAAkB,YAAY;AAChC,sBAAc,mBAAmB,EAAE,SAAS;AAAA,UAC1C,YAAY;AAAA,QACd,CAAC;AAAA,MACH;AAAA,IACF;AAEA,kBAAc,UAAU,IAAI;AAAA,EAC9B;AAEA,QAAM,YAAY,mBAAmB,MAAM;AACzC,UAAM,iBAAiB,6BAA6B;AACpD,QAAI,gBAAgB;AAClB,qBAAe,cAAc;AAAA,IAC/B,WAAW,cAAc,oBAAoB,SAAS,EAAE,YAAY;AAClE,qBAAe,SAAS;AAAA,IAC1B;AAEA,iBAAa;AAAA,EACf,CAAC;AAED,QAAM,YAAY,cAA2B,CAAC,OAAO;AACnD,OAAG,iBAAiB,UAAU,YAAY;AAC1C,WAAO,MAAM;AACX,SAAG,oBAAoB,UAAU,YAAY;AAAA,IAC/C;AAAA,EACF,CAAC;AAED,sBAAoB,CAAC,EAAE,SAAS,MAAM;AACpC,mBAAe,QAAQ;AAAA,EACzB,CAAC;AAGD,oBAAkB,oBAAoB,MAAM;AAC1C,iCAA6B,UAAU;AACvC,0BAAsB,MAAM;AAC1B,qBAAe,MAAM;AAAA,IACvB,CAAC;AAAA,EACH,CAAC;AAED,QAAM,gBAAgB,gBAA0B,WAAW,WAAW,MAAM;AAC5E,SAAO;AACT;","names":[]}
@@ -1,9 +1,9 @@
1
- // ../../node_modules/.pnpm/vitest@4.0.8_@types+debug@4.1.12_@types+node@24.10.1_@vitest+ui@4.0.8_jiti@2.6.1_jsdom@_c97fdea49f1663602bf3dfb16acdd85d/node_modules/vitest/dist/chunks/vi.Bgcdy3bQ.js
1
+ // ../../node_modules/.pnpm/vitest@4.0.10_@types+debug@4.1.12_@types+node@24.10.1_@vitest+ui@4.0.10_jiti@2.6.1_jsdo_8129e2874895056f7089688a9cfd0bc1/node_modules/vitest/dist/chunks/vi.BiaV1qII.js
2
2
  import { chai, equals, iterableEquality, subsetEquality, JestExtend, JestChaiExpect, JestAsymmetricMatchers, GLOBAL_EXPECT, ASYMMETRIC_MATCHERS_OBJECT, getState, setState, addCustomEqualityTesters, customMatchers } from "@vitest/expect.js";
3
3
  import { getCurrentTest } from "@vitest/runner.js";
4
4
  import { getNames, getTestName } from "@vitest/runner/utils.js";
5
5
 
6
- // ../../node_modules/.pnpm/vitest@4.0.8_@types+debug@4.1.12_@types+node@24.10.1_@vitest+ui@4.0.8_jiti@2.6.1_jsdom@_c97fdea49f1663602bf3dfb16acdd85d/node_modules/vitest/dist/chunks/utils.DvEY5TfP.js
6
+ // ../../node_modules/.pnpm/vitest@4.0.10_@types+debug@4.1.12_@types+node@24.10.1_@vitest+ui@4.0.10_jiti@2.6.1_jsdo_8129e2874895056f7089688a9cfd0bc1/node_modules/vitest/dist/chunks/utils.DvEY5TfP.js
7
7
  import { getSafeTimers } from "@vitest/utils/timers.js";
8
8
  var NAME_WORKER_STATE = "__vitest_worker__";
9
9
  function getWorkerState() {
@@ -44,7 +44,7 @@ async function waitForImportsToResolve() {
44
44
  await waitForImportsToResolve();
45
45
  }
46
46
 
47
- // ../../node_modules/.pnpm/vitest@4.0.8_@types+debug@4.1.12_@types+node@24.10.1_@vitest+ui@4.0.8_jiti@2.6.1_jsdom@_c97fdea49f1663602bf3dfb16acdd85d/node_modules/vitest/dist/chunks/vi.Bgcdy3bQ.js
47
+ // ../../node_modules/.pnpm/vitest@4.0.10_@types+debug@4.1.12_@types+node@24.10.1_@vitest+ui@4.0.10_jiti@2.6.1_jsdo_8129e2874895056f7089688a9cfd0bc1/node_modules/vitest/dist/chunks/vi.BiaV1qII.js
48
48
  import { getSafeTimers as getSafeTimers2 } from "@vitest/utils/timers.js";
49
49
  import { stripSnapshotIndentation, addSerializer, SnapshotClient } from "@vitest/snapshot.js";
50
50
  import "@vitest/utils/error.js";
@@ -53,10 +53,10 @@ import { fn, spyOn, restoreAllMocks, resetAllMocks, clearAllMocks, isMockFunctio
53
53
  import "@vitest/utils/offset.js";
54
54
  import { parseSingleStack } from "@vitest/utils/source-map.js";
55
55
 
56
- // ../../node_modules/.pnpm/vitest@4.0.8_@types+debug@4.1.12_@types+node@24.10.1_@vitest+ui@4.0.8_jiti@2.6.1_jsdom@_c97fdea49f1663602bf3dfb16acdd85d/node_modules/vitest/dist/chunks/_commonjsHelpers.BFTU3MAI.js
56
+ // ../../node_modules/.pnpm/vitest@4.0.10_@types+debug@4.1.12_@types+node@24.10.1_@vitest+ui@4.0.10_jiti@2.6.1_jsdo_8129e2874895056f7089688a9cfd0bc1/node_modules/vitest/dist/chunks/_commonjsHelpers.D26ty3Ew.js
57
57
  var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {};
58
58
 
59
- // ../../node_modules/.pnpm/vitest@4.0.8_@types+debug@4.1.12_@types+node@24.10.1_@vitest+ui@4.0.8_jiti@2.6.1_jsdom@_c97fdea49f1663602bf3dfb16acdd85d/node_modules/vitest/dist/chunks/date.Bq6ZW5rf.js
59
+ // ../../node_modules/.pnpm/vitest@4.0.10_@types+debug@4.1.12_@types+node@24.10.1_@vitest+ui@4.0.10_jiti@2.6.1_jsdo_8129e2874895056f7089688a9cfd0bc1/node_modules/vitest/dist/chunks/date.Bq6ZW5rf.js
60
60
  var RealDate = Date;
61
61
  var now = null;
62
62
  var MockDate = class _MockDate extends RealDate {
@@ -104,7 +104,7 @@ function resetDate() {
104
104
  globalThis.Date = RealDate;
105
105
  }
106
106
 
107
- // ../../node_modules/.pnpm/vitest@4.0.8_@types+debug@4.1.12_@types+node@24.10.1_@vitest+ui@4.0.8_jiti@2.6.1_jsdom@_c97fdea49f1663602bf3dfb16acdd85d/node_modules/vitest/dist/chunks/vi.Bgcdy3bQ.js
107
+ // ../../node_modules/.pnpm/vitest@4.0.10_@types+debug@4.1.12_@types+node@24.10.1_@vitest+ui@4.0.10_jiti@2.6.1_jsdo_8129e2874895056f7089688a9cfd0bc1/node_modules/vitest/dist/chunks/vi.BiaV1qII.js
108
108
  var unsupported = [
109
109
  "matchSnapshot",
110
110
  "toMatchSnapshot",
@@ -562,10 +562,10 @@ var hasRequiredDeprecated;
562
562
  function requireDeprecated() {
563
563
  if (hasRequiredDeprecated) return deprecated;
564
564
  hasRequiredDeprecated = 1;
565
- (function(exports) {
566
- exports.wrap = function(func, msg) {
565
+ (function(exports$1) {
566
+ exports$1.wrap = function(func, msg) {
567
567
  var wrapped = function() {
568
- exports.printWarning(msg);
568
+ exports$1.printWarning(msg);
569
569
  return func.apply(this, arguments);
570
570
  };
571
571
  if (func.prototype) {
@@ -573,10 +573,10 @@ function requireDeprecated() {
573
573
  }
574
574
  return wrapped;
575
575
  };
576
- exports.defaultMsg = function(packageName, funcName) {
576
+ exports$1.defaultMsg = function(packageName, funcName) {
577
577
  return `${packageName}.${funcName} is deprecated and will be removed from the public API in a future version of ${packageName}.`;
578
578
  };
579
- exports.printWarning = function(msg) {
579
+ exports$1.printWarning = function(msg) {
580
580
  if (typeof process === "object" && process.emitWarning) {
581
581
  process.emitWarning(msg);
582
582
  } else if (console.info) {
@@ -715,7 +715,7 @@ var hasRequiredTypeDetect;
715
715
  function requireTypeDetect() {
716
716
  if (hasRequiredTypeDetect) return typeDetect$1.exports;
717
717
  hasRequiredTypeDetect = 1;
718
- (function(module, exports) {
718
+ (function(module, exports$1) {
719
719
  (function(global3, factory) {
720
720
  module.exports = factory();
721
721
  })(typeDetect, (function() {
@@ -2692,11 +2692,11 @@ function _mocker() {
2692
2692
  function getImporter(name) {
2693
2693
  const stackArray = createSimpleStackTrace({ stackTraceLimit: 5 }).split("\n");
2694
2694
  return parseSingleStack(stackArray[stackArray.findLastIndex((stack) => {
2695
- return stack.includes(` at Object.${name}`) || stack.includes(`${name}@`);
2695
+ return stack.includes(` at Object.${name}`) || stack.includes(`${name}@`) || stack.includes(` at ${name} (`);
2696
2696
  }) + 1])?.file || "";
2697
2697
  }
2698
2698
 
2699
- // ../../node_modules/.pnpm/vitest@4.0.8_@types+debug@4.1.12_@types+node@24.10.1_@vitest+ui@4.0.8_jiti@2.6.1_jsdom@_c97fdea49f1663602bf3dfb16acdd85d/node_modules/vitest/dist/index.js
2699
+ // ../../node_modules/.pnpm/vitest@4.0.10_@types+debug@4.1.12_@types+node@24.10.1_@vitest+ui@4.0.10_jiti@2.6.1_jsdo_8129e2874895056f7089688a9cfd0bc1/node_modules/vitest/dist/index.js
2700
2700
  import { expectTypeOf } from "expect-type.js";
2701
2701
  import { afterAll, afterEach, beforeAll, beforeEach, describe, it, onTestFailed, onTestFinished, suite, test } from "@vitest/runner.js";
2702
2702
  import { chai as chai2 } from "@vitest/expect.js";