dsh-desktop

by longyu065

4 开发与运行时github未核验到 manifest收录于 08-16

DeepSeek Harness桌面壳 — 自动安装dsh、原生macOS托盘,适用于macOS和Windows。

Desktop shell for DeepSeek Harness Web GUI — auto-installs dsh, native macOS tray, packaged for macOS & Windows.

安装

dsh plugin --profile web add github:longyu065/dsh-desktop

GitHub 源码安装:首次需按提示配置 allowBuilds 构建授权后重试

安装与环境配置指引、插件开发教程见 DSH 中文社区文档 ↗

安装即在你的机器上以你的权限运行第三方代码——它可读写文件、使用凭据、访问网络,DSH 的工具审批不会为插件代码加沙箱。「检测到 manifest」仅代表发现 dsh.bundle / dsh.plugin 清单,不构成兼容性或安全审查;安装前请审阅源码,不熟悉的插件先在不含密钥的环境试用。

README

目录

License: MIT Version Platform Electron

中文 | English

把 DeepSeek Harness Web GUI(dsh web,本地 127.0.0.1:3080)包装成桌面应用(Electron 壳)。 拿来即用:下载打包好的应用,双击打开——没有 dsh 会自动安装。系统无需预装 Node.js(使用 Electron 内置运行时)。

功能特性

  • 🚀 开箱即用:自动定位/安装 dsh(@deepseek-ai/dsh),无需任何前置配置
  • 🖥️ 原生桌面体验:独立窗口 + macOS 菜单栏托盘(点红点隐藏、托盘显示/隐藏/退出)
  • 🔄 智能服务管理:复用已有 dsh web 实例;没有则自动拉起服务,退出应用时结束自己拉起的服务
  • 🐋 DeepSeek 官方图标:应用图标与托盘图标均为官方鲸鱼标识
  • 📦 一键打包:electron-builder 产出 macOS .app / dmg / zip 与 Windows NSIS 安装包 / zip

原理

  • npm start 先执行 scripts/ensure-dsh.js:
    1. 定位 dsh(resolveDshBin,顺序):DSH_BIN 环境变量 → PATH 中的 dsh → ~/.npm/_npx/*/node_modules/.bin/dsh → 常见安装位置 → 工程内 vendor/dsh;
    2. 没有 dsh → 自动安装(ensureDshBin):npm install --prefix vendor/dsh @deepseek-ai/dsh, 装进工程内 vendor/,不污染全局、不依赖用户 PATH(首次约 1-2 分钟);
    3. 探测 127.0.0.1:3080——已有实例(命令行/本 GUI 启动的)→ "直接复用"; 没有 → spawn(dsh, ['web']) 拉起常驻服务(detached,日志落 logs/),轮询就绪后启动 Electron。
  • Electron 只当客户端:加载页面、托盘常驻(点红点隐藏,托盘菜单显示/隐藏/退出)。
  • 退出 Electron 时结束本应用拉起的 dsh web(通过 logs/dsh-web.pid 精确停止,并校验进程确为 dsh,防止 pid 复用误杀)。 外部启动的实例(如终端命令行启动的)不受影响。
  • 直接 electron .(npm run start:raw,跳过前置脚本)时,主进程也会兜底定位/安装/拉起。

开发运行

cd dsh-desktop
npm install        # 安装 electron(含二进制下载)
npm start          # 自动定位/安装 dsh → 确保服务在跑 → 打开桌面应用

手动指定 dsh:DSH_BIN=/path/to/dsh npm start。安装日志在 vendor/dsh 安装时的终端输出, 运行日志在 logs/dsh-web.{stdout,stderr}.log。

安装时的两个环境变通点(部分机器曾遇到)

  1. ~/.npm 缓存目录被 root 占用会导致 npm install 报 EPERM。临时方案: npm install --cache /path/to/writable/npm-cache
  2. Electron 二进制下载默认写 ~/Library/Caches/electron,若不可写,用 electron_config_cache 指定替代缓存目录(install.js 读取的是这个变量,不是 ELECTRON_CACHE): electron_config_cache=/path/to/.electron-cache node node_modules/electron/install.js

日常 npm start 在正常终端环境下无需这些变通。

打包

npm run dist        # macOS:dmg + zip
npm run dist:win    # Windows:NSIS 安装包 + zip(可从 macOS 交叉编译)
npm run dist:all    # 两者都打

打包说明:

  • 开发/日常使用直接 npm start 即可;
  • 发布版打包时不包含 vendor/dsh(体积大),目标机器首次 npm start 会自动安装。 如需完全离线自包含,可发布前把 vendor/dsh 一并打进 extraResources,并在主进程按 process.resourcesPath 解析后传给 DSH_BIN。

目录结构

dsh-desktop/
├── package.json        # electron 依赖 + start/dist 脚本 + 打包配置
├── scripts/
│   ├── ensure-dsh.js   # start 前置:定位/安装 dsh → 探测 3080 → 无则拉起常驻服务
│   └── dsh-server-lib.js # 公共逻辑:dsh 定位/自动安装 / 端口探测 / 等待就绪 / 拉起
├── electron/
│   ├── main.js         # 主进程:兜底定位/安装/拉起、窗口、托盘(不管理服务生命周期)
│   └── preload.js      # 最小预加载桥(只读版本信息)
├── vendor/dsh/         # 自动安装的 dsh(首次 start 生成,可删,下次会自动重装)
├── logs/               # dsh web 运行日志与 pid(运行时生成)
├── build/              # 应用图标(icon.icns / icon.ico / icon.png)
└── release/            # 打包产物(electron-builder 输出)

License

MIT © 2026 tiankunrui

原始 README: https://github.com/longyu065/dsh-desktop/blob/main/README.zh.md ↗