OH10: Hooks OpenHarness · 对标 S10

S10 同主题:在工具执行前后插入用户脚本,用于审计、改写或阻断;必须与权限、工具错误路径顺序正确

上游:HKUDS/OpenHarness · 本仓库快照:reference/rererence_harness/OpenHarness/ · 路径亦见 专题映射表

与 S10 站内导图对齐course-s10)。

🎯 关键路径(读什么)

src/openharness/ 下优先打开:

  • hooks/events.pyPRE_TOOL_USE / POST_TOOL_USE / session 级事件。
  • hooks/executor.py:聚合多 hook 定义的执行与 block 语义。
  • hooks/loader.pyload_hook_registry 从配置构建。

🔍 源码导读

调用顺序(对照源码)

_execute_tool_callPre →(通过则)权限 → execute → Post。Pre 返回 blocked 时直接错误型 tool_result,不再做权限询问——与课内「hook 可短路」一致。

与 OH03 的叠加

权限判定依赖已解析的 parsed_input;Hook 收到的 payload 含原始与事件名。思考「谁在何种失败下对用户可见」。

⚖️ 与课内叙事对照

维度课内 S10OpenHarness
事件面Pre/Post/Session枚举 HookEvent
配置hooks JSON与 settings / 项目目录约定
阻断permission vs hook二者都可拒绝,但提示文案来源不同

🤔 思考题

  1. PostToolUse 若抛异常,工具结果是否仍写入对话历史?
  2. SessionStart hook 失败应否阻止整个会话启动?当前实现如何?
  3. 若要在 Pre 阶段做「自动改 tool 参数」,应返回什么结构?(对照 AggregatedHookResult

📎 延伸阅读

OH01–12 目录 · OH09 · OH11 · S10 · D10