@touchvue/chat 1.0.0-beta.48 → 1.0.0-beta.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/es/package.json.mjs +1 -1
- package/es/packages/components/touchchat/component/QuoteContent.vue2.mjs +19 -8
- package/es/packages/components/touchchat/component/QuoteContent.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/component/UploadView.vue2.mjs +51 -14
- package/es/packages/components/touchchat/component/UploadView.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/Chat/types.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/Chat/useChat.mjs +3 -1
- package/es/packages/components/touchchat/src/AiChat/Chat/useChat.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/Chat/useSSE.mjs +14 -4
- package/es/packages/components/touchchat/src/AiChat/Chat/useSSE.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/ChatInput.vue2.mjs +10 -1
- package/es/packages/components/touchchat/src/AiChat/ChatInput.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/TouchAgent.vue2.mjs +39 -0
- package/es/packages/components/touchchat/src/AiChat/TouchAgent.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/AiChat/TouchChat.vue2.mjs +32 -11
- package/es/packages/components/touchchat/src/AiChat/TouchChat.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/index.vue2.mjs +7 -2
- package/es/packages/components/touchchat/src/index.vue2.mjs.map +1 -1
- package/es/packages/components/touchchat/src/types/a2a.mjs.map +1 -1
- package/lib/package.json.js +1 -1
- package/lib/packages/components/touchchat/component/QuoteContent.vue2.js +18 -7
- package/lib/packages/components/touchchat/component/QuoteContent.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/component/UploadView.vue2.js +50 -13
- package/lib/packages/components/touchchat/component/UploadView.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/Chat/types.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/Chat/useChat.js +3 -1
- package/lib/packages/components/touchchat/src/AiChat/Chat/useChat.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/Chat/useSSE.js +14 -4
- package/lib/packages/components/touchchat/src/AiChat/Chat/useSSE.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/ChatInput.vue2.js +10 -1
- package/lib/packages/components/touchchat/src/AiChat/ChatInput.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/TouchAgent.vue2.js +39 -0
- package/lib/packages/components/touchchat/src/AiChat/TouchAgent.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/AiChat/TouchChat.vue2.js +31 -10
- package/lib/packages/components/touchchat/src/AiChat/TouchChat.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/index.vue2.js +6 -1
- package/lib/packages/components/touchchat/src/index.vue2.js.map +1 -1
- package/lib/packages/components/touchchat/src/types/a2a.js.map +1 -1
- package/package.json +1 -1
- package/theme/components/index.css +41 -0
- package/theme/index.css +41 -0
- package/theme/skin/default.css +41 -0
package/es/package.json.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { defineComponent, openBlock, createElementBlock, createElementVNode, toDisplayString } from 'vue';
|
|
1
|
+
import { defineComponent, openBlock, createElementBlock, createElementVNode, toDisplayString, createCommentVNode } from 'vue';
|
|
2
2
|
|
|
3
3
|
var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
4
4
|
__name: "QuoteContent",
|
|
@@ -8,14 +8,25 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
8
8
|
const props = __props;
|
|
9
9
|
const emits = __emit;
|
|
10
10
|
return (_ctx, _cache) => {
|
|
11
|
+
var _a, _b, _c, _d, _e, _f;
|
|
11
12
|
return openBlock(), createElementBlock("div", { class: "quote-content" }, [
|
|
12
|
-
createElementVNode(
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
13
|
+
createElementVNode("div", { class: "quote-content-text" }, [
|
|
14
|
+
createElementVNode(
|
|
15
|
+
"span",
|
|
16
|
+
null,
|
|
17
|
+
toDisplayString(props.quoteObj.user) + "\uFF1A",
|
|
18
|
+
1
|
|
19
|
+
/* TEXT */
|
|
20
|
+
),
|
|
21
|
+
((_a = props.quoteObj.msgList[0]) == null ? void 0 : _a.type) === "text" || ((_b = props.quoteObj.msgList[0]) == null ? void 0 : _b.type) === "markdown" ? (openBlock(), createElementBlock(
|
|
22
|
+
"span",
|
|
23
|
+
{ key: 0 },
|
|
24
|
+
toDisplayString((_c = props.quoteObj.msgList[0]) == null ? void 0 : _c.content),
|
|
25
|
+
1
|
|
26
|
+
/* TEXT */
|
|
27
|
+
)) : createCommentVNode("v-if", true),
|
|
28
|
+
((_d = props.quoteObj.msgList[0]) == null ? void 0 : _d.type) === "a2ui" || ((_e = props.quoteObj.msgList[0]) == null ? void 0 : _e.type) === "component" && ((_f = props.quoteObj.msgList[0]) == null ? void 0 : _f.displayMode) === "inline" ? (openBlock(), createElementBlock("span", { key: 1 }, "[\u7EC4\u4EF6]")) : createCommentVNode("v-if", true)
|
|
29
|
+
]),
|
|
19
30
|
createElementVNode("div", {
|
|
20
31
|
class: "touchchat-action-item value-close-fill",
|
|
21
32
|
onClick: ($event) => emits("close")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QuoteContent.vue2.mjs","sources":["../../../../../../packages/components/touchchat/component/QuoteContent.vue"],"sourcesContent":["<template>\n\t<div class=\"quote-content\">\n\t\t<div class=\"quote-content-text\">{{ props.quoteObj.content }}</div>\n\t\t<div class=\"touchchat-action-item value-close-fill\" @click=\"emits('close')\"></div>\n\t</div>\n</template>\n<script lang=\"ts\" setup>\nconst props = defineProps(['quoteObj'])\nconst emits = defineEmits(['close'])\n</script>\n"],"names":["_createElementBlock","_createElementVNode"],"mappings":";;;;;;;
|
|
1
|
+
{"version":3,"file":"QuoteContent.vue2.mjs","sources":["../../../../../../packages/components/touchchat/component/QuoteContent.vue"],"sourcesContent":["<template>\n\t<div class=\"quote-content\">\n\t\t<div class=\"quote-content-text\">\n\t\t\t<span>{{ props.quoteObj.user }}:</span>\n\t\t\t<span v-if=\"props.quoteObj.msgList[0]?.type === 'text' || props.quoteObj.msgList[0]?.type === 'markdown'\">{{ props.quoteObj.msgList[0]?.content }}</span>\n\t\t\t<span v-if=\"props.quoteObj.msgList[0]?.type === 'a2ui' || (props.quoteObj.msgList[0]?.type === 'component' && props.quoteObj.msgList[0]?.displayMode === 'inline')\">[组件]</span>\n\t\t</div>\n\t\t<div class=\"touchchat-action-item value-close-fill\" @click=\"emits('close')\"></div>\n\t</div>\n</template>\n<script lang=\"ts\" setup>\nconst props = defineProps(['quoteObj'])\nconst emits = defineEmits(['close'])\n</script>\n"],"names":["_createElementBlock","_createElementVNode","_openBlock"],"mappings":";;;;;;;AAWA,IAAA,MAAM,KAAQ,GAAA,OAAA,CAAA;AACd,IAAA,MAAM,KAAQ,GAAA,MAAA,CAAA;;;wBAXb,EAAAA,kBAAA,CAOM,OAAA,EAPD,KAAA,EAAM,iBAAe,EAAA;AAAA,QACzBC,kBAIM,CAAA,KAAA,EAAA,EAJD,KAAA,EAAM,sBAAoB,EAAA;AAAA,UAC9BA,kBAAA;AAAA,YAAuC,MAAA;AAAA;2BAA9B,CAAA,KAAA,CAAM,QAAS,CAAA,IAAI,CAAG,GAAA,QAAA;AAAA,YAAC,CAAA;AAAA;AAAA,WAAA;AAAA,UAAA,CAAA,CACpB,WAAM,QAAS,CAAA,OAAA,CAAY,CAAA,CAAA,KAA3B,mBAA2B,IAAmB,MAAA,MAAA,IAAA,CAAA,CAAA,EAAM,GAAA,KAAA,CAAA,QAAA,CAAS,eAAf,mBAA2B,IAAI,MAAA,UAAA,IAAzFC,WAAA,EAAAF,kBAAA;AAAA,YAAyJ,MAAA;AAAA;6BAA5C,EAAM,GAAA,KAAA,CAAA,QAAA,CAAS,eAAf,mBAA2B,OAAO,CAAA;AAAA,YAAA,CAAA;AAAA;AAAA,WAAA;YACnI,WAAM,QAAS,CAAA,OAAA,QAAf,mBAA2B,IAAI,MAAA,MAAA,IAAA,CAAA,CAAgB,EAAM,GAAA,KAAA,CAAA,QAAA,CAAS,QAAO,CAAA,CAAA,KAAtB,IAA2B,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,IAAA,MAAwB,iBAAA,EAAM,GAAA,KAAA,CAAA,QAAA,CAAS,OAAO,CAAA,CAAA,MAAtB,IAA2B,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,WAAA,MAAW,QAApJ,IAAAE,SAAA,IAAAF,kBAA+K,CAAA,MAAA,YAAX,EAAA,gBAAI;;QAEzKC,mBAAkF,KAAA,EAAA;AAAA,UAA7E,KAAM,EAAA,wCAAA;AAAA,UAA0C,gBAAO,KAAA,KAAA,CAAK,OAAA,CAAA;AAAA;;;;;;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { defineComponent,
|
|
1
|
+
import { defineComponent, inject, ref, openBlock, createElementBlock, createCommentVNode, createElementVNode, renderSlot } from 'vue';
|
|
2
2
|
import { showToast } from '../utils/tools.mjs';
|
|
3
3
|
|
|
4
4
|
var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
@@ -8,6 +8,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
8
8
|
},
|
|
9
9
|
emits: ["upload-file"],
|
|
10
10
|
setup(__props, { expose: __expose, emit: __emit }) {
|
|
11
|
+
const uploadAction = inject("uploadAction", null);
|
|
11
12
|
const props = __props;
|
|
12
13
|
const emit = __emit;
|
|
13
14
|
const fileInput = ref(null);
|
|
@@ -24,6 +25,11 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
24
25
|
if (input.files && input.files.length > 0) {
|
|
25
26
|
for (let i = 0; i < input.files.length; i++) {
|
|
26
27
|
const file = input.files[i];
|
|
28
|
+
const exists = fileInfos.value.some((f) => f.name === file.name && f.fileSize === formatFileSize(file.size));
|
|
29
|
+
if (exists) {
|
|
30
|
+
showToast(`\u6587\u4EF6"${file.name}"\u5DF2\u5B58\u5728`, "info", 3e3);
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
27
33
|
if (!isFileTypeAllowed(file) && types.value.length > 0) {
|
|
28
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);
|
|
29
35
|
continue;
|
|
@@ -66,15 +72,18 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
66
72
|
uploadFile(fileInfos.value.length - 1);
|
|
67
73
|
}
|
|
68
74
|
}
|
|
75
|
+
if (fileInput.value) {
|
|
76
|
+
fileInput.value.value = "";
|
|
77
|
+
}
|
|
69
78
|
}
|
|
70
|
-
console.log(fileInfos.value, "fileInfos.value");
|
|
71
79
|
};
|
|
72
80
|
const isFileTypeAllowed = (file) => {
|
|
73
81
|
var _a;
|
|
74
82
|
const fileExtension = (_a = file.name.split(".").pop()) == null ? void 0 : _a.toLowerCase();
|
|
75
83
|
return types.value.includes(fileExtension || "");
|
|
76
84
|
};
|
|
77
|
-
const uploadFile = (index, type) => {
|
|
85
|
+
const uploadFile = async (index, type) => {
|
|
86
|
+
var _a, _b;
|
|
78
87
|
const fileInfo = fileInfos.value[index];
|
|
79
88
|
if (!fileInfo || !fileInfo.file)
|
|
80
89
|
return;
|
|
@@ -86,19 +95,47 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
86
95
|
fileInfo.fileType = fileInfo.file.type;
|
|
87
96
|
fileInfo.id = fileInfo.file.lastModified.toString();
|
|
88
97
|
fileInfo.name = fileInfo.file.name;
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
fileInfo.
|
|
98
|
+
if (type)
|
|
99
|
+
return;
|
|
100
|
+
if (uploadAction) {
|
|
101
|
+
let progressCalled = false;
|
|
102
|
+
const progressTimer = setInterval(() => {
|
|
103
|
+
if (progressCalled)
|
|
104
|
+
return;
|
|
105
|
+
if (fileInfo.uploadProgress !== void 0 && fileInfo.uploadProgress < 90) {
|
|
106
|
+
fileInfo.uploadProgress += 10;
|
|
107
|
+
emit("upload-file", fileInfos.value);
|
|
108
|
+
}
|
|
109
|
+
}, 100);
|
|
110
|
+
try {
|
|
111
|
+
const res = await uploadAction(fileInfo.file, (percent) => {
|
|
112
|
+
progressCalled = true;
|
|
113
|
+
fileInfo.uploadProgress = percent;
|
|
114
|
+
emit("upload-file", fileInfos.value);
|
|
115
|
+
});
|
|
116
|
+
clearInterval(progressTimer);
|
|
97
117
|
fileInfo.uploadSuccess = true;
|
|
118
|
+
fileInfo.uploadProgress = 100;
|
|
119
|
+
fileInfo.url = (res == null ? void 0 : res.url) || ((_a = res == null ? void 0 : res.data) == null ? void 0 : _a.url);
|
|
120
|
+
fileInfo.fileId = (res == null ? void 0 : res.id) || ((_b = res == null ? void 0 : res.data) == null ? void 0 : _b.id);
|
|
121
|
+
} catch (e) {
|
|
122
|
+
clearInterval(progressTimer);
|
|
123
|
+
fileInfo.uploadError = true;
|
|
98
124
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
125
|
+
fileInfo.isUploading = false;
|
|
126
|
+
emit("upload-file", fileInfos.value);
|
|
127
|
+
} else {
|
|
128
|
+
const interval = setInterval(() => {
|
|
129
|
+
if (fileInfo.uploadProgress !== void 0) {
|
|
130
|
+
fileInfo.uploadProgress += 10;
|
|
131
|
+
}
|
|
132
|
+
emit("upload-file", fileInfos.value);
|
|
133
|
+
if (fileInfo.uploadProgress !== void 0 && fileInfo.uploadProgress >= 100) {
|
|
134
|
+
clearInterval(interval);
|
|
135
|
+
fileInfo.isUploading = false;
|
|
136
|
+
fileInfo.uploadSuccess = true;
|
|
137
|
+
}
|
|
138
|
+
}, 100);
|
|
102
139
|
}
|
|
103
140
|
};
|
|
104
141
|
const formatFileSize = (bytes) => {
|
|
@@ -1 +1 @@
|
|
|
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\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\tif (!isFileTypeAllowed(file) && types.value.length > 0) {\n\t\t\t\tshowToast(`文件类型${file.type}不允许上传,请上传${types.value.join('、')}类型文件`, 'info', 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}\n\tconsole.log(fileInfos.value, 'fileInfos.value')\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 = (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\tconst interval = setInterval(() => {\n\t\tif (fileInfo.uploadProgress !== undefined) {\n\t\t\tfileInfo.uploadProgress += 10\n\t\t}\n\t\t// emit('progressFn', fileInfo.uploadProgress)\n\t\temit('upload-file', fileInfos.value)\n\t\tif (fileInfo.uploadProgress !== undefined && fileInfo.uploadProgress >= 100) {\n\t\t\tclearInterval(interval)\n\t\t\tfileInfo.isUploading = false\n\t\t\tfileInfo.uploadSuccess = true\n\t\t}\n\t}, 100)\n\n\t// 模拟上传失败的情况,可根据需求修改\n\tif (type) {\n\t\treturn\n\t}\n\t// setTimeout(() => {\n\t// \tclearInterval(interval)\n\t// \tfileInfo.isUploading = false\n\t// \tfileInfo.uploadError = true\n\t// }, 500)\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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"}
|
|
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}\"已存在`, 'info', 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('、')}类型文件`, 'info', 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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.mjs","sources":["../../../../../../../../packages/components/touchchat/src/AiChat/Chat/types.ts"],"sourcesContent":["/**\n * TouchChat 类型定义\n */\n\nexport enum ThinkStatus {\n\tTHINKING = 'thinking',\n\tCOMPLETED = 'completed',\n\tSTOPPED = 'stopped'\n}\n\nexport interface ChatMessage {\n\tchatId?: string\n\tuser: 'u' | 'ai' | string\n\ttype: string\n\tcontent: string\n\tisChating?: boolean\n\tthinkContent?: string\n\treasoningContent?: string\n\tisLiked?: boolean\n\tisDisliked?: boolean\n\tisEditing?: boolean\n\teditContent?: string\n\tthinkStatus?: ThinkStatus\n\tthinkStartTime?: number\n\tthinkTime?: number\n\tthinkEndTime?: number\n\tisShowLike?: boolean\n\tisShowCopy?: boolean\n\tisWithDraw?: boolean\n\tcomponentName?: string\n\ttypeFlag?: string\n\tfiles?: FileItem[]\n\thtml?: string\n\tisError?: boolean\n\tauto?: boolean\n\tneedSequenceProcessing?: boolean\n\tneedSequenceType?: string\n\tstop?: boolean\n\tmsgList: any[]\n\tdataObj?: any\n\tlikeList?: any[]\n}\n\nexport interface ChatMsgList {\n\t[key: string]: any\n}\n\nexport interface AgentsItem {\n\tname: string\n\tintro: string\n\t[key: string]: any\n}\n\nexport interface ScriptContentItem {\n\tuser: 'i' | 'ai'\n\tdata?: string\n\ttype?: string\n\tagents?: string\n\tfile?: string\n\talias?: string | string[]\n\t[key: string]: any\n}\n\nexport interface Script {\n\tcontent: ScriptContentItem[]\n\t[key: string]: any\n}\n\nexport interface ModuleConfig {\n\taction?: () => string\n\theaders?: () => Record<string, string>\n\tbody?: () => Record<string, any>\n\trespoKey?: () => RespoKeyConfig\n\tname?: string\n}\n\nexport interface RespoKeyConfig {\n\tcontent: string\n\tcategory: string\n\tcontentCategory?: string\n\tall?: string\n\tallCategory?: string\n}\n\nexport interface ModuleItem {\n\tname?: string\n\tconfig?: ModuleConfig\n\t[key: string]: any\n}\n\nexport interface FileItem {\n\tid?: string\n\tfile?: File\n\tname: string\n\tfileType: string\n\tfileSize: string\n\tlastModified: number\n\tpreview?: string\n\tbase64?: string\n\t// 文件上传相关字段\n\tisUploading?: boolean\n\tuploadProgress?: number\n\tuploadSuccess?: boolean\n\tuploadError?: boolean\n\t[key: string]: any\n}\n\nexport interface RenderData {\n\tmainContent: string\n\tthinkContent: string\n\treasoningContent: string\n}\n\nexport enum MessageAction {\n\tCOPY = 'copy',\n\tEDIT = 'edit',\n\tDELETE = 'delete',\n\tRETRY = 'retry',\n\tLIKE = 'like',\n\tDISLIKE = 'dislike',\n\tWITHDRAW = 'withDraw'\n}\n\nexport interface ResultItem {\n\tallAiContent?: string\n\t[key: string]: any\n}\n\nexport interface MessageProcessor {\n\tmessageQueue: ChatMessage[]\n\tisProcessing: boolean\n\tcurrentMessage: ChatMessage | null\n\tprocessNextMessage: () => void\n\thandleMessageComplete: (chatId: string) => void\n}\n\nexport interface ScriptMatchResult {\n\tresponses: any[]\n\tnextIndex: number\n}\n\nexport interface MessageActions {\n\tuser: string[]\n\tai: string[]\n}\n"],"names":["ThinkStatus","MessageAction"],"mappings":"AAIY,IAAA,WAAA,qBAAAA,YAAL,KAAA;AACN,EAAAA,aAAA,UAAW,CAAA,GAAA,UAAA,CAAA;AACX,EAAAA,aAAA,WAAY,CAAA,GAAA,WAAA,CAAA;AACZ,EAAAA,aAAA,SAAU,CAAA,GAAA,SAAA,CAAA;AAHC,EAAAA,OAAAA,YAAAA,CAAAA;AAAA,CAAA,EAAA,WAAA,IAAA,EAAA,EAAA;
|
|
1
|
+
{"version":3,"file":"types.mjs","sources":["../../../../../../../../packages/components/touchchat/src/AiChat/Chat/types.ts"],"sourcesContent":["/**\n * TouchChat 类型定义\n */\n\nexport enum ThinkStatus {\n\tTHINKING = 'thinking',\n\tCOMPLETED = 'completed',\n\tSTOPPED = 'stopped'\n}\n\nexport interface ChatMessage {\n\tchatId?: string\n\tuser: 'u' | 'ai' | string\n\ttype: string\n\tcontent: string\n\tisChating?: boolean\n\tthinkContent?: string\n\treasoningContent?: string\n\tisLiked?: boolean\n\tisDisliked?: boolean\n\tisEditing?: boolean\n\teditContent?: string\n\tthinkStatus?: ThinkStatus\n\tthinkStartTime?: number\n\tthinkTime?: number\n\tthinkEndTime?: number\n\tisShowLike?: boolean\n\tisShowCopy?: boolean\n\tisWithDraw?: boolean\n\tcomponentName?: string\n\ttypeFlag?: string\n\tfiles?: FileItem[]\n\thtml?: string\n\tisError?: boolean\n\tauto?: boolean\n\tneedSequenceProcessing?: boolean\n\tneedSequenceType?: string\n\tstop?: boolean\n\tmsgList: any[]\n\tdataObj?: any\n\tlikeList?: any[]\n\tselecting?: boolean\n}\n\nexport interface ChatMsgList {\n\t[key: string]: any\n}\n\nexport interface AgentsItem {\n\tname: string\n\tintro: string\n\t[key: string]: any\n}\n\nexport interface ScriptContentItem {\n\tuser: 'i' | 'ai'\n\tdata?: string\n\ttype?: string\n\tagents?: string\n\tfile?: string\n\talias?: string | string[]\n\t[key: string]: any\n}\n\nexport interface Script {\n\tcontent: ScriptContentItem[]\n\t[key: string]: any\n}\n\nexport interface ModuleConfig {\n\taction?: () => string\n\theaders?: () => Record<string, string>\n\tbody?: () => Record<string, any>\n\trespoKey?: () => RespoKeyConfig\n\tname?: string\n}\n\nexport interface RespoKeyConfig {\n\tcontent: string\n\tcategory: string\n\tcontentCategory?: string\n\tall?: string\n\tallCategory?: string\n}\n\nexport interface ModuleItem {\n\tname?: string\n\tconfig?: ModuleConfig\n\t[key: string]: any\n}\n\nexport interface FileItem {\n\tid?: string\n\tfile?: File\n\tname: string\n\tfileType: string\n\tfileSize: string\n\tlastModified: number\n\tpreview?: string\n\tbase64?: string\n\t// 文件上传相关字段\n\tisUploading?: boolean\n\tuploadProgress?: number\n\tuploadSuccess?: boolean\n\tuploadError?: boolean\n\t// 上传成功后服务端返回的文件地址\n\turl?: string\n\t[key: string]: any\n}\n\nexport interface RenderData {\n\tmainContent: string\n\tthinkContent: string\n\treasoningContent: string\n}\n\nexport enum MessageAction {\n\tCOPY = 'copy',\n\tEDIT = 'edit',\n\tDELETE = 'delete',\n\tRETRY = 'retry',\n\tLIKE = 'like',\n\tDISLIKE = 'dislike',\n\tWITHDRAW = 'withDraw'\n}\n\nexport interface ResultItem {\n\tallAiContent?: string\n\t[key: string]: any\n}\n\nexport interface MessageProcessor {\n\tmessageQueue: ChatMessage[]\n\tisProcessing: boolean\n\tcurrentMessage: ChatMessage | null\n\tprocessNextMessage: () => void\n\thandleMessageComplete: (chatId: string) => void\n}\n\nexport interface ScriptMatchResult {\n\tresponses: any[]\n\tnextIndex: number\n}\n\nexport interface MessageActions {\n\tuser: string[]\n\tai: string[]\n}\n"],"names":["ThinkStatus","MessageAction"],"mappings":"AAIY,IAAA,WAAA,qBAAAA,YAAL,KAAA;AACN,EAAAA,aAAA,UAAW,CAAA,GAAA,UAAA,CAAA;AACX,EAAAA,aAAA,WAAY,CAAA,GAAA,WAAA,CAAA;AACZ,EAAAA,aAAA,SAAU,CAAA,GAAA,SAAA,CAAA;AAHC,EAAAA,OAAAA,YAAAA,CAAAA;AAAA,CAAA,EAAA,WAAA,IAAA,EAAA,EAAA;AAgHA,IAAA,aAAA,qBAAAC,cAAL,KAAA;AACN,EAAAA,eAAA,MAAO,CAAA,GAAA,MAAA,CAAA;AACP,EAAAA,eAAA,MAAO,CAAA,GAAA,MAAA,CAAA;AACP,EAAAA,eAAA,QAAS,CAAA,GAAA,QAAA,CAAA;AACT,EAAAA,eAAA,OAAQ,CAAA,GAAA,OAAA,CAAA;AACR,EAAAA,eAAA,MAAO,CAAA,GAAA,MAAA,CAAA;AACP,EAAAA,eAAA,SAAU,CAAA,GAAA,SAAA,CAAA;AACV,EAAAA,eAAA,UAAW,CAAA,GAAA,UAAA,CAAA;AAPA,EAAAA,OAAAA,cAAAA,CAAAA;AAAA,CAAA,EAAA,aAAA,IAAA,EAAA;;;;"}
|
|
@@ -53,6 +53,7 @@ function useChat({ props, emit, scripts, unmatchText, modules, afterSend, sendMe
|
|
|
53
53
|
typeFlag,
|
|
54
54
|
moduleInfo,
|
|
55
55
|
emit,
|
|
56
|
+
fileData,
|
|
56
57
|
afterSend,
|
|
57
58
|
enqueueRender,
|
|
58
59
|
renderContent,
|
|
@@ -302,7 +303,8 @@ function useChat({ props, emit, scripts, unmatchText, modules, afterSend, sendMe
|
|
|
302
303
|
files: fileList || [],
|
|
303
304
|
typeFlag: type,
|
|
304
305
|
auto: auto || false,
|
|
305
|
-
msgList: []
|
|
306
|
+
msgList: [],
|
|
307
|
+
selecting: false
|
|
306
308
|
};
|
|
307
309
|
chatList.value.push(userMessage);
|
|
308
310
|
emit("sendMessage", [...chatList.value]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useChat.mjs","sources":["../../../../../../../../packages/components/touchchat/src/AiChat/Chat/useChat.ts"],"sourcesContent":["/**\n * 主聊天逻辑 Composable\n */\n\nimport { ref, watch, type Ref, nextTick } from 'vue'\nimport { MessageAction, ThinkStatus, type ChatMessage, type ModuleItem, type FileItem, type MessageProcessor, ChatMsgList } from './types'\nimport { createScriptMatcher } from './scriptMatcher'\nimport { useSSE } from './useSSE'\nimport { useScroll } from './useScroll'\nimport { useMessageRender } from './useMessageRender'\nimport { useCopy } from './useCopy'\n\nexport interface UseChatOptions {\n\tprops: { value: ChatMessage[] }\n\temit: (event: string, ...args: any[]) => void\n\tscripts: any[]\n\tunmatchText: string\n\tmodules: (string | ModuleItem)[]\n\tafterSend: (result: object) => void\n\tsendMessageInject: (value: string, fileList?: any[]) => void\n\tbeforeSend: () => { result: boolean; componentName?: string } | Promise<{ result: boolean; componentName?: string }>\n\tbottom: () => void\n\tstop: (item: ChatMessage, index: number) => void\n\tchatContainer: Ref<HTMLElement | null>\n\tchatInputRef?: Ref<any | null>\n}\n\nexport function useChat({ props, emit, scripts, unmatchText, modules, afterSend, sendMessageInject, beforeSend, bottom, stop, chatContainer, chatInputRef }: UseChatOptions) {\n\t// 组件状态\n\tconst isMounted = ref(false)\n\tconst isChating = ref(false)\n\tconst inputValue = ref('')\n\tconst enableDeepThinking = ref(false)\n\tconst chatList = ref<ChatMessage[]>([])\n\tconst currIndex = ref(0)\n\tconst isUnmounting = ref(false)\n\tconst currentComponentName = ref('')\n\tconst fileData = ref<FileItem[]>([])\n\tconst activeAgentsName = ref<string>('')\n\tconst moduleInfo = ref<ModuleItem>((modules[0] as ModuleItem) || { name: 'deepseek-v3' })\n\tconst isDragging = ref(false)\n\tconst typeFlag = ref('')\n\n\t// 消息处理器状态\n\tconst currentMessageProcessor = ref<MessageProcessor | null>(null)\n\n\t// 消息渲染 composable\n\tconst { htmlContentRef, thinkingContentRef, reasoningContentRef, markdownToHtml, renderContent, enqueueRender } = useMessageRender({\n\t\tchatList,\n\t\tcurrIndex,\n\t\tisMounted,\n\t\tisUnmounting\n\t})\n\n\t// 滚动 composable\n\tconst { scrollToBottom, handleScroll } = useScroll({\n\t\tchatContainer,\n\t\tisMounted,\n\t\tisUnmounting,\n\t\tbottom\n\t})\n\n\t// 复制功能 composable\n\tconst { copyToClipboard } = useCopy()\n\n\t// 脚本匹配 - 需要将数组包装为 ref\n\tconst scriptsRef = ref(scripts)\n\tconst { activeScript, findMatchingScriptContent } = createScriptMatcher({\n\t\tscripts: scriptsRef,\n\t\tactiveAgentsName,\n\t\tfileData,\n\t\tunmatchText\n\t})\n\n\t// SSE\n\tconst { fetchStream, resultItem, openSSE, cleanupSSE } = useSSE({\n\t\tchatList,\n\t\tcurrIndex,\n\t\tisChating,\n\t\tisMounted,\n\t\tisUnmounting,\n\t\tinputValue,\n\t\tenableDeepThinking,\n\t\tcurrentComponentName,\n\t\ttypeFlag,\n\t\tmoduleInfo,\n\t\temit,\n\t\tafterSend,\n\t\tenqueueRender,\n\t\trenderContent,\n\t\tmarkdownToHtml,\n\t\tscrollToBottom,\n\t\tstop\n\t})\n\n\t// 监听 activeAgentsName\n\twatch(\n\t\t() => activeAgentsName,\n\t\t(val: any) => {\n\t\t\tif (!val) {\n\t\t\t\tactiveAgentsName.value = localStorage.getItem('activeAgentsName') as string\n\t\t\t}\n\t\t},\n\t\t{ immediate: true }\n\t)\n\n\t// 消息管理工具函数\n\tconst messageUtils = {\n\t\tupdateMessage: (index: number, updates: Partial<ChatMessage>): void => {\n\t\t\tif (index < 0 || index >= chatList.value.length) return\n\t\t\tchatList.value.splice(index, 1, { ...chatList.value[index], ...updates })\n\t\t\tnextTick(() => {\n\t\t\t\tconst message = chatList.value[index]\n\t\t\t\tif (message) {\n\t\t\t\t\trenderContent(message.content, 'main', index)\n\t\t\t\t\tif (message.thinkContent) {\n\t\t\t\t\t\trenderContent(message.thinkContent, 'thinking', index)\n\t\t\t\t\t}\n\t\t\t\t\tif (message.reasoningContent) {\n\t\t\t\t\t\trenderContent(message.reasoningContent, 'reasoning', index)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\t},\n\n\t\tdeleteMessageChain: (index: number): void => {\n\t\t\tif (index < 0 || index >= chatList.value.length) return\n\t\t\tif (chatList.value[index].user === 'u') {\n\t\t\t\tlet deleteCount = 1\n\t\t\t\tfor (let i = index + 1; i < chatList.value.length; i++) {\n\t\t\t\t\tif (chatList.value[i].user === 'ai') {\n\t\t\t\t\t\tdeleteCount++\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tchatList.value.splice(index, deleteCount)\n\t\t\t} else {\n\t\t\t\tchatList.value.splice(index, 1)\n\t\t\t}\n\t\t},\n\n\t\tcreateStandardMessage: (data: Partial<ChatMessage>): ChatMessage => ({\n\t\t\tchatId: data.chatId || 'ai_' + Math.random().toString(36).slice(2).padEnd(10, '0').slice(0, 10),\n\t\t\tuser: data.user || 'ai',\n\t\t\ttype: data.type || 'text',\n\t\t\tcontent: data.content || '',\n\t\t\tisChating: data.isChating ?? false,\n\t\t\tthinkContent: data.thinkContent || '',\n\t\t\treasoningContent: data.reasoningContent || '',\n\t\t\tisLiked: data.isLiked ?? false,\n\t\t\tisDisliked: data.isDisliked ?? false,\n\t\t\tisEditing: data.isEditing ?? false,\n\t\t\teditContent: data.editContent ?? '',\n\t\t\tmsgList: []\n\t\t})\n\t}\n\n\t// 更新消息\n\tconst update = (index: number, message: object) => {\n\t\tchatList.value[index] = { ...chatList.value[index], ...message }\n\t\t// console.log('update', chatList.value[index])\n\t}\n\n\t// 更新模块信息\n\tconst updateModule = (info: ModuleItem) => {\n\t\tmoduleInfo.value = info\n\t}\n\n\t// 处理智能体选择\n\tconst handleAgentSelect = (item: any) => {\n\t\tlocalStorage.setItem('activeAgentsName', item.name)\n\t\tconst aiMessage = item.intro\n\t\tmessageUtils.updateMessage(0, {\n\t\t\tcontent: '',\n\t\t\tisChating: false\n\t\t})\n\t\tsimulateStreamOutput(0, aiMessage)\n\t}\n\n\t// 渲染完成回调\n\tconst completeRendered = (chatId: string) => {\n\t\t// console.log('completeRendered', '渲染完成', chatId)\n\t\tif (currentMessageProcessor.value) {\n\t\t\tcurrentMessageProcessor.value.handleMessageComplete(chatId)\n\t\t}\n\t}\n\n\t// 初始化函数\n\tconst init = (): void => {\n\t\ttry {\n\t\t\tif (Array.isArray(props.value) && props.value.length && !scripts.length) {\n\t\t\t\tchatList.value = props.value.map((item: any) => ({\n\t\t\t\t\t...item,\n\t\t\t\t\tcontent: item.thinkContent ? item.content || '' : item.content || '',\n\t\t\t\t\tthinkContent: item.thinkContent || ''\n\t\t\t\t}))\n\n\t\t\t\tnextTick(() => {\n\t\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\t\tif (activeAgentsName.value && chatList.value.length > 0 && chatList.value[0].user === 'ai') {\n\t\t\t\t\t\t\tconst aiMessage = chatList.value[0]\n\t\t\t\t\t\t\tmessageUtils.updateMessage(0, {\n\t\t\t\t\t\t\t\tcontent: '',\n\t\t\t\t\t\t\t\tisChating: true\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tsimulateStreamOutput(0, aiMessage.content)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tchatList.value.forEach((item: any) => {\n\t\t\t\t\t\t\t\tif (item.thinkContent) {\n\t\t\t\t\t\t\t\t\trenderContent(item.thinkContent, 'thinking')\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (item.reasoningContent) {\n\t\t\t\t\t\t\t\t\trenderContent(item.reasoningContent, 'reasoning')\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (item.content) {\n\t\t\t\t\t\t\t\t\trenderContent(item.content, 'main')\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tnextTick(() => {\n\t\t\t\t\t\t\t\tscrollToBottom()\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t}\n\t\t} catch (error) {\n\t\t\t// console.error('初始化失败:', error)\n\t\t}\n\t}\n\n\t// 模拟流式输出\n\tconst simulateStreamOutput = (aiIndex: number, msg: string | ChatMessage, callback?: () => void) => {\n\t\tconst message: string = typeof msg === 'string' ? msg : msg.content\n\t\tconst componentName = typeof msg === 'string' ? '' : msg.needSequenceProcessing ? msg.needSequenceType : ''\n\t\tconst isNeedSequenceProcessing = typeof msg === 'string' ? false : msg.needSequenceProcessing\n\n\t\tconst fn = () => {\n\t\t\tclearInterval(interval)\n\t\t\temit('sendMessage', [...chatList.value])\n\t\t\tif (componentName) {\n\t\t\t\tchatList.value[aiIndex].componentName = componentName\n\t\t\t}\n\t\t\tmessageUtils.updateMessage(aiIndex, {\n\t\t\t\tisChating: false\n\t\t\t})\n\t\t\tnextTick(() => {\n\t\t\t\trenderContent(message, 'main', aiIndex)\n\t\t\t\tnextTick(() => {\n\t\t\t\t\tscrollToBottom()\n\t\t\t\t\tif (!isNeedSequenceProcessing && callback) {\n\t\t\t\t\t\tcallback()\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t\t}\n\n\t\tlet index = 0\n\t\tconst interval = setInterval(() => {\n\t\t\tif (index < message.length) {\n\t\t\t\tconst newContent = message\n\t\t\t\tmessageUtils.updateMessage(aiIndex, {\n\t\t\t\t\tcontent: newContent\n\t\t\t\t})\n\t\t\t\tnextTick(() => {\n\t\t\t\t\trenderContent(newContent, 'main', aiIndex)\n\t\t\t\t\tnextTick(() => {\n\t\t\t\t\t\tscrollToBottom()\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\tindex++\n\t\t\t} else {\n\t\t\t\tfn()\n\t\t\t}\n\t\t}, 50)\n\t}\n\n\t// 监听props.value变化\n\twatch(\n\t\t() => props.value,\n\t\t(newVal: any, oldVal: any) => {\n\t\t\tif (!Array.isArray(newVal)) return\n\t\t\tif (newVal.length && JSON.stringify(newVal) !== JSON.stringify(oldVal)) {\n\t\t\t\tchatList.value = newVal.map(item => ({\n\t\t\t\t\t...item,\n\t\t\t\t\tcontent: item.thinkContent ? item.content || '' : item.content || '',\n\t\t\t\t\tthinkContent: item.thinkContent || ''\n\t\t\t\t}))\n\n\t\t\t\tnextTick(() => {\n\t\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\t\tchatList.value.forEach((item: any) => {\n\t\t\t\t\t\t\tif (item.thinkContent) {\n\t\t\t\t\t\t\t\trenderContent(item.thinkContent, 'thinking')\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (item.reasoningContent) {\n\t\t\t\t\t\t\t\trenderContent(item.reasoningContent, 'reasoning')\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (item.content) {\n\t\t\t\t\t\t\t\trenderContent(item.content, 'main')\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t\tnextTick(() => {\n\t\t\t\t\t\t\tscrollToBottom()\n\t\t\t\t\t\t})\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t}\n\t\t},\n\t\t{ deep: true, immediate: true }\n\t)\n\n\t// 发送消息\n\tconst sendMessage = (content?: string, fileList?: any[], auto?: boolean, type?: string): void => {\n\t\tinputValue.value = content || ''\n\t\thandleBeforeSend(content, fileList, auto, type)\n\t}\n\n\t// 发送前处理\n\tconst handleBeforeSend = (content?: string, fileList?: any[], auto?: boolean, type?: string): void => {\n\t\tfileData.value = fileList || []\n\t\tif (beforeSend) {\n\t\t\tconst fn = beforeSend() as any\n\t\t\tif (fn && typeof fn.then === 'function') {\n\t\t\t\t;(Promise.resolve(fn) as Promise<{ result: boolean; componentName?: string }>)\n\t\t\t\t\t.then(res => {\n\t\t\t\t\t\tif (res.result) {\n\t\t\t\t\t\t\tcurrentComponentName.value = res.componentName || ''\n\t\t\t\t\t\t\thandleSend(content, fileList, auto, type)\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t.catch(error => {\n\t\t\t\t\t\tconsole.log(error)\n\t\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tif (fn.result) {\n\t\t\t\t\tcurrentComponentName.value = fn.componentName || ''\n\t\t\t\t\thandleSend(content, fileList, auto, type)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 处理发送\n\tconst handleSend = (content?: string, fileList?: any[], auto?: boolean, type?: string): void => {\n\t\temit('beforeSendMessage')\n\t\tsendMessageInject(inputValue.value, fileData.value)\n\t\ttypeFlag.value = type || ''\n\t\tif (scripts && Array.isArray(scripts) && scripts.length > 0) {\n\t\t\tconst userInput = content ? content.replace(/\\n/g, '') : inputValue.value.replace(/\\n/g, '').trim()\n\t\t\tif (!userInput && !fileList?.length && auto) return\n\n\t\t\t// 添加用户消息\n\t\t\tconst userChatId = `user_${Date.now()}`\n\t\t\tconst userMessage: ChatMessage & ChatMsgList = {\n\t\t\t\tchatId: userChatId,\n\t\t\t\tuser: 'u',\n\t\t\t\ttype: 'text',\n\t\t\t\tcontent: userInput,\n\t\t\t\tisShowLike: false,\n\t\t\t\tisShowCopy: true,\n\t\t\t\tisWithDraw: false,\n\t\t\t\tisRead: false,\n\t\t\t\tfiles: fileList || [],\n\t\t\t\ttypeFlag: type,\n\t\t\t\tauto: auto || false,\n\t\t\t\tmsgList: []\n\t\t\t}\n\t\t\tchatList.value.push(userMessage)\n\t\t\temit('sendMessage', [...chatList.value])\n\n\t\t\t// 滚动到底部\n\t\t\tnextTick(() => {\n\t\t\t\trenderContent(userMessage.content, 'main', chatList.value.length - 1)\n\t\t\t\tnextTick(() => {\n\t\t\t\t\tscrollToBottom()\n\t\t\t\t})\n\t\t\t})\n\n\t\t\t// 查找匹配的脚本内容\n\t\t\tconst result = findMatchingScriptContent(userInput)\n\n\t\t\tif (result && result.responses.length > 0) {\n\t\t\t\t// 存储新AI消息的数组\n\t\t\t\tconst newAiMessages: ChatMessage[] = []\n\n\t\t\t\tresult.responses.forEach((response: any, idx: number) => {\n\t\t\t\t\tconst pauseMarker = Array.isArray(response.data) ? '\\u200B'.repeat(20) : ''\n\t\t\t\t\tconst content = Array.isArray(response.data) ? response.data.join(pauseMarker) : response.data\n\n\t\t\t\t\tconst aiChatId = `ai_${Date.now()}_${idx}`\n\t\t\t\t\tconst aiMessage: ChatMessage = {\n\t\t\t\t\t\tchatId: aiChatId,\n\t\t\t\t\t\tuser: 'ai',\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tcontent: content || '',\n\t\t\t\t\t\tcomponentName: response.type || '',\n\t\t\t\t\t\tisShowLike: true,\n\t\t\t\t\t\tisShowCopy: true,\n\t\t\t\t\t\tneedSequenceType: response.type || '',\n\t\t\t\t\t\tneedSequenceProcessing: response.needSequenceProcessing || false,\n\t\t\t\t\t\ttypeFlag: type,\n\t\t\t\t\t\tmsgList: [],\n\t\t\t\t\t\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\tconsole.log('content === useChat === 488', content)\n\t\t\t// 无脚本模式,直接发送\n\t\t\tif (content) {\n\t\t\t\tinputValue.value = content\n\t\t\t}\n\t\t\tif ((isChating.value || (!inputValue.value.trim() && !fileList?.length)) && !auto) return\n\n\t\t\tconst userChatId = 'user_' + Math.random().toString(36).slice(2).padEnd(10, '0').slice(0, 10)\n\t\t\tconst userMessage: ChatMessage & ChatMsgList = {\n\t\t\t\tchatId: userChatId,\n\t\t\t\tuser: 'u',\n\t\t\t\ttype: 'text',\n\t\t\t\tcontent: inputValue.value,\n\t\t\t\tfiles: fileList || [],\n\t\t\t\tmsgList: [],\n\t\t\t\tisRead: false\n\t\t\t}\n\t\t\tchatList.value.push(userMessage)\n\t\t\tconst index = chatList.value.length - 1\n\t\t\tnextTick(() => {\n\t\t\t\trenderContent(userMessage.content, 'main', index)\n\t\t\t\tscrollToBottom()\n\t\t\t})\n\t\t\tconsole.log('openSSE === useChat === 511')\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\n\t\tconst aiIndex = chatList.value.findIndex((item: any) => item.isChating)\n\t\tif (aiIndex !== -1) {\n\t\t\tconst currentAiMessage = chatList.value[aiIndex]\n\n\t\t\tif (currentAiMessage.content?.trim()) {\n\t\t\t\tnextTick(() => {\n\t\t\t\t\tchatList.value[aiIndex] = {\n\t\t\t\t\t\t...currentAiMessage,\n\t\t\t\t\t\tcontent: currentAiMessage.content + '...',\n\t\t\t\t\t\tisChating: false\n\t\t\t\t\t}\n\t\t\t\t\trenderContent(chatList.value[aiIndex].content, 'main', aiIndex)\n\t\t\t\t\temit('sendMessage', chatList.value)\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tif (aiIndex > 0) {\n\t\t\t\t\tconst userMessageIndex = aiIndex - 1\n\t\t\t\t\tif (chatList.value[userMessageIndex].user === 'u') {\n\t\t\t\t\t\tchatList.value.splice(userMessageIndex, 2)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchatList.value.splice(aiIndex, 1)\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tchatList.value.splice(aiIndex, 1)\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconst lastIndex = chatList.value.length - 1\n\t\t\tif (lastIndex >= 0 && chatList.value[lastIndex].user === 'u') {\n\t\t\t\tchatList.value.pop()\n\t\t\t}\n\t\t}\n\n\t\tisChating.value = false\n\t}\n\n\t// 处理消息操作\n\tconst handleMessageAction = (action: MessageAction, index: number): void => {\n\t\tconst message = chatList.value[index]\n\t\tif (!message) return\n\n\t\tswitch (action) {\n\t\t\tcase MessageAction.COPY: {\n\t\t\t\t// 使用复制功能\n\t\t\t\tcopyToClipboard(message.content, '复制成功', '复制失败')\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase MessageAction.EDIT:\n\t\t\t\tmessage.isEditing = true\n\t\t\t\tmessage.editContent = message.content\n\t\t\t\tbreak\n\t\t\tcase MessageAction.DELETE:\n\t\t\t\tmessageUtils.deleteMessageChain(index)\n\t\t\t\temit('sendMessage', chatList.value)\n\t\t\t\tbreak\n\t\t\tcase MessageAction.RETRY: {\n\t\t\t\tconst aiMessage = chatList.value[index]\n\t\t\t\tconst userMessageIndex = index - 1\n\t\t\t\tconst userMessage = chatList.value[userMessageIndex]\n\n\t\t\t\tif (userMessage && userMessage.user === 'u') {\n\t\t\t\t\tconst updatedAiMessage = {\n\t\t\t\t\t\t...aiMessage,\n\t\t\t\t\t\tcontent: '',\n\t\t\t\t\t\tthinkContent: '',\n\t\t\t\t\t\treasoningContent: '',\n\t\t\t\t\t\tisLiked: false,\n\t\t\t\t\t\tisDisliked: false,\n\t\t\t\t\t\tisChating: true,\n\t\t\t\t\t\tisRead: false,\n\t\t\t\t\t\tchatId: aiMessage.chatId,\n\t\t\t\t\t\tuser: aiMessage.user,\n\t\t\t\t\t\ttype: aiMessage.type,\n\t\t\t\t\t\tthinkStatus: ThinkStatus.COMPLETED,\n\t\t\t\t\t\tthinkStartTime: 0,\n\t\t\t\t\t\tthinkEndTime: 0\n\t\t\t\t\t}\n\t\t\t\t\tchatList.value.splice(index, 1, updatedAiMessage)\n\n\t\t\t\t\tnextTick(() => {\n\t\t\t\t\t\tif (htmlContentRef.value[index]) htmlContentRef.value[index].innerHTML = ''\n\t\t\t\t\t\tif (thinkingContentRef.value[index]) thinkingContentRef.value[index].innerHTML = ''\n\t\t\t\t\t\tif (reasoningContentRef.value[index]) reasoningContentRef.value[index].innerHTML = ''\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\topenSSE(userMessage.content || '', index)\n\t\t\t\t\t\t}, 50)\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase MessageAction.LIKE:\n\t\t\t\tmessageUtils.updateMessage(index, {\n\t\t\t\t\tisLiked: true,\n\t\t\t\t\tisDisliked: false\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\tcase MessageAction.DISLIKE:\n\t\t\t\tmessageUtils.updateMessage(index, {\n\t\t\t\t\tisLiked: false,\n\t\t\t\t\tisDisliked: true\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\tcase MessageAction.WITHDRAW:\n\t\t\t\tconsole.log('withDraw')\n\t\t\t\tmessageUtils.updateMessage(index, {\n\t\t\t\t\tisWithDraw: true,\n\t\t\t\t\tuser: 'withDraw'\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\t// 保存编辑\n\tconst saveEdit = (index: number, newContent: string): void => {\n\t\tconst message = chatList.value[index]\n\t\tif (!message || !message.editContent) return\n\n\t\tchatList.value[index] = {\n\t\t\t...message,\n\t\t\tcontent: newContent,\n\t\t\tisEditing: false,\n\t\t\teditContent: undefined\n\t\t}\n\t\tnextTick(() => {\n\t\t\trenderContent(newContent, 'main', index)\n\t\t})\n\n\t\t// 删除后续的AI回复(如果有)\n\t\tconst hasDeletedAi = index + 1 < chatList.value.length && chatList.value[index + 1].user === 'ai'\n\t\tif (hasDeletedAi) {\n\t\t\tchatList.value.splice(index + 1, 1)\n\t\t}\n\n\t\t// 计算插入新AI消息的位置\n\t\t// 无论是否删除了AI消息,插入位置都是 index + 1\n\t\tconst insertPosition = index + 1\n\t\t// console.log('saveEdit调用openSSE,index:', index, 'insertPosition:', insertPosition, 'newContent:', newContent)\n\n\t\t// 等待下一个tick,确保Vue已经更新了DOM和refs\n\t\tnextTick(() => {\n\t\t\topenSSE(newContent, insertPosition)\n\t\t})\n\t\temit('sendMessage', chatList.value)\n\t}\n\n\t// 取消编辑\n\tconst cancelEdit = (index: number): void => {\n\t\tconst message = chatList.value[index]\n\t\tif (!message) return\n\n\t\tmessage.isEditing = false\n\t\tmessage.editContent = ''\n\t\tnextTick(() => {\n\t\t\trenderContent(message.content, 'main', index)\n\t\t})\n\t}\n\n\t// 处理拖拽事件\n\tconst handleDragEnter = () => {\n\t\tisDragging.value = true\n\t\t// 打开标记层以显示拖拽区域\n\t\tif (chatInputRef?.value) {\n\t\t\tchatInputRef.value.openMarkLayer()\n\t\t}\n\t}\n\n\tconst handleDragLeave = (e: DragEvent) => {\n\t\tconst rect = (e.target as HTMLElement).getBoundingClientRect()\n\t\tif (e.clientX < rect.left || e.clientX > rect.right || e.clientY < rect.top || e.clientY > rect.bottom) {\n\t\t\tisDragging.value = false\n\t\t}\n\t}\n\n\tconst handleDrop = async (e: DragEvent) => {\n\t\tisDragging.value = false\n\n\t\t// 获取拖拽的文件\n\t\tconst files = e.dataTransfer?.files\n\t\tif (files && files.length > 0) {\n\t\t\tconst fileList = await Promise.all(\n\t\t\t\tArray.from(files).map(async file => {\n\t\t\t\t\tlet base64 = ''\n\t\t\t\t\tif (file.type.startsWith('image/')) {\n\t\t\t\t\t\tbase64 = await new Promise(resolve => {\n\t\t\t\t\t\t\tconst reader = new FileReader()\n\t\t\t\t\t\t\treader.onload = e => {\n\t\t\t\t\t\t\t\tresolve(e.target?.result as string)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treader.readAsDataURL(file)\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: Math.random().toString(36).slice(2).padEnd(10, '0').slice(0, 10),\n\t\t\t\t\t\tfile: file,\n\t\t\t\t\t\tname: file.name,\n\t\t\t\t\t\tfileType: file.type,\n\t\t\t\t\t\tfileSize: file.size,\n\t\t\t\t\t\tlastModified: file.lastModified,\n\t\t\t\t\t\tpreview: URL.createObjectURL(file),\n\t\t\t\t\t\tbase64\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t)\n\t\t\t// 调用 ChatInput 的 handlePaste 方法处理拖拽的文件\n\t\t\tif (chatInputRef?.value) {\n\t\t\t\tchatInputRef.value.handlePaste(fileList, 'drop')\n\t\t\t}\n\t\t}\n\n\t\t// 关闭标记层\n\t\tif (chatInputRef?.value) {\n\t\t\tchatInputRef.value.colseMarkLayer()\n\t\t}\n\t}\n\n\t// 组件生命周期\n\tconst onMounted = () => {\n\t\tif (!isMounted.value) {\n\t\t\tinit()\n\t\t}\n\t\tisMounted.value = true\n\t}\n\n\tconst onBeforeUnmount = () => {\n\t\tif (!isUnmounting.value) {\n\t\t\tisUnmounting.value = true\n\t\t\tcleanupSSE()\n\t\t\tisMounted.value = false\n\t\t}\n\t}\n\n\treturn {\n\t\t// 状态\n\t\tchatList,\n\t\tisChating,\n\t\tinputValue,\n\t\tenableDeepThinking,\n\t\tisMounted,\n\t\tisUnmounting,\n\t\tcurrentComponentName,\n\t\tfileData,\n\t\tactiveAgentsName,\n\t\tmoduleInfo,\n\t\tisDragging,\n\t\ttypeFlag,\n\t\tcurrIndex,\n\t\tfetchStream,\n\t\tresultItem,\n\t\tcurrentMessageProcessor,\n\t\tactiveScript,\n\t\thtmlContentRef,\n\t\tthinkingContentRef,\n\t\treasoningContentRef,\n\t\t// 方法\n\t\tinit,\n\t\tsendMessage,\n\t\thandleBeforeSend,\n\t\thandleSend,\n\t\thandleStop,\n\t\thandleMessageAction,\n\t\tsaveEdit,\n\t\tcancelEdit,\n\t\tcompleteRendered,\n\t\thandleAgentSelect,\n\t\tupdate,\n\t\tupdateModule,\n\t\tmessageUtils,\n\t\tsimulateStreamOutput,\n\t\thandleDragEnter,\n\t\thandleDragLeave,\n\t\thandleDrop,\n\t\tonMounted,\n\t\tonBeforeUnmount,\n\t\tcleanupSSE,\n\t\tscrollToBottom,\n\t\thandleScroll,\n\t\trenderContent,\n\t\tenqueueRender\n\t}\n}\n"],"names":["content","e","_a"],"mappings":"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"}
|
|
1
|
+
{"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): void => {\n\t\tfileData.value = fileList || []\n\t\tif (beforeSend) {\n\t\t\tconst fn = beforeSend() as any\n\t\t\tif (fn && typeof fn.then === 'function') {\n\t\t\t\t;(Promise.resolve(fn) as Promise<{ result: boolean; componentName?: string }>)\n\t\t\t\t\t.then(res => {\n\t\t\t\t\t\tif (res.result) {\n\t\t\t\t\t\t\tcurrentComponentName.value = res.componentName || ''\n\t\t\t\t\t\t\thandleSend(content, fileList, auto, type)\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\t.catch(error => {\n\t\t\t\t\t\tconsole.log(error)\n\t\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tif (fn.result) {\n\t\t\t\t\tcurrentComponentName.value = fn.componentName || ''\n\t\t\t\t\thandleSend(content, fileList, auto, type)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 处理发送\n\tconst handleSend = (content?: string, fileList?: any[], auto?: boolean, type?: string): void => {\n\t\temit('beforeSendMessage')\n\t\tsendMessageInject(inputValue.value, fileData.value)\n\t\ttypeFlag.value = type || ''\n\t\tif (scripts && Array.isArray(scripts) && scripts.length > 0) {\n\t\t\tconst userInput = content ? content.replace(/\\n/g, '') : inputValue.value.replace(/\\n/g, '').trim()\n\t\t\tif (!userInput && !fileList?.length && auto) return\n\n\t\t\t// 添加用户消息\n\t\t\tconst userChatId = `user_${Date.now()}`\n\t\t\tconst userMessage: ChatMessage & ChatMsgList = {\n\t\t\t\tchatId: userChatId,\n\t\t\t\tuser: 'u',\n\t\t\t\ttype: 'text',\n\t\t\t\tcontent: userInput,\n\t\t\t\tisShowLike: false,\n\t\t\t\tisShowCopy: true,\n\t\t\t\tisWithDraw: false,\n\t\t\t\tisRead: false,\n\t\t\t\tfiles: fileList || [],\n\t\t\t\ttypeFlag: type,\n\t\t\t\tauto: auto || false,\n\t\t\t\tmsgList: [],\n\t\t\t\tselecting: false\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\tconsole.log('content === useChat === 488', content)\n\t\t\t// 无脚本模式,直接发送\n\t\t\tif (content) {\n\t\t\t\tinputValue.value = content\n\t\t\t}\n\t\t\tif ((isChating.value || (!inputValue.value.trim() && !fileList?.length)) && !auto) return\n\n\t\t\tconst userChatId = 'user_' + Math.random().toString(36).slice(2).padEnd(10, '0').slice(0, 10)\n\t\t\tconst userMessage: ChatMessage & ChatMsgList = {\n\t\t\t\tchatId: userChatId,\n\t\t\t\tuser: 'u',\n\t\t\t\ttype: 'text',\n\t\t\t\tcontent: inputValue.value,\n\t\t\t\tfiles: fileList || [],\n\t\t\t\tmsgList: [],\n\t\t\t\tisRead: false\n\t\t\t}\n\t\t\tchatList.value.push(userMessage)\n\t\t\tconst index = chatList.value.length - 1\n\t\t\tnextTick(() => {\n\t\t\t\trenderContent(userMessage.content, 'main', index)\n\t\t\t\tscrollToBottom()\n\t\t\t})\n\t\t\tconsole.log('openSSE === useChat === 511')\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\n\t\tconst aiIndex = chatList.value.findIndex((item: any) => item.isChating)\n\t\tif (aiIndex !== -1) {\n\t\t\tconst currentAiMessage = chatList.value[aiIndex]\n\n\t\t\tif (currentAiMessage.content?.trim()) {\n\t\t\t\tnextTick(() => {\n\t\t\t\t\tchatList.value[aiIndex] = {\n\t\t\t\t\t\t...currentAiMessage,\n\t\t\t\t\t\tcontent: currentAiMessage.content + '...',\n\t\t\t\t\t\tisChating: false\n\t\t\t\t\t}\n\t\t\t\t\trenderContent(chatList.value[aiIndex].content, 'main', aiIndex)\n\t\t\t\t\temit('sendMessage', chatList.value)\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tif (aiIndex > 0) {\n\t\t\t\t\tconst userMessageIndex = aiIndex - 1\n\t\t\t\t\tif (chatList.value[userMessageIndex].user === 'u') {\n\t\t\t\t\t\tchatList.value.splice(userMessageIndex, 2)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchatList.value.splice(aiIndex, 1)\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tchatList.value.splice(aiIndex, 1)\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tconst lastIndex = chatList.value.length - 1\n\t\t\tif (lastIndex >= 0 && chatList.value[lastIndex].user === 'u') {\n\t\t\t\tchatList.value.pop()\n\t\t\t}\n\t\t}\n\n\t\tisChating.value = false\n\t}\n\n\t// 处理消息操作\n\tconst handleMessageAction = (action: MessageAction, index: number): void => {\n\t\tconst message = chatList.value[index]\n\t\tif (!message) return\n\n\t\tswitch (action) {\n\t\t\tcase MessageAction.COPY: {\n\t\t\t\t// 使用复制功能\n\t\t\t\tcopyToClipboard(message.content, '复制成功', '复制失败')\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase MessageAction.EDIT:\n\t\t\t\tmessage.isEditing = true\n\t\t\t\tmessage.editContent = message.content\n\t\t\t\tbreak\n\t\t\tcase MessageAction.DELETE:\n\t\t\t\tmessageUtils.deleteMessageChain(index)\n\t\t\t\temit('sendMessage', chatList.value)\n\t\t\t\tbreak\n\t\t\tcase MessageAction.RETRY: {\n\t\t\t\tconst aiMessage = chatList.value[index]\n\t\t\t\tconst userMessageIndex = index - 1\n\t\t\t\tconst userMessage = chatList.value[userMessageIndex]\n\n\t\t\t\tif (userMessage && userMessage.user === 'u') {\n\t\t\t\t\tconst updatedAiMessage = {\n\t\t\t\t\t\t...aiMessage,\n\t\t\t\t\t\tcontent: '',\n\t\t\t\t\t\tthinkContent: '',\n\t\t\t\t\t\treasoningContent: '',\n\t\t\t\t\t\tisLiked: false,\n\t\t\t\t\t\tisDisliked: false,\n\t\t\t\t\t\tisChating: true,\n\t\t\t\t\t\tisRead: false,\n\t\t\t\t\t\tchatId: aiMessage.chatId,\n\t\t\t\t\t\tuser: aiMessage.user,\n\t\t\t\t\t\ttype: aiMessage.type,\n\t\t\t\t\t\tthinkStatus: ThinkStatus.COMPLETED,\n\t\t\t\t\t\tthinkStartTime: 0,\n\t\t\t\t\t\tthinkEndTime: 0\n\t\t\t\t\t}\n\t\t\t\t\tchatList.value.splice(index, 1, updatedAiMessage)\n\n\t\t\t\t\tnextTick(() => {\n\t\t\t\t\t\tif (htmlContentRef.value[index]) htmlContentRef.value[index].innerHTML = ''\n\t\t\t\t\t\tif (thinkingContentRef.value[index]) thinkingContentRef.value[index].innerHTML = ''\n\t\t\t\t\t\tif (reasoningContentRef.value[index]) reasoningContentRef.value[index].innerHTML = ''\n\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\topenSSE(userMessage.content || '', index)\n\t\t\t\t\t\t}, 50)\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase MessageAction.LIKE:\n\t\t\t\tmessageUtils.updateMessage(index, {\n\t\t\t\t\tisLiked: true,\n\t\t\t\t\tisDisliked: false\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\tcase MessageAction.DISLIKE:\n\t\t\t\tmessageUtils.updateMessage(index, {\n\t\t\t\t\tisLiked: false,\n\t\t\t\t\tisDisliked: true\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t\tcase MessageAction.WITHDRAW:\n\t\t\t\tconsole.log('withDraw')\n\t\t\t\tmessageUtils.updateMessage(index, {\n\t\t\t\t\tisWithDraw: true,\n\t\t\t\t\tuser: 'withDraw'\n\t\t\t\t})\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\t// 保存编辑\n\tconst saveEdit = (index: number, newContent: string): void => {\n\t\tconst message = chatList.value[index]\n\t\tif (!message || !message.editContent) return\n\n\t\tchatList.value[index] = {\n\t\t\t...message,\n\t\t\tcontent: newContent,\n\t\t\tisEditing: false,\n\t\t\teditContent: undefined\n\t\t}\n\t\tnextTick(() => {\n\t\t\trenderContent(newContent, 'main', index)\n\t\t})\n\n\t\t// 删除后续的AI回复(如果有)\n\t\tconst hasDeletedAi = index + 1 < chatList.value.length && chatList.value[index + 1].user === 'ai'\n\t\tif (hasDeletedAi) {\n\t\t\tchatList.value.splice(index + 1, 1)\n\t\t}\n\n\t\t// 计算插入新AI消息的位置\n\t\t// 无论是否删除了AI消息,插入位置都是 index + 1\n\t\tconst insertPosition = index + 1\n\t\t// console.log('saveEdit调用openSSE,index:', index, 'insertPosition:', insertPosition, 'newContent:', newContent)\n\n\t\t// 等待下一个tick,确保Vue已经更新了DOM和refs\n\t\tnextTick(() => {\n\t\t\topenSSE(newContent, insertPosition)\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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"}
|
|
@@ -3,7 +3,7 @@ import { FetchStream } from '../../../utils/fetchStream.mjs';
|
|
|
3
3
|
import { showToast } from '../../../utils/tools.mjs';
|
|
4
4
|
import { ThinkStatus } from './types.mjs';
|
|
5
5
|
|
|
6
|
-
function useSSE({ chatList, currIndex, isChating, isMounted, isUnmounting, enableDeepThinking, currentComponentName, typeFlag, moduleInfo, emit, afterSend, enqueueRender, renderContent, markdownToHtml, stop }) {
|
|
6
|
+
function useSSE({ chatList, currIndex, isChating, isMounted, isUnmounting, enableDeepThinking, currentComponentName, typeFlag, moduleInfo, fileData, emit, afterSend, enqueueRender, renderContent, markdownToHtml, stop }) {
|
|
7
7
|
const fetchStream = ref(null);
|
|
8
8
|
const resultItem = ref(null);
|
|
9
9
|
const generateChatId = (prefix = "ai_") => {
|
|
@@ -14,6 +14,7 @@ function useSSE({ chatList, currIndex, isChating, isMounted, isUnmounting, enabl
|
|
|
14
14
|
try {
|
|
15
15
|
if (isUnmounting.value)
|
|
16
16
|
return;
|
|
17
|
+
console.log("openSSE fileData:", JSON.stringify(fileData.value.map((f) => ({ name: f.name, fileId: f.fileId, url: f.url }))));
|
|
17
18
|
isChating.value = true;
|
|
18
19
|
const currentAiMessage = chatList.value.find((item) => item.isChating);
|
|
19
20
|
if (currentAiMessage) {
|
|
@@ -45,7 +46,8 @@ function useSSE({ chatList, currIndex, isChating, isMounted, isUnmounting, enabl
|
|
|
45
46
|
typeFlag: typeFlag.value,
|
|
46
47
|
msgList: [],
|
|
47
48
|
isRead: true,
|
|
48
|
-
dataObj: {}
|
|
49
|
+
dataObj: {},
|
|
50
|
+
selecting: false
|
|
49
51
|
};
|
|
50
52
|
if (insertIndex !== void 0 && insertIndex <= chatList.value.length) {
|
|
51
53
|
chatList.value.splice(insertIndex, 0, chatItem);
|
|
@@ -55,10 +57,12 @@ function useSSE({ chatList, currIndex, isChating, isMounted, isUnmounting, enabl
|
|
|
55
57
|
}
|
|
56
58
|
currIndex.value = insertIndex != null ? insertIndex : chatList.value.length - 1;
|
|
57
59
|
const BodyConfig = (_c = (_b = (_a = moduleInfo.value) == null ? void 0 : _a.config) == null ? void 0 : _b.body) == null ? void 0 : _c.call(_b);
|
|
58
|
-
const
|
|
60
|
+
const fileIds = fileData.value.filter((f) => f.fileId).map((f) => f.fileId);
|
|
61
|
+
const requestBody = ((_d = BodyConfig == null ? void 0 : BodyConfig.messages) == null ? void 0 : _d.length) ? { ...BodyConfig, messages: [...BodyConfig.messages], model: enableDeepThinking.value ? "deepseek-reasoner" : "deepseek-v3", fileIds: fileIds.length ? fileIds : void 0 } : {
|
|
59
62
|
model: enableDeepThinking.value ? "deepseek-reasoner" : "deepseek-v3",
|
|
60
63
|
messages: [{ role: "user", content: userContent }],
|
|
61
|
-
stream: true
|
|
64
|
+
stream: true,
|
|
65
|
+
fileIds: fileIds.length ? fileIds : void 0
|
|
62
66
|
};
|
|
63
67
|
if ((_e = BodyConfig == null ? void 0 : BodyConfig.messages) == null ? void 0 : _e.length) {
|
|
64
68
|
BodyConfig.messages[0].content = userContent;
|
|
@@ -185,6 +189,12 @@ function useSSE({ chatList, currIndex, isChating, isMounted, isUnmounting, enabl
|
|
|
185
189
|
}
|
|
186
190
|
}
|
|
187
191
|
}
|
|
192
|
+
if (newAiMessage) {
|
|
193
|
+
newAiMessage.content = aiContent;
|
|
194
|
+
newAiMessage.msgList = [...aiContentList];
|
|
195
|
+
newAiMessage.reasoningContent = reasoningContent;
|
|
196
|
+
newAiMessage.dataObj = result;
|
|
197
|
+
}
|
|
188
198
|
if (chatList.value.some((ele) => ele.chatId === chatId)) {
|
|
189
199
|
enqueueRender({
|
|
190
200
|
mainContent: aiContent,
|