跳到主要内容

Hooks

English

Hooks 在 Agent 事件前后运行命令,可用于策略检查、通知或补充上下文。只应从可信来源启用 Hooks。

启用和管理 Hooks

~/.copilot-shell/config.toml 或受信任的项目配置中定义:

[hooks]
enabled = true

[[hooks.PreToolUse]]
name = "security-check"
command = "/usr/local/bin/my-security-hook"
matcher = "shell"
timeout = 60000

在交互式终端中运行:

/hooks
/hooks history
/hooks trust-project
/hooks enable <id>
/hooks disable <id>

项目根目录受信任前,项目 Hooks 不会执行。使用 /hooks untrust-project 可以撤销信任。Shell Hook 状态只在当前会话有效;Agent Hook 状态由 registry 持久化。

事件名称

事件运行时机能否拦截
PreToolUse工具调用前可以
PostToolUse工具调用成功后可以
PostToolUseFailure工具调用失败后不可以
UserPromptSubmit提交 prompt 时可以
SessionStart会话初始化后不可以
StopAgent 停止时可以
BeforeModel / AfterModel模型请求前后不可以

使用 matcher 限制工具事件。Hook 命令从 stdin 接收一个 JSON 对象,其中包含 hook_event_namesession_idcwd,以及 tool_nametool_input 等事件数据。

返回决策

向 stdout 写入一个 JSON 对象:

{
"decision": "block",
"reason": "Dangerous command",
"systemMessage": "Command blocked by security policy"
}

allow 表示继续,block/deny 表示停止操作,ask 请求用户确认,空响应表示透传。退出码 2 也会拦截;其他非零退出码只作为警告。默认超时为 60 秒;需要快速完成的检查可以设置更短的 timeout。同一事件的多个 Hook 需要按顺序运行时,设置 sequential = true

添加上下文或子进程变量

hookSpecificOutput.additional_context 会把文本加入 Agent 上下文。env 只注入 Hook 子进程:

[[hooks.SessionStart]]
name = "load-context"
command = "/usr/local/bin/load-context"
env = { TEAM = "platform" }

宿主进程不会被修改。变量名必须符合 [A-Za-z_][A-Za-z0-9_]*,变量值不会被打印。Extension Hook 使用相同配置和协议,参见 Extensions