collabdocchat 2.0.5 → 2.0.7

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.
@@ -1,5 +1,5 @@
1
- /**
2
- * 功能集成�? * 将所有增强功能集成到仪表板中
1
+ /**
2
+ * 功能集成�? * 将所有增强功能集成到仪表板中
3
3
  */
4
4
 
5
5
  import { ChatEnhancements, OnlineStatusManager, MessageNotificationManager } from './chat-enhancements.js';
@@ -15,15 +15,15 @@ export class FeatureIntegrator {
15
15
  this.wsService = wsService;
16
16
  this.user = user;
17
17
 
18
- // 初始化各个功能模�? this.chatEnhancements = new ChatEnhancements(apiService, wsService, user.id || user._id);
18
+ // 初始化各个功能模�? this.chatEnhancements = new ChatEnhancements(apiService, wsService, user.id || user._id);
19
19
  this.onlineStatus = new OnlineStatusManager(wsService);
20
20
  this.notifications = new MessageNotificationManager();
21
21
  this.aiAssistant = new AIAssistant(apiService);
22
22
  this.collaboration = new CollaborationEnhancer(apiService, wsService);
23
23
 
24
- // 初始化主�? themeManager.init();
24
+ // 初始化主�? themeManager.init();
25
25
 
26
- // 设置在线状态监�? this.onlineStatus.setupListeners();
26
+ // 设置在线状态监�? this.onlineStatus.setupListeners();
27
27
  }
28
28
 
29
29
  /**
@@ -36,7 +36,7 @@ export class FeatureIntegrator {
36
36
  <span class="icon">⚙️</span> 设置
37
37
  </button>
38
38
  <button class="nav-item" data-view="help">
39
- <span class="icon">�?/span> 帮助
39
+ <span class="icon">�?/span> 帮助
40
40
  </button>
41
41
  </div>
42
42
  `;
@@ -45,7 +45,7 @@ export class FeatureIntegrator {
45
45
  }
46
46
 
47
47
  /**
48
- * 渲染设置页面(优化后的卡片式布局�? */
48
+ * 渲染设置页面(优化后的卡片式布局�? */
49
49
  renderSettingsView(container) {
50
50
  container.innerHTML = `
51
51
  <div class="view-header">
@@ -56,51 +56,51 @@ export class FeatureIntegrator {
56
56
  <div class="setting-card" data-setting="theme">
57
57
  <div class="setting-icon">🎨</div>
58
58
  <h3>主题设置</h3>
59
- <p>选择主题风格和颜色方�?/p>
60
- <button class="btn-card-action">进入设置 �?/button>
59
+ <p>选择主题风格和颜色方�?/p>
60
+ <button class="btn-card-action">进入设置 �?/button>
61
61
  </div>
62
62
 
63
63
  <div class="setting-card" data-setting="notifications">
64
64
  <div class="setting-icon">🔔</div>
65
65
  <h3>通知设置</h3>
66
- <p>管理通知偏好和提醒方�?/p>
67
- <button class="btn-card-action">进入设置 �?/button>
66
+ <p>管理通知偏好和提醒方�?/p>
67
+ <button class="btn-card-action">进入设置 �?/button>
68
68
  </div>
69
69
 
70
70
  <div class="setting-card" data-setting="ai">
71
71
  <div class="setting-icon">🤖</div>
72
72
  <h3>AI 助手</h3>
73
- <p>配置 AI 功能和智能建�?/p>
74
- <button class="btn-card-action">进入设置 �?/button>
73
+ <p>配置 AI 功能和智能建�?/p>
74
+ <button class="btn-card-action">进入设置 �?/button>
75
75
  </div>
76
76
 
77
77
  ${this.user.role === 'admin' ? `
78
78
  <div class="setting-card" data-setting="permissions">
79
79
  <div class="setting-icon">🔒</div>
80
80
  <h3>权限管理</h3>
81
- <p>设置用户权限和访问控�?/p>
82
- <button class="btn-card-action">进入设置 �?/button>
81
+ <p>设置用户权限和访问控�?/p>
82
+ <button class="btn-card-action">进入设置 �?/button>
83
83
  </div>
84
84
  ` : ''}
85
85
 
86
86
  <div class="setting-card" data-setting="data">
87
87
  <div class="setting-icon">📊</div>
88
88
  <h3>数据管理</h3>
89
- <p>导出数据和备份管�?/p>
90
- <button class="btn-card-action">进入设置 �?/button>
89
+ <p>导出数据和备份管�?/p>
90
+ <button class="btn-card-action">进入设置 �?/button>
91
91
  </div>
92
92
 
93
93
  <div class="setting-card" data-setting="language">
94
94
  <div class="setting-icon">🌐</div>
95
95
  <h3>语言设置</h3>
96
96
  <p>选择界面显示语言</p>
97
- <button class="btn-card-action">进入设置 �?/button>
97
+ <button class="btn-card-action">进入设置 �?/button>
98
98
  </div>
99
99
  </div>
100
100
 
101
101
  <!-- 详细设置面板 -->
102
102
  <div class="setting-detail-panel hidden" id="settingDetailPanel">
103
- <button class="btn-back" id="backToSettings">�?返回</button>
103
+ <button class="btn-back" id="backToSettings">�?返回</button>
104
104
  <div id="settingDetailContent"></div>
105
105
  </div>
106
106
  `;
@@ -126,7 +126,7 @@ export class FeatureIntegrator {
126
126
  const style = document.createElement('style');
127
127
  style.id = 'settings-modern-styles';
128
128
  style.textContent = `
129
- /* 设置页面容器 - 添加高度限制和滚�?*/
129
+ /* 设置页面容器 - 添加高度限制和滚�?*/
130
130
  #contentArea {
131
131
  max-height: calc(100vh - 40px);
132
132
  overflow-y: auto;
@@ -359,7 +359,7 @@ export class FeatureIntegrator {
359
359
  line-height: 1.6;
360
360
  }
361
361
 
362
- /* 切换开�?*/
362
+ /* 切换开�?*/
363
363
  .toggle-switch {
364
364
  position: relative;
365
365
  display: inline-block;
@@ -610,7 +610,7 @@ export class FeatureIntegrator {
610
610
  box-shadow: 0 4px 12px rgba(239,68,68,0.4);
611
611
  }
612
612
 
613
- /* 语言选择�?*/
613
+ /* 语言选择�?*/
614
614
  .language-selector-modern {
615
615
  display: grid;
616
616
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
@@ -684,7 +684,7 @@ export class FeatureIntegrator {
684
684
  animation: scaleIn 0.3s ease;
685
685
  }
686
686
 
687
- /* 信息提示�?*/
687
+ /* 信息提示�?*/
688
688
  .language-info-box {
689
689
  background: linear-gradient(135deg, rgba(99,102,241,0.1) 0%, rgba(99,102,241,0.05) 100%);
690
690
  border: 2px solid rgba(99,102,241,0.3);
@@ -735,7 +735,7 @@ export class FeatureIntegrator {
735
735
  }
736
736
  }
737
737
 
738
- /* 响应�?*/
738
+ /* 响应�?*/
739
739
  @media (max-width: 768px) {
740
740
  .settings-header-modern {
741
741
  padding: 30px 20px;
@@ -796,7 +796,7 @@ export class FeatureIntegrator {
796
796
  grid.style.display = 'none';
797
797
  panel.classList.remove('hidden');
798
798
 
799
- // 加载对应的设置内�? this.loadSettingsTab(setting, content);
799
+ // 加载对应的设置内�? this.loadSettingsTab(setting, content);
800
800
 
801
801
  // 返回按钮
802
802
  container.querySelector('#backToSettings').addEventListener('click', () => {
@@ -834,7 +834,7 @@ export class FeatureIntegrator {
834
834
  }
835
835
 
836
836
  /**
837
- * 渲染数据管理设置(优化后�? */
837
+ * 渲染数据管理设置(优化后�? */
838
838
  renderDataSettings(container) {
839
839
  container.innerHTML = `
840
840
  <div class="settings-detail-modern">
@@ -875,7 +875,7 @@ export class FeatureIntegrator {
875
875
  <div class="setting-card-icon">📤</div>
876
876
  <div class="setting-card-content">
877
877
  <h4>导出数据</h4>
878
- <p>导出您的聊天记录、文档和其他数据�?JSON �?CSV 格式</p>
878
+ <p>导出您的聊天记录、文档和其他数据�?JSON �?CSV 格式</p>
879
879
  <div class="export-options">
880
880
  <button class="btn-export" data-type="messages">
881
881
  <span>💬</span> 导出消息
@@ -891,12 +891,12 @@ export class FeatureIntegrator {
891
891
  </div>
892
892
 
893
893
  <div class="setting-card-detail">
894
- <div class="setting-card-icon">🗑�?/div>
894
+ <div class="setting-card-icon">🗑�?/div>
895
895
  <div class="setting-card-content">
896
896
  <h4>清除缓存</h4>
897
- <p>清除本地缓存数据以释放空间,不会删除服务器数�?/p>
897
+ <p>清除本地缓存数据以释放空间,不会删除服务器数�?/p>
898
898
  <button class="btn-danger-outline" id="clearCache">
899
- <span>🗑�?/span> 清除缓存
899
+ <span>🗑�?/span> 清除缓存
900
900
  </button>
901
901
  </div>
902
902
  </div>
@@ -905,7 +905,7 @@ export class FeatureIntegrator {
905
905
  <div class="setting-card-icon">🔄</div>
906
906
  <div class="setting-card-content">
907
907
  <h4>自动备份</h4>
908
- <p>定期自动备份您的重要数据,确保数据安�?/p>
908
+ <p>定期自动备份您的重要数据,确保数据安�?/p>
909
909
  <label class="toggle-switch">
910
910
  <input type="checkbox" id="autoBackup" checked>
911
911
  <span class="toggle-slider"></span>
@@ -924,11 +924,11 @@ export class FeatureIntegrator {
924
924
  btn.addEventListener('click', () => {
925
925
  const type = btn.dataset.type;
926
926
  const originalText = btn.innerHTML;
927
- btn.innerHTML = '<span>�?/span> 导出�?..';
927
+ btn.innerHTML = '<span>�?/span> 导出�?..';
928
928
  btn.disabled = true;
929
929
 
930
930
  setTimeout(() => {
931
- btn.innerHTML = '<span>�?/span> 导出成功�?;
931
+ btn.innerHTML = '<span>�?/span> 导出成功�?;
932
932
  setTimeout(() => {
933
933
  btn.innerHTML = originalText;
934
934
  btn.disabled = false;
@@ -941,14 +941,14 @@ export class FeatureIntegrator {
941
941
 
942
942
  // 清除缓存
943
943
  container.querySelector('#clearCache')?.addEventListener('click', () => {
944
- if (confirm('确定要清除缓存吗?这不会删除服务器上的数据�?)) {
944
+ if (confirm('确定要清除缓存吗?这不会删除服务器上的数据�?)) {
945
945
  const btn = container.querySelector('#clearCache');
946
- btn.innerHTML = '<span>�?/span> 清除�?..';
946
+ btn.innerHTML = '<span>�?/span> 清除�?..';
947
947
  btn.disabled = true;
948
948
 
949
949
  setTimeout(() => {
950
950
  localStorage.clear();
951
- alert('缓存已清除!页面将刷�?..');
951
+ alert('缓存已清除!页面将刷�?..');
952
952
  window.location.reload();
953
953
  }, 1000);
954
954
  }
@@ -956,7 +956,7 @@ export class FeatureIntegrator {
956
956
  }
957
957
 
958
958
  /**
959
- * 渲染语言设置(优化后�? */
959
+ * 渲染语言设置(优化后�? */
960
960
  renderLanguageSettings(container) {
961
961
  const currentLang = localStorage.getItem('language') || 'zh-CN';
962
962
 
@@ -972,11 +972,11 @@ export class FeatureIntegrator {
972
972
  <div class="language-card ${currentLang === 'zh-CN' ? 'selected' : ''}" data-lang="zh-CN">
973
973
  <div class="language-flag">🇨🇳</div>
974
974
  <div class="language-info">
975
- <h4>简体中�?/h4>
975
+ <h4>简体中�?/h4>
976
976
  <p>Simplified Chinese</p>
977
977
  </div>
978
978
  <div class="language-check">
979
- ${currentLang === 'zh-CN' ? '<span class="check-icon">�?/span>' : ''}
979
+ ${currentLang === 'zh-CN' ? '<span class="check-icon">�?/span>' : ''}
980
980
  </div>
981
981
  </div>
982
982
 
@@ -987,7 +987,7 @@ export class FeatureIntegrator {
987
987
  <p>Traditional Chinese</p>
988
988
  </div>
989
989
  <div class="language-check">
990
- ${currentLang === 'zh-TW' ? '<span class="check-icon">�?/span>' : ''}
990
+ ${currentLang === 'zh-TW' ? '<span class="check-icon">�?/span>' : ''}
991
991
  </div>
992
992
  </div>
993
993
 
@@ -998,29 +998,29 @@ export class FeatureIntegrator {
998
998
  <p>United States</p>
999
999
  </div>
1000
1000
  <div class="language-check">
1001
- ${currentLang === 'en-US' ? '<span class="check-icon">�?/span>' : ''}
1001
+ ${currentLang === 'en-US' ? '<span class="check-icon">�?/span>' : ''}
1002
1002
  </div>
1003
1003
  </div>
1004
1004
 
1005
1005
  <div class="language-card ${currentLang === 'ja-JP' ? 'selected' : ''}" data-lang="ja-JP">
1006
1006
  <div class="language-flag">🇯🇵</div>
1007
1007
  <div class="language-info">
1008
- <h4>日本�?/h4>
1008
+ <h4>日本�?/h4>
1009
1009
  <p>Japanese</p>
1010
1010
  </div>
1011
1011
  <div class="language-check">
1012
- ${currentLang === 'ja-JP' ? '<span class="check-icon">�?/span>' : ''}
1012
+ ${currentLang === 'ja-JP' ? '<span class="check-icon">�?/span>' : ''}
1013
1013
  </div>
1014
1014
  </div>
1015
1015
 
1016
1016
  <div class="language-card ${currentLang === 'ko-KR' ? 'selected' : ''}" data-lang="ko-KR">
1017
1017
  <div class="language-flag">🇰🇷</div>
1018
1018
  <div class="language-info">
1019
- <h4>한국�?/h4>
1019
+ <h4>한국�?/h4>
1020
1020
  <p>Korean</p>
1021
1021
  </div>
1022
1022
  <div class="language-check">
1023
- ${currentLang === 'ko-KR' ? '<span class="check-icon">�?/span>' : ''}
1023
+ ${currentLang === 'ko-KR' ? '<span class="check-icon">�?/span>' : ''}
1024
1024
  </div>
1025
1025
  </div>
1026
1026
 
@@ -1031,7 +1031,7 @@ export class FeatureIntegrator {
1031
1031
  <p>French</p>
1032
1032
  </div>
1033
1033
  <div class="language-check">
1034
- ${currentLang === 'fr-FR' ? '<span class="check-icon">�?/span>' : ''}
1034
+ ${currentLang === 'fr-FR' ? '<span class="check-icon">�?/span>' : ''}
1035
1035
  </div>
1036
1036
  </div>
1037
1037
  </div>
@@ -1040,13 +1040,13 @@ export class FeatureIntegrator {
1040
1040
  <div class="info-icon">ℹ️</div>
1041
1041
  <div class="info-content">
1042
1042
  <h4>语言切换说明</h4>
1043
- <p>更改语言后,页面将自动刷新以应用新的语言设置。部分内容可能需要重新加载�?/p>
1043
+ <p>更改语言后,页面将自动刷新以应用新的语言设置。部分内容可能需要重新加载�?/p>
1044
1044
  </div>
1045
1045
  </div>
1046
1046
 
1047
1047
  <div class="settings-actions">
1048
1048
  <button class="btn-primary-large" id="saveLanguage">
1049
- <span>💾</span> 保存并应�? </button>
1049
+ <span>💾</span> 保存并应�? </button>
1050
1050
  </div>
1051
1051
  </div>
1052
1052
  `;
@@ -1057,13 +1057,13 @@ export class FeatureIntegrator {
1057
1057
  // 语言卡片点击效果
1058
1058
  container.querySelectorAll('.language-card').forEach(card => {
1059
1059
  card.addEventListener('click', () => {
1060
- // 移除所有选中状�? container.querySelectorAll('.language-card').forEach(c => {
1060
+ // 移除所有选中状�? container.querySelectorAll('.language-card').forEach(c => {
1061
1061
  c.classList.remove('selected');
1062
1062
  c.querySelector('.language-check').innerHTML = '';
1063
1063
  });
1064
1064
 
1065
- // 添加选中状�? card.classList.add('selected');
1066
- card.querySelector('.language-check').innerHTML = '<span class="check-icon">�?/span>';
1065
+ // 添加选中状�? card.classList.add('selected');
1066
+ card.querySelector('.language-check').innerHTML = '<span class="check-icon">�?/span>';
1067
1067
  });
1068
1068
  });
1069
1069
 
@@ -1074,12 +1074,12 @@ export class FeatureIntegrator {
1074
1074
 
1075
1075
  const btn = container.querySelector('#saveLanguage');
1076
1076
  const originalText = btn.innerHTML;
1077
- btn.innerHTML = '<span>�?/span> 应用�?..';
1077
+ btn.innerHTML = '<span>�?/span> 应用�?..';
1078
1078
  btn.disabled = true;
1079
1079
 
1080
1080
  setTimeout(() => {
1081
1081
  localStorage.setItem('language', selectedLang);
1082
- btn.innerHTML = '<span>�?/span> 应用成功�?;
1082
+ btn.innerHTML = '<span>�?/span> 应用成功�?;
1083
1083
 
1084
1084
  setTimeout(() => {
1085
1085
  window.location.reload();
@@ -1089,7 +1089,7 @@ export class FeatureIntegrator {
1089
1089
  }
1090
1090
 
1091
1091
  /**
1092
- * 渲染通知设置(优化后�? */
1092
+ * 渲染通知设置(优化后�? */
1093
1093
  renderNotificationSettings(container) {
1094
1094
  const settings = {
1095
1095
  desktop: localStorage.getItem('notif_desktop') !== 'false',
@@ -1103,12 +1103,12 @@ export class FeatureIntegrator {
1103
1103
  <div class="settings-header-modern">
1104
1104
  <div class="settings-icon-large">🔔</div>
1105
1105
  <h2>通知设置</h2>
1106
- <p>管理您的通知偏好和提醒方�?/p>
1106
+ <p>管理您的通知偏好和提醒方�?/p>
1107
1107
  </div>
1108
1108
 
1109
1109
  <div class="settings-cards-container">
1110
1110
  <div class="setting-card-detail ${settings.desktop ? 'active' : ''}">
1111
- <div class="setting-card-icon">🖥�?/div>
1111
+ <div class="setting-card-icon">🖥�?/div>
1112
1112
  <div class="setting-card-content">
1113
1113
  <div class="setting-card-header">
1114
1114
  <h4>桌面通知</h4>
@@ -1117,7 +1117,7 @@ export class FeatureIntegrator {
1117
1117
  <span class="toggle-slider"></span>
1118
1118
  </label>
1119
1119
  </div>
1120
- <p>在桌面显示新消息通知,即使浏览器在后台运�?/p>
1120
+ <p>在桌面显示新消息通知,即使浏览器在后台运�?/p>
1121
1121
  </div>
1122
1122
  </div>
1123
1123
 
@@ -1145,7 +1145,7 @@ export class FeatureIntegrator {
1145
1145
  <span class="toggle-slider"></span>
1146
1146
  </label>
1147
1147
  </div>
1148
- <p>有人@提及您时发送特别通知,确保及时回�?/p>
1148
+ <p>有人@提及您时发送特别通知,确保及时回�?/p>
1149
1149
  </div>
1150
1150
  </div>
1151
1151
 
@@ -1159,7 +1159,7 @@ export class FeatureIntegrator {
1159
1159
  <span class="toggle-slider"></span>
1160
1160
  </label>
1161
1161
  </div>
1162
- <p>收到新消息时发送通知,保持与团队的实时沟�?/p>
1162
+ <p>收到新消息时发送通知,保持与团队的实时沟�?/p>
1163
1163
  </div>
1164
1164
  </div>
1165
1165
  </div>
@@ -1178,7 +1178,7 @@ export class FeatureIntegrator {
1178
1178
  // 添加详细设置样式
1179
1179
  this.addDetailSettingsStyles();
1180
1180
 
1181
- // 切换开关效�? container.querySelectorAll('.toggle-switch input').forEach(input => {
1181
+ // 切换开关效�? container.querySelectorAll('.toggle-switch input').forEach(input => {
1182
1182
  input.addEventListener('change', (e) => {
1183
1183
  const card = e.target.closest('.setting-card-detail');
1184
1184
  if (e.target.checked) {
@@ -1199,7 +1199,7 @@ export class FeatureIntegrator {
1199
1199
  // 显示成功提示
1200
1200
  const btn = container.querySelector('#saveNotifSettings');
1201
1201
  const originalText = btn.innerHTML;
1202
- btn.innerHTML = '<span>�?/span> 保存成功�?;
1202
+ btn.innerHTML = '<span>�?/span> 保存成功�?;
1203
1203
  btn.style.background = 'linear-gradient(135deg, #10b981 0%, #059669 100%)';
1204
1204
 
1205
1205
  setTimeout(() => {
@@ -1214,7 +1214,7 @@ export class FeatureIntegrator {
1214
1214
  Notification.requestPermission().then(permission => {
1215
1215
  if (permission === 'granted') {
1216
1216
  new Notification('CollabDocChat', {
1217
- body: '这是一条测试通知�?,
1217
+ body: '这是一条测试通知�?,
1218
1218
  icon: '/favicon.ico'
1219
1219
  });
1220
1220
  } else {
@@ -1228,7 +1228,7 @@ export class FeatureIntegrator {
1228
1228
  }
1229
1229
 
1230
1230
  /**
1231
- * 渲染AI设置(优化后�? */
1231
+ * 渲染AI设置(优化后�? */
1232
1232
  renderAISettings(container) {
1233
1233
  const aiEnabled = localStorage.getItem('ai_enabled') !== 'false';
1234
1234
  const smartReplies = localStorage.getItem('ai_smart_replies') !== 'false';
@@ -1239,12 +1239,12 @@ export class FeatureIntegrator {
1239
1239
  <div class="settings-header-modern">
1240
1240
  <div class="settings-icon-large">🤖</div>
1241
1241
  <h2>AI 助手设置</h2>
1242
- <p>配置 AI 功能,提升您的工作效�?/p>
1242
+ <p>配置 AI 功能,提升您的工作效�?/p>
1243
1243
  </div>
1244
1244
 
1245
1245
  <div class="settings-cards-container">
1246
1246
  <div class="setting-card-detail ${aiEnabled ? 'active' : ''}">
1247
- <div class="setting-card-icon">�?/div>
1247
+ <div class="setting-card-icon">�?/div>
1248
1248
  <div class="setting-card-content">
1249
1249
  <div class="setting-card-header">
1250
1250
  <h4>启用 AI 助手</h4>
@@ -1267,12 +1267,12 @@ export class FeatureIntegrator {
1267
1267
  <span class="toggle-slider"></span>
1268
1268
  </label>
1269
1269
  </div>
1270
- <p>根据消息内容自动生成回复建议,快速响应对�?/p>
1270
+ <p>根据消息内容自动生成回复建议,快速响应对�?/p>
1271
1271
  </div>
1272
1272
  </div>
1273
1273
 
1274
1274
  <div class="setting-card-detail ${autoComplete ? 'active' : ''}">
1275
- <div class="setting-card-icon">�?/div>
1275
+ <div class="setting-card-icon">�?/div>
1276
1276
  <div class="setting-card-content">
1277
1277
  <div class="setting-card-header">
1278
1278
  <h4>自动完成</h4>
@@ -1287,22 +1287,22 @@ export class FeatureIntegrator {
1287
1287
  </div>
1288
1288
 
1289
1289
  <div class="ai-features-showcase">
1290
- <h3>�?AI 功能展示</h3>
1290
+ <h3>�?AI 功能展示</h3>
1291
1291
  <div class="features-grid">
1292
1292
  <div class="feature-item">
1293
1293
  <div class="feature-icon">📝</div>
1294
1294
  <h4>智能摘要</h4>
1295
- <p>自动生成会议和文档摘�?/p>
1295
+ <p>自动生成会议和文档摘�?/p>
1296
1296
  </div>
1297
1297
  <div class="feature-item">
1298
1298
  <div class="feature-icon">🔍</div>
1299
1299
  <h4>智能搜索</h4>
1300
- <p>理解语义的智能搜�?/p>
1300
+ <p>理解语义的智能搜�?/p>
1301
1301
  </div>
1302
1302
  <div class="feature-item">
1303
1303
  <div class="feature-icon">🎯</div>
1304
1304
  <h4>任务建议</h4>
1305
- <p>智能推荐任务优先�?/p>
1305
+ <p>智能推荐任务优先�?/p>
1306
1306
  </div>
1307
1307
  <div class="feature-item">
1308
1308
  <div class="feature-icon">📊</div>
@@ -1329,7 +1329,7 @@ export class FeatureIntegrator {
1329
1329
  // 添加详细设置样式
1330
1330
  this.addDetailSettingsStyles();
1331
1331
 
1332
- // 切换开关效�? container.querySelectorAll('.toggle-switch input').forEach(input => {
1332
+ // 切换开关效�? container.querySelectorAll('.toggle-switch input').forEach(input => {
1333
1333
  input.addEventListener('change', (e) => {
1334
1334
  const card = e.target.closest('.setting-card-detail');
1335
1335
  if (e.target.checked) {
@@ -1348,7 +1348,7 @@ export class FeatureIntegrator {
1348
1348
 
1349
1349
  const btn = container.querySelector('#saveAISettings');
1350
1350
  const originalText = btn.innerHTML;
1351
- btn.innerHTML = '<span>�?/span> 保存成功�?;
1351
+ btn.innerHTML = '<span>�?/span> 保存成功�?;
1352
1352
  btn.style.background = 'linear-gradient(135deg, #10b981 0%, #059669 100%)';
1353
1353
 
1354
1354
  setTimeout(() => {
@@ -1361,11 +1361,11 @@ export class FeatureIntegrator {
1361
1361
  container.querySelector('#testAI').addEventListener('click', () => {
1362
1362
  const btn = container.querySelector('#testAI');
1363
1363
  const originalText = btn.innerHTML;
1364
- btn.innerHTML = '<span>�?/span> 测试�?..';
1364
+ btn.innerHTML = '<span>�?/span> 测试�?..';
1365
1365
  btn.disabled = true;
1366
1366
 
1367
1367
  setTimeout(() => {
1368
- btn.innerHTML = '<span>�?/span> AI 正常运行�?;
1368
+ btn.innerHTML = '<span>�?/span> AI 正常运行�?;
1369
1369
  setTimeout(() => {
1370
1370
  btn.innerHTML = originalText;
1371
1371
  btn.disabled = false;
@@ -1410,10 +1410,10 @@ export class FeatureIntegrator {
1410
1410
  🤖 AI
1411
1411
  </button>
1412
1412
  <button class="btn-secondary" id="showCollabTools" title="协作工具">
1413
- 🛠�?工具
1413
+ 🛠�?工具
1414
1414
  </button>
1415
- <button class="btn-secondary" id="markAllRead" title="全部标记为已�?>
1416
- �?已读
1415
+ <button class="btn-secondary" id="markAllRead" title="全部标记为已�?>
1416
+ �?已读
1417
1417
  </button>
1418
1418
  </div>
1419
1419
  `;
@@ -1478,7 +1478,7 @@ export class FeatureIntegrator {
1478
1478
  modal.innerHTML = `
1479
1479
  <div class="modal-content" style="max-width: 1000px;">
1480
1480
  <div class="modal-header">
1481
- <h3>🛠�?协作工具</h3>
1481
+ <h3>🛠�?协作工具</h3>
1482
1482
  <button class="modal-close" id="closeCollabTools">×</button>
1483
1483
  </div>
1484
1484
  <div class="collab-tools-tabs-modern">
@@ -1707,3 +1707,4 @@ export class FeatureIntegrator {
1707
1707
  }
1708
1708
  }
1709
1709
 
1710
+