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

液态玻璃桌面壳 165555979/dsh-desktop

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

把浏览器里的 dsh web 包装成双击即用的桌面应用

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

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

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

状态速览

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

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

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

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 57 处,展示前 55 条)
  • 读取本地文件
    main.js:35
    try { return JSON.parse(fs.readFileSync(settingsFile(), 'utf8')) } catch { return {} }
  • 写入本地文件
    main.js:39
    fs.mkdirSync(path.dirname(settingsFile()), { recursive: true })
  • 写入本地文件
    main.js:40
    fs.writeFileSync(settingsFile(), JSON.stringify(obj, null, 2), 'utf8')
  • 读取本地文件
    main.js:46
    return !!dir && fs.existsSync(path.join(dir, 'package.json')) &&
  • 读取本地文件
    main.js:47
    (fs.existsSync(path.join(dir, 'apps', 'cli', 'lib', 'bin.js')) || fs.existsSync(path.join(dir, 'node_modules')))
  • 发起网络请求
    main.js:82
    const req = http.get(`http://127.0.0.1:${DEFAULT_PORT}/`, { timeout: 2000 }, (res) => {
  • 执行外部命令固定命令
    main.js:94
    spawnSync('taskkill', ['/pid', String(pid), '/T', '/F'], { stdio: 'ignore', windowsHide: true })
  • 执行外部命令来自配置/变量
    main.js:111
    child = spawn(cmd, args, {
  • 读取本地文件
    main.js:189
    const css = fs.readFileSync(path.join(SHELL_DIR, 'shell.css'), 'utf8')
  • 读取本地文件
    main.js:190
    const js = fs.readFileSync(path.join(SHELL_DIR, 'shell.js'), 'utf8')
  • 写入本地文件
    main.js:273
    fs.writeFileSync(outPath, info)
  • 读取本地文件
    main.js:293
    return fs.readdirSync(dir)
  • 删除本地文件
    build-release.js:14
    fs.rmSync(OUT, { recursive: true, force: true })
  • 删除本地文件
    build-release.js:16
    fs.rmSync(path.join(OUT, 'resources', 'default_app.asar'), { force: true })
  • 删除本地文件
    build-release.js:19
    fs.rmSync(STAGING, { recursive: true, force: true })
  • 写入本地文件
    build-release.js:20
    fs.mkdirSync(path.join(STAGING, 'shell'), { recursive: true })
  • 写入本地文件
    build-release.js:22
    fs.copyFileSync(path.join(APP_ROOT, f), path.join(STAGING, f))
  • 读取本地文件
    build-release.js:33
    console.log('app.asar written:', (fs.statSync(asarOut).size / 1048576).toFixed(1), 'MB')
  • 写入本地文件
    build-release.js:37
    fs.renameSync(path.join(OUT, 'electron.exe'), exe)
  • 写入本地文件
    build-release.js:53
    fs.copyFileSync(path.join(APP_ROOT, 'README.md'), path.join(OUT, 'README.md'))
  • 写入本地文件
    build-release.js:54
    fs.copyFileSync(path.join(APP_ROOT, 'LICENSE'), path.join(OUT, 'LICENSE'))
  • 删除本地文件
    build-release.js:55
    fs.rmSync(STAGING, { recursive: true, force: true })
  • 读取本地文件
    probe/main-bgcheck.js:8
    const css = fs.readFileSync(path.join(APP, 'shell', 'shell.css'), 'utf8')
  • 读取本地文件
    probe/main-bgcheck.js:9
    const js = fs.readFileSync(path.join(APP, 'shell', 'shell.js'), 'utf8')
  • 读取本地文件
    probe/main-bgcheck.js:23
    const data = fs.readFileSync(file)
  • 写入本地文件
    probe/main-bgcheck.js:79
    fs.writeFileSync(path.join(__dirname, 'bg-out.json'), out)
  • 读取本地文件
    probe/main-collapse.js:8
    const css = fs.readFileSync(path.join(APP, 'shell', 'shell.css'), 'utf8')
  • 读取本地文件
    probe/main-collapse.js:9
    const js = fs.readFileSync(path.join(APP, 'shell', 'shell.js'), 'utf8')
  • 写入本地文件
    probe/main-collapse.js:11
    fs.mkdirSync(OUT, { recursive: true })
  • 写入本地文件
    probe/main-collapse.js:53
    fs.writeFileSync(path.join(OUT, 'collapse.json'), out)
  • 读取本地文件
    probe/main-collapse2.js:8
    const css = fs.readFileSync(path.join(APP, 'shell', 'shell.css'), 'utf8')
  • 读取本地文件
    probe/main-collapse2.js:9
    const js = fs.readFileSync(path.join(APP, 'shell', 'shell.js'), 'utf8')
  • 写入本地文件
    probe/main-collapse2.js:45
    fs.writeFileSync(path.join(__dirname, 'collapse-diag.json'), out)
  • 写入本地文件
    probe/main.js:9
    fs.mkdirSync(OUT, { recursive: true })
  • 写入本地文件
    probe/main.js:52
    fs.writeFileSync(path.join(OUT, 'dom.json'), info)
  • 写入本地文件
    probe/main.js:54
    fs.writeFileSync(path.join(OUT, 'screenshot.png'), img.toPNG())
  • 读取本地文件
    probe/main10.js:8
    const css = fs.readFileSync(path.join(APP, 'shell', 'shell.css'), 'utf8')
  • 读取本地文件
    probe/main10.js:9
    const js = fs.readFileSync(path.join(APP, 'shell', 'shell.js'), 'utf8')
  • 读取本地文件
    probe/main11.js:8
    const css = fs.readFileSync(path.join(APP, 'shell', 'shell.css'), 'utf8')
  • 读取本地文件
    probe/main11.js:9
    const js = fs.readFileSync(path.join(APP, 'shell', 'shell.js'), 'utf8')
  • 读取本地文件
    probe/main12.js:8
    const css = fs.readFileSync(path.join(APP, 'shell', 'shell.css'), 'utf8')
  • 读取本地文件
    probe/main12.js:9
    const js = fs.readFileSync(path.join(APP, 'shell', 'shell.js'), 'utf8')
  • 写入本地文件
    probe/main12.js:21
    fs.writeFileSync(path.join(__dirname, 'probe-out3', name + '.png'), img.toPNG())
  • 写入本地文件
    probe/main2.js:8
    fs.mkdirSync(OUT, { recursive: true })
  • 写入本地文件
    probe/main2.js:91
    fs.writeFileSync(path.join(OUT, 'dom.json'), info)
  • 写入本地文件
    probe/main3.js:8
    fs.mkdirSync(OUT, { recursive: true })
  • 写入本地文件
    probe/main3.js:51
    fs.writeFileSync(path.join(OUT, 'surfaces.json'), info)
  • 读取本地文件
    probe/main5.js:8
    const css = fs.readFileSync(path.join(APP, 'shell', 'shell.css'), 'utf8')
  • 读取本地文件
    probe/main6.js:8
    const css = fs.readFileSync(path.join(APP, 'shell', 'shell.css'), 'utf8')
  • 读取本地文件
    probe/main6.js:9
    const js = fs.readFileSync(path.join(APP, 'shell', 'shell.js'), 'utf8')
  • 读取本地文件
    probe/main7.js:8
    const css = fs.readFileSync(path.join(APP, 'shell', 'shell.css'), 'utf8')
  • 读取本地文件
    probe/main8.js:8
    const css = fs.readFileSync(path.join(APP, 'shell', 'shell.css'), 'utf8')
  • 读取本地文件
    probe/main8.js:9
    const js = fs.readFileSync(path.join(APP, 'shell', 'shell.js'), 'utf8')
  • 读取本地文件
    probe/main9.js:8
    const css = fs.readFileSync(path.join(APP, 'shell', 'shell.css'), 'utf8')
  • 读取本地文件
    probe/main9.js:9
    const js = fs.readFileSync(path.join(APP, 'shell', 'shell.js'), 'utf8')
扫描于 2026/11/2(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库

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

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

功能亮点

  • 包装为桌面应用
  • 双击即用

DeepSeek Harness 液态玻璃桌面外壳

README

由 DeepSeek 最新模型翻译生成
DeepSeek Harness Desktop 为 DeepSeek Harness 打造的液态玻璃桌面外壳 · A liquid-glass desktop shell for DeepSeek Harness 本仓库是客户端源代码;打包好的成品在 Releases 页面提供下载。 📖 中文文档 这是什么 一款为 DeepSeek Harness 打造的桌面外壳。它的定位很简单:在 Harness 本身可用的前提下,把「在浏览器里用」包装成「双击即用的漂亮桌面应用」。 - 壳核分离:完全不修改 Harness 的任何文件,仅在独立窗口中启动、美化现有的 dsh web 服务 - 本仓库只包含外壳代码,不包含 Harness 内核,也不负责帮你安装 Harness ✨ 特性 - 🚀 一键启动:自动探测 / 拉起 dsh web 服务并解析端口,无需手动开 PowerShell - 🔄 智能复用:已有 dsh web 在跑(默认 3080 端口)→ 直接复用;没有 → 自动启动新实例(--port 0 自动分配端口),关窗自动回收自己启动的服务 - 🖼️ 背景系统:6 张内置背景图(3 深 3 浅),可调透明度 / 明暗 / 背景模糊;支持自定义本地图片(持久记忆、重启恢复,并提示可关闭毛玻璃查看原图)
展开完整文档(README 剩余 1 节)
DeepSeek Harness Desktop

为 DeepSeek Harness 打造的液态玻璃桌面外壳 · A liquid-glass desktop shell for DeepSeek Harness

本仓库是客户端源代码;打包好的成品在 Releases 页面提供下载。

📖 中文文档

这是什么

一款为 DeepSeek Harness 打造的桌面外壳。它的定位很简单:在 Harness 本身可用的前提下,把「在浏览器里用」包装成「双击即用的漂亮桌面应用」。

- 壳核分离:完全不修改 Harness 的任何文件,仅在独立窗口中启动、美化现有的 dsh web 服务
- 本仓库只包含外壳代码,不包含 Harness 内核,也不负责帮你安装 Harness

✨ 特性

- 🚀 一键启动:自动探测 / 拉起 dsh web 服务并解析端口,无需手动开 PowerShell
- 🔄 智能复用:已有 dsh web 在跑(默认 3080 端口)→ 直接复用;没有 → 自动启动新实例(--port 0 自动分配端口),关窗自动回收自己启动的服务
- 🖼️ 背景系统:6 张内置背景图(3 深 3 浅),可调透明度 / 明暗 / 背景模糊;支持自定义本地图片(持久记忆、重启恢复,并提示可关闭毛玻璃查看原图)
- 🧊 液态玻璃:整窗圆角 + 帧级毛玻璃(Apple Liquid Glass 风格),侧栏 / 输入卡半透明磨砂、内高光边框
- 🪄 无边框沉浸界面:无标题栏黑条;最小化 / 最大化 / 关闭悬浮右上角、靠近自动浮现;按住页面顶部空白处即可拖动窗口
- 🐳 侧栏鲸鱼球:收起侧栏后化作左上角一颗玻璃球(DS 鲸鱼 logo),点击展开;展开为圆角卡片,保留原生收起 / 调宽
- 🎨 深色模式修色:代码块 / 内联代码改为半透明玻璃(不再突兀),点赞 / 复制 / 运行时间等辅助信息提亮
- ⚡ 性能模式:一键关闭全部模糊特效,老旧设备也流畅
- 💾 设置记忆:背景、透明度等偏好自动保存,重启不丢失

⚠️ 前置条件(重要)

本客户端是 Harness 的美化外壳,本身不包含 Harness 内核。请先确认目标机器满足:

1. 已有一份可用的 DeepSeek Harness 源码(本客户端不会帮你下载 / 安装 Harness)
2. Harness 已安装依赖并完成构建:
- 已执行 pnpm install(node_modules 完整)
- 已执行 pnpm run build(前端 apps/web/dist 已生成)
- 即:pnpm dsh web 在目标机器上能正常启动
3. 已安装 Node.js ≥ 22(客户端启动 Harness 时需要调用 node)

📦 下载与安装

前往本仓库的 Releases 页面,下载最新版 dsh-desktop-win32-x64.zip(约 100MB,含完整 Electron 运行时,无需对方安装 Node / Electron):

解压 → 双击 dsh-desktop.exe → 首次打开选 Harness 目录 → 开始使用

🔨 从源码构建

1. 安装依赖
npm install --no-audit --no-fund --cache .npm-cache

2. 开发模式启动
npm start

3. 打包发布(输出到 ..\release\dsh-desktop-win32-x64\)
npm run pack

🚀 首次使用

1. 双击 dsh-desktop.exe
2. 若本机 3080 端口已有 Harness 在运行 → 直接连接,跳过后续步骤
3. 否则启动页会显示:「未找到 DeepSeek Harness,请选择安装目录后继续」+ 选择按钮
4. 选择 Harness 源码目录(含 package.json 与 apps/cli 的那个文件夹),校验通过后自动启动
5. 路径会被记住,之后每次打开自动使用;换目录可通过环境变量 DSH_HARNESS_PATH 指定,或删除 %APPDATA%\DeepSeek Harness Desktop\settings.json 后重新选择

⚙️ 配置

- 外壳设置:右下角调色盘按钮打开「外观设置」面板 —— 背景图切换 / 自定义背景 / 透明度 / 明暗 / 背景模糊 / 毛玻璃面板 / 性能模式 / 恢复默认
- Harness 路径:首次选择后记录在 settings.json;环境变量 DSH_HARNESS_PATH 可强制指定
- 复用 vs 自启:关窗时只有本客户端启动的 Harness 服务会被回收;复用的已有服务不受影响

❓ 常见问题

| 现象 | 处理 |
| 启动页提示"启动失败" | 多为前置条件未满足:Harness 未 pnpm install / 未 pnpm run build,或 Node 版本过低 |
| 启动页提示"所选目录不是有效的 Harness" | 选错了文件夹:应选择包含 package.json 与 apps\cli 的 Harness 根目录 |
| 杀毒软件提示 | 无代码签名的 Electron 应用可能被误报,添加信任 / 白名单即可 |
| 换一台机器使用 | 直接把整个 dsh-desktop-win32-x64 文件夹拷过去即可(对方机器需满足前置条件) |

📁 目录结构

dsh-desktop/
├── main.js # 主进程:服务探测/启动/端口解析/窗口/IPC/资源协议 ├── preload.js # 桥接:向 harness 页面暴露最小权限 API ├── build-release.js # 手动打包脚本(asar + 图标) ├── shell/ │ ├── splash.html # 启动页(液态玻璃 + 进度 + 首次选目录引导) │ ├── shell.css # 注入式玻璃主题(变量覆盖/背景层/面板/动效) │ ├── shell.js # 注入式外壳逻辑(背景系统/面板识别/窗口拖拽/持久化) │ ├── backgrounds/ # 6 张内置背景图 │ └── assets/ # 应用图标 ├── gen-backgrounds.ps1 # 背景图生成脚本(可自定义增删) ├── gen-icon.ps1 # 图标生成脚本 └── probe/ # DOM 探测工具(升级 harness 后验证选择器用)

🔧 技术说明

- 外壳通过 webContents.insertCSS / executeJavaScript 注入到 Harness 页面,不触碰 Harness 源码
- 主题改造依赖 Harness 的语义 CSS 变量(--dsw-alias-bg-、--dsw-specific-),用 !important 覆盖为半透明玻璃色;主框架(.dsh-glass-frame)用 backdrop-filter + clip-path 实现整窗毛玻璃圆角
- 背景图通过自定义 dsh-shell:// 协议供给(打包后从 asar 内读取)
- 毛玻璃仅作用于主框架 + 外壳控件;动画全部使用 transform/opacity,支持系统「减弱动态效果」,并提供性能模式一键关闭模糊
- Harness 升级导致界面类名变化时,可用 probe/ 下的探测脚本复测选择器

📄 许可证

MIT License © DeepSeek Harness Desktop contributors

English Documentation

这是什么?

一个 DeepSeek Harness 桌面外壳,围绕一个想法打造:Harness 跑通之后,把它变成一个漂亮的、双击就能打开的桌面应用,而不是浏览器标签页。

- 外壳与内核分离 —— 它不改动 Harness 的任何一个文件,只在自己的窗口里启动并重新美化现有的 dsh web 服务。
- 本仓库只包含外壳源码,不含 Harness 内核,也不会替你安装 Harness。

✨ 功能特性

- 🚀 一键启动 —— 自动检测或启动 dsh web 服务,并解析出端口;不用再在 PowerShell 里敲命令。
- 🔄 智能复用 —— 如果已有 dsh web 实例在运行(默认端口 3080),直接复用;否则新起一个(--port 0 自动挑空闲端口),关窗时再回收。
- 🖼️ 背景系统 —— 6 张内置壁纸(3 张深色 / 3 张浅色),可调透明度、亮度和模糊;也能选本地图片(重启后依然保留,并提示关闭毛玻璃即可看到原图)。
- 🧊 液态玻璃 —— 窗口圆角,框架级毛玻璃,苹果风;侧边栏和输入卡片半透明,带内高光。
- 🪄 沉浸式无边框界面 —— 没有标题栏;最小化/最大化/关闭按钮浮在右上角,悬停时出现;按住页面顶部任意空白区域即可拖动窗口。
- 🐳 侧边栏鲸鱼球 —— 收起侧边栏后,它会变成左上角一颗小玻璃球(DS 鲸鱼 logo);点击即可展开回圆角卡片。原生收起/调整大小行为保持不变。
- 🎨 深色模式打磨 —— 代码块和行内代码变成半透明玻璃,不再是突兀的方块;点赞/复制/运行时长等辅助信息提亮,更易读。
- ⚡ 性能模式 —— 一键关闭所有模糊效果,照顾老机器。
- 💾 偏好持久化 —— 背景、透明度等设置自动保存,重启后依然生效。

⚠️ 前置条件

这个应用只是 Harness 的外壳,不打包 Harness 核心。先确认目标机器上有:

1. 一份能正常运行的 DeepSeek Harness 源码树(这个应用不会帮你下载或安装 Harness)。
2. Harness 已装好依赖并完成构建:
- 已经跑过 pnpm install(node_modules 完整)
- 已经跑过 pnpm run build(前端 apps/web/dist 已生成)
- 换句话说,在那台机器上 pnpm dsh web 应该能正常启动。
3. 已安装 Node.js ≥ 22(应用会调用 node 来启动 Harness)。

📦 下载与安装

到本仓库的 Releases 页面下载最新的 dsh-desktop-win32-x64.zip(约 100MB,内含完整 Electron 运行时——接收方不需要装 Node 或 Electron):

解压 → 双击 dsh-desktop.exe → 首次启动时选择你的 Harness 文件夹 → 完成

🔨 从源码构建

1. Install dependencies
npm install --no-audit --no-fund --cache .npm-cache

2. Run in development mode
npm start

3. Package a release (outputs to ..\release\dsh-desktop-win32-x64\)
npm run pack

🚀 首次启动

1. 双击 dsh-desktop.exe。
2. 如果已经有 Harness 实例在监听 3080 端口,它会直接连上——后面的步骤可以跳过。
3. 否则启动画面会显示:「Harness not found — please pick its folder to continue」,并带一个选择按钮。
4. 选择 Harness 源码目录(就是包含 package.json 和 apps/cli 的那个);应用会校验它并自动启动。
5. 路径会被记住,下次启动直接用。以后想改,可以设置 DSH_HARNESS_PATH 环境变量,或者删掉 %APPDATA%\DeepSeek Harness Desktop\settings.json 再重新选一次。

⚙️ 配置

- 外观面板:右下角的调色板按钮打开它——切换壁纸 / 自定义背景 / 不透明度 / 亮度 / 模糊 / 毛玻璃开关 / 性能模式 / 重置。
- Harness 路径:首次选择后记在 settings.json 里;DSH_HARNESS_PATH 会覆盖它。
- 复用还是新起:关闭窗口只会回收这个应用自己启动的服务;复用的服务会继续运行。

❓ 常见问题

| 现象 | 解决 |
| 启动画面上提示「Startup failed」 | 通常是前置条件没满足:Harness 还没跑 pnpm install / pnpm run build,或者 Node 版本太旧。 |
| 提示「The chosen folder is not a valid Harness」 | 文件夹选错了:要选包含 package.json 和 apps\cli 的 Harness 根目录。 |
| 杀毒软件报警 | 未签名的 Electron 应用偶尔会被误报;加个例外 / 白名单即可。 |
| 换到另一台机器 | 把整个 dsh-desktop-win32-x64 文件夹拷过去就行(那台机器同样要满足前置条件)。 |

📁 仓库结构

dsh-desktop/
├── main.js # Main process: server probe/launch, port parsing, window, IPC, asset protocol
├── preload.js # Bridge: minimal-permission API exposed to the harness page
├── build-release.js # 手动打包脚本(asar + 图标) ├── shell/ │ ├── splash.html # 启动画面(液态玻璃 + 进度 + 首次运行的文件夹选择器) │ ├── shell.css # 注入的玻璃主题(变量覆盖 / 图层 / 面板 / 动效) │ ├── shell.js # 注入的外壳逻辑(背景 / 面板检测 / 窗口拖拽 / 持久化) │ ├── backgrounds/ # 6 张内置壁纸 │ └── assets/ # 应用图标 ├── gen-backgrounds.ps1 # 壁纸生成器(添加/删除背景) ├── gen-icon.ps1 # 图标生成器 └── probe/ # DOM 探测工具(Harness 升级后重新校验选择器)

🔧 技术说明

- 外壳通过 webContents.insertCSS / executeJavaScript 注入 Harness 页面 —— 绝不改动 Harness 源码。
- 主题依托 Harness 的语义化 CSS 变量(--dsw-alias-bg-、--dsw-specific-),用 !important 覆盖为半透明玻璃色调;主框架(.dsh-glass-frame)用 backdrop-filter + clip-path 做出圆角磨砂窗口。
- 壁纸通过自定义 dsh-shell:// 协议提供(打包后从 asar 读取)。
- 模糊只作用于主框架和外壳控件;所有动画只用 transform/opacity,遵循系统「减少动态效果」设置,也能通过性能模式彻底关闭。
- 如果 Harness 升级后类名有变,用 probe/ 下的工具重新校验选择器。

📄 许可证

MIT License © DeepSeek Harness Desktop contributors
预览分享卡片长什么样 ↓165555979/dsh-desktop
分享 · DeepSeek Harness Hub
165555979/dsh-desktop

把浏览器里的 dsh web 包装成双击即用的桌面应用

回到顶部