@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.
- package/dist/client/AssistantClient.d.ts.map +1 -1
- package/dist/client/AssistantClient.js +14 -30
- package/dist/client/AssistantClient.js.map +1 -1
- package/dist/client/ModelContextClient.d.ts +1 -1
- package/dist/client/NoOpComposerClient.d.ts +1 -1
- package/dist/client/ThreadMessageClient.d.ts +1 -1
- package/dist/client/Tools.d.ts +1 -1
- package/dist/client/Tools.d.ts.map +1 -1
- package/dist/client/Tools.js +29 -18
- package/dist/client/Tools.js.map +1 -1
- package/dist/client/types/Tools.d.ts +6 -1
- package/dist/client/types/Tools.d.ts.map +1 -1
- package/dist/context/react/AssistantApiContext.d.ts +2 -4
- package/dist/context/react/AssistantApiContext.d.ts.map +1 -1
- package/dist/context/react/AssistantApiContext.js +0 -7
- package/dist/context/react/AssistantApiContext.js.map +1 -1
- package/dist/context/react/hooks/useAssistantState.js +2 -2
- package/dist/context/react/hooks/useAssistantState.js.map +1 -1
- package/dist/legacy-runtime/RuntimeAdapter.d.ts +1 -1
- package/dist/legacy-runtime/client/AttachmentRuntimeClient.d.ts +1 -1
- package/dist/legacy-runtime/client/ComposerRuntimeClient.d.ts +1 -1
- package/dist/legacy-runtime/client/EventManagerRuntimeClient.d.ts +1 -1
- package/dist/legacy-runtime/client/MessagePartRuntimeClient.d.ts +1 -1
- package/dist/legacy-runtime/client/MessageRuntimeClient.d.ts +1 -1
- package/dist/legacy-runtime/client/ThreadListItemRuntimeClient.d.ts +1 -1
- package/dist/legacy-runtime/client/ThreadListRuntimeClient.d.ts +1 -1
- package/dist/legacy-runtime/client/ThreadRuntimeClient.d.ts +1 -1
- package/dist/legacy-runtime/cloud/auiV0.js.map +1 -1
- package/dist/legacy-runtime/runtime-cores/external-store/ThreadMessageLike.d.ts +2 -2
- package/dist/legacy-runtime/runtime-cores/external-store/ThreadMessageLike.d.ts.map +1 -1
- package/dist/legacy-runtime/runtime-cores/external-store/ThreadMessageLike.js +2 -0
- package/dist/legacy-runtime/runtime-cores/external-store/ThreadMessageLike.js.map +1 -1
- package/dist/legacy-runtime/runtime-cores/local/LocalThreadRuntimeCore.d.ts.map +1 -1
- package/dist/legacy-runtime/runtime-cores/local/LocalThreadRuntimeCore.js +7 -4
- package/dist/legacy-runtime/runtime-cores/local/LocalThreadRuntimeCore.js.map +1 -1
- package/dist/legacy-runtime/runtime-cores/remote-thread-list/RemoteThreadListThreadListRuntimeCore.d.ts.map +1 -1
- package/dist/legacy-runtime/runtime-cores/remote-thread-list/RemoteThreadListThreadListRuntimeCore.js +34 -1
- package/dist/legacy-runtime/runtime-cores/remote-thread-list/RemoteThreadListThreadListRuntimeCore.js.map +1 -1
- package/dist/legacy-runtime/runtime-cores/remote-thread-list/adapter/cloud.d.ts.map +1 -1
- package/dist/legacy-runtime/runtime-cores/remote-thread-list/adapter/cloud.js +9 -0
- package/dist/legacy-runtime/runtime-cores/remote-thread-list/adapter/cloud.js.map +1 -1
- package/dist/legacy-runtime/runtime-cores/remote-thread-list/adapter/in-memory.d.ts +2 -1
- package/dist/legacy-runtime/runtime-cores/remote-thread-list/adapter/in-memory.d.ts.map +1 -1
- package/dist/legacy-runtime/runtime-cores/remote-thread-list/adapter/in-memory.js +3 -0
- package/dist/legacy-runtime/runtime-cores/remote-thread-list/adapter/in-memory.js.map +1 -1
- package/dist/legacy-runtime/runtime-cores/remote-thread-list/types.d.ts +1 -0
- package/dist/legacy-runtime/runtime-cores/remote-thread-list/types.d.ts.map +1 -1
- package/dist/legacy-runtime/runtime-cores/utils/MessageRepository.d.ts +7 -2
- package/dist/legacy-runtime/runtime-cores/utils/MessageRepository.d.ts.map +1 -1
- package/dist/legacy-runtime/runtime-cores/utils/MessageRepository.js +17 -3
- package/dist/legacy-runtime/runtime-cores/utils/MessageRepository.js.map +1 -1
- package/dist/model-context/index.d.ts +1 -1
- package/dist/model-context/index.d.ts.map +1 -1
- package/dist/model-context/index.js +0 -4
- package/dist/model-context/index.js.map +1 -1
- package/dist/model-context/makeAssistantVisible.d.ts.map +1 -1
- package/dist/model-context/makeAssistantVisible.js +21 -8
- package/dist/model-context/makeAssistantVisible.js.map +1 -1
- package/dist/model-context/toolbox.d.ts +1 -19
- package/dist/model-context/toolbox.d.ts.map +1 -1
- package/dist/model-context/toolbox.js +0 -13
- package/dist/model-context/toolbox.js.map +1 -1
- package/dist/model-context/useAssistantTool.js +1 -1
- package/dist/model-context/useAssistantTool.js.map +1 -1
- package/dist/model-context/useAssistantToolUI.js +1 -1
- package/dist/model-context/useAssistantToolUI.js.map +1 -1
- package/dist/primitives/assistantModal/scope.d.ts +2 -3
- package/dist/primitives/assistantModal/scope.d.ts.map +1 -1
- package/dist/primitives/assistantModal/scope.js.map +1 -1
- package/dist/primitives/index.d.ts +1 -0
- package/dist/primitives/index.d.ts.map +1 -1
- package/dist/primitives/index.js +2 -0
- package/dist/primitives/index.js.map +1 -1
- package/dist/primitives/message/MessageParts.d.ts.map +1 -1
- package/dist/primitives/message/MessageParts.js +4 -2
- package/dist/primitives/message/MessageParts.js.map +1 -1
- package/dist/primitives/message/MessagePartsGrouped.d.ts.map +1 -1
- package/dist/primitives/message/MessagePartsGrouped.js +4 -2
- package/dist/primitives/message/MessagePartsGrouped.js.map +1 -1
- package/dist/primitives/messagePart/useMessagePartData.d.ts +3 -0
- package/dist/primitives/messagePart/useMessagePartData.d.ts.map +1 -0
- package/dist/primitives/messagePart/useMessagePartData.js +23 -0
- package/dist/primitives/messagePart/useMessagePartData.js.map +1 -0
- package/dist/primitives/thread/useThreadViewportAutoScroll.d.ts.map +1 -1
- package/dist/primitives/thread/useThreadViewportAutoScroll.js +11 -12
- package/dist/primitives/thread/useThreadViewportAutoScroll.js.map +1 -1
- package/dist/tests/setup.js +287 -125
- package/dist/tests/setup.js.map +1 -1
- package/dist/types/AssistantTypes.d.ts +2 -2
- package/dist/types/AssistantTypes.d.ts.map +1 -1
- package/dist/types/MessagePartTypes.d.ts +6 -1
- package/dist/types/MessagePartTypes.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/tap-store/derived-scopes.d.ts +1 -1
- package/dist/utils/tap-store/derived-scopes.d.ts.map +1 -1
- package/package.json +9 -9
- package/src/client/AssistantClient.ts +14 -33
- package/src/client/Tools.ts +31 -22
- package/src/client/types/Tools.ts +11 -2
- package/src/context/react/AssistantApiContext.tsx +2 -11
- package/src/context/react/hooks/useAssistantState.tsx +2 -2
- package/src/legacy-runtime/cloud/auiV0.ts +1 -1
- package/src/legacy-runtime/runtime-cores/external-store/ThreadMessageLike.tsx +10 -1
- package/src/legacy-runtime/runtime-cores/local/LocalThreadRuntimeCore.tsx +7 -3
- package/src/legacy-runtime/runtime-cores/remote-thread-list/RemoteThreadListThreadListRuntimeCore.tsx +49 -2
- package/src/legacy-runtime/runtime-cores/remote-thread-list/adapter/cloud.tsx +10 -0
- package/src/legacy-runtime/runtime-cores/remote-thread-list/adapter/in-memory.tsx +5 -0
- package/src/legacy-runtime/runtime-cores/remote-thread-list/types.tsx +1 -0
- package/src/legacy-runtime/runtime-cores/utils/MessageRepository.tsx +27 -3
- package/src/model-context/index.ts +1 -6
- package/src/model-context/makeAssistantVisible.tsx +23 -12
- package/src/model-context/toolbox.tsx +1 -21
- package/src/model-context/useAssistantTool.tsx +1 -1
- package/src/model-context/useAssistantToolUI.tsx +1 -1
- package/src/primitives/assistantModal/scope.tsx +3 -1
- package/src/primitives/index.ts +1 -0
- package/src/primitives/message/MessageParts.tsx +5 -3
- package/src/primitives/message/MessagePartsGrouped.tsx +5 -3
- package/src/primitives/messagePart/useMessagePartData.tsx +24 -0
- package/src/primitives/thread/useThreadViewportAutoScroll.tsx +14 -13
- package/src/types/AssistantTypes.ts +2 -0
- package/src/types/MessagePartTypes.ts +8 -1
- package/src/types/index.ts +1 -0
- package/dist/client/ToolUIClient.d.ts +0 -7
- package/dist/client/ToolUIClient.d.ts.map +0 -1
- package/dist/client/ToolUIClient.js +0 -71
- package/dist/client/ToolUIClient.js.map +0 -1
- package/dist/client/ToolUIContext.d.ts +0 -4
- package/dist/client/ToolUIContext.d.ts.map +0 -1
- package/dist/client/ToolUIContext.js +0 -20
- package/dist/client/ToolUIContext.js.map +0 -1
- package/dist/client/types/ToolUI.d.ts +0 -23
- package/dist/client/types/ToolUI.d.ts.map +0 -1
- package/dist/client/types/ToolUI.js +0 -1
- package/dist/client/types/ToolUI.js.map +0 -1
- package/src/client/ToolUIClient.ts +0 -76
- package/src/client/ToolUIContext.ts +0 -22
- 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
|
-
* @
|
|
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
|
-
|
|
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:
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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:
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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
|
|
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.
|
|
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.
|
|
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
|
|
4
|
+
export const usePopoverScope: ReturnType<
|
|
5
|
+
typeof PopoverPrimitive.createPopoverScope
|
|
6
|
+
> = PopoverPrimitive.createPopoverScope();
|
|
5
7
|
export type ScopedProps<P> = P & { __scopeAssistantModal?: Scope };
|
package/src/primitives/index.ts
CHANGED
|
@@ -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(({
|
|
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(({
|
|
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
|
-
|
|
33
|
-
|
|
34
|
-
if (!div || !autoScroll) return;
|
|
31
|
+
const scrollToBottom = useCallback((behavior: ScrollBehavior) => {
|
|
32
|
+
const div = divRef.current;
|
|
33
|
+
if (!div) return;
|
|
35
34
|
|
|
36
|
-
|
|
37
|
-
|
|
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
|
|
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
|
-
|
|
70
|
-
|
|
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", () =>
|
|
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;
|
package/src/types/index.ts
CHANGED
|
@@ -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 +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
|
-
};
|