Skip to main content
Y

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-monitor

README

后台任务面板 · dsh-job-monitor

npm license

安装

最快的方式(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 / g G / 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