@assistant-ui/react 0.12.28 → 0.14.0

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 (124) hide show
  1. package/dist/client/ExternalThread.d.ts.map +1 -1
  2. package/dist/client/ExternalThread.js +0 -2
  3. package/dist/client/ExternalThread.js.map +1 -1
  4. package/dist/client/InMemoryThreadList.d.ts.map +1 -1
  5. package/dist/client/InMemoryThreadList.js +3 -0
  6. package/dist/client/InMemoryThreadList.js.map +1 -1
  7. package/dist/client/SingleThreadList.d.ts.map +1 -1
  8. package/dist/client/SingleThreadList.js +3 -0
  9. package/dist/client/SingleThreadList.js.map +1 -1
  10. package/dist/context/providers/ThreadViewportProvider.d.ts.map +1 -1
  11. package/dist/context/providers/ThreadViewportProvider.js +2 -10
  12. package/dist/context/providers/ThreadViewportProvider.js.map +1 -1
  13. package/dist/context/stores/ThreadViewport.d.ts +46 -4
  14. package/dist/context/stores/ThreadViewport.d.ts.map +1 -1
  15. package/dist/context/stores/ThreadViewport.js +51 -7
  16. package/dist/context/stores/ThreadViewport.js.map +1 -1
  17. package/dist/index.d.ts +1 -29
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +1 -28
  20. package/dist/index.js.map +1 -1
  21. package/dist/legacy-runtime/runtime-cores/assistant-transport/utils.d.ts +1 -1
  22. package/dist/legacy-runtime/runtime-cores/assistant-transport/utils.d.ts.map +1 -1
  23. package/dist/legacy-runtime/runtime-cores/assistant-transport/utils.js +1 -1
  24. package/dist/legacy-runtime/runtime-cores/assistant-transport/utils.js.map +1 -1
  25. package/dist/primitives/composer/ComposerInput.d.ts.map +1 -1
  26. package/dist/primitives/composer/ComposerInput.js +9 -4
  27. package/dist/primitives/composer/ComposerInput.js.map +1 -1
  28. package/dist/primitives/message/MessageRoot.d.ts +6 -30
  29. package/dist/primitives/message/MessageRoot.d.ts.map +1 -1
  30. package/dist/primitives/message/MessageRoot.js +68 -25
  31. package/dist/primitives/message/MessageRoot.js.map +1 -1
  32. package/dist/primitives/thread/ThreadViewport.d.ts +38 -0
  33. package/dist/primitives/thread/ThreadViewport.d.ts.map +1 -1
  34. package/dist/primitives/thread/ThreadViewport.js +53 -5
  35. package/dist/primitives/thread/ThreadViewport.js.map +1 -1
  36. package/dist/primitives/thread/ThreadViewportFooter.d.ts +2 -1
  37. package/dist/primitives/thread/ThreadViewportFooter.d.ts.map +1 -1
  38. package/dist/primitives/thread/ThreadViewportFooter.js +2 -1
  39. package/dist/primitives/thread/ThreadViewportFooter.js.map +1 -1
  40. package/dist/primitives/thread/topAnchor/computeTopAnchorSlack.d.ts +22 -0
  41. package/dist/primitives/thread/topAnchor/computeTopAnchorSlack.d.ts.map +1 -0
  42. package/dist/primitives/thread/topAnchor/computeTopAnchorSlack.js +53 -0
  43. package/dist/primitives/thread/topAnchor/computeTopAnchorSlack.js.map +1 -0
  44. package/dist/primitives/thread/topAnchor/createReserveObservers.d.ts +5 -0
  45. package/dist/primitives/thread/topAnchor/createReserveObservers.d.ts.map +1 -0
  46. package/dist/primitives/thread/topAnchor/createReserveObservers.js +38 -0
  47. package/dist/primitives/thread/topAnchor/createReserveObservers.js.map +1 -0
  48. package/dist/primitives/thread/topAnchor/mountTopAnchorReserve.d.ts +22 -0
  49. package/dist/primitives/thread/topAnchor/mountTopAnchorReserve.d.ts.map +1 -0
  50. package/dist/primitives/thread/topAnchor/mountTopAnchorReserve.js +75 -0
  51. package/dist/primitives/thread/topAnchor/mountTopAnchorReserve.js.map +1 -0
  52. package/dist/primitives/thread/topAnchor/topAnchorTurn.d.ts +15 -0
  53. package/dist/primitives/thread/topAnchor/topAnchorTurn.d.ts.map +1 -0
  54. package/dist/primitives/thread/topAnchor/topAnchorTurn.js +13 -0
  55. package/dist/primitives/thread/topAnchor/topAnchorTurn.js.map +1 -0
  56. package/dist/primitives/thread/topAnchor/topAnchorUtils.d.ts +15 -0
  57. package/dist/primitives/thread/topAnchor/topAnchorUtils.d.ts.map +1 -0
  58. package/dist/primitives/thread/topAnchor/topAnchorUtils.js +51 -0
  59. package/dist/primitives/thread/topAnchor/topAnchorUtils.js.map +1 -0
  60. package/dist/primitives/thread/topAnchor/useTopAnchorReserve.d.ts +7 -0
  61. package/dist/primitives/thread/topAnchor/useTopAnchorReserve.d.ts.map +1 -0
  62. package/dist/primitives/thread/topAnchor/useTopAnchorReserve.js +18 -0
  63. package/dist/primitives/thread/topAnchor/useTopAnchorReserve.js.map +1 -0
  64. package/dist/primitives/thread/useThreadViewportAutoScroll.d.ts.map +1 -1
  65. package/dist/primitives/thread/useThreadViewportAutoScroll.js +13 -1
  66. package/dist/primitives/thread/useThreadViewportAutoScroll.js.map +1 -1
  67. package/dist/primitives/thread.d.ts +0 -1
  68. package/dist/primitives/thread.d.ts.map +1 -1
  69. package/dist/primitives/thread.js +0 -1
  70. package/dist/primitives/thread.js.map +1 -1
  71. package/dist/primitives/threadList/ThreadListLoadMore.d.ts +13 -0
  72. package/dist/primitives/threadList/ThreadListLoadMore.d.ts.map +1 -0
  73. package/dist/primitives/threadList/ThreadListLoadMore.js +11 -0
  74. package/dist/primitives/threadList/ThreadListLoadMore.js.map +1 -0
  75. package/dist/primitives/threadList.d.ts +1 -0
  76. package/dist/primitives/threadList.d.ts.map +1 -1
  77. package/dist/primitives/threadList.js +1 -0
  78. package/dist/primitives/threadList.js.map +1 -1
  79. package/dist/utils/hooks/useManagedRef.d.ts.map +1 -1
  80. package/dist/utils/hooks/useManagedRef.js +1 -0
  81. package/dist/utils/hooks/useManagedRef.js.map +1 -1
  82. package/dist/utils/hooks/useOnResizeContent.d.ts.map +1 -1
  83. package/dist/utils/hooks/useOnResizeContent.js +1 -2
  84. package/dist/utils/hooks/useOnResizeContent.js.map +1 -1
  85. package/package.json +10 -10
  86. package/src/client/ExternalThread.ts +0 -2
  87. package/src/client/InMemoryThreadList.ts +3 -0
  88. package/src/client/SingleThreadList.ts +3 -0
  89. package/src/context/providers/ThreadViewportProvider.tsx +2 -12
  90. package/src/context/stores/ThreadViewport.ts +111 -11
  91. package/src/index.ts +0 -35
  92. package/src/legacy-runtime/runtime-cores/assistant-transport/utils.ts +1 -5
  93. package/src/primitives/composer/ComposerInput.test.tsx +232 -0
  94. package/src/primitives/composer/ComposerInput.tsx +9 -4
  95. package/src/primitives/message/MessageRoot.tsx +135 -57
  96. package/src/primitives/thread/ThreadViewport.tsx +95 -4
  97. package/src/primitives/thread/ThreadViewportFooter.tsx +2 -1
  98. package/src/primitives/thread/topAnchor/computeTopAnchorSlack.test.ts +131 -0
  99. package/src/primitives/thread/topAnchor/computeTopAnchorSlack.ts +94 -0
  100. package/src/primitives/thread/topAnchor/createReserveObservers.ts +50 -0
  101. package/src/primitives/thread/topAnchor/mountTopAnchorReserve.test.ts +131 -0
  102. package/src/primitives/thread/topAnchor/mountTopAnchorReserve.ts +127 -0
  103. package/src/primitives/thread/topAnchor/topAnchorTurn.test.ts +46 -0
  104. package/src/primitives/thread/topAnchor/topAnchorTurn.ts +30 -0
  105. package/src/primitives/thread/topAnchor/topAnchorUtils.ts +58 -0
  106. package/src/primitives/thread/topAnchor/useTopAnchorReserve.ts +19 -0
  107. package/src/primitives/thread/useThreadViewportAutoScroll.ts +15 -1
  108. package/src/primitives/thread.ts +0 -1
  109. package/src/primitives/threadList/ThreadListLoadMore.tsx +24 -0
  110. package/src/primitives/threadList.ts +1 -0
  111. package/src/tests/RemoteThreadListRuntime.adapterProvider.test.tsx +138 -0
  112. package/src/tests/RemoteThreadListRuntime.deferredProvider.test.tsx +28 -17
  113. package/src/utils/hooks/useManagedRef.ts +1 -0
  114. package/src/utils/hooks/useOnResizeContent.ts +1 -2
  115. package/dist/legacy-runtime/runtime-cores/external-store/getExternalStoreMessage.d.ts +0 -3
  116. package/dist/legacy-runtime/runtime-cores/external-store/getExternalStoreMessage.d.ts.map +0 -1
  117. package/dist/legacy-runtime/runtime-cores/external-store/getExternalStoreMessage.js +0 -3
  118. package/dist/legacy-runtime/runtime-cores/external-store/getExternalStoreMessage.js.map +0 -1
  119. package/dist/primitives/thread/ThreadViewportSlack.d.ts +0 -20
  120. package/dist/primitives/thread/ThreadViewportSlack.d.ts.map +0 -1
  121. package/dist/primitives/thread/ThreadViewportSlack.js +0 -80
  122. package/dist/primitives/thread/ThreadViewportSlack.js.map +0 -1
  123. package/src/legacy-runtime/runtime-cores/external-store/getExternalStoreMessage.ts +0 -6
  124. package/src/primitives/thread/ThreadViewportSlack.tsx +0 -116
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Minimal slice of `ThreadViewportStore` that the top-anchor reserve needs.
3
+ * Decoupling from the full store keeps `mountTopAnchorReserve` testable in
4
+ * isolation and re-usable from any consumer that can adapt to this shape.
5
+ */
6
+ export type TopAnchorStore = {
7
+ getState(): {
8
+ turnAnchor: "top" | "bottom";
9
+ element: {
10
+ viewport: HTMLElement | null;
11
+ anchor: HTMLElement | null;
12
+ target: HTMLElement | null;
13
+ };
14
+ targetConfig: {
15
+ tallerThan: number;
16
+ visibleHeight: number;
17
+ } | null;
18
+ };
19
+ subscribe(fn: () => void): () => void;
20
+ };
21
+ export declare const mountTopAnchorReserve: (store: TopAnchorStore) => () => void;
22
+ //# sourceMappingURL=mountTopAnchorReserve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mountTopAnchorReserve.d.ts","sourceRoot":"","sources":["../../../../src/primitives/thread/topAnchor/mountTopAnchorReserve.ts"],"names":[],"mappings":"AAcA;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,IAAI;QACV,UAAU,EAAE,KAAK,GAAG,QAAQ,CAAC;QAC7B,OAAO,EAAE;YACP,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;YAC7B,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;YAC3B,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;SAC5B,CAAC;QACF,YAAY,EAAE;YACZ,UAAU,EAAE,MAAM,CAAC;YACnB,aAAa,EAAE,MAAM,CAAC;SACvB,GAAG,IAAI,CAAC;KACV,CAAC;IACF,SAAS,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;CACvC,CAAC;AAsBF,eAAO,MAAM,qBAAqB,GAAI,OAAO,cAAc,eAuE1D,CAAC"}
@@ -0,0 +1,75 @@
1
+ "use client";
2
+ import { computeTopAnchorReserve, computeTopAnchorTargetScrollTop, } from "./computeTopAnchorSlack.js";
3
+ import { createReserveObservers } from "./createReserveObservers.js";
4
+ import { createReserveElement, getAnchorId, setReserveHeight, snapScrollTop, } from "./topAnchorUtils.js";
5
+ const createFrameScheduler = (fn) => {
6
+ let frame = null;
7
+ return {
8
+ schedule: () => {
9
+ if (frame !== null)
10
+ return;
11
+ frame = requestAnimationFrame(() => {
12
+ frame = null;
13
+ fn();
14
+ });
15
+ },
16
+ cancel: () => {
17
+ if (frame !== null) {
18
+ cancelAnimationFrame(frame);
19
+ frame = null;
20
+ }
21
+ },
22
+ };
23
+ };
24
+ export const mountTopAnchorReserve = (store) => {
25
+ let reserve = null;
26
+ let lastScrolledAnchorId;
27
+ function apply() {
28
+ const state = store.getState();
29
+ const { viewport, anchor, target } = state.element;
30
+ const clamp = state.targetConfig;
31
+ if (state.turnAnchor !== "top" ||
32
+ !viewport ||
33
+ !anchor ||
34
+ !target ||
35
+ !clamp) {
36
+ observers.disconnect();
37
+ if (reserve) {
38
+ setReserveHeight(reserve, 0);
39
+ reserve.remove();
40
+ }
41
+ return;
42
+ }
43
+ reserve ??= createReserveElement();
44
+ if (reserve.parentElement !== target.parentElement ||
45
+ reserve.previousElementSibling !== target) {
46
+ target.after(reserve);
47
+ }
48
+ observers.target(viewport, anchor, target);
49
+ const reserveChanged = setReserveHeight(reserve, computeTopAnchorReserve({ viewport, anchor, reserve, ...clamp }));
50
+ if (reserveChanged) {
51
+ scheduler.schedule();
52
+ return;
53
+ }
54
+ const anchorId = getAnchorId(anchor);
55
+ if (anchorId !== undefined && lastScrolledAnchorId === anchorId)
56
+ return;
57
+ const targetScrollTop = snapScrollTop(computeTopAnchorTargetScrollTop({ viewport, anchor, ...clamp }));
58
+ if (Math.abs(viewport.scrollTop - targetScrollTop) > 1) {
59
+ viewport.scrollTo({ top: targetScrollTop, behavior: "smooth" });
60
+ }
61
+ if (anchorId !== undefined)
62
+ lastScrolledAnchorId = anchorId;
63
+ }
64
+ const scheduler = createFrameScheduler(apply);
65
+ const observers = createReserveObservers(scheduler.schedule);
66
+ scheduler.schedule();
67
+ const unsubscribe = store.subscribe(scheduler.schedule);
68
+ return () => {
69
+ scheduler.cancel();
70
+ unsubscribe();
71
+ observers.disconnect();
72
+ reserve?.remove();
73
+ };
74
+ };
75
+ //# sourceMappingURL=mountTopAnchorReserve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mountTopAnchorReserve.js","sourceRoot":"","sources":["../../../../src/primitives/thread/topAnchor/mountTopAnchorReserve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ type TopAnchorTurnMessage = {
2
+ readonly id: string;
3
+ readonly role: string;
4
+ };
5
+ export declare const getActiveTopAnchorTurn: ({ isRunning, messages, }: {
6
+ readonly isRunning: boolean;
7
+ readonly messages: readonly TopAnchorTurnMessage[];
8
+ }) => {
9
+ anchorId: string;
10
+ targetId: string;
11
+ } | null;
12
+ export declare const getActiveTopAnchorAnchorId: (options: Parameters<typeof getActiveTopAnchorTurn>[0]) => string | undefined;
13
+ export declare const getActiveTopAnchorTargetId: (options: Parameters<typeof getActiveTopAnchorTurn>[0]) => string | undefined;
14
+ export {};
15
+ //# sourceMappingURL=topAnchorTurn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topAnchorTurn.d.ts","sourceRoot":"","sources":["../../../../src/primitives/thread/topAnchor/topAnchorTurn.ts"],"names":[],"mappings":"AAEA,KAAK,oBAAoB,GAAG;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,0BAGpC;IACD,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,SAAS,oBAAoB,EAAE,CAAC;CACpD;;;QAQA,CAAC;AAEF,eAAO,MAAM,0BAA0B,GACrC,SAAS,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC,CAAC,CAAC,uBACT,CAAC;AAE/C,eAAO,MAAM,0BAA0B,GACrC,SAAS,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC,CAAC,CAAC,uBACT,CAAC"}
@@ -0,0 +1,13 @@
1
+ "use client";
2
+ export const getActiveTopAnchorTurn = ({ isRunning, messages, }) => {
3
+ if (!isRunning)
4
+ return null;
5
+ const target = messages.at(-1);
6
+ const anchor = messages.at(-2);
7
+ if (anchor?.role !== "user" || target?.role !== "assistant")
8
+ return null;
9
+ return { anchorId: anchor.id, targetId: target.id };
10
+ };
11
+ export const getActiveTopAnchorAnchorId = (options) => getActiveTopAnchorTurn(options)?.anchorId;
12
+ export const getActiveTopAnchorTargetId = (options) => getActiveTopAnchorTurn(options)?.targetId;
13
+ //# sourceMappingURL=topAnchorTurn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topAnchorTurn.js","sourceRoot":"","sources":["../../../../src/primitives/thread/topAnchor/topAnchorTurn.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAOb,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,EACrC,SAAS,EACT,QAAQ,GAIT,EAAE,EAAE;IACH,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAE5B,MAAM,MAAM,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,MAAM,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/B,IAAI,MAAM,EAAE,IAAI,KAAK,MAAM,IAAI,MAAM,EAAE,IAAI,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IAEzE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;AACtD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACxC,OAAqD,EACrD,EAAE,CAAC,sBAAsB,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC;AAE/C,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACxC,OAAqD,EACrD,EAAE,CAAC,sBAAsB,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Convert a supported CSS length string (`px`, `em`, `rem`) into pixels,
3
+ * resolving font-relative units against the supplied element's computed style.
4
+ * Unsupported or malformed values disable the tall-message clamp.
5
+ *
6
+ * Part of the top-anchor package's public input contract: consumers may pass
7
+ * clamp configuration as supported CSS-length strings, and this function is the
8
+ * single place that converts them into the pixel values the package operates on.
9
+ */
10
+ export declare const parseCssLength: (value: string, element: HTMLElement) => number;
11
+ export declare const getAnchorId: (anchor: HTMLElement) => string | undefined;
12
+ export declare const createReserveElement: () => HTMLDivElement;
13
+ export declare const setReserveHeight: (reserve: HTMLElement, height: number) => boolean;
14
+ export declare const snapScrollTop: (top: number) => number;
15
+ //# sourceMappingURL=topAnchorUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topAnchorUtils.d.ts","sourceRoot":"","sources":["../../../../src/primitives/thread/topAnchor/topAnchorUtils.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,GAAI,OAAO,MAAM,EAAE,SAAS,WAAW,KAAG,MAkBpE,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,QAAQ,WAAW,uBAA6B,CAAC;AAE7E,eAAO,MAAM,oBAAoB,sBAShC,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,SAAS,WAAW,EAAE,QAAQ,MAAM,YAQpE,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,KAAK,MAAM,WAGxC,CAAC"}
@@ -0,0 +1,51 @@
1
+ "use client";
2
+ /**
3
+ * Convert a supported CSS length string (`px`, `em`, `rem`) into pixels,
4
+ * resolving font-relative units against the supplied element's computed style.
5
+ * Unsupported or malformed values disable the tall-message clamp.
6
+ *
7
+ * Part of the top-anchor package's public input contract: consumers may pass
8
+ * clamp configuration as supported CSS-length strings, and this function is the
9
+ * single place that converts them into the pixel values the package operates on.
10
+ */
11
+ export const parseCssLength = (value, element) => {
12
+ const match = value.trim().match(/^(\d+(?:\.\d+)?|\.\d+)(em|px|rem)$/);
13
+ if (!match)
14
+ return Number.POSITIVE_INFINITY;
15
+ const num = Number(match[1]);
16
+ const unit = match[2];
17
+ if (unit === "px")
18
+ return num;
19
+ if (unit === "em") {
20
+ const fontSize = parseFloat(getComputedStyle(element).fontSize) || 16;
21
+ return num * fontSize;
22
+ }
23
+ if (unit === "rem") {
24
+ const rootFontSize = parseFloat(getComputedStyle(document.documentElement).fontSize) || 16;
25
+ return num * rootFontSize;
26
+ }
27
+ return Number.POSITIVE_INFINITY;
28
+ };
29
+ export const getAnchorId = (anchor) => anchor.dataset.messageId;
30
+ export const createReserveElement = () => {
31
+ const reserve = document.createElement("div");
32
+ reserve.dataset.auiTopAnchorReserve = "";
33
+ reserve.style.height = "0px";
34
+ reserve.style.flexShrink = "0";
35
+ reserve.style.pointerEvents = "none";
36
+ reserve.setAttribute("aria-hidden", "true");
37
+ return reserve;
38
+ };
39
+ export const setReserveHeight = (reserve, height) => {
40
+ const nextHeight = `${height}px`;
41
+ if (reserve.style.height !== nextHeight) {
42
+ reserve.style.height = nextHeight;
43
+ return true;
44
+ }
45
+ return false;
46
+ };
47
+ export const snapScrollTop = (top) => {
48
+ const pixelRatio = window.devicePixelRatio || 1;
49
+ return Math.round(top * pixelRatio) / pixelRatio;
50
+ };
51
+ //# sourceMappingURL=topAnchorUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topAnchorUtils.js","sourceRoot":"","sources":["../../../../src/primitives/thread/topAnchor/topAnchorUtils.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAa,EAAE,OAAoB,EAAU,EAAE;IAC5E,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACvE,IAAI,CAAC,KAAK;QAAE,OAAO,MAAM,CAAC,iBAAiB,CAAC;IAE5C,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAEtB,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,GAAG,CAAC;IAC9B,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,MAAM,QAAQ,GAAG,UAAU,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACtE,OAAO,GAAG,GAAG,QAAQ,CAAC;IACxB,CAAC;IACD,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,MAAM,YAAY,GAChB,UAAU,CAAC,gBAAgB,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACxE,OAAO,GAAG,GAAG,YAAY,CAAC;IAC5B,CAAC;IACD,OAAO,MAAM,CAAC,iBAAiB,CAAC;AAClC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,MAAmB,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;AAE7E,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,EAAE;IACvC,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC9C,OAAO,CAAC,OAAO,CAAC,mBAAmB,GAAG,EAAE,CAAC;IACzC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;IAC7B,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC;IAC/B,OAAO,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM,CAAC;IACrC,OAAO,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAE5C,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,OAAoB,EAAE,MAAc,EAAE,EAAE;IACvE,MAAM,UAAU,GAAG,GAAG,MAAM,IAAI,CAAC;IACjC,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QACxC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,UAAU,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,GAAW,EAAE,EAAE;IAC3C,MAAM,UAAU,GAAG,MAAM,CAAC,gBAAgB,IAAI,CAAC,CAAC;IAChD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,UAAU,CAAC,GAAG,UAAU,CAAC;AACnD,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Mounts the top-turn-anchor reserve element against the active
3
+ * `ThreadViewport` store. Call this from inside the scrollable viewport so
4
+ * the reserve `<div>` is appended next to the streaming assistant message.
5
+ */
6
+ export declare const useTopAnchorReserve: (enabled: boolean) => void;
7
+ //# sourceMappingURL=useTopAnchorReserve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTopAnchorReserve.d.ts","sourceRoot":"","sources":["../../../../src/primitives/thread/topAnchor/useTopAnchorReserve.ts"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,GAAI,SAAS,OAAO,SAOnD,CAAC"}
@@ -0,0 +1,18 @@
1
+ "use client";
2
+ import { useLayoutEffect } from "react";
3
+ import { useThreadViewportStore } from "../../../context/react/ThreadViewportContext.js";
4
+ import { mountTopAnchorReserve } from "./mountTopAnchorReserve.js";
5
+ /**
6
+ * Mounts the top-turn-anchor reserve element against the active
7
+ * `ThreadViewport` store. Call this from inside the scrollable viewport so
8
+ * the reserve `<div>` is appended next to the streaming assistant message.
9
+ */
10
+ export const useTopAnchorReserve = (enabled) => {
11
+ const threadViewportStore = useThreadViewportStore();
12
+ useLayoutEffect(() => {
13
+ if (!enabled)
14
+ return;
15
+ return mountTopAnchorReserve(threadViewportStore);
16
+ }, [enabled, threadViewportStore]);
17
+ };
18
+ //# sourceMappingURL=useTopAnchorReserve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTopAnchorReserve.js","sourceRoot":"","sources":["../../../../src/primitives/thread/topAnchor/useTopAnchorReserve.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AACxC,OAAO,EAAE,sBAAsB,EAAE,wDAAqD;AACtF,OAAO,EAAE,qBAAqB,EAAE,mCAAgC;AAEhE;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,OAAgB,EAAE,EAAE;IACtD,MAAM,mBAAmB,GAAG,sBAAsB,EAAE,CAAC;IAErD,eAAe,CAAC,GAAG,EAAE;QACnB,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,OAAO,qBAAqB,CAAC,mBAAmB,CAAC,CAAC;IACpD,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC;AACrC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useThreadViewportAutoScroll.d.ts","sourceRoot":"","sources":["../../../src/primitives/thread/useThreadViewportAutoScroll.ts"],"names":[],"mappings":"AAGA,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,OAAO,CAAC;AAQ9D,yBAAiB,2BAA2B,CAAC;IAC3C,KAAY,OAAO,GAAG;QACpB;;;;;WAKG;QACH,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QAEjC;;;;WAIG;QACH,wBAAwB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QAE/C;;;;WAIG;QACH,0BAA0B,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QAEjD;;;;WAIG;QACH,4BAA4B,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;KACpD,CAAC;CACH;AAED,eAAO,MAAM,2BAA2B,GAAI,QAAQ,SAAS,WAAW,EAAE,qGAKvE,2BAA2B,CAAC,OAAO,KAAG,WAAW,CAAC,QAAQ,CAuG5D,CAAC"}
1
+ {"version":3,"file":"useThreadViewportAutoScroll.d.ts","sourceRoot":"","sources":["../../../src/primitives/thread/useThreadViewportAutoScroll.ts"],"names":[],"mappings":"AAGA,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,OAAO,CAAC;AAQ9D,yBAAiB,2BAA2B,CAAC;IAC3C,KAAY,OAAO,GAAG;QACpB;;;;;WAKG;QACH,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QAEjC;;;;WAIG;QACH,wBAAwB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QAE/C;;;;WAIG;QACH,0BAA0B,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QAEjD;;;;WAIG;QACH,4BAA4B,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;KACpD,CAAC;CACH;AAED,eAAO,MAAM,2BAA2B,GAAI,QAAQ,SAAS,WAAW,EAAE,qGAKvE,2BAA2B,CAAC,OAAO,KAAG,WAAW,CAAC,QAAQ,CAqH5D,CAAC"}
@@ -25,6 +25,12 @@ export const useThreadViewportAutoScroll = ({ autoScroll, scrollToBottomOnRunSta
25
25
  scrollingToBottomBehaviorRef.current = behavior;
26
26
  div.scrollTo({ top: div.scrollHeight, behavior });
27
27
  }, []);
28
+ const hasActiveTopAnchor = useCallback(() => {
29
+ const state = threadViewportStore.getState();
30
+ return (state.turnAnchor === "top" &&
31
+ state.element.viewport === divRef.current &&
32
+ state.element.anchor !== null);
33
+ }, [threadViewportStore]);
28
34
  const handleScroll = () => {
29
35
  const div = divRef.current;
30
36
  if (!div)
@@ -50,7 +56,11 @@ export const useThreadViewportAutoScroll = ({ autoScroll, scrollToBottomOnRunSta
50
56
  };
51
57
  const resizeRef = useOnResizeContent(() => {
52
58
  const scrollBehavior = scrollingToBottomBehaviorRef.current;
53
- if (scrollBehavior) {
59
+ if (scrollBehavior && hasActiveTopAnchor()) {
60
+ // Let the top-anchor reserve own scrolling while a run starts to avoid a bottom-scroll race.
61
+ scrollingToBottomBehaviorRef.current = null;
62
+ }
63
+ else if (scrollBehavior) {
54
64
  scrollToBottom(scrollBehavior);
55
65
  }
56
66
  else if (autoScroll && threadViewportStore.getState().isAtBottom) {
@@ -71,6 +81,8 @@ export const useThreadViewportAutoScroll = ({ autoScroll, scrollToBottomOnRunSta
71
81
  useAuiEvent("thread.runStart", () => {
72
82
  if (!scrollToBottomOnRunStart)
73
83
  return;
84
+ if (threadViewportStore.getState().turnAnchor === "top")
85
+ return;
74
86
  scrollingToBottomBehaviorRef.current = "auto";
75
87
  requestAnimationFrame(() => {
76
88
  scrollToBottom("auto");
@@ -1 +1 @@
1
- {"version":3,"file":"useThreadViewportAutoScroll.js","sourceRoot":"","sources":["../../../src/primitives/thread/useThreadViewportAutoScroll.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useThreadViewportAutoScroll.js","sourceRoot":"","sources":["../../../src/primitives/thread/useThreadViewportAutoScroll.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,6 @@ export { ThreadPrimitiveIf as If } from "./thread/ThreadIf.js";
4
4
  export { ThreadPrimitiveViewport as Viewport } from "./thread/ThreadViewport.js";
5
5
  export { ThreadPrimitiveViewportProvider as ViewportProvider } from "../context/providers/ThreadViewportProvider.js";
6
6
  export { ThreadPrimitiveViewportFooter as ViewportFooter } from "./thread/ThreadViewportFooter.js";
7
- export { ThreadPrimitiveViewportSlack as ViewportSlack } from "./thread/ThreadViewportSlack.js";
8
7
  export { ThreadPrimitiveMessages as Messages } from "./thread/ThreadMessages.js";
9
8
  export { ThreadPrimitiveMessageByIndex as MessageByIndex } from "./thread/ThreadMessages.js";
10
9
  export { ThreadPrimitiveScrollToBottom as ScrollToBottom } from "./thread/ThreadScrollToBottom.js";
@@ -1 +1 @@
1
- {"version":3,"file":"thread.d.ts","sourceRoot":"","sources":["../../src/primitives/thread.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,IAAI,IAAI,EAAE,+BAA4B;AAClE,OAAO,EAAE,oBAAoB,IAAI,KAAK,EAAE,gCAA6B;AACrE,OAAO,EAAE,iBAAiB,IAAI,EAAE,EAAE,6BAA0B;AAC5D,OAAO,EAAE,uBAAuB,IAAI,QAAQ,EAAE,mCAAgC;AAC9E,OAAO,EAAE,+BAA+B,IAAI,gBAAgB,EAAE,uDAAoD;AAClH,OAAO,EAAE,6BAA6B,IAAI,cAAc,EAAE,yCAAsC;AAChG,OAAO,EAAE,4BAA4B,IAAI,aAAa,EAAE,wCAAqC;AAC7F,OAAO,EAAE,uBAAuB,IAAI,QAAQ,EAAE,mCAAgC;AAC9E,OAAO,EAAE,6BAA6B,IAAI,cAAc,EAAE,mCAAgC;AAC1F,OAAO,EAAE,6BAA6B,IAAI,cAAc,EAAE,yCAAsC;AAChG,OAAO,EAAE,yBAAyB,IAAI,UAAU,EAAE,qCAAkC;AACpF,OAAO,EACL,0BAA0B,IAAI,WAAW,EACzC,gCAAgC,IAAI,iBAAiB,GACtD,sCAAmC"}
1
+ {"version":3,"file":"thread.d.ts","sourceRoot":"","sources":["../../src/primitives/thread.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,IAAI,IAAI,EAAE,+BAA4B;AAClE,OAAO,EAAE,oBAAoB,IAAI,KAAK,EAAE,gCAA6B;AACrE,OAAO,EAAE,iBAAiB,IAAI,EAAE,EAAE,6BAA0B;AAC5D,OAAO,EAAE,uBAAuB,IAAI,QAAQ,EAAE,mCAAgC;AAC9E,OAAO,EAAE,+BAA+B,IAAI,gBAAgB,EAAE,uDAAoD;AAClH,OAAO,EAAE,6BAA6B,IAAI,cAAc,EAAE,yCAAsC;AAChG,OAAO,EAAE,uBAAuB,IAAI,QAAQ,EAAE,mCAAgC;AAC9E,OAAO,EAAE,6BAA6B,IAAI,cAAc,EAAE,mCAAgC;AAC1F,OAAO,EAAE,6BAA6B,IAAI,cAAc,EAAE,yCAAsC;AAChG,OAAO,EAAE,yBAAyB,IAAI,UAAU,EAAE,qCAAkC;AACpF,OAAO,EACL,0BAA0B,IAAI,WAAW,EACzC,gCAAgC,IAAI,iBAAiB,GACtD,sCAAmC"}
@@ -4,7 +4,6 @@ export { ThreadPrimitiveIf as If } from "./thread/ThreadIf.js";
4
4
  export { ThreadPrimitiveViewport as Viewport } from "./thread/ThreadViewport.js";
5
5
  export { ThreadPrimitiveViewportProvider as ViewportProvider } from "../context/providers/ThreadViewportProvider.js";
6
6
  export { ThreadPrimitiveViewportFooter as ViewportFooter } from "./thread/ThreadViewportFooter.js";
7
- export { ThreadPrimitiveViewportSlack as ViewportSlack } from "./thread/ThreadViewportSlack.js";
8
7
  export { ThreadPrimitiveMessages as Messages } from "./thread/ThreadMessages.js";
9
8
  export { ThreadPrimitiveMessageByIndex as MessageByIndex } from "./thread/ThreadMessages.js";
10
9
  export { ThreadPrimitiveScrollToBottom as ScrollToBottom } from "./thread/ThreadScrollToBottom.js";
@@ -1 +1 @@
1
- {"version":3,"file":"thread.js","sourceRoot":"","sources":["../../src/primitives/thread.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,IAAI,IAAI,EAAE,+BAA4B;AAClE,OAAO,EAAE,oBAAoB,IAAI,KAAK,EAAE,gCAA6B;AACrE,OAAO,EAAE,iBAAiB,IAAI,EAAE,EAAE,6BAA0B;AAC5D,OAAO,EAAE,uBAAuB,IAAI,QAAQ,EAAE,mCAAgC;AAC9E,OAAO,EAAE,+BAA+B,IAAI,gBAAgB,EAAE,uDAAoD;AAClH,OAAO,EAAE,6BAA6B,IAAI,cAAc,EAAE,yCAAsC;AAChG,OAAO,EAAE,4BAA4B,IAAI,aAAa,EAAE,wCAAqC;AAC7F,OAAO,EAAE,uBAAuB,IAAI,QAAQ,EAAE,mCAAgC;AAC9E,OAAO,EAAE,6BAA6B,IAAI,cAAc,EAAE,mCAAgC;AAC1F,OAAO,EAAE,6BAA6B,IAAI,cAAc,EAAE,yCAAsC;AAChG,OAAO,EAAE,yBAAyB,IAAI,UAAU,EAAE,qCAAkC;AACpF,OAAO,EACL,0BAA0B,IAAI,WAAW,EACzC,gCAAgC,IAAI,iBAAiB,GACtD,sCAAmC"}
1
+ {"version":3,"file":"thread.js","sourceRoot":"","sources":["../../src/primitives/thread.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,IAAI,IAAI,EAAE,+BAA4B;AAClE,OAAO,EAAE,oBAAoB,IAAI,KAAK,EAAE,gCAA6B;AACrE,OAAO,EAAE,iBAAiB,IAAI,EAAE,EAAE,6BAA0B;AAC5D,OAAO,EAAE,uBAAuB,IAAI,QAAQ,EAAE,mCAAgC;AAC9E,OAAO,EAAE,+BAA+B,IAAI,gBAAgB,EAAE,uDAAoD;AAClH,OAAO,EAAE,6BAA6B,IAAI,cAAc,EAAE,yCAAsC;AAChG,OAAO,EAAE,uBAAuB,IAAI,QAAQ,EAAE,mCAAgC;AAC9E,OAAO,EAAE,6BAA6B,IAAI,cAAc,EAAE,mCAAgC;AAC1F,OAAO,EAAE,6BAA6B,IAAI,cAAc,EAAE,yCAAsC;AAChG,OAAO,EAAE,yBAAyB,IAAI,UAAU,EAAE,qCAAkC;AACpF,OAAO,EACL,0BAA0B,IAAI,WAAW,EACzC,gCAAgC,IAAI,iBAAiB,GACtD,sCAAmC"}
@@ -0,0 +1,13 @@
1
+ import { type ActionButtonElement, type ActionButtonProps } from "../../utils/createActionButton.js";
2
+ declare const useThreadListLoadMore: () => (() => void) | null;
3
+ export declare namespace ThreadListPrimitiveLoadMore {
4
+ type Element = ActionButtonElement;
5
+ type Props = ActionButtonProps<typeof useThreadListLoadMore>;
6
+ }
7
+ export declare const ThreadListPrimitiveLoadMore: import("react").ForwardRefExoticComponent<Omit<Omit<import("react").ClassAttributes<HTMLButtonElement> & import("react").ButtonHTMLAttributes<HTMLButtonElement> & {
8
+ asChild?: boolean;
9
+ }, "ref"> & {
10
+ render?: import("react").ReactElement | undefined;
11
+ } & import("react").RefAttributes<HTMLButtonElement>, "ref"> & import("react").RefAttributes<HTMLButtonElement>>;
12
+ export {};
13
+ //# sourceMappingURL=ThreadListLoadMore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ThreadListLoadMore.d.ts","sourceRoot":"","sources":["../../../src/primitives/threadList/ThreadListLoadMore.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EAEvB,0CAAuC;AAGxC,QAAA,MAAM,qBAAqB,2BAI1B,CAAC;AAEF,yBAAiB,2BAA2B,CAAC;IAC3C,KAAY,OAAO,GAAG,mBAAmB,CAAC;IAC1C,KAAY,KAAK,GAAG,iBAAiB,CAAC,OAAO,qBAAqB,CAAC,CAAC;CACrE;AAED,eAAO,MAAM,2BAA2B;;;;gHAGvC,CAAC"}
@@ -0,0 +1,11 @@
1
+ "use client";
2
+ import { createActionButton, } from "../../utils/createActionButton.js";
3
+ import { useThreadListLoadMore as useThreadListLoadMoreBehavior } from "@assistant-ui/core/react";
4
+ const useThreadListLoadMore = () => {
5
+ const { loadMore, disabled } = useThreadListLoadMoreBehavior();
6
+ if (disabled)
7
+ return null;
8
+ return loadMore;
9
+ };
10
+ export const ThreadListPrimitiveLoadMore = createActionButton("ThreadListPrimitive.LoadMore", useThreadListLoadMore);
11
+ //# sourceMappingURL=ThreadListLoadMore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ThreadListLoadMore.js","sourceRoot":"","sources":["../../../src/primitives/threadList/ThreadListLoadMore.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAGL,kBAAkB,GACnB,0CAAuC;AACxC,OAAO,EAAE,qBAAqB,IAAI,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AAElG,MAAM,qBAAqB,GAAG,GAAG,EAAE;IACjC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,6BAA6B,EAAE,CAAC;IAC/D,IAAI,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC1B,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAOF,MAAM,CAAC,MAAM,2BAA2B,GAAG,kBAAkB,CAC3D,8BAA8B,EAC9B,qBAAqB,CACtB,CAAC"}
@@ -1,5 +1,6 @@
1
1
  export { ThreadListPrimitiveNew as New } from "./threadList/ThreadListNew.js";
2
2
  export { ThreadListPrimitiveItems as Items } from "./threadList/ThreadListItems.js";
3
3
  export { ThreadListPrimitiveItemByIndex as ItemByIndex } from "./threadList/ThreadListItems.js";
4
+ export { ThreadListPrimitiveLoadMore as LoadMore } from "./threadList/ThreadListLoadMore.js";
4
5
  export { ThreadListPrimitiveRoot as Root } from "./threadList/ThreadListRoot.js";
5
6
  //# sourceMappingURL=threadList.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"threadList.d.ts","sourceRoot":"","sources":["../../src/primitives/threadList.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,IAAI,GAAG,EAAE,sCAAmC;AAC3E,OAAO,EAAE,wBAAwB,IAAI,KAAK,EAAE,wCAAqC;AACjF,OAAO,EAAE,8BAA8B,IAAI,WAAW,EAAE,wCAAqC;AAC7F,OAAO,EAAE,uBAAuB,IAAI,IAAI,EAAE,uCAAoC"}
1
+ {"version":3,"file":"threadList.d.ts","sourceRoot":"","sources":["../../src/primitives/threadList.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,IAAI,GAAG,EAAE,sCAAmC;AAC3E,OAAO,EAAE,wBAAwB,IAAI,KAAK,EAAE,wCAAqC;AACjF,OAAO,EAAE,8BAA8B,IAAI,WAAW,EAAE,wCAAqC;AAC7F,OAAO,EAAE,2BAA2B,IAAI,QAAQ,EAAE,2CAAwC;AAC1F,OAAO,EAAE,uBAAuB,IAAI,IAAI,EAAE,uCAAoC"}
@@ -1,5 +1,6 @@
1
1
  export { ThreadListPrimitiveNew as New } from "./threadList/ThreadListNew.js";
2
2
  export { ThreadListPrimitiveItems as Items } from "./threadList/ThreadListItems.js";
3
3
  export { ThreadListPrimitiveItemByIndex as ItemByIndex } from "./threadList/ThreadListItems.js";
4
+ export { ThreadListPrimitiveLoadMore as LoadMore } from "./threadList/ThreadListLoadMore.js";
4
5
  export { ThreadListPrimitiveRoot as Root } from "./threadList/ThreadListRoot.js";
5
6
  //# sourceMappingURL=threadList.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"threadList.js","sourceRoot":"","sources":["../../src/primitives/threadList.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,IAAI,GAAG,EAAE,sCAAmC;AAC3E,OAAO,EAAE,wBAAwB,IAAI,KAAK,EAAE,wCAAqC;AACjF,OAAO,EAAE,8BAA8B,IAAI,WAAW,EAAE,wCAAqC;AAC7F,OAAO,EAAE,uBAAuB,IAAI,IAAI,EAAE,uCAAoC"}
1
+ {"version":3,"file":"threadList.js","sourceRoot":"","sources":["../../src/primitives/threadList.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,IAAI,GAAG,EAAE,sCAAmC;AAC3E,OAAO,EAAE,wBAAwB,IAAI,KAAK,EAAE,wCAAqC;AACjF,OAAO,EAAE,8BAA8B,IAAI,WAAW,EAAE,wCAAqC;AAC7F,OAAO,EAAE,2BAA2B,IAAI,QAAQ,EAAE,2CAAwC;AAC1F,OAAO,EAAE,uBAAuB,IAAI,IAAI,EAAE,uCAAoC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useManagedRef.d.ts","sourceRoot":"","sources":["../../../src/utils/hooks/useManagedRef.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa,GAAI,KAAK,EACjC,UAAU,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,UAK5C,KAAK,GAAG,IAAI,SAepB,CAAC"}
1
+ {"version":3,"file":"useManagedRef.d.ts","sourceRoot":"","sources":["../../../src/utils/hooks/useManagedRef.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa,GAAI,KAAK,EACjC,UAAU,CAAC,IAAI,EAAE,KAAK,KAAK,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,UAK5C,KAAK,GAAG,IAAI,SAgBpB,CAAC"}
@@ -5,6 +5,7 @@ export const useManagedRef = (callback) => {
5
5
  // Call the previous cleanup function
6
6
  if (cleanupRef.current) {
7
7
  cleanupRef.current();
8
+ cleanupRef.current = undefined;
8
9
  }
9
10
  // Call the new callback and store its cleanup function
10
11
  if (el) {
@@ -1 +1 @@
1
- {"version":3,"file":"useManagedRef.js","sourceRoot":"","sources":["../../../src/utils/hooks/useManagedRef.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE5C,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,QAAmD,EACnD,EAAE;IACF,MAAM,UAAU,GAAG,MAAM,CAA2B,SAAS,CAAC,CAAC;IAE/D,MAAM,GAAG,GAAG,WAAW,CACrB,CAAC,EAAgB,EAAE,EAAE;QACnB,qCAAqC;QACrC,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YACvB,UAAU,CAAC,OAAO,EAAE,CAAC;QACvB,CAAC;QAED,uDAAuD;QACvD,IAAI,EAAE,EAAE,CAAC;YACP,UAAU,CAAC,OAAO,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,EACD,CAAC,QAAQ,CAAC,CACX,CAAC;IAEF,OAAO,GAAG,CAAC;AACb,CAAC,CAAC"}
1
+ {"version":3,"file":"useManagedRef.js","sourceRoot":"","sources":["../../../src/utils/hooks/useManagedRef.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE5C,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,QAAmD,EACnD,EAAE;IACF,MAAM,UAAU,GAAG,MAAM,CAA2B,SAAS,CAAC,CAAC;IAE/D,MAAM,GAAG,GAAG,WAAW,CACrB,CAAC,EAAgB,EAAE,EAAE;QACnB,qCAAqC;QACrC,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YACvB,UAAU,CAAC,OAAO,EAAE,CAAC;YACrB,UAAU,CAAC,OAAO,GAAG,SAAS,CAAC;QACjC,CAAC;QAED,uDAAuD;QACvD,IAAI,EAAE,EAAE,CAAC;YACP,UAAU,CAAC,OAAO,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,EACD,CAAC,QAAQ,CAAC,CACX,CAAC;IAEF,OAAO,GAAG,CAAC;AACb,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useOnResizeContent.d.ts","sourceRoot":"","sources":["../../../src/utils/hooks/useOnResizeContent.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,kBAAkB,GAAI,UAAU,MAAM,IAAI,qCAsCtD,CAAC"}
1
+ {"version":3,"file":"useOnResizeContent.d.ts","sourceRoot":"","sources":["../../../src/utils/hooks/useOnResizeContent.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,kBAAkB,GAAI,UAAU,MAAM,IAAI,qCAqCtD,CAAC"}
@@ -9,8 +9,7 @@ export const useOnResizeContent = (callback) => {
9
9
  });
10
10
  const mutationObserver = new MutationObserver((mutations) => {
11
11
  // Filter out style-only attribute mutations to prevent feedback loops
12
- // with components like ThreadViewportSlack that write styles in response
13
- // to viewport changes
12
+ // with code paths that write styles in response to viewport changes.
14
13
  const hasRelevantMutation = mutations.some((m) => m.type !== "attributes" || m.attributeName !== "style");
15
14
  if (hasRelevantMutation) {
16
15
  callbackRef();
@@ -1 +1 @@
1
- {"version":3,"file":"useOnResizeContent.js","sourceRoot":"","sources":["../../../src/utils/hooks/useOnResizeContent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,2BAAwB;AAEhD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,QAAoB,EAAE,EAAE;IACzD,MAAM,WAAW,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAE7C,MAAM,WAAW,GAAG,WAAW,CAC7B,CAAC,EAAe,EAAE,EAAE;QAClB,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,GAAG,EAAE;YAC7C,WAAW,EAAE,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,CAAC,SAAS,EAAE,EAAE;YAC1D,sEAAsE;YACtE,yEAAyE;YACzE,sBAAsB;YACtB,MAAM,mBAAmB,GAAG,SAAS,CAAC,IAAI,CACxC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,IAAI,CAAC,CAAC,aAAa,KAAK,OAAO,CAC9D,CAAC;YACF,IAAI,mBAAmB,EAAE,CAAC;gBACxB,WAAW,EAAE,CAAC;YAChB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC3B,gBAAgB,CAAC,OAAO,CAAC,EAAE,EAAE;YAC3B,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,IAAI;YAChB,aAAa,EAAE,IAAI;SACpB,CAAC,CAAC;QAEH,OAAO,GAAG,EAAE;YACV,cAAc,CAAC,UAAU,EAAE,CAAC;YAC5B,gBAAgB,CAAC,UAAU,EAAE,CAAC;QAChC,CAAC,CAAC;IACJ,CAAC,EACD,CAAC,WAAW,CAAC,CACd,CAAC;IAEF,OAAO,aAAa,CAAC,WAAW,CAAC,CAAC;AACpC,CAAC,CAAC"}
1
+ {"version":3,"file":"useOnResizeContent.js","sourceRoot":"","sources":["../../../src/utils/hooks/useOnResizeContent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,2BAAwB;AAEhD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,QAAoB,EAAE,EAAE;IACzD,MAAM,WAAW,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAE7C,MAAM,WAAW,GAAG,WAAW,CAC7B,CAAC,EAAe,EAAE,EAAE;QAClB,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,GAAG,EAAE;YAC7C,WAAW,EAAE,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,CAAC,SAAS,EAAE,EAAE;YAC1D,sEAAsE;YACtE,qEAAqE;YACrE,MAAM,mBAAmB,GAAG,SAAS,CAAC,IAAI,CACxC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,IAAI,CAAC,CAAC,aAAa,KAAK,OAAO,CAC9D,CAAC;YACF,IAAI,mBAAmB,EAAE,CAAC;gBACxB,WAAW,EAAE,CAAC;YAChB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC3B,gBAAgB,CAAC,OAAO,CAAC,EAAE,EAAE;YAC3B,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,IAAI;YAChB,aAAa,EAAE,IAAI;SACpB,CAAC,CAAC;QAEH,OAAO,GAAG,EAAE;YACV,cAAc,CAAC,UAAU,EAAE,CAAC;YAC5B,gBAAgB,CAAC,UAAU,EAAE,CAAC;QAChC,CAAC,CAAC;IACJ,CAAC,EACD,CAAC,WAAW,CAAC,CACd,CAAC;IAEF,OAAO,aAAa,CAAC,WAAW,CAAC,CAAC;AACpC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@assistant-ui/react",
3
- "version": "0.12.28",
3
+ "version": "0.14.0",
4
4
  "description": "TypeScript/React library for AI Chat",
5
5
  "keywords": [
6
6
  "radix-ui",
@@ -48,9 +48,9 @@
48
48
  ],
49
49
  "sideEffects": false,
50
50
  "dependencies": {
51
- "@assistant-ui/core": "^0.1.17",
52
- "@assistant-ui/store": "^0.2.9",
53
- "@assistant-ui/tap": "^0.5.10",
51
+ "@assistant-ui/core": "^0.2.0",
52
+ "@assistant-ui/store": "^0.2.10",
53
+ "@assistant-ui/tap": "^0.5.11",
54
54
  "@radix-ui/primitive": "^1.1.3",
55
55
  "@radix-ui/react-compose-refs": "^1.1.2",
56
56
  "@radix-ui/react-context": "^1.1.3",
@@ -58,12 +58,12 @@
58
58
  "@radix-ui/react-use-callback-ref": "^1.1.1",
59
59
  "@radix-ui/react-use-escape-keydown": "^1.1.1",
60
60
  "assistant-cloud": "^0.1.27",
61
- "assistant-stream": "^0.3.12",
62
- "nanoid": "^5.1.9",
61
+ "assistant-stream": "^0.3.13",
62
+ "nanoid": "^5.1.11",
63
63
  "radix-ui": "^1.4.3",
64
64
  "react-textarea-autosize": "^8.5.9",
65
- "zod": "^4.3.6",
66
- "zustand": "^5.0.12"
65
+ "zod": "^4.4.3",
66
+ "zustand": "^5.0.13"
67
67
  },
68
68
  "peerDependencies": {
69
69
  "@types/react": "*",
@@ -85,11 +85,11 @@
85
85
  "@types/node": "^25.6.0",
86
86
  "@types/react": "^19.2.14",
87
87
  "@types/react-dom": "^19.2.3",
88
- "jsdom": "^29.1.0",
88
+ "jsdom": "^29.1.1",
89
89
  "react": "^19.2.5",
90
90
  "react-dom": "^19.2.5",
91
91
  "vitest": "^4.1.5",
92
- "@assistant-ui/x-buildutils": "0.0.6"
92
+ "@assistant-ui/x-buildutils": "0.0.7"
93
93
  },
94
94
  "publishConfig": {
95
95
  "access": "public",
@@ -146,7 +146,6 @@ const MessageClient = resource(
146
146
  branchNumber: 1,
147
147
  branchCount: 1,
148
148
  speech: undefined,
149
- submittedFeedback: undefined,
150
149
  parts: partClients.state,
151
150
  isCopied,
152
151
  isHovering,
@@ -589,7 +588,6 @@ export const ExternalThread = resource(
589
588
  onStartRun?.();
590
589
  },
591
590
  resumeRun: () => {},
592
- unstable_resumeRun: () => {},
593
591
  cancelRun: handleCancelRun,
594
592
  getModelContext: () => ({ tools: {}, config: {} }),
595
593
  export: () => ({ messages: [] }),
@@ -142,6 +142,8 @@ export const InMemoryThreadList = resource(
142
142
  mainThreadId,
143
143
  newThreadId: null,
144
144
  isLoading: false,
145
+ isLoadingMore: false,
146
+ hasMore: false,
145
147
  threadIds: regularThreads.map((t) => t.id),
146
148
  archivedThreadIds: archivedThreads.map((t) => t.id),
147
149
  threadItems: threadListItems.state,
@@ -155,6 +157,7 @@ export const InMemoryThreadList = resource(
155
157
  switchToNewThread: handleSwitchToNewThread,
156
158
  getLoadThreadsPromise: () => RESOLVED_PROMISE,
157
159
  reload: () => RESOLVED_PROMISE,
160
+ loadMore: () => RESOLVED_PROMISE,
158
161
  item: (selector) => {
159
162
  if (selector === "main") {
160
163
  const index = threads.findIndex((t) => t.id === mainThreadId);
@@ -47,6 +47,8 @@ export const SingleThreadList = resource(
47
47
  mainThreadId: THREAD_ID,
48
48
  newThreadId: null,
49
49
  isLoading: false,
50
+ isLoadingMore: false,
51
+ hasMore: false,
50
52
  threadIds: [THREAD_ID],
51
53
  archivedThreadIds: [],
52
54
  threadItems: [itemClient.state],
@@ -65,6 +67,7 @@ export const SingleThreadList = resource(
65
67
  },
66
68
  getLoadThreadsPromise: () => RESOLVED_PROMISE,
67
69
  reload: () => RESOLVED_PROMISE,
70
+ loadMore: () => RESOLVED_PROMISE,
68
71
  item: (selector) => {
69
72
  if (
70
73
  selector !== "main" &&
@@ -19,6 +19,8 @@ export type ThreadViewportProviderProps = PropsWithChildren<{
19
19
 
20
20
  const useThreadViewportStoreValue = (options: ThreadViewportStoreOptions) => {
21
21
  const outerViewport = useThreadViewportStore({ optional: true });
22
+ // Viewport options are initial configuration. Keeping them non-reactive avoids
23
+ // fanout through every message in long threads when anchoring config changes.
22
24
  const [store] = useState(() => makeThreadViewportStore(options));
23
25
 
24
26
  // Forward scrollToBottom from outer viewport to inner viewport
@@ -37,18 +39,6 @@ const useThreadViewportStoreValue = (options: ThreadViewportStoreOptions) => {
37
39
  });
38
40
  }, [store, outerViewport]);
39
41
 
40
- // Sync options to store when they change
41
- useEffect(() => {
42
- const nextState = {
43
- turnAnchor: options.turnAnchor ?? "bottom",
44
- };
45
-
46
- const currentState = store.getState();
47
- if (currentState.turnAnchor !== nextState.turnAnchor) {
48
- writableStore(store).setState(nextState);
49
- }
50
- }, [store, options.turnAnchor]);
51
-
52
42
  return store;
53
43
  };
54
44