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

桌面客户端 gatesenman/dsh-desktop

DeepSeek Harnessv0.2.0
gatesenman69 天前有提交已提供中文文档扫描:含敏感能力

DeepSeek Harness(dsh)桌面应用——自动安装并内嵌 dsh Web UI

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

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

自动兼容检查有告警:npm 同名包「dsh-desktop」归属 snowcrescenter-tech/dsh-desktop,装到的可能不是本插件。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add gatesenman/dsh-desktop
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

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

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

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

npm 同名包「dsh-desktop」归属 snowcrescenter-tech/dsh-desktop,装到的可能不是本插件

展开查看检查明细 ↓

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

✓npm 包dsh-desktop @ 0.2.0
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

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

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

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

可执行外部命令读写/删除本地文件写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 82 处,展示前 45 条)
  • 读取本地文件
    src/main.js:75
    return JSON.parse(fs.readFileSync(statePath(), 'utf8'))
  • 写入本地文件
    src/main.js:82
    fs.mkdirSync(userDir(), { recursive: true })
  • 写入本地文件
    src/main.js:83
    fs.writeFileSync(statePath(), JSON.stringify(state, null, 2))
  • 写入本地文件
    src/main.js:99
    fs.mkdirSync(userDir(), { recursive: true })
  • 读取本地文件
    src/main.js:102
    if (fs.statSync(file).size > LOG_FILE_LIMIT) fs.renameSync(file, `${file}.old`)
  • 写入本地文件
    src/main.js:106
    logStream = fs.createWriteStream(file, { flags: 'a' })
  • 发起网络请求
    src/main.js:154
    const req = https.get(url, { headers: { 'user-agent': 'dsh-desktop' }, timeout: timeoutMs }, (res) => {
  • 发起网络请求
    src/main.js:177
    const req = https.get(url, { headers: { 'user-agent': 'dsh-desktop' } }, (res) => {
  • 写入本地文件
    src/main.js:191
    const file = fs.createWriteStream(dest)
  • 执行外部命令来自配置/变量
    src/main.js:213
    const child = spawn(cmd, args, { ...opts, shell: false })
  • 执行外部命令来自配置/变量
    src/main.js:241
    const probe = spawnSync(isWin ? 'node.exe' : 'node', ['--version'], { encoding: 'utf8', shell: false })
  • 执行外部命令来自配置/变量
    src/main.js:243
    const which = spawnSync(isWin ? 'where' : 'which', [isWin ? 'node.exe' : 'node'], { encoding: 'utf8' })
  • 读取本地文件
    src/main.js:257
    return fs.existsSync(path.join(dir, isWin ? 'node.exe' : 'node')) ? dir : null
  • 读取本地文件
    src/main.js:263
    const dir = fs.readFileSync(marker, 'utf8').trim()
  • 读取本地文件
    src/main.js:265
    if (fs.existsSync(nodeBin)) return dir
  • 写入本地文件
    src/main.js:291
    fs.mkdirSync(runtimeDir(), { recursive: true })
  • 删除本地文件
    src/main.js:296
    fs.rmSync(archive, { force: true })
  • 读取本地文件
    src/main.js:336
    if (fs.existsSync(local)) return local
  • 执行外部命令来自配置/变量
    src/main.js:341
    const probe = spawnSync(isWin ? 'node.exe' : 'node', ['-e', "console.log(require.resolve('npm/bin/npm-cli.js'))"], {
  • 删除本地文件
    src/main.js:390
    if (!keep.has(name)) fs.rmSync(versionInstallDir(name), { recursive: true, force: true })
  • 删除本地文件
    src/main.js:407
    fs.rmSync(prefix, { recursive: true, force: true })
  • 删除本地文件
    src/main.js:414
    fs.rmSync(prefix, { recursive: true, force: true })
  • 发起网络请求
    src/main.js:518
    const req = http.get({ host: '127.0.0.1', port, path: '/', timeout: 3000 }, (res) => {
  • 执行外部命令来自配置/变量
    src/main.js:544
    serverProc = spawn(nodeBin(nodeDir), [entry, 'web', '--port', String(serverPort)], {
  • 执行外部命令固定命令
    src/main.js:589
    spawnSync('taskkill', ['/pid', String(proc.pid), '/t', '/f'])
  • 删除本地文件
    src/main.js:953
    fs.rmSync(staging, { recursive: true, force: true })
  • 删除本地文件
    src/main.js:981
    fs.rmSync(staging, { recursive: true, force: true })
  • 发起网络请求
    src/main.js:1056
    const req = https.get(url, { headers: { 'user-agent': 'dsh-desktop' }, timeout: timeoutMs }, (res) => {
  • 发起网络请求
    src/main.js:1068
    const req = http.get({ host: '127.0.0.1', port, path: '/', timeout: timeoutMs }, (res) => {
  • 写入剪贴板
    src/main.js:1126
    if (response === 0) clipboard.writeText(report)
  • 发起网络请求
    build/prepare-node-runtime.js:20
    const req = https.get(url, { headers: { 'user-agent': 'dsh-desktop-build' } }, (res) => {
  • 写入本地文件
    build/prepare-node-runtime.js:31
    const file = fs.createWriteStream(dest)
  • 读取本地文件
    build/prepare-node-runtime.js:49
    if (fs.existsSync(path.join(stageDir, os === 'win' ? 'node.exe' : path.join('bin', 'node')))) {
  • 写入本地文件
    build/prepare-node-runtime.js:55
    fs.mkdirSync(cacheDir, { recursive: true })
  • 读取本地文件
    build/prepare-node-runtime.js:57
    if (!fs.existsSync(archive)) {
  • 删除本地文件
    build/prepare-node-runtime.js:63
    fs.rmSync(stageDir, { recursive: true, force: true })
  • 写入本地文件
    build/prepare-node-runtime.js:64
    fs.mkdirSync(stageDir, { recursive: true })
  • 执行外部命令固定命令
    build/prepare-node-runtime.js:66
    const tar = spawnSync('tar', ['-xf', archive, '-C', stageDir, '--strip-components=1'], { stdio: 'inherit' })
  • 删除本地文件
    build/prepare-node-runtime.js:71
    fs.rmSync(path.join(stageDir, name), { recursive: true, force: true })
  • 删除本地文件
    build/prepare-node-runtime.js:75
    fs.rmSync(path.join(stageDir, 'bin', name), { force: true })
  • 删除本地文件
    build/prepare-node-runtime.js:77
    fs.rmSync(path.join(stageDir, 'lib', 'node_modules', 'corepack'), { recursive: true, force: true })
  • 删除本地文件
    build/prepare-node-runtime.js:79
    fs.rmSync(path.join(stageDir, 'node_modules', 'corepack'), { recursive: true, force: true })
  • 删除本地文件
    build/prepare-node-runtime.js:81
    fs.rmSync(path.join(stageDir, name), { force: true })
  • 写入剪贴板
    src/inbox.js:56
    navigator.clipboard.writeText(task.output || '')
  • 写入剪贴板
    src/logs.js:24
    await navigator.clipboard.writeText(logEl.textContent)
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库

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

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

界面预览

3 张 · 点击查看大图

功能亮点

  • 内嵌dshWebUI
  • 自动安装dsh
  • 支持三大桌面系统

README

由 DeepSeek 最新模型翻译生成
DSH Desktop DeepSeek Harness (dsh) 的非官方桌面客户端 · macOS / Windows / Linux DSH Desktop 把官方发布的 @deepseek-ai/dsh 打包成开箱即用的桌面应用:不用命令行,也不用自己装 Node.js,下载安装包双击打开,应用自动完成全部环境配置,直接进入界面。 技术说明:应用通过 npm 安装官方公开发布的 @deepseek-ai/dsh(官方用法是 npx @deepseek-ai/dsh web),用 Electron + electron-builder 打包,内嵌官方 dsh web 服务的 Web UI。没有复制或修改任何官方源码,桌面壳只做运维、托盘、备份、诊断这些外围增强,不改动 Harness 内部的智能体、会话、插件与权限体系。 下载安装 从 Releases 下载对应平台的安装包: | 平台 | 安装包 | 说明 | | macOS | .dmg | x64 / Apple Silicon (arm64) | | Windows | .exe | NSIS 安装程序 | | Linux | .AppImage / .deb | x64 | 安装包内置 Node.js 运行时,弱网 / 离线环境同样能完成首次安装。
展开完整文档(README 剩余 1 节)
DSH Desktop

DeepSeek Harness (dsh) 的非官方桌面客户端 · macOS / Windows / Linux

DSH Desktop 把官方发布的 @deepseek-ai/dsh 打包成开箱即用的桌面应用:不用命令行,也不用自己装 Node.js,下载安装包双击打开,应用自动完成全部环境配置,直接进入界面。

技术说明:应用通过 npm 安装官方公开发布的 @deepseek-ai/dsh(官方用法是 npx @deepseek-ai/dsh web),用 Electron + electron-builder 打包,内嵌官方 dsh web 服务的 Web UI。没有复制或修改任何官方源码,桌面壳只做运维、托盘、备份、诊断这些外围增强,不改动 Harness 内部的智能体、会话、插件与权限体系。

下载安装

从 Releases 下载对应平台的安装包:

| 平台 | 安装包 | 说明 |
| macOS | .dmg | x64 / Apple Silicon (arm64) |
| Windows | .exe | NSIS 安装程序 |
| Linux | .AppImage / .deb | x64 |

安装包内置 Node.js 运行时,弱网 / 离线环境同样能完成首次安装。

核心特性

零门槛安装与启动

- 首启自动配置:检测系统 Node.js(22.19+ / 24+)→ 优先用安装包内置运行时 → 必要时自动下载;随后自动安装 @deepseek-ai/dsh 并启动服务,全程分步安装动画(支持系统「减弱动态效果」)。
- 二次启动秒进:环境配置只在首启执行一次,之后只显示轻量启动 splash,服务就绪即进入主界面。
- 单实例 + 崩溃自愈:重复打开唤起已有窗口;dsh web 服务意外退出自动重启;启动失败可一键重试或查看日志。

智能体收件箱与定时任务

- 全局快捷键快速任务:任意界面按 Ctrl/Cmd+Alt+Space 呼出输入框,输入一句话任务回车,任务通过 dsh 官方 headless 模式在后台运行,完成或失败即发送系统通知。
- 智能体收件箱:集中查看全部后台任务的状态与结果,支持取消进行中任务、复制结果、删除与清空;点击系统通知直达收件箱。
- 定时任务:创建「每天 HH:MM」或「每隔 N 小时」自动执行的任务(如每天 9 点总结昨天的工作目录变化),可随时启停、立即运行或删除。
- 后台任务需要已配置模型 API 凭据(在内嵌 Web UI 的 Models 页面配置即可)。

可靠运维

- dsh 版本钉扎与一键回滚:每个版本独立目录安装;升级先在新目录安装并通过 dsh --version 预检后才切换;保留上一版本,升级后启动失败自动回退,托盘 / 设置可随时手动回滚。
- 一键备份 / 恢复:将 DSH 数据目录(会话、设置、凭据)与桌面偏好打包为单个 tar.gz;恢复前二次确认并校验归档路径安全,完成后自动重启服务。备份包含 API 凭据,请妥善保管。
- 环境体检 Doctor:一键生成诊断报告(应用 / 系统 / Node / dsh 版本、服务与端口状态、数据目录读写、磁盘剩余、代理与 npm / DeepSeek API 网络连通性),可直接复制用于排障;不含 API key 等敏感值,不上传任何数据。
- 更新策略:手动或自动更新 dsh;应用本身通过 GitHub Releases 自动更新(启动后延迟错峰检查、每 6 小时一次、睡眠唤醒后补检)。

桌面体验

- 沉浸式窗口:无标题栏 / 菜单栏,记住窗口大小、位置、最大化状态与缩放级别;背景跟随系统深浅色主题,加载不白闪。
- 系统托盘:最小化到托盘持续运行;托盘菜单涵盖智能体收件箱、快速任务、工作目录切换、设置、更新、回滚、体检、备份 / 恢复、打开终端(node 与 dsh 已预置 PATH)等。
- 工作目录切换:任选文件夹作为 dsh 服务工作目录,记住最近目录,可一键恢复默认。
- 安全加固:服务仅监听本机随机端口;渲染进程禁用 Node 集成并启用上下文隔离;外部链接一律在系统浏览器中打开。

界面预览

主窗口(内嵌官方 Web UI,沉浸式无边框):

主窗口

智能体收件箱(后台任务结果、定时任务管理):

智能体收件箱

设置(开机自启、托盘、更新、维护工具):设置

快捷键

| 快捷键 | 功能 |
| Ctrl/Cmd+Alt+Space | 全局呼出快速任务输入框 |
| Ctrl/Cmd+Shift+R | 重启 dsh 服务 |
| Ctrl/Cmd+U | 检查并更新 dsh |
| Ctrl/Cmd + / - / 0 | 缩放界面 / 还原 |

从源码运行与构建

npm install
npm start # 从源码运行
npm run dist # 构建当前平台安装包

推送 v* 标签会触发 GitHub Actions,在 macOS / Windows / Linux 三平台构建并发布 Release。

数据目录

Node.js 运行时、dsh 版本化安装目录、任务记录、日志与状态文件,都保存在应用用户数据目录:

| 平台 | 路径 |
| macOS | ~/Library/Application Support/dsh-desktop |
| Windows | %APPDATA%/dsh-desktop |
| Linux | ~/.config/dsh-desktop |

许可证

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

DeepSeek Harness(dsh)桌面应用——自动安装并内嵌 dsh Web UI

这是你的仓库?认领条目

回到顶部