@chat-lab/ui 0.1.0-beta.73 → 0.1.0-beta.74

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/dist/components/Chatkit/index.cjs +2 -1
  2. package/dist/components/Chatkit/index.cjs.map +1 -1
  3. package/dist/components/Chatkit/index.js +2 -1
  4. package/dist/components/Chatkit/index.js.map +1 -1
  5. package/dist/components/assistant-ui/markdown-text.cjs +5 -3
  6. package/dist/components/assistant-ui/markdown-text.cjs.map +1 -1
  7. package/dist/components/assistant-ui/markdown-text.d.ts.map +1 -1
  8. package/dist/components/assistant-ui/markdown-text.js +5 -3
  9. package/dist/components/assistant-ui/markdown-text.js.map +1 -1
  10. package/dist/components/assistant-ui/thread.cjs +8 -9
  11. package/dist/components/assistant-ui/thread.cjs.map +1 -1
  12. package/dist/components/assistant-ui/thread.d.ts.map +1 -1
  13. package/dist/components/assistant-ui/thread.js +8 -9
  14. package/dist/components/assistant-ui/thread.js.map +1 -1
  15. package/dist/contexts/ChatkitContext.cjs.map +1 -1
  16. package/dist/contexts/ChatkitContext.d.ts +1 -0
  17. package/dist/contexts/ChatkitContext.d.ts.map +1 -1
  18. package/dist/contexts/ChatkitContext.js.map +1 -1
  19. package/dist/core/dist/index.cjs +5 -3
  20. package/dist/core/dist/index.cjs.map +1 -1
  21. package/dist/core/dist/index.js +5 -3
  22. package/dist/core/dist/index.js.map +1 -1
  23. package/dist/hooks/useClawChat/ClawProtocolAdaptor.cjs +1 -1
  24. package/dist/hooks/useClawChat/ClawProtocolAdaptor.cjs.map +1 -1
  25. package/dist/hooks/useClawChat/ClawProtocolAdaptor.js +1 -1
  26. package/dist/hooks/useClawChat/ClawProtocolAdaptor.js.map +1 -1
  27. package/dist/hooks/useClawChat/clawCompletion.cjs +13 -7
  28. package/dist/hooks/useClawChat/clawCompletion.cjs.map +1 -1
  29. package/dist/hooks/useClawChat/clawCompletion.d.ts.map +1 -1
  30. package/dist/hooks/useClawChat/clawCompletion.js +13 -7
  31. package/dist/hooks/useClawChat/clawCompletion.js.map +1 -1
  32. package/dist/hooks/useClawChat/clawPlugin.cjs +24 -0
  33. package/dist/hooks/useClawChat/clawPlugin.cjs.map +1 -0
  34. package/dist/hooks/useClawChat/clawPlugin.d.ts +10 -0
  35. package/dist/hooks/useClawChat/clawPlugin.d.ts.map +1 -0
  36. package/dist/hooks/useClawChat/clawPlugin.js +22 -0
  37. package/dist/hooks/useClawChat/clawPlugin.js.map +1 -0
  38. package/dist/hooks/useClawChat/index.cjs +24 -8
  39. package/dist/hooks/useClawChat/index.cjs.map +1 -1
  40. package/dist/hooks/useClawChat/index.d.ts.map +1 -1
  41. package/dist/hooks/useClawChat/index.js +24 -8
  42. package/dist/hooks/useClawChat/index.js.map +1 -1
  43. package/dist/hooks/useClawChat/types.cjs +1 -1
  44. package/dist/hooks/useClawChat/types.cjs.map +1 -1
  45. package/dist/hooks/useClawChat/types.d.ts +12 -5
  46. package/dist/hooks/useClawChat/types.d.ts.map +1 -1
  47. package/dist/hooks/useClawChat/types.js +1 -1
  48. package/dist/hooks/useClawChat/types.js.map +1 -1
  49. package/dist/index.css +1 -1
  50. package/package.json +1 -1
  51. package/dist/assets/Attachment.cjs +0 -8
  52. package/dist/assets/Attachment.cjs.map +0 -1
  53. package/dist/assets/Attachment.js +0 -6
  54. package/dist/assets/Attachment.js.map +0 -1
  55. package/dist/assets/ClearIcon.cjs +0 -8
  56. package/dist/assets/ClearIcon.cjs.map +0 -1
  57. package/dist/assets/ClearIcon.js +0 -6
  58. package/dist/assets/ClearIcon.js.map +0 -1
  59. package/dist/assets/Download.cjs +0 -10
  60. package/dist/assets/Download.cjs.map +0 -1
  61. package/dist/assets/Download.js +0 -8
  62. package/dist/assets/Download.js.map +0 -1
  63. package/dist/assets/NewSession.cjs +0 -8
  64. package/dist/assets/NewSession.cjs.map +0 -1
  65. package/dist/assets/NewSession.js +0 -6
  66. package/dist/assets/NewSession.js.map +0 -1
  67. package/dist/assets/RefreshIcon.cjs +0 -8
  68. package/dist/assets/RefreshIcon.cjs.map +0 -1
  69. package/dist/assets/RefreshIcon.js +0 -6
  70. package/dist/assets/RefreshIcon.js.map +0 -1
  71. package/dist/assets/ThumbDownIcon.cjs +0 -8
  72. package/dist/assets/ThumbDownIcon.cjs.map +0 -1
  73. package/dist/assets/ThumbDownIcon.js +0 -6
  74. package/dist/assets/ThumbDownIcon.js.map +0 -1
  75. package/dist/assets/ThumbUpIcon.cjs +0 -8
  76. package/dist/assets/ThumbUpIcon.cjs.map +0 -1
  77. package/dist/assets/ThumbUpIcon.js +0 -6
  78. package/dist/assets/ThumbUpIcon.js.map +0 -1
@@ -162,10 +162,11 @@ const ChatkitImpl = React.forwardRef((props, ref) => {
162
162
  authors,
163
163
  composerDisabled,
164
164
  composerTop,
165
+ threadBottom,
165
166
  }, children: [jsxRuntime.jsxs("div", { className: "flex h-full w-full", children: [threadList$1 !== false
166
167
  && (typeof threadList$1 === 'function' ? (threadList$1({
167
168
  threadList: lodashEs.values(threadMap),
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));
169
+ })) : (jsxRuntime.jsx(threadList, {}))), jsxRuntime.jsx("div", { className: "flex-1 h-full", children: jsxRuntime.jsx(thread.Thread, { welcome: welcome, recommends: recommends }) })] }), (tools || []).map((tool, index) => React.createElement(tool)), jsxRuntime.jsx(executionCard, {})] }) }, currentThreadId));
169
170
  });
170
171
  function Chatkit(props) {
171
172
  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;
@@ -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 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
+ {"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, last } 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 threadBottom,\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\">\n <Thread welcome={welcome} recommends={recommends} />\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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"}
@@ -160,10 +160,11 @@ const ChatkitImpl = forwardRef((props, ref) => {
160
160
  authors,
161
161
  composerDisabled,
162
162
  composerTop,
163
+ threadBottom,
163
164
  }, children: [jsxs("div", { className: "flex h-full w-full", children: [threadList !== false
164
165
  && (typeof threadList === 'function' ? (threadList({
165
166
  threadList: values(threadMap),
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));
167
+ })) : (jsx(ThreadList, {}))), jsx("div", { className: "flex-1 h-full", children: jsx(Thread, { welcome: welcome, recommends: recommends }) })] }), (tools || []).map((tool, index) => React__default.createElement(tool)), jsx(ExecutionCard, {})] }) }, currentThreadId));
167
168
  });
168
169
  function Chatkit(props) {
169
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, threadMaxWidth, } = props;
@@ -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 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
+ {"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, last } 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 threadBottom,\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\">\n <Thread welcome={welcome} recommends={recommends} />\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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"}
@@ -59,7 +59,9 @@ const rehypePlugins = [
59
59
  // rehypeAppendCursor,
60
60
  ];
61
61
  function MarkdownTextImpl() {
62
- return (jsxRuntime.jsx(reactMarkdown.MarkdownTextPrimitive, { remarkPlugins: remarkPlugins, rehypePlugins: rehypePlugins, className: "aui-md", components: defaultComponents }));
62
+ return (jsxRuntime.jsx(reactMarkdown.MarkdownTextPrimitive, { remarkPlugins: remarkPlugins, rehypePlugins: rehypePlugins, className: "aui-md",
63
+ // smooth={false}
64
+ components: defaultComponents }));
63
65
  }
64
66
  const MarkdownText = React.memo(MarkdownTextImpl);
65
67
  const CodeHeader = ({ language, code }) => {
@@ -115,11 +117,11 @@ const defaultComponents = reactMarkdown.unstable_memoizeMarkdownComponents({
115
117
  return videoExtensions.some((ext) => href.toLowerCase().includes(ext));
116
118
  };
117
119
  if (isVideo(props.href)) {
118
- return (jsxRuntime.jsx(Video, { src: props.href, className: className, ...props }));
120
+ return jsxRuntime.jsx(Video, { src: props.href, className: className, ...props });
119
121
  }
120
122
  return (jsxRuntime.jsx("a", { className: utils.cn('aui-md-a font-medium text-primary underline underline-offset-4', className), ...props }));
121
123
  },
122
- video: ({ className, ...props }) => jsxRuntime.jsx(Video, { className: className, ...props }),
124
+ video: ({ className, ...props }) => (jsxRuntime.jsx(Video, { className: className, ...props })),
123
125
  blockquote: ({ className, ...props }) => (jsxRuntime.jsx("blockquote", { className: utils.cn('aui-md-blockquote border-l-2 pl-6 italic', className), ...props })),
124
126
  ul: ({ className, ...props }) => (jsxRuntime.jsx("ul", { className: utils.cn('aui-md-ul my-5 ml-6 list-disc [&>li]:mt-2', className), ...props })),
125
127
  ol: ({ className, ...props }) => (jsxRuntime.jsx("ol", { className: utils.cn('aui-md-ol my-5 ml-6 list-decimal [&>li]:mt-2', className), ...props })),
@@ -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 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
+ {"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];\n\nfunction MarkdownTextImpl() {\n return (\n <MarkdownTextPrimitive\n remarkPlugins={remarkPlugins}\n rehypePlugins={rehypePlugins}\n className=\"aui-md\"\n // smooth={false}\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 <Video src={props.href} className={className} {...props} />;\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 <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,\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 +1 @@
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
+ {"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;AAsDtB,iBAAS,gBAAgB,gBAUxB;AAED,eAAO,MAAM,YAAY,8DAAyB,CAAC"}
@@ -57,7 +57,9 @@ const rehypePlugins = [
57
57
  // rehypeAppendCursor,
58
58
  ];
59
59
  function MarkdownTextImpl() {
60
- return (jsx(MarkdownTextPrimitive, { remarkPlugins: remarkPlugins, rehypePlugins: rehypePlugins, className: "aui-md", components: defaultComponents }));
60
+ return (jsx(MarkdownTextPrimitive, { remarkPlugins: remarkPlugins, rehypePlugins: rehypePlugins, className: "aui-md",
61
+ // smooth={false}
62
+ components: defaultComponents }));
61
63
  }
62
64
  const MarkdownText = memo(MarkdownTextImpl);
63
65
  const CodeHeader = ({ language, code }) => {
@@ -113,11 +115,11 @@ const defaultComponents = unstable_memoizeMarkdownComponents({
113
115
  return videoExtensions.some((ext) => href.toLowerCase().includes(ext));
114
116
  };
115
117
  if (isVideo(props.href)) {
116
- return (jsx(Video, { src: props.href, className: className, ...props }));
118
+ return jsx(Video, { src: props.href, className: className, ...props });
117
119
  }
118
120
  return (jsx("a", { className: cn('aui-md-a font-medium text-primary underline underline-offset-4', className), ...props }));
119
121
  },
120
- video: ({ className, ...props }) => jsx(Video, { className: className, ...props }),
122
+ video: ({ className, ...props }) => (jsx(Video, { className: className, ...props })),
121
123
  blockquote: ({ className, ...props }) => (jsx("blockquote", { className: cn('aui-md-blockquote border-l-2 pl-6 italic', className), ...props })),
122
124
  ul: ({ className, ...props }) => (jsx("ul", { className: cn('aui-md-ul my-5 ml-6 list-disc [&>li]:mt-2', className), ...props })),
123
125
  ol: ({ className, ...props }) => (jsx("ol", { className: cn('aui-md-ol my-5 ml-6 list-decimal [&>li]:mt-2', className), ...props })),
@@ -1 +1 @@
1
- {"version":3,"file":"markdown-text.js","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":["_jsx","_jsxs","memoizeMarkdownComponents"],"mappings":"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"}
1
+ {"version":3,"file":"markdown-text.js","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];\n\nfunction MarkdownTextImpl() {\n return (\n <MarkdownTextPrimitive\n remarkPlugins={remarkPlugins}\n rehypePlugins={rehypePlugins}\n className=\"aui-md\"\n // smooth={false}\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 <Video src={props.href} className={className} {...props} />;\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 <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,\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":["_jsx","_jsxs","memoizeMarkdownComponents"],"mappings":"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"}
@@ -7,7 +7,7 @@ var react$1 = require('@assistant-ui/react');
7
7
  var React = require('react');
8
8
  var react = require('motion/react');
9
9
  var button = require('../ui/button.cjs');
10
- var markdownText = require('./markdown-text.cjs');
10
+ require('./markdown-text.cjs');
11
11
  var utils = require('../../lib/utils.cjs');
12
12
  var tooltipIconButton = require('./tooltip-icon-button.cjs');
13
13
  var attachment = require('./attachment.cjs');
@@ -25,7 +25,6 @@ require('./reasoning.cjs');
25
25
  var messageComponentsWithAvatar = require('./message-components-with-avatar.cjs');
26
26
  var valtio = require('valtio');
27
27
 
28
- const userMessageComponents = { Text: markdownText.MarkdownText };
29
28
  const Thread = ({ welcome: welcome$1, recommends }) => {
30
29
  const { currentThread } = useThread();
31
30
  const ref = ChatkitContext.useChatkitRef();
@@ -51,14 +50,14 @@ const Thread = ({ welcome: welcome$1, recommends }) => {
51
50
  EditComposer,
52
51
  AssistantMessage,
53
52
  }), []);
54
- const { showHeader, renderHeader, threadMaxWidth } = ChatkitContext.useChatkitContext();
53
+ const { showHeader, renderHeader, threadMaxWidth, threadBottom, } = ChatkitContext.useChatkitContext();
55
54
  return (jsxRuntime.jsxs("div", { className: "min-w-full h-full flex flex-col", children: [showHeader
56
55
  && (renderHeader ? (renderHeader({ thread: currentThread })) : (jsxRuntime.jsx(threadHeader, { title: currentThread?.name || 'Thread Title' }))), jsxRuntime.jsx(react.LazyMotion, { features: react.domAnimation, children: jsxRuntime.jsx(react.MotionConfig, { reducedMotion: "user", children: jsxRuntime.jsxs(react$1.ThreadPrimitive.Root, { className: "aui-root aui-thread-root @container flex-1 flex h-[calc(100%-65px)] flex-col bg-background", style: {
57
56
  ['--thread-max-width']: '66rem',
58
- background: '#white',
57
+ background: 'white',
59
58
  }, children: [jsxRuntime.jsx(react$1.ThreadPrimitive.If, { empty: false, children: jsxRuntime.jsxs(react$1.ThreadPrimitive.Viewport, { className: "aui-thread-viewport relative flex flex-1 flex-col overflow-x-auto overflow-y-auto px-4", children: [jsxRuntime.jsx(react$1.ThreadPrimitive.Messages, { components: threadMessageComponents }), jsxRuntime.jsx("div", { className: "aui-thread-viewport-spacer min-h-12 grow z-9" }), jsxRuntime.jsx(Composer, {})] }) }), jsxRuntime.jsx(react$1.ThreadPrimitive.If, { empty: true, children: jsxRuntime.jsxs(react$1.ThreadPrimitive.Viewport, { className: "aui-thread-viewport relative flex flex-1 flex-col overflow-x-auto overflow-y-auto px-4 justify-center items-center", children: [jsxRuntime.jsx("div", { className: " aui-thread-viewport-spacer min-h-12 grow z-9", style: {
60
59
  maxWidth: threadMaxWidth,
61
- backgroundColor: '#white',
60
+ backgroundColor: 'white',
62
61
  } }), currentThread?.loading ? (jsxRuntime.jsxs("div", { className: "flex items-center justify-center gap-1.5 h-[180px]", children: [jsxRuntime.jsx("span", { className: "w-2.5 h-2.5 bg-gray-500 rounded-full", style: {
63
62
  animation: 'bounce 1s ease-in-out infinite',
64
63
  animationDelay: '0ms',
@@ -68,7 +67,7 @@ const Thread = ({ welcome: welcome$1, recommends }) => {
68
67
  } }), jsxRuntime.jsx("span", { className: "w-2.5 h-2.5 bg-gray-500 rounded-full", style: {
69
68
  animation: 'bounce 1s ease-in-out infinite',
70
69
  animationDelay: '300ms',
71
- } })] })) : (jsxRuntime.jsx("div", { style: { maxWidth: threadMaxWidth }, className: "max-w-[var(--thread-max-width)]", children: welcomeElement ?? jsxRuntime.jsx(ThreadWelcome, {}) })), jsxRuntime.jsx("div", { className: "aui-thread-viewport-spacer min-h-12 grow z-9", style: { background: '#white' } }), jsxRuntime.jsx(Composer, {})] }) })] }) }) })] }));
70
+ } })] })) : (jsxRuntime.jsx("div", { style: { maxWidth: threadMaxWidth }, className: "max-w-[var(--thread-max-width)]", children: welcomeElement ?? jsxRuntime.jsx(ThreadWelcome, {}) })), jsxRuntime.jsx("div", { className: "aui-thread-viewport-spacer min-h-12 grow z-9", style: { background: 'white' } }), jsxRuntime.jsx(Composer, {})] }) })] }) }) })] }));
72
71
  };
73
72
  const ThreadScrollToBottom = () => (jsxRuntime.jsx(react$1.ThreadPrimitive.ScrollToBottom, { asChild: true, children: jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "Scroll to bottom", variant: "outline", className: "aui-thread-scroll-to-bottom absolute -top-12 z-10 self-center rounded-full p-4 disabled:invisible dark:bg-background dark:hover:bg-accent", children: jsxRuntime.jsx(lucideReact.ArrowDownIcon, {}) }) }));
74
73
  const ThreadWelcome = () => {
@@ -77,7 +76,7 @@ const ThreadWelcome = () => {
77
76
  return (jsxRuntime.jsx("div", { className: "aui-thread-welcome-root mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col", style: { maxWidth: threadMaxWidth }, children: jsxRuntime.jsx("div", { className: "aui-thread-welcome-center flex w-full flex-col items-center justify-center", children: jsxRuntime.jsx("div", { className: "aui-thread-welcome-message flex size-full flex-col justify-center px-8 text-[24px] text-center font-medium leading-[100%] text-[#0C0D0E]", children: t('thread.greeting') }) }) }));
78
77
  };
79
78
  const Composer = () => {
80
- const { placeholder, composerTop, controller, threadMaxWidth, } = ChatkitContext.useChatkitContext();
79
+ const { placeholder, composerTop, controller, threadMaxWidth, threadBottom, } = ChatkitContext.useChatkitContext();
81
80
  const metaData = valtio.useSnapshot(controller?.metaData);
82
81
  const clawStatus = metaData?.clawStatus;
83
82
  const isDisabled = clawStatus?.status === false;
@@ -90,7 +89,7 @@ const Composer = () => {
90
89
  };
91
90
  // 1. 定义禁用状态和 tooltip 显示状态
92
91
  React.useState(false);
93
- return (jsxRuntime.jsxs("div", { style: { maxWidth: threadMaxWidth, background: '#white' }, className: "aui-composer-wrapper sticky bottom-0 mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col gap-4 overflow-visible bg-background pb-4 md:pb-6", children: [jsxRuntime.jsx(ThreadScrollToBottom, {}), composerTop, jsxRuntime.jsx("div", { className: "flex items-center gap-2", children: jsxRuntime.jsxs(react$1.ComposerPrimitive.Root, { className: utils.cn('aui-composer-root group/input-group relative flex flex-1 flex-col rounded-[24px] border border-[#EAEDF1] bg-background px-[16px] py-[12px] shadow-sm transition-all', isDisabled && 'opacity-50 cursor-not-allowed bg-gray-100'), children: [jsxRuntime.jsx(attachment.ComposerAttachments, {}), jsxRuntime.jsxs("div", { className: "flex items-center w-full gap-2", children: [jsxRuntime.jsx(react$1.ComposerPrimitive.Input, { placeholder: isDisabled ? disabledReason : placeholder, className: "aui-composer-input max-h-[48px] min-h-[24px] flex-1 overflow-y-auto resize-none bg-transparent py-0 text-[14px] leading-[22px] outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed", rows: 1, "aria-label": "Message input", disabled: isDisabled, onKeyDown: handleKeyDown }), jsxRuntime.jsx(ComposerAction, { disabled: isDisabled, disabledReason: disabledReason })] })] }) })] }));
92
+ return (jsxRuntime.jsxs("div", { style: { maxWidth: threadMaxWidth, background: 'white' }, className: "aui-composer-wrapper sticky bottom-0 mx-auto flex w-full max-w-[var(--thread-max-width)] flex-col gap-4 overflow-visible bg-background pb-4 md:pb-6", children: [jsxRuntime.jsx(ThreadScrollToBottom, {}), jsxRuntime.jsx("div", { className: "pt-[8px]", children: composerTop }), jsxRuntime.jsx("div", { className: "flex items-center gap-2", children: jsxRuntime.jsxs(react$1.ComposerPrimitive.Root, { className: utils.cn('aui-composer-root group/input-group relative flex flex-1 flex-col rounded-[24px] border border-[#EAEDF1] bg-background px-[16px] py-[12px] shadow-sm transition-all', isDisabled && 'opacity-50 cursor-not-allowed bg-gray-100'), children: [jsxRuntime.jsx(attachment.ComposerAttachments, {}), jsxRuntime.jsxs("div", { className: "flex items-center w-full gap-2", children: [jsxRuntime.jsx(react$1.ComposerPrimitive.Input, { placeholder: isDisabled ? disabledReason : placeholder, className: "aui-composer-input max-h-[48px] min-h-[24px] flex-1 overflow-y-auto resize-none bg-transparent py-0 text-[14px] leading-[22px] outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed", rows: 1, "aria-label": "Message input", disabled: isDisabled, onKeyDown: handleKeyDown }), jsxRuntime.jsx(ComposerAction, { disabled: isDisabled, disabledReason: disabledReason })] })] }) }), threadBottom] }));
94
93
  };
95
94
  const ComposerAction = ({ disabled, disabledReason, }) => {
96
95
  const { currentThread } = useThread();
@@ -147,7 +146,7 @@ const EditComposer = () => {
147
146
  const BranchPicker = ({ className, ...rest }) => (jsxRuntime.jsxs(react$1.BranchPickerPrimitive.Root, { hideWhenSingleBranch: true, className: utils.cn('aui-branch-picker-root mr-2 -ml-2 inline-flex items-center text-xs text-muted-foreground', className), ...rest, children: [jsxRuntime.jsx(react$1.BranchPickerPrimitive.Previous, { asChild: true, children: jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "Previous", children: jsxRuntime.jsx(lucideReact.ChevronLeftIcon, {}) }) }), jsxRuntime.jsxs("span", { className: "aui-branch-picker-state font-medium", children: [jsxRuntime.jsx(react$1.BranchPickerPrimitive.Number, {}), ' ', "/", jsxRuntime.jsx(react$1.BranchPickerPrimitive.Count, {})] }), jsxRuntime.jsx(react$1.BranchPickerPrimitive.Next, { asChild: true, children: jsxRuntime.jsx(tooltipIconButton.TooltipIconButton, { tooltip: "Next", children: jsxRuntime.jsx(lucideReact.ChevronRightIcon, {}) }) })] }));
148
147
  const UserMessage = () => {
149
148
  const { threadMaxWidth } = ChatkitContext.useChatkitContext();
150
- return (jsxRuntime.jsx(react$1.MessagePrimitive.Root, { asChild: true, children: jsxRuntime.jsxs("div", { style: { maxWidth: threadMaxWidth }, className: "aui-user-message-root mx-auto grid w-full max-w-[var(--thread-max-width)] animate-in auto-rows-auto grid-cols-[minmax(72px,1fr)_auto] gap-y-2 px-2 py-4 duration-150 ease-out fade-in slide-in-from-bottom-1 first:mt-3 last:mb-5 [&:where(>*)]:col-start-2 group", "data-role": "user", children: [jsxRuntime.jsx(attachment.UserMessageAttachments, {}), jsxRuntime.jsx("div", { className: "aui-user-message-content-wrapper relative col-start-2 min-w-0", children: jsxRuntime.jsx("div", { className: "aui-user-message-content bg-muted px-5 py-2.5 break-words text-foreground bg-[#EDEFFC] rounded-[8px]", children: jsxRuntime.jsx(react$1.MessagePrimitive.Parts, { components: userMessageComponents }) }) })] }) }));
149
+ return (jsxRuntime.jsx(react$1.MessagePrimitive.Root, { asChild: true, children: jsxRuntime.jsxs("div", { style: { maxWidth: threadMaxWidth }, className: "aui-user-message-root mx-auto grid w-full max-w-[var(--thread-max-width)] animate-in auto-rows-auto grid-cols-[minmax(72px,1fr)_auto] gap-y-2 px-2 py-4 duration-150 ease-out fade-in slide-in-from-bottom-1 first:mt-3 last:mb-5 [&:where(>*)]:col-start-2 group", "data-role": "user", children: [jsxRuntime.jsx(attachment.UserMessageAttachments, {}), jsxRuntime.jsx("div", { className: "aui-user-message-content-wrapper relative col-start-2 min-w-0", children: jsxRuntime.jsx("div", { className: "aui-user-message-content bg-muted px-5 py-2.5 break-words text-foreground bg-[#EDEFFC] rounded-[8px]", children: jsxRuntime.jsx(react$1.MessagePrimitive.Parts, {}) }) })] }) }));
151
150
  };
152
151
 
153
152
  exports.Thread = Thread;