Hook 输出与继续执行
正确输出 JSON 和进度消息,添加上下文、修改结果或让 agent 再执行一轮。
This page has not been translated into English yet. The original Chinese version is shown below.
命令 Hook 的 stdout 用于协议结果,调试日志应写 stderr。最终输出必须是一个 JSON 文档;连续打印多个普通 JSON 对象会拼成无效内容,导致决策被忽略。
进度与最终输出
CLI 允许在最终结果前输出单行 progress 对象:
echo '{"type":"progress","message":"Checking policy...","temporary":true}'
echo '{"permissionDecision":"allow"}'progress 行只负责显示,不参与最终决策。temporary 为 true 时替换前一个临时状态,智能体回复后清除。
CLI 逐行识别并移除完整的 progress JSON,再把剩余 stdout 合并,用一次 JSON.parse 解析。最终对象可跨多行,但 progress 对象必须各占一行。教程建议 jq -c 或 PowerShell ConvertTo-Json -Compress 便于避免格式问题;参考明确允许最终对象多行,并非所有输出都强制单行。
注入上下文
sessionStart 与 subagentStart 支持 additionalContext。多个成功 Hook 的非空内容按执行顺序用双换行合并,整体受 10 MiB 输出限制;会超过限制的贡献被丢弃,已积累内容保留并警告。
notification 异步、不会阻塞会话。返回 additionalContext 会作为用户消息注入,会话空闲时可能再次触发处理。用于桌面提示时,返回空对象即可,避免无意启动后续工作。
修改工具结果
postToolUse 可返回 modifiedResult,或 additionalContext。后者追加到工具结果供模型读取;多份上下文双换行合并,上限 10 KB,这与会话开始的 10 MiB 限制不同。
{
"additionalContext": "Check the command's exit status before interpreting its output."
}替换结果通常包含 resultType: "success" 和 textResultForLlm;如果返回 failure,失败会向下游传播,接着触发 postToolUseFailure。postToolUseFailure 的 command 退出码 2 则把 stdout 作为恢复指导追加给智能体。
要求继续执行
agentStop 与 subagentStop 可返回:
{
"decision": "block",
"reason": "Summarize the verification results before finishing."
}block 使用非空 reason 作为下一轮提示。连续 8 次 block 后,CLI 会覆盖 Hook 并结束,防止无限循环;agentStop 的 stop_hook_active 表示当前轮已因先前 block 而继续,处理器应主动限制重复。
只有 subagentStop 支持 modifiedResponse,用于替换返回父级的最终文本。有效 block 优先于改写;多份改写不串联,每个 Hook 都看到原始 response,最后返回 modifiedResponse 的 Hook 生效。不能假设“先脱敏再格式化”会自动组成流水线。
退出码
0 表示成功并处理 JSON;2 通常显示警告后继续,但权限事件按拒绝处理,postToolUseFailure 用作恢复上下文。其他非零通常记录失败后继续,preToolUse command 是拒绝例外。超时始终警告后继续通常流程,详见权限决策。