@assistant-ui/react 0.11.37 → 0.11.39

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 (139) hide show
  1. package/dist/client/AssistantClient.d.ts.map +1 -1
  2. package/dist/client/AssistantClient.js +14 -30
  3. package/dist/client/AssistantClient.js.map +1 -1
  4. package/dist/client/ModelContextClient.d.ts +1 -1
  5. package/dist/client/NoOpComposerClient.d.ts +1 -1
  6. package/dist/client/ThreadMessageClient.d.ts +1 -1
  7. package/dist/client/Tools.d.ts +1 -1
  8. package/dist/client/Tools.d.ts.map +1 -1
  9. package/dist/client/Tools.js +29 -18
  10. package/dist/client/Tools.js.map +1 -1
  11. package/dist/client/types/Tools.d.ts +6 -1
  12. package/dist/client/types/Tools.d.ts.map +1 -1
  13. package/dist/context/react/AssistantApiContext.d.ts +2 -4
  14. package/dist/context/react/AssistantApiContext.d.ts.map +1 -1
  15. package/dist/context/react/AssistantApiContext.js +0 -7
  16. package/dist/context/react/AssistantApiContext.js.map +1 -1
  17. package/dist/context/react/hooks/useAssistantState.js +2 -2
  18. package/dist/context/react/hooks/useAssistantState.js.map +1 -1
  19. package/dist/legacy-runtime/RuntimeAdapter.d.ts +1 -1
  20. package/dist/legacy-runtime/client/AttachmentRuntimeClient.d.ts +1 -1
  21. package/dist/legacy-runtime/client/ComposerRuntimeClient.d.ts +1 -1
  22. package/dist/legacy-runtime/client/EventManagerRuntimeClient.d.ts +1 -1
  23. package/dist/legacy-runtime/client/MessagePartRuntimeClient.d.ts +1 -1
  24. package/dist/legacy-runtime/client/MessageRuntimeClient.d.ts +1 -1
  25. package/dist/legacy-runtime/client/ThreadListItemRuntimeClient.d.ts +1 -1
  26. package/dist/legacy-runtime/client/ThreadListRuntimeClient.d.ts +1 -1
  27. package/dist/legacy-runtime/client/ThreadRuntimeClient.d.ts +1 -1
  28. package/dist/legacy-runtime/cloud/auiV0.js.map +1 -1
  29. package/dist/legacy-runtime/runtime-cores/external-store/ThreadMessageLike.d.ts +2 -2
  30. package/dist/legacy-runtime/runtime-cores/external-store/ThreadMessageLike.d.ts.map +1 -1
  31. package/dist/legacy-runtime/runtime-cores/external-store/ThreadMessageLike.js +2 -0
  32. package/dist/legacy-runtime/runtime-cores/external-store/ThreadMessageLike.js.map +1 -1
  33. package/dist/legacy-runtime/runtime-cores/local/LocalThreadRuntimeCore.d.ts.map +1 -1
  34. package/dist/legacy-runtime/runtime-cores/local/LocalThreadRuntimeCore.js +7 -4
  35. package/dist/legacy-runtime/runtime-cores/local/LocalThreadRuntimeCore.js.map +1 -1
  36. package/dist/legacy-runtime/runtime-cores/remote-thread-list/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
  37. package/dist/legacy-runtime/runtime-cores/remote-thread-list/RemoteThreadListThreadListRuntimeCore.js +34 -1
  38. package/dist/legacy-runtime/runtime-cores/remote-thread-list/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
  39. package/dist/legacy-runtime/runtime-cores/remote-thread-list/adapter/cloud.d.ts.map +1 -1
  40. package/dist/legacy-runtime/runtime-cores/remote-thread-list/adapter/cloud.js +9 -0
  41. package/dist/legacy-runtime/runtime-cores/remote-thread-list/adapter/cloud.js.map +1 -1
  42. package/dist/legacy-runtime/runtime-cores/remote-thread-list/adapter/in-memory.d.ts +2 -1
  43. package/dist/legacy-runtime/runtime-cores/remote-thread-list/adapter/in-memory.d.ts.map +1 -1
  44. package/dist/legacy-runtime/runtime-cores/remote-thread-list/adapter/in-memory.js +3 -0
  45. package/dist/legacy-runtime/runtime-cores/remote-thread-list/adapter/in-memory.js.map +1 -1
  46. package/dist/legacy-runtime/runtime-cores/remote-thread-list/types.d.ts +1 -0
  47. package/dist/legacy-runtime/runtime-cores/remote-thread-list/types.d.ts.map +1 -1
  48. package/dist/legacy-runtime/runtime-cores/utils/MessageRepository.d.ts +7 -2
  49. package/dist/legacy-runtime/runtime-cores/utils/MessageRepository.d.ts.map +1 -1
  50. package/dist/legacy-runtime/runtime-cores/utils/MessageRepository.js +17 -3
  51. package/dist/legacy-runtime/runtime-cores/utils/MessageRepository.js.map +1 -1
  52. package/dist/model-context/index.d.ts +1 -1
  53. package/dist/model-context/index.d.ts.map +1 -1
  54. package/dist/model-context/index.js +0 -4
  55. package/dist/model-context/index.js.map +1 -1
  56. package/dist/model-context/makeAssistantVisible.d.ts.map +1 -1
  57. package/dist/model-context/makeAssistantVisible.js +21 -8
  58. package/dist/model-context/makeAssistantVisible.js.map +1 -1
  59. package/dist/model-context/toolbox.d.ts +1 -19
  60. package/dist/model-context/toolbox.d.ts.map +1 -1
  61. package/dist/model-context/toolbox.js +0 -13
  62. package/dist/model-context/toolbox.js.map +1 -1
  63. package/dist/model-context/useAssistantTool.js +1 -1
  64. package/dist/model-context/useAssistantTool.js.map +1 -1
  65. package/dist/model-context/useAssistantToolUI.js +1 -1
  66. package/dist/model-context/useAssistantToolUI.js.map +1 -1
  67. package/dist/primitives/assistantModal/scope.d.ts +2 -3
  68. package/dist/primitives/assistantModal/scope.d.ts.map +1 -1
  69. package/dist/primitives/assistantModal/scope.js.map +1 -1
  70. package/dist/primitives/index.d.ts +1 -0
  71. package/dist/primitives/index.d.ts.map +1 -1
  72. package/dist/primitives/index.js +2 -0
  73. package/dist/primitives/index.js.map +1 -1
  74. package/dist/primitives/message/MessageParts.d.ts.map +1 -1
  75. package/dist/primitives/message/MessageParts.js +4 -2
  76. package/dist/primitives/message/MessageParts.js.map +1 -1
  77. package/dist/primitives/message/MessagePartsGrouped.d.ts.map +1 -1
  78. package/dist/primitives/message/MessagePartsGrouped.js +4 -2
  79. package/dist/primitives/message/MessagePartsGrouped.js.map +1 -1
  80. package/dist/primitives/messagePart/useMessagePartData.d.ts +3 -0
  81. package/dist/primitives/messagePart/useMessagePartData.d.ts.map +1 -0
  82. package/dist/primitives/messagePart/useMessagePartData.js +23 -0
  83. package/dist/primitives/messagePart/useMessagePartData.js.map +1 -0
  84. package/dist/primitives/thread/useThreadViewportAutoScroll.d.ts.map +1 -1
  85. package/dist/primitives/thread/useThreadViewportAutoScroll.js +11 -12
  86. package/dist/primitives/thread/useThreadViewportAutoScroll.js.map +1 -1
  87. package/dist/tests/setup.js +287 -125
  88. package/dist/tests/setup.js.map +1 -1
  89. package/dist/types/AssistantTypes.d.ts +2 -2
  90. package/dist/types/AssistantTypes.d.ts.map +1 -1
  91. package/dist/types/MessagePartTypes.d.ts +6 -1
  92. package/dist/types/MessagePartTypes.d.ts.map +1 -1
  93. package/dist/types/index.d.ts +1 -1
  94. package/dist/types/index.d.ts.map +1 -1
  95. package/dist/utils/tap-store/derived-scopes.d.ts +1 -1
  96. package/dist/utils/tap-store/derived-scopes.d.ts.map +1 -1
  97. package/package.json +9 -9
  98. package/src/client/AssistantClient.ts +14 -33
  99. package/src/client/Tools.ts +31 -22
  100. package/src/client/types/Tools.ts +11 -2
  101. package/src/context/react/AssistantApiContext.tsx +2 -11
  102. package/src/context/react/hooks/useAssistantState.tsx +2 -2
  103. package/src/legacy-runtime/cloud/auiV0.ts +1 -1
  104. package/src/legacy-runtime/runtime-cores/external-store/ThreadMessageLike.tsx +10 -1
  105. package/src/legacy-runtime/runtime-cores/local/LocalThreadRuntimeCore.tsx +7 -3
  106. package/src/legacy-runtime/runtime-cores/remote-thread-list/RemoteThreadListThreadListRuntimeCore.tsx +49 -2
  107. package/src/legacy-runtime/runtime-cores/remote-thread-list/adapter/cloud.tsx +10 -0
  108. package/src/legacy-runtime/runtime-cores/remote-thread-list/adapter/in-memory.tsx +5 -0
  109. package/src/legacy-runtime/runtime-cores/remote-thread-list/types.tsx +1 -0
  110. package/src/legacy-runtime/runtime-cores/utils/MessageRepository.tsx +27 -3
  111. package/src/model-context/index.ts +1 -6
  112. package/src/model-context/makeAssistantVisible.tsx +23 -12
  113. package/src/model-context/toolbox.tsx +1 -21
  114. package/src/model-context/useAssistantTool.tsx +1 -1
  115. package/src/model-context/useAssistantToolUI.tsx +1 -1
  116. package/src/primitives/assistantModal/scope.tsx +3 -1
  117. package/src/primitives/index.ts +1 -0
  118. package/src/primitives/message/MessageParts.tsx +5 -3
  119. package/src/primitives/message/MessagePartsGrouped.tsx +5 -3
  120. package/src/primitives/messagePart/useMessagePartData.tsx +24 -0
  121. package/src/primitives/thread/useThreadViewportAutoScroll.tsx +14 -13
  122. package/src/types/AssistantTypes.ts +2 -0
  123. package/src/types/MessagePartTypes.ts +8 -1
  124. package/src/types/index.ts +1 -0
  125. package/dist/client/ToolUIClient.d.ts +0 -7
  126. package/dist/client/ToolUIClient.d.ts.map +0 -1
  127. package/dist/client/ToolUIClient.js +0 -71
  128. package/dist/client/ToolUIClient.js.map +0 -1
  129. package/dist/client/ToolUIContext.d.ts +0 -4
  130. package/dist/client/ToolUIContext.d.ts.map +0 -1
  131. package/dist/client/ToolUIContext.js +0 -20
  132. package/dist/client/ToolUIContext.js.map +0 -1
  133. package/dist/client/types/ToolUI.d.ts +0 -23
  134. package/dist/client/types/ToolUI.d.ts.map +0 -1
  135. package/dist/client/types/ToolUI.js +0 -1
  136. package/dist/client/types/ToolUI.js.map +0 -1
  137. package/src/client/ToolUIClient.ts +0 -76
  138. package/src/client/ToolUIContext.ts +0 -22
  139. package/src/client/types/ToolUI.ts +0 -27
@@ -1,4 +1,5 @@
1
1
  import type { ThreadMessage } from "../../../types";
2
+ import { RunConfig } from "../../../types/AssistantTypes";
2
3
  import { generateId, generateOptimisticId } from "../../../utils/idUtils";
3
4
  import { ThreadMessageLike } from "../external-store";
4
5
  import { getAutoStatus } from "../external-store/auto-status";
@@ -34,6 +35,8 @@ export type ExportedMessageRepositoryItem = {
34
35
  message: ThreadMessage;
35
36
  /** ID of the parent message, or null for root messages */
36
37
  parentId: string | null;
38
+ /** The run configuration for the message */
39
+ runConfig?: RunConfig;
37
40
  };
38
41
 
39
42
  /**
@@ -46,6 +49,7 @@ export type ExportedMessageRepository = {
46
49
  messages: Array<{
47
50
  message: ThreadMessage;
48
51
  parentId: string | null;
52
+ runConfig?: RunConfig;
49
53
  }>;
50
54
  };
51
55
 
@@ -248,10 +252,30 @@ export class MessageRepository {
248
252
 
249
253
  /**
250
254
  * Gets all messages in the current active branch, from root to head.
251
- * @returns Array of messages in the current branch
255
+ * @param headId - Optional ID of the head message to get messages for. If not provided, uses the current head.
256
+ * @returns Array of messages in the specified branch
252
257
  */
253
- getMessages() {
254
- return this._messages.value;
258
+ getMessages(headId?: string) {
259
+ if (headId === undefined || headId === this.head?.current.id) {
260
+ return this._messages.value;
261
+ }
262
+
263
+ const headMessage = this.messages.get(headId);
264
+ if (!headMessage) {
265
+ throw new Error(
266
+ "MessageRepository(getMessages): Head message not found. This is likely an internal bug in assistant-ui.",
267
+ );
268
+ }
269
+
270
+ const messages = new Array<ThreadMessage>(headMessage.level + 1);
271
+ for (
272
+ let current: RepositoryMessage | null = headMessage;
273
+ current;
274
+ current = current.prev
275
+ ) {
276
+ messages[current.level] = current.current;
277
+ }
278
+ return messages;
255
279
  }
256
280
 
257
281
  /**
@@ -19,12 +19,7 @@ export { tool } from "./tool";
19
19
 
20
20
  export { makeAssistantVisible } from "./makeAssistantVisible";
21
21
 
22
- export {
23
- Toolkit,
24
- type ToolDefinition,
25
- type ToolkitFallback,
26
- type ToolkitLayout,
27
- } from "./toolbox";
22
+ export type { Toolkit, ToolDefinition } from "./toolbox";
28
23
 
29
24
  export { Tools } from "../client/Tools";
30
25
 
@@ -11,18 +11,21 @@ import {
11
11
  createContext,
12
12
  useContext,
13
13
  } from "react";
14
- import { z } from "zod";
15
14
  import { useAssistantApi } from "../context/react/AssistantApiContext";
16
15
  import { useComposedRefs } from "@radix-ui/react-compose-refs";
17
16
  import { tool } from "./tool";
18
17
 
19
- // TODO replace zod with json-schema so we can drop the zod dep
20
-
21
18
  const click = tool({
22
- parameters: z.object({
23
- clickId: z.string(),
24
- }),
25
- execute: async ({ clickId }) => {
19
+ parameters: {
20
+ type: "object",
21
+ properties: {
22
+ clickId: {
23
+ type: "string",
24
+ },
25
+ },
26
+ required: ["clickId"],
27
+ },
28
+ execute: async ({ clickId }: { clickId: string }) => {
26
29
  const escapedClickId = CSS.escape(clickId);
27
30
  const el = document.querySelector(`[data-click-id='${escapedClickId}']`);
28
31
  if (el instanceof HTMLElement) {
@@ -38,11 +41,19 @@ const click = tool({
38
41
  });
39
42
 
40
43
  const edit = tool({
41
- parameters: z.object({
42
- editId: z.string(),
43
- value: z.string(),
44
- }),
45
- execute: async ({ editId, value }) => {
44
+ parameters: {
45
+ type: "object",
46
+ properties: {
47
+ editId: {
48
+ type: "string",
49
+ },
50
+ value: {
51
+ type: "string",
52
+ },
53
+ },
54
+ required: ["editId", "value"],
55
+ },
56
+ execute: async ({ editId, value }: { editId: string; value: string }) => {
46
57
  const escapedEditId = CSS.escape(editId);
47
58
  const el = document.querySelector(`[data-edit-id='${escapedEditId}']`);
48
59
  if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement) {
@@ -1,6 +1,5 @@
1
1
  "use client";
2
2
 
3
- import type { ComponentType, ReactNode } from "react";
4
3
  import type { Tool } from "assistant-stream";
5
4
  import type { ToolCallMessagePartComponent } from "../types/MessagePartComponentTypes";
6
5
 
@@ -11,26 +10,7 @@ export type ToolDefinition<
11
10
  render?: ToolCallMessagePartComponent<TArgs, TResult> | undefined;
12
11
  };
13
12
 
14
- export const FallbackSymbol = Symbol("Toolkit.Fallback");
15
- export const LayoutSymbol = Symbol("Toolkit.Layout");
16
-
17
- export type ToolkitFallback = {
18
- render: ToolCallMessagePartComponent<unknown, unknown>;
19
- };
20
-
21
- export type ToolkitLayout = {
22
- render: ComponentType<{ children: ReactNode }>;
23
- };
24
-
25
- export type Toolkit = Record<string, ToolDefinition<any, any>> & {
26
- [FallbackSymbol]?: ToolkitFallback;
27
- [LayoutSymbol]?: ToolkitLayout;
28
- };
29
-
30
- export const Toolkit = {
31
- Fallback: FallbackSymbol,
32
- Layout: LayoutSymbol,
33
- } as const;
13
+ export type Toolkit = Record<string, ToolDefinition<any, any>>;
34
14
 
35
15
  export type ToolsConfig = {
36
16
  toolkit: Toolkit;
@@ -23,7 +23,7 @@ export const useAssistantTool = <
23
23
 
24
24
  useEffect(() => {
25
25
  if (!tool.render) return undefined;
26
- return api.toolUIs().setToolUI(tool.toolName, tool.render);
26
+ return api.tools().setToolUI(tool.toolName, tool.render);
27
27
  }, [api, tool.toolName, tool.render]);
28
28
 
29
29
  useEffect(() => {
@@ -15,6 +15,6 @@ export const useAssistantToolUI = (
15
15
  const api = useAssistantApi();
16
16
  useEffect(() => {
17
17
  if (!tool?.toolName || !tool?.render) return undefined;
18
- return api.toolUIs().setToolUI(tool.toolName, tool.render);
18
+ return api.tools().setToolUI(tool.toolName, tool.render);
19
19
  }, [api, tool?.toolName, tool?.render]);
20
20
  };
@@ -1,5 +1,7 @@
1
1
  import * as PopoverPrimitive from "@radix-ui/react-popover";
2
2
  import type { Scope } from "@radix-ui/react-context";
3
3
 
4
- export const usePopoverScope = PopoverPrimitive.createPopoverScope();
4
+ export const usePopoverScope: ReturnType<
5
+ typeof PopoverPrimitive.createPopoverScope
6
+ > = PopoverPrimitive.createPopoverScope();
5
7
  export type ScopedProps<P> = P & { __scopeAssistantModal?: Scope };
@@ -15,5 +15,6 @@ export { useMessagePartReasoning } from "./messagePart/useMessagePartReasoning";
15
15
  export { useMessagePartSource } from "./messagePart/useMessagePartSource";
16
16
  export { useMessagePartFile } from "./messagePart/useMessagePartFile";
17
17
  export { useMessagePartImage } from "./messagePart/useMessagePartImage";
18
+ export { useMessagePartData } from "./messagePart/useMessagePartData";
18
19
  export { useThreadViewportAutoScroll } from "./thread/useThreadViewportAutoScroll";
19
20
  export { useScrollLock } from "./reasoning";
@@ -252,9 +252,8 @@ const ToolUIDisplay = ({
252
252
  }: {
253
253
  Fallback: ToolCallMessagePartComponent | undefined;
254
254
  } & ToolCallMessagePartProps) => {
255
- const Render = useAssistantState(({ toolUIs }) => {
256
- const Render =
257
- toolUIs.tools[props.toolName] ?? toolUIs.fallback ?? Fallback;
255
+ const Render = useAssistantState(({ tools }) => {
256
+ const Render = tools.tools[props.toolName] ?? Fallback;
258
257
  if (Array.isArray(Render)) return Render[0] ?? Fallback;
259
258
  return Render;
260
259
  });
@@ -338,6 +337,9 @@ const MessagePartComponent: FC<MessagePartComponentProps> = ({
338
337
  case "audio":
339
338
  return <Audio {...part} />;
340
339
 
340
+ case "data":
341
+ return null;
342
+
341
343
  default:
342
344
  const unhandledType: never = type;
343
345
  throw new Error(`Unknown message part type: ${unhandledType}`);
@@ -220,9 +220,8 @@ const ToolUIDisplay = ({
220
220
  }: {
221
221
  Fallback: ToolCallMessagePartComponent | undefined;
222
222
  } & ToolCallMessagePartProps) => {
223
- const Render = useAssistantState(({ toolUIs }) => {
224
- const Render =
225
- toolUIs.tools[props.toolName] ?? toolUIs.fallback ?? Fallback;
223
+ const Render = useAssistantState(({ tools }) => {
224
+ const Render = tools.tools[props.toolName] ?? Fallback;
226
225
  if (Array.isArray(Render)) return Render[0] ?? Fallback;
227
226
  return Render;
228
227
  });
@@ -305,6 +304,9 @@ const MessagePartComponent: FC<MessagePartComponentProps> = ({
305
304
  case "audio":
306
305
  return <Audio {...part} />;
307
306
 
307
+ case "data":
308
+ return null;
309
+
308
310
  default:
309
311
  const unhandledType: never = type;
310
312
  throw new Error(`Unknown message part type: ${unhandledType}`);
@@ -0,0 +1,24 @@
1
+ "use client";
2
+
3
+ import { useAssistantState } from "../../context";
4
+ import { DataMessagePart } from "../../types";
5
+
6
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
7
+ export const useMessagePartData = <T = any,>(name?: string) => {
8
+ const part = useAssistantState(({ part }) => {
9
+ if (part.type !== "data") {
10
+ return null;
11
+ }
12
+ return part as DataMessagePart<T>;
13
+ });
14
+
15
+ if (!part) {
16
+ return null;
17
+ }
18
+
19
+ if (name && part.name !== name) {
20
+ return null;
21
+ }
22
+
23
+ return part;
24
+ };
@@ -28,16 +28,13 @@ export const useThreadViewportAutoScroll = <TElement extends HTMLElement>({
28
28
  // fix: delay the state change until the scroll is done
29
29
  const isScrollingToBottomRef = useRef(false);
30
30
 
31
- const scrollToBottom = useCallback(
32
- (behavior: ScrollBehavior) => {
33
- const div = divRef.current;
34
- if (!div || !autoScroll) return;
31
+ const scrollToBottom = useCallback((behavior: ScrollBehavior) => {
32
+ const div = divRef.current;
33
+ if (!div) return;
35
34
 
36
- isScrollingToBottomRef.current = true;
37
- div.scrollTo({ top: div.scrollHeight, behavior });
38
- },
39
- [autoScroll],
40
- );
35
+ isScrollingToBottomRef.current = true;
36
+ div.scrollTo({ top: div.scrollHeight, behavior });
37
+ }, []);
41
38
 
42
39
  const handleScroll = () => {
43
40
  const div = divRef.current;
@@ -45,7 +42,8 @@ export const useThreadViewportAutoScroll = <TElement extends HTMLElement>({
45
42
 
46
43
  const isAtBottom = threadViewportStore.getState().isAtBottom;
47
44
  const newIsAtBottom =
48
- div.scrollHeight - div.scrollTop <= div.clientHeight + 1; // TODO figure out why +1 is needed
45
+ Math.abs(div.scrollHeight - div.scrollTop - div.clientHeight) < 1 ||
46
+ div.scrollHeight <= div.clientHeight;
49
47
 
50
48
  if (!newIsAtBottom && lastScrollTop.current < div.scrollTop) {
51
49
  // ignore scroll down
@@ -66,8 +64,9 @@ export const useThreadViewportAutoScroll = <TElement extends HTMLElement>({
66
64
 
67
65
  const resizeRef = useOnResizeContent(() => {
68
66
  if (
69
- isScrollingToBottomRef.current ||
70
- threadViewportStore.getState().isAtBottom
67
+ autoScroll &&
68
+ (isScrollingToBottomRef.current ||
69
+ threadViewportStore.getState().isAtBottom)
71
70
  ) {
72
71
  scrollToBottom("instant");
73
72
  }
@@ -87,7 +86,9 @@ export const useThreadViewportAutoScroll = <TElement extends HTMLElement>({
87
86
  });
88
87
 
89
88
  // autoscroll on run start
90
- useAssistantEvent("thread.run-start", () => scrollToBottom("auto"));
89
+ useAssistantEvent("thread.run-start", () => {
90
+ if (autoScroll) scrollToBottom("auto");
91
+ });
91
92
 
92
93
  const autoScrollRef = useComposedRefs<TElement>(resizeRef, scrollRef, divRef);
93
94
  return autoScrollRef as RefCallback<TElement>;
@@ -6,6 +6,7 @@ import type {
6
6
  SourceMessagePart,
7
7
  ImageMessagePart,
8
8
  FileMessagePart,
9
+ DataMessagePart,
9
10
  Unstable_AudioMessagePart,
10
11
  ToolCallMessagePart,
11
12
  ThreadUserMessagePart,
@@ -19,6 +20,7 @@ export type {
19
20
  SourceMessagePart,
20
21
  ImageMessagePart,
21
22
  FileMessagePart,
23
+ DataMessagePart,
22
24
  Unstable_AudioMessagePart,
23
25
  ToolCallMessagePart,
24
26
  ThreadUserMessagePart,
@@ -43,6 +43,12 @@ export type Unstable_AudioMessagePart = {
43
43
  };
44
44
  };
45
45
 
46
+ export type DataMessagePart<T = any> = {
47
+ readonly type: "data";
48
+ readonly name: string;
49
+ readonly data: T;
50
+ };
51
+
46
52
  export type ToolCallMessagePart<
47
53
  TArgs = ReadonlyJSONObject,
48
54
  TResult = unknown,
@@ -72,4 +78,5 @@ export type ThreadAssistantMessagePart =
72
78
  | ToolCallMessagePart
73
79
  | SourceMessagePart
74
80
  | FileMessagePart
75
- | ImageMessagePart;
81
+ | ImageMessagePart
82
+ | DataMessagePart;
@@ -12,6 +12,7 @@ export type {
12
12
  SourceMessagePart,
13
13
  ImageMessagePart,
14
14
  FileMessagePart,
15
+ DataMessagePart,
15
16
  Unstable_AudioMessagePart,
16
17
  ToolCallMessagePart,
17
18
  MessageStatus,
@@ -1,7 +0,0 @@
1
- import { ToolUIApi } from "./types/ToolUI";
2
- export declare const ToolUIClient: import("@assistant-ui/tap").ResourceElementConstructor<{
3
- key: string | undefined;
4
- state: any;
5
- api: ToolUIApi;
6
- }, undefined>;
7
- //# sourceMappingURL=ToolUIClient.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ToolUIClient.d.ts","sourceRoot":"","sources":["../../src/client/ToolUIClient.ts"],"names":[],"mappings":"AAEA,OAAO,EAAe,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAExD,eAAO,MAAM,YAAY;;;;aAuEvB,CAAC"}
@@ -1,71 +0,0 @@
1
- // src/client/ToolUIClient.ts
2
- import { resource, tapState } from "@assistant-ui/tap";
3
- import { tapApi } from "../utils/tap-store/index.js";
4
- var ToolUIClient = resource(() => {
5
- const [state, setState] = tapState(() => ({
6
- tools: {},
7
- fallback: [],
8
- layout: []
9
- }));
10
- return tapApi({
11
- getState: () => state,
12
- setToolUI: (toolName, render) => {
13
- setState((prev) => {
14
- return {
15
- ...prev,
16
- tools: {
17
- ...prev.tools,
18
- [toolName]: [...prev.tools[toolName] ?? [], render]
19
- }
20
- };
21
- });
22
- return () => {
23
- setState((prev) => {
24
- return {
25
- ...prev,
26
- tools: {
27
- ...prev.tools,
28
- [toolName]: prev.tools[toolName]?.filter((r) => r !== render) ?? []
29
- }
30
- };
31
- });
32
- };
33
- },
34
- setFallbackToolUI: (render) => {
35
- setState((prev) => {
36
- return {
37
- ...prev,
38
- fallback: [...prev.fallback, render]
39
- };
40
- });
41
- return () => {
42
- setState((prev) => {
43
- return {
44
- ...prev,
45
- fallback: prev.fallback.filter((r) => r !== render)
46
- };
47
- });
48
- };
49
- },
50
- setToolUILayout: (render) => {
51
- setState((prev) => {
52
- return {
53
- ...prev,
54
- layout: [...prev.layout, render]
55
- };
56
- });
57
- return () => {
58
- setState((prev) => {
59
- return {
60
- ...prev,
61
- layout: prev.layout.filter((r) => r !== render)
62
- };
63
- });
64
- };
65
- }
66
- });
67
- });
68
- export {
69
- ToolUIClient
70
- };
71
- //# sourceMappingURL=ToolUIClient.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/client/ToolUIClient.ts"],"sourcesContent":["import { resource, tapState } from \"@assistant-ui/tap\";\nimport { tapApi } from \"../utils/tap-store\";\nimport { ToolUIState, ToolUIApi } from \"./types/ToolUI\";\n\nexport const ToolUIClient = resource(() => {\n const [state, setState] = tapState<ToolUIState>(() => ({\n tools: {},\n fallback: [],\n layout: [],\n }));\n\n return tapApi<ToolUIApi>({\n getState: () => state,\n\n setToolUI: (toolName, render) => {\n setState((prev) => {\n return {\n ...prev,\n tools: {\n ...prev.tools,\n [toolName]: [...(prev.tools[toolName] ?? []), render],\n },\n };\n });\n\n return () => {\n setState((prev) => {\n return {\n ...prev,\n tools: {\n ...prev.tools,\n [toolName]:\n prev.tools[toolName]?.filter((r) => r !== render) ?? [],\n },\n };\n });\n };\n },\n\n setFallbackToolUI: (render) => {\n setState((prev) => {\n return {\n ...prev,\n fallback: [...prev.fallback, render],\n };\n });\n\n return () => {\n setState((prev) => {\n return {\n ...prev,\n fallback: prev.fallback.filter((r) => r !== render),\n };\n });\n };\n },\n\n setToolUILayout: (render) => {\n setState((prev) => {\n return {\n ...prev,\n layout: [...prev.layout, render],\n };\n });\n\n return () => {\n setState((prev) => {\n return {\n ...prev,\n layout: prev.layout.filter((r) => r !== render),\n };\n });\n };\n },\n });\n});\n"],"mappings":";AAAA,SAAS,UAAU,gBAAgB;AACnC,SAAS,cAAc;AAGhB,IAAM,eAAe,SAAS,MAAM;AACzC,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAsB,OAAO;AAAA,IACrD,OAAO,CAAC;AAAA,IACR,UAAU,CAAC;AAAA,IACX,QAAQ,CAAC;AAAA,EACX,EAAE;AAEF,SAAO,OAAkB;AAAA,IACvB,UAAU,MAAM;AAAA,IAEhB,WAAW,CAAC,UAAU,WAAW;AAC/B,eAAS,CAAC,SAAS;AACjB,eAAO;AAAA,UACL,GAAG;AAAA,UACH,OAAO;AAAA,YACL,GAAG,KAAK;AAAA,YACR,CAAC,QAAQ,GAAG,CAAC,GAAI,KAAK,MAAM,QAAQ,KAAK,CAAC,GAAI,MAAM;AAAA,UACtD;AAAA,QACF;AAAA,MACF,CAAC;AAED,aAAO,MAAM;AACX,iBAAS,CAAC,SAAS;AACjB,iBAAO;AAAA,YACL,GAAG;AAAA,YACH,OAAO;AAAA,cACL,GAAG,KAAK;AAAA,cACR,CAAC,QAAQ,GACP,KAAK,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,MAAM,MAAM,KAAK,CAAC;AAAA,YAC1D;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IAEA,mBAAmB,CAAC,WAAW;AAC7B,eAAS,CAAC,SAAS;AACjB,eAAO;AAAA,UACL,GAAG;AAAA,UACH,UAAU,CAAC,GAAG,KAAK,UAAU,MAAM;AAAA,QACrC;AAAA,MACF,CAAC;AAED,aAAO,MAAM;AACX,iBAAS,CAAC,SAAS;AACjB,iBAAO;AAAA,YACL,GAAG;AAAA,YACH,UAAU,KAAK,SAAS,OAAO,CAAC,MAAM,MAAM,MAAM;AAAA,UACpD;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IAEA,iBAAiB,CAAC,WAAW;AAC3B,eAAS,CAAC,SAAS;AACjB,eAAO;AAAA,UACL,GAAG;AAAA,UACH,QAAQ,CAAC,GAAG,KAAK,QAAQ,MAAM;AAAA,QACjC;AAAA,MACF,CAAC;AAED,aAAO,MAAM;AACX,iBAAS,CAAC,SAAS;AACjB,iBAAO;AAAA,YACL,GAAG;AAAA,YACH,QAAQ,KAAK,OAAO,OAAO,CAAC,MAAM,MAAM,MAAM;AAAA,UAChD;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAC;AACH,CAAC;","names":[]}
@@ -1,4 +0,0 @@
1
- import type { ToolUIApi } from "./types/ToolUI";
2
- export declare const withToolUIProvider: <TResult>(toolUIs: ToolUIApi, fn: () => TResult) => TResult;
3
- export declare const tapToolUI: () => ToolUIApi;
4
- //# sourceMappingURL=ToolUIContext.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ToolUIContext.d.ts","sourceRoot":"","sources":["../../src/client/ToolUIContext.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAIhD,eAAO,MAAM,kBAAkB,GAAI,OAAO,EACxC,SAAS,SAAS,EAClB,IAAI,MAAM,OAAO,YAGlB,CAAC;AAEF,eAAO,MAAM,SAAS,iBAKrB,CAAC"}
@@ -1,20 +0,0 @@
1
- // src/client/ToolUIContext.ts
2
- import {
3
- createContext,
4
- tapContext,
5
- withContextProvider
6
- } from "@assistant-ui/tap";
7
- var ToolUIContext = createContext(null);
8
- var withToolUIProvider = (toolUIs, fn) => {
9
- return withContextProvider(ToolUIContext, toolUIs, fn);
10
- };
11
- var tapToolUI = () => {
12
- const toolUIs = tapContext(ToolUIContext);
13
- if (!toolUIs) throw new Error("ToolUI context is not available");
14
- return toolUIs;
15
- };
16
- export {
17
- tapToolUI,
18
- withToolUIProvider
19
- };
20
- //# sourceMappingURL=ToolUIContext.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/client/ToolUIContext.ts"],"sourcesContent":["import {\n createContext,\n tapContext,\n withContextProvider,\n} from \"@assistant-ui/tap\";\nimport type { ToolUIApi } from \"./types/ToolUI\";\n\nconst ToolUIContext = createContext<ToolUIApi | null>(null);\n\nexport const withToolUIProvider = <TResult>(\n toolUIs: ToolUIApi,\n fn: () => TResult,\n) => {\n return withContextProvider(ToolUIContext, toolUIs, fn);\n};\n\nexport const tapToolUI = () => {\n const toolUIs = tapContext(ToolUIContext);\n if (!toolUIs) throw new Error(\"ToolUI context is not available\");\n\n return toolUIs;\n};\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,IAAM,gBAAgB,cAAgC,IAAI;AAEnD,IAAM,qBAAqB,CAChC,SACA,OACG;AACH,SAAO,oBAAoB,eAAe,SAAS,EAAE;AACvD;AAEO,IAAM,YAAY,MAAM;AAC7B,QAAM,UAAU,WAAW,aAAa;AACxC,MAAI,CAAC,QAAS,OAAM,IAAI,MAAM,iCAAiC;AAE/D,SAAO;AACT;","names":[]}
@@ -1,23 +0,0 @@
1
- import { Unsubscribe } from "@assistant-ui/tap";
2
- import type { ComponentType, ReactNode } from "react";
3
- import { ToolCallMessagePartComponent } from "../../types";
4
- export type ToolUIState = {
5
- tools: Record<string, ToolCallMessagePartComponent[]>;
6
- fallback: ToolCallMessagePartComponent[];
7
- layout: ComponentType<{
8
- children: ReactNode;
9
- }>[];
10
- };
11
- export type ToolUIApi = {
12
- getState(): ToolUIState;
13
- setToolUI(toolName: string, render: ToolCallMessagePartComponent): Unsubscribe;
14
- setFallbackToolUI(render: ToolCallMessagePartComponent): Unsubscribe;
15
- setToolUILayout(render: ComponentType<{
16
- children: ReactNode;
17
- }>): Unsubscribe;
18
- };
19
- export type ToolUIMeta = {
20
- source: "root";
21
- query: Record<string, never>;
22
- };
23
- //# sourceMappingURL=ToolUI.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ToolUI.d.ts","sourceRoot":"","sources":["../../../src/client/types/ToolUI.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAC;AAE3D,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,4BAA4B,EAAE,CAAC,CAAC;IACtD,QAAQ,EAAE,4BAA4B,EAAE,CAAC;IACzC,MAAM,EAAE,aAAa,CAAC;QAAE,QAAQ,EAAE,SAAS,CAAA;KAAE,CAAC,EAAE,CAAC;CAClD,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,IAAI,WAAW,CAAC;IAExB,SAAS,CACP,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,4BAA4B,GACnC,WAAW,CAAC;IAEf,iBAAiB,CAAC,MAAM,EAAE,4BAA4B,GAAG,WAAW,CAAC;IAErE,eAAe,CAAC,MAAM,EAAE,aAAa,CAAC;QAAE,QAAQ,EAAE,SAAS,CAAA;KAAE,CAAC,GAAG,WAAW,CAAC;CAC9E,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;CAC9B,CAAC"}
@@ -1 +0,0 @@
1
- //# sourceMappingURL=ToolUI.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,76 +0,0 @@
1
- import { resource, tapState } from "@assistant-ui/tap";
2
- import { tapApi } from "../utils/tap-store";
3
- import { ToolUIState, ToolUIApi } from "./types/ToolUI";
4
-
5
- export const ToolUIClient = resource(() => {
6
- const [state, setState] = tapState<ToolUIState>(() => ({
7
- tools: {},
8
- fallback: [],
9
- layout: [],
10
- }));
11
-
12
- return tapApi<ToolUIApi>({
13
- getState: () => state,
14
-
15
- setToolUI: (toolName, render) => {
16
- setState((prev) => {
17
- return {
18
- ...prev,
19
- tools: {
20
- ...prev.tools,
21
- [toolName]: [...(prev.tools[toolName] ?? []), render],
22
- },
23
- };
24
- });
25
-
26
- return () => {
27
- setState((prev) => {
28
- return {
29
- ...prev,
30
- tools: {
31
- ...prev.tools,
32
- [toolName]:
33
- prev.tools[toolName]?.filter((r) => r !== render) ?? [],
34
- },
35
- };
36
- });
37
- };
38
- },
39
-
40
- setFallbackToolUI: (render) => {
41
- setState((prev) => {
42
- return {
43
- ...prev,
44
- fallback: [...prev.fallback, render],
45
- };
46
- });
47
-
48
- return () => {
49
- setState((prev) => {
50
- return {
51
- ...prev,
52
- fallback: prev.fallback.filter((r) => r !== render),
53
- };
54
- });
55
- };
56
- },
57
-
58
- setToolUILayout: (render) => {
59
- setState((prev) => {
60
- return {
61
- ...prev,
62
- layout: [...prev.layout, render],
63
- };
64
- });
65
-
66
- return () => {
67
- setState((prev) => {
68
- return {
69
- ...prev,
70
- layout: prev.layout.filter((r) => r !== render),
71
- };
72
- });
73
- };
74
- },
75
- });
76
- });
@@ -1,22 +0,0 @@
1
- import {
2
- createContext,
3
- tapContext,
4
- withContextProvider,
5
- } from "@assistant-ui/tap";
6
- import type { ToolUIApi } from "./types/ToolUI";
7
-
8
- const ToolUIContext = createContext<ToolUIApi | null>(null);
9
-
10
- export const withToolUIProvider = <TResult>(
11
- toolUIs: ToolUIApi,
12
- fn: () => TResult,
13
- ) => {
14
- return withContextProvider(ToolUIContext, toolUIs, fn);
15
- };
16
-
17
- export const tapToolUI = () => {
18
- const toolUIs = tapContext(ToolUIContext);
19
- if (!toolUIs) throw new Error("ToolUI context is not available");
20
-
21
- return toolUIs;
22
- };
@@ -1,27 +0,0 @@
1
- import { Unsubscribe } from "@assistant-ui/tap";
2
- import type { ComponentType, ReactNode } from "react";
3
- import { ToolCallMessagePartComponent } from "../../types";
4
-
5
- export type ToolUIState = {
6
- tools: Record<string, ToolCallMessagePartComponent[]>;
7
- fallback: ToolCallMessagePartComponent[];
8
- layout: ComponentType<{ children: ReactNode }>[];
9
- };
10
-
11
- export type ToolUIApi = {
12
- getState(): ToolUIState;
13
-
14
- setToolUI(
15
- toolName: string,
16
- render: ToolCallMessagePartComponent,
17
- ): Unsubscribe;
18
-
19
- setFallbackToolUI(render: ToolCallMessagePartComponent): Unsubscribe;
20
-
21
- setToolUILayout(render: ComponentType<{ children: ReactNode }>): Unsubscribe;
22
- };
23
-
24
- export type ToolUIMeta = {
25
- source: "root";
26
- query: Record<string, never>;
27
- };