@touchvue/chat 1.0.0-beta.46 → 1.0.0-beta.47
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/README.md +70 -70
- package/es/package.json.css +1 -1
- package/es/package.json.mjs +1 -1
- package/es/packages/components/resolver.mjs.map +1 -1
- package/es/packages/components/touchchat/component/AiRobot/HelloChat.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/AiRobot/letter.vue.mjs +1 -1
- package/es/packages/components/touchchat/component/AiRobot/letter.vue2.mjs +8 -8
- package/es/packages/components/touchchat/component/AiRobot/letter.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/FileContent.vue2.mjs +3 -3
- package/es/packages/components/touchchat/component/FileContent.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/FileView.vue2.mjs +2 -2
- package/es/packages/components/touchchat/component/FileView.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/HelloChat.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/ImageFile.vue2.mjs +6 -6
- package/es/packages/components/touchchat/component/ImageFile.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/ImageView.vue2.mjs +1 -1
- package/es/packages/components/touchchat/component/ImageView.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/LinkView.vue2.mjs +4 -4
- package/es/packages/components/touchchat/component/LinkView.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/MarkLayer.vue2.mjs +1 -1
- package/es/packages/components/touchchat/component/MarkLayer.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/ModuleSelect.vue2.mjs +2 -2
- package/es/packages/components/touchchat/component/ModuleSelect.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/PDFFile.vue2.mjs +8 -8
- package/es/packages/components/touchchat/component/PDFFile.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/QuoteContent.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/RealtimeVoice.vue2.mjs +1 -1
- package/es/packages/components/touchchat/component/RealtimeVoice.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/AgentsView.vue2.mjs +1 -1
- package/es/packages/components/touchchat/src/AiChat/AgentsView.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/AiMessage.vue2.mjs +26 -26
- package/es/packages/components/touchchat/src/AiChat/AiMessage.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/Chat/scriptMatcher.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/Chat/types.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/Chat/useChat.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/Chat/useCopy.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/Chat/useMessageRender.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/Chat/useSSE.mjs +2 -1
- package/es/packages/components/touchchat/src/AiChat/Chat/useSSE.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/ChatInput.vue2.mjs +5 -5
- package/es/packages/components/touchchat/src/AiChat/ChatInput.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/HistoryList.vue2.mjs +1 -1
- package/es/packages/components/touchchat/src/AiChat/HistoryList.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.mjs +3 -3
- package/es/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/MessageActions.vue2.mjs +11 -11
- package/es/packages/components/touchchat/src/AiChat/MessageActions.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/SiderBarView.vue2.mjs +3 -3
- package/es/packages/components/touchchat/src/AiChat/SiderBarView.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/TouchAgent.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/TouchChat.vue2.mjs +4 -0
- package/es/packages/components/touchchat/src/AiChat/TouchChat.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/TouchHistory.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/UserMessage.vue2.mjs +16 -16
- package/es/packages/components/touchchat/src/AiChat/UserMessage.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/index.vue2.mjs +9 -8
- package/es/packages/components/touchchat/src/index.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/utils/a2aService.mjs.map +1 -1
- package/es/packages/components/touchchat/utils/fetchStream.mjs.map +1 -1
- package/lib/package.json.css +1 -1
- package/lib/package.json.js +1 -1
- package/lib/packages/components/resolver.js.map +1 -1
- package/lib/packages/components/touchchat/component/AiRobot/HelloChat.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/AiRobot/letter.vue.js +1 -1
- package/lib/packages/components/touchchat/component/AiRobot/letter.vue2.js +8 -8
- package/lib/packages/components/touchchat/component/AiRobot/letter.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/FileContent.vue2.js +3 -3
- package/lib/packages/components/touchchat/component/FileContent.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/FileView.vue2.js +2 -2
- package/lib/packages/components/touchchat/component/FileView.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/HelloChat.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/ImageFile.vue2.js +6 -6
- package/lib/packages/components/touchchat/component/ImageFile.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/ImageView.vue2.js +1 -1
- package/lib/packages/components/touchchat/component/ImageView.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/LinkView.vue2.js +4 -4
- package/lib/packages/components/touchchat/component/LinkView.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/MarkLayer.vue2.js +1 -1
- package/lib/packages/components/touchchat/component/MarkLayer.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/ModuleSelect.vue2.js +2 -2
- package/lib/packages/components/touchchat/component/ModuleSelect.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/PDFFile.vue2.js +8 -8
- package/lib/packages/components/touchchat/component/PDFFile.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/QuoteContent.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/RealtimeVoice.vue2.js +1 -1
- package/lib/packages/components/touchchat/component/RealtimeVoice.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/AgentsView.vue2.js +1 -1
- package/lib/packages/components/touchchat/src/AiChat/AgentsView.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/AiMessage.vue2.js +26 -26
- package/lib/packages/components/touchchat/src/AiChat/AiMessage.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/Chat/scriptMatcher.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/Chat/types.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/Chat/useChat.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/Chat/useCopy.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/Chat/useMessageRender.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/Chat/useSSE.js +2 -1
- package/lib/packages/components/touchchat/src/AiChat/Chat/useSSE.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/ChatInput.vue2.js +5 -5
- package/lib/packages/components/touchchat/src/AiChat/ChatInput.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/HistoryList.vue2.js +1 -1
- package/lib/packages/components/touchchat/src/AiChat/HistoryList.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.js +3 -3
- package/lib/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/MessageActions.vue2.js +11 -11
- package/lib/packages/components/touchchat/src/AiChat/MessageActions.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/SiderBarView.vue2.js +3 -3
- package/lib/packages/components/touchchat/src/AiChat/SiderBarView.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/TouchAgent.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/TouchChat.vue2.js +4 -0
- package/lib/packages/components/touchchat/src/AiChat/TouchChat.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/TouchHistory.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/UserMessage.vue2.js +16 -16
- package/lib/packages/components/touchchat/src/AiChat/UserMessage.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/index.vue2.js +9 -8
- package/lib/packages/components/touchchat/src/index.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/utils/a2aService.js.map +1 -1
- package/lib/packages/components/touchchat/utils/fetchStream.js.map +1 -1
- package/package.json +83 -83
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiMessage.vue2.mjs","sources":["../../../../../../../packages/components/touchchat/src/AiChat/AiMessage.vue"],"sourcesContent":["<template>\r\n\t<div class=\"touchchat-ai touchchat-item\" :data-chat-id=\"item.chatId\">\r\n\t\t<!-- 头像区域 -->\r\n\t\t<div class=\"touchchat-ai-avatar\">\r\n\t\t\t<slot name=\"aiAvatar\">\r\n\t\t\t\t<img v-if=\"isShowAvatar\" :src=\"aiAvatarPath\" class=\"touchchat-ai-avatar-pic\" />\r\n\t\t\t</slot>\r\n\t\t</div>\r\n\r\n\t\t<!-- 内容区域 -->\r\n\t\t<div class=\"touchchat-ai-content\" :class=\"{ 'is-full': !item.isChating && item.componentName }\">\r\n\t\t\t<!-- 气泡 -->\r\n\t\t\t<div class=\"touchchat-ai-bubble\">\r\n\t\t\t\t<!-- 思考内容 -->\r\n\t\t\t\t<div v-if=\"thinkContentShow\" class=\"touchchat-ai-think\" v-html=\"processedThinkContent\"></div>\r\n\r\n\t\t\t\t<!-- 推理内容 -->\r\n\t\t\t\t<div v-if=\"reasoningContentShow\" class=\"touchchat-ai-think\">\r\n\t\t\t\t\t<div class=\"touchchat-ai-think-header\">\r\n\t\t\t\t\t\t<div class=\"touchchat-ai-think-state\">\r\n\t\t\t\t\t\t\t{{ item.thinkStatus === 'thinking' ? '深度思考中...' : item.thinkStatus === 'completed' ? '已深度思考' : '思考已停止' }}\r\n\t\t\t\t\t\t\t<template v-if=\"item.thinkStatus === 'completed'\">(用时{{ (item.thinkTime || 0) / 1000 }}秒)</template>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t<div class=\"touchchat-ai-think-toggle\" :class=\"collapse ? '' : 'is-expand'\" @click=\"collapse = !collapse\">\r\n\t\t\t\t\t\t\t<span class=\"touchchat-ai-think-toggle-icon\"></span>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<transition name=\"touchchat-ai-think-collpase\">\r\n\t\t\t\t\t\t<div v-show=\"collapse && !chainAble\" class=\"touchchat-ai-think-content\" v-html=\"processedReasoningContent\"></div>\r\n\t\t\t\t\t</transition>\r\n\t\t\t\t\t<transition name=\"touchchat-ai-think-collpase\">\r\n\t\t\t\t\t\t<thought-chain v-show=\"collapse && chainAble\"></thought-chain>\r\n\t\t\t\t\t</transition>\r\n\t\t\t\t</div>\r\n\r\n\t\t\t\t<!-- 主内容 -->\r\n\t\t\t\t<slot name=\"aimsg\" :item=\"item\" :index=\"index\">\r\n\t\t\t\t\t<div v-if=\"contentShow && scripts && scripts.length === 0 && item.msgList && item.msgList.length\" class=\"touchchat-ai-bubble-text touchchat-markdown\">\r\n\t\t\t\t\t\t<template v-for=\"node in item.msgList\" :key=\"node.id\">\r\n\t\t\t\t\t\t\t<div v-if=\"node.type === 'markdown' && node.content\" v-html=\"getProcessedContent(node)\" />\r\n\t\t\t\t\t\t\t<component :is=\"components[node.componentName]\" v-if=\"node.type === 'component' && node.displayMode === 'inline'\" v-bind=\"item.props\" />\r\n\t\t\t\t\t\t\t<TouchA2ui v-if=\"node.type === 'a2ui'\" :messages=\"node.msgs\" :components=\"a2uiProps.components\" :surface-id=\"node.surfaceId\" />\r\n\t\t\t\t\t\t</template>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div v-if=\"contentShow && scripts && scripts.length === 0 && !(item.msgList && item.msgList.length)\" class=\"touchchat-ai-bubble-text touchchat-markdown\" v-html=\"processedContent\"></div>\r\n\t\t\t\t</slot>\r\n\r\n\t\t\t\t<!-- && !item.componentName -->\r\n\t\t\t\t<letter v-if=\"scripts && scripts.length > 0\" auto-start :data=\"item.content\" @start=\"startLetter\" @complete=\"completeLetter\"> </letter>\r\n\t\t\t\t<slot v-if=\"(scripts.length > 0 && (showComponent || !item.content)) || (!scripts.length && !item.isChating)\" name=\"msg\" :item=\"item\" :index=\"index\">\r\n\t\t\t\t\t<component :is=\"componentName\" :index=\"index\" :item=\"item\" @start=\"startCompentent\" @complete=\"completeCompentent\" @toggle-sidebar=\"toggleSidebarClick\"></component>\r\n\t\t\t\t</slot>\r\n\r\n\t\t\t\t<!-- 新增加载状态区域 -->\r\n\t\t\t\t<div v-if=\"item.isChating\" class=\"touchchat-ai-loading\">\r\n\t\t\t\t\t<div class=\"touchchat-ai-loading-icon\"></div>\r\n\t\t\t\t\t<span class=\"touchchat-ai-loading-text\">加载中...</span>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t\t<slot name=\"fn\" :item=\"item\" :index=\"index\">\r\n\t\t\t\t<MessageActions v-show=\"(showFn && scripts.length > 0) || (!scripts.length && !item.isChating)\" :item=\"item\" message-type=\"ai\" :index=\"index\" :has-retry=\"hasRetry\" :show-copy=\"true\" @copy=\"onCopy\" @retry=\"onRetry\" @like=\"onLike\" @dislike=\"onDislike\" @quote=\"onQuote\">\r\n\t\t\t\t\t<!-- <slot name=\"extendsFn\" :item=\"item\" :index=\"index\"></slot> -->\r\n\t\t\t\t\t<template #extendsFn>\r\n\t\t\t\t\t\t<slot name=\"extendsFn\" :item=\"item\" :index=\"index\" />\r\n\t\t\t\t\t</template>\r\n\t\t\t\t</MessageActions>\r\n\t\t\t</slot>\r\n\t\t\t<!-- && !scripts.length -->\r\n\t\t</div>\r\n\t</div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\n// useSlots, Comment, watch\r\nimport { ref, computed, inject, onMounted, watch } from 'vue'\r\nimport type { ChatMessage, ChatMsgList } from './Chat/types'\r\nimport aiAvatarBase from '../../img/aiAvatar.png'\r\nimport markdown from '../../utils/markdown.ts'\r\nimport FileView from '../../component/FileView.vue'\r\nimport ImageView from '../../component/ImageView.vue'\r\nimport LinkView from '../../component/LinkView.vue'\r\nimport CardView from '../../component/CardView.vue'\r\nimport MessageActions from './MessageActions.vue'\r\nimport Face from '../../component/AiRobot/face.vue'\r\nimport MeterialPrepare from '../../component/AiRobot/meterialPrepare.vue'\r\nimport Letter from '../../component/AiRobot/letter.vue'\r\nimport ThoughtChain from '../../component/ThoughtChain.vue'\r\nimport { TouchA2ui } from '@touchvue/a2ui'\r\n// 为组件映射表定义接口\r\ninterface ComponentMap {\r\n\t[key: string]: any // 允许任何字符串键\r\n\tFileView: typeof FileView\r\n\tImageView: typeof ImageView\r\n\tLinkView: typeof LinkView\r\n\tCardView: typeof CardView\r\n}\r\n\r\n// 创建组件映射表\r\nconst componentMap: ComponentMap = {\r\n\tFileView,\r\n\tImageView,\r\n\tLinkView,\r\n\tCardView,\r\n\tFace,\r\n\tMeterialPrepare\r\n}\r\n\r\nconst props = withDefaults(\r\n\tdefineProps<{\r\n\t\titem: ChatMessage & ChatMsgList\r\n\t\tindex: number\r\n\t\thasRetry: boolean\r\n\t}>(),\r\n\t{\r\n\t\thasRetry: true\r\n\t}\r\n)\r\n\r\nwatch(\r\n\t() => props.item,\r\n\tval => {\r\n\t\tlet arr = []\r\n\t\tif (val.msgList) {\r\n\t\t\tarr = val.msgList?.filter(item => (item.type === 'component' && (item.displayMode === 'drawer' || item.displayMode === 'tip')) || (item.type === 'iframe' && item.url))\r\n\t\t}\r\n\t\tif (arr.length) {\r\n\t\t\temits('openSideBar', arr[0], props.index)\r\n\t\t}\r\n\t},\r\n\t{\r\n\t\tdeep: true\r\n\t}\r\n)\r\n\r\nconst emits = defineEmits<{\r\n\t(e: 'copy', index: number): void\r\n\t(e: 'retry', index: number): void\r\n\t(e: 'like', index: number): void\r\n\t(e: 'dislike', index: number): void\r\n\t(e: 'quote', item: any, index: number): void\r\n\t(e: 'contentRendered', element: HTMLElement): void\r\n\t(e: 'completeRendered', chatId: string): void\r\n\t(e: 'toggle-sidebar', item: any, index: number): void\r\n\t(e: 'openSideBar', item: any, index: number): void\r\n}>()\r\n\r\nconst collapse = ref(true)\r\nconst isShowAvatar = ref(true)\r\nconst aiAvatarPath = ref(aiAvatarBase)\r\nconst components = inject<Record<string, any>>('components', {}) // 指定类型并提供默认值 {}\r\nconst a2uiProps = inject<Record<string, any>>('a2uiProps', {}) // 指定类型并提供默认值 {}\r\nconst avatar = inject<boolean>('avatar', true)\r\nconst scripts = inject<any[]>('scripts', [])\r\nconst layout = inject<string>('layout', 'side, think, upload, chain')\r\nconst chainAble = layout.includes('chain')\r\nconst showComponent = ref(false)\r\nconst showFn = ref(false)\r\n\r\nconst init = () => {\r\n\tisShowAvatar.value = avatar\r\n}\r\n\r\nconst componentName = computed(() => {\r\n\tconst slotMap = components\r\n\r\n\t// 明确newMap的类型,允许字符串索引\r\n\tconst newMap: Record<string, any> = {\r\n\t\t...slotMap,\r\n\t\t...componentMap\r\n\t}\r\n\treturn newMap[props.item.componentName as string] || null\r\n})\r\n\r\nconst thinkContentShow = computed(() => {\r\n\treturn props.item.thinkContent\r\n\t// && !props.item.componentName;\r\n})\r\n\r\nconst reasoningContentShow = computed(() => {\r\n\treturn props.item.reasoningContent\r\n})\r\n\r\nconst processedContent = computed(() => {\r\n\treturn props.item.content ? markdown?.render(props.item.content, { isReasoning: false }) || '' : ''\r\n})\r\n\r\nconst getProcessedContent = (node: any) => {\r\n\treturn node.content ? markdown?.render(node.content, { isReasoning: false }) || '' : ''\r\n}\r\n\r\nconst processedThinkContent = computed(() => {\r\n\treturn props.item.thinkContent ? markdown?.render(props.item.thinkContent, { isReasoning: true }) || '' : ''\r\n})\r\n\r\nconst processedReasoningContent = computed(() => {\r\n\treturn props.item.reasoningContent ? markdown?.render(props.item.reasoningContent, { isReasoning: true }) || '' : ''\r\n})\r\n\r\nconst contentShow = computed(() => {\r\n\treturn props.item.content || props.item.msgList?.length\r\n})\r\n\r\nconst toggleSidebarClick = (item: ChatMessage, index: number) => {\r\n\temits('toggle-sidebar', item, index)\r\n}\r\n\r\nonMounted(() => {\r\n\tinit()\r\n})\r\n\r\nconst completeCompentent = () => {\r\n\temits('completeRendered', props.item?.chatId || '')\r\n\tshowFn.value = true\r\n}\r\nconst completeLetter = () => {\r\n\tshowComponent.value = true\r\n\tif (!props.item.componentName) {\r\n\t\temits('completeRendered', props.item?.chatId || '')\r\n\t\tshowFn.value = true\r\n\t}\r\n}\r\n\r\nconst startCompentent = () => {\r\n\tconsole.log('startCompentent')\r\n}\r\nconst startLetter = () => {\r\n\tshowComponent.value = false\r\n\tshowFn.value = false\r\n}\r\n\r\nconst onCopy = () => emits('copy', props.index)\r\nconst onRetry = () => emits('retry', props.index)\r\nconst onLike = () => emits('like', props.index)\r\nconst onDislike = () => emits('dislike', props.index)\r\nconst onQuote = () => emits('quote', props.item, props.index)\r\n</script>\r\n"],"names":["aiAvatarBase","_createElementBlock","_createCommentVNode","_createElementVNode","_renderSlot","_normalizeClass","_createTextVNode","_toDisplayString","_Fragment","_createVNode","_Transition","_vShow","_unref","_openBlock","_renderList","_createBlock","_resolveDynamicComponent","_mergeProps","TouchA2ui"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AiMessage.vue2.mjs","sources":["../../../../../../../packages/components/touchchat/src/AiChat/AiMessage.vue"],"sourcesContent":["<template>\n\t<div class=\"touchchat-ai touchchat-item\" :data-chat-id=\"item.chatId\">\n\t\t<!-- 头像区域 -->\n\t\t<div class=\"touchchat-ai-avatar\">\n\t\t\t<slot name=\"aiAvatar\">\n\t\t\t\t<img v-if=\"isShowAvatar\" :src=\"aiAvatarPath\" class=\"touchchat-ai-avatar-pic\" />\n\t\t\t</slot>\n\t\t</div>\n\n\t\t<!-- 内容区域 -->\n\t\t<div class=\"touchchat-ai-content\" :class=\"{ 'is-full': !item.isChating && item.componentName }\">\n\t\t\t<!-- 气泡 -->\n\t\t\t<div class=\"touchchat-ai-bubble\">\n\t\t\t\t<!-- 思考内容 -->\n\t\t\t\t<div v-if=\"thinkContentShow\" class=\"touchchat-ai-think\" v-html=\"processedThinkContent\"></div>\n\n\t\t\t\t<!-- 推理内容 -->\n\t\t\t\t<div v-if=\"reasoningContentShow\" class=\"touchchat-ai-think\">\n\t\t\t\t\t<div class=\"touchchat-ai-think-header\">\n\t\t\t\t\t\t<div class=\"touchchat-ai-think-state\">\n\t\t\t\t\t\t\t{{ item.thinkStatus === 'thinking' ? '深度思考中...' : item.thinkStatus === 'completed' ? '已深度思考' : '思考已停止' }}\n\t\t\t\t\t\t\t<template v-if=\"item.thinkStatus === 'completed'\">(用时{{ (item.thinkTime || 0) / 1000 }}秒)</template>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"touchchat-ai-think-toggle\" :class=\"collapse ? '' : 'is-expand'\" @click=\"collapse = !collapse\">\n\t\t\t\t\t\t\t<span class=\"touchchat-ai-think-toggle-icon\"></span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<transition name=\"touchchat-ai-think-collpase\">\n\t\t\t\t\t\t<div v-show=\"collapse && !chainAble\" class=\"touchchat-ai-think-content\" v-html=\"processedReasoningContent\"></div>\n\t\t\t\t\t</transition>\n\t\t\t\t\t<transition name=\"touchchat-ai-think-collpase\">\n\t\t\t\t\t\t<thought-chain v-show=\"collapse && chainAble\"></thought-chain>\n\t\t\t\t\t</transition>\n\t\t\t\t</div>\n\n\t\t\t\t<!-- 主内容 -->\n\t\t\t\t<slot name=\"aimsg\" :item=\"item\" :index=\"index\">\n\t\t\t\t\t<div v-if=\"contentShow && scripts && scripts.length === 0 && item.msgList && item.msgList.length\" class=\"touchchat-ai-bubble-text touchchat-markdown\">\n\t\t\t\t\t\t<template v-for=\"node in item.msgList\" :key=\"node.id\">\n\t\t\t\t\t\t\t<div v-if=\"node.type === 'markdown' && node.content\" v-html=\"getProcessedContent(node)\" />\n\t\t\t\t\t\t\t<component :is=\"components[node.componentName]\" v-if=\"node.type === 'component' && node.displayMode === 'inline'\" v-bind=\"item.props\" />\n\t\t\t\t\t\t\t<TouchA2ui v-if=\"node.type === 'a2ui'\" :messages=\"node.msgs\" :components=\"a2uiProps.components\" :surface-id=\"node.surfaceId\" />\n\t\t\t\t\t\t</template>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div v-if=\"contentShow && scripts && scripts.length === 0 && !(item.msgList && item.msgList.length)\" class=\"touchchat-ai-bubble-text touchchat-markdown\" v-html=\"processedContent\"></div>\n\t\t\t\t</slot>\n\n\t\t\t\t<!-- && !item.componentName -->\n\t\t\t\t<letter v-if=\"scripts && scripts.length > 0\" auto-start :data=\"item.content\" @start=\"startLetter\" @complete=\"completeLetter\"> </letter>\n\t\t\t\t<slot v-if=\"(scripts.length > 0 && (showComponent || !item.content)) || (!scripts.length && !item.isChating)\" name=\"msg\" :item=\"item\" :index=\"index\">\n\t\t\t\t\t<component :is=\"componentName\" :index=\"index\" :item=\"item\" @start=\"startCompentent\" @complete=\"completeCompentent\" @toggle-sidebar=\"toggleSidebarClick\"></component>\n\t\t\t\t</slot>\n\n\t\t\t\t<!-- 新增加载状态区域 -->\n\t\t\t\t<div v-if=\"item.isChating\" class=\"touchchat-ai-loading\">\n\t\t\t\t\t<div class=\"touchchat-ai-loading-icon\"></div>\n\t\t\t\t\t<span class=\"touchchat-ai-loading-text\">加载中...</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<slot name=\"fn\" :item=\"item\" :index=\"index\">\n\t\t\t\t<MessageActions v-show=\"(showFn && scripts.length > 0) || (!scripts.length && !item.isChating)\" :item=\"item\" message-type=\"ai\" :index=\"index\" :has-retry=\"hasRetry\" :show-copy=\"true\" @copy=\"onCopy\" @retry=\"onRetry\" @like=\"onLike\" @dislike=\"onDislike\" @quote=\"onQuote\">\n\t\t\t\t\t<!-- <slot name=\"extendsFn\" :item=\"item\" :index=\"index\"></slot> -->\n\t\t\t\t\t<template #extendsFn>\n\t\t\t\t\t\t<slot name=\"extendsFn\" :item=\"item\" :index=\"index\" />\n\t\t\t\t\t</template>\n\t\t\t\t</MessageActions>\n\t\t\t</slot>\n\t\t\t<!-- && !scripts.length -->\n\t\t</div>\n\t</div>\n</template>\n\n<script lang=\"ts\" setup>\n// useSlots, Comment, watch\nimport { ref, computed, inject, onMounted, watch } from 'vue'\nimport type { ChatMessage, ChatMsgList } from './Chat/types'\nimport aiAvatarBase from '../../img/aiAvatar.png'\nimport markdown from '../../utils/markdown.ts'\nimport FileView from '../../component/FileView.vue'\nimport ImageView from '../../component/ImageView.vue'\nimport LinkView from '../../component/LinkView.vue'\nimport CardView from '../../component/CardView.vue'\nimport MessageActions from './MessageActions.vue'\nimport Face from '../../component/AiRobot/face.vue'\nimport MeterialPrepare from '../../component/AiRobot/meterialPrepare.vue'\nimport Letter from '../../component/AiRobot/letter.vue'\nimport ThoughtChain from '../../component/ThoughtChain.vue'\nimport { TouchA2ui } from '@touchvue/a2ui'\n// 为组件映射表定义接口\ninterface ComponentMap {\n\t[key: string]: any // 允许任何字符串键\n\tFileView: typeof FileView\n\tImageView: typeof ImageView\n\tLinkView: typeof LinkView\n\tCardView: typeof CardView\n}\n\n// 创建组件映射表\nconst componentMap: ComponentMap = {\n\tFileView,\n\tImageView,\n\tLinkView,\n\tCardView,\n\tFace,\n\tMeterialPrepare\n}\n\nconst props = withDefaults(\n\tdefineProps<{\n\t\titem: ChatMessage & ChatMsgList\n\t\tindex: number\n\t\thasRetry: boolean\n\t}>(),\n\t{\n\t\thasRetry: true\n\t}\n)\n\nwatch(\n\t() => props.item,\n\tval => {\n\t\tlet arr = []\n\t\tif (val.msgList) {\n\t\t\tarr = val.msgList?.filter(item => (item.type === 'component' && (item.displayMode === 'drawer' || item.displayMode === 'tip')) || (item.type === 'iframe' && item.url))\n\t\t}\n\t\tif (arr.length) {\n\t\t\temits('openSideBar', arr[0], props.index)\n\t\t}\n\t},\n\t{\n\t\tdeep: true\n\t}\n)\n\nconst emits = defineEmits<{\n\t(e: 'copy', index: number): void\n\t(e: 'retry', index: number): void\n\t(e: 'like', index: number): void\n\t(e: 'dislike', index: number): void\n\t(e: 'quote', item: any, index: number): void\n\t(e: 'contentRendered', element: HTMLElement): void\n\t(e: 'completeRendered', chatId: string): void\n\t(e: 'toggle-sidebar', item: any, index: number): void\n\t(e: 'openSideBar', item: any, index: number): void\n}>()\n\nconst collapse = ref(true)\nconst isShowAvatar = ref(true)\nconst aiAvatarPath = ref(aiAvatarBase)\nconst components = inject<Record<string, any>>('components', {}) // 指定类型并提供默认值 {}\nconst a2uiProps = inject<Record<string, any>>('a2uiProps', {}) // 指定类型并提供默认值 {}\nconst avatar = inject<boolean>('avatar', true)\nconst scripts = inject<any[]>('scripts', [])\nconst layout = inject<string>('layout', 'side, think, upload, chain')\nconst chainAble = layout.includes('chain')\nconst showComponent = ref(false)\nconst showFn = ref(false)\n\nconst init = () => {\n\tisShowAvatar.value = avatar\n}\n\nconst componentName = computed(() => {\n\tconst slotMap = components\n\n\t// 明确newMap的类型,允许字符串索引\n\tconst newMap: Record<string, any> = {\n\t\t...slotMap,\n\t\t...componentMap\n\t}\n\treturn newMap[props.item.componentName as string] || null\n})\n\nconst thinkContentShow = computed(() => {\n\treturn props.item.thinkContent\n\t// && !props.item.componentName;\n})\n\nconst reasoningContentShow = computed(() => {\n\treturn props.item.reasoningContent\n})\n\nconst processedContent = computed(() => {\n\treturn props.item.content ? markdown?.render(props.item.content, { isReasoning: false }) || '' : ''\n})\n\nconst getProcessedContent = (node: any) => {\n\treturn node.content ? markdown?.render(node.content, { isReasoning: false }) || '' : ''\n}\n\nconst processedThinkContent = computed(() => {\n\treturn props.item.thinkContent ? markdown?.render(props.item.thinkContent, { isReasoning: true }) || '' : ''\n})\n\nconst processedReasoningContent = computed(() => {\n\treturn props.item.reasoningContent ? markdown?.render(props.item.reasoningContent, { isReasoning: true }) || '' : ''\n})\n\nconst contentShow = computed(() => {\n\treturn props.item.content || props.item.msgList?.length\n})\n\nconst toggleSidebarClick = (item: ChatMessage, index: number) => {\n\temits('toggle-sidebar', item, index)\n}\n\nonMounted(() => {\n\tinit()\n})\n\nconst completeCompentent = () => {\n\temits('completeRendered', props.item?.chatId || '')\n\tshowFn.value = true\n}\nconst completeLetter = () => {\n\tshowComponent.value = true\n\tif (!props.item.componentName) {\n\t\temits('completeRendered', props.item?.chatId || '')\n\t\tshowFn.value = true\n\t}\n}\n\nconst startCompentent = () => {\n\tconsole.log('startCompentent')\n}\nconst startLetter = () => {\n\tshowComponent.value = false\n\tshowFn.value = false\n}\n\nconst onCopy = () => emits('copy', props.index)\nconst onRetry = () => emits('retry', props.index)\nconst onLike = () => emits('like', props.index)\nconst onDislike = () => emits('dislike', props.index)\nconst onQuote = () => emits('quote', props.item, props.index)\n</script>\n"],"names":["aiAvatarBase","_createElementBlock","item","_createCommentVNode","_createElementVNode","_renderSlot","_normalizeClass","_Fragment","_createTextVNode","_createVNode","_Transition","_vShow","_unref","index","_openBlock","_createBlock","_resolveDynamicComponent","_mergeProps","TouchA2ui","hasRetry"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scriptMatcher.mjs","sources":["../../../../../../../../packages/components/touchchat/src/AiChat/Chat/scriptMatcher.ts"],"sourcesContent":["/**\r\n * 脚本匹配逻辑\r\n */\r\n\r\nimport { ref, type Ref } from 'vue'\r\nimport type { Script, FileItem, ScriptMatchResult } from './types'\r\n\r\nexport interface ScriptMatcherOptions {\r\n\tscripts: Ref<any[]>\r\n\tactiveAgentsName: Ref<string>\r\n\tfileData: Ref<FileItem[]>\r\n\tunmatchText: string\r\n}\r\n\r\nexport function createScriptMatcher({ scripts, activeAgentsName, fileData }: ScriptMatcherOptions) {\r\n\tconst activeScript = ref<Script | null>(null)\r\n\r\n\t// 在脚本中搜索匹配内容\r\n\tconst searchInScript = (script: Script, userInput: string): ScriptMatchResult | null => {\r\n\t\tfor (let i = 0; i < script.content.length; i++) {\r\n\t\t\tconst item = script.content[i]\r\n\t\t\tif (item.user === 'i') {\r\n\t\t\t\t// 检查 data 是否匹配\r\n\t\t\t\tconst isDataMatch = item.data && userInput.includes(item.data)\r\n\t\t\t\t// 检查 alias 是否匹配\r\n\t\t\t\tlet isSubDataMatch = false\r\n\t\t\t\tif (item.alias) {\r\n\t\t\t\t\tif (Array.isArray(item.alias)) {\r\n\t\t\t\t\t\tisSubDataMatch = item.alias.some((subItem: string) => subItem === userInput)\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (isDataMatch || isSubDataMatch) {\r\n\t\t\t\t\t// 收集 AI 回复\r\n\t\t\t\t\tconst responses: any[] = []\r\n\t\t\t\t\t// 从匹配位置的下一个元素开始遍历\r\n\t\t\t\t\tfor (let j = i + 1; j < script.content.length; j++) {\r\n\t\t\t\t\t\tconst nextItem = script.content[j]\r\n\t\t\t\t\t\tif (nextItem.user === 'i') {\r\n\t\t\t\t\t\t\tbreak // 遇到下一个用户消息,停止收集\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (nextItem.user === 'ai') {\r\n\t\t\t\t\t\t\tif (nextItem.data && nextItem.type) {\r\n\t\t\t\t\t\t\t\t// 合并 data 和 type 到一条响应中\r\n\t\t\t\t\t\t\t\tresponses.push({\r\n\t\t\t\t\t\t\t\t\t...nextItem,\r\n\t\t\t\t\t\t\t\t\t// 标记需要先流式输出文字,再调用组件\r\n\t\t\t\t\t\t\t\t\tneedSequenceProcessing: true\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tresponses.push(nextItem)\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// 查找下一个用户消息的索引\r\n\t\t\t\t\tconst nextIndex = script.content.findIndex((contentItem: any, index: number) => index > i && contentItem.user === 'i')\r\n\t\t\t\t\treturn { responses, nextIndex: nextIndex === -1 ? script.content.length : nextIndex }\r\n\t\t\t\t}\r\n\t\t\t} else if (item.user === 'ai') {\r\n\t\t\t\tscripts.value.forEach((script: any) => {\r\n\t\t\t\t\tif (script.content.length) {\r\n\t\t\t\t\t\tconst contents = script.content\r\n\t\t\t\t\t\tcontents.forEach((item: any) => {\r\n\t\t\t\t\t\t\tif (item.agents) {\r\n\t\t\t\t\t\t\t\tif (item.agents === activeAgentsName.value) {\r\n\t\t\t\t\t\t\t\t\tactiveScript.value = script\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn null\r\n\t}\r\n\r\n\t// 查找匹配的脚本内容\r\n\tconst findMatchingScriptContent = (userInput: string): ScriptMatchResult | null => {\r\n\t\tif (!scripts.value || scripts.value.length === 0) return null\r\n\r\n\t\tconst agentName = activeAgentsName.value ? activeAgentsName.value : localStorage.getItem('activeAgentsName') || ''\r\n\t\tif (agentName) {\r\n\t\t\tconst agentMatchedScripts = scripts.value.filter((script: any) => {\r\n\t\t\t\treturn script.content.some((item: any) => item.agents === agentName)\r\n\t\t\t})\r\n\t\t\tif (agentMatchedScripts.length > 0) {\r\n\t\t\t\tconst fileTypeItems = agentMatchedScripts.flatMap((script: any) => script.content.filter((item: any) => item.file))\r\n\t\t\t\tconst fileTypes = fileTypeItems.map((item: any) => item.file)\r\n\t\t\t\tconst isFileTypeMatched = fileData.value.some((file: any) => {\r\n\t\t\t\t\tconst nameArr = file.name.split('.')\r\n\t\t\t\t\tconst name = nameArr[nameArr.length - 1]\r\n\t\t\t\t\tconst isMatched = fileTypes.includes(name)\r\n\t\t\t\t\treturn isMatched\r\n\t\t\t\t})\r\n\t\t\t\t// 存储匹配的脚本内容下标\r\n\t\t\t\tlet matchedScriptContentIndex = -1\r\n\t\t\t\tif (!activeScript.value && isFileTypeMatched) {\r\n\t\t\t\t\tactiveScript.value = agentMatchedScripts[0]\r\n\t\t\t\t}\r\n\t\t\t\t// 智能体匹配成功,检查用户消息中是否有 file 字段\r\n\t\t\t\tif (isFileTypeMatched) {\r\n\t\t\t\t\t// 遍历所有匹配的脚本\r\n\t\t\t\t\tfor (const script of agentMatchedScripts) {\r\n\t\t\t\t\t\tfor (let i = 0; i < script.content.length; i++) {\r\n\t\t\t\t\t\t\tconst item = script.content[i]\r\n\t\t\t\t\t\t\tif (item.file) {\r\n\t\t\t\t\t\t\t\tconst nameArr = fileData.value.map((file: any) => {\r\n\t\t\t\t\t\t\t\t\tconst fileExtArr = file.name.split('.')\r\n\t\t\t\t\t\t\t\t\treturn fileExtArr[fileExtArr.length - 1]\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t\tif (nameArr.includes(item.file)) {\r\n\t\t\t\t\t\t\t\t\tmatchedScriptContentIndex = i\r\n\t\t\t\t\t\t\t\t\tbreak\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (matchedScriptContentIndex !== -1) {\r\n\t\t\t\t\t\t\tbreak\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tconst responses: any[] = []\r\n\t\t\t\t\tconst matchContent = agentMatchedScripts[0].content\r\n\t\t\t\t\tfor (let j = matchedScriptContentIndex + 1; j < matchContent.length; j++) {\r\n\t\t\t\t\t\tconst nextItem = matchContent[j]\r\n\t\t\t\t\t\tif (nextItem.user === 'i') {\r\n\t\t\t\t\t\t\tbreak // 遇到下一个用户消息,停止收集\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (nextItem.user === 'ai') {\r\n\t\t\t\t\t\t\tif (nextItem.data && nextItem.type) {\r\n\t\t\t\t\t\t\t\t// 合并 data 和 type 到一条响应中\r\n\t\t\t\t\t\t\t\tresponses.push({\r\n\t\t\t\t\t\t\t\t\t...nextItem,\r\n\t\t\t\t\t\t\t\t\t// 标记需要先流式输出文字,再调用组件\r\n\t\t\t\t\t\t\t\t\tneedSequenceProcessing: true\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tresponses.push(nextItem)\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tconst nextIndex = matchContent.findIndex((contentItem: any, index: number) => index > matchedScriptContentIndex && contentItem.user === 'i')\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tresponses,\r\n\t\t\t\t\t\tnextIndex: nextIndex === -1 ? matchContent.length : nextIndex\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t// agentName 有值但不存在带 agents 的剧本时,不拦截,继续下方通用剧本匹配\r\n\t\t}\r\n\r\n\t\t// 先尝试从当前激活的脚本中查找\r\n\t\tif (activeScript.value) {\r\n\t\t\tconst result = searchInScript(activeScript.value, userInput)\r\n\t\t\tif (result) {\r\n\t\t\t\treturn result\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// 若当前激活脚本未匹配,遍历所有脚本查找\r\n\t\tfor (const script of scripts.value) {\r\n\t\t\tconst result = searchInScript(script, userInput)\r\n\t\t\tif (result) {\r\n\t\t\t\tactiveScript.value = script\r\n\t\t\t\treturn result\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn null\r\n\t}\r\n\r\n\treturn {\r\n\t\tactiveScript,\r\n\t\tfindMatchingScriptContent,\r\n\t\tsearchInScript\r\n\t}\r\n}\r\n"],"names":["script","item"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"scriptMatcher.mjs","sources":["../../../../../../../../packages/components/touchchat/src/AiChat/Chat/scriptMatcher.ts"],"sourcesContent":["/**\n * 脚本匹配逻辑\n */\n\nimport { ref, type Ref } from 'vue'\nimport type { Script, FileItem, ScriptMatchResult } from './types'\n\nexport interface ScriptMatcherOptions {\n\tscripts: Ref<any[]>\n\tactiveAgentsName: Ref<string>\n\tfileData: Ref<FileItem[]>\n\tunmatchText: string\n}\n\nexport function createScriptMatcher({ scripts, activeAgentsName, fileData }: ScriptMatcherOptions) {\n\tconst activeScript = ref<Script | null>(null)\n\n\t// 在脚本中搜索匹配内容\n\tconst searchInScript = (script: Script, userInput: string): ScriptMatchResult | null => {\n\t\tfor (let i = 0; i < script.content.length; i++) {\n\t\t\tconst item = script.content[i]\n\t\t\tif (item.user === 'i') {\n\t\t\t\t// 检查 data 是否匹配\n\t\t\t\tconst isDataMatch = item.data && userInput.includes(item.data)\n\t\t\t\t// 检查 alias 是否匹配\n\t\t\t\tlet isSubDataMatch = false\n\t\t\t\tif (item.alias) {\n\t\t\t\t\tif (Array.isArray(item.alias)) {\n\t\t\t\t\t\tisSubDataMatch = item.alias.some((subItem: string) => subItem === userInput)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (isDataMatch || isSubDataMatch) {\n\t\t\t\t\t// 收集 AI 回复\n\t\t\t\t\tconst responses: any[] = []\n\t\t\t\t\t// 从匹配位置的下一个元素开始遍历\n\t\t\t\t\tfor (let j = i + 1; j < script.content.length; j++) {\n\t\t\t\t\t\tconst nextItem = script.content[j]\n\t\t\t\t\t\tif (nextItem.user === 'i') {\n\t\t\t\t\t\t\tbreak // 遇到下一个用户消息,停止收集\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (nextItem.user === 'ai') {\n\t\t\t\t\t\t\tif (nextItem.data && nextItem.type) {\n\t\t\t\t\t\t\t\t// 合并 data 和 type 到一条响应中\n\t\t\t\t\t\t\t\tresponses.push({\n\t\t\t\t\t\t\t\t\t...nextItem,\n\t\t\t\t\t\t\t\t\t// 标记需要先流式输出文字,再调用组件\n\t\t\t\t\t\t\t\t\tneedSequenceProcessing: true\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tresponses.push(nextItem)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// 查找下一个用户消息的索引\n\t\t\t\t\tconst nextIndex = script.content.findIndex((contentItem: any, index: number) => index > i && contentItem.user === 'i')\n\t\t\t\t\treturn { responses, nextIndex: nextIndex === -1 ? script.content.length : nextIndex }\n\t\t\t\t}\n\t\t\t} else if (item.user === 'ai') {\n\t\t\t\tscripts.value.forEach((script: any) => {\n\t\t\t\t\tif (script.content.length) {\n\t\t\t\t\t\tconst contents = script.content\n\t\t\t\t\t\tcontents.forEach((item: any) => {\n\t\t\t\t\t\t\tif (item.agents) {\n\t\t\t\t\t\t\t\tif (item.agents === activeAgentsName.value) {\n\t\t\t\t\t\t\t\t\tactiveScript.value = script\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\treturn null\n\t}\n\n\t// 查找匹配的脚本内容\n\tconst findMatchingScriptContent = (userInput: string): ScriptMatchResult | null => {\n\t\tif (!scripts.value || scripts.value.length === 0) return null\n\n\t\tconst agentName = activeAgentsName.value ? activeAgentsName.value : localStorage.getItem('activeAgentsName') || ''\n\t\tif (agentName) {\n\t\t\tconst agentMatchedScripts = scripts.value.filter((script: any) => {\n\t\t\t\treturn script.content.some((item: any) => item.agents === agentName)\n\t\t\t})\n\t\t\tif (agentMatchedScripts.length > 0) {\n\t\t\t\tconst fileTypeItems = agentMatchedScripts.flatMap((script: any) => script.content.filter((item: any) => item.file))\n\t\t\t\tconst fileTypes = fileTypeItems.map((item: any) => item.file)\n\t\t\t\tconst isFileTypeMatched = fileData.value.some((file: any) => {\n\t\t\t\t\tconst nameArr = file.name.split('.')\n\t\t\t\t\tconst name = nameArr[nameArr.length - 1]\n\t\t\t\t\tconst isMatched = fileTypes.includes(name)\n\t\t\t\t\treturn isMatched\n\t\t\t\t})\n\t\t\t\t// 存储匹配的脚本内容下标\n\t\t\t\tlet matchedScriptContentIndex = -1\n\t\t\t\tif (!activeScript.value && isFileTypeMatched) {\n\t\t\t\t\tactiveScript.value = agentMatchedScripts[0]\n\t\t\t\t}\n\t\t\t\t// 智能体匹配成功,检查用户消息中是否有 file 字段\n\t\t\t\tif (isFileTypeMatched) {\n\t\t\t\t\t// 遍历所有匹配的脚本\n\t\t\t\t\tfor (const script of agentMatchedScripts) {\n\t\t\t\t\t\tfor (let i = 0; i < script.content.length; i++) {\n\t\t\t\t\t\t\tconst item = script.content[i]\n\t\t\t\t\t\t\tif (item.file) {\n\t\t\t\t\t\t\t\tconst nameArr = fileData.value.map((file: any) => {\n\t\t\t\t\t\t\t\t\tconst fileExtArr = file.name.split('.')\n\t\t\t\t\t\t\t\t\treturn fileExtArr[fileExtArr.length - 1]\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\tif (nameArr.includes(item.file)) {\n\t\t\t\t\t\t\t\t\tmatchedScriptContentIndex = i\n\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (matchedScriptContentIndex !== -1) {\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconst responses: any[] = []\n\t\t\t\t\tconst matchContent = agentMatchedScripts[0].content\n\t\t\t\t\tfor (let j = matchedScriptContentIndex + 1; j < matchContent.length; j++) {\n\t\t\t\t\t\tconst nextItem = matchContent[j]\n\t\t\t\t\t\tif (nextItem.user === 'i') {\n\t\t\t\t\t\t\tbreak // 遇到下一个用户消息,停止收集\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (nextItem.user === 'ai') {\n\t\t\t\t\t\t\tif (nextItem.data && nextItem.type) {\n\t\t\t\t\t\t\t\t// 合并 data 和 type 到一条响应中\n\t\t\t\t\t\t\t\tresponses.push({\n\t\t\t\t\t\t\t\t\t...nextItem,\n\t\t\t\t\t\t\t\t\t// 标记需要先流式输出文字,再调用组件\n\t\t\t\t\t\t\t\t\tneedSequenceProcessing: true\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tresponses.push(nextItem)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconst nextIndex = matchContent.findIndex((contentItem: any, index: number) => index > matchedScriptContentIndex && contentItem.user === 'i')\n\t\t\t\t\treturn {\n\t\t\t\t\t\tresponses,\n\t\t\t\t\t\tnextIndex: nextIndex === -1 ? matchContent.length : nextIndex\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// agentName 有值但不存在带 agents 的剧本时,不拦截,继续下方通用剧本匹配\n\t\t}\n\n\t\t// 先尝试从当前激活的脚本中查找\n\t\tif (activeScript.value) {\n\t\t\tconst result = searchInScript(activeScript.value, userInput)\n\t\t\tif (result) {\n\t\t\t\treturn result\n\t\t\t}\n\t\t}\n\n\t\t// 若当前激活脚本未匹配,遍历所有脚本查找\n\t\tfor (const script of scripts.value) {\n\t\t\tconst result = searchInScript(script, userInput)\n\t\t\tif (result) {\n\t\t\t\tactiveScript.value = script\n\t\t\t\treturn result\n\t\t\t}\n\t\t}\n\n\t\treturn null\n\t}\n\n\treturn {\n\t\tactiveScript,\n\t\tfindMatchingScriptContent,\n\t\tsearchInScript\n\t}\n}\n"],"names":["script","item"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.mjs","sources":["../../../../../../../../packages/components/touchchat/src/AiChat/Chat/types.ts"],"sourcesContent":["/**\
|
|
1
|
+
{"version":3,"file":"types.mjs","sources":["../../../../../../../../packages/components/touchchat/src/AiChat/Chat/types.ts"],"sourcesContent":["/**\n * TouchChat 类型定义\n */\n\nexport enum ThinkStatus {\n\tTHINKING = 'thinking',\n\tCOMPLETED = 'completed',\n\tSTOPPED = 'stopped'\n}\n\nexport interface ChatMessage {\n\tchatId?: string\n\tuser: 'u' | 'ai' | string\n\ttype: string\n\tcontent: string\n\tisChating?: boolean\n\tthinkContent?: string\n\treasoningContent?: string\n\tisLiked?: boolean\n\tisDisliked?: boolean\n\tisEditing?: boolean\n\teditContent?: string\n\tthinkStatus?: ThinkStatus\n\tthinkStartTime?: number\n\tthinkTime?: number\n\tthinkEndTime?: number\n\tisShowLike?: boolean\n\tisShowCopy?: boolean\n\tisWithDraw?: boolean\n\tcomponentName?: string\n\ttypeFlag?: string\n\tfiles?: FileItem[]\n\thtml?: string\n\tisError?: boolean\n\tauto?: boolean\n\tneedSequenceProcessing?: boolean\n\tneedSequenceType?: string\n\tstop?: boolean\n\tmsgList: any[]\n}\n\nexport interface ChatMsgList {\n\t[key: string]: any\n}\n\nexport interface AgentsItem {\n\tname: string\n\tintro: string\n\t[key: string]: any\n}\n\nexport interface ScriptContentItem {\n\tuser: 'i' | 'ai'\n\tdata?: string\n\ttype?: string\n\tagents?: string\n\tfile?: string\n\talias?: string | string[]\n\t[key: string]: any\n}\n\nexport interface Script {\n\tcontent: ScriptContentItem[]\n\t[key: string]: any\n}\n\nexport interface ModuleConfig {\n\taction?: () => string\n\theaders?: () => Record<string, string>\n\tbody?: () => Record<string, any>\n\trespoKey?: () => RespoKeyConfig\n\tname?: string\n}\n\nexport interface RespoKeyConfig {\n\tcontent: string\n\tcategory: string\n\tcontentCategory?: string\n\tall?: string\n\tallCategory?: string\n}\n\nexport interface ModuleItem {\n\tname?: string\n\tconfig?: ModuleConfig\n\t[key: string]: any\n}\n\nexport interface FileItem {\n\tid?: string\n\tfile?: File\n\tname: string\n\tfileType: string\n\tfileSize: string\n\tlastModified: number\n\tpreview?: string\n\tbase64?: string\n\t// 文件上传相关字段\n\tisUploading?: boolean\n\tuploadProgress?: number\n\tuploadSuccess?: boolean\n\tuploadError?: boolean\n\t[key: string]: any\n}\n\nexport interface RenderData {\n\tmainContent: string\n\tthinkContent: string\n\treasoningContent: string\n}\n\nexport enum MessageAction {\n\tCOPY = 'copy',\n\tEDIT = 'edit',\n\tDELETE = 'delete',\n\tRETRY = 'retry',\n\tLIKE = 'like',\n\tDISLIKE = 'dislike',\n\tWITHDRAW = 'withDraw'\n}\n\nexport interface ResultItem {\n\tallAiContent?: string\n\t[key: string]: any\n}\n\nexport interface MessageProcessor {\n\tmessageQueue: ChatMessage[]\n\tisProcessing: boolean\n\tcurrentMessage: ChatMessage | null\n\tprocessNextMessage: () => void\n\thandleMessageComplete: (chatId: string) => void\n}\n\nexport interface ScriptMatchResult {\n\tresponses: any[]\n\tnextIndex: number\n}\n\nexport interface MessageActions {\n\tuser: string[]\n\tai: string[]\n}\n"],"names":["ThinkStatus","MessageAction"],"mappings":"AAIY,IAAA,WAAA,qBAAAA,YAAL,KAAA;AACN,EAAAA,aAAA,UAAW,CAAA,GAAA,UAAA,CAAA;AACX,EAAAA,aAAA,WAAY,CAAA,GAAA,WAAA,CAAA;AACZ,EAAAA,aAAA,SAAU,CAAA,GAAA,SAAA,CAAA;AAHC,EAAAA,OAAAA,YAAAA,CAAAA;AAAA,CAAA,EAAA,WAAA,IAAA,EAAA,EAAA;AA2GA,IAAA,aAAA,qBAAAC,cAAL,KAAA;AACN,EAAAA,eAAA,MAAO,CAAA,GAAA,MAAA,CAAA;AACP,EAAAA,eAAA,MAAO,CAAA,GAAA,MAAA,CAAA;AACP,EAAAA,eAAA,QAAS,CAAA,GAAA,QAAA,CAAA;AACT,EAAAA,eAAA,OAAQ,CAAA,GAAA,OAAA,CAAA;AACR,EAAAA,eAAA,MAAO,CAAA,GAAA,MAAA,CAAA;AACP,EAAAA,eAAA,SAAU,CAAA,GAAA,SAAA,CAAA;AACV,EAAAA,eAAA,UAAW,CAAA,GAAA,UAAA,CAAA;AAPA,EAAAA,OAAAA,cAAAA,CAAAA;AAAA,CAAA,EAAA,aAAA,IAAA,EAAA;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useChat.mjs","sources":["../../../../../../../../packages/components/touchchat/src/AiChat/Chat/useChat.ts"],"sourcesContent":["/**\r\n * 主聊天逻辑 Composable\r\n */\r\n\r\nimport { ref, watch, type Ref, nextTick } from 'vue'\r\nimport { MessageAction, ThinkStatus, type ChatMessage, type ModuleItem, type FileItem, type MessageProcessor, ChatMsgList } from './types'\r\nimport { createScriptMatcher } from './scriptMatcher'\r\nimport { useSSE } from './useSSE'\r\nimport { useScroll } from './useScroll'\r\nimport { useMessageRender } from './useMessageRender'\r\nimport { useCopy } from './useCopy'\r\n\r\nexport interface UseChatOptions {\r\n\tprops: { value: ChatMessage[] }\r\n\temit: (event: string, ...args: any[]) => void\r\n\tscripts: any[]\r\n\tunmatchText: string\r\n\tmodules: (string | ModuleItem)[]\r\n\tafterSend: (result: object) => void\r\n\tsendMessageInject: (value: string, fileList?: any[]) => void\r\n\tbeforeSend: () => { result: boolean; componentName?: string } | Promise<{ result: boolean; componentName?: string }>\r\n\tbottom: () => void\r\n\tstop: (item: ChatMessage, index: number) => void\r\n\tchatContainer: Ref<HTMLElement | null>\r\n\tchatInputRef?: Ref<any | null>\r\n}\r\n\r\nexport function useChat({ props, emit, scripts, unmatchText, modules, afterSend, sendMessageInject, beforeSend, bottom, stop, chatContainer, chatInputRef }: UseChatOptions) {\r\n\t// 组件状态\r\n\tconst isMounted = ref(false)\r\n\tconst isChating = ref(false)\r\n\tconst inputValue = ref('')\r\n\tconst enableDeepThinking = ref(false)\r\n\tconst chatList = ref<ChatMessage[]>([])\r\n\tconst currIndex = ref(0)\r\n\tconst isUnmounting = ref(false)\r\n\tconst currentComponentName = ref('')\r\n\tconst fileData = ref<FileItem[]>([])\r\n\tconst activeAgentsName = ref<string>('')\r\n\tconst moduleInfo = ref<ModuleItem>((modules[0] as ModuleItem) || { name: 'deepseek-v3' })\r\n\tconst isDragging = ref(false)\r\n\tconst typeFlag = ref('')\r\n\r\n\t// 消息处理器状态\r\n\tconst currentMessageProcessor = ref<MessageProcessor | null>(null)\r\n\r\n\t// 消息渲染 composable\r\n\tconst { htmlContentRef, thinkingContentRef, reasoningContentRef, markdownToHtml, renderContent, enqueueRender } = useMessageRender({\r\n\t\tchatList,\r\n\t\tcurrIndex,\r\n\t\tisMounted,\r\n\t\tisUnmounting\r\n\t})\r\n\r\n\t// 滚动 composable\r\n\tconst { scrollToBottom, handleScroll } = useScroll({\r\n\t\tchatContainer,\r\n\t\tisMounted,\r\n\t\tisUnmounting,\r\n\t\tbottom\r\n\t})\r\n\r\n\t// 复制功能 composable\r\n\tconst { copyToClipboard } = useCopy()\r\n\r\n\t// 脚本匹配 - 需要将数组包装为 ref\r\n\tconst scriptsRef = ref(scripts)\r\n\tconst { activeScript, findMatchingScriptContent } = createScriptMatcher({\r\n\t\tscripts: scriptsRef,\r\n\t\tactiveAgentsName,\r\n\t\tfileData,\r\n\t\tunmatchText\r\n\t})\r\n\r\n\t// SSE\r\n\tconst { fetchStream, resultItem, openSSE, cleanupSSE } = useSSE({\r\n\t\tchatList,\r\n\t\tcurrIndex,\r\n\t\tisChating,\r\n\t\tisMounted,\r\n\t\tisUnmounting,\r\n\t\tinputValue,\r\n\t\tenableDeepThinking,\r\n\t\tcurrentComponentName,\r\n\t\ttypeFlag,\r\n\t\tmoduleInfo,\r\n\t\temit,\r\n\t\tafterSend,\r\n\t\tenqueueRender,\r\n\t\trenderContent,\r\n\t\tmarkdownToHtml,\r\n\t\tscrollToBottom,\r\n\t\tstop\r\n\t})\r\n\r\n\t// 监听 activeAgentsName\r\n\twatch(\r\n\t\t() => activeAgentsName,\r\n\t\t(val: any) => {\r\n\t\t\tif (!val) {\r\n\t\t\t\tactiveAgentsName.value = localStorage.getItem('activeAgentsName') as string\r\n\t\t\t}\r\n\t\t},\r\n\t\t{ immediate: true }\r\n\t)\r\n\r\n\t// 消息管理工具函数\r\n\tconst messageUtils = {\r\n\t\tupdateMessage: (index: number, updates: Partial<ChatMessage>): void => {\r\n\t\t\tif (index < 0 || index >= chatList.value.length) return\r\n\t\t\tchatList.value.splice(index, 1, { ...chatList.value[index], ...updates })\r\n\t\t\tnextTick(() => {\r\n\t\t\t\tconst message = chatList.value[index]\r\n\t\t\t\tif (message) {\r\n\t\t\t\t\trenderContent(message.content, 'main', index)\r\n\t\t\t\t\tif (message.thinkContent) {\r\n\t\t\t\t\t\trenderContent(message.thinkContent, 'thinking', index)\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (message.reasoningContent) {\r\n\t\t\t\t\t\trenderContent(message.reasoningContent, 'reasoning', index)\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t},\r\n\r\n\t\tdeleteMessageChain: (index: number): void => {\r\n\t\t\tif (index < 0 || index >= chatList.value.length) return\r\n\t\t\tif (chatList.value[index].user === 'u') {\r\n\t\t\t\tlet deleteCount = 1\r\n\t\t\t\tfor (let i = index + 1; i < chatList.value.length; i++) {\r\n\t\t\t\t\tif (chatList.value[i].user === 'ai') {\r\n\t\t\t\t\t\tdeleteCount++\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tbreak\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tchatList.value.splice(index, deleteCount)\r\n\t\t\t} else {\r\n\t\t\t\tchatList.value.splice(index, 1)\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tcreateStandardMessage: (data: Partial<ChatMessage>): ChatMessage => ({\r\n\t\t\tchatId: data.chatId || 'ai_' + Math.random().toString(36).slice(2).padEnd(10, '0').slice(0, 10),\r\n\t\t\tuser: data.user || 'ai',\r\n\t\t\ttype: data.type || 'text',\r\n\t\t\tcontent: data.content || '',\r\n\t\t\tisChating: data.isChating ?? false,\r\n\t\t\tthinkContent: data.thinkContent || '',\r\n\t\t\treasoningContent: data.reasoningContent || '',\r\n\t\t\tisLiked: data.isLiked ?? false,\r\n\t\t\tisDisliked: data.isDisliked ?? false,\r\n\t\t\tisEditing: data.isEditing ?? false,\r\n\t\t\teditContent: data.editContent ?? '',\r\n\t\t\tmsgList: []\r\n\t\t})\r\n\t}\r\n\r\n\t// 更新消息\r\n\tconst update = (index: number, message: object) => {\r\n\t\tchatList.value[index] = { ...chatList.value[index], ...message }\r\n\t\t// console.log('update', chatList.value[index])\r\n\t}\r\n\r\n\t// 更新模块信息\r\n\tconst updateModule = (info: ModuleItem) => {\r\n\t\tmoduleInfo.value = info\r\n\t}\r\n\r\n\t// 处理智能体选择\r\n\tconst handleAgentSelect = (item: any) => {\r\n\t\tlocalStorage.setItem('activeAgentsName', item.name)\r\n\t\tconst aiMessage = item.intro\r\n\t\tmessageUtils.updateMessage(0, {\r\n\t\t\tcontent: '',\r\n\t\t\tisChating: false\r\n\t\t})\r\n\t\tsimulateStreamOutput(0, aiMessage)\r\n\t}\r\n\r\n\t// 渲染完成回调\r\n\tconst completeRendered = (chatId: string) => {\r\n\t\t// console.log('completeRendered', '渲染完成', chatId)\r\n\t\tif (currentMessageProcessor.value) {\r\n\t\t\tcurrentMessageProcessor.value.handleMessageComplete(chatId)\r\n\t\t}\r\n\t}\r\n\r\n\t// 初始化函数\r\n\tconst init = (): void => {\r\n\t\ttry {\r\n\t\t\tif (Array.isArray(props.value) && props.value.length && !scripts.length) {\r\n\t\t\t\tchatList.value = props.value.map((item: any) => ({\r\n\t\t\t\t\t...item,\r\n\t\t\t\t\tcontent: item.thinkContent ? item.content || '' : item.content || '',\r\n\t\t\t\t\tthinkContent: item.thinkContent || ''\r\n\t\t\t\t}))\r\n\r\n\t\t\t\tnextTick(() => {\r\n\t\t\t\t\trequestAnimationFrame(() => {\r\n\t\t\t\t\t\tif (activeAgentsName.value && chatList.value.length > 0 && chatList.value[0].user === 'ai') {\r\n\t\t\t\t\t\t\tconst aiMessage = chatList.value[0]\r\n\t\t\t\t\t\t\tmessageUtils.updateMessage(0, {\r\n\t\t\t\t\t\t\t\tcontent: '',\r\n\t\t\t\t\t\t\t\tisChating: true\r\n\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\tsimulateStreamOutput(0, aiMessage.content)\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tchatList.value.forEach((item: any) => {\r\n\t\t\t\t\t\t\t\tif (item.thinkContent) {\r\n\t\t\t\t\t\t\t\t\trenderContent(item.thinkContent, 'thinking')\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tif (item.reasoningContent) {\r\n\t\t\t\t\t\t\t\t\trenderContent(item.reasoningContent, 'reasoning')\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tif (item.content) {\r\n\t\t\t\t\t\t\t\t\trenderContent(item.content, 'main')\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\tnextTick(() => {\r\n\t\t\t\t\t\t\t\tscrollToBottom()\r\n\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t})\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t} catch (error) {\r\n\t\t\t// console.error('初始化失败:', error)\r\n\t\t}\r\n\t}\r\n\r\n\t// 模拟流式输出\r\n\tconst simulateStreamOutput = (aiIndex: number, msg: string | ChatMessage, callback?: () => void) => {\r\n\t\tconst message: string = typeof msg === 'string' ? msg : msg.content\r\n\t\tconst componentName = typeof msg === 'string' ? '' : msg.needSequenceProcessing ? msg.needSequenceType : ''\r\n\t\tconst isNeedSequenceProcessing = typeof msg === 'string' ? false : msg.needSequenceProcessing\r\n\r\n\t\tconst fn = () => {\r\n\t\t\tclearInterval(interval)\r\n\t\t\temit('sendMessage', [...chatList.value])\r\n\t\t\tif (componentName) {\r\n\t\t\t\tchatList.value[aiIndex].componentName = componentName\r\n\t\t\t}\r\n\t\t\tmessageUtils.updateMessage(aiIndex, {\r\n\t\t\t\tisChating: false\r\n\t\t\t})\r\n\t\t\tnextTick(() => {\r\n\t\t\t\trenderContent(message, 'main', aiIndex)\r\n\t\t\t\tnextTick(() => {\r\n\t\t\t\t\tscrollToBottom()\r\n\t\t\t\t\tif (!isNeedSequenceProcessing && callback) {\r\n\t\t\t\t\t\tcallback()\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t})\r\n\t\t}\r\n\r\n\t\tlet index = 0\r\n\t\tconst interval = setInterval(() => {\r\n\t\t\tif (index < message.length) {\r\n\t\t\t\tconst newContent = message\r\n\t\t\t\tmessageUtils.updateMessage(aiIndex, {\r\n\t\t\t\t\tcontent: newContent\r\n\t\t\t\t})\r\n\t\t\t\tnextTick(() => {\r\n\t\t\t\t\trenderContent(newContent, 'main', aiIndex)\r\n\t\t\t\t\tnextTick(() => {\r\n\t\t\t\t\t\tscrollToBottom()\r\n\t\t\t\t\t})\r\n\t\t\t\t})\r\n\t\t\t\tindex++\r\n\t\t\t} else {\r\n\t\t\t\tfn()\r\n\t\t\t}\r\n\t\t}, 50)\r\n\t}\r\n\r\n\t// 监听props.value变化\r\n\twatch(\r\n\t\t() => props.value,\r\n\t\t(newVal: any, oldVal: any) => {\r\n\t\t\tif (!Array.isArray(newVal)) return\r\n\t\t\tif (newVal.length && JSON.stringify(newVal) !== JSON.stringify(oldVal)) {\r\n\t\t\t\tchatList.value = newVal.map(item => ({\r\n\t\t\t\t\t...item,\r\n\t\t\t\t\tcontent: item.thinkContent ? item.content || '' : item.content || '',\r\n\t\t\t\t\tthinkContent: item.thinkContent || ''\r\n\t\t\t\t}))\r\n\r\n\t\t\t\tnextTick(() => {\r\n\t\t\t\t\trequestAnimationFrame(() => {\r\n\t\t\t\t\t\tchatList.value.forEach((item: any) => {\r\n\t\t\t\t\t\t\tif (item.thinkContent) {\r\n\t\t\t\t\t\t\t\trenderContent(item.thinkContent, 'thinking')\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (item.reasoningContent) {\r\n\t\t\t\t\t\t\t\trenderContent(item.reasoningContent, 'reasoning')\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (item.content) {\r\n\t\t\t\t\t\t\t\trenderContent(item.content, 'main')\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t\tnextTick(() => {\r\n\t\t\t\t\t\t\tscrollToBottom()\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t})\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t},\r\n\t\t{ deep: true, immediate: true }\r\n\t)\r\n\r\n\t// 发送消息\r\n\tconst sendMessage = (content?: string, fileList?: any[], auto?: boolean, type?: string): void => {\r\n\t\tinputValue.value = content || ''\r\n\t\thandleBeforeSend(content, fileList, auto, type)\r\n\t}\r\n\r\n\t// 发送前处理\r\n\tconst handleBeforeSend = (content?: string, fileList?: any[], auto?: boolean, type?: string): void => {\r\n\t\tfileData.value = fileList || []\r\n\t\tif (beforeSend) {\r\n\t\t\tconst fn = beforeSend() as any\r\n\t\t\tif (fn && typeof fn.then === 'function') {\r\n\t\t\t\t;(Promise.resolve(fn) as Promise<{ result: boolean; componentName?: string }>)\r\n\t\t\t\t\t.then(res => {\r\n\t\t\t\t\t\tif (res.result) {\r\n\t\t\t\t\t\t\tcurrentComponentName.value = res.componentName || ''\r\n\t\t\t\t\t\t\thandleSend(content, fileList, auto, type)\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.catch(error => {\r\n\t\t\t\t\t\tconsole.log(error)\r\n\t\t\t\t\t})\r\n\t\t\t} else {\r\n\t\t\t\tif (fn.result) {\r\n\t\t\t\t\tcurrentComponentName.value = fn.componentName || ''\r\n\t\t\t\t\thandleSend(content, fileList, auto, type)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// 处理发送\r\n\tconst handleSend = (content?: string, fileList?: any[], auto?: boolean, type?: string): void => {\r\n\t\temit('beforeSendMessage')\r\n\t\tsendMessageInject(inputValue.value, fileData.value)\r\n\t\ttypeFlag.value = type || ''\r\n\t\tif (scripts && Array.isArray(scripts) && scripts.length > 0) {\r\n\t\t\tconst userInput = content ? content.replace(/\\n/g, '') : inputValue.value.replace(/\\n/g, '').trim()\r\n\t\t\tif (!userInput && !fileList?.length && auto) return\r\n\r\n\t\t\t// 添加用户消息\r\n\t\t\tconst userChatId = `user_${Date.now()}`\r\n\t\t\tconst userMessage: ChatMessage & ChatMsgList = {\r\n\t\t\t\tchatId: userChatId,\r\n\t\t\t\tuser: 'u',\r\n\t\t\t\ttype: 'text',\r\n\t\t\t\tcontent: userInput,\r\n\t\t\t\tisShowLike: false,\r\n\t\t\t\tisShowCopy: true,\r\n\t\t\t\tisWithDraw: false,\r\n\t\t\t\tisRead: false,\r\n\t\t\t\tfiles: fileList || [],\r\n\t\t\t\ttypeFlag: type,\r\n\t\t\t\tauto: auto || false,\r\n\t\t\t\tmsgList: []\r\n\t\t\t}\r\n\t\t\tchatList.value.push(userMessage)\r\n\t\t\temit('sendMessage', [...chatList.value])\r\n\r\n\t\t\t// 滚动到底部\r\n\t\t\tnextTick(() => {\r\n\t\t\t\trenderContent(userMessage.content, 'main', chatList.value.length - 1)\r\n\t\t\t\tnextTick(() => {\r\n\t\t\t\t\tscrollToBottom()\r\n\t\t\t\t})\r\n\t\t\t})\r\n\r\n\t\t\t// 查找匹配的脚本内容\r\n\t\t\tconst result = findMatchingScriptContent(userInput)\r\n\r\n\t\t\tif (result && result.responses.length > 0) {\r\n\t\t\t\t// 存储新AI消息的数组\r\n\t\t\t\tconst newAiMessages: ChatMessage[] = []\r\n\r\n\t\t\t\tresult.responses.forEach((response: any, idx: number) => {\r\n\t\t\t\t\tconst pauseMarker = Array.isArray(response.data) ? '\\u200B'.repeat(20) : ''\r\n\t\t\t\t\tconst content = Array.isArray(response.data) ? response.data.join(pauseMarker) : response.data\r\n\r\n\t\t\t\t\tconst aiChatId = `ai_${Date.now()}_${idx}`\r\n\t\t\t\t\tconst aiMessage: ChatMessage = {\r\n\t\t\t\t\t\tchatId: aiChatId,\r\n\t\t\t\t\t\tuser: 'ai',\r\n\t\t\t\t\t\ttype: 'text',\r\n\t\t\t\t\t\tcontent: content || '',\r\n\t\t\t\t\t\tcomponentName: response.type || '',\r\n\t\t\t\t\t\tisShowLike: true,\r\n\t\t\t\t\t\tisShowCopy: true,\r\n\t\t\t\t\t\tneedSequenceType: response.type || '',\r\n\t\t\t\t\t\tneedSequenceProcessing: response.needSequenceProcessing || false,\r\n\t\t\t\t\t\ttypeFlag: type,\r\n\t\t\t\t\t\tmsgList: []\r\n\t\t\t\t\t}\r\n\t\t\t\t\tnewAiMessages.push(aiMessage)\r\n\t\t\t\t})\r\n\r\n\t\t\t\t// 创建消息处理器相关变量\r\n\t\t\t\tconst messageQueue = [...newAiMessages]\r\n\t\t\t\tlet isProcessing = false\r\n\t\t\t\tlet currentMessage: ChatMessage | null = null\r\n\r\n\t\t\t\t// 处理下一条消息\r\n\t\t\t\tconst processNextMessage = () => {\r\n\t\t\t\t\tif (messageQueue.length > 0 && !isProcessing) {\r\n\t\t\t\t\t\tisProcessing = true\r\n\t\t\t\t\t\tconst nextMessage = messageQueue.shift()\r\n\t\t\t\t\t\tif (nextMessage) {\r\n\t\t\t\t\t\t\tcurrentMessage = nextMessage\r\n\t\t\t\t\t\t\tchatList.value.push(currentMessage)\r\n\t\t\t\t\t\t\temit('sendMessage', [...chatList.value])\r\n\t\t\t\t\t\t\tconst msgIndex = chatList.value.length - 1\r\n\t\t\t\t\t\t\tnextTick(() => {\r\n\t\t\t\t\t\t\t\trenderContent(currentMessage?.content || '', 'main', msgIndex)\r\n\t\t\t\t\t\t\t\tnextTick(() => {\r\n\t\t\t\t\t\t\t\t\tscrollToBottom()\r\n\t\t\t\t\t\t\t\t\tif (currentMessage) {\r\n\t\t\t\t\t\t\t\t\t\tconst messageToProcess = {\r\n\t\t\t\t\t\t\t\t\t\t\t...currentMessage,\r\n\t\t\t\t\t\t\t\t\t\t\tneedSequenceProcessing: true\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\tsimulateStreamOutput(msgIndex, messageToProcess)\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// 处理消息完成事件\r\n\t\t\t\tconst handleMessageComplete = (chatId: string) => {\r\n\t\t\t\t\tif (currentMessage && currentMessage.chatId === chatId) {\r\n\t\t\t\t\t\tcurrentMessage = null\r\n\t\t\t\t\t\tisProcessing = false\r\n\t\t\t\t\t\tprocessNextMessage()\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// 保存消息处理器\r\n\t\t\t\tconst processorObj = {\r\n\t\t\t\t\tmessageQueue,\r\n\t\t\t\t\tisProcessing,\r\n\t\t\t\t\tcurrentMessage,\r\n\t\t\t\t\tprocessNextMessage,\r\n\t\t\t\t\thandleMessageComplete\r\n\t\t\t\t}\r\n\t\t\t\tcurrentMessageProcessor.value = processorObj\r\n\r\n\t\t\t\t// 开始处理消息队列\r\n\t\t\t\tprocessNextMessage()\r\n\t\t\t} else {\r\n\t\t\t\t// 插入默认AI回复\r\n\t\t\t\tconst defaultAiChatId = `ai_${Date.now()}`\r\n\t\t\t\tconst defaultAiMessage: ChatMessage = {\r\n\t\t\t\t\tchatId: defaultAiChatId,\r\n\t\t\t\t\tuser: 'ai',\r\n\t\t\t\t\ttype: 'text',\r\n\t\t\t\t\tcontent: unmatchText,\r\n\t\t\t\t\tisShowLike: true,\r\n\t\t\t\t\tisShowCopy: true,\r\n\t\t\t\t\tmsgList: []\r\n\t\t\t\t}\r\n\t\t\t\tchatList.value.push(defaultAiMessage)\r\n\t\t\t\temit('sendMessage', [...chatList.value])\r\n\t\t\t\tnextTick(() => {\r\n\t\t\t\t\tconst msgIndex = chatList.value.findIndex((item: any) => item.chatId === defaultAiChatId)\r\n\t\t\t\t\tif (msgIndex !== -1) {\r\n\t\t\t\t\t\trenderContent(defaultAiMessage.content, 'main', msgIndex)\r\n\t\t\t\t\t\tnextTick(() => {\r\n\t\t\t\t\t\t\tscrollToBottom()\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t}\r\n\r\n\t\t\tinputValue.value = ''\r\n\t\t} else {\r\n\t\t\t// 无脚本模式,直接发送\r\n\t\t\tif (content) {\r\n\t\t\t\tinputValue.value = content\r\n\t\t\t}\r\n\t\t\tif ((isChating.value || (!inputValue.value.trim() && !fileList?.length)) && !auto) return\r\n\r\n\t\t\tconst userChatId = 'user_' + Math.random().toString(36).slice(2).padEnd(10, '0').slice(0, 10)\r\n\t\t\tconst userMessage: ChatMessage & ChatMsgList = {\r\n\t\t\t\tchatId: userChatId,\r\n\t\t\t\tuser: 'u',\r\n\t\t\t\ttype: 'text',\r\n\t\t\t\tcontent: inputValue.value,\r\n\t\t\t\tfiles: fileList || [],\r\n\t\t\t\tmsgList: [],\r\n\t\t\t\tisRead: false\r\n\t\t\t}\r\n\t\t\tchatList.value.push(userMessage)\r\n\t\t\tconst index = chatList.value.length - 1\r\n\t\t\tnextTick(() => {\r\n\t\t\t\trenderContent(userMessage.content, 'main', index)\r\n\t\t\t\tscrollToBottom()\r\n\t\t\t})\r\n\t\t\topenSSE(inputValue.value, index + 1, 1)\r\n\t\t\tinputValue.value = ''\r\n\t\t}\r\n\t}\r\n\r\n\t// 停止生成\r\n\tconst handleStop = (): void => {\r\n\t\tcleanupSSE()\r\n\r\n\t\tconst aiIndex = chatList.value.findIndex((item: any) => item.isChating)\r\n\t\tif (aiIndex !== -1) {\r\n\t\t\tconst currentAiMessage = chatList.value[aiIndex]\r\n\r\n\t\t\tif (currentAiMessage.content?.trim()) {\r\n\t\t\t\tnextTick(() => {\r\n\t\t\t\t\tchatList.value[aiIndex] = {\r\n\t\t\t\t\t\t...currentAiMessage,\r\n\t\t\t\t\t\tcontent: currentAiMessage.content + '...',\r\n\t\t\t\t\t\tisChating: false\r\n\t\t\t\t\t}\r\n\t\t\t\t\trenderContent(chatList.value[aiIndex].content, 'main', aiIndex)\r\n\t\t\t\t\temit('sendMessage', chatList.value)\r\n\t\t\t\t})\r\n\t\t\t} else {\r\n\t\t\t\tif (aiIndex > 0) {\r\n\t\t\t\t\tconst userMessageIndex = aiIndex - 1\r\n\t\t\t\t\tif (chatList.value[userMessageIndex].user === 'u') {\r\n\t\t\t\t\t\tchatList.value.splice(userMessageIndex, 2)\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tchatList.value.splice(aiIndex, 1)\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tchatList.value.splice(aiIndex, 1)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tconst lastIndex = chatList.value.length - 1\r\n\t\t\tif (lastIndex >= 0 && chatList.value[lastIndex].user === 'u') {\r\n\t\t\t\tchatList.value.pop()\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tisChating.value = false\r\n\t}\r\n\r\n\t// 处理消息操作\r\n\tconst handleMessageAction = (action: MessageAction, index: number): void => {\r\n\t\tconst message = chatList.value[index]\r\n\t\tif (!message) return\r\n\r\n\t\tswitch (action) {\r\n\t\t\tcase MessageAction.COPY: {\r\n\t\t\t\t// 使用复制功能\r\n\t\t\t\tcopyToClipboard(message.content, '复制成功', '复制失败')\r\n\t\t\t\tbreak\r\n\t\t\t}\r\n\t\t\tcase MessageAction.EDIT:\r\n\t\t\t\tmessage.isEditing = true\r\n\t\t\t\tmessage.editContent = message.content\r\n\t\t\t\tbreak\r\n\t\t\tcase MessageAction.DELETE:\r\n\t\t\t\tmessageUtils.deleteMessageChain(index)\r\n\t\t\t\temit('sendMessage', chatList.value)\r\n\t\t\t\tbreak\r\n\t\t\tcase MessageAction.RETRY: {\r\n\t\t\t\tconst aiMessage = chatList.value[index]\r\n\t\t\t\tconst userMessageIndex = index - 1\r\n\t\t\t\tconst userMessage = chatList.value[userMessageIndex]\r\n\r\n\t\t\t\tif (userMessage && userMessage.user === 'u') {\r\n\t\t\t\t\tconst updatedAiMessage = {\r\n\t\t\t\t\t\t...aiMessage,\r\n\t\t\t\t\t\tcontent: '',\r\n\t\t\t\t\t\tthinkContent: '',\r\n\t\t\t\t\t\treasoningContent: '',\r\n\t\t\t\t\t\tisLiked: false,\r\n\t\t\t\t\t\tisDisliked: false,\r\n\t\t\t\t\t\tisChating: true,\r\n\t\t\t\t\t\tisRead: false,\r\n\t\t\t\t\t\tchatId: aiMessage.chatId,\r\n\t\t\t\t\t\tuser: aiMessage.user,\r\n\t\t\t\t\t\ttype: aiMessage.type,\r\n\t\t\t\t\t\tthinkStatus: ThinkStatus.COMPLETED,\r\n\t\t\t\t\t\tthinkStartTime: 0,\r\n\t\t\t\t\t\tthinkEndTime: 0\r\n\t\t\t\t\t}\r\n\t\t\t\t\tchatList.value.splice(index, 1, updatedAiMessage)\r\n\r\n\t\t\t\t\tnextTick(() => {\r\n\t\t\t\t\t\tif (htmlContentRef.value[index]) htmlContentRef.value[index].innerHTML = ''\r\n\t\t\t\t\t\tif (thinkingContentRef.value[index]) thinkingContentRef.value[index].innerHTML = ''\r\n\t\t\t\t\t\tif (reasoningContentRef.value[index]) reasoningContentRef.value[index].innerHTML = ''\r\n\t\t\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\t\t\topenSSE(userMessage.content || '', index, 1)\r\n\t\t\t\t\t\t}, 50)\r\n\t\t\t\t\t})\r\n\t\t\t\t}\r\n\t\t\t\tbreak\r\n\t\t\t}\r\n\t\t\tcase MessageAction.LIKE:\r\n\t\t\t\tmessageUtils.updateMessage(index, {\r\n\t\t\t\t\tisLiked: true,\r\n\t\t\t\t\tisDisliked: false\r\n\t\t\t\t})\r\n\t\t\t\tbreak\r\n\t\t\tcase MessageAction.DISLIKE:\r\n\t\t\t\tmessageUtils.updateMessage(index, {\r\n\t\t\t\t\tisLiked: false,\r\n\t\t\t\t\tisDisliked: true\r\n\t\t\t\t})\r\n\t\t\t\tbreak\r\n\t\t\tcase MessageAction.WITHDRAW:\r\n\t\t\t\tconsole.log('withDraw')\r\n\t\t\t\tmessageUtils.updateMessage(index, {\r\n\t\t\t\t\tisWithDraw: true,\r\n\t\t\t\t\tuser: 'withDraw'\r\n\t\t\t\t})\r\n\t\t\t\tbreak\r\n\t\t}\r\n\t}\r\n\r\n\t// 保存编辑\r\n\tconst saveEdit = (index: number, newContent: string): void => {\r\n\t\tconst message = chatList.value[index]\r\n\t\tif (!message || !message.editContent) return\r\n\r\n\t\tchatList.value[index] = {\r\n\t\t\t...message,\r\n\t\t\tcontent: newContent,\r\n\t\t\tisEditing: false,\r\n\t\t\teditContent: undefined\r\n\t\t}\r\n\t\tnextTick(() => {\r\n\t\t\trenderContent(newContent, 'main', index)\r\n\t\t})\r\n\r\n\t\t// 删除后续的AI回复(如果有)\r\n\t\tconst hasDeletedAi = index + 1 < chatList.value.length && chatList.value[index + 1].user === 'ai'\r\n\t\tif (hasDeletedAi) {\r\n\t\t\tchatList.value.splice(index + 1, 1)\r\n\t\t}\r\n\r\n\t\t// 计算插入新AI消息的位置\r\n\t\t// 无论是否删除了AI消息,插入位置都是 index + 1\r\n\t\tconst insertPosition = index + 1\r\n\t\t// console.log('saveEdit调用openSSE,index:', index, 'insertPosition:', insertPosition, 'newContent:', newContent)\r\n\r\n\t\t// 等待下一个tick,确保Vue已经更新了DOM和refs\r\n\t\tnextTick(() => {\r\n\t\t\topenSSE(newContent, insertPosition, 1)\r\n\t\t})\r\n\t\temit('sendMessage', chatList.value)\r\n\t}\r\n\r\n\t// 取消编辑\r\n\tconst cancelEdit = (index: number): void => {\r\n\t\tconst message = chatList.value[index]\r\n\t\tif (!message) return\r\n\r\n\t\tmessage.isEditing = false\r\n\t\tmessage.editContent = ''\r\n\t\tnextTick(() => {\r\n\t\t\trenderContent(message.content, 'main', index)\r\n\t\t})\r\n\t}\r\n\r\n\t// 处理拖拽事件\r\n\tconst handleDragEnter = () => {\r\n\t\tisDragging.value = true\r\n\t\t// 打开标记层以显示拖拽区域\r\n\t\tif (chatInputRef?.value) {\r\n\t\t\tchatInputRef.value.openMarkLayer()\r\n\t\t}\r\n\t}\r\n\r\n\tconst handleDragLeave = (e: DragEvent) => {\r\n\t\tconst rect = (e.target as HTMLElement).getBoundingClientRect()\r\n\t\tif (e.clientX < rect.left || e.clientX > rect.right || e.clientY < rect.top || e.clientY > rect.bottom) {\r\n\t\t\tisDragging.value = false\r\n\t\t}\r\n\t}\r\n\r\n\tconst handleDrop = async (e: DragEvent) => {\r\n\t\tisDragging.value = false\r\n\r\n\t\t// 获取拖拽的文件\r\n\t\tconst files = e.dataTransfer?.files\r\n\t\tif (files && files.length > 0) {\r\n\t\t\tconst fileList = await Promise.all(\r\n\t\t\t\tArray.from(files).map(async file => {\r\n\t\t\t\t\tlet base64 = ''\r\n\t\t\t\t\tif (file.type.startsWith('image/')) {\r\n\t\t\t\t\t\tbase64 = await new Promise(resolve => {\r\n\t\t\t\t\t\t\tconst reader = new FileReader()\r\n\t\t\t\t\t\t\treader.onload = e => {\r\n\t\t\t\t\t\t\t\tresolve(e.target?.result as string)\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\treader.readAsDataURL(file)\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tid: Math.random().toString(36).slice(2).padEnd(10, '0').slice(0, 10),\r\n\t\t\t\t\t\tfile: file,\r\n\t\t\t\t\t\tname: file.name,\r\n\t\t\t\t\t\tfileType: file.type,\r\n\t\t\t\t\t\tfileSize: file.size,\r\n\t\t\t\t\t\tlastModified: file.lastModified,\r\n\t\t\t\t\t\tpreview: URL.createObjectURL(file),\r\n\t\t\t\t\t\tbase64\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t)\r\n\t\t\t// 调用 ChatInput 的 handlePaste 方法处理拖拽的文件\r\n\t\t\tif (chatInputRef?.value) {\r\n\t\t\t\tchatInputRef.value.handlePaste(fileList, 'drop')\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// 关闭标记层\r\n\t\tif (chatInputRef?.value) {\r\n\t\t\tchatInputRef.value.colseMarkLayer()\r\n\t\t}\r\n\t}\r\n\r\n\t// 组件生命周期\r\n\tconst onMounted = () => {\r\n\t\tif (!isMounted.value) {\r\n\t\t\tinit()\r\n\t\t}\r\n\t\tisMounted.value = true\r\n\t}\r\n\r\n\tconst onBeforeUnmount = () => {\r\n\t\tif (!isUnmounting.value) {\r\n\t\t\tisUnmounting.value = true\r\n\t\t\tcleanupSSE()\r\n\t\t\tisMounted.value = false\r\n\t\t}\r\n\t}\r\n\r\n\treturn {\r\n\t\t// 状态\r\n\t\tchatList,\r\n\t\tisChating,\r\n\t\tinputValue,\r\n\t\tenableDeepThinking,\r\n\t\tisMounted,\r\n\t\tisUnmounting,\r\n\t\tcurrentComponentName,\r\n\t\tfileData,\r\n\t\tactiveAgentsName,\r\n\t\tmoduleInfo,\r\n\t\tisDragging,\r\n\t\ttypeFlag,\r\n\t\tcurrIndex,\r\n\t\tfetchStream,\r\n\t\tresultItem,\r\n\t\tcurrentMessageProcessor,\r\n\t\tactiveScript,\r\n\t\thtmlContentRef,\r\n\t\tthinkingContentRef,\r\n\t\treasoningContentRef,\r\n\t\t// 方法\r\n\t\tinit,\r\n\t\tsendMessage,\r\n\t\thandleBeforeSend,\r\n\t\thandleSend,\r\n\t\thandleStop,\r\n\t\thandleMessageAction,\r\n\t\tsaveEdit,\r\n\t\tcancelEdit,\r\n\t\tcompleteRendered,\r\n\t\thandleAgentSelect,\r\n\t\tupdate,\r\n\t\tupdateModule,\r\n\t\tmessageUtils,\r\n\t\tsimulateStreamOutput,\r\n\t\thandleDragEnter,\r\n\t\thandleDragLeave,\r\n\t\thandleDrop,\r\n\t\tonMounted,\r\n\t\tonBeforeUnmount,\r\n\t\tcleanupSSE,\r\n\t\tscrollToBottom,\r\n\t\thandleScroll,\r\n\t\trenderContent,\r\n\t\tenqueueRender\r\n\t}\r\n}\r\n"],"names":["content","e","_a"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useChat.mjs","sources":["../../../../../../../../packages/components/touchchat/src/AiChat/Chat/useChat.ts"],"sourcesContent":["/**\n * 主聊天逻辑 Composable\n */\n\nimport { ref, watch, type Ref, nextTick } from 'vue'\nimport { MessageAction, ThinkStatus, type ChatMessage, type ModuleItem, type FileItem, type MessageProcessor, ChatMsgList } from './types'\nimport { createScriptMatcher } from './scriptMatcher'\nimport { useSSE } from './useSSE'\nimport { useScroll } from './useScroll'\nimport { useMessageRender } from './useMessageRender'\nimport { useCopy } from './useCopy'\n\nexport interface UseChatOptions {\n\tprops: { value: ChatMessage[] }\n\temit: (event: string, ...args: any[]) => void\n\tscripts: any[]\n\tunmatchText: string\n\tmodules: (string | ModuleItem)[]\n\tafterSend: (result: object) => void\n\tsendMessageInject: (value: string, fileList?: any[]) => void\n\tbeforeSend: () => { result: boolean; componentName?: string } | Promise<{ result: boolean; componentName?: string }>\n\tbottom: () => void\n\tstop: (item: ChatMessage, index: number) => void\n\tchatContainer: Ref<HTMLElement | null>\n\tchatInputRef?: Ref<any | null>\n}\n\nexport function useChat({ props, emit, scripts, unmatchText, modules, afterSend, sendMessageInject, beforeSend, bottom, stop, chatContainer, chatInputRef }: UseChatOptions) {\n\t// 组件状态\n\tconst isMounted = ref(false)\n\tconst isChating = ref(false)\n\tconst inputValue = ref('')\n\tconst enableDeepThinking = ref(false)\n\tconst chatList = ref<ChatMessage[]>([])\n\tconst currIndex = ref(0)\n\tconst isUnmounting = ref(false)\n\tconst currentComponentName = ref('')\n\tconst fileData = ref<FileItem[]>([])\n\tconst activeAgentsName = ref<string>('')\n\tconst moduleInfo = ref<ModuleItem>((modules[0] as ModuleItem) || { name: 'deepseek-v3' })\n\tconst isDragging = ref(false)\n\tconst typeFlag = ref('')\n\n\t// 消息处理器状态\n\tconst currentMessageProcessor = ref<MessageProcessor | null>(null)\n\n\t// 消息渲染 composable\n\tconst { htmlContentRef, thinkingContentRef, reasoningContentRef, markdownToHtml, renderContent, enqueueRender } = useMessageRender({\n\t\tchatList,\n\t\tcurrIndex,\n\t\tisMounted,\n\t\tisUnmounting\n\t})\n\n\t// 滚动 composable\n\tconst { scrollToBottom, handleScroll } = useScroll({\n\t\tchatContainer,\n\t\tisMounted,\n\t\tisUnmounting,\n\t\tbottom\n\t})\n\n\t// 复制功能 composable\n\tconst { copyToClipboard } = useCopy()\n\n\t// 脚本匹配 - 需要将数组包装为 ref\n\tconst scriptsRef = ref(scripts)\n\tconst { activeScript, findMatchingScriptContent } = createScriptMatcher({\n\t\tscripts: scriptsRef,\n\t\tactiveAgentsName,\n\t\tfileData,\n\t\tunmatchText\n\t})\n\n\t// SSE\n\tconst { fetchStream, resultItem, openSSE, cleanupSSE } = useSSE({\n\t\tchatList,\n\t\tcurrIndex,\n\t\tisChating,\n\t\tisMounted,\n\t\tisUnmounting,\n\t\tinputValue,\n\t\tenableDeepThinking,\n\t\tcurrentComponentName,\n\t\ttypeFlag,\n\t\tmoduleInfo,\n\t\temit,\n\t\tafterSend,\n\t\tenqueueRender,\n\t\trenderContent,\n\t\tmarkdownToHtml,\n\t\tscrollToBottom,\n\t\tstop\n\t})\n\n\t// 监听 activeAgentsName\n\twatch(\n\t\t() => activeAgentsName,\n\t\t(val: any) => {\n\t\t\tif (!val) {\n\t\t\t\tactiveAgentsName.value = localStorage.getItem('activeAgentsName') as string\n\t\t\t}\n\t\t},\n\t\t{ immediate: true }\n\t)\n\n\t// 消息管理工具函数\n\tconst messageUtils = {\n\t\tupdateMessage: (index: number, updates: Partial<ChatMessage>): void => {\n\t\t\tif (index < 0 || index >= chatList.value.length) return\n\t\t\tchatList.value.splice(index, 1, { ...chatList.value[index], ...updates })\n\t\t\tnextTick(() => {\n\t\t\t\tconst message = chatList.value[index]\n\t\t\t\tif (message) {\n\t\t\t\t\trenderContent(message.content, 'main', index)\n\t\t\t\t\tif (message.thinkContent) {\n\t\t\t\t\t\trenderContent(message.thinkContent, 'thinking', index)\n\t\t\t\t\t}\n\t\t\t\t\tif (message.reasoningContent) {\n\t\t\t\t\t\trenderContent(message.reasoningContent, 'reasoning', index)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\n\t\tdeleteMessageChain: (index: number): void => {\n\t\t\tif (index < 0 || index >= chatList.value.length) return\n\t\t\tif (chatList.value[index].user === 'u') {\n\t\t\t\tlet deleteCount = 1\n\t\t\t\tfor (let i = index + 1; i < chatList.value.length; i++) {\n\t\t\t\t\tif (chatList.value[i].user === 'ai') {\n\t\t\t\t\t\tdeleteCount++\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tchatList.value.splice(index, deleteCount)\n\t\t\t} else {\n\t\t\t\tchatList.value.splice(index, 1)\n\t\t\t}\n\t\t},\n\n\t\tcreateStandardMessage: (data: Partial<ChatMessage>): ChatMessage => ({\n\t\t\tchatId: data.chatId || 'ai_' + Math.random().toString(36).slice(2).padEnd(10, '0').slice(0, 10),\n\t\t\tuser: data.user || 'ai',\n\t\t\ttype: data.type || 'text',\n\t\t\tcontent: data.content || '',\n\t\t\tisChating: data.isChating ?? false,\n\t\t\tthinkContent: data.thinkContent || '',\n\t\t\treasoningContent: data.reasoningContent || '',\n\t\t\tisLiked: data.isLiked ?? false,\n\t\t\tisDisliked: data.isDisliked ?? false,\n\t\t\tisEditing: data.isEditing ?? false,\n\t\t\teditContent: data.editContent ?? '',\n\t\t\tmsgList: []\n\t\t})\n\t}\n\n\t// 更新消息\n\tconst update = (index: number, message: object) => {\n\t\tchatList.value[index] = { ...chatList.value[index], ...message }\n\t\t// console.log('update', chatList.value[index])\n\t}\n\n\t// 更新模块信息\n\tconst updateModule = (info: ModuleItem) => {\n\t\tmoduleInfo.value = info\n\t}\n\n\t// 处理智能体选择\n\tconst handleAgentSelect = (item: any) => {\n\t\tlocalStorage.setItem('activeAgentsName', item.name)\n\t\tconst aiMessage = item.intro\n\t\tmessageUtils.updateMessage(0, {\n\t\t\tcontent: '',\n\t\t\tisChating: false\n\t\t})\n\t\tsimulateStreamOutput(0, aiMessage)\n\t}\n\n\t// 渲染完成回调\n\tconst completeRendered = (chatId: string) => {\n\t\t// console.log('completeRendered', '渲染完成', chatId)\n\t\tif (currentMessageProcessor.value) {\n\t\t\tcurrentMessageProcessor.value.handleMessageComplete(chatId)\n\t\t}\n\t}\n\n\t// 初始化函数\n\tconst init = (): void => {\n\t\ttry {\n\t\t\tif (Array.isArray(props.value) && props.value.length && !scripts.length) {\n\t\t\t\tchatList.value = props.value.map((item: any) => ({\n\t\t\t\t\t...item,\n\t\t\t\t\tcontent: item.thinkContent ? item.content || '' : item.content || '',\n\t\t\t\t\tthinkContent: item.thinkContent || ''\n\t\t\t\t}))\n\n\t\t\t\tnextTick(() => {\n\t\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\t\tif (activeAgentsName.value && chatList.value.length > 0 && chatList.value[0].user === 'ai') {\n\t\t\t\t\t\t\tconst aiMessage = chatList.value[0]\n\t\t\t\t\t\t\tmessageUtils.updateMessage(0, {\n\t\t\t\t\t\t\t\tcontent: '',\n\t\t\t\t\t\t\t\tisChating: true\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tsimulateStreamOutput(0, aiMessage.content)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tchatList.value.forEach((item: any) => {\n\t\t\t\t\t\t\t\tif (item.thinkContent) {\n\t\t\t\t\t\t\t\t\trenderContent(item.thinkContent, 'thinking')\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (item.reasoningContent) {\n\t\t\t\t\t\t\t\t\trenderContent(item.reasoningContent, 'reasoning')\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (item.content) {\n\t\t\t\t\t\t\t\t\trenderContent(item.content, 'main')\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tnextTick(() => {\n\t\t\t\t\t\t\t\tscrollToBottom()\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t}\n\t\t} catch (error) {\n\t\t\t// console.error('初始化失败:', error)\n\t\t}\n\t}\n\n\t// 模拟流式输出\n\tconst simulateStreamOutput = (aiIndex: number, msg: string | ChatMessage, callback?: () => void) => {\n\t\tconst message: string = typeof msg === 'string' ? msg : msg.content\n\t\tconst componentName = typeof msg === 'string' ? '' : msg.needSequenceProcessing ? msg.needSequenceType : ''\n\t\tconst isNeedSequenceProcessing = typeof msg === 'string' ? false : msg.needSequenceProcessing\n\n\t\tconst fn = () => {\n\t\t\tclearInterval(interval)\n\t\t\temit('sendMessage', [...chatList.value])\n\t\t\tif (componentName) {\n\t\t\t\tchatList.value[aiIndex].componentName = componentName\n\t\t\t}\n\t\t\tmessageUtils.updateMessage(aiIndex, {\n\t\t\t\tisChating: false\n\t\t\t})\n\t\t\tnextTick(() => {\n\t\t\t\trenderContent(message, 'main', aiIndex)\n\t\t\t\tnextTick(() => {\n\t\t\t\t\tscrollToBottom()\n\t\t\t\t\tif (!isNeedSequenceProcessing && callback) {\n\t\t\t\t\t\tcallback()\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t\t}\n\n\t\tlet index = 0\n\t\tconst interval = setInterval(() => {\n\t\t\tif (index < message.length) {\n\t\t\t\tconst newContent = message\n\t\t\t\tmessageUtils.updateMessage(aiIndex, {\n\t\t\t\t\tcontent: newContent\n\t\t\t\t})\n\t\t\t\tnextTick(() => {\n\t\t\t\t\trenderContent(newContent, 'main', aiIndex)\n\t\t\t\t\tnextTick(() => {\n\t\t\t\t\t\tscrollToBottom()\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\tindex++\n\t\t\t} else {\n\t\t\t\tfn()\n\t\t\t}\n\t\t}, 50)\n\t}\n\n\t// 监听props.value变化\n\twatch(\n\t\t() => props.value,\n\t\t(newVal: any, oldVal: any) => {\n\t\t\tif (!Array.isArray(newVal)) return\n\t\t\tif (newVal.length && JSON.stringify(newVal) !== JSON.stringify(oldVal)) {\n\t\t\t\tchatList.value = newVal.map(item => ({\n\t\t\t\t\t...item,\n\t\t\t\t\tcontent: item.thinkContent ? item.content || '' : item.content || '',\n\t\t\t\t\tthinkContent: item.thinkContent || ''\n\t\t\t\t}))\n\n\t\t\t\tnextTick(() => {\n\t\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\t\tchatList.value.forEach((item: any) => {\n\t\t\t\t\t\t\tif (item.thinkContent) {\n\t\t\t\t\t\t\t\trenderContent(item.thinkContent, 'thinking')\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (item.reasoningContent) {\n\t\t\t\t\t\t\t\trenderContent(item.reasoningContent, 'reasoning')\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (item.content) {\n\t\t\t\t\t\t\t\trenderContent(item.content, 'main')\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\tnextTick(() => {\n\t\t\t\t\t\t\tscrollToBottom()\n\t\t\t\t\t\t})\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t}\n\t\t},\n\t\t{ deep: true, immediate: true }\n\t)\n\n\t// 发送消息\n\tconst sendMessage = (content?: string, fileList?: any[], auto?: boolean, type?: string): void => {\n\t\tinputValue.value = content || ''\n\t\thandleBeforeSend(content, fileList, auto, type)\n\t}\n\n\t// 发送前处理\n\tconst handleBeforeSend = (content?: string, fileList?: any[], auto?: boolean, type?: string): void => {\n\t\tfileData.value = fileList || []\n\t\tif (beforeSend) {\n\t\t\tconst fn = beforeSend() as any\n\t\t\tif (fn && typeof fn.then === 'function') {\n\t\t\t\t;(Promise.resolve(fn) as Promise<{ result: boolean; componentName?: string }>)\n\t\t\t\t\t.then(res => {\n\t\t\t\t\t\tif (res.result) {\n\t\t\t\t\t\t\tcurrentComponentName.value = res.componentName || ''\n\t\t\t\t\t\t\thandleSend(content, fileList, auto, type)\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t.catch(error => {\n\t\t\t\t\t\tconsole.log(error)\n\t\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tif (fn.result) {\n\t\t\t\t\tcurrentComponentName.value = fn.componentName || ''\n\t\t\t\t\thandleSend(content, fileList, auto, type)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 处理发送\n\tconst handleSend = (content?: string, fileList?: any[], auto?: boolean, type?: string): void => {\n\t\temit('beforeSendMessage')\n\t\tsendMessageInject(inputValue.value, fileData.value)\n\t\ttypeFlag.value = type || ''\n\t\tif (scripts && Array.isArray(scripts) && scripts.length > 0) {\n\t\t\tconst userInput = content ? content.replace(/\\n/g, '') : inputValue.value.replace(/\\n/g, '').trim()\n\t\t\tif (!userInput && !fileList?.length && auto) return\n\n\t\t\t// 添加用户消息\n\t\t\tconst userChatId = `user_${Date.now()}`\n\t\t\tconst userMessage: ChatMessage & ChatMsgList = {\n\t\t\t\tchatId: userChatId,\n\t\t\t\tuser: 'u',\n\t\t\t\ttype: 'text',\n\t\t\t\tcontent: userInput,\n\t\t\t\tisShowLike: false,\n\t\t\t\tisShowCopy: true,\n\t\t\t\tisWithDraw: false,\n\t\t\t\tisRead: false,\n\t\t\t\tfiles: fileList || [],\n\t\t\t\ttypeFlag: type,\n\t\t\t\tauto: auto || false,\n\t\t\t\tmsgList: []\n\t\t\t}\n\t\t\tchatList.value.push(userMessage)\n\t\t\temit('sendMessage', [...chatList.value])\n\n\t\t\t// 滚动到底部\n\t\t\tnextTick(() => {\n\t\t\t\trenderContent(userMessage.content, 'main', chatList.value.length - 1)\n\t\t\t\tnextTick(() => {\n\t\t\t\t\tscrollToBottom()\n\t\t\t\t})\n\t\t\t})\n\n\t\t\t// 查找匹配的脚本内容\n\t\t\tconst result = findMatchingScriptContent(userInput)\n\n\t\t\tif (result && result.responses.length > 0) {\n\t\t\t\t// 存储新AI消息的数组\n\t\t\t\tconst newAiMessages: ChatMessage[] = []\n\n\t\t\t\tresult.responses.forEach((response: any, idx: number) => {\n\t\t\t\t\tconst pauseMarker = Array.isArray(response.data) ? '\\u200B'.repeat(20) : ''\n\t\t\t\t\tconst content = Array.isArray(response.data) ? response.data.join(pauseMarker) : response.data\n\n\t\t\t\t\tconst aiChatId = `ai_${Date.now()}_${idx}`\n\t\t\t\t\tconst aiMessage: ChatMessage = {\n\t\t\t\t\t\tchatId: aiChatId,\n\t\t\t\t\t\tuser: 'ai',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tcontent: content || '',\n\t\t\t\t\t\tcomponentName: response.type || '',\n\t\t\t\t\t\tisShowLike: true,\n\t\t\t\t\t\tisShowCopy: true,\n\t\t\t\t\t\tneedSequenceType: response.type || '',\n\t\t\t\t\t\tneedSequenceProcessing: response.needSequenceProcessing || false,\n\t\t\t\t\t\ttypeFlag: type,\n\t\t\t\t\t\tmsgList: []\n\t\t\t\t\t}\n\t\t\t\t\tnewAiMessages.push(aiMessage)\n\t\t\t\t})\n\n\t\t\t\t// 创建消息处理器相关变量\n\t\t\t\tconst messageQueue = [...newAiMessages]\n\t\t\t\tlet isProcessing = false\n\t\t\t\tlet currentMessage: ChatMessage | null = null\n\n\t\t\t\t// 处理下一条消息\n\t\t\t\tconst processNextMessage = () => {\n\t\t\t\t\tif (messageQueue.length > 0 && !isProcessing) {\n\t\t\t\t\t\tisProcessing = true\n\t\t\t\t\t\tconst nextMessage = messageQueue.shift()\n\t\t\t\t\t\tif (nextMessage) {\n\t\t\t\t\t\t\tcurrentMessage = nextMessage\n\t\t\t\t\t\t\tchatList.value.push(currentMessage)\n\t\t\t\t\t\t\temit('sendMessage', [...chatList.value])\n\t\t\t\t\t\t\tconst msgIndex = chatList.value.length - 1\n\t\t\t\t\t\t\tnextTick(() => {\n\t\t\t\t\t\t\t\trenderContent(currentMessage?.content || '', 'main', msgIndex)\n\t\t\t\t\t\t\t\tnextTick(() => {\n\t\t\t\t\t\t\t\t\tscrollToBottom()\n\t\t\t\t\t\t\t\t\tif (currentMessage) {\n\t\t\t\t\t\t\t\t\t\tconst messageToProcess = {\n\t\t\t\t\t\t\t\t\t\t\t...currentMessage,\n\t\t\t\t\t\t\t\t\t\t\tneedSequenceProcessing: true\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tsimulateStreamOutput(msgIndex, messageToProcess)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// 处理消息完成事件\n\t\t\t\tconst handleMessageComplete = (chatId: string) => {\n\t\t\t\t\tif (currentMessage && currentMessage.chatId === chatId) {\n\t\t\t\t\t\tcurrentMessage = null\n\t\t\t\t\t\tisProcessing = false\n\t\t\t\t\t\tprocessNextMessage()\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// 保存消息处理器\n\t\t\t\tconst processorObj = {\n\t\t\t\t\tmessageQueue,\n\t\t\t\t\tisProcessing,\n\t\t\t\t\tcurrentMessage,\n\t\t\t\t\tprocessNextMessage,\n\t\t\t\t\thandleMessageComplete\n\t\t\t\t}\n\t\t\t\tcurrentMessageProcessor.value = processorObj\n\n\t\t\t\t// 开始处理消息队列\n\t\t\t\tprocessNextMessage()\n\t\t\t} else {\n\t\t\t\t// 插入默认AI回复\n\t\t\t\tconst defaultAiChatId = `ai_${Date.now()}`\n\t\t\t\tconst defaultAiMessage: ChatMessage = {\n\t\t\t\t\tchatId: defaultAiChatId,\n\t\t\t\t\tuser: 'ai',\n\t\t\t\t\ttype: 'text',\n\t\t\t\t\tcontent: unmatchText,\n\t\t\t\t\tisShowLike: true,\n\t\t\t\t\tisShowCopy: true,\n\t\t\t\t\tmsgList: []\n\t\t\t\t}\n\t\t\t\tchatList.value.push(defaultAiMessage)\n\t\t\t\temit('sendMessage', [...chatList.value])\n\t\t\t\tnextTick(() => {\n\t\t\t\t\tconst msgIndex = chatList.value.findIndex((item: any) => item.chatId === defaultAiChatId)\n\t\t\t\t\tif (msgIndex !== -1) {\n\t\t\t\t\t\trenderContent(defaultAiMessage.content, 'main', msgIndex)\n\t\t\t\t\t\tnextTick(() => {\n\t\t\t\t\t\t\tscrollToBottom()\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tinputValue.value = ''\n\t\t} else {\n\t\t\t// 无脚本模式,直接发送\n\t\t\tif (content) {\n\t\t\t\tinputValue.value = content\n\t\t\t}\n\t\t\tif ((isChating.value || (!inputValue.value.trim() && !fileList?.length)) && !auto) return\n\n\t\t\tconst userChatId = 'user_' + Math.random().toString(36).slice(2).padEnd(10, '0').slice(0, 10)\n\t\t\tconst userMessage: ChatMessage & ChatMsgList = {\n\t\t\t\tchatId: userChatId,\n\t\t\t\tuser: 'u',\n\t\t\t\ttype: 'text',\n\t\t\t\tcontent: inputValue.value,\n\t\t\t\tfiles: fileList || [],\n\t\t\t\tmsgList: [],\n\t\t\t\tisRead: false\n\t\t\t}\n\t\t\tchatList.value.push(userMessage)\n\t\t\tconst index = chatList.value.length - 1\n\t\t\tnextTick(() => {\n\t\t\t\trenderContent(userMessage.content, 'main', index)\n\t\t\t\tscrollToBottom()\n\t\t\t})\n\t\t\topenSSE(inputValue.value, index + 1, 1)\n\t\t\tinputValue.value = ''\n\t\t}\n\t}\n\n\t// 停止生成\n\tconst handleStop = (): void => {\n\t\tcleanupSSE()\n\n\t\tconst aiIndex = chatList.value.findIndex((item: any) => item.isChating)\n\t\tif (aiIndex !== -1) {\n\t\t\tconst currentAiMessage = chatList.value[aiIndex]\n\n\t\t\tif (currentAiMessage.content?.trim()) {\n\t\t\t\tnextTick(() => {\n\t\t\t\t\tchatList.value[aiIndex] = {\n\t\t\t\t\t\t...currentAiMessage,\n\t\t\t\t\t\tcontent: currentAiMessage.content + '...',\n\t\t\t\t\t\tisChating: false\n\t\t\t\t\t}\n\t\t\t\t\trenderContent(chatList.value[aiIndex].content, 'main', aiIndex)\n\t\t\t\t\temit('sendMessage', chatList.value)\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tif (aiIndex > 0) {\n\t\t\t\t\tconst userMessageIndex = aiIndex - 1\n\t\t\t\t\tif (chatList.value[userMessageIndex].user === 'u') {\n\t\t\t\t\t\tchatList.value.splice(userMessageIndex, 2)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchatList.value.splice(aiIndex, 1)\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tchatList.value.splice(aiIndex, 1)\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconst lastIndex = chatList.value.length - 1\n\t\t\tif (lastIndex >= 0 && chatList.value[lastIndex].user === 'u') {\n\t\t\t\tchatList.value.pop()\n\t\t\t}\n\t\t}\n\n\t\tisChating.value = false\n\t}\n\n\t// 处理消息操作\n\tconst handleMessageAction = (action: MessageAction, index: number): void => {\n\t\tconst message = chatList.value[index]\n\t\tif (!message) return\n\n\t\tswitch (action) {\n\t\t\tcase MessageAction.COPY: {\n\t\t\t\t// 使用复制功能\n\t\t\t\tcopyToClipboard(message.content, '复制成功', '复制失败')\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase MessageAction.EDIT:\n\t\t\t\tmessage.isEditing = true\n\t\t\t\tmessage.editContent = message.content\n\t\t\t\tbreak\n\t\t\tcase MessageAction.DELETE:\n\t\t\t\tmessageUtils.deleteMessageChain(index)\n\t\t\t\temit('sendMessage', chatList.value)\n\t\t\t\tbreak\n\t\t\tcase MessageAction.RETRY: {\n\t\t\t\tconst aiMessage = chatList.value[index]\n\t\t\t\tconst userMessageIndex = index - 1\n\t\t\t\tconst userMessage = chatList.value[userMessageIndex]\n\n\t\t\t\tif (userMessage && userMessage.user === 'u') {\n\t\t\t\t\tconst updatedAiMessage = {\n\t\t\t\t\t\t...aiMessage,\n\t\t\t\t\t\tcontent: '',\n\t\t\t\t\t\tthinkContent: '',\n\t\t\t\t\t\treasoningContent: '',\n\t\t\t\t\t\tisLiked: false,\n\t\t\t\t\t\tisDisliked: false,\n\t\t\t\t\t\tisChating: true,\n\t\t\t\t\t\tisRead: false,\n\t\t\t\t\t\tchatId: aiMessage.chatId,\n\t\t\t\t\t\tuser: aiMessage.user,\n\t\t\t\t\t\ttype: aiMessage.type,\n\t\t\t\t\t\tthinkStatus: ThinkStatus.COMPLETED,\n\t\t\t\t\t\tthinkStartTime: 0,\n\t\t\t\t\t\tthinkEndTime: 0\n\t\t\t\t\t}\n\t\t\t\t\tchatList.value.splice(index, 1, updatedAiMessage)\n\n\t\t\t\t\tnextTick(() => {\n\t\t\t\t\t\tif (htmlContentRef.value[index]) htmlContentRef.value[index].innerHTML = ''\n\t\t\t\t\t\tif (thinkingContentRef.value[index]) thinkingContentRef.value[index].innerHTML = ''\n\t\t\t\t\t\tif (reasoningContentRef.value[index]) reasoningContentRef.value[index].innerHTML = ''\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\topenSSE(userMessage.content || '', index, 1)\n\t\t\t\t\t\t}, 50)\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase MessageAction.LIKE:\n\t\t\t\tmessageUtils.updateMessage(index, {\n\t\t\t\t\tisLiked: true,\n\t\t\t\t\tisDisliked: false\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\tcase MessageAction.DISLIKE:\n\t\t\t\tmessageUtils.updateMessage(index, {\n\t\t\t\t\tisLiked: false,\n\t\t\t\t\tisDisliked: true\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\tcase MessageAction.WITHDRAW:\n\t\t\t\tconsole.log('withDraw')\n\t\t\t\tmessageUtils.updateMessage(index, {\n\t\t\t\t\tisWithDraw: true,\n\t\t\t\t\tuser: 'withDraw'\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\t// 保存编辑\n\tconst saveEdit = (index: number, newContent: string): void => {\n\t\tconst message = chatList.value[index]\n\t\tif (!message || !message.editContent) return\n\n\t\tchatList.value[index] = {\n\t\t\t...message,\n\t\t\tcontent: newContent,\n\t\t\tisEditing: false,\n\t\t\teditContent: undefined\n\t\t}\n\t\tnextTick(() => {\n\t\t\trenderContent(newContent, 'main', index)\n\t\t})\n\n\t\t// 删除后续的AI回复(如果有)\n\t\tconst hasDeletedAi = index + 1 < chatList.value.length && chatList.value[index + 1].user === 'ai'\n\t\tif (hasDeletedAi) {\n\t\t\tchatList.value.splice(index + 1, 1)\n\t\t}\n\n\t\t// 计算插入新AI消息的位置\n\t\t// 无论是否删除了AI消息,插入位置都是 index + 1\n\t\tconst insertPosition = index + 1\n\t\t// console.log('saveEdit调用openSSE,index:', index, 'insertPosition:', insertPosition, 'newContent:', newContent)\n\n\t\t// 等待下一个tick,确保Vue已经更新了DOM和refs\n\t\tnextTick(() => {\n\t\t\topenSSE(newContent, insertPosition, 1)\n\t\t})\n\t\temit('sendMessage', chatList.value)\n\t}\n\n\t// 取消编辑\n\tconst cancelEdit = (index: number): void => {\n\t\tconst message = chatList.value[index]\n\t\tif (!message) return\n\n\t\tmessage.isEditing = false\n\t\tmessage.editContent = ''\n\t\tnextTick(() => {\n\t\t\trenderContent(message.content, 'main', index)\n\t\t})\n\t}\n\n\t// 处理拖拽事件\n\tconst handleDragEnter = () => {\n\t\tisDragging.value = true\n\t\t// 打开标记层以显示拖拽区域\n\t\tif (chatInputRef?.value) {\n\t\t\tchatInputRef.value.openMarkLayer()\n\t\t}\n\t}\n\n\tconst handleDragLeave = (e: DragEvent) => {\n\t\tconst rect = (e.target as HTMLElement).getBoundingClientRect()\n\t\tif (e.clientX < rect.left || e.clientX > rect.right || e.clientY < rect.top || e.clientY > rect.bottom) {\n\t\t\tisDragging.value = false\n\t\t}\n\t}\n\n\tconst handleDrop = async (e: DragEvent) => {\n\t\tisDragging.value = false\n\n\t\t// 获取拖拽的文件\n\t\tconst files = e.dataTransfer?.files\n\t\tif (files && files.length > 0) {\n\t\t\tconst fileList = await Promise.all(\n\t\t\t\tArray.from(files).map(async file => {\n\t\t\t\t\tlet base64 = ''\n\t\t\t\t\tif (file.type.startsWith('image/')) {\n\t\t\t\t\t\tbase64 = await new Promise(resolve => {\n\t\t\t\t\t\t\tconst reader = new FileReader()\n\t\t\t\t\t\t\treader.onload = e => {\n\t\t\t\t\t\t\t\tresolve(e.target?.result as string)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treader.readAsDataURL(file)\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: Math.random().toString(36).slice(2).padEnd(10, '0').slice(0, 10),\n\t\t\t\t\t\tfile: file,\n\t\t\t\t\t\tname: file.name,\n\t\t\t\t\t\tfileType: file.type,\n\t\t\t\t\t\tfileSize: file.size,\n\t\t\t\t\t\tlastModified: file.lastModified,\n\t\t\t\t\t\tpreview: URL.createObjectURL(file),\n\t\t\t\t\t\tbase64\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t)\n\t\t\t// 调用 ChatInput 的 handlePaste 方法处理拖拽的文件\n\t\t\tif (chatInputRef?.value) {\n\t\t\t\tchatInputRef.value.handlePaste(fileList, 'drop')\n\t\t\t}\n\t\t}\n\n\t\t// 关闭标记层\n\t\tif (chatInputRef?.value) {\n\t\t\tchatInputRef.value.colseMarkLayer()\n\t\t}\n\t}\n\n\t// 组件生命周期\n\tconst onMounted = () => {\n\t\tif (!isMounted.value) {\n\t\t\tinit()\n\t\t}\n\t\tisMounted.value = true\n\t}\n\n\tconst onBeforeUnmount = () => {\n\t\tif (!isUnmounting.value) {\n\t\t\tisUnmounting.value = true\n\t\t\tcleanupSSE()\n\t\t\tisMounted.value = false\n\t\t}\n\t}\n\n\treturn {\n\t\t// 状态\n\t\tchatList,\n\t\tisChating,\n\t\tinputValue,\n\t\tenableDeepThinking,\n\t\tisMounted,\n\t\tisUnmounting,\n\t\tcurrentComponentName,\n\t\tfileData,\n\t\tactiveAgentsName,\n\t\tmoduleInfo,\n\t\tisDragging,\n\t\ttypeFlag,\n\t\tcurrIndex,\n\t\tfetchStream,\n\t\tresultItem,\n\t\tcurrentMessageProcessor,\n\t\tactiveScript,\n\t\thtmlContentRef,\n\t\tthinkingContentRef,\n\t\treasoningContentRef,\n\t\t// 方法\n\t\tinit,\n\t\tsendMessage,\n\t\thandleBeforeSend,\n\t\thandleSend,\n\t\thandleStop,\n\t\thandleMessageAction,\n\t\tsaveEdit,\n\t\tcancelEdit,\n\t\tcompleteRendered,\n\t\thandleAgentSelect,\n\t\tupdate,\n\t\tupdateModule,\n\t\tmessageUtils,\n\t\tsimulateStreamOutput,\n\t\thandleDragEnter,\n\t\thandleDragLeave,\n\t\thandleDrop,\n\t\tonMounted,\n\t\tonBeforeUnmount,\n\t\tcleanupSSE,\n\t\tscrollToBottom,\n\t\thandleScroll,\n\t\trenderContent,\n\t\tenqueueRender\n\t}\n}\n"],"names":["content","e","_a"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCopy.mjs","sources":["../../../../../../../../packages/components/touchchat/src/AiChat/Chat/useCopy.ts"],"sourcesContent":["import { showToast } from '../../../utils/tools'\
|
|
1
|
+
{"version":3,"file":"useCopy.mjs","sources":["../../../../../../../../packages/components/touchchat/src/AiChat/Chat/useCopy.ts"],"sourcesContent":["import { showToast } from '../../../utils/tools'\n\n/**\n * 复制功能 composable\n * 提供统一的复制到剪贴板功能,支持现代浏览器和降级方案\n */\nexport function useCopy() {\n\t/**\n\t * 复制文本到剪贴板\n\t * @param text - 要复制的文本内容\n\t * @param successMsg - 成功时的提示消息,默认 '复制成功'\n\t * @param errorMsg - 失败时的提示消息,默认 '复制失败'\n\t */\n\tconst copyToClipboard = (text: string, successMsg: string = '复制成功', errorMsg: string = '复制失败'): void => {\n\t\tif (!text) {\n\t\t\tshowToast('复制内容为空', 'warning')\n\t\t\treturn\n\t\t}\n\n\t\t// 优先使用 Clipboard API\n\t\tif (navigator.clipboard && window.isSecureContext) {\n\t\t\tnavigator.clipboard\n\t\t\t\t.writeText(text)\n\t\t\t\t.then(() => {\n\t\t\t\t\tshowToast(successMsg, 'info')\n\t\t\t\t})\n\t\t\t\t.catch(err => {\n\t\t\t\t\tconsole.error('复制失败:', err)\n\t\t\t\t\tfallbackCopy(text, successMsg, errorMsg)\n\t\t\t\t})\n\t\t} else {\n\t\t\t// 降级方案:使用传统的复制方法\n\t\t\tfallbackCopy(text, successMsg, errorMsg)\n\t\t}\n\t}\n\n\t/**\n\t * 降级复制方案 (使用 textarea)\n\t */\n\tconst fallbackCopy = (text: string, successMsg: string, errorMsg: string): void => {\n\t\tconst textArea = document.createElement('textarea')\n\t\ttextArea.value = text\n\t\ttextArea.style.position = 'fixed'\n\t\ttextArea.style.left = '-999999px'\n\t\ttextArea.style.top = '-999999px'\n\t\tdocument.body.appendChild(textArea)\n\t\ttextArea.focus()\n\t\ttextArea.select()\n\n\t\ttry {\n\t\t\tconst successful = document.execCommand('copy')\n\t\t\tshowToast(successful ? successMsg : errorMsg, successful ? 'info' : 'error')\n\t\t} catch (err) {\n\t\t\tconsole.error('复制失败:', err)\n\t\t\tshowToast(errorMsg, 'error')\n\t\t} finally {\n\t\t\tdocument.body.removeChild(textArea)\n\t\t}\n\t}\n\n\t/**\n\t * 带按钮反馈的复制功能(用于代码块复制按钮)\n\t * @param text - 要复制的文本\n\t * @param button - 复制按钮元素,用于显示\"已复制\"状态\n\t * @param originalText - 按钮原始文本\n\t * @param copiedText - 复制成功后的文本,默认 '已复制'\n\t * @param duration - 显示成功文本的时长(ms),默认 2000\n\t */\n\tconst copyWithFeedback = (text: string, button: HTMLElement, originalText: string = '', copiedText: string = '已复制', duration: number = 2000): void => {\n\t\tif (!text) return\n\n\t\tcopyToClipboard(text, '', '')\n\n\t\t// 显示反馈\n\t\tbutton.textContent = copiedText\n\t\tsetTimeout(() => {\n\t\t\tbutton.textContent = originalText\n\t\t}, duration)\n\t}\n\n\treturn {\n\t\tcopyToClipboard,\n\t\tcopyWithFeedback\n\t}\n}\n"],"names":[],"mappings":";;AAMO,SAAS,OAAU,GAAA;AAOzB,EAAA,MAAM,kBAAkB,CAAC,IAAA,EAAc,UAAqB,GAAA,0BAAA,EAAQ,WAAmB,0BAAiB,KAAA;AACvG,IAAA,IAAI,CAAC,IAAM,EAAA;AACV,MAAA,SAAA,CAAU,wCAAU,SAAS,CAAA,CAAA;AAC7B,MAAA,OAAA;AAAA,KACD;AAGA,IAAI,IAAA,SAAA,CAAU,SAAa,IAAA,MAAA,CAAO,eAAiB,EAAA;AAClD,MAAA,SAAA,CAAU,SACR,CAAA,SAAA,CAAU,IAAI,CAAA,CACd,KAAK,MAAM;AACX,QAAA,SAAA,CAAU,YAAY,MAAM,CAAA,CAAA;AAAA,OAC5B,CACA,CAAA,KAAA,CAAM,CAAO,GAAA,KAAA;AACb,QAAQ,OAAA,CAAA,KAAA,CAAM,6BAAS,GAAG,CAAA,CAAA;AAC1B,QAAa,YAAA,CAAA,IAAA,EAAM,YAAY,QAAQ,CAAA,CAAA;AAAA,OACvC,CAAA,CAAA;AAAA,KACI,MAAA;AAEN,MAAa,YAAA,CAAA,IAAA,EAAM,YAAY,QAAQ,CAAA,CAAA;AAAA,KACxC;AAAA,GACD,CAAA;AAKA,EAAA,MAAM,YAAe,GAAA,CAAC,IAAc,EAAA,UAAA,EAAoB,QAA2B,KAAA;AAClF,IAAM,MAAA,QAAA,GAAW,QAAS,CAAA,aAAA,CAAc,UAAU,CAAA,CAAA;AAClD,IAAA,QAAA,CAAS,KAAQ,GAAA,IAAA,CAAA;AACjB,IAAA,QAAA,CAAS,MAAM,QAAW,GAAA,OAAA,CAAA;AAC1B,IAAA,QAAA,CAAS,MAAM,IAAO,GAAA,WAAA,CAAA;AACtB,IAAA,QAAA,CAAS,MAAM,GAAM,GAAA,WAAA,CAAA;AACrB,IAAS,QAAA,CAAA,IAAA,CAAK,YAAY,QAAQ,CAAA,CAAA;AAClC,IAAA,QAAA,CAAS,KAAM,EAAA,CAAA;AACf,IAAA,QAAA,CAAS,MAAO,EAAA,CAAA;AAEhB,IAAI,IAAA;AACH,MAAM,MAAA,UAAA,GAAa,QAAS,CAAA,WAAA,CAAY,MAAM,CAAA,CAAA;AAC9C,MAAA,SAAA,CAAU,UAAa,GAAA,UAAA,GAAa,QAAU,EAAA,UAAA,GAAa,SAAS,OAAO,CAAA,CAAA;AAAA,aACnE,GAAP,EAAA;AACD,MAAQ,OAAA,CAAA,KAAA,CAAM,6BAAS,GAAG,CAAA,CAAA;AAC1B,MAAA,SAAA,CAAU,UAAU,OAAO,CAAA,CAAA;AAAA,KAC1B,SAAA;AACD,MAAS,QAAA,CAAA,IAAA,CAAK,YAAY,QAAQ,CAAA,CAAA;AAAA,KACnC;AAAA,GACD,CAAA;AAUA,EAAM,MAAA,gBAAA,GAAmB,CAAC,IAAc,EAAA,MAAA,EAAqB,eAAuB,EAAI,EAAA,UAAA,GAAqB,oBAAO,EAAA,QAAA,GAAmB,GAAe,KAAA;AACrJ,IAAA,IAAI,CAAC,IAAA;AAAM,MAAA,OAAA;AAEX,IAAgB,eAAA,CAAA,IAAA,EAAM,IAAI,EAAE,CAAA,CAAA;AAG5B,IAAA,MAAA,CAAO,WAAc,GAAA,UAAA,CAAA;AACrB,IAAA,UAAA,CAAW,MAAM;AAChB,MAAA,MAAA,CAAO,WAAc,GAAA,YAAA,CAAA;AAAA,OACnB,QAAQ,CAAA,CAAA;AAAA,GACZ,CAAA;AAEA,EAAO,OAAA;AAAA,IACN,eAAA;AAAA,IACA,gBAAA;AAAA,GACD,CAAA;AACD;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMessageRender.mjs","sources":["../../../../../../../../packages/components/touchchat/src/AiChat/Chat/useMessageRender.ts"],"sourcesContent":["/**\r\n * 消息渲染相关逻辑 Composable\r\n */\r\n\r\nimport { ref, type Ref, nextTick } from 'vue'\r\nimport type { ChatMessage, RenderData } from './types'\r\nimport markdown from '../../../utils/markdown.ts'\r\nimport DOMPurify from 'dompurify'\r\nimport { useCopy } from './useCopy'\r\n\r\nexport interface UseMessageRenderOptions {\r\n\tchatList: Ref<ChatMessage[]>\r\n\tcurrIndex: Ref<number>\r\n\tisMounted: Ref<boolean>\r\n\tisUnmounting: Ref<boolean>\r\n}\r\n\r\nexport function useMessageRender({ chatList, currIndex, isMounted, isUnmounting }: UseMessageRenderOptions) {\r\n\tconst htmlContentRef = ref<(HTMLElement | null)[]>([])\r\n\tconst thinkingContentRef = ref<(HTMLElement | null)[]>([])\r\n\tconst reasoningContentRef = ref<(HTMLElement | null)[]>([])\r\n\tconst renderQueue = ref<RenderData[]>([])\r\n\tconst isRendering = ref(false)\r\n\r\n\t// 复制功能 composable\r\n\tconst { copyWithFeedback } = useCopy()\r\n\r\n\t// Markdown转HTML\r\n\tconst markdownToHtml = (markdownContent: string): string => {\r\n\t\treturn markdown?.render(markdownContent, { isReasoning: false }) || ''\r\n\t}\r\n\r\n\t// 附加复制按钮\r\n\tconst attachCopyButtons = (container: HTMLElement): void => {\r\n\t\tconst codeBlocks = container.querySelectorAll('pre code')\r\n\t\tcodeBlocks.forEach(codeBlock => {\r\n\t\t\tconst pre = codeBlock.parentElement\r\n\t\t\tif (pre) {\r\n\t\t\t\tconst copyBtn = document.createElement('button')\r\n\t\t\t\tcopyBtn.className = 'touchchat-code-copy'\r\n\t\t\t\tcopyBtn.addEventListener('click', () => {\r\n\t\t\t\t\tconst code = codeBlock.textContent || ''\r\n\t\t\t\t\tcopyWithFeedback(code, copyBtn, '', '已复制', 2000)\r\n\t\t\t\t})\r\n\r\n\t\t\t\tpre.style.position = 'relative'\r\n\t\t\t\tpre.appendChild(copyBtn)\r\n\t\t\t}\r\n\t\t})\r\n\t}\r\n\r\n\t// 渲染内容\r\n\tconst renderContent = (content: string, type: 'main' | 'thinking' | 'reasoning', index?: number): void => {\r\n\t\tconst renderIndex = index ?? currIndex.value\r\n\t\tif (renderIndex < 0 || renderIndex >= chatList.value.length) return\r\n\r\n\t\tconst refArrays = {\r\n\t\t\tmain: htmlContentRef,\r\n\t\t\tthinking: thinkingContentRef,\r\n\t\t\treasoning: reasoningContentRef\r\n\t\t}\r\n\t\tconst processors = {\r\n\t\t\tmain: (content: string) => markdown?.render(content, { isReasoning: false }) || '',\r\n\t\t\tthinking: (content: string) => markdown?.render(content, { isReasoning: false }) || '',\r\n\t\t\treasoning: (content: string) => markdown?.render(content, { isReasoning: true }) || ''\r\n\t\t}\r\n\r\n\t\tconst container = refArrays[type].value[renderIndex]\r\n\t\tif (!container) return\r\n\r\n\t\tconst rawHtml = processors[type](content || '')\r\n\t\t// 使用 DOMPurify 进行 XSS 防护\r\n\t\tconst sanitizedContent = DOMPurify.sanitize(rawHtml)\r\n\t\t// 使用 DOMParser 安全地解析 HTML\r\n\t\tconst parser = new DOMParser()\r\n\t\tconst doc = parser.parseFromString(sanitizedContent, 'text/html')\r\n\t\tconst fragment = doc.createRange().createContextualFragment(sanitizedContent)\r\n\t\t// 安全地设置内容\r\n\t\tcontainer.textContent = ''\r\n\t\tcontainer.appendChild(fragment)\r\n\t\tattachCopyButtons(container)\r\n\t}\r\n\r\n\t// 渲染队列\r\n\tconst enqueueRender = (data: RenderData): void => {\r\n\t\tif (isUnmounting.value || !isMounted.value) return\r\n\t\tif (currIndex.value < 0 || currIndex.value >= chatList.value.length) return\r\n\t\trenderQueue.value.push(data)\r\n\t\tif (!isRendering.value) {\r\n\t\t\tisRendering.value = true\r\n\t\t\tprocessRenderQueue()\r\n\t\t}\r\n\t}\r\n\r\n\tconst processRenderQueue = (): void => {\r\n\t\tif (isUnmounting.value || !isMounted.value) {\r\n\t\t\trenderQueue.value = []\r\n\t\t\tisRendering.value = false\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tif (renderQueue.value.length === 0) {\r\n\t\t\tisRendering.value = false\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\trequestAnimationFrame(() => {\r\n\t\t\tconst data = renderQueue.value.shift()\r\n\t\t\tif (data) {\r\n\t\t\t\tformatMarkdown(data)\r\n\t\t\t}\r\n\t\t\tprocessRenderQueue()\r\n\t\t})\r\n\t}\r\n\r\n\t// 格式化Markdown内容\r\n\tconst formatMarkdown = (data: RenderData): void => {\r\n\t\tif (!isMounted.value) return\r\n\t\tif (currIndex.value < 0 || currIndex.value >= chatList.value.length) return\r\n\r\n\t\tconst currentItem = chatList.value[currIndex.value]\r\n\t\t// 如果是错误消息,不更新content\r\n\t\tif (!currentItem.isError) {\r\n\t\t\tcurrentItem.thinkContent = data.thinkContent\r\n\t\t\tcurrentItem.content = data.mainContent\r\n\t\t\tcurrentItem.reasoningContent = data.reasoningContent\r\n\t\t}\r\n\r\n\t\tnextTick(() => {\r\n\t\t\tconst thinkingContainer = thinkingContentRef.value[currIndex.value]\r\n\t\t\tif (thinkingContainer) {\r\n\t\t\t\tif (data.thinkContent && !currentItem.isError) {\r\n\t\t\t\t\trenderContent(data.thinkContent, 'thinking')\r\n\t\t\t\t\tthinkingContainer.style.display = 'block'\r\n\t\t\t\t\tthinkingContainer.style.visibility = 'visible'\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthinkingContainer.style.display = 'none'\r\n\t\t\t\t\tthinkingContainer.style.visibility = 'hidden'\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tconst reasoningContainer = reasoningContentRef.value[currIndex.value]\r\n\t\t\tif (reasoningContainer) {\r\n\t\t\t\tif (data.reasoningContent && !currentItem.isError) {\r\n\t\t\t\t\trenderContent(data.reasoningContent, 'reasoning')\r\n\t\t\t\t\treasoningContainer.style.display = 'block'\r\n\t\t\t\t\treasoningContainer.style.visibility = 'visible'\r\n\t\t\t\t} else {\r\n\t\t\t\t\treasoningContainer.style.display = 'none'\r\n\t\t\t\t\treasoningContainer.style.visibility = 'hidden'\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// 如果是错误消息,使用currentItem.content,否则使用data.mainContent\r\n\t\t\trenderContent(currentItem.isError ? currentItem.content : data.mainContent, 'main')\r\n\t\t})\r\n\t}\r\n\r\n\t// 清理渲染相关引用\r\n\tconst cleanupRenderRefs = () => {\r\n\t\trenderQueue.value = []\r\n\t\thtmlContentRef.value = []\r\n\t\tthinkingContentRef.value = []\r\n\t\treasoningContentRef.value = []\r\n\t}\r\n\r\n\treturn {\r\n\t\thtmlContentRef,\r\n\t\tthinkingContentRef,\r\n\t\treasoningContentRef,\r\n\t\trenderQueue,\r\n\t\tisRendering,\r\n\t\tmarkdownToHtml,\r\n\t\trenderContent,\r\n\t\tenqueueRender,\r\n\t\tformatMarkdown,\r\n\t\tcleanupRenderRefs\r\n\t}\r\n}\r\n"],"names":["content","DOMPurify"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useMessageRender.mjs","sources":["../../../../../../../../packages/components/touchchat/src/AiChat/Chat/useMessageRender.ts"],"sourcesContent":["/**\n * 消息渲染相关逻辑 Composable\n */\n\nimport { ref, type Ref, nextTick } from 'vue'\nimport type { ChatMessage, RenderData } from './types'\nimport markdown from '../../../utils/markdown.ts'\nimport DOMPurify from 'dompurify'\nimport { useCopy } from './useCopy'\n\nexport interface UseMessageRenderOptions {\n\tchatList: Ref<ChatMessage[]>\n\tcurrIndex: Ref<number>\n\tisMounted: Ref<boolean>\n\tisUnmounting: Ref<boolean>\n}\n\nexport function useMessageRender({ chatList, currIndex, isMounted, isUnmounting }: UseMessageRenderOptions) {\n\tconst htmlContentRef = ref<(HTMLElement | null)[]>([])\n\tconst thinkingContentRef = ref<(HTMLElement | null)[]>([])\n\tconst reasoningContentRef = ref<(HTMLElement | null)[]>([])\n\tconst renderQueue = ref<RenderData[]>([])\n\tconst isRendering = ref(false)\n\n\t// 复制功能 composable\n\tconst { copyWithFeedback } = useCopy()\n\n\t// Markdown转HTML\n\tconst markdownToHtml = (markdownContent: string): string => {\n\t\treturn markdown?.render(markdownContent, { isReasoning: false }) || ''\n\t}\n\n\t// 附加复制按钮\n\tconst attachCopyButtons = (container: HTMLElement): void => {\n\t\tconst codeBlocks = container.querySelectorAll('pre code')\n\t\tcodeBlocks.forEach(codeBlock => {\n\t\t\tconst pre = codeBlock.parentElement\n\t\t\tif (pre) {\n\t\t\t\tconst copyBtn = document.createElement('button')\n\t\t\t\tcopyBtn.className = 'touchchat-code-copy'\n\t\t\t\tcopyBtn.addEventListener('click', () => {\n\t\t\t\t\tconst code = codeBlock.textContent || ''\n\t\t\t\t\tcopyWithFeedback(code, copyBtn, '', '已复制', 2000)\n\t\t\t\t})\n\n\t\t\t\tpre.style.position = 'relative'\n\t\t\t\tpre.appendChild(copyBtn)\n\t\t\t}\n\t\t})\n\t}\n\n\t// 渲染内容\n\tconst renderContent = (content: string, type: 'main' | 'thinking' | 'reasoning', index?: number): void => {\n\t\tconst renderIndex = index ?? currIndex.value\n\t\tif (renderIndex < 0 || renderIndex >= chatList.value.length) return\n\n\t\tconst refArrays = {\n\t\t\tmain: htmlContentRef,\n\t\t\tthinking: thinkingContentRef,\n\t\t\treasoning: reasoningContentRef\n\t\t}\n\t\tconst processors = {\n\t\t\tmain: (content: string) => markdown?.render(content, { isReasoning: false }) || '',\n\t\t\tthinking: (content: string) => markdown?.render(content, { isReasoning: false }) || '',\n\t\t\treasoning: (content: string) => markdown?.render(content, { isReasoning: true }) || ''\n\t\t}\n\n\t\tconst container = refArrays[type].value[renderIndex]\n\t\tif (!container) return\n\n\t\tconst rawHtml = processors[type](content || '')\n\t\t// 使用 DOMPurify 进行 XSS 防护\n\t\tconst sanitizedContent = DOMPurify.sanitize(rawHtml)\n\t\t// 使用 DOMParser 安全地解析 HTML\n\t\tconst parser = new DOMParser()\n\t\tconst doc = parser.parseFromString(sanitizedContent, 'text/html')\n\t\tconst fragment = doc.createRange().createContextualFragment(sanitizedContent)\n\t\t// 安全地设置内容\n\t\tcontainer.textContent = ''\n\t\tcontainer.appendChild(fragment)\n\t\tattachCopyButtons(container)\n\t}\n\n\t// 渲染队列\n\tconst enqueueRender = (data: RenderData): void => {\n\t\tif (isUnmounting.value || !isMounted.value) return\n\t\tif (currIndex.value < 0 || currIndex.value >= chatList.value.length) return\n\t\trenderQueue.value.push(data)\n\t\tif (!isRendering.value) {\n\t\t\tisRendering.value = true\n\t\t\tprocessRenderQueue()\n\t\t}\n\t}\n\n\tconst processRenderQueue = (): void => {\n\t\tif (isUnmounting.value || !isMounted.value) {\n\t\t\trenderQueue.value = []\n\t\t\tisRendering.value = false\n\t\t\treturn\n\t\t}\n\n\t\tif (renderQueue.value.length === 0) {\n\t\t\tisRendering.value = false\n\t\t\treturn\n\t\t}\n\n\t\trequestAnimationFrame(() => {\n\t\t\tconst data = renderQueue.value.shift()\n\t\t\tif (data) {\n\t\t\t\tformatMarkdown(data)\n\t\t\t}\n\t\t\tprocessRenderQueue()\n\t\t})\n\t}\n\n\t// 格式化Markdown内容\n\tconst formatMarkdown = (data: RenderData): void => {\n\t\tif (!isMounted.value) return\n\t\tif (currIndex.value < 0 || currIndex.value >= chatList.value.length) return\n\n\t\tconst currentItem = chatList.value[currIndex.value]\n\t\t// 如果是错误消息,不更新content\n\t\tif (!currentItem.isError) {\n\t\t\tcurrentItem.thinkContent = data.thinkContent\n\t\t\tcurrentItem.content = data.mainContent\n\t\t\tcurrentItem.reasoningContent = data.reasoningContent\n\t\t}\n\n\t\tnextTick(() => {\n\t\t\tconst thinkingContainer = thinkingContentRef.value[currIndex.value]\n\t\t\tif (thinkingContainer) {\n\t\t\t\tif (data.thinkContent && !currentItem.isError) {\n\t\t\t\t\trenderContent(data.thinkContent, 'thinking')\n\t\t\t\t\tthinkingContainer.style.display = 'block'\n\t\t\t\t\tthinkingContainer.style.visibility = 'visible'\n\t\t\t\t} else {\n\t\t\t\t\tthinkingContainer.style.display = 'none'\n\t\t\t\t\tthinkingContainer.style.visibility = 'hidden'\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst reasoningContainer = reasoningContentRef.value[currIndex.value]\n\t\t\tif (reasoningContainer) {\n\t\t\t\tif (data.reasoningContent && !currentItem.isError) {\n\t\t\t\t\trenderContent(data.reasoningContent, 'reasoning')\n\t\t\t\t\treasoningContainer.style.display = 'block'\n\t\t\t\t\treasoningContainer.style.visibility = 'visible'\n\t\t\t\t} else {\n\t\t\t\t\treasoningContainer.style.display = 'none'\n\t\t\t\t\treasoningContainer.style.visibility = 'hidden'\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// 如果是错误消息,使用currentItem.content,否则使用data.mainContent\n\t\t\trenderContent(currentItem.isError ? currentItem.content : data.mainContent, 'main')\n\t\t})\n\t}\n\n\t// 清理渲染相关引用\n\tconst cleanupRenderRefs = () => {\n\t\trenderQueue.value = []\n\t\thtmlContentRef.value = []\n\t\tthinkingContentRef.value = []\n\t\treasoningContentRef.value = []\n\t}\n\n\treturn {\n\t\thtmlContentRef,\n\t\tthinkingContentRef,\n\t\treasoningContentRef,\n\t\trenderQueue,\n\t\tisRendering,\n\t\tmarkdownToHtml,\n\t\trenderContent,\n\t\tenqueueRender,\n\t\tformatMarkdown,\n\t\tcleanupRenderRefs\n\t}\n}\n"],"names":["content","DOMPurify"],"mappings":"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"}
|
|
@@ -107,6 +107,7 @@ function useSSE({ chatList, currIndex, isChating, isMounted, isUnmounting, enabl
|
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
109
|
} else if (respoKey) {
|
|
110
|
+
console.log("\u6765\u4E86\u6CA1\u6709", result[respoKey.content]);
|
|
110
111
|
if (result) {
|
|
111
112
|
if (result.type === "markdown") {
|
|
112
113
|
const mapKey = `markdown_${result.order}`;
|
|
@@ -131,7 +132,7 @@ function useSSE({ chatList, currIndex, isChating, isMounted, isUnmounting, enabl
|
|
|
131
132
|
msgs: result.msgs ? [...result.msgs] : []
|
|
132
133
|
});
|
|
133
134
|
}
|
|
134
|
-
} else {
|
|
135
|
+
} else if (result.type) {
|
|
135
136
|
const mapKey = `${result.type}_${result.order}`;
|
|
136
137
|
aiContentList.push({ mapKey, ...result });
|
|
137
138
|
}
|