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

桌面外壳 Aliarrrrr/dsh-desktop

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

双击启动原生窗口运行 dsh 网页界面

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

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

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

状态速览

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

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

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 29 处,展示前 28 条)
  • 读取本地文件
    src/main.js:83
    const parsed = JSON.parse(fs.readFileSync(settingsPath, 'utf8'))
  • 写入本地文件
    src/main.js:92
    fs.mkdirSync(path.dirname(settingsPath), { recursive: true })
  • 写入本地文件
    src/main.js:93
    fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf8')
  • 读取本地文件
    src/main.js:112
    const id = crypto.createHash('sha256').update(fs.readFileSync(sourcePath)).digest('hex').slice(0, 16)
  • 写入本地文件
    src/main.js:114
    fs.mkdirSync(backgroundsDir(), { recursive: true })
  • 读取本地文件
    src/main.js:115
    if (!fs.existsSync(target)) fs.copyFileSync(sourcePath, target)
  • 读取本地文件
    src/main.js:130
    if (!file || !fs.existsSync(file)) return null
  • 读取本地文件
    src/main.js:132
    return 'data:image/' + ext + ';base64,' + fs.readFileSync(file).toString('base64')
  • 删除本地文件
    src/main.js:174
    fs.rmSync(path.join(backgroundsDir(), previous), { force: true })
  • 读取本地文件
    src/main.js:437
    const injectScript = fs.readFileSync(path.join(__dirname, 'inject.js'), 'utf8')
  • 写入本地文件
    src/main.js:677
    fs.writeFileSync(path.join(SMOKE_ROOT, 'smoke-shot-ui.png'), shotUi.toPNG())
  • 写入本地文件
    src/main.js:748
    fs.writeFileSync(path.join(SMOKE_ROOT, 'smoke-shot.png'), shot.toPNG())
  • 写入本地文件
    src/main.js:780
    fs.writeFileSync(path.join(SMOKE_ROOT, 'smoke-shot-bg.png'), shot2.toPNG())
  • 读取本地文件
    src/server.js:85
    if (fs.existsSync(nodeExe) && fs.existsSync(bin)) {
  • 读取本地文件
    src/server.js:96
    if (envRepo && fs.existsSync(path.join(envRepo, 'apps', 'cli', 'lib', 'bin.js'))) {
  • 读取本地文件
    src/server.js:114
    if (fs.existsSync(bin) && fs.existsSync(path.join(repo, 'node_modules'))) {
  • 发起网络请求
    src/server.js:153
    const res = await fetch(url, { signal: controller.signal, redirect: 'manual' })
  • 执行外部命令来自配置/变量
    src/server.js:267
    const child = spawn(spec.cmd, spec.args, {
  • 执行外部命令固定命令
    src/server.js:421
    spawn('taskkill', ['/pid', String(this.child.pid), '/T', '/F'], { windowsHide: true, stdio: 'ignore' })
  • 读取本地文件
    src/version.js:20
    const parsed = JSON.parse(fs.readFileSync(path.join(root, 'bundle', 'manifest.json'), 'utf8'))
  • 读取本地文件
    src/recovery.js:26
    return JSON.parse(fs.readFileSync(file, 'utf8'))
  • 写入本地文件
    src/recovery.js:33
    fs.mkdirSync(path.dirname(file), { recursive: true })
  • 写入本地文件
    src/recovery.js:34
    fs.writeFileSync(file, JSON.stringify(value, null, 2) + '\n', 'utf8')
  • 写入本地文件
    src/log.js:23
    fs.mkdirSync(dir, { recursive: true })
  • 读取本地文件
    src/log.js:25
    fileSize = fs.existsSync(filePath) ? fs.statSync(filePath).size : 0
  • 写入本地文件
    src/log.js:27
    fs.renameSync(filePath, filePath + '.1')
  • 写入本地文件
    src/log.js:38
    fs.renameSync(filePath, filePath + '.1')
  • 写入本地文件
    src/log.js:51
    fs.appendFileSync(filePath, line)
扫描于 2026/11/3(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库

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

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

功能亮点

  • 原生窗口运行网页界面
  • 自定义背景图

DeepSeek Harness 桌面应用:套在 dsh web UI 外面的 ChatGPT 风格轻量窗口,支持自定义背景图。

README

由 DeepSeek 最新模型翻译生成
dsh-desktop — DeepSeek Harness 桌面版 把「命令行跑 dsh web,再开浏览器访问」变成双击即用的原生窗口:窗口里就是 DeepSeek Harness 的 Web UI(逐字节一致),外加自定义背景图片。 桌面设置面板 早期预览版,目前仅支持 Windows。安装包未做代码签名,首次运行可能触发 SmartScreen 提示。 这是什么 它不是 dsh 的另一套前端,而是一个托管本地 dsh 服务的原生外壳: ┌───────────────────────────────────────┐ │ Electron 窗口 │ 原生窗口 / 托盘 / 菜单 / 单实例 │ └── 加载 dsh 的 Web UI │ └──────────────┬────────────────────────┘ │ http://127.0.0.1:/?token=…
展开完整文档(README 剩余 1 节)
dsh-desktop — DeepSeek Harness 桌面版

把「命令行跑 dsh web,再开浏览器访问」变成双击即用的原生窗口:窗口里就是 DeepSeek Harness 的 Web UI(逐字节一致),外加自定义背景图片。

桌面设置面板

早期预览版,目前仅支持 Windows。安装包未做代码签名,首次运行可能触发 SmartScreen 提示。

这是什么

它不是 dsh 的另一套前端,而是一个托管本地 dsh 服务的原生外壳:

┌───────────────────────────────────────┐
│ Electron 窗口 │ 原生窗口 / 托盘 / 菜单 / 单实例 │ └── 加载 dsh 的 Web UI │ └──────────────┬────────────────────────┘ │ http://127.0.0.1:/?token=…
┌──────────────▼────────────────────────┐
│ dsh 服务(子进程,受监督) │ 真身在这里 │ DSH_HOME = ~/.dsh │ 与 CLI 共享会话与凭据 └───────────────────────────────────────┘

所以任务管理器里会有两个 node.exe(Electron 外壳 + dsh 服务),这是设计如此——不是「桌面端和 web 版各跑了一份」。服务只监听 127.0.0.1 的随机端口,不对外暴露。

快速开始

安装版

1. 运行 DeepSeek Harness Setup.exe(或从 Releases 下载)
2. 双击桌面 / 开始菜单的「DeepSeek Harness」

安装体积约 450 MB,内含 Electron、便携 Node.js 22 与 @deepseek-ai/dsh 运行时——不需要预装 Node,也不需要联网(除调用模型 API 外,首次启动会在 %USERPROFILE%\.dsh 建立本地配置)。

从源码运行

git clone https://github.com/Aliarrrrr/dsh-desktop.git
cd dsh-desktop
npm install
npm run bundle:server # 构建内置运行时(便携 Node + dsh),约 260 MB
npm start

bundle:server 是推荐的一步:跑过之后桌面端自带运行时,不依赖系统 Node、也不依赖你其他的 dsh 安装。跳过它也能跑——此时会依次回退到「指向 deepseek-harness 检出」和 npx。

功能

桌面体验

- 真正的窗口,不是浏览器 --app= 伪装:原生菜单、托盘、单实例、窗口尺寸记忆
- 托盘常驻:关窗不结束应用,长时间任务继续跑;托盘提示显示服务状态与端口
- UI 与浏览器一致:Web 代码零改动——直接访问同一个服务,界面逐字节相同

可靠性

- 服务受监督:意外退出或连续两次探活失败即自动重启,指数退避(1/2/4/8 秒),最多 3 次后停手(避免坏插件导致每秒起一个进程)
- 启动失败有出路:恢复页提供三个可逆动作
- 重试启动
- 安全模式启动:只加载官方核心插件,会话与模型配置照常可用
- 禁用第三方插件:把插件条目移入备份字段(不删文件),可随时恢复
- 服务地址用 dsh 独有指纹确认,不会因为「某个前端恰好监听 3080」而误连
- 会话令牌不落日志:日志与界面只暴露 origin

个性化

- 自定义背景图片:右下角齿轮 →「桌面设置」
- 本地图片(png / jpg / webp / gif / bmp)、四种显示方式
- 背景淡化滑杆(0–90%):只淡化背景层,UI 文字始终清晰
- 图片按内容哈希去重,替换时清理上一张
- 与主题插件兼容:未设背景时不覆盖任何样式;设了也只接管主表面 token (bg-base / bg-layer-1 / sidebar-fill),其余 token 仍由主题插件控制

安全

- 渲染进程隔离:contextIsolation 开启、无 Node 能力、桥接 API 固定且不可篡改
- IPC 固定白名单(8 通道)+ 参数校验 + 路径穿越防护;无 eval、无 shell 拼接
- 恢复动作只读写 profile 文件,不启动任何进程,且全部可逆
- 注入脚本只注入 http(s) 页面,本地恢复页不会长出设置面板
- 详见 SECURITY.md(含威胁模型与已知边界)

版本管理

桌面端使用内置的固定 dsh 版本,与系统里 CLI 安装的 dsh 相互独立。

- 版本钉在 package.json 的 dshRuntime 字段(当前 0.1.6-alpha.1),安装时用 --save-exact:同一份源码永远构建出同一套运行时
- 每次构建写入 bundle/manifest.json(应用 / dsh / Node / 平台 / 构建时间),应用启动时读取,显示在设置面板底部并写入日志
- 两者共享 ~/.dsh 下的会话与凭据,但插件档(profile)各自管理
- 升级内置版本:改 dshRuntime → npm run bundle:server --force → 重新打包,并在 CHANGELOG 记录
- 临时试某个版本:npm run bundle:server -- --force --dsh-version=0.1.5-rc.2

数据位置

| 内容 | 位置 |
| dsh 会话 / 凭据 / 插件档 | %USERPROFILE%\.dsh(DSH_HOME,与 CLI 共享) |
| 桌面设置 | %APPDATA%\DeepSeek Harness\settings.json |
| 背景图片 | %APPDATA%\DeepSeek Harness\backgrounds\ |
| 运行日志 | %APPDATA%\DeepSeek Harness\logs\desktop.log(超过 2 MB 轮转) |

从源码 npm start 运行时,userData 是 %APPDATA%\dsh-desktop(Electron 取 package.json 的 name);打包安装版才是 %APPDATA%\DeepSeek Harness。
排查问题时两个位置都看一下,改动时间最新的那个才是刚跑的。

开发

常用命令

npm start # 运行桌面端
npm test # 功能单元检查(12 项,纯 Node,可在无 GUI 环境跑)
npm run security-check # 静态安全审计(54 项断言)
npm run verify # 上面两项,CI 在打包前执行
npm run smoke # 端到端冒烟:真实启动应用、注入、背景、持久化 + 截图

改了代码后,至少跑一遍 npm run verify;涉及 IPC 通道或桥接 API 的改动,要同步更新 scripts/verify-security.mjs 里的白名单,否则断言会红。

构建安装包

npm run bundle:server # 拉取内置运行时到 bundle/
npm run dist # 生成 NSIS 安装包(release/)
npm run dist:dir # 只生成免安装目录(release/win-unpacked/)

bundle:server 结束前会真实启动一次服务做自检:如果裁剪或安装把依赖弄坏了,构建会直接失败,而不是等你打开应用才发现。

网络受限时

构建需要下载便携 Node 与 dsh 依赖,两步都支持镜像回退:

| 用途 | 默认 | 回退 | 环境变量 |
| 便携 Node | nodejs.org | npmmirror → 阿里云 | DSH_DESKTOP_NODE_MIRROR |
| npm 依赖 | registry.npmjs.org | npmmirror | DSH_DESKTOP_NPM_REGISTRY |

例:全程走国内镜像
export DSH_DESKTOP_NPM_REGISTRY=https://registry.npmmirror.com/
npm run bundle:server --force

某些网络下官方 npm registry 会挂起而不报错,构建看起来像卡死。
遇到就显式指定镜像;脚本对单个请求设了 60 秒超时,会较快失败并尝试下一个源。

常见问题

启动后有个服务在监听端口,是不是多跑了一个?
不是。那是桌面端自己的后端(见上文「这是什么」)。想彻底停掉(连服务一起):托盘图标右键 →「退出」;直接关窗口只是收进托盘,服务会继续跑。

能让它复用手动跑着的 dsh web 吗?
会。若 127.0.0.1:3080 上有 dsh 服务,桌面端会复用它而不是再起一个(避免两个进程写同一份会话)。设 DSH_DESKTOP_NO_REUSE=1 可关闭。注意:如果那个实例需要令牌,桌面端拿不到,会改为启动自己的实例。

启动失败进不去界面?
应用会显示恢复页,依次尝试「重试启动」→「安全模式启动」→「禁用第三方插件」。
诊断信息与日志路径都在恢复页上。

服务中途挂了?
会自动重启,最多 3 次;状态显示在托盘提示与「帮助」菜单里。

怎么知道用的是哪个 dsh 版本?
右下角齿轮 →「桌面设置」面板底部;构建产物里也有 bundle/manifest.json。

杀软 / SmartScreen 提示未知发布者?
安装包未签名。正式分发前需要补代码签名证书。

想用本地仓库而不是内置运行时?
设 DSH_DESKTOP_REPO 指向一个已安装依赖(有 node_modules)的 deepseek-harness 检出即可;服务定位优先级见 src/server.js。没有依赖的源码树会被跳过。

项目结构

dsh-desktop/
├─ src/
│ ├─ main.js # 主进程:窗口、托盘、IPC、状态同步、恢复动作 │ ├─ server.js # dsh 子进程:命令解析、探活、崩溃重启、终止 │ ├─ recovery.js # 恢复动作:安全模式 profile、可逆禁用插件 │ ├─ version.js # 读取 bundle/manifest.json │ ├─ log.js # 日志落盘(2 MB 轮转,写失败不影响主流程) │ ├─ preload.js # 渲染进程桥接(固定 API) │ └─ inject.js # 注入页面脚本:背景应用器 + 桌面设置面板 ├─ assets/ # 图标、启动闪屏、启动失败恢复页 ├─ scripts/ # bundle 构建、冒烟、单元检查、安全审计 ├─ bundle/ # 内置运行时 + manifest.json(构建生成,不入库) └─ release/ # 打包产物(不入库)

许可

MIT License,版权归 Aliarrrrr 所有(见 LICENSE)。
第三方依赖许可见 THIRD_PARTY_NOTICES.md。

本项目封装自 @deepseek-ai/dsh(DeepSeek Harness,MIT);Electron(MIT)与 Chromium 组件的许可见各自项目。本项目是独立的社区项目,不代表 DeepSeek 官方发行或背书。
预览分享卡片长什么样 ↓Aliarrrrr/dsh-desktop
分享 · DeepSeek Harness Hub
Aliarrrrr/dsh-desktop

双击启动原生窗口运行 dsh 网页界面

这是你的仓库?认领条目

回到顶部