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

任务状态浮窗 wfz2006/dsh-status-bar

DeepSeek Harness
wfz200610 天前有提交已提供中文文档扫描:含敏感能力

把 DSH 的任务进度装进一块会折射的桌面玻璃 · Electron + React 桌面状态栏

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

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

自动兼容检查未通过:缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add wfz2006/dsh-status-bar
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

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

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装

缺少 main/exports/bin 入口声明;仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

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

✗npm 包dsh-glass(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✗入口文件缺少入口声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

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

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

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

可执行外部命令读写/删除本地文件
查看扫描证据(共 41 处,展示前 40 条)
  • 读取本地文件
    packages/dsh-status-bar/lib/download.js:19
    const size = path => { try { return statSync(path).size; } catch { return 0; } };
  • 读取本地文件
    packages/dsh-status-bar/lib/download.js:20
    const json = path => { try { return JSON.parse(readFileSync(path, 'utf8')); } catch { return {}; } };
  • 删除本地文件
    packages/dsh-status-bar/lib/download.js:21
    function reset(part) { for (const path of [part, `${part}.json`]) rmSync(path, { force: true }); }
  • 读取本地文件
    packages/dsh-status-bar/lib/download.js:33
    const blocks = readFileSync(file, 'utf8').split(/ ? ? /).filter(block => /^HTTP\
  • 删除本地文件
    packages/dsh-status-bar/lib/download.js:62
    rmSync(headersFile, { force: true });
  • 写入本地文件
    packages/dsh-status-bar/lib/download.js:72
    writeFileSync(`${part}.json`, JSON.stringify(next));
  • 执行外部命令来自配置/变量
    packages/dsh-status-bar/lib/download.js:77
    try { child = spawn(program, args, { windowsHide: true, stdio: 'ignore' }); }
  • 删除本地文件
    packages/dsh-status-bar/lib/download.js:97
    finally { rmSync(headersFile, { force: true }); }
  • 写入本地文件
    packages/dsh-status-bar/lib/download.js:128
    writeFileSync(`${part}.json`, JSON.stringify(next));
  • 写入本地文件
    packages/dsh-status-bar/lib/download.js:133
    try { await pipeline(response, createWriteStream(part, { flags: status === 206 ? 'a' : 'w' }), { signal: options.signal }); }
  • 读取本地文件
    packages/dsh-status-bar/lib/download.js:150
    if (existsSync(part) && previous.source === source && previous.total > 0 && size(part) === previous.total) return;
  • 读取本地文件
    packages/dsh-status-bar/lib/index.js:13
    function stamp(appDir) { try { return statSync(join(appDir, 'out', 'main', 'index.js')).mtimeMs; } catch { return 0; } }
  • 执行外部命令固定命令
    packages/dsh-status-bar/lib/index.js:17
    const killer = spawn('taskkill', ['/pid', String(child.pid), '/t', '/f'], { stdio: 'ignore', windowsHide: true });
  • 执行外部命令来自配置/变量
    packages/dsh-status-bar/lib/index.js:69
    spawned = spawn(target.electron, [target.appDir, `--dsh-link=${link}`, `--launcher-pid=${process.pid}`], {
  • 执行外部命令来自配置/变量
    packages/dsh-status-bar/lib/index.js:106
    spawned = spawn(target.electron, [target.appDir, `--dsh-link=${link}`, `--launcher-pid=${process.pid}`], {
  • 读取本地文件
    packages/dsh-status-bar/lib/runtime.js:10
    const json = path => { try { return JSON.parse(readFileSync(path, 'utf8')); } catch { return {}; } };
  • 读取本地文件
    packages/dsh-status-bar/lib/runtime.js:11
    const firstFile = values => values.find(value => { try { return typeof value === 'string' && statSync(value).isFile(); } catch { return false; } });
  • 写入本地文件
    packages/dsh-status-bar/lib/runtime.js:67
    try { writeFileSync(fd, JSON.stringify({ pid: process.pid, owner })); } finally { closeSync(fd); }
  • 删除本地文件
    packages/dsh-status-bar/lib/runtime.js:68
    return () => { if (json(path).owner === owner) rmSync(path, { force: true }); };
  • 读取本地文件
    packages/dsh-status-bar/lib/runtime.js:74
    } else { try { alive = Date.now() - statSync(path).mtimeMs < 10000; } catch { continue; } }
  • 删除本地文件
    packages/dsh-status-bar/lib/runtime.js:75
    if (!alive) { rmSync(path, { force: true }); continue; }
  • 执行外部命令来自配置/变量
    packages/dsh-status-bar/lib/runtime.js:84
    const child = spawn(program, args, { stdio: ['ignore', capture ? 'pipe' : 'ignore', 'ignore'], windowsHide: true });
  • 删除本地文件递归
    packages/dsh-status-bar/lib/runtime.js:100
    rmSync(path, { recursive: true, force: true });
  • 写入本地文件
    packages/dsh-status-bar/lib/runtime.js:121
    mkdirSync(base, { recursive: true });
  • 读取本地文件
    packages/dsh-status-bar/lib/runtime.js:128
    for (const name of readdirSync(base)) if (name.startsWith(`${basename(root)}.staging-`) && /^[0-9a-f-]{36}$/.test(name.slice(`${basename(root)}.stagin
  • 删除本地文件
    packages/dsh-status-bar/lib/runtime.js:133
    catch (error) { if (error.name !== 'AbortError') { rmSync(part, { force: true }); rmSync(`${part}.json`, { force: true }); } throw error; }
  • 删除本地文件
    packages/dsh-status-bar/lib/runtime.js:138
    rmSync(part, { force: true }); rmSync(`${part}.json`, { force: true });
  • 写入本地文件
    packages/dsh-status-bar/lib/runtime.js:142
    mkdirSync(staging);
  • 删除本地文件
    packages/dsh-status-bar/lib/runtime.js:146
    rmSync(part, { force: true }); rmSync(`${part}.json`, { force: true });
  • 读取本地文件
    packages/dsh-status-bar/lib/runtime.js:150
    if (existsSync(root)) renameSync(root, previous);
  • 写入本地文件
    packages/dsh-status-bar/lib/runtime.js:150
    if (existsSync(root)) renameSync(root, previous);
  • 写入本地文件
    packages/dsh-status-bar/lib/runtime.js:151
    try { renameSync(unpacked, root); }
  • 读取本地文件
    packages/dsh-status-bar/lib/runtime.js:152
    catch (error) { if (existsSync(previous)) renameSync(previous, root); throw error; }
  • 写入本地文件
    packages/dsh-status-bar/lib/runtime.js:152
    catch (error) { if (existsSync(previous)) renameSync(previous, root); throw error; }
  • 删除本地文件
    packages/dsh-status-bar/lib/startup-status.js:14
    const remove = () => { for (const path of [statePath, actionPath]) try { rmSync(path, { force: true }); } catch { } };
  • 写入本地文件
    packages/dsh-status-bar/lib/startup-status.js:17
    mkdirSync(base, { recursive: true });
  • 读取本地文件
    packages/dsh-status-bar/lib/startup-status.js:20
    try { action = readFileSync(actionPath, 'utf8').trim(); rmSync(actionPath, { force: true }); } catch { return; }
  • 删除本地文件
    packages/dsh-status-bar/lib/startup-status.js:20
    try { action = readFileSync(actionPath, 'utf8').trim(); rmSync(actionPath, { force: true }); } catch { return; }
  • 执行外部命令来自配置/变量
    packages/dsh-status-bar/lib/startup-status.js:24
    panel = spawn(join(process.env.SystemRoot ?? 'C:\\Windows', 'System32', 'WindowsPowerShell', 'v1.0', 'powershell.exe'),
  • 写入本地文件
    packages/dsh-status-bar/lib/startup-status.js:37
    try { open(); writeFileSync(statePath, JSON.stringify(state)); }
扫描于 2026/11/4(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库

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

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

README

由 DeepSeek 最新模型翻译生成
DSH Status Bar DSH Status Bar 发布卡 把 DSH(DeepSeek Harness)的任务进度,装进一块会折射的桌面玻璃里。 像手机上的「灵动岛」:平时是个安静的小胶囊,有事时自己长大,没事时乖乖待着。你可以随手把它拖到屏幕任何角落、拉成顺手的大小。它只是看板 + 传话筒,不抢戏、不越权。 📖 图文介绍页:介绍.html(可直接用浏览器打开,长图版本见 介绍.png) 📖 这是什么?(30 秒版) 你让 DSH 干活的时候,是不是总得反复切窗口看「跑完没」?DSH Status Bar 就是来解决这件小事的——一块液态玻璃小悬浮窗,一直陪你在桌面上:任务跑到哪、下一步干什么、有没有事等你拍板,瞟一眼全知道。 Windows 11 优先,Electron 实现,单实例常驻,不注册托盘图标、不占任务栏。 🫧 四副面孔:从小胶囊到审批台 | 胶囊胶囊 · 平时:小鲸鱼标志 + 一行任务名 + 「3 轮 · 42 步」的小字进度。小到可以贴着屏幕边缘安静待着。 | 速览速览 · 瞟一眼:会话转录(思考 / DSH / 你)、当前步骤,外加吞吐与缓存这些小仪表。 | | 详情紧凑详情 · 看全程:「过程 / 步骤」双标签,思考、工具调用、消息一条条排开,谁已完成谁已发送一目了然。
展开完整文档(README 剩余 1 节)
DSH Status Bar

DSH Status Bar 发布卡

把 DSH(DeepSeek Harness)的任务进度,装进一块会折射的桌面玻璃里。

像手机上的「灵动岛」:平时是个安静的小胶囊,有事时自己长大,没事时乖乖待着。你可以随手把它拖到屏幕任何角落、拉成顺手的大小。它只是看板 + 传话筒,不抢戏、不越权。

📖 图文介绍页:介绍.html(可直接用浏览器打开,长图版本见 介绍.png)

📖 这是什么?(30 秒版)

你让 DSH 干活的时候,是不是总得反复切窗口看「跑完没」?DSH Status Bar 就是来解决这件小事的——一块液态玻璃小悬浮窗,一直陪你在桌面上:任务跑到哪、下一步干什么、有没有事等你拍板,瞟一眼全知道。

Windows 11 优先,Electron 实现,单实例常驻,不注册托盘图标、不占任务栏。

🫧 四副面孔:从小胶囊到审批台

| 胶囊胶囊 · 平时:小鲸鱼标志 + 一行任务名 + 「3 轮 · 42 步」的小字进度。小到可以贴着屏幕边缘安静待着。 | 速览速览 · 瞟一眼:会话转录(思考 / DSH / 你)、当前步骤,外加吞吐与缓存这些小仪表。 |
| 详情紧凑详情 · 看全程:「过程 / 步骤」双标签,思考、工具调用、消息一条条排开,谁已完成谁已发送一目了然。 | 审批独立审批 · 拍板时:「需要你的确认 2 项」,命令先预览再点「拒绝 / 允许一次」,拿不准还能跳回 DSH 原窗口处理。 |

胶囊 288×44 DIP 起,点击长大成速览,再点进入详情;有请求待处理时点击可打开审批视图。自动展开由设置控制,默认关闭,手动尺寸不会被新请求覆盖。扩展约 320ms,收起先 80ms 内容退场、再 260ms 原生窗口连续变化。

📖 这块玻璃是「真」玻璃

普通悬浮窗只是把背景涂白假装透明;这块玻璃是真的会「看穿」它背后的东西——只取窗后一小块画面(不保存、不上传),再用同一套透镜把它折射出来:窗后内容被压弯约 13 个物理像素,边缘还带着一丝丝彩虹(RGB 色散)。

折射对照

对照实验(本次实测):左「零位移」,右「开启折射与 RGB 色散」。拿真实窗后条纹做的实测,不是效果图。

普通启动时,只要原生取样助手可用且材质非实色,这项能力默认开启;设置中的“真实折射与色散”可为本次运行关闭它。隐藏窗口时暂停,显示后恢复;关闭取样或退出程序时停止。范围仅限本窗后方与最多 48 个物理像素边距,不保存、不上传。

设置

📖 定下的死规矩:按钮永远是你按的

玻璃只是传话筒,不是代理人:

- 审批必须等 DSH 回了正式「已决定」才算数,绝不抢答;
- 断线、过期、撤销、参数看不懂?那就只读展示,绝不自动放行——任何一次批准都来自你明确的一次点击;
- 连不上就明说连不上,不装作一切正常。

📊 数字小卡片

| 214 | 4 | 13 px | 0 |
| 单测全绿(另有类型检查、lint、桌面构建) | 副面孔:胶囊 / 速览 / 详情 / 审批 | 真实折射偏折(实测物理像素) | 次自动放行(永远是 0) |

🚀 快速开始

要求:Windows 11 x64、Node.js、pnpm(packageManager: pnpm@12.4.1)。

pnpm install
pnpm build
pnpm start

也可以直接双击 启动预览.cmd。开发热更新用 pnpm dev。普通启动为 DSH 数据源、尚未连接;Mock 仅从调试菜单显式开启,自动化夹具使用 GLASS_SMOKE=1。连接真实 DSH 见下。

装成 DSH 插件(推荐)

不用自己 pnpm build:插件带上构建好的桌面端和 Electron 运行时,装上就能开。开启 DSH 时它会自己把官方认证链接交给玻璃,不用再手动粘贴。

npm 包只有 870 kB,首次启动自取 155 MB 运行时(缓存到版本目录,之后不再下载)
dsh plugin --profile web add dsh-status-bar-plugin

或者自包含 tarball:155 MB 一次装完,运行期不再联网
dsh plugin --profile web add https://github.com/wfz2006/dsh-status-bar/releases/latest/download/dsh-status-bar.tgz

装好后重启 DSH,玻璃会跟着启动;不想要它自动开,就在 profile 补丁里写 - id: dsh-status-bar-plugin + config: { autoLaunch: false }。细节见 packages/dsh-status-bar/README.md。

隐藏窗口后按 Ctrl+Shift+G 恢复;退出悬浮窗后,在 DSH 任意会话输入 /status-bar 即可重新打开。这个命令不保存或重放认证 token,只会在需要时向当前 DSH 取一条新链接。

连接真实 DSH(实验)

设置 → 官方认证地址 → 粘贴 DSH 启动器输出的认证链接并连接。凭据只留在 Main 内存,断线即失效、不落盘。

pnpm test:live # 隔离 DSH_HOME 下的真实 Host 联调(需要本机已安装 DSH)

真实官方 Desktop 的当前任务与真实审批仍未验收,状态以 支持矩阵 与 ADR 004 为准。

🛠️ 技术积木

| 组件 | 说明 |
| Electron 44 + electron-vite 6 | 悬浮窗本体(apps/desktop) |
| React 19 + Zustand 5 | 界面与状态管理 |
| TypeScript(strict) | 全套类型约束 |
| 自研工作包 | protocol / bridge / adapters/dsh / adapters/mock / dsh-status-bar |
| Vitest + Playwright | 单元测试 + 桌面实测脚本 |
| ws | 本地 WebSocket 通信 |

📁 项目结构

apps/desktop Electron 悬浮窗(main / renderer / shared + 光学取样助手) packages/protocol 自研本地协议与数据类型 packages/bridge 宿主桥接 packages/adapters dsh(真实 Host)/ mock(演示数据源) packages/dsh-status-bar DSH 插件(bundle:启动桌面端并把认证链接交过去) tests 单元测试 scripts 构建、验收、截图与联调脚本 docs 产品 / 架构 / 协议 / 安全 / 决策文档,界面截图在 docs/images

📚 文档索引

- 运行与验收:怎么跑、怎么验、当前材质与偏好
- 性能与轻量化实测:代码体积、流式传输、两轮内存对照及未解决的 GPU 开销
- 工具过程同步延迟修复:消除冷会话轮询等待、旧响应覆盖及工具行淡入延迟
- 代码审查与交互细节修复:请求草稿、特殊 ID、键盘导航、复制反馈与生产动效
- 产品边界与验收条件
- 总体架构 | 自定义本地协议 | 状态模型
- DSH 集成与已验证接口 | 安全测试
- 决策记录 | 执行计划
- 开发规格 | UI 重设计规范 | 变更记录
- 界面截图见 docs/images/;验收脚本会把新证据写到本机 reports/(不入库)

📌 当前状态

- 四形态 UI(任务胶囊 / 速览 / 紧凑详情 / 独立审批)已落地,偏好本地持久化,手动尺寸不被新请求覆盖。
- 150% DPI 下拖动「窗口自己越长越大」的 bug 已修复:移动只挪位置,不再改动尺寸。
- 真实折射与 RGB 色散已用真实窗后条纹实测(13 px 偏折),隐藏 / 停用 / 实色 / 异常退出均有回归;正式入口仍为 Electron。
- 审批只在收到匹配的 approval/decided 后确认;提问只在权威回执后确认;无法验证的参数保持只读。
- 仍有未验区域:真实用户 Desktop 任务、模型驱动的审批/提问尚未完成实机闭环,见 ADR 004。

说明

- 主要服务 Windows 11 x64;macOS / Linux 暂不承诺。
- 不替代 DSH 本体:不写代理模型、会话引擎、工具运行器。
- 本项目以 MIT License 开源;引用或二次分发请保留版权声明。
预览分享卡片长什么样 ↓wfz2006/dsh-status-bar
分享 · DeepSeek Harness Hub
wfz2006/dsh-status-bar

把 DSH 的任务进度装进一块会折射的桌面玻璃 · Electron + React 桌面状态栏

这是你的仓库?认领条目

回到顶部