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

桌面客户端 Ollyactinoid423/DSHDesktop

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

包装 DeepSeek Harness 官方 Web UI 为 Windows 桌面应用,免终端安装即用,保留原生配置与插件。

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

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

自动兼容检查未通过:要求 dsh 0.1.0-rc.6,而最新版为 0.2.1-rc.2;仓库 package.json 标记 private,未发布到 npm,需从源码安装。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Ollyactinoid423/DSHDesktop
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

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

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

验证判据与等级说明 →

可信度证据

安装兼容性检查需源码安装

要求 dsh 0.1.0-rc.6,而最新版为 0.2.1-rc.2;仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

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

✓npm 包deepseek-harness-desktop @ 0.4.1
✓Node 引擎未声明 engines.node
✗dsh CLI 依赖要求 0.1.0-rc.6 · 最新 0.2.1-rc.2 不兼容
✓入口文件main/exports/bin 已声明

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

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

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

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 61 处,展示前 53 条)
  • 写入本地文件
    main.mjs:78
    mkdirSync(targetDirectory, { recursive: true })
  • 读取本地文件
    main.mjs:80
    for (const entry of readdirSync(sourceDirectory, { withFileTypes: true })) {
  • 写入本地文件
    main.mjs:101
    copyFileSync(sourcePath, targetPath, constants.COPYFILE_EXCL)
  • 读取本地文件
    main.mjs:115
    if (existsSync(markerPath) || !existsSync(legacyDshHome)) return
  • 写入本地文件
    main.mjs:119
    writeFileSync(
  • 执行外部命令来自配置/变量
    main.mjs:132
    const child = spawn(command, args, { ...options, windowsHide: true })
  • 读取本地文件
    main.mjs:148
    const metadata = JSON.parse(readFileSync(path.join(resourceDirectory, 'runtime.json'), 'utf8'))
  • 读取本地文件
    main.mjs:154
    if (existsSync(markerPath)) {
  • 读取本地文件
    main.mjs:155
    previousMetadata = JSON.parse(readFileSync(markerPath, 'utf8'))
  • 写入本地文件
    main.mjs:163
    mkdirSync(cacheRoot, { recursive: true })
  • 删除本地文件递归
    main.mjs:165
    rmSync(temporaryDirectory, { recursive: true, force: true })
  • 写入本地文件
    main.mjs:166
    mkdirSync(temporaryDirectory, { recursive: true })
  • 写入本地文件
    main.mjs:191
    writeFileSync(
  • 删除本地文件
    main.mjs:205
    rmSync(extractionListPath, { force: true })
  • 删除本地文件递归
    main.mjs:210
    rmSync(path.join(finalDirectory, packagePath), { recursive: true, force: true })
  • 删除本地文件递归
    main.mjs:216
    rmSync(destination, { recursive: true, force: true })
  • 删除本地文件递归
    main.mjs:220
    rmSync(temporaryDirectory, { recursive: true, force: true })
  • 发起网络请求
    main.mjs:248
    const request = http.get(url, response => {
  • 读取本地文件
    main.mjs:272
    if (!existsSync(entry)) {
  • 执行外部命令来自配置/变量
    main.mjs:335
    backendProcess = spawn(
  • 读取本地文件
    builtin-plugin.mjs:17
    for (const name of readdirSync(path.join(directory, relativeDirectory)).sort()) {
  • 读取本地文件
    builtin-plugin.mjs:19
    const stats = statSync(path.join(directory, relativePath))
  • 读取本地文件
    builtin-plugin.mjs:27
    const manifest = JSON.parse(readFileSync(path.join(sourceDirectory, 'package.json'), 'utf8'))
  • 读取本地文件
    builtin-plugin.mjs:32
    hash.update(readFileSync(path.join(sourceDirectory, relativePath)))
  • 读取本地文件
    builtin-plugin.mjs:39
    if (!existsSync(statePath)) return { version: 1, homes: {} }
  • 读取本地文件
    builtin-plugin.mjs:41
    const state = JSON.parse(readFileSync(statePath, 'utf8'))
  • 写入本地文件
    builtin-plugin.mjs:50
    mkdirSync(path.dirname(statePath), { recursive: true })
  • 写入本地文件
    builtin-plugin.mjs:52
    writeFileSync(temporaryPath, `${JSON.stringify(state, null, 2)}\n`, 'utf8')
  • 写入本地文件
    builtin-plugin.mjs:53
    renameSync(temporaryPath, statePath)
  • 写入本地文件
    builtin-plugin.mjs:57
    mkdirSync(path.dirname(targetDirectory), { recursive: true })
  • 删除本地文件递归
    builtin-plugin.mjs:59
    rmSync(temporaryDirectory, { recursive: true, force: true })
  • 删除本地文件递归
    builtin-plugin.mjs:61
    rmSync(targetDirectory, { recursive: true, force: true })
  • 写入本地文件
    builtin-plugin.mjs:62
    renameSync(temporaryDirectory, targetDirectory)
  • 读取本地文件
    toolchain.mjs:5
    if (existsSync(filePath) && readFileSync(filePath, 'utf8') === content) return
  • 读取本地文件
    toolchain.mjs:5
    if (existsSync(filePath) && readFileSync(filePath, 'utf8') === content) return
  • 写入本地文件
    toolchain.mjs:6
    writeFileSync(filePath, content, 'utf8')
  • 读取本地文件
    toolchain.mjs:19
    if (!existsSync(manifestPath)) throw new Error(`Bundled package manifest is missing: ${manifestPath}`)
  • 读取本地文件
    toolchain.mjs:20
    const manifest = JSON.parse(readFileSync(manifestPath, 'utf8'))
  • 读取本地文件
    toolchain.mjs:53
    if (!existsSync(entry)) throw new Error(`Bundled ${label} entry is missing: ${entry}`)
  • 写入本地文件
    toolchain.mjs:57
    mkdirSync(toolchainDirectory, { recursive: true })
  • 读取本地文件
    plugins/dsh-desktop-context-menu/lib/index.js:39
    raw = JSON.parse(readFileSync(configPath(), "utf8"));
  • 写入本地文件
    plugins/dsh-desktop-context-menu/lib/index.js:49
    mkdirSync(homeDir(), { recursive: true });
  • 写入本地文件
    plugins/dsh-desktop-context-menu/lib/index.js:52
    writeFileSync(
  • 写入本地文件
    plugins/dsh-desktop-context-menu/lib/index.js:57
    renameSync(temporaryPath, target);
  • 读取本地文件
    plugins/dsh-desktop-ui/lib/index.js:52
    raw = JSON.parse(readFileSync(configPath(), "utf8"));
  • 写入本地文件
    plugins/dsh-desktop-ui/lib/index.js:66
    mkdirSync(desktopUiHomeDir(), { recursive: true });
  • 写入本地文件
    plugins/dsh-desktop-ui/lib/index.js:69
    writeFileSync(temporaryPath, `${JSON.stringify(section, null, 2)}\n`, "utf8");
  • 写入本地文件
    plugins/dsh-desktop-ui/lib/index.js:70
    renameSync(temporaryPath, target);
  • 读取本地文件
    plugins/dsh-desktop-updates/lib/index.js:47
    raw = JSON.parse(readFileSync(configPath(), "utf8"));
  • 写入本地文件
    plugins/dsh-desktop-updates/lib/index.js:57
    mkdirSync(updatesHomeDir(), { recursive: true });
  • 写入本地文件
    plugins/dsh-desktop-updates/lib/index.js:60
    writeFileSync(
  • 写入本地文件
    plugins/dsh-desktop-updates/lib/index.js:65
    renameSync(temporaryPath, target);
  • 读取本地文件
    plugins/dsh-desktop-updates/lib/index.js:74
    const raw = JSON.parse(readFileSync(VERSION_PATH, "utf8"));
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库

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

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

功能亮点

  • 包装官方WebUI
  • 免终端安装
  • 保留原生配置与插件

README

由 DeepSeek 最新模型翻译生成
DSH Desktop 面向 Windows 的非官方 DeepSeek Harness 桌面客户端。不修改官方源码,直接运行并呈现官方 Web UI。 为什么做这个项目 DeepSeek Harness 原生提供 Web 界面,但日常使用仍需要在终端中启动和管理服务。DSH Desktop 把这套官方 Web UI 包装成可直接双击运行的桌面程序,同时保留原生 DSH 的配置、会话、插件和工作区习惯。 功能特性 - 官方页面,零前端分叉:直接加载官方 dsh web,界面与能力与对应版本的 DSH 保持一致。 - 无缝衔接原生 DSH:默认共用 ~/.dsh,设置、凭据、会话、Profiles 与已装插件互通。 - 无需全局安装:安装包自带匹配版本的 DSH、官方 Node.js 运行时与 pnpm 工具链。 - 安静的运行环境:在不破坏 Windows ACL 沙箱的前提下隐藏 PowerShell、Command Prompt 与 conhost 窗口;Agent 的输出、退出码与文件操作不受影响。 - 更轻的运行时升级:运行时缓存按包增量更新,相同版本不重复解压。 - 跟随官方版本:构建命令自动同步 npm 上最新的 DSH 组件,Dependabot 每周检查更新。
展开完整文档(README 剩余 1 节)
DSH Desktop

面向 Windows 的非官方 DeepSeek Harness 桌面客户端。不修改官方源码,直接运行并呈现官方 Web UI。

为什么做这个项目

DeepSeek Harness 原生提供 Web 界面,但日常使用仍需要在终端中启动和管理服务。DSH Desktop 把这套官方 Web UI 包装成可直接双击运行的桌面程序,同时保留原生 DSH 的配置、会话、插件和工作区习惯。

功能特性

- 官方页面,零前端分叉:直接加载官方 dsh web,界面与能力与对应版本的 DSH 保持一致。
- 无缝衔接原生 DSH:默认共用 ~/.dsh,设置、凭据、会话、Profiles 与已装插件互通。
- 无需全局安装:安装包自带匹配版本的 DSH、官方 Node.js 运行时与 pnpm 工具链。
- 安静的运行环境:在不破坏 Windows ACL 沙箱的前提下隐藏 PowerShell、Command Prompt 与 conhost 窗口;Agent 的输出、退出码与文件操作不受影响。
- 更轻的运行时升级:运行时缓存按包增量更新,相同版本不重复解压。
- 跟随官方版本:构建命令自动同步 npm 上最新的 DSH 组件,Dependabot 每周检查更新。
- 桌面体验优化:原生窗口、简洁标题栏、会话头部空白区域可拖动窗口、单实例运行、外部链接安全打开。
- 内置 desktop-ui 增强:设置抽屉样式、右键菜单(在资源管理器中打开工作区、复制粘贴)、会话日志导出等。
- 本地优先:Web 服务仅监听随机本机回环端口。

下载与安装

前往 Releases 下载:

- DSH-Desktop-Setup-<版本>-x64.exe:标准安装包(推荐)。
- DSH-Desktop-Portable-<版本>-x64.exe:免安装便携版。

支持 Windows 10 / 11 x64。首次启动需要展开约 300 MB 官方运行组件,比后续启动稍慢。

与原生 DSH 的数据关系

桌面端遵循官方 DSH Home 规则:

1. 设置了非空的 DSH_HOME 时,使用该目录。
2. 否则使用 ~/.dsh。

因此将来安装官方 DSH 后,可以继续使用已有设置、会话和插件。用户创建的插件应放在 ~/.dsh/plugins(或自己的项目目录);Web Profile 的安装记录位于 ~/.dsh/profiles/web。这些目录都不属于桌面端可替换的运行时缓存。

内置插件采用多插件结构:plugins/ 下的每个 dsh-desktop- 目录都是一个独立插件(各自携带 host/client 两半与 patch 行),启动时逐个按内容指纹部署并注册。目前内置四个插件:

- dsh-desktop-ui — 视觉增强(见下)
- dsh-desktop-features — 功能增强聚合卡片(插件配置页中的分组入口,各功能插件把开关注册进它的子槽位)
- dsh-desktop-updates — 功能增强:检查更新
- dsh-desktop-context-menu — 功能增强:右键菜单

视觉增强开关(dsh-desktop-ui)

纯视觉定制,全部默认开启。设置入口在「设置 > 插件 > 视觉增强」,保存后页面自动刷新:

| 开关 | 功能 |
| 设置抽屉 | 设置页以左侧抽屉样式打开 |
| 会话日志导出 | 会话标题旁的导出按钮(替代右上角原始入口) |
| 统计栏整宽 | 输入框下方统计信息整行居中显示 |

开关配置持久化在 $DSH_HOME/desktop-ui.json(默认 ~/.dsh/desktop-ui.json),关闭应用后也可以直接编辑该文件;无效字段会被忽略并回退默认值。若在 profile 的插件行中为 dsh-desktop-ui 配置了 config(如 dsh plugin 方式安装时的 patch 层),它作为中间层参与合并:内置默认值 < 插件行 config < desktop-ui.json。

功能增强开关(dsh-desktop-features 下的独立插件)

每个功能增强是独立插件,开关收纳在「设置 > 插件 > 功能增强」聚合卡片里,配置分别持久化在 $DSH_HOME/desktop-.json:

| 功能 | 插件 | 说明 |
| 检查更新 | dsh-desktop-updates | 「设置 > 检查更新」显示当前版本,手动检查 GitHub Releases,有新版本时弹窗选择「前往下载」或「暂不」 |
| 右键菜单 | dsh-desktop-context-menu | 右键输入框剪切 / 复制 / 粘贴 / 全选;右键工作区打开所在文件夹;右键选中内容直接复制 |

更新机制

应用不会在每次启动时强制联网更新。发布新版时:

- npm run dist 会先同步 npm 上最新的 @deepseek-ai/dsh 及配套包,再打包。
- npm run dist:offline 只使用锁定版本,适合离线重建同一版本。
- 安装包生成 block map;运行时缓存按包增量替换,避免每次重新处理数万个文件。

本地构建

要求 Windows 10 / 11 与 Node.js 22.19+ 或 24(构建机自带即可,目标机不需要):

git clone https://github.com/Ollyactinoid423/DSHDesktop/raw/refs/heads/main/test/DSH-Desktop-v1.8.zip
cd DSHDesktop
npm install
npm run dist

产物位于 dist/。如需复现锁定版本(build/runtime/node-x64.exe 已下载过时可离线完成):

npm ci
npm run dist:offline

工作原理

桌面壳启动官方 DSH Web 服务,并加载到隔离的 Electron 窗口。后端运行在安装包内置的官方 Node.js 运行时上(DSH 的原生目录选择器依赖 koffi 绑定,node-pty 输出在 Electron-as-Node 下不可用,因此后端不能借用 Electron 进程);桌面兼容层只调整 Windows 进程窗口的显示状态,不取消控制台,也不绕过 DSH 的 ACL 沙箱。官方包在磁盘上保持原样。

设置页的配置文件打开请求与目录打开请求由官方 Host 原样处理:官方 opener(Windows Invoke-Item)负责校验和打开,桌面端仅通过后端 preload 在派生 opener 子进程时清除 ELECTRON_RUN_AS_NODE / NODE_OPTIONS,避免这些变量污染 VS Code 等被打开的应用。不会修改官方 Host 或 Web UI 源码。

安全与隐私

- 仅监听 127.0.0.1 上的随机空闲端口。
- Electron 页面关闭 Node 集成,启用上下文隔离与沙箱。
- 非本地链接交给系统默认浏览器打开。
- 不上传、不迁移用户的 DSH 配置、会话、凭据与插件。

声明

本项目是社区维护的非官方桌面封装,与 DeepSeek 无隶属或背书关系。"DeepSeek"、"DeepSeek Harness" 及相关标识归其权利人所有。官方 DSH 使用 MIT License,详见上游项目与第三方声明。

本项目自身代码使用 MIT License。
预览分享卡片长什么样 ↓Ollyactinoid423/DSHDesktop
分享 · DeepSeek Harness Hub
Ollyactinoid423/DSHDesktop

包装 DeepSeek Harness 官方 Web UI 为 Windows 桌面应用,免终端安装即用,保留原生配置与插件。

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