DeepSeek Harness 插件开发进阶:从 Host 工具到 Client UI
DeepSeek Harness 插件开发进阶:从 Host 工具到 Client UI 一、先理解 DSH 的插件模型 DSH 的插件运行时基于 Cordis。一个插件本质上是一个模块,它导出几样东西: export const name = 'my-plugin' // 插件名 export const inject = ['tools'] // 依赖哪些服务 export const Config = Schema.object({})// 配置 schema(可选) export function apply(ctx, config) {} // 插件主体 inject 声明依赖的服务;Cordis 会在这些服务可用时调用 apply,并在插件卸载或依赖消失时释放它注册的资源。Config 用于校验 profile 配置行里的 config。 1.1 Profile、Bundle 与 Patch DSH 的运行时组合是分层的: DSH 进程 └─ profile(desktop / web / headless / ...) ├─ package.json │ └─ dsh.profile.bundles: [bundle A, bundle B, ...] ├─ cordis.patch.yml # 用户自己的覆盖层 └─ node_modules/ ├─ @deepseek-ai/dsh-base # 基础 bundle ├─ @deepseek-ai/dsh-web-app # Web 形态 bundle └─ my-plugin # 你的插件 ├─ cordis.patch.yml # 插件要插入的配置行 ├─ lib/index.js # Host 侧入口 └─ lib/client.js # Client 侧入口(可选) Bundle:一组配置行的集合,通常是一个 npm 包,通过 dsh.bundle.patch 指向自己的 cordis.patch.yml。 Patch:按 id 定位配置行,可以覆盖、禁用或插入。注意,patch 会替换目标行的整个 config,不是深合并;想保留的字段要重写。 Profile:把若干 bundle 按顺序叠加,再叠加用户自己的 cordis.patch.yml 和 --patch 覆盖层。 加载顺序大致是:bundle 的 patch → profile 的 cordis.patch.yml → home 级 patch → --patch。后写的层覆盖先写的层。 ...