Hook 与插件注入状态机实战:优先级、并行、故障隔离
这一章补齐 Hook 与插件治理 的“实现手册”部分。
对应源码入口(可选)
src/plugins/loader.tssrc/plugins/registry.tssrc/plugins/hook-runner-global.tssrc/plugins/hooks.tssrc/agents/pi-tools.before-tool-call.tssrc/agents/pi-embedded-runner/run/attempt.tssrc/agents/pi-embedded-subscribe.handlers.tools.ts
注册期状态机(加载阶段)
目标:冲突不覆盖,必须拒绝并留下 diagnostics(method/route/command 等)。
执行期状态机(HookRunner)
你需要两种执行模型:
- void hooks:并行执行(吞吐优先),默认 catchErrors=true,单插件失败不拖垮主流程。
- modifying hooks:按 priority 串行执行(结果可预测),并用稳定 merge 规则合并。
主链路注入点(位置比“能注入”更重要)
- Agent 启动前(prepend context)
- 工具调用前(before_tool_call:改参/阻断)
- 工具调用后(after_tool_call:审计,成功/失败都触发)
- Agent 结束(汇总快照与耗时)
失败场景与排障入口
- 单个插件拖垮主链路:优先检查 hookRunner 是否默认 catchErrors=true,以及 after_tool_call 是否 fire-and-forget。
- 多插件结果不可预测:确认 modifying hooks 按 priority 顺序执行,并且 merge 规则稳定可解释。
验收清单
- priority 高的 hook 先执行。
- void hooks 并行且不阻塞主回复。
- 注册冲突会输出 diagnostics,而不是静默覆盖。