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