# 組件詳細說明
## 🏗️ 四層架構組件
MCP Feedback Enhanced 採用清晰的四層架構設計,每層負責特定的功能領域。本文檔詳細說明各層組件的實現細節、職責分工和交互機制。
### 架構設計原則
- **單一職責**: 每個組件專注於特定功能領域
- **低耦合**: 層間通過明確的接口通信
- **高內聚**: 相關功能集中在同一層內
- **可擴展**: 支援新功能的無縫集成
- **可測試**: 每層都可獨立進行單元測試
### 詳細組件關係圖
```mermaid
graph TB
subgraph "第一層:MCP 服務層"
SERVER[server.py
MCP 服務器
FastMCP 實現]
TOOL[interactive_feedback
核心工具
參數驗證]
I18N[i18n.py
國際化支援
多語言管理]
DEBUG[debug.py
統一調試
日誌輸出]
end
subgraph "第二層:Web UI 管理層"
MANAGER[WebUIManager
單例管理器
會話控制]
SESSION[WebFeedbackSession
會話模型
狀態管理]
MODELS[models/
數據模型
類型定義]
end
subgraph "第三層:Web 服務層"
MAIN[main.py
FastAPI 應用
HTTP 服務]
ROUTES[routes/main_routes.py
路由處理
API 端點]
WS[WebSocket
實時通信
雙向數據流]
end
subgraph "第四層:前端交互層"
HTML[templates/
HTML 模板
Jinja2 渲染]
JS[static/js/
JavaScript 模組
ES6+ 架構]
CSS[static/css/
樣式系統
響應式設計]
LOCALES[locales/
翻譯文件
JSON 格式]
PROMPT_MODULES[prompt/
提示詞管理模組
CRUD 操作]
SESSION_MODULES[session/
會話管理模組
歷史追蹤]
end
subgraph "工具層 - 核心工具"
ERROR[utils/error_handler.py
錯誤處理
統一異常管理]
MEMORY[utils/memory_monitor.py
記憶體監控
資源追蹤]
RESOURCE[utils/resource_manager.py
資源管理
生命週期控制]
end
subgraph "工具層 - Web 工具"
BROWSER[utils/browser.py
瀏覽器控制
智能開啟]
PORT[utils/port_manager.py
埠管理
動態分配]
COMPRESS[utils/compression_*.py
壓縮工具
數據優化]
CLEANUP[utils/session_cleanup_manager.py
清理管理
自動回收]
end
%% 主要數據流
SERVER -->|MCP 調用| TOOL
TOOL -->|創建會話| MANAGER
MANAGER -->|管理| SESSION
MANAGER -->|啟動服務| MAIN
MAIN -->|路由分發| ROUTES
ROUTES -->|渲染頁面| HTML
HTML -->|載入腳本| JS
JS -->|WebSocket| WS
WS -->|回傳數據| SESSION
%% 新功能模組
JS -->|載入模組| PROMPT_MODULES
JS -->|載入模組| SESSION_MODULES
PROMPT_MODULES -->|提示詞管理| WS
SESSION_MODULES -->|會話追蹤| WS
%% 支援服務
I18N -->|翻譯服務| ROUTES
I18N -->|語言包| LOCALES
DEBUG -->|日誌記錄| SERVER
MODELS -->|數據結構| SESSION
%% 工具層支援
ERROR -->|錯誤處理| MANAGER
MEMORY -->|監控| MANAGER
RESOURCE -->|資源管理| SESSION
BROWSER -->|開啟瀏覽器| MANAGER
PORT -->|埠分配| MAIN
COMPRESS -->|數據壓縮| ROUTES
CLEANUP -->|清理會話| SESSION
%% 樣式定義
classDef layer1 fill:#e3f2fd
classDef layer2 fill:#f3e5f5
classDef layer3 fill:#e8f5e8
classDef layer4 fill:#fff3e0
classDef tools fill:#fafafa
class SERVER,TOOL,I18N,DEBUG layer1
class MANAGER,SESSION,MODELS layer2
class MAIN,ROUTES,WS layer3
class HTML,JS,CSS,LOCALES,PROMPT_MODULES,SESSION_MODULES layer4
class ERROR,MEMORY,RESOURCE,BROWSER,PORT,COMPRESS,CLEANUP tools
```
## 🔧 第一層:MCP 服務層
### server.py - MCP 服務器核心
**架構實現**:
```python
# 基於 FastMCP 的服務器實現
mcp = FastMCP("mcp-feedback-enhanced")
@mcp.tool()
async def interactive_feedback(
project_directory: Annotated[str, Field(description="專案目錄路徑")] = ".",
summary: Annotated[str, Field(description="AI 工作完成的摘要說明")] = "我已完成了您請求的任務。",
timeout: Annotated[int, Field(description="等待用戶回饋的超時時間(秒)")] = 600,
) -> list:
"""
收集用戶的互動回饋,支援文字和圖片
"""
# 1. 參數驗證和環境檢測
# 2. 啟動 Web UI 管理器
# 3. 創建或更新會話
# 4. 等待用戶回饋
# 5. 處理和返回結果
```
**主要職責**:
- **MCP 協議實現**: 基於 FastMCP 框架的標準實現
- **工具註冊**: 註冊 `interactive_feedback` 和 `get_system_info` 工具
- **環境檢測**: 自動識別 Local/SSH Remote/WSL 環境
- **生命週期管理**: 控制 Web UI 的啟動、運行和清理
- **接口層**: 作為 AI 助手與系統的主要通信接口
**核心特性**:
- 支援 MCP 2.0+ 協議標準
- 異步處理提升性能
- 完整的錯誤處理和日誌記錄
- 參數類型驗證和文檔生成
### interactive_feedback 工具
**工具執行流程**:
```mermaid
flowchart TD
START[AI 助手調用] --> VALIDATE[參數驗證]
VALIDATE --> ENV[環境檢測]
ENV --> MANAGER[獲取 WebUIManager]
MANAGER --> SESSION[創建/更新會話]
SESSION --> LAUNCH[啟動 Web 服務]
LAUNCH --> BROWSER[智能開啟瀏覽器]
BROWSER --> WAIT[等待用戶回饋]
WAIT --> TIMEOUT{超時檢查}
TIMEOUT -->|未超時| FEEDBACK[接收回饋]
TIMEOUT -->|超時| CLEANUP[清理資源]
FEEDBACK --> PROCESS[處理回饋數據]
PROCESS --> SAVE[保存回饋記錄]
SAVE --> RETURN[返回結果給 AI]
CLEANUP --> ERROR[返回超時錯誤]
ERROR --> RETURN
style START fill:#e3f2fd
style RETURN fill:#e8f5e8
style ERROR fill:#ffebee
```
**參數說明**:
- `project_directory`: 專案目錄路徑,用於命令執行上下文
- `summary`: AI 工作摘要,顯示給用戶確認
- `timeout`: 等待超時時間,預設 600 秒(10 分鐘)
**返回格式**:
```python
# 成功返回
[
TextContent(type="text", text="用戶回饋內容"),
MCPImage(data="base64_encoded_image", mimeType="image/png") # 可選
]
# 錯誤返回
[TextContent(type="text", text="錯誤描述")]
```
### i18n.py - 國際化支援
**多語言架構**:
```python
class I18nManager:
def __init__(self):
self._supported_languages = ["zh-TW", "en", "zh-CN"]
self._fallback_language = "en"
self._locales_dir = Path(__file__).parent / "web" / "locales"
def t(self, key: str, **kwargs) -> str:
"""翻譯函數,支援巢狀鍵值和參數替換"""
```
**核心功能**:
- **三語支援**: 繁體中文、簡體中文、英文
- **智能檢測**: 基於系統語言自動選擇
- **動態切換**: 運行時語言切換無需重啟
- **巢狀翻譯**: 支援 `buttons.submit` 格式的鍵值
- **參數替換**: 支援 `{name}` 格式的動態內容
- **回退機制**: 翻譯缺失時自動使用英文
**翻譯文件結構**:
```json
{
"app": {
"title": "MCP Feedback Enhanced",
"subtitle": "AI 輔助開發回饋收集器"
},
"buttons": {
"submit": "提交回饋",
"cancel": "取消"
}
}
```
### debug.py - 統一調試系統
**調試功能**:
- **條件輸出**: 只在 `MCP_DEBUG=true` 時輸出
- **分類日誌**: 不同模組使用不同前綴
- **安全輸出**: 輸出到 stderr 避免干擾 MCP 通信
- **編碼處理**: 自動處理中文字符編碼問題
**使用方式**:
```python
from .debug import server_debug_log as debug_log
debug_log("伺服器啟動完成") # [SERVER] 伺服器啟動完成
```
## 🎛️ 第二層:Web UI 管理層
### WebUIManager - 核心管理器
**單例模式實現**:
```python
class WebUIManager:
_instance: Optional['WebUIManager'] = None
_lock = threading.Lock()
def __new__(cls, *args, **kwargs):
if cls._instance is None:
with cls._lock:
if cls._instance is None:
cls._instance = super().__new__(cls)
return cls._instance
def __init__(self, host: str = "127.0.0.1", port: int = 0):
self.current_session: Optional[WebFeedbackSession] = None
self.global_active_tabs: Dict[str, dict] = {}
self.app: Optional[FastAPI] = None
self.server_thread: Optional[threading.Thread] = None
self.port_manager = PortManager()
```
**核心職責**:
- **會話管理**: 單一活躍會話的創建、更新、清理
- **服務器控制**: FastAPI 應用的啟動、停止、重啟
- **瀏覽器控制**: 智能開啟瀏覽器,避免重複視窗
- **資源管理**: 自動清理過期資源和錯誤處理
- **狀態同步**: 維護全局狀態和標籤頁追蹤
**關鍵方法**:
```python
async def create_session(self, project_dir: str, summary: str) -> str:
"""創建新會話或更新現有會話"""
async def smart_open_browser(self, url: str) -> bool:
"""智能開啟瀏覽器,檢測活躍標籤頁"""
def cleanup_session(self, reason: CleanupReason = CleanupReason.MANUAL):
"""清理會話資源"""
def get_server_url(self) -> str:
"""獲取服務器 URL"""
```
**智能瀏覽器開啟機制**:
```mermaid
flowchart TD
START[開啟瀏覽器請求] --> CHECK[檢查活躍標籤頁]
CHECK --> ACTIVE{有活躍標籤?}
ACTIVE -->|是| NOTIFY[發送會話更新通知]
ACTIVE -->|否| DETECT[檢測運行環境]
DETECT --> LOCAL{本地環境?}
LOCAL -->|是| DIRECT[直接開啟瀏覽器]
LOCAL -->|否| SSH{SSH Remote?}
SSH -->|是| TUNNEL[建立 SSH 隧道]
SSH -->|否| WSL[WSL 環境處理]
DIRECT --> SUCCESS[開啟成功]
TUNNEL --> SUCCESS
WSL --> SUCCESS
NOTIFY --> SUCCESS
SUCCESS --> TRACK[追蹤標籤頁狀態]
```
### WebFeedbackSession - 會話模型
**會話狀態機**:
```mermaid
stateDiagram-v2
[*] --> WAITING: 會話創建
WAITING --> FEEDBACK_PROCESSING: 用戶提交回饋
FEEDBACK_PROCESSING --> FEEDBACK_SUBMITTED: 處理完成
FEEDBACK_SUBMITTED --> WAITING: AI 再次調用
FEEDBACK_SUBMITTED --> CLEANUP: 會話結束
CLEANUP --> [*]: 資源釋放
WAITING --> TIMEOUT: 超時檢測
TIMEOUT --> CLEANUP: 清理資源
note right of WAITING
- 顯示 AI 摘要
- 等待用戶輸入
- 支援文字/圖片/命令
end note
note right of FEEDBACK_PROCESSING
- 驗證回饋數據
- 圖片壓縮處理
- 命令執行結果
end note
note right of FEEDBACK_SUBMITTED
- 回饋已保存
- 等待 AI 處理
- 準備下次調用
end note
```
**會話數據結構**:
```python
@dataclass
class WebFeedbackSession:
session_id: str
project_directory: str
summary: str
status: SessionStatus
created_at: datetime
timeout: int
feedback_future: Optional[asyncio.Future] = None
# 回饋數據
interactive_feedback: str = ""
command_logs: str = ""
images: List[Dict[str, Any]] = field(default_factory=list)
async def wait_for_feedback(self, timeout: int) -> Dict[str, Any]:
"""等待用戶回饋,支援超時處理"""
def update_session(self, project_dir: str, summary: str, timeout: int):
"""更新會話內容,支援 AI 多次調用"""
```
**狀態枚舉**:
```python
class SessionStatus(Enum):
WAITING = "waiting" # 等待用戶回饋
FEEDBACK_PROCESSING = "processing" # 處理回饋中
FEEDBACK_SUBMITTED = "submitted" # 回饋已提交
TIMEOUT = "timeout" # 會話超時
ERROR = "error" # 發生錯誤
```
### models/ - 數據模型層
**FeedbackResult 模型**:
```python
@dataclass
class FeedbackResult:
interactive_feedback: str = ""
command_logs: str = ""
images: List[Dict[str, Any]] = field(default_factory=list)
session_id: str = ""
timestamp: datetime = field(default_factory=datetime.now)
def to_mcp_response(self) -> List[Union[TextContent, MCPImage]]:
"""轉換為 MCP 協議格式"""
```
**CleanupReason 枚舉**:
```python
class CleanupReason(Enum):
TIMEOUT = "timeout" # 超時清理
MANUAL = "manual" # 手動清理
ERROR = "error" # 錯誤清理
SHUTDOWN = "shutdown" # 系統關閉
```
**WebSocket 消息模型**:
```python
@dataclass
class WebSocketMessage:
type: str # 消息類型
data: Dict[str, Any] # 消息數據
session_id: Optional[str] = None
timestamp: datetime = field(default_factory=datetime.now)
```
## 🌐 第三層:Web 服務層
### main.py - FastAPI 應用
**應用架構**:
```python
def create_app(manager: 'WebUIManager') -> FastAPI:
"""創建 FastAPI 應用實例"""
app = FastAPI(
title="MCP Feedback Enhanced",
description="AI 輔助開發回饋收集系統",
version="2.3.0"
)
# 設置中間件
setup_middleware(app)
# 設置路由
setup_routes(manager)
# 設置 WebSocket
setup_websocket(app, manager)
return app
```
**中間件配置**:
```python
def setup_middleware(app: FastAPI):
# CORS 設定 - 允許本地開發
app.add_middleware(
CORSMiddleware,
allow_origins=["http://127.0.0.1:*", "http://localhost:*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# 靜態文件服務
app.mount("/static", StaticFiles(directory="static"), name="static")
# 錯誤處理中間件
@app.exception_handler(Exception)
async def global_exception_handler(request, exc):
return JSONResponse(
status_code=500,
content={"detail": f"內部服務器錯誤: {str(exc)}"}
)
```
**核心功能**:
- **HTTP 路由處理**: RESTful API 端點
- **WebSocket 連接管理**: 實時雙向通信
- **靜態資源服務**: CSS、JS、圖片等資源
- **模板渲染**: Jinja2 模板引擎
- **錯誤處理**: 統一的異常處理機制
- **安全配置**: CORS 和安全標頭設定
### routes/main_routes.py - 路由處理
**路由架構圖**:
```mermaid
graph TB
subgraph "HTTP 路由"
ROOT[GET /
主頁重定向]
FEEDBACK[GET /feedback
回饋頁面]
API_SESSION[GET /api/session
會話資訊]
API_SETTINGS[GET/POST /api/settings
設定管理]
API_I18N[GET /api/i18n
翻譯資源]
STATIC[/static/*
靜態資源]
end
subgraph "WebSocket 路由"
WS[/ws
WebSocket 連接]
MSG_HANDLER[訊息處理器]
BROADCAST[廣播機制]
end
subgraph "API 端點"
SUBMIT[POST /api/submit-feedback
提交回饋]
COMMAND[POST /api/execute-command
執行命令]
UPLOAD[POST /api/upload-image
圖片上傳]
STATUS[GET /api/status
系統狀態]
end
ROOT --> FEEDBACK
FEEDBACK --> API_SESSION
WS --> MSG_HANDLER
MSG_HANDLER --> BROADCAST
SUBMIT --> MSG_HANDLER
COMMAND --> MSG_HANDLER
UPLOAD --> MSG_HANDLER
```
**主要路由端點**:
**頁面路由**:
```python
@app.get("/")
async def root():
"""主頁重定向到回饋頁面"""
return RedirectResponse(url="/feedback")
@app.get("/feedback")
async def feedback_page(request: Request):
"""回饋收集頁面"""
return templates.TemplateResponse("feedback.html", {
"request": request,
"project_directory": session.project_directory,
"layout_mode": load_user_layout_settings()
})
```
**API 路由**:
```python
@app.get("/api/session")
async def get_session():
"""獲取當前會話資訊"""
@app.post("/api/submit-feedback")
async def submit_feedback(feedback_data: dict):
"""提交用戶回饋"""
@app.post("/api/execute-command")
async def execute_command(command_data: dict):
"""執行用戶命令"""
@app.post("/api/upload-image")
async def upload_image(file: UploadFile):
"""處理圖片上傳"""
```
**WebSocket 訊息類型**:
- `connection_established`: 連接建立確認
- `session_updated`: 會話內容更新
- `submit_feedback`: 提交回饋數據
- `feedback_received`: 回饋接收確認
- `status_update`: 系統狀態更新
- `error_occurred`: 錯誤通知
- `command_result`: 命令執行結果
- `image_uploaded`: 圖片上傳完成
**WebSocket 連接管理**:
```python
@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
try:
while True:
data = await websocket.receive_json()
await handle_websocket_message(websocket, data)
except WebSocketDisconnect:
await handle_disconnect(websocket)
```
## 🎨 第四層:前端交互層
### 新功能模組架構
#### 提示詞管理模組群組 (prompt/)
**模組結構**:
```mermaid
graph TB
subgraph "提示詞管理模組"
PM[prompt-manager.js
核心管理器
CRUD 操作]
PMO[prompt-modal.js
彈窗組件
編輯界面]
PSU[prompt-settings-ui.js
設定頁面
列表管理]
PIB[prompt-input-buttons.js
輸入按鈕
快速選擇]
end
PM -->|提供數據| PMO
PM -->|提供數據| PSU
PM -->|提供數據| PIB
PMO -->|編輯操作| PM
PSU -->|管理操作| PM
PIB -->|使用操作| PM
```
**核心功能**:
- **PromptManager**: 提示詞的增刪改查、排序、自動提交標記
- **PromptModal**: 新增/編輯提示詞的彈窗界面
- **PromptSettingsUI**: 設定頁籤中的提示詞管理界面
- **PromptInputButtons**: 回饋輸入區的快速選擇按鈕
#### 會話管理模組群組 (session/) - v2.4.3 重構增強
**模組結構**:
```mermaid
graph TB
subgraph "會話管理模組(v2.4.3 重構)"
SM[session-manager.js
會話控制器
狀態管理]
SDM[session-data-manager.js
數據管理器
本地存儲增強]
SUR[session-ui-renderer.js
UI 渲染器
頁籤化設計]
SDM_MODAL[session-details-modal.js
詳情彈窗
會話詳細資訊]
end
SM -->|數據操作| SDM
SM -->|UI 渲染| SUR
SM -->|詳情顯示| SDM_MODAL
SDM -->|狀態回調| SM
SUR -->|用戶操作| SM
SDM_MODAL -->|查看操作| SM
```
**v2.4.3 重構亮點**:
- **從側邊欄遷移到頁籤**: 解決瀏覽器相容性問題
- **本地歷史存儲**: 支援 72 小時可配置保存期限
- **隱私控制**: 三級用戶訊息記錄設定(完整/基本/停用)
- **數據管理**: 匯出和清理功能
- **UI 重新設計**: 專門的渲染器和詳情彈窗
**核心功能**:
- **SessionManager**: 當前會話的狀態管理和控制
- **SessionDataManager**: 會話歷史記錄、統計數據和本地存儲管理
- **SessionUIRenderer**: 專門的 UI 渲染器,負責會話列表和狀態顯示
- **SessionDetailsModal**: 會話詳情彈窗,提供完整的會話資訊查看
#### 音效通知模組群組 (audio/) - v2.4.3 新增
**模組結構**:
```mermaid
graph TB
subgraph "音效通知系統(v2.4.3 新增)"
AM[audio-manager.js
音效管理器
播放控制]
ASU[audio-settings-ui.js
設定界面
音效配置]
DA[DefaultAudios
內建音效
Base64 編碼]
CA[CustomAudios
自訂音效
用戶上傳]
end
subgraph "Web Audio API"
AUDIO[Audio 物件]
BASE64[Base64 音效數據]
end
AM -->|管理界面| ASU
AM -->|內建音效| DA
AM -->|自訂音效| CA
AM -->|播放控制| AUDIO
AUDIO -->|數據來源| BASE64
ASU -->|設定保存| SettingsManager
```
**核心功能**:
- **AudioManager**: 音效播放控制、音量管理、音效選擇
- **AudioSettingsUI**: 音效設定界面、上傳管理、測試播放
- **內建音效**: 經典提示音、通知鈴聲、輕柔鐘聲
- **自訂音效**: 支援 MP3、WAV、OGG 格式上傳和管理
**技術特性**:
- **Web Audio API**: 使用原生 Audio 物件進行播放
- **Base64 存儲**: 音效文件以 Base64 格式存儲在 localStorage
- **音量控制**: 0-100% 可調節音量
- **瀏覽器相容性**: 處理自動播放政策限制
#### 智能記憶功能 - v2.4.3 新增
**輸入框高度管理**:
```mermaid
graph TB
subgraph "高度管理系統"
THM[TextareaHeightManager
高度管理器]
RO[ResizeObserver
尺寸監控]
DEBOUNCE[防抖機制
500ms 延遲]
end
subgraph "存儲機制"
SETTINGS[SettingsManager]
HEIGHT_KEY[combinedFeedbackTextHeight]
end
TEXTAREA[combinedFeedbackText] --> RO
RO --> THM
THM --> DEBOUNCE
DEBOUNCE --> SETTINGS
SETTINGS --> HEIGHT_KEY
THM -->|恢復高度| TEXTAREA
```
**一鍵複製功能**:
- **專案路徑複製**: 點擊路徑文字即可複製到剪貼簿
- **會話ID複製**: 點擊會話ID即可複製
- **複製反饋**: 視覺提示複製成功狀態
- **國際化支援**: 複製提示支援多語言
#### 自動提交功能整合
**整合架構**:
```mermaid
graph LR
subgraph "自動提交功能"
ASM[AutoSubmitManager
倒數計時器
狀態控制]
PM[PromptManager
提示詞選擇
自動標記]
SM[SettingsManager
設定存儲
配置管理]
end
ASM -->|選擇提示詞| PM
ASM -->|保存設定| SM
PM -->|提供提示詞| ASM
SM -->|載入設定| ASM
```
### templates/ - HTML 模板系統
**模板結構**:
```html