diff --git a/.helloagents/CHANGELOG.md b/.helloagents/CHANGELOG.md index 16244c3..cfa5584 100644 --- a/.helloagents/CHANGELOG.md +++ b/.helloagents/CHANGELOG.md @@ -2,7 +2,22 @@ ## [Unreleased] -- **[frontend]**: 支持将快捷指令从一个标签组拖到另一个标签组内,允许把未标记命令直接拖入目标标签组,并修正 `manual / name / last_used` 排序按钮状态映射 — by yinjianm +- **[frontend]**: 将状态监控中的 CPU 卡片升级为总 CPU `canvas` 历史图 + 每核心实时条卡,并在极窄侧栏下自动切换为单列布局 — by yinjianm + - 方案: [202604190351_status-monitor-cpu-total-and-per-core](archive/2026-04/202604190351_status-monitor-cpu-total-and-per-core/) + +- **[backend]**: 扩展 `StatusMonitorService` 的 `/proc/stat` 采样链路,新增 `cpuCorePercents` 每核心实时占用字段并与总 CPU 百分比一同下发 — by yinjianm + - 方案: [202604190351_status-monitor-cpu-total-and-per-core](archive/2026-04/202604190351_status-monitor-cpu-total-and-per-core/) + +- **[frontend]**: 将状态监控里的网络历史图和网络统计表固定改为上下堆叠,并通过压缩图表 canvas、表格间距与统计项内边距,把整个网络模块限制在 350px 以内 — by yinjianm + - 方案: [202604190358_status-monitor-network-vertical-stack](archive/2026-04/202604190358_status-monitor-network-vertical-stack/) + +- **[frontend]**: 为进程管理详细视图补充可点击表头排序,支持按 `PID / USER / STATE / CPU / MEM / START / COMMAND` 列切换升降序,并拉开关闭按钮与刷新区的安全间距 — by yinjianm + - 方案: [202604190352_process-manager-table-sort-and-close-spacing](archive/2026-04/202604190352_process-manager-table-sort-and-close-spacing/) + +- **[frontend]**: 将状态监控“进程管理”的总数从独立摘要项提升为标题区右侧胶囊,并将默认摘要区收敛为“运行中 / 休眠中”两项,减少默认卡片纵向占用 - by yinjianm + - 方案: [202604190349_process-total-pill-display](archive/2026-04/202604190349_process-total-pill-display/) + +- **[frontend]**: 支持将快捷指令从一个标签组拖到另一个标签组内,允许把未标记命令直接拖入目标标签组,并修正 `manual / name / last_used` 排序按钮状态映射 - by yinjianm - 方案: [202604190322_quickcommands-cross-group-drag-move](archive/2026-04/202604190322_quickcommands-cross-group-drag-move/) - **[frontend]**: 将状态监控中的内存与网络卡片响应式阈值统一收紧到 250px,并把网络卡片的 SVG 趋势线升级为可 hover 查看最近 24 个采样点的 canvas 历史图 — by yinjianm @@ -82,7 +97,10 @@ - 方案: [202603250614_terminal-ansi-color-effects](archive/2026-03/202603250614_terminal-ansi-color-effects/) ### 快速修改 -- **[frontend]**: 将状态监控模块区从默认并排调整回基于常用 300px 右栏比例的单列布局,并用弹性高度把普通卡控制在约 200、进程管理控制在约 400 的视觉比例 — by yinjianm +- **[frontend]**: 将状态监控“进程管理”的“运行中 / 休眠中”也收纳进标题区胶囊组,和“总数”一起以内联小显示呈现,不再保留独立摘要行 - by yinjianm + - 类型: 快速修改(无方案包) + - 文件: packages/frontend/src/components/StatusMonitor.vue:217-230,571-575,875-880 +- **[frontend]**: 将状态监控模块区从默认并排调整回基于常用 300px 右栏比例的单列布局,并用弹性高度把普通卡控制在约 200、进程管理控制在约 400 的视觉比例 - by yinjianm - 类型: 快速修改(无方案包) - 文件: packages/frontend/src/components/StatusMonitor.vue - **[frontend]**: 将状态监控模块区从大断点固定分列改为更高密度的 auto-fit 自适应网格,让内存/网络/磁盘在正常宽度下默认并排,只有非常窄时才回落为单列 — by yinjianm diff --git a/.helloagents/archive/2026-04/202604190349_process-total-pill-display/.status.json b/.helloagents/archive/2026-04/202604190349_process-total-pill-display/.status.json new file mode 100644 index 0000000..1898f17 --- /dev/null +++ b/.helloagents/archive/2026-04/202604190349_process-total-pill-display/.status.json @@ -0,0 +1 @@ +{"status":"completed","completed":3,"failed":0,"pending":0,"total":3,"done":3,"percent":100,"current":"已完成并等待归档","updated_at":"2026-04-19 04:00:00"} diff --git a/.helloagents/archive/2026-04/202604190349_process-total-pill-display/proposal.md b/.helloagents/archive/2026-04/202604190349_process-total-pill-display/proposal.md new file mode 100644 index 0000000..6790073 --- /dev/null +++ b/.helloagents/archive/2026-04/202604190349_process-total-pill-display/proposal.md @@ -0,0 +1,113 @@ +# 变更提案: process-total-pill-display + +## 元信息 +```yaml +类型: 优化 +方案类型: implementation +优先级: P2 +状态: 草案 +创建: 2026-04-19 +``` + +--- + +## 1. 需求 + +### 背景 +工作区右侧状态监控中的“进程管理”模块当前把“总数 / 运行中 / 休眠中”都放在独立摘要行里展示,其中“总数”作为单独卡片占用了一行摘要位。用户希望“总数”像现有 `monitor-module__pill` 一样以内联小胶囊显示,并挂在模块标题区域,减少纵向占用,让默认监控卡片更紧凑。 + +### 目标 +- 将“总数”从 `process-summary-strip` 中移出。 +- 在“进程管理”标题区右侧新增与现有监控胶囊一致的小显示。 +- 保持“运行中 / 休眠中”摘要和高占用进程预览逻辑不变。 + +### 约束条件 +```yaml +时间约束: 本次仅做局部前端样式与模板调整 +性能约束: 不新增数据请求,不改变状态监控刷新频率 +兼容性约束: 继续复用现有 StatusMonitor 深色监控视觉体系 +业务约束: 不修改进程统计来源和 process manager modal 行为 +``` + +### 验收标准 +- [ ] “总数”不再以独立 `process-summary-item` 单独占一行显示。 +- [ ] “总数”在“进程管理”模块标题右侧以内联胶囊展示,视觉风格与现有 `monitor-module__pill` 一致。 +- [ ] “运行中 / 休眠中”摘要仍正常显示,进程预览列表不受影响。 +- [ ] 前端构建通过。 + +--- + +## 2. 方案 + +### 技术方案 +在 `packages/frontend/src/components/StatusMonitor.vue` 中拆分进程摘要数据: +- 新增一个仅供标题区展示的总数文案或值。 +- 将 `processSummaryItems` 缩减为“运行中 / 休眠中”两项。 +- 在 `monitor-module--process` 的标题区追加一个 `monitor-module__pill` 样式节点,用于显示总数。 +- 视需要微调标题区布局与摘要区网格列数,保证小宽度下仍然稳定。 + +### 影响范围 +```yaml +涉及模块: + - frontend: 调整 StatusMonitor.vue 的模板、计算属性和局部样式 +预计变更文件: 1 +``` + +### 风险评估 +| 风险 | 等级 | 应对 | +|------|------|------| +| 标题区新增胶囊后在窄宽度下换行异常 | 低 | 复用现有 heading 布局并补充最小样式约束 | +| 摘要区列数变化导致视觉密度失衡 | 低 | 同步调整 `process-summary-strip` 的网格列定义 | + +--- + +## 3. 技术设计(可选) + +> 本次不涉及架构变更、API 设计或数据模型变更,N/A。 + +--- + +## 4. 核心场景 + +### 场景: 默认监控卡片中查看进程管理摘要 +**模块**: frontend +**条件**: 用户已进入 `/workspace`,右侧状态监控卡片正常渲染进程统计。 +**行为**: “总数”以内联胶囊形式显示在“进程管理”标题右侧,摘要区仅保留“运行中 / 休眠中”。 +**结果**: 模块纵向占用更紧凑,摘要信息层级更清晰。 + +--- + +## 5. 技术决策 + +### process-total-pill-display#D001: 将“总数”提升为标题区状态胶囊 +**日期**: 2026-04-19 +**状态**: 已采纳 +**背景**: “总数”属于模块级总览指标,相比“运行中 / 休眠中”更适合作为标题区状态而不是并列摘要项。 +**选项分析**: +| 选项 | 优点 | 缺点 | +|------|------|------| +| A: 保持在摘要区 | 改动最小 | 继续占用摘要行,层级不突出 | +| B: 提升到标题区胶囊 | 更紧凑,和现有监控胶囊风格一致 | 需要调整标题区模板与布局 | +**决策**: 选择方案 B +**理由**: 更符合该指标的总览属性,也与用户明确指定的位置一致。 +**影响**: 影响 `StatusMonitor.vue` 内进程管理模块的标题区和摘要区布局。 + +--- + +## 6. 成果设计 + +### 设计方向 +- **美学基调**: 延续现有深色终端监控卡片风格,在不改变整体主题的前提下压缩信息层级。 +- **记忆点**: “进程总数”从块级摘要变成标题区状态胶囊,信息更像实时监控标签而不是表格式统计。 +- **参考**: 直接复用当前组件内已存在的 `monitor-module__pill` 视觉语言。 + +### 视觉要素 +- **配色**: 继续使用现有绿色轻发光胶囊配色。 +- **字体**: 沿用组件现有无衬线监控字体栈,不引入新字体。 +- **布局**: 标题区左侧保留标题文案,右侧增加总数胶囊;摘要区缩减为两列。 +- **动效**: N/A,本次不新增动画。 +- **氛围**: 保持控制台式深色监控观感,不做主题偏移。 + +### 技术约束 +- **可访问性**: 保持文本可读性,不用纯图标替代文字。 +- **响应式**: 标题区在窄容器下允许自然换行但不应破坏内容顺序。 diff --git a/.helloagents/archive/2026-04/202604190349_process-total-pill-display/tasks.md b/.helloagents/archive/2026-04/202604190349_process-total-pill-display/tasks.md new file mode 100644 index 0000000..38d126f --- /dev/null +++ b/.helloagents/archive/2026-04/202604190349_process-total-pill-display/tasks.md @@ -0,0 +1,47 @@ +# 任务清单: process-total-pill-display + +> **@status:** completed | 2026-04-19 03:54 + +```yaml +@feature: process-total-pill-display +@created: 2026-04-19 +@status: completed +@mode: R2 +``` + +## 进度概览 + +| 完成 | 失败 | 跳过 | 总数 | +|------|------|------|------| +| 3 | 0 | 0 | 3 | + +--- + +## 任务列表 + +### 1. frontend 组件调整 + +- [√] 1.1 在 `packages/frontend/src/components/StatusMonitor.vue` 中把进程总数从摘要列表中拆分出来,并挂到模块标题区域 +- [√] 1.2 在 `packages/frontend/src/components/StatusMonitor.vue` 中调整进程摘要区布局,使“运行中 / 休眠中”保持紧凑展示 + - 依赖: 1.1 + +### 2. 验证 + +- [√] 2.1 执行前端构建验证,确认 `StatusMonitor.vue` 改动未引入编译错误 + - 依赖: 1.2 + +--- + +## 执行日志 + +| 时间 | 任务 | 状态 | 备注 | +|------|------|------|------| +| 2026-04-19 03:49 | 创建方案包 | 已完成 | `create_package.py` 已生成 proposal/tasks 模板 | +| 2026-04-19 03:58 | 完成组件改动 | 已完成 | `StatusMonitor.vue` 已将总数提升到标题区胶囊,并将摘要区收敛为两项 | +| 2026-04-19 04:00 | 前端构建验证 | 已完成 | `npm --prefix "E:/code/vue/nexus-terminal/packages/frontend" run build` 通过 | + +--- + +## 执行备注 + +> 本次为局部 UI 优化,目标是减少“进程管理”默认卡片的纵向占用,不改变进程数据来源、刷新机制和 modal 行为。 diff --git a/.helloagents/archive/2026-04/202604190351_status-monitor-cpu-total-and-per-core/.status.json b/.helloagents/archive/2026-04/202604190351_status-monitor-cpu-total-and-per-core/.status.json new file mode 100644 index 0000000..c992364 --- /dev/null +++ b/.helloagents/archive/2026-04/202604190351_status-monitor-cpu-total-and-per-core/.status.json @@ -0,0 +1 @@ +{"status":"completed","completed":6,"failed":0,"pending":0,"total":6,"done":6,"percent":100,"current":"总 CPU 历史图与每核心实时条卡已完成实现并通过前后端构建校验","updated_at":"2026-04-19 04:06:18"} diff --git a/.helloagents/archive/2026-04/202604190351_status-monitor-cpu-total-and-per-core/proposal.md b/.helloagents/archive/2026-04/202604190351_status-monitor-cpu-total-and-per-core/proposal.md new file mode 100644 index 0000000..f2ddcb6 --- /dev/null +++ b/.helloagents/archive/2026-04/202604190351_status-monitor-cpu-total-and-per-core/proposal.md @@ -0,0 +1,138 @@ +# 变更提案: status-monitor-cpu-total-and-per-core + +## 元信息 +```yaml +类型: 优化 +方案类型: implementation +优先级: P1 +状态: 已确认 +创建: 2026-04-19 +``` + +--- + +## 1. 需求 + +### 背景 +当前 `/workspace` 右侧状态监控中,CPU 区只有一个装饰性的 SVG sparkline 和一条总占用进度条,无法像网络卡片那样直接查看近期历史图,也无法区分不同 CPU 核心的实时负载。用户明确要求将 CPU 区改成“总 CPU 历史图 + 不同核心分别显示”的结构,并已确认采用“保留总 CPU 历史图、下方按核心显示独立实时条卡”的方案。 + +### 目标 +- 将 CPU 卡片升级为 `canvas` 总 CPU 历史图,展示最近采样趋势。 +- 为每个 CPU 核心增加独立的实时显示条卡,明确区分不同核心当前占用。 +- 扩展后端状态采样 payload,提供每核心 CPU 百分比数据,前端直接消费。 +- 保持现有总 CPU 历史图缓存链路可用,不影响内存/网络/磁盘卡片。 + +### 约束条件 +```yaml +时间约束: 本轮限定为状态监控 CPU 链路,不扩展到设置页、审计或外部图表页面 +性能约束: 每核心仅传当前百分比,不增加每核心历史数组,避免 websocket payload 膨胀 +兼容性约束: 总 CPU 百分比和既有 cpuHistory 保持兼容,底部 StatusCharts 继续工作 +业务约束: 每核心数据来自现有 Linux /proc/stat 采样,不引入额外系统依赖 +``` + +### 验收标准 +- [ ] 后端状态 payload 新增每核心 CPU 百分比字段,并能与总 CPU 百分比一同返回。 +- [ ] 前端 CPU 卡片改为总 CPU 历史 `canvas` 图,显示最近采样趋势。 +- [ ] CPU 卡片下方按核心显示独立实时条卡,每个核心有单独标签和值。 +- [ ] 前后端构建通过;若本地无法完成登录后工作区的运行态验证,需要在执行备注中明确说明。 + +--- + +## 2. 方案 + +### 技术方案 +后端继续使用 `/proc/stat` 作为 CPU 采样源,但从只解析总 `cpu` 行扩展为同时解析 `cpu` 和 `cpuN` 行。服务端为每个会话缓存“上一次总 CPU 快照 + 每核心快照”,在下一轮采样时计算总百分比与每核心百分比,并通过 `status_update` 一起返回。前端类型定义增加 `cpuCorePercents`,CPU 卡片新增一个 `StatusMonitorCpuHistoryChart.vue` 子组件承载总 CPU `canvas` 历史图,`StatusMonitor.vue` 则在图下方或右侧渲染每核心实时条卡。 + +### 影响范围 +```yaml +涉及模块: + - backend: StatusMonitorService 的 CPU 采样与状态 payload 扩展 + - frontend: ServerStatus 类型、CPU 卡片结构与新图表子组件 + - frontend-i18n: 每核心标签与 CPU 历史图说明文案 +预计变更文件: 8 +``` + +### 风险评估 +| 风险 | 等级 | 应对 | +|------|------|------| +| 多核心服务器返回大量核心数据,导致 CPU 卡片过高 | 中 | 每核心条卡采用紧凑网格并允许卡片内部滚动 | +| 总 CPU 与各核心百分比计算方式不一致,导致数值观感异常 | 中 | 统一基于同一轮 `/proc/stat` 差值计算,采用相同的百分比裁剪规则 | +| 旧连接会话在首次采样前没有前序快照,导致每核心值为空 | 低 | 首轮统一返回 0,并在第二轮后进入稳定值 | + +--- + +## 3. 技术设计(可选) + +### 架构设计 +```mermaid +flowchart TD + A[/proc/stat cpu + cpuN/] --> B[StatusMonitorService] + B --> C[status.cpuPercent] + B --> D[status.cpuCorePercents[]] + C --> E[useStatusMonitor cpuHistory] + D --> F[StatusMonitor.vue core cards] + E --> G[StatusMonitorCpuHistoryChart.vue] +``` + +### 数据模型 +| 字段 | 类型 | 说明 | +|------|------|------| +| `cpuCorePercents` | `number[]` | 每个核心当前 CPU 使用率百分比,顺序对应 `cpu0..cpuN` | +| `cpuHistory` | `(number \| null)[]` | 现有总 CPU 历史采样,继续保留 | + +--- + +## 4. 核心场景 + +> 执行完成后同步到对应模块文档 + +### 场景: 侧栏中查看总 CPU 趋势 +**模块**: frontend +**条件**: 用户在 `/workspace` 查看右侧状态监控,当前会话已持续收到 CPU 状态采样。 +**行为**: CPU 卡片显示一个 `canvas` 总 CPU 历史图,用于观察最近采样趋势。 +**结果**: 用户可以不依赖底部大图,也能在 CPU 卡片中快速判断近期整体负载波动。 + +### 场景: 区分不同核心当前负载 +**模块**: frontend, backend +**条件**: 后端已为当前会话返回 `cpuCorePercents`。 +**行为**: CPU 卡片按核心渲染独立实时条卡,例如 `Core 1`、`Core 2`,每个核心都有单独百分比和进度条。 +**结果**: 用户可以快速识别负载是否集中在某些核心,而不是只能看总 CPU 百分比。 + +--- + +## 5. 技术决策 + +> 本方案涉及的技术决策,归档后成为决策的唯一完整记录 + +### status-monitor-cpu-total-and-per-core#D001: 每核心只传当前值,不维护每核心历史数组 +**日期**: 2026-04-19 +**状态**: ✅采纳 +**背景**: 用户要“总 CPU 历史图 + 每核心分别显示”。其中总图需要历史数据,但每核心展示仅要求分别显示,不一定需要每核心历史。 +**选项分析**: +| 选项 | 优点 | 缺点 | +|------|------|------| +| A: 总 CPU 历史 + 每核心当前值(推荐) | 数据量小、实现稳、对侧栏更友好 | 不能直接查看单核心历史 | +| B: 总 CPU 历史 + 每核心历史数组 | 信息最全,后续可扩成每核心迷你图 | websocket payload 和前端渲染复杂度明显上升 | +**决策**: 选择方案 A +**理由**: 这是最符合当前需求和侧栏密度约束的实现路径,既满足“总历史图”,也满足“不同核心不同显示”,同时避免后端和前端缓存结构膨胀。 +**影响**: 扩展后端 CPU 采样与前端 CPU 卡片结构,但不影响现有内存/网络历史缓存策略。 + +--- + +## 6. 成果设计 + +### 设计方向 +- **美学基调**: 延续当前状态监控的深色控制台面板风格,把 CPU 区从“单条概览”提升为更接近真实监控屏的图表 + 分核条卡组合。 +- **记忆点**: 同一张 CPU 卡里上方是总历史图,下方是一组按核心编号排列的独立实时条卡。 +- **参考**: 视觉语言参考已完成的网络 `canvas` 历史图和现有 usage lane 组件风格。 + +### 视觉要素 +- **配色**: 保持 CPU 既有蓝色语义色作为总图和条卡主色,不引入额外杂色。 +- **字体**: 数值继续使用 monospace,核心标签保持当前状态监控字重体系。 +- **布局**: CPU 卡片采用“历史图 + 条卡网格”组合,窄宽度时自动退为单列。 +- **动效**: 图表关闭动画,仅保留 hover tooltip;条卡用静态宽度反馈,不做额外动画。 +- **氛围**: 保持深色服务器面板的克制风格,避免把 CPU 卡做成单独花哨模块。 + +### 技术约束 +- **可访问性**: 核心条卡需包含可读标签与数值,不只靠颜色区分。 +- **响应式**: 多核心条卡在窄侧栏下要自动换列或纵向堆叠。 diff --git a/.helloagents/archive/2026-04/202604190351_status-monitor-cpu-total-and-per-core/tasks.md b/.helloagents/archive/2026-04/202604190351_status-monitor-cpu-total-and-per-core/tasks.md new file mode 100644 index 0000000..5cd6ef5 --- /dev/null +++ b/.helloagents/archive/2026-04/202604190351_status-monitor-cpu-total-and-per-core/tasks.md @@ -0,0 +1,56 @@ +# 任务清单: status-monitor-cpu-total-and-per-core + +> **@status:** completed | 2026-04-19 04:08 + +```yaml +@feature: status-monitor-cpu-total-and-per-core +@created: 2026-04-19 +@status: completed +@mode: R3 +``` + +## 进度概览 + +| 完成 | 失败 | 跳过 | 总数 | +|------|------|------|------| +| 6 | 0 | 0 | 6 | + +--- + +## 任务列表 + +### 1. 后端 CPU 状态扩展 + +- [√] 1.1 在 `packages/backend/src/services/status-monitor.service.ts` 中扩展 `/proc/stat` 解析,计算每核心 CPU 百分比并写入状态 payload | depends_on: [] +- [√] 1.2 运行 `@nexus-terminal/backend` 构建校验,确认每核心 CPU 字段扩展未破坏现有服务端类型与编译 | depends_on: [1.1] + +### 2. 前端 CPU 卡片重构 + +- [√] 2.1 在 `packages/frontend/src/types/server.types.ts` 与 `packages/frontend/src/composables/useStatusMonitor.ts` 中接入每核心 CPU 状态字段 | depends_on: [1.1] +- [√] 2.2 新增 `packages/frontend/src/components/StatusMonitorCpuHistoryChart.vue`,显示总 CPU canvas 历史图 | depends_on: [2.1] +- [√] 2.3 在 `packages/frontend/src/components/StatusMonitor.vue` 中将 CPU 卡片改为“总历史图 + 每核心实时条卡”布局 | depends_on: [2.2] +- [√] 2.4 在 `packages/frontend/src/locales/zh-CN.json`、`packages/frontend/src/locales/en-US.json`、`packages/frontend/src/locales/ja-JP.json` 中补充 CPU 历史与核心标签文案,并运行 `@nexus-terminal/frontend` 构建校验 | depends_on: [2.3] + +--- + +## 执行日志 + +| 时间 | 任务 | 状态 | 备注 | +|------|------|------|------| +| 2026-04-19 03:57 | design | completed | 已创建 implementation 方案包,范围锁定为总 CPU 历史图与每核心实时条卡的前后端联动实现 | +| 2026-04-19 04:00 | 1.1 | completed | 已扩展 `/proc/stat` 解析为总 CPU + `cpuN` 每核心快照,并将 `cpuCorePercents` 一并写入状态 payload | +| 2026-04-19 04:01 | 1.2 | completed | `npm --workspace @nexus-terminal/backend run build` 通过 | +| 2026-04-19 04:02 | 2.1 | completed | 已在前端状态类型与状态监控 composable 中接入 `cpuCorePercents` 并做数组归一化 | +| 2026-04-19 04:03 | 2.2 | completed | 已新增 `StatusMonitorCpuHistoryChart.vue`,用 canvas 展示最近 24 个总 CPU 历史采样点 | +| 2026-04-19 04:04 | 2.3 | completed | 已将 CPU 卡片改为“总历史图 + 每核心实时条卡”布局,并在极窄宽度下切换为单列 | +| 2026-04-19 04:06 | 2.4 | completed | 已补充中英日 CPU 文案;`npm --workspace @nexus-terminal/frontend run build` 通过,并额外确认 `npm --workspace @nexus-terminal/frontend run preview -- --host 127.0.0.1 --port 4173` 可返回 HTTP 200 | + +--- + +## 执行备注 + +> 记录执行过程中的重要说明、决策变更、风险提示等 + +- 本轮选择方案 A:保留总 CPU 历史图,但每核心仅展示当前实时值,不额外缓存每核心历史数组。 +- CPU 差值计算中的空闲时间按 `idle + iowait` 处理,避免高负载判断偏高。 +- 运行态限制: 已确认前端预览服务能正常启动并返回首页,但未在本地接入真实活动 SSH 会话,因此“带真实 CPU 数据的分核条卡与 tooltip 最终观感”仍建议在你的 `/workspace` 环境手动看一遍。 diff --git a/.helloagents/archive/2026-04/202604190352_process-manager-table-sort-and-close-spacing/proposal.md b/.helloagents/archive/2026-04/202604190352_process-manager-table-sort-and-close-spacing/proposal.md new file mode 100644 index 0000000..9da7df5 --- /dev/null +++ b/.helloagents/archive/2026-04/202604190352_process-manager-table-sort-and-close-spacing/proposal.md @@ -0,0 +1,161 @@ +# 变更提案: process-manager-table-sort-and-close-spacing + +## 元信息 +```yaml +类型: 优化 +方案类型: implementation +优先级: P1 +状态: 已完成 +创建: 2026-04-19 +完成: 2026-04-19 +``` + +--- + +## 1. 需求 + +### 背景 +当前 `ProcessManagerModal.vue` 已经能展示服务器进程明细、支持搜索和手动刷新,但明细表仍然是纯静态表头。用户进入进程管理详细视图后,无法按 `PID`、`CPU`、`MEM` 等列快速切换视角来定位高占用进程或按进程号排查问题。同时,右上角绝对定位的关闭按钮与顶部刷新控制区距离过近,在当前布局下容易产生视觉拥挤,影响操作清晰度。 + +### 目标 +- 允许点击进程管理表格头,按主要数据列切换排序显示。 +- 为当前激活的排序列显示明确的升序/降序方向标记。 +- 保持默认列表顺序与现有后端返回顺序一致,避免未点击表头前的展示语义回归。 +- 拉开关闭按钮与刷新区的安全间距,避免顶部工具区拥挤。 + +### 约束条件 +```yaml +时间约束: 本轮完成前端实现、构建验证与知识库同步 +性能约束: 不新增依赖,继续使用现有 Vue 计算属性完成前端本地排序 +兼容性约束: 不修改后端 process:list 消息结构,不改变默认未排序态 +业务约束: 所有主要数据列都支持排序,但操作列保持不可排序 +``` + +### 验收标准 +- [ ] 进程管理表头至少支持 `PID / USER / STATE / CPU / MEM / START / COMMAND` 点击排序。 +- [ ] 点击同一列表头时可以在升序和降序之间切换,并显示方向标记。 +- [ ] 数值列首次点击默认按更符合排障习惯的方向排序,文本列首次点击默认按字母升序排序。 +- [ ] 默认未点击表头时,进程列表仍保持现有后端返回顺序。 +- [ ] 关闭按钮与刷新区之间有明确安全间距,不再显得贴近或覆盖。 +- [ ] `npm run build --workspace @nexus-terminal/frontend` 通过。 + +--- + +## 2. 方案 + +### 技术方案 +本次改动只落在前端 `ProcessManagerModal.vue`。 + +第一部分是表格排序。新增本地排序状态 `sortKey + sortDirection`,基于当前 `processItems` 先执行搜索过滤,再在计算属性中按所选列进行稳定排序。默认 `sortKey=null`,保持后端原始顺序;点击表头后进入排序态。同一列重复点击则在升序/降序间切换,不同列首次点击则采用按列预设的默认方向,其中 `PID / CPU / MEM` 首次点击走降序或更符合当前字段的排障方向,文本列首次点击走升序。 + +第二部分是表头交互。把静态 `
| {{ t('statusMonitor.processManager.columns.pid') }} | -{{ t('statusMonitor.processManager.columns.user') }} | -{{ t('statusMonitor.processManager.columns.state') }} | -{{ t('statusMonitor.processManager.columns.cpu') }} | -{{ t('statusMonitor.processManager.columns.mem') }} | -{{ t('statusMonitor.processManager.columns.start') }} | -{{ t('statusMonitor.processManager.columns.command') }} | ++ + | ++ + | ++ + | ++ + | ++ + | ++ + | ++ + | {{ t('statusMonitor.processManager.columns.actions') }} |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ item.pid }} | {{ item.user }} |
@@ -374,9 +549,21 @@ onUnmounted(() => {
right: 14px;
border: none;
background: transparent;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 36px;
+ height: 36px;
+ border-radius: 10px;
color: #cbd5e1;
font-size: 18px;
cursor: pointer;
+ transition: background-color 0.2s ease, color 0.2s ease;
+}
+
+.process-modal-close:hover {
+ background: rgba(255, 255, 255, 0.08);
+ color: #f8fbff;
}
.process-modal-toolbar {
@@ -384,6 +571,7 @@ onUnmounted(() => {
gap: 12px;
align-items: center;
justify-content: space-between;
+ padding-right: 52px;
}
.process-modal-search {
@@ -505,6 +693,30 @@ onUnmounted(() => {
text-transform: uppercase;
}
+.process-sort-button {
+ display: inline-flex;
+ align-items: center;
+ gap: 8px;
+ width: 100%;
+ border: none;
+ background: transparent;
+ padding: 0;
+ color: inherit;
+ font: inherit;
+ letter-spacing: inherit;
+ text-transform: inherit;
+ cursor: pointer;
+}
+
+.process-sort-button__icon {
+ color: rgba(159, 176, 191, 0.56);
+ font-size: 11px;
+}
+
+.process-sort-button__icon--active {
+ color: #f8fbff;
+}
+
.process-table__mono {
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
}
@@ -569,6 +781,7 @@ onUnmounted(() => {
.process-modal-toolbar {
flex-direction: column;
align-items: stretch;
+ padding-right: 52px;
}
.process-modal-controls {
diff --git a/packages/frontend/src/components/StatusMonitor.vue b/packages/frontend/src/components/StatusMonitor.vue
index a50d4dd..d2c8821 100644
--- a/packages/frontend/src/components/StatusMonitor.vue
+++ b/packages/frontend/src/components/StatusMonitor.vue
@@ -58,30 +58,34 @@
+
{{ t('statusMonitor.cpuLabel') }}
-
-
+ {{ displayCpuCores }}
CPU-
-
-
-
-
@@ -219,15 +223,15 @@
{{ t('statusMonitor.processManager.title') }}
-
- {{ t('statusMonitor.processManager.subtitle') }}
-
- {{ item.label }}
- {{ item.value }}
+
@@ -274,6 +278,7 @@ import { computed, ref, watch, type CSSProperties, type PropType } from 'vue';
import { useI18n } from 'vue-i18n';
import { storeToRefs } from 'pinia';
import ProcessManagerModal from './ProcessManagerModal.vue';
+import StatusMonitorCpuHistoryChart from './StatusMonitorCpuHistoryChart.vue';
import StatusCharts from './StatusCharts.vue';
import StatusMonitorNetworkHistoryChart from './StatusMonitorNetworkHistoryChart.vue';
import { useSessionStore } from '../stores/session.store';
@@ -509,28 +514,29 @@ const systemCardMetaItems = computed
+
+
+ {{ item.label }} {{ item.value }}
+
+
+
+
+
+
+
+
+
diff --git a/packages/frontend/src/components/StatusMonitorNetworkHistoryChart.vue b/packages/frontend/src/components/StatusMonitorNetworkHistoryChart.vue
index 7f8d585..e32f48b 100644
--- a/packages/frontend/src/components/StatusMonitorNetworkHistoryChart.vue
+++ b/packages/frontend/src/components/StatusMonitorNetworkHistoryChart.vue
@@ -259,22 +259,22 @@ onBeforeUnmount(() => {
+
+
+
+
+ {{ t('statusMonitor.latestCpuValue', { value: latestCpuValue }) }}
+ {{ t('statusMonitor.cpuHistoryRecentPoints', { count: displayPointCount }) }} +{{ t('statusMonitor.cpuUsageTitle') }}+
+
+ |