fischer-agentkit/docs/plans/2026-06-13-001-feat-gui-pro...

383 lines
16 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.

---
date: "2026-06-13"
status: active
origin: docs/brainstorms/2026-06-13-gui-productization-requirements.md
---
## Summary
对 Fischer AgentKit GUI 进行产品级提升,三线并行:布局重构为「左对话 + 右双栏」、建立双主题设计系统、增强交互体验。分 3 个迭代交付。
## Problem Frame
当前 GUI 处于"功能可用但体验粗糙"状态:四象限等分布局让对话空间被压缩到 1/4 屏幕Design Token 体系仅覆盖浅色主题,暗色主题缺失;无过渡动画、操作无反馈、空状态单调。需要从布局、视觉、交互三个维度全面提升到产品级。
## Key Technical Decisions
**KTD-1. 暗色主题通过 `[data-theme="dark"]` 选择器切换,而非独立 CSS 文件。**
现有 `tokens.css``:root` 上定义了约 80 个 token。暗色主题在 `[data-theme="dark"]` 选择器上覆盖同名变量,切换时只需修改 `document.documentElement.dataset.theme`。这保持了 CSS 变量为唯一真实来源Ant Design Vue 主题通过 `readToken()` 运行时自动跟随。无需引入 CSS-in-JS 主题切换或独立 CSS 文件。
**KTD-2. 布局重构通过调整 AgentLayout 的 SplitPane 嵌套结构实现,不修改子视图。**
当前 AgentLayout 使用三层 SplitPane 嵌套(水平 → 左侧垂直 + 右侧垂直)。重构为两层:水平(左对话 + 右侧)→ 右侧垂直(右上 + 右下)。左侧不再嵌套垂直 SplitPaneChatView 直接占满左半屏。所有子视图ChatView、WorkflowView、EvolutionView 等)代码零修改。
**KTD-3. 侧边导航改为 32px 图标模式,复用现有 QuadrantPanel 的 Tab 切换机制。**
点击导航图标时调用 QuadrantPanel 的 `setActiveTab()` 方法切换 Tab 并展开面板。导航状态通过 `activeNav` ref 与 QuadrantPanel 的 `activeTab` 双向同步。不引入新的路由机制。
**KTD-4. 交互增强使用 Vue 3 内置 `<Transition>` 和 `<TransitionGroup>`,配合现有 `transitions.css` 定义的动画类。**
现有 `transitions.css` 已定义 7 种动画类fade、slide-up、slide-down、slide-right、collapse、scale、stagger-list和 3 种关键帧动画skeleton-pulse、pulse-dot、gentle-bounce。交互增强直接复用这些动画类不引入第三方动画库。
---
## High-Level Technical Design
```mermaid
flowchart LR
subgraph Layout["布局重构"]
HSplit["水平 SplitPane<br/>55:45"]
Left["左半屏<br/>ChatView"]
Right["右半屏"]
VSplit["垂直 SplitPane<br/>60:40"]
TR["右上面板<br/>代码/工作流/知识库"]
BR["右下面板<br/>监控/技能/设置"]
Left --> HSplit
Right --> HSplit
TR --> VSplit
BR --> VSplit
VSplit --> Right
end
subgraph Theme["双主题"]
Light["浅色 Token<br/>:root"]
Dark["暗色 Token<br/>[data-theme=dark]"]
Toggle["TopNav 切换按钮"]
Toggle --> Light
Toggle --> Dark
end
subgraph Interaction["交互增强"]
Anim["过渡动画<br/>Transition 组件"]
Feedback["操作反馈<br/>骨架屏/Toast"]
Empty["空状态<br/>品牌化插图"]
Drag["拖拽增强<br/>比例提示"]
end
```
---
## Requirements Traceability
| Origin R-ID | Plan Coverage |
|---|---|
| R1. 左对话 + 右双栏布局 | U1 |
| R2. 面板折叠为 Tab 栏 | U1 (QuadrantPanel 已支持,调整默认行为) |
| R3. 侧边导航精简为图标模式 | U2 |
| R4. Design Token 体系基础 | U3 (已有基础,补充暗色 token) |
| R5. 小屏幕适配 | U1 (调整 responsive.css 断点) |
| R6. 暗色主题 | U3 |
| R7. 组件样式统一 | U4 |
| R8. 过渡动画 | U5 |
| R9. 操作反馈 | U6 |
| R10. 空状态设计 | U7 |
| R11. 拖拽交互增强 | U8 |
---
## Implementation Units
### 迭代 1布局骨架 + 暗色主题
### U1. AgentLayout 布局重构
**Goal:** 将四象限等分布局重构为「左对话 + 右双栏」布局。
**Requirements:** R1, R2, R5
**Dependencies:**
**Files:**
- `src/agentkit/server/frontend/src/components/layout/AgentLayout.vue` (修改)
- `src/agentkit/server/frontend/src/styles/responsive.css` (修改)
- `src/agentkit/server/frontend/src/router/index.ts` (修改)
**Approach:**
- 修改 AgentLayout 的 SplitPane 嵌套结构:移除左侧垂直 SplitPaneChatView 直接作为水平 SplitPane 的 first slot
- 右侧保留垂直 SplitPane右上 + 右下),与当前相同
- 调整水平 SplitPane 默认比例为 55:45左:右)
- 调整路由:移除 `agent-terminal` 路由(终端不再作为独立象限),终端功能可通过右侧面板 Tab 访问
- 调整 responsive.css 断点:小屏幕阈值从 1280px 调整为 1024px
- QuadrantPanel 的折叠功能已实现,无需修改
**Patterns to follow:** 现有 SplitPane + QuadrantPanel 嵌套模式
**Test scenarios:**
- 页面加载后左半屏显示 ChatView右半屏上下分割为代码/工作流和监控
- 左右分割线可拖拽,默认比例 55:45
- 右侧上下分割线可拖拽,默认比例 60:40
- 分割比例保存到 localStorage刷新后恢复
- 右上面板可折叠为 Tab 栏
- 右下面板可折叠为 Tab 栏
- 两个面板同时折叠后对话面板获得最大空间
- 屏幕宽度 < 1024px 时显示小屏幕提示
- 旧路由 `/terminal` 重定向正确
**Verification:** 打开 GUI 后左半屏是对话右半屏上下分割拖拽和折叠功能正常
### U2. 侧边导航精简为图标模式
**Goal:** 将侧边导航精简为 32px 宽的图标导航点击切换右侧面板 Tab
**Requirements:** R3
**Dependencies:** U1
**Files:**
- `src/agentkit/server/frontend/src/components/layout/AgentLayout.vue` (修改)
- `src/agentkit/server/frontend/src/components/layout/TopNav.vue` (修改)
**Approach:**
- AgentLayout 的水平 SplitPane 之前添加 32px 宽的图标导航栏
- 导航项对话MessageOutlined)、工作流ApartmentOutlined)、知识库BookOutlined)、技能AppstoreOutlined)、监控DashboardOutlined)、设置SettingOutlined
- 点击导航图标时调用对应 QuadrantPanel `setActiveTab()` 方法并展开面板
- 当前激活的导航图标高亮显示使用 `--color-primary`
- TopNav 添加导航栏折叠/展开按钮
- 导航栏折叠时宽度为 0px展开时为 32px
- 导航状态与路由同步
**Patterns to follow:** QuadrantPanel `setActiveTab()` 方法
**Test scenarios:**
- 导航栏显示 6 个图标宽度 32px
- 点击工作流图标 右上面板切换到工作流 Tab 并展开
- 点击监控图标 右下面板切换到监控 Tab 并展开
- 点击对话图标 聚焦左侧对话面板
- 当前激活图标高亮
- TopNav 按钮可折叠/展开导航栏
- 折叠后导航栏宽度为 0px
**Verification:** 导航栏图标可切换右侧面板内容折叠/展开正常
### U3. 暗色主题 Token 定义与切换
**Goal:** 在现有浅色 Token 基础上新增暗色主题 Token支持一键切换
**Requirements:** R4, R6
**Dependencies:**
**Files:**
- `src/agentkit/server/frontend/src/styles/tokens.css` (修改 添加 `[data-theme="dark"]` )
- `src/agentkit/server/frontend/src/styles/theme.ts` (修改 暗色主题 Ant Design 映射)
- `src/agentkit/server/frontend/src/components/layout/TopNav.vue` (修改 添加主题切换按钮)
- `src/agentkit/server/frontend/src/stores/theme.ts` (新建 主题状态管理)
**Approach:**
- `tokens.css` 末尾添加 `[data-theme="dark"]` 选择器块覆盖所有颜色相关 token背景文本边框主色语义色灰色阶代码色
- 暗色主题配色深色背景#1a1a2e 系列)、荧光强调色保持 Indigo 主色但调亮)、终端原生感
- 新建 `stores/theme.ts`管理主题状态`light`/`dark`切换时修改 `document.documentElement.dataset.theme`偏好保存到 localStorage
- TopNav 添加太阳/月亮图标切换按钮
- `theme.ts` 中的 `readToken()` 已在运行时从 CSS 变量读取暗色 token 覆盖后 Ant Design 主题自动跟随
**Patterns to follow:** 现有 `tokens.css` `:root` 定义模式`theme.ts` `readToken()` 模式
**Test scenarios:**
- 点击 TopNav 月亮图标 界面切换到暗色主题
- 点击太阳图标 切换回浅色主题
- 暗色主题下所有组件正常显示文字可读边框可见按钮可点击
- 暗色主题下 Ant Design 组件按钮输入框下拉框模态框正常显示
- 主题偏好保存到 localStorage刷新后保持
- 代码块在暗色主题下使用暗色代码配色
**Verification:** 主题切换按钮可用两种主题下所有界面元素正常显示
---
### 迭代 2组件样式统一
### U4. 组件样式统一与 Ant Design 覆盖清理
**Goal:** 所有组件统一引用 Design Token清理 App.vue 中的 `!important` 覆盖
**Requirements:** R7
**Dependencies:** U3
**Files:**
- `src/agentkit/server/frontend/src/App.vue` (修改 清理全局覆盖)
- `src/agentkit/server/frontend/src/components/layout/SideNav.vue` (修改 迁移到 token)
- `src/agentkit/server/frontend/src/styles/theme.ts` (修改 增强组件级 token 映射)
- 各组件 scoped 样式中的硬编码值 (修改 替换为 token 引用)
**Approach:**
- App.vue 中的 `.ant-btn`、`.ant-card` 等全局覆盖迁移到 `theme.ts` 的组件级 token 映射中消除 `!important`
- SideNav.vue 的硬编码 `rgba()` 值替换为 token 引用
- 扫描所有组件 scoped 样式中的硬编码颜色/间距值替换为 token 引用
- 主色统一为 `--color-primary`消除 `#1677ff`/`#1890ff` 残留
**Patterns to follow:** `theme.ts` 的组件级 token 映射模式
**Test scenarios:**
- App.vue 中无 `!important` 覆盖
- 所有组件 scoped 样式中无硬编码颜色值
- 浅色和暗色主题下所有组件样式一致
- Ant Design 组件按钮卡片标签模态框选择框圆角和间距统一
**Verification:** 搜索代码中无硬编码颜色值 token 定义文件外两种主题下样式一致
---
### 迭代 3交互增强
### U5. 过渡动画
**Goal:** 为所有交互添加过渡动画
**Requirements:** R8
**Dependencies:** U1
**Files:**
- `src/agentkit/server/frontend/src/components/layout/QuadrantPanel.vue` (修改 折叠/展开动画)
- `src/agentkit/server/frontend/src/components/layout/AgentLayout.vue` (修改 Tab 切换动画)
- `src/agentkit/server/frontend/src/views/ChatView.vue` (修改 消息列表动画)
- `src/agentkit/server/frontend/src/styles/transitions.css` (修改 如需新增动画类)
**Approach:**
- QuadrantPanel 折叠/展开使用 Vue `<Transition>` 包裹 body 区域应用 `collapse` 动画类
- Tab 切换使用 Vue `<Transition>` 包裹 content 区域应用 `fade` 动画类
- ChatView 消息列表使用 `<TransitionGroup>` 包裹消息列表应用 `stagger-list` 动画类
- 路由切换使用 `<Transition>` 包裹 `<router-view>`应用 `fade` 动画类
**Patterns to follow:** 现有 `transitions.css` 定义的动画类
**Test scenarios:**
- 面板折叠/展开有平滑过渡200ms ease
- Tab 切换有淡入淡出150ms
- 新消息出现有交错渐入效果
- 动画不影响操作响应速度
**Verification:** 所有交互有流畅的过渡动画无生硬切换
### U6. 操作反馈
**Goal:** 为用户操作提供即时反馈
**Requirements:** R9
**Dependencies:** U1
**Files:**
- `src/agentkit/server/frontend/src/components/common/AppToast.vue` (新建 Toast 通知组件)
- `src/agentkit/server/frontend/src/components/common/SkeletonLoader.vue` (新建 骨架屏组件)
- `src/agentkit/server/frontend/src/components/layout/TopNav.vue` (修改 WebSocket 断连横幅)
- `src/agentkit/server/frontend/src/stores/chat.ts` (修改 使用 Toast 替代错误提示)
**Approach:**
- 新建 AppToast 组件基于 Ant Design Vue `message` API 封装支持 success/error/warning/info 四种类型
- 新建 SkeletonLoader 组件使用现有 `skeleton-pulse` 关键帧动画支持不同形状文本/卡片/列表
- TopNav 添加 WebSocket 断连横幅使用 `slide-down` 动画类
- chat.ts 中的错误提示从 `console.error` 改为 Toast 通知
**Patterns to follow:** 现有 `transitions.css` `skeleton-pulse` 动画
**Test scenarios:**
- 操作成功时显示绿色 Toast 通知
- 操作失败时显示红色 Toast 通知
- 加载状态显示骨架屏而非 `<a-spin>`
- WebSocket 断连时顶部显示黄色横幅
- 重连后横幅自动消失
**Verification:** 所有操作有即时视觉反馈
### U7. 空状态设计
**Goal:** 为所有空状态提供品牌化插图和引导文案
**Requirements:** R10
**Dependencies:** U1
**Files:**
- `src/agentkit/server/frontend/src/components/common/EmptyState.vue` (新建 通用空状态组件)
- `src/agentkit/server/frontend/src/views/ChatView.vue` (修改 对话空状态)
- `src/agentkit/server/frontend/src/views/WorkflowView.vue` (修改 工作流空状态)
- `src/agentkit/server/frontend/src/views/EvolutionView.vue` (修改 监控空状态)
- `src/agentkit/server/frontend/src/views/KnowledgeBaseView.vue` (修改 知识库空状态)
- `src/agentkit/server/frontend/src/views/SkillsView.vue` (修改 技能空状态)
**Approach:**
- 新建 EmptyState 通用组件接受 iconAnt Design 图标组件)、titledescriptionaction可选操作按钮三个 props
- 各视图的空状态使用 EmptyState 组件替换当前的纯文字提示
- 对话空状态MessageOutlined + "开始对话" + "输入消息与 Agent 交互"
- 工作流空状态ApartmentOutlined + "创建工作流" + "拖拽节点构建自动化流程"
- 监控空状态DashboardOutlined + "暂无监控数据" + "执行任务后数据将自动更新"
- 知识库空状态BookOutlined + "添加知识源" + "上传文档或配置外部知识库"
- 技能空状态AppstoreOutlined + "注册技能" + "通过 YAML 配置定义技能"
**Patterns to follow:** Ant Design Vue `a-empty` 组件模式
**Test scenarios:**
- 新用户打开对话页面显示空状态引导
- 工作流列表为空时显示空状态引导
- 监控数据为空时显示空状态引导
- 空状态组件在浅色和暗色主题下正常显示
**Verification:** 所有空状态有品牌化插图和引导文案
### U8. 拖拽交互增强
**Goal:** 优化拖拽操作的视觉反馈
**Requirements:** R11
**Dependencies:** U1
**Files:**
- `src/agentkit/server/frontend/src/components/layout/SplitPane.vue` (修改 拖拽比例提示)
- `src/agentkit/server/frontend/src/views/WorkflowView.vue` (修改 节点拖拽预览 FlowCanvas 支持)
**Approach:**
- SplitPane 拖拽时在分割线旁显示当前比例百分比 "55%"拖拽结束后淡出
- SplitPane 拖拽时分割线高亮加粗 2px 4px颜色从 `--border-color` 变为 `--color-primary`
- 工作流节点拖拽如果 Vue Flow 支持自定义拖拽预览添加放置预览指示
**Patterns to follow:** 现有 SplitPane 的拖拽处理模式
**Test scenarios:**
- 拖拽分割线时显示当前比例百分比
- 拖拽时分割线高亮加粗
- 拖拽结束后比例提示淡出
- 键盘调整分割线时也显示比例提示
**Verification:** 拖拽操作有清晰的视觉反馈
---
## Scope Boundaries
**Deferred to follow-up work:**
- 代码 Diff 查看器实现右上代码Tab 仍为占位
- Cmd+K 内联编辑
- @-mention 上下文引用
- 响应式移动端适配
- SideNav (Legacy) 组件迁移AppLayout 保留作为回退
**Outside this product's identity:**
- 多用户协作/实时协同编辑
- 插件市场
- 代码编辑器只读预览
---
## Risks & Dependencies
| Risk | Impact | Mitigation |
|------|--------|-----------|
| 暗色主题 token 覆盖不完整 | 部分组件在暗色下显示异常 | 逐组件验证优先覆盖高频组件 |
| Ant Design Vue 4.x CSS-in-JS 主题跟随 | 暗色切换后 Ant 组件可能不跟随 | `readToken()` 运行时读取确保跟随需验证 |
| 布局重构影响子视图高度计算 | 子视图内容溢出或空白 | 子视图使用 `height: 100%` + `overflow: auto` |
| 过渡动画性能 | 大量 DOM 操作时卡顿 | 使用 CSS transform/opacity 触发 GPU 加速 |