7af8812e26
add memory and disk monitoring cards with richer server metrics and localized labels in the workspace status panel group ssh terminal tabs by server with per-group add actions to make multi-terminal relationships clearer sync helloagents archive and module documentation for the completed workspace updates
3.9 KiB
3.9 KiB
变更提案: ssh-connection-multi-terminal
元信息
类型: 功能增强
方案类型: implementation
优先级: P1
状态: 已完成
状态说明: 已完成实现,前端构建验证通过
创建: 2026-03-25
1. 需求
背景
当前工作区顶部标签栏以“全局会话”为主视角。虽然前端和后端都允许对同一 SSH 连接重复创建多个会话,但交互上仍然表现为“打开一个服务器就是一个标签”,缺少“某个服务器连接内部继续新增多个终端”的直观模型,和参考界面中的单连接多终端体验不一致。
目标
- 仅针对
SSH连接实现“单个服务器连接下支持多个终端”。 - 用户首次打开某个服务器时,默认只创建 1 个终端。
- 在该服务器已打开后,允许继续新增该服务器下的第 2、第 3 ... 个终端。
- 顶部标签栏交互向“连接内多终端”靠拢,但保持当前项目的整体视觉和工作区结构。
约束条件
范围约束: 仅改 SSH 会话组织和标签栏交互,不改 RDP/VNC 行为
架构约束: 复用现有 Vue 3 + Pinia + WebSocket + xterm 链路,不引入新状态库
协议约束: 不新增后端 SSH 协议消息,优先复用现有“一次会话对应一个 WebSocket/SSH session”模型
兼容约束: 不破坏现有工作区布局、文件管理、编辑器、SSH 挂起和状态监控能力
验收标准
- 首次点击某个 SSH 连接时,只打开 1 个终端实例
- 已打开的 SSH 连接可继续新增同连接下的多个终端实例
- 标签栏能清晰区分“连接”与“该连接下的终端序号/实例”
- 关闭某个终端时,不影响同连接下其他终端继续使用
packages/frontend构建通过,核心类型链闭合
2. 方案
技术方案
延续现有“一个终端实例对应一个独立 SessionState / WebSocket / SSH session”的实现,不修改后端协议和 SSH handler。前端新增“连接分组视角”作为展示层:为每个 SSH 会话补充分组元数据和终端序号,通过新的 getter 将全局会话整理为“按连接聚合的终端组”,再由 TerminalTabBar 基于该聚合结果渲染标签。默认点击连接仍只创建一个终端;当当前激活的是 SSH 连接组时,可在标签栏直接为该连接追加新终端。这样既满足单连接多终端体验,又避免重写后端会话模型。
影响范围
涉及模块:
- frontend: session store、WorkspaceView、TerminalTabBar、i18n、类型定义
- backend: 原则上无协议改动,仅做兼容性核查
预计变更文件: 6-10
风险评估
| 风险 | 等级 | 应对 |
|---|---|---|
| 全局标签排序逻辑与连接分组排序冲突 | 中 | 将排序收口到 session getter,保留现有 localStorage 顺序语义 |
旧代码仍按 sessionId -> 标签 直读,导致 UI 状态不一致 |
中 | 统一从 store getter 导出分组标签模型,避免组件各自拼装 |
| 新增同连接终端后命令、文件管理、挂起状态误串组 | 低 | 保持底层仍按独立 sessionId 路由,分组只存在于展示层 |
3. 技术决策
ssh-connection-multi-terminal#D001: 复用现有独立 session 模型,只在前端增加连接分组层
日期: 2026-03-25
状态: ✅采纳
决策: 不改后端 SSH 协议和会话状态结构,继续保持“一个终端实例 = 一个独立 SSH session”,仅在前端用连接分组和终端序号实现“单连接多终端”体验。
理由: 当前后端已经支持同一连接重复建立多个 SSH session,瓶颈在交互组织而非协议能力。前端分组方案改动更小、回滚边界更清晰,也不会引入 RDP/VNC 连带回归。
影响: 主要影响 session.store、TerminalTabBar.vue、WorkspaceView.vue 和相关类型/i18n;后端仅需保持现有多 session 行为不退化。