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
73 lines
3.9 KiB
Markdown
73 lines
3.9 KiB
Markdown
# 变更提案: ssh-connection-multi-terminal
|
|
|
|
## 元信息
|
|
```yaml
|
|
类型: 功能增强
|
|
方案类型: implementation
|
|
优先级: P1
|
|
状态: 已完成
|
|
状态说明: 已完成实现,前端构建验证通过
|
|
创建: 2026-03-25
|
|
```
|
|
|
|
---
|
|
|
|
## 1. 需求
|
|
|
|
### 背景
|
|
当前工作区顶部标签栏以“全局会话”为主视角。虽然前端和后端都允许对同一 SSH 连接重复创建多个会话,但交互上仍然表现为“打开一个服务器就是一个标签”,缺少“某个服务器连接内部继续新增多个终端”的直观模型,和参考界面中的单连接多终端体验不一致。
|
|
|
|
### 目标
|
|
- 仅针对 `SSH` 连接实现“单个服务器连接下支持多个终端”。
|
|
- 用户首次打开某个服务器时,默认只创建 1 个终端。
|
|
- 在该服务器已打开后,允许继续新增该服务器下的第 2、第 3 ... 个终端。
|
|
- 顶部标签栏交互向“连接内多终端”靠拢,但保持当前项目的整体视觉和工作区结构。
|
|
|
|
### 约束条件
|
|
```yaml
|
|
范围约束: 仅改 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 连接组时,可在标签栏直接为该连接追加新终端。这样既满足单连接多终端体验,又避免重写后端会话模型。
|
|
|
|
### 影响范围
|
|
```yaml
|
|
涉及模块:
|
|
- 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 行为不退化。
|