🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

后台任务面板 cholf5/dsh-plugin-job-panel

DeepSeek Harnessv0.1.7-alpha.2
cholf538 天前有提交已提供中文文档扫描:未发现敏感能力

点击任务行查看实时终端输出并停止任务

35.9/100
综合分
9
GitHub 星标
35
npm 周下载
—/5
用户评分

数据截至 2026/9/27 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-plugin-job-panel
npm 源 · dsh-plugin-job-panel 的发布者账号已校验与本仓库一致

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · browser
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 38 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包dsh-plugin-job-panel @ 0.1.7-alpha.2
✓Node 引擎要求 >=22 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/11/2 06:37:21

安全扫描自动 · 静态分析源码
v2.7.0
🟢 扫描:未发现敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描未发现敏感能力:最多只发网络请求、读取自身元数据或只读文件,未发现执行命令、文件写入或敏感信息读取。

写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 7 处,展示前 7 条)
  • 发起网络请求
    lib/client.js:196
    const response = await fetch(`${OUTPUT_PATH}?${params.toString()}`, { signal, cache: "no-store" });
  • 发起网络请求
    lib/client.js:204
    const response = await fetch(`${FULL_PATH}?${params.toString()}`, { signal, cache: "no-store" });
  • 发起网络请求
    lib/client.js:209
    const response = await fetch(STOP_PATH, {
  • 写入剪贴板
    lib/client.js:10295
    await navigator.clipboard.writeText(command);
  • 发起网络请求
    src/client/api.js:42
    const response = await fetch(`${OUTPUT_PATH}?${params.toString()}`, { signal, cache: "no-store" });
  • 发起网络请求
    src/client/api.js:62
    const response = await fetch(`${FULL_PATH}?${params.toString()}`, { signal, cache: "no-store" });
  • 发起网络请求
    src/client/api.js:73
    const response = await fetch(STOP_PATH, {
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

界面预览

1 张 · 点击查看大图

功能亮点

  • 点击任务行查看输出
  • 实时终端输出
  • 停止任务

DeepSeek Harness 网页界面右侧边栏的任务面板。

v0.1.7-alpha.22026-09-26
dsh 0.1.7 兼容版本。 版本说明——从这个版本起,插件版本号与它验证过的 dsh 版本保持一致(0.1.7-alpha.2 ↔ dsh 0.1.7-alpha.2)。这个版本在功能上就是原本的 0.1.1 修复版,取代 npm 上的 0.1.0。 · 修复 · 弹窗行标识(dsh 0.1.7)——dsh 0.1.7 改了后台任务弹窗识别行的方式(JobItem fiber / guide entry id),导致从弹窗行打开任务面板失效。面板现在跟踪新的标识,同时兼容 0.1.6 时期的形态,两个 dsh 版本都能正常用。(#1724607) - 修复 dsh 0.1.7 任务弹窗行标识变更导致的「点击行无反应」问题;新旧两种行形态均兼容。 · 新增 / 文档 · 简体中文 README,带中英切换。 · 固定验证基线:META/dsh-upgrade.json 标记、META/dsh-baseline.txt(dsh 0.1.7-alpha.2),以及 verified-dsh/v0.1.7-alpha.2 标签。 · 验证 · npm test —— 39 通过 / 0 失败;node --check lib/*.js 无报错。 · 在运行中的 dsh 0.1.7-alpha.2 上实测通过。 · 安装 npx @deepseek-ai/dsh plugin --profile web add dsh-plugin-job-panel -w 安装(或升级)后重启 dsh web——bundle 层不会热重载——然后刷新页面。 完整更新日志:
v0.1.02026-09-20
DeepSeek Harness 网页图形界面的右侧栏任务面板首次公开发布:点击会话头部后台任务浮层里的某一行即可查看任务,包括命令、带 iterm2 风格有界回滚的实时终端输出、完整的溢出文件历史,并能停止该任务。 · 亮点 · 浮层行可点击——官方后台任务浮层只渲染只读行,不提供行级扩展位;这里按文档给出的无扩展位方式增强行(MutationObserver + data-* + 一条 CSS 规则),绝不向 React 管理的子节点注入内容 · 面板——通过官方两阶段 sidebarRightTabs 路径注册的页面标签类型:类型标签、实时状态点、跳动的时长、启动/结束/详情信息、带复制按钮的命令块、捕获的 spawn 工作目录,以及停止控件;分屏、浮动、全屏由停靠套件提供 · 真正的终端引擎——输出渲染在嵌入的 xterm.js 终端里:SGR 颜色(16/256/真彩色)、OSC、C1 双字节转义、粗体/暗淡/斜体/下划线、回车进度重绘;2000 行回滚,自动跟随并带浮动跳回按钮 · 语义化日志配色——纯文本捕获内容在展示时按级别词汇着色(error 红 / warn 琥珀 / debug 暗淡,沿用 console-logger 惯例);面板从不改动模型读取的流,输出里真实的转义序列按原样渲染 · 完整的溢出文件历史——超出 64 KB 内存窗口的流会保留宿主溢出文件;一个按钮拼接溢出文件头部与保留的尾部,并检测字节数缺口 · 有意的停止——第一次点击进入 3 秒待确认,第二次点击确认;宿主通过启动时记录的属主会话执行终止,浏览器从不宣称拥有权限 · 安装 npx @deepseek-ai/dsh plugin --profile web add dsh-plugin-job-panel -w 前置条件(dsh 可达性、pnpm)、用 cookie 探测验证路由、无 pnpm 的手动回退方案,以及故障排查:见 README。 · 兼容性 · 已针对 @deepseek-ai/dsh@0.1.5-rc.2 验证;Node >= 22 · 插件耦合了有文档但不稳定的内部接缝(任务注册表的启动语义、SubprocessHandle.collected 读取器、侧栏扩展位、/api 边界)——升级 dsh 时请重新核对 README 里的「版本敏感接缝」表 · npm 包附带构建好的 lib/(21 个文件,约 150 kB);@xterm/* 已打包在内,运行时除 dsh 本身外无需任何依赖 · 素材 下面的 demo.gif 就是 README 中展示的录屏。
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。

README

由 DeepSeek 最新模型翻译生成
dsh-plugin-job-panel DeepSeek Harness Web GUI 的右侧边栏任务面板 点击会话标题栏"后台任务"弹窗中的任意一行 → 查看命令、跟随其实时终端输出、停止该任务。 npm node License: MIT verified 点击弹窗中的某一行 → 面板页签打开并显示实时输出;完整历史从溢出文件加载;停止控件先待命、再确认。 双面插件(dual-face):一个包内同时包含 Node 半边(观察探针 + 三条精确 /api 路由)与浏览器半边(面板主体 + 弹窗行增强)。 已针对 @deepseek-ai/dsh@0.1.7-alpha.2 验证。MIT 许可。
展开完整文档(README 剩余 1 节)
dsh-plugin-job-panel

DeepSeek Harness Web GUI 的右侧边栏任务面板

点击会话标题栏"后台任务"弹窗中的任意一行 → 查看命令、跟随其实时终端输出、停止该任务。

npm
node
License: MIT
verified

点击弹窗中的某一行 → 面板页签打开并显示实时输出;完整历史从溢出文件加载;停止控件先待命、再确认。

双面插件(dual-face):一个包内同时包含 Node 半边(观察探针 + 三条精确 /api 路由)与浏览器半边(面板主体 + 弹窗行增强)。

已针对 @deepseek-ai/dsh@0.1.7-alpha.2 验证。MIT 许可。

亮点

| 🖱 弹窗行可点击 | 官方"后台任务"弹窗只渲染只读行 —— 本插件让每一行都成为点击目标,打开(或重新定位)面板页签 |
| 🖥 真正的终端引擎 | 输出渲染在嵌入式 xterm.js 终端里:SGR 颜色(16/256/真彩色)、OSC、粗体/暗淡/斜体/下划线、回车重绘的进度条 |
| 🎨 语义化日志配色 | 纯文本在展示阶段按级别词汇着色 —— error 红、warn 琥珀、debug 暗 —— 绝不触碰模型读取的那条捕获流 |
| 📜 基于溢出文件的完整历史 | 超出 64 KB 窗口的流内容保存为宿主侧溢出文件;一个按钮即可把溢出文件前段与保留尾段拼接起来(带字节缺口检测) |
| ⏹ 三思而后停 | 第一次点击进入 3 秒待命,第二次才确认;宿主按启动时记录的属主会话执行 kill |

安装

前置要求:

- dsh 命令可用 —— dsh --version。如果 dsh 不是全局命令(多数安装只通过 npx 使用),请给下文每条 dsh 命令加上 npx @deepseek-ai/dsh 前缀
- pnpm 已在 PATH 中(dsh 插件管理器会调用它):npm install -g pnpm

来自 npm registry —— 包自带构建好的 lib/,无需构建步骤
npx @deepseek-ai/dsh plugin --profile web add dsh-plugin-job-panel -w
或直接从 GitHub 安装
npx @deepseek-ai/dsh plugin --profile web add git+https://github.com/cholf5/dsh-plugin-job-panel.git -w

重启一次 dsh web(新增 bundle 不会热加载),然后刷新浏览器页面。

验证宿主路由是否已生效 —— 请携带会话 cookie:围栏会拒绝一切未携带 cookie 的 /api 请求,因此 401 不能说明任何注册状态:

curl -s -c /tmp/dsh-cookies.txt "http://127.0.0.1:3080/?token=" -o /dev/null # 换取会话 cookie(303)
curl -s -b /tmp/dsh-cookies.txt "http://127.0.0.1:3080/api/job-panel/output" # 400 jobId 校验报文 = 已注册;404 "not found" = 未注册

然后点击会话标题栏"后台任务"弹窗中的任意一行 —— 它会打开面板页签。

没有 pnpm,也不想装?手动回退方案

git clone https://github.com/cholf5/dsh-plugin-job-panel.git ~/.dsh/profiles/web/node_modules/dsh-plugin-job-panel

然后让 ~/.dsh/profiles/web/cordis.patch.yml 的内容为(这是该文件最终的顶层形态 —— 不要盲目地在 [] 行后面追加):

- insert:
- id: job-panel
name: dsh-plugin-job-panel

运行中的 dsh 会热加载这行补丁;随后刷新浏览器。

更新 / 卸载

npx @deepseek-ai/dsh plugin --profile web update dsh-plugin-job-panel -w # 或 remove dsh-plugin-job-panel -w

之后重启 dsh web。

它做了什么

1. 弹窗行可点击。 官方"后台任务"弹窗(dsh-client-ui-jobs)不提供行级扩展席位,因此这里采用文档记载的"无席位"增强方式:MutationObserver 为每一行打上 data-job-panel-id(任务 id,从该行的 React fiber 上读取 —— 自 dsh 0.1.7 起是 JobItem 包装 fiber 上的 props.job.id;0.1.5 的"带 key 的 "形态作为回退继续支持),一个点击监听器负责打开(或重新定位)面板页签 —— 但行内原生的终止按钮保持原行为,不会触发导航 —— CSS 提供指针/悬停/箭头视觉提示。绝不向 React 管理的子节点中注入任何元素。
2. 面板。 一种页面页签类型(kind: job-output,含引导区入口),通过官方两段式 sidebarRightTabs 路径注册;面板主体渲染 kind 徽标、实时状态点、跳动的时长、启动/结束/详情信息、命令块(生产者标签 —— 对 bash 任务即命令本身,带复制按钮和记录下的 spawn cwd)、流式输出视图,以及停止控件。页面页签在其所在窗格内去重,因此点击另一个任务会重新定位同一个页签;分屏 / 浮动 / 全屏则由停靠套件免费奉送。
3. 输出。 页签可见期间,面板以自己的字节偏移每 500 ms 轮询一次,并把原始增量转发给嵌入式 xterm.js 终端 —— 真正的终端引擎,因此 SGR 颜色(16/256/真彩色)、OSC、C1 双字节转义、粗体/暗淡/斜体/下划线以及回车重绘的进度条都原生渲染,样式状态跨行延续,与真实终端完全一致。有界历史即终端自身的回滚缓冲区(2000 行,iterm2 风格);自动跟随始终贴住底部,直到用户向上滚动(此时出现浮动跳回按钮);发生有损读取时,会带着缺口标记从保留尾段重新开始。当某个流的输出超出其内存窗口(默认每流 64 KB)时,宿主会保留一份溢出文件,"加载完整历史"按钮会重置视图,并把溢出文件前段与保留尾段按字节计数缺口检测拼接起来。
4. 停止。 第一次点击让按钮进入 3 秒待命,第二次点击才确认。宿主调用 ctx.jobs.kill(id, { id: ownerSession }) —— 注册表按会话 id 对调用者做鸭子类型判别,而属主会话是启动时记录的那个,所以浏览器从不自行声明权限。

输出是如何工作的(最有意思的部分)

浏览器半边 宿主半边 ┌───────────────────────────┐ ┌─────────────────────────────────┐ │ 弹窗行(可点击) │ GET /api/… │ JobTap 包装(行为保持): │ │ 面板页签 │ ──────────────▶ │ ctx.jobs.start │ │ └ 嵌入式 xterm.js │ 受围栏保护的 │ ctx.subprocess.spawn │ │ + 语义化颜色 │ /api 通道 │ 3 条精确路由: │ │ 停止控件(待命→确认) │ ◀────────────── │ output / full / stop │ └───────────────────────────┘ └─────────────────────────────────┘

任务注册表契约通过每个任务一个消费游标(ctx.jobs.read())暴露流输出,游标归模型的 job_output 工具所有;官方 README 把"独立观察者需要游标或快照 API"列为已知限制。若直接经由注册表读取,会抢走本属于模型的增量,并抑制其完成通知。

因此,本插件在下一层进行观察:

- 包装 ctx.jobs.start(保持行为不变),记录 kind / label / 属主会话,并在生产者的同步 run() 执行期间让对应条目保持打开;
- 包装 ctx.subprocess.spawn,把进行中的 start 所产生的第一个 collect 模式句柄归属到该条目 —— 句柄的 collected.stdout / collected.stderr 是文档明确为无游标的 SubprocessOutputReader("独立读取器不会互相消费对方的输出"),可从任意全流字节偏移读取,进程退出后依然可读。

共享的、经认证的 /api 通道上的三条精确路由负责提供这些数据:GET /api/job-panel/output(增量读取 + 快照)、GET /api/job-panel/full(溢出文件前段 + 保留尾段)、POST /api/job-panel/stop(终止)。请求先通过 connection 包的信任围栏与 cookie 认证,然后才进入分发。

终端颜色

捕获流按设计就是纯文本:harness 以 NO_COLOR=1、TERM=dumb 且无 TTY 运行每条命令,让模型看到干净的文本 —— 面板绝不触碰那条流。颜色只在展示阶段重建,分为两层:

1. 语义级别(始终开启)。 纯文本日志行 —— 绝大多数情况 —— 按级别词汇渲染:error/failed/fatal/exception/panic 红色,warn/deprecated 琥珀色,debug/trace/verbose 暗淡,即各控制台日志器的通用约定(.NET、serilog、log4j、……)。分类器只负责判断;终端把判断结果作为展示阶段的 SGR 包裹,应用到本身不含转义序列的行上。
2. 真材实料(如果存在)。 如果命令的输出本身就带转义序列,嵌入式终端会像真正的终端一样渲染它们 —— 16/256 色、真彩色、属性、光标寻址的进度重绘 —— 中间没有任何映射层。

想让某个任务显示真正的终端颜色,就在命令里强制打开 —— 常见的颜色检测器对 FORCE_COLOR 的优先级高于 NO_COLOR:

FORCE_COLOR=1 dotnet run # .NET / chalk / 大多数 Node 工具
CLICOLOR_FORCE=1 ./mytool # GNU 风格的工具
tool --color=always … # 带显式开关的工具

[!NOTE]
模型自己的 job_output 读的是同一条捕获流 —— 对模型会读取其输出的任务强制开启颜色,等于把转义序列也摆到模型面前。这个取舍属于命令的作者;面板刻意不去剥离或改写流来改变它。

终端主题跟随产品:面板背景、前景以及 error/warn 调色板项在挂载时从 dsh token 解析,并在主题切换时重新解析;16 色调色板的其余项采用中等亮度取值,在浅色与深色表面上都清晰可读。

已知限制

- 非 bash 任务(一次性后台子代理、……)是进程内生产者,没有可供观察的子进程句柄:其面板展示元数据与停止控件,并附"无输出流"说明。
- 插件加载之前启动的任务(包括宿主半边重载后)未被探针捕获:没有输出;停止时回退为使用展示该行的会话在浏览器侧提供的会话 id。
- 人为终止会抑制模型的完成通知 —— kill() 会把终态投递标记为已上报,这是 0.1.5-rc.2 中一个已被官方接受的接缝缺口;模型会在下一次 job_output/job_list/job_wait 调用时发现任务已被停止,不会挂起。
- dsh web 重启会清空任务注册表(按设计存于内存);对应任务已消失的面板会如实说明。
- 运行中任务超出溢出上限(每流 64 MB)的输出无法完整恢复;在完整历史视图中,溢出文件前段另有上限(默认每流 2 MB)。

版本敏感的接缝(升级 dsh 后请复查)

| 接缝 | 假设的事实 | 位置 |
| jobs-local.start() | 同步调用 spec.run() | lib/tap.js 的关联逻辑 |
| SubprocessHandle.collected | 基于偏移的读取器,readFrom(byteOffset) | lib/routes.js |
| ctx.jobs.kill/get | 按 caller.id 与属主 id 做鸭子类型判别 | lib/routes.js |
| 弹窗 DOM | ;行身份 = JobItem fiber 上的 props.job.id(0.1.7;旧版:带 key 的 fiber key),终止按钮 = 行内没有 aria-expanded 的那个按钮 | src/client/enhance-dropdown.js |
| 侧边栏席位 | 按 sidebar.right.pane.tab 键控的席位,useTabInfo hook 属性 | src/client/index.jsx |
| /api 围栏 | 未认证探测一律返回 401(本版本与具体路由无关 —— 旧的"404 = 未注册"启发式不再成立) | — |

故障排查

| 现象 | 原因与修复 |
| dsh: command not found | 仅通过 npx 安装 —— 每条命令加前缀 npx @deepseek-ai/dsh |
| pnpm was not found(退出码 127) | npm install -g pnpm,或使用上文的手动回退方案 |
| ERR_PNPM_ADDING_TO_ROOT | 漏掉了 -w 标志 |
| 已安装但行不可点击 / 没有面板 | 重启 dsh web(bundle 层不会热加载),然后刷新页面 |

开发

想在本插件上做二次开发,请从本地检出安装(link: 符号链接 —— 源码改动直接生效):

dsh plugin --profile web add link:/abs/path/to/dsh-plugin-job-panel -w

重启一次之后(bundle 安装不会热加载):

| 改动 | 生效方式 |
| lib/client.js(先运行 npm run build) | 由 dsh-client-hmr 热替换,无需重启 |
| lib/.js(宿主半边) | 重启 dsh web |
| cordis.patch.yml | 热加载 |

npm install # esbuild + @xterm(全部为 devDependencies)
npm test # node --test:output-buffer / log-line / stream-piper / 宿主路由 / bundle 工厂
npm run build # src/client/ -> lib/client.js
node --check lib/index.js

npm run build 从 src/client/ 重新生成 lib/client.js(esbuild 会把 @xterm/xterm 及其样式表一起打进产物 —— 所有构建期依赖都是 devDependency,因此从 registry 安装时只会拉取本包)。lib/ 已提交入库,所以以 link: 方式安装的 profile 无需任何安装步骤即可拾取改动。

宿主半边是纯 ESM JavaScript,没有构建步骤;浏览器半边由 build.js 构建,它把 esbuild 的 CJS 产物包装成浏览器模块系统所期望的 window.__ModuleLoader__.load({ id, factory }) 形态。平台种子模块(react、react/jsx-runtime、@deepseek-ai/dsh-client-ui-primitives)保持 external,经加载器的模块表解析;嵌入式终端(@xterm/xterm、@xterm/addon-fit —— 均为 MIT 许可,出自 xterm.js 作者之手)及其样式表则被打包进产物。

许可证

MIT
预览分享卡片长什么样 ↓cholf5/dsh-plugin-job-panel
分享 · DeepSeek Harness Hub
cholf5/dsh-plugin-job-panel

点击任务行查看实时终端输出并停止任务

回到顶部