Feature Request: Official extension directory for user plugins with stable service injection #5957
Replies: 1 comment
|
(base) PS D:\deepseek-harness> pnpm dsh web Error: dsh: plugin tree failed to load: failed to apply loader entry include (cordis:include): failed to apply loader entry sessionListApi (@deepseek-ai/dsh-session-list-api): cannot get property "router" without inject Node.js v22.23.2 |
Uh oh!
There was an error while loading. Please reload this page.
Proposal: Support user extensions in
<project-root>/extensions/with stable plugin loading and.gitignoreinclusion问题背景
在 deepseek-harness 项目中,我们希望开发自定义插件,对外暴露稳定的 REST API,以便第三方系统集成 DSH 的
workspace、session、providers、models等核心能力。这些插件不应受官方内部重构影响,且应能独立于官方代码库进行维护。
当前,我们尝试将自定义插件放在项目根目录下的
user/目录中,并通过webprofile 的cordis.patch.yml挂载。但遇到核心障碍:自定义插件无法注入router服务,导致dsh web启动失败。核心期望
官方认可一个明确的扩展目录(建议命名为
extensions/),用于放置用户自定义的功能插件。该目录应被加入
.gitignore,确保用户代码不会被提交到官方仓库,也不会因git pull被覆盖或影响。提供稳定的插件加载机制,确保位于
extensions/下的插件能正常访问router、workspaceRegistry、sessions等核心服务,并能注册 HTTP 路由或 Remote 方法。即使 DSH 内部进行重大重构(如 bundle 结构、依赖注入方式变更),只要公开的数据结构(如
Workspace、Session等类型)保持不变,外部集成应继续工作,无需修改插件代码。提供官方文档和示例,指导开发者如何在
extensions/目录下开发、构建、加载自定义插件,并说明与官方插件的集成约定。当前阻碍(复现步骤)
user/session-list-api/(或extensions/session-list-api/),编写自定义插件(尝试注册 HTTP 路由/api/lunerstar/workspaceSessions)。~/.dsh/profiles/web/cordis.patch.yml中添加insert块挂载该插件。node_modules中创建符号链接或安装包。pnpm dsh web,启动失败,错误日志显示:尝试过的解决方案(均失败):
static inject注入router、ctx等。apply函数直接访问ctx.router。ctx.ready、ctx.on('ready')等待服务就绪。所有这些尝试都因 Cordis 依赖注入机制的限制(服务未注册时禁止通过
ctx.router访问)而失败。根本原因(推测):
官方 bundle(如
dsh-base、dsh-web-app)中的插件在router服务注册之后加载,因此注入成功;而用户通过cordis.patch.yml的insert块加载的插件在router服务注册之前执行,导致无法注入。期望的解决方案
1. 明确扩展目录并加入
.gitignore<project-root>/extensions/作为官方认可的扩展目录,并添加到根目录的.gitignore中。2. 提供官方支持的挂载方式
dsh配置中增加dsh.extensions或dsh.plugins.user选项,指定扩展目录路径。webprofile 启动时,自动扫描该目录下的所有包(或遵循特定约定,如extensions/*/package.json),并在合适的生命周期阶段加载它们,确保router等核心服务已可用。3. 提供生命周期钩子
ctx.ready或ctx.on('services-ready')等官方钩子,让插件在服务完全初始化后执行路由注册等操作,无需依赖inject顺序。4. 文档与示例
package.json、源码、构建和加载步骤),确保开发者能快速集成。附加说明
TypertRemoteService和@Remote装饰器,但在 TypeScript 严格模式下遇到类型问题,无法顺利构建。若官方能提供稳定的装饰器兼容方案(如更新tsconfig推荐配置),将是更优雅的扩展方式。extensions/目录中的插件能作为独立的 Node 包存在,并通过 pnpm workspace 或 link 方式集成,方便开发和调试。环境信息
结论
当前 deepseek-harness 缺乏对用户自定义插件的官方支持路径,导致第三方集成困难。通过上述改进,可以大幅降低集成门槛,同时保证稳定性,使 DSH 成为一个真正可扩展的平台。
如果官方需要,我们可以提供更详细的设计建议或原型代码。请评估此建议的可行性,并告知后续计划。
All reactions