Skip to content

feat(buddy): 支持插件贡献 MCP 连接器与 NPC - #469

Merged
shanyuhai123 merged 6 commits into
useLexora:masterfrom
QAyong:codex/plugin-capability-contributions
Oct 28, 2026
Merged

shanyuhai123 merged 6 commits into
useLexora:masterfrom
QAyong:codex/plugin-capability-contributions

Conversation

@QAyong

@QAyong QAyong commented Oct 26, 2026

Copy link
Copy Markdown
Contributor

背景与关联 / Context and related issue

  • 问题或目标:一项完整能力常需要技能、MCP 连接器和子代理配套,但插件清单目前只能贡献技能(contributes.skills)。连接器和子代理要用户手动到设置里添加,卸载插件时也不会清理。本 PR 让插件清单可以声明它们,随插件安装、启停和卸载。
  • 关联 Issue:Refs [Feature] 插件清单支持贡献 MCP 连接器与子代理 #468(Issue 里先讨论方向和安全约束;本 PR 是其中前两步的合并实现,审核页和卸载提示也一并包含,便于整体评估。如果方向需要调整,可以按 Issue 里的拆分顺序拆成更小的 PR。)

主要改动 / Changes

  • 清单:新增 contributes.mcpConnectors(仅 streamable-http,地址必须是不带账号密码的 HTTPS;deferred 默认 true,credential 为 none / bearer / oauth)和 contributes.subagents(仅 kind: "npc";文件权限 inherit / read_only,默认只读)。需要 API 4;ID 不能重复;子代理的工具只能引用同一个包声明的连接器;不能使用内置子代理 ID。
  • 同步:主进程把已安装插件的声明汇总成描述符(ExtensionService.capabilityContributions),服务进程的 ExtensionCapabilitySync 对账——创建、更新、移除对应记录,并随插件启停;不新增数据库迁移。连接器是默认关闭、没有凭据的记录;子代理是带 ext.<插件 ID>. 前缀的伙伴记录,并加入默认伙伴的可委派列表。
  • 不覆盖用户的东西:同 ID 已有用户自己建的记录时跳过并记录冲突;用户在安装后自己删掉的不会被装回;一份台账文件(extension-capabilities.json)记录“哪些记录是插件创建的、安装时的摘要”,据此区分用户改动——卸载只删未改动的,改过的(改了提示词、填了凭据、改了地址等)保留。台账读不出来按“空”处理,即什么都不删;读取描述符失败时整轮放弃,不会把失败当成“全部卸载”。
  • 界面:安装审核页新增“MCP 连接”和“子代理”两节(连接地址、凭据要求、“不下载任何代码”、子代理的工具范围/文件权限/依赖的连接器、“会加入可委派列表”);卸载对话框在确认前列出将被保留的用户改动。
  • 文档:plugin-creator 技能新增 references/mcp-and-subagents.md,并在 api.d.ts 补充类型。

验证 / Verification

  • 自动检查:新增并通过的测试(在下游分支 QAyong/XTLaw 上运行)覆盖清单校验(API 版本、重复 ID、HTTPS/凭据、stdio 拒绝、跨包引用、内置 ID)、对账(安装、同 ID 冲突、用户删除后不装回、用户改动后卸载保留、停用/启用、台账丢失)、ExtensionService 的描述符发布与变更通知、安装审核页和卸载对话框的展示。本 PR 是把下游实现重新切到 upstream/master 上的版本,按仓库约定没有在本地重装依赖和跑测试,请以本 PR 的 CI 为准。
  • 手动验证:下游分支上已使用一段时间;本 PR 版本未做手动验证。
  • 未执行:本地类型检查、lint、测试、Playwright E2E(见上)。

兼容与风险 / Compatibility and risks

  • 没有数据库迁移,没有改已有清单字段;旧插件不受影响(新字段缺省为空数组)。
  • 新增 capabilityImpact 管理动作与 extensions.capabilities.* 内部 RPC,仅主进程与服务进程之间使用。
  • 安全面:插件能因此在用户电脑上登记连接器和子代理。约束是连接器默认关闭且无凭据、不下载不运行代码;子代理不能引用包外连接器、文件权限默认只读且不高于当前任务;安装前审核页完整列出。希望审阅者重点看:清单校验(extensionManifest.ts、extensionCapabilities.ts)和对账里“不接管用户记录、不删用户改动”的判断(ExtensionCapabilitySync.ts)。
  • 恢复:删除台账文件 extension-capabilities.json 后,插件创建的记录都会按“用户自己的”保留,不会被删除。

界面变更 / UI changes

安装审核页新增“MCP 连接”“子代理”两节,卸载对话框可能出现“你修改过的内容会保留”一节;仅在包声明了对应内容时出现,没有截图。

🤖 Generated with Claude Code

probe and others added 5 commits October 26, 2026 22:24
为什么:一项完整能力常需要技能、MCP 连接器和子代理配套,但插件清单目前只能贡献技能,连接器和子代理要用户手动到设置里添加,卸载时也不会清理。

做了什么:
- 清单新增 contributes.mcpConnectors(仅 streamable-http、无凭据的 HTTPS 地址,默认关闭)与 contributes.subagents(仅 NPC,工具只能引用本包声明的连接器,文件权限默认只读),需要 API 4。
- 主进程汇总已安装插件的声明,服务进程对账:创建、更新、移除对应记录并随插件启停,不新增数据库迁移;用台账文件区分用户改动,读不出台账时不删除任何东西。
- 安装审核页列出连接器与子代理;卸载对话框提前列出用户改过、将被保留的内容。
- plugin-creator 技能补充说明与类型声明。

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- extensionCapabilities 不再引用 buddySettings:清单 schema 会被插件 SDK 导出在纯 Node 下加载,无法解析它的无扩展名导入,改为在本文件内保留一份与之一致的工具选择 schema。
- 卸载对话框的类型标签改为 MCP / 子代理,插件术语测试遍历嵌套标签,同步测试只断言子代理台账为空。

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…ex/plugin-capability-contributions

# Conflicts:
#	apps/buddy/service/resources/skills/plugin-creator/SKILL.md
@shanyuhai123 shanyuhai123 changed the title feat(buddy): 插件清单支持贡献 MCP 连接器与子代理 feat(buddy): 支持插件贡献 MCP 连接器与 NPC Oct 28, 2026
@shanyuhai123
shanyuhai123 merged commit 80b38d7 into useLexora:master Oct 28, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants