diff --git a/VCPDistributedServer/frontend-plugin-loader.js b/VCPDistributedServer/frontend-plugin-loader.js index 4af8a625b..97199b7a9 100644 --- a/VCPDistributedServer/frontend-plugin-loader.js +++ b/VCPDistributedServer/frontend-plugin-loader.js @@ -3,10 +3,12 @@ if (window.VCPFrontendPlugins?.loaderStarted) return; - const registry = new Map(); + const registry = new Map(); + const loadStates = new Map(); const api = { loaderStarted: true, - registry, + registry, + getLoadState(id) { return loadStates.get(id); }, register(id, instance) { if (!id || registry.has(id)) return false; registry.set(id, instance || {}); @@ -53,7 +55,9 @@ const plugins = response?.success && Array.isArray(response.plugins) ? response.plugins : []; for (const plugin of plugins) { loadStyle(plugin); - results.push(await loadScript(plugin)); + const result = await loadScript(plugin); + loadStates.set(plugin.id, Object.freeze(result)); + results.push(result); } } catch (error) { console.error('[FrontendPlugins] 无法读取已启用插件清单。', error); diff --git a/docs/settings-plugins.md b/docs/settings-plugins.md new file mode 100644 index 000000000..a271f01a0 --- /dev/null +++ b/docs/settings-plugins.md @@ -0,0 +1,37 @@ +# 设置 → 插件与工具 + +主聊天的插件入口打开此设置分区,沿用现有设置壳和 DSH 控件样式。 + +## 功能 + +- 界面插件:搜索、启停及 Manifest 配置表单;显示加载器的真实加载结果。 +- 本机工具:搜索、启停及配置;运行状态取自本机插件与服务模块,节点连接在工具栏集中显示。 +- 后端插件:使用当前 VCPToolBox 管理端账号连接,读取注册清单并通过已有管理 API 启停和保存配置。分布式条目只读。 + +正常卡片省略重复状态标记,由开关表示启停。异常、未加载、状态未知、待重启、只读仍有短标记;完整运行事实可在详情和无障碍描述中读取。后端“已注册”只表示注册,不证明一次工具调用健康或浏览器已连接。 + +## 配置行为 + +本机启停与配置在重启 VCPChat 后生效,不打断当前聊天。后端由现有管理 API 重新加载插件。布尔/枚举使用共享选择器;数字遵守类型和范围;密钥遮挡,多行内容保留换行。 + +已有 `plugin-config.json` 时编辑该 JSON 文件,否则使用 `config.env`。未知键和注释保留。Manifest 与原始配置位于“高级配置”;后端 Manifest 只读。本机 Manifest 不能改变插件标识或分类。 + +插件配置独立显式保存,不进入全局设置自动保存。切换分类、搜索、刷新及本次应用会话内关闭重开设置保留草稿。保存与启停校验 revision,阻止覆盖其他窗口的修改;后端 revision 同时绑定服务器 origin。干净表单刷新读取最新配置,“放弃更改”读取成功后才替换草稿。插件移除时保留草稿供复制,并阻止保存。 + +## 接口与边界 + +插件 IPC 只接受应用真实主窗口顶层 frame。插件目录和配置拒绝越界路径、目录链接与符号链接,支持正常 Unicode 文件夹。 + +后端凭据只保留在主进程应用会话,导航、关闭、断开及服务器 origin 改变时清除;请求禁止跳转,超时 12 秒。管理地址采用服务器 origin 的根路径,尚不支持额外反向代理路径前缀。聊天 API key 不能代替管理端账号密码。 + +复用现有 UIUX 按钮、开关、门户选择器和生命周期所有者;样式通过 `settings.css` 导入,不修改生成的 UIUX 文件。DSH 样式参考固定源码 `639ed015`:正常启用项不显示状态标记、空描述不占位、线形展开箭头、36px/12px 按钮、36×20px 开关及明暗主题语义色。未做完整 DSH 应用像素 A/B。 + +## 验证 + +```powershell +npm run test:settings-plugins +node --test tests/settings-schema-render.test.mjs tests/global-settings-save.test.mjs tests/settings-autosave-coordinator.test.mjs tests/preload-registry.test.js tests/frontend-plugins.test.js tests/uiux-settings-bridge-modules.test.mjs tests/uiux-settings-css-parts.test.mjs tests/uiux-primitives.test.mjs +npm run check:ui-system +``` + +真实 Electron 验证使用隔离插件实际改清单、写配置、制造外部修改冲突并恢复草稿,结束后清理。真实 VCPToolBox 验证管理端登录与清单读取;后端写操作通过匹配现有 API 的模拟服务验证,未停用真实后端插件。检查明暗主题、窄窗口、键盘展开、选择器、搜索和主聊天插件入口。 diff --git a/main.html b/main.html index a8aeed3ef..477bf983d 100755 --- a/main.html +++ b/main.html @@ -723,7 +723,7 @@

全局设置

-