@aigentyc/chat-sdk 0.2.4 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/aigentyc.mjs +14 -8
- package/bin/lib/add.mjs +1 -1
- package/bin/lib/doctor.mjs +1 -1
- package/bin/lib/skill.mjs +84 -0
- package/claude-skill/README.md +32 -0
- package/claude-skill/aigentyc-chat-sdk/SKILL.md +339 -0
- package/context7.json +1 -1
- package/dist/ChatInterface-B0zbA3Lm.d.cts +64 -0
- package/dist/ChatInterface-f8ftS56n.d.ts +64 -0
- package/dist/{SlotsContext-CBtt36al.d.ts → SlotsContext-BjiX1mRx.d.ts} +17 -2
- package/dist/{SlotsContext-CHvISDJT.d.cts → SlotsContext-CEOBjzfh.d.cts} +17 -2
- package/dist/ai-elements.cjs +114 -393
- package/dist/ai-elements.cjs.map +1 -1
- package/dist/ai-elements.d.cts +2 -31
- package/dist/ai-elements.d.ts +2 -31
- package/dist/ai-elements.js +9 -291
- package/dist/ai-elements.js.map +1 -1
- package/dist/{chunk-5QSXB6UL.cjs → chunk-3HGOLNGG.cjs} +13 -4
- package/dist/chunk-3HGOLNGG.cjs.map +1 -0
- package/dist/{chunk-KVEJAPWA.js → chunk-3KSMOHNY.js} +48 -62
- package/dist/chunk-3KSMOHNY.js.map +1 -0
- package/dist/chunk-4WOBNRRB.cjs +540 -0
- package/dist/chunk-4WOBNRRB.cjs.map +1 -0
- package/dist/chunk-7AZMWPKX.cjs +35 -0
- package/dist/chunk-7AZMWPKX.cjs.map +1 -0
- package/dist/chunk-B27JIQ4Z.js +528 -0
- package/dist/chunk-B27JIQ4Z.js.map +1 -0
- package/dist/{chunk-J2K7EJYP.cjs → chunk-BPV66QNM.cjs} +6 -4
- package/dist/chunk-BPV66QNM.cjs.map +1 -0
- package/dist/{chunk-FYPJSHCL.js → chunk-FPQ3UCCJ.js} +6 -4
- package/dist/chunk-FPQ3UCCJ.js.map +1 -0
- package/dist/{chunk-7L4FS6G7.js → chunk-JHWSG5IB.js} +17 -3
- package/dist/chunk-JHWSG5IB.js.map +1 -0
- package/dist/{chunk-4FBVV64J.js → chunk-M4YRNNGB.js} +13 -4
- package/dist/chunk-M4YRNNGB.js.map +1 -0
- package/dist/{chunk-QDFPJJ5Y.cjs → chunk-OU5OZKYH.cjs} +50 -65
- package/dist/chunk-OU5OZKYH.cjs.map +1 -0
- package/dist/{chunk-MC6QDYB6.cjs → chunk-PPCGZ5MP.cjs} +166 -67
- package/dist/chunk-PPCGZ5MP.cjs.map +1 -0
- package/dist/{chunk-U3FXVLUK.js → chunk-PQCGQ32Q.js} +84 -4
- package/dist/chunk-PQCGQ32Q.js.map +1 -0
- package/dist/{chunk-FOZXDUSZ.js → chunk-SWKWHBBN.js} +151 -54
- package/dist/chunk-SWKWHBBN.js.map +1 -0
- package/dist/{chunk-DMGYQ6NN.cjs → chunk-TLGZSXTU.cjs} +86 -6
- package/dist/chunk-TLGZSXTU.cjs.map +1 -0
- package/dist/{chunk-C24QG43M.cjs → chunk-TZ7EM3EG.cjs} +17 -2
- package/dist/chunk-TZ7EM3EG.cjs.map +1 -0
- package/dist/chunk-XEAAB5ZM.js +32 -0
- package/dist/chunk-XEAAB5ZM.js.map +1 -0
- package/dist/components.cjs +31 -52
- package/dist/components.cjs.map +1 -1
- package/dist/components.d.cts +4 -34
- package/dist/components.d.ts +4 -34
- package/dist/components.js +18 -42
- package/dist/components.js.map +1 -1
- package/dist/core.d.cts +2 -2
- package/dist/core.d.ts +2 -2
- package/dist/hooks.cjs +6 -6
- package/dist/hooks.d.cts +2 -2
- package/dist/hooks.d.ts +2 -2
- package/dist/hooks.js +2 -2
- package/dist/i18n.d.cts +1 -1
- package/dist/i18n.d.ts +1 -1
- package/dist/index.cjs +45 -23
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +51 -6
- package/dist/index.d.ts +51 -6
- package/dist/index.js +17 -10
- package/dist/index.js.map +1 -1
- package/dist/llms-full.txt +194 -14
- package/dist/message-feedback-BFh3-qym.d.cts +92 -0
- package/dist/message-feedback-cWR0NVok.d.ts +92 -0
- package/dist/normalize-KzCLLqpU.d.cts +42 -0
- package/dist/normalize-KzCLLqpU.d.ts +42 -0
- package/dist/styles.css +1 -1
- package/dist/theme.d.cts +1 -1
- package/dist/theme.d.ts +1 -1
- package/dist/tools.cjs +14 -5
- package/dist/tools.d.cts +3 -2
- package/dist/tools.d.ts +3 -2
- package/dist/tools.js +3 -2
- package/dist/{types-DKJ_-nbG.d.cts → types-DlNwk-bG.d.cts} +33 -3
- package/dist/{types-DKJ_-nbG.d.ts → types-DlNwk-bG.d.ts} +33 -3
- package/dist/ui.cjs +45 -45
- package/dist/ui.js +2 -2
- package/llms.txt +175 -5
- package/package.json +2 -1
- package/dist/chunk-4FBVV64J.js.map +0 -1
- package/dist/chunk-5QSXB6UL.cjs.map +0 -1
- package/dist/chunk-7L4FS6G7.js.map +0 -1
- package/dist/chunk-A7PCSWIK.js +0 -219
- package/dist/chunk-A7PCSWIK.js.map +0 -1
- package/dist/chunk-C24QG43M.cjs.map +0 -1
- package/dist/chunk-DMGYQ6NN.cjs.map +0 -1
- package/dist/chunk-FOZXDUSZ.js.map +0 -1
- package/dist/chunk-FYPJSHCL.js.map +0 -1
- package/dist/chunk-J2K7EJYP.cjs.map +0 -1
- package/dist/chunk-KVEJAPWA.js.map +0 -1
- package/dist/chunk-MC6QDYB6.cjs.map +0 -1
- package/dist/chunk-QDFPJJ5Y.cjs.map +0 -1
- package/dist/chunk-RTVEBPAJ.cjs +0 -230
- package/dist/chunk-RTVEBPAJ.cjs.map +0 -1
- package/dist/chunk-U3FXVLUK.js.map +0 -1
package/dist/chunk-RTVEBPAJ.cjs
DELETED
|
@@ -1,230 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
'use strict';
|
|
3
|
-
|
|
4
|
-
var chunkC24QG43M_cjs = require('./chunk-C24QG43M.cjs');
|
|
5
|
-
var chunk525KS5HM_cjs = require('./chunk-525KS5HM.cjs');
|
|
6
|
-
var lucideReact = require('lucide-react');
|
|
7
|
-
var react = require('react');
|
|
8
|
-
var useStickToBottom = require('use-stick-to-bottom');
|
|
9
|
-
var jsxRuntime = require('react/jsx-runtime');
|
|
10
|
-
|
|
11
|
-
var Conversation = ({ className, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
12
|
-
useStickToBottom.StickToBottom,
|
|
13
|
-
{
|
|
14
|
-
className: chunk525KS5HM_cjs.cn("relative flex-1 overflow-y-hidden", className),
|
|
15
|
-
initial: "smooth",
|
|
16
|
-
resize: "smooth",
|
|
17
|
-
role: "log",
|
|
18
|
-
...props
|
|
19
|
-
}
|
|
20
|
-
);
|
|
21
|
-
var ConversationContent = ({
|
|
22
|
-
className,
|
|
23
|
-
...props
|
|
24
|
-
}) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
25
|
-
useStickToBottom.StickToBottom.Content,
|
|
26
|
-
{
|
|
27
|
-
className: chunk525KS5HM_cjs.cn("flex flex-col gap-8", className),
|
|
28
|
-
...props
|
|
29
|
-
}
|
|
30
|
-
);
|
|
31
|
-
var ConversationEmptyState = ({
|
|
32
|
-
className,
|
|
33
|
-
title = "No messages yet",
|
|
34
|
-
description = "Start a conversation to see messages here",
|
|
35
|
-
icon,
|
|
36
|
-
children,
|
|
37
|
-
...props
|
|
38
|
-
}) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
39
|
-
"div",
|
|
40
|
-
{
|
|
41
|
-
className: chunk525KS5HM_cjs.cn(
|
|
42
|
-
"flex size-full flex-col items-center justify-center gap-3 p-8 text-center",
|
|
43
|
-
className
|
|
44
|
-
),
|
|
45
|
-
...props,
|
|
46
|
-
children: children ?? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
47
|
-
icon && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-muted-foreground", children: icon }),
|
|
48
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1", children: [
|
|
49
|
-
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "font-medium text-sm", children: title }),
|
|
50
|
-
description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground text-sm", children: description })
|
|
51
|
-
] })
|
|
52
|
-
] })
|
|
53
|
-
}
|
|
54
|
-
);
|
|
55
|
-
var ConversationScrollButton = ({
|
|
56
|
-
className,
|
|
57
|
-
...props
|
|
58
|
-
}) => {
|
|
59
|
-
const { isAtBottom, scrollToBottom } = useStickToBottom.useStickToBottomContext();
|
|
60
|
-
const handleScrollToBottom = react.useCallback(() => {
|
|
61
|
-
scrollToBottom();
|
|
62
|
-
}, [scrollToBottom]);
|
|
63
|
-
return !isAtBottom && /* @__PURE__ */ jsxRuntime.jsx(
|
|
64
|
-
chunkC24QG43M_cjs.Button,
|
|
65
|
-
{
|
|
66
|
-
className: chunk525KS5HM_cjs.cn(
|
|
67
|
-
"absolute bottom-4 left-[50%] translate-x-[-50%] rounded-full",
|
|
68
|
-
className
|
|
69
|
-
),
|
|
70
|
-
onClick: handleScrollToBottom,
|
|
71
|
-
size: "icon",
|
|
72
|
-
type: "button",
|
|
73
|
-
variant: "outline",
|
|
74
|
-
...props,
|
|
75
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowDownIcon, { className: "size-4" })
|
|
76
|
-
}
|
|
77
|
-
);
|
|
78
|
-
};
|
|
79
|
-
var Loader = ({ className, text = "Thinking...", ...props }) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
80
|
-
"div",
|
|
81
|
-
{
|
|
82
|
-
className: chunk525KS5HM_cjs.cn(
|
|
83
|
-
"flex items-center gap-2 w-full py-3",
|
|
84
|
-
className
|
|
85
|
-
),
|
|
86
|
-
style: { color: "var(--ac-loader-color, var(--ac-primary, #2f80ed))" },
|
|
87
|
-
...props,
|
|
88
|
-
children: [
|
|
89
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
90
|
-
"svg",
|
|
91
|
-
{
|
|
92
|
-
className: "animate-spin",
|
|
93
|
-
width: "20",
|
|
94
|
-
height: "20",
|
|
95
|
-
viewBox: "0 0 20 20",
|
|
96
|
-
fill: "none",
|
|
97
|
-
xmlns: "http://www.w3.org/2000/svg",
|
|
98
|
-
children: [
|
|
99
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
100
|
-
"circle",
|
|
101
|
-
{
|
|
102
|
-
cx: "10",
|
|
103
|
-
cy: "10",
|
|
104
|
-
r: "8",
|
|
105
|
-
stroke: "#E5E5E5",
|
|
106
|
-
strokeWidth: "2",
|
|
107
|
-
fill: "none"
|
|
108
|
-
}
|
|
109
|
-
),
|
|
110
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
111
|
-
"path",
|
|
112
|
-
{
|
|
113
|
-
d: "M10 2C14.4183 2 18 5.58172 18 10",
|
|
114
|
-
stroke: "currentColor",
|
|
115
|
-
strokeWidth: "2",
|
|
116
|
-
strokeLinecap: "round",
|
|
117
|
-
fill: "none"
|
|
118
|
-
}
|
|
119
|
-
)
|
|
120
|
-
]
|
|
121
|
-
}
|
|
122
|
-
),
|
|
123
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-foreground", children: text })
|
|
124
|
-
]
|
|
125
|
-
}
|
|
126
|
-
);
|
|
127
|
-
var SpinnerLoader = ({ className, size = 16, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
128
|
-
"div",
|
|
129
|
-
{
|
|
130
|
-
className: chunk525KS5HM_cjs.cn(
|
|
131
|
-
"inline-flex animate-spin items-center justify-center",
|
|
132
|
-
className
|
|
133
|
-
),
|
|
134
|
-
...props,
|
|
135
|
-
children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
136
|
-
"svg",
|
|
137
|
-
{
|
|
138
|
-
height: size,
|
|
139
|
-
strokeLinejoin: "round",
|
|
140
|
-
style: { color: "currentcolor" },
|
|
141
|
-
viewBox: "0 0 16 16",
|
|
142
|
-
width: size,
|
|
143
|
-
children: [
|
|
144
|
-
/* @__PURE__ */ jsxRuntime.jsx("title", { children: "Loader" }),
|
|
145
|
-
/* @__PURE__ */ jsxRuntime.jsxs("g", { clipPath: "url(#clip0_2393_1490)", children: [
|
|
146
|
-
/* @__PURE__ */ jsxRuntime.jsx("path", { d: "M8 0V4", stroke: "currentColor", strokeWidth: "1.5" }),
|
|
147
|
-
/* @__PURE__ */ jsxRuntime.jsx("path", { d: "M8 16V12", opacity: "0.5", stroke: "currentColor", strokeWidth: "1.5" }),
|
|
148
|
-
/* @__PURE__ */ jsxRuntime.jsx("path", { d: "M3.29773 1.52783L5.64887 4.7639", opacity: "0.9", stroke: "currentColor", strokeWidth: "1.5" }),
|
|
149
|
-
/* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12.7023 1.52783L10.3511 4.7639", opacity: "0.1", stroke: "currentColor", strokeWidth: "1.5" }),
|
|
150
|
-
/* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12.7023 14.472L10.3511 11.236", opacity: "0.4", stroke: "currentColor", strokeWidth: "1.5" }),
|
|
151
|
-
/* @__PURE__ */ jsxRuntime.jsx("path", { d: "M3.29773 14.472L5.64887 11.236", opacity: "0.6", stroke: "currentColor", strokeWidth: "1.5" }),
|
|
152
|
-
/* @__PURE__ */ jsxRuntime.jsx("path", { d: "M15.6085 5.52783L11.8043 6.7639", opacity: "0.2", stroke: "currentColor", strokeWidth: "1.5" }),
|
|
153
|
-
/* @__PURE__ */ jsxRuntime.jsx("path", { d: "M0.391602 10.472L4.19583 9.23598", opacity: "0.7", stroke: "currentColor", strokeWidth: "1.5" }),
|
|
154
|
-
/* @__PURE__ */ jsxRuntime.jsx("path", { d: "M15.6085 10.4722L11.8043 9.2361", opacity: "0.3", stroke: "currentColor", strokeWidth: "1.5" }),
|
|
155
|
-
/* @__PURE__ */ jsxRuntime.jsx("path", { d: "M0.391602 5.52783L4.19583 6.7639", opacity: "0.8", stroke: "currentColor", strokeWidth: "1.5" })
|
|
156
|
-
] }),
|
|
157
|
-
/* @__PURE__ */ jsxRuntime.jsx("defs", { children: /* @__PURE__ */ jsxRuntime.jsx("clipPath", { id: "clip0_2393_1490", children: /* @__PURE__ */ jsxRuntime.jsx("rect", { fill: "white", height: "16", width: "16" }) }) })
|
|
158
|
-
]
|
|
159
|
-
}
|
|
160
|
-
)
|
|
161
|
-
}
|
|
162
|
-
);
|
|
163
|
-
var Sources = ({ className, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
164
|
-
chunkC24QG43M_cjs.Collapsible,
|
|
165
|
-
{
|
|
166
|
-
className: chunk525KS5HM_cjs.cn("not-prose mb-4 text-primary text-xs", className),
|
|
167
|
-
...props
|
|
168
|
-
}
|
|
169
|
-
);
|
|
170
|
-
var SourcesTrigger = ({
|
|
171
|
-
className,
|
|
172
|
-
count,
|
|
173
|
-
children,
|
|
174
|
-
...props
|
|
175
|
-
}) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
176
|
-
chunkC24QG43M_cjs.CollapsibleTrigger,
|
|
177
|
-
{
|
|
178
|
-
className: chunk525KS5HM_cjs.cn("flex items-center gap-2", className),
|
|
179
|
-
...props,
|
|
180
|
-
children: children ?? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
181
|
-
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "font-medium", children: [
|
|
182
|
-
"Used ",
|
|
183
|
-
count,
|
|
184
|
-
" sources"
|
|
185
|
-
] }),
|
|
186
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDownIcon, { className: "h-4 w-4" })
|
|
187
|
-
] })
|
|
188
|
-
}
|
|
189
|
-
);
|
|
190
|
-
var SourcesContent = ({
|
|
191
|
-
className,
|
|
192
|
-
...props
|
|
193
|
-
}) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
194
|
-
chunkC24QG43M_cjs.CollapsibleContent,
|
|
195
|
-
{
|
|
196
|
-
className: chunk525KS5HM_cjs.cn(
|
|
197
|
-
"mt-3 flex w-fit flex-col gap-2",
|
|
198
|
-
"data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 outline-none data-[state=closed]:animate-out data-[state=open]:animate-in",
|
|
199
|
-
className
|
|
200
|
-
),
|
|
201
|
-
...props
|
|
202
|
-
}
|
|
203
|
-
);
|
|
204
|
-
var Source = ({ href, title, children, ...props }) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
205
|
-
"a",
|
|
206
|
-
{
|
|
207
|
-
className: "flex items-center gap-2",
|
|
208
|
-
href,
|
|
209
|
-
rel: "noreferrer",
|
|
210
|
-
target: "_blank",
|
|
211
|
-
...props,
|
|
212
|
-
children: children ?? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
213
|
-
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.BookIcon, { className: "h-4 w-4" }),
|
|
214
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "block font-medium", children: title })
|
|
215
|
-
] })
|
|
216
|
-
}
|
|
217
|
-
);
|
|
218
|
-
|
|
219
|
-
exports.Conversation = Conversation;
|
|
220
|
-
exports.ConversationContent = ConversationContent;
|
|
221
|
-
exports.ConversationEmptyState = ConversationEmptyState;
|
|
222
|
-
exports.ConversationScrollButton = ConversationScrollButton;
|
|
223
|
-
exports.Loader = Loader;
|
|
224
|
-
exports.Source = Source;
|
|
225
|
-
exports.Sources = Sources;
|
|
226
|
-
exports.SourcesContent = SourcesContent;
|
|
227
|
-
exports.SourcesTrigger = SourcesTrigger;
|
|
228
|
-
exports.SpinnerLoader = SpinnerLoader;
|
|
229
|
-
//# sourceMappingURL=chunk-RTVEBPAJ.cjs.map
|
|
230
|
-
//# sourceMappingURL=chunk-RTVEBPAJ.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ai-elements/conversation.tsx","../src/ai-elements/loader.tsx","../src/ai-elements/sources.tsx"],"names":["jsx","StickToBottom","cn","jsxs","Fragment","useStickToBottomContext","useCallback","Button","ArrowDownIcon","Collapsible","CollapsibleTrigger","ChevronDownIcon","CollapsibleContent","BookIcon"],"mappings":"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","file":"chunk-RTVEBPAJ.cjs","sourcesContent":["\"use client\";\n\nimport { Button } from \"../ui/button\";\nimport { cn } from \"../core/utils\";\nimport { ArrowDownIcon } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\nimport { useCallback } from \"react\";\nimport { StickToBottom, useStickToBottomContext } from \"use-stick-to-bottom\";\n\nexport type ConversationProps = ComponentProps<typeof StickToBottom>;\n\nexport const Conversation = ({ className, ...props }: ConversationProps) => (\n <StickToBottom\n className={cn(\"relative flex-1 overflow-y-hidden\", className)}\n initial=\"smooth\"\n resize=\"smooth\"\n role=\"log\"\n {...props}\n />\n);\n\nexport type ConversationContentProps = ComponentProps<\n typeof StickToBottom.Content\n>;\n\nexport const ConversationContent = ({\n className,\n ...props\n}: ConversationContentProps) => (\n <StickToBottom.Content\n className={cn(\"flex flex-col gap-8\", className)}\n {...props}\n />\n);\n\nexport type ConversationEmptyStateProps = ComponentProps<\"div\"> & {\n title?: string;\n description?: string;\n icon?: React.ReactNode;\n};\n\nexport const ConversationEmptyState = ({\n className,\n title = \"No messages yet\",\n description = \"Start a conversation to see messages here\",\n icon,\n children,\n ...props\n}: ConversationEmptyStateProps) => (\n <div\n className={cn(\n \"flex size-full flex-col items-center justify-center gap-3 p-8 text-center\",\n className\n )}\n {...props}\n >\n {children ?? (\n <>\n {icon && <div className=\"text-muted-foreground\">{icon}</div>}\n <div className=\"space-y-1\">\n <h3 className=\"font-medium text-sm\">{title}</h3>\n {description && (\n <p className=\"text-muted-foreground text-sm\">{description}</p>\n )}\n </div>\n </>\n )}\n </div>\n);\n\nexport type ConversationScrollButtonProps = ComponentProps<typeof Button>;\n\nexport const ConversationScrollButton = ({\n className,\n ...props\n}: ConversationScrollButtonProps) => {\n const { isAtBottom, scrollToBottom } = useStickToBottomContext();\n\n const handleScrollToBottom = useCallback(() => {\n scrollToBottom();\n }, [scrollToBottom]);\n\n return (\n !isAtBottom && (\n <Button\n className={cn(\n \"absolute bottom-4 left-[50%] translate-x-[-50%] rounded-full\",\n className\n )}\n onClick={handleScrollToBottom}\n size=\"icon\"\n type=\"button\"\n variant=\"outline\"\n {...props}\n >\n <ArrowDownIcon className=\"size-4\" />\n </Button>\n )\n );\n};\n","\"use client\";\n\nimport { cn } from \"../core/utils\";\nimport type { HTMLAttributes } from \"react\";\n\nexport type LoaderProps = HTMLAttributes<HTMLDivElement> & {\n text?: string;\n};\n\nexport const Loader = ({ className, text = \"Thinking...\", ...props }: LoaderProps) => (\n <div\n className={cn(\n \"flex items-center gap-2 w-full py-3\",\n className\n )}\n style={{ color: \"var(--ac-loader-color, var(--ac-primary, #2f80ed))\" }}\n {...props}\n >\n {/* Circular spinner */}\n <svg\n className=\"animate-spin\"\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <circle\n cx=\"10\"\n cy=\"10\"\n r=\"8\"\n stroke=\"#E5E5E5\"\n strokeWidth=\"2\"\n fill=\"none\"\n />\n <path\n d=\"M10 2C14.4183 2 18 5.58172 18 10\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n fill=\"none\"\n />\n </svg>\n <span className=\"text-sm text-foreground\">{text}</span>\n </div>\n);\n\n// Spinner loader for other use cases\nexport type SpinnerLoaderProps = HTMLAttributes<HTMLDivElement> & {\n size?: number;\n};\n\nexport const SpinnerLoader = ({ className, size = 16, ...props }: SpinnerLoaderProps) => (\n <div\n className={cn(\n \"inline-flex animate-spin items-center justify-center\",\n className\n )}\n {...props}\n >\n <svg\n height={size}\n strokeLinejoin=\"round\"\n style={{ color: \"currentcolor\" }}\n viewBox=\"0 0 16 16\"\n width={size}\n >\n <title>Loader</title>\n <g clipPath=\"url(#clip0_2393_1490)\">\n <path d=\"M8 0V4\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M8 16V12\" opacity=\"0.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M3.29773 1.52783L5.64887 4.7639\" opacity=\"0.9\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M12.7023 1.52783L10.3511 4.7639\" opacity=\"0.1\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M12.7023 14.472L10.3511 11.236\" opacity=\"0.4\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M3.29773 14.472L5.64887 11.236\" opacity=\"0.6\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M15.6085 5.52783L11.8043 6.7639\" opacity=\"0.2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M0.391602 10.472L4.19583 9.23598\" opacity=\"0.7\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M15.6085 10.4722L11.8043 9.2361\" opacity=\"0.3\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M0.391602 5.52783L4.19583 6.7639\" opacity=\"0.8\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n </g>\n <defs>\n <clipPath id=\"clip0_2393_1490\">\n <rect fill=\"white\" height=\"16\" width=\"16\" />\n </clipPath>\n </defs>\n </svg>\n </div>\n);\n","\"use client\";\n\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"../ui/collapsible\";\nimport { cn } from \"../core/utils\";\nimport { BookIcon, ChevronDownIcon } from \"lucide-react\";\nimport type { ComponentProps } from \"react\";\n\nexport type SourcesProps = ComponentProps<\"div\">;\n\nexport const Sources = ({ className, ...props }: SourcesProps) => (\n <Collapsible\n className={cn(\"not-prose mb-4 text-primary text-xs\", className)}\n {...props}\n />\n);\n\nexport type SourcesTriggerProps = ComponentProps<typeof CollapsibleTrigger> & {\n count: number;\n};\n\nexport const SourcesTrigger = ({\n className,\n count,\n children,\n ...props\n}: SourcesTriggerProps) => (\n <CollapsibleTrigger\n className={cn(\"flex items-center gap-2\", className)}\n {...props}\n >\n {children ?? (\n <>\n <p className=\"font-medium\">Used {count} sources</p>\n <ChevronDownIcon className=\"h-4 w-4\" />\n </>\n )}\n </CollapsibleTrigger>\n);\n\nexport type SourcesContentProps = ComponentProps<typeof CollapsibleContent>;\n\nexport const SourcesContent = ({\n className,\n ...props\n}: SourcesContentProps) => (\n <CollapsibleContent\n className={cn(\n \"mt-3 flex w-fit flex-col gap-2\",\n \"data-[state=closed]:fade-out-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 outline-none data-[state=closed]:animate-out data-[state=open]:animate-in\",\n className\n )}\n {...props}\n />\n);\n\nexport type SourceProps = ComponentProps<\"a\">;\n\nexport const Source = ({ href, title, children, ...props }: SourceProps) => (\n <a\n className=\"flex items-center gap-2\"\n href={href}\n rel=\"noreferrer\"\n target=\"_blank\"\n {...props}\n >\n {children ?? (\n <>\n <BookIcon className=\"h-4 w-4\" />\n <span className=\"block font-medium\">{title}</span>\n </>\n )}\n </a>\n);\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tools/SearchKnowledgeBaseRenderer.tsx","../src/tools/ComponentRenderer.tsx","../src/tools/useSafeChatCallbacks.ts","../src/tools/tool-registry.ts","../src/tools/ToolRenderer.tsx"],"names":["useState","jsxs","jsx","useEffect"],"mappings":"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","file":"chunk-U3FXVLUK.js","sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { Card } from \"../ui/card\";\nimport type { ToolRendererProps } from \"../core/types\";\n\ninterface KbSource {\n rank?: number;\n id?: number | string;\n content?: string;\n documentName?: string;\n sourceUrl?: string | null;\n similarity?: number;\n pageTitle?: string | null;\n summary?: string | null;\n relevance?: string;\n}\n\ninterface KbResult {\n found?: boolean;\n totalResults?: number;\n generatedQueries?: string[];\n sources?: KbSource[];\n}\n\nfunction truncate(text: string, max = 220) {\n if (text.length <= max) return text;\n return text.slice(0, max).trimEnd() + \"…\";\n}\n\nexport function SearchKnowledgeBaseRenderer(props: ToolRendererProps) {\n const data = (props.result?._displayData ?? props.result?.data) as KbResult | undefined;\n const [expanded, setExpanded] = useState(false);\n\n if (!data || !data.found || !Array.isArray(data.sources) || data.sources.length === 0) {\n return null;\n }\n\n const sources = data.sources;\n const visible = expanded ? sources : sources.slice(0, 3);\n\n return (\n <Card className=\"p-3 text-sm\">\n <div className=\"mb-2 flex items-center justify-between text-xs text-muted-foreground\">\n <span>\n Found <strong className=\"text-foreground\">{data.totalResults ?? sources.length}</strong>{\" \"}\n source{(data.totalResults ?? sources.length) === 1 ? \"\" : \"s\"}\n {data.generatedQueries?.length\n ? ` for \"${data.generatedQueries.join(\", \")}\"`\n : \"\"}\n </span>\n </div>\n\n <ul className=\"flex flex-col gap-2\">\n {visible.map((s, i) => {\n const snippet = truncate((s.summary || s.content || \"\").replace(/\\s+/g, \" \").trim());\n const title = s.documentName || s.pageTitle || `Source ${s.rank ?? i + 1}`;\n return (\n <li\n key={`${s.id ?? i}`}\n className=\"rounded-md border border-border/60 bg-muted/20 p-2\"\n >\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"font-medium truncate\">{title}</span>\n {typeof s.similarity === \"number\" && (\n <span className=\"shrink-0 text-[10px] text-muted-foreground\">\n {(s.similarity * 100).toFixed(0)}%\n </span>\n )}\n </div>\n {snippet && (\n <p className=\"mt-1 text-xs text-muted-foreground leading-relaxed\">\n {snippet}\n </p>\n )}\n {s.sourceUrl && (\n <a\n href={s.sourceUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"mt-1 inline-block text-xs text-primary hover:underline\"\n >\n Open source ↗\n </a>\n )}\n </li>\n );\n })}\n </ul>\n\n {sources.length > 3 && (\n <button\n type=\"button\"\n onClick={() => setExpanded((e) => !e)}\n className=\"mt-2 text-xs text-muted-foreground hover:text-foreground\"\n >\n {expanded ? \"Show less\" : `Show ${sources.length - 3} more`}\n </button>\n )}\n </Card>\n );\n}\n\nexport default SearchKnowledgeBaseRenderer;\n","\"use client\";\n\n/**\n * ComponentRenderer — renders a \"legacy\" tool result that ships custom\n * HTML + CSS with Handlebars-style `{{field}}` template variables.\n *\n * Supports single objects and arrays with a responsive grid and a\n * show-more pagination fold. All window access is SSR-guarded.\n */\n\nimport {\n useEffect,\n useId,\n useRef,\n useState,\n useSyncExternalStore,\n type MouseEvent as ReactMouseEvent,\n} from \"react\";\nimport { processImagesInHtml } from \"../core/image-utils\";\n\nconst MOBILE_BREAKPOINT = 768;\n\nfunction subscribeToResize(cb: () => void) {\n if (typeof window === \"undefined\") return () => {};\n window.addEventListener(\"resize\", cb);\n return () => window.removeEventListener(\"resize\", cb);\n}\n\nfunction getIsMobile() {\n if (typeof window === \"undefined\") return false;\n return window.innerWidth < MOBILE_BREAKPOINT;\n}\n\n/** Props for `ComponentRenderer`. */\nexport interface ComponentRendererProps {\n /** Raw HTML template with `{{field}}` placeholders. */\n htmlCode: string;\n /** Scoped CSS for the template. */\n cssCode: string;\n /** Data payload — object (single render) or array (grid). */\n data: unknown;\n /** Columns on mobile when `data` is an array. Default: 1 */\n mobileGridCols?: number;\n /** Columns on desktop when `data` is an array. Default: 3 */\n desktopGridCols?: number;\n /** Optional interaction tracker. */\n onInteraction?: (params: {\n type: string;\n target: string;\n label: string;\n metadata?: Record<string, unknown>;\n messageId?: string;\n eventId?: string;\n }) => void;\n messageId?: string;\n eventId?: string;\n /** Items per page on mobile (default: 4). */\n mobilePageSize?: number;\n /** Items per page on desktop (default: 4). */\n desktopPageSize?: number;\n}\n\n/**\n * Renders a tool-provided HTML/CSS template against data. Strings such as\n * `{{user.name}}` and `{{#each items}}...{{/each}}` are resolved before\n * insertion.\n */\nexport function ComponentRenderer({\n htmlCode,\n cssCode,\n data,\n mobileGridCols = 1,\n desktopGridCols = 3,\n onInteraction,\n messageId,\n eventId,\n mobilePageSize = 4,\n desktopPageSize = 4,\n}: ComponentRendererProps) {\n const containerId = useId();\n const containerRef = useRef<HTMLDivElement>(null);\n const [currentPage, setCurrentPage] = useState(0);\n const isMobile = useSyncExternalStore(\n subscribeToResize,\n getIsMobile,\n () => true\n );\n\n const pageSize = isMobile ? mobilePageSize : desktopPageSize;\n\n const isArray = Array.isArray(data);\n const totalItems = isArray ? (data as unknown[]).length : 1;\n const totalPages = isArray ? Math.ceil(totalItems / pageSize) : 1;\n const hasPagination = isArray && totalItems > pageSize;\n\n useEffect(() => {\n setCurrentPage((p) => Math.min(p, Math.max(0, totalPages - 1)));\n }, [totalPages]);\n\n const displayData =\n isArray && hasPagination\n ? (data as unknown[]).slice(\n currentPage * pageSize,\n (currentPage + 1) * pageSize\n )\n : data;\n\n useEffect(() => {\n if (!containerRef.current) return;\n if (typeof document === \"undefined\") return;\n\n let processedHtml = \"\";\n\n if (Array.isArray(displayData)) {\n const gridId = `grid-${containerId}`;\n const items = displayData\n .map((item, idx) => {\n let rendered = replaceTemplateVariables(htmlCode, item);\n rendered = processImagesInHtml(rendered);\n const globalIndex = currentPage * pageSize + idx;\n return `<div class=\"grid-item\" data-item-index=\"${globalIndex}\">${rendered}</div>`;\n })\n .join(\"\");\n processedHtml = `<div class=\"grid-container\" id=\"${gridId}\">${items}</div>`;\n } else {\n processedHtml = replaceTemplateVariables(htmlCode, displayData);\n processedHtml = processImagesInHtml(processedHtml);\n }\n\n containerRef.current.innerHTML = processedHtml;\n\n const styleId = `component-style-${containerId}`;\n const existingStyle = document.getElementById(styleId);\n if (existingStyle) {\n existingStyle.remove();\n }\n\n let finalCss = cssCode;\n if (Array.isArray(displayData)) {\n const gridCss = `\n#${containerId} .grid-container {\n display: grid;\n grid-template-columns: repeat(${mobileGridCols}, 1fr);\n gap: 1rem;\n width: 100%;\n}\n\n#${containerId} .grid-item {\n width: 100%;\n}\n\n@media (min-width: 768px) {\n #${containerId} .grid-container {\n grid-template-columns: repeat(${desktopGridCols}, 1fr);\n }\n}\n`;\n finalCss = `${cssCode}\\n${gridCss}`;\n }\n\n const style = document.createElement(\"style\");\n style.id = styleId;\n style.textContent = finalCss;\n containerRef.current.appendChild(style);\n\n const images = containerRef.current.querySelectorAll(\"img\");\n images.forEach((img) => {\n if (!img.hasAttribute(\"loading\")) {\n img.setAttribute(\"loading\", \"lazy\");\n }\n });\n\n const links = containerRef.current.querySelectorAll(\"a\");\n links.forEach((link) => {\n link.setAttribute(\"target\", \"_blank\");\n link.setAttribute(\"rel\", \"noopener noreferrer\");\n });\n }, [\n htmlCode,\n cssCode,\n displayData,\n mobileGridCols,\n desktopGridCols,\n containerId,\n currentPage,\n pageSize,\n totalItems,\n totalPages,\n ]);\n\n const handleClick = (e: ReactMouseEvent<HTMLDivElement>) => {\n if (!onInteraction) return;\n const target = e.target as HTMLElement;\n const link = target.closest(\"a\");\n const button = target.closest(\"button\");\n\n if (link?.href) {\n onInteraction({\n type: \"link_click\",\n target: link.href,\n label: link.textContent || link.href,\n metadata: { url: link.href, text: link.textContent },\n messageId,\n eventId,\n });\n } else if (button && !button.hasAttribute(\"data-no-track\")) {\n onInteraction({\n type: \"button_click\",\n target: button.textContent || \"button\",\n label: button.textContent || \"button\",\n metadata: { buttonText: button.textContent },\n messageId,\n eventId,\n });\n }\n };\n\n return (\n <div className=\"component-renderer-wrapper\">\n <div\n ref={containerRef}\n id={containerId}\n className=\"component-render w-full rounded\"\n onClick={handleClick}\n style={{ display: \"block\" }}\n />\n\n {hasPagination && (\n <div className=\"flex items-center justify-center gap-2 mt-4\" dir=\"ltr\">\n <button\n onClick={() => setCurrentPage((p) => Math.max(0, p - 1))}\n disabled={currentPage === 0}\n className=\"px-3 py-1.5 text-sm rounded-md border border-gray-300 disabled:opacity-40 disabled:cursor-not-allowed hover:bg-gray-100 transition-colors\"\n aria-label=\"Previous page\"\n >\n {\"‹\"}\n </button>\n\n <span className=\"text-sm text-gray-600 px-2 tabular-nums\">\n {currentPage + 1} / {totalPages}\n </span>\n\n <button\n onClick={() =>\n setCurrentPage((p) => Math.min(totalPages - 1, p + 1))\n }\n disabled={currentPage >= totalPages - 1}\n className=\"px-3 py-1.5 text-sm rounded-md border border-gray-300 disabled:opacity-40 disabled:cursor-not-allowed hover:bg-gray-100 transition-colors\"\n aria-label=\"Next page\"\n >\n {\"›\"}\n </button>\n </div>\n )}\n </div>\n );\n}\n\nexport default ComponentRenderer;\n\n// ---------------------------------------------------------------------------\n// Template engine\n// ---------------------------------------------------------------------------\n\n/**\n * Replace `{{template}}` variables in HTML with actual data values.\n * Supports `{{field}}`, `{{nested.field}}`, `{{#each field}}...{{/each}}`,\n * `{{this}}`, and `{{this.field}}`.\n */\nfunction replaceTemplateVariables(html: string, data: unknown): string {\n let processed = processEachBlocks(html, data);\n\n // Strip unsupported control flow (e.g. {{#if}})\n processed = processed.replace(/\\{\\{[#/][^}]+\\}\\}/g, \"\");\n\n processed = processed.replace(/\\{\\{this\\}\\}/g, () =>\n data !== undefined && data !== null ? String(data) : \"\"\n );\n\n processed = processed.replace(/\\{\\{this\\.([^}]+)\\}\\}/g, \"{{$1}}\");\n\n return processed.replace(/\\{\\{([^}]+)\\}\\}/g, (match, path: string) => {\n try {\n const trimmedPath = path.trim();\n const value = getNestedValue(data, trimmedPath);\n\n if (value === undefined || value === null) return \"\";\n if (typeof value === \"object\") return JSON.stringify(value);\n return String(value);\n } catch {\n return match;\n }\n });\n}\n\nfunction processEachBlocks(html: string, data: unknown): string {\n const eachRegex = /\\{\\{#each\\s+([^}]+)\\}\\}([\\s\\S]*?)\\{\\{\\/each\\}\\}/g;\n\n return html.replace(eachRegex, (_match, field: string, content: string) => {\n const trimmedField = field.trim();\n const array = getNestedValue(data, trimmedField);\n if (!Array.isArray(array)) return \"\";\n\n return array\n .map((item) => {\n let itemHtml = processEachBlocks(content, item);\n\n if (typeof item !== \"object\" || item === null) {\n itemHtml = itemHtml.replace(/\\{\\{this\\}\\}/g, String(item));\n return itemHtml;\n }\n\n itemHtml = itemHtml.replace(/\\{\\{this\\.([^}]+)\\}\\}/g, \"{{$1}}\");\n itemHtml = itemHtml.replace(/\\{\\{([^}]+)\\}\\}/g, (m, path: string) => {\n const trimmedPath = path.trim();\n if (trimmedPath.startsWith(\"#\") || trimmedPath.startsWith(\"/\"))\n return m;\n const value = getNestedValue(item, trimmedPath);\n if (value === undefined || value === null) return \"\";\n if (typeof value === \"object\") return JSON.stringify(value);\n return String(value);\n });\n\n return itemHtml;\n })\n .join(\"\");\n });\n}\n\nfunction getNestedValue(obj: unknown, path: string): unknown {\n if (!path || obj === null || obj === undefined) return undefined;\n\n const parts = path.split(/\\.(?![^[]*\\])/);\n let current: unknown = obj;\n\n for (const part of parts) {\n if (current === null || current === undefined) return undefined;\n\n const arrayMatch = part.match(/^([^[]+)\\[([^\\]]+)\\]$/);\n if (arrayMatch) {\n const [, key, index] = arrayMatch;\n current = (current as Record<string, unknown>)[key];\n if (Array.isArray(current)) {\n current = current[parseInt(index, 10)];\n }\n } else {\n current = (current as Record<string, unknown>)[part];\n }\n }\n\n return current;\n}\n","\"use client\";\n\nimport { useContext } from \"react\";\nimport { ChatContext } from \"../providers/ChatContext\";\nimport type { ChatEventCallbacks } from \"../core/types\";\n\n/**\n * Read chat event callbacks from ChatContext if available, otherwise return\n * an empty object. Safe to call from components that may render outside a\n * ChatProvider (e.g. standalone tool previews).\n */\nexport function useSafeChatCallbacks(): ChatEventCallbacks {\n\tconst ctx = useContext(ChatContext);\n\treturn ctx?.callbacks ?? {};\n}\n","\"use client\";\n\n/**\n * Built-in tool renderer registry.\n *\n * The `ToolRenderer` router consults these maps after slot overrides and\n * before falling back to a generic JSON preview.\n */\n\nimport type { ComponentType } from \"react\";\nimport type { ToolRendererProps } from \"../core/types\";\nimport { SearchKnowledgeBaseRenderer } from \"./SearchKnowledgeBaseRenderer\";\n\n/**\n * Map of built-in renderers keyed by the tool result's `uiRenderMode`.\n *\n * Entries are populated lazily by `ToolRenderer` (via `React.lazy`) so the\n * heavy renderers (recharts, JSON-render catalog) don't end up in the core\n * bundle unless used. This map is intentionally empty at module scope — look\n * at `ToolRenderer.tsx` for the actual dispatch logic.\n */\nexport const BUILTIN_TOOL_RENDERERS: Record<\n string,\n ComponentType<ToolRendererProps> | null\n> = {\n visualization: null,\n json_render: null,\n legacy: null,\n preset: null,\n none: null,\n};\n\n/**\n * Built-in renderers addressed by tool *name* (not render mode).\n *\n * A `null` value signals \"render nothing\" — useful for tools whose side\n * effects are handled elsewhere (e.g. `requestHumanChat` is consumed by the\n * `LiveChatProvider` and must not produce UI inside the message stream).\n */\nexport const BUILTIN_NAMED_RENDERERS: Record<\n string,\n ComponentType<ToolRendererProps> | null\n> = {\n requestHumanChat: null,\n // Hidden by default — knowledge-base searches are context for the assistant,\n // not content for the user. Opt in via:\n // slots: { tools: { searchKnowledgeBase: SearchKnowledgeBaseRenderer } }\n searchKnowledgeBase: null,\n};\n// Keep the component reachable even though the default is null.\nvoid SearchKnowledgeBaseRenderer;\n","\"use client\";\n\n/**\n * ToolRenderer — the main dispatcher for tool invocations in the chat stream.\n *\n * Resolution order:\n * 1. `slots.tools[toolName]` — per-tool-name slot override\n * 2. `slots.toolRenderers[result.uiRenderMode]` — per-render-mode slot override\n * 3. `BUILTIN_NAMED_RENDERERS[toolName]` — special named built-ins\n * 4. `BUILTIN_TOOL_RENDERERS[result.uiRenderMode]` — built-in mode dispatch\n * 5. Fallback — clean JSON preview inside a Card\n *\n * Heavy renderers (`VisualizationRenderer`, `JsonRenderResult`) are loaded\n * lazily via `React.lazy` + `Suspense` to keep the core bundle small.\n */\n\nimport {\n lazy,\n Suspense,\n useEffect,\n useMemo,\n type ComponentType,\n} from \"react\";\nimport { useSlots } from \"../providers/SlotsContext\";\nimport { Card } from \"../ui/card\";\nimport { Spinner } from \"../ui/spinner\";\nimport type {\n ComponentAction,\n ToolRendererProps,\n ToolResult,\n} from \"../core/types\";\n// ToolRenderer may be rendered outside a ChatContext (e.g. standalone\n// previews), so we read the context defensively via a safe hook.\nimport { useSafeChatCallbacks } from \"./useSafeChatCallbacks\";\nimport {\n BUILTIN_NAMED_RENDERERS,\n BUILTIN_TOOL_RENDERERS,\n} from \"./tool-registry\";\nimport { ComponentRenderer } from \"./ComponentRenderer\";\n\n// ---------------------------------------------------------------------------\n// Lazy renderers\n// ---------------------------------------------------------------------------\n\nconst LazyVisualization = lazy(() =>\n import(\"./VisualizationRenderer\").then((m) => ({\n default: m.VisualizationRenderer,\n }))\n);\n\nconst LazyJsonRender = lazy(() =>\n import(\"../json-render/JsonRenderResult\").then((m) => ({\n default: m.JsonRenderResult as unknown as ComponentType<Record<string, unknown>>,\n }))\n);\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Return the best display payload for a tool result, preferring `_displayData`\n * (which the server strips before sending back to the LLM) over `data`.\n */\nfunction getDisplayData(result: ToolResult | undefined): unknown {\n if (!result) return undefined;\n if (result._displayData !== undefined) return result._displayData;\n return result.data;\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Default (fallback) renderers\n// ---------------------------------------------------------------------------\n\nfunction LoadingFallback({ text }: { text?: string }) {\n return (\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Spinner className=\"h-4 w-4\" />\n <span>{text || \"Working...\"}</span>\n </div>\n );\n}\n\nfunction PresetPreview(props: ToolRendererProps) {\n const payload = getDisplayData(props.result);\n if (payload === undefined || payload === null) return null;\n return (\n <Card className=\"p-3\">\n <pre className=\"text-xs overflow-x-auto whitespace-pre-wrap break-words\">\n {safeStringify(payload)}\n </pre>\n </Card>\n );\n}\n\nfunction VisualizationWrapper(props: ToolRendererProps) {\n const payload = getDisplayData(props.result);\n // Accept either a full spec or `{ spec: ... }`.\n const spec =\n payload && typeof payload === \"object\" && \"type\" in (payload as object)\n ? (payload as Record<string, unknown>)\n : (payload as { spec?: Record<string, unknown> })?.spec;\n if (!spec) return null;\n return (\n <Suspense fallback={<LoadingFallback text={props.result?.loadingText} />}>\n {/* eslint-disable-next-line @typescript-eslint/no-explicit-any */}\n <LazyVisualization spec={spec as any} />\n </Suspense>\n );\n}\n\nfunction JsonRenderWrapper(props: ToolRendererProps) {\n const spec = props.result?.jsonRenderSpec;\n const payload = getDisplayData(props.result);\n if (!spec) return null;\n return (\n <Suspense fallback={<LoadingFallback text={props.result?.loadingText} />}>\n <LazyJsonRender\n spec={spec}\n data={payload}\n onSendMessage={props.onSendMessage}\n onAction={props.onAction}\n />\n </Suspense>\n );\n}\n\nfunction LegacyWrapper(props: ToolRendererProps) {\n const result = props.result;\n const payload = getDisplayData(result);\n const config = result?.customComponent;\n // `customComponent` in core/types is declared as `string`, but when used by\n // the legacy render mode the server inlines the `{ htmlCode, cssCode, ... }`\n // object. Widen the type locally.\n const cfg =\n typeof config === \"object\" && config !== null\n ? (config as {\n htmlCode?: string;\n cssCode?: string;\n mobileGridCols?: number;\n desktopGridCols?: number;\n mobilePageSize?: number;\n desktopPageSize?: number;\n })\n : null;\n if (!cfg?.htmlCode) return null;\n\n return (\n <ComponentRenderer\n htmlCode={cfg.htmlCode}\n cssCode={cfg.cssCode || \"\"}\n data={payload}\n mobileGridCols={cfg.mobileGridCols}\n desktopGridCols={cfg.desktopGridCols}\n mobilePageSize={cfg.mobilePageSize}\n desktopPageSize={cfg.desktopPageSize}\n />\n );\n}\n\nfunction FallbackPreview(props: ToolRendererProps) {\n const payload = getDisplayData(props.result);\n if (payload === undefined) return null;\n return (\n <Card className=\"p-3 bg-muted/30\">\n <pre className=\"text-xs overflow-x-auto whitespace-pre-wrap break-words\">\n {safeStringify(payload)}\n </pre>\n </Card>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Router\n// ---------------------------------------------------------------------------\n\n/**\n * Main tool renderer. Place one of these per tool invocation inside the\n * assistant message stream.\n */\ninterface PublicSlotMap {\n loader?: ComponentType<{ text?: string }>;\n tools?: Record<string, ComponentType<ToolRendererProps>>;\n toolRenderers?: Record<string, ComponentType<ToolRendererProps>>;\n}\n\nexport function ToolRenderer(props: ToolRendererProps) {\n const { toolName, state, result } = props;\n const slots = useSlots() as unknown as PublicSlotMap;\n const callbacks = useSafeChatCallbacks();\n\n // ----- Fire analytics callbacks -----\n useEffect(() => {\n if (state === \"output-available\" && result) {\n (callbacks as { onToolResult?: (...args: unknown[]) => void } | undefined)?.onToolResult?.(toolName, result, result.uiRenderMode);\n }\n }, [state, toolName, result, callbacks]);\n\n // Wrap onAction to also forward to callbacks.onToolAction.\n const onAction = useMemo(() => {\n const userOnAction = props.onAction;\n return (action: ComponentAction, itemData?: unknown) => {\n (callbacks as { onToolAction?: (...args: unknown[]) => void } | undefined)?.onToolAction?.(action, itemData);\n userOnAction?.(action);\n };\n }, [callbacks, props.onAction]);\n\n // Build a prop-forwarding wrapper that swaps `onAction`.\n const forwardedProps: ToolRendererProps = { ...props, onAction };\n\n // ----- Pending / in-flight states -----\n if (state === \"partial-call\" || state === \"call\") {\n const slotLoader = (slots as { loader?: ComponentType<unknown> }).loader;\n if (slotLoader) {\n const L = slotLoader as ComponentType<{ text?: string }>;\n return <L text={result?.loadingText} />;\n }\n return <LoadingFallback text={result?.loadingText} />;\n }\n\n // Output-available — nothing to show if the result explicitly hides itself\n const mode = (result?.uiRenderMode as string | undefined) ?? \"preset\";\n if (mode === \"none\" || mode === \"hidden\") {\n // Still check named overrides in case a host wants to render a\n // side-effect-y tool.\n const named = slots.tools?.[toolName];\n if (named) {\n return renderWithDefault(named, forwardedProps, FallbackPreview);\n }\n return null;\n }\n\n // 1. per-tool slot override\n const toolSlot = slots.tools?.[toolName];\n if (toolSlot) {\n return renderWithDefault(toolSlot, forwardedProps, pickDefaultForMode(mode));\n }\n\n // 2. per-render-mode slot override\n const modeSlot = slots.toolRenderers?.[mode];\n if (modeSlot) {\n return renderWithDefault(modeSlot, forwardedProps, pickDefaultForMode(mode));\n }\n\n // 3. named built-in\n const namedBuiltin = BUILTIN_NAMED_RENDERERS[toolName];\n if (namedBuiltin === null && toolName in BUILTIN_NAMED_RENDERERS) {\n // explicit \"render nothing\" for this tool\n return null;\n }\n if (namedBuiltin) {\n const N = namedBuiltin;\n return <N {...forwardedProps} />;\n }\n\n // 4. built-in by render mode\n switch (mode) {\n case \"visualization\":\n return <VisualizationWrapper {...forwardedProps} />;\n case \"json_render\":\n case \"json\":\n return <JsonRenderWrapper {...forwardedProps} />;\n case \"legacy\":\n case \"display\":\n return <LegacyWrapper {...forwardedProps} />;\n case \"preset\":\n case \"text\":\n return <PresetPreview {...forwardedProps} />;\n default:\n // 5. fallback JSON card\n return <FallbackPreview {...forwardedProps} />;\n }\n}\n\nexport default ToolRenderer;\n\n// ---------------------------------------------------------------------------\n// Internals\n// ---------------------------------------------------------------------------\n\n/**\n * Render a slot override and inject the matching `DefaultComponent` so the\n * override can fall back to the built-in rendering.\n */\nfunction renderWithDefault(\n Override: ComponentType<ToolRendererProps & { DefaultComponent?: ComponentType<ToolRendererProps> }>,\n props: ToolRendererProps,\n Default: ComponentType<ToolRendererProps>\n) {\n return <Override {...props} DefaultComponent={Default} />;\n}\n\nfunction pickDefaultForMode(mode: string): ComponentType<ToolRendererProps> {\n switch (mode) {\n case \"visualization\":\n return VisualizationWrapper;\n case \"json_render\":\n case \"json\":\n return JsonRenderWrapper;\n case \"legacy\":\n case \"display\":\n return LegacyWrapper;\n case \"preset\":\n case \"text\":\n return PresetPreview;\n default:\n return FallbackPreview;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Re-exports for convenience\n// ---------------------------------------------------------------------------\n\nexport type { ToolRendererProps, ToolResult, ComponentAction };\n"]}
|