agent-Specialization/doc/frontend/componentization_plan.md

86 lines
7.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 前端专业化重构作业计划(持续进行中)
> 目标:在保持 `static/old_version_backup/前端备份` 视觉与交互 100% 还原的前提下,完成基于 Vite + Vue 3 + Pinia 的组件化重写。本文为后续接手者提供当前进度与下一步任务拆解。
## 当前进展202511
1. **模板与逻辑彻底迁移**:原 `index.html + app.js` DOM/方法已全部拆到 `static/src/App.vue` 及 Pinia store/composables`static/src/app.ts` 仅保留少数兼容辅助。根 HTML 只负责挂载点、复制脚本与安全脚本。
2. **全量 Pinia + 组合式 API**:连接、会话、聊天、文件/聚焦、资源、工具、个性化、子智能体、UI 等状态均落在 `static/src/stores/**``useLegacySocket`、`useMarkdownRenderer`、`useUploadStore`、`useEasterEgg` 等组合式函数负责跨模块逻辑。
3. **全局壳层完成组件化**`AppShell.vue` 托管 ToastStack、ConfirmDialog、QuotaToast、EasterEggOverlay、ContextMenu聊天区、输入区、Quick Menu、TokenDrawer、RightFocusPanel、PersonalizationDrawer、ActionBlock 系列全为独立组件。
4. **样式模块化完结**`static/src/styles/` 以 base/layout/components/utilities 分层,`npm run build` 输出 `static/dist/assets/main.css``static/style.css` 退化为对该文件的 `@import`,旧版真值迁至 `static/old_version_backup/前端备份`
5. **构建/依赖稳定**Vite 5 + Vue 3 + Pinia + Sass 作为唯一真值,`npm run build`、`npm run dev` 可直接产出最新 UIKaTeX/Prism/Socket.IO 通过 npm/ESM 管理。
## 架构索引(按模块划分)
### 1. Store 分层Pinia已落地
| Store | 数据来源(原 data 字段) | 关键方法/事件 |
| --- | --- | --- |
| `useConnectionStore` | `isConnected`, `socket`, `stopRequested` | `initSocket`, `disconnect`, Stop 按钮/事件处理 |
| `useSystemStore` | `projectPath`, `agentVersion`, `thinkingMode` | `fetchStatus`, `toggleThinkingMode` |
| `useConversationStore` | `conversations*`, `currentConversationId`, `currentConversationTitle`, `searchQuery`, `hasMoreConversations` | 对话 CRUD、搜索、加载更多、路由同步 |
| `useChatStore` | `messages`, `streamingMessage`, `expandedBlocks`, `thinkingScrollLocks`, `autoScrollEnabled`, `userScrolling` | 消息渲染、滚动锁、append/modify/system 块渲染、socket 事件映射 |
| `useFileStore` | `fileTree`, `expandedFolders`, `focusedFiles`, `contextMenu` | 文件树加载、右键菜单、聚焦/下载等 |
| `useResourceStore` | `tokenPanelCollapsed`, `currentContextTokens`, `currentConversationTokens`, `usageQuota`, `projectStorage`, `containerStatus`, `polling timer` | Token/Quota/Storage/容器轮询与渲染 |
| `useToolStore` | `preparingTools`, `activeTools`, `toolActionIndex`, `toolStacks`, `toolSettings*`, `toolMenuOpen` | Quick Menu、工具禁用面板、流式工具卡片 |
| `useUiStore` | `sidebarCollapsed`, `leftWidth`, `rightWidth`, `rightCollapsed`, `isResizing`, `panelMode`, `panelMenuOpen`, `settingsOpen`, `quickMenuOpen`, `toastQueue`, `confirmDialog`, `easterEgg` | 面板布局、Toast/Confirm、彩蛋生命周期 |
| `usePersonalizationStore` | `personalPageVisible`, `personalization*`, `tonePresets`, `newConsideration`, `draggedConsiderationIndex` | 个人空间表单/拖拽/保存 |
| `useSubAgentStore` | `subAgents`, `subAgentPollTimer` | 子智能体轮询 |
> 源码位于 `static/src/stores/`,组合式函数位于 `static/src/composables/`,如 `useLegacySocket.ts`、`useMarkdownRenderer.ts`、`useUploadStore.ts`。
### 2. 组件切分(全部完成,可按需继续细分)
1. **全局壳层**`AppShell.vue` 负责 ToastStack、ConfirmDialog、EasterEggOverlay、ContextMenu内部 slot 负责主布局。
2. **侧边栏**`ConversationSidebar.vue`(对话列表 + 搜索 + 按钮)、`ConversationList.vue`、`ConversationItem.vue`。
3. **三合一面板**`LeftPanel.vue`Logo 卡、模式切换)、`PanelSwitcher.vue`、`FileTreePanel.vue`(内含 `FileNode`)、`TodoPanel.vue`、`SubAgentPanel.vue`。
4. **聊天区域**`ChatArea.vue`、`MessageList.vue`、`MessageItem.vue`、`ActionBlock` 系列thinking/text/tool/append/modify/system
5. **输入区**`InputComposer.vue`、`QuickMenu.vue`、`ToolToggleMenu.vue`、`SettingsMenu.vue`、`UploadButton.vue`。
6. **右侧聚焦**`RightFocusPanel.vue`、`FocusedFileCard.vue`、`ScrollLockButton.vue`。
7. **资源/统计**`TokenDrawer.vue`、`ResourceStats.vue`、`UsageDashboard.vue`。
8. **个人空间**`PersonalizationDrawer.vue`、`TonePresetList.vue` 等。
所有组件均在 `static/src/components/` 下维护。若新增模块,沿用同一拆分策略:先从壳层/侧栏等低耦合区域着手,再处理聊天与输入区,最终迁移全局遮罩和抽屉。
### 3. 逻辑剥离 & Composable已落地
- **Socket 管理**`useLegacySocket()` 负责事件绑定/解绑并分发至 Pinia。
- **滚动/尺寸**`useAutoScroll()`、`useResizeHandles()` 等组合式函数维护滚动锁、面板拖拽。
- **彩蛋系统**`useEasterEgg()` 封装 `handleEasterEggPayload`、`startEasterEggEffect`。
- **工具/Markdown**`useToolActions()`、`useMarkdownRenderer()` 解析工具栈、思考文本、代码块复制。
### 4. 样式模块化(已落地)
- `static/src/styles/``base/`、`layout/`、`components/`、`utilities/` 四层维护 SCSS`main.ts` 统一导入 `./styles/index.scss`
- `npm run build` 输出 `static/dist/assets/main.css``static/style.css` 仅 `@import` 该文件以兼容旧 URL。
- 旧版 CSS 仍保存在 `static/old_version_backup/前端备份/style.css` 供视觉对照。
### 5. 验证清单
1. `npm run build`
2. 手动测试:
- 对话切换、搜索、加载更多
- Token/Quota 更新、Stop 按钮、思考块折叠
- Quick Menu上传文件、工具禁用、模式切换、设置子菜单动作
- 聚焦面板联动、锁定滚动按钮
- 个人空间开启/保存/拖动
- 子智能体轮询与卡片展示
- 彩蛋触发与结束
- Append/Modify/System 块渲染 & 复制代码按钮
## 注意事项
- 保持与旧版一致的 API/Socket contract不要修改后端接口。
- 所有按钮的 `title/aria-label` 均需保留。
- `window.ensureCsrfToken`、`window.requestSocketToken`、`EasterEggRegistry` 等全局对象仍由后端注入,前端需防御其缺失。
- 在组件化过程中,务必维持 `state -> UI` 的单向数据流,避免在多个组件中直接 mutate 同一对象,可通过 store action 统一更改。
> 如需快速定位旧逻辑,可在 `static/src/app.ts` 搜索原方法名称;拆分完成后再逐步删除未使用的段落,直至 `app.ts` 不再作为兼容入口。
## 后续关注
1. **卫星页面重写**:登录/注册/终端/资源忙碌等页面仍在 `static/old_version_backup/`,后续若需要统一体验,可按本文架构另建轻量 Vue 入口。
2. **文件管理器现代化**`static/file_manager/` 仍为独立 HTML/JS可先迁移 API 调用,再视情况接入 Pinia。
3. **自动化验证**:目前主要依靠手测,建议补充组件单测或端到端脚本覆盖 Quick Menu、上传、彩蛋等关键链路。
4. **性能与可 observability**:随着样式模块化完成,可继续引入 bundle 分析、监控指标,确保未来扩展更易诊断。