deepseek-harness-desktop/dsh-plugin-desktop

11.5kStar512Fork175Issue31Watching

把 DSH 装进 Electron 桌面应用,提供原生窗口、托盘、profile 切换、独立终端与更新检查,无需在浏览器里打开网页版。

语言
TypeScript
License
MIT
分支
master
cordiscordis-plugindeepseekdeepseek-harnessdesktopdshdsh-plugindsh-plugin-desktop

安装

$ dsh plugin --profile web add github:anywhere-labs/deepseek-harness-desktop/dsh-plugin-desktop

在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程

一句话定位

把 DeepSeek Harness 装进一个 Electron 桌面应用,用原生窗口和系统托盘替代"在浏览器里打开本地网页"的使用方式。安装后的应用名为 DSH Desktop,界面内容仍然是 DSH 官方的那一套。

核心能力

  • 以桌面应用形式启动 DSH:进程内起一个只监听本机回环地址的服务,再用原生窗口加载它,导航被限制在这个地址内
  • 提供系统托盘菜单:重新打开窗口、切换 profile、打开专用终端、检查更新、切换界面模式、退出应用
  • 在托盘里切换 profile(插件组合),切换以"先保存、再有序重启"的方式生效,启动失败会自动回滚一次
  • 提供两套界面外观:兼容模式沿用系统原生边框与官方界面;高级模式在 macOS 使用毛玻璃标题栏、在 Windows 使用 Mica 材质
  • 在 macOS/Windows 打开一个以当前 profile 为工作目录的系统终端,其中 dsh 命令默认作用于当前 profile
  • 检查并下载新版本安装包:定时静默检查,手动检查则一定给出结果对话框

技术实现

  • 语言: TypeScript
  • 关键依赖: electron(宿主运行时,peer 依赖)、@deepseek-ai/cordis(插件编排)、@deepseek-ai/dsh 系列 0.1.0-rc.6(Host 与 Web 客户端能力)、koffi(Windows 卷信息诊断)
  • 架构模式: 打包后的可执行文件只做最小启动:抢单实例锁、解析当前 profile、装好原生运行时能力,然后在 Electron 主进程里启动 Cordis 根。功能通过 cordis.patch.yml 以多行插件形式插入(桌面壳、终端、包管理、profile、更新),窗口与托盘由带清理逻辑的 effect 持有;界面通过回环 HTTP/WebSocket 加载,不使用 preload 桥,渲染进程开启上下文隔离与沙箱、关闭 Node 集成
  • 入口文件: src/main.ts(Electron 启动器)、src/index.ts(桌面壳插件)、src/bin.ts(无图形环境也能跑的命令行入口)

适用场景

适合已经在用 DSH、但不想每次都开浏览器标签页的人:装上后就有一个可以放在 Dock 或任务栏里的独立应用,窗口关掉还留在托盘里。也适合需要在多套插件组合之间来回切换的用户,托盘的 profile 菜单比手工改配置再重启更省事。如果你只在服务器上跑无界面的 DSH,这个插件对你没有意义。

前置依赖与兼容性

依赖最低版本说明
Node.js^22.19.0 或 >=24.0.0由包的 engines 字段声明
DSH0.1.0-rc.6固定依赖该版本的 DSH 包族,未声明宽松范围
Electron43.4.0peer 依赖;用 npm 全局安装会自动带上,在 profile 里安装需手动补装
平台macOS / Windows / Linux三端可运行,但 Linux 只有兼容模式,且没有托盘终端与更新下载
原生模块koffi、node-ptykoffi 用于 Windows 卷诊断;打包产物包含 node-pty 预编译二进制

安装方式

dsh plugin --profile web add github:anywhere-labs/deepseek-harness-desktop/dsh-plugin-desktop

配置项

配置类型说明默认值
界面模式compatibility | advanced选择原生外观:兼容模式用系统边框加载官方界面,高级模式换成桌面专属外观;修改后重启生效,Linux 不接受高级模式compatibility
窗口宽度数字(CSS 像素)首次打开时的窗口宽度,不小于 8001280
窗口高度数字(CSS 像素)首次打开时的窗口高度,不小于 600840
最小宽度数字(CSS 像素)允许缩到的最窄宽度,不小于 640900
最小高度数字(CSS 像素)允许缩到的最矮高度,不小于 480640
后台检查更新布尔关闭后打包版不再定时查新版本,托盘手动检查仍可用true
首次检查延迟毫秒启动后等多久做第一次更新检查60000
检查间隔毫秒一次检查结束到下一次检查之间的等待时间21600000(6 小时)
单次请求超时毫秒一次版本查询的最长等待时间,超时按静默失败处理15000

界面模式还可以直接写在 DSH home 的 settings.yaml 里(dsh-desktop.mode),托盘里的选择改的是同一份文件。

常见问题

Q: 安装这个插件后就能直接双击打开桌面应用吗?

A: 不一定。启动需要 electron 存在:用 npm install -g dsh-plugin-desktop 会自动装上 electron,而通过 profile 安装时不会自动装,需要再补一次 dsh plugin --profile <name> add electron。缺少时命令只打印安装指引,不会抛模块错误。

Q: 桌面版看到的界面和网页版一样吗?

A: 默认的兼容模式就是加载官方网页界面,只是外面套了带系统边框的原生窗口,macOS 会隐藏页面标题、Windows 会去掉菜单栏。切到高级模式后,macOS 换成透明标题栏加侧边栏毛玻璃,Windows 换成 Mica 背景。

Q: 怎么切换界面模式?

A: 从托盘菜单里选,或手工编辑 DSH home 的 settings.yaml,把 dsh-desktop.mode 写成 compatibilityadvanced。两种方式改的都是同一份文件,提交后应用会有序重启,不会在运行中热切换。

Q: Linux 能用吗?

A: 能启动,但只支持兼容模式,写成高级模式会被拒绝而不是降级;托盘里的"打开 DSH 终端"命令在 Linux 上不组合进来,更新包下载也不提供。

Q: 切换 profile 会丢聊天记录吗?

A: 不会。官方 profile 默认共用同一个 DSH home 下的会话、设置与存储,切换只是换一套插件组合并重启,不会复制或迁移数据。自定义 profile 可以主动把某个存储位置改到别处。

Q: 我给 profile 新加了插件,为什么桌面应用里没看到?

A: 启动器不监听 profile 清单的变化,增删插件后需要重启桌面应用才会生效;从托盘切换一次 profile 也会顺带完成这次重启。

Q: 更新是自动装好的吗?

A: 不是。打包版启动 60 秒后查一次,之后每次检查完成 6 小时再查;发现更新才提示下载。macOS 会打开下载好的 DMG,需要你手动替换应用;Windows 需要确认后才运行安装器。检查失败、无网络或版本相同时全程静默。

Q: 关掉窗口是不是就退出程序了?

A: 不是。关闭窗口只是把窗口隐藏,后台的 Cordis 树继续运行,可从托盘重新打开;真正退出要在托盘里选择退出命令,或发送 SIGINT/SIGTERM。

上手难度

入门 — 装好后从托盘就能完成模式切换、profile 切换和更新检查,默认配置即可运行;只有在 profile 内安装时需要额外补一个 electron 依赖。

已知问题与限制

  • 增删 profile 里的插件后必须重启应用,启动器不监听 profile 清单变化
  • 切换兼容/高级模式必然重启应用,运行中的窗口不会热切换外观或插件行
  • Linux 不支持高级模式,也没有托盘终端命令和更新包下载
  • Windows 上暴露给环境的 pnpm 与 Node 辅助命令是 .cmd 脚本,第三方插件若以不走 shell 的方式直接调用会失败,应改用受管服务或走 shell 的启动方式
  • 更新流程只校验下载文件的完整性,不校验发布者身份;本地构建的 Windows 安装包未签名,可能触发未知发布者或 SmartScreen 警告
  • 界面与后台之间走的是本机回环 HTTP/WebSocket,而不是 Electron IPC,替换它需要上游 DSH 提供传输扩展点
  • 依赖固定在已发布的 DSH 0.1.0-rc.6 包族上,未声明更宽的版本范围
  • 第三方市场包 dshmarket@1.2.3 未预装且不兼容本插件提供的 profile 与包管理能力,需等其发布适配版本