Help us shape the future of Go! Take the 2026 Go Developer Survey

hook

package
v0.2.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 1, 2026 License: MIT Imports: 21 Imported by: 0

Documentation

Overview

Package hook 运行用户配置的 hook:按事件找出命中的 hook,在事件所在的 Executor 上并行运行, 解析它们的输出并合并成一个决定。匹配、运行、输出解析和合并都由本包负责,触发事件的各层只看合并后的结果。

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type HookDefinition

type HookDefinition struct {
	// Key 标识配置中的 hook:文件项为 <文件名>:<事件>:<序号>,插件项以 plugin:<插件名>: 开头。
	Key   string
	Event defs.HookEventName
	// Matcher 按事件挑选命中的 hook,见 HookMatcher。
	Matcher *HookMatcher
	// Command 与 ScriptPath 二选一;ScriptPath 是 serve 本机的绝对路径。
	Command    string
	ScriptPath string
	// Args 是跟在 script 路径后面的参数。
	Args []string
	// Timeout 是最多运行多久。
	Timeout time.Duration
	// IsBlockedOnFailure 出错时是否按拦下处理?只用于 PreToolUse 和 UserPromptSubmit;本轮被中断不算出错。
	IsBlockedOnFailure bool
	// SourcePath 是声明这个 hook 的文件:hooks/ 下的 yaml 或插件的 manifest。
	SourcePath string
	// Plugin 是 hook 所属的插件;hooks/*.yaml 里的为 nil。插件的 script 在插件根目录内。
	Plugin *defs.Plugin
	// DisplayOrder 是展示顺序,也是运行结果的合并顺序:文件 hook 在插件 hook 前,各自按名字排序,内部按固定事件、matcher 组和 hook 顺序。
	DisplayOrder int
}

HookDefinition 是校验后的一个 hook。

type HookEvent

type HookEvent struct {
	Name    defs.HookEventName
	Session defs.Session
	TurnID  defs.TurnID
	// Source 是 SessionStart 的来源:startup 或 resume。
	Source string
	// Prompt 是 UserPromptSubmit 这组输入里的文本。
	Prompt string
	// ToolCall 是 PreToolUse、PostToolUse 的调用,已经过路由,参数不含 executor。
	ToolCall *defs.ToolCall
	// ToolResult 是 PostToolUse 的工具结果。
	ToolResult *defs.ToolResult
	// LastAssistantMessage 是 Stop、SubagentStop 时模型最后一条回复的文本。
	LastAssistantMessage string
	// IsStopHookActive 这一轮是不是已经被 Stop hook 续过?只用于 Stop、SubagentStop。
	IsStopHookActive bool
}

HookEvent 由 ToolExecutor 在工具调用前后交给 Hooks,其他事件由 Session 或 Agent 在启动、提交输入或结束时交给 Hooks; 命令 hook 从 stdin 收到它的 JSON。Source 及之后的字段只在对应事件里填写,其他事件留空。

type HookEventRequest

type HookEventRequest struct {
	Event *HookEvent
	// ExecutorID 是运行 hook 的 Executor。
	ExecutorID string
	// Workspace 是这个 Executor 的工作区,命令在它的根目录里运行。
	Workspace workspace.Workspace
}

HookEventRequest 是一次事件:发给 hook 的内容和运行它的 Executor。

type HookInfo

type HookInfo struct {
	// Key 是 HookDefinition.Key。
	Key   string             `json:"key"`
	Event defs.HookEventName `json:"event"`
	// Matcher 是配置里 matcher 的原文,没写时为空。
	Matcher string `json:"matcher,omitempty"`
	// Handler 是显示用的命令:command 原文,或 script 路径加 args。
	Handler        string `json:"handler"`
	TimeoutSeconds int    `json:"timeout_seconds"`
	SourcePath     string `json:"source_path"`
	DisplayOrder   int    `json:"display_order"`
	// CurrentHash 是这个 hook 定义的哈希:定义不变则不变,改了事件、matcher、命令、脚本、参数、超时或 on_failure 就变。
	CurrentHash string `json:"current_hash"`
	// PluginName 是 hook 所属插件的名字;用户自己的 hook 为空。
	PluginName string `json:"plugin_name,omitempty"`
}

HookInfo 是一个配置好的 hook,供 hooks/list 显示。

type HookMatcher

type HookMatcher struct {
	// contains filtered or unexported fields
}

HookMatcher 判断一个 hook 是否命中事件:不写、空串或 * 全部命中; 只由字母、数字、_、- 和 | 组成时按准确名字匹配(| 表示或,并认 Bash、Write、Edit、Read、Agent 这几个工具别名); 其他写法按 Go 正则匹配,不加首尾锚点。

func NewHookMatcher

func NewHookMatcher(pattern string) (*HookMatcher, error)

NewHookMatcher 解析 hook 的匹配表达式。

func (*HookMatcher) IsMatched

func (m *HookMatcher) IsMatched(values ...string) bool

IsMatched 给定值中是否有任意一个命中 matcher?

func (*HookMatcher) String

func (m *HookMatcher) String() string

String 返回 matcher 的配置原文。

type HookOutcome

type HookOutcome struct {
	// IsBlocked 是否有 hook 拦下了这个事件?
	IsBlocked bool
	// BlockReason 是拦下原因,多个时按配置顺序用空行拼接。
	BlockReason string
	// UpdatedToolArguments 只有 PreToolUse 会填,替换 defs.ToolCall.Arguments;多个 hook 都改写时取配置顺序最后的。
	UpdatedToolArguments string
	// IsTurnStopped 是否有 hook 要求结束本轮?
	IsTurnStopped bool
	// StopReason 是结束本轮的原因,只给用户看;多个时按配置顺序用空行拼接。
	StopReason string
	// SavedRuns 是要保存进历史的运行记录,按配置顺序;正常完成且没有任何输出的不在其中。
	SavedRuns []*defs.HookRun
}

HookOutcome 是一个事件上所有命中 hook 合并后的决定;触发事件的那一层据此改流程。

type Hooks

type Hooks interface {
	// RunEvent 运行命中 request.Event 的全部 hook 并返回合并后的决定,没有命中时返回空决定。
	// 每个命中的 hook 先发一次 running 记录,结束时再发一次最终记录(同一个 ID);RunEvent 返回后不再发送。
	// runUpdates 由调用方创建和关闭,接收方须在 RunEvent 运行期间持续接收;ctx 取消时运行中的命令被结束,记为 failed。
	RunEvent(ctx context.Context, request *HookEventRequest, runUpdates chan<- *defs.HookRun) *HookOutcome
	// GetHookInfos 返回配置的全部 hook,按 DisplayOrder 排列,供 hooks/list 显示。
	GetHookInfos() []*HookInfo
}

Hooks 是一份配置里的全部 hook;RunEvent 找出命中事件的 hook,在请求给出的 Executor 上并行运行, 每个 hook 开始和结束时各往 runUpdates 发一次运行记录,全部结束后返回合并结果。

func NewHooks

func NewHooks(opt *HooksOpt) Hooks

NewHooks 创建 Hooks,脚本和插件目录从本机 / 下读取。

type HooksOpt

type HooksOpt struct {
	Definitions []*HookDefinition
}

HooksOpt 是一份配置里的全部 hook 定义,按配置顺序排列。

func NewHooksOpt

func NewHooksOpt(definitions []*HookDefinition) *HooksOpt

NewHooksOpt 用按配置顺序排列的 hook 定义创建 HooksOpt。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL