在 DSH(DeepSeek Harness)开发中,使用 dsh web 启动 Web UI 是常见做法。这种方式需要在本地启动 HTTP 服务器,并手动打开浏览器访问。如果希望获得更原生的应用体验,直接使用桌面窗口是个更优解。

下面介绍 dsh-desktop 插件。这是一个 DSH bundle patch 插件,它通过 Electron 启动一个原生窗口,直接加载 DSH Web UI,并提供完整的桌面交互能力。

核心功能

  • 一键启动:执行启动命令后,桌面窗口会自动弹出并加载界面,无需手动打开浏览器。
  • 无需本地 HTTP 服务:插件通过 IPC(进程间通信)和自定义协议(dsh-desktop://)桥接前端与后端,不占用 TCP 端口,不启动 node:http 服务。
  • 终端立即释放:如果在交互式终端中运行,插件会将窗口实例移交为后台进程,命令行提示符会立即返回。日志会输出到 ~/.dsh/desktop.log。
  • 复用 DSH Web 能力:前端 UI、会话持久化、Agent 及工具均复用 DSH 现有的 Cordis 服务,无需二次开发。
  • 定制化标题栏:隐藏原生系统标题栏,通过 preload 脚本注入 DSH 风格的标题栏,并保留原生最小化/最大化/关闭控件。
  • 双向清理机制:
    • 关闭窗口会触发 DSH 自身退出(清理 Agent 和相关服务)。
    • DSH 主进程退出时,Electron 会检测并在 2 秒内自动关闭窗口。

安装与启用

前置要求

  • Node.js 24+ 及 npm。
  • DSH CLI 版本 0.1.2-rc.1 或更高。
  • 已配置模型凭证(如 DEEPSEEK_API_KEY)。

安装步骤

  1. 从 Releases 页面下载对应平台的压缩包(如 dsh-desktop-0.4.0-win32-x64.zip)。
  2. 解压文件。
  3. 将解压后的目录链接到 DSH 的 dsh-desktop profile 中。

注意:DSH 0.1.5+ 将 desktop profile 名字保留给官方应用,因此本插件使用非保留的 dsh-desktop profile。如果 profile 不存在,需先初始化:

# 初始化 profile(仅首次使用)
dsh --profile dsh-desktop --from-default-profile web --dump-config

然后执行安装命令(Windows 示例):

dsh plugin --profile dsh-desktop add link:D:\path\to\dsh-desktop-0.4.0-win32-x64

在 macOS/Linux 上,路径替换为对应的绝对路径即可。由于发布包已内置 Electron 运行时(位于 dist/electron/runtime/),无需执行 npm install。

典型用法

安装完成后,使用以下命令启动桌面客户端:

dsh --profile dsh-desktop

启动后,Electron 窗口会自动打开并加载 DSH Web UI,你可以在窗口内直接进行交互。

终端行为控制

如果需要在调试或 CI 环境中保持前台运行,可以使用环境变量:

  • DSH_DESKTOP_NO_DETACH=1:强制前台运行,不脱离终端。
  • DSH_DESKTOP_LOG:指定日志路径,默认为 ~/.dsh/desktop.log。

查看插件帮助信息:

dsh --profile dsh-desktop --help

注意事项

  • 开发模式差异:如果是直接从源码开发,需要执行 npm install 来解析依赖;如果下载的是已打包的 Release 版本,则不需要安装依赖。
  • 权限与安全:插件以当前 DSH 进程的权限运行,安装前建议检查源码及许可证。

总结

dsh-desktop 解决了从命令行直接进入桌面级 DSH 交互的需求。它通过 IPC 通信替代了 HTTP 服务,使得启动更加轻量,同时保留了完整的会话和工具能力。对于习惯在终端工作,但又需要图形化界面的开发者,这是一个实用的工具。