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

桌面壳客户端 longyu065/dsh-desktop

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

把本地 Web 界面包装成独立桌面应用,双击即用

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

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

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add longyu065/dsh-desktop
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么[目录]—
dsh 原生插件 · market
暂无时间戳·判据 →
装得上吗[实装验证]✓
本站已真实安装成功
非静态推断
L4 · 真实安装等级说明 →
数据截至 2026/09/26·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/05·判据 →
还在维护吗[仓库]—
更新放缓:最近一次提交在 80 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

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

验证判据与等级说明 →

可信度证据

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

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 41 处,展示前 33 条)
  • 读取本地文件
    electron/main.js:52
    if (fs.existsSync(pkgPath)) {
  • 读取本地文件
    electron/main.js:53
    const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
  • 读取本地文件
    electron/main.js:70
    if (fs.existsSync(vendorPkg)) return vendorPkg;
  • 读取本地文件
    electron/main.js:71
    if (fs.existsSync(devPkg)) return devPkg;
  • 发起网络请求
    electron/main.js:78
    https.get(url, { headers: { 'User-Agent': 'dsh-desktop/0.2.0' } }, (res) => {
  • 读取本地文件
    electron/main.js:190
    if (fs.existsSync(p)) return p;
  • 删除本地文件
    electron/main.js:207
    try { fs.rmSync(vendorNew, { recursive: true, force: true }); } catch (_) {}
  • 执行外部命令来自配置/变量
    electron/main.js:213
    const proc = spawn(npmBin, [
  • 删除本地文件
    electron/main.js:238
    try { fs.rmSync(vendorNew, { recursive: true, force: true }); } catch (_) {}
  • 删除本地文件
    electron/main.js:246
    try { fs.rmSync(vendorBackup, { recursive: true, force: true }); } catch (_) {}
  • 读取本地文件
    electron/main.js:249
    if (fs.existsSync(vendorDir)) {
  • 写入本地文件
    electron/main.js:250
    fs.renameSync(vendorDir, vendorBackup);
  • 写入本地文件
    electron/main.js:254
    fs.renameSync(vendorNew, vendorDir);
  • 删除本地文件
    electron/main.js:257
    try { fs.rmSync(vendorBackup, { recursive: true, force: true }); } catch (_) {}
  • 删除本地文件
    electron/main.js:266
    fs.rmSync(vendorDir, { recursive: true, force: true });
  • 写入本地文件
    electron/main.js:267
    fs.renameSync(vendorBackup, vendorDir);
  • 写入本地文件
    scripts/dsh-server-lib.js:19
    fs.mkdirSync(dir, { recursive: true });
  • 发起网络请求
    scripts/dsh-server-lib.js:26
    const req = http.get(
  • 执行外部命令固定命令
    scripts/dsh-server-lib.js:51
    const which = spawnSync('sh', ['-lc', 'command -v dsh'], { encoding: 'utf8' });
  • 读取本地文件
    scripts/dsh-server-lib.js:57
    if (fs.existsSync(npxRoot)) {
  • 读取本地文件
    scripts/dsh-server-lib.js:61
    .filter((p) => fs.existsSync(p))
  • 读取本地文件
    scripts/dsh-server-lib.js:62
    .sort((a, b) => fs.statSync(b).mtimeMs - fs.statSync(a).mtimeMs);
  • 读取本地文件
    scripts/dsh-server-lib.js:74
    if (fs.existsSync(p)) return p;
  • 读取本地文件
    scripts/dsh-server-lib.js:79
    if (fs.existsSync(vendorBin)) return vendorBin;
  • 读取本地文件
    scripts/dsh-server-lib.js:87
    if (extraDir.startsWith('/') && fs.existsSync(extraDir) && fs.statSync(extraDir).isDirectory()) {
  • 执行外部命令固定命令
    scripts/dsh-server-lib.js:106
    const which = spawnSync('sh', ['-lc', 'command -v npm'], { encoding: 'utf8' });
  • 执行外部命令固定命令
    scripts/dsh-server-lib.js:114
    const which = spawnSync('sh', ['-lc', 'command -v node'], { encoding: 'utf8' });
  • 写入本地文件
    scripts/dsh-server-lib.js:154
    fs.mkdirSync(vendorDir, { recursive: true });
  • 执行外部命令来自配置/变量
    scripts/dsh-server-lib.js:155
    const res = spawnSync(npmPath, ['install', '--prefix', vendorDir, '@deepseek-ai/dsh'], {
  • 执行外部命令来自配置/变量
    scripts/dsh-server-lib.js:185
    const proc = spawn(process.execPath, [dshCmd, 'web'], {
  • 写入本地文件
    scripts/dsh-server-lib.js:194
    fs.writeFileSync(path.join(logDir, 'dsh-web.pid'), String(proc.pid));
  • 执行外部命令固定命令
    scripts/dsh-server-lib.js:205
    const out = spawnSync('ps', ['-p', String(pid), '-o', 'command='], { encoding: 'utf8' });
  • 删除本地文件
    scripts/dsh-server-lib.js:267
    try { fs.unlinkSync(pidFile); } catch (_) {}
扫描于 2026/11/5(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库

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

社区实装还没有人打卡 · 装过的第一个就是你
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 包装为独立桌面应用
  • 双击启动
  • 原生macOS托盘

README

由 DeepSeek 最新模型翻译生成
dsh-desktop License: MIT Version [Platform]() [Electron]() 把 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:
展开完整文档(README 剩余 1 节)
dsh-desktop

License: MIT
Version
[Platform]()
[Electron]()

把 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
预览分享卡片长什么样 ↓longyu065/dsh-desktop
分享 · DeepSeek Harness Hub
longyu065/dsh-desktop

把本地 Web 界面包装成独立桌面应用,双击即用

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部