dsh-clean-desktop-shell

uitested: passnpmMIT

Clean desktop shell for DSH: launch by double-clicking a desktop shortcut like any normal desktop app, live backend monitoring with one-click tray start/restart/stop (progress dialogs), offline auto-reconnect, single instance. Reuses your existing web profile, no restyling of the web UI. Windows + m

下载量 / Downloads
1,069
依赖体积 / node_modules
2.93 MB
测试时间 / Tested
2026-11-06
DSH 版本 / Version
0.2.2-rc.1

Install

dsh plugin --profile web add dsh-clean-desktop-shell

Sandbox test results

StageResult
1 install✓
2 list✓
3 mount✓
4 boot—

Four stages run in an isolated sandbox: install (network on) → list → mount → boot (last three with no network).

README

<div align="center">

dsh-clean-desktop-shell

DeepSeek Harness 的纯净桌面壳(DSH 插件形态)

只做一件事:给已配置好的 DSH Web 加一层干净的桌面窗口——系统托盘、单实例、像普通软件一样用。无毛玻璃、无花哨材质,纯净。

[English](README.en.md) · [中文](README.md)

![Platform](https://github.com/Icather/dsh-clean-desktop-shell)

![License](LICENSE)

![Release](https://github.com/Icather/dsh-clean-desktop-shell/releases/latest)

![DSH](https://github.com/deepseek-ai/deepseek-harness)

![Contributors](https://github.com/Icather/dsh-clean-desktop-shell/graphs/contributors)

![npm downloads](https://www.npmjs.com/package/dsh-clean-desktop-shell)

![Installs](https://github.com/Icather/dsh-clean-desktop-shell/releases)

![Clones](https://github.com/Icather/dsh-clean-desktop-shell)

</div>

这是什么

dsh-clean-desktop-shell 是一个 DSH 插件形态 的纯净桌面壳:它给已经跑起来的 DSH Web(默认 http://127.0.0.1:3080)套一层原生桌面窗口——系统托盘、单实例,像普通桌面软件一样使用。不做任何视觉改造:不加毛玻璃、不改界面,纯粹是"窗口壳"。

与生态里其他桌面端方案的最大区别:

· 其他桌面端(如 dsh-desktop 系列) · 本插件

形态 · 独立 Electron 应用,自带独立 profile · DSH 插件,挂载进现有 profile

Profile · 新建 desktop profile,插件/配置要重装 · 复用现有 web profile,零迁移

视觉改造 · 自绘标题栏 / 毛玻璃等 · 零改造,纯净窗口壳

跟随上游 · 固定版本 · 已适配 DSH 0.1.2 BrowserAuth(冷启动自动认证;不接管、不杀外部后端)

核心亮点

① 像双击桌面应用一样,一键启动 DSH

不用开终端、不用记命令。双击桌面快捷方式,DSH 窗口立刻弹出,和启动任何一个普通软件一样自然:

  • 安装包自动创建桌面快捷方式;插件形态首次运行询问 + 托盘「创建桌面快捷方式」一键补建
  • 双击即出窗——窗口不等后端、不做启动等待
  • 单实例:重复双击只聚焦已有窗口,绝不重复开壳

② 后端活性实时监测 · 快捷手动自主启停

托盘实时显示后端状态(运行中 / 启动中 / 未运行 / 错误),一键启停:

  • 响应监测:保留 1,500 ms 探测超时。响应失败不等于进程退出:短暂或持续失败都保留已加载页面,只显示连接提示。
  • 原页重连:结合 HTTP 与客户端连接状态,通过客户端自身的连接服务恢复同步,不自动重载。自动重试沿用 4 秒探测节奏;手动重试共用防重复请求检查。
  • 快捷启停:托盘右键一键启动 / 重启 / 关闭后端(带进度弹窗);「关闭后端」真正停掉 3080 端口上的服务,含外部启动的实例

使用

1. 若安装过插件,命令行启动 dsh 自动弹出桌面窗口;也可通过插件创建的桌面快捷方式双击,媲美原生桌面端的体验。

2. 使用原网页端的一切功能。

3. 托盘右键可以进行详细设置。正常连接时保持原网页;连接异常时显示恢复提示。

后端启停等管理操作在托盘右键:

  • 启动 / 重启 / 关闭后端(带进度弹窗;关闭会真正停掉 3080 上的服务,包括外部启动的实例)
  • 自动探测后端 · 设置后端安装文件夹(默认自动探测定位)
  • 刷新窗口 · 创建桌面快捷方式 · 检查更新 · 仓库主页

窗口的可靠性(保留页面的连接恢复):

  • 双击启动立即出窗,不等后端就绪
  • 启动时尚无可用页面,显示「后端未连接」页;后端启动就绪后加载
  • 只有确认自管进程退出或明确停止已识别的后端,才切回离线页;外部后端失联仍按响应故障提示
  • 持续故障提供「立即重试」与「重新加载页面」;后者是会丢失未保存页面状态的显式操作
  • 离线页内置快捷按钮:重新加载 / 启动后端 / 自动探测后端 / 设置后端安装文件夹

壳不会因探测失败重建已加载文档,但第三方插件自身的断线处理仍可能改变其局部视图。确认退出与显式重载仍会离开当前页面。

macOS 状态(v0.1.7 重要说明)

v0.1.7 修复了插件形态在 macOS 上无法定位 Electron.app 路径的问题(该 bug 导致窗口在 Mac 上完全静默失败)。

但当前开发者没有 Mac 实机,以下事项仍然依赖 Mac 用户验证/贡献:

  • .dmg 安装包未签名、未公证:Apple 要求年度开发者计划($99/年)才能给安装包签名+公证。首次打开 .dmg 里的应用,很可能提示「已损坏,无法打开」或「无法验证开发者」。这不是应用本身损坏,是 Gatekeeper 拦截了未签名应用。
  • 临时解决:xattr -cr "/Applications/DSH Clean Desktop Shell.app",然后右键 → 打开。
  • 长期解决:需要一位有 Apple Developer 账号的 Mac 合作者协助签名/公证,或长期把 .dmg 安装体验写为「需要右键打开 / 执行 xattr」。
  • Electron.app 解压后的可执行位、quarantine 扩展属性等只有真机能确认行为是否完全正确。
  • 如果窗口还是没弹出来:启动失败时会把诊断信息写到 DSH home 下的 desktop-shell-launch.log:
  cat "${DSH_HOME:-$HOME/.dsh}/desktop-shell-launch.log"

把内容贴到 Issue 即可——里面记录了平台、架构、Node 版本、DSH home、运行时目录和具体报错。没有界面时,这是唯一能回传的信息。

诚挚邀请有 Mac 环境、愿意一起打磨的同学参与:能帮忙验证安装流程、补充签名配置、或者把开机自启/登录项做进 Electron 托盘,欢迎直接提 PR 或在 Issue 里 @ 我,我会把你加入 [CONTRIBUTORS.md](./CONTRIBUTORS.md)。

安全与权限:它到底做了什么

第三方安全扫描器(如 dsh-xray)会给本项目打出「高能力 + 敏感行为」的评级。这个评级没有误报——列出的每一条都属实,但每一条都有明确且必要的原因。既然要装进你的机器,就该摊开讲清楚。

行为 · 为什么必须这么做 · 代码位置

执行系统命令(spawn) · 壳的核心功能就是启动 / 重启 / 停止 dsh web 后端,以及探测 3080 端口占用。不调用系统命令无法实现。 · electron/service.js

下载约 100MB 的 Electron 运行时 · 首次启动需要。两个源按网络环境自动竞速(3 秒超时):github.com 与 npmmirror.com——后者是国内镜像,CN 网络下通常更快。 · src/host/runtime.js

访问 api.github.com · 仅用于托盘「检查更新」拉取最新 Release 信息。 · electron/update.js

读取环境变量 · 只用于定位路径和功能开关:DSH_HOME(DSH 主目录)、DSH_SHELL_ELECTRON_DIR(复用本地 Electron,跳过下载)、DSH_SHELL_AUTO_LAUNCH=0(关闭自动弹窗)、USERPROFILE / APPDATA(Windows 下定位 dsh.cmd 与快捷方式目录)。 · src/host/common.js、src/host/index.js、electron/shortcut.js

修改 DSH 运行时(cordis.patch.yml) · DSH 官方的插件注册机制,所有 DSH 插件都靠它挂载,并非本项目特有行为。 · cordis.patch.yml

边界:不上传任何数据、不读取会话内容、不回传遥测。全部网络请求只有上面两类(下载运行时 / 查更新),且都可通过设置 DSH_SHELL_ELECTRON_DIR 完全避免。

安装包的未签名警告(Windows SmartScreen、macOS Gatekeeper)来自缺少代码签名证书,与上述行为无关。

兼容性与运行边界

扫描器给出的「高能力」评级来自上一节那四类能力(文件 / 网络 / 命令 / 凭据)。下面把兼容范围、依赖、外部服务与失败边界摊开声明,供人工审阅——声明不等于验收,逐条注明证据。

兼容范围

项 · 声明 · 依据

Node.js · >=20.0.0(engines.node) · host 半边用全局 fetch 与 AbortSignal.timeout;Electron 半边跑在 Electron 33 内嵌的 Node 20.18 上。没有更新 API 的依赖。

DSH · >=0.1.1 <0.2.0(dsh.compatibility.dsh) · 面向 0.1.x 的插件契约;0.1.2 之前没有 BrowserAuth,host 半边对该代有显式守卫(拿不到 authenticatedUrl() 时照常拉起窗口,只是不带 bootstrap URL)。

dsh.compatibility.dshReleases 逐版本标注实测状态:

DSH 版本 · 状态 · 证据

0.1.5-rc.1 · compatible · 真机端到端:token 横幅 → 插件自动弹壳 → 窗口渲染 UI 并写入 dsh-auth cookie;掉线保留页面、确认退出切离线页均实测通过

0.1.5-rc.2、0.1.5-alpha.2 · unknown · 未做运行验收

0.1.1-rc.2 · unknown · 「0.1.2 之前」这条代码路径有独立断言(真实 host 模块 + 无 authenticatedUrl 的 connection),但没在真实该版本上跑完整验收

依赖与生命周期脚本

类型 · 内容

运行时依赖 · electron-updater(托盘「检查更新」)、semver(版本比较)。两者都只在 Electron 半边使用;host 半边不加载任何第三方依赖。

peer 依赖 · @deepseek-ai/dsh(可选)——宿主由 DSH 提供,不随本包安装。

开发依赖 · electron、electron-builder、sharp、png-to-ico(仅构建与图标生成)。

生命周期脚本 · 无。 本包不声明 preinstall / install / postinstall / prepare;scripts 只有 `bui

…(truncated)

Rendered from the README published on npm. Formatted only, not edited.

Versions

Published on npm::15,最后更新 2026-09-27

Links

GitHub · Homepage · npm

Same category