diff --git a/src/mcp_feedback_enhanced/web/main.py b/src/mcp_feedback_enhanced/web/main.py index 1d6f323..1e940bd 100644 --- a/src/mcp_feedback_enhanced/web/main.py +++ b/src/mcp_feedback_enhanced/web/main.py @@ -133,14 +133,25 @@ class WebUIManager: debug_log(f"創建新的活躍會話: {session_id}") debug_log(f"繼承 {len(session.active_tabs)} 個活躍標籤頁") - # 如果有舊的 WebSocket 連接,立即發送會話更新通知 + # 處理會話更新通知 if old_websocket: + # 有舊連接,立即發送會話更新通知 self._old_websocket_for_update = old_websocket self._new_session_for_update = session debug_log("已保存舊 WebSocket 連接,準備發送會話更新通知") + + # 立即發送會話更新通知 + import asyncio + try: + # 在後台任務中發送通知 + asyncio.create_task(self._send_immediate_session_update()) + except Exception as e: + debug_log(f"創建會話更新任務失敗: {e}") + self._pending_session_update = True else: - # 標記需要發送會話更新通知(當新 WebSocket 連接建立時) + # 沒有舊連接,標記需要發送會話更新通知(當新 WebSocket 連接建立時) self._pending_session_update = True + debug_log("沒有舊 WebSocket 連接,設置待更新標記") return session_id @@ -310,19 +321,27 @@ class WebUIManager: async def notify_session_update(self, session): """向活躍標籤頁發送會話更新通知""" try: - # 向所有活躍的 WebSocket 連接發送會話更新通知 - await self.broadcast_to_active_tabs({ - "type": "session_updated", - "message": "新會話已創建,正在更新頁面內容", - "session_info": { - "project_directory": session.project_directory, - "summary": session.summary, - "session_id": session.session_id - } - }) - debug_log("會話更新通知已發送到所有活躍標籤頁") + # 檢查是否有活躍的 WebSocket 連接 + if session.websocket: + # 直接通過當前會話的 WebSocket 發送 + await session.websocket.send_json({ + "type": "session_updated", + "message": "新會話已創建,正在更新頁面內容", + "session_info": { + "project_directory": session.project_directory, + "summary": session.summary, + "session_id": session.session_id + } + }) + debug_log("會話更新通知已通過 WebSocket 發送") + else: + # 沒有活躍連接,設置待更新標記 + self._pending_session_update = True + debug_log("沒有活躍 WebSocket 連接,設置待更新標記") except Exception as e: debug_log(f"發送會話更新通知失敗: {e}") + # 設置待更新標記作為備用方案 + self._pending_session_update = True async def _send_immediate_session_update(self): """立即發送會話更新通知(使用舊的 WebSocket 連接)""" diff --git a/src/mcp_feedback_enhanced/web/routes/main_routes.py b/src/mcp_feedback_enhanced/web/routes/main_routes.py index fc43f81..a8ca0eb 100644 --- a/src/mcp_feedback_enhanced/web/routes/main_routes.py +++ b/src/mcp_feedback_enhanced/web/routes/main_routes.py @@ -170,6 +170,7 @@ def setup_routes(manager: 'WebUIManager'): # 檢查是否有待發送的會話更新 if getattr(manager, '_pending_session_update', False): + debug_log("檢測到待發送的會話更新,準備發送通知") await websocket.send_json({ "type": "session_updated", "message": "新會話已創建,正在更新頁面內容", @@ -180,7 +181,14 @@ def setup_routes(manager: 'WebUIManager'): } }) manager._pending_session_update = False - debug_log("已發送會話更新通知到前端") + debug_log("✅ 已發送會話更新通知到前端") + else: + # 發送當前會話狀態 + await websocket.send_json({ + "type": "status_update", + "status_info": session.get_status_info() + }) + debug_log("已發送當前會話狀態到前端") except Exception as e: debug_log(f"發送連接確認失敗: {e}") diff --git a/src/mcp_feedback_enhanced/web/static/js/app.js b/src/mcp_feedback_enhanced/web/static/js/app.js index 8dc75c9..0b512a6 100644 --- a/src/mcp_feedback_enhanced/web/static/js/app.js +++ b/src/mcp_feedback_enhanced/web/static/js/app.js @@ -968,11 +968,20 @@ class FeedbackApp { this.updateConnectionStatus('connected', '已連接'); console.log('WebSocket 連接已建立'); + // 重置重連計數器 + this.reconnectAttempts = 0; + // 開始 WebSocket 心跳 this.startWebSocketHeartbeat(); // 連接成功後,請求會話狀態 this.requestSessionStatus(); + + // 如果之前處於處理狀態但連接斷開,重置為等待狀態 + if (this.feedbackState === 'processing') { + console.log('🔄 WebSocket 重連後重置處理狀態'); + this.setFeedbackState('waiting_for_feedback'); + } }; this.websocket.onmessage = (event) => { @@ -1004,12 +1013,17 @@ class FeedbackApp { this.updateConnectionStatus('disconnected', '已斷開'); // 只有在非正常關閉時才重連 - if (event.code !== 1000) { - console.log('3秒後嘗試重連...'); + if (event.code !== 1000 && this.reconnectAttempts < this.maxReconnectAttempts) { + this.reconnectAttempts++; + const delay = Math.min(3000 * this.reconnectAttempts, 15000); // 最大延遲15秒 + console.log(`${delay/1000}秒後嘗試重連... (第${this.reconnectAttempts}次)`); setTimeout(() => { - console.log('🔄 開始重連 WebSocket...'); + console.log(`🔄 開始重連 WebSocket... (第${this.reconnectAttempts}次)`); this.setupWebSocket(); - }, 3000); + }, delay); + } else if (this.reconnectAttempts >= this.maxReconnectAttempts) { + console.log('❌ 達到最大重連次數,停止重連'); + this.showMessage('WebSocket 連接失敗,請刷新頁面重試', 'error'); } } }; @@ -1089,7 +1103,7 @@ class FeedbackApp { this.handleStatusUpdate(data.status_info); break; case 'session_updated': - console.log('會話已更新:', data.session_info); + console.log('🔄 收到會話更新消息:', data.session_info); this.handleSessionUpdated(data); break; default: @@ -1158,8 +1172,13 @@ class FeedbackApp { // 使用局部更新替代整頁刷新 await this.updatePageContentPartially(); + // 確保 UI 狀態正確更新 + this.updateUIState(); + + console.log('✅ 頁面內容局部更新完成'); + } catch (error) { - console.error('局部更新頁面內容失敗:', error); + console.error('❌ 局部更新頁面內容失敗:', error); // 備用方案:顯示提示讓用戶手動刷新 this.showMessage('更新內容失敗,請手動刷新頁面以查看新的 AI 工作摘要', 'warning'); }