DSH Launcher

August 16, 2026 · View on GitHub

DSH Launcher 是用于管理 DeepSeek Harness Profile 的 Windows 桌面启动器。它直接读取 DSH_HOME/profiles 中的现有 Profile,并通过 DSH 自带的 --dump-configplugin 命令保持配置解析与安装语义一致。

功能

  • 选择、刷新和同时运行多个 Profile。
  • 将已停止的 Profile 安全移入系统回收站,并保留全局 Session、日志和存储数据。
  • 查看 Bundle 层、额外依赖,以及可按需展开的最终生效 Loader 条目、配置和来源。
  • 从 Web / Headless 模板创建 Profile,按 Bundle 折叠选择内置条目,并添加本地插件库或本地包中的扩展。
  • 从本地包目录或 pnpm .tgz 文件安装插件。
  • 使用独立的 DSHgo Home 收录 GitHub 或本地插件仓库,识别 monorepo 中的 DSH 包、运行入口、Bundle、兼容插件、可强制安装的 Host 包和 Web Client 能力。
  • 为本地插件执行 pnpm 安装、构建与 .tgz 打包,并可启动或停止 dev / watch 持续编译进程。
  • 创建 Profile 时或创建完成后,从本地插件库添加 dsh.bundle Profile Bundle、带 dsh.plugin.json 的兼容插件,或经用户确认 Loader ID 的普通 Host 包;支持稳定安装、默认 Link 开发、可选 Watch 开发、安全移除,以及启用或停用 DSHgo 管理的插件条目。
  • 自动为 Web Profile 选择可用端口,展示 stdout / stderr 和生命周期日志;支持删除单条已结束记录或清空当前 Profile 的已结束记录。
  • 可靠停止由当前启动器会话创建的进程;不会接管或终止外部启动的 DSH。

运行要求

  • Windows 10/11 x64。
  • DSH 源码目录已执行 pnpm installpnpm run build
  • DSH 支持的 Node.js 版本(默认可执行名为 node)。
  • 创建并安装 Profile 扩展时,系统中需要可用的 pnpm。

DSH 目录、工作目录、DSH_HOME、DSHgo Home、Node 可执行文件、首选端口和 Session Log 上传开关都可在“启动器设置”中修改。DSHgo Home 默认是 ~/.dshgo,也可由 DSHGO_HOME 覆盖;它与 DSH 自身的 Home 分离。开启“禁用 DSH Session Log 上传”会为 DSH 子进程设置 DSH_TELEMETRY_DISABLED=1;操作系统中已有的同名环境变量也会照常生效。

Profile 详情页可以在二次确认后将整个 Profile 目录移入系统回收站。删除前必须停止由当前启动器管理的运行实例;回收站操作失败时不会永久删除原目录。该操作只处理 DSH_HOME/profiles/<名称>,不会删除 DSH_HOME 中全局保存的 Session、日志或存储数据。

本地插件库与 Profile 插件

“本地插件库”管理 DSHgo Home 中的源码副本、构建产物和 Dev watcher。GitHub 来源必须是 https://github.com/owner/repository 形式;本地目录会复制或克隆到库中,原目录不会被修改。

仓库收录后,启动器会按新版 manifest 字段识别 dsh.bundledsh.client,并兼容旧的顶层 dshClient。包含有效 dsh.bundle.patch 的包按 Profile Bundle 安装;没有 Bundle 声明、但 package.json.main 与有效 dsh.plugin.json.main 指向同一运行入口的包会标记为“兼容插件”。没有插件清单、但声明了包名和单一 JavaScript 根入口的包会保留为“可强制安装为 Host”;带 exports["./client"] 的包不会进入这条 Host-only 兼容路径。用户每次把这类包添加到 Profile 时都必须确认 Loader ID,DSHgo 才会把它作为普通依赖安装,并在 Profile 自身的 cordis.patch.yml 中写入带所有权标记的 Loader 条目。确认 Loader ID 不会修改原始本地目录或 GitHub 仓库副本;安装后的配置验证、回滚、启停和卸载清理与兼容插件一致。兼容清单声明 Client 时,还必须同时提供一致的 dsh.client Web 声明和 exports["./client"],确保当前 DSH 能实际发现客户端入口。稳定构建会按仓库声明执行 pnpm installbuildbundleprepare,检查入口文件后运行 pnpm pack;产物按仓库、包版本和完整 Git commit 隔离保存在 DSHgo Home。第三方仓库只有 package-lock.json、没有 pnpm-lock.yaml 时,DSHgo 会在自己的仓库副本中临时运行 pnpm import,让安装继续遵循原仓库锁定的依赖版本;npm workspace 子包会使用确实覆盖它的上层锁文件,并临时生成 pnpm workspace 清单。DSHgo 会先在自己的 Home 中原子记录恢复状态,安装结束后移除临时文件;如果启动器异常退出,下次安装、刷新或移除该仓库时会先完成恢复。仓库原有的 pnpm-lock.yamlpnpm-workspace.yaml 不会被覆盖。为了兼容 pnpm 10.26 及之后的依赖构建审核,DSHgo 发起的第三方仓库依赖安装会始终允许依赖生命周期脚本执行;这项信任只作用于启动器创建的安装子进程,不会修改全局 pnpm 配置。Watch 模式优先使用 scripts.devscripts.watch,并为 tsdown/TypeScript 提供 watcher 回退。

稳定安装会先把 .tgz 复制到 Profile 自己的 dshgo-packages 目录,因此以后移除本地库仓库不会破坏已安装 Profile。开发安装默认选择 Link:它验证现有运行入口后直接链接 DSHgo Home 中的源码副本,不创建持续编译进程。需要由源码持续生成运行入口时,可从 Link 按钮的下拉菜单显式选择 Watch;首次添加时会临时运行 watcher 并等待入口产物就绪,启动 Profile 时会再次自动启动对应 watcher,最后一个引用它的运行实例结束后会自动停止该 watcher。旧版清单中没有开发启动方式的记录继续按 Watch 处理。仍有开发链接或正在进行的开发安装引用仓库时,启动器会拒绝刷新或删除该仓库。

DSHgo 使用 Profile 内的 dshgo.plugins.json 记录自己管理的 Bundle 和兼容插件安装。移除时复用 DSH CLI 的 plugin remove;兼容插件还会校验并删除 DSHgo 自己写入的 Loader 配置块。外部安装的 Bundle 也可通过风险确认卸载,来源不明的普通依赖保持只读。添加和移除插件时 Profile 必须处于停止状态。

对于能从 Bundle patch 中安全识别稳定 Loader ID 的已安装 Bundle,以及由 DSHgo 写入 Loader 条目的兼容插件,“安装插件”页会显示启用状态,并允许通过 Profile patch 启用或停用。DSHgo 只管理自己写入的停用配置;如果相同条目已被用户配置或其他 patch 停用,界面会保持只读,避免覆盖手工设置。运行中的 Profile 也可以切换状态,其中停用前需要再次确认;Host 配置会热更新,但已经打开的 DSH Web 页面需要刷新后才会反映变化。

Link 和 Watch 都会把 Bundle 或兼容插件源码以 link: 形式装入 Profile。Link 要求主包和 workspace 运行时依赖已有完整入口,Profile 启动时只校验链接并修复 DSHgo 管理的依赖,不启动 watcher;Watch 则会在 Profile 启动时自动运行仓库的 Dev watcher。对于 monorepo 中通过 workspace: 聚合其他运行时包的 Bundle,DSHgo 会递归把这些包也链接为 Profile 的直接依赖;Watch 会启动并等待各运行包自己的 watcher 生成入口,同时避免把附属 Bundle 重复加入 Profile 层。附属链接记录在 dshgo.plugins.json 中,并在最后一个引用它的 DSHgo 插件卸载时一并移除。新版 Web Client 已内置 HMR 接收能力;插件启用状态由 Host 热更新,但已经打开的 Web 页面仍需刷新。

DSHgo 会在调用 CLI 前逐包比较 DSH Host/Client workspace 源码与 manifest 声明的运行时产物,并单独校验 Web 前端构建;如果源码更新后没有完整构建,会提示先在 DSH 目录执行 corepack pnpm run build,避免某个较新的 CLI 文件掩盖其他包的旧产物。

稳定构建、Link 准备和 Watch 模式都可能执行第三方仓库中的依赖生命周期脚本,只应对可信来源使用。停止 Watch 时,启动器只处理本次会话记录的 watcher 进程树。

开发与打包

corepack pnpm install
corepack pnpm run dev
corepack pnpm run dev:web
corepack pnpm test
corepack pnpm run typecheck
corepack pnpm run dist

Windows 安装程序输出到 release/DSH-Launcher-<version>-Setup.exe

浏览器开发模式

执行 corepack pnpm run dev:web 后,访问终端打印的本地地址(默认从 http://127.0.0.1:5173 开始)。如果端口已被占用,服务会按顺序尝试下一个端口。该模式不是静态 Mock:浏览器通过仅监听回环地址的本地 HTTP/SSE 服务复用 ProfileServiceProcessManager,可以读取真实 Profile、创建 Profile、启动或停止 DSH,并实时查看日志。它适合通过 Codex 内置浏览器进行前端调试和 Agent 自动化测试;桌面发布仍然使用 Electron。

  • 可通过 DSH_WEB_PORT 修改起始监听端口;如果该端口被占用,也会继续向后查找。
  • 可通过 DSH_LAUNCHER_SETTINGS 指定设置文件;默认与 Windows 桌面版共用 %APPDATA%/dsh-launcher/settings.json
  • 可通过 DSHGO_HOME 临时覆盖本地插件库根目录,适合隔离测试。
  • 浏览器无法使用 Electron 原生目录选择框,Web 模式下点击路径选择按钮会要求输入绝对路径。
  • 结束开发服务前,应先停止界面中仍在运行的 DSH 实例和插件 Dev watcher;服务收到退出信号时也会清理自己管理的克隆、构建、打包及 Dev 进程。

进程管理边界

每个 Profile 在同一时刻最多存在一个活动实例,不同 Profile 可同时运行。启动器先请求子进程正常退出;若超过清理窗口,则仅对该次启动记录的 PID 及其进程树执行强制终止。启动器退出时会提示停止所有由它管理的实例。