DeepSeek Harness Plugin Hub

发布与管理完整 Harness Profiles,发现适合你的插件。

探索

插件目录环境预设文档中心动态

社区

发布插件联系我们报告问题

相关链接

Plugin Hub GitHubDeepSeek Harness 官方项目系统状态隐私说明
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

独立、非官方社区项目,与 DeepSeek 官方无隶属、授权或背书关系。

Job Watch — DeepSeek Harness 插件(DSH Plugin)
DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录
← Plugins
J

dsh-job-watch

Job Watch

DSH Web GUI:将长时间运行的作业 ID 附加到当前对话,并让侧边栏行显示其状态——作业运行时为粉色,完成后为绿色(回来分析),找不到 ID 时为琥珀色。提供程序只是一个 shell 命令加一个正则表达式,因此任何能够列出正在运行内容的工具(HPC 调度器、裸机上的 tmux、自定义 CLI)都可以使用。

插件会安装到这里;不确定时保持 web。

npx -y @deepseek-ai/dsh plugin --profile web add github:yanggaihao5-sys/dsh-job-watch#25527710474f901a5d2b57a292b5f0f8ae5f7fde
README兼容性版本
Three tracked conversations, each carrying the running colour on its sidebar row

说明

DSH Web GUI:将长时间运行的作业 ID 附加到当前对话,并让侧边栏行显示其状态——作业运行时为粉色,完成后为绿色(回来分析),找不到 ID 时为琥珀色。提供程序只是一个 shell 命令加一个正则表达式,因此任何能够列出正在运行内容的工具(HPC 调度器、裸机上的 tmux、自定义 CLI)都可以使用。与 DeepSeek 无关联。

兼容性与来源证明

Job Watch 以 dsh-job-watch 发布,当前版本为 0.1.0。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

DSH 兼容范围
*
运行环境
web
发布来源
github
Registry 更新时间
2026/10/11

版本

0.1.0stable
2026/10/11

相关插件

正在加载相关插件…

最新版
0.1.0
DSH
*
HMR
重启进程
Tree shaking
未声明可安全裁剪
解包体积
未提供
文件数
未提供
Surface
web
许可证
MIT
发布源
github
GitHub
★ 0
周下载
0
最近提交
2026/10/11
查看源码 ↗
README Badge

点击下方 Badge 复制 Markdown,粘贴到 README 即可。

这是你的 Plugin?认领权益 · 优先安全扫描

验证 package.json 声明的 GitHub 仓库,即可管理这个公开页面。认领后,Hub 会优先安排当前版本的安全扫描,并在通过后公开展示结果。

认领这个 Plugin →
报告问题

相关插件

继续浏览 ui-customization 分类下经过校验的插件。

Web App@deepseek-ai/dsh-web-appdsh 浏览器界面捆绑包:位于 dsh-base 之上的 Web 补丁层,加上运行时粘合插件(提供前端 dist、Web 界面提示符、bash 运行时变量和 URL 行)Experimental Agent Team Web Profile@deepseek-ai/dsh-experimental-agent-team-web-profile用于 Agent Teams Remote 和 UI 插件的实验性 Web 配置层Ab Chartdsh-ab-chart带有绘制其调用的浏览器卡片的图表渲染工具,封装在一个可发布的插件包中Whale Widgetdsh-whale-widgetDSH Web 界面右下角的 DeepSeek 余额小鲸鱼挂件:余额/今日已用/峰谷定价、自定义泡泡点击序列(文本/余额/今日/峰谷/图片/随机语句与并列加权选择)、逐行样式与字体、悬浮快捷编辑、音效与每轮消耗、自定义角色/动图/音效、吸附与翻转自定义

README

dsh-job-watch

A long-running job you did not start, pinned to the conversation that cares about it. The sidebar row of that conversation turns pink while the job runs, green once it has finished (come back and analyse the result), and amber when the job id cannot be found.

English | 中文速览

Not affiliated with DeepSeek. This is an independent community plugin for DeepSeek Harness (DSH). "DeepSeek Harness" is named only to describe compatibility.


The problem

An agent submits a job that takes six hours — to a cluster scheduler, to a bare-metal box over SSH, to tmux somewhere — and then the session goes quiet. The job's state lives in a completely different program (squeue, bjobs, tmux list-sessions), so the only ways to find out are:

  • open a terminal and poll it by hand, or
  • keep a monitoring tab open, or
  • notice four hours later that it finished and you never looked.

The GUI already knows which conversation you were working in. dsh-job-watch attaches the job id to that conversation, queries the provider for you, and paints the conversation's row — so "which conversation still has something running, and which one finished while I was away" is answered by the sidebar you are already looking at.

□ 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

Green is deliberately sticky: it does not expire, because it exists to make you come back. It clears the moment you actually say something in that conversation — and injected context (workspace instructions, skill catalogs, runtime snapshots) does not count as "saying something", because that would clear it silently and defeat the whole feature.

Screenshot

Three tracked conversations, each carrying the running colour on its sidebar row

A real screenshot of the sidebar: three tracked conversations, each with the running bar (#ec4899, the exact colour the plugin paints) on the left edge of its row. The conversation titles are covered by a solid block — they are the author's private session names, and the crop is verified pixel by pixel to contain no text at all. No green example appears here simply because no tracked job had finished when the shot was taken; green means "finished, come back and analyse".

How it works

HalfRuns inDoes
host (lib/index.js)the dsh processthe job ledger, the provider poller, the job_watch agent tool, /api/job-watch/*
browser (lib/client.js)the Web GUIreads the state endpoint and paints the sidebar rows

The plugin owns no job logic. A provider is a shell command plus one regex applied per output line — so an HPC scheduler, tmux on a bare-metal box, or your own status CLI are all the same thing to it. Nothing about a cluster, queue or path is hard-coded.

Queries happen on four triggers, all of them cheap and skipping each other:

TriggerWhy it exists
every pollMinutes (default 30)the normal rhythm
a 60 s heartbeat that compares the wall clock against the monotonic clocka suspended machine freezes timers, so a timer firing "on time" proves nothing; clock drift > 90 s is the evidence of a sleep, and the poll catches up right away
opening / refocusing the GUIyou are here, so the state you are shown should be current (the host only re-queries if the ledger is older than requestStaleSeconds)
right after registerthe colour must be correct immediately, not in 30 minutes

Install

dsh plugin --profile web add dsh-job-watch

Restart dsh web afterwards (--profile must come after plugin — the other order is rejected).

Then configure at least one provider in your profile patch, ~/.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 is applied per line; it needs a named group id, and may add stat and name. Lines that match nothing are ignored, so headers, banners and warnings cost nothing. ANSI colour codes are stripped first, which matters as soon as your command runs through a shell that thinks it is talking to a terminal.

Provider reference

KeyRequiredMeaning
id✅the name used by job_watch(provider=…) and shown in the tooltip
labelhuman-readable name for messages
command✅run through the platform shell; write the SSH call yourself, so no remote details live in the plugin
linePattern✅regex per line, named group id (required), stat, name (optional)
runningStatesoverrides the default list (RUN, PEND, QUEUE, WAIT, …)
doneStatesoverrides the default list (DONE, EXIT, FAIL, ABORT, KILL, …)

Other config: pollMinutes, heartbeatSeconds, commandTimeoutSeconds, minPollGapSeconds, requestStaleSeconds, unknownAfterSeconds, pruneDays (finished + acknowledged rows are dropped after this long), missingMeans (done = a job vanishing from its provider's listing has finished; unknown = paint it amber instead), statePath (default $DSH_HOME/job-watch.json).

A non-zero exit from a provider command is not fatal: tmux list-sessions exits 1 when there are no sessions, and several schedulers print the listing while warning on stderr. stdout is parsed either way and the failure is reported alongside the state.

Agent integration

The host injects a short rule into every agent's system prompt, and exposes one tool:

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 without jobIds auto-claims: every job the providers currently list as running and that no conversation tracks yet. Useful after the fact ("what did I forget to register?").
  • Registering is not optional. No colour can be inferred from a job that nobody told the plugin about — a job submitted in tmux or on a cluster leaves no trace in the ledger. This is why the rule lives in the system prompt rather than in a doc nobody reads.
  • Every report ends each job with a recommended finish time. It is arithmetic (registration time + the ETA you registered) or an explicit "cannot be estimated, here is how to measure it" — the plugin never invents a time. An ETA that has already elapsed while the provider still reports the job as running is called out as overdue rather than assumed finished.
  • SKILL.md is the same contract written for an agent that loads skills.

Limitations (measured, not guessed)

  • The sidebar has no decoration API. The browser half finds a row's session id through the React fiber chain hanging off the row DOM node and injects the marker into the row. This is inherently tied to the current sidebar implementation; when it breaks, the console and window.__dshJobWatch.stats() say so instead of failing silently.
  • register is a manual step — see above. There is no way around it for jobs DSH did not spawn.
  • Only rows the sidebar renders get a colour. A conversation that is not in the visible list is not painted (the rollup is still computed, so it paints as soon as the row appears).
  • linePattern is yours to get right. A pattern that matches the header row as a job will track a fake job; a pattern that matches nothing silently tracks nothing (which is why refresh reports how many ids each provider listed).
  • No test of the GUI itself. node --test test/kernel.test.mjs covers the kernel — listing parsing, STAT folding, the real-prompt discriminator, and the finish-time contract.

Prior art, and what is actually new here

Job listing is not new, and none of it is claimed as an idea of this plugin. In the DSH ecosystem:

ProjectWhat it coversWhy this is different
official @deepseek-ai/dsh-client-ui-jobs (the ui-jobs entry)background jobs DSH itself spawned, in the session headerthis is for jobs DSH did not start: a scheduler, a tmux session, another machine
lql341/dsh-scnetSCNet HPC as tools + a skill (submit, status, logs, cancel)on-demand tool calls for one specific platform; no conversation-level colour, no ETA contract
Gczmy/dsh-node-scheda dashboard for their own sched daemonrequires that daemon; a main-panel view rather than the conversation list
Luaphes/dsh-web-attention-badgesession attention state in the browser tab bar (amber = waiting on you, green = done)a session has finished, not a job; painted in the tab strip, not on the conversation row
catsenior507/dsh-command-centera panel for running background jobsa panel you open, not a colour on the row you are already reading

The increment claimed here is narrow: an external job id → a colour on that conversation's sidebar row, plus the finish-time contract (arithmetic or an explicit refusal to guess) and the sleep/wake-safe poller. Everything else — the job tools, the dashboards, the attention badges — belongs to the projects above.

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 是要打开的作业面板。本插件只占一格:外部作业 → 对话列表那一行的颜色 + 结束时间口径 + 抗休眠的轮询。