- Home
- Plugins
- UI Enhancements
- dsh-job-monitor
dsh-job-monitor
yuanjiangdev123/dsh-job-monitor
A dedicated background-job dashboard for the DSH Web UI: merges jobs from every session, shows producer-reported or parsed progress with an honest estimate fallback, groups by status, purpose, session or kind, streams live output, and keeps a local history ledger.
Install
dsh plugin --profile web add github:yuanjiangdev123/dsh-job-monitorREADME
后台任务面板 · dsh-job-monitor
安装
最快的方式(npm):在 DSH 里让 plugin_manager 用 install_bundle 安装,target 填 dsh-job-monitor。
npm install dsh-job-monitor # 仅工具链/离线分发时需要,DSH 自己会装
其他方式:
dsh plugin add dsh-job-monitor
装完刷新页面(或等热更新),左侧栏出现「后台任务」图标。
包名 dsh-job-monitor(bundle 包,含 Host 补丁与 Web 客户端)。其他安装方式:
- 从 GitHub:
git clone https://github.com/YuanJiangDev123/dsh-job-monitor.git,把目录路径交给install_bundle。 - 本地目录 / 解压后:在 DSH 里执行
plugin_manager的install_bundle,target指向本目录的绝对路径。 - 打包分发:
npm pack生成dsh-job-monitor-<version>.tgz,对方解压成目录后按上面安装;或把 tgz 直接交给install_bundle。 - npm 发布后:
target直接用包名dsh-job-monitor。
安装后刷新页面(或等热更新),左侧栏会出现「后台任务」图标。
开发
npm run check # 静态自检:词典键、i18n 调用、主题 token、注册形状、进度条样式回归
npm test # 纯函数单测(VM 里加载 bundle)
dsh-job-monitor — 后台任务面板
一个独立页面(不是浮层):从左侧栏进入,看到当前所有会话里的后台任务,按状态 / 用途 / 会话 / 类型分组,逐条看实时输出。
页面
后台任务 正在监视 12 / 12 个会话 [搜索…]
┌ 运行中 ┐ ┌ 今日完成 ┐ ┌ 异常 ┐ ┌ 总输出 ┐ ← 点卡片即筛选
│ 1 │ │ 6 │ │ 1 │ │ 4.2 MB │
└────────┘ └──────────┘ └──────┘ └────────┘
[全部][运行中][已完成][异常] 分组 状态 用途 会话 类型 不分组
┌─ 任务(7) ──────────────────┐ ┌─ 详情 ──────────────────────┐
│ ● vite build 1分12秒 │ │ ● vite build 1分12秒 │
│ ▓▓▓▓▓░░ 62% bash 进行中 │ │ bash · 运行中 · 会话A │
│ ─────────────────────────────│ │ ┌──────────────────────────┐ │
│ ● pytest 已完成 ▓▓▓▓▓ 42秒 │ │ │ ✓ 42 passed in 3.2s │ │
│ bash · exit code: 0 · 会话A │ │ │ │ │
│ ─────────────────────────────│ │ └──────────────────────────┘ │
│ ○ build.sh 非零退出 ▓▓▓ 1分2秒│ │ 累计 812 B [复制命令][复制输出]│
└──────────────────────────────┘ └──────────────────────────────┘
- 入口只有侧栏图标(
sidebar.panellist),不再有右下角浮层。 - 覆盖所有会话:页面为每个已知会话各开一条 roster 流(引用计数、与标题栏共享),上限 40 个,标题旁显示「正在监视 N / M 个会话」。
- 分组:状态 / 用途 / 会话 / 类型 / 不分组,切换不产生额外网络开销。用途按命令意图自动判定(下载、安装、构建、测试、服务、压缩、检索、清理、Git、其他),行内也有一个小标签。
- 搜索:匹配任务名、类型、会话标题。
- 进度:每个运行中的任务都会被观测(最多 4 条输出流,仍与标题栏共享),所以 curl / wget / 构建工具打印的百分比能直接读到;读不到的按该命令历史中位耗时估算并标
≈,超期后继续缓慢爬升而不是冻在 95%。 - 会话跳转:行内的会话名可点击,直接打开那个会话。
- 时间:悬停计时器显示开始 / 结束的准确时刻。
- 详情:选中任务后右侧是实时输出(自动跟尾、上滚暂停、「跳到最新」)、累计字节、复制命令、复制输出、下载
.log、中止。 - 键盘:列表聚焦后
j/k或 ↑ / ↓ 移动选中,Enter选中;页面上按/直接聚焦搜索框。 - 中英双语、只用主题 token、
prefers-reduced-motion下关闭动画。
关于「进度条」——为什么大多是流动条而不是百分比
DSH 的任务数据里没有数值进度字段。JobView 只有 status / startedAt / finishedAt / output.total / detail,唯一的 progress 是一行自由文本,而且只有任务生产者主动写才有——bash 任务从不写。
所以这里分档显示,绝不编造数字:
| 档 | 条件 | 显示 |
|---|---|---|
| 真进度 | progress / detail / 最近 40 行输出里能解析出 N/M 或 N% | 实心条 + 3/6 或 42% |
| 不确定 | 运行中但没有任何分母 | 流动条纹条 + 右侧「进行中」 |
| 终态 | 已结束 | 满条,绿=干净退出、琥珀=非零退出、红=真失败 |
非零退出在 DSH 里状态仍是
completed,退出码写在detail: exit code: N。所以红点只给「进程没起来」,琥珀点给「跑完了但退出码非零」——两者在界面上分开。
数据来源
| 用途 | 接口 |
|---|---|
| 各会话任务清单 | ctx.jobs.watchRows(sessionId)(引用计数的 remote.job.list 流) |
| 任务输出 | ctx.jobs.observe(sessionId, jobId)(引用计数的 remote.job.follow 流) |
| 中止任务 | ctx.jobs.kill(sessionId, jobId) |
| 会话列表与标题 | useSessions()(ids / byId[].title) |
文件
client.js— 页面、分组筛选、输出面板、侧栏图标(main+sidebar.panellist)index.js— Host 侧空实现(bundle 需要一个 Host 行)cordis.patch.yml— 插入job-monitor行locale/{zh,en}.json— 插件列表里的标题与描述icon.svg— 原创图标scripts/check.mjs— 静态自检(词典键集合、i18n 键、主题 token、注册形状)scripts/test-helpers.mjs— 纯函数单测(VM 里加载 bundle,不碰 React 渲染)
自检
npm run check # 静态:词典键集合、i18n 键、主题 token、注册形状
npm test # 10 项纯函数单测
变更记录
- v1.x — 右下角浮层:胶囊 + 列表 + 单任务实时输出。
- v2.x — 浮层转控制台:固定观察目标、收起态滚动最新行、错误边界、窄屏规则、单测与静态自检。
- v3.6.5 — 插件模块重载后自动恢复面板:宿主会把被清掉的选中值置空,现在记住「刚才停在该面板」并重新选中,不再需要手动点一次。
- v3.6.4 — 修复页面空白:状态声明排在引用它的 memo 之后,每次渲染都触发 TDZ 异常(被布局裁掉后表现为空白);「按用途」分组在重启后不再丢失;自检新增声明顺序回归断言。
- v3.6.3 — 本地历史台账:结束的任务摘要(命令、用途、耗时、输出、退出码)落盘保存(上限 200 条),页头「历史」切换查看累计/成功/异常/平均耗时、最常跑的命令与最近的异常,可一键清空。
- v3.6.2 — 行置顶(★,持久化);紧凑/舒适行高切换;快捷键
Esc/gG/x中止 /r复制命令;详情面板内输出搜索(高亮、只看匹配行、命中计数);一键导出 Markdown 任务报告。 - v3.6.1 — 进度旁显示按当前速率估算的剩余时间;运行中 90 秒无新输出标「可能停滞」;页头显示多任务总体进度。
- v3.6 — 设置面板(会话监视上限 5–200、同时观测输出 1–12,持久化到本地);崩溃页可复制错误详情;修正
/快捷键挂错组件的问题;新增 GitHub Actions 自检工作流。 - v3.5.1 — 修复进度条不填充:
.jp-fill是行内span,宽高被忽略,现在显式display:block,并在自检里加了回归断言。 - v3.5 — 新增用途分类:按命令意图分为下载 / 安装 / 构建 / 测试 / 服务 / 压缩 / 检索 / 清理 / Git / 其他,行内显示小标签,并新增「按用途」分组(固定顺序)。
- v3.4 — 进度解析更准:向后扫 40 行而不是只看最后一行;日期
2026/11/05、时间12:03、版本v1.2/3不再被误判成分数;只接受done ≤ total的合法计数;运行期间数字只增不减(解析丢了也不会倒退)。 - v3.3 — 性能:行组件改为
React.memo(稳定的选择/中止回调、原始类型 props),输出分片不再导致整表重渲染。 - v3.2 — 输出可下载为
.log;/聚焦搜索。 - v3.1 — 常规进度条(140×8px、填充过渡、右侧定宽数字):运行中任务全部观测、静默任务按历史耗时估算(≈)、超期后缓慢爬升;会话名可点击跳转;计时器悬停显示起止时刻;列表项补
aria-activedescendant。 - v3.0 — 改为独立页面(侧栏入口):跨会话聚合、聚合卡片筛选、搜索、按状态/会话/类型分组、进度三档(真进度 / 不确定 / 终态)、详情实时输出、复制命令与输出、键盘导航。移除浮层。
已知限制
- 会话数超过 40 时只监视前 40 个(按
sessions.ids顺序),标题旁会显示实际监视数。 - 没有重试 API,所以「重跑」只能复制原始命令。
- 百分比只在任务自己报了
N/M时出现;大多数命令不会有。
Related plugins
dsh-web (dsh-task-board)
zhu1090093659/dsh-web
dsh-web (dsh-web-all)
zhu1090093659/dsh-web
dsh-TUI
ccch1mneyyy/dsh-tui
dsh-web-ui (dsh-task-board)
zhu1090093659/dsh-web-ui