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

桌面客户端 EricXu20266/dsh-gui

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

把网页版封装成原生桌面应用,免配置开箱即用

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

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

自动兼容检查未通过:engines.node 要求 >=24,不满足 Node 22.19.0;仓库 package.json 标记 private,未发布到 npm,需从源码安装。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add EricXu20266/dsh-gui
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

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

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

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

engines.node 要求 >=24,不满足 Node 22.19.0;仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

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

✓npm 包dsh-gui @ 0.0.1
✗Node 引擎要求 >=24 · 基线 Node 22.19 不满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/11/1 04:57:04

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

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 52 处,展示前 48 条)
  • 执行外部命令来自配置/变量
    electron/child-process.ts:47
    spawn(bin, args, {
  • 执行外部命令来自配置/变量
    electron/host.ts:33
    const proc = spawn(options.nodeBin, args, {
  • 执行外部命令来自配置/变量
    electron/installer.ts:198
    const version = execFileSync(options.nodeBin, [getDhsBin(dhsRoot), '--version'], {
  • 写入本地文件
    electron/installer.ts:220
    writeFileSync(
  • 读取本地文件
    electron/installer.ts:238
    if (!existsSync(join(pluginDir, 'package.json'))) {
  • 读取本地文件
    electron/installer.ts:247
    if (existsSync(profilePkg)) {
  • 读取本地文件
    electron/installer.ts:255
    if (!existsSync(join(target, 'package.json'))) {
  • 写入本地文件
    electron/installer.ts:258
    writeFileSync(profilePkg, JSON.stringify(doc, null, 2));
  • 读取本地文件
    electron/installer.ts:285
    const depsOk = existsSync(join(dhsRoot, 'node_modules'));
  • 读取本地文件
    electron/installer.ts:286
    const binOk = existsSync(getDhsBin(dhsRoot));
  • 读取本地文件
    electron/installer.ts:300
    return readFileSync(profilePkg, 'utf8');
  • 删除本地文件递归
    electron/installer.ts:304
    rmSync(join(profileDir, 'node_modules', pluginName), { recursive: true, force: true });
  • 写入本地文件
    electron/log.ts:13
    mkdirSync(dirname(filePath), { recursive: true });
  • 写入本地文件
    electron/log.ts:15
    appendFileSync(installLogPath, `\n===== 安装开始 ${new Date().toISOString()} =====\n`);
  • 写入本地文件
    electron/log.ts:28
    appendFileSync(installLogPath, `${line}\n`);
  • 读取本地文件
    electron/paths.ts:45
    if (!existsSync(join(root, 'package.json'))) return false;
  • 读取本地文件
    electron/paths.ts:46
    if (!existsSync(getDhsBin(root))) return false;
  • 读取本地文件
    electron/paths.ts:47
    if (existsSync(join(root, INSTALL_MARKER))) return true;
  • 读取本地文件
    electron/paths.ts:48
    return existsSync(join(root, 'node_modules', '.pnpm', 'lock.yaml'));
  • 读取本地文件
    electron/paths.ts:83
    if (!existsSync(join(bundled, 'package.json'))) {
  • 读取本地文件
    electron/paths.ts:87
    if (existsSync(installed)) rmSync(installed, { recursive: true, force: true });
  • 删除本地文件递归
    electron/paths.ts:87
    if (existsSync(installed)) rmSync(installed, { recursive: true, force: true });
  • 写入本地文件
    electron/paths.ts:88
    mkdirSync(dirname(installed), { recursive: true });
  • 执行外部命令固定命令
    electron/proxy.ts:47
    const out = execFileSync(
  • 执行外部命令固定命令
    electron/proxy.ts:66
    const out = execFileSync('scutil', ['--proxy'], { encoding: 'utf8', windowsHide: true });
  • 读取本地文件
    electron/proxy.ts:85
    const text = readFileSync(settingsPath, 'utf8');
  • 写入本地文件
    electron/proxy.ts:97
    mkdirSync(dirname(settingsPath), { recursive: true });
  • 写入本地文件
    electron/proxy.ts:98
    writeFileSync(tmpPath, yamlDump(doc, { lineWidth: -1 }), 'utf8');
  • 读取本地文件
    electron/proxy.ts:100
    if (existsSync(settingsPath)) renameSync(settingsPath, bakPath);
  • 写入本地文件
    electron/proxy.ts:100
    if (existsSync(settingsPath)) renameSync(settingsPath, bakPath);
  • 写入本地文件
    electron/proxy.ts:101
    renameSync(tmpPath, settingsPath);
  • 读取本地文件
    electron/proxy.ts:103
    if (!existsSync(settingsPath) && existsSync(bakPath)) renameSync(bakPath, settingsPath);
  • 写入本地文件
    electron/proxy.ts:103
    if (!existsSync(settingsPath) && existsSync(bakPath)) renameSync(bakPath, settingsPath);
  • 删除本地文件
    electron/proxy.ts:106
    rmSync(tmpPath, { force: true });
  • 读取本地文件
    electron/proxy.ts:114
    if (existsSync(settingsPath)) {
  • 读取本地文件
    electron/proxy.ts:139
    if (!existsSync(settingsPath)) return {};
  • 读取本地文件
    mac-packing-resource/dsh-discovery/lib/index.js:20
    const manifest = JSON.parse(readFileSync(manifestPath, 'utf8'));
  • 发起网络请求
    mac-packing-resource/dsh-discovery/lib/routes.js:27
    const res = await fetch(url, {
  • 发起网络请求
    mac-packing-resource/dsh-discovery/lib/routes.js:96
    const res = await fetch(url, {
  • 读取本地文件
    mac-packing-resource/dsh-discovery/lib/routes.js:136
    return JSON.parse(readFileSync(join(profileNodeModules(pkg), 'package.json'), 'utf8'));
  • 读取本地文件
    mac-packing-resource/dsh-discovery/lib/routes.js:145
    return statSync(join(profileNodeModules(pkg), 'package.json')).mtimeMs;
  • 请求外部主机registry.npmjs.org
    mac-packing-resource/dsh-discovery/lib/routes.js:172
    const res = await fetch(`https://registry.npmjs.org/${encoded}?fields=dist-tags,time`, {
  • 发起网络请求
    mac-packing-resource/dsh-discovery/lib/routes.js:172
    const res = await fetch(`https://registry.npmjs.org/${encoded}?fields=dist-tags,time`, {
  • 发起网络请求
    mac-packing-resource/dsh-discovery/lib/routes.js:195
    const res = await fetch(`${GITHUB_API}/repos/${owner}/${repo}/commits?per_page=1`, {
  • 读取本地文件
    mac-packing-resource/dsh-discovery/lib/routes.js:222
    return JSON.parse(readFileSync(baselinePath(), 'utf8'));
  • 写入本地文件
    mac-packing-resource/dsh-discovery/lib/routes.js:230
    writeFileSync(baselinePath(), JSON.stringify(state, null, 2), 'utf8');
  • 发起网络请求
    mac-packing-resource/dsh-discovery/lib/routes.js:311
    const res = await fetch(url, {
  • 读取本地文件
    plugins/dsh-about/src/routes.ts:64
    const doc = JSON.parse(readFileSync(pkgPath, 'utf8')) as {
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库
涉及外部主机:registry.npmjs.org

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

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

功能亮点

  • 网页版封装为桌面应用
  • 免配置开箱即用
  • Electron图形界面

README

由 DeepSeek 最新模型翻译生成
dsh-gui — DeepSeek Harness 桌面客户端 🌐 中文 | English DHS (DeepSeek Harness) 的 Electron GUI 客户端:把 web ui 的使用方式封装为原生桌面 GUI。内核最大限度的保持 DHS。 Electron Node License Release DHS 官方以 web ui(浏览器)形态交付。dsh-gui 用 Electron 承载同一套 DHS 前端,把「浏览器里打开网页」变成「桌面应用」,同时保持 DHS 内核零改动。 下载 | 平台 | 安装包 | 说明 | | Windows 10+(x64) | dsh-gui-v0.2.0.zip | 免安装包,解压后双击 dsh-gui.exe 启动 | | macOS(Apple Silicon / arm64) | dsh-gui-0.2.0-arm64.dmg | 安装包,打开后拖入 Applications 启动 | 下载见 GitHub Releases。首次启动自动安装捆绑的 DHS 依赖(可选国内源加速),免手动配置环境。
展开完整文档(README 剩余 1 节)
dsh-gui — DeepSeek Harness 桌面客户端

🌐 中文 | English

DHS (DeepSeek Harness) 的 Electron GUI 客户端:把 web ui 的使用方式封装为原生桌面 GUI。内核最大限度的保持 DHS。

Electron
Node
License
Release

DHS 官方以 web ui(浏览器)形态交付。dsh-gui 用 Electron 承载同一套 DHS 前端,把「浏览器里打开网页」变成「桌面应用」,同时保持 DHS 内核零改动。

下载

| 平台 | 安装包 | 说明 |
| Windows 10+(x64) | dsh-gui-v0.2.0.zip | 免安装包,解压后双击 dsh-gui.exe 启动 |
| macOS(Apple Silicon / arm64) | dsh-gui-0.2.0-arm64.dmg | 安装包,打开后拖入 Applications 启动 |

下载见 GitHub Releases。首次启动自动安装捆绑的 DHS 依赖(可选国内源加速),免手动配置环境。

系统要求

- Windows 10+(x64):免安装包(zip),见上方下载
- macOS 14+(Apple Silicon / arm64):dmg 安装包,见上方下载
- 源码运行:任何平台均可通过 pnpm install && pnpm dev 从源码启动(见「快速开始」)

特性

- 原生桌面体验:独立窗口、系统托盘(X 最小化到托盘、托盘右键退出)、单实例锁、DeepSeek 蓝鲸鱼图标
- 动态端口:host 以 dsh web --port 0 启动,解析就绪 URL 后加载窗口,避免 3080 端口冲突
- 首次安装向导:5 步流程(欢迎 → 下载源选择 → 下载进度 → 真实校验 → 完成),国内源/原生源/系统代理可选,全程进度真实显示
- 捆绑分发:打包版捆绑 Node + pnpm + DHS 源码 + 内置插件,首次启动自动装依赖,开箱即用
- 内置插件体系:捆绑 5 个插件(插件搜索 / Skill 管理 / MCP 管理 / 全局代理 / 关于),覆盖 DHS 的日常管理与扩展——详见下方章节
- 插件 agent 感知:每个内置插件向 host 注册 systemPrompt section,模型每轮会话都能感知已安装插件的能力说明,无需手动提示
- 全局代理:设置页图形化配置系统代理/手动代理,GUI 启动时注入环境变量,DHS 全链路(LLM 调用 / 内置搜索 / MCP 客户端)走代理
- 中英双语:界面语言跟随系统,可手动切换,并映射到 DHS 内核 locale.preference(内核 UI 跟随)
- 安全基线:主窗口只允许本机 host origin 导航,外链走系统浏览器,危险权限默认拒绝,向导页启用 CSP
- 安装日志:安装全过程落盘 %APPDATA%/dsh-gui/install.log,失败可追溯
- 零内核改动:DHS 内核保持官方原样,GUI 只做壳

内置插件

dsh-gui 捆绑 5 个插件,除 dsh-about 外均为独立开源仓库,随打包版分发、首次安装自动注册到 DHS profile:

| 插件 | 仓库 | 功能 |
| dsh-discovery | EricXu20266/dsh-discovery | 社区插件搜索 + LLM 安全审计 |
| dsh-skillmanager | EricXu20266/dsh-skillmanager | Skill(技能)图形化管理 |
| dsh-mcpmanager | EricXu20266/dsh-mcpmanager | MCP server 图形化管理 |
| dsh-proxy | EricXu20266/dsh-proxy | 全局代理配置 |
| dsh-about | 内置(本仓库 plugins/) | 设置页「关于」显示版本信息 |

dsh-discovery — 插件搜索与 LLM 审计

定位是社区插件的发现与 LLM 审计工具:DHS 目前没有官方插件市场,第三方插件本质上是可执行代码,因此它刻意做成只读——只负责「发现 → 筛选」,安全审查交由 LLM 完成(一键生成审查 prompt,LLM 读源码查风险,通过则装、有风险则停)。

- 浏览:拉取 GitHub dsh-plugin 社区话题下的全部插件仓库(有界分页 + 超时降级)
- 分类:7 类功能分类 + 其他(UI 增强 / 终端 / 工具 / 记忆 / 模型 / 通知 / 开发)
- 场景:5 个使用场景(写作 / 开发 / 模型接入 / 自动化 / 通知集成),自动去重限量推荐
- 搜索:38 词中英同义词表,中文关键词也能命中英文插件数据
- LLM 审计安装:一键生成审查 prompt 交给 LLM(读源码/查依赖/识别恶意行为),通过则 dsh plugin add 安装、有风险则列出风险点停止;官方(deepseek-ai)标记、已安装标识、检查更新同样带安全审查(对比新旧差异,通过才 update)

完整的设计说明(安全模型、拉取规则、场景化筛选规则)见该仓库的 README。

dsh-skillmanager — Skill 管理

DHS 的技能体系没有中心化注册表——文件即注册:把 /SKILL.md 放进扫描根,宿主自动发现并纳入模型可用目录(~/.dsh/skills、~/.agents/skills 等 5 个扫描根)。本插件以图形化方式呈现这套体系:技能列表、分组、启用/禁用(frontmatter 权限开关)、新建引导、LLM 审查。技能的创建与编辑由 host agent(LLM)执行,本插件负责「看得清、管得住」。

dsh-mcpmanager — MCP 管理

DHS 的 MCP 没有独立存储——一个 server = 一条 @deepseek-ai/dsh-mcp-client 插件实例,持久化在 ~/.dsh/profiles/web/cordis.patch.yml。本插件以表单化方式增删改 MCP server 配置(stdio / streamable-http 两种传输),保存后热重载生效(新会话工具列表立即可用,无需重启),并提供 LLM 验证引导。

dsh-proxy — 全局代理

DHS 网络栈全链路裸 fetch(),不读 Windows 系统代理;Node 24+ 支持 NODE_USE_ENV_PROXY 环境变量代理(bootstrap-only 安全设计,.env 禁止设置代理变量)。本插件在设置页「通用设置」图形化配置系统代理 / 手动代理,持久化到 ~/.dsh/settings.yaml,由 dsh-gui 启动时注入环境变量,让 LLM 调用 / 内置搜索 / MCP 客户端全链路走代理。

dsh-about — 关于

设置页「关于」tab(内置插件,随仓库打包、不独立发布),展示 dsh-gui / 内核 / 运行时(Electron + Node)/ 已装插件四层版本信息,方便核对版本与排查问题。

插件 agent 感知(systemPrompt section)

每个内置插件在 host 侧注册一段 systemPrompt section(plugin:),随会话注入模型上下文。模型因此天然知道已安装哪些插件、各自能做什么——例如用户问「帮我看看有哪些插件」时,模型直接依据插件注册说明作答,无需额外文档。

架构

┌─────────────────────────────────────────────┐
│ Electron App(dsh-gui) │ │ main 进程 ──spawn──> DHS host 子进程 │ │ │ └─ apps/cli/bin.js │ │ │ --profile web │ │ │ --port 0 │ │ │ → 127.0.0.1: │ │ BrowserWindow loadURL ←─────────────────────┘ └─────────────────────────────────────────────┘

- GUI 壳:Electron(窗口、托盘、进程管理、安装向导、单实例锁)
- DHS host:子进程方式运行官方 dsh(打包版用捆绑 Node 24,开发态用系统 Node),内核 100% 保持
- 通信:本地 HTTP + WebSocket(127.0.0.1,端口由 --port 0 动态分配,避免 3080 冲突)
- 配置:~/.dsh(DHS 通用 home,web/gui 双模式共用)

⚠️ 已知边界:DHS 的 cordis loader 依赖 Node 内部 API(node-addon-require-builtin),与 Electron 内置 Node 不兼容——因此 host 走子进程而非 in-process(详见 docs/ARCHITECT.md)。

快速开始(开发态)

依赖(workspace 包含 ../deepseek-harness)
pnpm install

构建 DHS(首次需要:host lib + client lib + web dist)
pnpm --filter @deepseek-ai/dsh-root run build

提交前自检(先格式化,再检查)
pnpm format
pnpm typecheck && pnpm check && pnpm test

启动
pnpm build && pnpm start

打包分发

Windows(本地打包)

一键脚本(推荐,输出全程 console):

build-win-unpacked.bat

或手动(package.json 脚本):

pnpm package:dir # 免安装包 → release/win-unpacked/
pnpm package # nsis 安装包 → release/dsh-gui-setup-.exe

产物见 GitHub Releases。

macOS(源码构建)

dsh-gui 是 workspace 项目,内核依赖 deepseek-harness 必须放在 dsh-gui 同级目录(pnpm-workspace.yaml 的 ../deepseek-harness、图标源 apps/web/public/favicon.svg 都按此相对路径解析):

目录布局:两个仓库同级 ~/dev/dsh-gui ~/dev/deepseek-harness
git clone https://github.com/EricXu20266/dsh-gui.git
git clone https://github.com/deepseek-ai/deepseek-harness.git

cd dsh-gui
pnpm install # 安装依赖(含 workspace 的 DHS 包)
pnpm --filter @deepseek-ai/dsh-root run build # 构建 DHS 内核(lib + web dist)

开发态运行(用系统 Node,无需捆绑运行时)
pnpm build && pnpm start

打包 macOS 应用(Apple Silicon,产物 release/.dmg + .zip)
node scripts/gen-icons.mjs # 生成 mac 图标(icon-512.png)
pnpm exec electron-builder --mac --arm64 --publish never

打包版需要捆绑 Node + pnpm 运行时(resources/runtime/,该目录被 gitignore,需自行准备):从 nodejs.org 下载 darwin-arm64 版 Node、从 npm registry 取 pnpm tarball,解压到对应目录即可。

打包版结构:resources/runtime(捆绑 Node + pnpm)、resources/dhs(DHS 源码种子,不含 node_modules)、resources/dsh-(四个独立插件仓库 + 内置 dsh-about)。首次启动向导会把 DHS 源码复制到 %APPDATA%/dsh-gui/dhs(macOS 为 ~/Library/Application Support/dsh-gui/dhs)后再安装依赖,避免写入应用资源目录。

目录结构

dsh-gui/
├── electron/ # GUI 壳引擎(main/host/installer/proxy/paths/tray/preload/renderer) ├── plugins/ # 内置插件(dsh-about;其余 4 个为独立仓库) ├── mac-packing-resource/ # 4 个外置插件源码(mac CI 单仓库打包用) ├── platform/ # 平台适配(windows 打包 / macos 预留) ├── resources/ # 资源(图标、打包运行时:捆绑 Node + pnpm) ├── install/ # 安装器配置 ├── scripts/ # 构建/打包脚本 ├── tests/ # 单元测试(node:test + tsx) ├── tools/ # 辅助工具 └── docs/ # 文档体系(ARCHITECT/DEV-TRACKER/index...)

详细文档见 docs/index.md。
预览分享卡片长什么样 ↓EricXu20266/dsh-gui
分享 · DeepSeek Harness Hub
EricXu20266/dsh-gui

把网页版封装成原生桌面应用,免配置开箱即用

回到顶部