Open
[V1110-PLUGIN] [P1] 上游裁决:单工具执行口 pub(super) ⇒ 任何仓外消费者都只能自建窄管线,失 hooks / event log / D9 / spec #127
kemengAdd on  2 days ago
kemengCollaborators
2 days ago Create

结论

pub(super) 这一处可见性,决定了所有仓外消费者(MCP server、插件 tools.call、任何外部编排)都无法复用 xwcode 的完整工具执行管线,只能自建一条窄管线。而窄管线会静默丢掉四类语义,其中一类是安全相关的。

这不是插件系统单独的问题,是「xwcode 能不能被外部驱动」的公共前置。

钉面

  • 仓:xuanwu-code/xwcore · 版本 v0.1.61(f5a3706)· 宿主 xwcode master @ 019588af3
  • crates/xwcore/src/runtime/stages/execute_tool.rs:34 —— pub(super) async fn stage_execute_tool_with_retry
  • crates/xwcore/src/runtime/mod.rs:47 —— mod stages;(私有)
  • ConversationRuntime 无任何公开的单工具执行方法(grep "pub async fn execute" crates/xwcode/src/runtime/core.rs 零命中)
  • 可用于自建窄管线的公开件:contract_registry::tools()、xw_tools::execute_tool(lib.rs:353)、PermissionMode / parse_permission_mode(permission.rs:5,268)

窄管线会丢什么

丢失项 后果 严重度
hooks(PreToolUse / PostToolUse) 若有人用 hooks 做「命令必须先过审」,经外部路径调用的工具不经过它 安全
event log 工具调用不入会话事件流,事后无法回放 可观测
D9 摘要 长输出不被压缩,上下文失控 成本
spec 白名单 SDD 场景下允许的工具集不被强制 正确性
MCP 透传工具 mcp/ 前缀工具在外部路径下不可达 功能

要做(三选一,请上游裁决)

  • 甲案:把 stage_execute_tool_with_retry 提为 pub,并给 ConversationRuntime 一个公开的 execute_single_tool(name, input, mode)。改动最小,收益最大。
  • 乙案:在 xwcore 内新增一个薄门面模块(如 runtime::tool_gateway),只暴露上面那个方法,内部仍调 stage_*。封住 stages 的内部结构不外泄。
  • 丙案:明确「外部路径不走完整管线」是设计决定,那么在 hooks 文档中必须写明「MCP / 插件路径不触发 hooks」,并让 hooks 的语义降级为「仅 TUI 会话内有效」。

不建议继续维持现状:现状下每个消费者都会各写一条窄管线,语义漂移不可控(xwmcp、xwmcps、插件 tools.call 已经是三个潜在消费者)。

验收

  • 甲/乙案:外部消费者调用一次工具,PreToolUse hook 被触发(可用一个必拒绝的 hook 验证)。
  • 甲/乙案:同一次调用在 event log 中可见,D9 摘要在长输出时生效。
  • 丙案:文档明确声明,且 parse_permission_mode 的 deny-by-default 保证外部路径最低权限。

关联

audit/plugin-capability-2026-11-04/01-CAPABILITY_PROPOSAL.md §7.2 C-4 与 §10 待裁决项 #1/#2
相关仓:xuanwu-code/xwmcps docs/01-MCP_SERVER_E2E_PLAN.md(MCP server 侧同一问题,同一处方)

likedislike
kemengCollaborators
1 day ago Comments:

[ar审核 2026-11-05] 结论:✅可认领开发。建议:tx优先(建议仅负载均衡,任何人可抢,接单即开分支占位,comm同步防撞)。依赖:无。规范:一issue一分支,PR过L3;改门禁/契约/完成判据语义者ar复核diff。方向:单工具执行口pub(super)上游裁决,tx认领;偏裁决先贴方案。

likedislike
kemengCollaborators
1 day ago Comments:

tx 认领 #127(2026-11-06)。

分支:tx/v1113-127-tool-gateway

取 乙案(薄门面)动手,理由:甲案把 stages 的内部函数提为 pub,永久外泄内部结构;丙案等于承认差距但不消除;乙案只多一个门面模块、内部结构不外泄,且三个消费者(xwmcp / xwmcps / 插件 tools.call)可复用同一入口。

交付形:xwcore 侧新增 runtime::tool_gateway,只暴露 execute_single_tool;不改 stages 的可见性。是否采纳仍由 ar 复核 diff 决定,我不预设结论。

likedislike