byt-lingxiao-ai 0.3.0 → 0.3.2

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 (38) hide show
  1. package/components/AiMessage.vue +12 -18
  2. package/components/ChatAvatar.vue +8 -1
  3. package/components/ChatMessageList.vue +29 -10
  4. package/components/ChatWindow.vue +107 -4
  5. package/components/ChatWindowHeader.vue +1 -0
  6. package/components/assets/arrow.png +0 -0
  7. package/components/assets/empty.png +0 -0
  8. package/components/assets/entering.png +0 -0
  9. package/components/assets/logo.png +0 -0
  10. package/components/assets/normal.png +0 -0
  11. package/components/assets/output.png +0 -0
  12. package/components/assets/speaking.png +0 -0
  13. package/components/assets/think.png +0 -0
  14. package/components/assets/thinking.png +0 -0
  15. package/components/assets/waiting.png +0 -0
  16. package/components/mixins/messageMixin.js +11 -5
  17. package/dist/img/empty.f36cb82e.png +0 -0
  18. package/dist/img/entering.4ef198fb.png +0 -0
  19. package/dist/img/normal.30197a82.png +0 -0
  20. package/dist/img/output.1dfa94eb.png +0 -0
  21. package/dist/img/speaking.fa87fedb.png +0 -0
  22. package/dist/img/thinking.21ad5ca5.png +0 -0
  23. package/dist/img/waiting.460478ef.png +0 -0
  24. package/dist/index.common.js +189 -79
  25. package/dist/index.common.js.map +1 -1
  26. package/dist/index.css +2 -2
  27. package/dist/index.umd.js +189 -79
  28. package/dist/index.umd.js.map +1 -1
  29. package/dist/index.umd.min.js +1 -1
  30. package/dist/index.umd.min.js.map +1 -1
  31. package/package.json +1 -1
  32. package/components/assets/byt.mp3 +0 -0
  33. package/dist/img/entering.42f05909.png +0 -0
  34. package/dist/img/normal.13f08ecb.png +0 -0
  35. package/dist/img/output.85c6bd8b.png +0 -0
  36. package/dist/img/speaking.3ce8b666.png +0 -0
  37. package/dist/img/thinking.05f29a84.png +0 -0
  38. package/dist/img/waiting.ac21d76e.png +0 -0
@@ -28450,12 +28450,13 @@ if (typeof window !== 'undefined') {
28450
28450
  var es_iterator_constructor = __webpack_require__(8111);
28451
28451
  // EXTERNAL MODULE: ./node_modules/core-js/modules/es.iterator.for-each.js
28452
28452
  var es_iterator_for_each = __webpack_require__(7588);
28453
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./components/ChatWindow.vue?vue&type=template&id=14ff12bc&scoped=true
28453
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./components/ChatWindow.vue?vue&type=template&id=637b4214&scoped=true
28454
28454
  var render = function render() {
28455
28455
  var _vm = this,
28456
28456
  _c = _vm._self._c;
28457
28457
  return _c('div', {
28458
- staticClass: "chat"
28458
+ staticClass: "chat",
28459
+ style: _vm.chatStyle
28459
28460
  }, [_c('audio', {
28460
28461
  ref: "audioPlayer",
28461
28462
  staticClass: "hidden-audio",
@@ -28477,14 +28478,13 @@ var render = function render() {
28477
28478
  "status": _vm.avaterStatus
28478
28479
  },
28479
28480
  on: {
28480
- "click": _vm.toggleWindow
28481
+ "mousedown": _vm.startDrag
28481
28482
  }
28482
28483
  }), _c('ChatWindowDialog', {
28483
28484
  attrs: {
28484
28485
  "messages": _vm.messages,
28485
28486
  "input-message": _vm.inputMessage,
28486
- "think-status": _vm.thinkStatus,
28487
- "loading": _vm.isLoading
28487
+ "think-status": _vm.thinkStatus
28488
28488
  },
28489
28489
  on: {
28490
28490
  "update:inputMessage": function ($event) {
@@ -28668,15 +28668,15 @@ var component = normalizeComponent(
28668
28668
  )
28669
28669
 
28670
28670
  /* harmony default export */ var ChatRobot = (component.exports);
28671
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./components/ChatAvatar.vue?vue&type=template&id=0c02b1ca&scoped=true
28672
- var ChatAvatarvue_type_template_id_0c02b1ca_scoped_true_render = function render() {
28671
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./components/ChatAvatar.vue?vue&type=template&id=45540794&scoped=true
28672
+ var ChatAvatarvue_type_template_id_45540794_scoped_true_render = function render() {
28673
28673
  var _vm = this,
28674
28674
  _c = _vm._self._c;
28675
28675
  return _c('div', {
28676
28676
  staticClass: "chat-ai",
28677
28677
  on: {
28678
- "click": function ($event) {
28679
- return _vm.$emit('click');
28678
+ "mousedown": function ($event) {
28679
+ return _vm.$emit('mousedown');
28680
28680
  }
28681
28681
  }
28682
28682
  }, [_c('div', {
@@ -28685,7 +28685,7 @@ var ChatAvatarvue_type_template_id_0c02b1ca_scoped_true_render = function render
28685
28685
  staticClass: "chat-ai-text"
28686
28686
  }, [_vm._v(_vm._s(_vm.statusText))])]);
28687
28687
  };
28688
- var ChatAvatarvue_type_template_id_0c02b1ca_scoped_true_staticRenderFns = [];
28688
+ var ChatAvatarvue_type_template_id_45540794_scoped_true_staticRenderFns = [];
28689
28689
 
28690
28690
  ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./components/ChatAvatar.vue?vue&type=script&lang=js
28691
28691
  /* harmony default export */ var ChatAvatarvue_type_script_lang_js = ({
@@ -28710,10 +28710,10 @@ var ChatAvatarvue_type_template_id_0c02b1ca_scoped_true_staticRenderFns = [];
28710
28710
  });
28711
28711
  ;// ./components/ChatAvatar.vue?vue&type=script&lang=js
28712
28712
  /* harmony default export */ var components_ChatAvatarvue_type_script_lang_js = (ChatAvatarvue_type_script_lang_js);
28713
- ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-12.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./components/ChatAvatar.vue?vue&type=style&index=0&id=0c02b1ca&prod&scoped=true&lang=css
28713
+ ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-12.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./components/ChatAvatar.vue?vue&type=style&index=0&id=45540794&prod&scoped=true&lang=css
28714
28714
  // extracted by mini-css-extract-plugin
28715
28715
 
28716
- ;// ./components/ChatAvatar.vue?vue&type=style&index=0&id=0c02b1ca&prod&scoped=true&lang=css
28716
+ ;// ./components/ChatAvatar.vue?vue&type=style&index=0&id=45540794&prod&scoped=true&lang=css
28717
28717
 
28718
28718
  ;// ./components/ChatAvatar.vue
28719
28719
 
@@ -28726,11 +28726,11 @@ var ChatAvatarvue_type_template_id_0c02b1ca_scoped_true_staticRenderFns = [];
28726
28726
 
28727
28727
  var ChatAvatar_component = normalizeComponent(
28728
28728
  components_ChatAvatarvue_type_script_lang_js,
28729
- ChatAvatarvue_type_template_id_0c02b1ca_scoped_true_render,
28730
- ChatAvatarvue_type_template_id_0c02b1ca_scoped_true_staticRenderFns,
28729
+ ChatAvatarvue_type_template_id_45540794_scoped_true_render,
28730
+ ChatAvatarvue_type_template_id_45540794_scoped_true_staticRenderFns,
28731
28731
  false,
28732
28732
  null,
28733
- "0c02b1ca",
28733
+ "45540794",
28734
28734
  null
28735
28735
 
28736
28736
  )
@@ -28794,8 +28794,8 @@ var ChatWindowDialogvue_type_template_id_1424b8b1_scoped_true_render = function
28794
28794
  };
28795
28795
  var ChatWindowDialogvue_type_template_id_1424b8b1_scoped_true_staticRenderFns = [];
28796
28796
 
28797
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./components/ChatWindowHeader.vue?vue&type=template&id=90ac64ba&scoped=true
28798
- var ChatWindowHeadervue_type_template_id_90ac64ba_scoped_true_render = function render() {
28797
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./components/ChatWindowHeader.vue?vue&type=template&id=7cac9eba&scoped=true
28798
+ var ChatWindowHeadervue_type_template_id_7cac9eba_scoped_true_render = function render() {
28799
28799
  var _vm = this,
28800
28800
  _c = _vm._self._c;
28801
28801
  return _c('div', {
@@ -28880,7 +28880,7 @@ var ChatWindowHeadervue_type_template_id_90ac64ba_scoped_true_render = function
28880
28880
  }
28881
28881
  })])])]);
28882
28882
  };
28883
- var ChatWindowHeadervue_type_template_id_90ac64ba_scoped_true_staticRenderFns = [];
28883
+ var ChatWindowHeadervue_type_template_id_7cac9eba_scoped_true_staticRenderFns = [];
28884
28884
 
28885
28885
  ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./components/ChatWindowHeader.vue?vue&type=script&lang=js
28886
28886
  /* harmony default export */ var ChatWindowHeadervue_type_script_lang_js = ({
@@ -28894,10 +28894,10 @@ var ChatWindowHeadervue_type_template_id_90ac64ba_scoped_true_staticRenderFns =
28894
28894
  });
28895
28895
  ;// ./components/ChatWindowHeader.vue?vue&type=script&lang=js
28896
28896
  /* harmony default export */ var components_ChatWindowHeadervue_type_script_lang_js = (ChatWindowHeadervue_type_script_lang_js);
28897
- ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-12.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./components/ChatWindowHeader.vue?vue&type=style&index=0&id=90ac64ba&prod&scoped=true&lang=css
28897
+ ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-12.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./components/ChatWindowHeader.vue?vue&type=style&index=0&id=7cac9eba&prod&scoped=true&lang=css
28898
28898
  // extracted by mini-css-extract-plugin
28899
28899
 
28900
- ;// ./components/ChatWindowHeader.vue?vue&type=style&index=0&id=90ac64ba&prod&scoped=true&lang=css
28900
+ ;// ./components/ChatWindowHeader.vue?vue&type=style&index=0&id=7cac9eba&prod&scoped=true&lang=css
28901
28901
 
28902
28902
  ;// ./components/ChatWindowHeader.vue
28903
28903
 
@@ -28910,24 +28910,26 @@ var ChatWindowHeadervue_type_template_id_90ac64ba_scoped_true_staticRenderFns =
28910
28910
 
28911
28911
  var ChatWindowHeader_component = normalizeComponent(
28912
28912
  components_ChatWindowHeadervue_type_script_lang_js,
28913
- ChatWindowHeadervue_type_template_id_90ac64ba_scoped_true_render,
28914
- ChatWindowHeadervue_type_template_id_90ac64ba_scoped_true_staticRenderFns,
28913
+ ChatWindowHeadervue_type_template_id_7cac9eba_scoped_true_render,
28914
+ ChatWindowHeadervue_type_template_id_7cac9eba_scoped_true_staticRenderFns,
28915
28915
  false,
28916
28916
  null,
28917
- "90ac64ba",
28917
+ "7cac9eba",
28918
28918
  null
28919
28919
 
28920
28920
  )
28921
28921
 
28922
28922
  /* harmony default export */ var ChatWindowHeader = (ChatWindowHeader_component.exports);
28923
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./components/ChatMessageList.vue?vue&type=template&id=53715846&scoped=true
28924
- var ChatMessageListvue_type_template_id_53715846_scoped_true_render = function render() {
28923
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./components/ChatMessageList.vue?vue&type=template&id=dfc4454c&scoped=true
28924
+ var ChatMessageListvue_type_template_id_dfc4454c_scoped_true_render = function render() {
28925
28925
  var _vm = this,
28926
28926
  _c = _vm._self._c;
28927
28927
  return _c('div', {
28928
28928
  ref: "chatArea",
28929
28929
  staticClass: "chat-window-content scrollbar-hide"
28930
- }, _vm._l(_vm.messages, function (message) {
28930
+ }, [_vm.messages.length === 0 ? _c('div', {
28931
+ staticClass: "chat-window-empty"
28932
+ }) : _vm._e(), _vm._l(_vm.messages, function (message) {
28931
28933
  return _c('div', {
28932
28934
  key: message.id,
28933
28935
  staticClass: "chat-window-message"
@@ -28938,18 +28940,17 @@ var ChatMessageListvue_type_template_id_53715846_scoped_true_render = function r
28938
28940
  }) : _c('AiMessage', {
28939
28941
  attrs: {
28940
28942
  "message": message,
28941
- "think-status": _vm.thinkStatus,
28942
- "loading": _vm.isLoading
28943
+ "think-status": _vm.thinkStatus
28943
28944
  },
28944
28945
  on: {
28945
- "thinking-click": function ($event) {
28946
- return _vm.$emit('thinking-click');
28946
+ "thinking-toggle": function ($event) {
28947
+ return _vm.handleThinkingToggle(message);
28947
28948
  }
28948
28949
  }
28949
28950
  })], 1);
28950
- }), 0);
28951
+ })], 2);
28951
28952
  };
28952
- var ChatMessageListvue_type_template_id_53715846_scoped_true_staticRenderFns = [];
28953
+ var ChatMessageListvue_type_template_id_dfc4454c_scoped_true_staticRenderFns = [];
28953
28954
 
28954
28955
  ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./components/UserMessage.vue?vue&type=template&id=6a2b6167&scoped=true
28955
28956
  var UserMessagevue_type_template_id_6a2b6167_scoped_true_render = function render() {
@@ -29001,15 +29002,15 @@ var UserMessage_component = normalizeComponent(
29001
29002
  )
29002
29003
 
29003
29004
  /* harmony default export */ var UserMessage = (UserMessage_component.exports);
29004
- ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./components/AiMessage.vue?vue&type=template&id=a8b0fba0&scoped=true
29005
- var AiMessagevue_type_template_id_a8b0fba0_scoped_true_render = function render() {
29005
+ ;// ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./components/AiMessage.vue?vue&type=template&id=70c64956&scoped=true
29006
+ var AiMessagevue_type_template_id_70c64956_scoped_true_render = function render() {
29006
29007
  var _vm = this,
29007
29008
  _c = _vm._self._c;
29008
29009
  return _c('div', {
29009
29010
  staticClass: "chat-window-message-ai"
29010
29011
  }, [_c('div', {
29011
29012
  staticClass: "ai-render"
29012
- }, [_vm.loading ? _c('div', {
29013
+ }, [_vm.isLoading ? _c('div', {
29013
29014
  staticClass: "ai-loading"
29014
29015
  }, [_c('div', {
29015
29016
  staticClass: "dot"
@@ -29021,12 +29022,12 @@ var AiMessagevue_type_template_id_a8b0fba0_scoped_true_render = function render(
29021
29022
  staticClass: "ai-thinking",
29022
29023
  on: {
29023
29024
  "click": function ($event) {
29024
- return _vm.$emit('thinking-click');
29025
+ return _vm.$emit('thinking-toggle');
29025
29026
  }
29026
29027
  }
29027
29028
  }, [_c('div', {
29028
29029
  staticClass: "ai-thinking-time"
29029
- }, [_vm._v("思考用时" + _vm._s(_vm.message.time) + "秒")]), _vm.thinkStatus ? _c('div', {
29030
+ }, [_vm._v(_vm._s(_vm.message.time ? `思考用时${_vm.message.time}秒` : '思考中...'))]), _vm.thinkingExpanded ? _c('div', {
29030
29031
  staticClass: "ai-thinking-content"
29031
29032
  }, [_vm._v(_vm._s(_vm.message.thinking))]) : _vm._e()]) : _vm._e(), _c('div', {
29032
29033
  staticClass: "ai-content markdown-body",
@@ -29035,7 +29036,7 @@ var AiMessagevue_type_template_id_a8b0fba0_scoped_true_render = function render(
29035
29036
  }
29036
29037
  })])]);
29037
29038
  };
29038
- var AiMessagevue_type_template_id_a8b0fba0_scoped_true_staticRenderFns = [];
29039
+ var AiMessagevue_type_template_id_70c64956_scoped_true_staticRenderFns = [];
29039
29040
 
29040
29041
  // EXTERNAL MODULE: ./node_modules/core-js/modules/es.iterator.filter.js
29041
29042
  var es_iterator_filter = __webpack_require__(2489);
@@ -30849,10 +30850,11 @@ function parseMarkdown(text) {
30849
30850
  html = html.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2" target="_blank">$1</a>');
30850
30851
  html = html.replace(/!\[([^\]]*)\]\(([^)]+)\)/g, '<img src="$2" alt="$1" />');
30851
30852
  html = html.replace(/^-{3,}$/gm, '<hr>');
30852
- html = html.replace(/\n/g, '<br>');
30853
+
30854
+ // html = html.replace(/\n/g, '<br>');
30855
+
30853
30856
  return html;
30854
30857
  }
30855
-
30856
30858
  // 解析表格
30857
30859
  function parseTable(text) {
30858
30860
  const lines = text.split('\n');
@@ -30889,7 +30891,6 @@ function parseTable(text) {
30889
30891
  }
30890
30892
  return result.join('\n');
30891
30893
  }
30892
-
30893
30894
  // 渲染表格
30894
30895
  function renderTable(rows) {
30895
30896
  if (rows.length < 2) return rows.join('\n');
@@ -30919,7 +30920,6 @@ function renderTable(rows) {
30919
30920
  html += '</table></div>';
30920
30921
  return html;
30921
30922
  }
30922
-
30923
30923
  // HTML 转义
30924
30924
  function escapeHtml(text) {
30925
30925
  const map = {
@@ -30937,19 +30937,17 @@ function escapeHtml(text) {
30937
30937
  message: {
30938
30938
  type: Object,
30939
30939
  required: true
30940
- },
30941
- thinkStatus: {
30942
- type: Boolean,
30943
- default: true
30944
- },
30945
- loading: {
30946
- type: Boolean,
30947
- default: false
30948
30940
  }
30949
30941
  },
30950
30942
  computed: {
30943
+ thinkingExpanded() {
30944
+ return this.message.thinkingExpanded !== false;
30945
+ },
30951
30946
  renderedContent() {
30952
30947
  return parseMarkdown(this.message.content);
30948
+ },
30949
+ isLoading() {
30950
+ return this.message.loading === true;
30953
30951
  }
30954
30952
  },
30955
30953
  watch: {
@@ -30960,10 +30958,10 @@ function escapeHtml(text) {
30960
30958
  });
30961
30959
  ;// ./components/AiMessage.vue?vue&type=script&lang=js
30962
30960
  /* harmony default export */ var components_AiMessagevue_type_script_lang_js = (AiMessagevue_type_script_lang_js);
30963
- ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-12.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./components/AiMessage.vue?vue&type=style&index=0&id=a8b0fba0&prod&scoped=true&lang=css
30961
+ ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-12.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./components/AiMessage.vue?vue&type=style&index=0&id=70c64956&prod&scoped=true&lang=css
30964
30962
  // extracted by mini-css-extract-plugin
30965
30963
 
30966
- ;// ./components/AiMessage.vue?vue&type=style&index=0&id=a8b0fba0&prod&scoped=true&lang=css
30964
+ ;// ./components/AiMessage.vue?vue&type=style&index=0&id=70c64956&prod&scoped=true&lang=css
30967
30965
 
30968
30966
  ;// ./components/AiMessage.vue
30969
30967
 
@@ -30976,11 +30974,11 @@ function escapeHtml(text) {
30976
30974
 
30977
30975
  var AiMessage_component = normalizeComponent(
30978
30976
  components_AiMessagevue_type_script_lang_js,
30979
- AiMessagevue_type_template_id_a8b0fba0_scoped_true_render,
30980
- AiMessagevue_type_template_id_a8b0fba0_scoped_true_staticRenderFns,
30977
+ AiMessagevue_type_template_id_70c64956_scoped_true_render,
30978
+ AiMessagevue_type_template_id_70c64956_scoped_true_staticRenderFns,
30981
30979
  false,
30982
30980
  null,
30983
- "a8b0fba0",
30981
+ "70c64956",
30984
30982
  null
30985
30983
 
30986
30984
  )
@@ -31003,13 +31001,22 @@ var AiMessage_component = normalizeComponent(
31003
31001
  thinkStatus: {
31004
31002
  type: Boolean,
31005
31003
  default: true
31006
- },
31007
- isLoading: {
31008
- type: Boolean,
31009
- default: false
31004
+ }
31005
+ },
31006
+ computed: {
31007
+ lastMessageObject() {
31008
+ const len = this.messages.length;
31009
+ if (len === 0) {
31010
+ return null;
31011
+ }
31012
+ return this.messages[len - 1];
31010
31013
  }
31011
31014
  },
31012
31015
  methods: {
31016
+ handleThinkingToggle(message) {
31017
+ console.log('handleThinkingToggle', message);
31018
+ this.$set(message, 'thinkingExpanded', !message.thinkingExpanded);
31019
+ },
31013
31020
  scrollToBottom() {
31014
31021
  this.$nextTick(() => {
31015
31022
  const chatArea = this.$refs.chatArea;
@@ -31020,20 +31027,23 @@ var AiMessage_component = normalizeComponent(
31020
31027
  }
31021
31028
  },
31022
31029
  watch: {
31023
- messages: {
31024
- handler() {
31025
- this.scrollToBottom();
31030
+ lastMessageObject: {
31031
+ handler(newMsg) {
31032
+ if (newMsg) {
31033
+ this.scrollToBottom();
31034
+ }
31026
31035
  },
31027
- deep: true
31036
+ deep: true,
31037
+ immediate: true
31028
31038
  }
31029
31039
  }
31030
31040
  });
31031
31041
  ;// ./components/ChatMessageList.vue?vue&type=script&lang=js
31032
31042
  /* harmony default export */ var components_ChatMessageListvue_type_script_lang_js = (ChatMessageListvue_type_script_lang_js);
31033
- ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-12.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./components/ChatMessageList.vue?vue&type=style&index=0&id=53715846&prod&scoped=true&lang=css
31043
+ ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-12.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./components/ChatMessageList.vue?vue&type=style&index=0&id=dfc4454c&prod&scoped=true&lang=css
31034
31044
  // extracted by mini-css-extract-plugin
31035
31045
 
31036
- ;// ./components/ChatMessageList.vue?vue&type=style&index=0&id=53715846&prod&scoped=true&lang=css
31046
+ ;// ./components/ChatMessageList.vue?vue&type=style&index=0&id=dfc4454c&prod&scoped=true&lang=css
31037
31047
 
31038
31048
  ;// ./components/ChatMessageList.vue
31039
31049
 
@@ -31046,11 +31056,11 @@ var AiMessage_component = normalizeComponent(
31046
31056
 
31047
31057
  var ChatMessageList_component = normalizeComponent(
31048
31058
  components_ChatMessageListvue_type_script_lang_js,
31049
- ChatMessageListvue_type_template_id_53715846_scoped_true_render,
31050
- ChatMessageListvue_type_template_id_53715846_scoped_true_staticRenderFns,
31059
+ ChatMessageListvue_type_template_id_dfc4454c_scoped_true_render,
31060
+ ChatMessageListvue_type_template_id_dfc4454c_scoped_true_staticRenderFns,
31051
31061
  false,
31052
31062
  null,
31053
- "53715846",
31063
+ "dfc4454c",
31054
31064
  null
31055
31065
 
31056
31066
  )
@@ -31757,8 +31767,7 @@ class StreamParser {
31757
31767
  /* harmony default export */ var messageMixin = ({
31758
31768
  data() {
31759
31769
  return {
31760
- streamParser: null,
31761
- isLoading: false
31770
+ streamParser: null
31762
31771
  };
31763
31772
  },
31764
31773
  created() {
@@ -31768,7 +31777,6 @@ class StreamParser {
31768
31777
  // 约60fps
31769
31778
  debug: "production" === 'development'
31770
31779
  });
31771
- this.isLoading = true;
31772
31780
  },
31773
31781
  methods: {
31774
31782
  createAiMessage() {
@@ -31779,7 +31787,9 @@ class StreamParser {
31779
31787
  time: '',
31780
31788
  thinking: '',
31781
31789
  charts: [],
31782
- content: ''
31790
+ content: '',
31791
+ loading: true,
31792
+ thinkingExpanded: true
31783
31793
  };
31784
31794
  this.messages.push(message);
31785
31795
  this.currentMessage = message;
@@ -31842,14 +31852,17 @@ class StreamParser {
31842
31852
  }
31843
31853
  console.log(`流处理完成,总耗时: ${duration}ms`);
31844
31854
  this.avaterStatus = 'normal';
31845
- this.isLoading = false;
31846
31855
  } catch (error) {
31847
31856
  console.error('发送消息失败:', error);
31848
31857
  if (this.currentMessage) {
31849
31858
  this.currentMessage.content = '抱歉,发生了错误,请重试。';
31850
31859
  this.$forceUpdate();
31851
31860
  }
31852
- this.isLoading = false;
31861
+ } finally {
31862
+ // 确保加载状态关闭
31863
+ if (this.currentMessage) {
31864
+ this.currentMessage.loading = false;
31865
+ }
31853
31866
  }
31854
31867
  },
31855
31868
  /**
@@ -31886,7 +31899,9 @@ class StreamParser {
31886
31899
  handleStreamUpdate(result) {
31887
31900
  if (!this.currentMessage) return;
31888
31901
  console.log('收到更新:', result);
31889
-
31902
+ if (this.currentMessage.loading) {
31903
+ this.currentMessage.loading = false;
31904
+ }
31890
31905
  // 更新思考内容
31891
31906
  if (result.thinking) {
31892
31907
  this.currentMessage.thinking += result.thinking;
@@ -31961,14 +31976,45 @@ const FRAME_SIZE = 512;
31961
31976
  thinkStatus: true,
31962
31977
  jumpedTimePoints: new Set(),
31963
31978
  SAMPLE_RATE,
31964
- FRAME_SIZE
31979
+ FRAME_SIZE,
31980
+ dragThreshold: 5,
31981
+ // 拖拽阈值
31982
+ isDragging: false,
31983
+ dragStartX: 0,
31984
+ dragStartY: 0,
31985
+ currentX: 10,
31986
+ currentY: 20,
31987
+ initialX: 10,
31988
+ initialY: 20,
31989
+ hasMoved: false
31965
31990
  };
31966
31991
  },
31992
+ computed: {
31993
+ chatStyle() {
31994
+ if (this.robotStatus === 'leaving' && !this.visible) {
31995
+ return {
31996
+ right: `${this.currentX}px`,
31997
+ bottom: `${this.currentY}px`,
31998
+ cursor: this.isDragging ? 'grabbing' : 'grab',
31999
+ transition: this.isDragging ? 'none' : 'right 0.3s ease, bottom 0.3s ease'
32000
+ };
32001
+ }
32002
+ return {
32003
+ cursor: 'pointer'
32004
+ };
32005
+ }
32006
+ },
31967
32007
  mounted() {
31968
32008
  this.initWebSocket();
31969
32009
  if (this.appendToBody) {
31970
32010
  this.appendToBodyHandler();
31971
32011
  }
32012
+ this.$nextTick(() => {
32013
+ const chatEl = this.$el;
32014
+ const style = window.getComputedStyle(chatEl);
32015
+ this.initialX = this.currentX = parseInt(style.right, 10) || 10;
32016
+ this.initialY = this.currentY = parseInt(style.bottom, 10) || 20;
32017
+ });
31972
32018
  },
31973
32019
  beforeDestroy() {
31974
32020
  if (this.appendToBody && this.$el.parentElement === document.body) {
@@ -31976,10 +32022,74 @@ const FRAME_SIZE = 512;
31976
32022
  }
31977
32023
  this.closeWebSocket();
31978
32024
  this.stopRecording();
32025
+
32026
+ // 移除全局事件监听器
32027
+ document.removeEventListener('mousemove', this.onDrag);
32028
+ document.removeEventListener('mouseup', this.stopDrag);
31979
32029
  },
31980
32030
  methods: {
31981
32031
  toggleWindow() {
31982
32032
  this.visible = !this.visible;
32033
+ if (this.visible) {
32034
+ this.currentX = this.initialX;
32035
+ this.currentY = this.initialY;
32036
+ }
32037
+ },
32038
+ startDrag() {
32039
+ console.log('startDrag');
32040
+ if (this.robotStatus !== 'leaving' && this.visible) return;
32041
+ this.isDragging = true;
32042
+ this.hasMoved = false;
32043
+
32044
+ // 记录鼠标的初始位置
32045
+ this.dragStartX = event.clientX;
32046
+ this.dragStartY = event.clientY;
32047
+
32048
+ // 绑定全局事件监听器
32049
+ document.addEventListener('mousemove', this.onDrag);
32050
+ document.addEventListener('mouseup', this.stopDrag);
32051
+ },
32052
+ onDrag(event) {
32053
+ if (!this.isDragging) return;
32054
+
32055
+ // 鼠标位移量
32056
+ const deltaX = event.clientX - this.dragStartX;
32057
+ const deltaY = event.clientY - this.dragStartY;
32058
+ if (Math.abs(deltaX) > this.dragThreshold || Math.abs(deltaY) > this.dragThreshold) {
32059
+ console.log('移动超过阈值');
32060
+ this.hasMoved = true; // 只要移动超过阈值,就标记为拖拽
32061
+ }
32062
+
32063
+ // 获取 .chat 容器的尺寸
32064
+ const chatEl = this.$el;
32065
+ const chatWidth = chatEl.offsetWidth;
32066
+ const chatHeight = chatEl.offsetHeight;
32067
+ let newX = this.currentX - deltaX;
32068
+ let newY = this.currentY - deltaY;
32069
+
32070
+ // 视口宽度和高度
32071
+ const viewportWidth = window.innerWidth;
32072
+ const viewportHeight = window.innerHeight;
32073
+ newX = Math.max(0, newX);
32074
+ newX = Math.min(viewportWidth - chatWidth, newX);
32075
+ newY = Math.max(0, newY);
32076
+ newY = Math.min(viewportHeight - chatHeight, newY);
32077
+
32078
+ // 更新位置
32079
+ this.currentX = newX;
32080
+ this.currentY = newY;
32081
+
32082
+ // 重新设置新的拖拽起始点,实现平滑拖拽
32083
+ this.dragStartX = event.clientX;
32084
+ this.dragStartY = event.clientY;
32085
+ },
32086
+ stopDrag() {
32087
+ this.isDragging = false;
32088
+ document.removeEventListener('mousemove', this.onDrag);
32089
+ document.removeEventListener('mouseup', this.stopDrag);
32090
+ if (!this.hasMoved) {
32091
+ this.toggleWindow();
32092
+ }
31983
32093
  },
31984
32094
  handleThinkingClick() {
31985
32095
  this.thinkStatus = !this.thinkStatus;
@@ -32032,10 +32142,10 @@ const FRAME_SIZE = 512;
32032
32142
  });
32033
32143
  ;// ./components/ChatWindow.vue?vue&type=script&lang=js
32034
32144
  /* harmony default export */ var components_ChatWindowvue_type_script_lang_js = (ChatWindowvue_type_script_lang_js);
32035
- ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-12.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./components/ChatWindow.vue?vue&type=style&index=0&id=14ff12bc&prod&scoped=true&lang=css
32145
+ ;// ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-12.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./components/ChatWindow.vue?vue&type=style&index=0&id=637b4214&prod&scoped=true&lang=css
32036
32146
  // extracted by mini-css-extract-plugin
32037
32147
 
32038
- ;// ./components/ChatWindow.vue?vue&type=style&index=0&id=14ff12bc&prod&scoped=true&lang=css
32148
+ ;// ./components/ChatWindow.vue?vue&type=style&index=0&id=637b4214&prod&scoped=true&lang=css
32039
32149
 
32040
32150
  ;// ./components/ChatWindow.vue
32041
32151
 
@@ -32052,7 +32162,7 @@ var ChatWindow_component = normalizeComponent(
32052
32162
  staticRenderFns,
32053
32163
  false,
32054
32164
  null,
32055
- "14ff12bc",
32165
+ "637b4214",
32056
32166
  null
32057
32167
 
32058
32168
  )