--- 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 嵌套(水平 → 左侧垂直 + 右侧垂直)。重构为两层:水平(左对话 + 右侧)→ 右侧垂直(右上 + 右下)。左侧不再嵌套垂直 SplitPane,ChatView 直接占满左半屏。所有子视图(ChatView、WorkflowView、EvolutionView 等)代码零修改。 **KTD-3. 侧边导航改为 32px 图标模式,复用现有 QuadrantPanel 的 Tab 切换机制。** 点击导航图标时调用 QuadrantPanel 的 `setActiveTab()` 方法切换 Tab 并展开面板。导航状态通过 `activeNav` ref 与 QuadrantPanel 的 `activeTab` 双向同步。不引入新的路由机制。 **KTD-4. 交互增强使用 Vue 3 内置 `` 和 ``,配合现有 `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
55:45"] Left["左半屏
ChatView"] Right["右半屏"] VSplit["垂直 SplitPane
60:40"] TR["右上面板
代码/工作流/知识库"] BR["右下面板
监控/技能/设置"] Left --> HSplit Right --> HSplit TR --> VSplit BR --> VSplit VSplit --> Right end subgraph Theme["双主题"] Light["浅色 Token
:root"] Dark["暗色 Token
[data-theme=dark]"] Toggle["TopNav 切换按钮"] Toggle --> Light Toggle --> Dark end subgraph Interaction["交互增强"] Anim["过渡动画
Transition 组件"] Feedback["操作反馈
骨架屏/Toast"] Empty["空状态
品牌化插图"] Drag["拖拽增强
比例提示"] 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 嵌套结构:移除左侧垂直 SplitPane,ChatView 直接作为水平 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 `` 包裹 body 区域,应用 `collapse` 动画类 - Tab 切换:使用 Vue `` 包裹 content 区域,应用 `fade` 动画类 - ChatView 消息列表:使用 `` 包裹消息列表,应用 `stagger-list` 动画类 - 路由切换:使用 `` 包裹 ``,应用 `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 通知 - 加载状态显示骨架屏而非 `` - 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 通用组件:接受 icon(Ant Design 图标组件)、title、description、action(可选操作按钮)三个 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 加速 |