9b45ad77e5
extend server status payload with timezone, uptime, and process summary so the monitor sidebar can show richer at-a-glance host context. introduce process:list and process:signal websocket flows on active SSH sessions, enabling on-demand process querying and terminate/kill actions without adding new HTTP endpoints. add a dedicated process manager modal in the frontend with search, refresh, auto-refresh, and per-process actions, and wire localized labels for both english and chinese. enhance global connection fuzzy search scoring to include tag names as secondary-weight fields while preserving primary host/name relevance.
8.6 KiB
8.6 KiB
变更提案: status-monitor-process-manager-modal
元信息
类型: 新功能/重构/优化
方案类型: implementation
优先级: P1
状态: 已确认
创建: 2026-04-15
1. 需求
背景
上一轮状态监控已经完成基础视觉重构,但用户明确反馈“不够好看,要更贴近参考图”,同时新增了明确需求:默认状态视图中需要补上时区、运行时间和进程管理概览;点击“查看全部”后,应弹出一个更完整的独立进程管理页面,风格接近用户提供的深色表格化管理截图。
目标
- 将默认状态视图继续收紧为更接近“服务器监控小屏”的布局节奏与视觉密度
- 在默认状态视图中新增时区、运行时间和进程管理概览
- 提供“查看全部”入口,打开独立 modal 形式的进程管理页面,支持搜索、刷新、自动刷新和结束/强制结束进程
约束条件
时间约束: 当前回合内完成设计、实现、验证和知识库同步
性能约束: 进程列表查询与自动刷新不能影响现有 SSH 会话稳定性;默认视图仅展示摘要,避免持续渲染超长列表
兼容性约束: 复用现有 SSH 会话 WebSocket 链路,不破坏状态轮询、终端、Docker 和现有 modal 行为
业务约束: 默认视图是轻量概览;完整进程管理通过“查看全部” modal 打开,不直接把整张管理表挤进侧栏
验收标准
StatusMonitor.vue默认视图补齐时区、运行时间和进程概览,并整体更贴近用户给出的服务器小屏参考图- 新增独立进程管理 modal,支持搜索、刷新、自动刷新、结束进程、强制结束进程
- 后端通过现有 WebSocket 会话返回时区、运行时间、进程列表和进程操作结果,前端构建通过
2. 方案
技术方案
本次改动分为三层:
- 扩展状态监控后端采集:
- 在
status-monitor.service.ts中新增服务器时区和运行时间采集 - 保持
status_update主链路用于基础状态字段
- 新增进程管理 WebSocket 能力:
- 在现有 SSH 会话 WebSocket 连接上扩展
process:list与process:signal消息类型 - 后端通过当前活动 SSH 会话执行
ps和kill指令,返回结构化进程列表与操作结果
- 前端双层展示:
StatusMonitor.vue默认视图继续向监控小屏靠拢,新增时区、运行时间和进程概览卡片- “查看全部” 打开新的
ProcessManagerModal.vue,其中嵌入完整进程管理表格视图 - 表格风格尽量贴近用户截图,采用紧凑列、搜索栏、自动刷新开关和右侧操作列
影响范围
涉及模块:
- packages/backend/src/services/status-monitor.service.ts: 扩展时区和运行时间采集
- packages/backend/src/websocket/connection.ts: 新增进程查询与信号操作消息分发
- packages/backend/src/websocket/types.ts: 扩展进程管理消息类型
- packages/frontend/src/types/server.types.ts: 增加时区/运行时间字段
- packages/frontend/src/components/StatusMonitor.vue: 默认状态视图继续贴近参考图并增加进程概览
- packages/frontend/src/components/ProcessManagerModal.vue: 独立进程管理 modal
- packages/frontend/src/locales/*.json: 新增进程管理与状态监控文案
- .helloagents/modules/frontend.md / modules/backend.md / CHANGELOG.md: 同步知识库
预计变更文件: 8-10
风险评估
| 风险 | 等级 | 应对 |
|---|---|---|
ps 输出格式在不同 Linux 发行版上存在差异 |
中 | 使用明确字段顺序与受控 awk/tab 分隔格式,后端集中解析并做回退 |
| 进程操作误伤系统进程 | 中 | 默认仅提供单行显式操作按钮,不做批量;强制结束作为二级危险动作高亮展示 |
| modal 自动刷新与会话切换叠加导致订阅混乱 | 中 | 前端对 active session / isVisible 建立显式注册与清理逻辑,关闭 modal 时停止自动刷新 |
3. 技术设计(可选)
本次以现有 SSH 会话 WebSocket 为主,不新增独立 HTTP 管理接口。
架构设计
flowchart TD
A[StatusMonitorService] --> B[status_update]
C[WebSocket connection.ts] --> D[process:list / process:signal]
B --> E[StatusMonitor.vue 默认概览]
D --> E
E --> F[ProcessManagerModal.vue]
API设计
WebSocket process:list
- 请求:
{ type: 'process:list', sessionId, payload: { limit?: number } } - 响应:
{ type: 'process:list:response', sessionId, payload: { processes, total, running, sleeping } }
WebSocket process:signal
- 请求:
{ type: 'process:signal', sessionId, payload: { pid, signal: 'TERM' | 'KILL' } } - 响应:
{ type: 'process:signal:response', sessionId, payload: { pid, signal, success, error? } }
数据模型
| 字段 | 类型 | 说明 |
|---|---|---|
timezone |
string |
服务器当前时区显示文本 |
uptimeSeconds |
number |
服务器已运行秒数 |
ProcessListItem.pid |
number |
进程 ID |
ProcessListItem.user |
string |
所属用户 |
ProcessListItem.state |
string |
进程状态 |
ProcessListItem.cpu |
number |
CPU 占比 |
ProcessListItem.memMb |
number |
内存占用,MB |
ProcessListItem.startedAt |
string |
启动时间文本 |
ProcessListItem.command |
string |
完整命令 |
4. 核心场景
场景: 默认状态视图查看进程概览
模块: packages/frontend/src/components/StatusMonitor.vue
条件: 用户已有活动 SSH 会话,状态监控面板正常显示
行为: 面板以更接近服务器监控小屏的密度展示系统、时区、运行时间和资源状态,并在底部显示进程概览和“查看全部”入口
结果: 用户无需离开侧栏即可快速判断机器运行情况,并知道是否需要打开完整进程管理
场景: 查看全部进程管理
模块: packages/frontend/src/components/ProcessManagerModal.vue
条件: 用户点击状态监控中的“查看全部”
行为: 打开独立 modal,显示可搜索的进程表格,并支持刷新、自动刷新、结束进程和强制结束
结果: 用户获得接近参考图的独立进程管理页面,同时仍保留在当前工作区上下文中
5. 技术决策
status-monitor-process-manager-modal#D001: 进程管理沿当前 SSH 会话 WebSocket 链路实现
日期: 2026-04-15 状态: ✅采纳 背景: 进程列表和进程操作都依赖当前活动 SSH 会话上下文,若改走独立 HTTP 接口,需要额外解决会话绑定和 SSH 复用问题。 选项分析:
| 选项 | 优点 | 缺点 |
|---|---|---|
| A: 新增 HTTP 接口直连后台查询进程 | 前端调用方式统一 | 很难绑定当前 SSH 会话,需额外管理远端执行上下文 |
| B: 复用现有 SSH 会话 WebSocket 消息 | 与当前终端/状态监控链路一致,复用现有 sessionId 和 wsManager | 需要扩展消息类型和前端订阅 |
| 决策: 选择方案 B | ||
| 理由: 与现有架构最一致,能自然绑定活动 SSH 会话,也更适合 modal 内的即时刷新和进程操作回执。 | ||
影响: 影响 packages/backend/src/websocket/*、StatusMonitor.vue 以及新的进程管理 modal 组件 |
6. 成果设计
设计方向
- 美学基调: 更贴近运维监控终端的小屏控制台风格,默认视图强调紧凑、层级分明、状态色克制,弹窗则偏运维后台表格台面
- 记忆点: 默认视图像“服务器小屏仪表”,而点击“查看全部”后立刻切到一张近似真实进程控制台的深色表格
- 参考: 用户给出的服务器状态小屏截图 + 进程管理独立弹窗截图
视觉要素
- 配色: 延续炭黑监控底色,默认视图用绿色/蓝色/琥珀色状态高亮;进程表格中的危险操作使用明显红色
- 字体: 继续使用项目现有字体体系,强调等宽数字和紧凑列头,避免引入额外字体依赖
- 布局: 默认视图尽量纵向、像小屏;进程管理 modal 采用顶栏搜索 + 表格主体 + 右侧操作列的后台结构
- 动效: 仅保留轻量 hover、刷新和 modal 开合过渡,不增加大幅动画
- 氛围: 深色渐变、薄边框、表格网格线、低饱和荧光状态色和危险动作红色高亮
技术约束
- 可访问性: 表头、搜索框、按钮和危险操作需要明确可见状态;危险动作文字不能只靠颜色表达
- 响应式: 默认视图继续兼容窄侧栏;modal 在桌面优先按参考图宽表格布局,小屏允许横向滚动