@assistant-ui/react 0.12.28 → 0.14.2

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 (187) hide show
  1. package/README.md +58 -42
  2. package/dist/client/ExternalThread.d.ts +7 -0
  3. package/dist/client/ExternalThread.d.ts.map +1 -1
  4. package/dist/client/ExternalThread.js +24 -18
  5. package/dist/client/ExternalThread.js.map +1 -1
  6. package/dist/client/InMemoryThreadList.d.ts.map +1 -1
  7. package/dist/client/InMemoryThreadList.js +3 -0
  8. package/dist/client/InMemoryThreadList.js.map +1 -1
  9. package/dist/client/SingleThreadList.d.ts.map +1 -1
  10. package/dist/client/SingleThreadList.js +3 -0
  11. package/dist/client/SingleThreadList.js.map +1 -1
  12. package/dist/context/providers/ThreadViewportProvider.d.ts.map +1 -1
  13. package/dist/context/providers/ThreadViewportProvider.js +2 -10
  14. package/dist/context/providers/ThreadViewportProvider.js.map +1 -1
  15. package/dist/context/stores/ThreadViewport.d.ts +46 -4
  16. package/dist/context/stores/ThreadViewport.d.ts.map +1 -1
  17. package/dist/context/stores/ThreadViewport.js +51 -7
  18. package/dist/context/stores/ThreadViewport.js.map +1 -1
  19. package/dist/index.d.ts +5 -30
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +3 -28
  22. package/dist/index.js.map +1 -1
  23. package/dist/legacy-runtime/cloud/auiV0.d.ts +10 -1
  24. package/dist/legacy-runtime/cloud/auiV0.d.ts.map +1 -1
  25. package/dist/legacy-runtime/cloud/auiV0.js +21 -3
  26. package/dist/legacy-runtime/cloud/auiV0.js.map +1 -1
  27. package/dist/legacy-runtime/runtime-cores/assistant-transport/utils.d.ts +1 -1
  28. package/dist/legacy-runtime/runtime-cores/assistant-transport/utils.d.ts.map +1 -1
  29. package/dist/legacy-runtime/runtime-cores/assistant-transport/utils.js +1 -1
  30. package/dist/legacy-runtime/runtime-cores/assistant-transport/utils.js.map +1 -1
  31. package/dist/mcp-apps/McpAppRenderer.d.ts +28 -0
  32. package/dist/mcp-apps/McpAppRenderer.d.ts.map +1 -0
  33. package/dist/mcp-apps/McpAppRenderer.js +115 -0
  34. package/dist/mcp-apps/McpAppRenderer.js.map +1 -0
  35. package/dist/mcp-apps/McpAppsRemoteHost.d.ts +3 -0
  36. package/dist/mcp-apps/McpAppsRemoteHost.d.ts.map +1 -0
  37. package/dist/mcp-apps/McpAppsRemoteHost.js +27 -0
  38. package/dist/mcp-apps/McpAppsRemoteHost.js.map +1 -0
  39. package/dist/mcp-apps/app-frame.d.ts +3 -0
  40. package/dist/mcp-apps/app-frame.d.ts.map +1 -0
  41. package/dist/mcp-apps/app-frame.js +203 -0
  42. package/dist/mcp-apps/app-frame.js.map +1 -0
  43. package/dist/mcp-apps/bridge.d.ts +18 -0
  44. package/dist/mcp-apps/bridge.d.ts.map +1 -0
  45. package/dist/mcp-apps/bridge.js +290 -0
  46. package/dist/mcp-apps/bridge.js.map +1 -0
  47. package/dist/mcp-apps/index.d.ts +4 -0
  48. package/dist/mcp-apps/index.d.ts.map +1 -0
  49. package/dist/mcp-apps/index.js +3 -0
  50. package/dist/mcp-apps/index.js.map +1 -0
  51. package/dist/mcp-apps/types.d.ts +144 -0
  52. package/dist/mcp-apps/types.d.ts.map +1 -0
  53. package/dist/mcp-apps/types.js +3 -0
  54. package/dist/mcp-apps/types.js.map +1 -0
  55. package/dist/mcp-apps/utils.d.ts +5 -0
  56. package/dist/mcp-apps/utils.d.ts.map +1 -0
  57. package/dist/mcp-apps/utils.js +10 -0
  58. package/dist/mcp-apps/utils.js.map +1 -0
  59. package/dist/primitives/composer/ComposerInput.d.ts +6 -0
  60. package/dist/primitives/composer/ComposerInput.d.ts.map +1 -1
  61. package/dist/primitives/composer/ComposerInput.js +28 -6
  62. package/dist/primitives/composer/ComposerInput.js.map +1 -1
  63. package/dist/primitives/composer/trigger/TriggerPopover.d.ts.map +1 -1
  64. package/dist/primitives/composer/trigger/TriggerPopover.js +17 -1
  65. package/dist/primitives/composer/trigger/TriggerPopover.js.map +1 -1
  66. package/dist/primitives/composer/trigger/TriggerPopoverRootContext.d.ts +33 -0
  67. package/dist/primitives/composer/trigger/TriggerPopoverRootContext.d.ts.map +1 -1
  68. package/dist/primitives/composer/trigger/TriggerPopoverRootContext.js +80 -11
  69. package/dist/primitives/composer/trigger/TriggerPopoverRootContext.js.map +1 -1
  70. package/dist/primitives/composer/trigger/triggerKeyboardResource.d.ts.map +1 -1
  71. package/dist/primitives/composer/trigger/triggerKeyboardResource.js +2 -1
  72. package/dist/primitives/composer/trigger/triggerKeyboardResource.js.map +1 -1
  73. package/dist/primitives/message/MessageRoot.d.ts +6 -30
  74. package/dist/primitives/message/MessageRoot.d.ts.map +1 -1
  75. package/dist/primitives/message/MessageRoot.js +68 -25
  76. package/dist/primitives/message/MessageRoot.js.map +1 -1
  77. package/dist/primitives/messagePart/useMessagePartSource.d.ts +22 -3
  78. package/dist/primitives/messagePart/useMessagePartSource.d.ts.map +1 -1
  79. package/dist/primitives/thread/ThreadViewport.d.ts +38 -0
  80. package/dist/primitives/thread/ThreadViewport.d.ts.map +1 -1
  81. package/dist/primitives/thread/ThreadViewport.js +53 -5
  82. package/dist/primitives/thread/ThreadViewport.js.map +1 -1
  83. package/dist/primitives/thread/ThreadViewportFooter.d.ts +2 -1
  84. package/dist/primitives/thread/ThreadViewportFooter.d.ts.map +1 -1
  85. package/dist/primitives/thread/ThreadViewportFooter.js +2 -1
  86. package/dist/primitives/thread/ThreadViewportFooter.js.map +1 -1
  87. package/dist/primitives/thread/topAnchor/computeTopAnchorSlack.d.ts +22 -0
  88. package/dist/primitives/thread/topAnchor/computeTopAnchorSlack.d.ts.map +1 -0
  89. package/dist/primitives/thread/topAnchor/computeTopAnchorSlack.js +53 -0
  90. package/dist/primitives/thread/topAnchor/computeTopAnchorSlack.js.map +1 -0
  91. package/dist/primitives/thread/topAnchor/createReserveObservers.d.ts +5 -0
  92. package/dist/primitives/thread/topAnchor/createReserveObservers.d.ts.map +1 -0
  93. package/dist/primitives/thread/topAnchor/createReserveObservers.js +38 -0
  94. package/dist/primitives/thread/topAnchor/createReserveObservers.js.map +1 -0
  95. package/dist/primitives/thread/topAnchor/mountTopAnchorReserve.d.ts +22 -0
  96. package/dist/primitives/thread/topAnchor/mountTopAnchorReserve.d.ts.map +1 -0
  97. package/dist/primitives/thread/topAnchor/mountTopAnchorReserve.js +75 -0
  98. package/dist/primitives/thread/topAnchor/mountTopAnchorReserve.js.map +1 -0
  99. package/dist/primitives/thread/topAnchor/topAnchorTurn.d.ts +15 -0
  100. package/dist/primitives/thread/topAnchor/topAnchorTurn.d.ts.map +1 -0
  101. package/dist/primitives/thread/topAnchor/topAnchorTurn.js +13 -0
  102. package/dist/primitives/thread/topAnchor/topAnchorTurn.js.map +1 -0
  103. package/dist/primitives/thread/topAnchor/topAnchorUtils.d.ts +15 -0
  104. package/dist/primitives/thread/topAnchor/topAnchorUtils.d.ts.map +1 -0
  105. package/dist/primitives/thread/topAnchor/topAnchorUtils.js +51 -0
  106. package/dist/primitives/thread/topAnchor/topAnchorUtils.js.map +1 -0
  107. package/dist/primitives/thread/topAnchor/useTopAnchorReserve.d.ts +7 -0
  108. package/dist/primitives/thread/topAnchor/useTopAnchorReserve.d.ts.map +1 -0
  109. package/dist/primitives/thread/topAnchor/useTopAnchorReserve.js +18 -0
  110. package/dist/primitives/thread/topAnchor/useTopAnchorReserve.js.map +1 -0
  111. package/dist/primitives/thread/useThreadViewportAutoScroll.d.ts.map +1 -1
  112. package/dist/primitives/thread/useThreadViewportAutoScroll.js +13 -1
  113. package/dist/primitives/thread/useThreadViewportAutoScroll.js.map +1 -1
  114. package/dist/primitives/thread.d.ts +0 -1
  115. package/dist/primitives/thread.d.ts.map +1 -1
  116. package/dist/primitives/thread.js +0 -1
  117. package/dist/primitives/thread.js.map +1 -1
  118. package/dist/primitives/threadList/ThreadListLoadMore.d.ts +13 -0
  119. package/dist/primitives/threadList/ThreadListLoadMore.d.ts.map +1 -0
  120. package/dist/primitives/threadList/ThreadListLoadMore.js +11 -0
  121. package/dist/primitives/threadList/ThreadListLoadMore.js.map +1 -0
  122. package/dist/primitives/threadList.d.ts +1 -0
  123. package/dist/primitives/threadList.d.ts.map +1 -1
  124. package/dist/primitives/threadList.js +1 -0
  125. package/dist/primitives/threadList.js.map +1 -1
  126. package/dist/utils/hooks/useManagedRef.d.ts.map +1 -1
  127. package/dist/utils/hooks/useManagedRef.js +1 -0
  128. package/dist/utils/hooks/useManagedRef.js.map +1 -1
  129. package/dist/utils/hooks/useOnResizeContent.d.ts.map +1 -1
  130. package/dist/utils/hooks/useOnResizeContent.js +1 -2
  131. package/dist/utils/hooks/useOnResizeContent.js.map +1 -1
  132. package/package.json +13 -13
  133. package/src/client/ExternalThread.ts +32 -19
  134. package/src/client/InMemoryThreadList.ts +3 -0
  135. package/src/client/SingleThreadList.ts +3 -0
  136. package/src/context/providers/ThreadViewportProvider.tsx +2 -12
  137. package/src/context/stores/ThreadViewport.ts +111 -11
  138. package/src/index.ts +20 -34
  139. package/src/legacy-runtime/cloud/auiV0.ts +37 -4
  140. package/src/legacy-runtime/runtime-cores/assistant-transport/utils.ts +1 -5
  141. package/src/mcp-apps/McpAppRenderer.tsx +215 -0
  142. package/src/mcp-apps/McpAppsRemoteHost.ts +52 -0
  143. package/src/mcp-apps/app-frame.tsx +280 -0
  144. package/src/mcp-apps/bridge.test.ts +391 -0
  145. package/src/mcp-apps/bridge.ts +435 -0
  146. package/src/mcp-apps/index.ts +16 -0
  147. package/src/mcp-apps/types.ts +158 -0
  148. package/src/mcp-apps/utils.ts +16 -0
  149. package/src/primitives/composer/ComposerInput.test.tsx +280 -0
  150. package/src/primitives/composer/ComposerInput.tsx +29 -6
  151. package/src/primitives/composer/trigger/TriggerPopover.tsx +21 -1
  152. package/src/primitives/composer/trigger/TriggerPopoverRootContext.test.tsx +152 -0
  153. package/src/primitives/composer/trigger/TriggerPopoverRootContext.tsx +134 -17
  154. package/src/primitives/composer/trigger/triggerKeyboardResource.test.ts +236 -0
  155. package/src/primitives/composer/trigger/triggerKeyboardResource.ts +2 -1
  156. package/src/primitives/message/MessageRoot.tsx +135 -57
  157. package/src/primitives/thread/ThreadViewport.tsx +95 -4
  158. package/src/primitives/thread/ThreadViewportFooter.tsx +2 -1
  159. package/src/primitives/thread/topAnchor/computeTopAnchorSlack.test.ts +131 -0
  160. package/src/primitives/thread/topAnchor/computeTopAnchorSlack.ts +94 -0
  161. package/src/primitives/thread/topAnchor/createReserveObservers.ts +50 -0
  162. package/src/primitives/thread/topAnchor/mountTopAnchorReserve.test.ts +131 -0
  163. package/src/primitives/thread/topAnchor/mountTopAnchorReserve.ts +127 -0
  164. package/src/primitives/thread/topAnchor/topAnchorTurn.test.ts +46 -0
  165. package/src/primitives/thread/topAnchor/topAnchorTurn.ts +30 -0
  166. package/src/primitives/thread/topAnchor/topAnchorUtils.ts +58 -0
  167. package/src/primitives/thread/topAnchor/useTopAnchorReserve.ts +19 -0
  168. package/src/primitives/thread/useThreadViewportAutoScroll.ts +15 -1
  169. package/src/primitives/thread.ts +0 -1
  170. package/src/primitives/threadList/ThreadListLoadMore.tsx +24 -0
  171. package/src/primitives/threadList.ts +1 -0
  172. package/src/tests/BaseComposerRuntimeCore.test.ts +4 -0
  173. package/src/tests/RemoteThreadListRuntime.adapterProvider.test.tsx +138 -0
  174. package/src/tests/RemoteThreadListRuntime.deferredProvider.test.tsx +28 -17
  175. package/src/tests/auiV0Encode.test.ts +55 -0
  176. package/src/utils/hooks/useManagedRef.ts +1 -0
  177. package/src/utils/hooks/useOnResizeContent.ts +1 -2
  178. package/dist/legacy-runtime/runtime-cores/external-store/getExternalStoreMessage.d.ts +0 -3
  179. package/dist/legacy-runtime/runtime-cores/external-store/getExternalStoreMessage.d.ts.map +0 -1
  180. package/dist/legacy-runtime/runtime-cores/external-store/getExternalStoreMessage.js +0 -3
  181. package/dist/legacy-runtime/runtime-cores/external-store/getExternalStoreMessage.js.map +0 -1
  182. package/dist/primitives/thread/ThreadViewportSlack.d.ts +0 -20
  183. package/dist/primitives/thread/ThreadViewportSlack.d.ts.map +0 -1
  184. package/dist/primitives/thread/ThreadViewportSlack.js +0 -80
  185. package/dist/primitives/thread/ThreadViewportSlack.js.map +0 -1
  186. package/src/legacy-runtime/runtime-cores/external-store/getExternalStoreMessage.ts +0 -6
  187. 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,7 +1,7 @@
1
1
  {
2
2
  "name": "@assistant-ui/react",
3
- "version": "0.12.28",
4
- "description": "TypeScript/React library for AI Chat",
3
+ "version": "0.14.2",
4
+ "description": "Open-source TypeScript/React library for building production-grade AI chat experiences",
5
5
  "keywords": [
6
6
  "radix-ui",
7
7
  "nextjs",
@@ -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.2",
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,13 @@
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.14",
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
+ "safe-content-frame": "^0.0.18",
66
+ "zod": "^4.4.3",
67
+ "zustand": "^5.0.13"
67
68
  },
68
69
  "peerDependencies": {
69
70
  "@types/react": "*",
@@ -85,15 +86,14 @@
85
86
  "@types/node": "^25.6.0",
86
87
  "@types/react": "^19.2.14",
87
88
  "@types/react-dom": "^19.2.3",
88
- "jsdom": "^29.1.0",
89
+ "jsdom": "^29.1.1",
89
90
  "react": "^19.2.5",
90
91
  "react-dom": "^19.2.5",
91
92
  "vitest": "^4.1.5",
92
- "@assistant-ui/x-buildutils": "0.0.6"
93
+ "@assistant-ui/x-buildutils": "0.0.7"
93
94
  },
94
95
  "publishConfig": {
95
- "access": "public",
96
- "provenance": true
96
+ "access": "public"
97
97
  },
98
98
  "homepage": "https://www.assistant-ui.com/",
99
99
  "repository": {