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

桌面窗口启动器 ZichengGurrr/dsh-window

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

把网页界面装进独立窗口,双击即用

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

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

自动兼容检查有告警:npm 同名包「dsh-window」归属 bbtssama/dsh-window,装到的可能不是本插件;安装清单取自 plugin/package.json。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add ZichengGurrr/dsh-window
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

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

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

验证判据与等级说明 →

可信度证据

⚠︎ 实装验证未通过(unknown · 2026/11/2) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
安装兼容性检查⚠ 装前注意

npm 同名包「dsh-window」归属 bbtssama/dsh-window,装到的可能不是本插件;安装清单取自 plugin/package.json

展开查看检查明细 ↓

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

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

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

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

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

可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 54 处,展示前 54 条)
  • 读取本地文件
    kit/lib/installer.js:36
    exists: path => fs.existsSync(path),
  • 写入本地文件
    kit/lib/installer.js:37
    mkdir: dir => fs.mkdirSync(dir, { recursive: true }),
  • 读取本地文件
    kit/lib/installer.js:40
    return fs.readFileSync(path, 'utf8');
  • 写入本地文件
    kit/lib/installer.js:46
    writeFile: (path, data) => fs.writeFileSync(path, data),
  • 删除本地文件
    kit/lib/installer.js:47
    rm: path => fs.rmSync(path, { force: true }),
  • 发起网络请求
    kit/lib/installer.js:50
    const response = await fetch(url, {
  • 执行外部命令固定命令
    kit/lib/installer.js:62
    const child = spawn('curl', [
  • 删除本地文件
    kit/lib/installer.js:66
    child.on('error', error => { fs.rmSync(tmp, { force: true }); reject(error); });
  • 删除本地文件
    kit/lib/installer.js:69
    fs.rmSync(tmp, { force: true });
  • 读取本地文件
    kit/lib/installer.js:74
    resolve(fs.readFileSync(tmp));
  • 删除本地文件
    kit/lib/installer.js:80
    fs.rmSync(tmp, { force: true });
  • 执行外部命令固定命令
    kit/lib/installer.js:89
    const child = spawn('powershell', ['-NoProfile', '-Command', script], {
  • 执行外部命令固定命令
    kit/lib/installer.js:105
    const child = spawn('powershell', ['-NoProfile', '-Command', script], {
  • 执行外部命令来自配置/变量
    kit/lib/launcher.js:12
    const child = spawn(exePath, [], {
  • 读取本地文件
    kit/src/installer.ts:80
    exists: path => fs.existsSync(path),
  • 写入本地文件
    kit/src/installer.ts:81
    mkdir: dir => fs.mkdirSync(dir, { recursive: true }),
  • 读取本地文件
    kit/src/installer.ts:84
    return fs.readFileSync(path, 'utf8')
  • 写入本地文件
    kit/src/installer.ts:89
    writeFile: (path, data) => fs.writeFileSync(path, data),
  • 删除本地文件
    kit/src/installer.ts:90
    rm: path => fs.rmSync(path, { force: true }),
  • 发起网络请求
    kit/src/installer.ts:93
    const response = await fetch(url, {
  • 执行外部命令固定命令
    kit/src/installer.ts:104
    const child = spawn('curl', [
  • 删除本地文件
    kit/src/installer.ts:108
    child.on('error', error => { fs.rmSync(tmp, { force: true }); reject(error) })
  • 删除本地文件
    kit/src/installer.ts:111
    fs.rmSync(tmp, { force: true })
  • 读取本地文件
    kit/src/installer.ts:115
    try { resolve(fs.readFileSync(tmp)) } catch (error) { reject(error) } finally { fs.rmSync(tmp, { force: true }) }
  • 执行外部命令固定命令
    kit/src/installer.ts:123
    const child = spawn('powershell', ['-NoProfile', '-Command', script], {
  • 执行外部命令固定命令
    kit/src/installer.ts:139
    const child = spawn('powershell', ['-NoProfile', '-Command', script], {
  • 执行外部命令来自配置/变量
    kit/src/launcher.ts:14
    const child = spawn(exePath, [], {
  • 读取本地文件
    plugin/lib/installer.js:36
    exists: path => fs.existsSync(path),
  • 写入本地文件
    plugin/lib/installer.js:37
    mkdir: dir => fs.mkdirSync(dir, { recursive: true }),
  • 读取本地文件
    plugin/lib/installer.js:40
    return fs.readFileSync(path, 'utf8');
  • 写入本地文件
    plugin/lib/installer.js:46
    writeFile: (path, data) => fs.writeFileSync(path, data),
  • 删除本地文件
    plugin/lib/installer.js:47
    rm: path => fs.rmSync(path, { force: true }),
  • 发起网络请求
    plugin/lib/installer.js:50
    const response = await fetch(url, {
  • 执行外部命令固定命令
    plugin/lib/installer.js:62
    const child = spawn('curl', [
  • 删除本地文件
    plugin/lib/installer.js:66
    child.on('error', error => { fs.rmSync(tmp, { force: true }); reject(error); });
  • 删除本地文件
    plugin/lib/installer.js:69
    fs.rmSync(tmp, { force: true });
  • 读取本地文件
    plugin/lib/installer.js:74
    resolve(fs.readFileSync(tmp));
  • 删除本地文件
    plugin/lib/installer.js:80
    fs.rmSync(tmp, { force: true });
  • 执行外部命令固定命令
    plugin/lib/installer.js:89
    const child = spawn('powershell', ['-NoProfile', '-Command', script], {
  • 执行外部命令固定命令
    plugin/lib/installer.js:105
    const child = spawn('powershell', ['-NoProfile', '-Command', script], {
  • 执行外部命令来自配置/变量
    plugin/lib/launcher.js:12
    const child = spawn(exePath, [], {
  • 读取本地文件
    plugin/src/installer.ts:80
    exists: path => fs.existsSync(path),
  • 写入本地文件
    plugin/src/installer.ts:81
    mkdir: dir => fs.mkdirSync(dir, { recursive: true }),
  • 读取本地文件
    plugin/src/installer.ts:84
    return fs.readFileSync(path, 'utf8')
  • 写入本地文件
    plugin/src/installer.ts:89
    writeFile: (path, data) => fs.writeFileSync(path, data),
  • 删除本地文件
    plugin/src/installer.ts:90
    rm: path => fs.rmSync(path, { force: true }),
  • 发起网络请求
    plugin/src/installer.ts:93
    const response = await fetch(url, {
  • 执行外部命令固定命令
    plugin/src/installer.ts:104
    const child = spawn('curl', [
  • 删除本地文件
    plugin/src/installer.ts:108
    child.on('error', error => { fs.rmSync(tmp, { force: true }); reject(error) })
  • 删除本地文件
    plugin/src/installer.ts:111
    fs.rmSync(tmp, { force: true })
  • 读取本地文件
    plugin/src/installer.ts:115
    try { resolve(fs.readFileSync(tmp)) } catch (error) { reject(error) } finally { fs.rmSync(tmp, { force: true }) }
  • 执行外部命令固定命令
    plugin/src/installer.ts:123
    const child = spawn('powershell', ['-NoProfile', '-Command', script], {
  • 执行外部命令固定命令
    plugin/src/installer.ts:139
    const child = spawn('powershell', ['-NoProfile', '-Command', script], {
  • 执行外部命令来自配置/变量
    plugin/src/launcher.ts:14
    const child = spawn(exePath, [], {
扫描于 2026/11/4(1 天前) · 范围 全包扫描 · 来源 GitHub 仓库

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

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

功能亮点

  • 网页界面独立窗口
  • 双击启动

README

由 DeepSeek 最新模型翻译生成
DeepSeek Harness Window(社区版) 把 DeepSeek Harness 的 Web UI 装进 Windows 原生独立窗口(WebView2,即 Edge 内核)的极简启动器。 - 没有浏览器标签栏、地址栏;任务栏上是自己的图标和窗口 - 不需要 Electron;精简版整个应用约 256KB(4 个文件) - 便携版双击即用:自带 Node.js + DSH + Git,无需安装任何环境 - 双击即用:自动检测/启动本地 DSH 服务,就绪后弹窗;关窗即停(服务由它启动时) - 单实例:重复双击只聚焦已有窗口;记住窗口大小和位置;连不上服务时窗口内一键重试 ⚠️ 非官方社区项目,与 DeepSeek 公司无隶属关系。"DeepSeek" 商标归其所有者所有。 快速开始 方式一:DSH 插件(推荐给 DSH 用户) dsh plugin --profile web add dsh-window 插件自动从 GitHub Releases 安装应用并创建桌面快捷方式「DeepSeek Harness Window」;对话里说"打开桌面应用"即可通过 desktop_launch 工具拉起。详见 plugin/README.md。
展开完整文档(README 剩余 1 节)
DeepSeek Harness Window(社区版)

把 DeepSeek Harness 的 Web UI 装进 Windows 原生独立窗口(WebView2,即 Edge 内核)的极简启动器。

- 没有浏览器标签栏、地址栏;任务栏上是自己的图标和窗口
- 不需要 Electron;精简版整个应用约 256KB(4 个文件)
- 便携版双击即用:自带 Node.js + DSH + Git,无需安装任何环境
- 双击即用:自动检测/启动本地 DSH 服务,就绪后弹窗;关窗即停(服务由它启动时)
- 单实例:重复双击只聚焦已有窗口;记住窗口大小和位置;连不上服务时窗口内一键重试

⚠️ 非官方社区项目,与 DeepSeek 公司无隶属关系。"DeepSeek" 商标归其所有者所有。

快速开始

方式一:DSH 插件(推荐给 DSH 用户)

dsh plugin --profile web add dsh-window

插件自动从 GitHub Releases 安装应用并创建桌面快捷方式「DeepSeek Harness Window」;对话里说"打开桌面应用"即可通过 desktop_launch 工具拉起。详见 plugin/README.md。

方式二:便携版(零门槛,任何人)

1. 从 Releases 下载 DeepSeek-Harness-Window-portable-v-win-x64.zip
2. 解压到任意目录
3. 双击 DeepSeek Harness Window.exe

首次运行 Windows SmartScreen 可能拦截(exe 未签名):点「更多信息 → 仍要运行」即可。

方式三:精简版(已有 Node 环境)

1. 下载 DeepSeek-Harness-Window-v-win-x64.zip 并解压(4 个文件)
2. 前提:Windows 10/11、Node.js 装在默认位置 %LOCALAPPDATA%\Programs\nodejs、npm install -g @deepseek-ai/dsh
3. 双击 DeepSeek Harness Window.exe
4. 想一键安装到系统(开始菜单 + 桌面快捷方式 + 控制面板可卸载):运行 DeepSeek Harness Window.exe --install,卸载用 --uninstall

三件套全家桶(桌面 + GLM 视觉 + 语音输入)

一条命令装齐「Windows 桌面窗口 + DeepEye 视觉(GLM-4V-Flash)+ 语音输入按钮」:

dsh plugin --profile web add github:ZichengGurrr/dsh-window#path:/kit

GLM 视觉需在 ~/.dsh/.env 配置 DEEPEYE_API_KEY(智谱开放平台)。详见 kit/README.md。

两种形态

| | 精简版 slim | 便携版 portable |
| 大小 | ~256KB | ~180MB |
| 适合 | 开发者、已有 Node 环境的人 | 任何人,解压双击即用 |
| 前提 | 已装 Node + npm i -g @deepseek-ai/dsh | 无 |
| 文件名 | DeepSeek-Harness-Window-v-win-x64.zip | ...-portable-v-win-x64.zip |

同类桌面壳对比

| | dsh-window | dsh-desktop-windowos | DeepSeek Harness Desktop |
| 安装 | dsh plugin add dsh-window / zip | 插件 / 单 exe | 官网安装包 |
| 体积 | 256KB(精简)/ 180MB(便携) | 约 4.5MB | 安装包 |
| 需要 Node | 精简版需要;便携版不需要 | 需要 | 不需要 |
| 技术栈 | C# + WebView2(系统自带 csc 即可编译) | Tauri v2 + React | Electron |
| 托盘 / 任务完成通知 | 托盘有(closeToTray);通知计划中 | 有 | 有 |

原理

DeepSeek Harness 的图形界面本质是一个本地网页(默认 http://127.0.0.1:3080)。本程序负责起服务(dsh --profile web --host 127.0.0.1 --port 3080),并把“打开浏览器标签页”这一步换成内嵌的 WebView2 窗口。便携版把运行环境(Node、DSH 包、Git)放在程序目录的 runtime\ 下,优先使用,找不到再回退到系统安装。

可选配置

在 exe 同目录放一个 dsh-window.config.json(可省略,全部有默认值):

{
"host": "127.0.0.1",
"port": 3080,
"waitTimeoutMs": 30000,
"killServerOnClose": true,
"permissionMode": "danger-full-access",
"closeToTray": true,
"checkUpdates": true,
"updateRepo": "ZichengGurrr/dsh-window",
"logFile": true
}

| 字段 | 默认 | 说明 |
| host / port | 127.0.0.1 / 3080 | 服务地址;改端口即可与其它实例共存 |
| waitTimeoutMs | 30000 | 等待服务就绪的超时 |
| killServerOnClose | true | 服务由本程序启动时,关窗是否一并停止 |
| permissionMode | danger-full-access | 传给服务的 DSH 权限模式(也可在 Web UI 里改) |
| closeToTray | false | 点关闭按钮最小化到托盘(托盘菜单:显示主窗口 / 退出) |
| checkUpdates | true | 启动后检查 GitHub Release 新版本,有新版时页面右下角提示 |
| updateRepo | ZichengGurrr/dsh-window | 更新检查的仓库 |
| logFile | false | 写日志到 %LOCALAPPDATA%\DeepSeekHarnessWindow\launcher.log |

命令行参数

| 参数 | 作用 |
| (无) | 确保服务在线,然后打开窗口 |
| --check | 只检查运行环境,不启动任何东西 |
| --no-window | 只确保服务在线,不打开窗口 |
| --install | 一键安装:拷贝到 %LOCALAPPDATA%\Programs\dsh-window,创建桌面/开始菜单快捷方式和卸载项 |
| --uninstall | 卸载:移除快捷方式、注册表卸载项与安装目录 |

从源码构建

依赖:Windows + PowerShell + .NET Framework 4.x(自带 csc.exe)。构建脚本自动下载 WebView2 SDK(NuGet)。

.\build.ps1 # 精简版 .\build.ps1 -Portable # 精简版 + 便携版(自动下载 Node/MinGit、npm 安装 DSH) .\build.ps1 -Version 1.1.0 -IconPath .\my-icon.ico .\build.ps1 -Portable -DshVersion 0.1.0-rc.6 -NpmRegistry https://registry.npmmirror.com

产物:dist\(精简版目录)、dist-portable\(便携版目录)及仓库根目录下的 zip。

图标是可选的。仓库内不带任何 DeepSeek 官方 logo 素材,请勿在公开分发中使用官方鲸鱼 logo,除非你确认有权使用。

常见问题

便携版为什么这么大?
Node.js 运行时 + 完整 @deepseek-ai/dsh 包 + MinGit。这是“解压即用”的代价;不需要零安装体验就用精简版。

和直接开浏览器有什么区别?
服务完全一样,会话数据完全共用(~/.dsh)。区别只在窗口形态:独立窗口、独立任务栏图标、关窗即停。

关掉窗口后还能用浏览器访问吗?
如果服务本来就在外面跑着(比如命令行 dsh web),关窗不影响;服务是这个程序起的且 killServerOnClose 为 true,会一起停。

为什么不是单文件 exe?
WebView2 需要 3 个运行库文件随 exe 分发(含一个原生 DLL)。4 个文件放一个文件夹,体感与单文件无异。

Windows 弹 SmartScreen 警告?
exe 未做代码签名,首次运行会被拦:点「更多信息 → 仍要运行」。签名在 Roadmap 中。

Roadmap

- [x] 作为 DSH 插件分发(dsh plugin add dsh-window,含 desktop_launch 工具与自动安装/升级)
- [x] 托盘常驻与最小化到托盘(closeToTray,点关闭按钮隐藏到托盘)
- [x] 自动检查新版本并在页面内提示(checkUpdates)
- [x] 一键安装/卸载(--install / --uninstall,开始菜单 + 桌面快捷方式 + 控制面板卸载项)
- [ ] 任务完成系统通知(会话 idle 时弹 Toast,可一键唤回窗口)
- [ ] Inno Setup / winget 安装包
- [ ] 代码签名(消除 SmartScreen 警告)

相关链接

- 官方仓库:deepseek-ai/deepseek-harness(MIT,Discussions 开放)
- 官方 npm 包:@deepseek-ai/dsh
- 插件精选列表:awesome-dsh-plugin
- 其他社区桌面壳:RAFOLIE/dsh-desktop-windowos、anywhere-labs/deepseek-harness-desktop、salathleizhang/deepseek-harness-desktop、ChisaAlter/Deepseek-Harness-Desktop

License

MIT(见 LICENSE)

DeepSeek Harness Window(社区版)

一个极简启动器,将 DeepSeek Harness Web UI 放入一个原生独立的 Windows 窗口(WebView2 / Edge 引擎)。

- 没有浏览器标签页或地址栏;拥有自己的任务栏图标和窗口
- 不使用 Electron;精简版构建约 256KB(4 个文件)
- 便携版构建,双击即用:内置 Node.js + DSH + Git,无需任何环境
- 自动检测/启动本地 DSH 服务,并在就绪时打开窗口;仅在由它启动服务时,退出时才关闭该服务
- 单实例:重新启动会聚焦已有窗口;记住大小/位置;当服务无法访问时,可在窗口内一键重试

⚠️ 社区项目,与 DeepSeek 无关联。“DeepSeek”商标归其所有者所有。

快速开始

方式 A:DSH 插件(推荐 DSH 用户使用)

dsh plugin --profile web add dsh-window

该插件会从 GitHub Releases 自动安装应用,并创建桌面快捷方式“DeepSeek Harness Window”;在聊天中说“打开桌面应用”,即可通过 desktop_launch 工具启动它。参见 plugin/README.md。

方式 B:便携版构建(任何人,零前置条件)

1. 从 Releases 下载 DeepSeek-Harness-Window-portable-v-win-x64.zip
2. 解压到任意位置
3. 双击 DeepSeek Harness Window.exe

首次运行可能会触发 SmartScreen(该 exe 未签名):点击“更多信息 → 仍要运行”。

方式 C:精简版构建(已具备 Node 环境)

1. 下载并解压 DeepSeek-Harness-Window-v-win-x64.zip(4 个文件)
2. 前置条件:Windows 10/11、Node.js 位于 %LOCALAPPDATA%\Programs\nodejs、npm install -g @deepseek-ai/dsh
3. 双击 DeepSeek Harness Window.exe
4. 若要全系统安装(开始菜单 + 桌面快捷方式 + 控制面板卸载程序):运行 DeepSeek Harness Window.exe --install;使用 --uninstall 移除

一体化套件(桌面 + GLM 视觉 + 语音输入)

一条命令即可安装 Windows 桌面窗口、DeepEye 视觉(GLM-4V-Flash)以及语音输入麦克风按钮:

dsh plugin --profile web add github:ZichengGurrr/dsh-window#path:/kit

在 ~/.dsh/.env 中设置 DEEPEYE_API_KEY(智谱开放平台)以启用视觉。参见 kit/README.md。

构建

| | 精简版 | 便携版 |
| 大小 | ~256KB | ~180MB |
| 适用对象 | 已配置好 Node 的开发者 | 任何人,解压并双击即可 |
| 前置条件 | Node + npm i -g @deepseek-ai/dsh | 无 |
| 文件 | DeepSeek-Harness-Window-v-win-x64.zip | ...-portable-v-win-x64.zip |

工作原理

DeepSeek Harness GUI 是一个本地网页(默认 http://127.0.0.1:3080)。此应用会启动服务(dsh --profile web --host 127.0.0.1 --port 3080),并将“打开浏览器标签页”这一步替换为内嵌的 WebView2 窗口。便携版将运行时(Node、DSH 包、Git)保存在 runtime\ 下,缺失时会回退到系统安装。

可选配置

在 exe 旁边放置一个 dsh-window.config.json(所有键均为可选):

{
"host": "127.0.0.1",
"port": 3080,
"waitTimeoutMs": 30000,
"killServerOnClose": true,
"permissionMode": "danger-full-access",
"closeToTray": true,
"checkUpdates": true,
"updateRepo": "ZichengGurrr/dsh-window",
"logFile": true
}

| 键 | 默认值 | 含义 |
| host / port | 127.0.0.1 / 3080 | 服务地址;更改端口以与其他实例共存 |
| waitTimeoutMs | 30000 | 服务就绪超时时间 |
| killServerOnClose | true | 当此应用启动了服务时,关闭窗口即停止服务 |
| permissionMode | danger-full-access | 传递给服务的 DSH 权限模式(可在 Web UI 中更改) |
| closeToTray | false | 关闭时最小化到托盘(托盘菜单:显示窗口 / 退出) |
| checkUpdates | true | 启动时检查 GitHub Releases,并在有新版本时显示页内横幅 |
| updateRepo | ZichengGurrr/dsh-window | 用于更新检查的仓库 |
| logFile | false | 将日志写入 %LOCALAPPDATA%\DeepSeekHarnessWindow\launcher.log |

命令行参数

| 参数 | 效果 |
| (无) | 确保服务在线,然后打开窗口 |
| --check | 仅检查运行时环境,不启动任何内容 |
| --no-window | 仅确保服务在线,不打开窗口 |
| --install | 一键安装:复制到 %LOCALAPPDATA%\Programs\dsh-window,创建桌面/开始菜单快捷方式及卸载条目 |
| --uninstall | 卸载:移除快捷方式、注册表项及安装目录 |

从源码构建

前置条件:Windows + PowerShell + .NET Framework 4.x(随附的 csc.exe)。构建脚本会自动下载 WebView2 SDK(NuGet)。

.\build.ps1 # 精简构建 .\build.ps1 -Portable # 精简 + 便携(下载 Node/MinGit,通过 npm 安装 DSH) .\build.ps1 -Version 1.1.0 -IconPath .\my-icon.ico .\build.ps1 -Portable -DshVersion 0.1.0-rc.6 -NpmRegistry https://registry.npmmirror.com

输出:dist\(精简版)、dist-portable\(便携版),以及仓库根目录中的 zip 文件。
图标是可选的。此仓库不附带任何 DeepSeek 徽标资源;除非你确信自己拥有相关权利,否则不要在公开分发中使用官方鲸鱼徽标。

常见问题

为什么便携版这么大?
Node.js 运行时 + 完整的 @deepseek-ai/dsh 包 + MinGit。这就是解压即用的代价;当你已经安装了 Node 时,请使用精简版。

这与打开浏览器有何不同?
服务完全相同,会话也完全共享(~/.dsh)。区别仅在于窗口外观:独立窗口、自己的任务栏图标、关闭即停止。

关闭窗口后我还能继续使用浏览器吗?
可以,当服务已在外部运行时(例如在终端中运行 dsh web)。当此应用启动了服务且 killServerOnClose 为 true 时,关闭窗口会停止服务。

为什么不做成单文件 exe?
WebView2 需要在 exe 旁边附带 3 个运行时文件(包括一个原生 DLL)。一个文件夹里的四个文件感觉和单个文件一样。

Windows 显示 SmartScreen 警告?
该 exe 尚未进行代码签名,因此首次运行会被阻止:点击“更多信息 → 仍要运行”。签名已在路线图中。

路线图

- [x] DSH 插件分发(dsh plugin add dsh-window、desktop_launch 工具、自动安装/升级)
- [x] 托盘驻留和最小化到托盘(closeToTray,X 按钮隐藏到托盘)
- [x] 通过页面内横幅自动检查更新(checkUpdates)
- [x] 一键安装/卸载(--install / --uninstall、开始菜单 + 桌面快捷方式、控制面板条目)
- [ ] 任务完成系统通知(会话空闲时弹出 toast,一键恢复窗口)
- [ ] Inno Setup / winget 包
- [ ] 代码签名(消除 SmartScreen 警告)

链接

- 官方仓库:deepseek-ai/deepseek-harness(MIT,Discussions 开放)
- 官方 npm 包:@deepseek-ai/dsh
- 精选插件列表:awesome-dsh-plugin
- 其他社区桌面外壳:RAFOLIE/dsh-desktop-windowos、anywhere-labs/deepseek-harness-desktop、salathleizhang/deepseek-harness-desktop、ChisaAlter/Deepseek-Harness-Desktop

许可证

MIT(见 LICENSE)
预览分享卡片长什么样 ↓ZichengGurrr/dsh-window
分享 · DeepSeek Harness Hub
ZichengGurrr/dsh-window

把网页界面装进独立窗口,双击即用

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