已开启
[V1110-PLUGIN] [P1] on-x 先做 tool:before / tool:after / prompt:build 三个挂点:绕开 kernel 由 bridge 自维护订阅表 #126
kemeng创建于  17 小时前
kemeng成员
17 小时前 创建

结论

on-x / emit / waterfall 恒返 E_NOT_CARRIED(-2)(bridge.rs:681-731)。其中 on-x 是唯一无法被 Skill / Hook / MCP 替代的能力——它是插件在工具执行链上「看一眼、改一改」的唯一入口。没有它,插件永远只能做「静态贡献」,做不了「运行时管家」。

三条不可能一次铺全,建议只做 on-x 一个原语、只开三个挂点。

钉面

  • 仓:xuanwu-code/xwwasm · tag v0.1.18(75457fb)
  • crates/xw-plugin-kernel/src/bridge.rs:681 host_on_x / :697 host_emit / :712 host_waterfall,三者均 E_NOT_CARRIED
  • bridge.rs:401 注释原文:「接口面保留(不删)∧ 实现返回 E_NOT_CARRIED(响亮非静默)」
  • 裁定依据:seam.rs 头注引 G9_DUAL_TRACK_ADJUDICATION.md §34 / §61 ——「WIT 首端到端限只读贡献型 seam;waterfall/veto 类热路径不首迁(L3 性能边界)」

为什么绕开 kernel

kernel 的事件面是类型门控(编译期 on::<T>()),没有字符串键注册面;在 kernel 侧加「按事件名订阅」等于动它冻结的契约面,排期不可控。

替代路径:由 xwwasm 的 bridge 自维护订阅表(HashMap<(plugin, event)>),由 xwcode 侧在固定挂点主动回调 guest 的导出函数。三个挂点都在 xwcode 仓内,一仓内几天可闭合,不等 kernel 排期。

要做

  1. on-x 实装,仅三个事件:
    • tool:before —— 入参可改、可拒(拒 = 拦下这次工具调用)
    • tool:after —— 结果可改、只读观测
    • prompt:build —— 可追加段落,不可删改他段
  2. guest 侧导出 on_event(event_ptr, event_len, payload_ptr, payload_len) -> i64,返回 0 = 放行,>0 = 新载荷句柄,<0 = 拒绝(tool:before 专用)。
  3. 热路径纪律:tool:before 有强制超时(建议 50 ms),超时视为放行并记台账,不允许插件卡住工具链。
  4. emit / waterfall 仍返回 E_NOT_CARRIED,不顺手做——waterfall 是 L3 性能边界,emit 缺消费者。

安全红线

tool:before 等于给插件一票否决权。谁能装这类插件必须独立开关(默认关),不能与「只读贡献型」插件共用同一信任档。

验收

  • 正例:夹具插件在 tool:before 把 write_file 的 path 改成 /tmp/x,宿主实际写入 /tmp/x。
  • 拒绝:夹具插件对含 rm -rf 的 run_shell 返拒绝 ⇒ 工具未执行,且宿主收到可归因的拒因。
  • 超时:插件 sleep 200 ms ⇒ 50 ms 后放行,台账记超时,工具链不被卡住。
  • 未订阅插件零开销:prompt-conventions 装在同一宿主,工具调用耗时无显著变化。
  • emit / waterfall 仍返 -2(防止顺手实现导致语义漂移)。

关联

audit/plugin-capability-2026-11-04/00-CAPABILITY_AUDIT.md §2 · 01-CAPABILITY_PROPOSAL.md §6 L3 与 §7.4

likedislike