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
This commit is contained in:
yinjianm
2026-03-25 22:58:27 +08:00
parent d730d06c5e
commit 7af8812e26
23 changed files with 1644 additions and 839 deletions
@@ -0,0 +1 @@
{"status":"completed","completed":7,"failed":0,"pending":0,"total":7,"done":7,"percent":100,"current":"已完成 ssh-connection-multi-terminal 并通过前端构建验证","updated_at":"2026-03-25 22:19:31"}
@@ -0,0 +1,72 @@
# 变更提案: 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 行为不退化。
@@ -0,0 +1,52 @@
# 任务清单: ssh-connection-multi-terminal
```yaml
@feature: ssh-connection-multi-terminal
@created: 2026-03-25
@status: completed
@mode: R3
```
## 进度概览
| 完成 | 失败 | 跳过 | 总数 |
|------|------|------|------|
| 7 | 0 | 0 | 7 |
---
## 任务列表
### 1. 方案包与会话模型梳理
- [√] 1.1 创建单连接多终端方案包并固化前端分组决策 | depends_on: []
- [√] 1.2 梳理现有 `session` 状态、标签排序和 SSH 连接入口的复用边界 | depends_on: [1.1]
### 2. 前端会话分组与标签栏改造
- [√] 2.1 扩展 `SessionState` / getter,补充连接分组与终端序号信息 | depends_on: [1.2]
- [√] 2.2 改造 `TerminalTabBar.vue`,支持按连接展示并为当前 SSH 连接新增终端 | depends_on: [2.1]
- [√] 2.3 调整 `WorkspaceView.vue` 与会话入口逻辑,保证默认仅创建一个终端、追加时显式新增 | depends_on: [2.2]
### 3. 文案与验证
- [√] 3.1 补充前端 i18n / 提示文案,并核查 RDP/VNC 不受影响 | depends_on: [2.3]
- [√] 3.2 运行前端构建验证并同步 `.helloagents` 文档与变更记录 | depends_on: [3.1]
---
## 执行日志
| 时间 | 任务 | 状态 | 备注 |
|------|------|------|------|
| 2026-03-25 22:07 | 1.1 / 1.2 | 完成 | 创建 implementation 方案包,并确认复用现有独立 SSH session 模型 |
| 2026-03-25 22:14 | 2.1 / 2.2 / 2.3 | 完成 | 为 session 增加终端序号,顶部标签栏拆分“新增终端”和“选择服务器”入口 |
| 2026-03-25 22:19 | 3.1 / 3.2 | 完成 | 补充中英日文案,执行 `npm --prefix packages/frontend run build` 通过,并同步知识库文档 |
---
## 执行备注
- 本次只做 SSH,不扩展到 RDP/VNC。
- 组内每个终端仍对应独立 `sessionId`,避免影响现有 WebSocket / SFTP / 编辑器链路。
- 若现有标签顺序持久化与连接分组发生冲突,优先保证同连接终端的可识别性和可关闭性。