@chat-lab/ui 0.1.0-beta.71 → 0.1.0-beta.73
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/index.cjs +4 -3
- package/dist/components/Chatkit/index.cjs.map +1 -1
- package/dist/components/Chatkit/index.d.ts.map +1 -1
- package/dist/components/Chatkit/index.js +4 -3
- package/dist/components/Chatkit/index.js.map +1 -1
- package/dist/components/Chatkit/types.d.ts +1 -0
- package/dist/components/Chatkit/types.d.ts.map +1 -1
- package/dist/components/assistant-ui/markdown-text.cjs +14 -19
- package/dist/components/assistant-ui/markdown-text.cjs.map +1 -1
- package/dist/components/assistant-ui/markdown-text.d.ts +3 -1
- package/dist/components/assistant-ui/markdown-text.d.ts.map +1 -1
- package/dist/components/assistant-ui/markdown-text.js +16 -21
- package/dist/components/assistant-ui/markdown-text.js.map +1 -1
- package/dist/components/assistant-ui/thread.cjs +21 -9
- package/dist/components/assistant-ui/thread.cjs.map +1 -1
- package/dist/components/assistant-ui/thread.d.ts.map +1 -1
- package/dist/components/assistant-ui/thread.js +21 -9
- package/dist/components/assistant-ui/thread.js.map +1 -1
- package/dist/contexts/ChatkitContext.cjs.map +1 -1
- package/dist/contexts/ChatkitContext.d.ts +1 -0
- package/dist/contexts/ChatkitContext.d.ts.map +1 -1
- package/dist/contexts/ChatkitContext.js.map +1 -1
- package/dist/core/dist/index.cjs +5 -1
- package/dist/core/dist/index.cjs.map +1 -1
- package/dist/core/dist/index.js +5 -1
- package/dist/core/dist/index.js.map +1 -1
- package/dist/hooks/useClawChat/ClawProtocolAdaptor.cjs +10 -9
- package/dist/hooks/useClawChat/ClawProtocolAdaptor.cjs.map +1 -1
- package/dist/hooks/useClawChat/ClawProtocolAdaptor.d.ts.map +1 -1
- package/dist/hooks/useClawChat/ClawProtocolAdaptor.js +10 -9
- package/dist/hooks/useClawChat/ClawProtocolAdaptor.js.map +1 -1
- package/dist/index.css +1 -1
- package/package.json +1 -1
|
@@ -17,7 +17,7 @@ var valtio = require('valtio');
|
|
|
17
17
|
|
|
18
18
|
const ChatkitImpl = React.forwardRef((props, ref) => {
|
|
19
19
|
const { t } = I18nContext.useI18n();
|
|
20
|
-
const { initialConfig, tools, toolDisplay = 'group', welcome, recommends, plugins, threadList: threadList$1, showHeader = true, renderHeader, showReasoning = true, placeholder, expandToolGroup = false, expandReasoning = false, expandToolDetail = false, uploadBase64 = true, threadBottom, composerTop, accept, composerDisabled = false, } = props;
|
|
20
|
+
const { initialConfig, tools, toolDisplay = 'group', welcome, recommends, plugins, threadList: threadList$1, showHeader = true, renderHeader, showReasoning = true, placeholder, expandToolGroup = false, expandReasoning = false, expandToolDetail = false, uploadBase64 = true, threadBottom, composerTop, accept, composerDisabled = false, threadMaxWidth, } = props;
|
|
21
21
|
const { controller } = props;
|
|
22
22
|
const { threadMap, currentThreadId } = valtio.useSnapshot(controller.store.state);
|
|
23
23
|
// useImperativeHandleChatkitRef(ref, controller, onError);
|
|
@@ -148,6 +148,7 @@ const ChatkitImpl = React.forwardRef((props, ref) => {
|
|
|
148
148
|
// },
|
|
149
149
|
});
|
|
150
150
|
return (jsxRuntime.jsx(react.AssistantRuntimeProvider, { runtime: runtime, children: jsxRuntime.jsxs(ChatkitContext.ChatkitProvider, { value: {
|
|
151
|
+
threadMaxWidth,
|
|
151
152
|
ref: ref,
|
|
152
153
|
plugins: plugins || [],
|
|
153
154
|
showThreadList: threadList$1 !== false,
|
|
@@ -167,11 +168,11 @@ const ChatkitImpl = React.forwardRef((props, ref) => {
|
|
|
167
168
|
})) : (jsxRuntime.jsx(threadList, {}))), jsxRuntime.jsxs("div", { className: "flex-1 h-full w-[calc(100%-200px)]", children: [jsxRuntime.jsx(thread.Thread, { welcome: welcome, recommends: recommends }), threadBottom] })] }), (tools || []).map((tool, index) => React.createElement(tool)), jsxRuntime.jsx(executionCard, {})] }) }, currentThreadId));
|
|
168
169
|
});
|
|
169
170
|
function Chatkit(props) {
|
|
170
|
-
const { initialConfig, welcome, recommends, onError, toolDisplay, showReasoning, plugins, tools, chatController: chatControllerFromProps = null, threadBottom, chatControllerPlugins, threadList, showHeader = true, renderHeader, placeholder, expandToolGroup, expandToolDetail, locale, accept, uploadBase64, composerDisabled, composerTop, } = props;
|
|
171
|
+
const { initialConfig, welcome, recommends, onError, toolDisplay, showReasoning, plugins, tools, chatController: chatControllerFromProps = null, threadBottom, chatControllerPlugins, threadList, showHeader = true, renderHeader, placeholder, expandToolGroup, expandToolDetail, locale, accept, uploadBase64, composerDisabled, composerTop, threadMaxWidth, } = props;
|
|
171
172
|
const controllerRef = React.useRef(chatControllerFromProps);
|
|
172
173
|
const controller = controllerRef.current;
|
|
173
174
|
const { currentThreadId, threadMap } = valtio.useSnapshot(controller.store.state);
|
|
174
|
-
return (jsxRuntime.jsx(I18nContext.I18nProvider, { defaultLocale: locale, children: jsxRuntime.jsx("div", { className: "chatkit-wrapper", style: { height: '100%' }, "data-chatkit": true, children: jsxRuntime.jsx(ChatkitImpl, { uploadBase64: uploadBase64, showReasoning: showReasoning, tools: tools || [], showHeader: showHeader, renderHeader: renderHeader, recommends: recommends, initialConfig: initialConfig, expandToolGroup: expandToolGroup, toolDisplay: toolDisplay, expandToolDetail: expandToolDetail, placeholder: placeholder, welcome: welcome, plugins: plugins, threadList: threadList, threadBottom: threadBottom, controller: controller, accept: accept, composerDisabled: composerDisabled, composerTop: composerTop }, currentThreadId) }) }));
|
|
175
|
+
return (jsxRuntime.jsx(I18nContext.I18nProvider, { defaultLocale: locale, children: jsxRuntime.jsx("div", { className: "chatkit-wrapper", style: { height: '100%' }, "data-chatkit": true, children: jsxRuntime.jsx(ChatkitImpl, { uploadBase64: uploadBase64, showReasoning: showReasoning, tools: tools || [], showHeader: showHeader, renderHeader: renderHeader, recommends: recommends, initialConfig: initialConfig, expandToolGroup: expandToolGroup, toolDisplay: toolDisplay, expandToolDetail: expandToolDetail, placeholder: placeholder, welcome: welcome, plugins: plugins, threadList: threadList, threadBottom: threadBottom, controller: controller, accept: accept, composerDisabled: composerDisabled, composerTop: composerTop, threadMaxWidth: threadMaxWidth }, currentThreadId) }) }));
|
|
175
176
|
}
|
|
176
177
|
var index = React.forwardRef(Chatkit);
|
|
177
178
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../src/components/Chatkit/index.tsx"],"sourcesContent":["import React, {\n ForwardedRef,\n forwardRef,\n MutableRefObject,\n useMemo,\n useRef,\n useEffect,\n} from 'react';\nimport { v4 as uuid } from 'uuid';\nimport { compact, values } from 'lodash-es';\nimport {\n AssistantRuntimeProvider,\n useExternalStoreRuntime,\n} from '@assistant-ui/react';\nimport {\n ChatMessage,\n ChatController,\n Thread as ThreadType,\n useSnapshot,\n TextMessage,\n} from '@chat-lab/core';\nimport { ChatkitProvider } from '@/contexts/ChatkitContext';\nimport { I18nProvider, useI18n } from '@/contexts/I18nContext';\n\nimport convertToAssistantMessage from '@/utils/convertToAssistantMessage';\nimport { convertToBase64 } from '@/utils/convertToBase64';\nimport checkMedia from '@/utils/checkMedia';\nimport './style.less';\nimport ThreadList from '../thread-list';\nimport { ChatkitProps, ChatkitRef } from './types';\nimport { Thread } from '../assistant-ui/thread';\n\nimport ExecutionCard from '../assistant-ui-tools/execution-card';\n\nconst ChatkitImpl = forwardRef(\n (props: ChatkitProps, ref: ForwardedRef<ChatkitRef>) => {\n const { t } = useI18n();\n const {\n initialConfig,\n tools,\n toolDisplay = 'group',\n welcome,\n recommends,\n plugins,\n threadList,\n showHeader = true,\n renderHeader,\n showReasoning = true,\n placeholder,\n expandToolGroup = false,\n expandReasoning = false,\n expandToolDetail = false,\n uploadBase64 = true,\n threadBottom,\n composerTop,\n accept,\n composerDisabled = false,\n } = props;\n const { controller } = props;\n const { threadMap, currentThreadId } = useSnapshot(controller.store.state);\n // useImperativeHandleChatkitRef(ref, controller, onError);\n\n const currentThread = currentThreadId ? threadMap[currentThreadId] : null;\n const messages = currentThread?.messages || [];\n\n const { uiMessages, authors } = useMemo(\n () => convertToAssistantMessage(messages as Readonly<ChatMessage>[], {\n toolDisplay: toolDisplay || 'group',\n showReasoning,\n }),\n [messages, toolDisplay, showReasoning],\n );\n // const api = useAssistantApi();\n\n // useEffect(() => {}, [composerDisabled, api]);\n\n const runtime = useExternalStoreRuntime({\n messages: uiMessages,\n isLoading: currentThread?.sending,\n isRunning: currentThread?.sending,\n isDisabled: composerDisabled,\n convertMessage: (message) => message,\n onNew: async (message) => {\n const attachments = uploadBase64\n ? await Promise.all(\n message.attachments?.map(async (item) => ({\n ...item,\n base64: await convertToBase64(item.file as File),\n })) || [],\n )\n : message.attachments || [];\n\n controller?.sendMessage({\n attaches: attachments.map((item) => ({\n id: item.id,\n attachId: item.id,\n url: (item as { base64?: string })?.base64 || '',\n status: 'success',\n file: item.file,\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 controller?.reloadMessage({\n threadId: currentThread?.id,\n messageId: parentId,\n });\n } else {\n controller.onError?.(new Error(t('thread.notFound')));\n }\n },\n onCancel: async () => {\n controller?.abortMessage();\n },\n // adapters: {\n // attachments: {\n // remove: async ({ id }) => {\n // console.log(id);\n // },\n // send: async ({ id, file }) => {\n // // Map media type to valid content type\n // const baseMediaType = checkMedia(file.type) as\n // | 'image'\n // | 'video'\n // | 'audio';\n // const mediaType: 'image' | 'video' | 'audio' | 'file' = [\n // 'image',\n // 'video',\n // 'audio',\n // ].includes(baseMediaType)\n // ? baseMediaType\n // : 'file';\n\n // const contentItem: {\n // type: typeof mediaType;\n // image?: string;\n // video?: string;\n // audio?: string;\n // file?: string;\n // } = {\n // type: mediaType,\n // };\n\n // switch (mediaType) {\n // case 'image':\n // contentItem.image = file.name;\n // break;\n // case 'video':\n // contentItem.video = file.name;\n // break;\n // case 'audio':\n // contentItem.audio = file.name;\n // break;\n // case 'file':\n // contentItem.file = file.name;\n // break;\n // }\n\n // return {\n // id,\n // type: mediaType,\n // name: file.name,\n // contentType: file.type,\n // content: [contentItem],\n // status: {\n // type: 'complete',\n // },\n // file,\n // };\n // },\n // accept: accept || 'image/*',\n // add: async ({ file }) => ({\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 return (\n <AssistantRuntimeProvider key={currentThreadId} runtime={runtime}>\n <ChatkitProvider\n value={{\n ref: ref as MutableRefObject<ChatkitRef | null>,\n plugins: plugins || [],\n showThreadList: threadList !== false,\n placeholder: placeholder || t('thread.prompt'),\n showHeader,\n renderHeader,\n expandToolGroup,\n expandToolDetail,\n expandReasoning,\n controller,\n authors,\n composerDisabled,\n composerTop,\n }}\n >\n <div className=\"flex h-full w-full\">\n {threadList !== false\n && (typeof threadList === 'function' ? (\n threadList({\n threadList: values(threadMap) as ThreadType[],\n })\n ) : (\n <ThreadList />\n ))}\n <div className=\"flex-1 h-full w-[calc(100%-200px)]\">\n <Thread welcome={welcome} recommends={recommends} />\n {threadBottom}\n </div>\n </div>\n {(tools || []).map((tool, index) => React.createElement(tool))}\n <ExecutionCard />\n </ChatkitProvider>\n </AssistantRuntimeProvider>\n );\n },\n);\n\nfunction Chatkit(props: ChatkitProps) {\n const {\n initialConfig,\n welcome,\n recommends,\n onError,\n toolDisplay,\n showReasoning,\n plugins,\n tools,\n chatController: chatControllerFromProps = null,\n threadBottom,\n chatControllerPlugins,\n threadList,\n showHeader = true,\n renderHeader,\n placeholder,\n expandToolGroup,\n expandToolDetail,\n locale,\n accept,\n uploadBase64,\n composerDisabled,\n composerTop,\n } = props;\n\n const controllerRef = useRef<ChatController | null>(chatControllerFromProps);\n\n const controller = controllerRef.current;\n\n const { currentThreadId, threadMap } = useSnapshot(controller!.store.state);\n\n return (\n <I18nProvider defaultLocale={locale}>\n <div className=\"chatkit-wrapper\" style={{ height: '100%' }} data-chatkit>\n <ChatkitImpl\n uploadBase64={uploadBase64}\n key={currentThreadId}\n showReasoning={showReasoning}\n tools={tools || []}\n showHeader={showHeader}\n renderHeader={renderHeader}\n recommends={recommends}\n initialConfig={initialConfig}\n expandToolGroup={expandToolGroup}\n toolDisplay={toolDisplay}\n expandToolDetail={expandToolDetail}\n placeholder={placeholder}\n welcome={welcome}\n plugins={plugins}\n threadList={threadList}\n threadBottom={threadBottom}\n controller={controller!}\n accept={accept}\n composerDisabled={composerDisabled}\n composerTop={composerTop}\n />\n </div>\n </I18nProvider>\n );\n}\n\nexport default forwardRef(Chatkit);\n"],"names":["forwardRef","useI18n","threadList","useSnapshot","useMemo","useExternalStoreRuntime","convertToBase64","compact","_jsx","AssistantRuntimeProvider","_jsxs","ChatkitProvider","values","ThreadList","Thread","ExecutionCard","useRef","I18nProvider"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../src/components/Chatkit/index.tsx"],"sourcesContent":["import React, {\n ForwardedRef,\n forwardRef,\n MutableRefObject,\n useMemo,\n useRef,\n useEffect,\n} from 'react';\nimport { v4 as uuid } from 'uuid';\nimport { compact, values } from 'lodash-es';\nimport {\n AssistantRuntimeProvider,\n useExternalStoreRuntime,\n} from '@assistant-ui/react';\nimport {\n ChatMessage,\n ChatController,\n Thread as ThreadType,\n useSnapshot,\n TextMessage,\n} from '@chat-lab/core';\nimport { ChatkitProvider } from '@/contexts/ChatkitContext';\nimport { I18nProvider, useI18n } from '@/contexts/I18nContext';\n\nimport convertToAssistantMessage from '@/utils/convertToAssistantMessage';\nimport { convertToBase64 } from '@/utils/convertToBase64';\nimport checkMedia from '@/utils/checkMedia';\nimport './style.less';\nimport ThreadList from '../thread-list';\nimport { ChatkitProps, ChatkitRef } from './types';\nimport { Thread } from '../assistant-ui/thread';\n\nimport ExecutionCard from '../assistant-ui-tools/execution-card';\n\nconst ChatkitImpl = forwardRef(\n (props: ChatkitProps, ref: ForwardedRef<ChatkitRef>) => {\n const { t } = useI18n();\n const {\n initialConfig,\n tools,\n toolDisplay = 'group',\n welcome,\n recommends,\n plugins,\n threadList,\n showHeader = true,\n renderHeader,\n showReasoning = true,\n placeholder,\n expandToolGroup = false,\n expandReasoning = false,\n expandToolDetail = false,\n uploadBase64 = true,\n threadBottom,\n composerTop,\n accept,\n composerDisabled = false,\n threadMaxWidth,\n } = props;\n const { controller } = props;\n const { threadMap, currentThreadId } = useSnapshot(controller.store.state);\n // useImperativeHandleChatkitRef(ref, controller, onError);\n\n const currentThread = currentThreadId ? threadMap[currentThreadId] : null;\n const messages = currentThread?.messages || [];\n\n const { uiMessages, authors } = useMemo(\n () => convertToAssistantMessage(messages as Readonly<ChatMessage>[], {\n toolDisplay: toolDisplay || 'group',\n showReasoning,\n }),\n [messages, toolDisplay, showReasoning],\n );\n // const api = useAssistantApi();\n\n // useEffect(() => {}, [composerDisabled, api]);\n\n const runtime = useExternalStoreRuntime({\n messages: uiMessages,\n isLoading: currentThread?.sending,\n isRunning: currentThread?.sending,\n isDisabled: composerDisabled,\n convertMessage: (message) => message,\n onNew: async (message) => {\n const attachments = uploadBase64\n ? await Promise.all(\n message.attachments?.map(async (item) => ({\n ...item,\n base64: await convertToBase64(item.file as File),\n })) || [],\n )\n : message.attachments || [];\n\n controller?.sendMessage({\n attaches: attachments.map((item) => ({\n id: item.id,\n attachId: item.id,\n url: (item as { base64?: string })?.base64 || '',\n status: 'success',\n file: item.file,\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 controller?.reloadMessage({\n threadId: currentThread?.id,\n messageId: parentId,\n });\n } else {\n controller.onError?.(new Error(t('thread.notFound')));\n }\n },\n onCancel: async () => {\n controller?.abortMessage();\n },\n // adapters: {\n // attachments: {\n // remove: async ({ id }) => {\n // console.log(id);\n // },\n // send: async ({ id, file }) => {\n // // Map media type to valid content type\n // const baseMediaType = checkMedia(file.type) as\n // | 'image'\n // | 'video'\n // | 'audio';\n // const mediaType: 'image' | 'video' | 'audio' | 'file' = [\n // 'image',\n // 'video',\n // 'audio',\n // ].includes(baseMediaType)\n // ? baseMediaType\n // : 'file';\n\n // const contentItem: {\n // type: typeof mediaType;\n // image?: string;\n // video?: string;\n // audio?: string;\n // file?: string;\n // } = {\n // type: mediaType,\n // };\n\n // switch (mediaType) {\n // case 'image':\n // contentItem.image = file.name;\n // break;\n // case 'video':\n // contentItem.video = file.name;\n // break;\n // case 'audio':\n // contentItem.audio = file.name;\n // break;\n // case 'file':\n // contentItem.file = file.name;\n // break;\n // }\n\n // return {\n // id,\n // type: mediaType,\n // name: file.name,\n // contentType: file.type,\n // content: [contentItem],\n // status: {\n // type: 'complete',\n // },\n // file,\n // };\n // },\n // accept: accept || 'image/*',\n // add: async ({ file }) => ({\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 return (\n <AssistantRuntimeProvider key={currentThreadId} runtime={runtime}>\n <ChatkitProvider\n value={{\n threadMaxWidth,\n ref: ref as MutableRefObject<ChatkitRef | null>,\n plugins: plugins || [],\n showThreadList: threadList !== false,\n placeholder: placeholder || t('thread.prompt'),\n showHeader,\n renderHeader,\n expandToolGroup,\n expandToolDetail,\n expandReasoning,\n controller,\n authors,\n composerDisabled,\n composerTop,\n }}\n >\n <div className=\"flex h-full w-full\">\n {threadList !== false\n && (typeof threadList === 'function' ? (\n threadList({\n threadList: values(threadMap) as ThreadType[],\n })\n ) : (\n <ThreadList />\n ))}\n <div className=\"flex-1 h-full w-[calc(100%-200px)]\">\n <Thread welcome={welcome} recommends={recommends} />\n {threadBottom}\n </div>\n </div>\n {(tools || []).map((tool, index) => React.createElement(tool))}\n <ExecutionCard />\n </ChatkitProvider>\n </AssistantRuntimeProvider>\n );\n },\n);\n\nfunction Chatkit(props: ChatkitProps) {\n const {\n initialConfig,\n welcome,\n recommends,\n onError,\n toolDisplay,\n showReasoning,\n plugins,\n tools,\n chatController: chatControllerFromProps = null,\n threadBottom,\n chatControllerPlugins,\n threadList,\n showHeader = true,\n renderHeader,\n placeholder,\n expandToolGroup,\n expandToolDetail,\n locale,\n accept,\n uploadBase64,\n composerDisabled,\n composerTop,\n threadMaxWidth,\n } = props;\n\n const controllerRef = useRef<ChatController | null>(chatControllerFromProps);\n\n const controller = controllerRef.current;\n\n const { currentThreadId, threadMap } = useSnapshot(controller!.store.state);\n\n return (\n <I18nProvider defaultLocale={locale}>\n <div className=\"chatkit-wrapper\" style={{ height: '100%' }} data-chatkit>\n <ChatkitImpl\n uploadBase64={uploadBase64}\n key={currentThreadId}\n showReasoning={showReasoning}\n tools={tools || []}\n showHeader={showHeader}\n renderHeader={renderHeader}\n recommends={recommends}\n initialConfig={initialConfig}\n expandToolGroup={expandToolGroup}\n toolDisplay={toolDisplay}\n expandToolDetail={expandToolDetail}\n placeholder={placeholder}\n welcome={welcome}\n plugins={plugins}\n threadList={threadList}\n threadBottom={threadBottom}\n controller={controller!}\n accept={accept}\n composerDisabled={composerDisabled}\n composerTop={composerTop}\n threadMaxWidth={threadMaxWidth}\n />\n </div>\n </I18nProvider>\n );\n}\n\nexport default forwardRef(Chatkit);\n"],"names":["forwardRef","useI18n","threadList","useSnapshot","useMemo","useExternalStoreRuntime","convertToBase64","compact","_jsx","AssistantRuntimeProvider","_jsxs","ChatkitProvider","values","ThreadList","Thread","ExecutionCard","useRef","I18nProvider"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Chatkit/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAON,MAAM,OAAO,CAAC;AAoBf,OAAO,cAAc,CAAC;AAEtB,OAAO,EAAE,YAAY,EAAc,MAAM,SAAS,CAAC;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Chatkit/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAON,MAAM,OAAO,CAAC;AAoBf,OAAO,cAAc,CAAC;AAEtB,OAAO,EAAE,YAAY,EAAc,MAAM,SAAS,CAAC;;AAqRnD,wBAAmC"}
|
|
@@ -15,7 +15,7 @@ import { useSnapshot } from 'valtio';
|
|
|
15
15
|
|
|
16
16
|
const ChatkitImpl = forwardRef((props, ref) => {
|
|
17
17
|
const { t } = useI18n();
|
|
18
|
-
const { initialConfig, tools, toolDisplay = 'group', welcome, recommends, plugins, threadList, showHeader = true, renderHeader, showReasoning = true, placeholder, expandToolGroup = false, expandReasoning = false, expandToolDetail = false, uploadBase64 = true, threadBottom, composerTop, accept, composerDisabled = false, } = props;
|
|
18
|
+
const { initialConfig, tools, toolDisplay = 'group', welcome, recommends, plugins, threadList, showHeader = true, renderHeader, showReasoning = true, placeholder, expandToolGroup = false, expandReasoning = false, expandToolDetail = false, uploadBase64 = true, threadBottom, composerTop, accept, composerDisabled = false, threadMaxWidth, } = props;
|
|
19
19
|
const { controller } = props;
|
|
20
20
|
const { threadMap, currentThreadId } = useSnapshot(controller.store.state);
|
|
21
21
|
// useImperativeHandleChatkitRef(ref, controller, onError);
|
|
@@ -146,6 +146,7 @@ const ChatkitImpl = forwardRef((props, ref) => {
|
|
|
146
146
|
// },
|
|
147
147
|
});
|
|
148
148
|
return (jsx(AssistantRuntimeProvider, { runtime: runtime, children: jsxs(ChatkitProvider, { value: {
|
|
149
|
+
threadMaxWidth,
|
|
149
150
|
ref: ref,
|
|
150
151
|
plugins: plugins || [],
|
|
151
152
|
showThreadList: threadList !== false,
|
|
@@ -165,11 +166,11 @@ const ChatkitImpl = forwardRef((props, ref) => {
|
|
|
165
166
|
})) : (jsx(ThreadList, {}))), jsxs("div", { className: "flex-1 h-full w-[calc(100%-200px)]", children: [jsx(Thread, { welcome: welcome, recommends: recommends }), threadBottom] })] }), (tools || []).map((tool, index) => React__default.createElement(tool)), jsx(ExecutionCard, {})] }) }, currentThreadId));
|
|
166
167
|
});
|
|
167
168
|
function Chatkit(props) {
|
|
168
|
-
const { initialConfig, welcome, recommends, onError, toolDisplay, showReasoning, plugins, tools, chatController: chatControllerFromProps = null, threadBottom, chatControllerPlugins, threadList, showHeader = true, renderHeader, placeholder, expandToolGroup, expandToolDetail, locale, accept, uploadBase64, composerDisabled, composerTop, } = props;
|
|
169
|
+
const { initialConfig, welcome, recommends, onError, toolDisplay, showReasoning, plugins, tools, chatController: chatControllerFromProps = null, threadBottom, chatControllerPlugins, threadList, showHeader = true, renderHeader, placeholder, expandToolGroup, expandToolDetail, locale, accept, uploadBase64, composerDisabled, composerTop, threadMaxWidth, } = props;
|
|
169
170
|
const controllerRef = useRef(chatControllerFromProps);
|
|
170
171
|
const controller = controllerRef.current;
|
|
171
172
|
const { currentThreadId, threadMap } = useSnapshot(controller.store.state);
|
|
172
|
-
return (jsx(I18nProvider, { defaultLocale: locale, children: jsx("div", { className: "chatkit-wrapper", style: { height: '100%' }, "data-chatkit": true, children: jsx(ChatkitImpl, { uploadBase64: uploadBase64, showReasoning: showReasoning, tools: tools || [], showHeader: showHeader, renderHeader: renderHeader, recommends: recommends, initialConfig: initialConfig, expandToolGroup: expandToolGroup, toolDisplay: toolDisplay, expandToolDetail: expandToolDetail, placeholder: placeholder, welcome: welcome, plugins: plugins, threadList: threadList, threadBottom: threadBottom, controller: controller, accept: accept, composerDisabled: composerDisabled, composerTop: composerTop }, currentThreadId) }) }));
|
|
173
|
+
return (jsx(I18nProvider, { defaultLocale: locale, children: jsx("div", { className: "chatkit-wrapper", style: { height: '100%' }, "data-chatkit": true, children: jsx(ChatkitImpl, { uploadBase64: uploadBase64, showReasoning: showReasoning, tools: tools || [], showHeader: showHeader, renderHeader: renderHeader, recommends: recommends, initialConfig: initialConfig, expandToolGroup: expandToolGroup, toolDisplay: toolDisplay, expandToolDetail: expandToolDetail, placeholder: placeholder, welcome: welcome, plugins: plugins, threadList: threadList, threadBottom: threadBottom, controller: controller, accept: accept, composerDisabled: composerDisabled, composerTop: composerTop, threadMaxWidth: threadMaxWidth }, currentThreadId) }) }));
|
|
173
174
|
}
|
|
174
175
|
var index = forwardRef(Chatkit);
|
|
175
176
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/Chatkit/index.tsx"],"sourcesContent":["import React, {\n ForwardedRef,\n forwardRef,\n MutableRefObject,\n useMemo,\n useRef,\n useEffect,\n} from 'react';\nimport { v4 as uuid } from 'uuid';\nimport { compact, values } from 'lodash-es';\nimport {\n AssistantRuntimeProvider,\n useExternalStoreRuntime,\n} from '@assistant-ui/react';\nimport {\n ChatMessage,\n ChatController,\n Thread as ThreadType,\n useSnapshot,\n TextMessage,\n} from '@chat-lab/core';\nimport { ChatkitProvider } from '@/contexts/ChatkitContext';\nimport { I18nProvider, useI18n } from '@/contexts/I18nContext';\n\nimport convertToAssistantMessage from '@/utils/convertToAssistantMessage';\nimport { convertToBase64 } from '@/utils/convertToBase64';\nimport checkMedia from '@/utils/checkMedia';\nimport './style.less';\nimport ThreadList from '../thread-list';\nimport { ChatkitProps, ChatkitRef } from './types';\nimport { Thread } from '../assistant-ui/thread';\n\nimport ExecutionCard from '../assistant-ui-tools/execution-card';\n\nconst ChatkitImpl = forwardRef(\n (props: ChatkitProps, ref: ForwardedRef<ChatkitRef>) => {\n const { t } = useI18n();\n const {\n initialConfig,\n tools,\n toolDisplay = 'group',\n welcome,\n recommends,\n plugins,\n threadList,\n showHeader = true,\n renderHeader,\n showReasoning = true,\n placeholder,\n expandToolGroup = false,\n expandReasoning = false,\n expandToolDetail = false,\n uploadBase64 = true,\n threadBottom,\n composerTop,\n accept,\n composerDisabled = false,\n } = props;\n const { controller } = props;\n const { threadMap, currentThreadId } = useSnapshot(controller.store.state);\n // useImperativeHandleChatkitRef(ref, controller, onError);\n\n const currentThread = currentThreadId ? threadMap[currentThreadId] : null;\n const messages = currentThread?.messages || [];\n\n const { uiMessages, authors } = useMemo(\n () => convertToAssistantMessage(messages as Readonly<ChatMessage>[], {\n toolDisplay: toolDisplay || 'group',\n showReasoning,\n }),\n [messages, toolDisplay, showReasoning],\n );\n // const api = useAssistantApi();\n\n // useEffect(() => {}, [composerDisabled, api]);\n\n const runtime = useExternalStoreRuntime({\n messages: uiMessages,\n isLoading: currentThread?.sending,\n isRunning: currentThread?.sending,\n isDisabled: composerDisabled,\n convertMessage: (message) => message,\n onNew: async (message) => {\n const attachments = uploadBase64\n ? await Promise.all(\n message.attachments?.map(async (item) => ({\n ...item,\n base64: await convertToBase64(item.file as File),\n })) || [],\n )\n : message.attachments || [];\n\n controller?.sendMessage({\n attaches: attachments.map((item) => ({\n id: item.id,\n attachId: item.id,\n url: (item as { base64?: string })?.base64 || '',\n status: 'success',\n file: item.file,\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 controller?.reloadMessage({\n threadId: currentThread?.id,\n messageId: parentId,\n });\n } else {\n controller.onError?.(new Error(t('thread.notFound')));\n }\n },\n onCancel: async () => {\n controller?.abortMessage();\n },\n // adapters: {\n // attachments: {\n // remove: async ({ id }) => {\n // console.log(id);\n // },\n // send: async ({ id, file }) => {\n // // Map media type to valid content type\n // const baseMediaType = checkMedia(file.type) as\n // | 'image'\n // | 'video'\n // | 'audio';\n // const mediaType: 'image' | 'video' | 'audio' | 'file' = [\n // 'image',\n // 'video',\n // 'audio',\n // ].includes(baseMediaType)\n // ? baseMediaType\n // : 'file';\n\n // const contentItem: {\n // type: typeof mediaType;\n // image?: string;\n // video?: string;\n // audio?: string;\n // file?: string;\n // } = {\n // type: mediaType,\n // };\n\n // switch (mediaType) {\n // case 'image':\n // contentItem.image = file.name;\n // break;\n // case 'video':\n // contentItem.video = file.name;\n // break;\n // case 'audio':\n // contentItem.audio = file.name;\n // break;\n // case 'file':\n // contentItem.file = file.name;\n // break;\n // }\n\n // return {\n // id,\n // type: mediaType,\n // name: file.name,\n // contentType: file.type,\n // content: [contentItem],\n // status: {\n // type: 'complete',\n // },\n // file,\n // };\n // },\n // accept: accept || 'image/*',\n // add: async ({ file }) => ({\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 return (\n <AssistantRuntimeProvider key={currentThreadId} runtime={runtime}>\n <ChatkitProvider\n value={{\n ref: ref as MutableRefObject<ChatkitRef | null>,\n plugins: plugins || [],\n showThreadList: threadList !== false,\n placeholder: placeholder || t('thread.prompt'),\n showHeader,\n renderHeader,\n expandToolGroup,\n expandToolDetail,\n expandReasoning,\n controller,\n authors,\n composerDisabled,\n composerTop,\n }}\n >\n <div className=\"flex h-full w-full\">\n {threadList !== false\n && (typeof threadList === 'function' ? (\n threadList({\n threadList: values(threadMap) as ThreadType[],\n })\n ) : (\n <ThreadList />\n ))}\n <div className=\"flex-1 h-full w-[calc(100%-200px)]\">\n <Thread welcome={welcome} recommends={recommends} />\n {threadBottom}\n </div>\n </div>\n {(tools || []).map((tool, index) => React.createElement(tool))}\n <ExecutionCard />\n </ChatkitProvider>\n </AssistantRuntimeProvider>\n );\n },\n);\n\nfunction Chatkit(props: ChatkitProps) {\n const {\n initialConfig,\n welcome,\n recommends,\n onError,\n toolDisplay,\n showReasoning,\n plugins,\n tools,\n chatController: chatControllerFromProps = null,\n threadBottom,\n chatControllerPlugins,\n threadList,\n showHeader = true,\n renderHeader,\n placeholder,\n expandToolGroup,\n expandToolDetail,\n locale,\n accept,\n uploadBase64,\n composerDisabled,\n composerTop,\n } = props;\n\n const controllerRef = useRef<ChatController | null>(chatControllerFromProps);\n\n const controller = controllerRef.current;\n\n const { currentThreadId, threadMap } = useSnapshot(controller!.store.state);\n\n return (\n <I18nProvider defaultLocale={locale}>\n <div className=\"chatkit-wrapper\" style={{ height: '100%' }} data-chatkit>\n <ChatkitImpl\n uploadBase64={uploadBase64}\n key={currentThreadId}\n showReasoning={showReasoning}\n tools={tools || []}\n showHeader={showHeader}\n renderHeader={renderHeader}\n recommends={recommends}\n initialConfig={initialConfig}\n expandToolGroup={expandToolGroup}\n toolDisplay={toolDisplay}\n expandToolDetail={expandToolDetail}\n placeholder={placeholder}\n welcome={welcome}\n plugins={plugins}\n threadList={threadList}\n threadBottom={threadBottom}\n controller={controller!}\n accept={accept}\n composerDisabled={composerDisabled}\n composerTop={composerTop}\n />\n </div>\n </I18nProvider>\n );\n}\n\nexport default forwardRef(Chatkit);\n"],"names":["_jsx","_jsxs","React"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/Chatkit/index.tsx"],"sourcesContent":["import React, {\n ForwardedRef,\n forwardRef,\n MutableRefObject,\n useMemo,\n useRef,\n useEffect,\n} from 'react';\nimport { v4 as uuid } from 'uuid';\nimport { compact, values } from 'lodash-es';\nimport {\n AssistantRuntimeProvider,\n useExternalStoreRuntime,\n} from '@assistant-ui/react';\nimport {\n ChatMessage,\n ChatController,\n Thread as ThreadType,\n useSnapshot,\n TextMessage,\n} from '@chat-lab/core';\nimport { ChatkitProvider } from '@/contexts/ChatkitContext';\nimport { I18nProvider, useI18n } from '@/contexts/I18nContext';\n\nimport convertToAssistantMessage from '@/utils/convertToAssistantMessage';\nimport { convertToBase64 } from '@/utils/convertToBase64';\nimport checkMedia from '@/utils/checkMedia';\nimport './style.less';\nimport ThreadList from '../thread-list';\nimport { ChatkitProps, ChatkitRef } from './types';\nimport { Thread } from '../assistant-ui/thread';\n\nimport ExecutionCard from '../assistant-ui-tools/execution-card';\n\nconst ChatkitImpl = forwardRef(\n (props: ChatkitProps, ref: ForwardedRef<ChatkitRef>) => {\n const { t } = useI18n();\n const {\n initialConfig,\n tools,\n toolDisplay = 'group',\n welcome,\n recommends,\n plugins,\n threadList,\n showHeader = true,\n renderHeader,\n showReasoning = true,\n placeholder,\n expandToolGroup = false,\n expandReasoning = false,\n expandToolDetail = false,\n uploadBase64 = true,\n threadBottom,\n composerTop,\n accept,\n composerDisabled = false,\n threadMaxWidth,\n } = props;\n const { controller } = props;\n const { threadMap, currentThreadId } = useSnapshot(controller.store.state);\n // useImperativeHandleChatkitRef(ref, controller, onError);\n\n const currentThread = currentThreadId ? threadMap[currentThreadId] : null;\n const messages = currentThread?.messages || [];\n\n const { uiMessages, authors } = useMemo(\n () => convertToAssistantMessage(messages as Readonly<ChatMessage>[], {\n toolDisplay: toolDisplay || 'group',\n showReasoning,\n }),\n [messages, toolDisplay, showReasoning],\n );\n // const api = useAssistantApi();\n\n // useEffect(() => {}, [composerDisabled, api]);\n\n const runtime = useExternalStoreRuntime({\n messages: uiMessages,\n isLoading: currentThread?.sending,\n isRunning: currentThread?.sending,\n isDisabled: composerDisabled,\n convertMessage: (message) => message,\n onNew: async (message) => {\n const attachments = uploadBase64\n ? await Promise.all(\n message.attachments?.map(async (item) => ({\n ...item,\n base64: await convertToBase64(item.file as File),\n })) || [],\n )\n : message.attachments || [];\n\n controller?.sendMessage({\n attaches: attachments.map((item) => ({\n id: item.id,\n attachId: item.id,\n url: (item as { base64?: string })?.base64 || '',\n status: 'success',\n file: item.file,\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 controller?.reloadMessage({\n threadId: currentThread?.id,\n messageId: parentId,\n });\n } else {\n controller.onError?.(new Error(t('thread.notFound')));\n }\n },\n onCancel: async () => {\n controller?.abortMessage();\n },\n // adapters: {\n // attachments: {\n // remove: async ({ id }) => {\n // console.log(id);\n // },\n // send: async ({ id, file }) => {\n // // Map media type to valid content type\n // const baseMediaType = checkMedia(file.type) as\n // | 'image'\n // | 'video'\n // | 'audio';\n // const mediaType: 'image' | 'video' | 'audio' | 'file' = [\n // 'image',\n // 'video',\n // 'audio',\n // ].includes(baseMediaType)\n // ? baseMediaType\n // : 'file';\n\n // const contentItem: {\n // type: typeof mediaType;\n // image?: string;\n // video?: string;\n // audio?: string;\n // file?: string;\n // } = {\n // type: mediaType,\n // };\n\n // switch (mediaType) {\n // case 'image':\n // contentItem.image = file.name;\n // break;\n // case 'video':\n // contentItem.video = file.name;\n // break;\n // case 'audio':\n // contentItem.audio = file.name;\n // break;\n // case 'file':\n // contentItem.file = file.name;\n // break;\n // }\n\n // return {\n // id,\n // type: mediaType,\n // name: file.name,\n // contentType: file.type,\n // content: [contentItem],\n // status: {\n // type: 'complete',\n // },\n // file,\n // };\n // },\n // accept: accept || 'image/*',\n // add: async ({ file }) => ({\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 return (\n <AssistantRuntimeProvider key={currentThreadId} runtime={runtime}>\n <ChatkitProvider\n value={{\n threadMaxWidth,\n ref: ref as MutableRefObject<ChatkitRef | null>,\n plugins: plugins || [],\n showThreadList: threadList !== false,\n placeholder: placeholder || t('thread.prompt'),\n showHeader,\n renderHeader,\n expandToolGroup,\n expandToolDetail,\n expandReasoning,\n controller,\n authors,\n composerDisabled,\n composerTop,\n }}\n >\n <div className=\"flex h-full w-full\">\n {threadList !== false\n && (typeof threadList === 'function' ? (\n threadList({\n threadList: values(threadMap) as ThreadType[],\n })\n ) : (\n <ThreadList />\n ))}\n <div className=\"flex-1 h-full w-[calc(100%-200px)]\">\n <Thread welcome={welcome} recommends={recommends} />\n {threadBottom}\n </div>\n </div>\n {(tools || []).map((tool, index) => React.createElement(tool))}\n <ExecutionCard />\n </ChatkitProvider>\n </AssistantRuntimeProvider>\n );\n },\n);\n\nfunction Chatkit(props: ChatkitProps) {\n const {\n initialConfig,\n welcome,\n recommends,\n onError,\n toolDisplay,\n showReasoning,\n plugins,\n tools,\n chatController: chatControllerFromProps = null,\n threadBottom,\n chatControllerPlugins,\n threadList,\n showHeader = true,\n renderHeader,\n placeholder,\n expandToolGroup,\n expandToolDetail,\n locale,\n accept,\n uploadBase64,\n composerDisabled,\n composerTop,\n threadMaxWidth,\n } = props;\n\n const controllerRef = useRef<ChatController | null>(chatControllerFromProps);\n\n const controller = controllerRef.current;\n\n const { currentThreadId, threadMap } = useSnapshot(controller!.store.state);\n\n return (\n <I18nProvider defaultLocale={locale}>\n <div className=\"chatkit-wrapper\" style={{ height: '100%' }} data-chatkit>\n <ChatkitImpl\n uploadBase64={uploadBase64}\n key={currentThreadId}\n showReasoning={showReasoning}\n tools={tools || []}\n showHeader={showHeader}\n renderHeader={renderHeader}\n recommends={recommends}\n initialConfig={initialConfig}\n expandToolGroup={expandToolGroup}\n toolDisplay={toolDisplay}\n expandToolDetail={expandToolDetail}\n placeholder={placeholder}\n welcome={welcome}\n plugins={plugins}\n threadList={threadList}\n threadBottom={threadBottom}\n controller={controller!}\n accept={accept}\n composerDisabled={composerDisabled}\n composerTop={composerTop}\n threadMaxWidth={threadMaxWidth}\n />\n </div>\n </I18nProvider>\n );\n}\n\nexport default forwardRef(Chatkit);\n"],"names":["_jsx","_jsxs","React"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/Chatkit/types.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,aAAa,EACb,WAAW,EACX,kBAAkB,EAClB,cAAc,EACd,MAAM,EACP,MAAM,gBAAgB,CAAC;AAMxB,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EACP,KAAK,CAAC,SAAS,GACf,CAAC,CAAC,KAAK,EAAE;QAAE,UAAU,EAAE,MAAM,EAAE,CAAA;KAAE,KAAK,KAAK,CAAC,SAAS,CAAC,GACtD,OAAO,CAAC;IACZ,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC/B,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,aAAa,CAAC,EAAE;QACd,eAAe,EAAE,kBAAkB,CAAC;QACpC,cAAc,EAAE,cAAc,CAAC;KAChC,CAAC;IACF,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IACxC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,KAAK,KAAK,CAAC,SAAS,CAAC;IACrE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;IAC5B,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,qBAAqB,CAAC,EAAE,aAAa,EAAE,CAAC;IACxC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/B,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,UAAU,EAAE,cAAc,CAAC;IAC3B,gBAAgB,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/Chatkit/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,15 +4,16 @@ var jsxRuntime = require('react/jsx-runtime');
|
|
|
4
4
|
require('@assistant-ui/react-markdown/styles/dot.css');
|
|
5
5
|
var reactMarkdown = require('@assistant-ui/react-markdown');
|
|
6
6
|
var remarkGfm = require('remark-gfm');
|
|
7
|
+
var remarkBreaks = require('remark-breaks');
|
|
7
8
|
var rehypeRaw = require('rehype-raw');
|
|
8
9
|
var rehypeSanitize = require('rehype-sanitize');
|
|
9
10
|
var React = require('react');
|
|
10
11
|
var lucideReact = require('lucide-react');
|
|
11
12
|
var tooltipIconButton = require('./tooltip-icon-button.cjs');
|
|
12
13
|
var utils = require('../../lib/utils.cjs');
|
|
13
|
-
var shikiHighlighter = require('./shiki-highlighter.cjs');
|
|
14
14
|
var useDebounce = require('../../hooks/useDebounce.cjs');
|
|
15
15
|
var I18nContext = require('../../contexts/I18nContext.cjs');
|
|
16
|
+
var shikiHighlighter = require('./shiki-highlighter.cjs');
|
|
16
17
|
|
|
17
18
|
const schema = {
|
|
18
19
|
...rehypeSanitize.defaultSchema,
|
|
@@ -51,15 +52,15 @@ const schema = {
|
|
|
51
52
|
source: ['src', 'type'],
|
|
52
53
|
},
|
|
53
54
|
};
|
|
54
|
-
const remarkPlugins = [remarkGfm];
|
|
55
|
+
const remarkPlugins = [remarkGfm, remarkBreaks];
|
|
55
56
|
const rehypePlugins = [
|
|
56
57
|
rehypeRaw,
|
|
57
58
|
[rehypeSanitize, schema],
|
|
58
59
|
// rehypeAppendCursor,
|
|
59
60
|
];
|
|
60
|
-
|
|
61
|
+
function MarkdownTextImpl() {
|
|
61
62
|
return (jsxRuntime.jsx(reactMarkdown.MarkdownTextPrimitive, { remarkPlugins: remarkPlugins, rehypePlugins: rehypePlugins, className: "aui-md", components: defaultComponents }));
|
|
62
|
-
}
|
|
63
|
+
}
|
|
63
64
|
const MarkdownText = React.memo(MarkdownTextImpl);
|
|
64
65
|
const CodeHeader = ({ language, code }) => {
|
|
65
66
|
const { isCopied, copyToClipboard } = useCopyToClipboard();
|
|
@@ -72,10 +73,10 @@ const CodeHeader = ({ language, code }) => {
|
|
|
72
73
|
};
|
|
73
74
|
return (jsxRuntime.jsxs("div", { className: "aui-code-header-root mt-4 flex items-center justify-between gap-4 rounded-t-lg border bg-muted-foreground/15 px-4 py-2 text-sm font-semibold text-foreground max-w-[800px] overflow-auto", children: [jsxRuntime.jsx("span", { className: "aui-code-header-language lowercase [&>span]:text-xs", children: processedLanguage }), jsxRuntime.jsxs(tooltipIconButton.TooltipIconButton, { tooltip: t('thread.copy'), onClick: onCopy, children: [!isCopied && jsxRuntime.jsx(lucideReact.CopyIcon, {}), isCopied && jsxRuntime.jsx(lucideReact.CheckIcon, {})] })] }));
|
|
74
75
|
};
|
|
75
|
-
|
|
76
|
+
function Video({ src, className, ...props }) {
|
|
76
77
|
const debouncedSrc = useDebounce.useDebounce(src, 500);
|
|
77
78
|
return (jsxRuntime.jsx("video", { src: debouncedSrc, style: { maxWidth: 400 }, className: utils.cn('aui-md-video max-w-full rounded-lg', className), controls: true, ...props }));
|
|
78
|
-
}
|
|
79
|
+
}
|
|
79
80
|
const videoExtensions = [
|
|
80
81
|
'.mp4',
|
|
81
82
|
'.avi',
|
|
@@ -106,23 +107,19 @@ const defaultComponents = reactMarkdown.unstable_memoizeMarkdownComponents({
|
|
|
106
107
|
h5: ({ className, ...props }) => (jsxRuntime.jsx("h5", { className: utils.cn('aui-md-h5 my-4 text-lg font-semibold first:mt-0 last:mb-0', className), ...props })),
|
|
107
108
|
h6: ({ className, ...props }) => (jsxRuntime.jsx("h6", { className: utils.cn('aui-md-h6 my-4 font-semibold first:mt-0 last:mb-0', className), ...props })),
|
|
108
109
|
p: ({ className, ...props }) => (jsxRuntime.jsx("p", { className: utils.cn('aui-md-p text-[13px] mt-5 mb-5 leading-7 first:mt-0 last:mb-0 chatkit-md-text-p', className), ...props })),
|
|
109
|
-
image: ({ className, ...props }) => {
|
|
110
|
-
return (jsxRuntime.jsx("img", { src: props.href, style: { maxWidth: 400 }, className: utils.cn('aui-md-img max-w-full rounded-lg', className) }));
|
|
111
|
-
},
|
|
110
|
+
image: ({ className, ...props }) => (jsxRuntime.jsx("img", { src: props.href, style: { maxWidth: 400 }, className: utils.cn('aui-md-img max-w-full rounded-lg', className) })),
|
|
112
111
|
a: ({ className, ...props }) => {
|
|
113
112
|
const isVideo = (href) => {
|
|
114
113
|
if (!href)
|
|
115
114
|
return false;
|
|
116
|
-
return videoExtensions.some(ext => href.toLowerCase().includes(ext));
|
|
115
|
+
return videoExtensions.some((ext) => href.toLowerCase().includes(ext));
|
|
117
116
|
};
|
|
118
117
|
if (isVideo(props.href)) {
|
|
119
|
-
return (jsxRuntime.jsx(
|
|
118
|
+
return (jsxRuntime.jsx(Video, { src: props.href, className: className, ...props }));
|
|
120
119
|
}
|
|
121
120
|
return (jsxRuntime.jsx("a", { className: utils.cn('aui-md-a font-medium text-primary underline underline-offset-4', className), ...props }));
|
|
122
121
|
},
|
|
123
|
-
video: ({ className, ...props }) => {
|
|
124
|
-
return jsxRuntime.jsx(Video, { className: className, ...props });
|
|
125
|
-
},
|
|
122
|
+
video: ({ className, ...props }) => jsxRuntime.jsx(Video, { className: className, ...props }),
|
|
126
123
|
blockquote: ({ className, ...props }) => (jsxRuntime.jsx("blockquote", { className: utils.cn('aui-md-blockquote border-l-2 pl-6 italic', className), ...props })),
|
|
127
124
|
ul: ({ className, ...props }) => (jsxRuntime.jsx("ul", { className: utils.cn('aui-md-ul my-5 ml-6 list-disc [&>li]:mt-2', className), ...props })),
|
|
128
125
|
ol: ({ className, ...props }) => (jsxRuntime.jsx("ol", { className: utils.cn('aui-md-ol my-5 ml-6 list-decimal [&>li]:mt-2', className), ...props })),
|
|
@@ -136,13 +133,11 @@ const defaultComponents = reactMarkdown.unstable_memoizeMarkdownComponents({
|
|
|
136
133
|
pre: ({ className, ...props }) => (jsxRuntime.jsx("pre", { className: utils.cn('aui-md-pre overflow-x-auto !rounded-t-none rounded-b-lg p-4', className), ...props })),
|
|
137
134
|
code: function Code({ className, ...props }) {
|
|
138
135
|
const isCodeBlock = reactMarkdown.useIsMarkdownCodeBlock();
|
|
139
|
-
return (jsxRuntime.jsx("code", { className: utils.cn(!isCodeBlock
|
|
140
|
-
'aui-md-inline-code rounded border bg-muted font-semibold', className), ...props }));
|
|
136
|
+
return (jsxRuntime.jsx("code", { className: utils.cn(!isCodeBlock
|
|
137
|
+
&& 'aui-md-inline-code rounded border bg-muted font-semibold', className), ...props }));
|
|
141
138
|
},
|
|
142
139
|
CodeHeader,
|
|
143
|
-
div: ({ className, ...props }) => {
|
|
144
|
-
return jsxRuntime.jsx("div", { className: className, ...props });
|
|
145
|
-
},
|
|
140
|
+
div: ({ className, ...props }) => jsxRuntime.jsx("div", { className: className, ...props }),
|
|
146
141
|
});
|
|
147
142
|
|
|
148
143
|
exports.MarkdownText = MarkdownText;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-text.cjs","sources":["../../../src/components/assistant-ui/markdown-text.tsx"],"sourcesContent":["'use client';\n\nimport '@assistant-ui/react-markdown/styles/dot.css';\n\nimport {\n type CodeHeaderProps,\n MarkdownTextPrimitive,\n unstable_memoizeMarkdownComponents as memoizeMarkdownComponents,\n useIsMarkdownCodeBlock,\n} from '@assistant-ui/react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport rehypeRaw from 'rehype-raw';\nimport rehypeSanitize, { defaultSchema } from 'rehype-sanitize';\nimport { type FC, memo, useState } from 'react';\nimport { CheckIcon, CopyIcon, Loader2 } from 'lucide-react';\nimport './index.less';\nimport { TooltipIconButton } from '@/components/assistant-ui/tooltip-icon-button';\nimport { cn } from '@/lib/utils';\nimport { SyntaxHighlighter } from './shiki-highlighter';\nimport { useDebounce } from '@/hooks/useDebounce';\nimport { PluggableList } from 'unified';\nimport { useI18n } from '@/contexts/I18nContext';\n\nconst schema = {\n ...defaultSchema,\n // 1. 添加标签到白名单\n tagNames: [...(defaultSchema.tagNames || []), 'video', 'source', 'iframe'],\n // 2. 添加允许的属性\n attributes: {\n ...defaultSchema.attributes,\n iframe: [\n 'src',\n 'width',\n 'height',\n 'frameborder',\n 'allow',\n 'allowfullscreen',\n ],\n // 允许 video 标签使用的属性\n video: [\n 'controls',\n 'width',\n 'height',\n 'poster',\n 'preload',\n 'src',\n 'muted',\n 'loop',\n 'autoPlay',\n 'playsInline',\n ],\n div: [\n ...(defaultSchema.attributes?.div || []),\n 'className', //\n 'data-content', // 如果你在插件里用了 data-content\n ],\n // 允许 source 标签使用的属性\n source: ['src', 'type'],\n },\n};\n\nconst remarkPlugins: PluggableList = [remarkGfm];\n\nconst rehypePlugins: PluggableList = [\n rehypeRaw,\n [rehypeSanitize, schema],\n // rehypeAppendCursor,\n];\nconst MarkdownTextImpl = () => {\n return (\n <MarkdownTextPrimitive\n remarkPlugins={remarkPlugins}\n rehypePlugins={rehypePlugins}\n className=\"aui-md\"\n components={defaultComponents}\n />\n );\n};\n\nexport const MarkdownText = memo(MarkdownTextImpl);\n\nconst CodeHeader: FC<CodeHeaderProps> = ({ language, code }) => {\n const { isCopied, copyToClipboard } = useCopyToClipboard();\n const processedLanguage = language == 'unknown' ? 'text' : language;\n const { t } = useI18n();\n const onCopy = () => {\n if (!code || isCopied) return;\n copyToClipboard(code);\n };\n\n return (\n <div className=\"aui-code-header-root mt-4 flex items-center justify-between gap-4 rounded-t-lg border bg-muted-foreground/15 px-4 py-2 text-sm font-semibold text-foreground max-w-[800px] overflow-auto\">\n <span className=\"aui-code-header-language lowercase [&>span]:text-xs\">\n {processedLanguage}\n </span>\n <TooltipIconButton tooltip={t('thread.copy')} onClick={onCopy}>\n {!isCopied && <CopyIcon />}\n {isCopied && <CheckIcon />}\n </TooltipIconButton>\n </div>\n );\n};\n\nconst Video = ({\n src,\n className,\n ...props\n}: {\n src?: string;\n className?: string;\n}) => {\n const debouncedSrc = useDebounce(src, 500);\n return (\n <video\n src={debouncedSrc}\n style={{ maxWidth: 400 }}\n className={cn('aui-md-video max-w-full rounded-lg', className)}\n controls\n {...props}\n />\n );\n};\n\nconst videoExtensions = [\n '.mp4',\n '.avi',\n '.mov',\n '.wmv',\n '.flv',\n '.webm',\n '.mkv',\n '.m4v',\n];\n\nconst useCopyToClipboard = ({\n copiedDuration = 3000,\n}: {\n copiedDuration?: number;\n} = {}) => {\n const [isCopied, setIsCopied] = useState<boolean>(false);\n\n const copyToClipboard = (value: string) => {\n if (!value) return;\n\n navigator.clipboard.writeText(value).then(() => {\n setIsCopied(true);\n setTimeout(() => setIsCopied(false), copiedDuration);\n });\n };\n\n return { isCopied, copyToClipboard };\n};\n\nconst defaultComponents = memoizeMarkdownComponents({\n h1: ({ className, ...props }) => (\n <h1\n className={cn(\n 'aui-md-h1 mb-8 scroll-m-20 text-4xl font-extrabold tracking-tight last:mb-0',\n className,\n )}\n {...props}\n />\n ),\n h2: ({ className, ...props }) => (\n <h2\n className={cn(\n 'aui-md-h2 mt-6 mb-4 scroll-m-20 text-3xl font-semibold tracking-tight first:mt-0 last:mb-0',\n className,\n )}\n {...props}\n />\n ),\n h3: ({ className, ...props }) => (\n <h3\n className={cn(\n 'aui-md-h3 mt-6 mb-4 scroll-m-20 text-2xl font-semibold tracking-tight first:mt-0 last:mb-0',\n className,\n )}\n {...props}\n />\n ),\n h4: ({ className, ...props }) => (\n <h4\n className={cn(\n 'aui-md-h4 mt-6 mb-4 scroll-m-20 text-xl font-semibold tracking-tight first:mt-0 last:mb-0',\n className,\n )}\n {...props}\n />\n ),\n h5: ({ className, ...props }) => (\n <h5\n className={cn(\n 'aui-md-h5 my-4 text-lg font-semibold first:mt-0 last:mb-0',\n className,\n )}\n {...props}\n />\n ),\n h6: ({ className, ...props }) => (\n <h6\n className={cn(\n 'aui-md-h6 my-4 font-semibold first:mt-0 last:mb-0',\n className,\n )}\n {...props}\n />\n ),\n p: ({ className, ...props }) => (\n <p\n className={cn(\n 'aui-md-p text-[13px] mt-5 mb-5 leading-7 first:mt-0 last:mb-0 chatkit-md-text-p',\n className,\n )}\n {...props}\n />\n ),\n image: ({ className, ...props }) => {\n return (\n <img\n src={props.href}\n style={{ maxWidth: 400 }}\n className={cn('aui-md-img max-w-full rounded-lg', className)}\n />\n );\n },\n a: ({ className, ...props }) => {\n const isVideo = (href: string | undefined) => {\n if (!href) return false;\n return videoExtensions.some(ext => href.toLowerCase().includes(ext));\n };\n\n if (isVideo(props.href)) {\n return (\n <>\n <Video src={props.href} className={className} {...props} />\n </>\n );\n }\n\n return (\n <a\n className={cn(\n 'aui-md-a font-medium text-primary underline underline-offset-4',\n className,\n )}\n {...props}\n />\n );\n },\n video: ({ className, ...props }) => {\n return <Video className={className} {...props} />;\n },\n blockquote: ({ className, ...props }) => (\n <blockquote\n className={cn('aui-md-blockquote border-l-2 pl-6 italic', className)}\n {...props}\n />\n ),\n ul: ({ className, ...props }) => (\n <ul\n className={cn('aui-md-ul my-5 ml-6 list-disc [&>li]:mt-2', className)}\n {...props}\n />\n ),\n ol: ({ className, ...props }) => (\n <ol\n className={cn('aui-md-ol my-5 ml-6 list-decimal [&>li]:mt-2', className)}\n {...props}\n />\n ),\n hr: ({ className, ...props }) => (\n <hr className={cn('aui-md-hr my-5 border-b', className)} {...props} />\n ),\n table: ({ className, ...props }) => (\n <table\n className={cn(\n 'aui-md-table my-5 w-full border-separate border-spacing-0 overflow-y-auto',\n className,\n )}\n {...props}\n />\n ),\n th: ({ className, ...props }) => (\n <th\n className={cn(\n 'aui-md-th bg-muted px-4 py-2 text-left font-bold first:rounded-tl-lg last:rounded-tr-lg [&[align=center]]:text-center [&[align=right]]:text-right',\n className,\n )}\n {...props}\n />\n ),\n td: ({ className, ...props }) => (\n <td\n className={cn(\n 'aui-md-td border-b border-l px-4 py-2 text-left last:border-r [&[align=center]]:text-center [&[align=right]]:text-right',\n className,\n )}\n {...props}\n />\n ),\n tr: ({ className, ...props }) => (\n <tr\n className={cn(\n 'aui-md-tr m-0 border-b p-0 first:border-t [&:last-child>td:first-child]:rounded-bl-lg [&:last-child>td:last-child]:rounded-br-lg',\n className,\n )}\n {...props}\n />\n ),\n sup: ({ className, ...props }) => (\n <sup\n className={cn('aui-md-sup [&>a]:text-xs [&>a]:no-underline', className)}\n {...props}\n />\n ),\n SyntaxHighlighter: SyntaxHighlighter,\n pre: ({ className, ...props }) => (\n <pre\n className={cn(\n 'aui-md-pre overflow-x-auto !rounded-t-none rounded-b-lg p-4',\n className,\n )}\n {...props}\n />\n ),\n code: function Code({ className, ...props }) {\n const isCodeBlock = useIsMarkdownCodeBlock();\n return (\n <code\n className={cn(\n !isCodeBlock &&\n 'aui-md-inline-code rounded border bg-muted font-semibold',\n className,\n )}\n {...props}\n />\n );\n },\n CodeHeader,\n div: ({ className, ...props }) => {\n return <div className={className} {...props} />;\n },\n});\n"],"names":["defaultSchema","_jsx","MarkdownTextPrimitive","memo","useI18n","_jsxs","TooltipIconButton","CopyIcon","CheckIcon","useDebounce","cn","useState","memoizeMarkdownComponents","_Fragment","SyntaxHighlighter","useIsMarkdownCodeBlock"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"markdown-text.cjs","sources":["../../../src/components/assistant-ui/markdown-text.tsx"],"sourcesContent":["'use client';\n\nimport '@assistant-ui/react-markdown/styles/dot.css';\n\nimport {\n type CodeHeaderProps,\n MarkdownTextPrimitive,\n unstable_memoizeMarkdownComponents as memoizeMarkdownComponents,\n useIsMarkdownCodeBlock,\n} from '@assistant-ui/react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport remarkBreaks from 'remark-breaks';\nimport rehypeRaw from 'rehype-raw';\nimport rehypeSanitize, { defaultSchema } from 'rehype-sanitize';\nimport { type FC, memo, useState } from 'react';\nimport { CheckIcon, CopyIcon, Loader2 } from 'lucide-react';\nimport './index.less';\nimport { TooltipIconButton } from '@/components/assistant-ui/tooltip-icon-button';\nimport { cn } from '@/lib/utils';\nimport { useDebounce } from '@/hooks/useDebounce';\nimport { PluggableList } from 'unified';\nimport { useI18n } from '@/contexts/I18nContext';\nimport { SyntaxHighlighter } from './shiki-highlighter';\n\nconst schema = {\n ...defaultSchema,\n // 1. 添加标签到白名单\n tagNames: [...(defaultSchema.tagNames || []), 'video', 'source', 'iframe'],\n // 2. 添加允许的属性\n attributes: {\n ...defaultSchema.attributes,\n iframe: [\n 'src',\n 'width',\n 'height',\n 'frameborder',\n 'allow',\n 'allowfullscreen',\n ],\n // 允许 video 标签使用的属性\n video: [\n 'controls',\n 'width',\n 'height',\n 'poster',\n 'preload',\n 'src',\n 'muted',\n 'loop',\n 'autoPlay',\n 'playsInline',\n ],\n div: [\n ...(defaultSchema.attributes?.div || []),\n 'className', //\n 'data-content', // 如果你在插件里用了 data-content\n ],\n // 允许 source 标签使用的属性\n source: ['src', 'type'],\n },\n};\n\nconst remarkPlugins: PluggableList = [remarkGfm, remarkBreaks];\n\nconst rehypePlugins: PluggableList = [\n rehypeRaw,\n [rehypeSanitize, schema],\n // rehypeAppendCursor,\n];\nfunction MarkdownTextImpl() {\n return (\n <MarkdownTextPrimitive\n remarkPlugins={remarkPlugins}\n rehypePlugins={rehypePlugins}\n className=\"aui-md\"\n components={defaultComponents}\n />\n );\n}\n\nexport const MarkdownText = memo(MarkdownTextImpl);\n\nconst CodeHeader: FC<CodeHeaderProps> = ({ language, code }) => {\n const { isCopied, copyToClipboard } = useCopyToClipboard();\n const processedLanguage = language == 'unknown' ? 'text' : language;\n const { t } = useI18n();\n const onCopy = () => {\n if (!code || isCopied) return;\n copyToClipboard(code);\n };\n\n return (\n <div className=\"aui-code-header-root mt-4 flex items-center justify-between gap-4 rounded-t-lg border bg-muted-foreground/15 px-4 py-2 text-sm font-semibold text-foreground max-w-[800px] overflow-auto\">\n <span className=\"aui-code-header-language lowercase [&>span]:text-xs\">\n {processedLanguage}\n </span>\n <TooltipIconButton tooltip={t('thread.copy')} onClick={onCopy}>\n {!isCopied && <CopyIcon />}\n {isCopied && <CheckIcon />}\n </TooltipIconButton>\n </div>\n );\n};\n\nfunction Video({\n src,\n className,\n ...props\n}: {\n src?: string;\n className?: string;\n}) {\n const debouncedSrc = useDebounce(src, 500);\n return (\n <video\n src={debouncedSrc}\n style={{ maxWidth: 400 }}\n className={cn('aui-md-video max-w-full rounded-lg', className)}\n controls\n {...props}\n />\n );\n}\n\nconst videoExtensions = [\n '.mp4',\n '.avi',\n '.mov',\n '.wmv',\n '.flv',\n '.webm',\n '.mkv',\n '.m4v',\n];\n\nconst useCopyToClipboard = ({\n copiedDuration = 3000,\n}: {\n copiedDuration?: number;\n} = {}) => {\n const [isCopied, setIsCopied] = useState<boolean>(false);\n\n const copyToClipboard = (value: string) => {\n if (!value) return;\n\n navigator.clipboard.writeText(value).then(() => {\n setIsCopied(true);\n setTimeout(() => setIsCopied(false), copiedDuration);\n });\n };\n\n return { isCopied, copyToClipboard };\n};\n\nconst defaultComponents = memoizeMarkdownComponents({\n h1: ({ className, ...props }) => (\n <h1\n className={cn(\n 'aui-md-h1 mb-8 scroll-m-20 text-4xl font-extrabold tracking-tight last:mb-0',\n className,\n )}\n {...props}\n />\n ),\n h2: ({ className, ...props }) => (\n <h2\n className={cn(\n 'aui-md-h2 mt-6 mb-4 scroll-m-20 text-3xl font-semibold tracking-tight first:mt-0 last:mb-0',\n className,\n )}\n {...props}\n />\n ),\n h3: ({ className, ...props }) => (\n <h3\n className={cn(\n 'aui-md-h3 mt-6 mb-4 scroll-m-20 text-2xl font-semibold tracking-tight first:mt-0 last:mb-0',\n className,\n )}\n {...props}\n />\n ),\n h4: ({ className, ...props }) => (\n <h4\n className={cn(\n 'aui-md-h4 mt-6 mb-4 scroll-m-20 text-xl font-semibold tracking-tight first:mt-0 last:mb-0',\n className,\n )}\n {...props}\n />\n ),\n h5: ({ className, ...props }) => (\n <h5\n className={cn(\n 'aui-md-h5 my-4 text-lg font-semibold first:mt-0 last:mb-0',\n className,\n )}\n {...props}\n />\n ),\n h6: ({ className, ...props }) => (\n <h6\n className={cn(\n 'aui-md-h6 my-4 font-semibold first:mt-0 last:mb-0',\n className,\n )}\n {...props}\n />\n ),\n p: ({ className, ...props }) => (\n <p\n className={cn(\n 'aui-md-p text-[13px] mt-5 mb-5 leading-7 first:mt-0 last:mb-0 chatkit-md-text-p',\n className,\n )}\n {...props}\n />\n ),\n image: ({ className, ...props }) => (\n <img\n src={props.href}\n style={{ maxWidth: 400 }}\n className={cn('aui-md-img max-w-full rounded-lg', className)}\n />\n ),\n a: ({ className, ...props }) => {\n const isVideo = (href: string | undefined) => {\n if (!href) return false;\n return videoExtensions.some((ext) => href.toLowerCase().includes(ext));\n };\n\n if (isVideo(props.href)) {\n return (\n <Video src={props.href} className={className} {...props} />\n );\n }\n\n return (\n <a\n className={cn(\n 'aui-md-a font-medium text-primary underline underline-offset-4',\n className,\n )}\n {...props}\n />\n );\n },\n video: ({ className, ...props }) => <Video className={className} {...props} />,\n blockquote: ({ className, ...props }) => (\n <blockquote\n className={cn('aui-md-blockquote border-l-2 pl-6 italic', className)}\n {...props}\n />\n ),\n ul: ({ className, ...props }) => (\n <ul\n className={cn('aui-md-ul my-5 ml-6 list-disc [&>li]:mt-2', className)}\n {...props}\n />\n ),\n ol: ({ className, ...props }) => (\n <ol\n className={cn('aui-md-ol my-5 ml-6 list-decimal [&>li]:mt-2', className)}\n {...props}\n />\n ),\n hr: ({ className, ...props }) => (\n <hr className={cn('aui-md-hr my-5 border-b', className)} {...props} />\n ),\n table: ({ className, ...props }) => (\n <table\n className={cn(\n 'aui-md-table my-5 w-full border-separate border-spacing-0 overflow-y-auto',\n className,\n )}\n {...props}\n />\n ),\n th: ({ className, ...props }) => (\n <th\n className={cn(\n 'aui-md-th bg-muted px-4 py-2 text-left font-bold first:rounded-tl-lg last:rounded-tr-lg [&[align=center]]:text-center [&[align=right]]:text-right',\n className,\n )}\n {...props}\n />\n ),\n td: ({ className, ...props }) => (\n <td\n className={cn(\n 'aui-md-td border-b border-l px-4 py-2 text-left last:border-r [&[align=center]]:text-center [&[align=right]]:text-right',\n className,\n )}\n {...props}\n />\n ),\n tr: ({ className, ...props }) => (\n <tr\n className={cn(\n 'aui-md-tr m-0 border-b p-0 first:border-t [&:last-child>td:first-child]:rounded-bl-lg [&:last-child>td:last-child]:rounded-br-lg',\n className,\n )}\n {...props}\n />\n ),\n sup: ({ className, ...props }) => (\n <sup\n className={cn('aui-md-sup [&>a]:text-xs [&>a]:no-underline', className)}\n {...props}\n />\n ),\n SyntaxHighlighter,\n pre: ({ className, ...props }) => (\n <pre\n className={cn(\n 'aui-md-pre overflow-x-auto !rounded-t-none rounded-b-lg p-4',\n className,\n )}\n {...props}\n />\n ),\n code: function Code({ className, ...props }) {\n const isCodeBlock = useIsMarkdownCodeBlock();\n return (\n <code\n className={cn(\n !isCodeBlock\n && 'aui-md-inline-code rounded border bg-muted font-semibold',\n className,\n )}\n {...props}\n />\n );\n },\n CodeHeader,\n div: ({ className, ...props }) => <div className={className} {...props} />,\n});\n"],"names":["defaultSchema","_jsx","MarkdownTextPrimitive","memo","useI18n","_jsxs","TooltipIconButton","CopyIcon","CheckIcon","useDebounce","cn","useState","memoizeMarkdownComponents","SyntaxHighlighter","useIsMarkdownCodeBlock"],"mappings":"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"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import '@assistant-ui/react-markdown/styles/dot.css';
|
|
2
2
|
import './index.less';
|
|
3
|
-
|
|
3
|
+
declare function MarkdownTextImpl(): JSX.Element;
|
|
4
|
+
export declare const MarkdownText: import("react").MemoExoticComponent<typeof MarkdownTextImpl>;
|
|
5
|
+
export {};
|
|
4
6
|
//# sourceMappingURL=markdown-text.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown-text.d.ts","sourceRoot":"","sources":["../../../src/components/assistant-ui/markdown-text.tsx"],"names":[],"mappings":"AAEA,OAAO,6CAA6C,CAAC;
|
|
1
|
+
{"version":3,"file":"markdown-text.d.ts","sourceRoot":"","sources":["../../../src/components/assistant-ui/markdown-text.tsx"],"names":[],"mappings":"AAEA,OAAO,6CAA6C,CAAC;AAcrD,OAAO,cAAc,CAAC;AAqDtB,iBAAS,gBAAgB,gBASxB;AAED,eAAO,MAAM,YAAY,8DAAyB,CAAC"}
|
|
@@ -1,16 +1,17 @@
|
|
|
1
|
-
import { jsx,
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
2
|
import '@assistant-ui/react-markdown/styles/dot.css';
|
|
3
3
|
import { unstable_memoizeMarkdownComponents, useIsMarkdownCodeBlock, MarkdownTextPrimitive } from '@assistant-ui/react-markdown';
|
|
4
4
|
import remarkGfm from 'remark-gfm';
|
|
5
|
+
import remarkBreaks from 'remark-breaks';
|
|
5
6
|
import rehypeRaw from 'rehype-raw';
|
|
6
7
|
import rehypeSanitize, { defaultSchema } from 'rehype-sanitize';
|
|
7
8
|
import { memo, useState } from 'react';
|
|
8
9
|
import { CopyIcon, CheckIcon } from 'lucide-react';
|
|
9
10
|
import { TooltipIconButton } from './tooltip-icon-button.js';
|
|
10
11
|
import { cn } from '../../lib/utils.js';
|
|
11
|
-
import { SyntaxHighlighter } from './shiki-highlighter.js';
|
|
12
12
|
import { useDebounce } from '../../hooks/useDebounce.js';
|
|
13
13
|
import { useI18n } from '../../contexts/I18nContext.js';
|
|
14
|
+
import { SyntaxHighlighter } from './shiki-highlighter.js';
|
|
14
15
|
|
|
15
16
|
const schema = {
|
|
16
17
|
...defaultSchema,
|
|
@@ -49,15 +50,15 @@ const schema = {
|
|
|
49
50
|
source: ['src', 'type'],
|
|
50
51
|
},
|
|
51
52
|
};
|
|
52
|
-
const remarkPlugins = [remarkGfm];
|
|
53
|
+
const remarkPlugins = [remarkGfm, remarkBreaks];
|
|
53
54
|
const rehypePlugins = [
|
|
54
55
|
rehypeRaw,
|
|
55
56
|
[rehypeSanitize, schema],
|
|
56
57
|
// rehypeAppendCursor,
|
|
57
58
|
];
|
|
58
|
-
|
|
59
|
+
function MarkdownTextImpl() {
|
|
59
60
|
return (jsx(MarkdownTextPrimitive, { remarkPlugins: remarkPlugins, rehypePlugins: rehypePlugins, className: "aui-md", components: defaultComponents }));
|
|
60
|
-
}
|
|
61
|
+
}
|
|
61
62
|
const MarkdownText = memo(MarkdownTextImpl);
|
|
62
63
|
const CodeHeader = ({ language, code }) => {
|
|
63
64
|
const { isCopied, copyToClipboard } = useCopyToClipboard();
|
|
@@ -70,10 +71,10 @@ const CodeHeader = ({ language, code }) => {
|
|
|
70
71
|
};
|
|
71
72
|
return (jsxs("div", { className: "aui-code-header-root mt-4 flex items-center justify-between gap-4 rounded-t-lg border bg-muted-foreground/15 px-4 py-2 text-sm font-semibold text-foreground max-w-[800px] overflow-auto", children: [jsx("span", { className: "aui-code-header-language lowercase [&>span]:text-xs", children: processedLanguage }), jsxs(TooltipIconButton, { tooltip: t('thread.copy'), onClick: onCopy, children: [!isCopied && jsx(CopyIcon, {}), isCopied && jsx(CheckIcon, {})] })] }));
|
|
72
73
|
};
|
|
73
|
-
|
|
74
|
+
function Video({ src, className, ...props }) {
|
|
74
75
|
const debouncedSrc = useDebounce(src, 500);
|
|
75
76
|
return (jsx("video", { src: debouncedSrc, style: { maxWidth: 400 }, className: cn('aui-md-video max-w-full rounded-lg', className), controls: true, ...props }));
|
|
76
|
-
}
|
|
77
|
+
}
|
|
77
78
|
const videoExtensions = [
|
|
78
79
|
'.mp4',
|
|
79
80
|
'.avi',
|
|
@@ -104,23 +105,19 @@ const defaultComponents = unstable_memoizeMarkdownComponents({
|
|
|
104
105
|
h5: ({ className, ...props }) => (jsx("h5", { className: cn('aui-md-h5 my-4 text-lg font-semibold first:mt-0 last:mb-0', className), ...props })),
|
|
105
106
|
h6: ({ className, ...props }) => (jsx("h6", { className: cn('aui-md-h6 my-4 font-semibold first:mt-0 last:mb-0', className), ...props })),
|
|
106
107
|
p: ({ className, ...props }) => (jsx("p", { className: cn('aui-md-p text-[13px] mt-5 mb-5 leading-7 first:mt-0 last:mb-0 chatkit-md-text-p', className), ...props })),
|
|
107
|
-
image: ({ className, ...props }) => {
|
|
108
|
-
return (jsx("img", { src: props.href, style: { maxWidth: 400 }, className: cn('aui-md-img max-w-full rounded-lg', className) }));
|
|
109
|
-
},
|
|
108
|
+
image: ({ className, ...props }) => (jsx("img", { src: props.href, style: { maxWidth: 400 }, className: cn('aui-md-img max-w-full rounded-lg', className) })),
|
|
110
109
|
a: ({ className, ...props }) => {
|
|
111
110
|
const isVideo = (href) => {
|
|
112
111
|
if (!href)
|
|
113
112
|
return false;
|
|
114
|
-
return videoExtensions.some(ext => href.toLowerCase().includes(ext));
|
|
113
|
+
return videoExtensions.some((ext) => href.toLowerCase().includes(ext));
|
|
115
114
|
};
|
|
116
115
|
if (isVideo(props.href)) {
|
|
117
|
-
return (jsx(
|
|
116
|
+
return (jsx(Video, { src: props.href, className: className, ...props }));
|
|
118
117
|
}
|
|
119
118
|
return (jsx("a", { className: cn('aui-md-a font-medium text-primary underline underline-offset-4', className), ...props }));
|
|
120
119
|
},
|
|
121
|
-
video: ({ className, ...props }) => {
|
|
122
|
-
return jsx(Video, { className: className, ...props });
|
|
123
|
-
},
|
|
120
|
+
video: ({ className, ...props }) => jsx(Video, { className: className, ...props }),
|
|
124
121
|
blockquote: ({ className, ...props }) => (jsx("blockquote", { className: cn('aui-md-blockquote border-l-2 pl-6 italic', className), ...props })),
|
|
125
122
|
ul: ({ className, ...props }) => (jsx("ul", { className: cn('aui-md-ul my-5 ml-6 list-disc [&>li]:mt-2', className), ...props })),
|
|
126
123
|
ol: ({ className, ...props }) => (jsx("ol", { className: cn('aui-md-ol my-5 ml-6 list-decimal [&>li]:mt-2', className), ...props })),
|
|
@@ -130,17 +127,15 @@ const defaultComponents = unstable_memoizeMarkdownComponents({
|
|
|
130
127
|
td: ({ className, ...props }) => (jsx("td", { className: cn('aui-md-td border-b border-l px-4 py-2 text-left last:border-r [&[align=center]]:text-center [&[align=right]]:text-right', className), ...props })),
|
|
131
128
|
tr: ({ className, ...props }) => (jsx("tr", { className: cn('aui-md-tr m-0 border-b p-0 first:border-t [&:last-child>td:first-child]:rounded-bl-lg [&:last-child>td:last-child]:rounded-br-lg', className), ...props })),
|
|
132
129
|
sup: ({ className, ...props }) => (jsx("sup", { className: cn('aui-md-sup [&>a]:text-xs [&>a]:no-underline', className), ...props })),
|
|
133
|
-
SyntaxHighlighter
|
|
130
|
+
SyntaxHighlighter,
|
|
134
131
|
pre: ({ className, ...props }) => (jsx("pre", { className: cn('aui-md-pre overflow-x-auto !rounded-t-none rounded-b-lg p-4', className), ...props })),
|
|
135
132
|
code: function Code({ className, ...props }) {
|
|
136
133
|
const isCodeBlock = useIsMarkdownCodeBlock();
|
|
137
|
-
return (jsx("code", { className: cn(!isCodeBlock
|
|
138
|
-
'aui-md-inline-code rounded border bg-muted font-semibold', className), ...props }));
|
|
134
|
+
return (jsx("code", { className: cn(!isCodeBlock
|
|
135
|
+
&& 'aui-md-inline-code rounded border bg-muted font-semibold', className), ...props }));
|
|
139
136
|
},
|
|
140
137
|
CodeHeader,
|
|
141
|
-
div: ({ className, ...props }) => {
|
|
142
|
-
return jsx("div", { className: className, ...props });
|
|
143
|
-
},
|
|
138
|
+
div: ({ className, ...props }) => jsx("div", { className: className, ...props }),
|
|
144
139
|
});
|
|
145
140
|
|
|
146
141
|
export { MarkdownText };
|