把长任务挂到会话上,侧边栏变色提示进度
29.9/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/12 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add yanggaihao5-sys/dsh-job-watch该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:待复验
是什么
dsh 原生插件 · browser
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 23 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 5 处,展示前 5 条)
- 读取本地文件lib/index.js:102
const text = readFileSync(file, 'utf8') - 写入本地文件lib/index.js:111
mkdirSync(dirname(file), { recursive: true }) - 写入本地文件lib/index.js:112
writeFileSync(file, JSON.stringify(value, null, 2) + '\n', 'utf8') - 执行外部命令来自配置/变量lib/index.js:138
exec(command, { - 发起网络请求lib/client.js:212
fetch(STATE_URL, { credentials: 'same-origin', cache: 'no-store' })
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 挂载长任务id到会话
- 侧边栏变色显示状态
- 正则匹配任务输出
README
由 DeepSeek 最新模型翻译生成dsh-job-watch
一个不是你启动的长时间任务,钉在关心它的那个会话上。 任务运行期间,该会话在侧边栏的那一行变成粉色;任务结束后变成绿色(回来分析结果);找不到任务 id 时变成琥珀色。
与 DeepSeek 无隶属关系。 这是面向 DeepSeek Harness(DSH)的独立社区插件。提及「DeepSeek Harness」仅为说明兼容性。
问题
智能体提交了一个要跑六小时的任务——提交给集群调度器、通过 SSH 提交给裸金属机器、提交给某处的 tmux——然后会话就安静了。任务状态存在完全不同的程序里(squeue、bjobs、tmux list-sessions),所以想知道状态只有这几种办法:
- 打开终端手动轮询,或者
- 一直开着一个监控标签页,或者
- 四小时后才发现它早就跑完了,而你从没看过。
GUI 本来就知道你在哪个会话里工作。dsh-job-watch 把任务 id 挂到那个会话上,替你查询服务商,并给会话那一行上色——于是「哪个会话还有东西在跑,哪个在我离开时跑完了」,你看着侧边栏就能得到答案。
展开完整文档(README 剩余 1 节)
dsh-job-watch
一个不是你启动的长时间任务,钉在关心它的那个会话上。 任务运行期间,该会话在侧边栏的那一行变成粉色;任务结束后变成绿色(回来分析结果);找不到任务 id 时变成琥珀色。
与 DeepSeek 无隶属关系。 这是面向 DeepSeek Harness(DSH)的独立社区插件。提及「DeepSeek Harness」仅为说明兼容性。
问题
智能体提交了一个要跑六小时的任务——提交给集群调度器、通过 SSH 提交给裸金属机器、提交给某处的 tmux——然后会话就安静了。任务状态存在完全不同的程序里(squeue、bjobs、tmux list-sessions),所以想知道状态只有这几种办法:
- 打开终端手动轮询,或者
- 一直开着一个监控标签页,或者
- 四小时后才发现它早就跑完了,而你从没看过。
GUI 本来就知道你在哪个会话里工作。dsh-job-watch 把任务 id 挂到那个会话上,替你查询服务商,并给会话那一行上色——于是「哪个会话还有东西在跑,哪个在我离开时跑完了」,你看着侧边栏就能得到答案。
□ conv A · (no mark) nothing to do ▌ conv B · ● pink, pulsing a tracked job is running ▌ conv C · ● green finished — come back and analyse ▌ conv D · ● amber the id cannot be found by its provider
绿色是故意做成粘性的:它不会过期,因为它存在的意义就是让你回来。你只要在那个会话里真正说点什么,它就会清除——而注入的上下文(工作区指令、技能目录、运行时快照)不算「说点什么」,否则它会被悄悄清掉,整个功能就废了。
截图
三个被跟踪的会话,每个都在侧边栏那一行带着运行中的颜色
侧边栏的真实截图:三个被跟踪的会话,每个都在那一行左边缘带着运行中的色条(#ec4899,插件实际使用的颜色)。会话标题被实心色块盖住——它们是作者的私人会话名,裁剪区域已逐像素验证,不含任何文字。这里没有绿色示例,只是因为截图时还没有被跟踪的任务跑完;绿色表示「已结束,回来分析」。
工作原理
| 部分 | 运行位置 | 做什么 |
| host(lib/index.js) | dsh 进程 | 任务台账、服务商轮询器、job_watch 智能体工具、/api/job-watch/ |
| browser(lib/client.js) | Web GUI | 读取状态端点,给侧边栏各行上色 |
插件本身不包含任何作业逻辑。服务商就是一条 shell 命令,外加一条正则,逐行作用于输出——所以 HPC 调度器、裸机上的 tmux、你自己的状态命令行,对它来说都是同一回事。
集群、队列、路径,全都没有硬编码。
查询由四个触发条件发起,都很轻量,且互相跳过:
| 触发条件 | 为什么存在 |
| 每 pollMinutes(默认 30) | 正常节奏 |
| 60 秒心跳,比对墙上时钟与单调时钟 | 机器挂起会冻结定时器,所以定时器「按时」触发证明不了什么;时钟漂移 > 90 秒就是睡过的证据,轮询会立刻补上 |
| 打开 / 重新聚焦 GUI | 你就在这儿,展示给你的状态就该是当前的(只有账本比 requestStaleSeconds 更旧时,宿主才会重新查询) |
| register 之后立刻 | 颜色必须马上正确,而不是 30 分钟后 |
安装
dsh plugin --profile web add dsh-job-watch
之后重启 dsh web(--profile 必须放在 plugin 之后——反过来会被拒绝)。
然后在配置档补丁里配置至少一个服务商,路径是 ~/.dsh/profiles/<profile>/cordis.patch.yml:
- id: job-watch
config:
pollMinutes: 30
providers:
1) a scheduler that prints one job per line (Slurm here: id, state, name)
- id: cluster
label: Cluster
command: 'ssh login01 "squeue -u $USER -h -o ''%i %T %j''"'
linePattern: '^(?<id>\S+)\s+(?<stat>\S+)\s+(?<name>\S+)$'
2) a bare-metal box where "a job" is a tmux session name
- id: lab
label: Lab box
command: 'ssh lab "tmux list-sessions -F ''#{session_name}''"'
linePattern: '^(?<id>[A-Za-z0-9_.-]+)$'
linePattern 逐行应用;它需要一个命名分组 id,还可以加上 stat 和 name。什么都匹配不上的行会被忽略,所以表头、横幅、警告都不花代价。ANSI 颜色码会先被剥掉,只要你的命令经过一个自以为在跟终端说话的 shell,这一点就很重要。
服务商参考
| 键 | 必填 | 含义 |
| id | ✅ | job_watch(provider=…) 使用的名字,也显示在工具提示里 |
| label | | 消息里用的可读名称 |
| command | ✅ | 通过平台 shell 运行;SSH 调用自己写,所以插件里不存任何远程细节 |
| linePattern | ✅ | 逐行正则,命名分组 id(必填)、stat、name(可选) |
| runningStates | | 覆盖默认列表(RUN、PEND、QUEUE、WAIT、…) |
| doneStates | | 覆盖默认列表(DONE、EXIT、FAIL、ABORT、KILL、…) |
其他配置:pollMinutes、heartbeatSeconds、commandTimeoutSeconds、minPollGapSeconds、 requestStaleSeconds、unknownAfterSeconds、pruneDays(已结束 + 已确认的行超过这个时长就丢弃)、 missingMeans(done = 作业从服务商列表里消失就算结束;unknown = 改成琥珀色),statePath(默认 $DSH_HOME/job-watch.json)。
服务商命令返回非零退出码不算致命错误:没有会话时 tmux list-sessions 会以 1 退出,还有几个调度器在打印列表的同时往 stderr 写警告。无论哪种情况,stdout 都会被解析,失败信息会和状态一起上报。
智能体集成
宿主会往每个智能体的系统提示词里注入一条简短规则,并暴露一个工具:
job_watch(action='register', jobIds=['40217'], provider='cluster', etaMinutes=540, note='sweep A')
job_watch(action='list')
job_watch(action='refresh')
job_watch(action='clear')
- register 不带 jobIds 时自动认领:服务商当前列为运行中、且还没有任何会话跟踪的作业,全部认领。事后补救很有用(「我忘了登记哪些?」)。
- 登记不是可选项。* 没人告诉插件某个作业的存在,插件就推断不出任何颜色——在 tmux 里或集群上提交的作业,不会在账本里留下任何痕迹。正因如此,这条规则放在系统提示词里,而不是放在没人看的文档里。
- 每份报告都会给每个作业标出建议完成时间。它要么是算出来的(登记时间 + 你登记的 ETA),要么是一句明确的「无法估算,测量方法如下」——插件从不编造时间。如果 ETA 已经过了,而服务商仍报告作业在运行,就标记为逾期,而不是假定已完成。
- SKILL.md 是同一份契约,写给会加载技能的智能体看。
局限(实测得出,不是猜的)
- 侧边栏没有装饰 API。 浏览器端通过行 DOM 节点上挂着的 React fiber 链找到该行的会话 id,再把标记注入行内。这天然依赖当前侧边栏的实现;一旦失效,控制台和 window.__dshJobWatch.stats() 会明说,而不是悄悄失败。
- register 是手动步骤——见上文。DSH 没有自己启动的作业,绕不开这一步。
- 只有侧边栏渲染出来的行才会着色。 不在可见列表里的会话不会着色(汇总仍然会算,所以行一出现就会着色)。
- linePattern 得你自己写对。 匹配到表头行的模式会跟踪出一个假作业;什么都匹配不到的模式会悄悄什么都不跟踪(所以 refresh 会报告每个服务商列出了多少个 id)。
- GUI 本身没有测试。 node --test test/kernel.test.mjs 覆盖内核——列表解析、STAT 折叠、真实提示词判别器,以及完成时间契约。
已有做法,以及这里真正新在哪
作业列表并不新鲜,这里没有任何一点被声称为本插件的原创想法。在 DSH 生态里:
| 项目 | 覆盖范围 | 这里有何不同 |
| 官方 @deepseek-ai/dsh-client-ui-jobs(ui-jobs 入口) | DSH 自己起的后台任务,显示在会话头部 | 这里管的是 DSH 没有启动的作业:调度器、tmux 会话、另一台机器 |
| lql341/dsh-scnet | 把 SCNet HPC 做成工具 + 技能(提交、查状态、看日志、取消) | 针对某一个平台按需调用工具;没有对话级别的颜色,也没有结束时间口径 |
| Gczmy/dsh-node-sched | 给自家 sched 守护进程做的看板 | 依赖那个守护进程;是主面板视图,不是对话列表 |
| Luaphes/dsh-web-attention-badge | 浏览器标签栏里的会话注意力状态(琥珀 = 在等你,绿 = 已完成) | 管的是会话结束,不是作业;画在标签栏上,不在对话那一行 |
| catsenior507/dsh-command-center | 跑后台作业的面板 | 要你主动打开的面板,不是正在看的那一行上的颜色 |
这里新增的东西很窄:外部作业 id → 对话侧边栏那一行的颜色,再加上结束时间口径(要么算出来,要么明确拒绝瞎猜)和抗休眠的轮询。
其余的一切 —— 作业工具、看板、注意力徽标 —— 都归上面那些项目。
License
MIT. See LICENSE.
中文速览
问题:作业交出去要跑几小时,状态却在另一个程序里(squeue / bjobs / tmux list-sessions),于是要么手动开终端轮询,要么四小时后才发现早跑完了。
做法:把作业号绑到当前对话上,插件自己按配置的 provider 去查,侧边栏那一行直接变色 —— 🩷 粉 = 在跑 | 🟢 绿 = 已结束,回来分析 | 🟠 橙 = 查不到。绿色不会自己过期(它就是要喊你回来),你在那个对话里真的说话之后才消失(注入的上下文不算说话)。
provider 就是「一条命令 + 一行一条的正则」,所以调度器、裸机 tmux、你自己的状态 CLI 都是同一种东西:插件里不写死任何集群、队列、路径。查询有四条触发(定时 / 心跳发现休眠唤醒 / 打开页面 / 注册后立刻)。
必做:dsh plugin --profile web add dsh-job-watch,重启 dsh web,然后在 ~/.dsh/profiles/<profile>/cordis.patch.yml 里配 providers(见上文)。每次提交作业后必须登记 ——没人登记的作业不会有任何颜色,这是设计约束,不是 bug:
job_watch(action="register", jobIds=["40217"], provider="cluster", etaMinutes=540)
每条报告都会给出推荐结束时间:要么是「登记时刻 + 你给的 ETA」算出来的,要么明确说无法可靠推算 并告诉你从哪取数(作业自身的 elapsed 列 / 日志里的进度行)——不编时间。
与既有项目的关系:官方 ui-jobs 管的是 DSH 自己起的后台任务;dsh-scnet 是 SCNet 的工具+技能; dsh-node-sched 是自家 sched 守护进程的看板;dsh-web-attention-badge 是标签页里的会话注意力状态; dsh-command-center 是要打开的作业面板。本插件只占一格:外部作业 → 对话列表那一行的颜色 + 结束时间口径 + 抗休眠的轮询。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
yanggaihao5-sys/dsh-job-watch
把长任务挂到会话上,侧边栏变色提示进度
相关插件 · 浏览器
智能体插件框架deepseek-ai/deepseek-harness
DeepSeek Harnessdsh是由 DeepSeek AI 开发的开源 agent harness智能体框架。
★ 270,422已汉化DSH
71.9
多设备 Agent 看板YaoApp/yao
✨ 所有 Agent 和工作区集中管理,覆盖你的每一台设备。任务看板追踪进度,桌面端、移动端、浏览器、API…
★ 8,147已汉化DSH
71.2
可扩展侧边栏工作台omdsh-dev/DSH-better-sidebar
DSH 的双工作台:原生右侧栏 + 自绘底部面板,并把 ctx.betterSidebar 服务开放给所有插件
★ 4,761已汉化DSH
71.1
浏览器自动化桥Tencent/BrowserSkill
你的 Agent。你的浏览器。连接,就能协作。
★ 9,967已汉化DSH
71
AI 小说创作工作台EthanYoQ/AI-Novel-Writer
AI 小说作家 / AI Novel Writer
★ 1,591已汉化DSH
70.7
智能体浏览器引擎platonai/Browser4
DeepSeek Harness 集成
★ 1,175已汉化DSH
70.4
这是你的仓库?认领条目