Files
nexus-terminal/.helloagents/archive/2026-03/202603252207_ssh-connection-multi-terminal/proposal.md
T
yinjianm 7af8812e26 feat(workspace): enhance status cards and terminal groups
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
2026-03-25 22:58:27 +08:00

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 行为不退化。