cloneloop 0.1.0__py3-none-any.whl

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 (118) hide show
  1. cloneloop-0.1.0.dist-info/METADATA +392 -0
  2. cloneloop-0.1.0.dist-info/RECORD +118 -0
  3. cloneloop-0.1.0.dist-info/WHEEL +4 -0
  4. cloneloop-0.1.0.dist-info/entry_points.txt +5 -0
  5. mcp_ai_supervisor/__init__.py +52 -0
  6. mcp_ai_supervisor/__main__.py +551 -0
  7. mcp_ai_supervisor/debug.py +15 -0
  8. mcp_ai_supervisor/desktop_app/__init__.py +29 -0
  9. mcp_ai_supervisor/desktop_app/desktop_app.py +390 -0
  10. mcp_ai_supervisor/helpers/__init__.py +4 -0
  11. mcp_ai_supervisor/helpers/feedback_helpers.py +140 -0
  12. mcp_ai_supervisor/helpers/image_helpers.py +73 -0
  13. mcp_ai_supervisor/i18n.py +14 -0
  14. mcp_ai_supervisor/log_writer.py +16 -0
  15. mcp_ai_supervisor/logging/__init__.py +8 -0
  16. mcp_ai_supervisor/logging/log_parser.py +293 -0
  17. mcp_ai_supervisor/logging/log_tailer.py +367 -0
  18. mcp_ai_supervisor/py.typed +0 -0
  19. mcp_ai_supervisor/server.py +654 -0
  20. mcp_ai_supervisor/utils/__init__.py +28 -0
  21. mcp_ai_supervisor/utils/error_handler.py +10 -0
  22. mcp_ai_supervisor/utils/memory_monitor.py +11 -0
  23. mcp_ai_supervisor/utils/paths.py +7 -0
  24. mcp_ai_supervisor/utils/resource_manager.py +15 -0
  25. mcp_ai_supervisor/utils/structure_checker.py +291 -0
  26. mcp_ai_supervisor/web/__init__.py +26 -0
  27. mcp_ai_supervisor/web/constants/__init__.py +8 -0
  28. mcp_ai_supervisor/web/constants/message_codes.py +173 -0
  29. mcp_ai_supervisor/web/core/__init__.py +30 -0
  30. mcp_ai_supervisor/web/core/agent_bridge.py +957 -0
  31. mcp_ai_supervisor/web/core/auto_responder.py +332 -0
  32. mcp_ai_supervisor/web/core/context_collector.py +124 -0
  33. mcp_ai_supervisor/web/core/conversation_recorder.py +751 -0
  34. mcp_ai_supervisor/web/core/delegate_manager.py +1193 -0
  35. mcp_ai_supervisor/web/core/feedback_mediator.py +259 -0
  36. mcp_ai_supervisor/web/core/message_channel.py +551 -0
  37. mcp_ai_supervisor/web/core/response_builder.py +333 -0
  38. mcp_ai_supervisor/web/core/scene_detector.py +184 -0
  39. mcp_ai_supervisor/web/core/task_state.py +194 -0
  40. mcp_ai_supervisor/web/locales/en/translation.json +643 -0
  41. mcp_ai_supervisor/web/locales/zh-CN/translation.json +629 -0
  42. mcp_ai_supervisor/web/locales/zh-TW/translation.json +648 -0
  43. mcp_ai_supervisor/web/main.py +747 -0
  44. mcp_ai_supervisor/web/managers/__init__.py +8 -0
  45. mcp_ai_supervisor/web/managers/desktop_manager.py +228 -0
  46. mcp_ai_supervisor/web/managers/server_manager.py +170 -0
  47. mcp_ai_supervisor/web/managers/session_manager.py +515 -0
  48. mcp_ai_supervisor/web/managers/workbench_connector.py +186 -0
  49. mcp_ai_supervisor/web/models/__init__.py +13 -0
  50. mcp_ai_supervisor/web/models/feedback_result.py +16 -0
  51. mcp_ai_supervisor/web/models/feedback_session.py +938 -0
  52. mcp_ai_supervisor/web/models/session_cleaner.py +245 -0
  53. mcp_ai_supervisor/web/models/session_commands.py +213 -0
  54. mcp_ai_supervisor/web/models/session_resolver.py +158 -0
  55. mcp_ai_supervisor/web/models/session_timer.py +242 -0
  56. mcp_ai_supervisor/web/routes/__init__.py +12 -0
  57. mcp_ai_supervisor/web/routes/main_routes.py +965 -0
  58. mcp_ai_supervisor/web/routes/settings_routes.py +195 -0
  59. mcp_ai_supervisor/web/routes/ws_handlers.py +270 -0
  60. mcp_ai_supervisor/web/static/css/audio-management.css +545 -0
  61. mcp_ai_supervisor/web/static/css/notification-settings.css +152 -0
  62. mcp_ai_supervisor/web/static/css/prompt-management.css +566 -0
  63. mcp_ai_supervisor/web/static/css/session-management.css +1428 -0
  64. mcp_ai_supervisor/web/static/css/styles.css +2267 -0
  65. mcp_ai_supervisor/web/static/favicon.ico +0 -0
  66. mcp_ai_supervisor/web/static/icon-192.png +0 -0
  67. mcp_ai_supervisor/web/static/icon.svg +11 -0
  68. mcp_ai_supervisor/web/static/index.html +37 -0
  69. mcp_ai_supervisor/web/static/js/app.js +1721 -0
  70. mcp_ai_supervisor/web/static/js/i18n.js +376 -0
  71. mcp_ai_supervisor/web/static/js/modules/audio/audio-manager.js +610 -0
  72. mcp_ai_supervisor/web/static/js/modules/audio/audio-settings-ui.js +732 -0
  73. mcp_ai_supervisor/web/static/js/modules/connection-monitor.js +435 -0
  74. mcp_ai_supervisor/web/static/js/modules/constants/message-codes.js +168 -0
  75. mcp_ai_supervisor/web/static/js/modules/countdown-manager.js +273 -0
  76. mcp_ai_supervisor/web/static/js/modules/drag-drop-handler.js +677 -0
  77. mcp_ai_supervisor/web/static/js/modules/file-upload-manager.js +555 -0
  78. mcp_ai_supervisor/web/static/js/modules/image-handler.js +199 -0
  79. mcp_ai_supervisor/web/static/js/modules/logger.js +404 -0
  80. mcp_ai_supervisor/web/static/js/modules/notification/notification-manager.js +360 -0
  81. mcp_ai_supervisor/web/static/js/modules/notification/notification-settings.js +344 -0
  82. mcp_ai_supervisor/web/static/js/modules/prompt/prompt-input-buttons.js +427 -0
  83. mcp_ai_supervisor/web/static/js/modules/prompt/prompt-manager.js +414 -0
  84. mcp_ai_supervisor/web/static/js/modules/prompt/prompt-modal.js +458 -0
  85. mcp_ai_supervisor/web/static/js/modules/prompt/prompt-settings-ui.js +524 -0
  86. mcp_ai_supervisor/web/static/js/modules/session/session-data-manager.js +1042 -0
  87. mcp_ai_supervisor/web/static/js/modules/session/session-details-modal.js +594 -0
  88. mcp_ai_supervisor/web/static/js/modules/session/session-ui-renderer.js +836 -0
  89. mcp_ai_supervisor/web/static/js/modules/session-manager.js +1059 -0
  90. mcp_ai_supervisor/web/static/js/modules/settings-manager.js +1002 -0
  91. mcp_ai_supervisor/web/static/js/modules/tab-manager.js +235 -0
  92. mcp_ai_supervisor/web/static/js/modules/textarea-height-manager.js +267 -0
  93. mcp_ai_supervisor/web/static/js/modules/ui-manager.js +578 -0
  94. mcp_ai_supervisor/web/static/js/modules/utils/dom-utils.js +392 -0
  95. mcp_ai_supervisor/web/static/js/modules/utils/status-utils.js +403 -0
  96. mcp_ai_supervisor/web/static/js/modules/utils/time-utils.js +440 -0
  97. mcp_ai_supervisor/web/static/js/modules/utils.js +557 -0
  98. mcp_ai_supervisor/web/static/js/modules/websocket-manager.js +875 -0
  99. mcp_ai_supervisor/web/static/js/modules/workbench-notification.js +103 -0
  100. mcp_ai_supervisor/web/static/js/vendor/marked.min.js +6 -0
  101. mcp_ai_supervisor/web/static/js/vendor/purify.min.js +3 -0
  102. mcp_ai_supervisor/web/templates/components/image-upload.html +43 -0
  103. mcp_ai_supervisor/web/templates/components/settings-card.html +58 -0
  104. mcp_ai_supervisor/web/templates/components/status-indicator.html +31 -0
  105. mcp_ai_supervisor/web/templates/components/toggle-switch.html +19 -0
  106. mcp_ai_supervisor/web/templates/feedback.html +1198 -0
  107. mcp_ai_supervisor/web/templates/index.html +378 -0
  108. mcp_ai_supervisor/web/utils/__init__.py +12 -0
  109. mcp_ai_supervisor/web/utils/browser.py +35 -0
  110. mcp_ai_supervisor/web/utils/compression_config.py +195 -0
  111. mcp_ai_supervisor/web/utils/compression_monitor.py +314 -0
  112. mcp_ai_supervisor/web/utils/ide_opener.py +286 -0
  113. mcp_ai_supervisor/web/utils/network.py +66 -0
  114. mcp_ai_supervisor/web/utils/port_manager.py +340 -0
  115. mcp_ai_supervisor/web/utils/session_cleanup_manager.py +543 -0
  116. mcp_ai_supervisor/web/utils/workbench_client.py +899 -0
  117. mcp_ai_supervisor/workbench/__init__.py +5 -0
  118. mcp_ai_supervisor/workbench/__main__.py +5 -0
@@ -0,0 +1,524 @@
1
+ /**
2
+ * MCP AI Supervisor - 提示詞設定 UI 模組
3
+ * =========================================
4
+ *
5
+ * 處理設定頁籤中的提示詞管理介面
6
+ */
7
+
8
+ (function() {
9
+ 'use strict';
10
+
11
+ // 確保命名空間存在
12
+ window.MCPFeedback = window.MCPFeedback || {};
13
+ window.MCPFeedback.Prompt = window.MCPFeedback.Prompt || {};
14
+
15
+ const Utils = window.MCPFeedback.Utils;
16
+
17
+ /**
18
+ * 提示詞設定 UI 管理器
19
+ */
20
+ function PromptSettingsUI(options) {
21
+ options = options || {};
22
+
23
+ // 依賴注入
24
+ this.promptManager = options.promptManager || null;
25
+ this.promptModal = options.promptModal || null;
26
+ this.settingsManager = options.settingsManager || null;
27
+
28
+ // UI 元素
29
+ this.container = null;
30
+ this.promptList = null;
31
+ this.addButton = null;
32
+
33
+ // 狀態
34
+ this.isInitialized = false;
35
+
36
+ console.log('🎨 PromptSettingsUI 初始化完成');
37
+ }
38
+
39
+ /**
40
+ * 初始化設定 UI
41
+ */
42
+ PromptSettingsUI.prototype.init = function(containerSelector) {
43
+ this.container = document.querySelector(containerSelector);
44
+ if (!this.container) {
45
+ console.error('❌ 找不到提示詞設定容器:', containerSelector);
46
+ return false;
47
+ }
48
+
49
+ // 創建 UI 結構
50
+ this.createUI();
51
+
52
+ // 設置事件監聽器
53
+ this.setupEventListeners();
54
+
55
+ // 載入提示詞列表
56
+ this.refreshPromptList();
57
+
58
+ this.isInitialized = true;
59
+ console.log('✅ PromptSettingsUI 初始化完成');
60
+ return true;
61
+ };
62
+
63
+ /**
64
+ * 創建 UI 結構
65
+ */
66
+ PromptSettingsUI.prototype.createUI = function() {
67
+ const html = `
68
+ <div class="prompt-management-section">
69
+ <div class="prompt-management-header">
70
+ <h4 class="prompt-management-title" data-i18n="prompts.management.title">
71
+ 📝 常用提示詞管理
72
+ </h4>
73
+ <button type="button" class="btn btn-primary prompt-add-btn" id="promptAddBtn">
74
+ <span data-i18n="prompts.management.addNew">新增提示詞</span>
75
+ </button>
76
+ </div>
77
+ <div class="prompt-management-description" data-i18n="prompts.management.description">
78
+ 管理您的常用提示詞模板,可在回饋輸入時快速選用
79
+ </div>
80
+ <div class="prompt-settings-list" id="promptSettingsList">
81
+ <!-- 提示詞列表將在這裡動態生成 -->
82
+ </div>
83
+ </div>
84
+ `;
85
+
86
+ this.container.insertAdjacentHTML('beforeend', html);
87
+
88
+ // 獲取 UI 元素引用
89
+ this.promptList = this.container.querySelector('#promptSettingsList');
90
+ this.addButton = this.container.querySelector('#promptAddBtn');
91
+ };
92
+
93
+ /**
94
+ * 設置事件監聽器
95
+ */
96
+ PromptSettingsUI.prototype.setupEventListeners = function() {
97
+ const self = this;
98
+
99
+ // 新增按鈕事件
100
+ if (this.addButton) {
101
+ this.addButton.addEventListener('click', function() {
102
+ self.handleAddPrompt();
103
+ });
104
+ }
105
+
106
+ // 設置提示詞管理器回調
107
+ if (this.promptManager) {
108
+ this.promptManager.addPromptsChangeCallback(function(prompts) {
109
+ console.log('🎨 提示詞列表變更,重新渲染 UI');
110
+ self.refreshPromptList();
111
+ });
112
+ }
113
+
114
+ // 設置彈窗回調
115
+ if (this.promptModal) {
116
+ this.promptModal.onSave = function(promptData, type) {
117
+ self.handlePromptSave(promptData, type);
118
+ };
119
+ }
120
+ };
121
+
122
+ /**
123
+ * 刷新提示詞列表
124
+ */
125
+ PromptSettingsUI.prototype.refreshPromptList = function() {
126
+ if (!this.promptList || !this.promptManager) {
127
+ return;
128
+ }
129
+
130
+ const prompts = this.promptManager.getAllPrompts();
131
+
132
+ if (prompts.length === 0) {
133
+ this.promptList.innerHTML = this.createEmptyStateHTML();
134
+ } else {
135
+ this.promptList.innerHTML = prompts.map(prompt =>
136
+ this.createPromptItemHTML(prompt)
137
+ ).join('');
138
+
139
+ // 設置項目事件監聽器
140
+ this.setupPromptItemEvents();
141
+ }
142
+
143
+ // 更新翻譯
144
+ this.updateTranslations();
145
+
146
+ // 更新自動提交下拉選單
147
+ this.updateAutoSubmitSelect();
148
+ };
149
+
150
+ /**
151
+ * 創建空狀態 HTML
152
+ */
153
+ PromptSettingsUI.prototype.createEmptyStateHTML = function() {
154
+ return `
155
+ <div class="empty-state">
156
+ <div style="font-size: 48px; margin-bottom: 12px;">📝</div>
157
+ <div data-i18n="prompts.management.emptyState">
158
+ 尚未建立任何常用提示詞
159
+ </div>
160
+ <div style="font-size: 12px; color: var(--text-secondary); margin-top: 8px;" data-i18n="prompts.management.emptyHint">
161
+ 點擊上方「新增提示詞」按鈕開始建立您的第一個提示詞模板
162
+ </div>
163
+ </div>
164
+ `;
165
+ };
166
+
167
+ /**
168
+ * 創建提示詞項目 HTML
169
+ */
170
+ PromptSettingsUI.prototype.createPromptItemHTML = function(prompt) {
171
+ const createdDate = this.formatDate(prompt.createdAt);
172
+ const lastUsedDate = prompt.lastUsedAt ? this.formatDate(prompt.lastUsedAt) : null;
173
+ const truncatedContent = this.truncateText(prompt.content, 80);
174
+ const isAutoSubmit = prompt.isAutoSubmit || false;
175
+
176
+ return `
177
+ <div class="prompt-settings-item ${isAutoSubmit ? 'auto-submit-prompt' : ''}" data-prompt-id="${prompt.id}">
178
+ <div class="prompt-settings-info">
179
+ <div class="prompt-settings-name">
180
+ ${isAutoSubmit ? '<span class="auto-submit-badge" title="自動提交提示詞">⏰</span>' : ''}
181
+ ${Utils.escapeHtml(prompt.name)}
182
+ </div>
183
+ <div class="prompt-settings-content">${Utils.escapeHtml(truncatedContent)}</div>
184
+ <div class="prompt-settings-meta">
185
+ <span data-i18n="prompts.management.created">建立於</span>: ${createdDate}
186
+ ${lastUsedDate ? `| <span data-i18n="prompts.management.lastUsed">最近使用</span>: ${lastUsedDate}` : ''}
187
+ ${isAutoSubmit ? `| <span class="auto-submit-status" data-i18n="prompts.management.autoSubmit">自動提交</span>` : ''}
188
+ </div>
189
+ </div>
190
+ <div class="prompt-settings-actions">
191
+ <button type="button" class="prompt-action-btn auto-submit-btn ${isAutoSubmit ? 'active' : ''}"
192
+ data-prompt-id="${prompt.id}"
193
+ title="${isAutoSubmit ? '取消自動提交' : '設定為自動提交'}"
194
+ data-i18n="${isAutoSubmit ? 'prompts.management.cancelAutoSubmit' : 'prompts.management.setAutoSubmit'}">
195
+ ${isAutoSubmit ? '⏸️' : '⏰'}
196
+ </button>
197
+ <button type="button" class="prompt-action-btn edit-btn" data-prompt-id="${prompt.id}" data-i18n="prompts.management.edit">
198
+ 編輯
199
+ </button>
200
+ <button type="button" class="prompt-action-btn delete-btn delete" data-prompt-id="${prompt.id}" data-i18n="prompts.management.delete">
201
+ 刪除
202
+ </button>
203
+ </div>
204
+ </div>
205
+ `;
206
+ };
207
+
208
+ /**
209
+ * 設置提示詞項目事件監聽器
210
+ */
211
+ PromptSettingsUI.prototype.setupPromptItemEvents = function() {
212
+ const self = this;
213
+
214
+ // 編輯按鈕事件
215
+ const editButtons = this.promptList.querySelectorAll('.edit-btn');
216
+ editButtons.forEach(function(button) {
217
+ button.addEventListener('click', function(e) {
218
+ e.stopPropagation();
219
+ const promptId = button.getAttribute('data-prompt-id');
220
+ self.handleEditPrompt(promptId);
221
+ });
222
+ });
223
+
224
+ // 刪除按鈕事件
225
+ const deleteButtons = this.promptList.querySelectorAll('.delete-btn');
226
+ deleteButtons.forEach(function(button) {
227
+ button.addEventListener('click', function(e) {
228
+ e.stopPropagation();
229
+ const promptId = button.getAttribute('data-prompt-id');
230
+ self.handleDeletePrompt(promptId);
231
+ });
232
+ });
233
+
234
+ // 自動提交按鈕事件
235
+ const autoSubmitButtons = this.promptList.querySelectorAll('.auto-submit-btn');
236
+ autoSubmitButtons.forEach(function(button) {
237
+ button.addEventListener('click', function(e) {
238
+ e.stopPropagation();
239
+ const promptId = button.getAttribute('data-prompt-id');
240
+ self.handleToggleAutoSubmit(promptId);
241
+ });
242
+ });
243
+ };
244
+
245
+ /**
246
+ * 處理新增提示詞
247
+ */
248
+ PromptSettingsUI.prototype.handleAddPrompt = function() {
249
+ if (!this.promptModal) {
250
+ console.error('❌ PromptModal 未設定');
251
+ return;
252
+ }
253
+
254
+ this.promptModal.showAddModal();
255
+ };
256
+
257
+ /**
258
+ * 處理編輯提示詞
259
+ */
260
+ PromptSettingsUI.prototype.handleEditPrompt = function(promptId) {
261
+ if (!this.promptManager || !this.promptModal) {
262
+ console.error('❌ PromptManager 或 PromptModal 未設定');
263
+ return;
264
+ }
265
+
266
+ const prompt = this.promptManager.getPromptById(promptId);
267
+ if (!prompt) {
268
+ this.showError(this.t('prompts.management.notFound', '找不到指定的提示詞'));
269
+ return;
270
+ }
271
+
272
+ this.promptModal.showEditModal(prompt);
273
+ };
274
+
275
+ /**
276
+ * 處理刪除提示詞
277
+ */
278
+ PromptSettingsUI.prototype.handleDeletePrompt = function(promptId) {
279
+ if (!this.promptManager) {
280
+ console.error('❌ PromptManager 未設定');
281
+ return;
282
+ }
283
+
284
+ const prompt = this.promptManager.getPromptById(promptId);
285
+ if (!prompt) {
286
+ this.showError(this.t('prompts.management.notFound', '找不到指定的提示詞'));
287
+ return;
288
+ }
289
+
290
+ const confirmMessage = this.t('prompts.management.confirmDelete', '確定要刪除此提示詞嗎?') +
291
+ '\n\n' + prompt.name;
292
+
293
+ if (confirm(confirmMessage)) {
294
+ try {
295
+ this.promptManager.deletePrompt(promptId);
296
+ this.showSuccess(this.t('prompts.management.deleteSuccess', '提示詞已刪除'));
297
+ } catch (error) {
298
+ this.showError(error.message);
299
+ }
300
+ }
301
+ };
302
+
303
+ /**
304
+ * 處理自動提交切換
305
+ */
306
+ PromptSettingsUI.prototype.handleToggleAutoSubmit = function(promptId) {
307
+ if (!this.promptManager) {
308
+ console.error('❌ PromptManager 未設定');
309
+ return;
310
+ }
311
+
312
+ const prompt = this.promptManager.getPromptById(promptId);
313
+ if (!prompt) {
314
+ this.showError(this.t('prompts.management.notFound', '找不到指定的提示詞'));
315
+ return;
316
+ }
317
+
318
+ try {
319
+ if (prompt.isAutoSubmit) {
320
+ // 取消自動提交
321
+ this.promptManager.clearAutoSubmitPrompt();
322
+ this.showSuccess(this.t('prompts.management.autoSubmitCancelled', '已取消自動提交設定'));
323
+
324
+ // 清空設定管理器中的自動提交設定
325
+ if (this.settingsManager) {
326
+ this.settingsManager.set('autoSubmitPromptId', null);
327
+ this.settingsManager.set('autoSubmitEnabled', false);
328
+ console.log('🔄 已清空自動提交設定');
329
+ } else {
330
+ console.warn('⚠️ settingsManager 未設定,無法清空自動提交設定');
331
+ }
332
+ } else {
333
+ // 設定為自動提交
334
+ this.promptManager.setAutoSubmitPrompt(promptId);
335
+ this.showSuccess(this.t('prompts.management.autoSubmitSet', '已設定為自動提交提示詞:') + prompt.name);
336
+
337
+ // 更新設定管理器中的自動提交設定
338
+ if (this.settingsManager) {
339
+ console.log('🔧 設定前的 autoSubmitPromptId:', this.settingsManager.get('autoSubmitPromptId'));
340
+ this.settingsManager.set('autoSubmitPromptId', promptId);
341
+ this.settingsManager.set('autoSubmitEnabled', true);
342
+ console.log('✅ 已設定自動提交提示詞 ID:', promptId);
343
+ console.log('🔧 設定後的 autoSubmitPromptId:', this.settingsManager.get('autoSubmitPromptId'));
344
+ } else {
345
+ console.warn('⚠️ settingsManager 未設定,無法更新自動提交設定');
346
+ }
347
+ }
348
+
349
+ // 更新自動提交下拉選單
350
+ this.updateAutoSubmitSelect();
351
+
352
+ // 觸發自動提交狀態變更事件
353
+ if (this.settingsManager && this.settingsManager.triggerAutoSubmitStateChange) {
354
+ this.settingsManager.triggerAutoSubmitStateChange(prompt.isAutoSubmit);
355
+ } else {
356
+ console.warn('⚠️ settingsManager 或 triggerAutoSubmitStateChange 方法未設定');
357
+ }
358
+ } catch (error) {
359
+ this.showError(error.message);
360
+ }
361
+ };
362
+
363
+ /**
364
+ * 更新自動提交下拉選單
365
+ */
366
+ PromptSettingsUI.prototype.updateAutoSubmitSelect = function() {
367
+ console.log('🔄 updateAutoSubmitSelect 開始執行');
368
+ const autoSubmitSelect = document.getElementById('autoSubmitPromptSelect');
369
+ if (!autoSubmitSelect || !this.promptManager) {
370
+ console.log('❌ updateAutoSubmitSelect: 缺少必要元素');
371
+ return;
372
+ }
373
+
374
+ // 清空現有選項(保留第一個預設選項)
375
+ while (autoSubmitSelect.children.length > 1) {
376
+ autoSubmitSelect.removeChild(autoSubmitSelect.lastChild);
377
+ }
378
+
379
+ // 新增所有提示詞選項
380
+ const prompts = this.promptManager.getAllPrompts();
381
+ let autoSubmitPromptId = null;
382
+ console.log('🔄 updateAutoSubmitSelect 檢查提示詞:', prompts.map(p => ({id: p.id, name: p.name, isAutoSubmit: p.isAutoSubmit})));
383
+
384
+ prompts.forEach(function(prompt) {
385
+ const option = document.createElement('option');
386
+ option.value = prompt.id;
387
+ option.textContent = prompt.name;
388
+ if (prompt.isAutoSubmit) {
389
+ option.selected = true;
390
+ autoSubmitPromptId = prompt.id;
391
+ console.log('🔄 找到自動提交提示詞:', prompt.name, prompt.id);
392
+ }
393
+ autoSubmitSelect.appendChild(option);
394
+ });
395
+
396
+ // 同步更新設定管理器中的自動提交提示詞 ID
397
+ if (this.settingsManager) {
398
+ console.log('🔄 updateAutoSubmitSelect 設定前:', this.settingsManager.get('autoSubmitPromptId'));
399
+ const currentAutoSubmitEnabled = this.settingsManager.get('autoSubmitEnabled');
400
+
401
+ if (autoSubmitPromptId) {
402
+ // 檢查狀態一致性:如果設定中的 promptId 與找到的不一致,以找到的為準
403
+ const currentPromptId = this.settingsManager.get('autoSubmitPromptId');
404
+ if (currentPromptId !== autoSubmitPromptId) {
405
+ console.log('🔧 狀態不一致,修正 autoSubmitPromptId:', currentPromptId, '->', autoSubmitPromptId);
406
+ this.settingsManager.set('autoSubmitPromptId', autoSubmitPromptId);
407
+ }
408
+
409
+ // 不自動改變 autoSubmitEnabled 的值,完全尊重用戶的設定
410
+ // updateAutoSubmitSelect 只負責同步 promptId 和下拉選單顯示
411
+ console.log('🔄 updateAutoSubmitSelect 同步 promptId,保持 autoSubmitEnabled 狀態:', {
412
+ promptId: autoSubmitPromptId,
413
+ enabled: currentAutoSubmitEnabled
414
+ });
415
+ } else {
416
+ // 沒有找到自動提交提示詞,清空 promptId 但完全保留 enabled 狀態
417
+ this.settingsManager.set('autoSubmitPromptId', null);
418
+ console.log('🔄 updateAutoSubmitSelect 清空 promptId,完全保留 autoSubmitEnabled 狀態:', currentAutoSubmitEnabled);
419
+ }
420
+ console.log('🔄 updateAutoSubmitSelect 設定後:', {
421
+ promptId: this.settingsManager.get('autoSubmitPromptId'),
422
+ enabled: this.settingsManager.get('autoSubmitEnabled')
423
+ });
424
+ } else {
425
+ console.warn('⚠️ updateAutoSubmitSelect: settingsManager 未設定,無法同步設定');
426
+ }
427
+ };
428
+
429
+ /**
430
+ * 處理提示詞保存
431
+ */
432
+ PromptSettingsUI.prototype.handlePromptSave = function(promptData, type) {
433
+ if (!this.promptManager) {
434
+ console.error('❌ PromptManager 未設定');
435
+ return;
436
+ }
437
+
438
+ try {
439
+ if (type === 'add') {
440
+ this.promptManager.addPrompt(promptData.name, promptData.content);
441
+ this.showSuccess(this.t('prompts.management.addSuccess', '提示詞已新增'));
442
+ } else if (type === 'edit') {
443
+ this.promptManager.updatePrompt(promptData.id, promptData.name, promptData.content);
444
+ this.showSuccess(this.t('prompts.management.updateSuccess', '提示詞已更新'));
445
+ }
446
+
447
+ // 更新自動提交下拉選單
448
+ this.updateAutoSubmitSelect();
449
+ } catch (error) {
450
+ throw error; // 重新拋出錯誤,讓彈窗處理
451
+ }
452
+ };
453
+
454
+ /**
455
+ * 更新翻譯
456
+ */
457
+ PromptSettingsUI.prototype.updateTranslations = function() {
458
+ if (window.i18nManager && typeof window.i18nManager.applyTranslations === 'function') {
459
+ window.i18nManager.applyTranslations();
460
+ }
461
+ };
462
+
463
+ /**
464
+ * 顯示成功訊息
465
+ */
466
+ PromptSettingsUI.prototype.showSuccess = function(message) {
467
+ if (window.MCPFeedback && window.MCPFeedback.Utils && window.MCPFeedback.Utils.showMessage) {
468
+ window.MCPFeedback.Utils.showMessage(message, 'success');
469
+ } else {
470
+ console.log('✅', message);
471
+ }
472
+ };
473
+
474
+ /**
475
+ * 顯示錯誤訊息
476
+ */
477
+ PromptSettingsUI.prototype.showError = function(message) {
478
+ if (window.MCPFeedback && window.MCPFeedback.Utils && window.MCPFeedback.Utils.showMessage) {
479
+ window.MCPFeedback.Utils.showMessage(message, 'error');
480
+ } else {
481
+ alert(message);
482
+ }
483
+ };
484
+
485
+ /**
486
+ * 翻譯函數
487
+ */
488
+ PromptSettingsUI.prototype.t = function(key, fallback) {
489
+ if (window.i18nManager && typeof window.i18nManager.t === 'function') {
490
+ return window.i18nManager.t(key, fallback);
491
+ }
492
+ return fallback || key;
493
+ };
494
+
495
+ /**
496
+ * 格式化日期
497
+ */
498
+ PromptSettingsUI.prototype.formatDate = function(dateString) {
499
+ if (!dateString) return '';
500
+
501
+ try {
502
+ const date = new Date(dateString);
503
+ return date.toLocaleDateString() + ' ' + date.toLocaleTimeString([], {hour: '2-digit', minute:'2-digit'});
504
+ } catch (error) {
505
+ return dateString;
506
+ }
507
+ };
508
+
509
+ /**
510
+ * 截斷文字
511
+ */
512
+ PromptSettingsUI.prototype.truncateText = function(text, maxLength) {
513
+ if (!text || text.length <= maxLength) {
514
+ return text;
515
+ }
516
+ return text.substring(0, maxLength) + '...';
517
+ };
518
+
519
+ // 將 PromptSettingsUI 加入命名空間
520
+ window.MCPFeedback.Prompt.PromptSettingsUI = PromptSettingsUI;
521
+
522
+ console.log('✅ PromptSettingsUI 模組載入完成');
523
+
524
+ })();