@touchvue/chat 1.0.0-beta.55 → 1.0.0-beta.56

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/es/package.json.mjs +1 -1
  2. package/es/packages/components/touchchat/component/UploadView.vue2.mjs +2 -2
  3. package/es/packages/components/touchchat/component/UploadView.vue2.mjs.map +1 -1
  4. package/es/packages/components/touchchat/src/AiChat/Chat/useChat.mjs +0 -37
  5. package/es/packages/components/touchchat/src/AiChat/Chat/useChat.mjs.map +1 -1
  6. package/es/packages/components/touchchat/src/AiChat/Chat/useSSE.mjs +16 -9
  7. package/es/packages/components/touchchat/src/AiChat/Chat/useSSE.mjs.map +1 -1
  8. package/es/packages/components/touchchat/src/AiChat/ChatInput.vue2.mjs +11 -3
  9. package/es/packages/components/touchchat/src/AiChat/ChatInput.vue2.mjs.map +1 -1
  10. package/es/packages/components/touchchat/src/AiChat/TouchAgent.vue2.mjs +54 -12
  11. package/es/packages/components/touchchat/src/AiChat/TouchAgent.vue2.mjs.map +1 -1
  12. package/es/packages/components/touchchat/src/index.vue2.mjs +6 -1
  13. package/es/packages/components/touchchat/src/index.vue2.mjs.map +1 -1
  14. package/es/packages/components/touchchat/utils/a2aService.mjs +58 -15
  15. package/es/packages/components/touchchat/utils/a2aService.mjs.map +1 -1
  16. package/es/packages/components/touchchat/utils/markdown.mjs +21 -4
  17. package/es/packages/components/touchchat/utils/markdown.mjs.map +1 -1
  18. package/es/packages/components/touchchat/utils/tools.mjs +4 -4
  19. package/es/packages/components/touchchat/utils/tools.mjs.map +1 -1
  20. package/lib/package.json.js +1 -1
  21. package/lib/packages/components/touchchat/component/UploadView.vue2.js +2 -2
  22. package/lib/packages/components/touchchat/component/UploadView.vue2.js.map +1 -1
  23. package/lib/packages/components/touchchat/src/AiChat/Chat/useChat.js +0 -37
  24. package/lib/packages/components/touchchat/src/AiChat/Chat/useChat.js.map +1 -1
  25. package/lib/packages/components/touchchat/src/AiChat/Chat/useSSE.js +16 -9
  26. package/lib/packages/components/touchchat/src/AiChat/Chat/useSSE.js.map +1 -1
  27. package/lib/packages/components/touchchat/src/AiChat/ChatInput.vue2.js +10 -2
  28. package/lib/packages/components/touchchat/src/AiChat/ChatInput.vue2.js.map +1 -1
  29. package/lib/packages/components/touchchat/src/AiChat/TouchAgent.vue2.js +54 -12
  30. package/lib/packages/components/touchchat/src/AiChat/TouchAgent.vue2.js.map +1 -1
  31. package/lib/packages/components/touchchat/src/index.vue2.js +6 -1
  32. package/lib/packages/components/touchchat/src/index.vue2.js.map +1 -1
  33. package/lib/packages/components/touchchat/utils/a2aService.js +58 -15
  34. package/lib/packages/components/touchchat/utils/a2aService.js.map +1 -1
  35. package/lib/packages/components/touchchat/utils/markdown.js +21 -4
  36. package/lib/packages/components/touchchat/utils/markdown.js.map +1 -1
  37. package/lib/packages/components/touchchat/utils/tools.js +4 -4
  38. package/lib/packages/components/touchchat/utils/tools.js.map +1 -1
  39. package/package.json +83 -83
@@ -1,5 +1,5 @@
1
1
  var name = "@touchvue/chat";
2
- var version = "1.0.0-beta.55";
2
+ var version = "1.0.0-beta.56";
3
3
  var description = "TouchVue Chat Component Library";
4
4
  var main = "lib/index.js";
5
5
  var module = "es/index.mjs";
@@ -27,11 +27,11 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
27
27
  const file = input.files[i];
28
28
  const exists = fileInfos.value.some((f) => f.name === file.name && f.fileSize === formatFileSize(file.size));
29
29
  if (exists) {
30
- showToast(`\u6587\u4EF6"${file.name}"\u5DF2\u5B58\u5728`, "info", 3e3);
30
+ showToast(`\u6587\u4EF6"${file.name}"\u5DF2\u5B58\u5728`, "warning", 3e3);
31
31
  continue;
32
32
  }
33
33
  if (!isFileTypeAllowed(file) && types.value.length > 0) {
34
- showToast(`\u6587\u4EF6\u7C7B\u578B${file.type}\u4E0D\u5141\u8BB8\u4E0A\u4F20\uFF0C\u8BF7\u4E0A\u4F20${types.value.join("\u3001")}\u7C7B\u578B\u6587\u4EF6`, "info", 3e3);
34
+ showToast(`\u6587\u4EF6\u7C7B\u578B${file.type}\u4E0D\u5141\u8BB8\u4E0A\u4F20\uFF0C\u8BF7\u4E0A\u4F20${types.value.join("\u3001")}\u7C7B\u578B\u6587\u4EF6`, "warning", 3e3);
35
35
  continue;
36
36
  }
37
37
  if (file.type.startsWith("image/")) {
@@ -1 +1 @@
1
- {"version":3,"file":"UploadView.vue2.mjs","sources":["../../../../../../packages/components/touchchat/component/UploadView.vue"],"sourcesContent":["<template>\r\n\t<div class=\"upload-view\">\r\n\t\t<!-- <button class=\"upload-button\" @click=\"triggerFileInput\">点击选择文件</button> -->\r\n\t\t<div @click=\"triggerFileInput\">\r\n\t\t\t<slot></slot>\r\n\t\t</div>\r\n\t\t<input ref=\"fileInput\" type=\"file\" class=\"file-input\" style=\"display: none\" multiple @change=\"handleFileChange\" />\r\n\t</div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref, inject } from 'vue'\r\nimport { showToast } from '../utils/tools'\r\nimport type { FileItem } from '../src/AiChat/Chat/types'\r\n\r\ntype UploadActionFn = (file: File, onProgress: (percent: number) => void) => Promise<any>\r\n\r\nconst uploadAction = inject<UploadActionFn | null>('uploadAction', null)\r\n\r\nconst props = defineProps<{\r\n\tfileList: FileItem[]\r\n}>()\r\n\r\nconst emit = defineEmits<{\r\n\t(e: 'upload-file', value: FileItem[]): void\r\n}>()\r\n\r\nconst fileInput = ref<HTMLInputElement | null>(null)\r\nconst fileInfos = ref<FileItem[]>(props.fileList || [])\r\nconst allowedTypes = inject<string[]>('allowedTypes', [])\r\n// ['doc', 'docx','word','png']\r\nconst types = ref<string[]>(allowedTypes || [])\r\n\r\n// 触发文件选择框\r\nconst triggerFileInput = () => {\r\n\tif (fileInput.value) {\r\n\t\tfileInput.value.click()\r\n\t}\r\n}\r\n\r\n// 处理文件选择\r\nconst handleFileChange = (event: Event) => {\r\n\tconst input = event.target as HTMLInputElement\r\n\tif (input.files && input.files.length > 0) {\r\n\t\tfor (let i = 0; i < input.files.length; i++) {\r\n\t\t\tconst file = input.files[i]\r\n\t\t\t// 检查是否已存在相同文件(同名同大小)\r\n\t\t\tconst exists = fileInfos.value.some(f => f.name === file.name && f.fileSize === formatFileSize(file.size))\r\n\t\t\tif (exists) {\r\n\t\t\t\tshowToast(`文件\"${file.name}\"已存在`, 'info', 3000)\r\n\t\t\t\tcontinue\r\n\t\t\t}\r\n\t\t\t// 检查文件类型是否允许\r\n\t\t\tif (!isFileTypeAllowed(file) && types.value.length > 0) {\r\n\t\t\t\tshowToast(`文件类型${file.type}不允许上传,请上传${types.value.join('、')}类型文件`, 'info', 3000)\r\n\t\t\t\tcontinue // 跳过不允许的文件类型\r\n\t\t\t}\r\n\t\t\tif (file.type.startsWith('image/')) {\r\n\t\t\t\tconst reader = new FileReader()\r\n\t\t\t\treader.onload = e => {\r\n\t\t\t\t\tconst base64 = e.target?.result as string\r\n\t\t\t\t\tfileInfos.value.push({\r\n\t\t\t\t\t\tfile,\r\n\t\t\t\t\t\tisUploading: false,\r\n\t\t\t\t\t\tuploadProgress: 0,\r\n\t\t\t\t\t\tuploadSuccess: false,\r\n\t\t\t\t\t\tuploadError: false,\r\n\t\t\t\t\t\tfileSize: formatFileSize(file.size),\r\n\t\t\t\t\t\tfileType: file.type,\r\n\t\t\t\t\t\tid: file.lastModified.toString(),\r\n\t\t\t\t\t\tname: file.name,\r\n\t\t\t\t\t\tbase64, // 存储 Base64 数据\r\n\t\t\t\t\t\tlastModified: file.lastModified\r\n\t\t\t\t\t})\r\n\t\t\t\t\tuploadFile(fileInfos.value.length - 1)\r\n\t\t\t\t}\r\n\t\t\t\treader.readAsDataURL(file)\r\n\t\t\t} else {\r\n\t\t\t\tfileInfos.value.push({\r\n\t\t\t\t\tfile,\r\n\t\t\t\t\tisUploading: false,\r\n\t\t\t\t\tuploadProgress: 0,\r\n\t\t\t\t\tuploadSuccess: false,\r\n\t\t\t\t\tuploadError: false,\r\n\t\t\t\t\tfileSize: formatFileSize(file.size),\r\n\t\t\t\t\tfileType: file.type,\r\n\t\t\t\t\tid: file.lastModified.toString(),\r\n\t\t\t\t\tname: file.name,\r\n\t\t\t\t\tlastModified: file.lastModified\r\n\t\t\t\t})\r\n\t\t\t\tuploadFile(fileInfos.value.length - 1)\r\n\t\t\t}\r\n\t\t}\r\n\t\t// 清空 input value,允许重复选择同一文件\r\n\t\tif (fileInput.value) {\r\n\t\t\tfileInput.value.value = ''\r\n\t\t}\r\n\t}\r\n}\r\n// 检查文件类型是否允许\r\nconst isFileTypeAllowed = (file: File): boolean => {\r\n\tconst fileExtension = file.name.split('.').pop()?.toLowerCase()\r\n\treturn types.value.includes(fileExtension || '')\r\n}\r\n// 文件上传\r\nconst uploadFile = async (index: number, type?: string) => {\r\n\tconst fileInfo = fileInfos.value[index]\r\n\tif (!fileInfo || !fileInfo.file) return\r\n\r\n\tfileInfo.isUploading = true\r\n\tfileInfo.uploadSuccess = false\r\n\tfileInfo.uploadError = false\r\n\tfileInfo.uploadProgress = 0\r\n\tfileInfo.fileSize = formatFileSize(fileInfo.file.size)\r\n\tfileInfo.fileType = fileInfo.file.type\r\n\tfileInfo.id = fileInfo.file.lastModified.toString()\r\n\tfileInfo.name = fileInfo.file.name\r\n\r\n\tif (type) return\r\n\r\n\tif (uploadAction) {\r\n\t\t// 真实上传\r\n\t\tlet progressCalled = false\r\n\t\t// 保底进度:如果 onProgress 未被调用(如用 fetch),按时间递进补进度\r\n\t\tconst progressTimer = setInterval(() => {\r\n\t\t\tif (progressCalled) return\r\n\t\t\tif (fileInfo.uploadProgress !== undefined && fileInfo.uploadProgress < 90) {\r\n\t\t\t\tfileInfo.uploadProgress += 10\r\n\t\t\t\temit('upload-file', fileInfos.value)\r\n\t\t\t}\r\n\t\t}, 100)\r\n\t\ttry {\r\n\t\t\tconst res = await uploadAction(fileInfo.file, percent => {\r\n\t\t\t\tprogressCalled = true\r\n\t\t\t\tfileInfo.uploadProgress = percent\r\n\t\t\t\temit('upload-file', fileInfos.value)\r\n\t\t\t})\r\n\t\t\tclearInterval(progressTimer)\r\n\t\t\tfileInfo.uploadSuccess = true\r\n\t\t\tfileInfo.uploadProgress = 100\r\n\t\t\tfileInfo.url = res?.url || res?.data?.url\r\n\t\t\tfileInfo.fileId = res?.id || res?.data?.id\r\n\t\t} catch {\r\n\t\t\tclearInterval(progressTimer)\r\n\t\t\tfileInfo.uploadError = true\r\n\t\t}\r\n\t\tfileInfo.isUploading = false\r\n\t\temit('upload-file', fileInfos.value)\r\n\t} else {\r\n\t\t// 无 uploadAction 时保持模拟上传(向后兼容)\r\n\t\tconst interval = setInterval(() => {\r\n\t\t\tif (fileInfo.uploadProgress !== undefined) {\r\n\t\t\t\tfileInfo.uploadProgress += 10\r\n\t\t\t}\r\n\t\t\temit('upload-file', fileInfos.value)\r\n\t\t\tif (fileInfo.uploadProgress !== undefined && fileInfo.uploadProgress >= 100) {\r\n\t\t\t\tclearInterval(interval)\r\n\t\t\t\tfileInfo.isUploading = false\r\n\t\t\t\tfileInfo.uploadSuccess = true\r\n\t\t\t}\r\n\t\t}, 100)\r\n\t}\r\n}\r\n\r\n// 格式化文件大小\r\nconst formatFileSize = (bytes: number) => {\r\n\tif (bytes === 0) return '0 Bytes'\r\n\tconst k = 1024\r\n\tconst sizes = ['Bytes', 'KB', 'MB', 'GB']\r\n\tconst i = Math.floor(Math.log(bytes) / Math.log(k))\r\n\treturn parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]\r\n}\r\n\r\nconst resetFile = () => {\r\n\tfileInfos.value = []\r\n\tif (fileInput.value) {\r\n\t\tfileInput.value.value = ''\r\n\t}\r\n}\r\ndefineExpose({\r\n\tresetFile,\r\n\tuploadFile\r\n})\r\n</script>\r\n"],"names":["_createElementBlock","_createCommentVNode","_createElementVNode","_renderSlot"],"mappings":"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"}
1
+ {"version":3,"file":"UploadView.vue2.mjs","sources":["../../../../../../packages/components/touchchat/component/UploadView.vue"],"sourcesContent":["<template>\n\t<div class=\"upload-view\">\n\t\t<!-- <button class=\"upload-button\" @click=\"triggerFileInput\">点击选择文件</button> -->\n\t\t<div @click=\"triggerFileInput\">\n\t\t\t<slot></slot>\n\t\t</div>\n\t\t<input ref=\"fileInput\" type=\"file\" class=\"file-input\" style=\"display: none\" multiple @change=\"handleFileChange\" />\n\t</div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, inject } from 'vue'\nimport { showToast } from '../utils/tools'\nimport type { FileItem } from '../src/AiChat/Chat/types'\n\ntype UploadActionFn = (file: File, onProgress: (percent: number) => void) => Promise<any>\n\nconst uploadAction = inject<UploadActionFn | null>('uploadAction', null)\n\nconst props = defineProps<{\n\tfileList: FileItem[]\n}>()\n\nconst emit = defineEmits<{\n\t(e: 'upload-file', value: FileItem[]): void\n}>()\n\nconst fileInput = ref<HTMLInputElement | null>(null)\nconst fileInfos = ref<FileItem[]>(props.fileList || [])\nconst allowedTypes = inject<string[]>('allowedTypes', [])\n// ['doc', 'docx','word','png']\nconst types = ref<string[]>(allowedTypes || [])\n\n// 触发文件选择框\nconst triggerFileInput = () => {\n\tif (fileInput.value) {\n\t\tfileInput.value.click()\n\t}\n}\n\n// 处理文件选择\nconst handleFileChange = (event: Event) => {\n\tconst input = event.target as HTMLInputElement\n\tif (input.files && input.files.length > 0) {\n\t\tfor (let i = 0; i < input.files.length; i++) {\n\t\t\tconst file = input.files[i]\n\t\t\t// 检查是否已存在相同文件(同名同大小)\n\t\t\tconst exists = fileInfos.value.some(f => f.name === file.name && f.fileSize === formatFileSize(file.size))\n\t\t\tif (exists) {\n\t\t\t\tshowToast(`文件\"${file.name}\"已存在`, 'warning', 3000)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t// 检查文件类型是否允许\n\t\t\tif (!isFileTypeAllowed(file) && types.value.length > 0) {\n\t\t\t\tshowToast(`文件类型${file.type}不允许上传,请上传${types.value.join('、')}类型文件`, 'warning', 3000)\n\t\t\t\tcontinue // 跳过不允许的文件类型\n\t\t\t}\n\t\t\tif (file.type.startsWith('image/')) {\n\t\t\t\tconst reader = new FileReader()\n\t\t\t\treader.onload = e => {\n\t\t\t\t\tconst base64 = e.target?.result as string\n\t\t\t\t\tfileInfos.value.push({\n\t\t\t\t\t\tfile,\n\t\t\t\t\t\tisUploading: false,\n\t\t\t\t\t\tuploadProgress: 0,\n\t\t\t\t\t\tuploadSuccess: false,\n\t\t\t\t\t\tuploadError: false,\n\t\t\t\t\t\tfileSize: formatFileSize(file.size),\n\t\t\t\t\t\tfileType: file.type,\n\t\t\t\t\t\tid: file.lastModified.toString(),\n\t\t\t\t\t\tname: file.name,\n\t\t\t\t\t\tbase64, // 存储 Base64 数据\n\t\t\t\t\t\tlastModified: file.lastModified\n\t\t\t\t\t})\n\t\t\t\t\tuploadFile(fileInfos.value.length - 1)\n\t\t\t\t}\n\t\t\t\treader.readAsDataURL(file)\n\t\t\t} else {\n\t\t\t\tfileInfos.value.push({\n\t\t\t\t\tfile,\n\t\t\t\t\tisUploading: false,\n\t\t\t\t\tuploadProgress: 0,\n\t\t\t\t\tuploadSuccess: false,\n\t\t\t\t\tuploadError: false,\n\t\t\t\t\tfileSize: formatFileSize(file.size),\n\t\t\t\t\tfileType: file.type,\n\t\t\t\t\tid: file.lastModified.toString(),\n\t\t\t\t\tname: file.name,\n\t\t\t\t\tlastModified: file.lastModified\n\t\t\t\t})\n\t\t\t\tuploadFile(fileInfos.value.length - 1)\n\t\t\t}\n\t\t}\n\t\t// 清空 input value,允许重复选择同一文件\n\t\tif (fileInput.value) {\n\t\t\tfileInput.value.value = ''\n\t\t}\n\t}\n}\n// 检查文件类型是否允许\nconst isFileTypeAllowed = (file: File): boolean => {\n\tconst fileExtension = file.name.split('.').pop()?.toLowerCase()\n\treturn types.value.includes(fileExtension || '')\n}\n// 文件上传\nconst uploadFile = async (index: number, type?: string) => {\n\tconst fileInfo = fileInfos.value[index]\n\tif (!fileInfo || !fileInfo.file) return\n\n\tfileInfo.isUploading = true\n\tfileInfo.uploadSuccess = false\n\tfileInfo.uploadError = false\n\tfileInfo.uploadProgress = 0\n\tfileInfo.fileSize = formatFileSize(fileInfo.file.size)\n\tfileInfo.fileType = fileInfo.file.type\n\tfileInfo.id = fileInfo.file.lastModified.toString()\n\tfileInfo.name = fileInfo.file.name\n\n\tif (type) return\n\n\tif (uploadAction) {\n\t\t// 真实上传\n\t\tlet progressCalled = false\n\t\t// 保底进度:如果 onProgress 未被调用(如用 fetch),按时间递进补进度\n\t\tconst progressTimer = setInterval(() => {\n\t\t\tif (progressCalled) return\n\t\t\tif (fileInfo.uploadProgress !== undefined && fileInfo.uploadProgress < 90) {\n\t\t\t\tfileInfo.uploadProgress += 10\n\t\t\t\temit('upload-file', fileInfos.value)\n\t\t\t}\n\t\t}, 100)\n\t\ttry {\n\t\t\tconst res = await uploadAction(fileInfo.file, percent => {\n\t\t\t\tprogressCalled = true\n\t\t\t\tfileInfo.uploadProgress = percent\n\t\t\t\temit('upload-file', fileInfos.value)\n\t\t\t})\n\t\t\tclearInterval(progressTimer)\n\t\t\tfileInfo.uploadSuccess = true\n\t\t\tfileInfo.uploadProgress = 100\n\t\t\tfileInfo.url = res?.url || res?.data?.url\n\t\t\tfileInfo.fileId = res?.id || res?.data?.id\n\t\t} catch {\n\t\t\tclearInterval(progressTimer)\n\t\t\tfileInfo.uploadError = true\n\t\t}\n\t\tfileInfo.isUploading = false\n\t\temit('upload-file', fileInfos.value)\n\t} else {\n\t\t// 无 uploadAction 时保持模拟上传(向后兼容)\n\t\tconst interval = setInterval(() => {\n\t\t\tif (fileInfo.uploadProgress !== undefined) {\n\t\t\t\tfileInfo.uploadProgress += 10\n\t\t\t}\n\t\t\temit('upload-file', fileInfos.value)\n\t\t\tif (fileInfo.uploadProgress !== undefined && fileInfo.uploadProgress >= 100) {\n\t\t\t\tclearInterval(interval)\n\t\t\t\tfileInfo.isUploading = false\n\t\t\t\tfileInfo.uploadSuccess = true\n\t\t\t}\n\t\t}, 100)\n\t}\n}\n\n// 格式化文件大小\nconst formatFileSize = (bytes: number) => {\n\tif (bytes === 0) return '0 Bytes'\n\tconst k = 1024\n\tconst sizes = ['Bytes', 'KB', 'MB', 'GB']\n\tconst i = Math.floor(Math.log(bytes) / Math.log(k))\n\treturn parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]\n}\n\nconst resetFile = () => {\n\tfileInfos.value = []\n\tif (fileInput.value) {\n\t\tfileInput.value.value = ''\n\t}\n}\ndefineExpose({\n\tresetFile,\n\tuploadFile\n})\n</script>\n"],"names":["_createElementBlock","_createCommentVNode","_createElementVNode","_renderSlot"],"mappings":"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"}
@@ -407,7 +407,6 @@ function useChat({ props, emit, scripts, unmatchText, modules, afterSend, sendMe
407
407
  }
408
408
  inputValue.value = "";
409
409
  } else {
410
- console.log("content === useChat === 488", content);
411
410
  if (content) {
412
411
  inputValue.value = content;
413
412
  }
@@ -424,53 +423,18 @@ function useChat({ props, emit, scripts, unmatchText, modules, afterSend, sendMe
424
423
  isRead: false,
425
424
  quoteData
426
425
  };
427
- console.log("object324324213421", quoteData);
428
426
  chatList.value.push(userMessage);
429
427
  const index = chatList.value.length - 1;
430
428
  nextTick(() => {
431
429
  renderContent(userMessage.content, "main", index);
432
430
  scrollToBottom();
433
431
  });
434
- console.log("openSSE === useChat === 511");
435
432
  openSSE(inputValue.value, index + 1);
436
433
  inputValue.value = "";
437
434
  }
438
435
  };
439
436
  const handleStop = () => {
440
- var _a;
441
437
  cleanupSSE();
442
- const aiIndex = chatList.value.findIndex((item) => item.isChating);
443
- if (aiIndex !== -1) {
444
- const currentAiMessage = chatList.value[aiIndex];
445
- if ((_a = currentAiMessage.content) == null ? void 0 : _a.trim()) {
446
- nextTick(() => {
447
- chatList.value[aiIndex] = {
448
- ...currentAiMessage,
449
- content: currentAiMessage.content + "...",
450
- isChating: false
451
- };
452
- renderContent(chatList.value[aiIndex].content, "main", aiIndex);
453
- emit("sendMessage", chatList.value);
454
- });
455
- } else {
456
- if (aiIndex > 0) {
457
- const userMessageIndex = aiIndex - 1;
458
- if (chatList.value[userMessageIndex].user === "u") {
459
- chatList.value.splice(userMessageIndex, 2);
460
- } else {
461
- chatList.value.splice(aiIndex, 1);
462
- }
463
- } else {
464
- chatList.value.splice(aiIndex, 1);
465
- }
466
- }
467
- } else {
468
- const lastIndex = chatList.value.length - 1;
469
- if (lastIndex >= 0 && chatList.value[lastIndex].user === "u") {
470
- chatList.value.pop();
471
- }
472
- }
473
- isChating.value = false;
474
438
  };
475
439
  const handleMessageAction = (action, index) => {
476
440
  const message = chatList.value[index];
@@ -541,7 +505,6 @@ function useChat({ props, emit, scripts, unmatchText, modules, afterSend, sendMe
541
505
  });
542
506
  break;
543
507
  case MessageAction.WITHDRAW:
544
- console.log("withDraw");
545
508
  messageUtils.updateMessage(index, {
546
509
  isWithDraw: true,
547
510
  user: "withDraw"
@@ -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\tfileData,\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, quoteData?: any): 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, quoteData)\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, quoteData)\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, quoteData?: any): 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: type || '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\tselecting: false,\r\n\t\t\t\tquoteData\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\tlikeList: response.likeList\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\tconsole.log('content === useChat === 488', content)\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: type || '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\tquoteData\r\n\t\t\t}\r\n\t\t\tconsole.log('object324324213421', quoteData)\r\n\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\tconsole.log('openSSE === useChat === 511')\r\n\t\t\topenSSE(inputValue.value, index + 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\tconst retryFiles = (userMessage.files as FileItem[] | undefined) || []\r\n\t\t\t\t\t\t\tfileData.value = retryFiles\r\n\t\t\t\t\t\t\tsendMessageInject(userMessage.content || '', retryFiles)\r\n\t\t\t\t\t\t\topenSSE(userMessage.content || '', index)\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\tconst editedFiles = (message.files as FileItem[] | undefined) || []\r\n\t\t\tfileData.value = editedFiles\r\n\t\t\tsendMessageInject(newContent, editedFiles)\r\n\t\t\topenSSE(newContent, insertPosition)\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":";;;;;;;;AA2BO,SAAS,OAAQ,CAAA,EAAE,KAAO,EAAA,IAAA,EAAM,SAAS,WAAa,EAAA,OAAA,EAAS,SAAW,EAAA,iBAAA,EAAmB,UAAY,EAAA,MAAA,EAAQ,IAAM,EAAA,aAAA,EAAe,cAAgC,EAAA;AAE5K,EAAM,MAAA,SAAA,GAAY,IAAI,KAAK,CAAA,CAAA;AAC3B,EAAM,MAAA,SAAA,GAAY,IAAI,KAAK,CAAA,CAAA;AAC3B,EAAM,MAAA,UAAA,GAAa,IAAI,EAAE,CAAA,CAAA;AACzB,EAAM,MAAA,kBAAA,GAAqB,IAAI,KAAK,CAAA,CAAA;AACpC,EAAM,MAAA,QAAA,GAAW,GAAmB,CAAA,EAAE,CAAA,CAAA;AACtC,EAAM,MAAA,SAAA,GAAY,IAAI,CAAC,CAAA,CAAA;AACvB,EAAM,MAAA,YAAA,GAAe,IAAI,KAAK,CAAA,CAAA;AAC9B,EAAM,MAAA,oBAAA,GAAuB,IAAI,EAAE,CAAA,CAAA;AACnC,EAAM,MAAA,QAAA,GAAW,GAAgB,CAAA,EAAE,CAAA,CAAA;AACnC,EAAM,MAAA,gBAAA,GAAmB,IAAY,EAAE,CAAA,CAAA;AACvC,EAAM,MAAA,UAAA,GAAa,IAAiB,OAAQ,CAAA,CAAC,KAAoB,EAAE,IAAA,EAAM,eAAe,CAAA,CAAA;AACxF,EAAM,MAAA,UAAA,GAAa,IAAI,KAAK,CAAA,CAAA;AAC5B,EAAM,MAAA,QAAA,GAAW,IAAI,EAAE,CAAA,CAAA;AAGvB,EAAM,MAAA,uBAAA,GAA0B,IAA6B,IAAI,CAAA,CAAA;AAGjE,EAAM,MAAA,EAAE,gBAAgB,kBAAoB,EAAA,mBAAA,EAAqB,gBAAgB,aAAe,EAAA,aAAA,KAAkB,gBAAiB,CAAA;AAAA,IAClI,QAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,GACA,CAAA,CAAA;AAGD,EAAA,MAAM,EAAE,cAAA,EAAgB,YAAa,EAAA,GAAI,SAAU,CAAA;AAAA,IAClD,aAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA,MAAA;AAAA,GACA,CAAA,CAAA;AAGD,EAAM,MAAA,EAAE,eAAgB,EAAA,GAAI,OAAQ,EAAA,CAAA;AAGpC,EAAM,MAAA,UAAA,GAAa,IAAI,OAAO,CAAA,CAAA;AAC9B,EAAA,MAAM,EAAE,YAAA,EAAc,yBAA0B,EAAA,GAAI,mBAAoB,CAAA;AAAA,IACvE,OAAS,EAAA,UAAA;AAAA,IACT,gBAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,GACA,CAAA,CAAA;AAGD,EAAA,MAAM,EAAE,WAAa,EAAA,UAAA,EAAY,OAAS,EAAA,UAAA,KAAe,MAAO,CAAA;AAAA,IAC/D,QAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA;AAAA,IACA,kBAAA;AAAA,IACA,oBAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,IAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA;AAAA,IACA,cAAA;AAAA,IACA,cAAA;AAAA,IACA,IAAA;AAAA,GACA,CAAA,CAAA;AAGD,EAAA,KAAA;AAAA,IACC,MAAM,gBAAA;AAAA,IACN,CAAC,GAAa,KAAA;AACb,MAAA,IAAI,CAAC,GAAK,EAAA;AACT,QAAiB,gBAAA,CAAA,KAAA,GAAQ,YAAa,CAAA,OAAA,CAAQ,kBAAkB,CAAA,CAAA;AAAA,OACjE;AAAA,KACD;AAAA,IACA,EAAE,WAAW,IAAK,EAAA;AAAA,GACnB,CAAA;AAGA,EAAA,MAAM,YAAe,GAAA;AAAA,IACpB,aAAA,EAAe,CAAC,KAAA,EAAe,OAAwC,KAAA;AACtE,MAAA,IAAI,KAAQ,GAAA,CAAA,IAAK,KAAS,IAAA,QAAA,CAAS,KAAM,CAAA,MAAA;AAAQ,QAAA,OAAA;AACjD,MAAA,QAAA,CAAS,KAAM,CAAA,MAAA,CAAO,KAAO,EAAA,CAAA,EAAG,EAAE,GAAG,QAAS,CAAA,KAAA,CAAM,KAAK,CAAA,EAAG,GAAG,OAAA,EAAS,CAAA,CAAA;AACxE,MAAA,QAAA,CAAS,MAAM;AACd,QAAM,MAAA,OAAA,GAAU,QAAS,CAAA,KAAA,CAAM,KAAK,CAAA,CAAA;AACpC,QAAA,IAAI,OAAS,EAAA;AACZ,UAAc,aAAA,CAAA,OAAA,CAAQ,OAAS,EAAA,MAAA,EAAQ,KAAK,CAAA,CAAA;AAC5C,UAAA,IAAI,QAAQ,YAAc,EAAA;AACzB,YAAc,aAAA,CAAA,OAAA,CAAQ,YAAc,EAAA,UAAA,EAAY,KAAK,CAAA,CAAA;AAAA,WACtD;AACA,UAAA,IAAI,QAAQ,gBAAkB,EAAA;AAC7B,YAAc,aAAA,CAAA,OAAA,CAAQ,gBAAkB,EAAA,WAAA,EAAa,KAAK,CAAA,CAAA;AAAA,WAC3D;AAAA,SACD;AAAA,OACA,CAAA,CAAA;AAAA,KACF;AAAA,IAEA,kBAAA,EAAoB,CAAC,KAAwB,KAAA;AAC5C,MAAA,IAAI,KAAQ,GAAA,CAAA,IAAK,KAAS,IAAA,QAAA,CAAS,KAAM,CAAA,MAAA;AAAQ,QAAA,OAAA;AACjD,MAAA,IAAI,QAAS,CAAA,KAAA,CAAM,KAAK,CAAA,CAAE,SAAS,GAAK,EAAA;AACvC,QAAA,IAAI,WAAc,GAAA,CAAA,CAAA;AAClB,QAAA,KAAA,IAAS,IAAI,KAAQ,GAAA,CAAA,EAAG,IAAI,QAAS,CAAA,KAAA,CAAM,QAAQ,CAAK,EAAA,EAAA;AACvD,UAAA,IAAI,QAAS,CAAA,KAAA,CAAM,CAAC,CAAA,CAAE,SAAS,IAAM,EAAA;AACpC,YAAA,WAAA,EAAA,CAAA;AAAA,WACM,MAAA;AACN,YAAA,MAAA;AAAA,WACD;AAAA,SACD;AACA,QAAS,QAAA,CAAA,KAAA,CAAM,MAAO,CAAA,KAAA,EAAO,WAAW,CAAA,CAAA;AAAA,OAClC,MAAA;AACN,QAAS,QAAA,CAAA,KAAA,CAAM,MAAO,CAAA,KAAA,EAAO,CAAC,CAAA,CAAA;AAAA,OAC/B;AAAA,KACD;AAAA,IAEA,qBAAA,EAAuB,CAAC,IAAyC,KAAA;AA/InE,MAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AA+IuE,MAAA,OAAA;AAAA,QACpE,QAAQ,IAAK,CAAA,MAAA,IAAU,QAAQ,IAAK,CAAA,MAAA,GAAS,QAAS,CAAA,EAAE,EAAE,KAAM,CAAA,CAAC,EAAE,MAAO,CAAA,EAAA,EAAI,GAAG,CAAE,CAAA,KAAA,CAAM,GAAG,EAAE,CAAA;AAAA,QAC9F,IAAA,EAAM,KAAK,IAAQ,IAAA,IAAA;AAAA,QACnB,IAAA,EAAM,KAAK,IAAQ,IAAA,MAAA;AAAA,QACnB,OAAA,EAAS,KAAK,OAAW,IAAA,EAAA;AAAA,QACzB,SAAA,EAAA,CAAW,EAAK,GAAA,IAAA,CAAA,SAAA,KAAL,IAAkB,GAAA,EAAA,GAAA,KAAA;AAAA,QAC7B,YAAA,EAAc,KAAK,YAAgB,IAAA,EAAA;AAAA,QACnC,gBAAA,EAAkB,KAAK,gBAAoB,IAAA,EAAA;AAAA,QAC3C,OAAA,EAAA,CAAS,EAAK,GAAA,IAAA,CAAA,OAAA,KAAL,IAAgB,GAAA,EAAA,GAAA,KAAA;AAAA,QACzB,UAAA,EAAA,CAAY,EAAK,GAAA,IAAA,CAAA,UAAA,KAAL,IAAmB,GAAA,EAAA,GAAA,KAAA;AAAA,QAC/B,SAAA,EAAA,CAAW,EAAK,GAAA,IAAA,CAAA,SAAA,KAAL,IAAkB,GAAA,EAAA,GAAA,KAAA;AAAA,QAC7B,WAAA,EAAA,CAAa,EAAK,GAAA,IAAA,CAAA,WAAA,KAAL,IAAoB,GAAA,EAAA,GAAA,EAAA;AAAA,QACjC,SAAS,EAAC;AAAA,OACX,CAAA;AAAA,KAAA;AAAA,GACD,CAAA;AAGA,EAAM,MAAA,MAAA,GAAS,CAAC,KAAA,EAAe,OAAoB,KAAA;AAClD,IAAS,QAAA,CAAA,KAAA,CAAM,KAAK,CAAA,GAAI,EAAE,GAAG,SAAS,KAAM,CAAA,KAAK,CAAG,EAAA,GAAG,OAAQ,EAAA,CAAA;AAAA,GAEhE,CAAA;AAGA,EAAM,MAAA,YAAA,GAAe,CAAC,IAAqB,KAAA;AAC1C,IAAA,UAAA,CAAW,KAAQ,GAAA,IAAA,CAAA;AAAA,GACpB,CAAA;AAGA,EAAM,MAAA,iBAAA,GAAoB,CAAC,IAAc,KAAA;AACxC,IAAa,YAAA,CAAA,OAAA,CAAQ,kBAAoB,EAAA,IAAA,CAAK,IAAI,CAAA,CAAA;AAClD,IAAA,MAAM,YAAY,IAAK,CAAA,KAAA,CAAA;AACvB,IAAA,YAAA,CAAa,cAAc,CAAG,EAAA;AAAA,MAC7B,OAAS,EAAA,EAAA;AAAA,MACT,SAAW,EAAA,KAAA;AAAA,KACX,CAAA,CAAA;AACD,IAAA,oBAAA,CAAqB,GAAG,SAAS,CAAA,CAAA;AAAA,GAClC,CAAA;AAGA,EAAM,MAAA,gBAAA,GAAmB,CAAC,MAAmB,KAAA;AAE5C,IAAA,IAAI,wBAAwB,KAAO,EAAA;AAClC,MAAwB,uBAAA,CAAA,KAAA,CAAM,sBAAsB,MAAM,CAAA,CAAA;AAAA,KAC3D;AAAA,GACD,CAAA;AAGA,EAAA,MAAM,OAAO,MAAY;AACxB,IAAI,IAAA;AACH,MAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,KAAA,CAAM,KAAK,CAAA,IAAK,MAAM,KAAM,CAAA,MAAA,IAAU,CAAC,OAAA,CAAQ,MAAQ,EAAA;AACxE,QAAA,QAAA,CAAS,KAAQ,GAAA,KAAA,CAAM,KAAM,CAAA,GAAA,CAAI,CAAC,IAAe,MAAA;AAAA,UAChD,GAAG,IAAA;AAAA,UACH,SAAS,IAAK,CAAA,YAAA,GAAe,KAAK,OAAW,IAAA,EAAA,GAAK,KAAK,OAAW,IAAA,EAAA;AAAA,UAClE,YAAA,EAAc,KAAK,YAAgB,IAAA,EAAA;AAAA,SAClC,CAAA,CAAA,CAAA;AAEF,QAAA,QAAA,CAAS,MAAM;AACd,UAAA,qBAAA,CAAsB,MAAM;AAC3B,YAAI,IAAA,gBAAA,CAAiB,KAAS,IAAA,QAAA,CAAS,KAAM,CAAA,MAAA,GAAS,CAAK,IAAA,QAAA,CAAS,KAAM,CAAA,CAAC,CAAE,CAAA,IAAA,KAAS,IAAM,EAAA;AAC3F,cAAM,MAAA,SAAA,GAAY,QAAS,CAAA,KAAA,CAAM,CAAC,CAAA,CAAA;AAClC,cAAA,YAAA,CAAa,cAAc,CAAG,EAAA;AAAA,gBAC7B,OAAS,EAAA,EAAA;AAAA,gBACT,SAAW,EAAA,IAAA;AAAA,eACX,CAAA,CAAA;AACD,cAAqB,oBAAA,CAAA,CAAA,EAAG,UAAU,OAAO,CAAA,CAAA;AAAA,aACnC,MAAA;AACN,cAAS,QAAA,CAAA,KAAA,CAAM,OAAQ,CAAA,CAAC,IAAc,KAAA;AACrC,gBAAA,IAAI,KAAK,YAAc,EAAA;AACtB,kBAAc,aAAA,CAAA,IAAA,CAAK,cAAc,UAAU,CAAA,CAAA;AAAA,iBAC5C;AACA,gBAAA,IAAI,KAAK,gBAAkB,EAAA;AAC1B,kBAAc,aAAA,CAAA,IAAA,CAAK,kBAAkB,WAAW,CAAA,CAAA;AAAA,iBACjD;AACA,gBAAA,IAAI,KAAK,OAAS,EAAA;AACjB,kBAAc,aAAA,CAAA,IAAA,CAAK,SAAS,MAAM,CAAA,CAAA;AAAA,iBACnC;AAAA,eACA,CAAA,CAAA;AACD,cAAA,QAAA,CAAS,MAAM;AACd,gBAAe,cAAA,EAAA,CAAA;AAAA,eACf,CAAA,CAAA;AAAA,aACF;AAAA,WACA,CAAA,CAAA;AAAA,SACD,CAAA,CAAA;AAAA,OACF;AAAA,aACQ,KAAP,EAAA;AAAA,KAEF;AAAA,GACD,CAAA;AAGA,EAAA,MAAM,oBAAuB,GAAA,CAAC,OAAiB,EAAA,GAAA,EAA2B,QAA0B,KAAA;AACnG,IAAA,MAAM,OAAkB,GAAA,OAAO,GAAQ,KAAA,QAAA,GAAW,MAAM,GAAI,CAAA,OAAA,CAAA;AAC5D,IAAM,MAAA,aAAA,GAAgB,OAAO,GAAQ,KAAA,QAAA,GAAW,KAAK,GAAI,CAAA,sBAAA,GAAyB,IAAI,gBAAmB,GAAA,EAAA,CAAA;AACzG,IAAA,MAAM,wBAA2B,GAAA,OAAO,GAAQ,KAAA,QAAA,GAAW,QAAQ,GAAI,CAAA,sBAAA,CAAA;AAEvE,IAAA,MAAM,KAAK,MAAM;AAChB,MAAA,aAAA,CAAc,QAAQ,CAAA,CAAA;AACtB,MAAA,IAAA,CAAK,aAAe,EAAA,CAAC,GAAG,QAAA,CAAS,KAAK,CAAC,CAAA,CAAA;AACvC,MAAA,IAAI,aAAe,EAAA;AAClB,QAAS,QAAA,CAAA,KAAA,CAAM,OAAO,CAAA,CAAE,aAAgB,GAAA,aAAA,CAAA;AAAA,OACzC;AACA,MAAA,YAAA,CAAa,cAAc,OAAS,EAAA;AAAA,QACnC,SAAW,EAAA,KAAA;AAAA,OACX,CAAA,CAAA;AACD,MAAA,QAAA,CAAS,MAAM;AACd,QAAc,aAAA,CAAA,OAAA,EAAS,QAAQ,OAAO,CAAA,CAAA;AACtC,QAAA,QAAA,CAAS,MAAM;AACd,UAAe,cAAA,EAAA,CAAA;AACf,UAAI,IAAA,CAAC,4BAA4B,QAAU,EAAA;AAC1C,YAAS,QAAA,EAAA,CAAA;AAAA,WACV;AAAA,SACA,CAAA,CAAA;AAAA,OACD,CAAA,CAAA;AAAA,KACF,CAAA;AAEA,IAAA,IAAI,KAAQ,GAAA,CAAA,CAAA;AACZ,IAAM,MAAA,QAAA,GAAW,YAAY,MAAM;AAClC,MAAI,IAAA,KAAA,GAAQ,QAAQ,MAAQ,EAAA;AAC3B,QAAA,MAAM,UAAa,GAAA,OAAA,CAAA;AACnB,QAAA,YAAA,CAAa,cAAc,OAAS,EAAA;AAAA,UACnC,OAAS,EAAA,UAAA;AAAA,SACT,CAAA,CAAA;AACD,QAAA,QAAA,CAAS,MAAM;AACd,UAAc,aAAA,CAAA,UAAA,EAAY,QAAQ,OAAO,CAAA,CAAA;AACzC,UAAA,QAAA,CAAS,MAAM;AACd,YAAe,cAAA,EAAA,CAAA;AAAA,WACf,CAAA,CAAA;AAAA,SACD,CAAA,CAAA;AACD,QAAA,KAAA,EAAA,CAAA;AAAA,OACM,MAAA;AACN,QAAG,EAAA,EAAA,CAAA;AAAA,OACJ;AAAA,OACE,EAAE,CAAA,CAAA;AAAA,GACN,CAAA;AAGA,EAAA,KAAA;AAAA,IACC,MAAM,KAAM,CAAA,KAAA;AAAA,IACZ,CAAC,QAAa,MAAgB,KAAA;AAC7B,MAAI,IAAA,CAAC,KAAM,CAAA,OAAA,CAAQ,MAAM,CAAA;AAAG,QAAA,OAAA;AAC5B,MAAI,IAAA,MAAA,CAAO,UAAU,IAAK,CAAA,SAAA,CAAU,MAAM,CAAM,KAAA,IAAA,CAAK,SAAU,CAAA,MAAM,CAAG,EAAA;AACvE,QAAS,QAAA,CAAA,KAAA,GAAQ,MAAO,CAAA,GAAA,CAAI,CAAS,IAAA,MAAA;AAAA,UACpC,GAAG,IAAA;AAAA,UACH,SAAS,IAAK,CAAA,YAAA,GAAe,KAAK,OAAW,IAAA,EAAA,GAAK,KAAK,OAAW,IAAA,EAAA;AAAA,UAClE,YAAA,EAAc,KAAK,YAAgB,IAAA,EAAA;AAAA,SAClC,CAAA,CAAA,CAAA;AAEF,QAAA,QAAA,CAAS,MAAM;AACd,UAAA,qBAAA,CAAsB,MAAM;AAC3B,YAAS,QAAA,CAAA,KAAA,CAAM,OAAQ,CAAA,CAAC,IAAc,KAAA;AACrC,cAAA,IAAI,KAAK,YAAc,EAAA;AACtB,gBAAc,aAAA,CAAA,IAAA,CAAK,cAAc,UAAU,CAAA,CAAA;AAAA,eAC5C;AACA,cAAA,IAAI,KAAK,gBAAkB,EAAA;AAC1B,gBAAc,aAAA,CAAA,IAAA,CAAK,kBAAkB,WAAW,CAAA,CAAA;AAAA,eACjD;AACA,cAAA,IAAI,KAAK,OAAS,EAAA;AACjB,gBAAc,aAAA,CAAA,IAAA,CAAK,SAAS,MAAM,CAAA,CAAA;AAAA,eACnC;AAAA,aACA,CAAA,CAAA;AACD,YAAA,QAAA,CAAS,MAAM;AACd,cAAe,cAAA,EAAA,CAAA;AAAA,aACf,CAAA,CAAA;AAAA,WACD,CAAA,CAAA;AAAA,SACD,CAAA,CAAA;AAAA,OACF;AAAA,KACD;AAAA,IACA,EAAE,IAAA,EAAM,IAAM,EAAA,SAAA,EAAW,IAAK,EAAA;AAAA,GAC/B,CAAA;AAGA,EAAA,MAAM,WAAc,GAAA,CAAC,OAAkB,EAAA,QAAA,EAAkB,MAAgB,IAAwB,KAAA;AAChG,IAAA,UAAA,CAAW,QAAQ,OAAW,IAAA,EAAA,CAAA;AAC9B,IAAiB,gBAAA,CAAA,OAAA,EAAS,QAAU,EAAA,IAAA,EAAM,IAAI,CAAA,CAAA;AAAA,GAC/C,CAAA;AAGA,EAAA,MAAM,mBAAmB,CAAC,OAAA,EAAkB,QAAkB,EAAA,IAAA,EAAgB,MAAe,SAA0B,KAAA;AACtH,IAAS,QAAA,CAAA,KAAA,GAAQ,YAAY,EAAC,CAAA;AAC9B,IAAA,IAAI,UAAY,EAAA;AACf,MAAA,MAAM,KAAK,UAAW,EAAA,CAAA;AACtB,MAAA,IAAI,EAAM,IAAA,OAAO,EAAG,CAAA,IAAA,KAAS,UAAY,EAAA;AACvC,QAAC,OAAQ,CAAA,OAAA,CAAQ,EAAE,CAAA,CAClB,KAAK,CAAO,GAAA,KAAA;AACZ,UAAA,IAAI,IAAI,MAAQ,EAAA;AACf,YAAqB,oBAAA,CAAA,KAAA,GAAQ,IAAI,aAAiB,IAAA,EAAA,CAAA;AAClD,YAAA,UAAA,CAAW,OAAS,EAAA,QAAA,EAAU,IAAM,EAAA,IAAA,EAAM,SAAS,CAAA,CAAA;AAAA,WACpD;AAAA,SACA,CACA,CAAA,KAAA,CAAM,CAAS,KAAA,KAAA;AACf,UAAA,OAAA,CAAQ,IAAI,KAAK,CAAA,CAAA;AAAA,SACjB,CAAA,CAAA;AAAA,OACI,MAAA;AACN,QAAA,IAAI,GAAG,MAAQ,EAAA;AACd,UAAqB,oBAAA,CAAA,KAAA,GAAQ,GAAG,aAAiB,IAAA,EAAA,CAAA;AACjD,UAAA,UAAA,CAAW,OAAS,EAAA,QAAA,EAAU,IAAM,EAAA,IAAA,EAAM,SAAS,CAAA,CAAA;AAAA,SACpD;AAAA,OACD;AAAA,KACD;AAAA,GACD,CAAA;AAGA,EAAA,MAAM,aAAa,CAAC,OAAA,EAAkB,QAAkB,EAAA,IAAA,EAAgB,MAAe,SAA0B,KAAA;AAChH,IAAA,IAAA,CAAK,mBAAmB,CAAA,CAAA;AACxB,IAAkB,iBAAA,CAAA,UAAA,CAAW,KAAO,EAAA,QAAA,CAAS,KAAK,CAAA,CAAA;AAClD,IAAA,QAAA,CAAS,QAAQ,IAAQ,IAAA,EAAA,CAAA;AACzB,IAAA,IAAI,WAAW,KAAM,CAAA,OAAA,CAAQ,OAAO,CAAK,IAAA,OAAA,CAAQ,SAAS,CAAG,EAAA;AAC5D,MAAA,MAAM,SAAY,GAAA,OAAA,GAAU,OAAQ,CAAA,OAAA,CAAQ,KAAO,EAAA,EAAE,CAAI,GAAA,UAAA,CAAW,KAAM,CAAA,OAAA,CAAQ,KAAO,EAAA,EAAE,EAAE,IAAK,EAAA,CAAA;AAClG,MAAA,IAAI,CAAC,SAAA,IAAa,EAAC,QAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,QAAA,CAAU,MAAU,CAAA,IAAA,IAAA;AAAM,QAAA,OAAA;AAG7C,MAAM,MAAA,UAAA,GAAa,CAAQ,KAAA,EAAA,IAAA,CAAK,GAAI,EAAA,CAAA,CAAA,CAAA;AACpC,MAAA,MAAM,WAAyC,GAAA;AAAA,QAC9C,MAAQ,EAAA,UAAA;AAAA,QACR,IAAM,EAAA,GAAA;AAAA,QACN,MAAM,IAAQ,IAAA,MAAA;AAAA,QACd,OAAS,EAAA,SAAA;AAAA,QACT,UAAY,EAAA,KAAA;AAAA,QACZ,UAAY,EAAA,IAAA;AAAA,QACZ,UAAY,EAAA,KAAA;AAAA,QACZ,MAAQ,EAAA,KAAA;AAAA,QACR,KAAA,EAAO,YAAY,EAAC;AAAA,QACpB,QAAU,EAAA,IAAA;AAAA,QACV,MAAM,IAAQ,IAAA,KAAA;AAAA,QACd,SAAS,EAAC;AAAA,QACV,SAAW,EAAA,KAAA;AAAA,QACX,SAAA;AAAA,OACD,CAAA;AACA,MAAS,QAAA,CAAA,KAAA,CAAM,KAAK,WAAW,CAAA,CAAA;AAC/B,MAAA,IAAA,CAAK,aAAe,EAAA,CAAC,GAAG,QAAA,CAAS,KAAK,CAAC,CAAA,CAAA;AAGvC,MAAA,QAAA,CAAS,MAAM;AACd,QAAA,aAAA,CAAc,YAAY,OAAS,EAAA,MAAA,EAAQ,QAAS,CAAA,KAAA,CAAM,SAAS,CAAC,CAAA,CAAA;AACpE,QAAA,QAAA,CAAS,MAAM;AACd,UAAe,cAAA,EAAA,CAAA;AAAA,SACf,CAAA,CAAA;AAAA,OACD,CAAA,CAAA;AAGD,MAAM,MAAA,MAAA,GAAS,0BAA0B,SAAS,CAAA,CAAA;AAElD,MAAA,IAAI,MAAU,IAAA,MAAA,CAAO,SAAU,CAAA,MAAA,GAAS,CAAG,EAAA;AAE1C,QAAA,MAAM,gBAA+B,EAAC,CAAA;AAEtC,QAAA,MAAA,CAAO,SAAU,CAAA,OAAA,CAAQ,CAAC,QAAA,EAAe,GAAgB,KAAA;AACxD,UAAM,MAAA,WAAA,GAAc,MAAM,OAAQ,CAAA,QAAA,CAAS,IAAI,CAAI,GAAA,QAAA,CAAS,MAAO,CAAA,EAAE,CAAI,GAAA,EAAA,CAAA;AACzE,UAAMA,MAAAA,QAAAA,GAAU,KAAM,CAAA,OAAA,CAAQ,QAAS,CAAA,IAAI,CAAI,GAAA,QAAA,CAAS,IAAK,CAAA,IAAA,CAAK,WAAW,CAAA,GAAI,QAAS,CAAA,IAAA,CAAA;AAE1F,UAAA,MAAM,QAAW,GAAA,CAAA,GAAA,EAAM,IAAK,CAAA,GAAA,EAAS,CAAA,CAAA,EAAA,GAAA,CAAA,CAAA,CAAA;AACrC,UAAA,MAAM,SAAyB,GAAA;AAAA,YAC9B,MAAQ,EAAA,QAAA;AAAA,YACR,IAAM,EAAA,IAAA;AAAA,YACN,IAAM,EAAA,MAAA;AAAA,YACN,SAASA,QAAW,IAAA,EAAA;AAAA,YACpB,aAAA,EAAe,SAAS,IAAQ,IAAA,EAAA;AAAA,YAChC,UAAY,EAAA,IAAA;AAAA,YACZ,UAAY,EAAA,IAAA;AAAA,YACZ,gBAAA,EAAkB,SAAS,IAAQ,IAAA,EAAA;AAAA,YACnC,sBAAA,EAAwB,SAAS,sBAA0B,IAAA,KAAA;AAAA,YAC3D,QAAU,EAAA,IAAA;AAAA,YACV,SAAS,EAAC;AAAA,YACV,UAAU,QAAS,CAAA,QAAA;AAAA,WACpB,CAAA;AACA,UAAA,aAAA,CAAc,KAAK,SAAS,CAAA,CAAA;AAAA,SAC5B,CAAA,CAAA;AAGD,QAAM,MAAA,YAAA,GAAe,CAAC,GAAG,aAAa,CAAA,CAAA;AACtC,QAAA,IAAI,YAAe,GAAA,KAAA,CAAA;AACnB,QAAA,IAAI,cAAqC,GAAA,IAAA,CAAA;AAGzC,QAAA,MAAM,qBAAqB,MAAM;AAChC,UAAA,IAAI,YAAa,CAAA,MAAA,GAAS,CAAK,IAAA,CAAC,YAAc,EAAA;AAC7C,YAAe,YAAA,GAAA,IAAA,CAAA;AACf,YAAM,MAAA,WAAA,GAAc,aAAa,KAAM,EAAA,CAAA;AACvC,YAAA,IAAI,WAAa,EAAA;AAChB,cAAiB,cAAA,GAAA,WAAA,CAAA;AACjB,cAAS,QAAA,CAAA,KAAA,CAAM,KAAK,cAAc,CAAA,CAAA;AAClC,cAAA,IAAA,CAAK,aAAe,EAAA,CAAC,GAAG,QAAA,CAAS,KAAK,CAAC,CAAA,CAAA;AACvC,cAAM,MAAA,QAAA,GAAW,QAAS,CAAA,KAAA,CAAM,MAAS,GAAA,CAAA,CAAA;AACzC,cAAA,QAAA,CAAS,MAAM;AACd,gBAAA,aAAA,CAAA,CAAc,cAAgB,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,cAAA,CAAA,OAAA,KAAW,EAAI,EAAA,MAAA,EAAQ,QAAQ,CAAA,CAAA;AAC7D,gBAAA,QAAA,CAAS,MAAM;AACd,kBAAe,cAAA,EAAA,CAAA;AACf,kBAAA,IAAI,cAAgB,EAAA;AACnB,oBAAA,MAAM,gBAAmB,GAAA;AAAA,sBACxB,GAAG,cAAA;AAAA,sBACH,sBAAwB,EAAA,IAAA;AAAA,qBACzB,CAAA;AACA,oBAAA,oBAAA,CAAqB,UAAU,gBAAgB,CAAA,CAAA;AAAA,mBAChD;AAAA,iBACA,CAAA,CAAA;AAAA,eACD,CAAA,CAAA;AAAA,aACF;AAAA,WACD;AAAA,SACD,CAAA;AAGA,QAAM,MAAA,qBAAA,GAAwB,CAAC,MAAmB,KAAA;AACjD,UAAI,IAAA,cAAA,IAAkB,cAAe,CAAA,MAAA,KAAW,MAAQ,EAAA;AACvD,YAAiB,cAAA,GAAA,IAAA,CAAA;AACjB,YAAe,YAAA,GAAA,KAAA,CAAA;AACf,YAAmB,kBAAA,EAAA,CAAA;AAAA,WACpB;AAAA,SACD,CAAA;AAGA,QAAA,MAAM,YAAe,GAAA;AAAA,UACpB,YAAA;AAAA,UACA,YAAA;AAAA,UACA,cAAA;AAAA,UACA,kBAAA;AAAA,UACA,qBAAA;AAAA,SACD,CAAA;AACA,QAAA,uBAAA,CAAwB,KAAQ,GAAA,YAAA,CAAA;AAGhC,QAAmB,kBAAA,EAAA,CAAA;AAAA,OACb,MAAA;AAEN,QAAM,MAAA,eAAA,GAAkB,CAAM,GAAA,EAAA,IAAA,CAAK,GAAI,EAAA,CAAA,CAAA,CAAA;AACvC,QAAA,MAAM,gBAAgC,GAAA;AAAA,UACrC,MAAQ,EAAA,eAAA;AAAA,UACR,IAAM,EAAA,IAAA;AAAA,UACN,IAAM,EAAA,MAAA;AAAA,UACN,OAAS,EAAA,WAAA;AAAA,UACT,UAAY,EAAA,IAAA;AAAA,UACZ,UAAY,EAAA,IAAA;AAAA,UACZ,SAAS,EAAC;AAAA,SACX,CAAA;AACA,QAAS,QAAA,CAAA,KAAA,CAAM,KAAK,gBAAgB,CAAA,CAAA;AACpC,QAAA,IAAA,CAAK,aAAe,EAAA,CAAC,GAAG,QAAA,CAAS,KAAK,CAAC,CAAA,CAAA;AACvC,QAAA,QAAA,CAAS,MAAM;AACd,UAAM,MAAA,QAAA,GAAW,SAAS,KAAM,CAAA,SAAA,CAAU,CAAC,IAAc,KAAA,IAAA,CAAK,WAAW,eAAe,CAAA,CAAA;AACxF,UAAA,IAAI,aAAa,CAAI,CAAA,EAAA;AACpB,YAAc,aAAA,CAAA,gBAAA,CAAiB,OAAS,EAAA,MAAA,EAAQ,QAAQ,CAAA,CAAA;AACxD,YAAA,QAAA,CAAS,MAAM;AACd,cAAe,cAAA,EAAA,CAAA;AAAA,aACf,CAAA,CAAA;AAAA,WACF;AAAA,SACA,CAAA,CAAA;AAAA,OACF;AAEA,MAAA,UAAA,CAAW,KAAQ,GAAA,EAAA,CAAA;AAAA,KACb,MAAA;AACN,MAAQ,OAAA,CAAA,GAAA,CAAI,+BAA+B,OAAO,CAAA,CAAA;AAElD,MAAA,IAAI,OAAS,EAAA;AACZ,QAAA,UAAA,CAAW,KAAQ,GAAA,OAAA,CAAA;AAAA,OACpB;AACA,MAAK,IAAA,CAAA,SAAA,CAAU,KAAU,IAAA,CAAC,UAAW,CAAA,KAAA,CAAM,MAAU,IAAA,EAAC,QAAU,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,QAAA,CAAA,MAAA,CAAA,KAAY,CAAC,IAAA;AAAM,QAAA,OAAA;AAEnF,MAAA,MAAM,aAAa,OAAU,GAAA,IAAA,CAAK,MAAO,EAAA,CAAE,SAAS,EAAE,CAAA,CAAE,KAAM,CAAA,CAAC,EAAE,MAAO,CAAA,EAAA,EAAI,GAAG,CAAE,CAAA,KAAA,CAAM,GAAG,EAAE,CAAA,CAAA;AAC5F,MAAA,MAAM,WAAyC,GAAA;AAAA,QAC9C,MAAQ,EAAA,UAAA;AAAA,QACR,IAAM,EAAA,GAAA;AAAA,QACN,MAAM,IAAQ,IAAA,MAAA;AAAA,QACd,SAAS,UAAW,CAAA,KAAA;AAAA,QACpB,KAAA,EAAO,YAAY,EAAC;AAAA,QACpB,SAAS,EAAC;AAAA,QACV,MAAQ,EAAA,KAAA;AAAA,QACR,SAAA;AAAA,OACD,CAAA;AACA,MAAQ,OAAA,CAAA,GAAA,CAAI,sBAAsB,SAAS,CAAA,CAAA;AAE3C,MAAS,QAAA,CAAA,KAAA,CAAM,KAAK,WAAW,CAAA,CAAA;AAC/B,MAAM,MAAA,KAAA,GAAQ,QAAS,CAAA,KAAA,CAAM,MAAS,GAAA,CAAA,CAAA;AACtC,MAAA,QAAA,CAAS,MAAM;AACd,QAAc,aAAA,CAAA,WAAA,CAAY,OAAS,EAAA,MAAA,EAAQ,KAAK,CAAA,CAAA;AAChD,QAAe,cAAA,EAAA,CAAA;AAAA,OACf,CAAA,CAAA;AACD,MAAA,OAAA,CAAQ,IAAI,6BAA6B,CAAA,CAAA;AACzC,MAAQ,OAAA,CAAA,UAAA,CAAW,KAAO,EAAA,KAAA,GAAQ,CAAC,CAAA,CAAA;AACnC,MAAA,UAAA,CAAW,KAAQ,GAAA,EAAA,CAAA;AAAA,KACpB;AAAA,GACD,CAAA;AAGA,EAAA,MAAM,aAAa,MAAY;AA5gBhC,IAAA,IAAA,EAAA,CAAA;AA6gBE,IAAW,UAAA,EAAA,CAAA;AAEX,IAAA,MAAM,UAAU,QAAS,CAAA,KAAA,CAAM,UAAU,CAAC,IAAA,KAAc,KAAK,SAAS,CAAA,CAAA;AACtE,IAAA,IAAI,YAAY,CAAI,CAAA,EAAA;AACnB,MAAM,MAAA,gBAAA,GAAmB,QAAS,CAAA,KAAA,CAAM,OAAO,CAAA,CAAA;AAE/C,MAAI,IAAA,CAAA,EAAA,GAAA,gBAAA,CAAiB,OAAjB,KAAA,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAA0B,IAAQ,EAAA,EAAA;AACrC,QAAA,QAAA,CAAS,MAAM;AACd,UAAS,QAAA,CAAA,KAAA,CAAM,OAAO,CAAI,GAAA;AAAA,YACzB,GAAG,gBAAA;AAAA,YACH,OAAA,EAAS,iBAAiB,OAAU,GAAA,KAAA;AAAA,YACpC,SAAW,EAAA,KAAA;AAAA,WACZ,CAAA;AACA,UAAA,aAAA,CAAc,SAAS,KAAM,CAAA,OAAO,CAAE,CAAA,OAAA,EAAS,QAAQ,OAAO,CAAA,CAAA;AAC9D,UAAK,IAAA,CAAA,aAAA,EAAe,SAAS,KAAK,CAAA,CAAA;AAAA,SAClC,CAAA,CAAA;AAAA,OACK,MAAA;AACN,QAAA,IAAI,UAAU,CAAG,EAAA;AAChB,UAAA,MAAM,mBAAmB,OAAU,GAAA,CAAA,CAAA;AACnC,UAAA,IAAI,QAAS,CAAA,KAAA,CAAM,gBAAgB,CAAA,CAAE,SAAS,GAAK,EAAA;AAClD,YAAS,QAAA,CAAA,KAAA,CAAM,MAAO,CAAA,gBAAA,EAAkB,CAAC,CAAA,CAAA;AAAA,WACnC,MAAA;AACN,YAAS,QAAA,CAAA,KAAA,CAAM,MAAO,CAAA,OAAA,EAAS,CAAC,CAAA,CAAA;AAAA,WACjC;AAAA,SACM,MAAA;AACN,UAAS,QAAA,CAAA,KAAA,CAAM,MAAO,CAAA,OAAA,EAAS,CAAC,CAAA,CAAA;AAAA,SACjC;AAAA,OACD;AAAA,KACM,MAAA;AACN,MAAM,MAAA,SAAA,GAAY,QAAS,CAAA,KAAA,CAAM,MAAS,GAAA,CAAA,CAAA;AAC1C,MAAA,IAAI,aAAa,CAAK,IAAA,QAAA,CAAS,MAAM,SAAS,CAAA,CAAE,SAAS,GAAK,EAAA;AAC7D,QAAA,QAAA,CAAS,MAAM,GAAI,EAAA,CAAA;AAAA,OACpB;AAAA,KACD;AAEA,IAAA,SAAA,CAAU,KAAQ,GAAA,KAAA,CAAA;AAAA,GACnB,CAAA;AAGA,EAAM,MAAA,mBAAA,GAAsB,CAAC,MAAA,EAAuB,KAAwB,KAAA;AAC3E,IAAM,MAAA,OAAA,GAAU,QAAS,CAAA,KAAA,CAAM,KAAK,CAAA,CAAA;AACpC,IAAA,IAAI,CAAC,OAAA;AAAS,MAAA,OAAA;AAEd,IAAA,QAAQ,MAAQ;AAAA,MACf,KAAK,cAAc,IAAM,EAAA;AAExB,QAAgB,eAAA,CAAA,OAAA,CAAQ,OAAS,EAAA,0BAAA,EAAQ,0BAAM,CAAA,CAAA;AAC/C,QAAA,MAAA;AAAA,OACD;AAAA,MACA,KAAK,aAAc,CAAA,IAAA;AAClB,QAAA,OAAA,CAAQ,SAAY,GAAA,IAAA,CAAA;AACpB,QAAA,OAAA,CAAQ,cAAc,OAAQ,CAAA,OAAA,CAAA;AAC9B,QAAA,MAAA;AAAA,MACD,KAAK,aAAc,CAAA,MAAA;AAClB,QAAA,YAAA,CAAa,mBAAmB,KAAK,CAAA,CAAA;AACrC,QAAK,IAAA,CAAA,aAAA,EAAe,SAAS,KAAK,CAAA,CAAA;AAClC,QAAA,MAAA;AAAA,MACD,KAAK,cAAc,KAAO,EAAA;AACzB,QAAM,MAAA,SAAA,GAAY,QAAS,CAAA,KAAA,CAAM,KAAK,CAAA,CAAA;AACtC,QAAA,MAAM,mBAAmB,KAAQ,GAAA,CAAA,CAAA;AACjC,QAAM,MAAA,WAAA,GAAc,QAAS,CAAA,KAAA,CAAM,gBAAgB,CAAA,CAAA;AAEnD,QAAI,IAAA,WAAA,IAAe,WAAY,CAAA,IAAA,KAAS,GAAK,EAAA;AAC5C,UAAA,MAAM,gBAAmB,GAAA;AAAA,YACxB,GAAG,SAAA;AAAA,YACH,OAAS,EAAA,EAAA;AAAA,YACT,YAAc,EAAA,EAAA;AAAA,YACd,gBAAkB,EAAA,EAAA;AAAA,YAClB,OAAS,EAAA,KAAA;AAAA,YACT,UAAY,EAAA,KAAA;AAAA,YACZ,SAAW,EAAA,IAAA;AAAA,YACX,MAAQ,EAAA,KAAA;AAAA,YACR,QAAQ,SAAU,CAAA,MAAA;AAAA,YAClB,MAAM,SAAU,CAAA,IAAA;AAAA,YAChB,MAAM,SAAU,CAAA,IAAA;AAAA,YAChB,aAAa,WAAY,CAAA,SAAA;AAAA,YACzB,cAAgB,EAAA,CAAA;AAAA,YAChB,YAAc,EAAA,CAAA;AAAA,WACf,CAAA;AACA,UAAA,QAAA,CAAS,KAAM,CAAA,MAAA,CAAO,KAAO,EAAA,CAAA,EAAG,gBAAgB,CAAA,CAAA;AAEhD,UAAA,QAAA,CAAS,MAAM;AACd,YAAI,IAAA,cAAA,CAAe,MAAM,KAAK,CAAA;AAAG,cAAe,cAAA,CAAA,KAAA,CAAM,KAAK,CAAA,CAAE,SAAY,GAAA,EAAA,CAAA;AACzE,YAAI,IAAA,kBAAA,CAAmB,MAAM,KAAK,CAAA;AAAG,cAAmB,kBAAA,CAAA,KAAA,CAAM,KAAK,CAAA,CAAE,SAAY,GAAA,EAAA,CAAA;AACjF,YAAI,IAAA,mBAAA,CAAoB,MAAM,KAAK,CAAA;AAAG,cAAoB,mBAAA,CAAA,KAAA,CAAM,KAAK,CAAA,CAAE,SAAY,GAAA,EAAA,CAAA;AACnF,YAAA,UAAA,CAAW,MAAM;AAChB,cAAM,MAAA,UAAA,GAAc,WAAY,CAAA,KAAA,IAAoC,EAAC,CAAA;AACrE,cAAA,QAAA,CAAS,KAAQ,GAAA,UAAA,CAAA;AACjB,cAAkB,iBAAA,CAAA,WAAA,CAAY,OAAW,IAAA,EAAA,EAAI,UAAU,CAAA,CAAA;AACvD,cAAQ,OAAA,CAAA,WAAA,CAAY,OAAW,IAAA,EAAA,EAAI,KAAK,CAAA,CAAA;AAAA,eACtC,EAAE,CAAA,CAAA;AAAA,WACL,CAAA,CAAA;AAAA,SACF;AACA,QAAA,MAAA;AAAA,OACD;AAAA,MACA,KAAK,aAAc,CAAA,IAAA;AAClB,QAAA,YAAA,CAAa,cAAc,KAAO,EAAA;AAAA,UACjC,OAAS,EAAA,IAAA;AAAA,UACT,UAAY,EAAA,KAAA;AAAA,SACZ,CAAA,CAAA;AACD,QAAA,MAAA;AAAA,MACD,KAAK,aAAc,CAAA,OAAA;AAClB,QAAA,YAAA,CAAa,cAAc,KAAO,EAAA;AAAA,UACjC,OAAS,EAAA,KAAA;AAAA,UACT,UAAY,EAAA,IAAA;AAAA,SACZ,CAAA,CAAA;AACD,QAAA,MAAA;AAAA,MACD,KAAK,aAAc,CAAA,QAAA;AAClB,QAAA,OAAA,CAAQ,IAAI,UAAU,CAAA,CAAA;AACtB,QAAA,YAAA,CAAa,cAAc,KAAO,EAAA;AAAA,UACjC,UAAY,EAAA,IAAA;AAAA,UACZ,IAAM,EAAA,UAAA;AAAA,SACN,CAAA,CAAA;AACD,QAAA,MAAA;AAAA,KACF;AAAA,GACD,CAAA;AAGA,EAAM,MAAA,QAAA,GAAW,CAAC,KAAA,EAAe,UAA6B,KAAA;AAC7D,IAAM,MAAA,OAAA,GAAU,QAAS,CAAA,KAAA,CAAM,KAAK,CAAA,CAAA;AACpC,IAAI,IAAA,CAAC,OAAW,IAAA,CAAC,OAAQ,CAAA,WAAA;AAAa,MAAA,OAAA;AAEtC,IAAS,QAAA,CAAA,KAAA,CAAM,KAAK,CAAI,GAAA;AAAA,MACvB,GAAG,OAAA;AAAA,MACH,OAAS,EAAA,UAAA;AAAA,MACT,SAAW,EAAA,KAAA;AAAA,MACX,WAAa,EAAA,KAAA,CAAA;AAAA,KACd,CAAA;AACA,IAAA,QAAA,CAAS,MAAM;AACd,MAAc,aAAA,CAAA,UAAA,EAAY,QAAQ,KAAK,CAAA,CAAA;AAAA,KACvC,CAAA,CAAA;AAGD,IAAM,MAAA,YAAA,GAAe,KAAQ,GAAA,CAAA,GAAI,QAAS,CAAA,KAAA,CAAM,MAAU,IAAA,QAAA,CAAS,KAAM,CAAA,KAAA,GAAQ,CAAC,CAAA,CAAE,IAAS,KAAA,IAAA,CAAA;AAC7F,IAAA,IAAI,YAAc,EAAA;AACjB,MAAA,QAAA,CAAS,KAAM,CAAA,MAAA,CAAO,KAAQ,GAAA,CAAA,EAAG,CAAC,CAAA,CAAA;AAAA,KACnC;AAIA,IAAA,MAAM,iBAAiB,KAAQ,GAAA,CAAA,CAAA;AAI/B,IAAA,QAAA,CAAS,MAAM;AACd,MAAM,MAAA,WAAA,GAAe,OAAQ,CAAA,KAAA,IAAoC,EAAC,CAAA;AAClE,MAAA,QAAA,CAAS,KAAQ,GAAA,WAAA,CAAA;AACjB,MAAA,iBAAA,CAAkB,YAAY,WAAW,CAAA,CAAA;AACzC,MAAA,OAAA,CAAQ,YAAY,cAAc,CAAA,CAAA;AAAA,KAClC,CAAA,CAAA;AACD,IAAK,IAAA,CAAA,aAAA,EAAe,SAAS,KAAK,CAAA,CAAA;AAAA,GACnC,CAAA;AAGA,EAAM,MAAA,UAAA,GAAa,CAAC,KAAwB,KAAA;AAC3C,IAAM,MAAA,OAAA,GAAU,QAAS,CAAA,KAAA,CAAM,KAAK,CAAA,CAAA;AACpC,IAAA,IAAI,CAAC,OAAA;AAAS,MAAA,OAAA;AAEd,IAAA,OAAA,CAAQ,SAAY,GAAA,KAAA,CAAA;AACpB,IAAA,OAAA,CAAQ,WAAc,GAAA,EAAA,CAAA;AACtB,IAAA,QAAA,CAAS,MAAM;AACd,MAAc,aAAA,CAAA,OAAA,CAAQ,OAAS,EAAA,MAAA,EAAQ,KAAK,CAAA,CAAA;AAAA,KAC5C,CAAA,CAAA;AAAA,GACF,CAAA;AAGA,EAAA,MAAM,kBAAkB,MAAM;AAC7B,IAAA,UAAA,CAAW,KAAQ,GAAA,IAAA,CAAA;AAEnB,IAAA,IAAI,6CAAc,KAAO,EAAA;AACxB,MAAA,YAAA,CAAa,MAAM,aAAc,EAAA,CAAA;AAAA,KAClC;AAAA,GACD,CAAA;AAEA,EAAM,MAAA,eAAA,GAAkB,CAAC,CAAiB,KAAA;AACzC,IAAM,MAAA,IAAA,GAAQ,CAAE,CAAA,MAAA,CAAuB,qBAAsB,EAAA,CAAA;AAC7D,IAAA,IAAI,CAAE,CAAA,OAAA,GAAU,IAAK,CAAA,IAAA,IAAQ,EAAE,OAAU,GAAA,IAAA,CAAK,KAAS,IAAA,CAAA,CAAE,UAAU,IAAK,CAAA,GAAA,IAAO,CAAE,CAAA,OAAA,GAAU,KAAK,MAAQ,EAAA;AACvG,MAAA,UAAA,CAAW,KAAQ,GAAA,KAAA,CAAA;AAAA,KACpB;AAAA,GACD,CAAA;AAEA,EAAM,MAAA,UAAA,GAAa,OAAO,CAAiB,KAAA;AAlsB5C,IAAA,IAAA,EAAA,CAAA;AAmsBE,IAAA,UAAA,CAAW,KAAQ,GAAA,KAAA,CAAA;AAGnB,IAAM,MAAA,KAAA,GAAA,CAAQ,EAAE,GAAA,CAAA,CAAA,YAAA,KAAF,IAAgB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,KAAA,CAAA;AAC9B,IAAI,IAAA,KAAA,IAAS,KAAM,CAAA,MAAA,GAAS,CAAG,EAAA;AAC9B,MAAM,MAAA,QAAA,GAAW,MAAM,OAAQ,CAAA,GAAA;AAAA,QAC9B,MAAM,IAAK,CAAA,KAAK,CAAE,CAAA,GAAA,CAAI,OAAM,IAAQ,KAAA;AACnC,UAAA,IAAI,MAAS,GAAA,EAAA,CAAA;AACb,UAAA,IAAI,IAAK,CAAA,IAAA,CAAK,UAAW,CAAA,QAAQ,CAAG,EAAA;AACnC,YAAS,MAAA,GAAA,MAAM,IAAI,OAAA,CAAQ,CAAW,OAAA,KAAA;AACrC,cAAM,MAAA,MAAA,GAAS,IAAI,UAAW,EAAA,CAAA;AAC9B,cAAO,MAAA,CAAA,MAAA,GAAS,CAAAC,EAAK,KAAA;AA9sB5B,gBAAAC,IAAAA,GAAAA,CAAAA;AA+sBQ,gBAAA,OAAA,CAAA,CAAQA,GAAAD,GAAAA,EAAAA,CAAE,MAAF,KAAA,IAAA,GAAA,KAAA,CAAA,GAAAC,IAAU,MAAgB,CAAA,CAAA;AAAA,eACnC,CAAA;AACA,cAAA,MAAA,CAAO,cAAc,IAAI,CAAA,CAAA;AAAA,aACzB,CAAA,CAAA;AAAA,WACF;AACA,UAAO,OAAA;AAAA,YACN,IAAI,IAAK,CAAA,MAAA,EAAS,CAAA,QAAA,CAAS,EAAE,CAAE,CAAA,KAAA,CAAM,CAAC,CAAA,CAAE,OAAO,EAAI,EAAA,GAAG,CAAE,CAAA,KAAA,CAAM,GAAG,EAAE,CAAA;AAAA,YACnE,IAAA;AAAA,YACA,MAAM,IAAK,CAAA,IAAA;AAAA,YACX,UAAU,IAAK,CAAA,IAAA;AAAA,YACf,UAAU,IAAK,CAAA,IAAA;AAAA,YACf,cAAc,IAAK,CAAA,YAAA;AAAA,YACnB,OAAA,EAAS,GAAI,CAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,YACjC,MAAA;AAAA,WACD,CAAA;AAAA,SACA,CAAA;AAAA,OACF,CAAA;AAEA,MAAA,IAAI,6CAAc,KAAO,EAAA;AACxB,QAAa,YAAA,CAAA,KAAA,CAAM,WAAY,CAAA,QAAA,EAAU,MAAM,CAAA,CAAA;AAAA,OAChD;AAAA,KACD;AAGA,IAAA,IAAI,6CAAc,KAAO,EAAA;AACxB,MAAA,YAAA,CAAa,MAAM,cAAe,EAAA,CAAA;AAAA,KACnC;AAAA,GACD,CAAA;AAGA,EAAA,MAAM,YAAY,MAAM;AACvB,IAAI,IAAA,CAAC,UAAU,KAAO,EAAA;AACrB,MAAK,IAAA,EAAA,CAAA;AAAA,KACN;AACA,IAAA,SAAA,CAAU,KAAQ,GAAA,IAAA,CAAA;AAAA,GACnB,CAAA;AAEA,EAAA,MAAM,kBAAkB,MAAM;AAC7B,IAAI,IAAA,CAAC,aAAa,KAAO,EAAA;AACxB,MAAA,YAAA,CAAa,KAAQ,GAAA,IAAA,CAAA;AACrB,MAAW,UAAA,EAAA,CAAA;AACX,MAAA,SAAA,CAAU,KAAQ,GAAA,KAAA,CAAA;AAAA,KACnB;AAAA,GACD,CAAA;AAEA,EAAO,OAAA;AAAA;AAAA,IAEN,QAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,kBAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA,oBAAA;AAAA,IACA,QAAA;AAAA,IACA,gBAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA,uBAAA;AAAA,IACA,YAAA;AAAA,IACA,cAAA;AAAA,IACA,kBAAA;AAAA,IACA,mBAAA;AAAA;AAAA,IAEA,IAAA;AAAA,IACA,WAAA;AAAA,IACA,gBAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA,mBAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,gBAAA;AAAA,IACA,iBAAA;AAAA,IACA,MAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA,oBAAA;AAAA,IACA,eAAA;AAAA,IACA,eAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,eAAA;AAAA,IACA,UAAA;AAAA,IACA,cAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA;AAAA,GACD,CAAA;AACD;;;;"}
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\tfileData,\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, quoteData?: any): 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, quoteData)\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, quoteData)\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, quoteData?: any): 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: type || '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\tselecting: false,\n\t\t\t\tquoteData\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\tlikeList: response.likeList\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: type || '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\tquoteData\n\t\t\t}\n\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)\n\t\t\tinputValue.value = ''\n\t\t}\n\t}\n\n\t// 停止生成\n\tconst handleStop = (): void => {\n\t\tcleanupSSE()\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\tconst retryFiles = (userMessage.files as FileItem[] | undefined) || []\n\t\t\t\t\t\t\tfileData.value = retryFiles\n\t\t\t\t\t\t\tsendMessageInject(userMessage.content || '', retryFiles)\n\t\t\t\t\t\t\topenSSE(userMessage.content || '', index)\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\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\tconst editedFiles = (message.files as FileItem[] | undefined) || []\n\t\t\tfileData.value = editedFiles\n\t\t\tsendMessageInject(newContent, editedFiles)\n\t\t\topenSSE(newContent, insertPosition)\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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"}
@@ -85,6 +85,7 @@ function mapFileItemsToFilesPayload(items) {
85
85
  function useSSE({ chatList, currIndex, isChating, isMounted, isUnmounting, enableDeepThinking, currentComponentName, typeFlag, moduleInfo, fileData, emit, afterSend, enqueueRender, renderContent, markdownToHtml, stop }) {
86
86
  const fetchStream = ref(null);
87
87
  const resultItem = ref(null);
88
+ const isAborting = ref(false);
88
89
  const generateChatId = (prefix = "ai_") => {
89
90
  return prefix + Math.random().toString(36).slice(2).padEnd(10, "0").slice(0, 10);
90
91
  };
@@ -93,6 +94,7 @@ function useSSE({ chatList, currIndex, isChating, isMounted, isUnmounting, enabl
93
94
  try {
94
95
  if (isUnmounting.value)
95
96
  return;
97
+ isAborting.value = false;
96
98
  isChating.value = true;
97
99
  const currentAiMessage = chatList.value.find((item) => item.isChating);
98
100
  if (currentAiMessage) {
@@ -166,7 +168,7 @@ function useSSE({ chatList, currIndex, isChating, isMounted, isUnmounting, enabl
166
168
  },
167
169
  onmessage: (line) => {
168
170
  var _a2, _b2, _c2, _d2, _e2, _f2, _g2, _h2, _i2, _j2;
169
- if (isUnmounting.value)
171
+ if (isUnmounting.value || isAborting.value)
170
172
  return;
171
173
  let dataString = "";
172
174
  if (line.length) {
@@ -340,11 +342,14 @@ function useSSE({ chatList, currIndex, isChating, isMounted, isUnmounting, enabl
340
342
  }
341
343
  };
342
344
  const handleAbort = () => {
345
+ if (isAborting.value)
346
+ return;
347
+ isAborting.value = true;
343
348
  isChating.value = false;
344
349
  if (isUnmounting.value)
345
350
  return;
346
- const currentAiMessage = chatList.value[currIndex.value];
347
351
  stop(chatList.value[currIndex.value], currIndex.value);
352
+ const currentAiMessage = chatList.value[currIndex.value];
348
353
  const hasContent = currentAiMessage && (currentAiMessage.content || currentAiMessage.thinkContent || currentAiMessage.reasoningContent);
349
354
  if (currentAiMessage) {
350
355
  if (currentAiMessage.thinkStatus === ThinkStatus.THINKING) {
@@ -352,13 +357,15 @@ function useSSE({ chatList, currIndex, isChating, isMounted, isUnmounting, enabl
352
357
  currentAiMessage.thinkTime = Date.now() - (currentAiMessage.thinkStartTime || Date.now());
353
358
  }
354
359
  if (!hasContent) {
355
- const userMessageIndex = currIndex.value - 1;
356
- if (userMessageIndex >= 0 && chatList.value[userMessageIndex].user === "u") {
357
- chatList.value.splice(currIndex.value, 1);
358
- chatList.value.splice(userMessageIndex, 1);
359
- } else {
360
- chatList.value.splice(currIndex.value, 1);
361
- }
360
+ currentAiMessage.content = `<div style="color: red; display: flex; align-items: center;"><svg xmlns="http://www.w3.org/2000/svg" width="15" height="16" viewBox="0 0 15 16" fill="none">
361
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 15.5C11.6421 15.5 15 12.1421 15 8C15 3.85786 11.6421 0.5 7.5 0.5C3.35786 0.5 0 3.85786 0 8C0 12.1421 3.35786 15.5 7.5 15.5ZM9.7539 4.9506L10.5494 5.7461L8.2951 8.0001L10.5494 10.2539L9.7539 11.0494L7.5001 8.7951L5.2461 11.0494L4.4506 10.2539L6.7051 8.0001L4.4506 5.7461L5.2461 4.9506L7.5001 7.2051L9.7539 4.9506Z" fill="#F93920"/>
362
+ </svg>${"\u7528\u6237\u6267\u884C\u4E86\u4E3B\u52A8\u7EC8\u6B62\u64CD\u4F5C"}</div>`;
363
+ currentAiMessage.isChating = false;
364
+ nextTick(() => {
365
+ renderContent(currentAiMessage.content || "", "main");
366
+ emit("sendMessage", [...chatList.value]);
367
+ });
368
+ return;
362
369
  } else {
363
370
  const updatedAiMessage = {
364
371
  ...currentAiMessage,