design/09 §5.2.1 / §5.6.1:补上「看不见连没连上 / 暴露了哪些工具 / 为什么挂了」的洞。 - runtimeconfig:PluginConfig 新增 `enabled`(*bool,缺省=启用 ⇒ 既有 plugins.json 向后兼容);新增 RedactPluginSecrets(整把凭据 + 任意 ≥6 字符片段一并抹除)。 - mcp:新增 status.go 的只读状态读面(ToolSummaries:工具名 + 截断描述,取自能力 注册表本身,因此与模型可见的工具集合同源)。 - plugin 管理器: · Install/Restore 尊重 enabled(停用=落盘不连接,重启后仍是停用,且一次都不连); · SetEnabled 落盘 enabled(停用先落盘再下线;启用失败时 enabled 保持 false); · 新增 Reconnect(对已停用者拒绝,不替用户启用); · 新增 Statuses(三态:connected 缺席=未知,工具数/明细/时间只在知道时给出, lastError 在记录那一刻即脱敏截断); · 内置「MCP 服务器」页声明 + 7 个已声明动作(list/install/reconnect/enable/ disable/uninstall/transports),走既有通用动作端点(owner-admin + 审计); · 护栏:热装插件的生命周期不改动内置提供者(mcp)的目录条目。 - gateway:已安装列表与 install 响应加 enabled,install 支持 config.enabled。
- GET /api/v1/admin/panels:按调用者角色过滤后的接入点快照(PLG-1 的 catalog 挂进插件管理器) - POST /api/v1/admin/plugins/{id}/actions/{action}:**只接受该插件声明过的动作名** (未声明 ⇒ 404);写动作 writeAuth + 落审计;插件只给动作名不给 URL ⇒ 不给插件开任意请求面 - 生命周期:install/uninstall/enable/disable 变化后**重算面板集合**并经进程内 bus 推 panels_changed (前端可热更新;不新开端口) 契约 v0.78 登记由主会话随后统一落(本片报告给了可直接粘贴的契约段)。
- capability/plugin/manager.go: Manager(Install/Uninstall/List/Restore/Close); Install=连接+发现+mcp:name注册工具,失败不落盘; holder持有*mcp.Registry; boot Restore重装 - config/runtimeconfig/plugins.go: PluginConfig(Normalize/Validate), LoadPlugins/SavePlugins(0600+tmp+rename)/Upsert/Delete/Masked(apiKey+敏感env掩码) - mcp: MCPConfig加APIKey/Env, http/sse Bearer应用, stdio子进程env合并; registry.ToolNames() - gateway: adminPluginInstall/Uninstall/ListInstalledPlugins; Deps.Plugins注入 - cmd/cyrene/plugins.go: wirePlugins(boot Restore+close) - 契约: body{kind:mcp,name,config{transport, endpoint?/command?,args?,apiKey?,env?}} → {installed,name,kind,transport,toolCount}; 失败502不落盘/非法400/未注入501; 卸载连带unregister+删配置 - 测试(manager/plugins/admin/mcp_auth/组合根), build/vet/test绿+3平台交叉编译 - Docs/api-client v0.28 + api-reference install=501改真实; .gitignore加plugins.json - 前端api.ts仍发旧body(无config)会400, 面板安装表单待后续