@touchvue/chat 1.0.0-beta.41 → 1.0.0-beta.43

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 (151) hide show
  1. package/es/package.json.css +1 -1
  2. package/es/package.json.mjs +1 -1
  3. package/es/packages/components/touchchat/component/AiRobot/HelloChat.vue2.mjs.map +1 -1
  4. package/es/packages/components/touchchat/component/AiRobot/letter.vue.mjs +1 -1
  5. package/es/packages/components/touchchat/component/AiRobot/letter.vue2.mjs +15 -3
  6. package/es/packages/components/touchchat/component/AiRobot/letter.vue2.mjs.map +1 -1
  7. package/es/packages/components/touchchat/component/FileContent.vue2.mjs +3 -3
  8. package/es/packages/components/touchchat/component/FileContent.vue2.mjs.map +1 -1
  9. package/es/packages/components/touchchat/component/FileView.vue2.mjs +2 -2
  10. package/es/packages/components/touchchat/component/FileView.vue2.mjs.map +1 -1
  11. package/es/packages/components/touchchat/component/HelloChat.vue2.mjs.map +1 -1
  12. package/es/packages/components/touchchat/component/ImageFile.vue2.mjs +6 -6
  13. package/es/packages/components/touchchat/component/ImageFile.vue2.mjs.map +1 -1
  14. package/es/packages/components/touchchat/component/ImageView.vue2.mjs +1 -1
  15. package/es/packages/components/touchchat/component/ImageView.vue2.mjs.map +1 -1
  16. package/es/packages/components/touchchat/component/LinkView.vue2.mjs +4 -4
  17. package/es/packages/components/touchchat/component/LinkView.vue2.mjs.map +1 -1
  18. package/es/packages/components/touchchat/component/MarkLayer.vue2.mjs +1 -1
  19. package/es/packages/components/touchchat/component/MarkLayer.vue2.mjs.map +1 -1
  20. package/es/packages/components/touchchat/component/ModuleSelect.vue2.mjs +2 -2
  21. package/es/packages/components/touchchat/component/ModuleSelect.vue2.mjs.map +1 -1
  22. package/es/packages/components/touchchat/component/PDFFile.vue2.mjs +8 -8
  23. package/es/packages/components/touchchat/component/PDFFile.vue2.mjs.map +1 -1
  24. package/es/packages/components/touchchat/component/RealtimeVoice.vue2.mjs +1 -1
  25. package/es/packages/components/touchchat/component/RealtimeVoice.vue2.mjs.map +1 -1
  26. package/es/packages/components/touchchat/component/Screenshot.vue2.mjs +11 -2
  27. package/es/packages/components/touchchat/component/Screenshot.vue2.mjs.map +1 -1
  28. package/es/packages/components/touchchat/component/UploadView.vue2.mjs +10 -7
  29. package/es/packages/components/touchchat/component/UploadView.vue2.mjs.map +1 -1
  30. package/es/packages/components/touchchat/component/VoiceView.vue2.mjs +1 -1
  31. package/es/packages/components/touchchat/component/VoiceView.vue2.mjs.map +1 -1
  32. package/es/packages/components/touchchat/src/AiChat/AgentsView.vue2.mjs +1 -1
  33. package/es/packages/components/touchchat/src/AiChat/AgentsView.vue2.mjs.map +1 -1
  34. package/es/packages/components/touchchat/src/AiChat/AiMessage.vue2.mjs +22 -22
  35. package/es/packages/components/touchchat/src/AiChat/AiMessage.vue2.mjs.map +1 -1
  36. package/es/packages/components/touchchat/src/AiChat/Chat/scriptMatcher.mjs +145 -0
  37. package/es/packages/components/touchchat/src/AiChat/Chat/scriptMatcher.mjs.map +1 -0
  38. package/es/packages/components/touchchat/src/AiChat/Chat/types.mjs +18 -0
  39. package/es/packages/components/touchchat/src/AiChat/Chat/types.mjs.map +1 -0
  40. package/es/packages/components/touchchat/src/AiChat/Chat/useChat.mjs +672 -0
  41. package/es/packages/components/touchchat/src/AiChat/Chat/useChat.mjs.map +1 -0
  42. package/es/packages/components/touchchat/src/AiChat/Chat/useCopy.mjs +55 -0
  43. package/es/packages/components/touchchat/src/AiChat/Chat/useCopy.mjs.map +1 -0
  44. package/es/packages/components/touchchat/src/AiChat/Chat/useMessageRender.mjs +155 -0
  45. package/es/packages/components/touchchat/src/AiChat/Chat/useMessageRender.mjs.map +1 -0
  46. package/es/packages/components/touchchat/src/AiChat/Chat/useSSE.mjs +352 -0
  47. package/es/packages/components/touchchat/src/AiChat/Chat/useSSE.mjs.map +1 -0
  48. package/es/packages/components/touchchat/src/AiChat/Chat/useScroll.mjs +74 -0
  49. package/es/packages/components/touchchat/src/AiChat/Chat/useScroll.mjs.map +1 -0
  50. package/es/packages/components/touchchat/src/AiChat/ChatInput.vue2.mjs +8 -7
  51. package/es/packages/components/touchchat/src/AiChat/ChatInput.vue2.mjs.map +1 -1
  52. package/es/packages/components/touchchat/src/AiChat/HistoryList.vue2.mjs +1 -1
  53. package/es/packages/components/touchchat/src/AiChat/HistoryList.vue2.mjs.map +1 -1
  54. package/es/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.mjs +3 -3
  55. package/es/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.mjs.map +1 -1
  56. package/es/packages/components/touchchat/src/AiChat/MessageActions.vue2.mjs +11 -11
  57. package/es/packages/components/touchchat/src/AiChat/MessageActions.vue2.mjs.map +1 -1
  58. package/es/packages/components/touchchat/src/AiChat/SiderBarView.vue2.mjs +3 -3
  59. package/es/packages/components/touchchat/src/AiChat/SiderBarView.vue2.mjs.map +1 -1
  60. package/es/packages/components/touchchat/src/AiChat/TouchAgent.vue2.mjs +33 -29
  61. package/es/packages/components/touchchat/src/AiChat/TouchAgent.vue2.mjs.map +1 -1
  62. package/es/packages/components/touchchat/src/AiChat/TouchChat.vue2.mjs +179 -1332
  63. package/es/packages/components/touchchat/src/AiChat/TouchChat.vue2.mjs.map +1 -1
  64. package/es/packages/components/touchchat/src/AiChat/TouchHistory.vue2.mjs +19 -6
  65. package/es/packages/components/touchchat/src/AiChat/TouchHistory.vue2.mjs.map +1 -1
  66. package/es/packages/components/touchchat/src/AiChat/UserMessage.vue2.mjs +14 -14
  67. package/es/packages/components/touchchat/src/AiChat/UserMessage.vue2.mjs.map +1 -1
  68. package/es/packages/components/touchchat/src/index.vue2.mjs +3 -3
  69. package/es/packages/components/touchchat/src/index.vue2.mjs.map +1 -1
  70. package/es/packages/components/touchchat/utils/a2aService.mjs +3 -2
  71. package/es/packages/components/touchchat/utils/a2aService.mjs.map +1 -1
  72. package/es/packages/components/touchchat/utils/fetchStream.mjs +2 -1
  73. package/es/packages/components/touchchat/utils/fetchStream.mjs.map +1 -1
  74. package/es/packages/components/touchchat/utils/markdown.mjs +30 -12
  75. package/es/packages/components/touchchat/utils/markdown.mjs.map +1 -1
  76. package/lib/package.json.css +1 -1
  77. package/lib/package.json.js +1 -1
  78. package/lib/packages/components/touchchat/component/AiRobot/HelloChat.vue2.js.map +1 -1
  79. package/lib/packages/components/touchchat/component/AiRobot/letter.vue.js +1 -1
  80. package/lib/packages/components/touchchat/component/AiRobot/letter.vue2.js +15 -3
  81. package/lib/packages/components/touchchat/component/AiRobot/letter.vue2.js.map +1 -1
  82. package/lib/packages/components/touchchat/component/FileContent.vue2.js +3 -3
  83. package/lib/packages/components/touchchat/component/FileContent.vue2.js.map +1 -1
  84. package/lib/packages/components/touchchat/component/FileView.vue2.js +2 -2
  85. package/lib/packages/components/touchchat/component/FileView.vue2.js.map +1 -1
  86. package/lib/packages/components/touchchat/component/HelloChat.vue2.js.map +1 -1
  87. package/lib/packages/components/touchchat/component/ImageFile.vue2.js +6 -6
  88. package/lib/packages/components/touchchat/component/ImageFile.vue2.js.map +1 -1
  89. package/lib/packages/components/touchchat/component/ImageView.vue2.js +1 -1
  90. package/lib/packages/components/touchchat/component/ImageView.vue2.js.map +1 -1
  91. package/lib/packages/components/touchchat/component/LinkView.vue2.js +4 -4
  92. package/lib/packages/components/touchchat/component/LinkView.vue2.js.map +1 -1
  93. package/lib/packages/components/touchchat/component/MarkLayer.vue2.js +1 -1
  94. package/lib/packages/components/touchchat/component/MarkLayer.vue2.js.map +1 -1
  95. package/lib/packages/components/touchchat/component/ModuleSelect.vue2.js +2 -2
  96. package/lib/packages/components/touchchat/component/ModuleSelect.vue2.js.map +1 -1
  97. package/lib/packages/components/touchchat/component/PDFFile.vue2.js +8 -8
  98. package/lib/packages/components/touchchat/component/PDFFile.vue2.js.map +1 -1
  99. package/lib/packages/components/touchchat/component/RealtimeVoice.vue2.js +1 -1
  100. package/lib/packages/components/touchchat/component/RealtimeVoice.vue2.js.map +1 -1
  101. package/lib/packages/components/touchchat/component/Screenshot.vue2.js +11 -2
  102. package/lib/packages/components/touchchat/component/Screenshot.vue2.js.map +1 -1
  103. package/lib/packages/components/touchchat/component/UploadView.vue2.js +10 -7
  104. package/lib/packages/components/touchchat/component/UploadView.vue2.js.map +1 -1
  105. package/lib/packages/components/touchchat/component/VoiceView.vue2.js +1 -1
  106. package/lib/packages/components/touchchat/component/VoiceView.vue2.js.map +1 -1
  107. package/lib/packages/components/touchchat/src/AiChat/AgentsView.vue2.js +1 -1
  108. package/lib/packages/components/touchchat/src/AiChat/AgentsView.vue2.js.map +1 -1
  109. package/lib/packages/components/touchchat/src/AiChat/AiMessage.vue2.js +22 -22
  110. package/lib/packages/components/touchchat/src/AiChat/AiMessage.vue2.js.map +1 -1
  111. package/lib/packages/components/touchchat/src/AiChat/Chat/scriptMatcher.js +147 -0
  112. package/lib/packages/components/touchchat/src/AiChat/Chat/scriptMatcher.js.map +1 -0
  113. package/lib/packages/components/touchchat/src/AiChat/Chat/types.js +21 -0
  114. package/lib/packages/components/touchchat/src/AiChat/Chat/types.js.map +1 -0
  115. package/lib/packages/components/touchchat/src/AiChat/Chat/useChat.js +674 -0
  116. package/lib/packages/components/touchchat/src/AiChat/Chat/useChat.js.map +1 -0
  117. package/lib/packages/components/touchchat/src/AiChat/Chat/useCopy.js +57 -0
  118. package/lib/packages/components/touchchat/src/AiChat/Chat/useCopy.js.map +1 -0
  119. package/lib/packages/components/touchchat/src/AiChat/Chat/useMessageRender.js +157 -0
  120. package/lib/packages/components/touchchat/src/AiChat/Chat/useMessageRender.js.map +1 -0
  121. package/lib/packages/components/touchchat/src/AiChat/Chat/useSSE.js +354 -0
  122. package/lib/packages/components/touchchat/src/AiChat/Chat/useSSE.js.map +1 -0
  123. package/lib/packages/components/touchchat/src/AiChat/Chat/useScroll.js +76 -0
  124. package/lib/packages/components/touchchat/src/AiChat/Chat/useScroll.js.map +1 -0
  125. package/lib/packages/components/touchchat/src/AiChat/ChatInput.vue2.js +8 -7
  126. package/lib/packages/components/touchchat/src/AiChat/ChatInput.vue2.js.map +1 -1
  127. package/lib/packages/components/touchchat/src/AiChat/HistoryList.vue2.js +1 -1
  128. package/lib/packages/components/touchchat/src/AiChat/HistoryList.vue2.js.map +1 -1
  129. package/lib/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.js +3 -3
  130. package/lib/packages/components/touchchat/src/AiChat/HistorySidebar.vue2.js.map +1 -1
  131. package/lib/packages/components/touchchat/src/AiChat/MessageActions.vue2.js +11 -11
  132. package/lib/packages/components/touchchat/src/AiChat/MessageActions.vue2.js.map +1 -1
  133. package/lib/packages/components/touchchat/src/AiChat/SiderBarView.vue2.js +3 -3
  134. package/lib/packages/components/touchchat/src/AiChat/SiderBarView.vue2.js.map +1 -1
  135. package/lib/packages/components/touchchat/src/AiChat/TouchAgent.vue2.js +49 -45
  136. package/lib/packages/components/touchchat/src/AiChat/TouchAgent.vue2.js.map +1 -1
  137. package/lib/packages/components/touchchat/src/AiChat/TouchChat.vue2.js +179 -1332
  138. package/lib/packages/components/touchchat/src/AiChat/TouchChat.vue2.js.map +1 -1
  139. package/lib/packages/components/touchchat/src/AiChat/TouchHistory.vue2.js +19 -6
  140. package/lib/packages/components/touchchat/src/AiChat/TouchHistory.vue2.js.map +1 -1
  141. package/lib/packages/components/touchchat/src/AiChat/UserMessage.vue2.js +14 -14
  142. package/lib/packages/components/touchchat/src/AiChat/UserMessage.vue2.js.map +1 -1
  143. package/lib/packages/components/touchchat/src/index.vue2.js +3 -3
  144. package/lib/packages/components/touchchat/src/index.vue2.js.map +1 -1
  145. package/lib/packages/components/touchchat/utils/a2aService.js +3 -2
  146. package/lib/packages/components/touchchat/utils/a2aService.js.map +1 -1
  147. package/lib/packages/components/touchchat/utils/fetchStream.js +2 -1
  148. package/lib/packages/components/touchchat/utils/fetchStream.js.map +1 -1
  149. package/lib/packages/components/touchchat/utils/markdown.js +30 -12
  150. package/lib/packages/components/touchchat/utils/markdown.js.map +1 -1
  151. package/package.json +1 -1
@@ -0,0 +1,674 @@
1
+ 'use strict';
2
+
3
+ var vue = require('vue');
4
+ var types = require('./types.js');
5
+ var scriptMatcher = require('./scriptMatcher.js');
6
+ var useSSE = require('./useSSE.js');
7
+ var useScroll = require('./useScroll.js');
8
+ var useMessageRender = require('./useMessageRender.js');
9
+ var useCopy = require('./useCopy.js');
10
+
11
+ function useChat({ props, emit, scripts, unmatchText, modules, afterSend, sendMessageInject, beforeSend, bottom, stop, chatContainer, chatInputRef }) {
12
+ const isMounted = vue.ref(false);
13
+ const isChating = vue.ref(false);
14
+ const inputValue = vue.ref("");
15
+ const enableDeepThinking = vue.ref(false);
16
+ const chatList = vue.ref([]);
17
+ const currIndex = vue.ref(0);
18
+ const isUnmounting = vue.ref(false);
19
+ const currentComponentName = vue.ref("");
20
+ const fileData = vue.ref([]);
21
+ const activeAgentsName = vue.ref("");
22
+ const moduleInfo = vue.ref(modules[0] || { name: "deepseek-v3" });
23
+ const isDragging = vue.ref(false);
24
+ const typeFlag = vue.ref("");
25
+ const currentMessageProcessor = vue.ref(null);
26
+ const { htmlContentRef, thinkingContentRef, reasoningContentRef, markdownToHtml, renderContent, enqueueRender } = useMessageRender.useMessageRender({
27
+ chatList,
28
+ currIndex,
29
+ isMounted,
30
+ isUnmounting
31
+ });
32
+ const { scrollToBottom, handleScroll } = useScroll.useScroll({
33
+ chatContainer,
34
+ isMounted,
35
+ isUnmounting,
36
+ bottom
37
+ });
38
+ const { copyToClipboard } = useCopy.useCopy();
39
+ const scriptsRef = vue.ref(scripts);
40
+ const { activeScript, findMatchingScriptContent } = scriptMatcher.createScriptMatcher({
41
+ scripts: scriptsRef,
42
+ activeAgentsName,
43
+ fileData,
44
+ unmatchText
45
+ });
46
+ const { fetchStream, resultItem, openSSE, cleanupSSE } = useSSE.useSSE({
47
+ chatList,
48
+ currIndex,
49
+ isChating,
50
+ isMounted,
51
+ isUnmounting,
52
+ inputValue,
53
+ enableDeepThinking,
54
+ currentComponentName,
55
+ typeFlag,
56
+ moduleInfo,
57
+ emit,
58
+ afterSend,
59
+ enqueueRender,
60
+ renderContent,
61
+ markdownToHtml,
62
+ scrollToBottom,
63
+ stop
64
+ });
65
+ vue.watch(
66
+ () => activeAgentsName,
67
+ (val) => {
68
+ if (!val) {
69
+ activeAgentsName.value = localStorage.getItem("activeAgentsName");
70
+ }
71
+ },
72
+ { immediate: true }
73
+ );
74
+ const messageUtils = {
75
+ updateMessage: (index, updates) => {
76
+ if (index < 0 || index >= chatList.value.length)
77
+ return;
78
+ chatList.value.splice(index, 1, { ...chatList.value[index], ...updates });
79
+ vue.nextTick(() => {
80
+ const message = chatList.value[index];
81
+ if (message) {
82
+ renderContent(message.content, "main", index);
83
+ if (message.thinkContent) {
84
+ renderContent(message.thinkContent, "thinking", index);
85
+ }
86
+ if (message.reasoningContent) {
87
+ renderContent(message.reasoningContent, "reasoning", index);
88
+ }
89
+ }
90
+ });
91
+ },
92
+ deleteMessageChain: (index) => {
93
+ if (index < 0 || index >= chatList.value.length)
94
+ return;
95
+ if (chatList.value[index].user === "u") {
96
+ let deleteCount = 1;
97
+ for (let i = index + 1; i < chatList.value.length; i++) {
98
+ if (chatList.value[i].user === "ai") {
99
+ deleteCount++;
100
+ } else {
101
+ break;
102
+ }
103
+ }
104
+ chatList.value.splice(index, deleteCount);
105
+ } else {
106
+ chatList.value.splice(index, 1);
107
+ }
108
+ },
109
+ createStandardMessage: (data) => {
110
+ var _a, _b, _c, _d, _e;
111
+ return {
112
+ chatId: data.chatId || "ai_" + Math.random().toString(36).slice(2).padEnd(10, "0").slice(0, 10),
113
+ user: data.user || "ai",
114
+ type: data.type || "text",
115
+ content: data.content || "",
116
+ isChating: (_a = data.isChating) != null ? _a : false,
117
+ thinkContent: data.thinkContent || "",
118
+ reasoningContent: data.reasoningContent || "",
119
+ isLiked: (_b = data.isLiked) != null ? _b : false,
120
+ isDisliked: (_c = data.isDisliked) != null ? _c : false,
121
+ isEditing: (_d = data.isEditing) != null ? _d : false,
122
+ editContent: (_e = data.editContent) != null ? _e : ""
123
+ };
124
+ }
125
+ };
126
+ const update = (index, message) => {
127
+ chatList.value[index] = { ...chatList.value[index], ...message };
128
+ };
129
+ const updateModule = (info) => {
130
+ moduleInfo.value = info;
131
+ };
132
+ const handleAgentSelect = (item) => {
133
+ localStorage.setItem("activeAgentsName", item.name);
134
+ const aiMessage = item.intro;
135
+ messageUtils.updateMessage(0, {
136
+ content: "",
137
+ isChating: false
138
+ });
139
+ simulateStreamOutput(0, aiMessage);
140
+ };
141
+ const completeRendered = (chatId) => {
142
+ if (currentMessageProcessor.value) {
143
+ currentMessageProcessor.value.handleMessageComplete(chatId);
144
+ }
145
+ };
146
+ const init = () => {
147
+ try {
148
+ if (Array.isArray(props.value) && props.value.length && !scripts.length) {
149
+ chatList.value = props.value.map((item) => ({
150
+ ...item,
151
+ content: item.thinkContent ? item.content || "" : item.content || "",
152
+ thinkContent: item.thinkContent || ""
153
+ }));
154
+ vue.nextTick(() => {
155
+ requestAnimationFrame(() => {
156
+ if (activeAgentsName.value && chatList.value.length > 0 && chatList.value[0].user === "ai") {
157
+ const aiMessage = chatList.value[0];
158
+ messageUtils.updateMessage(0, {
159
+ content: "",
160
+ isChating: true
161
+ });
162
+ simulateStreamOutput(0, aiMessage.content);
163
+ } else {
164
+ chatList.value.forEach((item) => {
165
+ if (item.thinkContent) {
166
+ renderContent(item.thinkContent, "thinking");
167
+ }
168
+ if (item.reasoningContent) {
169
+ renderContent(item.reasoningContent, "reasoning");
170
+ }
171
+ if (item.content) {
172
+ renderContent(item.content, "main");
173
+ }
174
+ });
175
+ vue.nextTick(() => {
176
+ scrollToBottom();
177
+ });
178
+ }
179
+ });
180
+ });
181
+ }
182
+ } catch (error) {
183
+ }
184
+ };
185
+ const simulateStreamOutput = (aiIndex, msg, callback) => {
186
+ const message = typeof msg === "string" ? msg : msg.content;
187
+ const componentName = typeof msg === "string" ? "" : msg.needSequenceProcessing ? msg.needSequenceType : "";
188
+ const isNeedSequenceProcessing = typeof msg === "string" ? false : msg.needSequenceProcessing;
189
+ const fn = () => {
190
+ clearInterval(interval);
191
+ emit("sendMessage", [...chatList.value]);
192
+ if (componentName) {
193
+ chatList.value[aiIndex].componentName = componentName;
194
+ }
195
+ messageUtils.updateMessage(aiIndex, {
196
+ isChating: false
197
+ });
198
+ vue.nextTick(() => {
199
+ renderContent(message, "main", aiIndex);
200
+ vue.nextTick(() => {
201
+ scrollToBottom();
202
+ if (!isNeedSequenceProcessing && callback) {
203
+ callback();
204
+ }
205
+ });
206
+ });
207
+ };
208
+ let index = 0;
209
+ const interval = setInterval(() => {
210
+ if (index < message.length) {
211
+ const newContent = message;
212
+ messageUtils.updateMessage(aiIndex, {
213
+ content: newContent
214
+ });
215
+ vue.nextTick(() => {
216
+ renderContent(newContent, "main", aiIndex);
217
+ vue.nextTick(() => {
218
+ scrollToBottom();
219
+ });
220
+ });
221
+ index++;
222
+ } else {
223
+ fn();
224
+ }
225
+ }, 50);
226
+ };
227
+ vue.watch(
228
+ () => props.value,
229
+ (newVal, oldVal) => {
230
+ if (!Array.isArray(newVal))
231
+ return;
232
+ if (newVal.length && JSON.stringify(newVal) !== JSON.stringify(oldVal)) {
233
+ chatList.value = newVal.map((item) => ({
234
+ ...item,
235
+ content: item.thinkContent ? item.content || "" : item.content || "",
236
+ thinkContent: item.thinkContent || ""
237
+ }));
238
+ vue.nextTick(() => {
239
+ requestAnimationFrame(() => {
240
+ chatList.value.forEach((item) => {
241
+ if (item.thinkContent) {
242
+ renderContent(item.thinkContent, "thinking");
243
+ }
244
+ if (item.reasoningContent) {
245
+ renderContent(item.reasoningContent, "reasoning");
246
+ }
247
+ if (item.content) {
248
+ renderContent(item.content, "main");
249
+ }
250
+ });
251
+ vue.nextTick(() => {
252
+ scrollToBottom();
253
+ });
254
+ });
255
+ });
256
+ }
257
+ },
258
+ { deep: true, immediate: true }
259
+ );
260
+ const sendMessage = (content, fileList, auto, type) => {
261
+ inputValue.value = content || "";
262
+ handleBeforeSend(content, fileList, auto, type);
263
+ };
264
+ const handleBeforeSend = (content, fileList, auto, type) => {
265
+ fileData.value = fileList || [];
266
+ if (beforeSend) {
267
+ const fn = beforeSend();
268
+ if (fn && typeof fn.then === "function") {
269
+ Promise.resolve(fn).then((res) => {
270
+ if (res.result) {
271
+ currentComponentName.value = res.componentName || "";
272
+ handleSend(content, fileList, auto, type);
273
+ }
274
+ }).catch((error) => {
275
+ console.log(error);
276
+ });
277
+ } else {
278
+ if (fn.result) {
279
+ currentComponentName.value = fn.componentName || "";
280
+ handleSend(content, fileList, auto, type);
281
+ }
282
+ }
283
+ }
284
+ };
285
+ const handleSend = (content, fileList, auto, type) => {
286
+ emit("beforeSendMessage");
287
+ sendMessageInject(inputValue.value, fileData.value);
288
+ typeFlag.value = type || "";
289
+ if (scripts && Array.isArray(scripts) && scripts.length > 0) {
290
+ const userInput = content ? content.replace(/\n/g, "") : inputValue.value.replace(/\n/g, "").trim();
291
+ if (!userInput && !(fileList == null ? void 0 : fileList.length) && auto)
292
+ return;
293
+ const userChatId = `user_${Date.now()}`;
294
+ const userMessage = {
295
+ chatId: userChatId,
296
+ user: "u",
297
+ type: "text",
298
+ content: userInput,
299
+ isShowLike: false,
300
+ isShowCopy: true,
301
+ files: fileList || [],
302
+ typeFlag: type,
303
+ auto: auto || false
304
+ };
305
+ chatList.value.push(userMessage);
306
+ emit("sendMessage", [...chatList.value]);
307
+ vue.nextTick(() => {
308
+ renderContent(userMessage.content, "main", chatList.value.length - 1);
309
+ vue.nextTick(() => {
310
+ scrollToBottom();
311
+ });
312
+ });
313
+ const result = findMatchingScriptContent(userInput);
314
+ if (result && result.responses.length > 0) {
315
+ const newAiMessages = [];
316
+ result.responses.forEach((response, idx) => {
317
+ const pauseMarker = Array.isArray(response.data) ? "\u200B".repeat(20) : "";
318
+ const content2 = Array.isArray(response.data) ? response.data.join(pauseMarker) : response.data;
319
+ const aiChatId = `ai_${Date.now()}_${idx}`;
320
+ const aiMessage = {
321
+ chatId: aiChatId,
322
+ user: "ai",
323
+ type: "text",
324
+ content: content2 || "",
325
+ componentName: response.type || "",
326
+ isShowLike: true,
327
+ isShowCopy: true,
328
+ needSequenceType: response.type || "",
329
+ needSequenceProcessing: response.needSequenceProcessing || false,
330
+ typeFlag: type
331
+ };
332
+ newAiMessages.push(aiMessage);
333
+ });
334
+ const messageQueue = [...newAiMessages];
335
+ let isProcessing = false;
336
+ let currentMessage = null;
337
+ const processNextMessage = () => {
338
+ if (messageQueue.length > 0 && !isProcessing) {
339
+ isProcessing = true;
340
+ const nextMessage = messageQueue.shift();
341
+ if (nextMessage) {
342
+ currentMessage = nextMessage;
343
+ chatList.value.push(currentMessage);
344
+ emit("sendMessage", [...chatList.value]);
345
+ const msgIndex = chatList.value.length - 1;
346
+ vue.nextTick(() => {
347
+ renderContent((currentMessage == null ? void 0 : currentMessage.content) || "", "main", msgIndex);
348
+ vue.nextTick(() => {
349
+ scrollToBottom();
350
+ if (currentMessage) {
351
+ const messageToProcess = {
352
+ ...currentMessage,
353
+ needSequenceProcessing: true
354
+ };
355
+ simulateStreamOutput(msgIndex, messageToProcess);
356
+ }
357
+ });
358
+ });
359
+ }
360
+ }
361
+ };
362
+ const handleMessageComplete = (chatId) => {
363
+ if (currentMessage && currentMessage.chatId === chatId) {
364
+ currentMessage = null;
365
+ isProcessing = false;
366
+ processNextMessage();
367
+ }
368
+ };
369
+ const processorObj = {
370
+ messageQueue,
371
+ isProcessing,
372
+ currentMessage,
373
+ processNextMessage,
374
+ handleMessageComplete
375
+ };
376
+ currentMessageProcessor.value = processorObj;
377
+ processNextMessage();
378
+ } else {
379
+ const defaultAiChatId = `ai_${Date.now()}`;
380
+ const defaultAiMessage = {
381
+ chatId: defaultAiChatId,
382
+ user: "ai",
383
+ type: "text",
384
+ content: unmatchText,
385
+ isShowLike: true,
386
+ isShowCopy: true
387
+ };
388
+ chatList.value.push(defaultAiMessage);
389
+ emit("sendMessage", [...chatList.value]);
390
+ vue.nextTick(() => {
391
+ const msgIndex = chatList.value.findIndex((item) => item.chatId === defaultAiChatId);
392
+ if (msgIndex !== -1) {
393
+ renderContent(defaultAiMessage.content, "main", msgIndex);
394
+ vue.nextTick(() => {
395
+ scrollToBottom();
396
+ });
397
+ }
398
+ });
399
+ }
400
+ inputValue.value = "";
401
+ } else {
402
+ if (content) {
403
+ inputValue.value = content;
404
+ }
405
+ if ((isChating.value || !inputValue.value.trim() && !(fileList == null ? void 0 : fileList.length)) && !auto)
406
+ return;
407
+ const userChatId = "user_" + Math.random().toString(36).slice(2).padEnd(10, "0").slice(0, 10);
408
+ const userMessage = {
409
+ chatId: userChatId,
410
+ user: "u",
411
+ type: "text",
412
+ content: inputValue.value,
413
+ files: fileList || []
414
+ };
415
+ chatList.value.push(userMessage);
416
+ const index = chatList.value.length - 1;
417
+ vue.nextTick(() => {
418
+ renderContent(userMessage.content, "main", index);
419
+ scrollToBottom();
420
+ });
421
+ openSSE(inputValue.value, index + 1, 1);
422
+ inputValue.value = "";
423
+ }
424
+ };
425
+ const handleStop = () => {
426
+ var _a;
427
+ cleanupSSE();
428
+ const aiIndex = chatList.value.findIndex((item) => item.isChating);
429
+ if (aiIndex !== -1) {
430
+ const currentAiMessage = chatList.value[aiIndex];
431
+ if ((_a = currentAiMessage.content) == null ? void 0 : _a.trim()) {
432
+ vue.nextTick(() => {
433
+ chatList.value[aiIndex] = {
434
+ ...currentAiMessage,
435
+ content: currentAiMessage.content + "...",
436
+ isChating: false
437
+ };
438
+ renderContent(chatList.value[aiIndex].content, "main", aiIndex);
439
+ emit("sendMessage", chatList.value);
440
+ });
441
+ } else {
442
+ if (aiIndex > 0) {
443
+ const userMessageIndex = aiIndex - 1;
444
+ if (chatList.value[userMessageIndex].user === "u") {
445
+ chatList.value.splice(userMessageIndex, 2);
446
+ } else {
447
+ chatList.value.splice(aiIndex, 1);
448
+ }
449
+ } else {
450
+ chatList.value.splice(aiIndex, 1);
451
+ }
452
+ }
453
+ } else {
454
+ const lastIndex = chatList.value.length - 1;
455
+ if (lastIndex >= 0 && chatList.value[lastIndex].user === "u") {
456
+ chatList.value.pop();
457
+ }
458
+ }
459
+ isChating.value = false;
460
+ };
461
+ const handleMessageAction = (action, index) => {
462
+ const message = chatList.value[index];
463
+ if (!message)
464
+ return;
465
+ switch (action) {
466
+ case types.MessageAction.COPY: {
467
+ copyToClipboard(message.content, "\u590D\u5236\u6210\u529F", "\u590D\u5236\u5931\u8D25");
468
+ break;
469
+ }
470
+ case types.MessageAction.EDIT:
471
+ message.isEditing = true;
472
+ message.editContent = message.content;
473
+ break;
474
+ case types.MessageAction.DELETE:
475
+ messageUtils.deleteMessageChain(index);
476
+ emit("sendMessage", chatList.value);
477
+ break;
478
+ case types.MessageAction.RETRY: {
479
+ const aiMessage = chatList.value[index];
480
+ const userMessageIndex = index - 1;
481
+ const userMessage = chatList.value[userMessageIndex];
482
+ if (userMessage && userMessage.user === "u") {
483
+ const updatedAiMessage = {
484
+ ...aiMessage,
485
+ content: "",
486
+ thinkContent: "",
487
+ reasoningContent: "",
488
+ isLiked: false,
489
+ isDisliked: false,
490
+ isChating: true,
491
+ chatId: aiMessage.chatId,
492
+ user: aiMessage.user,
493
+ type: aiMessage.type,
494
+ thinkStatus: types.ThinkStatus.COMPLETED,
495
+ thinkStartTime: 0,
496
+ thinkEndTime: 0
497
+ };
498
+ chatList.value.splice(index, 1, updatedAiMessage);
499
+ vue.nextTick(() => {
500
+ if (htmlContentRef.value[index])
501
+ htmlContentRef.value[index].innerHTML = "";
502
+ if (thinkingContentRef.value[index])
503
+ thinkingContentRef.value[index].innerHTML = "";
504
+ if (reasoningContentRef.value[index])
505
+ reasoningContentRef.value[index].innerHTML = "";
506
+ setTimeout(() => {
507
+ openSSE(userMessage.content || "", index, 1);
508
+ }, 50);
509
+ });
510
+ }
511
+ break;
512
+ }
513
+ case types.MessageAction.LIKE:
514
+ messageUtils.updateMessage(index, {
515
+ isLiked: true,
516
+ isDisliked: false
517
+ });
518
+ break;
519
+ case types.MessageAction.DISLIKE:
520
+ messageUtils.updateMessage(index, {
521
+ isLiked: false,
522
+ isDisliked: true
523
+ });
524
+ break;
525
+ }
526
+ };
527
+ const saveEdit = (index, newContent) => {
528
+ const message = chatList.value[index];
529
+ if (!message || !message.editContent)
530
+ return;
531
+ chatList.value[index] = {
532
+ ...message,
533
+ content: newContent,
534
+ isEditing: false,
535
+ editContent: void 0
536
+ };
537
+ vue.nextTick(() => {
538
+ renderContent(newContent, "main", index);
539
+ });
540
+ const hasDeletedAi = index + 1 < chatList.value.length && chatList.value[index + 1].user === "ai";
541
+ if (hasDeletedAi) {
542
+ chatList.value.splice(index + 1, 1);
543
+ }
544
+ const insertPosition = index + 1;
545
+ vue.nextTick(() => {
546
+ openSSE(newContent, insertPosition, 1);
547
+ });
548
+ emit("sendMessage", chatList.value);
549
+ };
550
+ const cancelEdit = (index) => {
551
+ const message = chatList.value[index];
552
+ if (!message)
553
+ return;
554
+ message.isEditing = false;
555
+ message.editContent = "";
556
+ vue.nextTick(() => {
557
+ renderContent(message.content, "main", index);
558
+ });
559
+ };
560
+ const handleDragEnter = () => {
561
+ isDragging.value = true;
562
+ if (chatInputRef == null ? void 0 : chatInputRef.value) {
563
+ chatInputRef.value.openMarkLayer();
564
+ }
565
+ };
566
+ const handleDragLeave = (e) => {
567
+ const rect = e.target.getBoundingClientRect();
568
+ if (e.clientX < rect.left || e.clientX > rect.right || e.clientY < rect.top || e.clientY > rect.bottom) {
569
+ isDragging.value = false;
570
+ }
571
+ };
572
+ const handleDrop = async (e) => {
573
+ var _a;
574
+ isDragging.value = false;
575
+ const files = (_a = e.dataTransfer) == null ? void 0 : _a.files;
576
+ if (files && files.length > 0) {
577
+ const fileList = await Promise.all(
578
+ Array.from(files).map(async (file) => {
579
+ let base64 = "";
580
+ if (file.type.startsWith("image/")) {
581
+ base64 = await new Promise((resolve) => {
582
+ const reader = new FileReader();
583
+ reader.onload = (e2) => {
584
+ var _a2;
585
+ resolve((_a2 = e2.target) == null ? void 0 : _a2.result);
586
+ };
587
+ reader.readAsDataURL(file);
588
+ });
589
+ }
590
+ return {
591
+ id: Math.random().toString(36).slice(2).padEnd(10, "0").slice(0, 10),
592
+ file,
593
+ name: file.name,
594
+ fileType: file.type,
595
+ fileSize: file.size,
596
+ lastModified: file.lastModified,
597
+ preview: URL.createObjectURL(file),
598
+ base64
599
+ };
600
+ })
601
+ );
602
+ if (chatInputRef == null ? void 0 : chatInputRef.value) {
603
+ chatInputRef.value.handlePaste(fileList, "drop");
604
+ }
605
+ }
606
+ if (chatInputRef == null ? void 0 : chatInputRef.value) {
607
+ chatInputRef.value.colseMarkLayer();
608
+ }
609
+ };
610
+ const onMounted = () => {
611
+ if (!isMounted.value) {
612
+ init();
613
+ }
614
+ isMounted.value = true;
615
+ };
616
+ const onBeforeUnmount = () => {
617
+ if (!isUnmounting.value) {
618
+ isUnmounting.value = true;
619
+ cleanupSSE();
620
+ isMounted.value = false;
621
+ }
622
+ };
623
+ return {
624
+ // 状态
625
+ chatList,
626
+ isChating,
627
+ inputValue,
628
+ enableDeepThinking,
629
+ isMounted,
630
+ isUnmounting,
631
+ currentComponentName,
632
+ fileData,
633
+ activeAgentsName,
634
+ moduleInfo,
635
+ isDragging,
636
+ typeFlag,
637
+ currIndex,
638
+ fetchStream,
639
+ resultItem,
640
+ currentMessageProcessor,
641
+ activeScript,
642
+ htmlContentRef,
643
+ thinkingContentRef,
644
+ reasoningContentRef,
645
+ // 方法
646
+ init,
647
+ sendMessage,
648
+ handleBeforeSend,
649
+ handleSend,
650
+ handleStop,
651
+ handleMessageAction,
652
+ saveEdit,
653
+ cancelEdit,
654
+ completeRendered,
655
+ handleAgentSelect,
656
+ update,
657
+ updateModule,
658
+ messageUtils,
659
+ simulateStreamOutput,
660
+ handleDragEnter,
661
+ handleDragLeave,
662
+ handleDrop,
663
+ onMounted,
664
+ onBeforeUnmount,
665
+ cleanupSSE,
666
+ scrollToBottom,
667
+ handleScroll,
668
+ renderContent,
669
+ enqueueRender
670
+ };
671
+ }
672
+
673
+ exports.useChat = useChat;
674
+ //# sourceMappingURL=useChat.js.map