mirror of
https://github.com/Minidoracat/mcp-feedback-enhanced.git
synced 2025-07-27 10:42:25 +08:00
🐛 修復 websocket
This commit is contained in:
parent
466dcffaa9
commit
462ed934a3
@ -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 連接)"""
|
||||
|
@ -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}")
|
||||
|
@ -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');
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user