@chat-lab/ui 0.1.0-beta.31 → 0.1.0-beta.32
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/components/Chatkit/chatController.d.ts +2 -0
- package/dist/components/Chatkit/chatController.d.ts.map +1 -0
- package/dist/components/Chatkit/index.cjs +24 -25
- package/dist/components/Chatkit/index.cjs.map +1 -1
- package/dist/components/Chatkit/index.d.ts +2 -2
- package/dist/components/Chatkit/index.d.ts.map +1 -1
- package/dist/components/Chatkit/index.js +24 -25
- package/dist/components/Chatkit/index.js.map +1 -1
- package/dist/components/assistant-ui/reasoning.cjs +1 -3
- package/dist/components/assistant-ui/reasoning.cjs.map +1 -1
- package/dist/components/assistant-ui/reasoning.d.ts.map +1 -1
- package/dist/components/assistant-ui/reasoning.js +1 -3
- package/dist/components/assistant-ui/reasoning.js.map +1 -1
- package/dist/components/assistant-ui/thread.cjs +23 -23
- package/dist/components/assistant-ui/thread.cjs.map +1 -1
- package/dist/components/assistant-ui/thread.d.ts +1 -1
- package/dist/components/assistant-ui/thread.d.ts.map +1 -1
- package/dist/components/assistant-ui/thread.js +23 -23
- package/dist/components/assistant-ui/thread.js.map +1 -1
- package/dist/contexts/ChatkitContext.cjs +0 -1
- package/dist/contexts/ChatkitContext.cjs.map +1 -1
- package/dist/contexts/ChatkitContext.d.ts +0 -2
- package/dist/contexts/ChatkitContext.d.ts.map +1 -1
- package/dist/contexts/ChatkitContext.js +0 -1
- package/dist/contexts/ChatkitContext.js.map +1 -1
- package/dist/node_modules/.pnpm/mitt@3.0.1/node_modules/mitt/dist/mitt.cjs +6 -0
- package/dist/node_modules/.pnpm/mitt@3.0.1/node_modules/mitt/dist/mitt.cjs.map +1 -0
- package/dist/node_modules/.pnpm/mitt@3.0.1/node_modules/mitt/dist/mitt.js +4 -0
- package/dist/node_modules/.pnpm/mitt@3.0.1/node_modules/mitt/dist/mitt.js.map +1 -0
- package/dist/plugins/adkPlugin.d.ts +11 -0
- package/dist/plugins/adkPlugin.d.ts.map +1 -0
- package/dist/plugins/getAdkConfig.cjs +9 -0
- package/dist/plugins/getAdkConfig.cjs.map +1 -1
- package/dist/plugins/getAdkConfig.d.ts.map +1 -1
- package/dist/plugins/getAdkConfig.js +9 -0
- package/dist/plugins/getAdkConfig.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chatController.d.ts","sourceRoot":"","sources":["../../../src/components/Chatkit/chatController.ts"],"names":[],"mappings":""}
|
|
@@ -22,20 +22,19 @@ var v4 = require('../../node_modules/.pnpm/uuid@13.0.0/node_modules/uuid/dist/v4
|
|
|
22
22
|
var AssistantRuntimeProvider = require('../../node_modules/.pnpm/@assistant-ui_react@0.11.37_patch_hash_ynfhbcwv6lgckkdmenopdkbtmq_@types_react-dom@17.0.2_@ty_7dz2xsf2ib2guiutzhjhoerypu/node_modules/@assistant-ui/react/dist/legacy-runtime/AssistantRuntimeProvider.cjs');
|
|
23
23
|
|
|
24
24
|
const ChatkitImpl = React.forwardRef((props, ref$1) => {
|
|
25
|
-
const { initialConfig, welcome, recommends, onError, plugins, threadList: threadList$1, showHeader = true, placeholder, expandToolGroup = false,
|
|
25
|
+
const { initialConfig, welcome, recommends, onError, plugins, threadList: threadList$1, showHeader = true, placeholder, expandToolGroup = false, expandToolDetail = false, } = props;
|
|
26
26
|
const { threadMap } = index$1.useThreadManagerStore();
|
|
27
27
|
ref(ref$1, initialConfig, onError);
|
|
28
28
|
return (jsxRuntime.jsx(ChatkitContext.ChatkitProvider, { value: {
|
|
29
29
|
ref: ref$1,
|
|
30
30
|
plugins: plugins || [],
|
|
31
31
|
showThreadList: threadList$1 !== false,
|
|
32
|
-
placeholder: placeholder ||
|
|
32
|
+
placeholder: placeholder || "请输入内容",
|
|
33
33
|
showHeader,
|
|
34
34
|
expandToolGroup,
|
|
35
35
|
expandToolDetail,
|
|
36
|
-
expandReasoning,
|
|
37
36
|
}, children: jsxRuntime.jsxs("div", { className: "flex h-full w-full", children: [threadList$1 !== false &&
|
|
38
|
-
(typeof threadList$1 ===
|
|
37
|
+
(typeof threadList$1 === "function" ? (threadList$1({
|
|
39
38
|
threadList: cloneDeep(values(threadMap)),
|
|
40
39
|
})) : (jsxRuntime.jsx(threadList, {}))), jsxRuntime.jsx("div", { className: "flex-1 h-full", children: jsxRuntime.jsx(thread.Thread, { welcome: welcome, recommends: recommends }) })] }) }));
|
|
41
40
|
});
|
|
@@ -43,13 +42,13 @@ const Chatkit = (props, refFromProps) => {
|
|
|
43
42
|
const { initialConfig, welcome, recommends, onError, toolDisplay, plugins, threadList, showHeader = true, placeholder, expandToolGroup, expandToolDetail, } = props;
|
|
44
43
|
const { currentThread } = useThread();
|
|
45
44
|
const { threadMap } = index$1.useThreadManagerStore();
|
|
46
|
-
const messages = cloneDeep(threadMap[currentThread?.id ||
|
|
45
|
+
const messages = cloneDeep(threadMap[currentThread?.id || ""]?.messages || []) || [];
|
|
47
46
|
const uiMessages = React.useMemo(() => convertToAssistantMessage(messages, {
|
|
48
|
-
toolDisplay: toolDisplay ||
|
|
47
|
+
toolDisplay: toolDisplay || "group",
|
|
49
48
|
}), [messages]);
|
|
50
49
|
const innerRef = React.useRef(null);
|
|
51
50
|
let ref;
|
|
52
|
-
if (typeof refFromProps ===
|
|
51
|
+
if (typeof refFromProps === "function") {
|
|
53
52
|
refFromProps(innerRef.current);
|
|
54
53
|
ref = innerRef;
|
|
55
54
|
}
|
|
@@ -62,8 +61,8 @@ const Chatkit = (props, refFromProps) => {
|
|
|
62
61
|
const runtime = useExternalStoreRuntime.useExternalStoreRuntime({
|
|
63
62
|
messages: uiMessages,
|
|
64
63
|
isLoading: currentThread?.sending,
|
|
65
|
-
isDisabled: !!currentThread?.metadata[
|
|
66
|
-
convertMessage: message => message,
|
|
64
|
+
isDisabled: !!(currentThread?.metadata["isInitingSession"]),
|
|
65
|
+
convertMessage: (message) => message,
|
|
67
66
|
onNew: async (message) => {
|
|
68
67
|
const attachments = await Promise.all(message.attachments?.map(async (item) => {
|
|
69
68
|
return {
|
|
@@ -72,19 +71,19 @@ const Chatkit = (props, refFromProps) => {
|
|
|
72
71
|
};
|
|
73
72
|
}) || []);
|
|
74
73
|
ref.current?.sendMessage({
|
|
75
|
-
attaches: attachments.map(item => ({
|
|
74
|
+
attaches: attachments.map((item) => ({
|
|
76
75
|
id: item.id,
|
|
77
76
|
attachId: item.id,
|
|
78
77
|
url: item.base64,
|
|
79
|
-
status:
|
|
78
|
+
status: "success",
|
|
80
79
|
type: checkMedia(item.contentType),
|
|
81
80
|
mimeType: item.contentType,
|
|
82
81
|
})),
|
|
83
82
|
content: compact([
|
|
84
|
-
...message.content.map(item => {
|
|
85
|
-
if (item.type ===
|
|
83
|
+
...message.content.map((item) => {
|
|
84
|
+
if (item.type === "text") {
|
|
86
85
|
return {
|
|
87
|
-
type:
|
|
86
|
+
type: "text",
|
|
88
87
|
text: item.text,
|
|
89
88
|
};
|
|
90
89
|
}
|
|
@@ -96,10 +95,10 @@ const Chatkit = (props, refFromProps) => {
|
|
|
96
95
|
if (currentThread?.id && parentId)
|
|
97
96
|
ref.current?.reloadMessage(currentThread?.id, parentId);
|
|
98
97
|
else {
|
|
99
|
-
onError?.(new Error(
|
|
98
|
+
onError?.(new Error("未找到对应的对话"));
|
|
100
99
|
useToast.toast({
|
|
101
|
-
title:
|
|
102
|
-
description:
|
|
100
|
+
title: "重载失败",
|
|
101
|
+
description: "未找到对应的对话",
|
|
103
102
|
});
|
|
104
103
|
}
|
|
105
104
|
},
|
|
@@ -114,32 +113,32 @@ const Chatkit = (props, refFromProps) => {
|
|
|
114
113
|
send: async ({ id, file }) => {
|
|
115
114
|
return {
|
|
116
115
|
id,
|
|
117
|
-
type:
|
|
116
|
+
type: "image",
|
|
118
117
|
name: file.name,
|
|
119
118
|
contentType: file.type,
|
|
120
119
|
content: [
|
|
121
120
|
{
|
|
122
|
-
type:
|
|
121
|
+
type: "image",
|
|
123
122
|
image: file.name,
|
|
124
123
|
},
|
|
125
124
|
],
|
|
126
125
|
status: {
|
|
127
|
-
type:
|
|
126
|
+
type: "complete",
|
|
128
127
|
},
|
|
129
128
|
file,
|
|
130
129
|
};
|
|
131
130
|
},
|
|
132
|
-
accept:
|
|
131
|
+
accept: "image/*",
|
|
133
132
|
add: async ({ file }) => {
|
|
134
133
|
return {
|
|
135
134
|
file,
|
|
136
135
|
id: v4(),
|
|
137
|
-
type:
|
|
136
|
+
type: "image",
|
|
138
137
|
name: file.name,
|
|
139
138
|
contentType: file.type,
|
|
140
139
|
status: {
|
|
141
|
-
type:
|
|
142
|
-
reason:
|
|
140
|
+
type: "running",
|
|
141
|
+
reason: "uploading",
|
|
143
142
|
progress: 0,
|
|
144
143
|
},
|
|
145
144
|
};
|
|
@@ -147,7 +146,7 @@ const Chatkit = (props, refFromProps) => {
|
|
|
147
146
|
},
|
|
148
147
|
},
|
|
149
148
|
});
|
|
150
|
-
return (jsxRuntime.jsx("div", { className:
|
|
149
|
+
return (jsxRuntime.jsx("div", { className: "chatkit-wrapper", style: { height: "100%" }, "data-chatkit": true, children: jsxRuntime.jsxs(AssistantRuntimeProvider.AssistantRuntimeProvider, { runtime: runtime, children: [jsxRuntime.jsx(ChatkitImpl, { ref: ref, showHeader: showHeader, recommends: recommends, initialConfig: initialConfig, expandToolGroup: expandToolGroup, expandToolDetail: expandToolDetail, placeholder: placeholder, welcome: welcome, onError: onError, plugins: plugins, threadList: threadList }), jsxRuntime.jsx(toaster.Toaster, {}), jsxRuntime.jsx(executionCard, {})] }) }));
|
|
151
150
|
};
|
|
152
151
|
var index = React.forwardRef(Chatkit);
|
|
153
152
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../src/components/Chatkit/index.tsx"],"sourcesContent":["import {\n ForwardedRef,\n forwardRef,\n MutableRefObject,\n Ref,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { v4 as uuid } from 'uuid';\nimport { ChatkitProps, ChatkitRef } from './types';\nimport { cloneDeep, compact, findLastIndex, isString, values } from 'lodash-es';\nimport { ChatkitProvider } from '@/contexts/ChatkitContext';\nimport useImperativeHandleChatkitRef from './ref';\nimport useThread from '@/hooks/useThread';\nimport { Thread } from '../assistant-ui/thread';\nimport {\n AssistantRuntimeProvider,\n ThreadMessageLike,\n useExternalStoreRuntime,\n} from '@assistant-ui/react';\nimport { useThreadManagerStore, sendMessage, Message } from '@chatkit/core';\nimport convertToAssistantMessage from '@/utils/convertToAssistantMessage';\nimport ThreadList from '../thread-list';\nimport { Thread as ThreadType } from '@chatkit/core/src/types/Thread';\nimport { Toaster } from '../ui/toaster';\nimport { toast } from '@/hooks/use-toast';\nimport ExecutionCard from '../assistant-ui-tools/execution-card';\nimport { convertToBase64 } from '@/utils/convertToBase64';\nimport checkMedia from '@/utils/checkMedia';\nimport { TextMessage } from '@chatkit/core/src/types/Message';\nimport Recommend from '../welcome';\nimport './style.less';\nconst ChatkitImpl = forwardRef(\n (\n props: {\n initialConfig: ChatkitProps['initialConfig'];\n welcome?: React.ReactNode;\n recommends?: string[];\n plugins?: React.ReactNode[];\n onError?: (error: Error) => void;\n placeholder?: string;\n threadList?:\n | React.ReactNode\n | boolean\n | ((props: { threadList: Readonly<ThreadType>[] }) => React.ReactNode);\n showHeader?: boolean;\n expandToolGroup?: boolean;\n expandToolDetail?: boolean;\n expandReasoning?: boolean;\n },\n ref: ForwardedRef<ChatkitRef>,\n ) => {\n const {\n initialConfig,\n welcome,\n recommends,\n onError,\n plugins,\n threadList,\n showHeader = true,\n placeholder,\n expandToolGroup = false,\n expandReasoning = false,\n expandToolDetail = false,\n } = props;\n const { threadMap } = useThreadManagerStore();\n useImperativeHandleChatkitRef(ref, initialConfig, onError);\n\n return (\n <ChatkitProvider\n value={{\n ref: ref as MutableRefObject<ChatkitRef | null>,\n plugins: plugins || [],\n showThreadList: threadList !== false,\n placeholder: placeholder || '请输入内容',\n showHeader,\n expandToolGroup,\n expandToolDetail,\n expandReasoning,\n }}\n >\n <div className=\"flex h-full w-full\">\n {threadList !== false &&\n (typeof threadList === 'function' ? (\n threadList({\n threadList: cloneDeep(values(threadMap)) as ThreadType[],\n })\n ) : (\n <ThreadList />\n ))}\n <div className=\"flex-1 h-full\">\n <Thread welcome={welcome} recommends={recommends} />\n </div>\n </div>\n </ChatkitProvider>\n );\n },\n);\n\nconst Chatkit = (\n props: ChatkitProps,\n refFromProps: ForwardedRef<ChatkitRef>,\n) => {\n const {\n initialConfig,\n welcome,\n recommends,\n onError,\n toolDisplay,\n plugins,\n threadList,\n showHeader = true,\n placeholder,\n expandToolGroup,\n expandToolDetail,\n } = props;\n\n const { currentThread } = useThread();\n\n const { threadMap } = useThreadManagerStore();\n const messages =\n cloneDeep(threadMap[currentThread?.id || '']?.messages || []) || [];\n const uiMessages = useMemo(\n () =>\n convertToAssistantMessage(messages as Readonly<Message>[], {\n toolDisplay: toolDisplay || 'group',\n }),\n [messages],\n );\n\n const innerRef = useRef<ChatkitRef>(null);\n\n let ref: MutableRefObject<ChatkitRef | null>;\n if (typeof refFromProps === 'function') {\n refFromProps(innerRef.current);\n ref = innerRef;\n } else if (refFromProps === null) {\n ref = innerRef;\n } else {\n ref = refFromProps;\n }\n\n const runtime = useExternalStoreRuntime({\n messages: uiMessages,\n isLoading: currentThread?.sending,\n isDisabled: !!currentThread?.metadata['isInitingSession'],\n convertMessage: message => message,\n onNew: async message => {\n const attachments = await Promise.all(\n message.attachments?.map(async item => {\n return {\n ...item,\n base64: await convertToBase64(item.file as File),\n };\n }) || [],\n );\n\n ref.current?.sendMessage({\n attaches: attachments.map(item => ({\n id: item.id,\n attachId: item.id,\n url: item.base64,\n status: 'success',\n type: checkMedia(item.contentType),\n mimeType: item.contentType,\n })),\n content: compact([\n ...message.content.map(item => {\n if (item.type === 'text') {\n return {\n type: 'text',\n text: item.text,\n } as TextMessage;\n }\n }),\n ]),\n });\n },\n onReload: async (parentId, config) => {\n if (currentThread?.id && parentId)\n ref.current?.reloadMessage(currentThread?.id, parentId);\n else {\n onError?.(new Error('未找到对应的对话'));\n toast({\n title: '重载失败',\n description: '未找到对应的对话',\n });\n }\n },\n onCancel: async () => {\n ref.current?.abortMessage();\n },\n adapters: {\n attachments: {\n remove: async ({ id }) => {\n console.log(id);\n },\n send: async ({ id, file }) => {\n return {\n id,\n type: 'image',\n name: file.name,\n contentType: file.type,\n content: [\n {\n type: 'image',\n image: file.name,\n },\n ],\n status: {\n type: 'complete',\n },\n file,\n };\n },\n accept: 'image/*',\n add: async ({ file }) => {\n return {\n file,\n id: uuid(),\n type: 'image',\n name: file.name,\n contentType: file.type,\n status: {\n type: 'running',\n reason: 'uploading',\n progress: 0,\n },\n };\n },\n },\n },\n });\n\n return (\n <div className={'chatkit-wrapper'} style={{ height: '100%' }} data-chatkit>\n <AssistantRuntimeProvider runtime={runtime}>\n <ChatkitImpl\n ref={ref}\n showHeader={showHeader}\n recommends={recommends}\n initialConfig={initialConfig}\n expandToolGroup={expandToolGroup}\n expandToolDetail={expandToolDetail}\n placeholder={placeholder}\n welcome={welcome}\n onError={onError}\n plugins={plugins}\n threadList={threadList}\n />\n <Toaster />\n <ExecutionCard />\n </AssistantRuntimeProvider>\n </div>\n );\n};\n\nexport default forwardRef(Chatkit);\n"],"names":["forwardRef","ref","threadList","useThreadManagerStore","useImperativeHandleChatkitRef","_jsx","ChatkitProvider","_jsxs","ThreadList","Thread","useMemo","useRef","useExternalStoreRuntime","convertToBase64","toast","uuid","AssistantRuntimeProvider","Toaster","ExecutionCard"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../src/components/Chatkit/index.tsx"],"sourcesContent":["\nimport {\n ForwardedRef,\n forwardRef,\n MutableRefObject,\n Ref,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { v4 as uuid } from \"uuid\";\nimport { ChatkitProps, ChatkitRef } from \"./types\";\nimport { cloneDeep, compact, findLastIndex, isString, values } from \"lodash-es\";\nimport { ChatkitProvider,} from \"@/contexts/ChatkitContext\";\nimport useImperativeHandleChatkitRef from \"./ref\";\nimport useThread from \"@/hooks/useThread\";\nimport { Thread } from \"../assistant-ui/thread\";\nimport {\n AssistantRuntimeProvider,\n ThreadMessageLike,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { useThreadManagerStore, sendMessage, Message } from \"@chatkit/core\";\nimport convertToAssistantMessage from \"@/utils/convertToAssistantMessage\";\nimport ThreadList from \"../thread-list\";\nimport { Thread as ThreadType } from \"@chatkit/core/src/types/Thread\";\nimport { Toaster } from \"../ui/toaster\";\nimport { toast } from \"@/hooks/use-toast\";\nimport ExecutionCard from \"../assistant-ui-tools/execution-card\";\nimport { convertToBase64 } from \"@/utils/convertToBase64\";\nimport checkMedia from \"@/utils/checkMedia\";\nimport { TextMessage } from \"@chatkit/core/src/types/Message\";\nimport Recommend from \"../welcome\";\nimport \"./style.less\";\nconst ChatkitImpl = forwardRef(\n (\n props: {\n initialConfig: ChatkitProps[\"initialConfig\"];\n welcome?: React.ReactNode;\n recommends?: string[];\n plugins?: React.ReactNode[];\n onError?: (error: Error) => void;\n placeholder?: string;\n threadList?:\n | React.ReactNode\n | boolean\n | ((props: { threadList: Readonly<ThreadType>[] }) => React.ReactNode);\n showHeader?: boolean;\n expandToolGroup?: boolean;\n expandToolDetail?: boolean;\n },\n ref: ForwardedRef<ChatkitRef>\n ) => {\n const {\n initialConfig,\n welcome,\n recommends,\n onError,\n plugins,\n threadList,\n showHeader = true,\n placeholder,\n expandToolGroup = false,\n expandToolDetail = false,\n } = props;\n const { threadMap } = useThreadManagerStore();\n useImperativeHandleChatkitRef(ref, initialConfig, onError);\n return (\n <ChatkitProvider\n value={{\n ref: ref as MutableRefObject<ChatkitRef | null>,\n plugins: plugins || [],\n showThreadList: threadList !== false,\n placeholder: placeholder || \"请输入内容\",\n showHeader,\n expandToolGroup,\n expandToolDetail,\n }}\n >\n <div className=\"flex h-full w-full\">\n {threadList !== false &&\n (typeof threadList === \"function\" ? (\n threadList({\n threadList: cloneDeep(values(threadMap)) as ThreadType[],\n })\n ) : (\n <ThreadList />\n ))}\n <div className=\"flex-1 h-full\">\n <Thread welcome={welcome} recommends={recommends} />\n </div>\n </div>\n </ChatkitProvider>\n );\n }\n);\n\nconst Chatkit = (\n props: ChatkitProps,\n refFromProps: ForwardedRef<ChatkitRef>\n) => {\n const {\n initialConfig,\n welcome,\n recommends,\n onError,\n toolDisplay,\n plugins,\n threadList,\n showHeader = true,\n placeholder,\n expandToolGroup,\n expandToolDetail,\n } = props;\n\n const { currentThread } = useThread();\n\n const { threadMap } = useThreadManagerStore();\n const messages =\n cloneDeep(threadMap[currentThread?.id || \"\"]?.messages || []) || [];\n const uiMessages = useMemo(\n () =>\n convertToAssistantMessage(messages as Readonly<Message>[], {\n toolDisplay: toolDisplay || \"group\",\n }),\n [messages]\n );\n\n const innerRef = useRef<ChatkitRef>(null);\n\n let ref: MutableRefObject<ChatkitRef | null>;\n if (typeof refFromProps === \"function\") {\n refFromProps(innerRef.current);\n ref = innerRef;\n } else if (refFromProps === null) {\n ref = innerRef;\n } else {\n ref = refFromProps;\n }\n\n\n const runtime = useExternalStoreRuntime({\n messages: uiMessages,\n isLoading: currentThread?.sending,\n isDisabled: !!(currentThread?.metadata[\"isInitingSession\"]),\n convertMessage: (message) => message,\n onNew: async (message) => {\n const attachments = await Promise.all(\n message.attachments?.map(async (item) => {\n return {\n ...item,\n base64: await convertToBase64(item.file as File),\n };\n }) || []\n );\n\n ref.current?.sendMessage({\n attaches: attachments.map((item) => ({\n id: item.id,\n attachId: item.id,\n url: item.base64,\n status: \"success\",\n type: checkMedia(item.contentType),\n mimeType: item.contentType,\n })),\n content: compact([\n ...message.content.map((item) => {\n if (item.type === \"text\") {\n return {\n type: \"text\",\n text: item.text,\n } as TextMessage;\n }\n }),\n ]),\n });\n },\n onReload: async (parentId, config) => {\n if (currentThread?.id && parentId)\n ref.current?.reloadMessage(currentThread?.id, parentId);\n else {\n onError?.(new Error(\"未找到对应的对话\"));\n toast({\n title: \"重载失败\",\n description: \"未找到对应的对话\",\n });\n }\n },\n onCancel: async () => {\n ref.current?.abortMessage();\n },\n adapters: {\n attachments: {\n remove: async ({ id }) => {\n console.log(id);\n },\n send: async ({ id, file }) => {\n return {\n id,\n type: \"image\",\n name: file.name,\n contentType: file.type,\n content: [\n {\n type: \"image\",\n image: file.name,\n },\n ],\n status: {\n type: \"complete\",\n },\n file,\n };\n },\n accept: \"image/*\",\n add: async ({ file }) => {\n return {\n file,\n id: uuid(),\n type: \"image\",\n name: file.name,\n contentType: file.type,\n status: {\n type: \"running\",\n reason: \"uploading\",\n progress: 0,\n },\n };\n },\n },\n },\n });\n\n return (\n <div className={\"chatkit-wrapper\"} style={{ height: \"100%\" }} data-chatkit>\n <AssistantRuntimeProvider runtime={runtime}>\n <ChatkitImpl\n ref={ref}\n showHeader={showHeader}\n recommends={recommends}\n initialConfig={initialConfig}\n expandToolGroup={expandToolGroup}\n expandToolDetail={expandToolDetail}\n placeholder={placeholder}\n welcome={welcome}\n onError={onError}\n plugins={plugins}\n threadList={threadList}\n />\n <Toaster />\n <ExecutionCard />\n </AssistantRuntimeProvider>\n </div>\n );\n};\n\nexport default forwardRef(Chatkit);\n"],"names":["forwardRef","ref","threadList","useThreadManagerStore","useImperativeHandleChatkitRef","_jsx","ChatkitProvider","_jsxs","ThreadList","Thread","useMemo","useRef","useExternalStoreRuntime","convertToBase64","toast","uuid","AssistantRuntimeProvider","Toaster","ExecutionCard"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { ChatkitProps, ChatkitRef } from
|
|
2
|
-
import
|
|
1
|
+
import { ChatkitProps, ChatkitRef } from "./types";
|
|
2
|
+
import "./style.less";
|
|
3
3
|
declare const _default: import("react").ForwardRefExoticComponent<ChatkitProps & import("react").RefAttributes<ChatkitRef>>;
|
|
4
4
|
export default _default;
|
|
5
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Chatkit/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Chatkit/index.tsx"],"names":[],"mappings":"AAWA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAsBnD,OAAO,cAAc,CAAC;;AA+NtB,wBAAmC"}
|
|
@@ -20,20 +20,19 @@ import v4 from '../../node_modules/.pnpm/uuid@13.0.0/node_modules/uuid/dist/v4.j
|
|
|
20
20
|
import { AssistantRuntimeProvider } from '../../node_modules/.pnpm/@assistant-ui_react@0.11.37_patch_hash_ynfhbcwv6lgckkdmenopdkbtmq_@types_react-dom@17.0.2_@ty_7dz2xsf2ib2guiutzhjhoerypu/node_modules/@assistant-ui/react/dist/legacy-runtime/AssistantRuntimeProvider.js';
|
|
21
21
|
|
|
22
22
|
const ChatkitImpl = forwardRef((props, ref) => {
|
|
23
|
-
const { initialConfig, welcome, recommends, onError, plugins, threadList, showHeader = true, placeholder, expandToolGroup = false,
|
|
23
|
+
const { initialConfig, welcome, recommends, onError, plugins, threadList, showHeader = true, placeholder, expandToolGroup = false, expandToolDetail = false, } = props;
|
|
24
24
|
const { threadMap } = useThreadManagerStore();
|
|
25
25
|
useImperativeHandleChatkitRef(ref, initialConfig, onError);
|
|
26
26
|
return (jsx(ChatkitProvider, { value: {
|
|
27
27
|
ref: ref,
|
|
28
28
|
plugins: plugins || [],
|
|
29
29
|
showThreadList: threadList !== false,
|
|
30
|
-
placeholder: placeholder ||
|
|
30
|
+
placeholder: placeholder || "请输入内容",
|
|
31
31
|
showHeader,
|
|
32
32
|
expandToolGroup,
|
|
33
33
|
expandToolDetail,
|
|
34
|
-
expandReasoning,
|
|
35
34
|
}, children: jsxs("div", { className: "flex h-full w-full", children: [threadList !== false &&
|
|
36
|
-
(typeof threadList ===
|
|
35
|
+
(typeof threadList === "function" ? (threadList({
|
|
37
36
|
threadList: cloneDeep(values(threadMap)),
|
|
38
37
|
})) : (jsx(ThreadList, {}))), jsx("div", { className: "flex-1 h-full", children: jsx(Thread, { welcome: welcome, recommends: recommends }) })] }) }));
|
|
39
38
|
});
|
|
@@ -41,13 +40,13 @@ const Chatkit = (props, refFromProps) => {
|
|
|
41
40
|
const { initialConfig, welcome, recommends, onError, toolDisplay, plugins, threadList, showHeader = true, placeholder, expandToolGroup, expandToolDetail, } = props;
|
|
42
41
|
const { currentThread } = useThread();
|
|
43
42
|
const { threadMap } = useThreadManagerStore();
|
|
44
|
-
const messages = cloneDeep(threadMap[currentThread?.id ||
|
|
43
|
+
const messages = cloneDeep(threadMap[currentThread?.id || ""]?.messages || []) || [];
|
|
45
44
|
const uiMessages = useMemo(() => convertToAssistantMessage(messages, {
|
|
46
|
-
toolDisplay: toolDisplay ||
|
|
45
|
+
toolDisplay: toolDisplay || "group",
|
|
47
46
|
}), [messages]);
|
|
48
47
|
const innerRef = useRef(null);
|
|
49
48
|
let ref;
|
|
50
|
-
if (typeof refFromProps ===
|
|
49
|
+
if (typeof refFromProps === "function") {
|
|
51
50
|
refFromProps(innerRef.current);
|
|
52
51
|
ref = innerRef;
|
|
53
52
|
}
|
|
@@ -60,8 +59,8 @@ const Chatkit = (props, refFromProps) => {
|
|
|
60
59
|
const runtime = useExternalStoreRuntime({
|
|
61
60
|
messages: uiMessages,
|
|
62
61
|
isLoading: currentThread?.sending,
|
|
63
|
-
isDisabled: !!currentThread?.metadata[
|
|
64
|
-
convertMessage: message => message,
|
|
62
|
+
isDisabled: !!(currentThread?.metadata["isInitingSession"]),
|
|
63
|
+
convertMessage: (message) => message,
|
|
65
64
|
onNew: async (message) => {
|
|
66
65
|
const attachments = await Promise.all(message.attachments?.map(async (item) => {
|
|
67
66
|
return {
|
|
@@ -70,19 +69,19 @@ const Chatkit = (props, refFromProps) => {
|
|
|
70
69
|
};
|
|
71
70
|
}) || []);
|
|
72
71
|
ref.current?.sendMessage({
|
|
73
|
-
attaches: attachments.map(item => ({
|
|
72
|
+
attaches: attachments.map((item) => ({
|
|
74
73
|
id: item.id,
|
|
75
74
|
attachId: item.id,
|
|
76
75
|
url: item.base64,
|
|
77
|
-
status:
|
|
76
|
+
status: "success",
|
|
78
77
|
type: checkMedia(item.contentType),
|
|
79
78
|
mimeType: item.contentType,
|
|
80
79
|
})),
|
|
81
80
|
content: compact([
|
|
82
|
-
...message.content.map(item => {
|
|
83
|
-
if (item.type ===
|
|
81
|
+
...message.content.map((item) => {
|
|
82
|
+
if (item.type === "text") {
|
|
84
83
|
return {
|
|
85
|
-
type:
|
|
84
|
+
type: "text",
|
|
86
85
|
text: item.text,
|
|
87
86
|
};
|
|
88
87
|
}
|
|
@@ -94,10 +93,10 @@ const Chatkit = (props, refFromProps) => {
|
|
|
94
93
|
if (currentThread?.id && parentId)
|
|
95
94
|
ref.current?.reloadMessage(currentThread?.id, parentId);
|
|
96
95
|
else {
|
|
97
|
-
onError?.(new Error(
|
|
96
|
+
onError?.(new Error("未找到对应的对话"));
|
|
98
97
|
toast({
|
|
99
|
-
title:
|
|
100
|
-
description:
|
|
98
|
+
title: "重载失败",
|
|
99
|
+
description: "未找到对应的对话",
|
|
101
100
|
});
|
|
102
101
|
}
|
|
103
102
|
},
|
|
@@ -112,32 +111,32 @@ const Chatkit = (props, refFromProps) => {
|
|
|
112
111
|
send: async ({ id, file }) => {
|
|
113
112
|
return {
|
|
114
113
|
id,
|
|
115
|
-
type:
|
|
114
|
+
type: "image",
|
|
116
115
|
name: file.name,
|
|
117
116
|
contentType: file.type,
|
|
118
117
|
content: [
|
|
119
118
|
{
|
|
120
|
-
type:
|
|
119
|
+
type: "image",
|
|
121
120
|
image: file.name,
|
|
122
121
|
},
|
|
123
122
|
],
|
|
124
123
|
status: {
|
|
125
|
-
type:
|
|
124
|
+
type: "complete",
|
|
126
125
|
},
|
|
127
126
|
file,
|
|
128
127
|
};
|
|
129
128
|
},
|
|
130
|
-
accept:
|
|
129
|
+
accept: "image/*",
|
|
131
130
|
add: async ({ file }) => {
|
|
132
131
|
return {
|
|
133
132
|
file,
|
|
134
133
|
id: v4(),
|
|
135
|
-
type:
|
|
134
|
+
type: "image",
|
|
136
135
|
name: file.name,
|
|
137
136
|
contentType: file.type,
|
|
138
137
|
status: {
|
|
139
|
-
type:
|
|
140
|
-
reason:
|
|
138
|
+
type: "running",
|
|
139
|
+
reason: "uploading",
|
|
141
140
|
progress: 0,
|
|
142
141
|
},
|
|
143
142
|
};
|
|
@@ -145,7 +144,7 @@ const Chatkit = (props, refFromProps) => {
|
|
|
145
144
|
},
|
|
146
145
|
},
|
|
147
146
|
});
|
|
148
|
-
return (jsx("div", { className:
|
|
147
|
+
return (jsx("div", { className: "chatkit-wrapper", style: { height: "100%" }, "data-chatkit": true, children: jsxs(AssistantRuntimeProvider, { runtime: runtime, children: [jsx(ChatkitImpl, { ref: ref, showHeader: showHeader, recommends: recommends, initialConfig: initialConfig, expandToolGroup: expandToolGroup, expandToolDetail: expandToolDetail, placeholder: placeholder, welcome: welcome, onError: onError, plugins: plugins, threadList: threadList }), jsx(Toaster, {}), jsx(ExecutionCard, {})] }) }));
|
|
149
148
|
};
|
|
150
149
|
var index = forwardRef(Chatkit);
|
|
151
150
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/Chatkit/index.tsx"],"sourcesContent":["import {\n ForwardedRef,\n forwardRef,\n MutableRefObject,\n Ref,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { v4 as uuid } from 'uuid';\nimport { ChatkitProps, ChatkitRef } from './types';\nimport { cloneDeep, compact, findLastIndex, isString, values } from 'lodash-es';\nimport { ChatkitProvider } from '@/contexts/ChatkitContext';\nimport useImperativeHandleChatkitRef from './ref';\nimport useThread from '@/hooks/useThread';\nimport { Thread } from '../assistant-ui/thread';\nimport {\n AssistantRuntimeProvider,\n ThreadMessageLike,\n useExternalStoreRuntime,\n} from '@assistant-ui/react';\nimport { useThreadManagerStore, sendMessage, Message } from '@chatkit/core';\nimport convertToAssistantMessage from '@/utils/convertToAssistantMessage';\nimport ThreadList from '../thread-list';\nimport { Thread as ThreadType } from '@chatkit/core/src/types/Thread';\nimport { Toaster } from '../ui/toaster';\nimport { toast } from '@/hooks/use-toast';\nimport ExecutionCard from '../assistant-ui-tools/execution-card';\nimport { convertToBase64 } from '@/utils/convertToBase64';\nimport checkMedia from '@/utils/checkMedia';\nimport { TextMessage } from '@chatkit/core/src/types/Message';\nimport Recommend from '../welcome';\nimport './style.less';\nconst ChatkitImpl = forwardRef(\n (\n props: {\n initialConfig: ChatkitProps['initialConfig'];\n welcome?: React.ReactNode;\n recommends?: string[];\n plugins?: React.ReactNode[];\n onError?: (error: Error) => void;\n placeholder?: string;\n threadList?:\n | React.ReactNode\n | boolean\n | ((props: { threadList: Readonly<ThreadType>[] }) => React.ReactNode);\n showHeader?: boolean;\n expandToolGroup?: boolean;\n expandToolDetail?: boolean;\n expandReasoning?: boolean;\n },\n ref: ForwardedRef<ChatkitRef>,\n ) => {\n const {\n initialConfig,\n welcome,\n recommends,\n onError,\n plugins,\n threadList,\n showHeader = true,\n placeholder,\n expandToolGroup = false,\n expandReasoning = false,\n expandToolDetail = false,\n } = props;\n const { threadMap } = useThreadManagerStore();\n useImperativeHandleChatkitRef(ref, initialConfig, onError);\n\n return (\n <ChatkitProvider\n value={{\n ref: ref as MutableRefObject<ChatkitRef | null>,\n plugins: plugins || [],\n showThreadList: threadList !== false,\n placeholder: placeholder || '请输入内容',\n showHeader,\n expandToolGroup,\n expandToolDetail,\n expandReasoning,\n }}\n >\n <div className=\"flex h-full w-full\">\n {threadList !== false &&\n (typeof threadList === 'function' ? (\n threadList({\n threadList: cloneDeep(values(threadMap)) as ThreadType[],\n })\n ) : (\n <ThreadList />\n ))}\n <div className=\"flex-1 h-full\">\n <Thread welcome={welcome} recommends={recommends} />\n </div>\n </div>\n </ChatkitProvider>\n );\n },\n);\n\nconst Chatkit = (\n props: ChatkitProps,\n refFromProps: ForwardedRef<ChatkitRef>,\n) => {\n const {\n initialConfig,\n welcome,\n recommends,\n onError,\n toolDisplay,\n plugins,\n threadList,\n showHeader = true,\n placeholder,\n expandToolGroup,\n expandToolDetail,\n } = props;\n\n const { currentThread } = useThread();\n\n const { threadMap } = useThreadManagerStore();\n const messages =\n cloneDeep(threadMap[currentThread?.id || '']?.messages || []) || [];\n const uiMessages = useMemo(\n () =>\n convertToAssistantMessage(messages as Readonly<Message>[], {\n toolDisplay: toolDisplay || 'group',\n }),\n [messages],\n );\n\n const innerRef = useRef<ChatkitRef>(null);\n\n let ref: MutableRefObject<ChatkitRef | null>;\n if (typeof refFromProps === 'function') {\n refFromProps(innerRef.current);\n ref = innerRef;\n } else if (refFromProps === null) {\n ref = innerRef;\n } else {\n ref = refFromProps;\n }\n\n const runtime = useExternalStoreRuntime({\n messages: uiMessages,\n isLoading: currentThread?.sending,\n isDisabled: !!currentThread?.metadata['isInitingSession'],\n convertMessage: message => message,\n onNew: async message => {\n const attachments = await Promise.all(\n message.attachments?.map(async item => {\n return {\n ...item,\n base64: await convertToBase64(item.file as File),\n };\n }) || [],\n );\n\n ref.current?.sendMessage({\n attaches: attachments.map(item => ({\n id: item.id,\n attachId: item.id,\n url: item.base64,\n status: 'success',\n type: checkMedia(item.contentType),\n mimeType: item.contentType,\n })),\n content: compact([\n ...message.content.map(item => {\n if (item.type === 'text') {\n return {\n type: 'text',\n text: item.text,\n } as TextMessage;\n }\n }),\n ]),\n });\n },\n onReload: async (parentId, config) => {\n if (currentThread?.id && parentId)\n ref.current?.reloadMessage(currentThread?.id, parentId);\n else {\n onError?.(new Error('未找到对应的对话'));\n toast({\n title: '重载失败',\n description: '未找到对应的对话',\n });\n }\n },\n onCancel: async () => {\n ref.current?.abortMessage();\n },\n adapters: {\n attachments: {\n remove: async ({ id }) => {\n console.log(id);\n },\n send: async ({ id, file }) => {\n return {\n id,\n type: 'image',\n name: file.name,\n contentType: file.type,\n content: [\n {\n type: 'image',\n image: file.name,\n },\n ],\n status: {\n type: 'complete',\n },\n file,\n };\n },\n accept: 'image/*',\n add: async ({ file }) => {\n return {\n file,\n id: uuid(),\n type: 'image',\n name: file.name,\n contentType: file.type,\n status: {\n type: 'running',\n reason: 'uploading',\n progress: 0,\n },\n };\n },\n },\n },\n });\n\n return (\n <div className={'chatkit-wrapper'} style={{ height: '100%' }} data-chatkit>\n <AssistantRuntimeProvider runtime={runtime}>\n <ChatkitImpl\n ref={ref}\n showHeader={showHeader}\n recommends={recommends}\n initialConfig={initialConfig}\n expandToolGroup={expandToolGroup}\n expandToolDetail={expandToolDetail}\n placeholder={placeholder}\n welcome={welcome}\n onError={onError}\n plugins={plugins}\n threadList={threadList}\n />\n <Toaster />\n <ExecutionCard />\n </AssistantRuntimeProvider>\n </div>\n );\n};\n\nexport default forwardRef(Chatkit);\n"],"names":["_jsx","_jsxs","uuid"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAiCA,MAAM,WAAW,GAAG,UAAU,CAC5B,CACE,KAeC,EACD,GAA6B,KAC3B;AACF,IAAA,MAAM,EACJ,aAAa,EACb,OAAO,EACP,UAAU,EACV,OAAO,EACP,OAAO,EACP,UAAU,EACV,UAAU,GAAG,IAAI,EACjB,WAAW,EACX,eAAe,GAAG,KAAK,EACvB,eAAe,GAAG,KAAK,EACvB,gBAAgB,GAAG,KAAK,GACzB,GAAG,KAAK,CAAC;AACV,IAAA,MAAM,EAAE,SAAS,EAAE,GAAG,qBAAqB,EAAE,CAAC;AAC9C,IAAA,6BAA6B,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;AAE3D,IAAA,QACEA,GAAA,CAAC,eAAe,EAAA,EACd,KAAK,EAAE;AACL,YAAA,GAAG,EAAE,GAA0C;YAC/C,OAAO,EAAE,OAAO,IAAI,EAAE;YACtB,cAAc,EAAE,UAAU,KAAK,KAAK;YACpC,WAAW,EAAE,WAAW,IAAI,OAAO;YACnC,UAAU;YACV,eAAe;YACf,gBAAgB;YAChB,eAAe;AAChB,SAAA,EAAA,QAAA,EAEDC,cAAK,SAAS,EAAC,oBAAoB,EAChC,QAAA,EAAA,CAAA,UAAU,KAAK,KAAK;qBAClB,OAAO,UAAU,KAAK,UAAU,IAC/B,UAAU,CAAC;AACT,wBAAA,UAAU,EAAE,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAiB;AACzD,qBAAA,CAAC,KAEFD,GAAA,CAAC,UAAU,EAAA,EAAA,CAAG,CACf,CAAC,EACJA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,eAAe,EAC5B,QAAA,EAAAA,GAAA,CAAC,MAAM,EAAA,EAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAI,CAAA,EAAA,CAChD,CACF,EAAA,CAAA,EAAA,CACU,EAClB;AACJ,CAAC,CACF,CAAC;AAEF,MAAM,OAAO,GAAG,CACd,KAAmB,EACnB,YAAsC,KACpC;IACF,MAAM,EACJ,aAAa,EACb,OAAO,EACP,UAAU,EACV,OAAO,EACP,WAAW,EACX,OAAO,EACP,UAAU,EACV,UAAU,GAAG,IAAI,EACjB,WAAW,EACX,eAAe,EACf,gBAAgB,GACjB,GAAG,KAAK,CAAC;AAEV,IAAA,MAAM,EAAE,aAAa,EAAE,GAAG,SAAS,EAAE,CAAC;AAEtC,IAAA,MAAM,EAAE,SAAS,EAAE,GAAG,qBAAqB,EAAE,CAAC;AAC9C,IAAA,MAAM,QAAQ,GACZ,SAAS,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;IACtE,MAAM,UAAU,GAAG,OAAO,CACxB,MACE,yBAAyB,CAAC,QAA+B,EAAE;QACzD,WAAW,EAAE,WAAW,IAAI,OAAO;AACpC,KAAA,CAAC,EACJ,CAAC,QAAQ,CAAC,CACX,CAAC;AAEF,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAa,IAAI,CAAC,CAAC;AAE1C,IAAA,IAAI,GAAwC,CAAC;AAC7C,IAAA,IAAI,OAAO,YAAY,KAAK,UAAU,EAAE;AACtC,QAAA,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC/B,GAAG,GAAG,QAAQ,CAAC;KAChB;AAAM,SAAA,IAAI,YAAY,KAAK,IAAI,EAAE;QAChC,GAAG,GAAG,QAAQ,CAAC;KAChB;SAAM;QACL,GAAG,GAAG,YAAY,CAAC;KACpB;IAED,MAAM,OAAO,GAAG,uBAAuB,CAAC;AACtC,QAAA,QAAQ,EAAE,UAAU;QACpB,SAAS,EAAE,aAAa,EAAE,OAAO;QACjC,UAAU,EAAE,CAAC,CAAC,aAAa,EAAE,QAAQ,CAAC,kBAAkB,CAAC;AACzD,QAAA,cAAc,EAAE,OAAO,IAAI,OAAO;AAClC,QAAA,KAAK,EAAE,OAAM,OAAO,KAAG;AACrB,YAAA,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,GAAG,CACnC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,OAAM,IAAI,KAAG;gBACpC,OAAO;AACL,oBAAA,GAAG,IAAI;AACP,oBAAA,MAAM,EAAE,MAAM,eAAe,CAAC,IAAI,CAAC,IAAY,CAAC;iBACjD,CAAC;AACJ,aAAC,CAAC,IAAI,EAAE,CACT,CAAC;AAEF,YAAA,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC;gBACvB,QAAQ,EAAE,WAAW,CAAC,GAAG,CAAC,IAAI,KAAK;oBACjC,EAAE,EAAE,IAAI,CAAC,EAAE;oBACX,QAAQ,EAAE,IAAI,CAAC,EAAE;oBACjB,GAAG,EAAE,IAAI,CAAC,MAAM;AAChB,oBAAA,MAAM,EAAE,SAAS;AACjB,oBAAA,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC;oBAClC,QAAQ,EAAE,IAAI,CAAC,WAAW;AAC3B,iBAAA,CAAC,CAAC;gBACH,OAAO,EAAE,OAAO,CAAC;oBACf,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAG;AAC5B,wBAAA,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE;4BACxB,OAAO;AACL,gCAAA,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE,IAAI,CAAC,IAAI;6BACD,CAAC;yBAClB;AACH,qBAAC,CAAC;iBACH,CAAC;AACH,aAAA,CAAC,CAAC;SACJ;AACD,QAAA,QAAQ,EAAE,OAAO,QAAQ,EAAE,MAAM,KAAI;AACnC,YAAA,IAAI,aAAa,EAAE,EAAE,IAAI,QAAQ;gBAC/B,GAAG,CAAC,OAAO,EAAE,aAAa,CAAC,aAAa,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;iBACrD;gBACH,OAAO,GAAG,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;AACjC,gBAAA,KAAK,CAAC;AACJ,oBAAA,KAAK,EAAE,MAAM;AACb,oBAAA,WAAW,EAAE,UAAU;AACxB,iBAAA,CAAC,CAAC;aACJ;SACF;QACD,QAAQ,EAAE,YAAW;AACnB,YAAA,GAAG,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC;SAC7B;AACD,QAAA,QAAQ,EAAE;AACR,YAAA,WAAW,EAAE;AACX,gBAAA,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,KAAI;AACvB,oBAAA,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;iBACjB;gBACD,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAI;oBAC3B,OAAO;wBACL,EAAE;AACF,wBAAA,IAAI,EAAE,OAAO;wBACb,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,WAAW,EAAE,IAAI,CAAC,IAAI;AACtB,wBAAA,OAAO,EAAE;AACP,4BAAA;AACE,gCAAA,IAAI,EAAE,OAAO;gCACb,KAAK,EAAE,IAAI,CAAC,IAAI;AACjB,6BAAA;AACF,yBAAA;AACD,wBAAA,MAAM,EAAE;AACN,4BAAA,IAAI,EAAE,UAAU;AACjB,yBAAA;wBACD,IAAI;qBACL,CAAC;iBACH;AACD,gBAAA,MAAM,EAAE,SAAS;AACjB,gBAAA,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,KAAI;oBACtB,OAAO;wBACL,IAAI;wBACJ,EAAE,EAAEE,EAAI,EAAE;AACV,wBAAA,IAAI,EAAE,OAAO;wBACb,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,WAAW,EAAE,IAAI,CAAC,IAAI;AACtB,wBAAA,MAAM,EAAE;AACN,4BAAA,IAAI,EAAE,SAAS;AACf,4BAAA,MAAM,EAAE,WAAW;AACnB,4BAAA,QAAQ,EAAE,CAAC;AACZ,yBAAA;qBACF,CAAC;iBACH;AACF,aAAA;AACF,SAAA;AACF,KAAA,CAAC,CAAC;AAEH,IAAA,QACEF,GAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,iBAAiB,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAC1D,cAAA,EAAA,IAAA,EAAA,QAAA,EAAAC,IAAA,CAAC,wBAAwB,EAAC,EAAA,OAAO,EAAE,OAAO,aACxCD,GAAC,CAAA,WAAW,EACV,EAAA,GAAG,EAAE,GAAG,EACR,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,aAAa,EAC5B,eAAe,EAAE,eAAe,EAChC,gBAAgB,EAAE,gBAAgB,EAClC,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,UAAU,GACtB,EACFA,GAAA,CAAC,OAAO,EAAA,EAAA,CAAG,EACXA,GAAC,CAAA,aAAa,KAAG,CACQ,EAAA,CAAA,EAAA,CACvB,EACN;AACJ,CAAC,CAAC;AAEF,YAAe,UAAU,CAAC,OAAO,CAAC;;;;"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/Chatkit/index.tsx"],"sourcesContent":["\nimport {\n ForwardedRef,\n forwardRef,\n MutableRefObject,\n Ref,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { v4 as uuid } from \"uuid\";\nimport { ChatkitProps, ChatkitRef } from \"./types\";\nimport { cloneDeep, compact, findLastIndex, isString, values } from \"lodash-es\";\nimport { ChatkitProvider,} from \"@/contexts/ChatkitContext\";\nimport useImperativeHandleChatkitRef from \"./ref\";\nimport useThread from \"@/hooks/useThread\";\nimport { Thread } from \"../assistant-ui/thread\";\nimport {\n AssistantRuntimeProvider,\n ThreadMessageLike,\n useExternalStoreRuntime,\n} from \"@assistant-ui/react\";\nimport { useThreadManagerStore, sendMessage, Message } from \"@chatkit/core\";\nimport convertToAssistantMessage from \"@/utils/convertToAssistantMessage\";\nimport ThreadList from \"../thread-list\";\nimport { Thread as ThreadType } from \"@chatkit/core/src/types/Thread\";\nimport { Toaster } from \"../ui/toaster\";\nimport { toast } from \"@/hooks/use-toast\";\nimport ExecutionCard from \"../assistant-ui-tools/execution-card\";\nimport { convertToBase64 } from \"@/utils/convertToBase64\";\nimport checkMedia from \"@/utils/checkMedia\";\nimport { TextMessage } from \"@chatkit/core/src/types/Message\";\nimport Recommend from \"../welcome\";\nimport \"./style.less\";\nconst ChatkitImpl = forwardRef(\n (\n props: {\n initialConfig: ChatkitProps[\"initialConfig\"];\n welcome?: React.ReactNode;\n recommends?: string[];\n plugins?: React.ReactNode[];\n onError?: (error: Error) => void;\n placeholder?: string;\n threadList?:\n | React.ReactNode\n | boolean\n | ((props: { threadList: Readonly<ThreadType>[] }) => React.ReactNode);\n showHeader?: boolean;\n expandToolGroup?: boolean;\n expandToolDetail?: boolean;\n },\n ref: ForwardedRef<ChatkitRef>\n ) => {\n const {\n initialConfig,\n welcome,\n recommends,\n onError,\n plugins,\n threadList,\n showHeader = true,\n placeholder,\n expandToolGroup = false,\n expandToolDetail = false,\n } = props;\n const { threadMap } = useThreadManagerStore();\n useImperativeHandleChatkitRef(ref, initialConfig, onError);\n return (\n <ChatkitProvider\n value={{\n ref: ref as MutableRefObject<ChatkitRef | null>,\n plugins: plugins || [],\n showThreadList: threadList !== false,\n placeholder: placeholder || \"请输入内容\",\n showHeader,\n expandToolGroup,\n expandToolDetail,\n }}\n >\n <div className=\"flex h-full w-full\">\n {threadList !== false &&\n (typeof threadList === \"function\" ? (\n threadList({\n threadList: cloneDeep(values(threadMap)) as ThreadType[],\n })\n ) : (\n <ThreadList />\n ))}\n <div className=\"flex-1 h-full\">\n <Thread welcome={welcome} recommends={recommends} />\n </div>\n </div>\n </ChatkitProvider>\n );\n }\n);\n\nconst Chatkit = (\n props: ChatkitProps,\n refFromProps: ForwardedRef<ChatkitRef>\n) => {\n const {\n initialConfig,\n welcome,\n recommends,\n onError,\n toolDisplay,\n plugins,\n threadList,\n showHeader = true,\n placeholder,\n expandToolGroup,\n expandToolDetail,\n } = props;\n\n const { currentThread } = useThread();\n\n const { threadMap } = useThreadManagerStore();\n const messages =\n cloneDeep(threadMap[currentThread?.id || \"\"]?.messages || []) || [];\n const uiMessages = useMemo(\n () =>\n convertToAssistantMessage(messages as Readonly<Message>[], {\n toolDisplay: toolDisplay || \"group\",\n }),\n [messages]\n );\n\n const innerRef = useRef<ChatkitRef>(null);\n\n let ref: MutableRefObject<ChatkitRef | null>;\n if (typeof refFromProps === \"function\") {\n refFromProps(innerRef.current);\n ref = innerRef;\n } else if (refFromProps === null) {\n ref = innerRef;\n } else {\n ref = refFromProps;\n }\n\n\n const runtime = useExternalStoreRuntime({\n messages: uiMessages,\n isLoading: currentThread?.sending,\n isDisabled: !!(currentThread?.metadata[\"isInitingSession\"]),\n convertMessage: (message) => message,\n onNew: async (message) => {\n const attachments = await Promise.all(\n message.attachments?.map(async (item) => {\n return {\n ...item,\n base64: await convertToBase64(item.file as File),\n };\n }) || []\n );\n\n ref.current?.sendMessage({\n attaches: attachments.map((item) => ({\n id: item.id,\n attachId: item.id,\n url: item.base64,\n status: \"success\",\n type: checkMedia(item.contentType),\n mimeType: item.contentType,\n })),\n content: compact([\n ...message.content.map((item) => {\n if (item.type === \"text\") {\n return {\n type: \"text\",\n text: item.text,\n } as TextMessage;\n }\n }),\n ]),\n });\n },\n onReload: async (parentId, config) => {\n if (currentThread?.id && parentId)\n ref.current?.reloadMessage(currentThread?.id, parentId);\n else {\n onError?.(new Error(\"未找到对应的对话\"));\n toast({\n title: \"重载失败\",\n description: \"未找到对应的对话\",\n });\n }\n },\n onCancel: async () => {\n ref.current?.abortMessage();\n },\n adapters: {\n attachments: {\n remove: async ({ id }) => {\n console.log(id);\n },\n send: async ({ id, file }) => {\n return {\n id,\n type: \"image\",\n name: file.name,\n contentType: file.type,\n content: [\n {\n type: \"image\",\n image: file.name,\n },\n ],\n status: {\n type: \"complete\",\n },\n file,\n };\n },\n accept: \"image/*\",\n add: async ({ file }) => {\n return {\n file,\n id: uuid(),\n type: \"image\",\n name: file.name,\n contentType: file.type,\n status: {\n type: \"running\",\n reason: \"uploading\",\n progress: 0,\n },\n };\n },\n },\n },\n });\n\n return (\n <div className={\"chatkit-wrapper\"} style={{ height: \"100%\" }} data-chatkit>\n <AssistantRuntimeProvider runtime={runtime}>\n <ChatkitImpl\n ref={ref}\n showHeader={showHeader}\n recommends={recommends}\n initialConfig={initialConfig}\n expandToolGroup={expandToolGroup}\n expandToolDetail={expandToolDetail}\n placeholder={placeholder}\n welcome={welcome}\n onError={onError}\n plugins={plugins}\n threadList={threadList}\n />\n <Toaster />\n <ExecutionCard />\n </AssistantRuntimeProvider>\n </div>\n );\n};\n\nexport default forwardRef(Chatkit);\n"],"names":["_jsx","_jsxs","uuid"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAkCA,MAAM,WAAW,GAAG,UAAU,CAC5B,CACE,KAcC,EACD,GAA6B,KAC3B;AACF,IAAA,MAAM,EACJ,aAAa,EACb,OAAO,EACP,UAAU,EACV,OAAO,EACP,OAAO,EACP,UAAU,EACV,UAAU,GAAG,IAAI,EACjB,WAAW,EACX,eAAe,GAAG,KAAK,EACvB,gBAAgB,GAAG,KAAK,GACzB,GAAG,KAAK,CAAC;AACV,IAAA,MAAM,EAAE,SAAS,EAAE,GAAG,qBAAqB,EAAE,CAAC;AAC9C,IAAA,6BAA6B,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;AAC3D,IAAA,QACEA,GAAA,CAAC,eAAe,EAAA,EACd,KAAK,EAAE;AACL,YAAA,GAAG,EAAE,GAA0C;YAC/C,OAAO,EAAE,OAAO,IAAI,EAAE;YACtB,cAAc,EAAE,UAAU,KAAK,KAAK;YACpC,WAAW,EAAE,WAAW,IAAI,OAAO;YACnC,UAAU;YACV,eAAe;YACf,gBAAgB;AACjB,SAAA,EAAA,QAAA,EAEDC,cAAK,SAAS,EAAC,oBAAoB,EAChC,QAAA,EAAA,CAAA,UAAU,KAAK,KAAK;qBAClB,OAAO,UAAU,KAAK,UAAU,IAC/B,UAAU,CAAC;AACT,wBAAA,UAAU,EAAE,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAiB;AACzD,qBAAA,CAAC,KAEFD,GAAA,CAAC,UAAU,EAAA,EAAA,CAAG,CACf,CAAC,EACJA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,eAAe,EAC5B,QAAA,EAAAA,GAAA,CAAC,MAAM,EAAA,EAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAI,CAAA,EAAA,CAChD,CACF,EAAA,CAAA,EAAA,CACU,EAClB;AACJ,CAAC,CACF,CAAC;AAEF,MAAM,OAAO,GAAG,CACd,KAAmB,EACnB,YAAsC,KACpC;IACF,MAAM,EACJ,aAAa,EACb,OAAO,EACP,UAAU,EACV,OAAO,EACP,WAAW,EACX,OAAO,EACP,UAAU,EACV,UAAU,GAAG,IAAI,EACjB,WAAW,EACX,eAAe,EACf,gBAAgB,GACjB,GAAG,KAAK,CAAC;AAEV,IAAA,MAAM,EAAE,aAAa,EAAE,GAAG,SAAS,EAAE,CAAC;AAEtC,IAAA,MAAM,EAAE,SAAS,EAAE,GAAG,qBAAqB,EAAE,CAAC;AAC9C,IAAA,MAAM,QAAQ,GACZ,SAAS,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;IACtE,MAAM,UAAU,GAAG,OAAO,CACxB,MACE,yBAAyB,CAAC,QAA+B,EAAE;QACzD,WAAW,EAAE,WAAW,IAAI,OAAO;AACpC,KAAA,CAAC,EACJ,CAAC,QAAQ,CAAC,CACX,CAAC;AAEF,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAa,IAAI,CAAC,CAAC;AAE1C,IAAA,IAAI,GAAwC,CAAC;AAC7C,IAAA,IAAI,OAAO,YAAY,KAAK,UAAU,EAAE;AACtC,QAAA,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC/B,GAAG,GAAG,QAAQ,CAAC;KAChB;AAAM,SAAA,IAAI,YAAY,KAAK,IAAI,EAAE;QAChC,GAAG,GAAG,QAAQ,CAAC;KAChB;SAAM;QACL,GAAG,GAAG,YAAY,CAAC;KACpB;IAGD,MAAM,OAAO,GAAG,uBAAuB,CAAC;AACtC,QAAA,QAAQ,EAAE,UAAU;QACpB,SAAS,EAAE,aAAa,EAAE,OAAO;QACjC,UAAU,EAAE,CAAC,EAAE,aAAa,EAAE,QAAQ,CAAC,kBAAkB,CAAC,CAAC;AAC3D,QAAA,cAAc,EAAE,CAAC,OAAO,KAAK,OAAO;AACpC,QAAA,KAAK,EAAE,OAAO,OAAO,KAAI;AACvB,YAAA,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,GAAG,CACnC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,OAAO,IAAI,KAAI;gBACtC,OAAO;AACL,oBAAA,GAAG,IAAI;AACP,oBAAA,MAAM,EAAE,MAAM,eAAe,CAAC,IAAI,CAAC,IAAY,CAAC;iBACjD,CAAC;AACJ,aAAC,CAAC,IAAI,EAAE,CACT,CAAC;AAEF,YAAA,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC;gBACvB,QAAQ,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM;oBACnC,EAAE,EAAE,IAAI,CAAC,EAAE;oBACX,QAAQ,EAAE,IAAI,CAAC,EAAE;oBACjB,GAAG,EAAE,IAAI,CAAC,MAAM;AAChB,oBAAA,MAAM,EAAE,SAAS;AACjB,oBAAA,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC;oBAClC,QAAQ,EAAE,IAAI,CAAC,WAAW;AAC3B,iBAAA,CAAC,CAAC;gBACH,OAAO,EAAE,OAAO,CAAC;oBACf,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,KAAI;AAC9B,wBAAA,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE;4BACxB,OAAO;AACL,gCAAA,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE,IAAI,CAAC,IAAI;6BACD,CAAC;yBAClB;AACH,qBAAC,CAAC;iBACH,CAAC;AACH,aAAA,CAAC,CAAC;SACJ;AACD,QAAA,QAAQ,EAAE,OAAO,QAAQ,EAAE,MAAM,KAAI;AACnC,YAAA,IAAI,aAAa,EAAE,EAAE,IAAI,QAAQ;gBAC/B,GAAG,CAAC,OAAO,EAAE,aAAa,CAAC,aAAa,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;iBACrD;gBACH,OAAO,GAAG,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;AACjC,gBAAA,KAAK,CAAC;AACJ,oBAAA,KAAK,EAAE,MAAM;AACb,oBAAA,WAAW,EAAE,UAAU;AACxB,iBAAA,CAAC,CAAC;aACJ;SACF;QACD,QAAQ,EAAE,YAAW;AACnB,YAAA,GAAG,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC;SAC7B;AACD,QAAA,QAAQ,EAAE;AACR,YAAA,WAAW,EAAE;AACX,gBAAA,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,KAAI;AACvB,oBAAA,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;iBACjB;gBACD,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAI;oBAC3B,OAAO;wBACL,EAAE;AACF,wBAAA,IAAI,EAAE,OAAO;wBACb,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,WAAW,EAAE,IAAI,CAAC,IAAI;AACtB,wBAAA,OAAO,EAAE;AACP,4BAAA;AACE,gCAAA,IAAI,EAAE,OAAO;gCACb,KAAK,EAAE,IAAI,CAAC,IAAI;AACjB,6BAAA;AACF,yBAAA;AACD,wBAAA,MAAM,EAAE;AACN,4BAAA,IAAI,EAAE,UAAU;AACjB,yBAAA;wBACD,IAAI;qBACL,CAAC;iBACH;AACD,gBAAA,MAAM,EAAE,SAAS;AACjB,gBAAA,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,KAAI;oBACtB,OAAO;wBACL,IAAI;wBACJ,EAAE,EAAEE,EAAI,EAAE;AACV,wBAAA,IAAI,EAAE,OAAO;wBACb,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,WAAW,EAAE,IAAI,CAAC,IAAI;AACtB,wBAAA,MAAM,EAAE;AACN,4BAAA,IAAI,EAAE,SAAS;AACf,4BAAA,MAAM,EAAE,WAAW;AACnB,4BAAA,QAAQ,EAAE,CAAC;AACZ,yBAAA;qBACF,CAAC;iBACH;AACF,aAAA;AACF,SAAA;AACF,KAAA,CAAC,CAAC;AAEH,IAAA,QACEF,GAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,iBAAiB,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAC1D,cAAA,EAAA,IAAA,EAAA,QAAA,EAAAC,IAAA,CAAC,wBAAwB,EAAC,EAAA,OAAO,EAAE,OAAO,aACxCD,GAAC,CAAA,WAAW,EACV,EAAA,GAAG,EAAE,GAAG,EACR,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,aAAa,EAC5B,eAAe,EAAE,eAAe,EAChC,gBAAgB,EAAE,gBAAgB,EAClC,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,UAAU,GACtB,EACFA,GAAA,CAAC,OAAO,EAAA,EAAA,CAAG,EACXA,GAAC,CAAA,aAAa,KAAG,CACQ,EAAA,CAAA,EAAA,CACvB,EACN;AACJ,CAAC,CAAC;AAEF,YAAe,UAAU,CAAC,OAAO,CAAC;;;;"}
|
|
@@ -6,7 +6,6 @@ var markdownText = require('./markdown-text.cjs');
|
|
|
6
6
|
var collapsible = require('../ui/collapsible.cjs');
|
|
7
7
|
var utils = require('../../lib/utils.cjs');
|
|
8
8
|
var SpeakAiLineIcon = require('../../assets/SpeakAiLineIcon.cjs');
|
|
9
|
-
var ChatkitContext = require('../../contexts/ChatkitContext.cjs');
|
|
10
9
|
var useScrollLock = require('../../node_modules/.pnpm/@assistant-ui_react@0.11.37_patch_hash_ynfhbcwv6lgckkdmenopdkbtmq_@types_react-dom@17.0.2_@ty_7dz2xsf2ib2guiutzhjhoerypu/node_modules/@assistant-ui/react/dist/primitives/reasoning/useScrollLock.cjs');
|
|
11
10
|
var chevronDown = require('../../node_modules/.pnpm/lucide-react@0.552.0_react@17.0.2/node_modules/lucide-react/dist/esm/icons/chevron-down.cjs');
|
|
12
11
|
var useAssistantState = require('../../node_modules/.pnpm/@assistant-ui_react@0.11.37_patch_hash_ynfhbcwv6lgckkdmenopdkbtmq_@types_react-dom@17.0.2_@ty_7dz2xsf2ib2guiutzhjhoerypu/node_modules/@assistant-ui/react/dist/context/react/hooks/useAssistantState.cjs');
|
|
@@ -19,8 +18,7 @@ const SHIMMER_DURATION = 1000;
|
|
|
19
18
|
*/
|
|
20
19
|
const ReasoningRoot = ({ className, children }) => {
|
|
21
20
|
const collapsibleRef = React.useRef(null);
|
|
22
|
-
const
|
|
23
|
-
const [isOpen, setIsOpen] = React.useState(expandReasoning);
|
|
21
|
+
const [isOpen, setIsOpen] = React.useState(false);
|
|
24
22
|
const lockScroll = useScrollLock.useScrollLock(collapsibleRef, ANIMATION_DURATION);
|
|
25
23
|
const handleOpenChange = React.useCallback((open) => {
|
|
26
24
|
if (!open) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reasoning.cjs","sources":["../../../src/components/assistant-ui/reasoning.tsx"],"sourcesContent":["\"use client\";\n\nimport { BrainIcon, ChevronDownIcon } from \"lucide-react\";\nimport { createCollapsibleScope } from \"@radix-ui/react-collapsible\";\nimport {\n memo,\n useCallback,\n useContext,\n useRef,\n useState,\n type FC,\n type PropsWithChildren,\n} from \"react\";\n\nimport {\n useScrollLock,\n useAssistantState,\n type ReasoningMessagePartComponent,\n type ReasoningGroupComponent,\n} from \"@assistant-ui/react\";\n\nimport { MarkdownText } from \"@/components/assistant-ui/markdown-text\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"@/components/ui/collapsible\";\nimport { cn } from \"@/lib/utils\";\nimport SpeakAiLine from \"@/assets/SpeakAiLineIcon\";\nimport { useChatkitContext } from \"@/contexts/ChatkitContext\";\n\nconst ANIMATION_DURATION = 200;\nconst SHIMMER_DURATION = 1000;\n\n/**\n * Root collapsible container that manages open/closed state and scroll lock.\n * Provides animation timing via CSS variable and prevents scroll jumps on collapse.\n */\nconst ReasoningRoot: FC<\n PropsWithChildren<{\n className?: string;\n }>\n> = ({ className, children }) => {\n const collapsibleRef = useRef<HTMLDivElement>(null);\n const { expandReasoning }=useChatkitContext()\n const [isOpen, setIsOpen] = useState(expandReasoning);\n const lockScroll = useScrollLock(collapsibleRef, ANIMATION_DURATION);\n\n const handleOpenChange = useCallback(\n (open: boolean) => {\n if (!open) {\n lockScroll();\n }\n setIsOpen(open);\n },\n [lockScroll]\n );\n return (\n <Collapsible\n ref={collapsibleRef}\n open={isOpen}\n onOpenChange={handleOpenChange}\n className={cn(\"aui-reasoning-root mb-4 h-fit w-full\", className)}\n style={\n {\n \"--animation-duration\": `${ANIMATION_DURATION}ms`,\n \"--shimmer-duration\": `${SHIMMER_DURATION}ms`,\n } as React.CSSProperties\n }\n >\n {children}\n </Collapsible>\n );\n};\n\nReasoningRoot.displayName = \"ReasoningRoot\";\n\n/**\n * Gradient overlay that softens the bottom edge during expand/collapse animations.\n * Animation: Fades out with delay when opening and fades back in when closing.\n */\nconst GradientFade: FC<{ className?: string }> = ({ className }) => (\n <div\n className={cn(\n \"aui-reasoning-fade pointer-events-none absolute inset-x-0 bottom-0 z-10 h-16\",\n \"bg-[linear-gradient(to_top,var(--color-background),transparent)]\",\n \"animate-in fade-in-0\",\n \"group-data-[state=open]/collapsible-content:animate-out\",\n \"group-data-[state=open]/collapsible-content:fade-out-0\",\n \"group-data-[state=open]/collapsible-content:delay-[calc(var(--animation-duration)*0.75)]\", // calc for timing the delay\n \"group-data-[state=open]/collapsible-content:fill-mode-forwards\",\n \"duration-(--animation-duration)\",\n \"group-data-[state=open]/collapsible-content:duration-(--animation-duration)\",\n className\n )}\n />\n);\n\n/**\n * Trigger button for the Reasoning collapsible.\n * Composed of icons, label, and text shimmer animation when reasoning is being streamed.\n */\nconst ReasoningTrigger: FC<{\n active: boolean;\n className?: string;\n isOpen: boolean;\n}> = ({ active, className, isOpen }) => {\n return (\n <CollapsibleTrigger\n asChild\n className={cn(\n \"aui-reasoning-trigger group/trigger data-[state=open]:border-b border-[##0000001a] flex items-center justify-between gap-2 py-[6px] pl-[8px] pr-[12px] text-sm text-muted-foreground transition-colors hover:text-foreground\",\n className\n )}\n >\n <div>\n <div className=\"flex items-center gap-0\">\n <div className=\"aui-reasoning-trigger-icon size-4 shrink-0 w-[28px] h-[28px] flex items-center justify-center\">\n <SpeakAiLine />\n </div>\n <span className=\"aui-reasoning-trigger-label-wrapper relative inline-block leading-none\">\n <span>{!active ? \"思考过程\" : \"深度思考中...\"}</span>\n </span>\n </div>\n <ChevronDownIcon\n className={cn(\n \"aui-reasoning-trigger-chevron mt-0.5 size-4 shrink-0\",\n \"transition-transform duration-(--animation-duration) ease-out\",\n \"group-data-[state=closed]/trigger:-rotate-90\",\n \"group-data-[state=open]/trigger:rotate-0\"\n )}\n />\n </div>\n </CollapsibleTrigger>\n );\n};\n/**\n * Collapsible content wrapper that handles height expand/collapse animation.\n * Animation: Height animates up (collapse) and down (expand).\n * Also provides group context for child animations via data-state attributes.\n */\nconst ReasoningContent: FC<\n PropsWithChildren<{\n className?: string;\n \"aria-busy\"?: boolean;\n }>\n> = ({ className, children, \"aria-busy\": ariaBusy }) => (\n <CollapsibleContent\n className={cn(\n \"aui-reasoning-content relative overflow-hidden text-sm text-muted-foreground outline-none\",\n \"group/collapsible-content ease-out\",\n \"data-[state=closed]:animate-collapsible-up\",\n \"data-[state=open]:animate-collapsible-down\",\n \"data-[state=closed]:fill-mode-forwards\",\n \"data-[state=closed]:pointer-events-none\",\n \"data-[state=open]:duration-(--animation-duration)\",\n \"data-[state=closed]:duration-(--animation-duration)\",\n className\n )}\n aria-busy={ariaBusy}\n >\n {children}\n <GradientFade />\n </CollapsibleContent>\n);\n\nReasoningContent.displayName = \"ReasoningContent\";\n\n/**\n * Text content wrapper that animates the reasoning text visibility.\n * Animation: Slides in from top + fades in when opening, reverses when closing.\n * Reacts to parent ReasoningContent's data-state via Radix group selectors.\n */\nconst ReasoningText: FC<\n PropsWithChildren<{\n className?: string;\n }>\n> = ({ className, children }) => (\n <div\n className={cn(\n \"aui-reasoning-text relative z-0 space-y-4 pt-4 pl-6 leading-relaxed\",\n \"transform-gpu transition-[transform,opacity]\",\n \"text-[#86909C]\",\n \"group-data-[state=open]/collapsible-content:animate-in\",\n \"group-data-[state=closed]/collapsible-content:animate-out\",\n \"group-data-[state=open]/collapsible-content:fade-in-0\",\n \"group-data-[state=closed]/collapsible-content:fade-out-0\",\n \"group-data-[state=open]/collapsible-content:slide-in-from-top-4\",\n \"group-data-[state=closed]/collapsible-content:slide-out-to-top-4\",\n \"group-data-[state=open]/collapsible-content:duration-(--animation-duration)\",\n \"group-data-[state=closed]/collapsible-content:duration-(--animation-duration)\",\n \"[&_p]:-mb-2\",\n className\n )}\n >\n {children}\n </div>\n);\n\nReasoningText.displayName = \"ReasoningText\";\n\n/**\n * Renders a single reasoning part's text with markdown support.\n * Consecutive reasoning parts are automatically grouped by ReasoningGroup.\n *\n * Pass Reasoning to MessagePrimitive.Parts in thread.tsx\n *\n * @example:\n * ```tsx\n * <MessagePrimitive.Parts\n * components={{\n * Reasoning: Reasoning,\n * ReasoningGroup: ReasoningGroup,\n * }}\n * />\n * ```\n */\nconst ReasoningImpl: ReasoningMessagePartComponent = () => <MarkdownText />;\n\n/**\n * Collapsible wrapper that groups consecutive reasoning parts together.\n * Includes scroll lock to prevent page jumps during collapse animation.\n *\n * Pass ReasoningGroup to MessagePrimitive.Parts in thread.tsx\n *\n * @example:\n * ```tsx\n * <MessagePrimitive.Parts\n * components={{\n * Reasoning: Reasoning,\n * ReasoningGroup: ReasoningGroup,\n * }}\n * />\n * ```\n */\nconst ReasoningGroupImpl: ReasoningGroupComponent = ({\n children,\n startIndex,\n endIndex,\n}) => {\n /**\n * Detects if reasoning is currently streaming within this group's range.\n */\n const isReasoningStreaming = useAssistantState(({ message }) => {\n if (message.status?.type !== \"running\") return false;\n const lastIndex = message.parts.length - 1;\n if (lastIndex < 0) return false;\n const lastType = message.parts[lastIndex]?.type;\n if (lastType !== \"reasoning\") return false;\n return lastIndex >= startIndex && lastIndex <= endIndex;\n });\n\n return (\n <ReasoningRoot className=\"border-[1px] rounded-[8px] border-[#0000001A] data-[state=closed]:w-[160px] data-[state=open]:w-full\">\n <ReasoningTrigger\n active={isReasoningStreaming}\n isOpen={isReasoningStreaming}\n />\n\n <ReasoningContent aria-busy={isReasoningStreaming}>\n <ReasoningText>{children}</ReasoningText>\n </ReasoningContent>\n </ReasoningRoot>\n );\n};\n\nexport const Reasoning = memo(ReasoningImpl);\nReasoning.displayName = \"Reasoning\";\n\nexport const ReasoningGroup = memo(ReasoningGroupImpl);\nReasoningGroup.displayName = \"ReasoningGroup\";\n"],"names":["useRef","useChatkitContext","useState","useScrollLock","useCallback","_jsx","Collapsible","cn","CollapsibleTrigger","_jsxs","SpeakAiLine","ChevronDownIcon","CollapsibleContent","MarkdownText","useAssistantState","memo"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"reasoning.cjs","sources":["../../../src/components/assistant-ui/reasoning.tsx"],"sourcesContent":["\"use client\";\n\nimport { BrainIcon, ChevronDownIcon } from \"lucide-react\";\nimport { createCollapsibleScope } from \"@radix-ui/react-collapsible\";\nimport {\n memo,\n useCallback,\n useContext,\n useRef,\n useState,\n type FC,\n type PropsWithChildren,\n} from \"react\";\n\nimport {\n useScrollLock,\n useAssistantState,\n type ReasoningMessagePartComponent,\n type ReasoningGroupComponent,\n} from \"@assistant-ui/react\";\n\nimport { MarkdownText } from \"@/components/assistant-ui/markdown-text\";\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from \"@/components/ui/collapsible\";\nimport { cn } from \"@/lib/utils\";\nimport SpeakAiLine from \"@/assets/SpeakAiLineIcon\";\n\nconst ANIMATION_DURATION = 200;\nconst SHIMMER_DURATION = 1000;\n\n/**\n * Root collapsible container that manages open/closed state and scroll lock.\n * Provides animation timing via CSS variable and prevents scroll jumps on collapse.\n */\nconst ReasoningRoot: FC<\n PropsWithChildren<{\n className?: string;\n }>\n> = ({ className, children }) => {\n const collapsibleRef = useRef<HTMLDivElement>(null);\n const [isOpen, setIsOpen] = useState(false);\n const lockScroll = useScrollLock(collapsibleRef, ANIMATION_DURATION);\n\n const handleOpenChange = useCallback(\n (open: boolean) => {\n if (!open) {\n lockScroll();\n }\n setIsOpen(open);\n },\n [lockScroll]\n );\n return (\n <Collapsible\n ref={collapsibleRef}\n open={isOpen}\n onOpenChange={handleOpenChange}\n className={cn(\"aui-reasoning-root mb-4 h-fit w-full\", className)}\n style={\n {\n \"--animation-duration\": `${ANIMATION_DURATION}ms`,\n \"--shimmer-duration\": `${SHIMMER_DURATION}ms`,\n } as React.CSSProperties\n }\n >\n {children}\n </Collapsible>\n );\n};\n\nReasoningRoot.displayName = \"ReasoningRoot\";\n\n/**\n * Gradient overlay that softens the bottom edge during expand/collapse animations.\n * Animation: Fades out with delay when opening and fades back in when closing.\n */\nconst GradientFade: FC<{ className?: string }> = ({ className }) => (\n <div\n className={cn(\n \"aui-reasoning-fade pointer-events-none absolute inset-x-0 bottom-0 z-10 h-16\",\n \"bg-[linear-gradient(to_top,var(--color-background),transparent)]\",\n \"animate-in fade-in-0\",\n \"group-data-[state=open]/collapsible-content:animate-out\",\n \"group-data-[state=open]/collapsible-content:fade-out-0\",\n \"group-data-[state=open]/collapsible-content:delay-[calc(var(--animation-duration)*0.75)]\", // calc for timing the delay\n \"group-data-[state=open]/collapsible-content:fill-mode-forwards\",\n \"duration-(--animation-duration)\",\n \"group-data-[state=open]/collapsible-content:duration-(--animation-duration)\",\n className\n )}\n />\n);\n\n/**\n * Trigger button for the Reasoning collapsible.\n * Composed of icons, label, and text shimmer animation when reasoning is being streamed.\n */\nconst ReasoningTrigger: FC<{\n active: boolean;\n className?: string;\n isOpen: boolean;\n}> = ({ active, className, isOpen }) => {\n return (\n <CollapsibleTrigger\n asChild\n className={cn(\n \"aui-reasoning-trigger group/trigger data-[state=open]:border-b border-[##0000001a] flex items-center justify-between gap-2 py-[6px] pl-[8px] pr-[12px] text-sm text-muted-foreground transition-colors hover:text-foreground\",\n className\n )}\n >\n <div>\n <div className=\"flex items-center gap-0\">\n <div className=\"aui-reasoning-trigger-icon size-4 shrink-0 w-[28px] h-[28px] flex items-center justify-center\">\n <SpeakAiLine />\n </div>\n <span className=\"aui-reasoning-trigger-label-wrapper relative inline-block leading-none\">\n <span>{!active ? \"思考过程\" : \"深度思考中...\"}</span>\n </span>\n </div>\n <ChevronDownIcon\n className={cn(\n \"aui-reasoning-trigger-chevron mt-0.5 size-4 shrink-0\",\n \"transition-transform duration-(--animation-duration) ease-out\",\n \"group-data-[state=closed]/trigger:-rotate-90\",\n \"group-data-[state=open]/trigger:rotate-0\"\n )}\n />\n </div>\n </CollapsibleTrigger>\n );\n};\n/**\n * Collapsible content wrapper that handles height expand/collapse animation.\n * Animation: Height animates up (collapse) and down (expand).\n * Also provides group context for child animations via data-state attributes.\n */\nconst ReasoningContent: FC<\n PropsWithChildren<{\n className?: string;\n \"aria-busy\"?: boolean;\n }>\n> = ({ className, children, \"aria-busy\": ariaBusy }) => (\n <CollapsibleContent\n className={cn(\n \"aui-reasoning-content relative overflow-hidden text-sm text-muted-foreground outline-none\",\n \"group/collapsible-content ease-out\",\n \"data-[state=closed]:animate-collapsible-up\",\n \"data-[state=open]:animate-collapsible-down\",\n \"data-[state=closed]:fill-mode-forwards\",\n \"data-[state=closed]:pointer-events-none\",\n \"data-[state=open]:duration-(--animation-duration)\",\n \"data-[state=closed]:duration-(--animation-duration)\",\n className\n )}\n aria-busy={ariaBusy}\n >\n {children}\n <GradientFade />\n </CollapsibleContent>\n);\n\nReasoningContent.displayName = \"ReasoningContent\";\n\n/**\n * Text content wrapper that animates the reasoning text visibility.\n * Animation: Slides in from top + fades in when opening, reverses when closing.\n * Reacts to parent ReasoningContent's data-state via Radix group selectors.\n */\nconst ReasoningText: FC<\n PropsWithChildren<{\n className?: string;\n }>\n> = ({ className, children }) => (\n <div\n className={cn(\n \"aui-reasoning-text relative z-0 space-y-4 pt-4 pl-6 leading-relaxed\",\n \"transform-gpu transition-[transform,opacity]\",\n \"text-[#86909C]\",\n \"group-data-[state=open]/collapsible-content:animate-in\",\n \"group-data-[state=closed]/collapsible-content:animate-out\",\n \"group-data-[state=open]/collapsible-content:fade-in-0\",\n \"group-data-[state=closed]/collapsible-content:fade-out-0\",\n \"group-data-[state=open]/collapsible-content:slide-in-from-top-4\",\n \"group-data-[state=closed]/collapsible-content:slide-out-to-top-4\",\n \"group-data-[state=open]/collapsible-content:duration-(--animation-duration)\",\n \"group-data-[state=closed]/collapsible-content:duration-(--animation-duration)\",\n \"[&_p]:-mb-2\",\n className\n )}\n >\n {children}\n </div>\n);\n\nReasoningText.displayName = \"ReasoningText\";\n\n/**\n * Renders a single reasoning part's text with markdown support.\n * Consecutive reasoning parts are automatically grouped by ReasoningGroup.\n *\n * Pass Reasoning to MessagePrimitive.Parts in thread.tsx\n *\n * @example:\n * ```tsx\n * <MessagePrimitive.Parts\n * components={{\n * Reasoning: Reasoning,\n * ReasoningGroup: ReasoningGroup,\n * }}\n * />\n * ```\n */\nconst ReasoningImpl: ReasoningMessagePartComponent = () => <MarkdownText />;\n\n/**\n * Collapsible wrapper that groups consecutive reasoning parts together.\n * Includes scroll lock to prevent page jumps during collapse animation.\n *\n * Pass ReasoningGroup to MessagePrimitive.Parts in thread.tsx\n *\n * @example:\n * ```tsx\n * <MessagePrimitive.Parts\n * components={{\n * Reasoning: Reasoning,\n * ReasoningGroup: ReasoningGroup,\n * }}\n * />\n * ```\n */\nconst ReasoningGroupImpl: ReasoningGroupComponent = ({\n children,\n startIndex,\n endIndex,\n}) => {\n /**\n * Detects if reasoning is currently streaming within this group's range.\n */\n const isReasoningStreaming = useAssistantState(({ message }) => {\n if (message.status?.type !== \"running\") return false;\n const lastIndex = message.parts.length - 1;\n if (lastIndex < 0) return false;\n const lastType = message.parts[lastIndex]?.type;\n if (lastType !== \"reasoning\") return false;\n return lastIndex >= startIndex && lastIndex <= endIndex;\n });\n\n return (\n <ReasoningRoot className=\"border-[1px] rounded-[8px] border-[#0000001A] data-[state=closed]:w-[160px] data-[state=open]:w-full\">\n <ReasoningTrigger\n active={isReasoningStreaming}\n isOpen={isReasoningStreaming}\n />\n\n <ReasoningContent aria-busy={isReasoningStreaming}>\n <ReasoningText>{children}</ReasoningText>\n </ReasoningContent>\n </ReasoningRoot>\n );\n};\n\nexport const Reasoning = memo(ReasoningImpl);\nReasoning.displayName = \"Reasoning\";\n\nexport const ReasoningGroup = memo(ReasoningGroupImpl);\nReasoningGroup.displayName = \"ReasoningGroup\";\n"],"names":["useRef","useState","useScrollLock","useCallback","_jsx","Collapsible","cn","CollapsibleTrigger","_jsxs","SpeakAiLine","ChevronDownIcon","CollapsibleContent","MarkdownText","useAssistantState","memo"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reasoning.d.ts","sourceRoot":"","sources":["../../../src/components/assistant-ui/reasoning.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"reasoning.d.ts","sourceRoot":"","sources":["../../../src/components/assistant-ui/reasoning.tsx"],"names":[],"mappings":"AAwQA,eAAO,MAAM,SAAS;;EAAsB,CAAC;AAG7C,eAAO,MAAM,cAAc,yFAA2B,CAAC"}
|
|
@@ -4,7 +4,6 @@ import { MarkdownText } from './markdown-text.js';
|
|
|
4
4
|
import { Collapsible, CollapsibleTrigger, CollapsibleContent } from '../ui/collapsible.js';
|
|
5
5
|
import { cn } from '../../lib/utils.js';
|
|
6
6
|
import SpeakAiLineIcon from '../../assets/SpeakAiLineIcon.js';
|
|
7
|
-
import { useChatkitContext } from '../../contexts/ChatkitContext.js';
|
|
8
7
|
import { useScrollLock } from '../../node_modules/.pnpm/@assistant-ui_react@0.11.37_patch_hash_ynfhbcwv6lgckkdmenopdkbtmq_@types_react-dom@17.0.2_@ty_7dz2xsf2ib2guiutzhjhoerypu/node_modules/@assistant-ui/react/dist/primitives/reasoning/useScrollLock.js';
|
|
9
8
|
import ChevronDown from '../../node_modules/.pnpm/lucide-react@0.552.0_react@17.0.2/node_modules/lucide-react/dist/esm/icons/chevron-down.js';
|
|
10
9
|
import { useAssistantState } from '../../node_modules/.pnpm/@assistant-ui_react@0.11.37_patch_hash_ynfhbcwv6lgckkdmenopdkbtmq_@types_react-dom@17.0.2_@ty_7dz2xsf2ib2guiutzhjhoerypu/node_modules/@assistant-ui/react/dist/context/react/hooks/useAssistantState.js';
|
|
@@ -17,8 +16,7 @@ const SHIMMER_DURATION = 1000;
|
|
|
17
16
|
*/
|
|
18
17
|
const ReasoningRoot = ({ className, children }) => {
|
|
19
18
|
const collapsibleRef = useRef(null);
|
|
20
|
-
const
|
|
21
|
-
const [isOpen, setIsOpen] = useState(expandReasoning);
|
|
19
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
22
20
|
const lockScroll = useScrollLock(collapsibleRef, ANIMATION_DURATION);
|
|
23
21
|
const handleOpenChange = useCallback((open) => {
|
|
24
22
|
if (!open) {
|