[Feature]: 支持插件在注册期声明 settings 命名空间暴露(落地 2026-08-10-web-plugin-configuration 笔记中暂缓的备选方案) #1144
Replies: 1 comment
|
你这帖有两样别的同类帖没有的东西:最大的实测影响面,和一个短期方案。我想把这两样都加固一下,因为你的短期方案可能比长期方案更值得先推。 一、先说规模:这已经是第七个独立线程了这堵墙现在被至少七个线程各自撞到过,而且每个都带着不同的插件:
十三个以上具名插件、七个线程、至少三份各自独立写的 patch 脚本。 其中 #903 那份最激进——插件在运行时通过模块缓存定位并改写宿主安装目录下的 (顺带我这边也算一个:我维护 pi2dsh,它的产品页在 DSH Web 里从没调过 这份名单本身就是论据。 设计笔记把注册期声明"暂缓"时,成本是"加第四个插件要改一次白名单";现在的实际成本是十三个插件、三份 patch 脚本、和一个会自愈的宿主文件改写器。建议把这张表放进原帖开头——这一族现在最缺的不是又一个提案,是有人把规模摆出来。 二、你的短期方案(把白名单开放为可配置)比它看上去更强你的方案 2 是:
我认为这条恰好绕开了设计笔记列出的全部三个暂缓理由,值得单独强调。#1196 引的笔记原文把顾虑写得很清楚:seam 契约变更、全部现有注册点、fail-closed 脱敏路径。逐条对:
最后一行是关键。设计笔记坚持的那句是——
而 profile patch 就是 Host 的决定。 部署方在自己的配置文件里写一行"我要暴露 所以我建议把你的方案 2 从"短期方案"提成独立提案:
它可以和 #3114 那份 RFC 并行推进而不冲突——RFC 解决的是"插件自己声明"(需要脱敏、需要改契约,慢),这条解决的是"用户今天怎么用上已经装好的插件"(不需要任何前置条件,快)。两者不是二选一,是不同时间尺度上的两件事。 三、给今天被卡住的人:一条不改宿主文件的路在上面任何一条落地之前,
我们就是这么落地的,跑在真 DSH loop 上,全程没有改动宿主目录下的任何一个字节。代价前面说过了(丢掉分层解析 / 边界与利益相关我们不修 DSH 自家组件——apiproxy、settings seam 都在 DSH 里。第二节那张对照表是我对着 #1196 引的设计笔记原文逐条推的,我没有读过 apiproxy 的完整实现,如果 profile patch 那条路在实现上有我没看到的障碍,以维护者的判断为准。 利益相关:我维护 pi2dsh,是这个提案的直接受益者之一,先说在前面。这条不推销:第三节那条绕法用的 |
Uh oh!
There was an error while loading. Please reload this page.
背景
Web 设置页的插件配置区只渲染编译期硬编码白名单
WEB_SETTINGS_NAMESPACES(packages/host/apiproxy/src/api-proxy.ts)中的命名空间。settings.describeRPC 对结果做filter(descriptor => exposed.has(ns)),名单之外的命名空间即使已被插件注册也会得到与未注册完全相同的settings-not-exposed,客户端 settings scope 停在unavailable。官方设计笔记 .agents/notes/implemented/feature/2026-08-10-web-plugin-configuration.zh.md 明确这是预期行为("暴露仍是 Host 的白名单"),并把"用注册期的暴露声明取代白名单"列为暂缓的备选方案(顾虑:seam 契约变更、全部现有注册点、fail-closed 脱敏路径)。
实际问题
第三方插件无法向 Web 设置页暴露自己的配置命名空间,除非本地修改 harness 包。
实例:dsh-web-ui 全家桶(
@linxin666/dsh-web-ui-all@0.1.9/0.1.10,社区最热门的 Web 增强插件集)通过settings.register()注册了 pet / task-board / live-stats / remote-web-ui / dsh-ssh / skin-background 等命名空间,但因白名单过滤,其「Web UI 插件」设置组 5 张配置卡片中 4 张静默隐形(PluginSettingsCard在 scopeunavailable时return null),配置不可读也不可写。用户唯一出路是手工修改dsh-host-apiproxy的编译期白名单(社区已实测可行)。相关报告:zhu1090093659/dsh-web#92(open)。
请求
settings.register(ns, schema, { expose: true })),并配套 fail-closed 的 secret 脱敏校验(笔记中提到的前置条件);或影响面
All reactions