Skip to content

Harmony 是什么?

dsh-harmony 是 DeepSeek Harness 的运行时 Patch 协调层。 官方插件 API 用于增加能力;Harmony 用于修改已经存在的能力。

一个 Provider 可以在目标插件加载前重写它、替换具名函数,或装饰函数调用。变换后的源码只存在于内存,Harmony 不会改写磁盘上的安装包。

选择正确的扩展方式

方式适用场景边界与成本
官方插件 API注册服务、Slot、工具和页面没有扩展点就无法修改内部实现
维护 Fork不受限制地修改源码需要持续合并上游,多个 Fork 难以协调
dsh-harmony运行时修改 Host 和 WebUI 插件Patch 必须跟随目标编译结构变化

Harmony 不是新的安装器,也不替代 Harness Loader。它保留现有 dsh 命令和官方插件装配流程,只在 Loader 执行插件前收集、排序和应用 Patch。设计灵感来自 C# 和 .NET 的 Harmony

运行路径

全局命令始终沿同一条路径运行:

text
系统 dsh 命令
  -> Harmony shim
  -> dsh-harmony/bin
  -> @deepseek-ai/dsh/lib/bin.js
  -> Loader + Host
  -> 同源 WebUI + /api + WebSocket

Harmony 先安装 CommonJS 和 ESM 变换 Hook,再原样转发 CLI 参数。它不代理 WebUI 流量,不创建第二个 Host,也不保存另一套后端地址。

组件负责不负责
HarmonyHook、Patch 发现、排序、验证、检查和重载事务第二套后端或 WebUI 代理
DSH HostWebUI 静态资源、/api RPC 和 WebSocket其他 Host 的会话
WebUI与当前 Host 建立同源连接单独选择后端地址
Desktop一个本地 Host 进程及其就绪地址改写 Harness 协议

Harmony 协调什么

  • 源码 Patch:通过 TypeScript AST 变换 lib/index.jslib/client.js 或其他编译目标。
  • 语义 Patch:对具名函数和类方法执行 beforeafteraroundreplace
  • 全局顺序:将手动 Provider 顺序与 beforeafter 约束结合。
  • 事务:提交重载前预检 Provider、顺序和启停状态变化。
  • 检查:展示原始源码、每一步 Patch 结果和最终运行时源码。
  • 工具 API:让插件与构建工具查询状态,或以事务方式重载插件及其 Patch 声明。

Host 与浏览器目标

Node 目标通过 Loader Tree 重载。同一目标包中的相对 ESM 导入共享一代 Patch;CommonJS 重载会清理该包内部的 require 图。

lib/client.js 等浏览器目标使用 Harness 现有的 clientModules.rebuilt 路径。Harmony 重新计算 Bundle revision 并发送原生 HMR 事件,因此 WebUI 只重载发生变化的客户端插件。

安全边界

每次更新都会用完整、有序的 Patch 集合检查所有受影响目标。无法匹配或应用的单个 Patch 会被跳过并报告,不会拖垮 Host。Provider 声明加载失败或目标插件重载失败时,Harmony 才会保留上一代 Loader Tree 和 profile 状态。卸载 Harmony 后直接恢复执行原始文件,无需还原任何目标包。

下一步:安装运行时编写 Patch

基于 MIT License 发布。