Files
deepseek-harness/packages/host/plugin-inventory/README.zh.md
T
Pine e18cfbfb93 feat(plugin-inventory): live plugin activation, mirror install, and toggle lists
Installing a plugin now activates it without a restart: the CLI boot provides a
dshReloadProfile handle that re-runs the profile composition and applies it to
the running root Include, and the install/uninstall Remotes recompose live when
the handle is present (restartRequired: false). Registry installs try the
ordered INSTALL_REGISTRIES mirrors with the official npm registry as the final
fallback, erroring only when every source is unreachable. The enable/disable
guard splits into a REQUIRED_PLUGINS blacklist and a USER_TOGGLEABLE_PLUGINS
whitelist (default toggleable) generated from the running plugin list, and the
offline optional-bundle catalog is emptied (default bundles are not
installable/uninstallable). The plugin-list tab becomes a registry install form
and shows immediate-activation instead of a restart notice.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-14 20:45:00 +08:00

3.9 KiB
Raw Blame History

@deepseek-ai/dsh-host-plugin-inventory

English | 中文

当前 Cordis Loader 树的 Host 投影,带逐插件启用/停用。PluginInventoryGateway 注册 pluginInventory 服务,并发布两个由 Typert 生成的直接 Remote:pluginInventory/list 与 pluginInventory/setEnabled。list 直接读取 ctx.loader.entries(),跳过结构性的 group 行,再按 Loader 顺序返回其余条目,并且只包含 Loader 条目 id、模块标识、有效启用状态与当前根 Fiber 阶段。

阶段为 pending、loading、active、failed 或 unloading;条目没有存活的根 Fiber 时则为 null。该快照刻意只表示调用当下:Loader 仍是唯一的生命周期权威,本包不拥有缓存、历史、来源模型或事件流。setEnabled 通过 ctx.loader.update 实时切换单条条目,并把显式 disabled 覆盖写进 profile 的用户补丁层,使选择在重启后保留(bundle 默认禁用的行需要 disabled: false 覆盖才能保持启用)。

每条条目带 protected 标记。src/required.ts 中的守卫默认开放,含两个可由代码编辑的名单:REQUIRED_PLUGINS(黑名单,即不可停用的承重核心——入口树、Remote RPC 主干、session 与 agent 主干)与 USER_TOGGLEABLE_PLUGINS(白名单,覆盖黑名单、对显式可开关的插件生效);未列入任何名单的插件默认可切换。随包 base bundle 的完整依赖图分类见 docs/plugin-system.md。setEnabled 拒绝停用必需插件;启用后会校验 fiber 变为 active(依赖缺失的启用会回滚)。Web 插件列表 tab 渲染单一扁平列表,包含所有条目:每项按真实启用状态显示,可切换插件带"启用"或"停用"按钮(这样 bundle 默认禁用的插件也能重新启用),必需插件只显示只读说明。

网关还通过 availableBundles/installPlugin/uninstall 管理安装。availableBundles 列出 src/bundles.ts(AVAILABLE_BUNDLES)中策展的离线可安装可选 bundle;该目录目前为空,直到有可选 bundle 随包——profile 的默认 bundle(dsh-base、dsh-web-app、dsh-image-recognition-bundle)是部署的一部分,非可选插件,uninstall 拒绝移除它们。installPlugin 对 registry 包 spec 用内置 Node 与 vendored pnpm 在可写的 profile 目录运行 pnpm(设置页插件列表 tab 以"安装插件"表单提供此入口);registry 安装受 dshAllowPluginInstall 上下文标志门禁,仅桌面启动会开启。它会依次尝试 src/install.ts 中排序的 INSTALL_REGISTRIES 镜像源列表,直到其中一个成功——官方 npm 源排在最后作为保底,只有所有镜像源都不可达才报错。当 boot 提供了 dshReloadProfile 句柄时,网关在写入后重组合运行中的树,使插件立即生效(restartRequired: false);否则安装持久化 profile 清单,需重启生效(restartRequired: true)。公开 payload 类型位于 ./types,Typert 生成由 ./typert 与 ./remote 导出的 Host 和 Client Remote 产物。

该服务仅供 Remote 使用,刻意不声明同进程 Cordis Context merge。Client 包通过显式的 api-remotes 组合消费它,而不导入 Host 实现。

模型体验

无,因为这个仅限 Host 的清单投影不注册提示词、工具、消息或提供方请求。

KV Cache 影响

无;本包从不组装模型输入。

已知限制与暂缓事项

  • 仅表示调用当下 —— 结果不包含持久的失败历史或订阅;只要不存在存活的根 Fiber,就会报告 null,而不区分其原因。
  • 无来源、不能增删 —— 服务不识别条目由哪个 bundle、profile 或 override 引入,也不能添加或移除插件。启用/停用持久化到 profile 的用户补丁层;profile 未挂载(任何 bundle 都没有)的行无法从这里切换。