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

桌面外壳 qgx1992/DSH-Exoskeleton

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

把 DSH 网页版封装成双击即用的桌面程序

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

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

自动兼容检查未通过:仓库 package.json 标记 private,未发布到 npm,需从源码安装。以下命令仍可尝试,但可能失败。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add qgx1992/DSH-Exoskeleton
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

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

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

验证判据与等级说明 →

可信度证据

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

仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

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

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

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

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/12 06:05:07

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

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

可执行外部命令写入剪贴板(不计风险)发起外部网络请求
查看扫描证据(共 41 处,展示前 41 条)
  • 执行外部命令来自配置/变量
    src/main/dsh-manager.ts:227
    execFile(cmd, args, { windowsHide: true, timeout: 10_000, shell: opts.shell ?? false }, (err, stdout) => {
  • 执行外部命令来自配置/变量
    src/main/dsh-manager.ts:302
    const child = spawn(exe.command, args, {
  • 发起网络请求
    src/main/dsh-manager.ts:412
    const req = http.get(
  • 执行外部命令固定命令
    src/main/dsh-manager.ts:550
    execFile('taskkill', ['/pid', String(pid), '/T', '/F'], { windowsHide: true }, () => {
  • 执行外部命令固定命令
    src/main/dsh-manager.ts:566
    execFile('taskkill', ['/pid', String(pid), '/T', '/F'], { windowsHide: true }, () => resolvePromise())
  • 执行外部命令来自配置/变量
    src/main/dsh-manager.ts:642
    const child = spawn(exe.command, [...exe.args, ...args], {
  • 执行外部命令来自配置/变量
    src/main/dsh-manager.ts:683
    const child = spawn(exe.command, fullArgs, { stdio: ['ignore', 'pipe', 'pipe'], windowsHide: true })
  • 写入剪贴板
    src/main/ipc-handlers.ts:317
    if (typeof text === 'string') clipboard.writeText(text)
  • 执行外部命令来自配置/变量
    src/main/kernel-compat.ts:173
    execFile(cmd, args, { windowsHide: true, timeout: timeoutMs, encoding: 'utf-8' }, (err, stdout) => {
  • 执行外部命令固定命令
    src/main/kernel-compat.ts:184
    execFile('taskkill', ['/pid', String(pid), '/T', '/F'], { windowsHide: true }, () => { })
  • 执行外部命令来自配置/变量
    src/main/kernel-compat.ts:235
    const child = spawn(nodeExe, args, {
  • 发起网络请求
    src/main/kernel-compat.ts:327
    const req = http.get({ host: '127.0.0.1', port, path: paths[idx], timeout: 1_500 }, (res) => {
  • 发起网络请求
    src/main/kernel-manager.ts:345
    const res = await fetch(REGISTRY_URL, {
  • 执行外部命令来自配置/变量
    src/main/kernel-manager.ts:419
    execFile(cmd, args, { windowsHide: true, timeout: timeoutMs, encoding: 'utf-8' }, (err, stdout) => {
  • 执行外部命令来自配置/变量
    src/main/kernel-manager.ts:476
    const child = spawn(spawnCmd, spawnArgs, {
  • 执行外部命令固定命令
    src/main/kernel-manager.ts:518
    execFile('taskkill', ['/pid', String(pid), '/T', '/F'], { windowsHide: true }, () => { })
  • 发起网络请求
    src/main/kernel-manager.ts:601
    const regRes = await fetch(registryRoot + '/@deepseek-ai/dsh', { signal: AbortSignal.timeout(15_000) })
  • 发起网络请求
    src/main/kernel-manager.ts:1037
    const res = await fetch(REGISTRY_URL, {
  • 请求外部主机registry.npmjs.org
    src/main/plugins.ts:136
    const res = await fetch(`https://registry.npmjs.org/${p}/latest`, { signal: AbortSignal.timeout(15_000) })
  • 发起网络请求
    src/main/plugins.ts:136
    const res = await fetch(`https://registry.npmjs.org/${p}/latest`, { signal: AbortSignal.timeout(15_000) })
  • 请求外部主机api.github.com
    src/main/plugins.ts:148
    const relRes = await fetch(`https://api.github.com/repos/${owner}/${repo}/releases/latest`, {
  • 发起网络请求
    src/main/plugins.ts:148
    const relRes = await fetch(`https://api.github.com/repos/${owner}/${repo}/releases/latest`, {
  • 请求外部主机api.github.com
    src/main/plugins.ts:156
    const tagRes = await fetch(`https://api.github.com/repos/${owner}/${repo}/tags?per_page=10`, {
  • 发起网络请求
    src/main/plugins.ts:156
    const tagRes = await fetch(`https://api.github.com/repos/${owner}/${repo}/tags?per_page=10`, {
  • 发起网络请求
    src/main/plugins.ts:219
    const res = await fetch(GITHUB_SEARCH, {
  • 发起网络请求
    src/main/plugins.ts:247
    const res = await fetch(NPM_SEARCH, { signal: AbortSignal.timeout(15_000) })
  • 执行外部命令来自配置/变量
    src/main/pnpm.ts:49
    execFile(cmd, args, { windowsHide: true, timeout: timeoutMs, encoding: 'utf-8' }, (err, stdout) => {
  • 执行外部命令来自配置/变量
    src/main/pnpm.ts:63
    const child = spawn(nodeExe, args, { stdio: ['ignore', 'pipe', 'pipe'], windowsHide: true })
  • 执行外部命令来自配置/变量
    src/main/runtime-manager.ts:59
    const child = spawn(exe, ['--version'], { stdio: ['ignore', 'pipe', 'pipe'], windowsHide: true })
  • 执行外部命令固定命令
    src/main/runtime-manager.ts:87
    execFile('where', ['node'], { windowsHide: true, timeout: 8_000 }, (err, stdout) => {
  • 发起网络请求
    src/main/runtime-manager.ts:103
    const res = await fetch(NODE_DIST + '/index.json', { signal: AbortSignal.timeout(15_000) })
  • 发起网络请求
    src/main/runtime-manager.ts:212
    const res = await fetch(sumsUrl, { signal: AbortSignal.timeout(15_000) })
  • 执行外部命令固定命令
    src/main/runtime-manager.ts:307
    const child = spawn('tar.exe', ['-xf', zipPath, '-C', dest], { windowsHide: true, stdio: 'ignore' })
  • 执行外部命令固定命令
    src/main/runtime-manager.ts:341
    const child = spawn('powershell.exe', ['-NoProfile', '-Command', "Expand-Archive -LiteralPath '" + zipPath + "' -DestinationPath '" + dest + "' -Force
  • 发起网络请求
    src/main/session-watcher.ts:240
    const r = await zstdWorker.request('frameEvents', { file, offset: oldOffset })
  • 发起网络请求
    src/main/session-watcher.ts:370
    const head = await zstdWorker.request('headInfo', { file: ev.file })
  • 发起网络请求
    src/main/session-watcher.ts:439
    const head = await zstdWorker.request('headInfo', { file: ev.file })
  • 发起网络请求
    src/main/sessions.ts:113
    const head = await zstdWorker.request('headInfo', { file: c.file })
  • 发起网络请求
    src/main/updater.ts:211
    const res = await fetch(GITHUB_API, {
  • 执行外部命令来自配置/变量
    src/main/zstd-worker.ts:46
    execFile(cmd, args, { windowsHide: true, timeout: timeoutMs, encoding: 'utf-8' }, (err, stdout) => {
  • 执行外部命令来自配置/变量
    src/main/zstd-worker.ts:89
    this.proc = spawn(node, [this.workerPath()], {
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库
涉及外部主机:registry.npmjs.org、api.github.com

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

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

功能亮点

  • 封装网页为桌面程序
  • 双击即用
  • 托盘常驻

DeepSeek Harness 桌面客户端 — 轻量纯净的 DSH Web UI 桌面外壳(Electron,壳核分离、数据复用 ~/.dsh、托盘常驻、黑金鲸鱼图标)

README

由 DeepSeek 最新模型翻译生成
DeepSeek Harness 桌面客户端(DSH-Exoskeleton) | English 调研社区 7 个 DSH 桌面端项目后,得出的统一开发方案(开发文档)。 轻量、纯净、功能完整的 DSH 桌面外壳:把官方 dsh web 封装成 Windows 桌面程序,双击即用。 遵循「壳核分离」原则——不改动 DSH 内核,官方升级无缝跟随;默认共用 ~/.dsh,已有配置零迁移。 完整版本历史见 更新日志。 最新版本要点(v0.9.6) Release 说明 · 完整历史见 更新日志 - 「更新」页新增两个独立开关:「自动检查更新」+「自动下载更新」(均默认开,保持历史行为)。两项正交——因为「别联网查」和「可以查、但别偷我带宽 / 别偷偷装」本就是两种不同诉求,单开关表达不了。关掉检查则启动不再静默联网(面板手动检查仍可用);关掉下载则检查到新版只提示不下载,且下载完成后也不随退出自动安装。若怕关了下载就更新不了:面板新增的「下载更新」按钮是一等手动路径——已核实 electron-updater 上游行为,autoDownload 只影响 checkForUpdates() 内部是否顺带下载,显式调 downloadUpdate() 不受它约束。两个开关都改完立即生效(无需重启),且老配置(无这些字段)一律视为开启,升级用户行为不变。
展开完整文档(README 剩余 1 节)
DeepSeek Harness 桌面客户端(DSH-Exoskeleton)

| English

调研社区 7 个 DSH 桌面端项目后,得出的统一开发方案(开发文档)。

轻量、纯净、功能完整的 DSH 桌面外壳:把官方 dsh web 封装成 Windows 桌面程序,双击即用。
遵循「壳核分离」原则——不改动 DSH 内核,官方升级无缝跟随;默认共用 ~/.dsh,已有配置零迁移。

完整版本历史见 更新日志。

最新版本要点(v0.9.6)

Release 说明 · 完整历史见 更新日志

- 「更新」页新增两个独立开关:「自动检查更新」+「自动下载更新」(均默认开,保持历史行为)。两项正交——因为「别联网查」和「可以查、但别偷我带宽 / 别偷偷装」本就是两种不同诉求,单开关表达不了。关掉检查则启动不再静默联网(面板手动检查仍可用);关掉下载则检查到新版只提示不下载,且下载完成后也不随退出自动安装。若怕关了下载就更新不了:面板新增的「下载更新」按钮是一等手动路径——已核实 electron-updater 上游行为,autoDownload 只影响 checkForUpdates() 内部是否顺带下载,显式调 downloadUpdate() 不受它约束。两个开关都改完立即生效(无需重启),且老配置(无这些字段)一律视为开启,升级用户行为不变。
- 侧边栏底部重排为一行 4 个小按钮(设置 / 网页版 DeepSeek / 管理面板 / 折叠切换):官方底栏原本是两行(插槽行 69px + 官方设置整行大按钮 50px),合计 119px;现压成一行 32×32 图标按钮,并在行内自适应均分(中心恒为行宽的 1/8·3/8·5/8·7/8,侧栏宽窄变化自动跟随)。坚持只改 CSS 不搬 DOM(搬 slot 节点会与框架重渲染互相触发、渲染进程 100% CPU 卡死);官方的「设置」按钮行为完全不变(onClick 仍是官方那个),「折叠全部/展开全部」合并为一个双向 toggle。窄条(rail)态只留「设置」。
- 修掉两个底栏布局缺陷:① 第三方插件会把自己的元素插到插槽最前面且占满整行,导致壳按钮被顶到中间(实测底栏 131px、按键不在底行)——现把壳按钮包进组容器并用 order 固定到最底行,不搬动第三方节点;② 设置列占位致第三方内容左侧空一截(实测 x=76..268、左 64px 空白)——改用绝对定位脱流后从底栏左边缘铺满(x=12..268 与 footArea 对齐)。
- 可验证性:本次新增 updater-switch 单测(19 项)+ 两个实机探针(probe-updater-switch 20 项:伪装安装版后直接观察 autoDownload / autoInstallOnAppQuit 真实取值;probe-update-ui 23 项:真实渲染进程加载构建产物,断言开关渲染、点击载荷、按钮显隐),一键跑 npm run probe:update。

功能特性

| 模块 | 说明 |
| DSH 子进程管理 | 启动/停止/重启 dsh web,--port 0 自动分配端口,健康检查,崩溃自动重启 |
| 原生窗口 | 无标题栏 + 右上角系统原生窗口按钮叠加(内容从 y=0 铺满),顶部为 DSH 侧边栏品牌行,三块拖拽区可拖动窗口 |
| 系统托盘 | 单击唤回,右键菜单(打开/启动停止服务/开机自启/日志/更新/关于/退出) |
| 单实例 | 重复双击唤出已有窗口 |
| 仪表盘 | 状态 / 设置 / 日志 / 更新 统一管理面板 |
| 首次启动引导 | 检测 ~/.dsh/.credentials.yaml,未配置 API Key 时弹出向导,Key 写入本地凭据文件 |
| 原生通知 | 服务就绪 / 异常 / 崩溃重启 / 会话完成 / 询问卡等待回答 时 Windows 通知(可开关) |
| 备份与回滚 | 手动存档 + 自动快照(插件安装/卸载、恢复前)+ 一键回退,快照存于 userData\backups |
| 插件管理 | GitHub topic dsh-plugin + npm 双来源目录,一键安装/卸载(复用 dsh plugin),冲突预检 + 操作前自动备份 |
| 自动更新 | NSIS 安装版 electron-updater 静默下载 → 通知 → 一键重启安装;便携版引导手动下载 |
| 内核管理(阶段 A/B/C/D) | DSH 多版本共存:安装/默认路由/卸载 + 内置 Node 运行时(零门槛)+ 首启默认内核预置 + 内核更新检测与一键升级 + 多 Profile 内核绑定 + 磁盘配额 + 卸载可靠性(改名优先:删不掉也不破坏文件)+ 启动对账(损坏内核识别与一键清理) + alpha 带病内核兼容补丁自动注入(R-24,试启动门禁 + 崩溃自动回滚) |
| 数据复用 | DSH_HOME 环境变量优先,否则 %USERPROFILE%\.dsh |
| 安全隔离 | 仅监听 127.0.0.1、渲染进程沙箱、contextIsolation、禁用 Node 集成 |

技术栈

Electron + TypeScript + React + Tailwind CSS + Vite(electron-vite)+ electron-builder

架构总览

DSH-Exoskeleton 架构

可交互动画版:查看架构图(GitHub Pages)未启用 Pages 时可用第三方预览:htmlpreview

目录结构

├── src/
│ ├── main/ # Electron 主进程 │ │ ├── index.ts # 入口:窗口/生命周期/单实例 │ │ ├── window-manager.ts # 无边框窗口 + WebContentsView 承载 DSH Web UI │ │ ├── dsh-manager.ts # DSH 子进程管理(启动/停止/健康检查/崩溃重启) │ │ ├── tray.ts # 系统托盘 │ │ ├── updater.ts # 更新检查 │ │ ├── ipc-handlers.ts # IPC 通信 │ │ ├── config.ts # 配置管理(userData/config.json) │ │ └── logger.ts # 文件日志(轮转) │ ├── preload/ # contextBridge 类型化桥接 │ └── renderer/ # 外壳 UI(标题栏 + 仪表盘) │ └── components/panels/ # 状态/设置/日志/更新 ├── shared/ # 主/渲染进程共享类型 ├── resources/ # 图标 ├── scripts/ # 图标生成等脚本 ├── electron-builder.yml └── electron.vite.config.ts

开发

新手入门:完整上手路径见 docs/onboarding/(概念术语 → 环境准备 → 首次运行 → 代码地图 → 第一个改动)。

安装依赖
npm install

生成图标(首次)
npm run gen:icon

开发模式(HMR)
npm run dev

类型检查
npm run typecheck

构建
npm run build

打包(NSIS 安装包 + 便携版)
npm run dist

打包产物

dist/DSH-Exoskeleton-Setup-0.6.3.exe # NSIS 安装器 dist/DSH-Exoskeleton-Portable-0.6.3.exe # 单文件便携版 dist/win-unpacked/ # 免安装绿色版文件夹

DSH 可执行文件解析

主进程按以下顺序定位 dsh:

1. DSH_EXECUTABLE 环境变量(显式指定)
2. npm/pnpm 全局安装的 @deepseek-ai/dsh(lib/bin.js 由 Node 直接运行,不依赖路径)
3. PATH 中的 dsh.cmd

「零门槛」目标:后续版本将支持打包内置 DSH 内核,免除用户手动安装 dsh。

配置项

存储于 %APPDATA%\DSH-Exoskeleton\config.json:

| 配置 | 用途 | 默认 |
| port | Web 服务端口 | 0(自动分配) |
| autoLaunch | 开机自启 | false |
| apiKey | DeepSeek API Key(系统级加密,P1 引导) | 空 |
| dshHome | DSH Home 覆盖 | 空(官方规则) |
| activeProfileId | 激活的配置档案 | default |
| kernelsQuotaMB | 内核仓库磁盘配额(MB,0=不限) | 1024 |
| defaultKernelVersion | 默认托管内核版本(首启预置自动写入) | null |
| autoStartService | 启动时自动运行服务 | true |
| minimizeToTray | 关闭窗口隐藏到托盘 | true |

日志

%APPDATA%\DSH-Exoskeleton\dsh-desktop.log(2MB 轮转),仪表盘提供实时查看,托盘菜单可打开日志目录。

路线图

- [x] Phase 1 — MVP:脚手架 / 原生窗口 / 托盘 / 单实例 / DSH 进程管理 / 端口自动分配
- [x] Phase 2 — 体验完善:API Key 首次启动向导 / 数据复用 / 安全隔离 / 日志查看 / 原生通知 / 开机自启
- [x] Phase 3 大部分:自动更新(electron-updater 静默下载+一键重启)/ 仪表盘(状态/设置/内核/插件/备份/日志/更新)/
插件管理器(双来源目录+冲突预检+自动备份)/ 备份与回滚 / 三种分发形态
- [x] 内核管理阶段 A/B/C/D:托管安装/默认路由/卸载;内置 Node 运行时(真零门槛);首启默认内核预置(全新装自动就绪);
内核更新检测 + 一键升级;多 Profile 与内核版本绑定(档案面板);磁盘配额与卸载引用保护
- [ ] Phase 4:跨平台 / 社区生态

内核管理(阶段 B/C/D 已落地)

- 首启默认内核预置(阶段 D):全新安装首次启动自动安装默认内核(当前 0.1.5-rc.1,见 src/shared/kernel-defaults.ts)并设为默认——无 Node 的机器会先自动下载内置运行时再装内核;老用户升级自动跳过,失败下次启动重试
- 内置 Node 运行时:内核面板一键下载(~30MB,nodejs.org,可用 DSH_NODE_DIST 换 npmmirror 镜像),之后无需系统 Node(真零门槛)
- 安装走 npm registry(可切 npmmirror 镜像加速国内网络,见 docs/KERNEL-MANAGER-DESIGN.md)
- 依赖树较大(单内核 ~50MB+),首次安装耗时受网络影响;内核仓库有磁盘配额保护(kernelsQuotaMB,默认 1GB)
- 多 Profile 档案:每个档案可绑定不同内核版本,切换档案即切换内核(服务自动重启)

参考项目

- dsh-clean-desktop-shell
- DSHDesktop (CCMu04)
- dsh-desktop (SnowCrescenter)
- dsh-desktop (kevenxz)
- dsh-desktop (csyyywy)
- deepseek-harness-desktop (Tauri)
- anywhere-labs/dsh-desktop
- DeepSeek Harness 官方
预览分享卡片长什么样 ↓qgx1992/DSH-Exoskeleton
分享 · DeepSeek Harness Hub
qgx1992/DSH-Exoskeleton

把 DSH 网页版封装成双击即用的桌面程序

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