# 前端组件化 Phase 3 – 聊天区实时化 ## 阶段目标 1. 将 legacy `static/app.js` 中的聊天逻辑迁移到 Vue/Pinia,覆盖历史记录、实时消息、输入/工具/上传等能力。 2. 建立统一的状态/通知体系(用量、资源、toast/confirm),为后续样式统一和其它页面迁移打基础。 ## 交付进度 ### Step 1 – 历史消息 - `useChatStore` 加载 `/api/conversations//messages` 并在 ChatArea 显示历史记录,支持错误提示/滚动。 ### Step 2 – 实时通信 + 输入区 + 快捷菜单 - `useConnectionStore` 接入 `socket.io-client`,`useChatStore` 监听 `ai_message_start`/`thinking_*`/`text_*`/`ai_message_end`/工具事件并渲染流式内容。 - ChatArea 输入区支持 Ctrl+Enter 发送、停止按钮、快捷菜单(上传 & 工具开关),操作成功/失败都通过 toast 提示。 ### Step 3 – Token/资源面板 + 工具卡片/Markdown - `useResourceStore` + `TokenDrawer` 负责 Token/Quota/容器/存储可视化并定时轮询。 - MarkdownBlock 结合 `marked + prismjs` 渲染聊天内容/思考流,代码块支持高亮与复制。 - 工具事件在消息下方以卡片展示状态/提示/结果,彻底脱离 legacy DOM。 - `useToolStore` 管理 `/api/tool-settings`,QuickMenu UI 与上传入口迁至 Vue。 - 新的 `useUiStore` + `ToastStack/ConfirmDialog` 提供全局通知/确认,旧版 alert/confirm 正逐步替换。 ## 下一阶段计划 1. **工具卡片增强**:支持命令输出、文件 diff、错误详情等,匹配 legacy Tool UI。 2. **提示体系统一**:将所有 `pushToast`/`confirmAction` 调用迁到 Pinia store,统一文案与样式。 3. **右侧聚焦/个性化面板**:组件化 Focus Files 与 Personalization Drawer,与新聊天区联动。 4. **样式统一**:整理 CSS/变量,让 Token Drawer、聊天气泡、工具卡片等跟 legacy 视觉一致,避免层级堆叠。 5. **其它交互**:如滚动锁、终端入口、工具提示等,让新版 UI 完全覆盖旧版功能。 完成上述步骤后即可进入 Phase 4,重点处理聚焦面板、个性化设置、全局主题与其它页面。