# Phase 5:前端集成 日期:2026-04-04 状态:待实施 依赖:Phase 4 完成 --- ## 1. 本阶段目的 Vue 前端新增代码指挥官 UI: - 页面组件 - 终端显示组件 - WebSocket 服务 - 路由配置 --- ## 2. 详细任务 ### 2.1 页面组件 **新文件**: `frontend/src/pages/chat/CodeCommander.vue` ```vue 选择 AI 助手 {{ p.name }} {{ isExecuting ? '执行中...' : '开始执行' }} {{ inputPrompt }} 下载文件 清理 ``` ### 2.2 终端显示组件 **新文件**: `frontend/src/components/TerminalDisplay.vue` ```vue ``` ### 2.3 WebSocket 服务 **新文件**: `frontend/src/services/terminalWs.ts` ```typescript type MessageHandler = (msg: StreamMessage) => void interface StreamMessage { type: 'output' | 'error' | 'status' | 'waiting_input' | 'complete' session_id: string data: string timestamp: string } class TerminalWsService { private ws: WebSocket | null = null private sessionId: string | null = null private handlers: MessageHandler[] = [] private reconnectAttempts = 0 private maxReconnectAttempts = 5 async connect(provider: string): Promise { // 创建会话 const response = await fetch('/api/code-commander/sessions', { method: 'POST', body: JSON.stringify({ provider }), }) const { session_id } = await response.json() // 建立 WebSocket this.ws = new WebSocket(`ws://localhost:8000/ws/terminal/${session_id}`) this.ws.onmessage = (event) => { const msg: StreamMessage = JSON.parse(event.data) this.handlers.forEach((h) => h(msg)) } this.ws.onclose = () => { this.attemptReconnect() } this.sessionId = session_id return session_id } async sendTask(sessionId: string, prompt: string) { await fetch(`/api/code-commander/sessions/${sessionId}/task`, { method: 'POST', body: JSON.stringify({ prompt }), }) } sendInput(sessionId: string, input: string) { this.ws?.send(JSON.stringify({ type: 'input', data: input })) } onMessage(handler: MessageHandler) { this.handlers.push(handler) } removeHandler(handler: MessageHandler) { this.handlers = this.handlers.filter((h) => h !== handler) } async disconnect(sessionId: string) { await fetch(`/api/code-commander/sessions/${sessionId}`, { method: 'DELETE', }) this.ws?.close() this.ws = null this.sessionId = null } private async attemptReconnect() { if (this.reconnectAttempts >= this.maxReconnectAttempts) { return } this.reconnectAttempts++ await new Promise((r) => setTimeout(r, 1000 * this.reconnectAttempts)) // 重新连接 } } export const terminalWsService = new TerminalWsService() ``` ### 2.4 路由配置 **文件**: `frontend/src/router/index.ts` ```typescript { path: '/code-commander', name: 'CodeCommander', component: () => import('@/pages/chat/CodeCommander.vue'), } ``` --- ## 3. 核心文件清单 | 文件 | 操作 | 说明 | |------|------|------| | `CodeCommander.vue` | 新增 | 主页面组件 | | `TerminalDisplay.vue` | 新增 | 终端显示组件(xterm.js) | | `terminalWs.ts` | 新增 | WebSocket 服务 | | `router/index.ts` | 修改 | 新增路由 | --- ## 4. 验收标准 - [ ] 用户可以选择 AI 提供商 - [ ] 可以输入任务描述并执行 - [ ] 终端实时显示 AI 输出 - [ ] 用户可以输入交互(如 "y") - [ ] 可以下载和清理文件 --- ## 5. 依赖 | 依赖 | 版本 | 用途 | |------|------|------| | xterm | ^5.x | 终端渲染 | | xterm-addon-fit | ^0.8.x | 自适应大小 | --- ## 6. 依赖关系 ``` Phase 4(流式交互) ↓ 本阶段(前端集成)→ 端到端测试 ```