vue-element-ui-x 1.0.42-beta → 1.0.43-beta

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 (89) hide show
  1. package/lib/index.common.js +1 -1
  2. package/lib/index.esm.js +1 -1
  3. package/lib/index.ssr.js +90 -0
  4. package/lib/index.umd.js +1 -1
  5. package/package.json +5 -5
  6. package/src/components/Attachments/index.js +0 -8
  7. package/src/components/Attachments/src/main.vue +0 -529
  8. package/src/components/Bubble/index.js +0 -6
  9. package/src/components/Bubble/src/main.vue +0 -288
  10. package/src/components/BubbleList/index.js +0 -8
  11. package/src/components/BubbleList/src/loading.vue +0 -75
  12. package/src/components/BubbleList/src/main.vue +0 -444
  13. package/src/components/Conversations/index.js +0 -8
  14. package/src/components/Conversations/src/components/item.vue +0 -350
  15. package/src/components/Conversations/src/main.vue +0 -587
  16. package/src/components/FilesCard/index.js +0 -8
  17. package/src/components/FilesCard/src/fileSvg/audio.vue +0 -38
  18. package/src/components/FilesCard/src/fileSvg/changeFileName.bat +0 -18
  19. package/src/components/FilesCard/src/fileSvg/code.vue +0 -35
  20. package/src/components/FilesCard/src/fileSvg/database.vue +0 -94
  21. package/src/components/FilesCard/src/fileSvg/excel.vue +0 -38
  22. package/src/components/FilesCard/src/fileSvg/file.vue +0 -40
  23. package/src/components/FilesCard/src/fileSvg/image.vue +0 -40
  24. package/src/components/FilesCard/src/fileSvg/index.js +0 -46
  25. package/src/components/FilesCard/src/fileSvg/link.vue +0 -54
  26. package/src/components/FilesCard/src/fileSvg/mark.vue +0 -38
  27. package/src/components/FilesCard/src/fileSvg/pdf.vue +0 -38
  28. package/src/components/FilesCard/src/fileSvg/ppt.vue +0 -38
  29. package/src/components/FilesCard/src/fileSvg/three.vue +0 -38
  30. package/src/components/FilesCard/src/fileSvg/txt.vue +0 -38
  31. package/src/components/FilesCard/src/fileSvg/unknown.vue +0 -54
  32. package/src/components/FilesCard/src/fileSvg/video.vue +0 -38
  33. package/src/components/FilesCard/src/fileSvg/word.vue +0 -38
  34. package/src/components/FilesCard/src/fileSvg/zip.vue +0 -38
  35. package/src/components/FilesCard/src/main.vue +0 -403
  36. package/src/components/FilesCard/src/options.js +0 -18
  37. package/src/components/Prompts/index.js +0 -8
  38. package/src/components/Prompts/src/main.vue +0 -248
  39. package/src/components/Sender/index.js +0 -8
  40. package/src/components/Sender/src/components/ClearButton.vue +0 -28
  41. package/src/components/Sender/src/components/Loading.vue +0 -53
  42. package/src/components/Sender/src/components/LoadingButton.vue +0 -37
  43. package/src/components/Sender/src/components/SendButton.vue +0 -26
  44. package/src/components/Sender/src/components/SpeechButton.vue +0 -24
  45. package/src/components/Sender/src/components/SpeechLoading.vue +0 -87
  46. package/src/components/Sender/src/components/SpeechLoadingButton.vue +0 -41
  47. package/src/components/Sender/src/main.vue +0 -803
  48. package/src/components/Thinking/index.js +0 -8
  49. package/src/components/Thinking/src/main.vue +0 -199
  50. package/src/components/ThoughtChain/index.js +0 -8
  51. package/src/components/ThoughtChain/src/main.vue +0 -291
  52. package/src/components/Typewriter/index.js +0 -8
  53. package/src/components/Typewriter/src/main.vue +0 -255
  54. package/src/components/Welcome/index.js +0 -8
  55. package/src/components/Welcome/src/main.vue +0 -151
  56. package/src/index.js +0 -104
  57. package/src/locale/index.js +0 -97
  58. package/src/locale/lang/ar.js +0 -18
  59. package/src/locale/lang/de.js +0 -18
  60. package/src/locale/lang/en.js +0 -18
  61. package/src/locale/lang/es.js +0 -18
  62. package/src/locale/lang/fr.js +0 -18
  63. package/src/locale/lang/index.js +0 -62
  64. package/src/locale/lang/it.js +0 -18
  65. package/src/locale/lang/ja.js +0 -18
  66. package/src/locale/lang/ko.js +0 -18
  67. package/src/locale/lang/pt-br.js +0 -18
  68. package/src/locale/lang/ru-RU.js +0 -18
  69. package/src/locale/lang/zh-CN.js +0 -18
  70. package/src/locale/lang/zh-TW.js +0 -18
  71. package/src/locale/mixin.js +0 -9
  72. package/src/mixins/index.js +0 -49
  73. package/src/mixins/recordMixin.js +0 -117
  74. package/src/mixins/sendMixin.js +0 -450
  75. package/src/mixins/streamMixin.js +0 -497
  76. package/src/styles/Attachments.scss +0 -236
  77. package/src/styles/Bubble.scss +0 -158
  78. package/src/styles/BubbleList.scss +0 -148
  79. package/src/styles/Conversations.scss +0 -283
  80. package/src/styles/FilesCard.scss +0 -222
  81. package/src/styles/Prompts.scss +0 -197
  82. package/src/styles/Sender.scss +0 -211
  83. package/src/styles/Thinking.scss +0 -142
  84. package/src/styles/ThoughtChain.scss +0 -113
  85. package/src/styles/Typewriter.scss +0 -66
  86. package/src/styles/Welcome.scss +0 -283
  87. package/src/theme/var.scss +0 -183
  88. package/src/utils/index.js +0 -199
  89. package/src/utils/scrollDetector.js +0 -34
@@ -1,450 +0,0 @@
1
- /**
2
- * XRequest 类 - 用于处理 SSE 和 Fetch 请求
3
- */
4
- export class XRequest {
5
- constructor(options = {}) {
6
- const {
7
- baseURL,
8
- onAbort,
9
- onMessage,
10
- onError,
11
- baseOptions,
12
- transformer,
13
- type,
14
- onFinish,
15
- onOpen,
16
- } = options;
17
-
18
- this._instance = null;
19
- this._transformer = transformer;
20
- this._baseURL = baseURL || '';
21
- this._baseOptions = baseOptions || {};
22
- this._onAbort = onAbort;
23
- this._onMessage = onMessage;
24
- this._onError = onError;
25
- this._onOpen = onOpen;
26
- this._type = type || 'sse';
27
- this._controller = null;
28
- this._onFinish = onFinish;
29
- this._messages = [];
30
- // 添加结束标志和超时控制
31
- this._isFinished = false;
32
- this._finishTimeout = null;
33
-
34
- // 绑定方法上下文
35
- this.abort = this.abort.bind(this);
36
- this.send = this.send.bind(this);
37
- }
38
-
39
- _sendWithFetch(url, options = {}) {
40
- this._controller = new AbortController();
41
- const signal = this._controller.signal;
42
- const fetchOptions = {
43
- ...options,
44
- signal,
45
- };
46
-
47
- // 用于存储跨 chunk 的不完整数据
48
- let buffer = '';
49
-
50
- return fetch(this._baseURL + url, fetchOptions)
51
- .then(res => res.body)
52
- .then(async body => {
53
- if (!body) {
54
- return Promise.reject(new Error('Response body is null in stream mode'));
55
- }
56
-
57
- const reader = body.getReader();
58
- const decoder = new TextDecoder('utf-8');
59
- let done = false;
60
-
61
- while (!done) {
62
- const { value, done: streamDone } = await reader.read();
63
- done = streamDone;
64
-
65
- if (streamDone) {
66
- // 处理缓冲区中剩余的数据
67
- if (buffer.trim()) {
68
- this.processBufferData(buffer);
69
- }
70
- this._onFinish && this._onFinish(this._messages);
71
- return;
72
- }
73
-
74
- if (value) {
75
- const chunk = decoder.decode(value, {
76
- stream: true,
77
- });
78
- // console.log('chunk:', chunk);
79
- // 将新数据添加到缓冲区
80
- buffer += chunk;
81
-
82
- // 处理缓冲区中的完整行
83
- buffer = this.processBuffer(buffer);
84
- // const chunkUse = chunk.startsWith('data: ') ? chunk.slice(6) : chunk;
85
-
86
- // try {
87
- // const res = this._transformer ? this._transformer(chunkUse) : chunkUse;
88
- // this._messages.push(res);
89
- // this._onMessage && this._onMessage(res);
90
- // } catch (error) {
91
- // this._onError && this._onError(error);
92
- // this._controller && this._controller.abort();
93
- // return Promise.reject(error);
94
- // }
95
- }
96
- }
97
- })
98
- .catch(err => {
99
- if (err.name === 'AbortError') {
100
- this._onAbort && this._onAbort(this._messages);
101
- return;
102
- }
103
- this._onError && this._onError(err);
104
- this._controller && this._controller.abort();
105
- });
106
- }
107
- /**
108
- * 处理缓冲区数据,提取完整的行
109
- * @param {string} buffer - 缓冲区数据
110
- * @returns {string} 剩余的不完整数据
111
- */
112
- processBuffer(buffer) {
113
- const lines = buffer.split('\n');
114
- // console.log('lines:', lines);
115
- // 保留最后一行(可能不完整)
116
- const remainingData = lines.pop();
117
-
118
- // 处理完整的行
119
- for (const line of lines) {
120
- this.processLine(line);
121
- }
122
-
123
- return remainingData || '';
124
- }
125
-
126
- /**
127
- * 处理单行数据
128
- * @param {string} line - 单行数据
129
- */
130
- processLine(line) {
131
- // 跳过空行
132
- if (!line.trim()) {
133
- return;
134
- }
135
-
136
- // 处理 data: 开头的行
137
- if (line.startsWith('data: ')) {
138
- const dataContent = line.slice(6);
139
-
140
- // 检查是否是结束标识
141
- if (dataContent.trim() === '[DONE]') {
142
- this._isFinished = true;
143
- this._onFinish && this._onFinish(this._messages);
144
- this.abort();
145
- return;
146
- }
147
-
148
- // 跳过空数据
149
- if (!dataContent.trim()) {
150
- return;
151
- }
152
-
153
- try {
154
- // 尝试解析和处理数据
155
- let processedData;
156
- try {
157
- // 首先尝试作为 JSON 解析
158
- processedData = JSON.parse(dataContent);
159
- } catch {
160
- // 如果不是 JSON,使用原始数据
161
- processedData = dataContent;
162
- }
163
- // console.log('processedData:', processedData, processedData.answer);
164
-
165
- const res = this._transformer ? this._transformer(processedData) : processedData;
166
- this._messages.push(res);
167
- this._onMessage && this._onMessage(res);
168
- } catch (error) {
169
- console.error('Error processing line:', line, error);
170
- this._onError && this._onError(error);
171
- this._controller && this._controller.abort();
172
- }
173
- }
174
- // 可以在这里处理其他类型的行(如果需要)
175
- }
176
-
177
- /**
178
- * 处理缓冲区中剩余的数据(在流结束时调用)
179
- * @param {string} buffer - 剩余的缓冲区数据
180
- */
181
- processBufferData(buffer) {
182
- const lines = buffer.split('\n');
183
- for (const line of lines) {
184
- this.processLine(line);
185
- }
186
- }
187
-
188
- _sendWithSSE(url, options = {}) {
189
- const es = new EventSource(this._baseURL + url, {
190
- ...this._baseOptions,
191
- ...options,
192
- });
193
-
194
- es.onmessage = e => {
195
- // 检查是否是结束消息
196
- if (e.data === '[DONE]' || e.data === 'data: [DONE]') {
197
- this._isFinished = true;
198
- this._onFinish && this._onFinish(this._messages);
199
- this.abort();
200
- return;
201
- }
202
-
203
- const res = this._transformer ? this._transformer(e.data) : e;
204
- this._messages.push(res);
205
- this._onMessage && this._onMessage(res);
206
-
207
- // 重置超时定时器
208
- if (this._finishTimeout) {
209
- clearTimeout(this._finishTimeout);
210
- }
211
-
212
- // 设置超时检测:如果 10 秒内没有新消息,认为连接可能已结束
213
- this._finishTimeout = setTimeout(() => {
214
- if (!this._isFinished && es.readyState !== EventSource.CONNECTING) {
215
- this._isFinished = true;
216
- this._onFinish && this._onFinish(this._messages);
217
- this.abort();
218
- }
219
- }, 10000);
220
- };
221
-
222
- es.onopen = () => {
223
- this._onOpen && this._onOpen();
224
- };
225
-
226
- es.onerror = ev => {
227
- // 清除超时定时器
228
- if (this._finishTimeout) {
229
- clearTimeout(this._finishTimeout);
230
- this._finishTimeout = null;
231
- }
232
-
233
- // 如果已经标记为结束,直接返回
234
- if (this._isFinished) {
235
- return;
236
- }
237
-
238
- // 更可靠的结束检测逻辑
239
- if (
240
- es.readyState === EventSource.CLOSED ||
241
- (this._messages.length > 0 && es.readyState !== EventSource.CONNECTING)
242
- ) {
243
- // 有消息且连接状态不是正在连接,很可能是正常结束
244
- this._isFinished = true;
245
- this._onFinish && this._onFinish(this._messages);
246
- } else {
247
- // 真正的错误情况
248
- this._onError && this._onError(es, ev);
249
- }
250
- this.abort();
251
- };
252
-
253
- this._instance = es;
254
- return es;
255
- }
256
-
257
- send(url, options = {}) {
258
- switch (this._type) {
259
- case 'fetch':
260
- this._sendWithFetch(url, options);
261
- break;
262
- default:
263
- this._sendWithSSE(url, options);
264
- }
265
- return this;
266
- }
267
-
268
- abort() {
269
- // 清除超时定时器
270
- if (this._finishTimeout) {
271
- clearTimeout(this._finishTimeout);
272
- this._finishTimeout = null;
273
- }
274
-
275
- if (this._instance && this._instance.close) {
276
- this._instance.close();
277
- }
278
- this._instance = null;
279
-
280
- if (this._controller) {
281
- this._controller.abort();
282
- }
283
- this._controller = null;
284
-
285
- // 只有在未正常结束时才调用 onAbort
286
- if (!this._isFinished) {
287
- this._onAbort && this._onAbort(this._messages);
288
- }
289
-
290
- this._messages = [];
291
- this._isFinished = false;
292
- }
293
- }
294
-
295
- /**
296
- * sendMixin -
297
- * 用于处理发送操作管理请求状态的 mixin,支持可选的中止功能,同时支持 Promise 和 SSE(服务端事件)
298
- */
299
- export const sendMixin = {
300
- data() {
301
- return {
302
- loading: false,
303
- _sendPromise: null,
304
- _sendController: null,
305
- };
306
- },
307
-
308
- methods: {
309
- /**
310
- * 初始化发送配置
311
- * @param {Object} options - 配置选项
312
- * @param {Function} options.onAbort - 中止回调
313
- * @param {Function} options.sendHandler - 发送处理器
314
- * @param {Function} options.abortHandler - 中止处理器
315
- * @param {Function} options.finishHandler - 完成处理器
316
- */
317
- initSend(options = {}) {
318
- this._sendOptions = {
319
- onAbort: options.onAbort,
320
- sendHandler: options.sendHandler,
321
- abortHandler: options.abortHandler,
322
- finishHandler: options.finishHandler,
323
- };
324
- },
325
-
326
- /**
327
- * 发送操作
328
- * @param {...any} args - 传递给 sendHandler 的参数
329
- */
330
- handleSend(...args) {
331
- if (this.loading) {
332
- return;
333
- }
334
-
335
- if (this._sendOptions && this._sendOptions.sendHandler) {
336
- this._sendOptions.sendHandler(...args);
337
- }
338
-
339
- this.loading = true;
340
- },
341
-
342
- /**
343
- * 中止操作
344
- */
345
- handleAbort() {
346
- this.loading = false;
347
-
348
- if (this._sendOptions && this._sendOptions.abortHandler) {
349
- this._sendOptions.abortHandler();
350
- }
351
-
352
- if (this._sendOptions && this._sendOptions.onAbort) {
353
- this._sendOptions.onAbort();
354
- }
355
- },
356
-
357
- /**
358
- * 完成操作
359
- */
360
- handleFinish() {
361
- this.loading = false;
362
-
363
- if (this._sendOptions && this._sendOptions.finishHandler) {
364
- this._sendOptions.finishHandler();
365
- }
366
- },
367
-
368
- /**
369
- * 创建 XRequest 实例的便捷方法
370
- * @param {Object} options - XRequest 配置选项
371
- * @returns {XRequest} XRequest 实例
372
- */
373
- createXRequest(options = {}) {
374
- return new XRequest({
375
- ...options,
376
- onAbort: (...args) => {
377
- this.handleAbort();
378
- if (options.onAbort) {
379
- options.onAbort(...args);
380
- }
381
- },
382
- onFinish: (...args) => {
383
- this.handleFinish();
384
- if (options.onFinish) {
385
- options.onFinish(...args);
386
- }
387
- },
388
- });
389
- },
390
- },
391
-
392
- beforeDestroy() {
393
- // 组件销毁时清理资源
394
- if (this._sendController) {
395
- this._sendController.abort();
396
- }
397
- },
398
- };
399
-
400
- /**
401
- * 工具函数版本 - 用于非组件场景
402
- * @param {Object} options - 配置选项
403
- * @returns {Object} 包含发送相关方法的对象
404
- */
405
- export function createSendUtils(options = {}) {
406
- const state = {
407
- loading: false,
408
- };
409
-
410
- const handleSend = (...args) => {
411
- if (state.loading) {
412
- return;
413
- }
414
-
415
- if (options.sendHandler) {
416
- options.sendHandler(...args);
417
- }
418
-
419
- state.loading = true;
420
- };
421
-
422
- const handleAbort = () => {
423
- state.loading = false;
424
-
425
- if (options.abortHandler) {
426
- options.abortHandler();
427
- }
428
-
429
- if (options.onAbort) {
430
- options.onAbort();
431
- }
432
- };
433
-
434
- const handleFinish = () => {
435
- state.loading = false;
436
-
437
- if (options.finishHandler) {
438
- options.finishHandler();
439
- }
440
- };
441
-
442
- return {
443
- state,
444
- send: handleSend,
445
- abort: handleAbort,
446
- finish: handleFinish,
447
- };
448
- }
449
-
450
- export default sendMixin;