dsh-system-vitals
DeepSeek Harness 的系统体征插件 —— 在输入框卡片内部工具行、紧贴「自动审查」右侧,常驻显示 CPU 占用、CPU 温度、内存、磁盘、实时上传/下载速率;Linux / macOS / Windows 三平台,每秒采样,零运行时依赖。
+ 自动审查 ⌄ CPU 2.8% 温度 41°C 内存 14% 磁盘 13% 上传 128K/s 下载 1.60M/s
不用打开任务管理器、不用切窗口,也不用往下翻对话——体征就在你打字的地方。
特性
- 一条极简状态行:
CPU · 温度 · 内存 · 磁盘 · 上传 · 下载,全部常驻可见。 - 零依赖:Linux 直接读内核计数器(
/proc、/sys);macOS 用系统自带sysctl/netstat;Windows 用常驻 PowerShell 读性能计数器。不装原生模块、不需要管理员权限。 - 等宽格子、绝不跳动:每个读数是
标签 4ch + 数字 3.5ch + 单位 2.5ch的定宽格子,数值从9%变10%时整条不会左右晃。 - 数字最多 3 位有效数字:放不下就换单位(网速
B/s → K/s → M/s → G/s),绝不撑宽格子。 - 阈值变色:CPU/内存 75% 起警示色、90% 起错误色;磁盘 85% / 95%;温度 80°C / 92°C。
- 窄屏自适应:工具行放不下时按优先级收起次要读数,而不是把模型选择器挤走。
- 跟随主题与语言:只使用
--dsw-alias-*主题 token,中英文自动切换。
安装
要求:DSH 0.2.1-rc.2 左右版本、Node ≥ 20、dsh web 带界面的 profile。
dsh plugin --profile web add github:abyss2021/dsh-system-vitals
也可以从本地目录安装(开发调试):dsh plugin --profile web add /path/to/dsh-system-vitals。
若将来发布到 npm,可用
dsh plugin --profile web add dsh-system-vitals安装。 这两条命令不要同时写进代码块:插件商店的安装命令探测器遇到两个候选会判为ambiguous,反而一条都不显示。
装好后刷新页面即可。卸载:
dsh plugin --profile web remove dsh-system-vitals
本插件是 bundle + Client half 的组合:Host 半侧负责采样并暴露一条同源 HTTP 路由, Client 半侧向
conversation.input.left注册一个 React 组件。不需要构建步骤,client.js是可直接加载的浏览器模块。
显示内容
| 指标 | Linux | macOS | Windows |
|---|---|---|---|
| CPU 总占用 / 单核占用 | /proc/stat 两次采样求差 |
Node os.cpus() 时间片差分 |
Win32_PerfFormattedData_PerfOS_Processor |
| CPU 温度 | /sys/class/hwmon(coretemp/k10temp/zenpower/cpu_thermal…)→ 回退 /sys/class/thermal |
powermetrics --samplers smc(无 sudo 时通常不可读;回退 osx-cpu-temp/istats) |
MSAcpi_ThermalZoneTemperature(多数消费级主板不暴露,故常为 —) |
| 内存 / 交换 | /proc/meminfo |
Node os.totalmem/freemem + sysctl vm.swapusage |
Win32_PerfFormattedData_PerfOS_Memory(交换取 commit 量) |
| 磁盘占用 | fs.statfs('/') |
fs.statfs('/') |
Win32_LogicalDisk(系统盘) |
| 上传 / 下载速率 | /proc/net/dev 累计差分 |
netstat -ib 累计差分 |
Win32_PerfFormattedData_Tcpip_NetworkInterface 的 Bytes*Persec |
| (Host 侧附带)负载、进程数、运行时长 | /proc/loadavg、/proc、/proc/uptime |
os.loadavg() / os.uptime() |
NumberOfProcesses / LastBootUpTime |
Host 每秒采样一次,Client 每 2 秒轮询 GET /system-vitals/api/snapshot。读不到的字段一律返回 null,界面显示 —,不会编造数值。
各平台实现要点
- Linux:纯文件读取,零子进程、零依赖。
- macOS:
sysctl/netstat短命令 + Node API;温度采样较贵,每 5 个采样点刷新一次并缓存。 - Windows:启动一个常驻 PowerShell 子进程,每秒输出一行 JSON(性能计数器本身已是百分比与每秒字节,无需差分);子进程退出后按 5 秒退避重启,期间沿用上一次采样。
- 其他平台回退到 Node
os的最小读数(内存、负载、运行时长),CPU 占用与网速显示—。
拖动排序
每个参数都是独立可选中的格子:
- 拖动:按住任一参数拖到新位置,拖动过程中实时换位,松手即生效;
- 键盘:Tab 聚焦后用
←/→移动(Enter/Space选中); - 持久化:顺序存在
localStorage(keydsh-system-vitals:order),刷新与重启后保留; 词条表里已不存在的旧 id 会被忽略,缺失的参数自动补回原位。
因为每个格子等宽、且拖动时不留占位符,整条的宽度与绝对位置在任何顺序下都不变——变的只是哪个读数占哪个槽位。
窄屏行为
宿主工具行本身就是一层 inline-size 容器,插件直接复用它的宽度做判断(不使用自身宽度,避免尺寸隔离把整条压成 0 宽):
| 卡片宽度 | 显示 |
|---|---|
| > 860px | 六项全显:CPU · 温度 · 内存 · 磁盘 · 上传 · 下载 |
| ≤ 860px | 收起上传/下载 |
| ≤ 620px | 再收起磁盘,保留 CPU · 温度 · 内存 |
被收起的读数仍可通过悬浮提示查看精确值。
配置
在 profile 的 patch 层覆盖行 config:
- insert:
- id: system-vitals
name: dsh-system-vitals
config:
intervalMs: 1000 # Host 采样间隔,250–10000 ms;网速按该间隔的字节差计算
兼容性
- 平台:Linux 完整支持;macOS、Windows 支持 CPU/内存/磁盘/网速,温度视机型与权限可能不可用。
- DSH:在
0.2.1-rc.2上开发并验证;只使用稳定的webServer.register、ctx.slots.register/inject、ctx.locale.register接口。 - Node:≥ 20(
fs.statfs)。
安全说明
Host 半侧注册的 GET /system-vitals/api/snapshot 是本机未鉴权路由,只绑在 DSH Web 的
监听地址上(默认 127.0.0.1)。同机的其他进程本来就能读 /proc,因此不构成额外暴露;
但不要把 DSH Web 直接暴露到公网(--host 0.0.0.0)后再开着这个插件,否则这些读数会随页面一起对外可见。
项目结构
dsh-system-vitals/
├── package.json # 包清单:dsh.bundle / dsh.client / exports
├── cordis.patch.yml # 插入插件行
├── index.js # Host 半侧:采样 + HTTP 路由
├── client.js # Client 半侧:工具行里的状态行
├── locale/{zh,en}.json # 插件市场展示用元数据
├── icon.svg # 插件图标
└── README.md / README.en.md / LICENSE
开发与发布
node --check index.js # 语法检查
node --check client.js
for file in platform/*.js; do node --check "$file"; done
npm pack --dry-run # 查看将发布的文件列表
npm publish # 发布到 npm(需先 npm login,目前未发布)
发布前记得同步升版本(npm version patch|minor|major)并更新 CHANGELOG.md。
package.json 已声明 publishConfig.access = public 与 provenance;.github/workflows/publish.yml
会在发布 GitHub Release 时校验 tag 并执行 npm publish --provenance(需配置 NPM_TOKEN secret)。
当前未发布到 npm,所以用 GitHub 安装;发布后再把上面的安装命令换成
dsh plugin --profile web add dsh-system-vitals,并保持代码块里只有这一条。
修改后重装即可生效:
dsh plugin --profile web remove dsh-system-vitals
dsh plugin --profile web add /path/to/dsh-system-vitals
No comments yet. Be the first to write one.