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

桌面壳 Denszh/dsh-desktop

DeepSeek Harness
Denszh74 天前有提交已提供中文文档扫描:高危

双击即用,免装 Node 启动本地服务

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

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

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

状态速览

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

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
🔴 安全扫描发现高危能力自动 · 静态分析源码
v2.7.0
🔴 扫描:高危尚无人工评估

静态扫描发现安装期即执行代码,或命令参数由运行时变量拼接(参数来源无法静态判定,从严处理)。

命令参数由运行时变量拼接读写/删除本地文件发起外部网络请求
查看扫描证据(共 47 处,展示前 32 条)
  • 读取本地文件
    src/main/index.js:44
    if (fs.existsSync(p)) return fs.readFileSync(p, 'utf8').trim();
  • 写入本地文件
    src/main/index.js:50
    fs.writeFileSync(path.join(dshRuntimeDir(), '.version'), version);
  • 请求外部主机api.github.com
    src/main/index.js:62
    https.get(`https://api.github.com/repos/${DSH_RELEASE_OWNER}/${DSH_RELEASE_REPO}/releases?per_page=100`, {
  • 发起网络请求
    src/main/index.js:62
    https.get(`https://api.github.com/repos/${DSH_RELEASE_OWNER}/${DSH_RELEASE_REPO}/releases?per_page=100`, {
  • 读取本地文件
    src/main/index.js:93
    return fs.existsSync(dshRuntimeBinPath());
  • 读取本地文件
    src/main/index.js:103
    if (fs.existsSync(c)) return c;
  • 读取本地文件
    src/main/index.js:118
    return fs.existsSync(p) ? p : null;
  • 删除本地文件
    src/main/index.js:145
    fs.rmSync(extractTmp, { recursive: true, force: true });
  • 写入本地文件
    src/main/index.js:146
    fs.mkdirSync(extractTmp, { recursive: true });
  • 执行外部命令固定命令
    src/main/index.js:151
    execFile('tar', ['-xzf', archivePath, '-C', extractTmp], (err) => {
  • 删除本地文件
    src/main/index.js:157
    fs.rmSync(archivePath, { force: true });
  • 删除本地文件
    src/main/index.js:159
    fs.rmSync(runtimeDir, { recursive: true, force: true });
  • 写入本地文件
    src/main/index.js:160
    fs.mkdirSync(runtimeDir, { recursive: true });
  • 读取本地文件
    src/main/index.js:162
    const entries = fs.readdirSync(extractTmp);
  • 读取本地文件
    src/main/index.js:164
    for (const entry of fs.readdirSync(root)) {
  • 写入本地文件
    src/main/index.js:165
    fs.renameSync(path.join(root, entry), path.join(runtimeDir, entry));
  • 删除本地文件
    src/main/index.js:167
    fs.rmSync(extractTmp, { recursive: true, force: true });
  • 写入本地文件
    src/main/index.js:171
    if (process.platform !== 'win32') fs.chmodSync(bin, 0o755);
  • 执行外部命令来自配置/变量
    src/main/index.js:190
    execFile(nodePath, ['--version'], { timeout: 3000 }, (err, stdout) => {
  • 写入本地文件
    src/main/index.js:273
    fs.mkdirSync(path.dirname(STATE_FILE), { recursive: true });
  • 删除本地文件
    src/main/index.js:281
    try { fs.rmSync(STATE_FILE, { force: true }); } catch { }
  • 发起网络请求
    src/main/index.js:317
    https.get(u, (res) => {
  • 删除本地文件
    src/main/index.js:337
    file.on('error', (err) => { fs.rmSync(dest, { force: true }); reject(err); });
  • 执行外部命令固定命令
    src/main/index.js:347
    execFile('unzip', ['-o', '-q', zipPath, '-d', destDir], (err) => {
  • 执行外部命令来自配置/变量
    src/main/index.js:432
    const child = spawn(cmd, args, {
  • 执行外部命令固定命令
    src/main/index.js:937
    execFileSync('pgrep', ['-f', 'DshDesktop.app/Contents/MacOS'], { stdio: 'ignore' });
  • 读取本地文件
    src/main/updater.js:20
    if (fs.existsSync(cfgPath)) {
  • 读取本地文件
    src/main/updater.js:21
    const cfg = JSON.parse(fs.readFileSync(cfgPath, 'utf8'));
  • 执行外部命令来自配置/变量
    test-dsh-process.js:28
    const child = spawn(pnpm, DEFAULT_DSH_ARGS, {
  • 执行外部命令运行时拼接
    test-dsh-process.js:100
    try { execSync(`lsof -iTCP:${port} -sTCP:LISTEN -n -P 2>/dev/null`); return true; } catch { return false; }
  • 执行外部命令运行时拼接
    test-dsh-process.js:106
    try { return execSync(`ps aux | grep -E "${pat}" | grep -v grep | awk '{print $2}'`).toString().trim().split('\n').filter(Boolean); } catch { return [
  • 执行外部命令运行时拼接
    test-dsh-process.js:117
    try { execSync(`lsof -iTCP:${port} -sTCP:LISTEN -n -P 2>/dev/null`); } catch { exited = true; break; }
扫描于 2026/11/1(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库
涉及外部主机:api.github.com

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

依赖的 DSH / Cordis 模块
@deepseek-ai/dsh
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 免装Node启动服务
  • 双击即用
  • 零配置启动

DeepSeek Harness 桌面壳,零配置启动,无需预装 Node

README

由 DeepSeek 最新模型翻译生成
dsh-desktop 在桌面上运行 DeepSeek Harness 的桌面壳 ——无需预装 Node.js,一键安装,双击即用。 简体中文 · English 功能 - ⚡️ 零配置启动:首次启动自动下载 Node 运行时与 Harness 核心,之后全部本地运行,无需预装任何环境 - 🔄 运行时分发:安装包不携带 dsh 依赖树;首次运行从 GitHub Releases 下载 dsh-runtime-<platform>-<arch>.zip,后续复用本地缓存 - 🪶 Node 运行时兜底:优先使用系统 Node 22+;若系统没有合适版本,自动下载独立 Node 运行时到本地 - 🔁 内核自愈:每次启动自动对比 GitHub Releases 最新 dsh 运行时,有新版本即自动升级;离线时保留本地继续运行 - 🔒 本地优先:dsh 服务运行在 127.0.0.1,会话与设置保存在本机 - 📌 托盘驻留:关闭窗口不退出,dsh 后台继续运行;托盘菜单可打开窗口、重启服务、退出 - 🛡️ 进程守护:安全回收 dsh 子进程(含强杀后残留的孤儿进程) - 🔄 自动更新:通过 electron-updater 检查 GitHub Releases,新版本自动下载,重启时完成升级 快速开始 从 Releases 下载对应平台的安装包,安装后启动即可。
展开完整文档(README 剩余 1 节)
dsh-desktop

在桌面上运行 DeepSeek Harness 的桌面壳 ——无需预装 Node.js,一键安装,双击即用。

简体中文 · English

功能

- ⚡️ 零配置启动:首次启动自动下载 Node 运行时与 Harness 核心,之后全部本地运行,无需预装任何环境
- 🔄 运行时分发:安装包不携带 dsh 依赖树;首次运行从 GitHub Releases 下载 dsh-runtime-<platform>-<arch>.zip,后续复用本地缓存
- 🪶 Node 运行时兜底:优先使用系统 Node 22+;若系统没有合适版本,自动下载独立 Node 运行时到本地
- 🔁 内核自愈:每次启动自动对比 GitHub Releases 最新 dsh 运行时,有新版本即自动升级;离线时保留本地继续运行
- 🔒 本地优先:dsh 服务运行在 127.0.0.1,会话与设置保存在本机
- 📌 托盘驻留:关闭窗口不退出,dsh 后台继续运行;托盘菜单可打开窗口、重启服务、退出
- 🛡️ 进程守护:安全回收 dsh 子进程(含强杀后残留的孤儿进程)
- 🔄 自动更新:通过 electron-updater 检查 GitHub Releases,新版本自动下载,重启时完成升级

快速开始

从 Releases 下载对应平台的安装包,安装后启动即可。

首次运行会下载 Node 运行时与 Harness 核心(约几百 MB),随后直接进入 http://127.0.0.1:<port> 的 Harness 界面。之后一切本地运行,无需网络。

要求:macOS 10.15+ / Windows 10+(64 位)· 首次启动需联网

🤔 不知道下载哪个? 每个版本的 Release 说明 里都有一份「我该下载哪个安装包」的通俗指引,照着选即可。

工作原理

┌──────────────────────────────────────────────┐
│ Electron 壳 (BrowserWindow) │ │ loadURL(dsh web) → 显示 Harness 界面 │ │ 托盘菜单 / 自动更新 / 进程守护 │ └──────────────────────┬───────────────────────┘ │ spawn (node → dsh) ┌──────────────────────┴───────────────────────┐ │ Electron 主进程 │ │ ensureDshRuntime 下载/解压 dsh 运行时 │ │ ensureNodeRuntime 按需下载 Node 22 │ │ DshProcess 端口发现 + 生命周期 │ │ updater 自动更新检查 │ └──────┬───────────────────────────┬───────────┘ │ │ userData/dsh-runtime/ userData/node-runtime/ (预打包 dsh 依赖) (Node v22 运行时) └─────────────┬─────────────┘ ▼
node dsh/lib/bin.js --profile web --port 0
│
▼
http://127.0.0.1:<port>/ ← dsh web UI

预打包的 Harness 运行时发布在 dsh-desktop Releases 的 runtime release 中,按平台/架构区分(dsh-runtime-<platform>-<arch>.zip)。

开发

环境

pnpm install # 安装依赖
pnpm start # 启动(开发模式)

常用命令

| 命令 | 说明 |
| pnpm start | 开发模式启动(使用项目内 dsh) |
| pnpm dist:mac | 打包 macOS(dmg/zip) |
| pnpm build:dsh-runtime | 构建 dsh 运行时压缩包 |
| pnpm release <ver> <notes> | 一键发布(签名 + 公证 + GitHub Release) |

环境变量

| 变量 | 默认 | 说明 |
| DSH_SOURCE | 空 | 设为 repo 时使用本地源码模式(开发调试) |
| DSH_REPO | ~/personal/deepseek-harness | 本地源码模式下的 dsh 仓库路径 |
| DSH_PROFILE | web | dsh profile 名 |
| DSH_NODE | 空 | 指定 Node.js 绝对路径(优先于自动探测) |
| DSH_RUNTIME_VERSION | 0.1.0-rc.6 | 运行时下载的 dsh 版本 |
| DSH_DISABLE_SYSTEM_NODE | 空 | 设为 1 时强制跳过系统 Node,用独立运行时 |

目录结构

src/main/index.js Electron 主进程:运行时下载/启动 dsh、端口发现、托盘、生命周期 src/main/updater.js App 自动更新(electron-updater 封装) src/preload/ contextBridge 安全桥 src/renderer/ 加载中/错误页(实际 UI 由 dsh web 提供) scripts/build-dsh-runtime.sh 构建运行时压缩包 scripts/release.sh 一键发布脚本 .github/workflows/release.yml GitHub Actions 发布流水线

技术要点

- 运行时分发:安装包不包含 dsh 依赖树;首次运行下载 dsh-runtime-<platform>-<arch>.zip 到 userData/dsh-runtime
- 内核自愈:每次启动对比 GitHub Releases 最新 dsh 运行时版本,有新版本自动下载替换;离线/限流时保留本地继续运行
- Node 运行时兜底:优先使用系统 Node 22+;若没有,自动下载 node-v22.23.1-<platform>-<arch> 到 userData/node-runtime
- 进程组管理:dsh 以独立进程组运行,停止时整棵进程树(node → dsh)一并回收
- 退出路径:托盘"退出"/Cmd+Q 时先回收 dsh 子进程再退出;强杀 Electron 时通过 state 文件记录进程组 PID,下次启动自动清理孤儿进程
- 自更新机制:打包版启动 30 秒后及此后每 6 小时自动检查更新
- CI 缓存:GitHub Actions 缓存 dsh-runtime 构建结果(~/.npm + .dsh-runtime-cache),大幅缩短 Windows 构建时间

License

MIT
预览分享卡片长什么样 ↓Denszh/dsh-desktop
分享 · DeepSeek Harness Hub
Denszh/dsh-desktop

双击即用,免装 Node 启动本地服务

回到顶部